Gobligine/tools/udta.c
2001-05-30 18:45:57 +00:00

1951 lines
57 KiB
C

// ___________ _________ _____ __
// \_ _____/______ ____ ____ \_ ___ \____________ _/ ____\/ |_
// | __) \_ __ \_/ __ \_/ __ \/ \ \/\_ __ \__ \\ __\\ __\
// | \ | | \/\ ___/\ ___/\ \____| | \// __ \| | | |
// \___ / |__| \___ >\___ >\______ /|__| (____ /__| |__|
// \/ \/ \/ \/ \/
// ______________________ ______________________
// T H E W A R B E G I N S
// FreeCraft - A free fantasy real time strategy game engine
//
// Utility for FreeCraft.
//
// udta.c - Converts udta section (old,not working for new version).
//
// (c) Copyright 1998,2000 by Lutz Sammer
//
// FreeCraft 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.
//
// FreeCraft 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.
//
// $Id$
#include <stdio.h>
#define local
local int PudReadLong(FILE* input)
{
unsigned long temp_long;
if( fread(&temp_long,4,1,input)!=1 ) {
perror("fread()");
exit(-1);
}
return temp_long;
}
local int PudReadWord(FILE* input)
{
unsigned short temp_short;
if( fread(&temp_short,2,1,input)!=1 ) {
perror("fread()");
exit(-1);
}
return temp_short;
}
local int PudReadByte(FILE* input)
{
unsigned char temp_char;
if( fread(&temp_char,1,1,input)!=1 ) {
perror("fread()");
exit(-1);
}
return temp_char;
}
const char* MissileNames[] = {
"MissileLightning",
"MissileGriffonHammer",
"MissileDragonBreath",
"MissileFireball",
"MissileFlameShield",
"MissileBlizzard",
"MissileDeathDecay",
"MissileBigCannon",
"MissileExorcism",
"MissileHealEffect",
"MissileTouchOfDeath",
"MissileRune",
"MissileWhirlwind",
"MissileCatapultRock",
"MissileBallistaBolt",
"MissileArrow",
"MissileAxe",
"MissileSubmarineMissle",
"MissileTurtleMissle",
"MissileSmallFire",
"MissileBigFire",
"MissileImpact",
"MissileNormalSpell",
"MissileExplosion",
"MissileSmallCannon",
"MissileCannonExplosion",
"MissileCannonTowerExplosion",
"MissileDemonFire",
"MissileGreenCross",
"MissileNone",
"MissileNone",
};
const char* UnitTypeNames[] = {
"UnitFootman",
"UnitGrunt",
"UnitPeasant",
"UnitPeon",
"UnitBallista",
"UnitCatapult",
"UnitKnight",
"UnitOgre",
"UnitArcher",
"UnitAxethrower",
"UnitMage",
"UnitDeathKnight",
"UnitPaladin",
"UnitOgreMage",
"UnitDwarves",
"UnitGoblinSappers",
"UnitAttackPeasant",
"UnitAttackPeon",
"UnitRanger",
"UnitBerserker",
"UnitAlleria",
"UnitTeronGorefiend",
"UnitKurdanAndSky_ree",
"UnitDentarg",
"UnitKhadgar",
"UnitGnomHellscream",
"UnitTankerHuman",
"UnitTankerOrc",
"UnitTransportHuman",
"UnitTransportOrc",
"UnitElvenDestroyer",
"UnitTrollDestroyer",
"UnitBattleship",
"UnitJuggernaught",
"UnitNothing",
"UnitDeathwing",
"UnitNothing1",
"UnitNothing2",
"UnitGnomishSubmarine",
"UnitGiantTurtle",
"UnitGnomishFlyingMachine",
"UnitGoblinZeppelin",
"UnitGryphonRider",
"UnitDragon",
"UnitTuralyon",
"UnitEyeOfKilrogg",
"UnitDanath",
"UnitKorgathBladefist",
"UnitNothing3",
"UnitCho_gall",
"UnitLothar",
"UnitGul_dan",
"UnitUtherLightbringer",
"UnitZuljin",
"UnitNothing4",
"UnitSkeleton",
"UnitDaemon",
"UnitCritter",
"UnitFarm",
"UnitPigFarm",
"UnitBarracksHuman",
"UnitBarracksOrc",
"UnitChurch",
"UnitAltarOfStorms",
"UnitScoutTowerHuman",
"UnitScoutTowerOrc",
"UnitStables",
"UnitOgreMound",
"UnitGnomishInventor",
"UnitGoblinAlchemist",
"UnitGryphonAviary",
"UnitDragonRoost",
"UnitShipyardHuman",
"UnitShipyardOrc",
"UnitTownHall",
"UnitGreatHall",
"UnitElvenLumberMill",
"UnitTrollLumberMill",
"UnitFoundryHuman",
"UnitFoundryOrc",
"UnitMageTower",
"UnitTempleOfTheDamned",
"UnitBlacksmithHuman",
"UnitBlacksmithOrc",
"UnitRefineryHuman",
"UnitRefineryOrc",
"UnitOilPlatformHuman",
"UnitOilPlatformOrc",
"UnitKeep",
"UnitStronghold",
"UnitCastle",
"UnitFortress",
"UnitGoldMine",
"UnitOilPatch",
"UnitStartLocationHuman",
"UnitStartLocationOrc",
"UnitGuardTowerHuman",
"UnitGuardTowerOrc",
"UnitCannonTowerHuman",
"UnitCannonTowerOrc",
"UnitCircleofPower",
"UnitDarkPortal",
"UnitRunestone",
"UnitWallHuman",
"UnitWallOrc",
"UnitDeadBody",
"Unit1x1DestroyedPlace",
"Unit2x2DestroyedPlace",
"Unit3x3DestroyedPlace",
"Unit4x4DestroyedPlace",
"UnitPeonWithGold",
"UnitPeasantWithGold",
"UnitPeonWithWood",
"UnitPeasantWithWood",
};
typedef struct _unit_type_ {
char* Name; /// unit name
int SameSprite; /// unittype shared sprites
char* File[4/*TilesetMax*/]; /// sprite files
int Width; /// " width
int Height; /// " height
unsigned Icon; /// icon to display for this unit
int Speed; /// movement speed
// this is taken from the UDTA section
int OverlapFrame;
int SightRange;
unsigned HitPoints;
int Magic;
int BuildTime;
int GoldCost;
int WoodCost;
int OilCost;
int TileWidth;
int TileHeight;
int BoxWidth;
int BoxHeight;
int AttackRange;
int ReactRangeComputer;
int ReactRangeHuman;
int Armor;
int Priority;
int BasicDamage;
int PiercingDamage;
int WeaponsUpgradable;
int ArmorUpgradable;
int MissileWeapon;
int UnitType; // land / fly / naval
#define UnitTypeLand 0
#define UnitTypeFly 1
#define UnitTypeNaval 2
int DecayRate;
int AnnoyComputerFactor;
int MouseAction;
#define MouseActionAttack 1
#define MouseActionMove 2
#define MouseActionHarvest 3
#define MouseActionHaulOil 4
#define MouseActionDemolish 5
#define MouseActionSail 6
int Points;
int CanTarget;
#define CanTargetLand 1
#define CanTargetSea 2
#define CanTargetAir 4
unsigned LandUnit : 1;
unsigned AirUnit : 1;
unsigned SeaUnit : 1;
unsigned ExplodeWhenKilled : 1;
unsigned Critter : 1;
unsigned Building : 1;
unsigned Submarine : 1;
unsigned CanSeeSubmarine : 1;
unsigned CowerPeon : 1;
unsigned Tanker : 1;
unsigned Transporter : 1;
unsigned GivesOil : 1;
unsigned StoresGold : 1;
unsigned Vanishes : 1;
unsigned GroundAttack : 1;
unsigned IsUndead : 1;
unsigned ShoreBuilding : 1;
unsigned CanCastSpell : 1;
unsigned StoresWood : 1;
unsigned CanAttack : 1;
unsigned Tower : 1;
unsigned OilPatch : 1;
unsigned GoldMine : 1;
unsigned Hero : 1;
unsigned StoresOil : 1;
unsigned Volatile : 1; // invisiblity/unholy armor killes this unit
unsigned CowerMage : 1;
unsigned Organic : 1;
unsigned SelectableByRectangle : 1;
// --- FILLED UP ---
unsigned ExtraDamage : 8; /// Extra damage through upgrade
unsigned ExtraArmor : 8; /// Extra armor through upgrade
unsigned Type; /// Type as number
RleSprite* RleSprite; /// sprite images
} UnitType;
#define DEFAULT ((void*)0L)
local UnitType UnitTypes[] = {
{ "Footman", -1
,{ "footman.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconFootman
,10, 0,4, 60,0, 60, 600, 0, 0,1,1, 31, 31
, 1, 6, 4, 2, 60, 6,3,1,1,29,0, 0, 0,1, 50
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Grunt", -1
,{ "grunt.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconGrunt
,10, 0,4, 60,0, 60, 600, 0, 0,1,1, 31, 31
, 1, 6, 4, 2, 60, 6,3,1,1,29,0, 0, 0,1, 50
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Peasant", -1
,{ "peasant.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconPeasant
,10, 0,4, 30,0, 45, 400, 0, 0,1,1, 31, 31
, 1, 6, 4, 0, 50, 3,2,0,0,29,0, 0, 0,3, 30
,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Peon", -1
,{ "peon.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconPeon
,10, 0,4, 30,0, 45, 400, 0, 0,1,1, 31, 31
, 1, 6, 4, 0, 50, 3,2,0,0,29,0, 0, 0,3, 30
,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Ballista", -1
,{ "ballista.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 64, 64, IconBallista
, 5, 0,9, 110,0,250, 900, 300, 0,1,1, 63, 63
, 8,11, 9, 0, 70,80,0,1,0,14,0, 0, 0,1,100
,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1 },
{ "Catapult", -1
,{ "catapult.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 64, 64, IconCatapult
, 5, 0,9, 110,0,250, 900, 300, 0,1,1, 63, 63
, 8,11, 9, 0, 70,80,0,1,0,13,0, 0, 0,1,100
,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1 },
{ "Knight", -1
,{ "knight.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconKnight
,13, 0,4, 90,0, 90, 800, 100, 0,1,1, 42, 42
, 1, 6, 4, 4, 63, 8,4,1,1,29,0, 0, 0,1,100
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Ogre", -1
,{ "ogre.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconOgre
,13, 0,4, 90,0, 90, 800, 100, 0,1,1, 42, 42
, 1, 6, 4, 4, 63, 8,4,1,1,29,0, 0, 0,1,100
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Archer", -1
,{ "archer.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconArcher
,10, 0,5, 40,0, 70, 500, 50, 0,1,1, 33, 33
, 4, 7, 5, 0, 55, 3,6,1,0,15,0, 0, 0,1, 60
,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Troll Axethrower", -1
,{ "axethrower.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconAxethrower
,10, 0,5, 40,0, 70, 500, 50, 0,1,1, 36, 36
, 4, 7, 5, 0, 55, 3,6,1,0,16,0, 0, 0,1, 60
,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Mage", -1
,{ "mage.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconMage
, 8, 0,9, 60,1,120,1200, 0, 0,1,1, 33, 33
, 2,11, 9, 0, 70, 0,9,0,0, 0,0, 0, 0,1,100
,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,1 },
{ "Death Knight", -1
,{ "death knight.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconDeathKnight
, 8, 0,9, 60,1,120,1200, 0, 0,1,1, 39, 39
, 3,11, 9, 0, 70, 0,9,0,0,10,0, 0, 0,1,100
,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,1,1 },
{ "Paladin", UnitKnight
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconPaladin
,13, 0,5, 90,0, 90, 800, 100, 0,1,1, 42, 42
, 1, 7, 5, 4, 65, 8,4,1,1,29,0, 0, 0,1,110
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,1 },
{ "Ogre Mage", UnitOgre
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconOgreMage
,13, 0,5, 90,0, 90, 800, 100, 0,1,1, 42, 42
, 1, 7, 5, 4, 65, 8,4,1,1,29,0, 0, 0,1,110
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,1 },
{ "Dwarves", -1
,{ "dwarves.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 56, 56, IconDwarves
,11, 0,4, 40,0,200, 700, 250, 0,1,1, 32, 32
, 1, 4, 2, 0, 55, 4,2,1,0,29,0, 0, 0,5,100
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,1 },
{ "Goblin Sappers", -1
,{ "goblin sapper.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 56, 56, IconGoblinSappers
,11, 0,4, 40,0,200, 700, 250, 0,1,1, 37, 37
, 1, 4, 2, 0, 55, 4,2,1,0,29,0, 0, 0,5,100
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,1 },
{ "Peasant", UnitPeasant
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconPeasant
,10, 0,4, 30,0, 45, 400, 0, 0,1,1, 31, 31
, 1, 6, 4, 0, 50, 3,2,0,0,29,0, 0, 0,1, 30
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Peon", UnitPeon
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconPeon
,10, 0,4, 30,0, 45, 400, 0, 0,1,1, 31, 31
, 1, 6, 4, 0, 50, 3,2,0,0,29,0, 0, 0,1, 30
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Ranger", UnitArcher
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconRanger
,10, 0,6, 50,0, 70, 500, 50, 0,1,1, 33, 33
, 4, 9, 6, 0, 57, 3,6,1,0,15,0, 0, 0,1, 70
,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Berserker", UnitAxethrower
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconBerserker
,10, 0,6, 50,0, 70, 500, 50, 0,1,1, 36, 36
, 4, 9, 6, 0, 57, 3,6,1,0,16,0, 0, 0,1, 70
,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Alleria", UnitArcher
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconAlleria
,10, 0,9, 120,0, 70, 500, 50, 0,1,1, 33, 33
, 7, 7, 5, 5, 55,10,18,1,0,15,0, 0, 0,1, 60
,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Teron Gorefiend", UnitDeathKnight
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconTeronGorefiend
, 8, 0,9, 180,1,120,1200, 0, 0,1,1, 39, 39
, 4,11, 9, 2, 70, 0,16,0,0,10,0, 0, 0,1,100
,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,1,1 },
{ "Kurdan and Sky'ree", -1
,{ "gryphon rider.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 80, 80, IconKurdanAndSky_ree
,14, 0,9, 250,0,250,2500, 0, 0,1,1, 63, 63
, 5, 8, 6, 6, 65, 0,25,0,0, 1,1, 0, 0,1,150
,7,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Dentarg", UnitOgre
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconDentarg
,13, 0,6, 300,1, 90, 800, 100, 0,1,1, 42, 42
, 1, 6, 4, 8, 63,18,6,1,1,29,0, 0, 0,1,100
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,1 },
{ "Khadgar", UnitMage
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconKhadgar
, 8, 0,9, 120,1,120,1200, 0, 0,1,1, 33, 33
, 6,11, 9, 3, 70, 0,16,0,0, 0,0, 0, 0,1,100
,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,1 },
{ "Grom Hellscream", UnitGrunt
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconGromHellscream
,10, 0,5, 240,0, 60, 600, 0, 0,1,1, 31, 31
, 1, 6, 4, 8, 60,16,6,1,1,29,0, 0, 0,1, 50
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Oil tanker", -1
,{ "human tanker (empty).png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconTankerHuman
,10, 0,4, 90,0, 50, 400, 200, 0,1,1, 63, 63
, 1, 0, 0,10, 50, 0,0,0,0,29,2, 0, 10,4, 40
,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ "Oil tanker", -1
,{ "orc tanker (empty).png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconTankerOrc
,10, 0,4, 90,0, 50, 400, 200, 0,1,1, 63, 63
, 1, 0, 0,10, 50, 0,0,0,0,29,2, 0, 10,4, 40
,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ "Transport", -1
,{ "human transport.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconTransportHuman
,10, 0,4, 150,0, 70, 600, 200, 500,1,1, 63, 63
, 1, 0, 0, 0, 70, 0,0,0,1,29,2, 0, 15,6, 50
,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ "Transport", -1
,{ "orc transport.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconTransportOrc
,10, 0,4, 150,0, 70, 600, 200, 500,1,1, 63, 63
, 1, 0, 0, 0, 70, 0,0,0,1,29,2, 0, 15,6, 50
,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ "Elven Destroyer", -1
,{ "elven destroyer.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 80, 88, IconElvenDestroyer
,10, 0,8, 100,0, 90, 700, 350, 700,1,1, 63, 63
, 4,10, 8,10, 65,35,0,1,1,24,2, 0, 20,1,150
,7,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1 },
{ "Troll Destroyer", -1
,{ "troll destroyer.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 88, 88, IconTrollDestroyer
,10, 0,8, 100,0, 90, 700, 350, 700,1,1, 63, 63
, 4,10, 8,10, 65,35,0,1,1,24,2, 0, 20,1,150
,7,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1 },
{ "Battleship", -1
,{ "battleship.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 88, 88, IconBattleship
, 6, 0,8, 150,0,140,1000, 500,1000,1,1, 70, 70
, 6,10, 8,15, 63,130,0,1,1, 7,2, 0, 25,1,300
,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1 },
{ "Ogre Juggernaught", -1
,{ "juggernaught.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 88, 88, IconJuggernaught
, 6, 0,8, 150,0,140,1000, 500,1000,1,1, 70, 70
, 6,10, 8,15, 63,130,0,1,1, 7,2, 0, 25,1,300
,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1 },
{ "Nothing 22", -1
,{ NULL
,DEFAULT
,DEFAULT
,DEFAULT }
, 0, 0, 99
,99, 0,0, 0,0, 0, 0, 0, 0,0,0, 0, 0
, 0, 0, 0, 0, 0, 0,0,0,0, 0,0, 0, 0,0, 0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Deathwing", -1
,{ "dragon.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 88, 80, IconDeathwing
,14, 0,9, 800,0,250,2500, 0, 0,1,1, 71, 71
, 5, 8, 6,10, 65,10,25,0,0, 2,1, 0, 0,1,150
,7,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Nothing 24", -1
,{ NULL
,DEFAULT
,DEFAULT
,DEFAULT }
, 32, 32, 99
,99, 0,4, 60,0, 60, 400, 0, 0,1,1, 63, 63
, 1,20,10, 2, 40, 9,1,0,0,29,2, 0, 0,1, 0
,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ "Nothing 25", -1
,{ NULL
,DEFAULT
,DEFAULT
,DEFAULT }
, 32, 32, 99
,99, 0,4, 60,0, 60, 400, 0, 0,1,1, 63, 63
, 1,20,10, 2, 40, 9,1,0,0,29,2, 0, 0,1, 0
,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ "Gnomish Submarine", -1
,{ "gnomish submarine (summer,winter).png"
,DEFAULT
,"gnomish submarine (wasteland).png"
,"gnomish submarine (swamp).png" }
, 72, 72, IconGnomishSubmarine
, 7, 0,5, 60,0,100, 800, 150, 900,1,1, 63, 63
, 4, 7, 5, 0, 60,50,0,0,0,17,2, 0, 20,1,120
,2,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1 },
{ "Giant Turtle", -1
,{ "giant turtle (summer,winter).png"
,DEFAULT
,"giant turtle (wasteland).png"
,"giant turtle (swamp).png" }
, 72, 72, IconGiantTurtle
, 7, 0,5, 60,0,100, 800, 150, 900,1,1, 63, 63
, 4, 7, 5, 0, 60,50,0,0,0,18,2, 0, 20,1,120
,2,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1 },
{ "Gnomish Flying Machine",-1
,{ "gnomish flying machine.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 80, 80, IconGnomishFlyingMachine
,17, 0,9, 150,0, 65, 500, 100, 0,1,1, 63, 63
, 1,19,15, 2, 40, 0,0,0,0,29,1, 0, 0,2, 40
,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ "Goblin Zeppelin", -1
,{ "goblin zeppelin.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconGoblinZeppelin
,17, 0,9, 150,0, 65, 500, 100, 0,1,1, 63, 63
, 1,19,15, 2, 40, 0,0,0,0,29,1, 0, 0,2, 40
,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ "Gryphon Rider", UnitKurdanAndSky_ree
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 80, 80, IconGryphonRider
,14, 0,6, 100,0,250,2500, 0, 0,1,1, 63, 63
, 4, 8, 6, 5, 65, 0,16,0,0, 1,1, 0, 0,1,150
,7,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Dragon", UnitDeathwing
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 88, 80, IconDragon
,14, 0,6, 100,0,250,2500, 0, 0,1,1, 71, 71
, 4, 8, 6, 5, 65, 0,16,0,0, 2,1, 0, 0,1,150
,7,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Turalyon", UnitKnight
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconTuralyon
,13, 0,6, 180,0, 90, 800, 100, 0,1,1, 42, 42
, 1, 7, 5,10, 65,14,5,1,1,29,0, 0, 0,1,110
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,1 },
{ "Eye of Kilrogg", -1
,{ "eye of kilrogg.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 32, 32, IconEyeOfKilrogg
,42, 0,3, 100,0, 0, 0, 0, 0,1,1, 31, 31
, 1,20,10, 0, 0, 0,0,0,0,29,1, 3, 0,2, 0
,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ "Danath", UnitFootman
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconDanath
,10, 0,6, 220,0, 60, 600, 0, 0,1,1, 31, 31
, 1, 6, 4, 8, 60,15,8,1,1,29,0, 0, 0,1, 50
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Korgath Bladefist", UnitGrunt
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconKorgathBladefist
,10, 0,5, 240,0, 60, 600, 0, 0,1,1, 31, 31
, 1, 6, 4, 8, 60,16,6,1,1,29,0, 0, 0,1, 50
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Nothing 30", -1
,{ NULL
,DEFAULT
,DEFAULT
,DEFAULT }
, 0, 0, 99
,99, 0,0, 0,0, 0, 0, 0, 0,0,0, 0, 0
, 0, 0, 0, 0, 0, 0,0,0,0, 0,0, 0, 0,0, 0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Cho'gall", UnitOgre
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconCho_gall
,13, 0,5, 100,0,100,1100, 50, 0,1,1, 42, 42
, 1, 7, 5, 0, 65,10,5,1,1,29,0, 0, 0,1,120
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,1 },
{ "Lothar", UnitKnight
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconLothar
,13, 0,5, 90,0,100, 900, 100, 0,1,1, 42, 42
, 1, 7, 5, 4, 65, 8,4,1,1,29,0, 0, 0,1,120
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
{ "Gul'dan", UnitDeathKnight
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconGul_dan
, 8, 0,8, 40,1,120,1200, 0, 0,1,1, 33, 33
, 3,10, 8, 0, 70, 0,3,0,0,10,0, 0, 0,1,120
,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,1 },
{ "Uther Lightbringer", UnitKnight
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconUtherLightbringer
,13, 0,5, 90,0,100, 900, 100, 0,1,1, 42, 42
, 1, 7, 5, 4, 65, 8,4,1,1,29,0, 0, 0,1,120
,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,1 },
{ "Zuljin", UnitAxethrower
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconZuljin
,10, 0,6, 40,0, 70, 500, 50, 0,1,1, 36, 36
, 5, 8, 6, 0, 55, 3,6,1,0,16,0, 0, 0,1,120
,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
{ "Nothing 36", -1
,{ NULL
,DEFAULT
,DEFAULT
,DEFAULT }
, 0, 0, 99
,99, 0,0, 0,0, 0, 0, 0, 0,0,0, 0, 0
, 0, 0, 0, 0, 0, 0,0,0,0, 0,0, 0, 0,0, 0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Skeleton", -1
,{ "skeleton.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 56, 56, IconSkeleton
,99, 0,3, 40,0, 0, 0, 0, 0,1,1, 31, 31
, 1, 4, 2, 0, 55, 6,3,0,0,29,0,100, 0,1, 0
,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Daemon", -1
,{ "daemon.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, 37
,99, 0,5, 60,0, 0, 0, 0, 0,1,1, 31, 31
, 2, 7, 5, 2, 63, 9,1,0,0,27,1, 0, 0,1,100
,7,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0 },
{ "Critter", -1
,{ "critter (summer).png"
,"critter (winter).png"
,"critter (wasteland).png"
,"critter (swamp).png" }
, 32, 32, 115
, 3, 0,2, 5,0, 0, 0, 0, 0,1,1, 31, 31
, 1,20,10, 0, 37, 0,0,0,0,29,0, 0, 0,2, 1
,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
{ "Farm", -1
,{ "farm (summer).png"
,"farm (winter).png"
,"farm (wasteland).png"
,"farm (swamp).png" }
, 64, 64, IconFarm
, 0, 6,3, 400,0,100, 500, 250, 0,2,2, 63, 63
, 0, 0, 0,20, 20, 0,0,0,0, 0,0, 0, 45,0,100
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Pig Farm", -1
,{ "pig farm (summer).png"
,"pig farm (winter).png"
,"pig farm (wasteland).png"
,"pig farm (swamp).png" }
, 64, 64, IconPigFarm
, 0, 6,3, 400,0,100, 500, 250, 0,2,2, 63, 63
, 0, 0, 0,20, 20, 0,0,0,0, 0,0, 0, 45,0,100
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Barracks", -1
,{ "human barracks (summer).png"
,"human barracks (winter).png"
,DEFAULT
,"human barracks (swamp).png" }
, 96, 96, IconBarracksHuman
, 0, 6,3, 800,0,200, 700, 450, 0,3,3, 95, 95
, 0, 0, 0,20, 30, 0,0,0,0, 0,0, 0, 35,0,160
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Barracks", -1
,{ "orc barracks (summer).png"
,"orc barracks (winter).png"
,DEFAULT
,"orc barracks (swamp).png" }
, 96, 96, IconBarracksOrc
, 0, 6,3, 800,0,200, 700, 450, 0,3,3, 95, 95
, 0, 0, 0,20, 30, 0,0,0,0, 0,0, 0, 35,0,160
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Church", -1
,{ "church (summer).png"
,"church (winter).png"
,DEFAULT
,"church (swamp).png" }
, 96, 96, 62
, 0, 6,3, 700,0,175, 900, 500, 0,3,3, 95, 95
, 0, 0, 0,20, 15, 0,0,0,0, 0,0, 0, 35,0,240
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Altar of Storms", -1
,{ "altar of storms (summer).png"
,"altar of storms (winter).png"
,DEFAULT
,"altar of storms (swamp).png" }
, 96, 96, 63
, 0, 6,3, 700,0,175, 900, 500, 0,3,3, 95, 95
, 0, 0, 0,20, 15, 0,0,0,0, 0,0, 0, 35,0,240
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Watch Tower", -1
,{ "human scout tower (summer).png"
,"human scout tower (winter).png"
,DEFAULT
,"human scout tower (swamp).png" }
, 64, 64, 60
, 0, 6,9, 100,0, 60, 550, 200, 0,2,2, 63, 63
, 0, 0, 0,20, 55, 0,0,0,0,29,0, 0, 50,0, 95
,7,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Watch Tower", -1
,{ "orc scout tower (summer).png"
,"orc scout tower (winter).png"
,DEFAULT
,"orc scout tower (swamp).png" }
, 64, 64, 61
, 0, 6,9, 100,0, 60, 550, 200, 0,2,2, 63, 63
, 0, 0, 0,20, 55, 0,0,0,0,29,0, 0, 50,0, 95
,7,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Stables", -1
,{ "stables (summer).png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 96, 96, 56
, 0, 6,3, 500,0,150,1000, 300, 0,3,3, 95, 95
, 0, 0, 0,20, 15, 0,0,0,0, 0,0, 0, 15,0,210
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Ogre Mound", -1
,{ "ogre mound (summer).png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 96, 96, 57
, 0, 6,3, 500,0,150,1000, 300, 0,3,3, 95, 95
, 0, 0, 0,20, 15, 0,0,0,0, 0,0, 0, 15,0,210
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Gnomish Inventor", -1
,{ "gnomish inventor (summer).png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 96, 96, 58
, 0, 6,3, 500,0,150,1000, 400, 0,3,3, 95, 95
, 0, 0, 0,20, 15, 0,0,0,0, 0,0, 0, 20,0,230
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Goblin Alchemist", -1
,{ "goblin alchemist (summer).png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 96, 96, 59
, 0, 6,3, 500,0,150,1000, 400, 0,3,3, 95, 95
, 0, 0, 0,20, 15, 0,0,0,0, 0,0, 0, 20,0,230
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Gryphon Aviary", -1
,{ "gryphon aviary (summer).png"
,"gryphon aviary (winter).png"
,DEFAULT
,"gryphon aviary (swamp).png" }
, 96, 96, 72
, 0, 6,3, 500,0,150,1000, 400, 0,3,3, 95, 95
, 0, 0, 0,20, 15, 0,0,0,0, 0,0, 0, 20,0,280
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Dragon Roost", -1
,{ "dragon roost (summer).png"
,"dragon roost (winter).png"
,DEFAULT
,"dragon roost (swamp).png" }
, 96, 96, 73
, 0, 6,3, 500,0,150,1000, 400, 0,3,3, 95, 95
, 0, 0, 0,20, 15, 0,0,0,0, 0,0, 0, 20,0,280
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Shipyard", -1
,{ "human shipyard (summer).png"
,"human shipyard (winter).png"
,DEFAULT
,"human shipyard (swamp).png" }
, 96, 96, 48
, 0, 7,3, 1100,0,200, 800, 450, 0,3,3, 95, 95
, 0, 0, 0,20, 30, 0,0,0,0, 0,0, 0, 20,0,170
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0 },
{ "Shipyard", -1
,{ "orc shipyard (summer).png"
,"orc shipyard (winter).png"
,DEFAULT
,"orc shipyard (swamp).png" }
, 96, 96, 49
, 0, 8,3, 1100,0,200, 800, 450, 0,3,3, 95, 95
, 0, 0, 0,20, 30, 0,0,0,0, 0,0, 0, 20,0,170
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0 },
{ "Town Hall", -1
,{ "town hall (summer).png"
,"town hall (winter).png"
,DEFAULT
,"town hall (swamp).png" }
,128,128, IconTownHall
, 0, 6,4, 1200,0,255,1200, 800, 0,4,4,126,126
, 0, 0, 0,20, 35, 0,0,0,0, 0,0, 0, 45,0,200
,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Great Hall", -1
,{ "great hall (summer).png"
,"great hall (winter).png"
,DEFAULT
,"great hall (swamp).png" }
,128,128, 41
, 0, 6,4, 1200,0,255,1200, 800, 0,4,4,127,127
, 0, 0, 0,20, 35, 0,0,0,0, 0,0, 0, 45,0,200
,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Elven Lumber Mill", -1
,{ "elven lumber mill (summer).png"
,"elven lumber mill (winter).png"
,"elven lumber mill (wasteland).png"
,"elven lumber mill (swamp).png" }
, 96, 96, 44
, 0, 6,3, 600,0,150, 600, 450, 0,3,3, 95, 95
, 0, 0, 0,20, 25, 0,0,0,0, 0,0, 0, 15,0,150
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 },
{ "Troll Lumber Mill", -1
,{ "troll lumber mill (summer).png"
,"troll lumber mill (winter).png"
,"troll lumber mill (wasteland).png"
,"troll lumber mill (swamp).png" }
, 96, 96, 45
, 0, 6,3, 600,0,150, 600, 450, 0,3,3, 95, 95
, 0, 0, 0,20, 25, 0,0,0,0, 0,0, 0, 15,0,150
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 },
{ "Foundry", -1
,{ "human foundry (summer).png"
,"human foundry (winter).png"
,DEFAULT
,"human foundry (swamp).png" }
, 96, 96, 52
, 0,13,3, 750,0,175, 700, 400, 400,3,3, 95, 95
, 0, 0, 0,20, 15, 0,0,0,0, 0,0, 0, 20,0,200
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Foundry", -1
,{ "orc foundry (summer).png"
,"orc foundry (winter).png"
,DEFAULT
,"orc foundry (swamp).png" }
, 96, 96, 53
, 0,14,3, 750,0,175, 700, 400, 400,3,3, 95, 95
, 0, 0, 0,20, 15, 0,0,0,0, 0,0, 0, 20,0,200
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Mage Tower", -1
,{ "mage tower (summer).png"
,"mage tower (winter).png"
,DEFAULT
,"mage tower (swamp).png" }
, 96, 96, 64
, 0, 6,3, 500,0,125,1000, 200, 0,3,3, 95, 95
, 0, 0, 0,20, 35, 0,0,0,0, 0,0, 0, 20,0,240
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Temple of the Damned",-1
,{ "temple of the damned (summer).png"
,"temple of the damned (winter).png"
,DEFAULT
,"temple of the damned (swamp).png" }
, 96, 96, 65
, 0, 6,3, 500,0,125,1000, 200, 0,3,3, 95, 95
, 0, 0, 0,20, 35, 0,0,0,0, 0,0, 0, 20,0,240
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Blacksmith", -1
,{ "human blacksmith (summer).png"
,"human blacksmith (winter).png"
,DEFAULT
,"human blacksmith (swamp).png" }
, 96, 96, 46
, 0, 6,3, 775,0,200, 800, 450, 100,3,3, 95, 95
, 0, 0, 0,20, 15, 0,0,0,0, 0,0, 0, 20,0,170
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Blacksmith", -1
,{ "orc blacksmith (summer).png"
,"orc blacksmith (winter).png"
,DEFAULT
,"orc blacksmith (swamp).png" }
, 96, 96, 47
, 0, 6,3, 775,0,200, 800, 450, 100,3,3, 95, 95
, 0, 0, 0,20, 15, 0,0,0,0, 0,0, 0, 20,0,170
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Refinery", -1
,{ "human refinery (summer).png"
,"human refinery (winter).png"
,DEFAULT
,"human refinery (swamp).png" }
, 96, 96, IconRefineryHuman
, 0,11,3, 600,0,225, 800, 350, 200,3,3, 95, 95
, 0, 0, 0,20, 25, 0,0,0,0, 0,0, 0, 20,0,200
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0 },
{ "Refinery", -1
,{ "orc refinery (summer).png"
,"orc refinery (winter).png"
,DEFAULT
,"orc refinery (swamp).png" }
, 96, 96, IconRefineryOrc
, 0,12,3, 600,0,225, 800, 350, 200,3,3, 95, 95
, 0, 0, 0,20, 25, 0,0,0,0, 0,0, 0, 20,0,200
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0 },
{ "Oil Platform", -1
,{ "human oil well (summer).png"
,"human oil well (winter).png"
,"human oil well (wasteland).png"
,"human oil well (swamp).png" }
, 96, 96, IconOilPlatformHuman
, 0, 9,3, 650,0,200, 700, 450, 0,3,3, 95, 95
, 0, 0, 0,20, 20, 0,0,0,0, 0,2, 0, 20,0,160
,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Oil Platform", -1
,{ "orc oil well (summer).png"
,"orc oil well (winter).png"
,"orc oil well (wasteland).png"
,"orc oil well (swamp).png" }
, 96, 96, IconOilPlatformOrc
, 0,10,3, 650,0,200, 700, 450, 0,3,3, 95, 95
, 0, 0, 0,20, 20, 0,0,0,0, 0,2, 0, 20,0,160
,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Keep", -1
,{ "keep (summer).png"
,"keep (winter).png"
,DEFAULT
,"keep (swamp).png" }
,128,128, IconKeep
, 0, 6,6, 1400,0,200,2000,1000, 200,4,4,127,127
, 0, 0, 0,20, 37, 0,0,0,0, 0,0, 0, 40,0,600
,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Stronghold", -1
,{ "stronghold (summer).png"
,"stronghold (winter).png"
,DEFAULT
,"stronghold (swamp).png" }
,128,128, IconStronghold
, 0, 6,6, 1400,0,200,2000,1000, 200,4,4,127,127
, 0, 0, 0,20, 37, 0,0,0,0, 0,0, 0, 40,0,600
,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Castle", -1
,{ "castle (summer).png"
,"castle (winter).png"
,DEFAULT
,"castle (swamp).png" }
,128,128, IconCastle
, 0, 6,9, 1600,0,200,2500,1200, 500,4,4,127,127
, 0, 0, 0,20, 40, 0,0,0,0, 0,0, 0, 50,0,1500
,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Fortress", -1
,{ "fortress (summer).png"
,"fortress (winter).png"
,DEFAULT
,"fortress (swamp).png" }
,128,128, IconFortress
, 0, 6,9, 1600,0,200,2500,1200, 500,4,4,127,127
, 0, 0, 0,20, 40, 0,0,0,0, 0,0, 0, 50,0,1500
,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Gold Mine", -1
,{ "gold mine (summer).png"
,"gold mine (winter).png"
,"gold mine (wasteland).png"
,"gold mine (swamp).png" }
, 96, 96, IconGoldMine
, 0, 6,3,25500,0,150, 0, 0, 0,3,3, 95, 95
, 0, 0, 0,20, 0, 0,0,0,0, 0,0, 0, 0,0, 0
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0 },
{ "Oil Patch", -1
,{ "oil patch (summer).png"
,DEFAULT
,"oil patch (wasteland).png"
,"oil patch (swamp).png" }
, 96, 96, IconOilPatch
, 0, 0,0, 0,0, 0, 0, 0, 0,3,3, 95, 95
, 0, 0, 0, 0, 0, 0,0,0,0, 0,2, 0, 0,0, 0
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 },
{ "Start Location", -1
,{ NULL
,DEFAULT
,DEFAULT
,DEFAULT }
, 32, 32, 99
, 0, 0,0, 0,0, 0, 0, 0, 0,1,1, 31, 31
, 0, 0, 0, 0, 0, 0,0,0,0, 0,0, 0, 0,0, 0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Start Location", -1
,{ NULL
,DEFAULT
,DEFAULT
,DEFAULT }
, 32, 32, 99
, 0, 0,0, 0,0, 0, 0, 0, 0,1,1, 31, 31
, 0, 0, 0, 0, 0, 0,0,0,0, 0,0, 0, 0,0, 0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Guard Tower", -1
,{ "human guard tower (summer).png"
,"human guard tower (winter).png"
,DEFAULT
,"human guard tower (swamp).png" }
, 64, 64, IconGuardTowerHuman
, 0, 6,9, 130,0,140, 500, 150, 0,2,2, 63, 63
, 6, 6, 6,20, 40, 4,12,0,0,15,0, 0, 50,0,200
,7,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
{ "Guard Tower", -1
,{ "orc guard tower (summer).png"
,"orc guard tower (winter).png"
,DEFAULT
,"orc guard tower (swamp).png" }
, 64, 64, IconGuardTowerOrc
, 0, 6,9, 130,0,140, 500, 150, 0,2,2, 63, 63
, 6, 6, 6,20, 40, 4,12,0,0,15,0, 0, 50,0,200
,7,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
{ "Cannon Tower", -1
,{ "human cannon tower (summer).png"
,"human cannon tower (winter).png"
,DEFAULT
,"human cannon tower (swamp).png" }
, 64, 64, IconCannonTowerHuman
, 0, 6,9, 160,0,190,1000, 300, 0,2,2, 63, 63
, 7, 7, 7,20, 40,50,0,0,0,24,0, 0, 50,0,250
,3,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
{ "Cannon Tower", -1
,{ "orc cannon tower (summer).png"
,"orc cannon tower (winter).png"
,DEFAULT
,"orc cannon tower (swamp).png" }
, 64, 64, IconCannonTowerOrc
, 0, 6,9, 160,0,190,1000, 300, 0,2,2, 63, 63
, 7, 7, 7,20, 40,50,0,0,0,24,0, 0, 50,0,250
,3,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0 },
{ "Circle of Power", -1
,{ "circle of power.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 64, 64, IconCircleOfPower
, 0, 0,0, 0,0, 0, 0, 0, 0,2,2, 63, 63
, 0, 0, 0, 0, 0, 0,0,0,0, 0,0, 0, 0,0, 0
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Dark Portal", -1
,{ "dark portal (summer).png"
,"dark portal (winter).png"
,"dark portal (wasteland).png"
,"dark portal (swamp).png" }
,128,128, IconDarkPortal
, 0, 0,0, 5000,0, 0, 0, 0, 0,4,4,127,127
, 0, 0, 0, 0, 0, 0,0,0,0, 0,0, 0, 0,0, 0
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Runestone", -1
,{ "runestone (summer,wasteland).png"
,"runestone (winter).png"
,DEFAULT
,"runestone (swamp).png" }
, 64, 64, IconRunestone
, 0, 6,4, 5000,0,175, 900, 500, 0,2,2, 63, 63
, 0, 0, 0,20, 15, 0,0,0,0, 0,0, 0, 35,0,150
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Wall H - not yet build",-1
,{ "wall (summer).png"
,"wall (winter).png"
,"wall (wasteland).png"
,DEFAULT }
, 32, 32, 92
, 0,15,1, 40,0, 30, 20, 10, 0,1,1, 31, 31
, 0, 0, 0, 0, 0, 0,0,0,0, 0,0, 0, 45,0, 1
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Wall O - not yet build",UnitWallHuman
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 32, 32, 93
, 0,15,1, 40,0, 30, 20, 10, 0,1,1, 31, 31
, 0, 0, 0, 0, 0, 0,0,0,0, 0,0, 0, 45,0, 1
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Dead Body", -1
,{ "corpses.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, 0
, 0, 0,1, 255,0, 0, 0, 0, 0,1,1, 71, 71
, 0, 0, 0, 0, 0, 0,0,0,0, 0,0, 0, 0,0, 0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "1x1 Destroyed Place",-1
,{ "small destroyed site (summer).png"
,"small destroyed site (winter).png"
,"small destroyed site (wasteland).png"
,"small destroyed site (swamp).png" }
, 32, 32, 99
, 0, 0,2, 255,0, 0, 0, 0, 0,1,1, 31, 31
, 0, 0, 0, 0, 0, 0,0,0,0, 0,0, 0, 0,0, 0
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "2x2 Destroyed Place",-1
,{ "destroyed site (summer).png"
,"destroyed site (winter).png"
,"destroyed site (wasteland).png"
,"destroyed site (swamp).png" }
, 64, 64, 99
, 0, 0,2, 255,0, 0, 0, 0, 0,2,2, 63, 63
, 0, 0, 0, 0, 0, 0,0,0,0, 0,0, 0, 0,0, 0
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "3x3 Destroyed Place",Unit2x2DestroyedPlace
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
, 96, 96, 99
, 0, 0,3, 255,0, 0, 0, 0, 0,3,3, 95, 95
, 0, 0, 0, 0, 0, 0,0,0,0, 0,0, 0, 0,0, 0
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "4x4 Destroyed Place",Unit2x2DestroyedPlace
,{ DEFAULT
,DEFAULT
,DEFAULT
,DEFAULT }
,128,128, 99
, 0, 0,3, 255,0, 0, 0, 0, 0,4,4,127,127
, 0, 0, 0, 0, 0, 0,0,0,0, 0,0, 0, 0,0, 0
,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ "Peon", -1
,{ "peon with gold.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconPeon
,10, 0,4, 30,0, 45, 400, 0, 0,1,1, 31, 31
, 1, 6, 4, 0, 50, 3,2,0,0,29,0, 0, 0,3, 30
,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Peasant", -1
,{ "peasant with gold.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconPeasant
,10, 0,4, 30,0, 45, 400, 0, 0,1,1, 31, 31
, 1, 6, 4, 0, 50, 3,2,0,0,29,0, 0, 0,3, 30
,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Peon", -1
,{ "peon with wood.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconPeon
,10, 0,4, 30,0, 45, 400, 0, 0,1,1, 31, 31
, 1, 6, 4, 0, 50, 3,2,0,0,29,0, 0, 0,3, 30
,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Peasant", -1
,{ "peasant with wood.png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconPeasant
,10, 0,4, 30,0, 45, 400, 0, 0,1,1, 31, 31
, 1, 6, 4, 0, 50, 3,2,0,0,29,0, 0, 0,3, 30
,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ "Oil tanker", -1
,{ "human tanker (full).png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconTankerHuman
,10, 0,4, 90,0, 50, 400, 200, 0,1,1, 63, 63
, 1, 0, 0,10, 50, 0,0,0,0,29,2, 0, 10,4, 40
,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ "Oil tanker", -1
,{ "orc tanker (full).png"
,DEFAULT
,DEFAULT
,DEFAULT }
, 72, 72, IconTankerOrc
,10, 0,4, 90,0, 50, 400, 200, 0,1,1, 63, 63
, 1, 0, 0,10, 50, 0,0,0,0,29,2, 0, 10,4, 40
,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
};
void DumpUdtaAsScm(void)
{
int i;
printf("\n;;\tMissile names\n");
for( i=0; i<sizeof(MissileNames)/sizeof(*MissileNames); ++i ) {
printf("(define %s %d)\n",MissileNames[i],i);
}
printf("\n;;\tUnit-type names\n");
for( i=0; i<sizeof(UnitTypeNames)/sizeof(*UnitTypeNames); ++i ) {
printf("(define %s %d)\n",UnitTypeNames[i],i);
}
for( i=0; i<sizeof(UnitTypes)/sizeof(*UnitTypes); ++i ) {
printf("\n(unit-type %s\n",UnitTypeNames[i]);
printf(" \"%s\"\n",UnitTypes[i].Name);
printf("\t\t\t\t;;; Graphics\n");
if( (int)UnitTypes[i].SameSprite==-1 ) {
printf(" #(");
if( UnitTypes[i].File[0] ) {
printf("\"%s\"\n",UnitTypes[i].File[0]);
} else {
printf("nil\n");
}
if( UnitTypes[i].File[1] ) {
printf(" \"%s\"\n",UnitTypes[i].File[1]);
} else {
printf(" nil\n");
}
if( UnitTypes[i].File[2] ) {
printf(" \"%s\"\n",UnitTypes[i].File[2]);
} else {
printf(" nil\n");
}
if( UnitTypes[i].File[3] ) {
printf(" \"%s\")\n",UnitTypes[i].File[3]);
} else {
printf(" nil)\n");
}
} else if( (int)UnitTypes[i].SameSprite<=200 ) {
printf(" %s\n",UnitTypeNames[(int)UnitTypes[i].SameSprite]);
} else {
printf(" '%s\n",UnitTypes[i].SameSprite);
}
printf(" %3d %3d\t\t\t;;; graphic size\n"
,UnitTypes[i].Width,UnitTypes[i].Height);
if( UnitTypes[i].Icon<=(char*)199 ) {
printf(" %d",(int)UnitTypes[i].Icon);
} else {
printf(" '%s",UnitTypes[i].Icon);
}
printf("\t\t\t;;; Icon\n");
printf(" %d\t\t\t\t;;; Speed\n",UnitTypes[i].Speed);
printf(" %d\t\t\t\t;;; Overlap frame\n",UnitTypes[i].OverlapFrame);
printf(" %d\t\t\t\t;;; Sight-range\n",UnitTypes[i].SightRange);
printf(" %d\t\t\t\t;;; Hit-points\n",UnitTypes[i].HitPoints);
printf(" %d\t\t\t\t;;; Magic\n",UnitTypes[i].Magic);
printf(" %d\t\t\t\t;;; Build-time\n",UnitTypes[i].BuildTime);
printf(" %4d %4d %4d\t\t;;; Costs\n"
,UnitTypes[i].GoldCost,UnitTypes[i].WoodCost,UnitTypes[i].OilCost);
printf(" %d %d\t\t\t\t;;; Tile size\n"
,UnitTypes[i].TileWidth,UnitTypes[i].TileHeight);
printf(" %3d %3d\t\t\t;;; Box size\n"
,UnitTypes[i].BoxWidth,UnitTypes[i].BoxHeight);
printf(" %2d %2d %2d\t\t\t;;; Ranges\n"
,UnitTypes[i].AttackRange
,UnitTypes[i].ReactRangeComputer
,UnitTypes[i].ReactRangeHuman);
printf(" %d\t\t\t\t;;; Armor\n",UnitTypes[i].Armor);
printf(" %d\t\t\t\t;;; Priority\n",UnitTypes[i].Priority);
printf(" %d\t\t\t\t;;; Basic-damage\n",UnitTypes[i].BasicDamage);
printf(" %d\t\t\t\t;;; Piercing-damage\n",UnitTypes[i].PiercingDamage);
printf(" %d\t\t\t\t;;; Weapon-upgradeable\n"
,UnitTypes[i].WeaponsUpgradable);
printf(" %d\t\t\t\t;;; Armor-upgradeable\n"
,UnitTypes[i].ArmorUpgradable);
printf(" '%s\t\t\t;;; Missile\n"
,MissileNames[UnitTypes[i].MissileWeapon]);
switch( UnitTypes[i].UnitType ) {
case UnitTypeLand:
printf(" 'land\n");
break;
case UnitTypeFly:
printf(" 'fly\n");
break;
case UnitTypeNaval:
printf(" 'naval\n");
break;
}
printf(" %d\t\t\t\t;;; Decay-rate\n",UnitTypes[i].DecayRate);
printf(" %d\t\t\t\t;;; Annoy computer factor\n"
,UnitTypes[i].AnnoyComputerFactor);
printf(" ");
switch( UnitTypes[i].MouseAction ) {
case MouseActionAttack:
printf("'attack");
break;
case MouseActionMove:
printf("'move");
break;
case MouseActionHarvest:
printf("'harvest");
break;
case MouseActionHaulOil:
printf("'haul-oil");
break;
case MouseActionDemolish:
printf("'demolish");
break;
case MouseActionSail:
printf("'sail");
break;
}
printf("\t\t\t;;; Right mouse button\n");
printf(" %d\t\t\t\t;;; Points\n",UnitTypes[i].Points);
if( UnitTypes[i].CanTarget ) {
printf(" ");
if( UnitTypes[i].CanTarget&1 ) {
printf("'can-target-land ");
}
if( UnitTypes[i].CanTarget&2 ) {
printf("'can-target-sea ");
}
if( UnitTypes[i].CanTarget&4 ) {
printf("'can-target-air ");
}
if( UnitTypes[i].CanTarget&~7 ) {
printf("'can-target-other ");
}
printf("\n");
}
printf("\t\t\t\t;;; Flags\n");
if( UnitTypes[i].LandUnit ) {
printf(" 'land-unit\n");
}
if( UnitTypes[i].AirUnit ) {
printf(" 'air-unit\n");
}
if( UnitTypes[i].SeaUnit ) {
printf(" 'sea-unit\n");
}
if( UnitTypes[i].ExplodeWhenKilled ) {
printf(" 'explode-when-killed\n");
}
if( UnitTypes[i].Critter ) {
printf(" 'critter\n");
}
if( UnitTypes[i].Building ) {
printf(" 'building\n");
}
if( UnitTypes[i].Submarine ) {
printf(" 'submarine\n");
}
if( UnitTypes[i].CanSeeSubmarine ) {
printf(" 'can-see-submarine\n");
}
if( UnitTypes[i].CowerPeon ) {
printf(" 'cower-peon\n");
}
if( UnitTypes[i].Tanker ) {
printf(" 'tanker\n");
}
if( UnitTypes[i].Transporter ) {
printf(" 'transporter\n");
}
if( UnitTypes[i].GivesOil ) {
printf(" 'gives-oil\n");
}
if( UnitTypes[i].StoresGold ) {
printf(" 'stores-gold\n");
}
if( UnitTypes[i].Vanishes ) {
printf(" 'vanishes\n");
}
if( UnitTypes[i].GroundAttack ) {
printf(" 'can-groundattack\n");
}
if( UnitTypes[i].IsUndead ) {
printf(" 'isundead\n");
}
if( UnitTypes[i].ShoreBuilding ) {
printf(" 'shore-building\n");
}
if( UnitTypes[i].CanCastSpell ) {
printf(" 'can-cast-spell\n");
}
if( UnitTypes[i].StoresWood ) {
printf(" 'stores-wood\n");
}
if( UnitTypes[i].CanAttack ) {
printf(" 'can-attack\n");
}
if( UnitTypes[i].Tower ) {
printf(" 'tower\n");
}
if( UnitTypes[i].OilPatch ) {
printf(" 'oil-patch\n");
}
if( UnitTypes[i].GoldMine ) {
printf(" 'gold-mine\n");
}
if( UnitTypes[i].Hero ) {
printf(" 'hero\n");
}
if( UnitTypes[i].StoresOil ) {
printf(" 'stores-oil\n");
}
if( UnitTypes[i].Volatile ) {
printf(" 'volatile\n");
}
if( UnitTypes[i].CowerMage ) {
printf(" 'cower-mage\n");
}
if( UnitTypes[i].Organic ) {
printf(" 'organic\n");
}
if( UnitTypes[i].SelectableByRectangle ) {
printf(" 'selectable-by-rectangle\n");
}
printf(" )\n");
}
}
int main(int argc,char** argv)
{
int i;
int v;
for( i=0; i<110; ++i ) { // overlap frames
v=PudReadWord(stdin);
UnitTypes[i].OverlapFrame=v;
}
for( i=0; i<508; ++i ) { // skip obselete data
v=PudReadWord(stdin);
}
for( i=0; i<110; ++i ) { // sight range
v=PudReadLong(stdin);
UnitTypes[i].SightRange=v;
}
for( i=0; i<110; ++i ) { // hit points
v=PudReadWord(stdin);
UnitTypes[i].HitPoints=v;
}
for( i=0; i<110; ++i ) { // Flag if unit is magic
v=PudReadByte(stdin);
UnitTypes[i].Magic=v;
}
for( i=0; i<110; ++i ) { // Build time * 6 = one second
v=PudReadByte(stdin);
UnitTypes[i].BuildTime=v;
}
for( i=0; i<110; ++i ) { // Gold cost / 10
v=PudReadByte(stdin);
UnitTypes[i].GoldCost=v*10;
}
for( i=0; i<110; ++i ) { // Lumber cost / 10
v=PudReadByte(stdin);
UnitTypes[i].WoodCost=v*10;
}
for( i=0; i<110; ++i ) { // Oil cost / 10
v=PudReadByte(stdin);
UnitTypes[i].OilCost=v*10;
}
for( i=0; i<110; ++i ) { // Unit size in tiles
v=PudReadWord(stdin);
UnitTypes[i].TileWidth=v;
v=PudReadWord(stdin);
UnitTypes[i].TileHeight=v;
}
for( i=0; i<110; ++i ) { // Box size in pixel
v=PudReadWord(stdin);
UnitTypes[i].BoxWidth=v;
v=PudReadWord(stdin);
UnitTypes[i].BoxHeight=v;
}
for( i=0; i<110; ++i ) { // Attack range
v=PudReadByte(stdin);
UnitTypes[i].AttackRange=v;
}
for( i=0; i<110; ++i ) { // React range
v=PudReadByte(stdin);
UnitTypes[i].ReactRangeComputer=v;
}
for( i=0; i<110; ++i ) { // React range
v=PudReadByte(stdin);
UnitTypes[i].ReactRangeHuman=v;
}
for( i=0; i<110; ++i ) { // Armor
v=PudReadByte(stdin);
UnitTypes[i].Armor=v;
}
for( i=0; i<110; ++i ) { // Selectable via rectangle
v=PudReadByte(stdin);
UnitTypes[i].SelectableByRectangle=v!=0;
}
for( i=0; i<110; ++i ) { // Priority
v=PudReadByte(stdin);
UnitTypes[i].Priority=v;
}
for( i=0; i<110; ++i ) { // Basic damage
v=PudReadByte(stdin);
UnitTypes[i].BasicDamage=v;
}
for( i=0; i<110; ++i ) { // Piercing damage
v=PudReadByte(stdin);
UnitTypes[i].PiercingDamage=v;
}
for( i=0; i<110; ++i ) { // Weapons upgradable
v=PudReadByte(stdin);
UnitTypes[i].WeaponsUpgradable=v;
}
for( i=0; i<110; ++i ) { // Armor upgradable
v=PudReadByte(stdin);
UnitTypes[i].ArmorUpgradable=v;
}
for( i=0; i<110; ++i ) { // Missile Weapon
v=PudReadByte(stdin);
UnitTypes[i].MissileWeapon=v;
}
for( i=0; i<110; ++i ) { // Unit type
v=PudReadByte(stdin);
UnitTypes[i].UnitType=v;
}
for( i=0; i<110; ++i ) { // Decay rate * 6 = secs
v=PudReadByte(stdin);
UnitTypes[i].DecayRate=v;
}
for( i=0; i<110; ++i ) { // Annoy computer factor
v=PudReadByte(stdin);
UnitTypes[i].AnnoyComputerFactor=v;
}
for( i=0; i<58; ++i ) { // 2nd mouse button action
v=PudReadByte(stdin);
UnitTypes[i].MouseAction=v;
}
for( ; i<110; ++i ) { // 2nd mouse button action
UnitTypes[i].MouseAction=0;
}
for( i=0; i<110; ++i ) { // Point value for killing unit
v=PudReadWord(stdin);
UnitTypes[i].Points=v;
}
for( i=0; i<110; ++i ) { // Can target (1 land, 2 sea, 4 air)
v=PudReadByte(stdin);
UnitTypes[i].CanTarget=v;
}
for( i=0; i<110; ++i ) { // Flags
v=PudReadLong(stdin);
// UnitTypes[i].Flags=v;
#define BIT(b,v) (((v>>b))&1)
UnitTypes[i].LandUnit=BIT(0,v);
UnitTypes[i].AirUnit=BIT(1,v);
UnitTypes[i].ExplodeWhenKilled=BIT(2,v);
UnitTypes[i].SeaUnit=BIT(3,v);
UnitTypes[i].Critter=BIT(4,v);
UnitTypes[i].Building=BIT(5,v);
UnitTypes[i].Submarine=BIT(6,v);
UnitTypes[i].CanSeeSubmarine=BIT(7,v);
UnitTypes[i].CowerPeon=BIT(8,v);
UnitTypes[i].Tanker=BIT(9,v);
UnitTypes[i].Transporter=BIT(10,v);
UnitTypes[i].GivesOil=BIT(11,v);
UnitTypes[i].StoresGold=BIT(12,v);
UnitTypes[i].Vanishes=BIT(13,v);
UnitTypes[i].GroundAttack=BIT(14,v);
UnitTypes[i].IsUndead=BIT(15,v);
UnitTypes[i].ShoreBuilding=BIT(16,v);
UnitTypes[i].CanCastSpell=BIT(17,v);
UnitTypes[i].StoresWood=BIT(18,v);
UnitTypes[i].CanAttack=BIT(19,v);
UnitTypes[i].Tower=BIT(20,v);
UnitTypes[i].OilPatch=BIT(21,v);
UnitTypes[i].GoldMine=BIT(22,v);
UnitTypes[i].Hero=BIT(23,v);
UnitTypes[i].StoresOil=BIT(24,v);
UnitTypes[i].Volatile=BIT(25,v);
UnitTypes[i].CowerMage=BIT(26,v);
UnitTypes[i].Organic=BIT(27,v);
if( BIT(28,v) ) printf("Unused bit 28 used in %d\n",i);
if( BIT(29,v) ) printf("Unused bit 29 used in %d\n",i);
if( BIT(30,v) ) printf("Unused bit 30 used in %d\n",i);
if( BIT(31,v) ) printf("Unused bit 31 used in %d\n",i);
}
if( 0 )
for( i=0; i<sizeof(UnitTypes)/sizeof(*UnitTypes); ++i ) {
printf("Unit: %d %x %s\n",i,i,UnitTypes[i].Name);
printf("\tOverlapFrame\t%d\n",UnitTypes[i].OverlapFrame);
printf("\tSightRange\t%d\n",UnitTypes[i].SightRange);
printf("\tHitPoints\t%d\n",UnitTypes[i].HitPoints);
printf("\tMagic\t\t%d\n",UnitTypes[i].Magic);
printf("\tBuildTime\t%d\n",UnitTypes[i].BuildTime);
printf("\tGoldCost\t%d",UnitTypes[i].GoldCost);
printf("\tWoodCost\t%d",UnitTypes[i].WoodCost);
printf("\tOilCost\t%d\n",UnitTypes[i].OilCost);
printf("\tTileWidth\t%d\t",UnitTypes[i].TileWidth);
printf("\tTileHeight\t%d\n",UnitTypes[i].TileHeight);
printf("\tBoxWidth\t%d\t",UnitTypes[i].BoxWidth);
printf("\tBoxHeight\t%d\n",UnitTypes[i].BoxHeight);
printf("\tAttackRange\t%d\n",UnitTypes[i].AttackRange);
printf("\tReactRangeComputer\t%d\n",UnitTypes[i].ReactRangeComputer);
printf("\tReactRangeHuman\t%d\n",UnitTypes[i].ReactRangeHuman);
printf("\tArmor\t\t%d\n",UnitTypes[i].Armor);
printf("\tSelectableByRectangle\t%d\n",UnitTypes[i].SelectableByRectangle);
printf("\tPriority\t%d\n",UnitTypes[i].Priority);
printf("\tBasicDamage\t%d\n",UnitTypes[i].BasicDamage);
printf("\tPiercingDamage\t%d\n",UnitTypes[i].PiercingDamage);
printf("\tWeaponsUpgradable\t%d\n",UnitTypes[i].WeaponsUpgradable);
printf("\tArmorUpgradable\t%d\n",UnitTypes[i].ArmorUpgradable);
printf("\tMissileWeapon\t%d\n",UnitTypes[i].MissileWeapon);
printf("\tUnitType\t%d\n",UnitTypes[i].UnitType);
printf("\tDecayRate\t%d\n",UnitTypes[i].DecayRate);
printf("\tAnnoyComputerFactor\t%d\n",UnitTypes[i].AnnoyComputerFactor);
printf("\tMouseAction\t%d\n",UnitTypes[i].MouseAction);
printf("\tPoints\t\t%d\n",UnitTypes[i].Points);
printf("\tCanTarget\t%d\n",UnitTypes[i].CanTarget);
// printf("\tFlags\t\t%X\n",UnitTypes[i].Flags);
printf("\tLandUnit\t%d\n",UnitTypes[i].LandUnit);
printf("\tAirUnit\t%d\n",UnitTypes[i].AirUnit);
printf("\tExplodeWhenKilled\t%d\n",UnitTypes[i].ExplodeWhenKilled);
printf("\tSeaUnit\t%d\n",UnitTypes[i].SeaUnit);
printf("\tCritter\t%d\n",UnitTypes[i].Critter);
printf("\tBuilding\t%d\n",UnitTypes[i].Building);
printf("\tSubmarine\t%d\n",UnitTypes[i].Submarine);
printf("\tCanSeeSubmarine\t%d\n",UnitTypes[i].CanSeeSubmarine);
printf("\tCowerPeon\t%d\n",UnitTypes[i].CowerPeon);
printf("\tTanker\t%d\n",UnitTypes[i].Tanker);
printf("\tTransporter\t%d\n",UnitTypes[i].Transporter);
printf("\tGivesOil\t%d\n",UnitTypes[i].GivesOil);
printf("\tStoresGold\t%d\n",UnitTypes[i].StoresGold);
printf("\tVanishes\t%d\n",UnitTypes[i].Vanishes);
printf("\tGroundAttack\t%d\n",UnitTypes[i].GroundAttack);
printf("\tIsUndead\t%d\n",UnitTypes[i].IsUndead);
printf("\tShoreBuilding\t%d\n",UnitTypes[i].ShoreBuilding);
printf("\tCanCastSpell\t%d\n",UnitTypes[i].CanCastSpell);
printf("\tStoresWood\t%d\n",UnitTypes[i].StoresWood);
printf("\tCanAttack\t%d\n",UnitTypes[i].CanAttack);
printf("\tTower\t%d\n",UnitTypes[i].Tower);
printf("\tOilPatch\t%d\n",UnitTypes[i].OilPatch);
printf("\tMine\t%d\n",UnitTypes[i].GoldMine);
printf("\tHero\t%d\n",UnitTypes[i].Hero);
printf("\tStoresOil\t%d\n",UnitTypes[i].StoresOil);
printf("\tVolatile\t%d\n",UnitTypes[i].Volatile);
printf("\tCowerMage\t%d\n",UnitTypes[i].CowerMage);
printf("\tOrganic\t%d\n",UnitTypes[i].Organic);
}
if( 0 )
for( i=0; i<sizeof(UnitTypes)/sizeof(*UnitTypes); ++i ) {
printf("{ \"%s\",",UnitTypes[i].Name);
if( strlen(UnitTypes[i].Name)<11 ) {
printf("\t\t");
} else if( strlen(UnitTypes[i].Name)<19 ) {
printf("\t");
}
if( (int)UnitTypes[i].SameSprite==-1 ) {
printf("-1\n");
} else {
printf("%s\n",UnitTypes[i].SameSprite);
}
if( UnitTypes[i].File[0] ) {
printf(" ,{ \"%s\"\n",UnitTypes[i].File[0]);
} else {
printf(" ,{ DEFAULT\n");
}
if( UnitTypes[i].File[1] ) {
printf(" ,\"%s\"\n",UnitTypes[i].File[1]);
} else {
printf(" ,DEFAULT\n");
}
if( UnitTypes[i].File[2] ) {
printf(" ,\"%s\"\n",UnitTypes[i].File[2]);
} else {
printf(" ,DEFAULT\n");
}
if( UnitTypes[i].File[3] ) {
printf(" ,\"%s\" }\n",UnitTypes[i].File[3]);
} else {
printf(" ,DEFAULT }\n");
}
printf("\t,%3d,%3d, ",UnitTypes[i].Width,UnitTypes[i].Height);
if( UnitTypes[i].Icon<=(char*)199 ) {
printf("%d\n",(int)UnitTypes[i].Icon);
} else {
printf("%s\n",UnitTypes[i].Icon);
}
#if 0
printf("%3d,%3d,%3d\n",UnitTypes[i].TileWidth*32
,UnitTypes[i].TileHeight*32,99);
#endif
printf("\t,%2d,%2d,%1d,%5d,%1d,%3d"
,UnitTypes[i].Speed
,UnitTypes[i].OverlapFrame
,UnitTypes[i].SightRange
,UnitTypes[i].HitPoints
,UnitTypes[i].Magic
,UnitTypes[i].BuildTime);
printf(",%4d,%4d,%4d"
,UnitTypes[i].GoldCost
,UnitTypes[i].WoodCost
,UnitTypes[i].OilCost);
printf(",%d,%d,%3d,%3d\n"
,UnitTypes[i].TileWidth
,UnitTypes[i].TileHeight
,UnitTypes[i].BoxWidth
,UnitTypes[i].BoxHeight);
printf("\t,%2d,%2d,%2d"
,UnitTypes[i].AttackRange
,UnitTypes[i].ReactRangeComputer
,UnitTypes[i].ReactRangeHuman);
printf(",%2d,%3d,%2d,%d,%d,%d"
,UnitTypes[i].Armor
,UnitTypes[i].Priority
,UnitTypes[i].BasicDamage
,UnitTypes[i].PiercingDamage
,UnitTypes[i].WeaponsUpgradable
,UnitTypes[i].ArmorUpgradable);
printf(",%2d,%d,%3d,%3d,%d,%3d\n"
,UnitTypes[i].MissileWeapon
,UnitTypes[i].UnitType
,UnitTypes[i].DecayRate
,UnitTypes[i].AnnoyComputerFactor
,UnitTypes[i].MouseAction
,UnitTypes[i].Points);
printf("\t,%d,%d,%d,%d,%d,%d,%d,%d"
,UnitTypes[i].CanTarget
,UnitTypes[i].LandUnit
,UnitTypes[i].AirUnit
,UnitTypes[i].SeaUnit
,UnitTypes[i].ExplodeWhenKilled
,UnitTypes[i].Critter
,UnitTypes[i].Building
,UnitTypes[i].Submarine);
printf(",%d,%d,%d,%d,%d,%d,%d,%d"
,UnitTypes[i].CanSeeSubmarine
,UnitTypes[i].CowerPeon
,UnitTypes[i].Tanker
,UnitTypes[i].Transporter
,UnitTypes[i].GivesOil
,UnitTypes[i].StoresGold
,UnitTypes[i].Vanishes
,UnitTypes[i].GroundAttack);
printf(",%d,%d,%d,%d,%d,%d,%d,%d"
,UnitTypes[i].IsUndead
,UnitTypes[i].ShoreBuilding
,UnitTypes[i].CanCastSpell
,UnitTypes[i].StoresWood
,UnitTypes[i].CanAttack
,UnitTypes[i].Tower
,UnitTypes[i].OilPatch
,UnitTypes[i].GoldMine);
printf(",%d,%d,%d,%d,%d,%d"
,UnitTypes[i].Hero
,UnitTypes[i].StoresOil
,UnitTypes[i].Volatile
,UnitTypes[i].CowerMage
,UnitTypes[i].Organic
,UnitTypes[i].SelectableByRectangle);
printf(" },\n");
}
if( 0 )
DumpUdtaAsScm();
}