bastion-cvs Mailing List for Bastion - Cornville\'s troops
Brought to you by:
jacek_kolodziej
You can subscribe to this list here.
| 2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(36) |
Dec
(206) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2004 |
Jan
(41) |
Feb
(99) |
Mar
(149) |
Apr
(197) |
May
(110) |
Jun
(28) |
Jul
(10) |
Aug
(3) |
Sep
|
Oct
|
Nov
|
Dec
|
|
From: Michał Sła. <sw...@us...> - 2004-08-06 13:15:06
|
Update of /cvsroot/bastion/bastion/src/team In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22342/team Modified Files: Team.cpp Log Message: Witam! To juz chyba w miare ostateczna wersja AiDefender'a- wszystko zdaje sie dzialac. Ludziki wchodza na mur, jak widza wroga to prosza kolegow o pomoc itd.itd. Zeby mozna bylo rzeczywiscie zdobywac zamek, trzeba bedzie poprawic jeszcze sporo rzeczy- oto co mi sie nazucilo przy rozgrywaniu moich "partii":) - Gdy oddzial wejdzie na mur miejsce w ktorym sie znajduje jest z reguly prze suwane gdzies w drugi kat zamku, wiec oddzialy go atakujace biegna prosto... na jakas inna baszte, by z calej sily uderzyc glowa w jej mury. - Odkrylem chyba jak to jest z tymi trobkami. W KAZDYM oddziale przy starcie, lub po prostu przy powstaniu tego oddzialu pada jeden zolnierz, lub tworzy sie jakis nadprogramowy Unit, ktory od razu jest usuwany. Moze wy tego nie macie? W kazdym razie u mnie pod kazdym oddzialem na poczatku mozna sie dopatrzec jednego trupka. To bylo tez przyczyna tych zgonow na zawal serca przy szturmowaniu muru- oddzial byl dzielony na mniejsz (odlaczala sie konnica) i w tym mniejszym oddziale tez ktos umieral. To samo jest u mnie- jezeli oddzial rozlacza sie na dwa mniejsze, to z nowego oddzialu ktos umiera! Zastanowcie sie czy to nie jest jakis banalny blad... - Oddzial ktory dostanie rozkaz wejscia na mury juz sie nie zbiera i nie slucha kolejnych rozkazow (moge sie mylic, ale raczej nie). Walczy z przeciwnikami, ale nie probuje juz wrcac do jakiegos szyku itp. Ok... To chyba tyle jak na razie. Sorki, ze tak pozno. Pozdrawiam, zycze udanego odpoczynku Michal ---------------------------------------------------------------------- Index: Team.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/team/Team.cpp,v retrieving revision 1.44 retrieving revision 1.45 diff -C2 -d -r1.44 -r1.45 *** Team.cpp 30 Jun 2004 13:52:38 -0000 1.44 --- Team.cpp 6 Aug 2004 13:14:57 -0000 1.45 *************** *** 459,463 **** } // MICHA£ - Zg³aszanie event'ów ! if (getSeenSet()->getSeenEnemyCounter()>0) { EventDispatcher::get()-> dispatch(EventDispatcher::EEnemySpotted,new EventEnemySpotted(this)); --- 459,463 ---- } // MICHA£ - Zg³aszanie event'ów ! if (getSeenSet() && getSeenSet()->getSeenEnemyCounter()>0) { EventDispatcher::get()-> dispatch(EventDispatcher::EEnemySpotted,new EventEnemySpotted(this)); |
|
From: Michał Sła. <sw...@us...> - 2004-08-06 13:15:06
|
Update of /cvsroot/bastion/bastion/src/army In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22342/army Modified Files: AIDefender.cpp SiegePoint.cpp SiegePoint.h Log Message: Witam! To juz chyba w miare ostateczna wersja AiDefender'a- wszystko zdaje sie dzialac. Ludziki wchodza na mur, jak widza wroga to prosza kolegow o pomoc itd.itd. Zeby mozna bylo rzeczywiscie zdobywac zamek, trzeba bedzie poprawic jeszcze sporo rzeczy- oto co mi sie nazucilo przy rozgrywaniu moich "partii":) - Gdy oddzial wejdzie na mur miejsce w ktorym sie znajduje jest z reguly prze suwane gdzies w drugi kat zamku, wiec oddzialy go atakujace biegna prosto... na jakas inna baszte, by z calej sily uderzyc glowa w jej mury. - Odkrylem chyba jak to jest z tymi trobkami. W KAZDYM oddziale przy starcie, lub po prostu przy powstaniu tego oddzialu pada jeden zolnierz, lub tworzy sie jakis nadprogramowy Unit, ktory od razu jest usuwany. Moze wy tego nie macie? W kazdym razie u mnie pod kazdym oddzialem na poczatku mozna sie dopatrzec jednego trupka. To bylo tez przyczyna tych zgonow na zawal serca przy szturmowaniu muru- oddzial byl dzielony na mniejsz (odlaczala sie konnica) i w tym mniejszym oddziale tez ktos umieral. To samo jest u mnie- jezeli oddzial rozlacza sie na dwa mniejsze, to z nowego oddzialu ktos umiera! Zastanowcie sie czy to nie jest jakis banalny blad... - Oddzial ktory dostanie rozkaz wejscia na mury juz sie nie zbiera i nie slucha kolejnych rozkazow (moge sie mylic, ale raczej nie). Walczy z przeciwnikami, ale nie probuje juz wrcac do jakiegos szyku itp. Ok... To chyba tyle jak na razie. Sorki, ze tak pozno. Pozdrawiam, zycze udanego odpoczynku Michal ---------------------------------------------------------------------- Index: AIDefender.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/army/AIDefender.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** AIDefender.cpp 23 Jul 2004 15:58:16 -0000 1.10 --- AIDefender.cpp 6 Aug 2004 13:14:56 -0000 1.11 *************** *** 14,18 **** AiPlayer(_army,aSpotted,aAttack,aDied,aCompleted,aDefeated,aVictory) , nrDefPoints(0) , nrSupPoints(0) , nrRmpPoints(0) { ! this->addAction(1,new AiDefenderLookUpAction(this)); }; --- 14,18 ---- AiPlayer(_army,aSpotted,aAttack,aDied,aCompleted,aDefeated,aVictory) , nrDefPoints(0) , nrSupPoints(0) , nrRmpPoints(0) { ! //this->addAction(1,new AiDefenderLookUpAction(this)); }; *************** *** 143,147 **** // Uwaga, tu bardzo mocne za³o¿enie, ¿e najpierw dodajemy pocz±tkowe // oddzia³y typu posi³okowego (tzn. gdy dodajemy tych na murze to ci na dole ju¿ s±) ! void AiDefender::addTeamInitial(Team* team,const int category) { SiegePoint* point; switch (category) { --- 143,147 ---- // Uwaga, tu bardzo mocne za³o¿enie, ¿e najpierw dodajemy pocz±tkowe // oddzia³y typu posi³okowego (tzn. gdy dodajemy tych na murze to ci na dole ju¿ s±) ! void AiDefender::addTeamInitial(Team* _team,const int category) { SiegePoint* point; switch (category) { *************** *** 149,154 **** break; case TEAMS_WALLS: ! point = new DefenderPoint(team,15,(double) 0.5); ! inSiege[team] = point; defendPoints[nrDefPoints] = (DefenderPoint*) point; nrDefPoints++; --- 149,154 ---- break; case TEAMS_WALLS: ! point = new DefenderPoint(_team,15,(double) 0.5); ! inSiege[_team] = point; defendPoints[nrDefPoints] = (DefenderPoint*) point; nrDefPoints++; *************** *** 156,168 **** break; case TEAMS_COURTYARD: ! team->getPosX(); ! point = new ReinforcementPoint(team); ! inSiege[team] = point; supportPoints[nrSupPoints] = (ReinforcementPoint*) point; nrSupPoints++; break; case TEAMS_RAMPAGE: ! point = new RampagePoint(team); ! inSiege[team] = point; rampagePoints[nrRmpPoints] = (RampagePoint*) point; nrRmpPoints++; --- 156,167 ---- break; case TEAMS_COURTYARD: ! point = new ReinforcementPoint(_team); ! inSiege[_team] = point; supportPoints[nrSupPoints] = (ReinforcementPoint*) point; nrSupPoints++; break; case TEAMS_RAMPAGE: ! point = new RampagePoint(_team); ! inSiege[_team] = point; rampagePoints[nrRmpPoints] = (RampagePoint*) point; nrRmpPoints++; *************** *** 180,183 **** --- 179,183 ---- defendPoints[nrDefPoints] = (DefenderPoint*) point; nrDefPoints++; + addAction(3,new SiegePointLookUpAction(this,(DefenderPoint*) point)); } else if (category == SiegePoint::TYPE_REI) { point = new ReinforcementPoint(_x,_y); *************** *** 215,218 **** --- 215,219 ---- }; + //UWAGA!!! POPRAWIAÆ inSiege!!!!!!! void AiDefender::support(DefenderPoint* point,int strenght) { int doWyslania = strenght; *************** *** 230,235 **** supportT->transferTo(&doWyslania,newTeam,-1); army->addTeam(newTeam); ! point->team = newTeam; ! point->state = SiegePoint::POINT_GUARDED; }; while (doWyslania>0) { --- 231,236 ---- supportT->transferTo(&doWyslania,newTeam,-1); army->addTeam(newTeam); ! point->teamProtect(newTeam); ! inSiege[newTeam] = point; }; while (doWyslania>0) { *************** *** 269,272 **** --- 270,282 ---- actT->transferTo(&doWyslania,newTeam,-1); army->addTeam(newTeam); + // Powiadamiamy siebie i punkt + inSiege[newTeam] = supportP; + supportP->teamProtect(newTeam); + // Teraz ich wysy³amy + Order* newOrder = + new Order(new OrderMove(supportP->x,supportP->y)); + SiegePoint::ordersToSend.setOrder(newOrder,ORDER_CURRENT); + delete newOrder; + newTeam->getTeamBrain()->newOrders(&SiegePoint::ordersToSend); }; }; Index: SiegePoint.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/army/SiegePoint.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** SiegePoint.cpp 23 Jul 2004 15:58:16 -0000 1.5 --- SiegePoint.cpp 6 Aug 2004 13:14:56 -0000 1.6 *************** *** 1,8 **** #include "SiegePoint.h" - #include "../map/SeenSet.h" #include "../unit/Unit.h" order::OrderPack SiegePoint::ordersToSend; --- 1,8 ---- #include "SiegePoint.h" #include "../map/SeenSet.h" #include "../unit/Unit.h" + #include <iostream> order::OrderPack SiegePoint::ordersToSend; *************** *** 31,34 **** --- 31,35 ---- void SiegePoint::teamProtect(Team* _team) { + if (team=NULL) exit(1); // To inaczej nale¿y obs³u¿yæ... ale niech na razie bêdzie tak team = _team; state = POINT_GUARDED; *************** *** 124,128 **** bool zasloniety = true; for(int i = 0;i<protectorsNr;i++) { ! if (protectors[i]->getState() != POINT_LOST) zasloniety = false; }; --- 125,129 ---- bool zasloniety = true; for(int i = 0;i<protectorsNr;i++) { ! if (protectors[i]->getState() == POINT_LOST) zasloniety = false; }; Index: SiegePoint.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/army/SiegePoint.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** SiegePoint.h 23 Jul 2004 15:58:16 -0000 1.6 --- SiegePoint.h 6 Aug 2004 13:14:56 -0000 1.7 *************** *** 65,69 **** int priority; double protection; - Team* team; public: int pointType() {return TYPE_DEF;}; --- 65,68 ---- *************** *** 91,95 **** class ReinforcementPoint : public SiegePoint { protected: - Team* team; public: int pointType() {return TYPE_REI;}; --- 90,93 ---- |
|
From: Michał Sła. <sw...@us...> - 2004-08-06 13:15:05
|
Update of /cvsroot/bastion/bastion/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22342 Modified Files: World.cpp Log Message: Witam! To juz chyba w miare ostateczna wersja AiDefender'a- wszystko zdaje sie dzialac. Ludziki wchodza na mur, jak widza wroga to prosza kolegow o pomoc itd.itd. Zeby mozna bylo rzeczywiscie zdobywac zamek, trzeba bedzie poprawic jeszcze sporo rzeczy- oto co mi sie nazucilo przy rozgrywaniu moich "partii":) - Gdy oddzial wejdzie na mur miejsce w ktorym sie znajduje jest z reguly prze suwane gdzies w drugi kat zamku, wiec oddzialy go atakujace biegna prosto... na jakas inna baszte, by z calej sily uderzyc glowa w jej mury. - Odkrylem chyba jak to jest z tymi trobkami. W KAZDYM oddziale przy starcie, lub po prostu przy powstaniu tego oddzialu pada jeden zolnierz, lub tworzy sie jakis nadprogramowy Unit, ktory od razu jest usuwany. Moze wy tego nie macie? W kazdym razie u mnie pod kazdym oddzialem na poczatku mozna sie dopatrzec jednego trupka. To bylo tez przyczyna tych zgonow na zawal serca przy szturmowaniu muru- oddzial byl dzielony na mniejsz (odlaczala sie konnica) i w tym mniejszym oddziale tez ktos umieral. To samo jest u mnie- jezeli oddzial rozlacza sie na dwa mniejsze, to z nowego oddzialu ktos umiera! Zastanowcie sie czy to nie jest jakis banalny blad... - Oddzial ktory dostanie rozkaz wejscia na mury juz sie nie zbiera i nie slucha kolejnych rozkazow (moge sie mylic, ale raczej nie). Walczy z przeciwnikami, ale nie probuje juz wrcac do jakiegos szyku itp. Ok... To chyba tyle jak na razie. Sorki, ze tak pozno. Pozdrawiam, zycze udanego odpoczynku Michal ---------------------------------------------------------------------- Index: World.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/World.cpp,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -d -r1.32 -r1.33 *** World.cpp 30 Jun 2004 18:49:28 -0000 1.32 --- World.cpp 6 Aug 2004 13:14:56 -0000 1.33 *************** *** 167,186 **** // Jak znale¼æ mury? Sk±d mam wiedzieæ gdzie ich rozmie¶ciæ? Czy bêdziemy robiæ wczytywanie ich z pliku? if (worldDescription->getWidth()>500) { Team* tm1 = army[1]->addSampleTeam(20,280,315,false,false); Team* tm2 = army[1]->addSampleTeam(8,217,305,false,false); Team* tm3 = army[1]->addSampleTeam(8,225,275,false,false); ! Team* tmd1 = army[1]->addSampleTeam(5,305,310,false,false); ! Team* tmd2 = army[1]->addSampleTeam(5,217,345,false,false); ! Team* tmd3 = army[1]->addSampleTeam(5,200,275,false,false); enemyPlayer->addTeamInitial(tm1,AiDefender::TEAMS_COURTYARD); enemyPlayer->addTeamInitial(tm2,AiDefender::TEAMS_COURTYARD); enemyPlayer->addTeamInitial(tm3,AiDefender::TEAMS_COURTYARD); ! enemyPlayer->addTeamInitial(tmd1,AiDefender::TEAMS_WALLS); ! enemyPlayer->addTeamInitial(tmd2,AiDefender::TEAMS_WALLS); ! enemyPlayer->addTeamInitial(tmd3,AiDefender::TEAMS_WALLS); }; for(int i=0; i<army[0]->getTeamsNum(); i++){ --- 167,205 ---- // Jak znale¼æ mury? Sk±d mam wiedzieæ gdzie ich rozmie¶ciæ? Czy bêdziemy robiæ wczytywanie ich z pliku? if (worldDescription->getWidth()>500) { + // Oddzia³y na dziedziñcu Team* tm1 = army[1]->addSampleTeam(20,280,315,false,false); Team* tm2 = army[1]->addSampleTeam(8,217,305,false,false); Team* tm3 = army[1]->addSampleTeam(8,225,275,false,false); ! // Oddzia³y na murach ! //Team* tmd1 = army[1]->addSampleTeam(5,305,310,false,false); ! //Team* tmd2 = army[1]->addSampleTeam(5,217,345,false,false); ! //Team* tmd3 = army[1]->addSampleTeam(5,200,275,false,false); + // Oddzia³y posi³ków, jeszcze nie przydzielone nikomu. + Team* tmr1 = army[1]->addSampleTeam(5,285,320,false,false); + Team* tmr2 = army[1]->addSampleTeam(5,217,320,false,false); + Team* tmr3 = army[1]->addSampleTeam(5,240,273,false,false); + + + // Dodaje punkty posi³ków tam gdzie s± oddzia³y na dziedziñcu enemyPlayer->addTeamInitial(tm1,AiDefender::TEAMS_COURTYARD); enemyPlayer->addTeamInitial(tm2,AiDefender::TEAMS_COURTYARD); enemyPlayer->addTeamInitial(tm3,AiDefender::TEAMS_COURTYARD); ! // Dodaje go³e punkty obronne- w ci±gu najbli¿szego czasu wojsko je obstawi ! enemyPlayer->addPoint(305,310); ! enemyPlayer->addPoint(217,345); ! enemyPlayer->addPoint(200,275); + // Dodaje punkty obronne tam gdzie s± oddzia³y na murach + //enemyPlayer->addTeamInitial(tmd1,AiDefender::TEAMS_WALLS); + //enemyPlayer->addTeamInitial(tmd2,AiDefender::TEAMS_WALLS); + //enemyPlayer->addTeamInitial(tmd3,AiDefender::TEAMS_WALLS); + + // Dodaje komputerowemu graczu nowe oddzia³y + enemyPlayer->addTeam(tmr1); + enemyPlayer->addTeam(tmr2); + enemyPlayer->addTeam(tmr3); }; for(int i=0; i<army[0]->getTeamsNum(); i++){ |
|
From: Michał Sła. <sw...@us...> - 2004-07-23 15:58:27
|
Update of /cvsroot/bastion/bastion/src/army In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1594 Modified Files: AIDefender.cpp AIDefender.h ArmyAction.h SiegePoint.cpp SiegePoint.h Log Message: Witam Obszerniejszego maila wysle wam osobno bo Neostrada ciagle mi przerywa ... To wkazdym razie jest AI w takim stanie w jakim jest teraz: - Ludziki wchodza na mury.... - wszystko jest jeszcze niewystarczajaco przetestowane - wszystko wymaga pewnych ustawien (aktualnie oddzialy potrzebuja np. za duzo wojska na murach i efekt tego jest smieszny - oddzialy jeszcze nie wchodza na mur tylko na nim startuja- odwlekalem to bo wiaze sie to z pewna decyzja, ktorej jeszcze nie podjalem (dodanie nowego stanu punktu obronnego). ---------------------------------------------------------------------- Index: ArmyAction.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/army/ArmyAction.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** ArmyAction.h 14 Jun 2004 11:02:20 -0000 1.5 --- ArmyAction.h 23 Jul 2004 15:58:16 -0000 1.6 *************** *** 36,39 **** --- 36,40 ---- }; + // Wydawanie rozkazu zadanej dru¿ynie. Dru¿yna mo¿e byæ okre¶lona, b±d¼ podawana za ka¿dym wywo³aniem. class GiveOrderAction : public ArmyAction { protected: *************** *** 44,53 **** orderPack = pack; team = t; }; bool doAction(ArmyBrain* aBrain) { ! ((team->getTeamBrain())->getOrderManager())->mergeWith(orderPack);; ! return true; }; }; class TestAction : public ArmyAction { protected: --- 45,62 ---- orderPack = pack; team = t; }; + GiveOrderAction(order::OrderPack* pack) { + orderPack = pack; team = NULL; + }; + + void getData(void* info) {team = (Team*) info;}; bool doAction(ArmyBrain* aBrain) { ! if (team) { ! ((team->getTeamBrain())->getOrderManager())->mergeWith(orderPack);; ! return true; ! } else {return false;}; }; }; + // Ogólna klasa do akcji warunkowych. Jej podklasy musz± przedefiniowaæ metodê 'test'. class TestAction : public ArmyAction { protected: *************** *** 77,80 **** --- 86,90 ---- }; + // Wczytuje dru¿yne i porównuje czy to zadana - do testowania czy mamy doczynienia z odpowiedni± dru¿yn±. class IsTeamTestAction : public TestAction { protected: *************** *** 110,113 **** --- 120,124 ---- public: SiegePointLookUpAction(AiDefender* _p,DefenderPoint* _d) : player(_p) , point(_d) {}; + void getData(void* _p) {point = (DefenderPoint*) _p;}; bool doAction(ArmyBrain* aBrain); }; Index: AIDefender.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/army/AIDefender.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** AIDefender.cpp 14 Jun 2004 11:02:20 -0000 1.9 --- AIDefender.cpp 23 Jul 2004 15:58:16 -0000 1.10 *************** *** 146,188 **** SiegePoint* point; switch (category) { ! TEAMS_OTHER: break; ! TEAMS_WALLS: point = new DefenderPoint(team,15,(double) 0.5); inSiege[team] = point; defendPoints[nrDefPoints] = (DefenderPoint*) point; nrDefPoints++; ! addAction(1,new SiegePointLookUpAction(this,(DefenderPoint*) point)); break; ! TEAMS_COURTYARD: point = new ReinforcementPoint(team); inSiege[team] = point; ! supportPoints[nrDefPoints] = (ReinforcementPoint*) point; nrSupPoints++; break; ! TEAMS_RAMPAGE: point = new RampagePoint(team); inSiege[team] = point; ! rampagePoints[nrDefPoints] = (RampagePoint*) point; nrRmpPoints++; break; default: break; }; }; void AiDefender::lookUp() { for (int i = 0;i<nrDefPoints;i++) { ! if (defendPoints[i]->lastLookUp - time > LOOKUP_TIME) { lookUp(defendPoints[i]); defendPoints[i]->lastLookUp = time; ! }; }; }; void AiDefender::lookUp(DefenderPoint* point) { ! if (point->state == SiegePoint::POINT_LOST || point->state == SiegePoint::POINT_UNAVAIABLE) return; int need = point->strenghtNeeded(); if (need>IGNORE_STRENGTH) { support(point,need); --- 146,211 ---- SiegePoint* point; switch (category) { ! case TEAMS_OTHER: break; ! case TEAMS_WALLS: point = new DefenderPoint(team,15,(double) 0.5); inSiege[team] = point; defendPoints[nrDefPoints] = (DefenderPoint*) point; nrDefPoints++; ! addAction(3,new SiegePointLookUpAction(this,(DefenderPoint*) point)); break; ! case TEAMS_COURTYARD: ! team->getPosX(); point = new ReinforcementPoint(team); inSiege[team] = point; ! supportPoints[nrSupPoints] = (ReinforcementPoint*) point; nrSupPoints++; break; ! case TEAMS_RAMPAGE: point = new RampagePoint(team); inSiege[team] = point; ! rampagePoints[nrRmpPoints] = (RampagePoint*) point; nrRmpPoints++; break; default: + std :: cout << "WARRNING! AiDefender::AddTeamInitial - WRONG PARAMETER = "<< category <<"!\n"; break; }; }; + void AiDefender::addPoint(int _x,int _y,int category) { + SiegePoint* point; + if (category == SiegePoint::TYPE_DEF) { + point = new DefenderPoint(_x,_y,15,(double) 0.5); + defendPoints[nrDefPoints] = (DefenderPoint*) point; + nrDefPoints++; + } else if (category == SiegePoint::TYPE_REI) { + point = new ReinforcementPoint(_x,_y); + supportPoints[nrSupPoints] = (ReinforcementPoint*) point; + nrSupPoints++; + } else if (category == SiegePoint::TYPE_RMP) { + point = new RampagePoint(_x,_y); + rampagePoints[nrRmpPoints] = (RampagePoint*) point; + nrRmpPoints++; + } else return; + }; + void AiDefender::lookUp() { + std :: cout << "lookin UP!!!!!!!!!!!\n"; for (int i = 0;i<nrDefPoints;i++) { ! //if (defendPoints[i]->lastLookUp - time > LOOKUP_TIME) { lookUp(defendPoints[i]); defendPoints[i]->lastLookUp = time; ! //}; }; + std :: cout << "~lookin UP!!!!!!!!!!!\n"; }; void AiDefender::lookUp(DefenderPoint* point) { ! point->lastLookUp = time; ! if (/*point->state == SiegePoint::POINT_LOST ||*/ point->state == SiegePoint::POINT_UNAVAIABLE) return; int need = point->strenghtNeeded(); + std :: cout << "lookin UP - need = "<< need <<"\n"; if (need>IGNORE_STRENGTH) { support(point,need); *************** *** 196,199 **** --- 219,223 ---- Team* actT = point->getTeam(); + std :: cout << "support() strenght = "<< strenght <<"\n"; ReinforcementPoint* supportP; Team* supportT; *************** *** 210,217 **** --- 234,243 ---- }; while (doWyslania>0) { + std :: cout << "support() wysylamy !"<< doWyslania <<"\n"; supportP = getClosestReinforcements(point); if (!supportP) return; supportT = supportP->getTeam(); int supportStrenght = supportT->getCount(); + std :: cout << "support() wysylamy !"<< supportStrenght <<"\n"; supportT->transferTo(&doWyslania,actT,-1); }; *************** *** 278,281 **** --- 304,308 ---- // Pierwszy znaleziony bestDist = to->distanceTo(supportPoints[i]); + best = supportPoints[i]; }; }; Index: AIDefender.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/army/AIDefender.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** AIDefender.h 1 Jun 2004 09:56:20 -0000 1.6 --- AIDefender.h 23 Jul 2004 15:58:16 -0000 1.7 *************** *** 43,47 **** // Statystyki //int rainforcementCounter; ! static const int IGNORE_STRENGTH=3; public: static const int TEAMS_OTHER = 0; --- 43,47 ---- // Statystyki //int rainforcementCounter; ! static const int IGNORE_STRENGTH=5; public: static const int TEAMS_OTHER = 0; *************** *** 73,76 **** --- 73,79 ---- void addTeam(Team* team); void addTeamInitial(Team* team,const int category = TEAMS_OTHER); + + void addPoint(int _x,int _y,int category = SiegePoint::TYPE_DEF); + void enemySpotted(Team* actTeam); void underAttack(Team* team); Index: SiegePoint.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/army/SiegePoint.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** SiegePoint.cpp 1 Jun 2004 09:56:20 -0000 1.4 --- SiegePoint.cpp 23 Jul 2004 15:58:16 -0000 1.5 *************** *** 1,7 **** --- 1,9 ---- #include "SiegePoint.h" + #include "../map/SeenSet.h" #include "../unit/Unit.h" + order::OrderPack SiegePoint::ordersToSend; *************** *** 15,20 **** SiegePoint::SiegePoint(Team* _team) { ! x = (int) team->getPosX(); ! y = (int) team->getPosY(); team = _team; state = POINT_GUARDED; --- 17,22 ---- SiegePoint::SiegePoint(Team* _team) { ! x = (int) _team->getPosX(); ! y = (int) _team->getPosY(); team = _team; state = POINT_GUARDED; *************** *** 38,44 **** int count;Team* dest; switch (point->getState()) { ! POINT_GUARDED: ! POINT_UNDERATTACK: ! POINT_UNAVAIABLE: dest = point->getTeam(); count = team->getCount(); --- 40,46 ---- int count;Team* dest; switch (point->getState()) { ! case POINT_GUARDED: ! case POINT_UNDERATTACK: ! case POINT_UNAVAIABLE: dest = point->getTeam(); count = team->getCount(); *************** *** 56,60 **** }; break; ! POINT_LOST: count = team->getCount(); if (ile>=count) { --- 58,62 ---- }; break; ! case POINT_LOST: count = team->getCount(); if (ile>=count) { *************** *** 110,119 **** // Wylicza danger i uruchamia int DefenderPoint::strenghtNeeded() { - SeenSet* seen = team->getSeenSet(); - danger = seen->getSeenEnemyCounter(); if (team) { return (priority+((int)(danger*protection)) - team->getCount()); } else { ! return (priority+((int) (danger*protection))); }; }; --- 112,121 ---- // Wylicza danger i uruchamia int DefenderPoint::strenghtNeeded() { if (team) { + SeenSet* seen = team->getSeenSet(); + danger = seen->getSeenEnemyCounter(); return (priority+((int)(danger*protection)) - team->getCount()); } else { ! return (priority); }; }; *************** *** 128,129 **** --- 130,140 ---- return DefenderPoint::strenghtNeeded(); }; + + RampagePoint::RampagePoint(int posX,int posY) : SiegePoint(posX,posY) {}; + RampagePoint::RampagePoint(Team* team) : SiegePoint(team) {}; + + ReinforcementPoint::ReinforcementPoint(int posX,int posY) : SiegePoint(posX,posY) {}; + ReinforcementPoint::ReinforcementPoint(Team* team) : SiegePoint(team) {}; + + + Index: SiegePoint.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/army/SiegePoint.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** SiegePoint.h 14 Jun 2004 11:02:20 -0000 1.5 --- SiegePoint.h 23 Jul 2004 15:58:16 -0000 1.6 *************** *** 94,98 **** public: int pointType() {return TYPE_REI;}; ! ReinforcementPoint(double posX,double posY); ReinforcementPoint(Team* team); }; --- 94,98 ---- public: int pointType() {return TYPE_REI;}; ! ReinforcementPoint(int posX,int posY); ReinforcementPoint(Team* team); }; *************** *** 102,106 **** public: int pointType() {return TYPE_RMP;}; ! RampagePoint(double posX,double posY); RampagePoint(Team* team); }; --- 102,106 ---- public: int pointType() {return TYPE_RMP;}; ! RampagePoint(int posX,int posY); RampagePoint(Team* team); }; |
|
From: Paweł Kęp. <t_...@us...> - 2004-07-15 00:11:20
|
Update of /cvsroot/bastion/bastion/src/save In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8560/src/save Modified Files: Makefile.am Log Message: - poprawki w plikach konfiguracyjnych (teraz powinno sie wszystko kompilowac z obsluga zapisu obiektow do pliku i automatycznym zapisem Configuration) JACEK: Nie wiem czy zaczales sie przymierzac do jakiegos menu glownego, tak czy owak przynajmniej czesc danych do niego jest (lub bedzie) wlasnie w Configuration. Znajdziesz tam juz wektor dostepnych plikow save (klasa SaveDescription w SaveManager.h). Niedlugo pewnie wrzuce tez cos do odczytu dostepnych map. Index: Makefile.am =================================================================== RCS file: /cvsroot/bastion/bastion/src/save/Makefile.am,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Makefile.am 14 Jul 2004 23:18:30 -0000 1.1 --- Makefile.am 15 Jul 2004 00:11:08 -0000 1.2 *************** *** 1,4 **** lib_LIBRARIES = libSave.a ! libUnit_a_SOURCES = BastionInput.h \ BastionOutput.h \ Common.h \ --- 1,4 ---- lib_LIBRARIES = libSave.a ! libSave_a_SOURCES = BastionInput.h \ BastionOutput.h \ Common.h \ |
|
From: Paweł Kęp. <t_...@us...> - 2004-07-15 00:11:19
|
Update of /cvsroot/bastion/bastion/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8560/src Modified Files: Makefile.am Log Message: - poprawki w plikach konfiguracyjnych (teraz powinno sie wszystko kompilowac z obsluga zapisu obiektow do pliku i automatycznym zapisem Configuration) JACEK: Nie wiem czy zaczales sie przymierzac do jakiegos menu glownego, tak czy owak przynajmniej czesc danych do niego jest (lub bedzie) wlasnie w Configuration. Znajdziesz tam juz wektor dostepnych plikow save (klasa SaveDescription w SaveManager.h). Niedlugo pewnie wrzuce tez cos do odczytu dostepnych map. Index: Makefile.am =================================================================== RCS file: /cvsroot/bastion/bastion/src/Makefile.am,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -d -r1.32 -r1.33 *** Makefile.am 14 Jul 2004 23:18:30 -0000 1.32 --- Makefile.am 15 Jul 2004 00:11:07 -0000 1.33 *************** *** 39,43 **** ! SUBDIRS = team unit map army util interface order . noinst_HEADERS = World.h --- 39,43 ---- ! SUBDIRS = team unit map army util interface order save . noinst_HEADERS = World.h *************** *** 54,58 **** ./interface/world/libWorld.a \ ./interface/utils/libInterfaceUtils.a \ ! save/licSave.a \ map/libMap.a \ unit/libUnit.a \ --- 54,58 ---- ./interface/world/libWorld.a \ ./interface/utils/libInterfaceUtils.a \ ! save/libSave.a \ map/libMap.a \ unit/libUnit.a \ |
|
From: Paweł Kęp. <t_...@us...> - 2004-07-15 00:11:19
|
Update of /cvsroot/bastion/bastion In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8560 Modified Files: configure.ac Log Message: - poprawki w plikach konfiguracyjnych (teraz powinno sie wszystko kompilowac z obsluga zapisu obiektow do pliku i automatycznym zapisem Configuration) JACEK: Nie wiem czy zaczales sie przymierzac do jakiegos menu glownego, tak czy owak przynajmniej czesc danych do niego jest (lub bedzie) wlasnie w Configuration. Znajdziesz tam juz wektor dostepnych plikow save (klasa SaveDescription w SaveManager.h). Niedlugo pewnie wrzuce tez cos do odczytu dostepnych map. Index: configure.ac =================================================================== RCS file: /cvsroot/bastion/bastion/configure.ac,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** configure.ac 30 Jun 2004 13:52:36 -0000 1.39 --- configure.ac 15 Jul 2004 00:11:07 -0000 1.40 *************** *** 82,85 **** src/team/Makefile \ src/army/Makefile \ ! src/tests/Makefile ) --- 82,86 ---- src/team/Makefile \ src/army/Makefile \ ! src/tests/Makefile \ ! src/save/Makefile ) |
|
From: Paweł Kęp. <t_...@us...> - 2004-07-14 23:18:39
|
Update of /cvsroot/bastion/bastion/src/save In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32042/src/save Added Files: Makefile.am Log Message: - dodanie wczytywania i zapisywania Configuration (nie wiem nawet to sie skompiluje, ale musze przeinstalowac Linuxa i wtedy bede mogl dzialac nico bardziej interaktywnie) --- NEW FILE: Makefile.am --- lib_LIBRARIES = libSave.a libUnit_a_SOURCES = BastionInput.h \ BastionOutput.h \ Common.h \ Configuration.h \ FileManager.h \ ObjectCreator.h \ SaveManager.h \ Serializer.h \ Configuration.cpp \ FileManager.cpp \ ObjectCreator.cpp \ SaveManager.cpp \ Serializer.cpp LDADD = INCLUDES = -I. -I$(top_srcdir)/src AM_CXXFLAGS = `sdl-config --cflags` SUBDIRS = . |
|
From: Paweł Kęp. <t_...@us...> - 2004-07-14 23:18:39
|
Update of /cvsroot/bastion/bastion/src/interface In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32042/src/interface Modified Files: LoadingScreen.cpp Log Message: - dodanie wczytywania i zapisywania Configuration (nie wiem nawet to sie skompiluje, ale musze przeinstalowac Linuxa i wtedy bede mogl dzialac nico bardziej interaktywnie) Index: LoadingScreen.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/interface/LoadingScreen.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** LoadingScreen.cpp 30 Jun 2004 18:49:30 -0000 1.3 --- LoadingScreen.cpp 14 Jul 2004 23:18:30 -0000 1.4 *************** *** 17,20 **** --- 17,22 ---- #include "interface/gui/puImage.h" + // Pawel: dodane przeze mnie + #include "save/Configuration.h" #include "interface/GameView.h" *************** *** 29,32 **** --- 31,35 ---- #include "interface/utils/SoundManager.h" + Configuration *_config; GameView *_gv; World *_world; *************** *** 135,138 **** --- 138,143 ---- void* LoadingScreen::loadLevel(void *levelName) { + // Pawel: dodane przez mnie + _config = Configuration::load(); // laczenie swiata i wizualizacji *************** *** 158,163 **** --- 163,175 ---- std::cout << " bastion.cpp: cleaning up \n"; + // Pawel: dodane przeze mnie + _config->save(); + delete _world; delete _gv; + + // Pawel: dodane przeze mnie + delete _config; + std::cout << "Bastion pre2END - bye!\n" << SDL_GetError() << std::endl; VideoMode::get()->close(); |
|
From: Paweł Kęp. <t_...@us...> - 2004-07-14 23:18:38
|
Update of /cvsroot/bastion/bastion/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32042/src Modified Files: Makefile.am Log Message: - dodanie wczytywania i zapisywania Configuration (nie wiem nawet to sie skompiluje, ale musze przeinstalowac Linuxa i wtedy bede mogl dzialac nico bardziej interaktywnie) Index: Makefile.am =================================================================== RCS file: /cvsroot/bastion/bastion/src/Makefile.am,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** Makefile.am 29 May 2004 15:48:31 -0000 1.31 --- Makefile.am 14 Jul 2004 23:18:30 -0000 1.32 *************** *** 8,11 **** --- 8,12 ---- ./interface/world/libWorld.a \ ./interface/utils/libInterfaceUtils.a \ + save/libSave.a \ map/libMap.a \ unit/libUnit.a \ *************** *** 53,56 **** --- 54,58 ---- ./interface/world/libWorld.a \ ./interface/utils/libInterfaceUtils.a \ + save/licSave.a \ map/libMap.a \ unit/libUnit.a \ |
|
From: Paweł Kęp. <t_...@us...> - 2004-07-14 22:37:32
|
Update of /cvsroot/bastion/bastion/src/save In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24353 Added Files: BastionInput.h BastionOutput.h Common.h Configuration.cpp Configuration.h FileManager.cpp FileManager.h ObjectCreator.cpp ObjectCreator.h SaveManager.cpp SaveManager.h Serializer.cpp Serializer.h Log Message: Witam wszystkich. Zeby nie bylo, ze sie obijam to wrzucam wstepna wersje savowania. Na razie tylko nowej klasy Configuration, ktora zawierac bedzie wszytskie informacje zachowywane o stanie naszej gry (np. ustawienia) pomiedzy kolejnymi uruchomieniami. Szczegoly juz wkrotce. Wszystko powinno sie komilowac, ale na razie nie mam za bardzo czasu zeby to sprawdzic. Bardzo ekstremalnie w swojej implemantacji uzywam polimorfizmu, co moze powodowac pewne problemy kiedy sami byscie chcieli wykozystac cos odemnie wiec na razie proponuje sie wstrzymac, az wszystko przetesuje. Pozdrawiam --- NEW FILE: Configuration.h --- #ifndef __CONFIGURATION_H__ #define __CONFIGURATION_H__ #include <string> #include "Serializer.h" #include "SaveManager.h" using namespace std; class FileManager; class Configuration { friend class ObjectCreator; static string DEFAULT_FILE_NAME; static Configuration *instance; SaveManager *saveManager; FileManager *fileManager; Configuration() { } void init(); void setFileManager(FileManager *fileManager); static void* create(); public : SaveManager* getSaveManager() const; FileManager* getFileManager() const; static Configuration* load(); void desc(Description *desc) { desc->create(typeid(this)); if (desc->check((void*) saveManager)) saveManager->desc(desc); } void save(); }; #endif --- NEW FILE: Common.h --- #ifndef __COMMON_H__ #define __COMMON_H__ #include <string> using namespace std; /** * Klasa wyjatku rzucana przez klasy implementujace BastionInput i * BastionOutput w przypadku wystapienia powaznego bledu (glownie * w konstruktorach np. gdy nie mozna otworzyc pliku). */ class BastionIOException { }; /** * Klasa stanowiaca abstrakcje strumienia wejsciowego. Umozliwia * sekwencyjny odczyt serii nastepujacych po sobie bajtow. Prostota * interfejsu (w porownaniu do standardowych strumieni w C++) * umozliwia jego latwa implementacje. */ class BastionInput { public : /** * Destruktor wirtualny na potrzeby podklas. */ virtual ~BastionInput() { // pusta implementacja } /** * Metoda wczytujaca do wskazanego bufora sekwencje bajtow * podanej wielkosci. * \param buffer bufor do ktorego maja zostac wczytane dane * \param size ilosc bajtow do wczytania * \return liczba wczytanych bajtow lub -1 w przypadku bledu */ virtual int read(char* buffer, int size) = 0; /** * Zamyka strumien. Po zamknieciu strumienia odczyt z niego daje * nieokreslony wynik. Strumien powinnien zawsze byc zamykany. */ virtual void close() = 0; }; /** * Klasa stanowiaca abstrakcje strumienia wyjsciowego. Umozliwia * sekwencyjny zapis serii nastepujacych po sobie bajtow. Prostota * interfejsu (w porownaniu do standardowych strumieni w C++) * umozliwia jego latwa implementacje. */ class BastionOutput { public : /** * Destruktor wirtualny na potrzeby podklas. */ virtual ~BastionOutput() { // pusta implementacja } /** * Metoda zapisujaca do strumienia sekwencje bajtow podrana z * przekazanego bufora. * \param buffer bufor z ktorego maja zostac pobrane dane * \param size ilosc bajtow do zapisania * \return liczba zapisanych bajtow lub -1 w przypadku bledu */ virtual int write(const char* buffer, int size) = 0; /** * Zamyka strumien. Po zamknieciu strumienia zapis do niego daje * nieokreslony wynik. Strumien powinnien zawsze byc zamykany. */ virtual void close() = 0; }; #endif --- NEW FILE: SaveManager.cpp --- #include "SaveManager.h" #include "FileManager.h" #include "Common.h" #include "BastionInput.h" #include "BastionOutput.h" void* SaveDescription::create() { return new SaveDescription(); } SaveManager::SaveManager() { } SaveManager* SaveManager::createDefault() { SaveManager *result = new SaveManager(); for (int i = 0; i < 12; i++) { SaveDescription *desc = new SaveDescription("--PUSTE--", ""); result->saveDescription.push_back(desc); } return result; } void* SaveManager::create() { return new SaveManager; } vector<SaveDescription*> SaveManager::getSaves() const { return saveDescription; } void save(SaveDescription* save, World *world) { // TODO: napisac } World* load(SaveDescription* save) { // TODO: napisac if (!save->isEmpty()) { } return NULL; } --- NEW FILE: SaveManager.h --- #ifndef __SAVER_H__ #define __SAVER_H__ #include <vector> #include <string> #include <sys/time.h> #include "Serializer.h" using namespace std; class Game; class SaveDescription { friend class ObjectCreator; friend class SaveManager; int saveId; string saveName; time_t saveDate; string saveDesc; bool saveEmpty; static void* create(); SaveDescription() { } SaveDescription(string name, string desc) { saveDate = time(NULL); saveId = -1; saveName = name; saveDesc = desc; saveEmpty = true; } public : void desc(Description *desc) { desc->create(typeid(this)); desc->add(saveDate); desc->add(saveId); desc->add(saveName); desc->add(saveDesc); desc->add(saveEmpty); } void setName(string name) { saveName = name; } void setDesc(string desc) { saveDesc = desc; } string getName() const { return saveName; } time_t getDate() const { return saveDate; } string getDesc() const { return saveDesc; } bool isEmpty() const { return saveEmpty; } }; class FileManager; class World; class SaveManager { friend class ObjectCreator; friend class Configuration; vector<SaveDescription*> saveDescription; static SaveManager* createDefault(); static void* create(); SaveManager(); public : void desc(Description* desc) { Description::ObjectVector<SaveDescription*> objects(desc); desc->create(typeid(this)); objects.add(saveDescription); } vector<SaveDescription*> getSaves() const; void save(SaveDescription* save, World *world); World* load(SaveDescription* save); }; #endif --- NEW FILE: BastionInput.h --- #ifndef __BASTIONINPUT_H__ #define __BASTIONINPUT_H__ #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <iostream> #include "Common.h" using namespace std; class BufferedBastionInput : public BastionInput { BastionInput *input; char *buffer; char *source; int count; int left; public : BufferedBastionInput(BastionInput *reader, int size) { buffer = new char[size]; source = buffer; input = reader; count = size; left = 0; } ~BufferedBastionInput() { close(); delete[] buffer; delete input; } int read(char* dest, int size) { int result = 0; while (size > 0) { if (left == 0) { left = input->read(buffer, count); if (left == 0) return result; if (left == -1) return -1; source = buffer; } int copy = min(left, size); result += copy; left -= copy; size -= copy; while (copy-- > 0) *(dest++) = *(source++); } return result; } void close() { source = buffer; left = 0; input->close(); } }; class BastionInputFile : public BastionInput { static const int attr = O_RDONLY; /// Uchwyt do pliku int fileDesc; int openFile(const char* dir, const char* file) { char buffer[256]; strcpy(buffer, dir); strcat(buffer, "/"); strcat(buffer, file); return ::open(buffer, attr); } public : BastionInputFile(int file) { fileDesc = file; } BastionInputFile(const char *dir, const char *file) { fileDesc = openFile(dir, file); if (fileDesc == -1) throw BastionIOException(); } ~BastionInputFile() { close(); } int read(char *data, int size) { if (fileDesc != -1) { size = ::read(fileDesc, data, size); if (size == -1) cerr << "FILE READ ERROR!!!" << endl; } return size; } void close() { if (fileDesc > 2) { ::close(fileDesc); fileDesc = -1; } } }; #endif --- NEW FILE: FileManager.cpp --- #include "FileManager.h" #include "BastionInput.h" #include "BastionOutput.h" const string FileManager::CONF_DIR("conf"); const string FileManager::SAVE_DIR("save"); BastionInput* FileManager::getConfigurationInput(string name) { BastionInput *result = NULL; try { result = new BastionInputFile(CONF_DIR.c_str(), name.c_str()); result = new BufferedBastionInput(result, DEF_BUF_SIZE); } catch (BastionIOException exception) { cerr << "ERROR: configuration output file open faild\n"; } return result; } BastionOutput* FileManager::getConfigurationOutput(string name) { BastionOutput *result = NULL; try { result = new BastionOutputFile(CONF_DIR.c_str(), name.c_str()); result = new BufferedBastionOutput(result, DEF_BUF_SIZE); } catch (BastionIOException exception) { cerr << "ERROR: configuration output file open faild\n"; } return result; } --- NEW FILE: Configuration.cpp --- #include "Configuration.h" #include "FileManager.h" #include "SaveManager.h" #include "Serializer.h" string Configuration::DEFAULT_FILE_NAME = "bastion.conf"; Configuration* Configuration::instance = NULL; void Configuration::setFileManager(FileManager* fileManager) { this->fileManager = fileManager; } void* Configuration::create() { return new Configuration(); } SaveManager* Configuration::getSaveManager() const { return saveManager; } FileManager* Configuration::getFileManager() const { return fileManager; } void Configuration::init() { saveManager = SaveManager::createDefault(); } Configuration* Configuration::load() { if (instance == NULL) { FileManager *fileManager = new FileManager(); BastionInput *input = fileManager->getConfigurationInput(DEFAULT_FILE_NAME); if (input == NULL) { instance = new Configuration(); instance->init(); } else { instance = readObject<Configuration>(input); delete input; } instance->setFileManager(fileManager); } return instance; } void Configuration::save() { BastionOutput* output = fileManager->getConfigurationOutput(DEFAULT_FILE_NAME); if (output != NULL) { writeObject<Configuration>(this, output); } delete output; } --- NEW FILE: Serializer.h --- #ifndef __SERIALIZE_H__ #define __SERIALIZE_H__ #include <typeinfo> #include <string> #include <vector> #include "Common.h" using namespace std; /** * SLOWNIKCZEK :) * * bastionizacja - zapisanie lub wczytanie obiektu gry BASTION * wykonywane za pomoca ponizszego API. * * obiekt - instancja klasy spelniajacej warunki bastionizacji */ /** * Zapisuje przekazany jako pierwszy argument obiekt do podanego * jako drugi argument strumienia wyjsciowego. Klasa przekazanego * do zapisania obiektu musi spelniac wymogi bastionizacji. * * Przyklad wywolania: * World *world = ... * writeObject<World>(world, saveFile); */ template<class T> void writeObject(T* obj, BastionOutput* stream); /** * Wczytuje obiekt danego typu ze wskazanego strumienia wejsciowego. * Klasa wczytywanego obiektu musi spelniac wymogi bastionizacji. * * Przyklad wywolania: * World *world = readObject<World>(saveFile); */ template<class T> T* readObject(BastionInput* stream); /** * Klasa opisu obiektu. Jej zadaniem jest umozliwienie opisania * struktury klasy - jej nadklas, konstruktorow, atrybutow i * skladowych. Dzieki takiemu opisowi funkcje writeObject(...) i * readObject(...) moga poprawnie zbastionizowac przekazane obiekty. */ class Description { private : /// Blokowanie kopiowanie obiektow klasy Description Description(Description const& desc); /// Blokowanie kopiowania obiektow klasy Description Description& operator=(Description const& desc); protected : /// Tworzenie obiektu tylko dla podklas Description() { // pusta implementacja } public : /// Zwraca obiekt Description na potrzeby readObject(...). static Description *getReader(BastionInput* stream); /// Zwraca obiekt Description na potrzeby writeObject(...). static Description *getWriter(BastionOutput* stream); /// Destruktor wirtualny na potrzeby klas podklas. virtual ~Description() { // pusta implementacja } /** * Klasa pomocnicza uzywana do definiowania atrybutow obiektow * bedacych wekorami wartosci prostych lub wskaznikow do takich * wartosci. */ template <class T> class AttrVector { Description *desc; public : /// Tworzy nowego "pomocnika" AttrVector(Description *desc) { this->desc = desc; } /// Dodaje definicje wskazanego wektora void add(vector<T> &vec) { int size = vec.size(); desc->add(size); vec.resize(size); while (size > 0) desc->add(vec[--size]); } }; /** * Klasa pomocnicza uzywana do definiowania atrybutow obiektow * bedacych wekorami wskaznikow do innych obiektow. */ template <class T> class ObjectVector { Description *desc; public : /// Tworzy nowego "pomocnika" ObjectVector(Description *desc) { this->desc = desc; } /// Dodaje definicje wskazanego wektora void add(vector<T> &vec) { int size = vec.size(); desc->add(size); vec.resize(size); while (--size >= 0) if (desc->check((void*) vec[size])) vec[size]->desc(desc); } }; /** * Funkcja definiujaca "konstruktor" dla obiektu danej klasy. * Odpowiednia funkcja jest wybierana na podstawie przekazanej * informacji o typie obiektu. * * Przyklad wywolania ("typeid" to slowo kluczowe w C++): * desc->create(typeid(this)); */ virtual void create(const type_info& info) = 0; /** * Funkcja sprawdzajaca, czy wskazywany przez wskaznik obiekt * zostal juz przetworzony. Zaraz po tym wywolaniu powinno * nastapic warunkowe (w przypadku zwrocenia przez ta metode * true) wywolanie metody desc tego obiektu. */ virtual bool check(void* &object) = 0; /** * Funkcje definiujace attrybuty obiektu bedace wskaznikami lub * dynamicznymi obszarami pamieci. Implementacja automatycznie * wykrywa wskazniki wskazujace na ten sam element w pamieci. * Jako drugi argument wszystkich funkcji przekazywana jest * liczba elementow danego typu do ktorego prowadzi wskaznik * (wielkosc dynamicznie alokowanej tablicy). */ virtual void add(string* &pointer, int size) = 0; virtual void add(double* &pointer, int size) = 0; virtual void add(float* &pointer, int size) = 0; virtual void add(long* &pointer, int size) = 0; virtual void add(int* &pointer, int size) = 0; virtual void add(short* &pointer, int size) = 0; virtual void add(char* &pointer, int size) = 0; virtual void add(bool* &pointer, int size) = 0; virtual void add(string* &pointer) = 0; virtual void add(double* &pointer) = 0; virtual void add(float* &pointer) = 0; virtual void add(long* &pointer) = 0; virtual void add(int* &pointer) = 0; virtual void add(short* &pointer) = 0; virtual void add(char* &pointer) = 0; virtual void add(bool* &pointer) = 0; /** * Funkcja definujaca atrybuty obiektu bedace tablicami * wartosci prostych. Drugi argument okresla ilosc elemntow * w talocy (a nie jej wielkosc w bajtach). */ virtual void add(const string *array, int size) = 0; virtual void add(const double *array, int size) = 0; virtual void add(const float *array, int size) = 0; virtual void add(const long *array, int size) = 0; virtual void add(const int *array, int size) = 0; virtual void add(const short *array, int size) = 0; virtual void add(const char *array, int size) = 0; virtual void add(const bool *array, int size) = 0; virtual void add(string array[], int size) = 0; virtual void add(double array[], int size) = 0; virtual void add(float array[], int size) = 0; virtual void add(long array[], int size) = 0; virtual void add(int array[], int size) = 0; virtual void add(short array[], int size) = 0; virtual void add(char array[], int size) = 0; virtual void add(bool array[], int size) = 0; /** * Funkcje definujace attrybuty obiektu bedace wartosciami prostymi. * Jako argument pobieraja referencje (nie wskaznik!!!) do danego * atrybutu. */ virtual void add(string &value) = 0; virtual void add(double &value) = 0; virtual void add(float &value) = 0; virtual void add(long &value) = 0; virtual void add(int &value) = 0; virtual void add(short &value) = 0; virtual void add(char &value) = 0; virtual void add(bool &value) = 0; }; /** * Zapisuje przekazany jako pierwszy argument obiekt * do podanego strumienia. */ template<class T> void writeObject(T* obj, BastionOutput* stream) { Description *writer = Description::getWriter(stream); if (writer->check((void*)obj)) obj->desc(writer); delete writer; } /** * Wczytuje obiekt podanego typu ze strumienia. */ template<class T> T* readObject(BastionInput* stream) { Description *reader = Description::getReader(stream); void *obj = 0; if (reader->check(obj)) ((T*) obj)->desc(reader); delete reader; return (T*)obj; }; #endif --- NEW FILE: Serializer.cpp --- #include "Serializer.h" #include <map> #include <iostream> #include "ObjectCreator.h" using namespace std; // TODO: zapisywanie/odczytywanie atrybutow wskaznikowych // TODO: sprawdzanie zachodzacych na siebie fragmentow pamieci class DescriptionImpl : public Description { protected: virtual void updateBuffer(char *data, int size) = 0; public : void add(long &attr) { updateBuffer((char*)&attr, sizeof(long)); } void add(int &attr) { updateBuffer((char*)&attr, sizeof(int)); } void add(short &attr) { updateBuffer((char*)&attr, sizeof(short)); } void add(char &attr) { updateBuffer((char*)&attr, sizeof(char)); } void add(float &attr) { updateBuffer((char*)&attr, sizeof(float)); } void add(double &attr) { updateBuffer((char*)&attr, sizeof(double)); } void add(bool &attr) { updateBuffer((char*)&attr, sizeof(bool)); } void add(double array[], int size) { updateBuffer((char*)array, size*sizeof(double)); } void add(float array[], int size) { updateBuffer((char*)array, size*sizeof(float)); } void add(long array[], int size) { updateBuffer((char*)array, size*sizeof(long)); } void add(int array[], int size) { updateBuffer((char*)array, size*sizeof(int)); } void add(short array[], int size) { updateBuffer((char*)array, size*sizeof(short)); } void add(char array[], int size) { updateBuffer((char*)array, size); } void add(bool array[], int size) { updateBuffer((char*)array, size*sizeof(bool)); } void add(const double *array, int size) { updateBuffer((char*)array, size*sizeof(double)); } void add(const float *array, int size) { updateBuffer((char*)array, size*sizeof(float)); } void add(const long *array, int size) { updateBuffer((char*)array, size*sizeof(long)); } void add(const int *array, int size) { updateBuffer((char*)array, size*sizeof(int)); } void add(const short *array, int size) { updateBuffer((char*)array, size*sizeof(short)); } void add(const char *array, int size) { updateBuffer((char*)array, size); } void add(const bool *array, int size) { updateBuffer((char*)array, size*sizeof(bool)); } }; class Writer : public DescriptionImpl { map<void*, int> mapping; BastionOutput *output; void *last; bool isNew; protected : /// Funkcja wrzucajaca do bufora dany obszar pamieci void updateBuffer(char *object, int size) { output->write(object, size); } public : Writer(BastionOutput *file) { output = file; isNew = true; mapping[NULL] = 0; } void create(const type_info &info) { int index = ObjectCreator::find(info); if (isNew) { if (index == -1) { cerr << "ERROR WHILE SERIALIZING OBJECT:"; cerr << info.name() << endl; } updateBuffer((char*)&index, sizeof(int)); } mapping[last] = index; isNew = false; } bool check(void* &object) { updateBuffer((char*)&object, sizeof(void*)); if (mapping.find(object) == mapping.end()) { last = object; isNew = true; return true; } return false; } void add(string &attr) { int length = attr.length(); DescriptionImpl::add(length); DescriptionImpl::add(attr.c_str(), length); } void add(string* &pointer, int size) { if (check((void*)pointer)) { updateBuffer((char*) pointer, sizeof(int)); add((const string*) pointer, size); } } void add(double* &pointer, int size) { if (check((void*)pointer)) { updateBuffer((char*) pointer, sizeof(int)); DescriptionImpl::add((const double*) pointer, size); } } void add(float* &pointer, int size) { if (check((void*)pointer)) { updateBuffer((char*) pointer, sizeof(int)); DescriptionImpl::add((const float*) pointer, size); } } void add(long* &pointer, int size) { if (check((void*)pointer)) { updateBuffer((char*) pointer, sizeof(int)); DescriptionImpl::add((const long*) pointer, size); } } void add(int* &pointer, int size) { if (check((void*)pointer)) { updateBuffer((char*) pointer, sizeof(int)); DescriptionImpl::add((const int*) pointer, size); } } void add(short* &pointer, int size) { if (check((void*)pointer)) { updateBuffer((char*) pointer, sizeof(int)); DescriptionImpl::add((const short*) pointer, size); } } void add(char* &pointer, int size) { if (check((void*)pointer)) { updateBuffer((char*) pointer, sizeof(int)); DescriptionImpl::add((const char*) pointer, size); } } void add(bool* &pointer, int size) { if (check((void*)pointer)) { updateBuffer((char*) pointer, sizeof(int)); DescriptionImpl::add((const bool*) pointer, size); } } void add(string* &pointer) { if (check((void*)pointer)) add(*pointer); } void add(double* &pointer) { if (check((void*)pointer)) DescriptionImpl::add(*pointer); } void add(float* &pointer) { if (check((void*)pointer)) DescriptionImpl::add(*pointer); } void add(long* &pointer) { if (check((void*)pointer)) DescriptionImpl::add(*pointer); } void add(int* &pointer) { if (check((void*)pointer)) DescriptionImpl::add(*pointer); } void add(short* &pointer) { if (check((void*)pointer)) DescriptionImpl::add(*pointer); } void add(char* &pointer) { if (check((void*)pointer)) DescriptionImpl::add(*pointer); } void add(bool* &pointer) { if (check((void*)pointer)) DescriptionImpl::add(*pointer); } void add(string array[], int size) { while (size-- > 0) add(array[size]); } void add(const string *array, int size) { string *pointer = (string*) array; while (size-- > 0) add(pointer[size]); } }; class Reader : public DescriptionImpl { map<void*, void*> mapping; BastionInput *input; protected: /// Funkcja wrzucajaca do bufora dany obszar pamieci void updateBuffer(char *object, int size) { input->read(object, size); } public : Reader(BastionInput *file) { input = file; mapping[NULL] = NULL; } void create(const type_info &info) { } bool check(void* (&object)) { void *pointer = 0; int index; updateBuffer((char*) &pointer, sizeof(void*)); if (mapping.find(pointer) == mapping.end()) { updateBuffer((char*) &index, sizeof(int)); object = ObjectCreator::create(index); if (object == NULL) cerr << "NULL POINTER CREATED (" << index << ")" << endl; mapping[pointer] = object; return true; } object = mapping[pointer]; return false; } void add(string &attr) { int length = 0; DescriptionImpl::add(length); if (length > 0) { char table[length]; DescriptionImpl::add((const char*)table, length); attr = string(table, length); } } void add(string* &pointer, int size) { if (check((void*)pointer)) { pointer = new string[size]; add((const string*) pointer, size); } } void add(double* &pointer, int size) { if (check((void*)pointer)) { pointer = new double[size]; updateBuffer((char*) pointer, size*sizeof(double)); } } void add(float* &pointer, int size) { if (check((void*)pointer)) { pointer = new float[size]; updateBuffer((char*) pointer, size*sizeof(float)); } } void add(long* &pointer, int size) { if (check((void*)pointer)) { pointer = new long[size]; updateBuffer((char*) pointer, size*sizeof(long)); } } void add(int* &pointer, int size) { if (check((void*)pointer)) { pointer = new int[size]; updateBuffer((char*) pointer, size*sizeof(int)); } } void add(short* &pointer, int size) { if (check((void*)pointer)) { pointer = new short[size]; updateBuffer((char*) pointer, size*sizeof(short)); } } void add(char* &pointer, int size) { if (check((void*)pointer)) { pointer = new char[size]; updateBuffer((char*) pointer, size); } } void add(bool* &pointer, int size) { if (check((void*)pointer)) { pointer = new bool[size]; updateBuffer((char*) pointer, size*sizeof(bool)); } } void add(string* &pointer) { if (check((void*)pointer)) { pointer = new string; add(*pointer); } } void add(double* &pointer) { if (check((void*)pointer)) { pointer = new double; DescriptionImpl::add(*pointer); } } void add(float* &pointer) { if (check((void*)pointer)) { pointer = new float; DescriptionImpl::add(*pointer); } } void add(long* &pointer) { if (check((void*)pointer)) { pointer = new long; DescriptionImpl::add(*pointer); } } void add(int* &pointer) { if (check((void*)pointer)) { pointer = new int; DescriptionImpl::add(*pointer); } } void add(short* &pointer) { if (check((void*)pointer)) { pointer = new short; DescriptionImpl::add(*pointer); } } void add(char* &pointer) { if (check((void*)pointer)) { pointer = new char; DescriptionImpl::add(*pointer); } } void add(bool* &pointer) { if (check((void*)pointer)) { pointer = new bool; DescriptionImpl::add(*pointer); } } void add(string array[], int size) { while (size-- > 0) add(array[size]); } void add(const string *array, int size) { string *pointer = (string*) array; while (size-- > 0) add(pointer[size]); } }; Description* Description::getReader(BastionInput *stream) { return new Reader(stream); } Description* Description::getWriter(BastionOutput *stream) { return new Writer(stream); } --- NEW FILE: FileManager.h --- #ifndef __FILE_MANAGER_H__ #define __FILE_MANAGER_H__ #include <string> #include "Common.h" using namespace std; class FileManager { friend class Configuration; const static int DEF_BUF_SIZE = 4096; const static string SAVE_DIR; const static string CONF_DIR; FileManager() { } BastionInput* getConfigurationInput(string name); BastionOutput* getConfigurationOutput(string name); public : }; #endif --- NEW FILE: ObjectCreator.cpp --- #include "ObjectCreator.h" #include "Configuration.h" #include <iostream> using namespace std; ObjectCreator* ObjectCreator::creatorTable[] = { NULL, // Puste pierwsze wejscie. Nie zmieniac go !!! new ObjectCreator(typeid(SaveDescription*), SaveDescription::create), new ObjectCreator(typeid(SaveManager*), SaveManager::create), new ObjectCreator(typeid(Configuration*), Configuration::create) }; int ObjectCreator::find(const type_info& info) { // Przegladamy tablice w poszukiwaniu obiektu ObjectCreator z // type_info jak podane int size = sizeof(creatorTable)/sizeof(ObjectCreator*); for (int i = 0; i < size; ++i) if (creatorTable[i] != NULL) if (creatorTable[i]->getTypeInfo() == info) return i; return -1; } void* ObjectCreator::create(int index) { int size = sizeof(creatorTable)/sizeof(ObjectCreator*); if (index > 0 && index < size) { ObjectCreator *creator = creatorTable[index]; if (creator != NULL) return creator->createObject(); } return NULL; } --- NEW FILE: BastionOutput.h --- #ifndef __BASTIONOUTPUT_H__ #define __BASTIONOUTPUT_H__ #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <iostream> #include "Common.h" using namespace std; class BufferedBastionOutput : public BastionOutput { BastionOutput *output; char *buffer; char *dest; int count; int left; public : BufferedBastionOutput(BastionOutput *writer, int size) { buffer = new char[size]; dest = buffer; output = writer; count = size; left = size; } ~BufferedBastionOutput() { close(); delete[] buffer; delete output; } int write(const char* source, int size) { int result = 0; while (size > 0) { if (left == 0) { left = output->write(buffer, count); if (left < count) { dest = buffer; left = count; return result; } if (left == -1) return -1; } int copy = min(left, size); result += copy; left -= copy; size -= copy; while (copy-- > 0) *(dest++) = *(source++); } return result; } void flush() { if (dest != buffer) { output->write(buffer, dest-buffer); dest = buffer; left = count; } } void close() { flush(); output->close(); } }; class BastionOutputFile : public BastionOutput { // Prawa uzywane do otwarcia pliku static const int attr = O_WRONLY|O_CREAT; /// Uchwyt pliku int fileDesc; int createDir(const char *dir, int len) { if (mkdir(dir, 0777) == -1) { int result = -1; if (errno == ENOENT) { while (--len > 0) { if (dir[len] == '/') { ((char*) dir)[len] = 0; result = createDir(dir, len); ((char*) dir)[len] = '/'; if (result != -1) return mkdir(dir, 0777); } } } return result; } return 0; } int openFile(const char *dir, const char *file) { char buffer[256]; strcpy(buffer, dir); strcat(buffer, "/"); strcat(buffer, file); return ::open(buffer, attr, 0333); } public : BastionOutputFile(int file) { fileDesc = file; } BastionOutputFile(const char *dir, const char *file) { fileDesc = openFile(dir, file); if (fileDesc == -1) { if (createDir(dir, strlen(dir)) == -1 || (fileDesc = openFile(dir, file)) == -1) { cerr << "FILE OPEN ERROR!!!" << endl; throw BastionIOException(); } } } ~BastionOutputFile() { close(); } int write(const char *data, int size) { if (fileDesc != -1) if (::write(fileDesc, data, size) != size) { cerr << "FILE WRITE ERROR!!!" << endl; return -1; } return size; } void close() { if (fileDesc > 2) { ::close(fileDesc); fileDesc = -1; } } }; #endif --- NEW FILE: ObjectCreator.h --- #ifndef __OBJECT_CREATOR_H__ #define __OBJECT_CREATOR_H__ #include <typeinfo> using namespace std; class ObjectCreator { static ObjectCreator* creatorTable[]; void* (*creator)(); const type_info& typeInfo; ObjectCreator(const type_info& objectType, void* (*objectCreator)()) : typeInfo(objectType), creator(objectCreator) { } void* createObject() { return creator(); } const type_info& getTypeInfo() { return typeInfo; } public : /** * \return indeks creatora dla obiektu danego typu lub -1 w * przypadku bledu (nie znalezienia typu) */ static int find(const type_info& info); /** * Tworzy instancje obiektu o podanym indeksie. Dla indeksu * rownego 0 zwraca zawsze NULL'a. */ static void* create(int index); }; #endif |
|
From: Paweł Kęp. <t_...@us...> - 2004-07-14 22:30:04
|
Update of /cvsroot/bastion/bastion/src/save In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24018/save Log Message: Directory /cvsroot/bastion/bastion/src/save added to the repository |
|
From: Jacek K. <jac...@us...> - 2004-07-14 18:18:04
|
Update of /cvsroot/bastion/bastion/doc In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4551 Added Files: Licencjat.tex Log Message: - dodanie pliku Licencjat.tex - dokument w wersji przesylanej mailem przez Darka. --- NEW FILE: Licencjat.tex --- %& --translate-file=il2-pl \documentclass[licencjacka]{pracamgr} \usepackage{polski} % Je¿eli Twój TeX nie reaguje na komentarz w~pierwszej linijce, % i~psuje polskie znaki, uaktywnij poni¿sz± deklaracjê: %\usepackage[latin2]{inputenc} % Dane magistranta: \author{Dariusz Ku¶mierek} \nralbumu{197885} \title{Implementacja gry strategicznej czasu rzeczywistego -- projekt~,,{\bf Bastion}''} \kierunek{Informatyka} % Praca wykonana pod kierunkiem: % (podaæ tytu³/stopieñ imiê i nazwisko opiekuna % Instytut % ew. Wydzia³ ew. Uczelnia (je¿eli nie MIM UW)) \opiekun{mgr. Krzysztofa Ciebiery\\ Zak³ad Analizy Algorytmów\\ Instytut Informatyki\\ } % miesi±c i~rok: \date{Lipiec 2004} % Podaæ klasyfikacjê tematyczn± wed³ug AMS MSC 2000 lub ACM CCS: \klasyfikacja{ K. Computing Milieux \\ K.8 Personal Computing\\ K.8.0 General\\ Subject Descriptor: Games\\ } % S³owa kluczowe: \keywords{gra strategiczna czasu rzeczywistego, informacja, sztuczna inteligencja} % Tu jest dobre miejsce na Twoje w³asne makra i~¶rodowiska: \newtheorem{defi}{Definicja}[subsection] % koniec definicji \begin{document} \maketitle \begin{abstract} W~pracy przedstawiono implementacjê gry~strategicznej czasu rzeczywistego rozgrywaj±cej siê w~trójwymiarowym ¶wiecie. Rozwój sprzêtu komputerowego, w szczególno¶ci za¶ akceleratorów grafiki trójwymiarowej, pozwoli³ na~stworzenie rozbudowanego modelu ¶wiata gry oraz jego jednoczesn±, precyzyjn± prezentacjê. Nacisk po³o¿ony na~hermetyczno¶æ systemu przekazu informacji i poleceñ, pozwoli³ na~niezwykle realistyczne oddanie sytuacji dowódcy wojsk w~czasie kampanii. \end{abstract} \tableofcontents %\listoffigures %\listoftables \newpage \section*{Wprowadzenie} \addcontentsline{toc}{section}{Wprowadzenie} Niniejsza praca stanowi podsumowanie projektu znanego jako ,,{\bf Bastion}'', polegaj±cego na implementacji gry strategicznej czasu rzeczywistego, w~której gracz dowodzi armi± jednostek uformowanych w oddzia³y, zdolnych do~wykonywania rozmaitych rozkazów. Projekt~,,{\bf Bastion}'' zrealizowany zosta³ przez zespó³ w~sk³adzie (w~kolejno¶ci alfabetycznej): \begin{itemize} \item Pawe³ Kêpka \item Jacek Ko³odziej -- kierownik zespo³u \item Dariusz Ku¶mierek \item Micha³ S³apa \end{itemize} Niniejsza praca sk³ada siê z~2~rozdzia³ów. Rozdzia³~1 stanowi ca³o¶ciowy opis projektu. Przypominamy w nim podstawowe pojêcia wi±¿±ce siê z grami strategicznymi czasu rzeczywistego, nastêpnie przedstawiamy regu³y, jakimi rz±dzi siê ¶wiat przez nas modelowany oraz za³o¿enia, jakimi kierowali¶my siê~podczas realizacji gry, by ostatecznie po¶wiêciæ kilka zdañ technikaliom wi±¿±cym ~siê ze~¶rodowiskiem programistycznym, w~jakim powstawa³ ,,{\bf Bastion}'' oraz bibliotekom wykorzystanym do~jego implementacji. Rozdzia³~2 zawiera podsumowanie wk³adu, jaki przedk³adaj±cy niniejsz± pracê w³o¿y³ w~realizacjê projektu~,,{\bf Bastion}''. \chapter{Opis projektu~,,{\bf Bastion}''}\label{r:opis} \section{Podstawowe pojêcia}\label{r:pojecia} \subsection{Gra strategiczna czasu rzeczywistego} Gry strategiczne czasu rzeczywistego (ang. {\it RTS -- Real Time Strategy}) pozwalaj± graczom na~wziêcie udzia³u w~rozgrywce, podczas której akcje podejmowane przez przeciwnika oraz przez gracza i~jego jednostki odbywaj± siê~jednocze¶nie. Takie uporz±dkowanie rozgrywki wymusza wykonywanie wszelkich obliczeñ na~bie¿±co, co~niesie za sob± konieczno¶æ zastosowania efektywnych, czêsto przybli¿onych algorytmów. \subsection{Informacje i mg³y wojny} Genera³ Sun Tzu Wu (500 r. p. n. e.) tak pisa³ w~ostatnim rozdziale swej s³ynnej ,,{\it Sztuki~wojny}'': \begin{quote} Tak wiêc ¶wiat³y w³adca i~rozs±dny genera³ zawsze wygrywaj±; osi±gaj±~to, czego pospolity cz³owiek osi±gn±æ nie~potrafi - a~wszystko~to dziêki temu, ¿e~wiedz± wcze¶niej. Wiedzy takiej nie~mo¿na otrzymaæ od~bogów, nie~mo¿na jej~zdobyæ przez obserwacjê rzeczywisto¶ci, nie~mo¿na jej~te¿~wyczytaæ z~gwiazd. Jedynym sposobem, aby~poznaæ wroga, to~zdobyæ wiadomo¶ci o~nim od~kogo¶ innego. \raggedleft\slshape t³um. z~chiñskiego Jaros³aw Zawadzki \end{quote} Genera³ zwraca w~powy¿szym fragmencie uwagê czytelnika na~kluczowe znaczenie informacji w~rozwoju kampanii wojennej. Twórcy gier strategicznych dla~dodania swym produkcjom realizmu od~lat stosuj± metodê ukrywania przed graczem informacji na~temat nie~widocznego w~danym momencie terenu (najwa¿niejsz± -- i~zazwyczaj jedyn± -- ukrywan± w~ten sposób informacj± jest obecno¶æ wrogich jednostek). Technika ta~nazywana jest powszechnie mg³ami wojny (ang. {\it Fog of war}). \section{Rzeczywisto¶æ modelowana w~projekcie ,,{\bf Bastion}'' }\label{r:rzeczywisto¶æ} \subsection{Cel gry} W~,,{\bf Bastionie}'' gracz wciela siê~w~rolê genera³a dowodz±cego wojskami szturmuj±cymi zamek. Na~planszy (wewn±trz oraz na~zewn±trz zamku) znajduj±~siê tak¿e jednostki wojsk przeciwnych, z~którymi armia genera³a musi siê~zmierzyæ. Celem gracza jest doprowadzenie do zdobycia zamku. Gra koñczy~siê klêsk± w~momencie ¶mierci genera³a. \subsection{Informacje i rozkazy} Gracz obserwuje ¶wiat z~perspektywy genera³a. Przyjêli¶my za³o¿enie, i¿~zarówno kszta³t jak i rodzaj terenu na ca³ej planszy jest znany, nieznane pozostaje po³o¿enie oraz liczno¶æ wojsk zarówno przeciwnych jak i~podleg³ych genera³owi. Gracz obserwowaæ mo¿e w~trakcie gry bezpo¶rednie po³o¿enie jednostek widocznych dla genera³a; dla jednostek, które opu¶ci³y pole widzenia dowódcy wy¶wietlana jest ostania pozycja, w~której by³y widziane. Do takiej pozycji bêdziemy siê~odnosiæ jako do {\it ostatniej zaobserwowanej pozycji} jednostki. Ostatnia zaobserwowana pozycja zostaje zaktualizowana w~momencie, w~którym dowódca dostrze¿e rzeczon± jednostkê w~innej lokalizacji. Aktualizacja ostatniej zaobserwowanej pozycji ma~tak¿e miejsce, gdy do dowódcy dotrze pos³aniec wys³any przez który¶ z oddzia³ów. Pos³aniec przekazuje dowódcy informacje na~temat zaobserwowanego po³o¿enia jednostek. Je¿eli pos³aniec posiada ¶wie¿sze od genera³a informacje odno¶nie lokalizacji danej jednostki, wówczas ostatnia zaobserwowana pozycja tej¿e jednostki zostaje zaktualizowana. Podobnie jak~w~wiêkszo¶ci gier strategicznych, równie¿ w~,,{\bf Bastionie}'' kluczowym dla~rozgrywki jest wykonywanie rozkazów dowódcy przez oddzia³y jemu podlegaj±ce. Ze wzglêdu na za³o¿enie o~jak najwy¿szym stopniu realizmu rozgrywki, w~,,{\bf Bastionie}'' rozkaz, zanim zostanie wykonany przez oddzia³, musi zostaæ do~niego dostarczony przez pos³añca. Pos³añcy s± zwyk³ymi jednostkami przemieszczaj±cymi siê pomiêdzy oddzia³em dowódcy a pozosta³ymi; tak samo jak~wszystkie inne jednostki, pos³añcy mog± zostaæ zabici przez przeciwnika. P³ynie z~tego wa¿ki wniosek, i¿~rozkaz wydany przez dowódcê mo¿e nie~dotrzeæ do~celu, a~zatem nigdy nie zostaæ wykonanym, w~najlepszym za¶~razie zostanie wykonany z~opó¼nieniem, równym czasowi podró¿y pos³añca pomiêdzy dowódc± a oddzia³em (na~pos³añca wybierana jest najszybsza jednostka w~oddziale dowódcy). \subsubsection{Rozkazy z³o¿one} Ze~wzglêdu na~omówione powy¿ej ograniczenia stoj±ce przed dowódc±, zrodzi³a~siê potrzeba rozbudowania mechanizmu definiowania rozkazów. W~,,{\bf Bastionie}'' gracz definiuje drzewo rozkazu z~rozkazów podstawowych takich jak: przemieszczenie~siê do~zadanej pozycji (opcjonalne przemieszczanie siê w~lesie, lub z~dala od zamku), oczekiwanie na~up³yniêcie pewnego czasu, lub na~nadej¶cie sygna³u rogu (pozwala na~synchronizacjê dzia³añ kilku oddzia³ów), atakowanie muru (stawianie drabin pod~murem), b±d¼ podzielenie oddzia³u. W ramach definicji rozkazu, gracz wyspecyfikowaæ mo¿e stopieñ waleczno¶ci ¿o³nierzy (atakowanie ka¿dego przeciwnika, unikanie walki, atakowanie tylko mniej licznych oddzia³ów). Wspomnieli¶my, i¿~rozkaz z³o¿ony ma~strukturê drzewiast±. Ka¿dy rozkaz podstawowy zakoñczyæ siê~mo¿e sukcesem~lub~pora¿k±. Gracz ma mo¿liwo¶æ wyspecyfikowania, jakie akcje zostan± przez oddzia³ wykonane w~zale¿no¶ci od~wyniku danej akcji. \subsection{Jednostki} W~,,{\bf Bastionie}'' wystêpuj± trzy rodzaje jednostek \begin{itemize} \item [--] Piechota - standardowa jednostka bojowa \item [--] £ucznicy - standardowa jednostka zdolna do~ataku na~odleg³o¶æ \item [--] Konnica - szybsza i~potê¿niejsza jednostka, nie~zdolna jednak do~wspinania~siê po~drabinie i~zdobywania murów. W~czasie ataku na~mur, konnica od³±czana jest od~oddzia³u. \end{itemize} \subsection{Oddzia³y} Jednostki uformowane s± w~oddzia³y. Oddzia³ zarz±dza po³o¿eniem poszczególnych jednostek, dbaj±c o~to, aby~jednostki poszczególnych rodzajów porusza³y~siê razem (w~pododdzia³ach). W ramach oddzia³u wykonywane s±~modyfikacje formacji, konieczne na~przyk³ad w~sytuacji, gdy na drodze oddzia³u znajduje siê~w±ski w±wóz. Oddzia³ tak¿e, poprzez dostosowanie po³o¿enia, do~którego d±¿± poszczególne jednostki, mo¿e czekaæ na~maruderów, czyli jednostki, które nie~dotar³y do wyznaczonych im~pozycji (jednostki takie zwiêkszaj± swoj± prêdko¶æ na~krótkim dystansie, celem zniwelowania opó¼nienia). \subsection{Plansza i teren} Jednostki poruszaj±~siê po~planszy, która podzielona jest na~pola. Chocia¿ w~ramach jednego pola znajdowaæ siê~mo¿e tylko jedna jednostka (co~wymaga rozstrzygania konfliktów pomiêdzy jednostkami), to jednostka ta~znajdowaæ siê mo¿e w dowolnym miejscu swojego pola (po³o¿enie jednostki opisane jest przez trzy wspó³rzêdne rzeczywiste), oraz mo¿e przemieszczaæ~siê w~dowolnym kierunku. Na planszy znajdowaæ siê mog± trzy rodzaje terenu: \begin{itemize} \item [--] Pole -- standardowy teren \item [--] Las -- teren, który utrudnia poruszanie~siê jednostek oraz ogranicza widoczno¶æ w~sposób niesymetryczny (pozwala na~ukrywanie siê~jednostek) \item [--] Ska³y -- teren niedostêpny dla jednostek \end{itemize} Na polu mo¿e (ale~nie~musi) znajdowaæ~siê budynek jednego z~czterech rodzajów: \begin{itemize} \item [--] Mur -- po~którym mog± przemieszczaæ~siê jednostki \item [--] Wie¿a -- na~której jednostki nie~mog± siê~znajdowaæ \item [--] Drabina -- po~której wszystkie jednostki poza konnic± mog± dostaæ~siê na~mur, oraz z~niego zej¶æ \item [--] Brama \end{itemize} \section{Technikalia i~opis implementacji}\label{r:technikalia} W tej czê¶ci wymienimy dane techniczne dotycz±ce ¶rodowiska w~jakim projekt~,,{\bf Bastion}' powsta³ oraz w~jakim mo¿e byæ uruchomiony. \subsection{¦rodowisko u¿ytkownika} \subsubsection{System operacyjny} Projekt~,,{\bf Bastion}'' funkcjonuje jedynie jako aplikacja systemu operacyjnego {\bf Linux}. \subsubsection{Wymagania techniczne} Ze wzglêdu na~wysokiej jako¶ci grafikê stworzon± na~potrzeby gry, do~jej~funkcjonowania wymagana jest sprzêtowa akceleracja 3D oraz poprawnie zainstalowany OpenGL. \subsection{¦rodowisko programistyczne} \subsubsection{Jêzyk} Projekt~,,{\bf Bastion}'' zrealizowany zosta³ ca³kowicie w~jêzyku {\bf C++}. \subsubsection{Biblioteki} Na potrzeby realizacji projektu wykorzystane zosta³y nastêpuj±ce biblioteki: \begin{itemize} \item [--] Glut -- dla~obs³ugi trybu graficznego oraz zdarzeñ kontrolnych (mysz, klawiatura) \item [--] Plib -- dla~stworzenia zaawansowanego i~wygodnego interfejsu u¿ytkownika (ang. {\it GUI -- Graphical User Interface}) \item [--] Demeter -- dla~wygenerowania realistycznego trójwymiarowego pod³o¿a \end{itemize} \subsubsection{Narzêdzia} W~tworzeniu i dokumentacji projektu pomocne okaza³y siê narzêdzia: \begin{itemize} \item [--] cvs.sf.net -- na potrzeby wygodnej i~wydajnej pracy zespo³owej \item [--] Doxygen -- na potrzeby automatycznej dokumentacji kodu \end{itemize} \chapter{Funkcjonalno¶ci zrealizowane przez przedk³adaj±cego pracê licencjack±}\label{r:funkcjonalnosci} \begin{enumerate} \item Reprezentacja mapy \begin{enumerate} \item Teren: las, pole, ska³y \item Budynki: mur, wie¿a, drabina, brama \item Wykonywanie polecenia przemieszczenia jednostki \begin{enumerate} \item Prêdko¶æ zale¿na od~nachylenia i~rodzaju terenu \item Rozstrzyganie konfliktów pomiêdzy jednostkami \end{enumerate} \end{enumerate} \item Uproszczone rozstrzyganie widoczno¶ci \begin{enumerate} \item Generowanie zbioru jednostek i~budynków widzianych przez dowódcê oddzia³u \item Widoczno¶æ zale¿na od~rodzaju i~kszta³tu terenu \end{enumerate} \item System wyszukiwania ¶cie¿ek \begin{enumerate} \item Tworzenie i~aktualizowanie map spójnych sk³adowych pozwalaj±cych na~szybkie rozstrzygniêcie, czy~¶cie¿ka pomiêdzy zadanymi punktami istnieje. \item Wyszukiwanie, je¶li istnieje, ¶cie¿ki na~wprost \item W przeciwnym wypadku u¿ycie algorytmu A* dla wyszukania ¶cie¿ki \begin{enumerate} \item Heurystyka przyspieszaj±ca wyszukiwanie kosztem nie~zawsze optymalnej ¶cie¿ki (heurystyka przeszacowana) \item Dodatkowe, opcjonalne heurystyki pozwalaj±ce~na: \begin{enumerate} \item Wyszukiwanie ¶cie¿ek omijaj±cych zamek \item Wyszukiwanie ¶cie¿ek ukrytych w~lesie (w~jak~najwy¿szym stopniu) \item Wyszukiwanie ¶cie¿ek omijaj±cych ska³y \end{enumerate} \item Badanie szeroko¶ci ¶cie¿ki na~potrzeby zmiany formacji oddzia³u (np.~zwê¿enie formacji podczas przej¶cia przez ska³y) \end{enumerate} \end{enumerate} \end{enumerate} \begin{thebibliography}{99} \addcontentsline{toc}{section}{Bibliografia} \bibitem[Str97]{stroustrup} Bjarne Stroustrup, \textit{Jêzyk C++}, Wydawnictwa Naukowo--Techniczne, 1997 \end{thebibliography} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% coding: latin-2 %%% End: |
|
From: Jacek K. <jac...@us...> - 2004-06-30 18:50:08
|
Update of /cvsroot/bastion/bastion/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24235/src Modified Files: World.cpp World.h Log Message: - Zwyciestwo! Model gry jest oddzielony od jej wizualizacji. Dzieki temu moze istniec caly model swiata bez istnienia wizualizacji (nie testowalem czy mozna tick'ac swiat zanim zacznie sie go ogladac, ale nie powinno byc z tym problemow). W szczegolnosci nie da sie juz przejsc wskaznikami od klas swiata do klas widoku. Teraz metoda void* LoadingScreen::loadLevel(void *levelName) wyglada nader prosto: new World, new GameView(world). Pawel: masz czysty teren jesli chodzi o zapisywanie stanu gry. Sa dwa miejsca gdzie obiekty swiata posiadaja wskaznik do obiektow wizualizacji: UnitHandler oraz EventUnitSpotted (klasa przechowujaca informacje o jednostce w InformationCollectorze). Klasy te posiadaja wskazniki do figurek ("figure"). Przy zapisywaniu stanu gry, nalezy te wskazniki zapisac jako NULL - sa bowiem one poprawiane przy podpinaniu swiata do GameView. Mozna przyjac ze klasa MissileView ktora zajmuje sie renderingiem strzal tez powinna byc zapisywana w pliku. Alternatywnie, mozna odpowiedni wskaznik z klasy Missile zapisac jako NULL - tez powinno dzialac ok. A tak pozatym to gra dziala tak samo jak do tej pory. Index: World.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/World.h,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** World.h 4 Jun 2004 20:21:41 -0000 1.10 --- World.h 30 Jun 2004 18:49:28 -0000 1.11 *************** *** 37,41 **** \param gv wskaznik na obiekt klasy GameView. \param mapName string z nazwa mapy. Przeklada sie na nazwe katalogu "./data/<mapName>/". */ ! World(GameView *gv, char *mapName); ~World(); --- 37,41 ---- \param gv wskaznik na obiekt klasy GameView. \param mapName string z nazwa mapy. Przeklada sie na nazwe katalogu "./data/<mapName>/". */ ! World(char *mapName); ~World(); *************** *** 45,49 **** GameMap* getGameMap() { return gameMap; } ! GameView* getGameView() { return gameView; } --- 45,49 ---- GameMap* getGameMap() { return gameMap; } ! //GameView* getGameView() { return gameView; } *************** *** 67,72 **** protected: GameMap *gameMap; ! GameView *gameView; ! bool gameOver; /// true jesli gra jest zakonczona --- 67,71 ---- protected: GameMap *gameMap; ! bool gameOver; /// true jesli gra jest zakonczona Index: World.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/World.cpp,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** World.cpp 30 Jun 2004 13:52:36 -0000 1.31 --- World.cpp 30 Jun 2004 18:49:28 -0000 1.32 *************** *** 115,124 **** } ! World::World(GameView *gv , char *mapName ) { gameOver = false; worldDescription = new WorldDescription(mapName, EventDispatcher::get()); army = new (Army*)[2]; ! gameView = gv; gameMap = new GameMap( this, --- 115,124 ---- } ! World::World(char *mapName ) { gameOver = false; worldDescription = new WorldDescription(mapName, EventDispatcher::get()); army = new (Army*)[2]; ! gameMap = new GameMap( this, *************** *** 128,131 **** --- 128,133 ---- army[0] = new Army(this, gameMap, 20.0, 20.0); army[1] = new Army(this, gameMap, 100.0, 100.0); + + createSample(); } |
|
From: Jacek K. <jac...@us...> - 2004-06-30 18:49:42
|
Update of /cvsroot/bastion/bastion/src/util In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24235/src/util Modified Files: EventBase.h EventDispatcher.h EventListener.h Log Message: - Zwyciestwo! Model gry jest oddzielony od jej wizualizacji. Dzieki temu moze istniec caly model swiata bez istnienia wizualizacji (nie testowalem czy mozna tick'ac swiat zanim zacznie sie go ogladac, ale nie powinno byc z tym problemow). W szczegolnosci nie da sie juz przejsc wskaznikami od klas swiata do klas widoku. Teraz metoda void* LoadingScreen::loadLevel(void *levelName) wyglada nader prosto: new World, new GameView(world). Pawel: masz czysty teren jesli chodzi o zapisywanie stanu gry. Sa dwa miejsca gdzie obiekty swiata posiadaja wskaznik do obiektow wizualizacji: UnitHandler oraz EventUnitSpotted (klasa przechowujaca informacje o jednostce w InformationCollectorze). Klasy te posiadaja wskazniki do figurek ("figure"). Przy zapisywaniu stanu gry, nalezy te wskazniki zapisac jako NULL - sa bowiem one poprawiane przy podpinaniu swiata do GameView. Mozna przyjac ze klasa MissileView ktora zajmuje sie renderingiem strzal tez powinna byc zapisywana w pliku. Alternatywnie, mozna odpowiedni wskaznik z klasy Missile zapisac jako NULL - tez powinno dzialac ok. A tak pozatym to gra dziala tak samo jak do tej pory. Index: EventDispatcher.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/util/EventDispatcher.h,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** EventDispatcher.h 30 Jun 2004 13:52:38 -0000 1.10 --- EventDispatcher.h 30 Jun 2004 18:49:31 -0000 1.11 *************** *** 29,38 **** @author Jacek Kolodziej ! */ class EventDispatcher{ public: // ELastEvent musi byc zawsze ostatni - wyznacza ilosc kolejek eventow /// Mozliwe rodzaje eventow na ktore mozna sie rejestrowac ! enum EventType { ETeamEvents, EOnMapMouseClick, EOrderManipulation, EDied, EAttacked, EEnemySpotted, EOrderCompleted, ETeamDestroyed, EEnemyDefeated, EWorldChanged, ELastEvent}; // UWAGA: ELastEvent MUSI byc na koncu tej listy (!) --- 29,38 ---- @author Jacek Kolodziej ! // */ class EventDispatcher{ public: // ELastEvent musi byc zawsze ostatni - wyznacza ilosc kolejek eventow /// Mozliwe rodzaje eventow na ktore mozna sie rejestrowac ! enum EventType { ETeamEvents, EOnMapMouseClick, EOrderManipulation, EDied, EAttacked, EEnemySpotted, EOrderCompleted, ETeamDestroyed, EEnemyDefeated, EWorldChanged, ENeedAFigure, ELastEvent}; // UWAGA: ELastEvent MUSI byc na koncu tej listy (!) Index: EventBase.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/util/EventBase.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** EventBase.h 31 May 2004 19:14:23 -0000 1.6 --- EventBase.h 30 Jun 2004 18:49:31 -0000 1.7 *************** *** 14,21 **** --- 14,24 ---- #include "EventListener.h" + #include <stdlib.h> class EventListener; class Team; class Unit; + class EventUnitSpotted; + class UnitHandler; /** \brief Klasa bazowa dla eventow. *************** *** 116,119 **** --- 119,137 ---- + class EventNeedAFigure: public EventBase{ + public: + EventUnitSpotted *eus; + UnitHandler *uhandler; + EventNeedAFigure(EventUnitSpotted *u) { eus=u; uhandler=NULL;} + EventNeedAFigure(UnitHandler *u) { uhandler=u; eus=NULL;} + + virtual void notify (EventListener *e) { + if(eus) e->eventNeedAFigure(eus); + if(uhandler) e->eventNeedAFigure(uhandler); + } + }; + + + /** \brief Index: EventListener.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/util/EventListener.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** EventListener.h 26 May 2004 11:50:46 -0000 1.8 --- EventListener.h 30 Jun 2004 18:49:31 -0000 1.9 *************** *** 22,25 **** --- 22,27 ---- class Unit; class Ladder; + class EventUnitSpotted; + class UnitHandler; /** *************** *** 57,60 **** --- 59,67 ---- virtual void enemyDefeated(Team* team) {}; + /// Zgloszenie o checi dostania figurki + virtual void eventNeedAFigure(EventUnitSpotted *eus) {}; + /// Zgloszenie o checi dostania figurki + virtual void eventNeedAFigure(UnitHandler *uhandler) {}; + ~EventListener(); |
|
From: Jacek K. <jac...@us...> - 2004-06-30 18:49:41
|
Update of /cvsroot/bastion/bastion/src/order In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24235/src/order Modified Files: InformationCollector.cpp InformationCollector.h Log Message: - Zwyciestwo! Model gry jest oddzielony od jej wizualizacji. Dzieki temu moze istniec caly model swiata bez istnienia wizualizacji (nie testowalem czy mozna tick'ac swiat zanim zacznie sie go ogladac, ale nie powinno byc z tym problemow). W szczegolnosci nie da sie juz przejsc wskaznikami od klas swiata do klas widoku. Teraz metoda void* LoadingScreen::loadLevel(void *levelName) wyglada nader prosto: new World, new GameView(world). Pawel: masz czysty teren jesli chodzi o zapisywanie stanu gry. Sa dwa miejsca gdzie obiekty swiata posiadaja wskaznik do obiektow wizualizacji: UnitHandler oraz EventUnitSpotted (klasa przechowujaca informacje o jednostce w InformationCollectorze). Klasy te posiadaja wskazniki do figurek ("figure"). Przy zapisywaniu stanu gry, nalezy te wskazniki zapisac jako NULL - sa bowiem one poprawiane przy podpinaniu swiata do GameView. Mozna przyjac ze klasa MissileView ktora zajmuje sie renderingiem strzal tez powinna byc zapisywana w pliku. Alternatywnie, mozna odpowiedni wskaznik z klasy Missile zapisac jako NULL - tez powinno dzialac ok. A tak pozatym to gra dziala tak samo jak do tej pory. Index: InformationCollector.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/order/InformationCollector.cpp,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** InformationCollector.cpp 4 Jun 2004 20:21:47 -0000 1.18 --- InformationCollector.cpp 30 Jun 2004 18:49:31 -0000 1.19 *************** *** 9,12 **** --- 9,14 ---- #include "army/Army.h" #include "interface/world/WorldView.h" + #include "util/EventDispatcher.h" + #include "util/EventBase.h" WorldView * EventUnitSpotted::worldView=NULL; *************** *** 414,419 **** figure = NULL; //state = NULL; if (manageVisualization) ! initFigure(); } --- 416,429 ---- figure = NULL; //state = NULL; + if (manageVisualization) ! //initFigure(); ! // TODO: dispatch(nowa figurka potrzebna) ! EventDispatcher::get()->dispatch( ! EventDispatcher::ENeedAFigure, ! new EventNeedAFigure(this) ! ); ! ! } *************** *** 432,436 **** figure = NULL; if (manageVisualization) ! initFigure(); } --- 442,450 ---- figure = NULL; if (manageVisualization) ! //initFigure(); ! EventDispatcher::get()->dispatch( ! EventDispatcher::ENeedAFigure, ! new EventNeedAFigure(this) ! ); } *************** *** 464,472 **** if (isWilhelm != u->isWilhelm) { isWilhelm = u->isWilhelm; if (figure) { delete figure; figure = NULL; initFigure(); ! } } --- 478,488 ---- if (isWilhelm != u->isWilhelm) { isWilhelm = u->isWilhelm; + /***** if (figure) { delete figure; figure = NULL; initFigure(); ! } ! */ } *************** *** 490,497 **** --- 506,515 ---- } + /* void EventUnitSpotted::initFigure( ) { /// UWAGA: Tu NIE WOLNO przechodzic przez wskaznik 'unit' !!! + figure = Figure::createFigure( unitType, *************** *** 503,509 **** updateFigure(); } ! void EventUnitSpotted::updateFigure( ) { figure->setMapPos(xPos, yPos); //std::cout << " ----- Time: " << (InformationCollector::getGameTime() - time) << ", gettime: " << InformationCollector::getGameTime() << " time: " << time << "\n"; --- 521,529 ---- updateFigure(); } ! */ void EventUnitSpotted::updateFigure( ) { + if(!figure) + return; figure->setMapPos(xPos, yPos); //std::cout << " ----- Time: " << (InformationCollector::getGameTime() - time) << ", gettime: " << InformationCollector::getGameTime() << " time: " << time << "\n"; Index: InformationCollector.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/order/InformationCollector.h,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** InformationCollector.h 29 May 2004 11:41:15 -0000 1.18 --- InformationCollector.h 30 Jun 2004 18:49:31 -0000 1.19 *************** *** 1 **** ! #ifndef INFCOL_H #define INFCOL_H #define DEBUG #include <stdlib.h> #include <vector> #include "OrderManager.h" #include "../army/Army.h" #include "../map/SeenSet.h" #include "../unit/Unit.h" #include "../team/Team.h" #include "../team/TeamBrain.h" #include "../util/DynamicStack.h" /*! \const OBJECT_DESTROYED \brief Opisuje stan obiektu na mapie jako zniszczony. */ int const OBJECT_DESTROYED = 2; /*! \const OBJECT_DEMAGED \brief Opisuje stan obiektu na mapie jako uszkodzony. */ int const OBJECT_DEMAGED = 1; /*! \const OBJECT_FOUND \brief Zaznacza, ¿e zosta³ zauwa¿ony dotychczas niespotkany obiekt. */ int const OBJECT_FOUND = 0; class Team; class Unit; class MapObject; class SeenSet; class Figure; class WorldView; using namespace order; /*! \class eventUnitSpotted \brief Struktura okre?lajca informacje o widzianej w przesz³oci jednostce. *Ta struktura przechowuje informacje o widzianej jednostce. Jest to moja propozycja, zobaczymy co bêdzie rzeczywi?cie *potrzebne, bardzo wa¿ny jest tu kompromis pomiêdzy ilo?ci pamiêtanych danych, a wydajno?ci operacji na strukturze. */ class EventUnitSpotted { public: Unit* unit; int time; double xPos; double yPos; int unitType; // Typ jednostki wg. tego co zwraca w unit->getType(); bool isWilhelm; Army* side; Team* team; bool alive; // Aktualizowane, przy died(), tworzeniu i merge'owani // To dla Jacka: mylê, ¿e fajnie bêdzie w przysz³oci pamiêtaæ np. klatkê animacji, czy co takiego. //void* state; static WorldView *worldView; /// Potrzebne do ewentualnego tworzenia figurki bool manageVisualization; Figure *figure; /// figurka danej jednostki. NULL jesli manageVisualization==false. /** \param manageVisualization true jesli ten obiekt ma zarzadzac wyswietlaniem zadanej jednostki */ EventUnitSpotted(Unit* u,int t, bool _manageVisualization); EventUnitSpotted(const EventUnitSpotted& eus, bool _manageVisualization); /* EventUnitSpotted(const EventUnitSpotted& eus) { unit = eus.unit;time = eus.time; xPos = eus.xPos; yPos = eus.yPos; alive = eus.alive; side = eus.side; //state = eus.state; }; */ void actualize(Unit* u,int t); void actualize(EventUnitSpotted* newData); void died(Unit* u, int t); ~EventUnitSpotted(); /// aktualizuje wyglad figurki - polozenie, przezroczystosc, itp. void updateFigure(); protected: /// Podpina figurke. void initFigure(); private: EventUnitSpotted(const EventUnitSpotted& eus); // Tej metody nie mozna uzywac (JACEK) }; /*! \class eventTeamSpotted \brief Struktura okre?lajca informacje o widzianej w przesz³oci dru¿ynie.. */ class EventTeamSpotted { public: Team* team; char *name; int time; double xPos; double yPos; int count; //int bowmen_count; //int warriot_count; //int knight_count; double morale; OrderPack* orderPack; void* state; EventTeamSpotted(Team* tm,int t) { name = tm->getName(); team = tm;time = t; xPos = tm->getPosX(); yPos = tm->getPosY(); morale = tm->getMorality(); count = tm->getCount(); orderPack = new OrderPack(*((tm->getTeamBrain())->getOrderManager())); }; EventTeamSpotted(const EventTeamSpotted& ts) { team = ts.team; time = ts.time; xPos = ts.xPos; yPos = ts.yPos; morale = ts.morale; count = ts.count; orderPack = new OrderPack(*ts.orderPack); }; void actualize(Team* tm,int t) { if (t>time) { time = t; xPos = tm->getPosX(); yPos = tm->getPosY(); morale = tm->getMorality(); count = tm->getCount(); orderPack->mergeWith((tm->getTeamBrain())->getOrderManager()); }; }; void actualize(EventTeamSpotted* newData) { time = newData->time; xPos = newData->xPos; yPos = newData->yPos; morale = newData->morale; count = newData->count; orderPack->mergeWith(newData->orderPack); }; ~EventTeamSpotted() { delete orderPack; }; }; /*! \class eventStructureSpotted \brief Struktura okreajca informacje jakie przechowujemy o widzianym zdarzeniu na mapie. *Wci¿ nie ma decyzji, co dok³adnie oddzia³ powinien pamiêtaæ odno?nie mapy, to wiêc jest jeszcze moja luna propozycja. *Jak na razie tego nie bêdzie... */ class EventStructureSpotted { public: MapObject* structure; int state; int time; int xPos; int yPos; }; /*! \class spottedUnits \brief Struktura definujca format danych o jednostkach jakie zwracaæ bêdzie InformationCollector. */ /*class SpottedUnits { public: int n; EventUnitSpotted* spotted; };*/ /*! \class spottedStructures \brief Struktura definujca format danych o budynkach i terenie jakie zwracaæ bêdzie InformationCollector. */ class SpottedStructures { public: int n; EventStructureSpotted* spotted; } ; class TeamTable { protected: friend class InformationCollector; int maxTeam; Army* army; EventTeamSpotted** teams; void newMaxTeam(int n) {if (n>maxTeam) maxTeam = n;}; // Zwraca pozycje na której jest jednostka, lub pozycjê nieu¿ywan±. int linearSearch(Team* tm); int getTeamNum(Team* tm); public: void merge(TeamTable* tt2); EventTeamSpotted* getTeamInfo(Team* tm) { int n = getTeamNum(tm); return teams[n]; }; void addTeam(Team* tm,int t); void removeTeam(Team* tm) { int n = getTeamNum(tm); if (n == maxTeam) maxTeam--; if (teams[n]) delete teams[n]; teams[n] = NULL; }; void checkData(EventTeamSpotted* newData); // Jedyny dostêpny konstruktor to konstruktor dla armii, chyba nic innego nie potrzeba? TeamTable(Army* _army); ~TeamTable(); }; class UnitTable { protected: friend class InformationCollector; static const int maxLenght = 1025; DynamicStack<Unit*> *present; EventUnitSpotted* units[maxLenght]; bool isMain; // true jesli to jest unitTable glownego InfCollectora. int hashUnit(Unit* u) { return (((((int) u)+1137)>>2)%maxLenght); }; int getUnitNum(Unit* u); public: /// juz NIE ZMIENIA parametru (modyfikacja JACKA). void merge(UnitTable* ut2); EventUnitSpotted* getUnitInfo(Unit* u) { return units[getUnitNum(u)]; }; void addUnit(Unit* u,int t) { int n = getUnitNum(u); if (units[n]) { units[n]->actualize(u,t); } else { units[n] = new EventUnitSpotted(u,t,isMain); present->push(u); }; }; EventUnitSpotted* getData(Unit* u) { int n = getUnitNum(u); return(units[n]); }; /*! \brief Sprawdza czy mamy aktualne dane o jednostce. * Sprawdza czy nasze dane przechowywane o jednostce s¹ nowsze od zadanych. \param newData nowe dane. */ void checkData(EventUnitSpotted* newData); void unitDied(Unit* u,int t); /// \param isMain true jesli to jest UnitTable glownego InfCollectora UnitTable(bool isMain); /*! \brief Ten konstruktor tworzy UnitTable w którym s¹ wszystkie inforamcje dotycz¹ce konkretnej armii. */ // UnitTable(Army* army); ~UnitTable(); }; /*! \class InformationCollector \brief Klasa odpowiedzialna za zarzdzanie wiedz oddzia³u. *InfromationCollector w naszym za³o¿eniu pamiêta o napotkanych jednostkach i uszkodzonych budynkach. Nie ma tu jeszcze *odpowiedzialnych za to struktur danych */ class InformationCollector { protected: /*! \brief Aktualnie przechowywany SeenSet * Ostatnio pobrany od Team SeenSet. */ UnitTable* unitsTable; TeamTable* teamTable; //int gameTime; static int gameTime; int shiftTime; static const int actualizeTime = 10; // Co ile czasu aktualizowaæ? /* True jesli to jest glowny InformationCollector. Glowny InfCollector ma za zadanie zarzadzac figurkami. Nie ma jednak sensu robic z tego osobnej klasy IMHO (JACEK). */ bool isMain; static InformationCollector *mainInformationCollector; static EventTeamSpotted* Team2EventTeamSpotted(Team *t); public: // InformationCollector(Team* team); /** Konstruktor. \param isMain true jesli to ma byc glowny InformationCollector zarzadzajacy widokiem calej gry */ InformationCollector(Army* army, bool isMain); ~InformationCollector(); static int getGameTime() { return gameTime;} /*! \brief Podstawowa funkcja wywo³ywana przez dru¿ynê. \param Mog³a by braæ w parametrze SeenSet, ale mo¿e lepiej bêdzie jak sama o niego poprosi. */ void tick(Team* tm); // Funkcja newEra ma byæ przez kogo¶ wywo³ywana raz na turê- aktualnie jest to GameMap static void newEra() {gameTime++;}; //void makeOlder() {gameTime++;}; /*! \brief £¹czy informacje z dwóch InformationCollector'ów * £¹czy informacje z dwóch InformationCollector'ów \param with drugi InformationCollector */ void merge(InformationCollector* with); /*! \brief Aktualizuje informacje o jednostkach. * Aktualizuje informacje o jednostkach na podstawie otrzymanego SeenSet. \param seen SeenSet oddzia³u */ void actualize(SeenSet* seen); /*! \brief Aktualizuje informacje o jednostkach. * Aktualizuje informacje o jednostkach dla dru¿yny. Wed³ug specyfikacji ko¿ystamy z innego \param seen SeenSet oddzia³u */ void actualize(Team* team); /*! \brief Zaznacza, ¿e jednostka nie ¿yje. * Ustawia w strukturach danych informnacje o ?mierci jednostki \param died zmar³y. */ void unitDies(Unit* died); /*! \brief Odbiera informacje o zmianie na mapie. * Odbiera od oddzia³u informacje o zmianie na mapie. \param object dostrze¿ony obiekt. \param newState nowy stan w którym znalaz³ siê obiekt(\sa OBJECT_DESTROYED \sa OBJECT_DEMAGED \sa OBJECT_FOUND). */ void structureSpotted(MapObject* object,int newState); /*! \brief Zwraca odnalezione zmiany na mapie. * InformationCollector zwraca w ten sposób niesione przez siebie informacje o ukszta³towaniu mapy, w formacie * \a spottedStructures */ SpottedStructures* giveStructuresSpotted(); /*! \brief Zwraca napotkane jednostki. NOTE: nalezy samemu zwolnic wynikowy wektor przy pomocy delete. (Jacek) * InformationCollector zwraca w ten sposób niesione przez siebie informacje o napotkanych jednostkach, w formacie * \a spottedUnits */ vector<EventUnitSpotted*>* giveUnitsSpotted(); vector<EventTeamSpotted*>* giveTeamsSpotted(); }; // Teraz pare definicji, z których jak na razie rezygnujê... // Uwaga! Jak na razie rezygnujê z wykorzystania tej klasy- to gdybym chcia³ segregowaæ // informacje o ludzikach wedle dru¿yn. /*class TeamInfo { friend class TeamTable; protected: EventUnitSpotted** units; int users; int lastInfo; int oldestInfo; public: TeamInfo(); void merge(TeamInfo* t2); TeamInfo(const TeamInfo&); Team* giveTeam(); };*/ #endif \ No newline at end of file --- 1 ---- ! #ifndef INFCOL_H #define INFCOL_H #define DEBUG #include <stdlib.h> #include <vector> #include "OrderManager.h" #include "../army/Army.h" #include "../map/SeenSet.h" #include "../unit/Unit.h" #include "../team/Team.h" #include "../team/TeamBrain.h" #include "../util/DynamicStack.h" /*! \const OBJECT_DESTROYED \brief Opisuje stan obiektu na mapie jako zniszczony. */ int const OBJECT_DESTROYED = 2; /*! \const OBJECT_DEMAGED \brief Opisuje stan obiektu na mapie jako uszkodzony. */ int const OBJECT_DEMAGED = 1; /*! \const OBJECT_FOUND \brief Zaznacza, ¿e zosta³ zauwa¿ony dotychczas niespotkany obiekt. */ int const OBJECT_FOUND = 0; class Team; class Unit; class MapObject; class SeenSet; class Figure; class WorldView; using namespace order; /*! \class eventUnitSpotted \brief Struktura okre?lajca informacje o widzianej w przesz³oci jednostce. *Ta struktura przechowuje informacje o widzianej jednostce. Jest to moja propozycja, zobaczymy co bêdzie rzeczywi?cie *potrzebne, bardzo wa¿ny jest tu kompromis pomiêdzy ilo?ci pamiêtanych danych, a wydajno?ci operacji na strukturze. */ class EventUnitSpotted { public: Unit* unit; int time; double xPos; double yPos; int unitType; // Typ jednostki wg. tego co zwraca w unit->getType(); bool isWilhelm; Army* side; Team* team; bool alive; // Aktualizowane, przy died(), tworzeniu i merge'owani // To dla Jacka: mylê, ¿e fajnie bêdzie w przysz³oci pamiêtaæ np. klatkê animacji, czy co takiego. //void* state; static WorldView *worldView; /// Potrzebne do ewentualnego tworzenia figurki bool manageVisualization; Figure *figure; /// figurka danej jednostki. NULL jesli manageVisualization==false. /// Przypisuje figurke (i zleca zarzadzanie nia). void setFigure(Figure * newFigure) { figure = newFigure; updateFigure(); }; /** \param manageVisualization true jesli ten obiekt ma zarzadzac wyswietlaniem zadanej jednostki */ EventUnitSpotted(Unit* u,int t, bool _manageVisualization); EventUnitSpotted(const EventUnitSpotted& eus, bool _manageVisualization); /* EventUnitSpotted(const EventUnitSpotted& eus) { unit = eus.unit;time = eus.time; xPos = eus.xPos; yPos = eus.yPos; alive = eus.alive; side = eus.side; //state = eus.state; }; */ void actualize(Unit* u,int t); void actualize(EventUnitSpotted* newData); void died(Unit* u, int t); ~EventUnitSpotted(); /// aktualizuje wyglad figurki - polozenie, przezroczystosc, itp. void updateFigure(); protected: /// Podpina figurke. //void initFigure(); private: EventUnitSpotted(const EventUnitSpotted& eus); // Tej metody nie mozna uzywac (JACEK) }; /*! \class eventTeamSpotted \brief Struktura okre?lajca informacje o widzianej w przesz³oci dru¿ynie.. */ class EventTeamSpotted { public: Team* team; char *name; int time; double xPos; double yPos; int count; //int bowmen_count; //int warriot_count; //int knight_count; double morale; OrderPack* orderPack; void* state; EventTeamSpotted(Team* tm,int t) { name = tm->getName(); team = tm;time = t; xPos = tm->getPosX(); yPos = tm->getPosY(); morale = tm->getMorality(); count = tm->getCount(); orderPack = new OrderPack(*((tm->getTeamBrain())->getOrderManager())); }; EventTeamSpotted(const EventTeamSpotted& ts) { team = ts.team; time = ts.time; xPos = ts.xPos; yPos = ts.yPos; morale = ts.morale; count = ts.count; orderPack = new OrderPack(*ts.orderPack); }; void actualize(Team* tm,int t) { if (t>time) { time = t; xPos = tm->getPosX(); yPos = tm->getPosY(); morale = tm->getMorality(); count = tm->getCount(); orderPack->mergeWith((tm->getTeamBrain())->getOrderManager()); }; }; void actualize(EventTeamSpotted* newData) { time = newData->time; xPos = newData->xPos; yPos = newData->yPos; morale = newData->morale; count = newData->count; orderPack->mergeWith(newData->orderPack); }; ~EventTeamSpotted() { delete orderPack; }; }; /*! \class eventStructureSpotted \brief Struktura okreajca informacje jakie przechowujemy o widzianym zdarzeniu na mapie. *Wci¿ nie ma decyzji, co dok³adnie oddzia³ powinien pamiêtaæ odno?nie mapy, to wiêc jest jeszcze moja luna propozycja. *Jak na razie tego nie bêdzie... */ class EventStructureSpotted { public: MapObject* structure; int state; int time; int xPos; int yPos; }; /*! \class spottedUnits \brief Struktura definujca format danych o jednostkach jakie zwracaæ bêdzie InformationCollector. */ /*class SpottedUnits { public: int n; EventUnitSpotted* spotted; };*/ /*! \class spottedStructures \brief Struktura definujca format danych o budynkach i terenie jakie zwracaæ bêdzie InformationCollector. */ class SpottedStructures { public: int n; EventStructureSpotted* spotted; } ; class TeamTable { protected: friend class InformationCollector; int maxTeam; Army* army; EventTeamSpotted** teams; void newMaxTeam(int n) {if (n>maxTeam) maxTeam = n;}; // Zwraca pozycje na której jest jednostka, lub pozycjê nieu¿ywan±. int linearSearch(Team* tm); int getTeamNum(Team* tm); public: void merge(TeamTable* tt2); EventTeamSpotted* getTeamInfo(Team* tm) { int n = getTeamNum(tm); return teams[n]; }; void addTeam(Team* tm,int t); void removeTeam(Team* tm) { int n = getTeamNum(tm); if (n == maxTeam) maxTeam--; if (teams[n]) delete teams[n]; teams[n] = NULL; }; void checkData(EventTeamSpotted* newData); // Jedyny dostêpny konstruktor to konstruktor dla armii, chyba nic innego nie potrzeba? TeamTable(Army* _army); ~TeamTable(); }; class UnitTable { protected: friend class InformationCollector; static const int maxLenght = 1025; DynamicStack<Unit*> *present; EventUnitSpotted* units[maxLenght]; bool isMain; // true jesli to jest unitTable glownego InfCollectora. int hashUnit(Unit* u) { return (((((int) u)+1137)>>2)%maxLenght); }; int getUnitNum(Unit* u); public: /// juz NIE ZMIENIA parametru (modyfikacja JACKA). void merge(UnitTable* ut2); EventUnitSpotted* getUnitInfo(Unit* u) { return units[getUnitNum(u)]; }; void addUnit(Unit* u,int t) { int n = getUnitNum(u); if (units[n]) { units[n]->actualize(u,t); } else { units[n] = new EventUnitSpotted(u,t,isMain); present->push(u); }; }; EventUnitSpotted* getData(Unit* u) { int n = getUnitNum(u); return(units[n]); }; /*! \brief Sprawdza czy mamy aktualne dane o jednostce. * Sprawdza czy nasze dane przechowywane o jednostce s¹ nowsze od zadanych. \param newData nowe dane. */ void checkData(EventUnitSpotted* newData); void unitDied(Unit* u,int t); /// \param isMain true jesli to jest UnitTable glownego InfCollectora UnitTable(bool isMain); /*! \brief Ten konstruktor tworzy UnitTable w którym s¹ wszystkie inforamcje dotycz¹ce konkretnej armii. */ // UnitTable(Army* army); ~UnitTable(); }; /*! \class InformationCollector \brief Klasa odpowiedzialna za zarzdzanie wiedz oddzia³u. *InfromationCollector w naszym za³o¿eniu pamiêta o napotkanych jednostkach i uszkodzonych budynkach. Nie ma tu jeszcze *odpowiedzialnych za to struktur danych */ class InformationCollector { protected: /*! \brief Aktualnie przechowywany SeenSet * Ostatnio pobrany od Team SeenSet. */ UnitTable* unitsTable; TeamTable* teamTable; //int gameTime; static int gameTime; int shiftTime; static const int actualizeTime = 10; // Co ile czasu aktualizowaæ? /* True jesli to jest glowny InformationCollector. Glowny InfCollector ma za zadanie zarzadzac figurkami. Nie ma jednak sensu robic z tego osobnej klasy IMHO (JACEK). */ bool isMain; static InformationCollector *mainInformationCollector; static EventTeamSpotted* Team2EventTeamSpotted(Team *t); public: // InformationCollector(Team* team); /** Konstruktor. \param isMain true jesli to ma byc glowny InformationCollector zarzadzajacy widokiem calej gry */ InformationCollector(Army* army, bool isMain); ~InformationCollector(); static int getGameTime() { return gameTime;} /*! \brief Podstawowa funkcja wywo³ywana przez dru¿ynê. \param Mog³a by braæ w parametrze SeenSet, ale mo¿e lepiej bêdzie jak sama o niego poprosi. */ void tick(Team* tm); // Funkcja newEra ma byæ przez kogo¶ wywo³ywana raz na turê- aktualnie jest to GameMap static void newEra() {gameTime++;}; //void makeOlder() {gameTime++;}; /*! \brief £¹czy informacje z dwóch InformationCollector'ów * £¹czy informacje z dwóch InformationCollector'ów \param with drugi InformationCollector */ void merge(InformationCollector* with); /*! \brief Aktualizuje informacje o jednostkach. * Aktualizuje informacje o jednostkach na podstawie otrzymanego SeenSet. \param seen SeenSet oddzia³u */ void actualize(SeenSet* seen); /*! \brief Aktualizuje informacje o jednostkach. * Aktualizuje informacje o jednostkach dla dru¿yny. Wed³ug specyfikacji ko¿ystamy z innego \param seen SeenSet oddzia³u */ void actualize(Team* team); /*! \brief Zaznacza, ¿e jednostka nie ¿yje. * Ustawia w strukturach danych informnacje o ?mierci jednostki \param died zmar³y. */ void unitDies(Unit* died); /*! \brief Odbiera informacje o zmianie na mapie. * Odbiera od oddzia³u informacje o zmianie na mapie. \param object dostrze¿ony obiekt. \param newState nowy stan w którym znalaz³ siê obiekt(\sa OBJECT_DESTROYED \sa OBJECT_DEMAGED \sa OBJECT_FOUND). */ void structureSpotted(MapObject* object,int newState); /*! \brief Zwraca odnalezione zmiany na mapie. * InformationCollector zwraca w ten sposób niesione przez siebie informacje o ukszta³towaniu mapy, w formacie * \a spottedStructures */ SpottedStructures* giveStructuresSpotted(); /*! \brief Zwraca napotkane jednostki. NOTE: nalezy samemu zwolnic wynikowy wektor przy pomocy delete. (Jacek) * InformationCollector zwraca w ten sposób niesione przez siebie informacje o napotkanych jednostkach, w formacie * \a spottedUnits */ vector<EventUnitSpotted*>* giveUnitsSpotted(); vector<EventTeamSpotted*>* giveTeamsSpotted(); }; // Teraz pare definicji, z których jak na razie rezygnujê... // Uwaga! Jak na razie rezygnujê z wykorzystania tej klasy- to gdybym chcia³ segregowaæ // informacje o ludzikach wedle dru¿yn. /*class TeamInfo { friend class TeamTable; protected: EventUnitSpotted** units; int users; int lastInfo; int oldestInfo; public: TeamInfo(); void merge(TeamInfo* t2); TeamInfo(const TeamInfo&); Team* giveTeam(); };*/ #endif \ No newline at end of file |
|
From: Jacek K. <jac...@us...> - 2004-06-30 18:49:41
|
Update of /cvsroot/bastion/bastion/src/interface In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24235/src/interface Modified Files: GameView.cpp GameView.h LoadingScreen.cpp Log Message: - Zwyciestwo! Model gry jest oddzielony od jej wizualizacji. Dzieki temu moze istniec caly model swiata bez istnienia wizualizacji (nie testowalem czy mozna tick'ac swiat zanim zacznie sie go ogladac, ale nie powinno byc z tym problemow). W szczegolnosci nie da sie juz przejsc wskaznikami od klas swiata do klas widoku. Teraz metoda void* LoadingScreen::loadLevel(void *levelName) wyglada nader prosto: new World, new GameView(world). Pawel: masz czysty teren jesli chodzi o zapisywanie stanu gry. Sa dwa miejsca gdzie obiekty swiata posiadaja wskaznik do obiektow wizualizacji: UnitHandler oraz EventUnitSpotted (klasa przechowujaca informacje o jednostce w InformationCollectorze). Klasy te posiadaja wskazniki do figurek ("figure"). Przy zapisywaniu stanu gry, nalezy te wskazniki zapisac jako NULL - sa bowiem one poprawiane przy podpinaniu swiata do GameView. Mozna przyjac ze klasa MissileView ktora zajmuje sie renderingiem strzal tez powinna byc zapisywana w pliku. Alternatywnie, mozna odpowiedni wskaznik z klasy Missile zapisac jako NULL - tez powinno dzialac ok. A tak pozatym to gra dziala tak samo jak do tej pory. Index: LoadingScreen.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/interface/LoadingScreen.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** LoadingScreen.cpp 22 Apr 2004 19:20:31 -0000 1.2 --- LoadingScreen.cpp 30 Jun 2004 18:49:30 -0000 1.3 *************** *** 40,44 **** { ! std::cout << "display begin" << std::endl; // UWAGA: szerokosc bocznego menu jest tez w funkcji nizej --- 40,44 ---- { ! //std::cout << "display begin" << std::endl; // UWAGA: szerokosc bocznego menu jest tez w funkcji nizej *************** *** 75,79 **** glDisable(GL_TEXTURE_2D); */ ! std::cout << "redisplay end" << std::endl; static int num=0; --- 75,79 ---- glDisable(GL_TEXTURE_2D); */ ! //std::cout << "redisplay end" << std::endl; static int num=0; *************** *** 135,150 **** void* LoadingScreen::loadLevel(void *levelName) { ! _gv = new GameView(); // laczenie swiata i wizualizacji if (levelName==NULL) { ! _world = new World(_gv, "map1"); } else { ! _world = new World(_gv, (char *)levelName); ! } ! ! ! _gv->init(_world); ! _world->createSample(); ! _gv->init2(); std::cout << " bastion.cpp: about to start \n"; --- 135,147 ---- void* LoadingScreen::loadLevel(void *levelName) { ! // laczenie swiata i wizualizacji if (levelName==NULL) { ! _world = new World("map1"); } else { ! _world = new World((char *)levelName); ! } ! ! _gv = new GameView(_world); std::cout << " bastion.cpp: about to start \n"; Index: GameView.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/interface/GameView.cpp,v retrieving revision 1.48 retrieving revision 1.49 diff -C2 -d -r1.48 -r1.49 *** GameView.cpp 30 Jun 2004 13:52:37 -0000 1.48 --- GameView.cpp 30 Jun 2004 18:49:29 -0000 1.49 *************** *** 71,77 **** } ! GameView::GameView( ) { ! } --- 71,78 ---- } ! GameView::GameView(World *worldModel ) { ! init(worldModel); ! init2(); } *************** *** 228,232 **** glViewport(vm->getXOffset() + 200, vm->getYOffset(), vm->getWidth() -200, vm->getHeight()); ! Demeter::Terrain *ter = world->getGameView()->getWorldView()->getTerrainWrapper()->getTerrain(); if (ter->Pick(screenX, screenY, x, y, z) && --- 229,233 ---- glViewport(vm->getXOffset() + 200, vm->getYOffset(), vm->getWidth() -200, vm->getHeight()); ! Demeter::Terrain *ter = getWorldView()->getTerrainWrapper()->getTerrain(); if (ter->Pick(screenX, screenY, x, y, z) && Index: GameView.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/interface/GameView.h,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** GameView.h 30 Jun 2004 13:52:37 -0000 1.26 --- GameView.h 30 Jun 2004 18:49:30 -0000 1.27 *************** *** 56,70 **** public: ! GameView(); ! ! /** \brief Inicjalizacja calego widoku gry. ! \param worldModel zainicjalizowany model swiata gry na ktorym ma sie toczyc rozgrywka. ! */ ! void init(World *worldModel); ! ! /** Dokonczenie inicjalizacji. Powinno byc wykonane przed pierwszym wyrysowaniem widoku gry. ! Brzydota.*/ ! void init2(); ! /** \brief DEPRECATED. Patrz ScreenManager::go(). Opdalenie petli glownej gry */ --- 56,61 ---- public: ! /** Tworzy wizualizacje gry na postawie zadanego modelu swiata */ ! GameView(World *worldModel); /** \brief DEPRECATED. Patrz ScreenManager::go(). Opdalenie petli glownej gry */ *************** *** 105,108 **** --- 96,109 ---- protected: + /** \brief Inicjalizacja calego widoku gry. + \param worldModel zainicjalizowany model swiata gry na ktorym ma sie toczyc rozgrywka. + */ + void init(World *worldModel); + + /** Dokonczenie inicjalizacji. Powinno byc wykonane przed pierwszym wyrysowaniem widoku gry. + Brzydota.*/ + void init2(); + + // EventDispatcher *eventDispatcher; |
|
From: Jacek K. <jac...@us...> - 2004-06-30 18:49:40
|
Update of /cvsroot/bastion/bastion/src/interface/world In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24235/src/interface/world Modified Files: UnitsView.cpp UnitsView.h WorldView.cpp Log Message: - Zwyciestwo! Model gry jest oddzielony od jej wizualizacji. Dzieki temu moze istniec caly model swiata bez istnienia wizualizacji (nie testowalem czy mozna tick'ac swiat zanim zacznie sie go ogladac, ale nie powinno byc z tym problemow). W szczegolnosci nie da sie juz przejsc wskaznikami od klas swiata do klas widoku. Teraz metoda void* LoadingScreen::loadLevel(void *levelName) wyglada nader prosto: new World, new GameView(world). Pawel: masz czysty teren jesli chodzi o zapisywanie stanu gry. Sa dwa miejsca gdzie obiekty swiata posiadaja wskaznik do obiektow wizualizacji: UnitHandler oraz EventUnitSpotted (klasa przechowujaca informacje o jednostce w InformationCollectorze). Klasy te posiadaja wskazniki do figurek ("figure"). Przy zapisywaniu stanu gry, nalezy te wskazniki zapisac jako NULL - sa bowiem one poprawiane przy podpinaniu swiata do GameView. Mozna przyjac ze klasa MissileView ktora zajmuje sie renderingiem strzal tez powinna byc zapisywana w pliku. Alternatywnie, mozna odpowiedni wskaznik z klasy Missile zapisac jako NULL - tez powinno dzialac ok. A tak pozatym to gra dziala tak samo jak do tej pory. Index: UnitsView.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/interface/world/UnitsView.cpp,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** UnitsView.cpp 29 May 2004 11:41:15 -0000 1.20 --- UnitsView.cpp 30 Jun 2004 18:49:30 -0000 1.21 *************** *** 25,28 **** --- 25,31 ---- #include "order/InformationCollector.h" #include "map/UnitHandler.h" + #include "unit/Unit.h" + #include "util/EventDispatcher.h" + #include "map/UnitHandler.h" #include <stdlib.h> *************** *** 36,39 **** --- 39,43 ---- worldv = w; + EventDispatcher::get()->registerListener(EventDispatcher::ENeedAFigure,this); // TODO: finish this code // TextureManager::get()->createTexture( *************** *** 57,60 **** --- 61,67 ---- // addFigure(); + + + } *************** *** 65,68 **** --- 72,76 ---- { // delete fig; + EventDispatcher::get()->unregisterListener(this); delete[] figures; delete[] figuresReal; *************** *** 237,239 **** --- 245,314 ---- } + void UnitsView::attachToWorld( ) + { + vector<EventUnitSpotted*> *unitVector; + std::vector<EventUnitSpotted *>::iterator it; + + // podpinanie sie do InformationCollectora + unitVector = worldv->getWorld()->getArmy(0)->getGeneralTeam()-> + getInformationCollector()->giveUnitsSpotted(); + + for (it = unitVector->begin(); it !=unitVector->end(); it++) { + (*it)->setFigure(createFigureFor(*it)); + } + + // podpinanie sie pod UnitHandlery + for(int army=0; army<=1; army++) { + for(int team=0; + team < worldv->getWorld()->getArmy(army)->getTeamsNum(); + team++) + { + std::vector<Unit*> vec = + worldv->getWorld()->getArmy(army)-> + getTeam(team)->getUnits(); + for(int unit=0; unit < vec.size(); unit++) { + vec[unit]->getHandler()->setFigure( + createFigureFor( vec[unit]->getHandler())); + } + + } + } + } + + Figure * UnitsView::createFigureFor( EventUnitSpotted * unitSpot ) + { + Figure *figure = Figure::createFigure( + unitSpot->unitType, + worldv, + 0, 0, unitSpot->isWilhelm); + figure->beRendered(true); + if (unitSpot->side != worldv->getWorld()->getArmy(0)) + figure->setSide(true); + return figure; + } + + + Figure * UnitsView::createFigureFor( UnitHandler * uhandler ) + { + Figure *figure = Figure::createFigure( + uhandler->getOwner()->getType(), + worldv, + 0, 0, uhandler->getOwner()->isWilhelm, false); + figure->beRendered(false); + if (uhandler->getOwner()->getArmy() != worldv->getWorld()->getArmy(0)) + figure->setSide(true); + return figure; + } + + + void UnitsView::eventNeedAFigure( EventUnitSpotted * eus ) + { + eus->setFigure(createFigureFor(eus)); + } + + void UnitsView::eventNeedAFigure( UnitHandler * uhandler ) + { + uhandler->setFigure(createFigureFor(uhandler)); + } + Index: UnitsView.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/interface/world/UnitsView.h,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** UnitsView.h 29 May 2004 08:29:13 -0000 1.12 --- UnitsView.h 30 Jun 2004 18:49:30 -0000 1.13 *************** *** 14,21 **** --- 14,24 ---- #include "interface/world/Figure.h" + #include "util/EventListener.h" // Deklaracja klasy jest tu niezbedna z powodu cyklu w grafie zaleznosci klas. class WorldView; class Figure; + class EventUnitSpotted; + class UnitHandler; //template class std::Vector<>; *************** *** 30,36 **** */ ! class UnitsView{ public: UnitsView(WorldView *w); void render(); --- 33,41 ---- */ ! class UnitsView : public EventListener{ public: UnitsView(WorldView *w); + + void attachToWorld(); void render(); *************** *** 63,66 **** --- 68,74 ---- void setRealFiguresRender(bool doRender) { renderFiguresReal = doRender; } + + void eventNeedAFigure(EventUnitSpotted *eus); + void eventNeedAFigure(UnitHandler *uhandler); protected: *************** *** 87,90 **** --- 95,102 ---- } + Figure * createFigureFor(EventUnitSpotted * unit); + Figure * createFigureFor(UnitHandler * uh); + + private: Index: WorldView.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/interface/world/WorldView.cpp,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** WorldView.cpp 28 Apr 2004 08:55:53 -0000 1.19 --- WorldView.cpp 30 Jun 2004 18:49:30 -0000 1.20 *************** *** 45,48 **** --- 45,49 ---- castleView = new CastleView(this); + unitsView->attachToWorld(); } |
|
From: Jacek K. <jac...@us...> - 2004-06-30 18:49:40
|
Update of /cvsroot/bastion/bastion/src/map In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24235/src/map Modified Files: UnitHandler.cpp UnitHandler.h Log Message: - Zwyciestwo! Model gry jest oddzielony od jej wizualizacji. Dzieki temu moze istniec caly model swiata bez istnienia wizualizacji (nie testowalem czy mozna tick'ac swiat zanim zacznie sie go ogladac, ale nie powinno byc z tym problemow). W szczegolnosci nie da sie juz przejsc wskaznikami od klas swiata do klas widoku. Teraz metoda void* LoadingScreen::loadLevel(void *levelName) wyglada nader prosto: new World, new GameView(world). Pawel: masz czysty teren jesli chodzi o zapisywanie stanu gry. Sa dwa miejsca gdzie obiekty swiata posiadaja wskaznik do obiektow wizualizacji: UnitHandler oraz EventUnitSpotted (klasa przechowujaca informacje o jednostce w InformationCollectorze). Klasy te posiadaja wskazniki do figurek ("figure"). Przy zapisywaniu stanu gry, nalezy te wskazniki zapisac jako NULL - sa bowiem one poprawiane przy podpinaniu swiata do GameView. Mozna przyjac ze klasa MissileView ktora zajmuje sie renderingiem strzal tez powinna byc zapisywana w pliku. Alternatywnie, mozna odpowiedni wskaznik z klasy Missile zapisac jako NULL - tez powinno dzialac ok. A tak pozatym to gra dziala tak samo jak do tej pory. Index: UnitHandler.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/map/UnitHandler.cpp,v retrieving revision 1.47 retrieving revision 1.48 diff -C2 -d -r1.47 -r1.48 *** UnitHandler.cpp 30 Jun 2004 13:52:37 -0000 1.47 --- UnitHandler.cpp 30 Jun 2004 18:49:30 -0000 1.48 *************** *** 59,62 **** --- 59,69 ---- #ifndef __CONSOLE_TEST__ // jak widac tu nie jest sprawdzane czy nie ma NULL'a po drodze. + + EventDispatcher::get()->dispatch( + EventDispatcher::ENeedAFigure, + new EventNeedAFigure(this) + ); + + /* figure = Figure::createFigure( unit->getType(), *************** *** 64,67 **** --- 71,76 ---- x, y, owner->isWilhelm, false); figure->beRendered(false); + */ + /// sprawdzanie czy jestesmy w armii atakujacej czy broniacej zamku // TODO: ^^^ *************** *** 435,438 **** --- 444,454 ---- void UnitHandler::closeGate(Gate *gateToBeClosed){} + void UnitHandler::setFigure( Figure * fig ) + { + figure = fig; + if(figure) + figure->setMapPos(x,y); + } + Index: UnitHandler.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/map/UnitHandler.h,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** UnitHandler.h 27 Apr 2004 20:27:11 -0000 1.30 --- UnitHandler.h 30 Jun 2004 18:49:31 -0000 1.31 *************** *** 88,93 **** UnitHandler (const UnitHandler &obj){}; - Unit* getOwner(){return owner;}; - /// Figurka (wizualizacja postaci) reprezentujaca danego unita. Figure *figure; --- 88,91 ---- *************** *** 95,99 **** public: - /*!\brief Konstruktor z mapy */ --- 93,96 ---- *************** *** 105,108 **** --- 102,106 ---- ~UnitHandler(); + Unit* getOwner(){return owner;}; virtual double moveMeToAsFarAs(double newX, double newY, double maxDistance); *************** *** 231,234 **** --- 229,233 ---- Figure * getFigure() { return figure; } + void setFigure(Figure *fig); }; |
|
From: Jacek K. <jac...@us...> - 2004-06-30 18:49:40
|
Update of /cvsroot/bastion/bastion/src/team In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24235/src/team Modified Files: Team.h Log Message: - Zwyciestwo! Model gry jest oddzielony od jej wizualizacji. Dzieki temu moze istniec caly model swiata bez istnienia wizualizacji (nie testowalem czy mozna tick'ac swiat zanim zacznie sie go ogladac, ale nie powinno byc z tym problemow). W szczegolnosci nie da sie juz przejsc wskaznikami od klas swiata do klas widoku. Teraz metoda void* LoadingScreen::loadLevel(void *levelName) wyglada nader prosto: new World, new GameView(world). Pawel: masz czysty teren jesli chodzi o zapisywanie stanu gry. Sa dwa miejsca gdzie obiekty swiata posiadaja wskaznik do obiektow wizualizacji: UnitHandler oraz EventUnitSpotted (klasa przechowujaca informacje o jednostce w InformationCollectorze). Klasy te posiadaja wskazniki do figurek ("figure"). Przy zapisywaniu stanu gry, nalezy te wskazniki zapisac jako NULL - sa bowiem one poprawiane przy podpinaniu swiata do GameView. Mozna przyjac ze klasa MissileView ktora zajmuje sie renderingiem strzal tez powinna byc zapisywana w pliku. Alternatywnie, mozna odpowiedni wskaznik z klasy Missile zapisac jako NULL - tez powinno dzialac ok. A tak pozatym to gra dziala tak samo jak do tej pory. Index: Team.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/team/Team.h,v retrieving revision 1.37 retrieving revision 1.38 diff -C2 -d -r1.37 -r1.38 *** Team.h 29 May 2004 11:41:16 -0000 1.37 --- Team.h 30 Jun 2004 18:49:31 -0000 1.38 *************** *** 426,429 **** --- 426,431 ---- bool chiefsTeam() { return isChiefsTeam; } + /// Zwraca KOPIE listy jednostek. + vector<Unit*> getUnits() {return units;} }; |
|
From: Jacek K. <jac...@us...> - 2004-06-30 13:52:48
|
Update of /cvsroot/bastion/bastion/src/team In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28722/src/team Modified Files: Team.cpp TeamBrain.cpp TeamCommand.cpp Log Message: - krok w kierunku umozliwienia istnienia swiata, bez istnienia jego wizualizacji: przeniesienie EventDispatchera z klasy GameView do statycznego pola klasy EventDispatcher. Aby pobrac EventDispatchera wystarczy teraz wywolac EvnetDispatcher::get(). Pozostaje jeszcze zrobic tak aby figurki w UnitHandlerze i InformationCollectorze byly przypisywane z zewnatrz. Index: TeamCommand.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/team/TeamCommand.cpp,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** TeamCommand.cpp 31 May 2004 19:14:23 -0000 1.13 --- TeamCommand.cpp 30 Jun 2004 13:52:38 -0000 1.14 *************** *** 49,53 **** }; // MICHA£ - zg³aszam eventa o koñcu walki ! team->getArmy()->getWorld()->getGameView()->getEventDispatcher()-> dispatch(EventDispatcher::EEnemyDefeated,new EventEnemyDefeated(team)); return true; --- 49,53 ---- }; // MICHA£ - zg³aszam eventa o koñcu walki ! EventDispatcher::get()-> dispatch(EventDispatcher::EEnemyDefeated,new EventEnemyDefeated(team)); return true; *************** *** 66,70 **** } // MICHA£ - zg³aszam eventa o koñcu walki ! team->getArmy()->getWorld()->getGameView()->getEventDispatcher()-> dispatch(EventDispatcher::EEnemyDefeated,new EventEnemyDefeated(team)); return true; --- 66,70 ---- } // MICHA£ - zg³aszam eventa o koñcu walki ! EventDispatcher::get()-> dispatch(EventDispatcher::EEnemyDefeated,new EventEnemyDefeated(team)); return true; Index: TeamBrain.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/team/TeamBrain.cpp,v retrieving revision 1.42 retrieving revision 1.43 diff -C2 -d -r1.42 -r1.43 *** TeamBrain.cpp 31 May 2004 19:14:23 -0000 1.42 --- TeamBrain.cpp 30 Jun 2004 13:52:38 -0000 1.43 *************** *** 69,73 **** if (enemy != 0) { // MICHA£ - Moje: tu zg³aszam eventa ! getTeam()->getArmy()->getWorld()->getGameView()->getEventDispatcher()-> dispatch(EventDispatcher::EAttacked,new EventUnderAttack(team)); --- 69,73 ---- if (enemy != 0) { // MICHA£ - Moje: tu zg³aszam eventa ! EventDispatcher::get()-> dispatch(EventDispatcher::EAttacked,new EventUnderAttack(team)); *************** *** 274,279 **** //MICHA£ - Wysy³am eventa... ! getTeam()->getArmy()->getWorld()->getGameView()-> ! getEventDispatcher()->dispatch(EventDispatcher::EOrderCompleted, new EventOrderCompleted(getTeam())); --- 274,278 ---- //MICHA£ - Wysy³am eventa... ! EventDispatcher::get()->dispatch(EventDispatcher::EOrderCompleted, new EventOrderCompleted(getTeam())); *************** *** 284,289 **** // Aby menu bylo aktualne, trzeba przy robieniu czegos z // rozkazami generowac takiego oto eventa. ! getTeam()->getArmy()->getWorld()->getGameView()-> ! getEventDispatcher()->dispatch(EventDispatcher::EOrderManipulation, new EventOrderManipulation()); } --- 283,287 ---- // Aby menu bylo aktualne, trzeba przy robieniu czegos z // rozkazami generowac takiego oto eventa. ! EventDispatcher::get()->dispatch(EventDispatcher::EOrderManipulation, new EventOrderManipulation()); } *************** *** 332,336 **** // Aby menu bylo aktualne, trzeba przy robieniu czegos z rozkazami generowac // eventa. ! getTeam()->getArmy()->getWorld()->getGameView()->getEventDispatcher()->dispatch( EventDispatcher::EOrderManipulation, new EventOrderManipulation()); } --- 330,334 ---- // Aby menu bylo aktualne, trzeba przy robieniu czegos z rozkazami generowac // eventa. ! EventDispatcher::get()->dispatch( EventDispatcher::EOrderManipulation, new EventOrderManipulation()); } *************** *** 363,367 **** // Aby menu bylo aktualne, trzeba przy robieniu czegos z rozkazami generowac // eventa. ! getTeam()->getArmy()->getWorld()->getGameView()->getEventDispatcher()->dispatch( EventDispatcher::EOrderManipulation, new EventOrderManipulation()); } --- 361,365 ---- // Aby menu bylo aktualne, trzeba przy robieniu czegos z rozkazami generowac // eventa. ! EventDispatcher::get()->dispatch( EventDispatcher::EOrderManipulation, new EventOrderManipulation()); } *************** *** 376,381 **** // rozkaz z galezi porazki. orderManager->giveNextOrder(this, order::OrderManager::ORDER_FINISH_FAILED); ! getTeam()->getArmy()->getWorld()-> ! getGameView()->getEventDispatcher()->dispatch( EventDispatcher::EOrderManipulation, new EventOrderManipulation() ); --- 374,378 ---- // rozkaz z galezi porazki. orderManager->giveNextOrder(this, order::OrderManager::ORDER_FINISH_FAILED); ! EventDispatcher::get()->dispatch( EventDispatcher::EOrderManipulation, new EventOrderManipulation() ); Index: Team.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/team/Team.cpp,v retrieving revision 1.43 retrieving revision 1.44 diff -C2 -d -r1.43 -r1.44 *** Team.cpp 31 May 2004 19:14:08 -0000 1.43 --- Team.cpp 30 Jun 2004 13:52:38 -0000 1.44 *************** *** 245,249 **** if (getCount() == 0) { // MICHA£ - Zg³aszamy eventa ! army->getWorld()->getGameView()->getEventDispatcher()-> dispatch(EventDispatcher::ETeamDestroyed,new EventTeamDestroyed(this)); observer->destroyed(); --- 245,249 ---- if (getCount() == 0) { // MICHA£ - Zg³aszamy eventa ! EventDispatcher::get()-> dispatch(EventDispatcher::ETeamDestroyed,new EventTeamDestroyed(this)); observer->destroyed(); *************** *** 460,464 **** // MICHA£ - Zg³aszanie event'ów if (getSeenSet()->getSeenEnemyCounter()>0) { ! army->getWorld()->getGameView()->getEventDispatcher()-> dispatch(EventDispatcher::EEnemySpotted,new EventEnemySpotted(this)); }; --- 460,464 ---- // MICHA£ - Zg³aszanie event'ów if (getSeenSet()->getSeenEnemyCounter()>0) { ! EventDispatcher::get()-> dispatch(EventDispatcher::EEnemySpotted,new EventEnemySpotted(this)); }; |
|
From: Jacek K. <jac...@us...> - 2004-06-30 13:52:48
|
Update of /cvsroot/bastion/bastion/src/util In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28722/src/util Modified Files: EventDispatcher.cpp EventDispatcher.h Log Message: - krok w kierunku umozliwienia istnienia swiata, bez istnienia jego wizualizacji: przeniesienie EventDispatchera z klasy GameView do statycznego pola klasy EventDispatcher. Aby pobrac EventDispatchera wystarczy teraz wywolac EvnetDispatcher::get(). Pozostaje jeszcze zrobic tak aby figurki w UnitHandlerze i InformationCollectorze byly przypisywane z zewnatrz. Index: EventDispatcher.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/util/EventDispatcher.h,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** EventDispatcher.h 26 May 2004 11:50:46 -0000 1.9 --- EventDispatcher.h 30 Jun 2004 13:52:38 -0000 1.10 *************** *** 58,64 **** --- 58,68 ---- ~EventDispatcher(); + /// Pobiera jedyna instancje tego obiektu. + static EventDispatcher* get(); protected: + static EventDispatcher *theOnlyOneDispatcher; + /// Tablica kolejek. Po jednej kolejce dla kazdego rodzaju eventa. EventListenersQueue **queue; Index: EventDispatcher.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/util/EventDispatcher.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** EventDispatcher.cpp 26 May 2004 11:50:46 -0000 1.3 --- EventDispatcher.cpp 30 Jun 2004 13:52:38 -0000 1.4 *************** *** 18,21 **** --- 18,23 ---- #include <iostream> + EventDispatcher * EventDispatcher::theOnlyOneDispatcher = NULL; + EventDispatcher::~EventDispatcher() { *************** *** 63,65 **** --- 65,74 ---- } + EventDispatcher * EventDispatcher::get( ) + { + if(theOnlyOneDispatcher==NULL) + theOnlyOneDispatcher = new EventDispatcher(); + return theOnlyOneDispatcher; + } + |
|
From: Jacek K. <jac...@us...> - 2004-06-30 13:52:47
|
Update of /cvsroot/bastion/bastion/src/interface/gui In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28722/src/interface/gui Modified Files: MenuMoveOrderEditor.cpp MenuMoveOrderEditor.h MenuOrders.cpp MenuTeam.cpp Log Message: - krok w kierunku umozliwienia istnienia swiata, bez istnienia jego wizualizacji: przeniesienie EventDispatchera z klasy GameView do statycznego pola klasy EventDispatcher. Aby pobrac EventDispatchera wystarczy teraz wywolac EvnetDispatcher::get(). Pozostaje jeszcze zrobic tak aby figurki w UnitHandlerze i InformationCollectorze byly przypisywane z zewnatrz. Index: MenuMoveOrderEditor.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/interface/gui/MenuMoveOrderEditor.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** MenuMoveOrderEditor.cpp 28 Apr 2004 11:34:24 -0000 1.6 --- MenuMoveOrderEditor.cpp 30 Jun 2004 13:52:37 -0000 1.7 *************** *** 26,30 **** MenuMoveOrderEditor::~MenuMoveOrderEditor() { ! dispatcher->unregisterListener(this); delete commonComponents; if (figure) delete figure; --- 26,30 ---- MenuMoveOrderEditor::~MenuMoveOrderEditor() { ! EventDispatcher::get()->unregisterListener(this); delete commonComponents; if (figure) delete figure; *************** *** 61,66 **** figure = NULL; ! dispatcher = menuManager->getGUIView()->getGameView()->getEventDispatcher(); ! dispatcher->registerListener(EventDispatcher::EOnMapMouseClick, this); figure = new MapPointFigure --- 61,66 ---- figure = NULL; ! EventDispatcher::get(); ! EventDispatcher::get()->registerListener(EventDispatcher::EOnMapMouseClick, this); figure = new MapPointFigure *************** *** 142,146 **** delete getInstance()->figure; getInstance()->figure = NULL; ! getInstance()->dispatcher->unregisterListener(getInstance()); if (getInstance()->creatingNewOrder && getInstance()->order) { --- 142,146 ---- delete getInstance()->figure; getInstance()->figure = NULL; ! EventDispatcher::get()->unregisterListener(getInstance()); if (getInstance()->creatingNewOrder && getInstance()->order) { *************** *** 157,161 **** delete getInstance()->figure; getInstance()->figure = NULL; ! getInstance()->dispatcher->unregisterListener(getInstance()); /// Utrwalanie parametrow rozkazu. --- 157,161 ---- delete getInstance()->figure; getInstance()->figure = NULL; ! EventDispatcher::get()->unregisterListener(getInstance()); /// Utrwalanie parametrow rozkazu. Index: MenuOrders.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/interface/gui/MenuOrders.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** MenuOrders.cpp 26 May 2004 19:00:56 -0000 1.11 --- MenuOrders.cpp 30 Jun 2004 13:52:37 -0000 1.12 *************** *** 30,35 **** MenuOrders::~MenuOrders() { ! menuManager->getGUIView()->getGameView()-> ! getEventDispatcher()->unregisterListener(this); delete orderChanges; if (menuOrderEditor) { --- 30,34 ---- MenuOrders::~MenuOrders() { ! EventDispatcher::get()->unregisterListener(this); delete orderChanges; if (menuOrderEditor) { *************** *** 114,120 **** hide(); ! menuManager->getGUIView()->getGameView()->getEventDispatcher()->registerListener( EventDispatcher::EOrderManipulation, this); ! menuManager->getGUIView()->getGameView()->getEventDispatcher()-> registerListener(EventDispatcher::ETeamEvents, this); --- 113,119 ---- hide(); ! EventDispatcher::get()->registerListener( EventDispatcher::EOrderManipulation, this); ! EventDispatcher::get()-> registerListener(EventDispatcher::ETeamEvents, this); Index: MenuMoveOrderEditor.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/interface/gui/MenuMoveOrderEditor.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** MenuMoveOrderEditor.h 17 Apr 2004 23:54:09 -0000 1.3 --- MenuMoveOrderEditor.h 30 Jun 2004 13:52:37 -0000 1.4 *************** *** 62,66 **** bool creatingNewOrder; ! EventDispatcher *dispatcher; Team *team; order::OrderMove *order; --- 62,66 ---- bool creatingNewOrder; ! //EventDispatcher *dispatcher; Team *team; order::OrderMove *order; Index: MenuTeam.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/interface/gui/MenuTeam.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** MenuTeam.cpp 21 May 2004 15:12:45 -0000 1.14 --- MenuTeam.cpp 30 Jun 2004 13:52:37 -0000 1.15 *************** *** 46,50 **** MenuTeam::~MenuTeam() { ! menuManager->getGUIView()->getGameView()->getEventDispatcher()-> unregisterListener(this); --- 46,50 ---- MenuTeam::~MenuTeam() { ! EventDispatcher::get()-> unregisterListener(this); *************** *** 113,117 **** //refreshLabels(); ! menuManager->getGUIView()->getGameView()->getEventDispatcher()-> registerListener(EventDispatcher::ETeamEvents, this); --- 113,117 ---- //refreshLabels(); ! EventDispatcher::get()-> registerListener(EventDispatcher::ETeamEvents, this); |
|
From: Jacek K. <jac...@us...> - 2004-06-30 13:52:47
|
Update of /cvsroot/bastion/bastion/src/map In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28722/src/map Modified Files: UnitHandler.cpp Log Message: - krok w kierunku umozliwienia istnienia swiata, bez istnienia jego wizualizacji: przeniesienie EventDispatchera z klasy GameView do statycznego pola klasy EventDispatcher. Aby pobrac EventDispatchera wystarczy teraz wywolac EvnetDispatcher::get(). Pozostaje jeszcze zrobic tak aby figurki w UnitHandlerze i InformationCollectorze byly przypisywane z zewnatrz. Index: UnitHandler.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/map/UnitHandler.cpp,v retrieving revision 1.46 retrieving revision 1.47 diff -C2 -d -r1.46 -r1.47 *** UnitHandler.cpp 26 Jun 2004 15:32:06 -0000 1.46 --- UnitHandler.cpp 30 Jun 2004 13:52:37 -0000 1.47 *************** *** 373,377 **** std::cout<<owner->getId()<<": UnitHandler::iDied()\n"; // MICHA£ - Tu zg³aszam eventa ! army->getWorld()->getGameView()->getEventDispatcher()->dispatch(EventDispatcher::EDied,new EventUnitDied(owner)); /* // Powinno byc to co jest zakomentowane, ale dla celow testowych // zostawiam duszki umarlych jednostek. --- 373,377 ---- std::cout<<owner->getId()<<": UnitHandler::iDied()\n"; // MICHA£ - Tu zg³aszam eventa ! EventDispatcher::get()->dispatch(EventDispatcher::EDied,new EventUnitDied(owner)); /* // Powinno byc to co jest zakomentowane, ale dla celow testowych // zostawiam duszki umarlych jednostek. |
|
From: Jacek K. <jac...@us...> - 2004-06-30 13:52:46
|
Update of /cvsroot/bastion/bastion/src/interface In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28722/src/interface Modified Files: GameView.cpp GameView.h Log Message: - krok w kierunku umozliwienia istnienia swiata, bez istnienia jego wizualizacji: przeniesienie EventDispatchera z klasy GameView do statycznego pola klasy EventDispatcher. Aby pobrac EventDispatchera wystarczy teraz wywolac EvnetDispatcher::get(). Pozostaje jeszcze zrobic tak aby figurki w UnitHandlerze i InformationCollectorze byly przypisywane z zewnatrz. Index: GameView.cpp =================================================================== RCS file: /cvsroot/bastion/bastion/src/interface/GameView.cpp,v retrieving revision 1.47 retrieving revision 1.48 diff -C2 -d -r1.47 -r1.48 *** GameView.cpp 4 Jun 2004 20:21:44 -0000 1.47 --- GameView.cpp 30 Jun 2004 13:52:37 -0000 1.48 *************** *** 64,68 **** GameView::~GameView() { ! eventDispatcher->unregisterListener(this); delete worldView; GUIView::destroyInstance(); --- 64,68 ---- GameView::~GameView() { ! EventDispatcher::get()->unregisterListener(this); delete worldView; GUIView::destroyInstance(); *************** *** 73,77 **** GameView::GameView( ) { ! eventDispatcher = new EventDispatcher(); } --- 73,77 ---- GameView::GameView( ) { ! } *************** *** 87,91 **** canManipulateTeams = true; ! eventDispatcher->registerListener(EventDispatcher::ETeamEvents, this); continueRunning = true; --- 87,91 ---- canManipulateTeams = true; ! EventDispatcher::get()->registerListener(EventDispatcher::ETeamEvents, this); continueRunning = true; *************** *** 237,241 **** /// wydawanie rozkazu move potrzebuje klikniecia /// na mapie dokad trzeba isc ! eventDispatcher->dispatch( EventDispatcher::EOnMapMouseClick, new EventOnMapMouseClick(x/16,y/16)); --- 237,241 ---- /// wydawanie rozkazu move potrzebuje klikniecia /// na mapie dokad trzeba isc ! EventDispatcher::get()->dispatch( EventDispatcher::EOnMapMouseClick, new EventOnMapMouseClick(x/16,y/16)); *************** *** 387,391 **** std::cout << "new active team: " << (int) t << "\n"; activeTeam = t; ! eventDispatcher->dispatch(EventDispatcher::ETeamEvents, new EventActiveTeamChanged(t)); } --- 387,391 ---- std::cout << "new active team: " << (int) t << "\n"; activeTeam = t; ! EventDispatcher::get()->dispatch(EventDispatcher::ETeamEvents, new EventActiveTeamChanged(t)); } Index: GameView.h =================================================================== RCS file: /cvsroot/bastion/bastion/src/interface/GameView.h,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** GameView.h 27 May 2004 18:26:38 -0000 1.25 --- GameView.h 30 Jun 2004 13:52:37 -0000 1.26 *************** *** 92,96 **** WorldView* getWorldView() { return worldView; } ! EventDispatcher* getEventDispatcher() {return eventDispatcher;} void setActiveTeam(Team *t); --- 92,97 ---- WorldView* getWorldView() { return worldView; } ! // EvnetDispatcher przeniesiony do EventDispatcher::get(). ! // EventDispatcher* getEventDispatcher() {return eventDispatcher;} void setActiveTeam(Team *t); *************** *** 104,108 **** protected: ! EventDispatcher *eventDispatcher; bool canManipulateTeams; // true jesli mozna manipulowac druzynami. --- 105,109 ---- protected: ! // EventDispatcher *eventDispatcher; bool canManipulateTeams; // true jesli mozna manipulowac druzynami. |