/* 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
