File indexing completed on 2024-10-06 03:45:02

0001 /*
0002     SPDX-FileCopyrightText: 2009 Mathias Kraus <k.hias@gmx.de>
0003     SPDX-FileCopyrightText: 2007-2008 Thomas Gallinari <tg8187@yahoo.fr>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #ifndef PLAYER_H
0009 #define PLAYER_H
0010 
0011 #include "character.h"
0012 
0013 class PlayerSettings;
0014 class QKeyEvent;
0015 class QString;
0016 class QTimer;
0017 class Bonus;
0018 
0019 /**
0020  * @brief This class represents the main character of the game.
0021  */
0022 class Player : public Character
0023 {
0024     Q_OBJECT
0025 
0026 private:
0027     /** The path to the Player image */
0028     QString m_playerName;
0029     QString m_desktopFilePath;
0030     QString m_graphicsFile;
0031 
0032     /** Player asked speed */
0033     qreal m_askedXSpeed, m_askedYSpeed;
0034 
0035     /** the direction the player is moving/looking */
0036     int m_direction;
0037 
0038     /** Player bomb power */
0039     int m_bombPower;
0040 
0041     /** Player bomb total armory */
0042     int m_maxBombArmory;
0043 
0044     /** Player bomb armory */
0045     int m_bombArmory;
0046 
0047     /** Player death flag */
0048     bool m_death;
0049 
0050     /** Points from the player */
0051     int m_points;
0052 
0053     /** flag if the player is on ice */
0054     bool m_onIce;
0055 
0056     /** flag if the player falls into a hole */
0057     bool m_falling;
0058 
0059     /** flag if the player player has the throw bomb bonus */
0060     bool m_throwBomb;
0061 
0062     /** flag if the player player has the kick bomb bonus */
0063     bool m_kickBomb;
0064 
0065     /** flag if the player should omit bomb kicking if it's the bomb currently dropped and the player hasn't stopped in the mean time or changed direction */
0066     bool m_omitBombCurrentCell;
0067 
0068     /** a list with the gathered shields from the shield bonus */
0069     QList <int> m_listShield;
0070 
0071     /** the bad bonus type */
0072     Granatier::Bonus::Type m_badBonusType;
0073 
0074     /** the speed before a bad bonus was taken */
0075     qreal m_normalSpeed;
0076 
0077     /** the bomb armory before a bad bonus was taken */
0078     int m_normalBombArmory;
0079 
0080     /** flag if the mirror bad bunus was taken */
0081     bool m_moveMirrored;
0082 
0083     /** timer for the bad bonus to disapear */
0084     QTimer* m_badBonusCountdownTimer;
0085     /** milliseconds to elapse till the last bad bonus will be removed */
0086     int m_badBonusMillisecondsToElapse;
0087 
0088 
0089 
0090 public:
0091     /**
0092       * Creates a new Player instance.
0093       * @param p_x the initial x-coordinate
0094       * @param p_y the initial y-coordinate
0095       * @param p_playerID the Player ID for PlayerSettings
0096       * @param p_playerSettings the PlayerSettings
0097       * @param p_arena the Arena the Player is on
0098       */
0099     Player(qreal p_x, qreal p_y, const QString& p_playerID, const PlayerSettings* p_playerSettings, Arena* p_arena);
0100 
0101     /**
0102       * Deletes the Player instance.
0103       */
0104     ~Player() override;
0105 
0106     /**
0107       * Shortcuts for moving and dropping bombs
0108       */
0109     void setShortcuts(const Shortcuts &keys);
0110 
0111     /**
0112       * Gets the file for the Player SVG.
0113       * @return the file for the Player SVG
0114       */
0115     QString getGraphicsFile() const;
0116 
0117     /**
0118      * Gets the path to the Player Desktop file.
0119      * @return the path to the Player Desktop file
0120      */
0121     QString getDesktopFilePath() const;
0122 
0123     /**
0124       * Gets the Player name.
0125       * @return the Player name
0126       */
0127     QString getPlayerName() const;
0128 
0129     /**
0130       * Initializes the Player.
0131       */
0132     void init();
0133 
0134     /**
0135       * pause the timer
0136       */
0137     void pause();
0138 
0139     /**
0140       * resume the timer
0141       */
0142     void resume();
0143 
0144     /**
0145       * Makes the Player ask to go up
0146       */
0147     void goUp() override;
0148 
0149     /**
0150       * Makes the Player ask to go down
0151       */
0152     void goDown() override;
0153 
0154     /**
0155       * Makes the Player ask to go to the right
0156       */
0157     void goRight() override;
0158 
0159     /**
0160       * Makes the Player ask to go to the left
0161       */
0162     void goLeft() override;
0163 
0164     /**
0165       * Moves the Player function of its current coordinates and speed.
0166       */
0167     void move(qreal x, qreal y);
0168 
0169     /**
0170       * Updates the Player move
0171       */
0172     void updateMove() override;
0173 
0174     /**
0175       * @return the asked x speed value
0176       */
0177     qreal getAskedXSpeed() const;
0178 
0179     /**
0180       * @return the asked y speed value
0181       */
0182     qreal getAskedYSpeed() const;
0183 
0184     /**
0185       * @return the direction the player is moving/looking
0186       */
0187     int direction();
0188 
0189     /**
0190       * @return the bomb power
0191       */
0192     int getBombPower() const;
0193 
0194     /**
0195       * decrements the bomb armory
0196       */
0197     void decrementBombArmory();
0198 
0199     /**
0200       * Manages the points won
0201       * @param p_bonus reference to the bonus taken
0202       */
0203     void addBonus(Bonus* p_bonus);
0204 
0205     /**
0206       * Manages the points won
0207       * @param n_ExplosionID the ID from the explosion which hit the player
0208       * @return true if there is an unused shield, false otherwise
0209       */
0210     bool shield(int n_ExplosionID);
0211 
0212     /**
0213       * @return true if the player has the shield bonus
0214       */
0215     bool hasShield();
0216 
0217     /**
0218       * @return true if the player has the throw bonus
0219       */
0220     bool hasThrowBomb();
0221 
0222     /**
0223       * @return true if the player has the kick bonus
0224       */
0225     bool hasKickBomb();
0226 
0227     /**
0228       * @return true if the player has a bad bonus
0229       */
0230     bool hasBadBonus();
0231 
0232     /**
0233       * Implements the Character function
0234       */
0235     void die();
0236 
0237     /**
0238       *  returns if the player is alive
0239       */
0240     bool isAlive() const;
0241 
0242     /**
0243       * resurrects the player
0244       */
0245     void resurrect();
0246 
0247     /**
0248       * returns the points
0249       */
0250     int points() const;
0251 
0252     /**
0253       * adds a point
0254       */
0255     void addPoint();
0256 
0257     /**
0258       * Emits a signal to PlayerItem in order to manage collisions
0259       */
0260     void emitGameUpdated();
0261 
0262     /**
0263       * Manages the keys for moving and dropping bombs.
0264       */
0265     void keyPressed(QKeyEvent* keyEvent);
0266 
0267     /**
0268       * Manages the keys for moving and dropping bombs.
0269       */
0270     void keyReleased(QKeyEvent* keyEvent);
0271 
0272     /**
0273       * Returns the sign of a value with a positive sign for zero
0274       */
0275       //TODO: find a better place
0276     int signZeroPositive(const qreal value);
0277     /**
0278       * Returns the sign of a value with 0 for zero
0279       */
0280     int sign(const qreal value);
0281 
0282 private:
0283     /**
0284       * Updates the Player direction with the asked direction
0285       */
0286     void updateDirection();
0287 
0288     /**
0289       * Stops moving the Player
0290       */
0291     void stopMoving();
0292 
0293 public Q_SLOTS:
0294     /**
0295      * refills the bomb armory after a bomb is exploded
0296      */
0297     void slot_refillBombArmory();
0298 
0299 private Q_SLOTS:
0300     /**
0301      * removes the bad bonus from the player
0302      */
0303     void slot_removeBadBonus();
0304 
0305     /**
0306      * emits the signal with the elapsed bad bonus time for the infosidebar
0307      */
0308     void slot_badBonusTimerTimeout();
0309 
0310 Q_SIGNALS:
0311     /**
0312       * Emitted when the direction changed
0313       */
0314     void directionChanged();
0315 
0316     /**
0317       * Signals to PlayerItem that the game has been updated
0318       */
0319       void gameUpdated();
0320 
0321       /**
0322       * Emitted when the player stops moving
0323       */
0324       void stopped();
0325 
0326       /**
0327       * Emitted when the player drops a bomb
0328       */
0329       void bombDropped(Player* player, qreal x, qreal y, bool newBomb, int throwDistance);
0330 
0331       /**
0332       * Emitted when the player is dying
0333       */
0334       void dying();
0335 
0336       /**
0337       * Emitted when the player is falling in a hole
0338       */
0339       void falling();
0340 
0341       /**
0342       * Emitted when the player has taken the resurrect bonus
0343       */
0344       void resurrectBonusTaken();
0345 
0346       /**
0347       * Emitted when the player has resurrected
0348       */
0349       void resurrected();
0350 
0351        /**
0352       * Emitted when the player has taken a bonus
0353       * @param player the player which info changed
0354       * @param bonusType the bonus that was taken
0355       * @param percentageElapsed the bad bonus time that has elapsed
0356       */
0357       void bonusUpdated(Player* player, Granatier::Bonus::Type bonusType, int percentageElapsed);
0358 };
0359 
0360 #endif