1 /*
2 SPDX-FileCopyrightText: 2009 Mathias Kraus <k.hias@gmx.de>
3 SPDX-FileCopyrightText: 2007-2008 Thomas Gallinari <tg8187@yahoo.fr>
4 SPDX-FileCopyrightText: 2007-2008 Pierre-Benoît Besse <besse.pb@gmail.com>
5
6 SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9 #include "arena.h"
10 #include "granatier_random.h"
11
12 #include <QPoint>
13
14 #include <cstdlib>
15
Arena()16 Arena::Arena()
17 {
18 }
19
~Arena()20 Arena::~Arena()
21 {
22 for(int i = 0 ; i < m_nbRows; ++i)
23 {
24 delete[] m_cells[i];
25 }
26 delete[] m_cells;
27 }
28
init(const int p_nbRows,const int p_nbColumns)29 void Arena::init(const int p_nbRows, const int p_nbColumns)
30 {
31 m_nbRows = p_nbRows;
32 m_nbColumns = p_nbColumns;
33 m_cells = new Cell*[m_nbRows];
34 for (int i = 0; i < m_nbRows; ++i)
35 {
36 m_cells[i] = new Cell[m_nbColumns];
37 }
38
39 m_emptyCell.setType(Granatier::Cell::HOLE);
40 }
41
getName() const42 QString Arena::getName () const
43 {
44 return m_strArenaName;
45 }
46
setName(const QString & p_strArenaName)47 void Arena::setName (const QString &p_strArenaName)
48 {
49 m_strArenaName = p_strArenaName;
50 }
51
setCellType(const int p_row,const int p_column,const Granatier::Cell::Type p_type)52 void Arena::setCellType(const int p_row, const int p_column, const Granatier::Cell::Type p_type)
53 {
54 if (p_row < 0 || p_row >= m_nbRows || p_column < 0 || p_column >= m_nbColumns)
55 {
56 return;
57 }
58 m_cells[p_row][p_column].setType(p_type);
59 }
60
setCellElement(const int p_row,const int p_column,Element * p_element)61 void Arena::setCellElement(const int p_row, const int p_column, Element * p_element)
62 {
63 if (p_row < 0 || p_row >= m_nbRows || p_column < 0 || p_column >= m_nbColumns)
64 {
65 return;
66 }
67 m_cells[p_row][p_column].setElement(p_element);
68 }
69
removeCellElement(const int p_row,const int p_column,Element * p_element)70 void Arena::removeCellElement(const int p_row, const int p_column, Element * p_element)
71 {
72 if (p_row < 0 || p_row >= m_nbRows || p_column < 0 || p_column >= m_nbColumns)
73 {
74 return;
75 }
76 m_cells[p_row][p_column].removeElement(p_element);
77 }
78
addPlayerPosition(const QPointF & p_position)79 void Arena::addPlayerPosition(const QPointF &p_position)
80 {
81 m_playerPosition.append(p_position);
82
83 int nShuffle;
84 for (int i = 0; i < m_playerPosition.size(); i++)
85 {
86 nShuffle = granatier::RNG::fromRange(0, m_playerPosition.size()-1);
87 m_playerPosition.swapItemsAt(i, nShuffle);
88 }
89 }
90
getPlayerPosition(int p_player) const91 QPointF Arena::getPlayerPosition(int p_player) const
92 {
93 if(m_playerPosition.count() > p_player)
94 {
95 return m_playerPosition.at(p_player);
96 }
97 return m_playerPosition.at(0); //to have a valid position
98 }
99
getCell(const int p_row,const int p_column) const100 Cell Arena::getCell(const int p_row, const int p_column) const
101 {
102 if (p_row < 0 || p_row >= m_nbRows || p_column < 0 || p_column >= m_nbColumns)
103 {
104 return m_emptyCell;
105 }
106 return m_cells[p_row][p_column];
107 }
108
getCoords(Cell * p_cell) const109 QPoint Arena::getCoords(Cell* p_cell) const
110 {
111 for (int i = 0; i < m_nbRows; ++i)
112 {
113 for (int j = 0; j < m_nbColumns; ++j)
114 {
115 if (&m_cells[i][j] == p_cell)
116 {
117 return QPoint(j, i);
118 }
119 }
120 }
121 return QPoint();
122 }
123
getRowFromY(const qreal p_y) const124 int Arena::getRowFromY(const qreal p_y) const
125 {
126 int nRow = static_cast<int>(p_y / Granatier::CellSize);
127 if (p_y < 0)
128 {
129 nRow -= 1;
130 }
131 return nRow;
132 }
133
getColFromX(const qreal p_x) const134 int Arena::getColFromX(const qreal p_x) const
135 {
136 int nCol = static_cast<int>(p_x / Granatier::CellSize);
137 if (p_x < 0)
138 {
139 nCol -= 1;
140 }
141 return nCol;
142 }
143
getNbColumns() const144 int Arena::getNbColumns() const
145 {
146 return m_nbColumns;
147 }
148
getNbRows() const149 int Arena::getNbRows() const
150 {
151 return m_nbRows;
152 }
153