summaryrefslogtreecommitdiffstats
path: root/pacman-c++/server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'pacman-c++/server.cpp')
-rw-r--r--pacman-c++/server.cpp63
1 files changed, 41 insertions, 22 deletions
diff --git a/pacman-c++/server.cpp b/pacman-c++/server.cpp
index 9baa9ab..516d1f7 100644
--- a/pacman-c++/server.cpp
+++ b/pacman-c++/server.cpp
@@ -54,7 +54,8 @@ bool Server::run()
54void Server::tick() 54void Server::tick()
55{ 55{
56 //qDebug() << "[Tick] Doing server update"; 56 //qDebug() << "[Tick] Doing server update";
57 //TODO: add ai here 57 foreach(Color::Color color, m_bots)
58 aiCalculate(m_actors[color]);
58 Transmission::map_t map = calculateUpdates(); 59 Transmission::map_t map = calculateUpdates();
59 updateMap(map); 60 updateMap(map);
60 61
@@ -89,27 +90,7 @@ invalid_direction:
89 qDebug() << "[Calc] Actor wants to move: color=" << i.key() 90 qDebug() << "[Calc] Actor wants to move: color=" << i.key()
90 << "pos=" << mapPosition << "direction=" << direction; 91 << "pos=" << mapPosition << "direction=" << direction;
91 92
92 QPoint newMapPosition = mapPosition; 93 QPoint newMapPosition = mapPosition + Actor::movementToPoint(direction);
93 switch (direction)
94 {
95 case Actor::Up:
96 newMapPosition += QPoint(0, -1);
97 break;
98 case Actor::Down:
99 newMapPosition += QPoint(0, 1);
100 break;
101 case Actor::Left:
102 newMapPosition += QPoint(-1, 0);
103 break;
104 case Actor::Right:
105 newMapPosition += QPoint(1, 0);
106 break;
107 case Actor::None:
108 break;
109 default:
110 Q_ASSERT(false);
111 }
112
113 if (newMapPosition.x() < 0) 94 if (newMapPosition.x() < 0)
114 newMapPosition.setX(0); 95 newMapPosition.setX(0);
115 if (newMapPosition.x() >= visualMap.size()) 96 if (newMapPosition.x() >= visualMap.size())
@@ -308,7 +289,10 @@ bool Server::waitForClientConnections()
308 } 289 }
309 290
310 for (unsigned int i = (m_maxplayers - m_numbots); i < m_maxplayers; ++i) 291 for (unsigned int i = (m_maxplayers - m_numbots); i < m_maxplayers; ++i)
292 {
311 m_bots.append(Color::order[i]); 293 m_bots.append(Color::order[i]);
294 m_actorMovements[Color::order[i]] = Actor::None;
295 }
312 296
313 qDebug() << "[Server] All Clients connected"; 297 qDebug() << "[Server] All Clients connected";
314 return true; 298 return true;
@@ -355,6 +339,41 @@ void Server::sendUpdate(Transmission::map_t map)
355 } 339 }
356} 340}
357 341
342void Server::aiCalculate(Actor *actor)
343{
344 /* move as long as possible in one direction */
345 if (m_actorMovements[actor->color()] != Actor::None)
346 return;
347
348 QPoint actorpos = CoordToMapPosition(actor->pos().toPoint());
349 QList<Actor::Movement> directions;
350 directions << Actor::Left << Actor::Right << Actor::Up << Actor::Down;
351
352 QMutableListIterator<Actor::Movement> i(directions);
353 while(i.hasNext())
354 {
355 i.next();
356 Actor::Movement direction = i.value();
357 QPoint pos = actorpos + Actor::movementToPoint(direction);
358 if (pos.x() < 0 || pos.x() >= visualMap.size())
359 continue;
360 if (pos.y() < 0 || pos.y() >= visualMap[pos.x()].size())
361 continue;
362 GameEntity *item = visualMap[pos.x()][pos.y()];
363
364 /* check if neighbour is a block */
365 Block *block = qgraphicsitem_cast<Block *>(item);
366 if (block != NULL && block->color() != actor->color())
367 {
368 i.remove();
369 continue;
370 }
371 }
372
373 int rand = (int) (directions.size() * (qrand() / (RAND_MAX + 1.0)));
374 m_actorMovements[actor->color()] = directions.at(rand);
375}
376
358void Server::keyPressUpdate() 377void Server::keyPressUpdate()
359{ 378{
360 ProtoBuf::KeyPressUpdate packet; 379 ProtoBuf::KeyPressUpdate packet;