//
// Copyright 2020 Electronic Arts Inc.
//
// TiberianDawn.DLL and RedAlert.dll and corresponding source code 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.

// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed 
// in the hope that it will be useful, but with permitted additional restrictions 
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT 
// distributed with this program. You should have received a copy of the 
// GNU General Public License along with permitted additional restrictions 
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection

/* $Header:   F:\projects\c&c\vcs\code\tdata.cpv   2.16   16 Oct 1995 16:52:04   JOE_BOSTIC  $ */
/***********************************************************************************************
 ***             C O N F I D E N T I A L  ---  W E S T W O O D   S T U D I O S               ***
 ***********************************************************************************************
 *                                                                                             *
 *                 Project Name : Command & Conquer                                            *
 *                                                                                             *
 *                    File Name : TDATA.CPP                                                    *
 *                                                                                             *
 *                   Programmer : Joe L. Bostic                                                *
 *                                                                                             *
 *                   Start Date : May 2, 1994                                                  *
 *                                                                                             *
 *                  Last Update : May 8, 1995 [JLB]                                            *
 *                                                                                             *
 *---------------------------------------------------------------------------------------------*
 * Functions:                                                                                  *
 *   TerrainTypeClass::Prep_For_Add -- Prepares to add terrain object.                         *
 *   TerrainTypeClass::Display -- Display a generic terrain object.                            *
 *   TerrainTypeClass::From_Name -- Convert name to terrain type.                              *
 *   TerrainTypeClass::Init -- Loads terrain object shape files.                               *
 *   TerrainTypeClass::Create_And_Place -- Creates and places terrain object on map.           *
 *   TerrainTypeClass::Create_On_Of -- Creates a terrain object from type.                     *
 *   TerrainTypeClass::TerrainTypeClass -- The general constructor for the terrain type objects*
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

#include	"function.h"
#include	"terrain.h"
#include	"type.h"


#define	TREE_NORMAL		600
#define	TREE_WEAK		400
#define	TREE_STRONG		800

static short const _List1[] = {0, REFRESH_EOL};
static short const _List000010[] = {MAP_CELL_W+1, REFRESH_EOL};
static short const _List000011101000[] = {MAP_CELL_W, MAP_CELL_W+1, MAP_CELL_W+2, MAP_CELL_W*2, REFRESH_EOL};
static short const _List00001[] = {4, REFRESH_EOL};
static short const _List000110[] = {MAP_CELL_W, MAP_CELL_W+1, REFRESH_EOL};
static short const _List000111[] = {MAP_CELL_W, MAP_CELL_W+1, MAP_CELL_W+2, REFRESH_EOL};
static short const _List001011100110[] = {2, MAP_CELL_W, MAP_CELL_W+1, MAP_CELL_W+2, MAP_CELL_W*2+1, MAP_CELL_W*2+2, REFRESH_EOL};
static short const _List0010[] = {MAP_CELL_W, REFRESH_EOL};
static short const _List0011[] = {MAP_CELL_W, MAP_CELL_W+1, REFRESH_EOL};
static short const _List001[] = {2, REFRESH_EOL};
static short const _List010110[] = {1, MAP_CELL_W, MAP_CELL_W+1, REFRESH_EOL};
static short const _List01[] = {1, REFRESH_EOL};
static short const _List1001[] = {0, MAP_CELL_W+1, REFRESH_EOL};
static short const _List101001[] = {0, 2, MAP_CELL_W+2, REFRESH_EOL};
static short const _List10[] = {0, REFRESH_EOL};
static short const _List110000011001[] = {0, 1, MAP_CELL_W+3, MAP_CELL_W*2, MAP_CELL_W*2+3, REFRESH_EOL};
static short const _List110000[] = {0, 1, REFRESH_EOL};
static short const _List110001[] = {0, 1, MAP_CELL_W+2, REFRESH_EOL};
static short const _List1100[] = {0, 1, REFRESH_EOL};
static short const _List110110[] = {0, 1, MAP_CELL_W, MAP_CELL_W+1, REFRESH_EOL};
static short const _List1101[] = {0, 1, MAP_CELL_W+1, REFRESH_EOL};
static short const _List111000010110[] = {0, 1, 2, MAP_CELL_W+3, MAP_CELL_W*2+1, MAP_CELL_W*2+2, REFRESH_EOL};
static short const _List111001[] = {0, 1, 2, MAP_CELL_W+2, REFRESH_EOL};
static short const _List111101[] = {0, 1, 2, MAP_CELL_W, MAP_CELL_W+2, REFRESH_EOL};
static short const _List11110[] = {0, 1, 2, 3, REFRESH_EOL};


static TerrainTypeClass const Tree1Class(
	TERRAIN_TREE1,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(11,41),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T01",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0010,
	(short const *)_List1001
);

static TerrainTypeClass const Tree2Class(
	TERRAIN_TREE2,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(11,44),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T02",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0010,
	(short const *)_List1001
);

static TerrainTypeClass const Tree3Class(
	TERRAIN_TREE3,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(12,45),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T03",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0010,
	(short const *)_List1001
);

static TerrainTypeClass const Tree4Class(
	TERRAIN_TREE4,
	THEATERF_DESERT,
	XYP_COORD(8,9),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T04",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List1,
	NULL
);


static TerrainTypeClass const Tree5Class(
	TERRAIN_TREE5,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(15,41),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T05",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0010,
	(short const *)_List1001
);

static TerrainTypeClass const Tree6Class(
	TERRAIN_TREE6,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(16,37),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T06",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0010,
	(short const *)_List1001
);

static TerrainTypeClass const Tree7Class(
	TERRAIN_TREE7,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(15,41),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T07",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0010,
	(short const *)_List1001
);

static TerrainTypeClass const Tree8Class(
	TERRAIN_TREE8,
	THEATERF_WINTER|THEATERF_TEMPERATE|THEATERF_DESERT,
	XYP_COORD(14,22),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T08",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List10,
	(short const *)_List01
);

static TerrainTypeClass const Tree9Class(
	TERRAIN_TREE9,
	THEATERF_DESERT,
	XYP_COORD(11,22),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T09",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List10,
	(short const *)_List01
);

static TerrainTypeClass const Tree10Class(
	TERRAIN_TREE10,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(25,43),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T10",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0011,
	(short const *)_List1100
);

static TerrainTypeClass const Tree11Class(
	TERRAIN_TREE11,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(23,44),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T11",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0011,
	(short const *)_List1100
);

static TerrainTypeClass const Tree12Class(
	TERRAIN_TREE12,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(14,36),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T12",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0010,
	(short const *)_List1001
);

static TerrainTypeClass const Tree13Class(
	TERRAIN_TREE13,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(19,40),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T13",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0010,
	(short const *)_List1101
);

static TerrainTypeClass const Tree14Class(
	TERRAIN_TREE14,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(19,40),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T14",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0011,
	(short const *)_List1100
);

static TerrainTypeClass const Tree15Class(
	TERRAIN_TREE15,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(19,40),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T15",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0011,
	(short const *)_List1100
);

static TerrainTypeClass const Tree16Class(
	TERRAIN_TREE16,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(13,36),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T16",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0010,
	(short const *)_List1001
);

static TerrainTypeClass const Tree17Class(
	TERRAIN_TREE17,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(18,44),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T17",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0010,
	(short const *)_List1001
);

static TerrainTypeClass const Tree18Class(
	TERRAIN_TREE18,
	THEATERF_DESERT,
	XYP_COORD(33,40),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		true,			// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		true,			// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		false,		// Is it immune to normal combat damage?
	"T18",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List000010,
	(short const *)_List111101
);

static TerrainTypeClass const Split1Class(
	TERRAIN_BLOSSOMTREE1,
	THEATERF_TEMPERATE|THEATERF_WINTER,
	XYP_COORD(18,44),	// Center base coordinate offset.
		true,			// Spawns Tiberium spontaneously?
		false,		// Does it have destruction animation?
		true,			// Does it have transformation (blossom tree) anim?
		false,		// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		true,			// Is it immune to normal combat damage?
	"SPLIT2",
	TXT_BLOSSOM_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0010,
	(short const *)_List1101
);

static TerrainTypeClass const Split2Class(
	TERRAIN_BLOSSOMTREE2,
	THEATERF_TEMPERATE|THEATERF_WINTER|THEATERF_DESERT,
	XYP_COORD(18,44),	// Center base coordinate offset.
		true,			// Spawns Tiberium spontaneously?
		false,		// Does it have destruction animation?
		true,			// Does it have transformation (blossom tree) anim?
		false,		// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		true,			// Is it immune to normal combat damage?
	"SPLIT3",
	TXT_BLOSSOM_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List0010,
	(short const *)_List1101
);

static TerrainTypeClass const Clump1Class(
	TERRAIN_CLUMP1,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(28,41),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		false,		// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		false,		// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		true,			// Is it immune to normal combat damage?
	"TC01",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List000110,
	(short const *)_List110001
);

static TerrainTypeClass const Clump2Class(
	TERRAIN_CLUMP2,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(38,41),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		false,		// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		false,		// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		true,			// Is it immune to normal combat damage?
	"TC02",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List010110,
	(short const *)_List101001
);

static TerrainTypeClass const Clump3Class(
	TERRAIN_CLUMP3,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(33,35),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		false,		// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		false,		// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		true,			// Is it immune to normal combat damage?
	"TC03",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List110110,
	(short const *)_List001
);

static TerrainTypeClass const Clump4Class(
	TERRAIN_CLUMP4,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(44,49),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		false,		// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		false,		// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		true,			// Is it immune to normal combat damage?
	"TC04",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List000011101000,
	(short const *)_List111000010110
);

static TerrainTypeClass const Clump5Class(
	TERRAIN_CLUMP5,
	THEATERF_WINTER|THEATERF_TEMPERATE,
	XYP_COORD(49,58),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		false,		// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		false,		// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		true,			// Is it immune to normal combat damage?
	"TC05",
	TXT_TREE,
	TREE_NORMAL,
	ARMOR_WOOD,
	(short const *)_List001011100110,
	(short const *)_List110000011001
);

static TerrainTypeClass const Rock1Class(
	TERRAIN_ROCK1,
	THEATERF_DESERT,
	XYP_COORD(33,41),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		false,		// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		false,		// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		true,			// Is it immune to normal combat damage?
	"ROCK1",
	TXT_ROCK,
	1000,
	ARMOR_STEEL,
	(short const *)_List0011,
	(short const *)_List111001
);

static TerrainTypeClass const Rock2Class(
	TERRAIN_ROCK2,
	THEATERF_DESERT,
	XYP_COORD(24,23),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		false,		// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		false,		// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		true,			// Is it immune to normal combat damage?
	"ROCK2",
	TXT_ROCK,
	1000,
	ARMOR_STEEL,
	(short const *)_List1100,
	(short const *)_List001
);

static TerrainTypeClass const Rock3Class(
	TERRAIN_ROCK3,
	THEATERF_DESERT,
	XYP_COORD(20,39),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		false,		// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		false,		// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		true,			// Is it immune to normal combat damage?
	"ROCK3",
	TXT_ROCK,
	1000,
	ARMOR_STEEL,
	(short const *)_List000110,
	(short const *)_List110001
);

static TerrainTypeClass const Rock4Class(
	TERRAIN_ROCK4,
	THEATERF_DESERT,
	XYP_COORD(12,20),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		false,		// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		false,		// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		true,			// Is it immune to normal combat damage?
	"ROCK4",
	TXT_ROCK,
	1000,
	ARMOR_STEEL,
	(short const *)_List10,
	(short const *)_List01
);

static TerrainTypeClass const Rock5Class(
	TERRAIN_ROCK5,
	THEATERF_DESERT,
	XYP_COORD(17,19),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		false,		// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		false,		// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		true,			// Is it immune to normal combat damage?
	"ROCK5",
	TXT_ROCK,
	1000,
	ARMOR_STEEL,
	(short const *)_List10,
	(short const *)_List01
);

static TerrainTypeClass const Rock6Class(
	TERRAIN_ROCK6,
	THEATERF_DESERT,
	XYP_COORD(28,40),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		false,		// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		false,		// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		true,			// Is it immune to normal combat damage?
	"ROCK6",
	TXT_ROCK,
	1000,
	ARMOR_STEEL,
	(short const *)_List000111,
	(short const *)_List110000
);

static TerrainTypeClass const Rock7Class(
	TERRAIN_ROCK7,
	THEATERF_DESERT,
	XYP_COORD(57,22),	// Center base coordinate offset.
		false,		// Spawns Tiberium spontaneously?
		false,		// Does it have destruction animation?
		false,		// Does it have transformation (blossom tree) anim?
		false,		// Does it catch fire?
		false,		// Is this object crushable by heavy vehicles?
		false,		// Can this object be selected by the player?
		false,		// Can it be the target of a move or attack order?
		true,			// Don't make a big deal about it if it gets destroyed?
		true,			// Is it immune to normal combat damage?
	"ROCK7",
	TXT_ROCK,
	1000,
	ARMOR_STEEL,
	(short const *)_List11110,
	(short const *)_List00001
);


TerrainTypeClass const * const TerrainTypeClass::Pointers[TERRAIN_COUNT] = {
	&Tree1Class,		//	TERRAIN_TREE1
	&Tree2Class,		//	TERRAIN_TREE2
	&Tree3Class,		//	TERRAIN_TREE3
	&Tree4Class,		//	TERRAIN_TREE4
	&Tree5Class,		//	TERRAIN_TREE5
	&Tree6Class,		//	TERRAIN_TREE6
	&Tree7Class,		//	TERRAIN_TREE7
	&Tree8Class,		//	TERRAIN_TREE8
	&Tree9Class,		//	TERRAIN_TREE9
	&Tree10Class,		//	TERRAIN_TREE10
	&Tree11Class,		//	TERRAIN_TREE11
	&Tree12Class,		//	TERRAIN_TREE12
	&Tree13Class,		//	TERRAIN_TREE13
	&Tree14Class,		//	TERRAIN_TREE14
	&Tree15Class,		//	TERRAIN_TREE15
	&Tree16Class,		//	TERRAIN_TREE16
	&Tree17Class,		//	TERRAIN_TREE17
	&Tree18Class,		//	TERRAIN_TREE18
	&Split1Class,		// TERRAIN_BLOSSOMTREE1
	&Split2Class,		// TERRAIN_BLOSSOMTREE2
	&Clump1Class,		//	TERRAIN_CLUMP1
	&Clump2Class,		//	TERRAIN_CLUMP2
	&Clump3Class,		//	TERRAIN_CLUMP3
	&Clump4Class,		//	TERRAIN_CLUMP4
	&Clump5Class,		//	TERRAIN_CLUMP5
	&Rock1Class,		//	TERRAIN_ROCK1
	&Rock2Class,		//	TERRAIN_ROCK2
	&Rock3Class,		//	TERRAIN_ROCK3
	&Rock4Class,		//	TERRAIN_ROCK4
	&Rock5Class,		//	TERRAIN_ROCK5
	&Rock6Class,		//	TERRAIN_ROCK6
	&Rock7Class			//	TERRAIN_ROCK7
};


/***********************************************************************************************
 * TerrainTypeClass::TerrainTypeClass -- The general constructor for the terrain type objects. *
 *                                                                                             *
 *    This is the constructor for terrain type objects. It is only used to construct the       *
 *    static (constant) terrain type objects.                                                  *
 *                                                                                             *
 * INPUT:   see below..                                                                        *
 *                                                                                             *
 * OUTPUT:  none                                                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   07/19/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
TerrainTypeClass::TerrainTypeClass(
	TerrainType terrain,
	int theater,
	COORDINATE centerbase,
	bool is_spawn,
	bool is_destroyable,
	bool is_transformable,
	bool is_flammable,
	bool is_crushable,
	bool is_selectable,
	bool is_legal_target,
	bool is_insignificant,
	bool is_immune,
	char const *ininame,
	int fullname, unsigned short strength, ArmorType armor, short const *occupy, short const *overlap) :
		ObjectTypeClass(true, is_flammable, is_crushable, true, is_selectable,
								is_legal_target, is_insignificant, is_immune,
								fullname, ininame, armor, strength)
{
	CenterBase = centerbase;
	IsTiberiumSpawn = is_spawn;
	IsDestroyable = is_destroyable;
	IsTransformable = is_transformable;
	Theater = theater;
	Type = terrain;
	Occupy = occupy;
	Overlap = overlap;
}


/***********************************************************************************************
 * TerrainTypeClass::Init -- Loads terrain object shape files.                                 *
 *                                                                                             *
 *    This routine is used to load up the terrain object shape files.                          *
 *    The shape files loaded depends on theater.                                               *
 *                                                                                             *
 * INPUT:   theater  -- The theater to load the terrain shape data for.                        *
 *                                                                                             *
 * OUTPUT:  none                                                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   05/16/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
void TerrainTypeClass::Init(TheaterType theater)
{
	if (theater != LastTheater){
		for (TerrainType index = TERRAIN_FIRST; index < TERRAIN_COUNT; index++) {
			TerrainTypeClass const & terrain = As_Reference(index);
			char	fullname[_MAX_FNAME+_MAX_EXT];

			/*
			**	Clear any existing shape pointer. All terrain is theater specific, thus if
			**	it isn't loaded in this routine, it shouldn't exist at all.
			*/
			((void const *&)terrain.ImageData) = NULL;

			if (terrain.Theater & (1 << theater)) {

				/*
				**	Load in the appropriate object shape data.
				*/
				_makepath(fullname, NULL, NULL, terrain.IniName, Theaters[theater].Suffix);
				((void const *&)terrain.ImageData) = MixFileClass::Retrieve(fullname);

				IsTheaterShape = true;
				if (terrain.RadarIcon) delete[] (char *)terrain.RadarIcon;
				((void const *&)terrain.RadarIcon) = Get_Radar_Icon(terrain.Get_Image_Data(), 0, 1, 3);
				IsTheaterShape = false;
			}
		}
	}
}


