scummvm/engines/agi/preagi_winnie.h

345 lines
10 KiB
C
Raw Normal View History

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* $URL$
* $Id$
*
*/
#include "agi/agi.h"
namespace Agi {
// strings
#define IDS_WTP_SELECTION ">"
#define IDS_WTP_PATH_ROOM "rooms\\rm.%02d"
#define IDS_WTP_PATH_OBJ "obj.%02d"
#define IDS_WTP_PATH_SND "snd.%02d"
#define IDS_WTP_PATH "%s"
#define IDS_WTP_FILE_LOGO "logo.pic"
#define IDS_WTP_FILE_TITLE "title.pic"
#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_PATH_ROOM_C64 "%sroom%02d"
#define IDS_WTP_PATH_OBJ_C64 "%sobject%02d"
#define IDS_WTP_PATH_SND_C64 "%ssound.obj"
#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."
// 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
// 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
};
#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
};
// 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 {
uint16 reserved0; // 10c2 unused
uint16 fSound; // 10c4
uint16 nMoves; // 10c6
uint16 nObjMiss; // 10c8
uint16 nObjRet; // 10ca
uint16 reserved1; // 10ce unused
uint16 reserved2; // 10cf unused
uint16 reserved3; // 10d0 unused
uint16 iObjHave; // 10d2
uint16 o10d4; // 10d4 can be ignored
uint16 o10d6; // 10d6 can be ignored
uint16 o10d8; // 10d8 can be ignored
uint8 fGame[IDI_WTP_MAX_FLAG]; // 10da
uint8 iUsedObj[IDI_WTP_MAX_OBJ_MISSING]; // 1102
uint8 iObjRoom[IDI_WTP_MAX_ROOM_OBJ]; // 110c
uint16 o1136; // 1136 can be ignored
uint16 o1138; // 1138 can be ignored
};
class Winnie {
friend class PreAgiEngine;
public:
Winnie(PreAgiEngine *vm);
//~Winnie();
void init();
void run();
private:
PreAgiEngine *_vm;
WTP_SAVE_GAME game;
int room;
int mist;
bool wind;
bool winnie_event;
int tigger_mist;
void initEngine();
void initVars();
void randomize();
void intro();
void intro_DrawLogo();
void intro_DrawTitle();
void intro_PlayTheme();
void drawPic(const char*);
void gameLoop();
void readRoom(int, uint8*, int);
void drawRoomPic();
int parser(int, int, uint8*);
int getObjInRoom(int);
bool getSelOkBack();
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);
void readObj(int, uint8*, int);
void takeObj(int);
void dropObj(int);
bool isRightObj(int, int, int*);
void drawObjPic(int, int, int);
void getMenuMouseSel(int*, int[], int, int);
void setFlag(int);
void clearFlag(int);
void gameOver();
void saveGame();
void loadGame();
void writeSaveGame(uint8*);
void readSaveGame(uint8*);
};
}