Files
scummvm-cursorfix/engines/alg/logic/game_johnnyrock.h
2026-02-02 04:50:13 +01:00

286 lines
9.6 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/>.
*
*/
#ifndef ALG_GAME_JOHNNYROCK_H
#define ALG_GAME_JOHNNYROCK_H
#include "common/hashmap.h"
#include "common/rect.h"
#include "gui/debugger.h"
#include "alg/game.h"
#include "alg/scene.h"
namespace Alg {
typedef Common::Functor1Mem<Scene *, void, GameJohnnyRock> JRScriptFunctionScene;
typedef Common::Functor1Mem<Rect *, void, GameJohnnyRock> JRScriptFunctionRect;
typedef Common::Functor1Mem<Common::Point *, void, GameJohnnyRock> JRScriptFunctionPoint;
typedef Common::HashMap<Common::String, JRScriptFunctionScene *> JRScriptFunctionSceneMap;
typedef Common::HashMap<Common::String, JRScriptFunctionRect *> JRScriptFunctionRectMap;
typedef Common::HashMap<Common::String, JRScriptFunctionPoint *> JRScriptFunctionPointMap;
class GameJohnnyRock : public Game {
enum SceneFuncType {
PREOP = 1,
SHOWMSG = 2,
INSOP = 3,
WEPDWN = 4,
SCNSCR = 5,
NXTFRM = 6,
NXTSCN = 7
};
public:
GameJohnnyRock(AlgEngine *vm, const AlgGameDescription *gd);
~GameJohnnyRock() override;
Common::Error run() override;
void debugWarpTo(int val);
private:
void init() override;
void registerScriptFunctions();
void verifyScriptFunctions();
JRScriptFunctionPoint getScriptFunctionZonePtrFb(Common::String name);
JRScriptFunctionRect getScriptFunctionRectHit(Common::String name);
JRScriptFunctionScene getScriptFunctionScene(SceneFuncType type, Common::String name);
void callScriptFunctionZonePtrFb(Common::String name, Common::Point *point);
void callScriptFunctionRectHit(Common::String name, Rect *rect);
void callScriptFunctionScene(SceneFuncType type, Common::String name, Scene *scene);
JRScriptFunctionPointMap _zonePtrFb;
JRScriptFunctionRectMap _rectHitFuncs;
JRScriptFunctionSceneMap _scenePreOps;
JRScriptFunctionSceneMap _sceneShowMsg;
JRScriptFunctionSceneMap _sceneInsOps;
JRScriptFunctionSceneMap _sceneWepDwn;
JRScriptFunctionSceneMap _sceneScnScr;
JRScriptFunctionSceneMap _sceneNxtFrm;
JRScriptFunctionSceneMap _sceneNxtScn;
// images
Common::Array<Graphics::Surface *> *_difficultyIcon;
Graphics::Surface *_levelIcon;
Graphics::Surface *_bulletholeIcon;
// constants
const int16 _randomRooftop[6] = {2, -4, 0x104, 0x1E, 0x100, 0x102};
const int16 _randomTheater[9] = {5, -5, 0x111, 0x1E, 0x107, 0x109, 0x10B, 0x10D, 0x10F};
const int16 _randomAlley[10] = {6, -4, 0, 0x1E, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D};
const int16 _randomFuneralMR[10] = {6, -5, 0x12B, 0x1E, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129};
const int16 _randomBookMR[8] = {4, 5, 0, 0x1E, 0x12E, 0x130, 0x132, 0x134};
const int16 _randomStairway[8] = {4, -3, 0, 0x1E, 0x139, 0x13B, 0x13D, 0x13F};
const int16 _randomHall[8] = {4, -5, 0, 0x1E, 0x141, 0x143, 0x145, 0x146};
const int16 _randomWindows[10] = {6, -3, 0, 0x1E, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E};
const int16 _randomCar[5] = {1, 1, 0, 0, 0x0FE};
const int16 _randomHall1[5] = {1, 1, 0, 0x1E, 0x148};
const int16 _randomElevator[5] = {1, 1, 0, 0, 0x14C};
const int16 _randomBaby[5] = {1, 1, 0, 0, 0x160};
const int16 *_randomPlaces[6] = {_randomWindows, _randomStairway, _randomCar, _randomHall1, _randomElevator, _randomBaby};
const int16 *_randomPlacesMR[8] = {_randomBookMR, _randomFuneralMR, _randomAlley, _randomTheater, _randomHall, _randomWindows, _randomHall1, _randomRooftop};
const int16 _officeTable[5] = {0xA7, 0x9F, 0x9E, 0x0A0, 0x0AD};
const uint16 _diffPos[4][2] = {{0, 0}, {0xCD, 0x35}, {0xD2, 0x53}, {0xD2, 0x6E}};
// gamestate
uint16 _totalDies = 0;
int16 _gameMoney = 0;
int16 _oldGameMoney = 0;
uint16 _ammoAgain = 0;
uint16 _mapTimeout = 0;
uint8 _luckyNumber = 0;
uint8 _thisMap = 0;
uint16 _clues = 0;
uint16 _placeBits = 0;
uint8 _randomCount = 0;
uint16 _doctorBits = 0;
uint16 _undertakerBits = 0;
uint16 _thisClue = 0;
uint8 _gotThisNumber = 0;
uint8 _casino = 0;
uint8 _poolHall = 0;
uint8 _warehouse = 0;
uint8 _garage = 0;
uint8 _office = 0;
uint8 _casinoType = 0;
uint8 _poolHallType = 0;
uint8 _warehouseType = 0;
uint8 _garageType = 0;
uint8 _mansion = 0;
uint8 _inWarehouse = 0;
uint8 _inOffice = 0;
uint16 _gotTo = 0;
uint8 _whoDidIt = 0;
uint8 _hadGoToMansion = 0;
uint16 _officeCount = 0;
uint16 _randomPlaceBits = 0;
uint8 _maxRandomCount = 0;
uint16 _gotoAfterRandom = 0;
uint16 _repeatRandomPlace = 0;
uint16 _maxRepeat = 0;
uint16 _gotThisClue = 0;
uint16 _didContinue = 0;
uint16 _thisGameTime = 0;
uint8 _thisDifficulty = 0;
uint8 _clueTable[4];
uint8 _combinations[4];
uint16 _entranceIndex[20];
const int16 *_randomScenes = nullptr;
uint8 _randomScenesSavestateIndex = 0;
uint16 _randomScenesIndex[10];
Common::String _moneyScene = "";
uint8 _mgunCnt = 0;
uint32 _machGunTimer = 0;
// base functions
bool fired(Common::Point *point);
void newGame();
void resetParams();
void outShots();
void doMenu();
void updateStat();
void displayScore();
void showDifficulty(uint8 newDifficulty, bool updateCursor);
void changeDifficulty(uint8 newDifficulty);
void updateCursor();
void updateMouse();
void moveMouse();
bool weaponDown();
bool saveState();
bool loadState();
void doMoneySound();
// misc game functions
Common::String numToScene(int n);
uint16 sceneToNum(Common::String sceneName);
void defaultBullethole(Common::Point *point);
uint16 pickBits(uint16 *bits, uint8 max);
uint16 pickRandomPlace(uint8 place);
void showCombination();
void shotClue(uint8 clue);
void shotCombination(uint8 combination, bool combinationB);
void shotLuckyNumber(uint8 number);
// Script functions: Zone
void zoneBullethole(Common::Point *point);
// Script functions: RectHit
void rectShotMenu(Rect *rect);
void rectSave(Rect *rect);
void rectLoad(Rect *rect);
void rectContinue(Rect *rect);
void rectStart(Rect *rect);
void rectKillInnocent(Rect *rect);
void rectSelectCasino(Rect *rect);
void rectSelectPoolhall(Rect *rect);
void rectSelectWarehouse(Rect *rect);
void rectSelectGarage(Rect *rect);
void rectSelectMansion(Rect *rect);
void rectSelectAmmo(Rect *rect);
void rectSelectOffice(Rect *rect);
void rectShotManBust(Rect *rect);
void rectShotWomanBust(Rect *rect);
void rectShotBlueVase(Rect *rect);
void rectShotCat(Rect *rect);
void rectShotIndian(Rect *rect);
void rectShotPlate(Rect *rect);
void rectShotBlueDressPic(Rect *rect);
void rectShotModernPic(Rect *rect);
void rectShotMonaLisa(Rect *rect);
void rectShotGWashington(Rect *rect);
void rectShotBoyInRedPic(Rect *rect);
void rectShotCoatOfArms(Rect *rect);
void rectShotCombinationA0(Rect *rect);
void rectShotCombinationA1(Rect *rect);
void rectShotCombinationA2(Rect *rect);
void rectShotCombinationA3(Rect *rect);
void rectShotCombinationA4(Rect *rect);
void rectShotCombinationA5(Rect *rect);
void rectShotCombinationB0(Rect *rect);
void rectShotCombinationB1(Rect *rect);
void rectShotCombinationB2(Rect *rect);
void rectShotCombinationB3(Rect *rect);
void rectShotCombinationB4(Rect *rect);
void rectShotCombinationB5(Rect *rect);
void rectShotLuckyNumber0(Rect *rect);
void rectShotLuckyNumber1(Rect *rect);
void rectShotLuckyNumber2(Rect *rect);
void rectShotLuckyNumber3(Rect *rect);
void rectShotLuckyNumber4(Rect *rect);
void rectShotLuckyNumber5(Rect *rect);
// Script functions: Scene InsOps
void sceneIsoShootpast(Scene *scene);
void sceneIsoShootpastPause(Scene *scene);
void sceneIsoGotoCasino(Scene *scene);
void sceneIsoGotoPoolhall(Scene *scene);
void sceneIsoGotoWarehouse(Scene *scene);
void sceneIsoInWarehouse2(Scene *scene);
void sceneIsoInwarehouse3(Scene *scene);
void sceneIsoGotoGarage(Scene *scene);
void sceneIsoGotoMansion(Scene *scene);
void sceneIsoInMansion1(Scene *scene);
// Script functions: Scene NxtScn
void sceneNxtscnDied(Scene *scene);
void sceneNxtscnBombDead(Scene *scene);
void sceneNxtscnPickUndertaker(Scene *scene);
void sceneNxtscnCallAttract(Scene *scene);
void sceneNxtscnPickLuckyNumber(Scene *scene);
void sceneNxtscnPickMap(Scene *scene);
void sceneNxtscnPickClue(Scene *scene);
void sceneNxtscnMapTimeout(Scene *scene);
void sceneNxtscnEnterCasino(Scene *scene);
void sceneNxtscnCasinoWhat(Scene *scene);
void sceneNxtscnEnterPoolhall(Scene *scene);
void sceneNxtscnPoolhallClue(Scene *scene);
void sceneNxtscnEnterWarehouse(Scene *scene);
void sceneNxtscnWarehouseClue(Scene *scene);
void sceneNxtscnEnterGarage(Scene *scene);
void sceneNxtscnGarageClue(Scene *scene);
void sceneNxtscnEnterMansion(Scene *scene);
void sceneNxtscnGiveClue(Scene *scene);
void sceneNxtscnPickFlowerMan(Scene *scene);
void sceneNxtscnRandomScene(Scene *scene);
void sceneNxtscnEndRandScene(Scene *scene);
void sceneNxtscnKillInnocent(Scene *scene);
// Script functions: Scene WepDwn
void sceneDefaultWepdwn(Scene *scene);
};
class DebuggerJohnnyRock : public GUI::Debugger {
public:
DebuggerJohnnyRock(GameJohnnyRock *game);
bool cmdWarpTo(int argc, const char **argv);
bool cmdDumpLib(int argc, const char **argv);
private:
GameJohnnyRock *_game;
};
} // End of namespace Alg
#endif