mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-20 20:23:03 +02:00
Na początek.
This commit is contained in:
parent
ac4ce5af49
commit
01e84b9e40
337
CAmbarCendamo.cpp
Normal file
337
CAmbarCendamo.cpp
Normal file
@ -0,0 +1,337 @@
|
||||
#include "stdafx.h"
|
||||
#include "CAmbarCendamo.h"
|
||||
#include "CSemiDefHandler.h"
|
||||
#include <fstream>
|
||||
#include <set>
|
||||
CAmbarCendamo::CAmbarCendamo (const char * tie)
|
||||
{
|
||||
is = new std::ifstream();
|
||||
is -> open(tie,std::ios::binary);
|
||||
is->seekg(0,std::ios::end); // na koniec
|
||||
andame = is->tellg(); // read length
|
||||
is->seekg(0,std::ios::beg); // wracamy na poczatek
|
||||
bufor = new unsigned char[andame]; // allocate memory
|
||||
is->read((char*)bufor, andame); // read map file to buffer
|
||||
}
|
||||
CAmbarCendamo::~CAmbarCendamo ()
|
||||
{// free memory
|
||||
for (int ii=0;ii<map.width;ii++)
|
||||
delete map.terrain[ii] ;
|
||||
delete map.terrain;
|
||||
delete bufor;
|
||||
}
|
||||
void CAmbarCendamo::teceDef()
|
||||
{
|
||||
for (int i=0; i<map.defy.size(); i++)
|
||||
{
|
||||
std::ofstream * of = new std::ofstream(map.defy[i].name.c_str());
|
||||
for (int j=0;j<46;j++)
|
||||
{
|
||||
(*of) << map.defy[i].bytes[j]<<std::endl;
|
||||
}
|
||||
delete of;
|
||||
}
|
||||
}
|
||||
void CAmbarCendamo::deh3m()
|
||||
{
|
||||
map.version = (Eformat)bufor[0]; //wersja mapy
|
||||
map.areAnyPLayers = bufor[4];
|
||||
map.height = map.width = bufor[5]; // wymiary mapy
|
||||
map.twoLevel = bufor[9]; //czy sa lochy
|
||||
map.terrain = new TerrainTile*[map.width]; // allocate memory
|
||||
for (int ii=0;ii<map.width;ii++)
|
||||
map.terrain[ii] = new TerrainTile[map.height]; // allocate memory
|
||||
if (map.twoLevel)
|
||||
{
|
||||
map.undergroungTerrain = new TerrainTile*[map.width]; // allocate memory
|
||||
for (int ii=0;ii<map.width;ii++)
|
||||
map.undergroungTerrain[ii] = new TerrainTile[map.height]; // allocate memory
|
||||
}
|
||||
int length = bufor[10]; //name length
|
||||
int i=14, pom;
|
||||
while (i-14<length) //read name
|
||||
map.name+=bufor[i++];
|
||||
length = bufor[i] + bufor[i+1]*256; //description length
|
||||
i+=4;
|
||||
for (pom=0;pom<length;pom++)
|
||||
map.description+=bufor[i++];
|
||||
map.difficulty = bufor[i++]; // reading map difficulty
|
||||
map.levelLimit = bufor[i++]; // hero level limit
|
||||
for (pom=0;pom<8;pom++)
|
||||
{
|
||||
map.players[pom].canHumanPlay = bufor[i++];
|
||||
map.players[pom].canComputerPlay = bufor[i++];
|
||||
if (!(map.players[pom].canHumanPlay || map.players[pom].canComputerPlay))
|
||||
{
|
||||
i+=13;
|
||||
continue;
|
||||
}
|
||||
|
||||
map.players[pom].AITactic = bufor[i++];
|
||||
if (bufor[i++])
|
||||
{
|
||||
map.players[pom].allowedFactions = 0;
|
||||
map.players[pom].allowedFactions += bufor[i++];
|
||||
map.players[pom].allowedFactions += (bufor[i++])*256;
|
||||
}
|
||||
else
|
||||
{
|
||||
map.players[pom].allowedFactions = 511;
|
||||
i+=2;
|
||||
}
|
||||
map.players[pom].isFactionRandom = bufor[i++];
|
||||
i+=2; //unknown bytes
|
||||
int unknown = bufor[i++];
|
||||
if (unknown == 255)
|
||||
{
|
||||
map.players[pom].mainHeroPortrait = 255;
|
||||
i+=5;
|
||||
continue;
|
||||
}
|
||||
map.players[pom].mainHeroPortrait = bufor[i++];
|
||||
int nameLength = bufor[i++];
|
||||
i+=3;
|
||||
for (int pp=0;pp<nameLength;pp++)
|
||||
map.players[pom].mainHeroName+=bufor[i++];
|
||||
i++; ////unknown byte
|
||||
int heroCount = bufor[i++];
|
||||
i+=3;
|
||||
for (int pp=0;pp<heroCount;pp++)
|
||||
{
|
||||
SheroName vv;
|
||||
vv.heroID=bufor[i++];
|
||||
int hnl = bufor[i++];
|
||||
i+=3;
|
||||
for (int zz=0;zz<hnl;zz++)
|
||||
{
|
||||
vv.heroName+=bufor[i++];
|
||||
}
|
||||
map.players[pom].heroesNames.push_back(vv);
|
||||
}
|
||||
}
|
||||
map.victoryCondition = (EvictoryConditions)bufor[i++];
|
||||
if (map.victoryCondition != winStandard) //specific victory conditions
|
||||
{
|
||||
int nr;
|
||||
switch (map.victoryCondition) //read victory conditions
|
||||
{
|
||||
case artifact:
|
||||
{
|
||||
map.vicConDetails = new VicCon0();
|
||||
((VicCon0*)map.vicConDetails)->ArtifactID = bufor[i+2];
|
||||
nr=2;
|
||||
break;
|
||||
}
|
||||
case gatherTroop:
|
||||
{
|
||||
map.vicConDetails = new VicCon1();
|
||||
int temp1 = bufor[i+2];
|
||||
int temp2 = bufor[i+3];
|
||||
((VicCon1*)map.vicConDetails)->monsterID = bufor[i+2];
|
||||
((VicCon1*)map.vicConDetails)->neededQuantity=readNormalNr(i+4);
|
||||
nr=6;
|
||||
break;
|
||||
}
|
||||
case gatherResource:
|
||||
{
|
||||
map.vicConDetails = new VicCon2();
|
||||
((VicCon2*)map.vicConDetails)->resourceID = bufor[i+2];
|
||||
((VicCon2*)map.vicConDetails)->neededQuantity=readNormalNr(i+3);
|
||||
nr=5;
|
||||
break;
|
||||
}
|
||||
case buildCity:
|
||||
{
|
||||
map.vicConDetails = new VicCon3();
|
||||
((VicCon3*)map.vicConDetails)->posOfCity.x = bufor[i+2];
|
||||
((VicCon3*)map.vicConDetails)->posOfCity.y = bufor[i+3];
|
||||
((VicCon3*)map.vicConDetails)->posOfCity.z = bufor[i+4];
|
||||
((VicCon3*)map.vicConDetails)->councilNeededLevel = bufor[i+5];
|
||||
((VicCon3*)map.vicConDetails)->fortNeededLevel = bufor[i+6];
|
||||
nr=5;
|
||||
break;
|
||||
}
|
||||
case buildGrail:
|
||||
{
|
||||
map.vicConDetails = new VicCon4();
|
||||
if (bufor[i+4]>2)
|
||||
((VicCon4*)map.vicConDetails)->anyLocation = true;
|
||||
else
|
||||
{
|
||||
((VicCon4*)map.vicConDetails)->whereBuildGrail.x = bufor[i+2];
|
||||
((VicCon4*)map.vicConDetails)->whereBuildGrail.y = bufor[i+3];
|
||||
((VicCon4*)map.vicConDetails)->whereBuildGrail.z = bufor[i+4];
|
||||
}
|
||||
nr=3;
|
||||
break;
|
||||
}
|
||||
case beatHero:
|
||||
{
|
||||
map.vicConDetails = new VicCon5();
|
||||
((VicCon5*)map.vicConDetails)->locationOfHero.x = bufor[i+2];
|
||||
((VicCon5*)map.vicConDetails)->locationOfHero.y = bufor[i+3];
|
||||
((VicCon5*)map.vicConDetails)->locationOfHero.z = bufor[i+4];
|
||||
nr=3;
|
||||
break;
|
||||
}
|
||||
case captureCity:
|
||||
{
|
||||
map.vicConDetails = new VicCon6();
|
||||
((VicCon6*)map.vicConDetails)->locationOfTown.x = bufor[i+2];
|
||||
((VicCon6*)map.vicConDetails)->locationOfTown.y = bufor[i+3];
|
||||
((VicCon6*)map.vicConDetails)->locationOfTown.z = bufor[i+4];
|
||||
nr=3;
|
||||
break;
|
||||
}
|
||||
case beatMonster:
|
||||
{
|
||||
map.vicConDetails = new VicCon7();
|
||||
((VicCon7*)map.vicConDetails)->locationOfMonster.x = bufor[i+2];
|
||||
((VicCon7*)map.vicConDetails)->locationOfMonster.y = bufor[i+3];
|
||||
((VicCon7*)map.vicConDetails)->locationOfMonster.z = bufor[i+4];
|
||||
nr=3;
|
||||
break;
|
||||
}
|
||||
case takeDwellings:
|
||||
{
|
||||
map.vicConDetails = new CspecificVictoryConidtions();
|
||||
nr=3;
|
||||
break;
|
||||
}
|
||||
case takeMines:
|
||||
{
|
||||
map.vicConDetails = new CspecificVictoryConidtions();
|
||||
nr=3;
|
||||
break;
|
||||
}
|
||||
case transportItem:
|
||||
{
|
||||
map.vicConDetails = new VicCona();
|
||||
((VicCona*)map.vicConDetails)->artifactID = bufor[i+2];
|
||||
((VicCona*)map.vicConDetails)->destinationPlace.x = bufor[i+3];
|
||||
((VicCona*)map.vicConDetails)->destinationPlace.y = bufor[i+4];
|
||||
((VicCona*)map.vicConDetails)->destinationPlace.z = bufor[i+5];
|
||||
nr=3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
map.vicConDetails->allowNormalVictory = bufor[i++];
|
||||
map.vicConDetails->appliesToAI = bufor[i++];
|
||||
i+=nr;
|
||||
}
|
||||
map.lossCondition.typeOfLossCon = (ElossCon)bufor[i++];
|
||||
switch (map.lossCondition.typeOfLossCon) //read loss conditions
|
||||
{
|
||||
case lossCastle:
|
||||
{
|
||||
map.lossCondition.castlePos.x=bufor[i++];
|
||||
map.lossCondition.castlePos.y=bufor[i++];
|
||||
map.lossCondition.castlePos.z=bufor[i++];
|
||||
}
|
||||
case lossHero:
|
||||
{
|
||||
map.lossCondition.heroPos.x=bufor[i++];
|
||||
map.lossCondition.heroPos.y=bufor[i++];
|
||||
map.lossCondition.heroPos.z=bufor[i++];
|
||||
}
|
||||
case timeExpires:
|
||||
{
|
||||
map.lossCondition.timeLimit = readNormalNr(i++,2);
|
||||
}
|
||||
}
|
||||
i+=88;
|
||||
int rumNr = readNormalNr(i,4);i+=4;
|
||||
for (int it=0;it<rumNr;it++)
|
||||
{
|
||||
Rumor ourRumor;
|
||||
int nameL = readNormalNr(i,4);i+=4; //read length of name of rumor
|
||||
for (int zz=0; zz<nameL; zz++)
|
||||
ourRumor.name+=bufor[i++];
|
||||
nameL = readNormalNr(i,4);i+=4; //read length of rumor
|
||||
for (int zz=0; zz<nameL; zz++)
|
||||
ourRumor.text+=bufor[i++];
|
||||
map.rumors.push_back(ourRumor); //add to our list
|
||||
}
|
||||
i+=156;
|
||||
for (int c=0; c<map.width; c++) // reading terrain
|
||||
{
|
||||
for (int z=0; z<map.height; z++)
|
||||
{
|
||||
map.terrain[z][c].tertype = (EterrainType)(bufor[i++]);
|
||||
map.terrain[z][c].terview = bufor[i++];
|
||||
map.terrain[z][c].nuine = (Eriver)bufor[i++];
|
||||
map.terrain[z][c].rivDir = bufor[i++];
|
||||
map.terrain[z][c].malle = (Eroad)bufor[i++];
|
||||
map.terrain[z][c].roadDir = bufor[i++];
|
||||
map.terrain[z][c].siodmyTajemniczyBajt = bufor[i++];
|
||||
}
|
||||
}
|
||||
if (map.twoLevel) // read underground terrain
|
||||
{
|
||||
for (int z=0; z<map.width; z++) // reading terrain
|
||||
{
|
||||
for (int c=0; c<map.height; c++)
|
||||
{
|
||||
map.undergroungTerrain[z][c].tertype = (EterrainType)(bufor[i++]);
|
||||
map.undergroungTerrain[z][c].terview = bufor[i++];
|
||||
map.undergroungTerrain[z][c].nuine = (Eriver)bufor[i++];
|
||||
map.undergroungTerrain[z][c].rivDir = bufor[i++];
|
||||
map.undergroungTerrain[z][c].malle = (Eroad)bufor[i++];
|
||||
map.undergroungTerrain[z][c].roadDir = bufor[i++];
|
||||
map.undergroungTerrain[z][c].siodmyTajemniczyBajt = bufor[i++];
|
||||
}
|
||||
}
|
||||
}
|
||||
int defAmount = bufor[i]; // liczba defow
|
||||
i+=8;
|
||||
for (int idd = 0 ; idd<defAmount; idd++) // reading defs
|
||||
{
|
||||
DefInfo vinya; // info about new def
|
||||
while (1) // read name
|
||||
{
|
||||
if (bufor[i] == '.' && bufor[i+1] == 'd' && bufor[i+2] == 'e' && bufor[i+3] == 'f')
|
||||
{
|
||||
vinya.name += ".def";
|
||||
i+=4;
|
||||
break;
|
||||
}
|
||||
vinya.name += bufor[i++];
|
||||
}
|
||||
for (int v=0; v<46; v++) // read info
|
||||
{
|
||||
vinya.bytes[v] = bufor[i++];
|
||||
}
|
||||
map.defy.push_back(vinya); // add this def to the vector
|
||||
teceDef();
|
||||
}
|
||||
//todo: read events
|
||||
}
|
||||
int CAmbarCendamo::readNormalNr (int pos, int bytCon)
|
||||
{
|
||||
int ret=0;
|
||||
int amp=1;
|
||||
for (int i=0; i<bytCon; i++)
|
||||
{
|
||||
ret+=bufor[pos+i]*amp;
|
||||
amp*=256;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
void CAmbarCendamo::loadDefs()
|
||||
{
|
||||
std::set<int> loadedTypes;
|
||||
for (int i=0; i<map.width; i++)
|
||||
{
|
||||
for (int j=0; j<map.width; j++)
|
||||
{
|
||||
if (loadedTypes.find(map.terrain[i][j].tertype)==loadedTypes.end())
|
||||
{
|
||||
CSemiDefHandler *sdh = new CSemiDefHandler();
|
||||
sdh->openDef(("H3sprite.lod\\"+sdh->nameFromType(map.terrain[i][j].tertype)).c_str());
|
||||
loadedTypes.insert(map.terrain[i][j].tertype);
|
||||
defs.push_back(sdh);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
29
CAmbarCendamo.h
Normal file
29
CAmbarCendamo.h
Normal file
@ -0,0 +1,29 @@
|
||||
#ifndef AMBARCENDD
|
||||
#define AMBARCENDD
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "global.h"
|
||||
#include "SDL.h"
|
||||
#include "map.h"
|
||||
#include "CSemiDefHandler.h"
|
||||
|
||||
class CAmbarCendamo
|
||||
{
|
||||
public:
|
||||
/////////////////zmienne skladowe
|
||||
Mapa map;
|
||||
std::ifstream * is; // stream used to read map file
|
||||
int andame; // length of map file
|
||||
unsigned char * bufor; // here we store map bytecode
|
||||
std::vector<CSemiDefHandler*> defs;
|
||||
/////////////////funkcje skladowe
|
||||
CAmbarCendamo (const char * tie); // c-tor; tie is the path of the map file
|
||||
~CAmbarCendamo (); // d-tor
|
||||
int readNormalNr (int pos, int bytCon=4); //read number from bytCon bytes starting from pos position in buffer
|
||||
void teceDef (); // create files with info about defs
|
||||
void deh3m(); // decode file, results are stored in map
|
||||
void loadDefs();
|
||||
};
|
||||
#endif //AMBARCENDD
|
139
CSemiDefHandler.cpp
Normal file
139
CSemiDefHandler.cpp
Normal file
@ -0,0 +1,139 @@
|
||||
#include "stdafx.h"
|
||||
#include "CSemiDefHandler.h"
|
||||
#include <fstream>
|
||||
extern SDL_Surface * ekran;
|
||||
std::string CSemiDefHandler::nameFromType (EterrainType typ)
|
||||
{
|
||||
switch(typ)
|
||||
{
|
||||
case dirt:
|
||||
{
|
||||
return std::string("DIRTTL.DEF");
|
||||
break;
|
||||
}
|
||||
case sand:
|
||||
{
|
||||
return std::string("SANDTL.DEF");
|
||||
break;
|
||||
}
|
||||
case grass:
|
||||
{
|
||||
return std::string("GRASTL.DEF");
|
||||
break;
|
||||
}
|
||||
case snow:
|
||||
{
|
||||
return std::string("SNOWTL.DEF");
|
||||
break;
|
||||
}
|
||||
case swamp:
|
||||
{
|
||||
return std::string("SWMPTL.DEF");
|
||||
break;
|
||||
}
|
||||
case rough:
|
||||
{
|
||||
return std::string("ROUGTL.DEF");
|
||||
break;
|
||||
}
|
||||
case subterranean:
|
||||
{
|
||||
return std::string("SUBBTL.DEF");
|
||||
break;
|
||||
}
|
||||
case lava:
|
||||
{
|
||||
return std::string("LAVATL.DEF");
|
||||
break;
|
||||
}
|
||||
case water:
|
||||
{
|
||||
return std::string("WATRTL.DEF");
|
||||
break;
|
||||
}
|
||||
case rock:
|
||||
{
|
||||
return std::string("ROCKTL.DEF");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
void CSemiDefHandler::openDef(const char *name)
|
||||
{
|
||||
std::ifstream * is = new std::ifstream();
|
||||
is -> open(name,std::ios::binary);
|
||||
is->seekg(0,std::ios::end); // na koniec
|
||||
int andame = is->tellg(); // read length
|
||||
is->seekg(0,std::ios::beg); // wracamy na poczatek
|
||||
buforD = new unsigned char[andame]; // allocate memory
|
||||
is->read((char*)buforD, andame); // read map file to buffer
|
||||
defName = name;
|
||||
int gdzie = defName.find_last_of("\\");
|
||||
defName = defName.substr(gdzie+1, gdzie-defName.length());
|
||||
delete is;
|
||||
|
||||
readFileList();
|
||||
loadImages();
|
||||
|
||||
}
|
||||
void CSemiDefHandler::readFileList()
|
||||
{
|
||||
howManyImgs = buforD[788];
|
||||
int i = 800;
|
||||
for (int pom=0;pom<howManyImgs;pom++)
|
||||
{
|
||||
std::string temp;
|
||||
while (buforD[i]!=0)
|
||||
{
|
||||
temp+=buforD[i++];
|
||||
}
|
||||
i++;;
|
||||
if (temp!="")
|
||||
{
|
||||
temp = temp.substr(0,temp.length()-4) + ".BMP";
|
||||
namesOfImgs.push_back(temp);
|
||||
}
|
||||
else pom--;
|
||||
}
|
||||
}
|
||||
void CSemiDefHandler::loadImages()
|
||||
{
|
||||
for (int i=0; i<namesOfImgs.size(); i++)
|
||||
{
|
||||
openImg(("H3sprite.lod\\_"+defName+"\\"+namesOfImgs[i]).c_str());
|
||||
}
|
||||
}
|
||||
void SDL_DisplayBitmap(const char *file, SDL_Surface *ekran, int x, int y)
|
||||
{
|
||||
SDL_Surface *image;
|
||||
SDL_Rect dest;
|
||||
|
||||
image = SDL_LoadBMP(file);
|
||||
if ( image == NULL )
|
||||
{
|
||||
fprintf(stderr, "Nie mo¿na wczytaæ %s: %s\n", file, SDL_GetError());
|
||||
return;
|
||||
}
|
||||
dest.x = x;
|
||||
dest.y = y;
|
||||
dest.w = image->w;
|
||||
dest.h = image->h;
|
||||
SDL_BlitSurface(image, NULL, ekran, &dest);
|
||||
SDL_UpdateRects(ekran, 1, &dest);
|
||||
SDL_FreeSurface(image);
|
||||
}
|
||||
void CSemiDefHandler::openImg(const char *name)
|
||||
{
|
||||
SDL_Surface *image;
|
||||
image=IMG_Load(name);
|
||||
//SDL_DisplayBitmap(name,image, 0,0);
|
||||
if(!image)
|
||||
{
|
||||
printf("IMG_Load: %s\n", IMG_GetError());
|
||||
// handle error
|
||||
}
|
||||
Cimage vinya;
|
||||
vinya.bitmap=image;
|
||||
vinya.imName = name;
|
||||
ourImages.push_back(vinya);
|
||||
}
|
28
CSemiDefHandler.h
Normal file
28
CSemiDefHandler.h
Normal file
@ -0,0 +1,28 @@
|
||||
#ifndef SEMIDEF_H
|
||||
#define SEMIDEF_H
|
||||
#include "global.h"
|
||||
#include <string>
|
||||
#include "SDL.h"
|
||||
#include "SDL_image.h"
|
||||
#include <vector>
|
||||
struct Cimage
|
||||
{
|
||||
std::string imName; //name without extension
|
||||
SDL_Surface * bitmap;
|
||||
};
|
||||
class CSemiDefHandler
|
||||
{
|
||||
public:
|
||||
int howManyImgs;
|
||||
std::string defName;
|
||||
std::vector<Cimage> ourImages;
|
||||
std::vector<std::string> namesOfImgs;
|
||||
unsigned char * buforD;
|
||||
|
||||
static std::string nameFromType(EterrainType typ);
|
||||
void openImg(const char *name);
|
||||
void openDef(const char *name);
|
||||
void readFileList();
|
||||
void loadImages();
|
||||
};
|
||||
#endif // SEMIDEF_H
|
1231
SDL_rotozoom.cpp
Normal file
1231
SDL_rotozoom.cpp
Normal file
File diff suppressed because it is too large
Load Diff
117
SDL_rotozoom.h
Normal file
117
SDL_rotozoom.h
Normal file
@ -0,0 +1,117 @@
|
||||
|
||||
/*
|
||||
|
||||
SDL_rotozoom - rotozoomer
|
||||
|
||||
LGPL (c) A. Schiffler
|
||||
|
||||
*/
|
||||
|
||||
#ifndef _SDL_rotozoom_h
|
||||
#define _SDL_rotozoom_h
|
||||
|
||||
#include <math.h>
|
||||
|
||||
/* Set up for C function definitions, even when using C++ */
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.141592654
|
||||
#endif
|
||||
|
||||
#include "SDL.h"
|
||||
|
||||
/* ---- Defines */
|
||||
|
||||
#define SMOOTHING_OFF 0
|
||||
#define SMOOTHING_ON 1
|
||||
|
||||
/* ---- Structures */
|
||||
|
||||
typedef struct tColorRGBA {
|
||||
Uint8 r;
|
||||
Uint8 g;
|
||||
Uint8 b;
|
||||
Uint8 a;
|
||||
} tColorRGBA;
|
||||
|
||||
typedef struct tColorY {
|
||||
Uint8 y;
|
||||
} tColorY;
|
||||
|
||||
|
||||
/* ---- Prototypes */
|
||||
|
||||
#ifdef WIN32
|
||||
#ifdef BUILD_DLL
|
||||
#define DLLINTERFACE __declspec(dllexport)
|
||||
#else
|
||||
#define DLLINTERFACE __declspec(dllimport)
|
||||
#endif
|
||||
#else
|
||||
#define DLLINTERFACE
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
rotozoomSurface()
|
||||
|
||||
Rotates and zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
|
||||
'angle' is the rotation in degrees. 'zoom' a scaling factor. If 'smooth' is 1
|
||||
then the destination 32bit surface is anti-aliased. If the surface is not 8bit
|
||||
or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
|
||||
|
||||
*/
|
||||
|
||||
SDL_Surface *rotozoomSurface(SDL_Surface * src, double angle, double zoom, int smooth);
|
||||
|
||||
DLLINTERFACE SDL_Surface *rotozoomSurfaceXY
|
||||
(SDL_Surface * src, double angle, double zoomx, double zoomy, int smooth);
|
||||
|
||||
/* Returns the size of the target surface for a rotozoomSurface() call */
|
||||
|
||||
DLLINTERFACE void rotozoomSurfaceSize(int width, int height, double angle, double zoom, int *dstwidth,
|
||||
int *dstheight);
|
||||
|
||||
DLLINTERFACE void rotozoomSurfaceSizeXY
|
||||
(int width, int height, double angle, double zoomx, double zoomy,
|
||||
int *dstwidth, int *dstheight);
|
||||
|
||||
/*
|
||||
|
||||
zoomSurface()
|
||||
|
||||
Zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
|
||||
'zoomx' and 'zoomy' are scaling factors for width and height. If 'smooth' is 1
|
||||
then the destination 32bit surface is anti-aliased. If the surface is not 8bit
|
||||
or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
|
||||
|
||||
*/
|
||||
|
||||
DLLINTERFACE SDL_Surface *zoomSurface(SDL_Surface * src, double zoomx, double zoomy, int smooth);
|
||||
|
||||
/* Returns the size of the target surface for a zoomSurface() call */
|
||||
|
||||
DLLINTERFACE void zoomSurfaceSize(int width, int height, double zoomx, double zoomy, int *dstwidth, int *dstheight);
|
||||
|
||||
|
||||
/*
|
||||
shrinkSurface()
|
||||
|
||||
Shrinks a 32bit or 8bit 'src' surface ti a newly created 'dst' surface.
|
||||
'factorx' and 'factory' are the shrinking ratios (i.e. 2=1/2 the size,
|
||||
3=1/3 the size, etc.) The destination surface is antialiased by averaging
|
||||
the source box RGBA or Y information. If the surface is not 8bit
|
||||
or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
|
||||
*/
|
||||
|
||||
DLLINTERFACE SDL_Surface *shrinkSurface(SDL_Surface * src, int factorx, int factory);
|
||||
|
||||
/* Ends C function definitions when using C++ */
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _SDL_rotozoom_h */
|
12
global.h
Normal file
12
global.h
Normal file
@ -0,0 +1,12 @@
|
||||
#ifndef GLOBAL_H
|
||||
#define GLOBAL_H
|
||||
enum EterrainType {dirt, sand, grass, snow, swamp, rough, subterranean, lava, water, rock};
|
||||
enum Eriver {clearRiver=1, icyRiver, muddyRiver, lavaRiver};
|
||||
enum Eroad {dirtRoad=1, gravelRoad, cobblestoneRoad};
|
||||
enum Eformat { WoG=0x33, AB=0x15, RoE=0x0e, SoD=0x1c};
|
||||
enum EvictoryConditions {artifact, gatherTroop, gatherResource, buildCity, buildGrail, beatHero,
|
||||
captureCity, beatMonster, takeDwellings, takeMines, transportItem, winStandard=255};
|
||||
enum ElossCon {lossCastle, lossHero, timeExpires, lossStandard=255};
|
||||
|
||||
#define DEFBYPASS
|
||||
#endif //GLOBAL_H
|
47
inde.cpp
Normal file
47
inde.cpp
Normal file
@ -0,0 +1,47 @@
|
||||
/* zpipe.c: example of proper use of zlib's inflate() and deflate()
|
||||
Not copyrighted -- provided to the public domain
|
||||
Version 1.4 11 December 2005 Mark Adler */
|
||||
|
||||
/* Version history:
|
||||
1.0 30 Oct 2004 First version
|
||||
1.1 8 Nov 2004 Add void casting for unused return values
|
||||
Use switch statement for inflate() return values
|
||||
1.2 9 Nov 2004 Add assertions to document zlib guarantees
|
||||
1.3 6 Apr 2005 Remove incorrect assertion in inf()
|
||||
1.4 11 Dec 2005 Add hack to avoid MSDOS end-of-line conversions
|
||||
Avoid some compiler warnings for input and output buffers
|
||||
*/
|
||||
|
||||
|
||||
#include "stdafx.h"
|
||||
/* compress or decompress from stdin to stdout */
|
||||
//int main(int argc, char **argv)
|
||||
//{
|
||||
// int ret;
|
||||
//
|
||||
// /* avoid end-of-line conversions */
|
||||
// SET_BINARY_MODE(stdin);
|
||||
// SET_BINARY_MODE(stdout);
|
||||
//
|
||||
// /* do compression if no arguments */
|
||||
// if (argc == 1) {
|
||||
// ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION);
|
||||
// if (ret != Z_OK)
|
||||
// zerr(ret);
|
||||
// return ret;
|
||||
// }
|
||||
//
|
||||
// /* do decompression if -d specified */
|
||||
// else if (argc == 2 && strcmp(argv[1], "-d") == 0) {
|
||||
// ret = inf(stdin, stdout);
|
||||
// if (ret != Z_OK)
|
||||
// zerr(ret);
|
||||
// return ret;
|
||||
// }
|
||||
//
|
||||
// /* otherwise, report usage */
|
||||
// else {
|
||||
// fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr);
|
||||
// return 1;
|
||||
// }
|
||||
//}
|
147
map.h
Normal file
147
map.h
Normal file
@ -0,0 +1,147 @@
|
||||
#ifndef MAPD
|
||||
#define MAPD
|
||||
struct TimeEvent
|
||||
{
|
||||
//bajty wydarzeñ (59 + |teksty|)
|
||||
//4 bajty na d³ugoœæ nazwy zdarzenia
|
||||
//nazwa zdarzenia (bajty dodatkowe)
|
||||
//4 bajty na d³ugoœæ wiadomoœci
|
||||
//wiadomoϾ (bajty dodatkowe)
|
||||
//4 bajty na zwiêkszenie siê ilosci drewna (zapis normalny) lub ff,ff,ff,ff - iloœæ drewna do odebrania (maksymalna iloœæ drewna, któr¹ mo¿na daæ/odebraæ to 32767)
|
||||
//4 bajty na zwiêkszenie siê ilosci rtêci (zapis normalny) lub ff,ff,ff,ff - iloœæ rtêci do odebrania (maksymalna iloœæ rtêci, któr¹ mo¿na daæ/odebraæ to 32767)
|
||||
//4 bajty na zwiêkszenie siê ilosci rudy (zapis normalny) lub ff,ff,ff,ff - iloœæ rudy do odebrania (maksymalna iloœæ rudy, któr¹ mo¿na daæ/odebraæ to 32767)
|
||||
//4 bajty na zwiêkszenie siê ilosci siarki (zapis normalny) lub ff,ff,ff,ff - iloœæ siarki do odebrania (maksymalna iloœæ siarki, któr¹ mo¿na daæ/odebraæ to 32767)
|
||||
//4 bajty na zwiêkszenie siê ilosci kryszta³u (zapis normalny) lub ff,ff,ff,ff - iloœæ kryszta³u do odebrania (maksymalna iloœæ kryszta³u, któr¹ mo¿na daæ/odebraæ to 32767)
|
||||
//4 bajty na zwiêkszenie siê ilosci klejnotów (zapis normalny) lub ff,ff,ff,ff - iloœæ klejnotów do odebrania (maksymalna iloœæ klejnotów, któr¹ mo¿na daæ/odebraæ to 32767)
|
||||
//4 bajty na zwiêkszenie siê ilosci z³ota (zapis normalny) lub ff,ff,ff,ff - iloœæ z³ota do odebrania (maksymalna iloœæ z³ota, któr¹ mo¿na daæ/odebraæ to 32767)
|
||||
//1 bajt - których graczy dotyczy zdarzenie (pole bitowe, +1 - pierwszy, +2 - drugi, +4 - trzeci, +8 - czwarty, +16 - pi¹ty, +32 - szósty, +64 - siódmy, +128 - ósmy)
|
||||
//1 bajt - czy zdarzenie odnosi siê do graczy - ludzi (00 - nie, 01 - tak)
|
||||
//1 bajt - czy zdarzenie odnosi siê do graczy komputerowych (00 - nie, 01 - tak)
|
||||
//2 bajty - opóŸnienie pierwszego wyst¹pienia (w dniach, zapis normalny, maks 671)
|
||||
//1 bajt - co ile dni wystêpuje zdarzenie (maks 28, 00 oznacza zdarzenie jednorazowe)
|
||||
//17 bajtów zerowych
|
||||
};
|
||||
struct TerrainTile
|
||||
{
|
||||
EterrainType tertype; // type of terrain
|
||||
unsigned int terview; // look of terrain
|
||||
Eriver nuine; // type of Eriver (0 if there is no Eriver)
|
||||
unsigned int rivDir; // direction of Eriver
|
||||
Eroad malle; // type of Eroad (0 if there is no Eriver)
|
||||
unsigned int roadDir; // direction of Eroad
|
||||
unsigned int siodmyTajemniczyBajt; // mysterius byte // jak bedzie waidomo co to, to sie nazwie inaczej
|
||||
};
|
||||
struct DefInfo //information from def declaration
|
||||
{
|
||||
std::string name;
|
||||
int bytes [46];
|
||||
};
|
||||
struct SheroName //name of starting hero
|
||||
{
|
||||
int heroID;
|
||||
std::string heroName;
|
||||
};
|
||||
struct PlayerInfo
|
||||
{
|
||||
bool canHumanPlay;
|
||||
bool canComputerPlay;
|
||||
unsigned int AITactic; //(00 - random, 01 - warrior, 02 - builder, 03 - explorer)
|
||||
unsigned int allowedFactions; //(01 - castle; 02 - rampart; 04 - tower; 08 - inferno; 16 - necropolis; 32 - dungeon; 64 - stronghold; 128 - fortress; 256 - conflux);
|
||||
bool isFactionRandom;
|
||||
unsigned int mainHeroPortrait; //it's ID of hero with choosen portrait; 255 if standard
|
||||
std::string mainHeroName;
|
||||
std::vector<SheroName> heroesNames;
|
||||
};
|
||||
struct Location
|
||||
{
|
||||
int x, y;
|
||||
bool z; // underground
|
||||
};
|
||||
struct LossCondition
|
||||
{
|
||||
ElossCon typeOfLossCon;
|
||||
union
|
||||
{
|
||||
Location castlePos;
|
||||
Location heroPos;
|
||||
int timeLimit; // in days
|
||||
};
|
||||
};
|
||||
struct CspecificVictoryConidtions
|
||||
{
|
||||
bool allowNormalVictory;
|
||||
bool appliesToAI;
|
||||
};
|
||||
struct VicCon0 : public CspecificVictoryConidtions //acquire artifact
|
||||
{
|
||||
int ArtifactID;
|
||||
};
|
||||
struct VicCon1 : public CspecificVictoryConidtions //accumulate creatures
|
||||
{
|
||||
int monsterID;
|
||||
int neededQuantity;
|
||||
};
|
||||
struct VicCon2 : public CspecificVictoryConidtions // accumulate resources
|
||||
{
|
||||
int resourceID;
|
||||
int neededQuantity;
|
||||
};
|
||||
struct VicCon3 : public CspecificVictoryConidtions // upgrade specific town
|
||||
{
|
||||
Location posOfCity;
|
||||
int councilNeededLevel; //0 - town; 1 - city; 2 - capitol
|
||||
int fortNeededLevel;// 0 - fort; 1 - citadel; 2 - castle
|
||||
};
|
||||
struct VicCon4 : public CspecificVictoryConidtions // build grail structure
|
||||
{
|
||||
bool anyLocation;
|
||||
Location whereBuildGrail;
|
||||
};
|
||||
struct VicCon5 : public CspecificVictoryConidtions // defeat a specific hero
|
||||
{
|
||||
Location locationOfHero;
|
||||
};
|
||||
struct VicCon6 : public CspecificVictoryConidtions // capture a specific town
|
||||
{
|
||||
Location locationOfTown;
|
||||
};
|
||||
struct VicCon7 : public CspecificVictoryConidtions // defeat a specific monster
|
||||
{
|
||||
Location locationOfMonster;
|
||||
};
|
||||
/*struct VicCon8 : public CspecificVictoryConidtions // flag all creature dwellings
|
||||
{
|
||||
};
|
||||
struct VicCon9 : public CspecificVictoryConidtions // flag all mines
|
||||
{
|
||||
};*/
|
||||
struct VicCona : public CspecificVictoryConidtions //transport specific artifact
|
||||
{
|
||||
int artifactID;
|
||||
Location destinationPlace;
|
||||
};
|
||||
struct Rumor
|
||||
{
|
||||
std::string name, text;
|
||||
};
|
||||
struct Mapa
|
||||
{
|
||||
Eformat version; // version of map Eformat
|
||||
bool twoLevel; // if map has underground level
|
||||
int difficulty; // 0 easy - 4 impossible
|
||||
int levelLimit;
|
||||
bool areAnyPLayers; // if there are any playable players on map
|
||||
std::string name; //name of map
|
||||
std::string description; //and description
|
||||
int height, width;
|
||||
TerrainTile** terrain;
|
||||
TerrainTile** undergroungTerrain; // used only if there is underground level
|
||||
std::vector<Rumor> rumors;
|
||||
std::vector<DefInfo> defy; // list of .def files
|
||||
PlayerInfo players[8]; // info about players
|
||||
std::vector<int> teams; // teams[i] = team of player nr i
|
||||
LossCondition lossCondition;
|
||||
EvictoryConditions victoryCondition; //victory conditions
|
||||
CspecificVictoryConidtions * vicConDetails; // used only if vistory conditions aren't standard
|
||||
};
|
||||
#endif //MAPD
|
65
mapHandler.cpp
Normal file
65
mapHandler.cpp
Normal file
@ -0,0 +1,65 @@
|
||||
#include "stdafx.h"
|
||||
#include "mapHandler.h"
|
||||
#include "CSemiDefHandler.h"
|
||||
#include "SDL_rotozoom.h"
|
||||
extern SDL_Surface * ekran;
|
||||
void mapHandler::init()
|
||||
{
|
||||
terrainBitmap = new SDL_Surface **[reader->map.width];
|
||||
for (int ii=0;ii<reader->map.width;ii++)
|
||||
terrainBitmap[ii] = new SDL_Surface*[reader->map.height]; // allocate memory
|
||||
for (int i=0; i<reader->map.width; i++)
|
||||
{
|
||||
for (int j=0; j<reader->map.height;j++)
|
||||
{
|
||||
TerrainTile zz = reader->map.terrain[i][j];
|
||||
std::string name = CSemiDefHandler::nameFromType(reader->map.terrain[i][j].tertype);
|
||||
for (int k=0; k<reader->defs.size(); k++)
|
||||
{
|
||||
if (reader->defs[k]->defName != name)
|
||||
continue;
|
||||
else
|
||||
{
|
||||
SDL_Surface * n;
|
||||
int ktora = reader->map.terrain[i][j].terview;
|
||||
terrainBitmap[i][j] = reader->defs[k]->ourImages[ktora].bitmap;
|
||||
//TODO: odwracanie
|
||||
|
||||
//SDL_BlitSurface(terrainBitmap[i][j],NULL,ekran,NULL); SDL_Flip(ekran);SDL_Delay(50);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
SDL_Surface * mapHandler::terrainRect(int x, int y, int dx, int dy)
|
||||
{
|
||||
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
|
||||
int rmask = 0xff000000;
|
||||
int gmask = 0x00ff0000;
|
||||
int bmask = 0x0000ff00;
|
||||
int amask = 0x000000ff;
|
||||
#else
|
||||
int rmask = 0x000000ff;
|
||||
int gmask = 0x0000ff00;
|
||||
int bmask = 0x00ff0000;
|
||||
int amask = 0xff000000;
|
||||
#endif
|
||||
SDL_Surface * su = SDL_CreateRGBSurface(SDL_SWSURFACE, dx*32, dy*32, 32,
|
||||
rmask, gmask, bmask, amask);
|
||||
for (int bx=0; bx<dx; bx++)
|
||||
{
|
||||
for (int by=0; by<dy; by++)
|
||||
{
|
||||
SDL_Rect * sr = new SDL_Rect;
|
||||
sr->y=by*32;
|
||||
sr->x=bx*32;
|
||||
sr->h=sr->w=32;
|
||||
SDL_BlitSurface(terrainBitmap[bx][by],NULL,su,sr);
|
||||
|
||||
//SDL_BlitSurface(su,NULL,ekran,NULL);SDL_Flip(ekran);
|
||||
}
|
||||
}
|
||||
return su;
|
||||
}
|
11
mapHandler.h
Normal file
11
mapHandler.h
Normal file
@ -0,0 +1,11 @@
|
||||
#include "CAmbarCendamo.h"
|
||||
class mapHandler
|
||||
{
|
||||
public:
|
||||
CAmbarCendamo * reader;
|
||||
SDL_Surface *** terrainBitmap;
|
||||
SDL_Surface *** undTerrainBitmap; // used only if there is underground level
|
||||
SDL_Surface * terrainRect(int x, int y, int dx, int dy);
|
||||
SDL_Surface mirrorImage(SDL_Surface *src);
|
||||
void init();
|
||||
};
|
8
stdafx.cpp
Normal file
8
stdafx.cpp
Normal file
@ -0,0 +1,8 @@
|
||||
// stdafx.cpp : source file that includes just the standard includes
|
||||
// CMT.pch will be the pre-compiled header
|
||||
// stdafx.obj will contain the pre-compiled type information
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
// TODO: reference any additional headers you need in STDAFX.H
|
||||
// and not in this file
|
16
stdafx.h
Normal file
16
stdafx.h
Normal file
@ -0,0 +1,16 @@
|
||||
// stdafx.h : include file for standard system include files,
|
||||
// or project specific include files that are used frequently, but
|
||||
// are changed infrequently
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
#include <stdio.h>
|
||||
#include <tchar.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
|
||||
// TODO: reference additional headers your program requires here
|
Loading…
Reference in New Issue
Block a user