/***********************************************************************************************
 * TerrainTypeClass::From_Name -- Convert name to terrain type.                                *
 *                                                                                             *
 *    This routine is used to convert a text name into the matching                            *
 *    terrain type number. This is used during scenario initialization.                        *
 *                                                                                             *
 * INPUT:   name  -- The name to convert.                                                      *
 *                                                                                             *
 * OUTPUT:  Returns the TerrainType that matches the name specified. If                        *
 *          no match was found, then TERRAIN_NONE is returned.                                 *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   05/16/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
TerrainType TerrainTypeClass::From_Name(char const * name)
{
	TerrainType	index;

	if (name) {
		for (index = TERRAIN_FIRST; index < TERRAIN_COUNT; index++) {
			if (stricmp(name, Pointers[index]->IniName) == 0) {
				return(index);
			}
		}
	}
	return(TERRAIN_NONE);
}


#ifdef SCENARIO_EDITOR
/***********************************************************************************************
 * TerrainTypeClass::Display -- Display a generic terrain object.                              *
 *                                                                                             *
 *    This routine is used to display a generic terrain object. Typical                        *
 *    use is during scenario editing.                                                          *
 *                                                                                             *
 * INPUT:   x,y   -- Pixel coordinates to display object at (centered).                        *
 *                                                                                             *
 *          window-- The window to display the object within.                                  *
 *                                                                                             *
 * OUTPUT:  none                                                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   05/16/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
void TerrainTypeClass::Display(int x, int y, WindowNumberType window, HousesType) const
{
	CC_Draw_Shape(Get_Image_Data(), 0, x, y, window, SHAPE_NORMAL|SHAPE_CENTER|SHAPE_WIN_REL);
}


/***********************************************************************************************
 * TerrainTypeClass::Prep_For_Add -- Prepares to add terrain object.                           *
 *                                                                                             *
 *    Submits all of the valid terrain objects to the scenario editor for possible selection   *
 *    and subsequent placement on the map. All terrain objects, that have a valid shape        *
 *    file available, are added.                                                               *
 *                                                                                             *
 * INPUT:   none                                                                               *
 *                                                                                             *
 * OUTPUT:  none                                                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   05/23/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
void TerrainTypeClass::Prep_For_Add(void)
{
	for (TerrainType index = TERRAIN_FIRST; index < TERRAIN_COUNT; index++) {
		if (As_Reference(index).Get_Image_Data()) {
			Map.Add_To_List(&As_Reference(index));
		}
	}
}
#endif


/***********************************************************************************************
 * TerrainTypeClass::Create_And_Place -- Creates and places terrain object on map.             *
 *                                                                                             *
 *    This support routine is used by the scenario editor to add a terrain object to the map.  *
 *                                                                                             *
 * INPUT:   cell  -- The cell to place the terrain object in.                                  *
 *                                                                                             *
 * OUTPUT:  bool; Was the placement successful?                                                *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   05/28/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
bool TerrainTypeClass::Create_And_Place(CELL cell, HousesType ) const
{
	if (new TerrainClass(Type, cell)) {
		return(true);
	}
	return(false);
}


/***********************************************************************************************
 * TerrainTypeClass::Create_On_Of -- Creates a terrain object from type.                       *
 *                                                                                             *
 *    This is used to create a terrain object by using the terrain type as a guide. This       *
 *    routine is typically used by the scenario editor in order to place a terrain object      *
 *    onto the map.                                                                            *
 *                                                                                             *
 * INPUT:   none                                                                               *
 *                                                                                             *
 * OUTPUT:  Returns with a pointer to the created terrain object or NULL if one couldn't be    *
 *          created.                                                                           *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   07/19/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
ObjectClass * TerrainTypeClass::Create_One_Of(HouseClass *) const
{
	return(new TerrainClass(Type, -1));
}


short const * TerrainTypeClass::Occupy_List(bool ) const
{
	if (Occupy) return(Occupy);

	static short const _simple[1] = {
		REFRESH_EOL
	};
	return(&_simple[0]);
}


short const * TerrainTypeClass::Overlap_List(void) const
{
	if (Overlap) return(Overlap);

	static short const _simple[1] = {
		REFRESH_EOL
	};
	return(&_simple[0]);
}
