/* 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 GLK_LEVEL9_LEVEL9_MAIN
#define GLK_LEVEL9_LEVEL9_MAIN

#include "common/scummsys.h"
#include "common/endian.h"
#include "common/stream.h"

namespace Glk {
namespace Level9 {

typedef byte L9BYTE;
typedef uint16 L9UINT16;
typedef uint32 L9UINT32;
typedef bool L9BOOL;

#define FALSE false
#define TRUE true

#define LISTAREASIZE 0x800
#define STACKSIZE 1024
#define V1FILESIZE 0x600

#ifndef MAX_PATH
#define MAX_PATH 256
#endif

struct GameState {
	L9UINT32 Id;
	L9UINT16 codeptr, stackptr, listsize, stacksize, filenamesize, checksum;
	L9UINT16 vartable[256];
	L9BYTE listarea[LISTAREASIZE];
	L9UINT16 stack[STACKSIZE];
	char filename[MAX_PATH];
};

enum BitmapType {
	NO_BITMAPS,
	AMIGA_BITMAPS,
	PC1_BITMAPS,
	PC2_BITMAPS,
	C64_BITMAPS,
	BBC_BITMAPS,
	CPC_BITMAPS,
	MAC_BITMAPS,
	ST1_BITMAPS,
	ST2_BITMAPS
};

struct Colour {
	L9BYTE red, green, blue;
};

struct Bitmap {
	L9UINT16 width, height;
	L9BYTE *bitmap;
	Colour palette[32];
	L9UINT16 npalette;
};

#define MAX_BITMAP_WIDTH 512
#define MAX_BITMAP_HEIGHT 218

#define L9WORD(x) READ_LE_UINT16(x)
#define L9SETWORD(x,val) WRITE_LE_UINT16(x, val)
#define L9SETDWORD(x,val) WRITE_LE_UINT32(x, val)

extern byte *startdata;
extern uint32 FileSize;

extern void level9_initialize();

/* routines provided by os dependent code */
extern void os_printchar(char c);
extern L9BOOL os_input(char *ibuff, int size);
extern char os_readchar(int millis);
extern L9BOOL os_stoplist(void);
extern void os_flush(void);
extern L9BOOL os_save_file(L9BYTE *Ptr, int Bytes);
extern L9BOOL os_load_file(L9BYTE *Ptr, int *Bytes, int Max);
extern L9BOOL os_get_game_file(char *NewName, int Size);
extern void os_set_filenumber(char *NewName, int Size, int n);
extern void os_graphics(int mode);
extern void os_cleargraphics(void);
extern void os_setcolour(int colour, int index);
extern void os_drawline(int x1, int y1, int x2, int y2, int colour1, int colour2);
extern void os_fill(int x, int y, int colour1, int colour2);
extern void os_show_bitmap(int pic, int x, int y);
extern Common::SeekableReadStream *os_open_script_file(void);

/* routines provided by level9 interpreter */
extern L9BOOL LoadGame(const char *filename, char *picname);
extern L9BOOL RunGame(void);
extern void StopGame(void);
extern void RestoreGame(char *filename);
extern void FreeMemory(void);
extern void GetPictureSize(int *width, int *height);
extern L9BOOL RunGraphics(void);

/* bitmap routines provided by level9 interpreter */
BitmapType DetectBitmaps(char *dir);
Bitmap *DecodeBitmap(char *dir, BitmapType type, int num, int x, int y);

} // End of namespace Level9
} // End of namespace Glk

#endif
