/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#ifndef BBVS_MINIGAMES_BBTENNIS_H
#define BBVS_MINIGAMES_BBTENNIS_H

#include "bbvs/minigames/minigame.h"

namespace Bbvs {

class MinigameBbTennis : public Minigame {
public:
	MinigameBbTennis(BbvsEngine *vm) : Minigame(vm) {};
	bool run(bool fromMainGame);
public:

	struct Obj {
		int kind;
		int x, y;
		const ObjAnimation *anim;
		int frameIndex;
		int ticks;
		int status;
		int blinkCtr;
		float fltStepX;
		float fltStepY;
		float fltX;
		float fltY;
		int targetX;
		int targetY;
		int ballStep;
		int ballStepCtr;
		int netPlayDirection;
	};

	enum {
		kMaxObjectsCount = 256
	};

	enum {
		kGSTitleScreen      = 0,    // Title screen
		kGSMainGame         = 1,    // Game when called as part of the main game
		kGSStandaloneGame   = 2,    // Game when called as standalone game
		kGSScoreCountUp     = 3     // Score countup and next level text
	};

	Obj _objects[kMaxObjectsCount];

	int _numHearts;
	int _squirrelDelay;
	int _tennisPlayerDelay;
	int _throwerDelay;
	int _netPlayerDelay;
	int _playerDecrease;
	int _delayDecreaseTimer;
	int _numBalls;
	int _newBallTimer;
	int _initBallTimer;
	int _maxBalls;
	int _rapidFireBallsCount;
	int _score, _hiScore;
	int _hitMissRatio;
	bool _allHeartsGone;
	bool _playedThisIsTheCoolest;
	bool _startSoundPlayed;
	bool _endSoundPlaying;

	const ObjAnimation *getAnimation(int animIndex);

	void buildDrawList(DrawList &drawList);
	void buildDrawList0(DrawList &drawList);
	void buildDrawList1(DrawList &drawList);
	void buildDrawList2(DrawList &drawList);

	void drawSprites();

	void initObjs();
	Obj *getFreeObject();
	Obj *findTennisBall(int startObjIndex);
	bool isHit(Obj *obj1, Obj *obj2);

	void initObjects();
	void initObjects0();
	void initObjects1();
	void initObjects2();

	void initVars();
	void initVars0();
	void initVars1();
	void initVars2();

	bool updateStatus(int mouseX, int mouseY, uint mouseButtons);
	bool updateStatus0(int mouseX, int mouseY, uint mouseButtons);
	bool updateStatus1(int mouseX, int mouseY, uint mouseButtons);
	bool updateStatus2(int mouseX, int mouseY, uint mouseButtons);

	void updateObjs();
	void updateTennisBall(int objIndex);
	void updateSquirrel(int objIndex);
	void updateTennisPlayer(int objIndex);
	void updateThrower(int objIndex);
	void updateNetPlayer(int objIndex);
	void updateEnemyTennisBall(int objIndex);
	void makeEnemyBall(int x, int y, int frameIndex);
	void hitSomething();

	void update();

	void loadSounds();

};

} // End of namespace Bbvs

#endif // BBVS_MINIGAMES_BBTENNIS_H
