Files
scummvm-cursorfix/engines/agi/preagi/winnie.h
2026-02-02 04:50:13 +01:00

376 lines
12 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 AGI_PREAGI_WINNIE_H
#define AGI_PREAGI_WINNIE_H
namespace Agi {
#define WTP_SAVEGAME_VERSION 1
#define IDI_XOR_KEY 0x80
// strings
#define IDS_WTP_ROOM_DOS "rooms/rm.%02d"
#define IDS_WTP_ROOM_AMIGA "rooms/room.%d"
#define IDS_WTP_ROOM_C64 "room%02d"
#define IDS_WTP_ROOM_APPLE "room%d.obj"
#define IDS_WTP_ROOM_COCO "room%02d"
#define IDS_WTP_OBJ_DOS "obj.%02d"
#define IDS_WTP_OBJ_AMIGA "objects/object.%d"
#define IDS_WTP_OBJ_C64 "object%02d"
#define IDS_WTP_OBJ_APPLE "object%d.obj"
#define IDS_WTP_OBJ_COCO "obj%02d"
#define IDS_WTP_SND_DOS "snd.%02d"
#define IDS_WTP_SND_AMIGA "Sounds"
#define IDS_WTP_SND_C64 "sound.obj"
#define IDS_WTP_SND_APPLE "sound.obj"
#define IDS_WTP_FILE_LOGO "logo"
#define IDS_WTP_FILE_TITLE "title"
#define IDS_WTP_FILE_SAVEGAME "savegame"
#define IDS_WTP_FILE_RND "rnd"
#define IDS_WTP_DISK_ERROR "There is a problem with your disk drive.Please make sure your Winnie-the-Pooh disk is in the drive correctly."
#define IDS_WTP_INTRO_0 " PRESENT"
#define IDS_WTP_INTRO_1 " TM designates trademark of\n Sierra On-Line, Inc.\n (c) 1985 Walt Disney Productions"
#define IDS_WTP_HELP_0 "The <SPACE BAR> moves the pointer. Press <RETURN> when it is by the choice you want. Press the <Backspace> key to see what you just finished reading."
#define IDS_WTP_HELP_1 "Press <C> to see what you are carrying. <Ctrl-S> turns the sound off and on. <ESC> takes you to the playroom (in caseyou get lost or want to save the game)."
#define IDS_WTP_GAME_OVER_0 "Congratulations!! You did it! You returned everything that was lost. Now,Christopher Robin invites you to a Hero party."
#define IDS_WTP_GAME_OVER_1 "The good news is: YOU are the Hero!! The bad news is: you have to find the party by yourself. Good luck!"
#define IDS_WTP_OWL_0 "\"For example, that object you are carrying now is interesting. I know I've seen it before. Hmmm. Let me think about this . . .\""
#define IDS_WTP_OWL_1 "\"You know, this object here beside me isfamiliar. I'm sure I could give you some sort of clue about it. Let me see. . .\""
#define IDS_WTP_WIND_0 "Oh, no! The Blustery Wind begins to howl. It has returned, and mixed up all the objects in the Wood."
#define IDS_WTP_WIND_1 "But don't worry. Everyone still has theobjects you returned to them.\n\n (Today must be Winds-day!)"
#define IDS_WTP_TIGGER "\"Hallooooo, there!!!! It's ME, Tigger! Let's BOUNCE!\""
#define IDS_WTP_MIST "Oh, look out! The mysterious mist is coming in. It gets so thick that you can't see through it. Just keep walkingand it will soon clear up."
#define IDS_WTP_SONG_0 "Winnie-the-Pooh, Winnie-the-Pooh, Tubby little cubby all stuffed with fluff, He's Winnie-the-Pooh, Winnie-the-Pooh, Willy, nilly, silly, old bear."
#define IDS_WTP_SONG_1 "Deep in the Hundred Acre Wood, Where Christopher Robin plays, You will find the enchanted neighborhoodof Christopher's childhood days."
#define IDS_WTP_SONG_2 "A donkey named Eeyore is his friend, and Kanga and little Roo. There's Rabbit and Piglet and there's Owl But most of all Winnie-the-Pooh!"
#define IDS_WTP_NSEW "North South East West"
#define IDS_WTP_TAKE "Take"
#define IDS_WTP_DROP "Drop"
#define IDS_WTP_CANT_GO "\nSorry, but you can't go that way."
#define IDS_WTP_CANT_TAKE "You can't take it. You can only carry one object at a time."
#define IDS_WTP_CANT_DROP "You can't drop it. Another object is already here."
#define IDS_WTP_WRONG_PLACE "\nOk, but it doesn't belong here."
#define IDS_WTP_OK "\nOk."
#define IDS_WTP_INVENTORY_0 "You are carrying nothing."
#define IDS_WTP_INVENTORY_1 "Number of objects still missing: %d"
// COMMODORE 64 version strings
#define IDS_WTP_FILE_SAVEGAME_C64 "saved game"
#define IDS_WTP_DISK_ERROR_C64 "There is a problem with your disk drive.Please make sure your disk is in the drive correctly."
#define IDS_WTP_HELP_0_C64 "The <SPACE BAR> moves the pointer. Press <RETURN> when it is by the choice you want. <F1> brings back what you have already read."
#define IDS_WTP_HELP_1_C64 "<F3> takes you back to the playroom (if you get lost, or want to save the game).<F5> turns the sound off and on. <F7> shows what you're carrying."
#define IDS_WTP_WRONG_PLACE_C64 "\nOk, but this is not the right place."
// Amiga strings
// original strings from the executable and edited versions for our four-line interface
#define IDS_WTP_AMIGA_HELP_0 "Use the mouse to select your choice from\nthe bottom of the screen or the menu.\n\nTo use the keyboard instead of the\nmouse, press the NUMBER or first LETTER\nof what you want."
#define IDS_WTP_AMIGA_HELP_1 "From the keyboard you can also press:\n 'l' to look at the scene you're in.\n 'o' to look at an object in the room.\n 'c' to see what you're carrying and\n how you're doing.\n CTRL-S to turn the sound on or off."
#define IDS_WTP_AMIGA_HELP_EDITED_0 "Use the mouse to select your choice fromthe bottom of the screen or the menu.\nTo use the keyboard instead of the\nmouse, press the NUMBER or first LETTER."
#define IDS_WTP_AMIGA_HELP_EDITED_1 "From the keyboard you can also press:\n <C> to see what you're carrying and\n how you're doing.\n <CTRL-S> to turn the sound on or off."
// maximum values
#define IDI_WTP_MAX_OBJ_MISSING 10
#define IDI_WTP_MAX_ROOM 62
#define IDI_WTP_MAX_OBJ 40
#define IDI_WTP_MAX_SND 14
#define IDI_WTP_MAX_PIC 2
#define IDI_WTP_MAX_ROOM_NORMAL 57
#define IDI_WTP_MAX_ROOM_TELEPORT 30
#define IDI_WTP_MAX_ROOM_OBJ 42
#define IDI_WTP_MAX_BLOCK 4
#define IDI_WTP_MAX_STR 6
#define IDI_WTP_MAX_OBJ_STR 4
#define IDI_WTP_MAX_OBJ_STR_END 2
#define IDI_WTP_MAX_FLAG 40
#define IDI_WTP_MAX_OPTION 3
#define IDI_WTP_MAX_DIR 4
#define IDI_WTP_MAX_MOVES_UNTIL_WIND 150
#define IDI_WTP_TIMER_INTERVAL (10 * 60 * 1000) // 10 minutes on DOS
// positions
#define IDI_WTP_ROW_MENU 21
#define IDI_WTP_ROW_OPTION_1 21
#define IDI_WTP_ROW_OPTION_2 22
#define IDI_WTP_ROW_OPTION_3 23
#define IDI_WTP_ROW_OPTION_4 24
#define IDI_WTP_COL_MENU 0
#define IDI_WTP_COL_OPTION 1
#define IDI_WTP_COL_NSEW 1
#define IDI_WTP_COL_NORTH 1
#define IDI_WTP_COL_SOUTH 8
#define IDI_WTP_COL_EAST 15
#define IDI_WTP_COL_WEST 21
#define IDI_WTP_COL_TAKE 29
#define IDI_WTP_COL_DROP 35
#define IDI_WTP_COL_PRESENT 17
// data file offset modifiers
#define IDI_WTP_OFS_ROOM 0x5400
#define IDI_WTP_OFS_OBJ 0x0800
// picture
#define IDI_WTP_PIC_WIDTH 140
#define IDI_WTP_PIC_HEIGHT 159
#define IDI_WTP_PIC_X0 10
#define IDI_WTP_PIC_Y0 0
#define IDI_WTP_PIC_FLAGS IDF_AGI_PIC_V2
// selections
enum {
IDI_WTP_SEL_HOME = -2,
IDI_WTP_SEL_BACK,
IDI_WTP_SEL_OPT_1,
IDI_WTP_SEL_OPT_2,
IDI_WTP_SEL_OPT_3,
IDI_WTP_SEL_NORTH,
IDI_WTP_SEL_SOUTH,
IDI_WTP_SEL_EAST,
IDI_WTP_SEL_WEST,
IDI_WTP_SEL_TAKE,
IDI_WTP_SEL_DROP,
IDI_WTP_SEL_REAL_OPT_1,
IDI_WTP_SEL_REAL_OPT_2,
IDI_WTP_SEL_REAL_OPT_3,
IDI_WTP_SEL_TIMER_EVENT
};
#define IDI_WTP_SEL_LAST IDI_WTP_SEL_REAL_OPT_3
// rooms
enum {
IDI_WTP_ROOM_NONE = -1,
IDI_WTP_ROOM_NORTH,
IDI_WTP_ROOM_SOUTH,
IDI_WTP_ROOM_EAST,
IDI_WTP_ROOM_WEST
};
#define IDI_WTP_ROOM_HIDE 0
#define IDI_WTP_ROOM_PICNIC 2
#define IDI_WTP_ROOM_HOME 28
#define IDI_WTP_ROOM_PARTY 58
#define IDI_WTP_ROOM_MIST 59
#define IDI_WTP_ROOM_TIGGER 61
// sound
enum ENUM_WTP_SOUND {
IDI_WTP_SND_POOH_0 = 1,
IDI_WTP_SND_TIGGER,
IDI_WTP_SND_TAKE,
IDI_WTP_SND_DROP,
IDI_WTP_SND_DROP_OK,
IDI_WTP_SND_FANFARE,
IDI_WTP_SND_POOH_1,
IDI_WTP_SND_KEYHELP,
IDI_WTP_SND_POOH_2,
IDI_WTP_SND_WIND_0,
IDI_WTP_SND_WIND_1
};
// script opcodes
#define IDO_WTP_GOTO_ROOM 0x06
#define IDO_WTP_PRINT_MSG 0x08
#define IDO_WTP_PRINT_STR 0x0A
#define IDO_WTP_DROP_OBJ 0x0C
#define IDO_WTP_FLAG_CLEAR 0x0E
#define IDO_WTP_FLAG_SET 0x10
#define IDO_WTP_GAME_OVER 0x12
#define IDO_WTP_WALK_MIST 0x14
#define IDO_WTP_PLAY_SOUND 0x16
#define IDO_WTP_SAVE_GAME 0x18
#define IDO_WTP_LOAD_GAME 0x1A
#define IDO_WTP_OWL_HELP 0x1C
#define IDO_WTP_GOTO_RND 0x1E
#define IDO_WTP_OPTION_0 0x15
#define IDO_WTP_OPTION_1 0x16
#define IDO_WTP_OPTION_2 0x17
enum {
IDI_WTP_OBJ_DESC = 0,
IDI_WTP_OBJ_TAKE,
IDI_WTP_OBJ_DROP,
IDI_WTP_OBJ_HELP
};
enum {
IDI_WTP_PAR_OK = 0,
IDI_WTP_PAR_GOTO,
IDI_WTP_PAR_BACK,
IDI_WTP_PAR_RELOAD
};
// room file option block
struct WTP_ROOM_BLOCK {
uint16 ofsOpt[IDI_WTP_MAX_BLOCK];
};
// room file header
struct WTP_ROOM_HDR {
uint8 roomNumber;
uint8 objId;
uint16 ofsPic;
uint16 fileLen;
uint16 reserved0;
int8 roomNew[IDI_WTP_MAX_DIR];
uint8 objX;
uint8 objY;
uint16 reserved1;
uint16 ofsDesc[IDI_WTP_MAX_BLOCK];
uint16 ofsBlock[IDI_WTP_MAX_BLOCK];
uint16 ofsStr[IDI_WTP_MAX_STR];
uint32 reserved2;
WTP_ROOM_BLOCK opt[IDI_WTP_MAX_BLOCK];
};
// object file header
struct WTP_OBJ_HDR {
uint16 fileLen;
uint16 objId;
uint16 ofsEndStr[IDI_WTP_MAX_OBJ_STR_END];
uint16 ofsStr[IDI_WTP_MAX_OBJ_STR];
uint16 ofsPic;
};
// savegame
struct WTP_SAVE_GAME {
uint8 fSound;
uint8 nMoves;
uint8 nObjMiss;
uint8 nObjRet;
uint8 iObjHave;
uint8 fGame[IDI_WTP_MAX_FLAG];
uint8 iUsedObj[IDI_WTP_MAX_OBJ_MISSING];
uint8 iObjRoom[IDI_WTP_MAX_ROOM_OBJ];
};
class PreAgiEngine;
class PictureMgr_Mickey_Winnie;
class WinnieEngine : public PreAgiEngine {
public:
WinnieEngine(OSystem *syst, const AGIGameDescription *gameDesc);
~WinnieEngine() override;
void init();
Common::Error go() override;
void debugCurRoom();
private:
PictureMgr_Mickey_Winnie *_picture;
WTP_SAVE_GAME _gameStateWinnie;
int _room;
int _mist;
bool _doWind;
bool _tiggerOrMist;
bool _timerEnabled;
uint32 _timerStart;
int _roomOffset;
int _objOffset;
bool _isBigEndian;
Common::Rect hotspotNorth, hotspotSouth, hotspotEast, hotspotWest;
void randomize();
void intro();
void drawPic(const char *);
void gameLoop();
void parseRoomHeader(WTP_ROOM_HDR *roomHdr, byte *buffer, int len);
void parseObjHeader(WTP_OBJ_HDR *objHdr, byte *buffer, int len);
uint32 readRoom(int, uint8 *, WTP_ROOM_HDR &);
void drawRoomPic();
int parser(int, int, uint8 *);
int getObjInRoom(int);
void getMenuSel(char *, int *, int[]);
void keyHelp();
void clrMenuSel(int *, int[]);
void incMenuSel(int *, int[]);
void decMenuSel(int *, int[]);
void drawMenu(char *, int, int[]);
void printRoomStr(int, int);
void inventory();
void printObjStr(int, int);
uint32 readObj(int, uint8 *);
void takeObj(int);
bool dropObj(int);
bool isRightObj(int, int, int *);
void drawObjPic(int, int, int);
void getMenuMouseSel(int *, int[], int, int);
void setWinnieFlag(int);
void clearWinnieFlag(int);
void gameOver();
void saveGame();
void loadGame();
void dropObjRnd();
void setTakeDrop(int[]);
bool makeSel(int *, int[]);
void wind();
void mist();
void tigger();
void startTimer();
void stopTimer();
void showOwlHelp();
void showAmigaHelp();
bool playSound(ENUM_WTP_SOUND);
void printStrWinnie(char *szMsg);
};
} // End of namespace Agi
#endif