~ubuntu-branches/ubuntu/vivid/kapman/vivid-proposed

« back to all changes in this revision

Viewing changes to kapman.cpp

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2012-12-07 17:37:19 UTC
  • Revision ID: package-import@ubuntu.com-20121207173719-5973b949kqub4zup
Tags: upstream-4.9.90
ImportĀ upstreamĀ versionĀ 4.9.90

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright 2007-2008 Thomas Gallinari <tg8187@yahoo.fr>
 
3
 * 
 
4
 * This program is free software; you can redistribute it and/or
 
5
 * modify it under the terms of the GNU General Public License as
 
6
 * published by the Free Software Foundation; either version 2 of 
 
7
 * the License, or (at your option) any later version.
 
8
 * 
 
9
 * This program is distributed in the hope that it will be useful,
 
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
 * GNU General Public License for more details.
 
13
 * 
 
14
 * You should have received a copy of the GNU General Public License
 
15
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
16
 */
 
17
 
 
18
 
 
19
#include "kapman.h"
 
20
 
 
21
#include <KgDifficulty>
 
22
 
 
23
const qreal Kapman::MAX_SPEED_RATIO = 1.5;
 
24
 
 
25
Kapman::Kapman(qreal p_x, qreal p_y, Maze* p_maze) : Character(p_x, p_y, p_maze) {
 
26
        m_type = Element::KAPMAN;
 
27
        m_maxSpeed = m_normalSpeed * MAX_SPEED_RATIO;
 
28
}
 
29
 
 
30
Kapman::~Kapman() {
 
31
 
 
32
}
 
33
 
 
34
void Kapman::init() {
 
35
        goRight();
 
36
        updateDirection();
 
37
        // Stop animation
 
38
        emit(stopped());
 
39
}
 
40
 
 
41
void Kapman::goUp() {
 
42
        m_askedXSpeed = 0;
 
43
        m_askedYSpeed = -m_speed;
 
44
}
 
45
 
 
46
void Kapman::goDown() {
 
47
        m_askedXSpeed = 0;
 
48
        m_askedYSpeed = m_speed;
 
49
}
 
50
 
 
51
void Kapman::goRight() {
 
52
        m_askedXSpeed = m_speed;
 
53
        m_askedYSpeed = 0;
 
54
}
 
55
 
 
56
void Kapman::goLeft() {
 
57
        m_askedXSpeed = -m_speed;
 
58
        m_askedYSpeed = 0;
 
59
}
 
60
 
 
61
void Kapman::updateDirection() {
 
62
        setXSpeed(m_askedXSpeed);
 
63
        setYSpeed(m_askedYSpeed);
 
64
        m_askedXSpeed = 0;
 
65
        m_askedYSpeed = 0;
 
66
        // Signal to the kapman item that the direction changed
 
67
        emit(directionChanged());
 
68
}
 
