tower* spawnTower(gnode * grid,int node_id,int owner,int type){ tower* t; tower_type *ttype=0; // printDebug("spawn tower %d on %d by %d\n",type,node_id,owner); if (node_id<0 || node_id>=config.gridsize*config.gridsize) return 0; if (grid[node_id].tower!=0) return 0; gnode* node=&grid[node_id]; if (type==BASE) ttype=&config.players[owner].base_type; else ttype=typesTowerGet(type); if (ttype==0) return 0; if((t=newTower())==0){ perror("newTower spawnTower"); return 0; } t->owner=owner; t->position=node_id; t->type=type; t->bit_mask=0; t->level=type;//1; setMask(t,TOWER_CREATE); setTowerBase(t); node->tower=t; config.players[owner].money -= ttype->cost; config.players[owner].stat.towers_built++;//created tower: save to stats config.players[owner].stat.xp += ttype->cost; //TODO: use something better setMask(&config.players[owner], PLAYER_MONEY); return t; }
void Game::placeTower(Coordinate coord, TowerType type) { if (map->getCellType(coord) == CellType::PATH) return; else if (getTower(coord)) return; else { auto tower = towerFactory.create(coord, type); if (debitCurrency(tower->getPurchasePrice())) { towers.push_back(unique_ptr<BaseTower>(tower)); emit newTower(tower); } else delete tower; } }