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