69
 
 
70
void Kapman::updateMove() {
 
71
        // If the kapman does not move
 
72
        if (m_xSpeed == 0 && m_ySpeed == 0) {
 
73
                // If the user asks for moving
 
74
                if (m_askedXSpeed != 0 || m_askedYSpeed != 0) {
 
75
                        // Check the next cell with the asked direction
 
76
                        if (getAskedNextCell().getType() == Cell::CORRIDOR) {
 
77
                                // Update the direction
 
78
                                updateDirection();
 
79
                                // Move the kapman
 
80
                                move();
 
81
                        }
 
82
                }
 
83
        }
 
84
        // If the kapman is already moving
 
85
        else {
 
86
                // If the kapman wants to go back it does not wait to be on a center
 
87
                if ( (m_xSpeed!=0 && m_askedXSpeed==-m_xSpeed) || (m_ySpeed!=0 && m_askedYSpeed==-m_ySpeed) ) {
 
88
                        // Go back
 
89
                        updateDirection();
 
90
                        // Move the kapman
 
91
                        move();
 
92
                } else {
 
93
                        // If the kapman gets on a cell center
 
94
                        if (onCenter()) {
 
95
                                // If there is an asked direction (but not a half-turn)
 
96
                                if ((m_askedXSpeed != 0 || m_askedYSpeed != 0) && (m_askedXSpeed != m_xSpeed || m_askedYSpeed != m_ySpeed)) {
 
97
                                        // Check the next cell with the kapman asked direction
 
98
                                        if (getAskedNextCell().getType() == Cell::CORRIDOR) {
 
99
                                                // Move the kapman on the cell center
 
100
                                                moveOnCenter();
 
101
                                                // Update the direction
 
102
                                                updateDirection();
 
103
                                        } else {
 
104
                                                // Check the next cell with the kapman current direction
 
105
                                                if (getNextCell().getType() != Cell::CORRIDOR) {
 
106
                                                        // Move the kapman on the cell center
 
107
                                                        moveOnCenter();
 
108
                                                        // Stop moving
 
109
                                                        stopMoving();
 
110
                                                } else {
 
111
                                                        // Move the kapman
 
112
                                                        move();
 
113
                                                }
 
114
                                        }
 
115
                                } else {
 
116
                                        // Check the next cell with the kapman current direction
 
117
                                        if (getNextCell().getType() != Cell::CORRIDOR) {
 
118
                                                // Move the kapman on the cell center
 
119
                                                moveOnCenter();
 
120
                                                // Stop moving
 
121
                                                stopMoving();
 
122
                                        } else {
 
123
                                                // Move the kapman
 
124
                                                move();
 
125
                                        }
 
126
                                }
 
127
                        } else {
 
128
                                // Move the kapman
 
129
                                move();
 
130
                        }
 
131
                }
 
132
        }
 
133
}
 
134
 
 
135
void Kapman::winPoints(Element* p_element) {
 
136
        // Emits a signal to the game
 
137
        emit(sWinPoints(p_element));
 
138
}
 
139
 
 
140
void Kapman::die() {
 
141
        emit(eaten());
 
142
}
 
143
 
 
144
void Kapman::emitGameUpdated() {
 
145
        emit(gameUpdated());
 
146
}
 
147
 
 
148
qreal Kapman::getAskedXSpeed() const {
 
149
        return m_askedXSpeed;
 
150
}
 
151
 
 
152
qreal Kapman::getAskedYSpeed() const {
 
153
        return m_askedYSpeed;
 
154
}
 
155
 
 
156
Cell Kapman::getAskedNextCell() {
 
157
        // Get the current cell coordinates from the character coordinates
 
158
        int curCellRow = m_maze->getRowFromY(m_y);
 
159
        int curCellCol = m_maze->getColFromX(m_x);
 
160
        Cell nextCell;
 
161
 
 
162
        // Get the next cell function of the character asked direction
 
163
        if (m_askedXSpeed > 0) {
 
164
                nextCell = m_maze->getCell(curCellRow, curCellCol + 1);
 
165
        } else if (m_askedXSpeed < 0) {
 
166
                nextCell = m_maze->getCell(curCellRow, curCellCol - 1);
 
167
        } else if (m_askedYSpeed > 0) {
 
168
                nextCell = m_maze->getCell(curCellRow + 1, curCellCol);
 
169
        } else if (m_askedYSpeed < 0) {
 
170
                nextCell = m_maze->getCell(curCellRow - 1, curCellCol);
 
171
        }
 
172
 
 
173
        return nextCell;
 
174
}
 
175
 
 
176
void Kapman::stopMoving() {
 
177
        setXSpeed(0);
 
178
        setYSpeed(0);
 
179
        m_askedXSpeed = 0;
 
180
        m_askedYSpeed = 0;
 
181
        emit(stopped());
 
182
}
 
183
 
 
184
void Kapman::initSpeedInc() {
 
185
        // Kapman speed increase when level up
 
186
        switch ((int) Kg::difficultyLevel())
 
187
        {
 
188
                case KgDifficultyLevel::Easy:
 
189
                        m_speedIncrease = Character::LOW_SPEED_INC / 2;
 
190
                        break;
 
191
                case KgDifficultyLevel::Medium:
 
192
                        m_speedIncrease = Character::MEDIUM_SPEED_INC / 2;
 
193
                        break;
 
194
                case KgDifficultyLevel::Hard:
 
195
                        m_speedIncrease = Character::HIGH_SPEED_INC / 2;
 
196
                        break;
 
197
        }
 
198
}
 
199