/* ScummVM - Scumm Interpreter
 * Copyright (C) 2003-2005 The ScummVM project
 *
 * 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header$
 *
 */

#ifndef BSOBJECT_H
#define BSOBJECT_H

#include "scummsys.h"

namespace Sword1 {

#define	O_TOTAL_EVENTS	5
#define	O_WALKANIM_SIZE	600			//max number of nodes in router output
#define	O_GRID_SIZE		200
#define	EXTRA_GRID_SIZE	20
//--------------------------------------------------------------------------------------

struct OEventSlot {			//receiving event list in the compact - 
	int32	o_event;		//array of these with O_TOTAL_EVENTS elements
	int32	o_event_script;
};

#define	TOTAL_script_levels	5
//-----
struct ScriptTree {								//this is a logic tree, used by OBJECTs
	int32	o_script_level;						//logic level
	int32	o_script_id[TOTAL_script_levels];	//script id's (are unique to each level)
	int32	o_script_pc[TOTAL_script_levels];	//pc of script for each (if script_manager)
};	// size = 11*int32 = 44 bytes
//--------------------------------------------------------------------------------------
struct TalkOffset {
	int32	x;
	int32	y;
};	// size = 2*int32 = 8 bytes
//--------------------------------------------------------------------------------------
struct WalkData {
	int32	frame;
	int32	x;
	int32	y;
	int32	step;
	int32	dir;
} GCC_PACK;	// size = 5*int32 = 20 bytes

struct Object {
	int32	o_type;						// 0  broad description of type - object, floor, etc.
	int32	o_status;					// 4  bit flags for logic, graphics, mouse, etc.
	int32	o_logic;					// 8  logic type
	int32	o_place;					// 12 where is the mega character
	int32	o_down_flag;				// 16 pass back down with this - with C possibly both are unnecessary?
	int32	o_target;					// 20 target object for the GTM			*these are linked to script
	int32	o_screen;					// 24 physical screen/section
	int32	o_frame;					// 28 frame number &
	int32	o_resource;					// 32 id of spr file it comes from
	int32	o_sync;						// 36 receive sync here
	int32	o_pause;					// 40 logic_engine() pauses these cycles
	int32	o_xcoord;					// 44 
	int32	o_ycoord;					// 48
	int32	o_mouse_x1;					// 52 top-left of mouse area is (x1,y1)
	int32	o_mouse_y1;					// 56 
	int32	o_mouse_x2;					// 60 bottom-right of area is (x2,y2)	(these coords are inclusive)
	int32	o_mouse_y2;					// 64 
	int32	o_priority;					// 68
	int32	o_mouse_on;					// 72
	int32	o_mouse_off;				// 76
	int32	o_mouse_click;				// 80
	int32	o_interact;					// 84
	int32	o_get_to_script;			// 88
	int32	o_scale_a;					// 92 used by floors
	int32	o_scale_b;					// 96 
	int32	o_anim_x;					// 100
	int32	o_anim_y;					// 104

	ScriptTree	o_tree;					// 108	size = 44 bytes
	ScriptTree	o_bookmark;				// 152	size = 44 bytes

	int32	o_dir;					 	// 196
	int32	o_speech_pen;				// 200
	int32	o_speech_width;				// 204
	int32	o_speech_time;				// 208
	int32	o_text_id;					// 212 working back from o_ins1
	int32	o_tag;					 	// 216
	int32	o_anim_pc;					// 220 position within an animation structure
	int32	o_anim_resource;			// 224 cdt or anim table

	int32	o_walk_pc;					// 228

	TalkOffset	talk_table[6];			// 232	size = 6*8 bytes = 48

	OEventSlot o_event_list[O_TOTAL_EVENTS];	// 280	size = 5*8 bytes = 40

	int32	o_ins1;						// 320
	int32	o_ins2;						// 324
	int32	o_ins3;						// 328

	int32	o_mega_resource;			// 332
	int32	o_walk_resource;			// 336

	WalkData	o_route[O_WALKANIM_SIZE];	// 340	size = 600*20 bytes = 12000
				// mega size = 12340 bytes (+ 8 byte offset table + 20 byte header = 12368)
};

struct CollisionData {
	Object  *compact;
	int32	w[24];
	int32	h[24];
	WalkData route[24];
};

} // End of namespace Sword1 

#endif //BSOBJECT_H