| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833 |
- #include "../stdafx.h"
- #include "../CGameInfo.h"
- #include "CDefHandler.h"
- #include "CCreatureHandler.h"
- #include "CLodHandler.h"
- #include <sstream>
- #include <boost/assign/std/vector.hpp>
- #include <boost/algorithm/string.hpp>
- #include <boost/algorithm/string/replace.hpp>
- void CCreatureHandler::loadCreatures()
- {
- std::string buf = CGameInfo::mainObj->bitmaph->getTextFile("ZCRTRAIT.TXT");
- int andame = buf.size();
- int i=0; //buf iterator
- int hmcr=0;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\r')
- ++hmcr;
- if(hmcr==2)
- break;
- }
- i+=2;
- while(i<buf.size())
- {
- //if(creatures.size()>190 && buf.substr(i, buf.size()-i).find('\r')==std::string::npos)
- //{
- // loadAnimationInfo();
- // loadUnitAnimations();
- // break;
- //}
- CCreature ncre;
- int befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.nameSing = buf.substr(befi, i-befi);
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.namePl = buf.substr(befi, i-befi);
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.wood = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.mercury = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.ore = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.sulfur = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.crystal = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.gems = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.gold = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.fightValue = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.AIValue = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.growth = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.hordeGrowth = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.hitPoints = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.speed = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.attack = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.defence = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.low1 = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.high1 = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.shots = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.spells = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.low2 = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.high2 = atoi(buf.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\t')
- break;
- }
- ncre.abilityText = buf.substr(befi, i-befi);
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\r')
- break;
- }
- ncre.abilityRefs = buf.substr(befi, i-befi);
- i+=2;
- if(ncre.nameSing!=std::string("") && ncre.namePl!=std::string(""))
- {
- ncre.idNumber = creatures.size();
- ncre.isDefinite = true;
- creatures.push_back(ncre);
- }
- }
- for(int bb=1; bb<8; ++bb)
- {
- CCreature ncre;
- ncre.isDefinite = false;
- ncre.indefLevel = bb;
- ncre.indefUpgraded = false;
- creatures.push_back(ncre);
- ncre.indefUpgraded = true;
- creatures.push_back(ncre);
- }
- //loading reference names
- std::ifstream ifs("config/crerefnam.txt");
- int tempi;
- std::string temps;
- for (;;)
- {
- ifs >> tempi >> temps;
- if (tempi>=creatures.size())
- break;
- boost::assign::insert(nameToID)(temps,tempi);
- creatures[tempi].nameRef=temps;
- }
- ifs.close();
- //loading 32x32px imgs
- CDefHandler *smi = CGI->spriteh->giveDef("CPRSMALL.DEF");
- smi->notFreeImgs = true;
- for (int i=0; i<smi->ourImages.size(); i++)
- {
- boost::assign::insert(smallImgs)(i-2,smi->ourImages[i].bitmap);
- }
- delete smi;
- smi = CGI->spriteh->giveDef("TWCRPORT.DEF");
- smi->notFreeImgs = true;
- for (int i=0; i<smi->ourImages.size(); i++)
- {
- boost::assign::insert(bigImgs)(i-2,smi->ourImages[i].bitmap);
- }
- delete smi;
- }
- void CCreatureHandler::loadAnimationInfo()
- {
- //std::string buf = CGameInfo::mainObj->bitmaph->getTextFile("CRANIM.TXT");
- //int andame = buf.size();
- //int i=0; //buf iterator
- //hmcr=0;
- //for(i; i<andame; ++i)
- //{
- // if(buf[i]=='\r')
- // ++hmcr;
- // if(hmcr==2)
- // break;
- //}
- //i+=2;
- //for(int dd=0; dd<creatures.size(); ++dd)
- //{
- // loadUnitAnimInfo(creatures[dd], buf, i);
- //}
- return;
- }
- void CCreatureHandler::loadUnitAnimInfo(CCreature & unit, std::string & src, int & i)
- {
- int befi=i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\t')
- break;
- }
- unit.timeBetweenFidgets = atof(src.substr(befi, i-befi).c_str());
- ++i;
- while(unit.timeBetweenFidgets == 0.0)
- {
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\r')
- break;
- }
- i+=2;
- befi=i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\t')
- break;
- }
- unit.timeBetweenFidgets = atof(src.substr(befi, i-befi).c_str());
- ++i;
- }
- befi=i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\t')
- break;
- }
- unit.walkAnimationTime = atof(src.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\t')
- break;
- }
- unit.attackAnimationTime = atof(src.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\t')
- break;
- }
- unit.flightAnimationDistance = atof(src.substr(befi, i-befi).c_str());
- ++i;
- ///////////////////////
- befi=i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\t')
- break;
- }
- unit.upperRightMissleOffsetX = atoi(src.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\t')
- break;
- }
- unit.upperRightMissleOffsetY = atoi(src.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\t')
- break;
- }
- unit.rightMissleOffsetX = atoi(src.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\t')
- break;
- }
- unit.rightMissleOffsetY = atoi(src.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\t')
- break;
- }
- unit.lowerRightMissleOffsetX = atoi(src.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\t')
- break;
- }
- unit.lowerRightMissleOffsetY = atoi(src.substr(befi, i-befi).c_str());
- ++i;
- ///////////////////////
- for(int jjj=0; jjj<12; ++jjj)
- {
- befi=i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\t')
- break;
- }
- unit.missleFrameAngles[jjj] = atof(src.substr(befi, i-befi).c_str());
- ++i;
- }
- befi=i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\t')
- break;
- }
- unit.troopCountLocationOffset= atoi(src.substr(befi, i-befi).c_str());
- ++i;
- befi=i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\t')
- break;
- }
- unit.attackClimaxFrame = atoi(src.substr(befi, i-befi).c_str());
- ++i;
- for(i; i<src.size(); ++i)
- {
- if(src[i]=='\r')
- break;
- }
- i+=2;
- }
- void CCreatureHandler::loadUnitAnimations()
- {
- std::ifstream inp("config/CREDEFS.TXT", std::ios::in | std::ios::binary); //this file is not in lod
- inp.seekg(0,std::ios::end); // na koniec
- int andame = inp.tellg(); // read length
- inp.seekg(0,std::ios::beg); // wracamy na poczatek
- char * bufor = new char[andame]; // allocate memory
- inp.read((char*)bufor, andame); // read map file to buffer
- inp.close();
- std::string buf = std::string(bufor);
- delete [andame] bufor;
- int i = 0; //buf iterator
- int hmcr = 0;
- for(i; i<andame; ++i) //omitting rubbish
- {
- if(buf[i]=='\r')
- break;
- }
- i+=2;
- for(int s=0; s<creatures.size(); ++s)
- {
- int befi=i;
- std::string rub;
- for(i; i<andame; ++i)
- {
- if(buf[i]==' ')
- break;
- }
- rub = buf.substr(befi, i-befi);
- ++i;
- befi=i;
- for(i; i<andame; ++i)
- {
- if(buf[i]=='\r')
- break;
- }
- std::string defName = buf.substr(befi, i-befi);
- if(defName != std::string("x"))
- creatures[s].battleAnimation = CGameInfo::mainObj->spriteh->giveDef(defName);
- else
- creatures[s].battleAnimation = NULL;
- i+=2;
- }
- }
- int CCreatureAnimation::getType() const
- {
- return type;
- }
- void CCreatureAnimation::setType(int type)
- {
- this->type = type;
- curFrame = 0;
- }
- CCreatureAnimation::CCreatureAnimation(std::string name)
- {
- //load main file
- std::string data2 = CGI->spriteh->getTextFile(name);
- FDef = new unsigned char[data2.size()];
- for(int g=0; g<data2.size(); ++g)
- {
- FDef[g] = data2[g];
- }
- //init anim data
- int i,j, totalInBlock;
- char Buffer[13];
- defName=name;
- int andame = data2.size();
- i = 0;
- DEFType = readNormalNr(i,4); i+=4;
- fullWidth = readNormalNr(i,4); i+=4;
- fullHeight = readNormalNr(i,4); i+=4;
- i=0xc;
- totalBlocks = readNormalNr(i,4); i+=4;
- i=0x10;
- for (int it=0;it<256;it++)
- {
- palette[it].R = FDef[i++];
- palette[it].G = FDef[i++];
- palette[it].B = FDef[i++];
- palette[it].F = 0;
- }
- i=0x310;
- totalEntries=0;
- for (int z=0; z<totalBlocks; z++)
- {
- int unknown1 = readNormalNr(i,4); i+=4;
- totalInBlock = readNormalNr(i,4); i+=4;
- for (j=SEntries.size(); j<totalEntries+totalInBlock; j++)
- SEntries.push_back(SEntry());
- int unknown2 = readNormalNr(i,4); i+=4;
- int unknown3 = readNormalNr(i,4); i+=4;
- for (j=0; j<totalInBlock; j++)
- {
- for (int k=0;k<13;k++) Buffer[k]=FDef[i+k];
- i+=13;
- SEntries[totalEntries+j].name=Buffer;
- }
- for (j=0; j<totalInBlock; j++)
- {
- SEntries[totalEntries+j].offset = readNormalNr(i,4);
- int unknown4 = readNormalNr(i,4); i+=4;
- }
- //totalEntries+=totalInBlock;
- for(int hh=0; hh<totalInBlock; ++hh)
- {
- SEntries[totalEntries].group = z;
- ++totalEntries;
- }
- }
- for(j=0; j<SEntries.size(); ++j)
- {
- SEntries[j].name = SEntries[j].name.substr(0, SEntries[j].name.find('.')+4);
- }
- //pictures don't have to be readed here
- //for(int i=0; i<SEntries.size(); ++i)
- //{
- // Cimage nimg;
- // nimg.bitmap = getSprite(i);
- // nimg.imName = SEntries[i].name;
- // nimg.groupNumber = SEntries[i].group;
- // ourImages.push_back(nimg);
- //}
- //delete FDef;
- //FDef = NULL;
- //init vars
- curFrame = 0;
- type = -1;
- frames = totalEntries;
- }
- int CCreatureAnimation::readNormalNr (int pos, int bytCon, unsigned char * str, bool cyclic)
- {
- int ret=0;
- int amp=1;
- if (str)
- {
- for (int i=0; i<bytCon; i++)
- {
- ret+=str[pos+i]*amp;
- amp*=256;
- }
- }
- else
- {
- for (int i=0; i<bytCon; i++)
- {
- ret+=FDef[pos+i]*amp;
- amp*=256;
- }
- }
- if(cyclic && bytCon<4 && ret>=amp/2)
- {
- ret = ret-amp;
- }
- return ret;
- }
- int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y)
- {
- if(dest->format->BytesPerPixel<3)
- return -1; //not enough depth
- int SIndex = curFrame++; //TODO: finish
- if(curFrame>=frames)
- curFrame = 0;
- long BaseOffset,
- SpriteWidth, SpriteHeight, //format sprite'a
- LeftMargin, RightMargin, TopMargin,BottomMargin,
- i, add, FullHeight,FullWidth,
- TotalRowLength, // dlugosc przeczytanego segmentu
- NextSpriteOffset, RowAdd;
- std::ifstream Fdef;
- unsigned char SegmentType, SegmentLength, BL, BR;
- unsigned char * TempDef; //memory
- std::string FTemp;
-
- i=BaseOffset=SEntries[SIndex].offset;
- int prSize=readNormalNr(i,4,FDef);i+=4;
- int defType2 = readNormalNr(i,4,FDef);i+=4;
- FullWidth = readNormalNr(i,4,FDef);i+=4;
- FullHeight = readNormalNr(i,4,FDef);i+=4;
- SpriteWidth = readNormalNr(i,4,FDef);i+=4;
- SpriteHeight = readNormalNr(i,4,FDef);i+=4;
- LeftMargin = readNormalNr(i,4,FDef);i+=4;
- TopMargin = readNormalNr(i,4,FDef);i+=4;
- RightMargin = FullWidth - SpriteWidth - LeftMargin;
- BottomMargin = FullHeight - SpriteHeight - TopMargin;
- BMPHeader tb;
- tb.x = FullWidth;
- tb.y = FullHeight;
- tb.dataSize2 = tb.dataSize1 = tb.x*tb.y;
- tb.fullSize = tb.dataSize1+436;
- tb._h3=tb.fullSize-36;
-
- //add = (int)(4*(((float)1) - ((int)(((int)((float)FullWidth/(float)4))-((float)FullWidth/(float)4)))));
- add = 4 - FullWidth%4;
- /*if (add==4)
- add=0;*/ //moved to defcompression dependent block
- #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
-
- //ret = SDL_CreateRGBSurface(SDL_SWSURFACE, FullWidth, FullHeight, 8, 0, 0, 0, 0);
- //int tempee2 = readNormalNr(0,4,((unsigned char *)tempee.c_str()));
- int BaseOffsetor = BaseOffset = i;
- /*for(int i=0; i<256; ++i)
- {
- SDL_Color pr;
- pr.r = palette[i].R;
- pr.g = palette[i].G;
- pr.b = palette[i].B;
- pr.unused = palette[i].F;
- (*(ret->format->palette->colors+i))=pr;
- }*/
- for (int i=0;i<800;i++)
- fbuffer[i]=0;
- if (defType2==1) //as it should be allways in creature animations
- {
- if (add==4)
- add=0; ////////was 3
- if (TopMargin>0)
- {
- for (int i=0;i<TopMargin;i++)
- {
- for (int j=0;j<FullWidth+add;j++)
- FTemp+=fbuffer[j];
- }
- }
- RLEntries = new int[SpriteHeight];
- for (int i=0;i<SpriteHeight;i++)
- {
- RLEntries[i]=readNormalNr(BaseOffset,4,FDef);BaseOffset+=4;
- }
- for (int i=0;i<SpriteHeight;i++)
- {
- BaseOffset=BaseOffsetor+RLEntries[i];
- if (LeftMargin>0)
- {
- for (int j=0;j<LeftMargin;j++)
- FTemp+=fbuffer[j];
- }
- TotalRowLength=0;
- do
- {
- SegmentType=FDef[BaseOffset++];
- SegmentLength=FDef[BaseOffset++];
- if (SegmentType==0xFF)
- {
- for (int k=0;k<=SegmentLength;k++)
- {
- FTemp+=FDef[BaseOffset+k];
- if ((TotalRowLength+k+1)>=SpriteWidth)
- break;
- }
- BaseOffset+=SegmentLength+1;////
- TotalRowLength+=SegmentLength+1;
- }
- else
- {
- for (int k=0;k<SegmentLength+1;k++)
- {
- FTemp+=SegmentType;//
- //FTemp+='\0';
- }
- TotalRowLength+=SegmentLength+1;
- }
- }while(TotalRowLength<SpriteWidth);
- RowAdd=SpriteWidth-TotalRowLength;
- if (RightMargin>0)
- {
- for (int j=0;j<RightMargin;j++)
- FTemp+=fbuffer[j];
- }
- if (add>0)
- {
- for (int j=0;j<add+RowAdd;j++)
- FTemp+=fbuffer[j];
- }
- }
- delete RLEntries;
- RLEntries = NULL;
- if (BottomMargin>0)
- {
- for (int i=0;i<BottomMargin;i++)
- {
- for (int j=0;j<FullWidth+add;j++)
- FTemp+=fbuffer[j];
- }
- }
- }
- for (int i=0; i<FullHeight; ++i)
- {
- for (int j=0;j<FullWidth+add;j++)
- {
- if( i+y<dest->h && j+x<dest->w && i+y>=0 && j+x>=0)
- {
- unsigned char coln = FTemp[i*(FullWidth+add)+j]; //number of color from palette
- if(coln==0)
- continue;
- unsigned char* ptr = ((unsigned char*)dest->pixels + dest->format->BytesPerPixel * ((i + y)*dest->w + j + x));
- if(coln>7 || coln == 5) //normal or yellow border
- {
- *ptr = palette[coln].B;
- *(ptr+1) = palette[coln].G;
- *(ptr+2) = palette[coln].R;
- }
- else if(coln<5) //shadow
- {
- *ptr = ((*ptr) * (palette[coln].G + 50)) /200;
- *(ptr+1) = ((*(ptr+1)) * (palette[coln].G + 50)) /200 ;
- *(ptr+2) = ((*(ptr+2)) * (palette[coln].G + 50)) /200 ;
- }
- else if(coln == 6) //yellow border shadowed
- {
- *ptr = ((*ptr) + palette[coln-1].B) / 2;
- *(ptr+1) = ((*(ptr+1)) + palette[coln-1].G) / 2;
- *(ptr+2) = ((*(ptr+2)) + palette[coln-1].R) / 2;
- }
- }
- }
- }
- SDL_UpdateRect(dest, x, y, FullWidth+add, FullHeight);
- return 0;
- }
|