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

#ifndef 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      "room.%d"
#define IDS_WTP_ROOM_C64        "room%02d"
#define IDS_WTP_ROOM_APPLE      "room%d.obj"
#define IDS_WTP_OBJ_DOS         "obj.%02d"
#define IDS_WTP_OBJ_AMIGA       "object.%d"
#define IDS_WTP_OBJ_C64         "object%02d"
#define IDS_WTP_OBJ_APPLE       "object%d.obj"
#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."

// 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 {
	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 WinnieEngine : public PreAgiEngine {
public:
	WinnieEngine(OSystem *syst, const AGIGameDescription *gameDesc);
	~WinnieEngine();

	void init();
	Common::Error go();

	void debugCurRoom();

	GUI::Debugger *getDebugger() { return _console; }

private:
	WinnieConsole *_console;

	WTP_SAVE_GAME _gameStateWinnie;
	int _room;
	int _mist;
	bool _doWind;
	bool _winnieEvent;
	int _tiggerMist;

	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);
	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);
	uint32 readObj(int, uint8 *);
	void takeObj(int);
	void 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[]);
	void makeSel(int *, int[]);

	void wind();
	void mist();
	void tigger();

	void showOwlHelp();
	bool playSound(ENUM_WTP_SOUND);

	void printStrWinnie(char *szMsg);
};

} // End of namespace Agi

#endif