vector2d<int> Unit::availableTile(Entity* target) { GameScene* scene = (GameScene*) (Game::getInstance().currentScene); vector2d<int> tile(-1, -1); vector<vector2d<int>>* candidates; candidates = target->getSurroundingTiles(); for(int i = 0; i < candidates->size(); i++) { if(scene->getEntity(candidates->at(i).X, candidates->at(i).Y) ) { candidates->erase(candidates->begin() + i); i--; } } float lowest = FLT_MAX; for(int i = 0; i < candidates->size(); i++) { float distance = candidates->at(i).getDistanceFrom(vector2d<int>(tileX, tileY) ); if(distance < lowest ) { tile = candidates->at(i); lowest = distance; } } delete candidates; return tile; }
void Unit::addDistanceTiles(int x, int y, int distance) { Game* game = &Game::getInstance(); GameScene* scene = (GameScene*)game->currentScene; if(distance < 0) return; if(x < 0 || x > MAPSIZE-1) { return; } if(y < 0 || y > MAPSIZE-1) { return; } if(!scene->tilesystem.tiles[x][y]->walkable) { return; } Entity* entity = scene->getEntity(x,y); if( entity != NULL && entity != this ) { return; } bool alreadyThere = false; for(int i = 0; i < distanceTiles.size(); i++) { if(distanceTiles.at(i)->getPosition().X == x*10 && distanceTiles.at(i)->getPosition().Z == y*10) { alreadyThere = true; } } bool inAttackRange = false; for(int i = 0; i < scene->entities.size(); i++) { if(scene->entities.at(i)->player == 0) continue; if(scene->entities.at(i)->inAttackRange(x, y, attackDistance) ) { inAttackRange = true; } } if(!inAttackRange && hasMoved) return; if(!alreadyThere) { IAnimatedMesh* model = game->sceneManager->getMesh("res/tileDistance.3ds"); ISceneNode* node = game->sceneManager->addMeshSceneNode(model); node->setMaterialFlag(EMF_LIGHTING, false); node->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL); if(inAttackRange) { node->setMaterialTexture( 0, game->videoDriver->getTexture("res/tileDistanceRed.png") ); } else { node->setMaterialTexture( 0, game->videoDriver->getTexture("res/tileDistanceBlue.png") ); } node->setPosition(vector3d<f32>(x*10, 0, y*10) ); node->setID(0); distanceTiles.push_back(node); } addDistanceTiles(x-1, y, distance-1); addDistanceTiles(x+1, y, distance-1); addDistanceTiles(x, y-1, distance-1); addDistanceTiles(x, y+1, distance-1); }
void SiegeWorkshop::createUnit(){ Game* game = &Game::getInstance(); GameScene* scene = (GameScene*)game->currentScene; std::vector<vector2d<int>> *list; list = this->getSurroundingTiles(); for(int i = 0; i < list->size(); i++) { TileGrass* tile = dynamic_cast<TileGrass*>(scene->tilesystem.tiles[list->at(i).X][list->at(i).Y]); if( scene->getEntity(list->at(i).X, list->at(i).Y) || !tile) { list->erase(list->begin()+i); i--; } } if(list->size() > 0){ ((GameScene*)game->currentScene)->entities.push_back(new UnitCatapult(list->at(0).X,list->at(0).Y, player, scene )); delete list; } }