Files
scummvm-cursorfix/engines/bagel/hodjnpodj/packrat/packrat.cpp
2026-02-02 04:50:13 +01:00

3608 lines
102 KiB
C++

/* 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#include "bagel/boflib/misc.h"
#include "bagel/hodjnpodj/hnplibs/stdafx.h"
#include "bagel/hodjnpodj/packrat/packrat.h"
#include "bagel/hodjnpodj/packrat/dialogs.h"
#include "bagel/hodjnpodj/hodjnpodj.h"
namespace Bagel {
namespace HodjNPodj {
namespace Packrat {
#define DYNAMIC_OBJ_COUNT
#define PACKRATTIMER 97
#define MAXLIVESPRITE 5
#define MAXLIVES 10
#define MOVEPLAYER 16
#define MOVEBADGUY 16
#define NUMBEROFPLAYERCELLS 8
#define NUMBEROFBADGUYCELLS 7
#define MAZETOP 26
#define MAZEBOTTOM 442
#define MAZELEFT 22
#define MAZERIGHT 598
#define FOLLOWRIGHTWALL 1
#define FOLLOWLEFTWALL 2
#define PLAYER 6
#define WALL -1
#define OBJECT 1
#define SUPEROBJ1 2
#define SUPEROBJ2 3
#define SUPEROBJ3 4
#define SUPEROBJ4 5
#define BADGUY1 10
#define BADGUY2 20
#define BADGUY3 30
#define BADGUY4 40
#define NUMBEROFROWS 27
#define NUMBEROFCOLS 37
#define EATTURTLE 500
#define RELEASETURTLECOUNT 100
#define IDC_RESETGAME 888
#define MAZE1 "ART\\PKRT1.BMP"
#define MAZE2 "ART\\PKRT2.BMP"
#define MAZE3 "ART\\PKRT3.BMP"
#define MAZE4 "ART\\PKRT4.BMP"
#define OPTIONU "ART\\OPTIONU.BMP"
#define OPTIONG "ART\\OPTIONG.BMP"
#define BADGUYSPRITEU "ART\\TURTLEBU.BMP"
#define BADGUYSPRITED "ART\\TURTLEBD.BMP"
#define BADGUYSPRITEL "ART\\TURTLEBL.BMP"
#define BADGUYSPRITER "ART\\TURTLEBR.BMP"
#define GOODGUYSPRITEU "ART\\TURTLEGU.BMP"
#define GOODGUYSPRITED "ART\\TURTLEGD.BMP"
#define GOODGUYSPRITEL "ART\\TURTLEGL.BMP"
#define GOODGUYSPRITER "ART\\TURTLEGR.BMP"
#define FLASHSPRITEU "ART\\TURTLEFU.BMP"
#define FLASHSPRITED "ART\\TURTLEFD.BMP"
#define FLASHSPRITEL "ART\\TURTLEFL.BMP"
#define FLASHSPRITER "ART\\TURTLEFR.BMP"
#define PODJUPSPRITE "ART\\PODJU.BMP"
#define PODJDOWNSPRITE "ART\\PODJD.BMP"
#define PODJLEFTSPRITE "ART\\PODJL.BMP"
#define PODJRIGHTSPRITE "ART\\PODJR.BMP"
#define HODJUPSPRITE "ART\\HODJU.BMP"
#define HODJDOWNSPRITE "ART\\HODJD.BMP"
#define HODJLEFTSPRITE "ART\\HODJL.BMP"
#define HODJRIGHTSPRITE "ART\\HODJR.BMP"
#define LIVESPRITE "ART\\LIVE.BMP"
#define BALLOONSPRITE "ART\\BALLOONS.BMP"
#define SSPACEBMP "ART\\SEMPTY.BMP"
#define LSPACEBMP "ART\\LEMPTY.BMP"
#define BADGUYSOUND ".\\SOUND\\GULP.WAV"
#define PLAYERSOUND ".\\SOUND\\SORRY2.WAV"
#define SUPERSOUND ".\\SOUND\\POWER.WAV"
#define NEWLIFE_WAV ".\\SOUND\\NEWLIFE.WAV"
#define BG1 1
#define BG2 2
#define BG3 4
#define BG4 8
extern CMainPackRatWindow *pcwndPackRat;
CPalette *pGamePalette = nullptr; // Palette to be used throughout the game
CBmpButton *pOptionButton = nullptr; // Option button object for getting to the options dialog
CSprite *pPlayerRightSprite = nullptr;
CSprite *pPlayerLeftSprite = nullptr;
CSprite *pPlayerUpSprite = nullptr;
CSprite *pPlayerDownSprite = nullptr;
CSprite *pBadGuyUpSprite = nullptr;
CSprite *pBadGuyDownSprite = nullptr;
CSprite *pBadGuyLeftSprite = nullptr;
CSprite *pBadGuyRightSprite = nullptr;
CSprite *pGoodGuyUpSprite = nullptr;
CSprite *pGoodGuyDownSprite = nullptr;
CSprite *pGoodGuyLeftSprite = nullptr;
CSprite *pGoodGuyRightSprite = nullptr;
CSprite *pFlashUpSprite = nullptr;
CSprite *pFlashDownSprite = nullptr;
CSprite *pFlashLeftSprite = nullptr;
CSprite *pFlashRightSprite = nullptr;
CSprite *pLiveSprite = nullptr;
CSprite *pLivesSprite[MAXLIVESPRITE];
CSprite *pBalloonSprite = nullptr;
CSprite *pPlayerSprite = nullptr;
CSprite *apBadGuySprite[4];
CBitmap *pSSpaceBMP = nullptr;
CBitmap *pLSpaceBMP = nullptr;
static CSound *pGameSound = nullptr; // Game theme song
POINT ptNOLocInGrid;
int nPaintObject;
int nPlayerMove;
int anBadGuyMove[4];
bool bFirstTimer;
bool bEatTurtle;
bool abChangeTurtle[4];
int nEatTurtle;
bool bChangeTurtle;
int nOldTSpeed;
bool abGoodTurtle[4];
bool anSuperObj[4];
bool bEndGame;
bool bFlashTurtle;
int anReleaseTurtleCount[4];
bool bUseJoyStick;
unsigned int awJoyCenter[2];
int nNumOfBGKilled;
int nStartingLives;
int nKillBadGuy = 0;
bool bKillPlayer = false;
bool bResetGame;
bool bMouseHidden = false;
bool bInNewGameRect = false;
bool bStart;
int anCurrentMaze[999];
const int anMaze4[999] = {
-1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1,
-1, 0, 0, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, 0, 0, -1,
-1, 0, 0, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, 0, 0, -1,
-1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1,
-1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 5, 1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, 1, 2, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1,
-1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1,
0, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 0,
-1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1,
-1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1,
-1, 1, 1, 1, 1, 1, 1, -1, -1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, -1, -1, 1, 1, 1, 1, 1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1,
-1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1,
-1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1,
-1, 0, 0, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, 0, 0, -1,
-1, 0, 0, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, 0, 0, -1,
-1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1
};
const int anMaze3[999] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 0, 0, -1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, -1, -1, 0, -1, -1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, -1, 0, 0, -1,
-1, 0, 0, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 0, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 0, 0, -1,
-1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 0, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1,
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 0, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, 0, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1,
0, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, 0, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 0,
-1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 3, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 5, -1, -1, 1, -1,
-1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1,
0, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, 0, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 0,
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, 0, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 0, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 0, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1,
-1, 0, 0, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 0, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 0, 0, -1,
-1, 0, 0, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 0, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 0, 0, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
};
const int anMaze2[999] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 0, 0, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, 0, 0, -1,
-1, 0, 0, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, 0, 0, -1,
-1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1,
-1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 2, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 4, -1, -1, 1, -1,
-1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 3, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 5, -1, -1, 1, 1, 1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
-1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1,
-1, 0, 0, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, 0, 0, -1,
-1, 0, 0, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 0, 0, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
};
const int anMaze1[999] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 0, 0, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 0, 0, -1,
-1, 0, 0, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, 0, 0, -1,
-1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1,
-1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1,
-1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1,
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 5, -1, -1, -1, 3, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1,
0, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 0,
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1,
-1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, -1, -1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1,
-1, 0, 0, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, 0, 0, -1,
-1, 0, 0, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 0, 0, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
};
int nExtraLives;
bool bInLoop;
bool bBALLOONShown;
/*****************************************************************
*
* CMainPackRatWindow
*
* FUNCTIONAL DESCRIPTION:
*
* Create the window with the appropriate style, size, menu, etc.;
* it will be later revealed by CTheApp::InitInstance(). Then
* create our splash screen object by opening and loading its DIB.
*
* FORMAL PARAMETERS:
*
* lUserAmount = initial amount of money that user starts with
* defaults to zero
* nRounds = the number of rounds to play, if 0 then not playing rounds
* = defaults to zero
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
CMainPackRatWindow::CMainPackRatWindow(HWND hCallingWnd, LPGAMESTRUCT lpGameStruct) :
ptBaloon(609, 25),
ptLastMouseCoord(-1, -1),
ptCurrMouseCoord(-1, -1),
rNewGame(21, 3, 227, 20),
ptScore(MainRect.left + 10, MainRect.top + 10,
MainRect.left + 110, MainRect.top + 25) {
CDC *pDC = nullptr; // device context for the screen
CString WndClass;
CSize mySize;
bool bTestCreate; // bool for testing the creation of each button
bool bTestBmp; // bool for testing the creation of the splash screen
int nLoop1;
JOYINFO joyInfo;
CBitmap *pTempBMP = nullptr;
// Define a special window class which traps double-clicks, is byte aligned
// to maximize BITBLT performance, and creates "owned" DCs rather than sharing
// the five system defined DCs which are not guaranteed to be available;
// this adds a bit to our app size but avoids hangs/freezes/lockups.
BeginWaitCursor();
initStatics();
WndClass = AfxRegisterWndClass(CS_DBLCLKS | CS_BYTEALIGNWINDOW | CS_OWNDC,
nullptr, nullptr, nullptr);
// set the seed for the random number generator
//srand( (unsigned)time( nullptr ));
// initialize private members
m_lpGameStruct = lpGameStruct;
m_hCallAppWnd = hCallingWnd;
// load splash screen
pDC = GetDC(); // get a device context for our window
/*
pDibDoc = new CDibDoc(); // create an object to hold our splash screen
ASSERT(pDibDoc); // ... and verify we got it
bTestBmp = pDibDoc->OpenDocument(MAZE1); // next load in the actual DIB based artwork
ASSERT( bTestBmp );
pGamePalette = (*pDibDoc).DetachPalette(); // grab its palette and save it for later use
delete pDibDoc; // now discard the splash screen
*/
// set window coordinates to center game on screeen
MainRect.left = (pDC->GetDeviceCaps(HORZRES) - GAME_WIDTH) >> 1;
MainRect.top = (pDC->GetDeviceCaps(VERTRES) - GAME_HEIGHT) >> 1;
MainRect.right = MainRect.left + GAME_WIDTH; // determine where to place the game window
MainRect.bottom = MainRect.top + GAME_HEIGHT; // ... so it is centered on the screen
ReleaseDC(pDC);
pDC = nullptr;
// Create the window as a POPUP so that no boarders, title, or menu are present;
// this is because the game's background art will fill the entire 640x40 area.
Create(WndClass, "Boffo Games -- Packrat", WS_POPUP, MainRect, nullptr, 0);
pDC = GetDC();
pTempBMP = FetchBitmap(pDC, &pGamePalette, MAZE1);
bTestBmp = CSprite::SetBackdrop(pDC, pGamePalette, pTempBMP);
ASSERT(bTestBmp);
pTempBMP = nullptr;
//ReleaseDC( pDC );
//pDC = nullptr;
ShowWindow(SW_SHOWNORMAL);
//UpdateWindow();
//pDC = GetDC();
//pOldPalette = pDC->SelectPalette( pGamePalette, false );
//pDC->RealizePalette();
pSSpaceBMP = FetchResourceBitmap(pDC, nullptr, IDB_SEMPTY);
pLSpaceBMP = FetchResourceBitmap(pDC, nullptr, IDB_LEMPTY);
CSprite::RefreshBackdrop(pDC, pGamePalette);
// create buttons
if (joySetCapture(m_hWnd, JOYSTICKID1, 5000, true) == JOYERR_NOERROR) {
bUseJoyStick = true;
joySetThreshold(JOYSTICKID1, 2000);
joyGetPos(JOYSTICKID1, &joyInfo);
awJoyCenter[0] = (unsigned int)joyInfo.wXpos;
awJoyCenter[1] = (unsigned int)joyInfo.wYpos;
} else {
bUseJoyStick = false;
}
if (m_lpGameStruct->bPlayingMetagame) {
pBalloonSprite = new CSprite;
pBalloonSprite->SharePalette(pGamePalette);
bTestCreate = pBalloonSprite->LoadCels(pDC, BALLOONSPRITE, 1);
//bTestCreate = pLiveSprite->LoadResourceCels( pDC, IDB_LIVE, 1 );
pBalloonSprite->SetMasked(true);
pBalloonSprite->SetMobile(false);
pBalloonSprite->SetOptimizeSpeed(false);
ASSERT(bTestCreate != 0); // test for sprite's creation
bBALLOONShown = false;
}
pOptionButton = new CBmpButton; // create the Options button
ASSERT(pOptionButton);
OptionRect.SetRect(OPTION_LEFT,
OPTION_TOP,
OPTION_LEFT + OPTION_WIDTH,
OPTION_TOP + OPTION_HEIGHT);
bTestCreate = pOptionButton->Create("Options", BS_OWNERDRAW | WS_CHILD | WS_VISIBLE, OptionRect, this, IDC_OPTION);
ASSERT(bTestCreate != 0); // test for button's creation
bTestCreate = pOptionButton->LoadBitmaps(IDB_OPTIONU, IDB_OPTIONU, IDB_OPTIONU, IDB_OPTIONG);
//bTestCreate = pOptionButton->LoadBitmaps( OPTIONU, nullptr, nullptr, OPTIONG );
ASSERT(bTestCreate != 0); // test for button's creation
if (m_lpGameStruct->bPlayingHodj) {
pPlayerRightSprite = new CSprite;
pPlayerRightSprite->SharePalette(pGamePalette);
//bTestCreate = pPlayerRightSprite->LoadResourceCels( pDC, IDB_HODJR, 8 );
bTestCreate = pPlayerRightSprite->LoadCels(pDC, HODJRIGHTSPRITE, 8);
ASSERT(bTestCreate); // test for sprite's creation
pPlayerRightSprite->SetMasked(true);
pPlayerRightSprite->SetMobile(true);
pPlayerRightSprite->SetOptimizeSpeed(true);
pPlayerLeftSprite = new CSprite;
pPlayerLeftSprite->SharePalette(pGamePalette);
//bTestCreate = pPlayerLeftSprite->LoadResourceCels( pDC, IDB_HODJL, 8 );
bTestCreate = pPlayerLeftSprite->LoadCels(pDC, HODJLEFTSPRITE, 8);
ASSERT(bTestCreate); // test for sprite's creation
pPlayerLeftSprite->SetMasked(true);
pPlayerLeftSprite->SetMobile(true);
pPlayerLeftSprite->SetOptimizeSpeed(true);
pPlayerUpSprite = new CSprite;
pPlayerUpSprite->SharePalette(pGamePalette);
//bTestCreate = pPlayerUpSprite->LoadResourceCels( pDC, IDB_HODJU, 8 );
bTestCreate = pPlayerUpSprite->LoadCels(pDC, HODJUPSPRITE, 8);
ASSERT(bTestCreate); // test for sprite's creation
pPlayerUpSprite->SetMasked(true);
pPlayerUpSprite->SetMobile(true);
pPlayerUpSprite->SetOptimizeSpeed(true);
pPlayerDownSprite = new CSprite;
pPlayerDownSprite->SharePalette(pGamePalette);
//bTestCreate = pPlayerDownSprite->LoadResourceCels( pDC, IDB_HODJD, 8 );
bTestCreate = pPlayerDownSprite->LoadCels(pDC, HODJDOWNSPRITE, 8);
ASSERT(bTestCreate); // test for sprite's creation
pPlayerDownSprite->SetMasked(true);
pPlayerDownSprite->SetMobile(true);
pPlayerDownSprite->SetOptimizeSpeed(true);
} else {
pPlayerRightSprite = new CSprite;
pPlayerRightSprite->SharePalette(pGamePalette);
//bTestCreate = pPlayerRightSprite->LoadResourceCels( pDC, IDB_PODJR, 8 );
bTestCreate = pPlayerRightSprite->LoadCels(pDC, PODJRIGHTSPRITE, 8);
ASSERT(bTestCreate); // test for sprite's creation
pPlayerRightSprite->SetMasked(true);
pPlayerRightSprite->SetMobile(true);
pPlayerRightSprite->SetOptimizeSpeed(true);
pPlayerLeftSprite = new CSprite;
pPlayerLeftSprite->SharePalette(pGamePalette);
//bTestCreate = pPlayerLeftSprite->LoadResourceCels( pDC, IDB_PODJL, 8 );
bTestCreate = pPlayerLeftSprite->LoadCels(pDC, PODJLEFTSPRITE, 8);
ASSERT(bTestCreate); // test for sprite's creation
pPlayerLeftSprite->SetMasked(true);
pPlayerLeftSprite->SetMobile(true);
pPlayerLeftSprite->SetOptimizeSpeed(true);
pPlayerUpSprite = new CSprite;
pPlayerUpSprite->SharePalette(pGamePalette);
//bTestCreate = pPlayerUpSprite->LoadResourceCels( pDC, IDB_PODJU, 8 );
bTestCreate = pPlayerUpSprite->LoadCels(pDC, PODJUPSPRITE, 8);
ASSERT(bTestCreate); // test for sprite's creation
pPlayerUpSprite->SetMasked(true);
pPlayerUpSprite->SetMobile(true);
pPlayerUpSprite->SetOptimizeSpeed(true);
pPlayerDownSprite = new CSprite;
pPlayerDownSprite->SharePalette(pGamePalette);
//bTestCreate = pPlayerDownSprite->LoadResourceCels( pDC, IDB_PODJD, 8 );
bTestCreate = pPlayerDownSprite->LoadCels(pDC, PODJDOWNSPRITE, 8);
ASSERT(bTestCreate); // test for sprite's creation
pPlayerDownSprite->SetMasked(true);
pPlayerDownSprite->SetMobile(true);
pPlayerDownSprite->SetOptimizeSpeed(true);
}
pPlayerSprite = pPlayerUpSprite->DuplicateSprite(pDC);
pPlayerSprite->LinkSprite();
m_ptCurrentPPos.x = 0;
m_ptCurrentPPos.y = 0;
pBadGuyUpSprite = new CSprite;
pBadGuyUpSprite->SharePalette(pGamePalette);
bTestCreate = pBadGuyUpSprite->LoadCels(pDC, BADGUYSPRITEU, 7);
//bTestCreate = pBadGuyUpSprite->LoadResourceCels( pDC, IDB_TURTLEBU, 7 );
pBadGuyUpSprite->SetMasked(true);
pBadGuyUpSprite->SetMobile(true);
pBadGuyUpSprite->SetOptimizeSpeed(true);
ASSERT(bTestCreate != 0); // test for sprite's creation
pBadGuyDownSprite = new CSprite;
pBadGuyDownSprite->SharePalette(pGamePalette);
bTestCreate = pBadGuyDownSprite->LoadCels(pDC, BADGUYSPRITED, 7);
//bTestCreate = pBadGuyDownSprite->LoadResourceCels( pDC, IDB_TURTLEBD, 7 );
pBadGuyDownSprite->SetMasked(true);
pBadGuyDownSprite->SetMobile(true);
pBadGuyDownSprite->SetOptimizeSpeed(true);
ASSERT(bTestCreate != 0); // test for sprite's creation
pBadGuyLeftSprite = new CSprite;
pBadGuyLeftSprite->SharePalette(pGamePalette);
bTestCreate = pBadGuyLeftSprite->LoadCels(pDC, BADGUYSPRITEL, 7);
//bTestCreate = pBadGuyLeftSprite->LoadResourceCels( pDC, IDB_TURTLEBL, 7 );
pBadGuyLeftSprite->SetMasked(true);
pBadGuyLeftSprite->SetMobile(true);
pBadGuyLeftSprite->SetOptimizeSpeed(true);
ASSERT(bTestCreate != 0); // test for sprite's creation
pBadGuyRightSprite = new CSprite;
pBadGuyRightSprite->SharePalette(pGamePalette);
bTestCreate = pBadGuyRightSprite->LoadCels(pDC, BADGUYSPRITER, 7);
//bTestCreate = pBadGuyRightSprite->LoadResourceCels( pDC, IDB_TURTLEBR, 7 );
pBadGuyRightSprite->SetMasked(true);
pBadGuyRightSprite->SetMobile(true);
pBadGuyRightSprite->SetOptimizeSpeed(true);
ASSERT(bTestCreate != 0); // test for sprite's creation
pGoodGuyUpSprite = new CSprite;
pGoodGuyUpSprite->SharePalette(pGamePalette);
bTestCreate = pGoodGuyUpSprite->LoadCels(pDC, GOODGUYSPRITEU, 7);
//bTestCreate = pGoodGuyUpSprite->LoadResourceCels( pDC, IDB_TURTLEGU, 7 );
pGoodGuyUpSprite->SetMasked(true);
pGoodGuyUpSprite->SetMobile(true);
pGoodGuyUpSprite->SetOptimizeSpeed(true);
ASSERT(bTestCreate != 0); // test for sprite's creation
pGoodGuyDownSprite = new CSprite;
pGoodGuyDownSprite->SharePalette(pGamePalette);
bTestCreate = pGoodGuyDownSprite->LoadCels(pDC, GOODGUYSPRITED, 7);
//bTestCreate = pGoodGuyDownSprite->LoadResourceCels( pDC, IDB_TURTLEGD, 7 );
pGoodGuyDownSprite->SetMasked(true);
pGoodGuyDownSprite->SetMobile(true);
pGoodGuyDownSprite->SetOptimizeSpeed(true);
ASSERT(bTestCreate != 0); // test for sprite's creation
pGoodGuyLeftSprite = new CSprite;
pGoodGuyLeftSprite->SharePalette(pGamePalette);
bTestCreate = pGoodGuyLeftSprite->LoadCels(pDC, GOODGUYSPRITEL, 7);
//bTestCreate = pGoodGuyLeftSprite->LoadResourceCels( pDC, IDB_TURTLEGL, 7 );
pGoodGuyLeftSprite->SetMasked(true);
pGoodGuyLeftSprite->SetMobile(true);
pGoodGuyLeftSprite->SetOptimizeSpeed(true);
ASSERT(bTestCreate != 0); // test for sprite's creation
pGoodGuyRightSprite = new CSprite;
pGoodGuyRightSprite->SharePalette(pGamePalette);
bTestCreate = pGoodGuyRightSprite->LoadCels(pDC, GOODGUYSPRITER, 7);
//bTestCreate = pGoodGuyRightSprite->LoadResourceCels( pDC, IDB_TURTLEGR, 7 );
pGoodGuyRightSprite->SetMasked(true);
pGoodGuyRightSprite->SetMobile(true);
pGoodGuyRightSprite->SetOptimizeSpeed(true);
ASSERT(bTestCreate != 0); // test for sprite's creation
pFlashUpSprite = new CSprite;
pFlashUpSprite->SharePalette(pGamePalette);
bTestCreate = pFlashUpSprite->LoadCels(pDC, FLASHSPRITEU, 7);
//bTestCreate = pFlashUpSprite->LoadResourceCels( pDC, IDB_TURTLEFU, 7 );
pFlashUpSprite->SetMasked(true);
pFlashUpSprite->SetMobile(true);
pFlashUpSprite->SetOptimizeSpeed(true);
ASSERT(bTestCreate != 0); // test for sprite's creation
pFlashDownSprite = new CSprite;
pFlashDownSprite->SharePalette(pGamePalette);
bTestCreate = pFlashDownSprite->LoadCels(pDC, FLASHSPRITED, 7);
//bTestCreate = pFlashDownSprite->LoadResourceCels( pDC, IDB_TURTLEFD, 7 );
pFlashDownSprite->SetMasked(true);
pFlashDownSprite->SetMobile(true);
pFlashDownSprite->SetOptimizeSpeed(true);
ASSERT(bTestCreate != 0); // test for sprite's creation
pFlashLeftSprite = new CSprite;
pFlashLeftSprite->SharePalette(pGamePalette);
bTestCreate = pFlashLeftSprite->LoadCels(pDC, FLASHSPRITEL, 7);
//bTestCreate = pFlashLeftSprite->LoadResourceCels( pDC, IDB_TURTLEFL, 7 );
pFlashLeftSprite->SetMasked(true);
pFlashLeftSprite->SetMobile(true);
pFlashLeftSprite->SetOptimizeSpeed(true);
ASSERT(bTestCreate != 0); // test for sprite's creation
pFlashRightSprite = new CSprite;
pFlashRightSprite->SharePalette(pGamePalette);
bTestCreate = pFlashRightSprite->LoadCels(pDC, FLASHSPRITER, 7);
//bTestCreate = pFlashRightSprite->LoadResourceCels( pDC, IDB_TURTLEFR, 7 );
pFlashRightSprite->SetMasked(true);
pFlashRightSprite->SetMobile(true);
pFlashRightSprite->SetOptimizeSpeed(true);
ASSERT(bTestCreate != 0); // test for sprite's creation
for (nLoop1 = 0; nLoop1 < 4; nLoop1++) {
apBadGuySprite[nLoop1] = nullptr;
apBadGuySprite[nLoop1] = new CSprite;
apBadGuySprite[nLoop1] = pBadGuyUpSprite->DuplicateSprite(pDC);
apBadGuySprite[nLoop1]->LinkSprite();
}
pLiveSprite = new CSprite;
pLiveSprite->SharePalette(pGamePalette);
bTestCreate = pLiveSprite->LoadCels(pDC, LIVESPRITE, 1);
//bTestCreate = pLiveSprite->LoadResourceCels( pDC, IDB_LIVE, 1 );
pLiveSprite->SetMasked(true);
pLiveSprite->SetMobile(true);
pLiveSprite->SetOptimizeSpeed(false);
ASSERT(bTestCreate != 0); // test for sprite's creation
for (nLoop1 = 0; nLoop1 < MAXLIVESPRITE; nLoop1++) {
pLivesSprite[nLoop1] = new CSprite;
pLivesSprite[nLoop1] = pLiveSprite->DuplicateSprite(pDC);
}
ReleaseDC(pDC); // release our window context
m_ptCurrPLocInGrid.x = 0;
m_ptCurrPLocInGrid.y = 0;
m_aptCurrBLocInGrid[0].x = 0;
m_aptCurrBLocInGrid[0].y = 0;
m_aptCurrBLocInGrid[1].x = 0;
m_aptCurrBLocInGrid[1].y = 0;
m_aptCurrBLocInGrid[2].x = 0;
m_aptCurrBLocInGrid[2].y = 0;
m_aptCurrBLocInGrid[3].x = 0;
m_aptCurrBLocInGrid[3].y = 0;
m_bMouseCaptured = false;
m_nPDirection = 0;
m_nNextDir = m_nPDirection;
m_nBDirection = FOLLOWRIGHTWALL;
m_anBDirection[0] = 1;
m_anBDirection[1] = 3;
m_anBDirection[2] = 2;
m_anBDirection[3] = 4;
m_nNumberOfMoves = 0;
m_lScore = 0;
m_bSuspend = true;
bEatTurtle = false;
nEatTurtle = 0;
bFirstTimer = true;
bChangeTurtle = false;
bFlashTurtle = false;
nOldTSpeed = 0;
nPaintObject = 0;
ptNOLocInGrid.x = 0;
ptNOLocInGrid.y = 0;
nNumOfBGKilled = 0;
bEndGame = false;
if (m_lpGameStruct->bPlayingMetagame) {
nStartingLives = 1;
switch (m_lpGameStruct->nSkillLevel) {
case SKILLLEVEL_LOW:
m_nGameLevel = 1;
break;
case SKILLLEVEL_MEDIUM:
m_nGameLevel = 6;
break;
case SKILLLEVEL_HIGH:
m_nGameLevel = 12;
break;
}
} else {
m_nGameLevel = 1;
nStartingLives = 3;
}
bResetGame = false;
ResetGame();
anBadGuyMove[0] = NUMBEROFBADGUYCELLS + 1;
anBadGuyMove[1] = NUMBEROFBADGUYCELLS + 1;
anBadGuyMove[2] = NUMBEROFBADGUYCELLS + 1;
anBadGuyMove[3] = NUMBEROFBADGUYCELLS + 1;
nPlayerMove = NUMBEROFPLAYERCELLS;
if (m_lpGameStruct->bMusicEnabled) {
pGameSound = new CSound(this, GAME_THEME,
SOUND_MIDI | SOUND_LOOP | SOUND_DONT_LOOP_TO_END);
if (pGameSound != nullptr)
(*pGameSound).midiLoopPlaySegment(2310, 29400, 0, FMT_MILLISEC);
} // end if pGameSound
if (m_lpGameStruct->bPlayingMetagame) {
m_bSuspend = false;
bFirstTimer = false;
SetTimer(PACKRATTIMER, 50, nullptr);
}
bStart = false;
bInLoop = false;
EndWaitCursor();
(*this).SetFocus();
}
void CMainPackRatWindow::initStatics() {
pGamePalette = nullptr;
pOptionButton = nullptr;
pPlayerRightSprite = nullptr;
pPlayerLeftSprite = nullptr;
pPlayerUpSprite = nullptr;
pPlayerDownSprite = nullptr;
pBadGuyUpSprite = nullptr;
pBadGuyDownSprite = nullptr;
pBadGuyLeftSprite = nullptr;
pBadGuyRightSprite = nullptr;
pGoodGuyUpSprite = nullptr;
pGoodGuyDownSprite = nullptr;
pGoodGuyLeftSprite = nullptr;
pGoodGuyRightSprite = nullptr;
pFlashUpSprite = nullptr;
pFlashDownSprite = nullptr;
pFlashLeftSprite = nullptr;
pFlashRightSprite = nullptr;
pLiveSprite = nullptr;
Common::fill(pLivesSprite, pLivesSprite + MAXLIVESPRITE, nullptr);
pBalloonSprite = nullptr;
pPlayerSprite = nullptr;
Common::fill(apBadGuySprite, apBadGuySprite + 4, nullptr);
pSSpaceBMP = nullptr;
pLSpaceBMP = nullptr;
pGameSound = nullptr; // Game theme song
ptNOLocInGrid.x = ptNOLocInGrid.y = 0;
nPaintObject = 0;
nPlayerMove = 0;
Common::fill(anBadGuyMove, anBadGuyMove + 4, 0);
bFirstTimer = false;
bEatTurtle = false;
Common::fill(abChangeTurtle, abChangeTurtle + 4, false);
nEatTurtle = 0;
bChangeTurtle = false;
nOldTSpeed = 0;
Common::fill(abGoodTurtle, abGoodTurtle + 4, false);
Common::fill(anSuperObj, anSuperObj + 4, false);
bEndGame = false;
bFlashTurtle = false;
Common::fill(anReleaseTurtleCount, anReleaseTurtleCount + 4, 0);
bUseJoyStick = false;
awJoyCenter[0] = awJoyCenter[1] = 0;
nNumOfBGKilled = 0;
nStartingLives = 0;
nKillBadGuy = 0;
bKillPlayer = false;
bResetGame = false;
bMouseHidden = false;
bInNewGameRect = false;
bStart = false;
}
/*****************************************************************
*
* SetMaze
*
* FUNCTIONAL DESCRIPTION:
*
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::SetMaze() {
CDC *pDC = GetDC();
CPalette *pOldPal = nullptr;
int nLoop1;
CBitmap *pTempBmp = nullptr;
bool bTestBmp;
SetLevel();
// if ( pGamePalette != nullptr ) {
// delete pGamePalette;
// pGamePalette = nullptr;
// }
pOldPal = pDC->SelectPalette(pGamePalette, false);
pDC->RealizePalette();
switch (m_nMaze) {
case 2:
pTempBmp = FetchBitmap(pDC, nullptr, MAZE2);
#ifndef DYNAMIC_OBJ_COUNT
m_nNumberOfObjectsLeft = 0;
#endif
for (nLoop1 = 0; nLoop1 < 999; nLoop1++) {
anCurrentMaze[nLoop1] = anMaze2[nLoop1];
}
#ifndef DYNAMIC_OBJ_COUNT
m_nNumberOfObjectsLeft = 365;
#endif
break;
case 3:
pTempBmp = FetchBitmap(pDC, nullptr, MAZE3);
#ifndef DYNAMIC_OBJ_COUNT
m_nNumberOfObjectsLeft = 0;
#endif
for (nLoop1 = 0; nLoop1 < 999; nLoop1++) {
anCurrentMaze[nLoop1] = anMaze3[nLoop1];
}
#ifndef DYNAMIC_OBJ_COUNT
m_nNumberOfObjectsLeft = 342;
#endif
break;
case 4:
pTempBmp = FetchBitmap(pDC, nullptr, MAZE4);
#ifndef DYNAMIC_OBJ_COUNT
m_nNumberOfObjectsLeft = 0;
#endif
for (nLoop1 = 0; nLoop1 < 999; nLoop1++) {
anCurrentMaze[nLoop1] = anMaze4[nLoop1];
}
#ifndef DYNAMIC_OBJ_COUNT
m_nNumberOfObjectsLeft = 366;
#endif
break;
default:
pTempBmp = FetchBitmap(pDC, nullptr, MAZE1);
#ifndef DYNAMIC_OBJ_COUNT
m_nNumberOfObjectsLeft = 0;
#endif
for (nLoop1 = 0; nLoop1 < 999; nLoop1++) {
anCurrentMaze[nLoop1] = anMaze1[nLoop1];
#ifndef DYNAMIC_OBJ_COUNT
m_nNumberOfObjectsLeft = 358;
#endif
}
break;
}
bTestBmp = CSprite::SetBackdrop(pDC, pGamePalette, pTempBmp);
ASSERT(bTestBmp);
pTempBmp = nullptr;
m_anMazeArray = (int *) &anCurrentMaze[0];
#ifdef DYNAMIC_OBJ_COUNT
m_nNumberOfObjectsLeft = 0;
for (int nLoop = 0; nLoop < 999; nLoop++) {
if (m_anMazeArray[nLoop] > 0) {
m_nNumberOfObjectsLeft++;
}
}
#endif
anSuperObj[0] = false;
anSuperObj[1] = false;
anSuperObj[2] = false;
anSuperObj[3] = false;
nNumOfBGKilled = 0;
bChangeTurtle = true;
bEatTurtle = false;
nEatTurtle = 0;
KillPlayer(true);
pDC->SelectPalette(pOldPal, false);
ReleaseDC(pDC);
RedrawWindow();
m_bSuspend = false;
}
/*****************************************************************
*
* SetLevel
*
* FUNCTIONAL DESCRIPTION:
*
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::SetLevel() {
switch (m_nGameLevel) {
case 1:
m_nBadGuySpeed = 9;
m_nPlayerSpeed = 8;
m_nMaze = 1;
break;
case 2:
m_nBadGuySpeed = 9;
m_nPlayerSpeed = 8;
m_nMaze = 2;
break;
case 3:
m_nBadGuySpeed = 9;
m_nPlayerSpeed = 8;
m_nMaze = 3;
break;
case 4:
m_nBadGuySpeed = 9;
m_nPlayerSpeed = 8;
m_nMaze = 4;
break;
case 5:
m_nBadGuySpeed = 8;
m_nPlayerSpeed = 7;
m_nMaze = 1;
break;
case 6:
m_nBadGuySpeed = 8;
m_nPlayerSpeed = 7;
m_nMaze = 2;
break;
case 7:
m_nBadGuySpeed = 8;
m_nPlayerSpeed = 7;
m_nMaze = 3;
break;
case 8:
m_nBadGuySpeed = 8;
m_nPlayerSpeed = 7;
m_nMaze = 4;
break;
case 9:
m_nBadGuySpeed = 7;
m_nPlayerSpeed = 6;
m_nMaze = 1;
break;
case 10:
m_nBadGuySpeed = 7;
m_nPlayerSpeed = 6;
m_nMaze = 2;
break;
case 11:
m_nBadGuySpeed = 7;
m_nPlayerSpeed = 6;
m_nMaze = 3;
break;
case 12:
m_nBadGuySpeed = 7;
m_nPlayerSpeed = 6;
m_nMaze = 4;
break;
case 13:
m_nBadGuySpeed = 6;
m_nPlayerSpeed = 5;
m_nMaze = 1;
break;
case 14:
m_nBadGuySpeed = 6;
m_nPlayerSpeed = 5;
m_nMaze = 2;
break;
case 15:
m_nBadGuySpeed = 6;
m_nPlayerSpeed = 5;
m_nMaze = 3;
break;
case 16:
m_nBadGuySpeed = 6;
m_nPlayerSpeed = 5;
m_nMaze = 4;
break;
case 17:
m_nBadGuySpeed = 5;
m_nPlayerSpeed = 4;
m_nMaze = 1;
break;
case 18:
m_nBadGuySpeed = 5;
m_nPlayerSpeed = 4;
m_nMaze = 2;
break;
case 19:
m_nBadGuySpeed = 5;
m_nPlayerSpeed = 4;
m_nMaze = 3;
break;
case 20:
m_nBadGuySpeed = 5;
m_nPlayerSpeed = 4;
m_nMaze = 4;
break;
case 21:
m_nBadGuySpeed = 4;
m_nPlayerSpeed = 3;
m_nMaze = 1;
break;
case 22:
m_nBadGuySpeed = 4;
m_nPlayerSpeed = 3;
m_nMaze = 2;
break;
case 23:
m_nBadGuySpeed = 4;
m_nPlayerSpeed = 3;
m_nMaze = 3;
break;
case 24:
m_nBadGuySpeed = 4;
m_nPlayerSpeed = 3;
m_nMaze = 4;
break;
case 25:
m_nBadGuySpeed = 3;
m_nPlayerSpeed = 2;
m_nMaze = 1;
break;
case 26:
m_nBadGuySpeed = 3;
m_nPlayerSpeed = 2;
m_nMaze = 2;
break;
case 27:
m_nBadGuySpeed = 3;
m_nPlayerSpeed = 2;
m_nMaze = 3;
break;
case 28:
m_nBadGuySpeed = 3;
m_nPlayerSpeed = 2;
m_nMaze = 4;
break;
case 29:
m_nBadGuySpeed = 2;
m_nPlayerSpeed = 1;
m_nMaze = 1;
break;
case 30:
m_nBadGuySpeed = 2;
m_nPlayerSpeed = 1;
m_nMaze = 2;
break;
case 31:
m_nBadGuySpeed = 2;
m_nPlayerSpeed = 1;
m_nMaze = 3;
break;
case 32:
m_nBadGuySpeed = 2;
m_nPlayerSpeed = 1;
m_nMaze = 4;
break;
case 33:
m_nBadGuySpeed = 1;
m_nPlayerSpeed = 1;
m_nMaze = 1;
break;
case 34:
m_nBadGuySpeed = 1;
m_nPlayerSpeed = 1;
m_nMaze = 2;
break;
case 35:
m_nBadGuySpeed = 1;
m_nPlayerSpeed = 1;
m_nMaze = 3;
break;
case 36:
m_nBadGuySpeed = 1;
m_nPlayerSpeed = 1;
m_nMaze = 4;
break;
}
return;
}
/*****************************************************************
*
* KillBadGuy
*
* FUNCTIONAL DESCRIPTION:
*
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::KillBadGuy(int nWhichBadGuy, bool bFirstTime) {
CDC *pDC = GetDC();
nKillBadGuy = 0;
m_bSuspend = true;
if (nWhichBadGuy >= BG4) {
if (apBadGuySprite[3] != nullptr)
apBadGuySprite[3]->EraseSprite(pDC);
m_aptCurrBLocInGrid[3].x = 34;
m_aptCurrBLocInGrid[3].y = 25;
anReleaseTurtleCount[3] = 1;
m_aptCurrentBPos[3].x = (m_aptCurrBLocInGrid[3].x * MOVEBADGUY) + MAZELEFT;
m_aptCurrentBPos[3].y = (m_aptCurrBLocInGrid[3].y * MOVEBADGUY) + MAZETOP;
apBadGuySprite[3]->PaintSprite(pDC, m_aptCurrentBPos[3]);
nWhichBadGuy -= BG4;
if (bFirstTime == false) {
nNumOfBGKilled++;
m_lScore += ((Power(2, (nNumOfBGKilled - 1)) * 25) * m_nGameLevel);
}
}
if (nWhichBadGuy >= BG3) {
if (apBadGuySprite[2] != nullptr)
apBadGuySprite[2]->EraseSprite(pDC);
m_aptCurrBLocInGrid[2].x = 2;
m_aptCurrBLocInGrid[2].y = 25;
anReleaseTurtleCount[2] = 1;
m_aptCurrentBPos[2].x = (m_aptCurrBLocInGrid[2].x * MOVEBADGUY) + MAZELEFT;
m_aptCurrentBPos[2].y = (m_aptCurrBLocInGrid[2].y * MOVEBADGUY) + MAZETOP;
apBadGuySprite[2]->PaintSprite(pDC, m_aptCurrentBPos[2]);
nWhichBadGuy -= BG3;
if (bFirstTime == false) {
nNumOfBGKilled++;
m_lScore += ((Power(2, (nNumOfBGKilled - 1)) * 25) * m_nGameLevel);
}
}
if (nWhichBadGuy >= BG2) {
if (apBadGuySprite[1] != nullptr)
apBadGuySprite[1]->EraseSprite(pDC);
m_aptCurrBLocInGrid[1].x = 34;
m_aptCurrBLocInGrid[1].y = 2;
anReleaseTurtleCount[1] = 1;
m_aptCurrentBPos[1].x = (m_aptCurrBLocInGrid[1].x * MOVEBADGUY) + MAZELEFT;
m_aptCurrentBPos[1].y = (m_aptCurrBLocInGrid[1].y * MOVEBADGUY) + MAZETOP;
apBadGuySprite[1]->PaintSprite(pDC, m_aptCurrentBPos[1]);
nWhichBadGuy -= BG2;
if (bFirstTime == false) {
nNumOfBGKilled++;
m_lScore += ((Power(2, (nNumOfBGKilled - 1)) * 25) * m_nGameLevel);
}
}
if (nWhichBadGuy >= BG1) {
if (apBadGuySprite[0] != nullptr)
apBadGuySprite[0]->EraseSprite(pDC);
m_aptCurrBLocInGrid[0].x = 2;
m_aptCurrBLocInGrid[0].y = 2;
anReleaseTurtleCount[0] = 1;
m_aptCurrentBPos[0].x = (m_aptCurrBLocInGrid[0].x * MOVEBADGUY) + MAZELEFT;
m_aptCurrentBPos[0].y = (m_aptCurrBLocInGrid[0].y * MOVEBADGUY) + MAZETOP;
apBadGuySprite[0]->PaintSprite(pDC, m_aptCurrentBPos[0]);
nWhichBadGuy -= BG1;
if (bFirstTime == false) {
nNumOfBGKilled++;
m_lScore += ((Power(2, (nNumOfBGKilled - 1)) * 25) * m_nGameLevel);
}
}
ReleaseDC(pDC);
m_bSuspend = false;
return;
}
/*****************************************************************
*
* KillPlayer
*
* FUNCTIONAL DESCRIPTION:
*
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::KillPlayer(bool bFirstTime) {
CDC *pDC = GetDC();
CMsgDlg cMessageBoxDlg((CWnd *)this, pGamePalette);
bKillPlayer = false;
m_bSuspend = true;
pPlayerSprite->EraseSprite(pDC);
KillBadGuy((BG1 + BG2 + BG3 + BG4), true);
m_bSuspend = true;
// m_anMazeArray[m_ptCurrPLocInGrid.x + ( m_ptCurrPLocInGrid.y * NUMBEROFCOLS )] = 0;
switch (m_nMaze) {
case 2:
m_ptCurrPLocInGrid.x = 18;
m_ptCurrPLocInGrid.y = 15;
break;
case 3:
case 4:
m_ptCurrPLocInGrid.x = 18;
m_ptCurrPLocInGrid.y = 13;
break;
case 5:
default:
m_ptCurrPLocInGrid.x = 18;
m_ptCurrPLocInGrid.y = 14;
break;
}
m_ptCurrentPPos.x = (m_ptCurrPLocInGrid.x * MOVEPLAYER) + MAZELEFT;
m_ptCurrentPPos.y = (m_ptCurrPLocInGrid.y * MOVEPLAYER) + MAZETOP;
pPlayerSprite->PaintSprite(pDC, m_ptCurrentPPos);
ReleaseDC(pDC);
if (bFirstTime == false) {
m_nLives--;
pOptionButton->EnableWindow(true);
if (m_nLives == 0) {
if (m_lpGameStruct->bSoundEffectsEnabled) {
sndPlaySound(nullptr, SND_ASYNC);
sndPlaySound(DEAD_WAV, SND_ASYNC);
}
if (m_bMouseCaptured) {
ReleaseCapture();
m_bMouseCaptured = false;
while (MFC::ShowCursor(true) < 0)
;
}
cMessageBoxDlg.SetInitialOptions(4, m_lScore);
cMessageBoxDlg.DoModal();
(*this).SetFocus();
m_nPDirection = 0;
m_nNextDir = 0;
m_bSuspend = true;
if (m_lpGameStruct->bPlayingMetagame) {
PostMessage(WM_CLOSE, 0, 0);
bEndGame = true;
}
if (m_lpGameStruct->bSoundEffectsEnabled) {
sndPlaySound(nullptr, SND_ASYNC);
}
RedrawWindow();
return;
} else {
if (m_bMouseCaptured) {
ReleaseCapture();
m_bMouseCaptured = false;
while (MFC::ShowCursor(true) < 0)
;
}
cMessageBoxDlg.SetInitialOptions(3, m_lScore, m_nLives);
cMessageBoxDlg.DoModal();
if (m_lpGameStruct->bSoundEffectsEnabled) {
sndPlaySound(nullptr, SND_ASYNC);
}
(*this).SetFocus();
}
}
RedrawWindow();
m_nPDirection = 0;
m_nNextDir = 0;
m_bSuspend = false;
return;
}
/*****************************************************************
*
* OnPaint
*
* FUNCTIONAL DESCRIPTION:
*
* Repaint the screen whenever needed; e.g. when uncovered by an
* overlapping window, when maximized from an icon, and when it the
* window is initially created. Ensures that the entire client area
* of the main screen window is repainted, not just the portion in the
* update region; see SplashScreen();
*
* This routine is called whenever Windows sends a WM_PAINT message.
* Note that creating a CPaintDC automatically does a BeginPaint and
* an EndPaint call is done when it is destroyed at the end of this
* function. CPaintDC's constructor needs the window (this).
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::OnPaint() {
PAINTSTRUCT lpPaint;
BeginPaint(&lpPaint); // bracket start of window update
SplashScreen(); // repaint our window's content
EndPaint(&lpPaint); // bracket end of window update
}
/*****************************************************************
*
* PaintObjects
*
* FUNCTIONAL DESCRIPTION:
*
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::PaintObjects(int nSize) {
CDC *pDC = GetDC();
CPalette *pOldPal = pDC->SelectPalette(pGamePalette, false);
int x, y;
pDC->RealizePalette();
if (nSize == 1) {
if (m_nMaze != 1) {
x = (ptNOLocInGrid.x * MOVEPLAYER) + MAZELEFT + 6;
y = (ptNOLocInGrid.y * MOVEPLAYER) + MAZETOP + 6;
} else {
x = (ptNOLocInGrid.x * MOVEPLAYER) + MAZELEFT + 6;
y = (ptNOLocInGrid.y * MOVEPLAYER) + MAZETOP + 7;
}
PaintMaskedBitmap(pDC, pGamePalette, pSSpaceBMP, x, y, 9, 9);
PaintMaskedBitmap(CSprite::GetBackdropDC(pDC), pGamePalette, pSSpaceBMP, x, y, 9, 9);
CSprite::ReleaseBackdropDC();
} else {
x = (ptNOLocInGrid.x * MOVEPLAYER) + MAZELEFT + 1;
y = (ptNOLocInGrid.y * MOVEPLAYER) + MAZETOP + 1;
// PaintBitmap( pDC, pGamePalette, pLSpaceBMP, x, y, 17, 17 );
// PaintBitmap( CSprite::GetBackdropDC(), pGamePalette, pLSpaceBMP, x, y, 17, 17 );
PaintMaskedBitmap(pDC, pGamePalette, pLSpaceBMP, x, y, 19, 19);
PaintMaskedBitmap(CSprite::GetBackdropDC(pDC), pGamePalette, pLSpaceBMP, x, y, 19, 19);
CSprite::ReleaseBackdropDC();
}
pDC->SelectPalette(pOldPal, false);
ReleaseDC(pDC);
nPaintObject = 0;
ptNOLocInGrid.x = 0;
ptNOLocInGrid.y = 0;
return;
}
/*****************************************************************
*
* PickUpSuperObject
*
* FUNCTIONAL DESCRIPTION:
*
*
*
* FORMAL PARAMETERS:
*
*
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::PickUpSuperObject() {
int y = 0;
int x = 0;
bool bInSequence = false;
if (((m_anMazeArray[m_ptCurrPLocInGrid.x + (m_ptCurrPLocInGrid.y * NUMBEROFCOLS)] % 10) >= SUPEROBJ1) &&
((m_anMazeArray[m_ptCurrPLocInGrid.x + (m_ptCurrPLocInGrid.y * NUMBEROFCOLS)] % 10) <= SUPEROBJ4)) {
y = (m_anMazeArray[m_ptCurrPLocInGrid.x + (m_ptCurrPLocInGrid.y * NUMBEROFCOLS)] % 10);
m_anMazeArray[m_ptCurrPLocInGrid.x + (m_ptCurrPLocInGrid.y * NUMBEROFCOLS)] = 0;
bEatTurtle = true;
nEatTurtle = 1;
nOldTSpeed = m_nBadGuySpeed;
m_nBadGuySpeed *= 2;
if (m_lpGameStruct->bSoundEffectsEnabled) {
sndPlaySound(nullptr, SND_ASYNC);
sndPlaySound(SUPERSOUND, SND_ASYNC);
}
bChangeTurtle = true;
m_nNumberOfObjectsLeft--;
m_lScore += (5 * m_nGameLevel);
nPaintObject = 2;
ptNOLocInGrid.x = m_ptCurrPLocInGrid.x;
ptNOLocInGrid.y = m_ptCurrPLocInGrid.y;
bInSequence = true;
anSuperObj[y - 2] = true;
for (x = 0; x < (y - 1); x++) {
if (anSuperObj[x] != true)
bInSequence = false;
}
if (bInSequence) {
if (y == 5) {
m_lScore += (500 * m_nGameLevel);
}
}
}
return;
}
/*****************************************************************
*
* PickUpObject
*
* FUNCTIONAL DESCRIPTION:
*
*
*
* FORMAL PARAMETERS:
*
*
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::PickUpObject() {
if ((m_anMazeArray[m_ptCurrPLocInGrid.x + (m_ptCurrPLocInGrid.y * NUMBEROFCOLS)] % 10) == OBJECT) {
m_anMazeArray[m_ptCurrPLocInGrid.x + (m_ptCurrPLocInGrid.y * NUMBEROFCOLS)] = 0;
m_nNumberOfObjectsLeft--;
m_lScore += m_nGameLevel;
nPaintObject = OBJECT;
ptNOLocInGrid.x = m_ptCurrPLocInGrid.x;
ptNOLocInGrid.y = m_ptCurrPLocInGrid.y;
}
return;
}
/*****************************************************************
*
* PlayerKilled
*
* FUNCTIONAL DESCRIPTION:
*
* checkes whether a player / turtle have been killed
*
* FORMAL PARAMETERS:
*
* which turtle to check against
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
bool CMainPackRatWindow::PlayerKilled(int nWhichBadGuy) {
bool bReturn = false;
if ((m_aptCurrBLocInGrid[nWhichBadGuy].x == m_ptCurrPLocInGrid.x) &&
(m_aptCurrBLocInGrid[nWhichBadGuy].y == m_ptCurrPLocInGrid.y)) {
if (bEatTurtle) {
if (m_lpGameStruct->bSoundEffectsEnabled) {
sndPlaySound(nullptr, SND_ASYNC);
sndPlaySound(BADGUYSOUND, SND_ASYNC);
}
nKillBadGuy += Power(2, nWhichBadGuy);
} else {
if (m_lpGameStruct->bSoundEffectsEnabled) {
sndPlaySound(nullptr, SND_ASYNC);
sndPlaySound(PLAYERSOUND, SND_ASYNC);
}
bReturn = true;
}
}
return (bReturn);
}
/*****************************************************************
*
* SetNewPlayerPos
*
* FUNCTIONAL DESCRIPTION:
*
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::SetNewPlayerPos() {
CDC *pDC = GetDC();
int nWhichBadGuy;
int nOldDir;
CSprite *pTempSprite = nullptr;
JOYINFO joyInfo;
CMsgDlg cMessageBoxDlg((CWnd *)this, pGamePalette);
if (bEndGame) {
ReleaseDC(pDC);
return;
}
nOldDir = m_nPDirection;
if ((bUseJoyStick) && (m_nNextDir == 0)) {
joyGetPos(JOYSTICKID1, &joyInfo);
if ((unsigned int)(joyInfo.wXpos) > (unsigned int)(awJoyCenter[0] + 10000))
m_nNextDir = 2;
else {
if ((unsigned int)(joyInfo.wXpos) < (unsigned int)(awJoyCenter[0] - 10000))
m_nNextDir = 1;
else {
if ((unsigned int)(joyInfo.wYpos) > (unsigned int)(awJoyCenter[1] + 10000))
m_nNextDir = 4;
else {
if ((unsigned int)(joyInfo.wYpos) < (unsigned int)(awJoyCenter[1] - 10000))
m_nNextDir = 3;
}
}
}
}
switch (m_nNextDir) {
case 1:
if (m_anMazeArray[m_ptCurrPLocInGrid.x - 1 + (m_ptCurrPLocInGrid.y * NUMBEROFCOLS)] != WALL) {
m_nPDirection = m_nNextDir;
m_nNextDir = 0;
}
break;
case 2:
if (m_anMazeArray[m_ptCurrPLocInGrid.x + 1 + (m_ptCurrPLocInGrid.y * NUMBEROFCOLS)] != WALL) {
m_nPDirection = m_nNextDir;
m_nNextDir = 0;
}
break;
case 3:
if (m_anMazeArray[m_ptCurrPLocInGrid.x + ((m_ptCurrPLocInGrid.y - 1) * NUMBEROFCOLS)] != WALL) {
m_nPDirection = m_nNextDir;
m_nNextDir = 0;
}
break;
case 4:
if (m_anMazeArray[m_ptCurrPLocInGrid.x + ((m_ptCurrPLocInGrid.y + 1) * NUMBEROFCOLS)] != WALL) {
m_nPDirection = m_nNextDir;
m_nNextDir = 0;
}
break;
}
switch (m_nPDirection) {
case 1: // move left
if (m_ptCurrPLocInGrid.x <= 0) {
m_ptCurrentPPos.x = MAZERIGHT;
// m_anMazeArray[m_ptCurrPLocInGrid.x + ( m_ptCurrPLocInGrid.y * NUMBEROFCOLS )] = 0;
m_ptCurrPLocInGrid.x = 36;
} else {
if (m_anMazeArray[m_ptCurrPLocInGrid.x - 1 + (m_ptCurrPLocInGrid.y * NUMBEROFCOLS)] != WALL) {
if (nOldDir != m_nPDirection) {
pTempSprite = pPlayerLeftSprite->DuplicateSprite(pDC);
}
m_ptCurrentPPos.x = (m_ptCurrPLocInGrid.x * MOVEPLAYER) + MAZELEFT;
m_ptCurrentPPos.y = (m_ptCurrPLocInGrid.y * MOVEPLAYER) + MAZETOP;
m_ptCurrPLocInGrid.x--;
PickUpObject();
PickUpSuperObject();
} else {
m_nPDirection = 0;
}
}
break;
case 2: // move right
if (m_ptCurrPLocInGrid.x >= 36) {
m_ptCurrentPPos.x = MAZELEFT;
// m_anMazeArray[m_ptCurrPLocInGrid.x + ( m_ptCurrPLocInGrid.y * NUMBEROFCOLS )] = 0;
m_ptCurrPLocInGrid.x = 0;
} else {
if (m_anMazeArray[m_ptCurrPLocInGrid.x + 1 + (m_ptCurrPLocInGrid.y * NUMBEROFCOLS)] != WALL) {
if (nOldDir != m_nPDirection) {
pTempSprite = pPlayerRightSprite->DuplicateSprite(pDC);
}
m_ptCurrentPPos.x = (m_ptCurrPLocInGrid.x * MOVEPLAYER) + MAZELEFT;
m_ptCurrentPPos.y = (m_ptCurrPLocInGrid.y * MOVEPLAYER) + MAZETOP;
m_ptCurrPLocInGrid.x++;
PickUpObject();
PickUpSuperObject();
} else {
m_nPDirection = 0;
}
}
break;
case 3: // move up
if (m_ptCurrPLocInGrid.y <= 0) {
m_ptCurrentPPos.y = MAZEBOTTOM;
// m_anMazeArray[m_ptCurrPLocInGrid.y + ( m_ptCurrPLocInGrid.x * NUMBEROFCOLS )]=0;
m_ptCurrPLocInGrid.y = 26;
} else {
if (m_anMazeArray[m_ptCurrPLocInGrid.x + ((m_ptCurrPLocInGrid.y - 1) * NUMBEROFCOLS)] != WALL) {
if (nOldDir != m_nPDirection) {
pTempSprite = pPlayerUpSprite->DuplicateSprite(pDC);
}
m_ptCurrentPPos.x = (m_ptCurrPLocInGrid.x * MOVEPLAYER) + MAZELEFT;
m_ptCurrentPPos.y = (m_ptCurrPLocInGrid.y * MOVEPLAYER) + MAZETOP;
m_ptCurrPLocInGrid.y--;
PickUpObject();
PickUpSuperObject();
} else {
m_nPDirection = 0;
}
}
break;
case 4: // move down
if (m_ptCurrPLocInGrid.y >= 26) {
m_ptCurrentPPos.y = MAZETOP;
// m_anMazeArray[m_ptCurrPLocInGrid.x + ( m_ptCurrPLocInGrid.y * NUMBEROFCOLS )]=0;
m_ptCurrPLocInGrid.y = 0;
} else {
if (m_anMazeArray[m_ptCurrPLocInGrid.x + ((m_ptCurrPLocInGrid.y + 1) * NUMBEROFCOLS)] != WALL) {
if (nOldDir != m_nPDirection) {
pTempSprite = pPlayerDownSprite->DuplicateSprite(pDC);
}
m_ptCurrentPPos.x = (m_ptCurrPLocInGrid.x * MOVEPLAYER) + MAZELEFT;
m_ptCurrentPPos.y = (m_ptCurrPLocInGrid.y * MOVEPLAYER) + MAZETOP;
m_ptCurrPLocInGrid.y++;
PickUpObject();
PickUpSuperObject();
} else {
m_nPDirection = 0;
}
}
break;
}
if (pTempSprite != nullptr) {
pTempSprite->LinkSprite();
pTempSprite->PaintSprite(pDC, m_ptCurrentPPos);
pPlayerSprite->EraseSprite(pDC);
pPlayerSprite->UnlinkSprite();
delete pPlayerSprite;
pPlayerSprite = pTempSprite;
}
pPlayerSprite->PaintSprite(pDC, m_ptCurrentPPos);
// m_anMazeArray[m_ptCurrPLocInGrid.x + ( m_ptCurrPLocInGrid.y * NUMBEROFCOLS )]=0;
for (nWhichBadGuy = 0; nWhichBadGuy < 4; nWhichBadGuy++) {
if (PlayerKilled(nWhichBadGuy)) {
bKillPlayer = true;
if (pDC != nullptr)
ReleaseDC(pDC);
return;
}
}
if (CheckMessages() == true) {
PostMessage(WM_CLOSE);
bEndGame = true;
}
if (m_nNumberOfObjectsLeft < 0) {
if (m_lpGameStruct->bPlayingMetagame) {
pOptionButton->EnableWindow(true);
PaintObjects();
if (m_bMouseCaptured) {
ReleaseCapture();
m_bMouseCaptured = false;
while (MFC::ShowCursor(true) < 0)
;
}
cMessageBoxDlg.SetInitialOptions(5, m_lScore);
cMessageBoxDlg.DoModal();
(*this).SetFocus();
m_nPDirection = 0;
m_nNextDir = 0;
m_bSuspend = true;
PostMessage(WM_CLOSE, 0, 0);
bEndGame = true;
// return;
} else {
m_nGameLevel++;
if (m_nGameLevel > LEVELMAX) {
if (m_lpGameStruct->bSoundEffectsEnabled) {
sndPlaySound(nullptr, SND_ASYNC);
sndPlaySound(LASTLEV_WAV, SND_ASYNC);
}
pOptionButton->EnableWindow(true);
if (m_bMouseCaptured) {
ReleaseCapture();
m_bMouseCaptured = false;
while (MFC::ShowCursor(true) < 0)
;
}
cMessageBoxDlg.SetInitialOptions(2, m_lScore);
cMessageBoxDlg.DoModal();
(*this).SetFocus();
m_bSuspend = true;
if (m_lpGameStruct->bPlayingMetagame) {
sndPlaySound(nullptr, SND_ASYNC);
PostMessage(WM_CLOSE, 0, 0);
bEndGame = true;
}
} else {
pOptionButton->EnableWindow(true);
if (m_lpGameStruct->bSoundEffectsEnabled) {
sndPlaySound(LEVEL_WAV, SND_ASYNC);
}
if (m_bMouseCaptured) {
ReleaseCapture();
m_bMouseCaptured = false;
while (MFC::ShowCursor(true) < 0)
;
}
cMessageBoxDlg.SetInitialOptions(1, m_lScore, (m_nGameLevel - 1));
cMessageBoxDlg.DoModal();
(*this).SetFocus();
SetMaze();
m_bSuspend = false;
}
}
}
if (m_nNumberOfObjectsLeft == 0)
m_nNumberOfObjectsLeft--;
if (pDC != nullptr) {
ReleaseDC(pDC);
}
return;
}
/*****************************************************************
*
* MovePlayer
*
* FUNCTIONAL DESCRIPTION:
*
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::MovePlayer() {
CDC *pDC = GetDC();
if (bEndGame) {
ReleaseDC(pDC);
return;
}
if (nPlayerMove > m_nPlayerSpeed) {
if (bKillPlayer) {
KillPlayer();
}
if (nKillBadGuy > 0) {
KillBadGuy(nKillBadGuy);
}
nPlayerMove = 1;
ReleaseDC(pDC);
SetNewPlayerPos();
return;
}
switch (m_nPDirection) {
case 1: // move left
m_ptCurrentPPos.x = ((m_ptCurrPLocInGrid.x + 1) * MOVEPLAYER) + MAZELEFT - ((nPlayerMove * MOVEPLAYER) / m_nPlayerSpeed);
m_ptCurrentPPos.y = (m_ptCurrPLocInGrid.y * MOVEPLAYER) + MAZETOP;
pPlayerSprite->PaintSprite(pDC, m_ptCurrentPPos);
break;
case 2: // move right
m_ptCurrentPPos.x = ((m_ptCurrPLocInGrid.x - 1) * MOVEPLAYER) + MAZELEFT + ((nPlayerMove * MOVEPLAYER) / m_nPlayerSpeed);
m_ptCurrentPPos.y = (m_ptCurrPLocInGrid.y * MOVEPLAYER) + MAZETOP;
pPlayerSprite->PaintSprite(pDC, m_ptCurrentPPos);
break;
case 3: // move up
m_ptCurrentPPos.x = (m_ptCurrPLocInGrid.x * MOVEPLAYER) + MAZELEFT;
m_ptCurrentPPos.y = ((m_ptCurrPLocInGrid.y + 1) * MOVEPLAYER) + MAZETOP - ((nPlayerMove * MOVEPLAYER) / m_nPlayerSpeed);
pPlayerSprite->PaintSprite(pDC, m_ptCurrentPPos);
break;
case 4: // move down
m_ptCurrentPPos.x = (m_ptCurrPLocInGrid.x * MOVEPLAYER) + MAZELEFT;
m_ptCurrentPPos.y = ((m_ptCurrPLocInGrid.y - 1) * MOVEPLAYER) + MAZETOP + ((nPlayerMove * MOVEPLAYER) / m_nPlayerSpeed);
pPlayerSprite->PaintSprite(pDC, m_ptCurrentPPos);
break;
default:
nPlayerMove = m_nPlayerSpeed;
break;
}
if (CheckMessages() == true) {
PostMessage(WM_CLOSE);
bEndGame = true;
}
nPlayerMove++;
//pDC->SelectPalette( pOldPal, false );
ReleaseDC(pDC);
return;
}
/*****************************************************************
*
* SetNewBadGuyPos
*
* FUNCTIONAL DESCRIPTION:
*
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
bool CMainPackRatWindow::SetNewBadGuyPos(int nWhichBadGuy, bool bForceRepaint) {
bool bReturn = true;
CDC *pDC = GetDC();
int nOldDir;
//bool bNewDirOK = false;
CSprite *pTempSprite = nullptr;
bool bSeePlayer = false;
bool bNearPlayer = false;
int nOldDirection;
int nDirectionToGo = 0;
int nDist1 = abs(m_aptCurrBLocInGrid[nWhichBadGuy].x - m_ptCurrPLocInGrid.x);
int nDist2 = abs(m_aptCurrBLocInGrid[nWhichBadGuy].y - m_ptCurrPLocInGrid.y);
if (bEndGame) {
ReleaseDC(pDC);
return (bReturn);
}
if (m_aptCurrBLocInGrid[nWhichBadGuy].x == m_ptCurrPLocInGrid.x) {
int i, j, nSmaller, nLarger;
bool bWall = false;
if (m_aptCurrBLocInGrid[nWhichBadGuy].y > m_ptCurrPLocInGrid.y) {
nDirectionToGo = 1;
nSmaller = m_ptCurrPLocInGrid.y;
nLarger = m_aptCurrBLocInGrid[nWhichBadGuy].y;
} else {
nDirectionToGo = 3;
nSmaller = m_aptCurrBLocInGrid[nWhichBadGuy].y;
nLarger = m_ptCurrPLocInGrid.y;
}
j = m_ptCurrPLocInGrid.x;
for (i = nSmaller; i < nLarger; i ++) {
if (m_anMazeArray[j + (i * NUMBEROFCOLS)] == WALL) {
bWall = true;
break;
}
}
if (bWall == false) {
bSeePlayer = true;
}
} else {
if (m_aptCurrBLocInGrid[nWhichBadGuy].y == m_ptCurrPLocInGrid.y) {
int i, j, nSmaller, nLarger;
bool bWall = false;
if (m_aptCurrBLocInGrid[nWhichBadGuy].x > m_ptCurrPLocInGrid.x) {
nDirectionToGo = 4;
nSmaller = m_ptCurrPLocInGrid.x;
nLarger = m_aptCurrBLocInGrid[nWhichBadGuy].x;
} else {
nDirectionToGo = 2;
nSmaller = m_aptCurrBLocInGrid[nWhichBadGuy].x;
nLarger = m_ptCurrPLocInGrid.x;
}
j = m_ptCurrPLocInGrid.y;
for (i = nSmaller; i < nLarger; i ++) {
if (m_anMazeArray[i + (j * NUMBEROFCOLS)] == WALL) {
bWall = true;
break;
}
}
if (bWall == false) {
bSeePlayer = true;
}
}
}
if ((bSeePlayer == false) && (nDist1 < 10) && (nDist2 < 10)) {
nOldDirection = m_anBDirection[nWhichBadGuy];
if (nDist1 <= nDist2) {
if (m_aptCurrBLocInGrid[nWhichBadGuy].x > m_ptCurrPLocInGrid.x) {
nDirectionToGo = 4;
if ((m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x - 1 + (m_aptCurrBLocInGrid[nWhichBadGuy].y * NUMBEROFCOLS)] != WALL) && (abs(nOldDirection - nDirectionToGo) != 2))
bNearPlayer = true;
} else {
nDirectionToGo = 2;
if ((m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x + 1 + (m_aptCurrBLocInGrid[nWhichBadGuy].y * NUMBEROFCOLS)] != WALL) && (abs(nOldDirection - nDirectionToGo) != 2))
bNearPlayer = true;
}
}
if (bNearPlayer == false) {
if (m_aptCurrBLocInGrid[nWhichBadGuy].y > m_ptCurrPLocInGrid.y) {
nDirectionToGo = 1;
if ((m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x + ((m_aptCurrBLocInGrid[nWhichBadGuy].y - 1) * NUMBEROFCOLS)] != WALL) && (abs(nOldDirection - nDirectionToGo) != 2))
bNearPlayer = true;
} else {
nDirectionToGo = 3;
if ((m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x + ((m_aptCurrBLocInGrid[nWhichBadGuy].y + 1) * NUMBEROFCOLS)] != WALL) && (abs(nOldDirection - nDirectionToGo) != 2))
bNearPlayer = true;
}
}
if (bNearPlayer == false) {
if (m_aptCurrBLocInGrid[nWhichBadGuy].x > m_ptCurrPLocInGrid.x) {
nDirectionToGo = 4;
if ((m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x - 1 + (m_aptCurrBLocInGrid[nWhichBadGuy].y * NUMBEROFCOLS)] != WALL) && (abs(nOldDirection - nDirectionToGo) != 2))
bNearPlayer = true;
} else {
nDirectionToGo = 2;
if ((m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x + 1 + (m_aptCurrBLocInGrid[nWhichBadGuy].y * NUMBEROFCOLS)] != WALL) && (abs(nOldDirection - nDirectionToGo) != 2))
bNearPlayer = true;
}
}
}
if (m_nNumberOfMoves > 100) {
m_nNumberOfMoves = 0;
if (m_nBDirection == FOLLOWRIGHTWALL)
m_nBDirection = FOLLOWLEFTWALL;
else
m_nBDirection = FOLLOWRIGHTWALL;
} else {
m_nNumberOfMoves++;
}
if (bForceRepaint)
nOldDir = 0;
else
nOldDir = m_anBDirection[nWhichBadGuy];
if (m_nBDirection == FOLLOWRIGHTWALL) {
switch (m_anBDirection[nWhichBadGuy]) {
case 0:
m_anBDirection[nWhichBadGuy] = 1;
break;
case 1: // move up
// these were != -1 instead of > -1
if (m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x + 1 + (m_aptCurrBLocInGrid[nWhichBadGuy].y * NUMBEROFCOLS)] > WALL)
m_anBDirection[nWhichBadGuy]++;
break;
case 2: // move right
if (m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x + ((m_aptCurrBLocInGrid[nWhichBadGuy].y + 1) * NUMBEROFCOLS)] > WALL)
m_anBDirection[nWhichBadGuy]++;
break;
case 3: // move down
if (m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x - 1 + (m_aptCurrBLocInGrid[nWhichBadGuy].y * NUMBEROFCOLS)] > WALL)
m_anBDirection[nWhichBadGuy]++;
break;
case 4: // move left
if (m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x + ((m_aptCurrBLocInGrid[nWhichBadGuy].y - 1) * NUMBEROFCOLS)] > WALL)
m_anBDirection[nWhichBadGuy] = 1;
break;
}
} else {
switch (m_anBDirection[nWhichBadGuy]) {
case 0:
m_anBDirection[nWhichBadGuy] = 1;
break;
case 1: // move up
if (m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x - 1 + (m_aptCurrBLocInGrid[nWhichBadGuy].y * NUMBEROFCOLS)] > WALL)
m_anBDirection[nWhichBadGuy] = 4;
break;
case 2: // move right
if (m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x + ((m_aptCurrBLocInGrid[nWhichBadGuy].y - 1) * NUMBEROFCOLS)] > WALL)
m_anBDirection[nWhichBadGuy]--;
break;
case 3: // move down
if (m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x + 1 + (m_aptCurrBLocInGrid[nWhichBadGuy].y * NUMBEROFCOLS)] > WALL)
m_anBDirection[nWhichBadGuy]--;
break;
case 4: // move left
if (m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x + ((m_aptCurrBLocInGrid[nWhichBadGuy].y + 1) * NUMBEROFCOLS)] > WALL)
m_anBDirection[nWhichBadGuy]--;
break;
}
}
if ((bSeePlayer || bNearPlayer) && (bEatTurtle == false)) {
m_anBDirection[nWhichBadGuy] = nDirectionToGo;
}
switch (m_anBDirection[nWhichBadGuy]) {
case 1: // move up
if (m_aptCurrBLocInGrid[nWhichBadGuy].y <= 0) {
m_aptCurrentBPos[nWhichBadGuy].y = MAZEBOTTOM;
m_aptCurrBLocInGrid[nWhichBadGuy].y = 26;
} else {
if (m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x + ((m_aptCurrBLocInGrid[nWhichBadGuy].y - 1) * NUMBEROFCOLS)] != WALL) {
m_aptCurrentBPos[nWhichBadGuy].x = (m_aptCurrBLocInGrid[nWhichBadGuy].x * MOVEBADGUY) + MAZELEFT;
m_aptCurrentBPos[nWhichBadGuy].y = (m_aptCurrBLocInGrid[nWhichBadGuy].y * MOVEBADGUY) + MAZETOP;
if (nOldDir != m_anBDirection[nWhichBadGuy]) {
if (bEatTurtle) {
if (bFlashTurtle)
pTempSprite = pFlashUpSprite->DuplicateSprite(pDC);
else
pTempSprite = pGoodGuyUpSprite->DuplicateSprite(pDC);
} else
pTempSprite = pBadGuyUpSprite->DuplicateSprite(pDC);
} else {
if (bEatTurtle) {
if (bFlashTurtle)
pTempSprite = pFlashUpSprite->DuplicateSprite(pDC);
else
pTempSprite = pGoodGuyUpSprite->DuplicateSprite(pDC);
abGoodTurtle[nWhichBadGuy] = true;
abChangeTurtle[nWhichBadGuy] = false;
}
}
m_aptCurrBLocInGrid[nWhichBadGuy].y--;
} else {
// change direction
m_anBDirection[nWhichBadGuy] = brand() % 4;
bReturn = false;
}
}
break;
case 2: // move right
if (m_aptCurrBLocInGrid[nWhichBadGuy].x >= 36) {
m_aptCurrentBPos[nWhichBadGuy].x = MAZELEFT;
m_aptCurrBLocInGrid[nWhichBadGuy].x = 0;
} else {
if (m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x + 1 + (m_aptCurrBLocInGrid[nWhichBadGuy].y * NUMBEROFCOLS)] != WALL) {
m_aptCurrentBPos[nWhichBadGuy].x = (m_aptCurrBLocInGrid[nWhichBadGuy].x * MOVEBADGUY) + MAZELEFT;
m_aptCurrentBPos[nWhichBadGuy].y = (m_aptCurrBLocInGrid[nWhichBadGuy].y * MOVEBADGUY) + MAZETOP;
if (nOldDir != m_anBDirection[nWhichBadGuy]) {
if (bEatTurtle) {
if (bFlashTurtle)
pTempSprite = pFlashRightSprite->DuplicateSprite(pDC);
else
pTempSprite = pGoodGuyRightSprite->DuplicateSprite(pDC);
} else
pTempSprite = pBadGuyRightSprite->DuplicateSprite(pDC);
} else {
if (bEatTurtle) {
if (bFlashTurtle)
pTempSprite = pFlashRightSprite->DuplicateSprite(pDC);
else
pTempSprite = pGoodGuyRightSprite->DuplicateSprite(pDC);
abGoodTurtle[nWhichBadGuy] = true;
abChangeTurtle[nWhichBadGuy] = false;
}
}
m_aptCurrBLocInGrid[nWhichBadGuy].x++;
} else {
// change direction
m_anBDirection[nWhichBadGuy] = brand() % 4;
bReturn = false;
}
}
break;
case 3: // move down
if (m_aptCurrBLocInGrid[nWhichBadGuy].y >= 26) {
m_aptCurrentBPos[nWhichBadGuy].y = MAZETOP;
m_aptCurrBLocInGrid[nWhichBadGuy].y = 0;
} else {
if (m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x + ((m_aptCurrBLocInGrid[nWhichBadGuy].y + 1) * NUMBEROFCOLS)] != WALL) {
m_aptCurrentBPos[nWhichBadGuy].x = (m_aptCurrBLocInGrid[nWhichBadGuy].x * MOVEBADGUY) + MAZELEFT;
m_aptCurrentBPos[nWhichBadGuy].y = (m_aptCurrBLocInGrid[nWhichBadGuy].y * MOVEBADGUY) + MAZETOP;
if (nOldDir != m_anBDirection[nWhichBadGuy]) {
if (bEatTurtle) {
if (bFlashTurtle)
pTempSprite = pFlashDownSprite->DuplicateSprite(pDC);
else
pTempSprite = pGoodGuyDownSprite->DuplicateSprite(pDC);
} else
pTempSprite = pBadGuyDownSprite->DuplicateSprite(pDC);
} else {
if (bEatTurtle) {
if (bFlashTurtle)
pTempSprite = pFlashDownSprite->DuplicateSprite(pDC);
else
pTempSprite = pGoodGuyDownSprite->DuplicateSprite(pDC);
abGoodTurtle[nWhichBadGuy] = true;
abChangeTurtle[nWhichBadGuy] = false;
}
}
m_aptCurrBLocInGrid[nWhichBadGuy].y++;
} else {
// change direction
m_anBDirection[nWhichBadGuy] = brand() % 4;
bReturn = false;
}
}
break;
case 4: // move left
if (m_aptCurrBLocInGrid[nWhichBadGuy].x <= 0) {
m_aptCurrentBPos[nWhichBadGuy].x = MAZERIGHT;
m_aptCurrBLocInGrid[nWhichBadGuy].x = 36;
} else {
if (m_anMazeArray[m_aptCurrBLocInGrid[nWhichBadGuy].x - 1 + (m_aptCurrBLocInGrid[nWhichBadGuy].y * NUMBEROFCOLS)] != WALL) {
m_aptCurrentBPos[nWhichBadGuy].x = (m_aptCurrBLocInGrid[nWhichBadGuy].x * MOVEBADGUY) + MAZELEFT;
m_aptCurrentBPos[nWhichBadGuy].y = (m_aptCurrBLocInGrid[nWhichBadGuy].y * MOVEBADGUY) + MAZETOP;
if (nOldDir != m_anBDirection[nWhichBadGuy]) {
if (bEatTurtle) {
if (bFlashTurtle)
pTempSprite = pFlashLeftSprite->DuplicateSprite(pDC);
else
pTempSprite = pGoodGuyLeftSprite->DuplicateSprite(pDC);
} else
pTempSprite = pBadGuyLeftSprite->DuplicateSprite(pDC);
} else {
if (bEatTurtle) {
if (bFlashTurtle)
pTempSprite = pFlashLeftSprite->DuplicateSprite(pDC);
else
pTempSprite = pGoodGuyLeftSprite->DuplicateSprite(pDC);
abGoodTurtle[nWhichBadGuy] = true;
abChangeTurtle[nWhichBadGuy] = false;
}
}
m_aptCurrBLocInGrid[nWhichBadGuy].x--;
} else {
// change direction
m_anBDirection[nWhichBadGuy] = brand() % 4;
bReturn = false;
}
}
break;
}
if (pTempSprite != nullptr) {
pTempSprite->LinkSprite();
pTempSprite->PaintSprite(pDC, m_aptCurrentBPos[nWhichBadGuy]);
apBadGuySprite[nWhichBadGuy]->EraseSprite(pDC);
apBadGuySprite[nWhichBadGuy]->UnlinkSprite();
delete apBadGuySprite[nWhichBadGuy];
apBadGuySprite[nWhichBadGuy] = pTempSprite;
}
apBadGuySprite[nWhichBadGuy]->PaintSprite(pDC, m_aptCurrentBPos[nWhichBadGuy]);
pTempSprite = nullptr;
if (PlayerKilled(nWhichBadGuy)) {
bKillPlayer = true;
} else {
if (nKillBadGuy != 0) {
if (pDC != nullptr)
ReleaseDC(pDC);
return bReturn;
}
}
if (CheckMessages() == true) {
PostMessage(WM_CLOSE);
bEndGame = true;
}
if (m_anBDirection[nWhichBadGuy] > 4)
m_anBDirection[nWhichBadGuy] = brand() % 4;
bChangeTurtle = false;
if (pDC != nullptr)
ReleaseDC(pDC);
return bReturn;
}
/*****************************************************************
*
* MoveBadGuys
*
* FUNCTIONAL DESCRIPTION:
*
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::MoveBadGuys() {
CDC *pDC = GetDC();
int nWhichBadGuy;
bool bTempBool1;
bool bTempBool2;
for (nWhichBadGuy = 0; nWhichBadGuy < 4; nWhichBadGuy++) {
if (bEndGame) {
ReleaseDC(pDC);
return;
}
if (anBadGuyMove[nWhichBadGuy] > m_nBadGuySpeed) {
if (bKillPlayer)
KillPlayer();
if (nKillBadGuy >= Power(2, nWhichBadGuy)) {
KillBadGuy(nKillBadGuy);
}
anBadGuyMove[nWhichBadGuy] = 1;
bTempBool1 = false;
bTempBool2 = false;
while (bTempBool1 == false) {
bTempBool1 = SetNewBadGuyPos(nWhichBadGuy, bTempBool2);
bTempBool2 = true;
}
if (bEndGame) {
ReleaseDC(pDC);
return;
}
} else {
switch (m_anBDirection[nWhichBadGuy]) {
case 1: // move up
m_aptCurrentBPos[nWhichBadGuy].x = (m_aptCurrBLocInGrid[nWhichBadGuy].x * MOVEBADGUY) + MAZELEFT;
m_aptCurrentBPos[nWhichBadGuy].y = ((m_aptCurrBLocInGrid[nWhichBadGuy].y + 1) * MOVEBADGUY) + MAZETOP - ((anBadGuyMove[nWhichBadGuy] * MOVEBADGUY) / m_nBadGuySpeed);
apBadGuySprite[nWhichBadGuy]->PaintSprite(pDC, m_aptCurrentBPos[nWhichBadGuy]);
break;
case 2: // move right
m_aptCurrentBPos[nWhichBadGuy].x = ((m_aptCurrBLocInGrid[nWhichBadGuy].x - 1) * MOVEBADGUY) + MAZELEFT + ((anBadGuyMove[nWhichBadGuy] * MOVEBADGUY) / m_nBadGuySpeed);
m_aptCurrentBPos[nWhichBadGuy].y = (m_aptCurrBLocInGrid[nWhichBadGuy].y * MOVEBADGUY) + MAZETOP;
apBadGuySprite[nWhichBadGuy]->PaintSprite(pDC, m_aptCurrentBPos[nWhichBadGuy]);
break;
case 3: // move down
m_aptCurrentBPos[nWhichBadGuy].x = (m_aptCurrBLocInGrid[nWhichBadGuy].x * MOVEBADGUY) + MAZELEFT;
m_aptCurrentBPos[nWhichBadGuy].y = ((m_aptCurrBLocInGrid[nWhichBadGuy].y - 1) * MOVEBADGUY) + MAZETOP + ((anBadGuyMove[nWhichBadGuy] * MOVEBADGUY) / m_nBadGuySpeed);
apBadGuySprite[nWhichBadGuy]->PaintSprite(pDC, m_aptCurrentBPos[nWhichBadGuy]);
break;
case 4: // move left
m_aptCurrentBPos[nWhichBadGuy].x = ((m_aptCurrBLocInGrid[nWhichBadGuy].x + 1) * MOVEBADGUY) + MAZELEFT - ((anBadGuyMove[nWhichBadGuy] * MOVEBADGUY) / m_nBadGuySpeed);
m_aptCurrentBPos[nWhichBadGuy].y = (m_aptCurrBLocInGrid[nWhichBadGuy].y * MOVEBADGUY) + MAZETOP;
apBadGuySprite[nWhichBadGuy]->PaintSprite(pDC, m_aptCurrentBPos[nWhichBadGuy]);
break;
}
anBadGuyMove[nWhichBadGuy]++;
}
}
ReleaseDC(pDC);
return;
}
/*****************************************************************
*
* CheckMessages
*
* FUNCTIONAL DESCRIPTION:
*
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
bool CMainPackRatWindow::CheckMessages() {
MSG msg;
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
if (msg.message == WM_CLOSE || msg.message == WM_QUIT) {
bEndGame = true;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (bEndGame);
}
/*****************************************************************
*
* SplashScreen
*
* FUNCTIONAL DESCRIPTION:
*
* Repaint the background artwork, together with all sprites in the
* sprite chain queue. The entire window is redrawn, rather than just
* the updated area, to ensure that the sprites end up with the correct
* background bitmaps saved for their image areas.
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::SplashScreen() {
CDC *pDC = GetDC(); // pointer to the window device context
CSprite *pSprite = nullptr;
POINT ptLive;
int nLoop1;
CSprite::RefreshBackdrop(pDC, pGamePalette);
pSprite = CSprite::GetSpriteChain();
if (pSprite != nullptr) {
while (pSprite != nullptr) {
pSprite->ClearBackground();
pSprite->RefreshSprite(pDC);
pSprite = pSprite->GetNextSprite();
}
/*
for ( nLoop1 = 0; nLoop1 < MAXLIVES; nLoop1++ ) {
if ( pLivesSprite[nLoop1] != nullptr )
pLivesSprite[nLoop1]->EraseSprite( pDC );
}
*/
}
for (nLoop1 = 0; nLoop1 < MAXLIVESPRITE; nLoop1++) {
if (pLivesSprite[nLoop1] != nullptr) {
pLivesSprite[nLoop1]->EraseSprite(pDC);
if (nLoop1 < m_nLives) {
ptLive.x = 15 + (17 * nLoop1);
ptLive.y = 25;
pLivesSprite[nLoop1]->PaintSprite(pDC, ptLive);
}
}
}
/*
for ( nLoop1 = 0; nLoop1 < m_nLives; nLoop1++ ) {
ptLive.x = 15 + ( 17 * nLoop1);
ptLive.y = 25;
if ( pLivesSprite[nLoop1] != nullptr )
pLivesSprite[nLoop1]->PaintSprite( pDC, ptLive );
}
*/
if ((bBALLOONShown) && (pBalloonSprite != nullptr)) {
pBalloonSprite->PaintSprite(pDC, ptBaloon.x, ptBaloon.y);
}
ReleaseDC(pDC); // release the window's context
}
/*****************************************************************
*
* ResetGame
*
* FUNCTIONAL DESCRIPTION:
*
* Start a new game, and reset all arrays and buttons
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* aDealtArray, apHold
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::ResetGame() {
if (m_nGameLevel >= 36)
m_nGameLevel = 36;
m_nLives = nStartingLives;
m_lScore = 0L;
nExtraLives = 4;
bEndGame = false;
SetMaze();
(*this).SetFocus();
return;
}
/*****************************************************************
*
* OnCommand
*
* FUNCTIONAL DESCRIPTION:
*
* Process the QUIT and OKAY buttons when they are clicked.
*
* This function is called when a WM_COMMAND message is issued,
* typically in order to process control related activities.
*
* FORMAL PARAMETERS:
*
* wParam identifier for the button to be processed
* lParam type of message to be processed
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
// OnCommand
//
void CALLBACK lpfnOptionCallback(CWnd * pWnd) {
// do the mini options dialog
int nOption = 0; // return from the Options dialog
//unsigned int x = IDD_MINIOPTIONS_DIALOG;
CPackRatOptDlg dlgMiniOptDlg(pWnd, pGamePalette, IDD_MINIOPTIONS_DIALOG);
bResetGame = false;
dlgMiniOptDlg.SetInitialOptions(min(pcwndPackRat->m_nGameLevel, 36), nStartingLives);
nOption = dlgMiniOptDlg.DoModal();
if (nOption != 0) {
pcwndPackRat->m_nGameLevel = nOption / 10;
nStartingLives = nOption % 10;
bResetGame = true;
}
return;
}
bool CMainPackRatWindow::OnCommand(WPARAM wParam, LPARAM lParam) {
int nMainOption = 0; // return from the Options dialog
bool bContinue = true;
if (HIWORD(lParam) == BN_CLICKED) // only want to look at button clicks
switch (wParam) {
// Option button clicked, then put up the Options dialog
case IDC_OPTION:
m_bSuspend = true;
pOptionButton->EnableWindow(false);
bResetGame = false;
UpdateWindow();
//CSound::waitWaveSounds();
sndPlaySound(nullptr, 0);
if (m_bMouseCaptured) {
ReleaseCapture();
m_bMouseCaptured = false;
while (MFC::ShowCursor(true) < 0)
;
}
if (m_lpGameStruct->bPlayingMetagame) {
CMainMenu dlgMainOpts((CWnd *)this, pGamePalette, (NO_NEWGAME | NO_OPTIONS),
lpfnOptionCallback, RULESFILE,
(m_lpGameStruct->bSoundEffectsEnabled ? RULES_WAV : nullptr), m_lpGameStruct);
nMainOption = dlgMainOpts.DoModal();
switch (nMainOption) {
case IDC_OPTIONS_QUIT:
// if Quit buttons was hit, quit
PostMessage(WM_CLOSE, 0, 0);
bFirstTimer = false;
bEndGame = true;
break;
}
} else {
CMainMenu dlgMainOpts((CWnd *)this, pGamePalette, 0,
lpfnOptionCallback, RULESFILE,
(m_lpGameStruct->bSoundEffectsEnabled ? RULES_WAV : nullptr), m_lpGameStruct);
nMainOption = dlgMainOpts.DoModal();
switch (nMainOption) {
case IDC_OPTIONS_QUIT:
// if Quit buttons was hit, quit
PostMessage(WM_CLOSE, 0, 0);
bFirstTimer = false;
bEndGame = true;
break;
case IDC_OPTIONS_NEWGAME:
// reset the game and start a new hand
bResetGame = true;
break;
case IDC_OPTIONS_RETURN:
if (m_nLives <= 0) {
bContinue = false;
}
break;
}
}
if (m_lpGameStruct->bMusicEnabled) {
if (pGameSound == nullptr) {
pGameSound = new CSound(this, GAME_THEME,
SOUND_MIDI | SOUND_LOOP | SOUND_DONT_LOOP_TO_END);
if (pGameSound != nullptr)
(*pGameSound).midiLoopPlaySegment(2310, 29400, 0, FMT_MILLISEC);
}
} // end if pGameSound
else {
if (pGameSound != nullptr) {
pGameSound->stop();
delete pGameSound;
pGameSound = nullptr;
}
}
if (bResetGame)
ResetGame();
pOptionButton->EnableWindow(true);
m_bSuspend = false;
if (bContinue == false) {
m_bSuspend = true;
return true;
}
if (bFirstTimer) {
bFirstTimer = false;
SetTimer(PACKRATTIMER, 50, nullptr);
}
break;
}
// if the Hols buttons are hit then set then accordingly
(*this).SetFocus(); // Reset focus back to the main window
return true;
}
void CMainPackRatWindow::OnMouseMove(unsigned int nFlags, CPoint point) {
if (m_bMouseCaptured) {
CRect rMazeRect(15, 23, 624, 464);
int dx, dy;
if (rMazeRect.PtInRect(point)) {
if (bMouseHidden == false) {
while (MFC::ShowCursor(false) >= 0)
;
bMouseHidden = true;
}
} else {
if (bMouseHidden) {
bMouseHidden = false;
while (MFC::ShowCursor(true) < 0)
;
}
}
if ((ptLastMouseCoord.x == -1) && (ptLastMouseCoord.y == -1)) {
ptLastMouseCoord.x = point.x;
ptLastMouseCoord.y = point.y;
} else {
dx = ptLastMouseCoord.x - point.x;
dy = ptLastMouseCoord.y - point.y;
if (abs(dx) > abs(dy)) { // move left/right
if (dx > 10) { // move left
m_nNextDir = 1;
} else {
if (abs(dx) > 10) { // move right
m_nNextDir = 2;
}
}
} else {
if (dy > 10) { // move up
m_nNextDir = 3;
} else {
if (abs(dy) > 10) { // move down
m_nNextDir = 4;
}
}
}
}
}
CWnd::OnMouseMove(nFlags, point);
}
void CMainPackRatWindow::OnLButtonDown(unsigned int nFlags, CPoint point) {
if (m_lpGameStruct->bPlayingMetagame == false) {
if ((rNewGame.PtInRect(point)) && (m_bMouseCaptured == false)) {
/*
SetCapture();
m_bMouseCaptured = true;
bInNewGameRect = true;
*/
ResetGame();
}
}
CWnd::OnLButtonDown(nFlags, point);
}
void CMainPackRatWindow::OnLButtonUp(unsigned int nFlags, CPoint point) {
/*
if ( m_bMouseCaptured ) {
m_bMouseCaptured = false;
ReleaseCapture();
if (bInNewGameRect ) {
bInNewGameRect = false;
ResetGame();
}
}
*/
CWnd::OnLButtonUp(nFlags, point);
}
void CMainPackRatWindow::OnRButtonDown(unsigned int nFlags, CPoint point) {
if (m_bMouseCaptured) {
ReleaseCapture();
m_bMouseCaptured = false;
while (MFC::ShowCursor(true) < 0)
;
} else {
/*
this was the old way
*/
SetCapture();
m_bMouseCaptured = true;
while (MFC::ShowCursor(false) < 0)
;
}
CWnd::OnRButtonDown(nFlags, point);
}
void CMainPackRatWindow::OnRButtonUp(unsigned int nFlags, CPoint point) {
/*
if ( m_bMouseCaptured ) {
m_bMouseCaptured = false;
ReleaseCapture();
while ( MFC::ShowCursor( true ) < 0 )
;
}
*/
CWnd::OnRButtonUp(nFlags, point);
}
void CMainPackRatWindow::OnKeyDown(unsigned int nChar, unsigned int nRepCnt, unsigned int nFlags) {
CRules dlgRules((CWnd *)this, RULESFILE, pGamePalette,
(m_lpGameStruct->bSoundEffectsEnabled ? RULES_WAV : nullptr));
switch (nChar) {
case VK_F1:
if (bInLoop) {
bool bTemp = m_bSuspend;
m_bSuspend = true;
sndPlaySound(nullptr, SND_ASYNC);
if (m_bMouseCaptured) {
m_bMouseCaptured = false;
ReleaseCapture();
while (MFC::ShowCursor(true) < 0)
;
}
pOptionButton->EnableWindow(false);
UpdateWindow();
dlgRules.DoModal(); // invoke the help dialog box
pOptionButton->EnableWindow(true);
m_bSuspend = bTemp;
}
break;
case VK_F2:
if (bInLoop) {
if (m_bMouseCaptured) {
m_bMouseCaptured = false;
ReleaseCapture();
while (MFC::ShowCursor(true) < 0)
;
}
SendMessage(WM_COMMAND, IDC_OPTION, BN_CLICKED);
}
break;
case VK_H:
case VK_NUMPAD4:
case VK_LEFT:
m_nNextDir = 1;
break;
case VK_L:
case VK_NUMPAD6:
case VK_RIGHT:
m_nNextDir = 2;
break;
case VK_K:
case VK_NUMPAD8:
case VK_UP:
m_nNextDir = 3;
break;
case VK_J:
case VK_NUMPAD2:
case VK_DOWN:
m_nNextDir = 4;
break;
case VK_SPACE:
case VK_RETURN:
case VK_ESCAPE:
if (m_bMouseCaptured) {
m_bMouseCaptured = false;
ReleaseCapture();
while (MFC::ShowCursor(true) < 0)
;
}
break;
default:
CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
break;
}
(*this).SetFocus();
return;
}
void CMainPackRatWindow::OnTimer(uintptr nWhichTimer) {
if (nWhichTimer == PACKRATTIMER) {
KillTimer(PACKRATTIMER);
bEndGame = false;
bInLoop = true;
MainLoop();
bInLoop = false;
bFirstTimer = true;
return;
}
return;
}
/*****************************************************************
*
* MainLoop
*
* FUNCTIONAL DESCRIPTION:
*
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::MainLoop() {
int nLoop1;
int nLoop2;
CDC *pDC = nullptr;
POINT ptLive;
bool bRedrawLives = false;
(*this).SetFocus();
while (bEndGame == false) {
if (m_bSuspend == false) {
if ((nEatTurtle <= (EATTURTLE - (4 * m_nGameLevel))) && (bEatTurtle)) {
bEatTurtle = true;
nEatTurtle++;
if (nEatTurtle > (EATTURTLE - (4 * m_nGameLevel) - 40))
bFlashTurtle = true;
else
bFlashTurtle = false;
} else {
if (nEatTurtle > 0) {
nNumOfBGKilled = 0;
bChangeTurtle = true;
bEatTurtle = false;
nEatTurtle = 0;
m_nBadGuySpeed = nOldTSpeed;
}
}
for (nLoop1 = 0; nLoop1 < 4; nLoop1++) {
if ((anReleaseTurtleCount[nLoop1] <= RELEASETURTLECOUNT) && (anReleaseTurtleCount[nLoop1] > 0)) {
if (bStart)
anReleaseTurtleCount[nLoop1]++;
} else {
if (anReleaseTurtleCount[nLoop1] > RELEASETURTLECOUNT) {
anReleaseTurtleCount[nLoop1] = 0;
switch (nLoop1) {
case 0:
m_aptCurrBLocInGrid[0].x = 1;
m_aptCurrBLocInGrid[0].y = 4;
break;
case 1:
m_aptCurrBLocInGrid[1].x = 35;
m_aptCurrBLocInGrid[1].y = 4;
break;
case 2:
m_aptCurrBLocInGrid[2].x = 1;
m_aptCurrBLocInGrid[2].y = 22;
break;
case 3:
m_aptCurrBLocInGrid[3].x = 35;
m_aptCurrBLocInGrid[3].y = 22;
break;
}
}
}
}
if (bEndGame)
return;
if ((m_nPDirection != 0) || (m_nNextDir != 0) || (bUseJoyStick)) {
bStart = true;
MovePlayer();
}
if ((m_lpGameStruct->bPlayingMetagame) && (m_lScore > (350 * m_nGameLevel))) {
if (bBALLOONShown == false) {
pDC = GetDC();
pBalloonSprite->PaintSprite(pDC, ptBaloon.x, ptBaloon.y);
ReleaseDC(pDC);
bBALLOONShown = true;
}
}
if ((m_lpGameStruct->bPlayingMetagame == false) && (m_lScore > 40000)) {
if (nExtraLives == 1)
bRedrawLives = true;
}
if ((m_lpGameStruct->bPlayingMetagame == false) && (m_lScore > 20000)) {
if (nExtraLives == 2)
bRedrawLives = true;
}
if ((m_lpGameStruct->bPlayingMetagame == false) && (m_lScore > 10000)) {
if (nExtraLives == 3)
bRedrawLives = true;
}
if ((m_lpGameStruct->bPlayingMetagame == false) && (m_lScore > 5000)) {
if (nExtraLives == 4)
bRedrawLives = true;
}
if (bRedrawLives) {
bRedrawLives = false;
if (m_nLives < MAXLIVES) {
if (m_lpGameStruct->bSoundEffectsEnabled) {
/*
CSound *pSound = nullptr;
CSound::StopWaveSounds();
sndPlaySound( nullptr, SND_ASYNC);
pSound = new CSound((CWnd *)this, ".\\SOUND\\NEWLIFE.WAV", SOUND_WAVE | SOUND_ASYNCH | SOUND_AUTODELETE );
pSound->play();
*/
sndPlaySound(nullptr, SND_ASYNC);
sndPlaySound(NEWLIFE_WAV, SND_ASYNC);
}
nExtraLives--;
m_nLives++;
pDC = GetDC();
/*
for ( nLoop2 = 0; nLoop2 < MAXLIVES; nLoop2++ )
pLivesSprite[nLoop2]->EraseSprite( pDC );
for ( nLoop2 = 0; nLoop2 < m_nLives; nLoop2++ ) {
ptLive.x = 15 + ( 17 * nLoop2);
ptLive.y = 25;
pLivesSprite[nLoop2]->PaintSprite( pDC, ptLive );
}
*/
for (nLoop2 = 0; nLoop2 < MAXLIVESPRITE; nLoop2++) {
if (pLivesSprite[nLoop2] != nullptr) {
pLivesSprite[nLoop2]->EraseSprite(pDC);
if (nLoop2 < m_nLives) {
ptLive.x = 15 + (17 * nLoop2);
ptLive.y = 25;
pLivesSprite[nLoop2]->PaintSprite(pDC, ptLive);
}
}
}
ReleaseDC(pDC);
}
}
if (bEndGame)
return;
if (nPaintObject == 1) {
PaintObjects();
} else {
if (nPaintObject == 2) {
PaintObjects(2);
}
}
if (bEndGame)
return;
if (m_nGameLevel == 45) {
if (bEndGame)
return;
MoveBadGuys();
if (bEndGame)
return;
MoveBadGuys();
if (bEndGame)
return;
} else {
if (bEndGame)
return;
MoveBadGuys();
if (bEndGame)
return;
}
}
if (CheckMessages() == true) {
PostMessage(WM_CLOSE);
bEndGame = true;
return;
}
}
return;
}
/*****************************************************************
*
* OnXXXXXX
*
* FUNCTIONAL DESCRIPTION:
*
* These functions are called when ever the corresponding WM_
* event message is generated for the mouse.
*
* (Add game-specific processing)
*
* FORMAL PARAMETERS:
*
* [Show arguments]
*
* IMPLICIT INPUT PARAMETERS:
*
* [External data read]
*
* IMPLICIT OUTPUT PARAMETERS:
*
* [External data modified]
*
* RETURN VALUE:
*
* [Discuss return value]
*
****************************************************************/
bool CMainPackRatWindow::OnEraseBkgnd(CDC *pDC) {
// eat this
return true;
}
void CMainPackRatWindow::OnActivate(unsigned int nState, CWnd *pWndOther, bool bMinimized) {
if (!bMinimized)
switch (nState) {
case WA_INACTIVE:
m_bSuspend = true;
break;
case WA_ACTIVE:
case WA_CLICKACTIVE:
m_bSuspend = false;
InvalidateRect(nullptr, false);
break;
}
return;
}
/*****************************************************************
*
* OnClose
*
* FUNCTIONAL DESCRIPTION:
*
* This function is called when a Close event is generated. For
* this sample application we need only kill our event timer;
* The ExitInstance will handle releasing resources.
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::OnClose() {
CDC *pDC = GetDC();
CRect rctFillRect(0, 0, 640, 480);
CBrush Brush(RGB(0, 0, 0));
pDC->FillRect(&rctFillRect, &Brush);
ReleaseDC(pDC);
ReleaseResources();
if (bUseJoyStick)
joyReleaseCapture(JOYSTICKID1);
if (m_bMouseCaptured) {
ReleaseCapture();
m_bMouseCaptured = false;
}
while (MFC::ShowCursor(true) < 0)
;
CFrameWnd ::OnClose();
}
/*****************************************************************
*
* OnDestroy
*
* FUNCTIONAL DESCRIPTION:
*
* This function is called when after the window has been destroyed.
* For poker, we post a message bak to the calling app to tell it
* that the user has quit the game, and therefore the app can unload
* this DLLL
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::OnDestroy() {
// send a message to the calling app to tell it the user has quit the game
m_lpGameStruct->lScore = m_lScore;
MFC::PostMessage(m_hCallAppWnd, WM_PARENTNOTIFY, WM_DESTROY, (LPARAM)m_lpGameStruct);
m_lpGameStruct = nullptr;
CFrameWnd::OnDestroy();
}
/*****************************************************************
*
* ReleaseResources
*
* FUNCTIONAL DESCRIPTION:
*
* Release all resources that were created and retained during the
* course of the game. This includes sprites in the sprite chain,
* the game color palette, and button controls.
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::ReleaseResources() {
int nLoop1;
delete pBalloonSprite;
pBalloonSprite = nullptr;
delete pGameSound; // delete the game theme song
pGameSound = nullptr;
CSound::clearSounds();
CSprite::FlushSpriteChain();
if (pSSpaceBMP != nullptr) {
pSSpaceBMP->DeleteObject();
delete pSSpaceBMP;
pSSpaceBMP = nullptr;
}
if (pLSpaceBMP != nullptr) {
pLSpaceBMP->DeleteObject();
delete pLSpaceBMP;
pLSpaceBMP = nullptr;
}
delete pPlayerRightSprite;
delete pPlayerLeftSprite;
delete pPlayerUpSprite;
delete pPlayerDownSprite;
pPlayerRightSprite = nullptr;
pPlayerLeftSprite = nullptr;
pPlayerUpSprite = nullptr;
pPlayerDownSprite = nullptr;
delete pBadGuyUpSprite;
delete pBadGuyDownSprite;
delete pBadGuyLeftSprite;
delete pBadGuyRightSprite;
pBadGuyUpSprite = nullptr;
pBadGuyDownSprite = nullptr;
pBadGuyLeftSprite = nullptr;
pBadGuyRightSprite = nullptr;
delete pGoodGuyUpSprite;
delete pGoodGuyDownSprite;
delete pGoodGuyLeftSprite;
delete pGoodGuyRightSprite;
pGoodGuyUpSprite = nullptr;
pGoodGuyDownSprite = nullptr;
pGoodGuyLeftSprite = nullptr;
pGoodGuyRightSprite = nullptr;
delete pFlashUpSprite;
delete pFlashDownSprite;
delete pFlashLeftSprite;
delete pFlashRightSprite;
pFlashUpSprite = nullptr;
pFlashDownSprite = nullptr;
pFlashLeftSprite = nullptr;
pFlashRightSprite = nullptr;
for (nLoop1 = 0; nLoop1 < MAXLIVESPRITE; nLoop1++) {
delete pLivesSprite[nLoop1];
pLivesSprite[nLoop1] = nullptr;
}
delete pLiveSprite;
pLiveSprite = nullptr;
CSprite::ClearBackdrop();
if (pGamePalette) {
(*pGamePalette).DeleteObject(); // release the game color palette
delete pGamePalette;
pGamePalette = nullptr;
}
delete pOptionButton;
pOptionButton = nullptr;
}
/*****************************************************************
*
* Power
*
* FUNCTIONAL DESCRIPTION:
*
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
int CMainPackRatWindow::Power(int nBase, int nPower) {
int nTemp1 = 1;
int nTemp2 = 1;
int nReturn = 1;
int nLoop = 0;
for (nLoop = 0; nLoop < nPower; nLoop++) {
nTemp1 = nTemp2;
nTemp2 = nTemp1 * nBase;
}
nReturn = nTemp2;
return (nReturn);
}
/*****************************************************************
*
* FlushInputEvents
*
* FUNCTIONAL DESCRIPTION:
*
* Remove all keyboard and mouse related events from the message
* so that they will not be sent to us for processing; i.e. this
* flushes keyboard type ahead and extra mouse clicks and movement.
*
* FORMAL PARAMETERS:
*
* n/a
*
* IMPLICIT INPUT PARAMETERS:
*
* n/a
*
* IMPLICIT OUTPUT PARAMETERS:
*
* n/a
*
* RETURN VALUE:
*
* n/a
*
****************************************************************/
void CMainPackRatWindow::FlushInputEvents() {
MSG msg;
while (true) { // find and remove all keyboard events
if (!PeekMessage(&msg, nullptr, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE))
break;
}
while (true) { // find and remove all mouse events
if (!PeekMessage(&msg, nullptr, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE))
break;
}
}
//////////// Additional Sound Notify routines //////////////
LRESULT CMainPackRatWindow::OnMCINotify(WPARAM wParam, LPARAM lParam) {
CSound *pSound;
pSound = CSound::OnMCIStopped(wParam, lParam);
if (pSound != nullptr)
OnSoundNotify(pSound);
return 0;
}
LRESULT CMainPackRatWindow::OnMMIONotify(WPARAM wParam, LPARAM lParam) {
CSound *pSound;
pSound = CSound::OnMMIOStopped(wParam, lParam);
if (pSound != nullptr)
OnSoundNotify(pSound);
return 0;
}
void CMainPackRatWindow::OnSoundNotify(CSound *pSound) {
//
// Add your code to process explicit notification of a sound "done" event here.
// pSound is a pointer to a CSound object for which you requested SOUND_NOTIFY.
//
}
void CMainPackRatWindow::OnSysKeyDown(unsigned int nChar, unsigned int nRepCnt, unsigned int nFlags) {
switch (nChar) {
// User has hit ALT_F4 so close down this App
//
case VK_F4:
PostMessage(WM_CLOSE);
break;
default:
CFrameWnd::OnSysKeyDown(nChar, nRepCnt, nFlags);
break;
}
}
// CMainPackRatWindow message map:
// Associate messages with member functions.
//
BEGIN_MESSAGE_MAP(CMainPackRatWindow, CFrameWnd)
//{{AFX_MSG_MAP( CMainPackRatWindow )
ON_WM_PAINT()
ON_WM_RBUTTONDOWN()
ON_WM_RBUTTONUP()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_CLOSE()
ON_WM_DESTROY()
ON_WM_TIMER()
ON_WM_ERASEBKGND()
ON_WM_KEYDOWN()
ON_WM_SYSKEYDOWN()
ON_WM_ACTIVATE()
ON_MESSAGE(MM_MCINOTIFY, CMainPackRatWindow::OnMCINotify)
ON_MESSAGE(MM_WOM_DONE, CMainPackRatWindow::OnMMIONotify)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
} // namespace Packrat
} // namespace HodjNPodj
} // namespace Bagel