home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
WarCraft 2000 - Nuclear Epidemic
/
W2000.nrg
/
SOURCE.War2000
/
mapa.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-09-25
|
70KB
|
2,758 lines
#include "ddini.h"
#include <stdlib.h>
#include "ResFile.h"
#include "Fastdraw.h"
#include "MapDiscr.h"
#include "mouse.h"
#include "mode.h"
#include "fog.h"
#include "walls.h"
#include "Nature.h"
#include <crtdbg.h>
#include <math.h>
#include "TopZones.h"
#include "Megapolis.h"
#include "FlyObj.h"
#include "fonts.h"
#include "WeaponID.h"
#include "MapEdit.h"
#include "3DSurf.h"
#include "GSound.h"
#include <assert.h>
extern int time1,time2,time3,time4,time5;
int time6,time7,time8;
extern int HintX;
extern int HintY;
extern bool CheapMode;
extern int NMyUnits;
extern int NThemUnits;
extern RLCFont FPassive;
extern RLCFont FActive;
extern RLCFont FDisable;
int GetRLen(char* s,RLCFont* font);
word GetEnemy(int x,int y,byte NI);
word GetFriend(int x,int y,byte NI);
int COUNTER;
extern int BlobMode;
extern RLCTable IMM;
extern int LASTRAND,LASTIND;
void ShowRMap();
extern int FogMode;
extern int RealLx;
extern int RealLy;
extern int Pitch;
extern Forces NForces[8];
word GetOwner(int x,int y);
extern bool GetCoord;
extern UniqMethood* UNIM;
//╩α≡≥α φσ≤±≥≡αφΦ∞√⌡ ∩≡σ∩ ≥±≥ΓΦΘ
extern int PathAsks;
extern int NMONS;
extern bool AttackMode;
extern int nEused;
extern bool EUsage[1024];
extern Nation* curn;
extern int counter;
extern bool InfoMode;
extern int WaitCycle;
extern int tmtmt;
extern bool EditMapMode;
extern bool HeightEditMode;
extern bool HelpMode;
extern bool ChoosePosition;
extern int LastKey;
const byte CLRT[8]={0xD0,0xD4,0xD8,0xDC,0xE0,0xE4,0xE8,0xAD};
void ShowSuperFluentFog(int x,int y,int z1,int z2,int z3,int z4);
void ShowDestn();
void ShowMiniDestn();
extern byte RNTB[64][256];
byte TrMap[maxmap][maxmap];
word SlMons[8192];
bool GetTask[8192];
void CreateMiniMap();
void ShowSuperFluentFog32_160(int x,int y,int z1x,int z2x,int z3x,int z4x);
word Nsel;
//╩α≡ΦφΩΦ Σδ ⌠εφα
byte tiles[32][8192];
byte mtiles[16][4096];
//ε∩Φ±αφΦσ Ωα≡≥ΦφεΩ φα Ωα≡≥σ
byte tmap[maxmap][maxmap];
//Ωα≡≥α-±±√δΩΦ φα ∞εφ±≥≡εΓ
MapCell map[maxmap][maxmap];
//Ωα≡≥α ßδεΩΦ≡εΓεΩ
byte LLock[maxmap][maxmap];
//╩α≡≥α ≡α±∩εδεµσφΦ ∞εφ±≥≡εΓ
word Mops[maxmap][maxmap];
word FlyMops[256][256];
//╩α≡≥α Σδ ≤ßΦ≥√⌡
word Died[maxmap][maxmap];
bool BuildMode;
byte SpecCmd;
OneSlide* OSB;
byte blx;
byte bly;
word BuildingID;
Nation* BNat;
extern int NAsk;
extern int curptr;
int smapx;
int smapy;
int smaplx;
int smaply;
int mapx;
int mapy;
int msx;
int msy;
int minix;
int miniy;
static int StartX=0;
static int StartY=0;
bool MiniMade;
char Prompt[80];
int PromptTime;
byte minimap[maxmap][maxmap];
byte Locking[1024];//╚φ⌠. ε ßδεΩΦ≡εΓαφΦΦ ∩εΓσ≡⌡φε±≥Φ
#define ScreenSizeX32 ScreenSizeX-32
//╠α±±ΦΓ Γ±σ ∞εφ±≥≡εΓ φα Ωα≡≥σ
OneObject* Group[8192];
//Mα±±ΦΓ Σδ δεΩαδⁿφ√⌡ Ωε∞αφΣ
//╚φΣσΩ±√ Φ±∩εδⁿτεΓαφΦ
bool AsmUsage[MaxAsmCount];
char AsmBuf[MaxAsmCount*OneAsmSize];
int LastAsmRequest;
//╠α±±ΦΓ Σδ Ωε∞αφΣ ∩σ≡Γεπε ≤≡εΓφ
bool OrdUsage[MaxOrdCount];
Order1 OrdBuf[MaxOrdCount];
int LastOrdRequest;
//network sequence errors enumeration
extern int SeqErrorsCount;
extern int LastRandDif;
extern int curdx;
extern int curdy;
//╘εφ
byte fon000[1024*768];
void RedSquare(int x,int y){
if(x<mapx||x>=mapx+smaplx||y<mapy||y>=mapy+smaply)return;
int sco=int(ScreenPtr)+smapx+((x-mapx)<<5)+
(((y-mapy)<<5)+smapy)*SCRSizeX;
int ddx=SCRSizeX+SCRSizeX-32;
__asm{
push edi
mov edi,sco
mov eax,16
uyu: mov ecx,16
uuu: mov byte ptr [edi],clrRed
add edi,2
loop uuu
add edi,ddx
dec al
jnz uyu
pop edi
};
};
void RedMiniSquare(int x,int y){
if(x<mapx||x>=mapx+smaplx||y<mapy||y>=mapy+smaply)return;
int sco=int(ScreenPtr)+smapx+((x-mapx)<<4)+
(((y-mapy)<<4)+smapy)*SCRSizeX;
int ddx=SCRSizeX+SCRSizeX-16;
__asm{
push edi
mov edi,sco
mov eax,8
uyu: mov ecx,8
uuu: mov byte ptr [edi],clrRed
add edi,2
loop uuu
add edi,ddx
dec al
jnz uyu
pop edi
};
};
void RedBar(int x,int y,int lx,int ly){
for(int i=0;i<lx;i++)
for(int j=0;j<ly;j++)
RedSquare(x+i,y+j);
};
void RedMiniBar(int x,int y,int lx,int ly){
for(int i=0;i<lx;i++)
for(int j=0;j<ly;j++)
RedMiniSquare(x+i,y+j);
};
void WhiteSquare(int x,int y){
if(x<mapx||x>=mapx+smaplx||y<mapy||y>=mapy+smaply)return;
int sco=int(ScreenPtr)+smapx+((x-mapx)<<5)+
(((y-mapy)<<5)+smapy)*SCRSizeX;
int ddx=SCRSizeX+SCRSizeX-32;
__asm{
push edi
mov edi,sco
mov eax,16
uyu: mov ecx,16
uuu: mov byte ptr [edi],255
add edi,2
loop uuu
add edi,ddx
dec al
jnz uyu
pop edi
};
};
void WhiteMiniSquare(int x,int y){
if(x<mapx||x>=mapx+smaplx||y<mapy||y>=mapy+smaply)return;
int sco=int(ScreenPtr)+smapx+((x-mapx)<<4)+
(((y-mapy)<<4)+smapy)*SCRSizeX;
int ddx=SCRSizeX+SCRSizeX-16;
__asm{
push edi
mov edi,sco
mov eax,8
uyu: mov ecx,8
uuu: mov byte ptr [edi],255
add edi,2
loop uuu
add edi,ddx
dec al
jnz uyu
pop edi
};
};
void WhiteBar(int x,int y,int lx,int ly){
for(int i=0;i<lx;i++)
for(int j=0;j<ly;j++)
WhiteSquare(x+i,y+j);
};
void WhiteMiniBar(int x,int y,int lx,int ly){
for(int i=0;i<lx;i++)
for(int j=0;j<ly;j++)
WhiteMiniSquare(x+i,y+j);
};
void OutErr(LPCSTR s)
{
MessageBox(hwnd,s,"Loading failed...",MB_ICONWARNING|MB_OK);
};
bool ManualFogCheck(int xx,int yy,int dx){
if(EditMapMode)return true;
int x,y;
for(int i=0;i<dx;i++)
for(int j=0;j<dx;j++){
x=xx+i;
y=yy+j;
if(x<=1||x>=msx||y<=1||y>=msy)return false;
if(fmap[y][x]<1000)return false;
};
return true;
};
void AssignHint1(char* s,int time);
bool CheckGold(int xx,int yy,GeneralObject* GO){
if(!GO->AGold)return true;
for(int i=0;i<15;i++)
for(int j=0;j<15;j++){
int x=xx+i-5;
int y=yy+j-5;
if(x>1&&y>1&&x<=msx&&y<=msy){
if(rtmap[y][x]==1&&ramap[y][x]){
AssignHint1("╤δΦ°Ωε∞ ßδΦτΩε Ω τεδε≥≤.",4);
return false;
};
};
};
return true;
};
//╧εδ≤≈Φ≥ⁿ ßδεΩ Σδ InLineCom
char* GetAsmBlock(){
if(LastAsmRequest>=MaxAsmCount)LastAsmRequest=0;
for(int i=LastAsmRequest;i<MaxAsmCount&&AsmUsage[i];i++);
if(i<MaxAsmCount){
LastAsmRequest=i+1;
AsmUsage[i]=true;
return &AsmBuf[i*OneAsmSize];
} else{
for(int i=0;i<LastAsmRequest&&AsmUsage[i];i++);
if(i<LastAsmRequest){
LastAsmRequest=i+1;
AsmUsage[i]=true;
return &AsmBuf[i*OneAsmSize];
} else return NULL;
};
};
void FreeAsmBlock(char* p ){
int i=(int(p)-int(AsmBuf))>>OneAShift;
AsmUsage[i]=false;
LastAsmRequest=i;
};
void InitAsmBuf(){
memset(AsmUsage,0,sizeof AsmUsage);
memset(AsmBuf,0,sizeof AsmBuf);
LastAsmRequest=0;
};
//╧εδ≤≈Φ≥ⁿ ßδεΩ Σδ LocalOrder
int CHSM1;
void GetOrdSum(){
return;
CHSM1=0;
for(int i=0;i<MaxOrdCount;i++){
if(OrdUsage[i])CHSM1+=i;
};
};
void ChkOrdSum(){
return;
int xxx=CHSM1;
GetOrdSum();
assert(xxx=CHSM1);
};
Order1* GetOrdBlock(){
ChkOrdSum();
if(LastOrdRequest>=MaxOrdCount)LastOrdRequest=0;
for(int i=LastOrdRequest;i<MaxOrdCount&&OrdUsage[i];i++);
if(i<MaxOrdCount){
LastOrdRequest=i+1;
OrdUsage[i]=true;
GetOrdSum();
return &OrdBuf[i];
} else{
for(int i=0;i<LastOrdRequest&&OrdUsage[i];i++);
if(i<LastOrdRequest){
LastOrdRequest=i+1;
OrdUsage[i]=true;
GetOrdSum();
return &OrdBuf[i];
} else{
GetOrdSum();
return NULL;
};
};
};
void OneObject::FreeOrdBlock(Order1* p ){
ChkOrdSum();
byte ot=p->OrderType;
if(ot==3){
Attack=false;
EnemyID=0xFFFF;
EnemyDist=5000;
};
if(ot==22)MoveInRect=false;
int i=div(int(p)-int(OrdBuf),sizeof Order1).quot;
OrdUsage[i]=false;
LastOrdRequest=i;
GetOrdSum();
};
void InitOrdBuf(){
memset(OrdUsage,0,sizeof OrdUsage);
memset(OrdBuf,0,sizeof OrdBuf);
//LastOrdRequest=0;
};
void LoadLock()
{
ResFile f=RReset("lock.dat");
if(IOresult())OutErr("Can't load locking.");
RBlockRead(f,Locking,RFileSize(f));
RClose(f);
};
void LoadFon()
{
if(RealLx==1024){
ResFile ff1=RReset("fon1024p.raw");
if(IOresult()) OutErr("Can't load fon1024p.raw");
RBlockRead(ff1,fon000,RFileSize(ff1));
RClose(ff1);
return;
};
ResFile ff1=RReset("fon.000");
if(IOresult()) OutErr("Can't load fon.000");
RBlockRead(ff1,fon000,RFileSize(ff1));
RClose(ff1);
};
void ShowFon()
{
return;
//if(SCRSizeY==768)return;
int addX=RSCRSizeX-COPYSizeX;
int SZX=(COPYSizeX)>>2;
__asm{
push esi
push edi
mov esi,offset fon000
mov edi,RealScreenPtr
mov ebx,RSCRSizeY
cld
uuu1:
mov ecx,SZX
rep movsd
add edi,addX
dec ebx
jnz uuu1
pop edi
pop esi
}
};
void ShowFon1()
{
//if(SCRSizeY==768)return;
int addX=SCRSizeX-COPYSizeX;
int SZX=(COPYSizeX)>>2;
__asm{
push esi
push edi
mov esi,offset fon000
mov edi,ScreenPtr
mov ebx,RSCRSizeY
cld
uuu1:
mov ecx,SZX
rep movsd
add edi,addX
dec ebx
jnz uuu1
pop edi
pop esi
}
};
void ShowBorder()
{
return;
/*int Start=smapx-32+smapy*ScreenSizeX;
int Ly=smaply*32;
__asm{
push esi
push edi
mov ebx,Ly
mov esi,offset fon000
add esi,Start
mov edi,ScreenPtr
add edi,Start
cld
Uuy1: mov ecx,8
rep movsd
add esi,ScreenSizeX-32
add edi,ScreenSizeX-32
dec ebx
jnz Uuy1
pop edi
pop esi
}
Start=smapx+smaplx*32+smapy*ScreenSizeX;
__asm{
push esi
push edi
mov ebx,Ly
mov esi,offset fon000
add esi,Start
mov edi,ScreenPtr
add edi,Start
cld
Uuy2: mov ecx,8
rep movsd
add esi,ScreenSizeX-32
add edi,ScreenSizeX-32
dec ebx
jnz Uuy2
pop edi
pop esi
}*/
};
void LoadTiles()
{
ResFile ff1=RReset("new_dark.bpx");//tiles.t00");
if (IOresult()) OutErr("Can't load tiles.");
RBlockRead(ff1,tiles,RFileSize(ff1));
int ntiles=RFileSize(ff1)>>10;
RClose(ff1);
for(int i=0;i<ntiles;i++){
for(int ux=0;ux<16;ux++)
for(int uy=0;uy<16;uy++){
((byte*)(mtiles))[(i<<8)+(ux)+(uy<<4)]=
((byte*)(tiles))[(i<<10)+(ux<<1)+(uy<<6)];
};
};
};
void SaveWalls(ResFile ff1);
void LoadWalls(ResFile ff1);
char MapName[128];
extern short HiMap[256][256];//Height of surface
byte mapPos[16];
int RES[8][8];
void SaveExtendedMap(char* s){
ResFile f1=RRewrite(s);
int i='APAM';
RBlockWrite(f1,&i,4);
RBlockWrite(f1,MapName,128);
RBlockWrite(f1,mapPos,16);
//Saving Tiles Map
RBlockWrite(f1,&msx,4);
RBlockWrite(f1,&msy,4);
RBlockWrite(f1,&RES[0][0],sizeof RES);
for(i=0;i<msx;i++)RBlockWrite(f1,&tmap[i][0],msy);
//Saving Height map
for(i=0;i<=msy;i++)RBlockWrite(f1,&HiMap[i][0],(msx+1)<<1);
//Oil spots
int NU=0;
for(int xx=0;xx<128;xx++)
for(int yy=0;yy<128;yy++)if(OILMAP[yy][xx])NU++;
RBlockWrite(f1,&NU,4);
for(xx=0;xx<128;xx++)
for(int yy=0;yy<128;yy++)if(OILMAP[yy][xx]){
RBlockWrite(f1,&xx,1);
RBlockWrite(f1,&yy,1);
RBlockWrite(f1,&OILMAP[yy][xx],2);
};
//saving units
NU=0;
for(i=0;i<8192;i++){
if(Group[i])NU++;
};
RBlockWrite(f1,&NU,4);
for(i=0;i<8192;i++){
OneObject* OB=Group[i];
if(OB){
RBlockWrite(f1,&OB->NIndex,2);
RBlockWrite(f1,&OB->NNUM,1);
RBlockWrite(f1,&OB->x,1);
RBlockWrite(f1,&OB->y,1);
};
};
SaveWalls(f1);
RClose(f1);
};
void PreLoadExtendedMap(char* s){
ResFile f1=RReset(s);
InitRenderMap();
int i='APAM';
RBlockRead(f1,&i,4);
if(i!='APAM'){
RClose(f1);
return;
};
//Loading tiles map
RBlockRead(f1,MapName,128);
RBlockRead(f1,mapPos,16);
RBlockRead(f1,&msx,4);
RBlockRead(f1,&msy,4);
RBlockRead(f1,&RES[0][0],sizeof RES);
memcpy(&RESRC[0][0],&RES[0][0],sizeof RES);
for(i=0;i<msx;i++)RBlockRead(f1,&tmap[i][0],msy);
//Loading height map
for(i=0;i<=msy;i++)RBlockRead(f1,&HiMap[i][0],(msx+1)<<1);
int NOIL;
byte x,y;
word AMOUNT;
RBlockRead(f1,&NOIL,4);
for(i=0;i<NOIL;i++){
RBlockRead(f1,&x,1);
RBlockRead(f1,&y,1);
RBlockRead(f1,&AMOUNT,2);
OILMAP[y][x]=AMOUNT;
};
PromptTime=0;
MAXOBJECT=0;
memset(&fmap[0][0],0,sizeof fmap);
memset(Group,0,sizeof Group);
memset(&TrMap[0][0],0,sizeof TrMap);
memset(&LLock[0][0],0,sizeof LLock);
memset(&WLock[0][0],0,sizeof WLock);
memset(&WMap[0][0],0,sizeof WMap);
memset(&map[0][0],0,sizeof map);
memset(NLocks,0,sizeof NLocks);
BuildMode=false;
for(i=0;i<maxmap;i++)
for(int j=0;j<maxmap;j++){
//map[i][j].BuildingID=65535;
Mops[j][i]=65535;
Died[j][i]=65535;
FlyMops[j][i]=65535;
//map[i][j].FlyID=65535;
};
for(i=0;i<msx;i++)for(int j=0;j<msy;j++){
byte k=Locking[tmap[j][i]];
if(k&1){
LLock[i+1][j+1]=1;
IncLock(j+1,i+1);
TrMap[i+1][j+1]=1;
};
//if(k&2)map[j][i].WaterLock=true;
};
for(i=0;i<=msx+1;i++){
TrMap[i][0]=2;
TrMap[i][msy+1]=2;
LLock[i][0]=2;
IncLock(0,i);
LLock[i][msy+1]=2;
IncLock(msy+1,i);
WMap[i][0]=2;
WMap[i][msy+1]=2;
WLock[i][0]=2;
WLock[i][msy+1]=2;
WMap[i][0]=2;
WMap[i][msy+2]=2;
WLock[i][0]=2;
WLock[i][msy+2]=2;
};
for(i=0;i<msy+1;i++){
TrMap[0][i]=2;
TrMap[msx+1][i]=2;
LLock[0][i]=2;
IncLock(i,0);
LLock[msx+1][i]=2;
IncLock(i,msx+1);
WMap[0][i]=2;
WMap[msx+1][i]=2;
WLock[0][i]=2;
WLock[msx+1][i]=2;
WMap[0][i]=2;
WMap[msx+2][i]=2;
WLock[0][i]=2;
WLock[msx+2][i]=2;
};
RClose(f1);
Nsel=0;
CreateResMap();
CreateWaterMap();
CreateTZones();
CreateCMap();
CreateMiniMap();
};
void CreateUnit(Nation* NT,byte x,byte y,word ID){
GeneralObject* GO=NT->Mon[ID];
if(!GO->cpbBuilding){
NT->CreateTerrainAt(x,y,ID);
}else{
CheapMode=true;
int oi=NT->CreateBuilding(ID,x,y);
CheapMode=false;
if(oi!=-1){
OneObject* OB=Group[oi];
OB->LoadCurAnm(0);
OB->TicksPerChange=255;
OB->Life=OB->MaxLife;
OB->CurrentSprite=OB->CurAnm->count-1;
if(OB->Ref.General->cpbFarm)NT->NFarms++;
OB->Ready=true;
OB->Stage=OB->Stage=OB->NStages;
};
};
};
void PostLoadExtendedMap(char* s){
memset(&fmap[0][0],10,sizeof fmap);
ResFile f1=RReset(s);
int pos=12+16+128+8*8*4+(msx*msy)+(msx+1)*(msy+1)*2;
RSeek(f1,pos);
//Load units
int NU;
RBlockRead(f1,&NU,4);
pos+=(NU+1)<<2;
RSeek(f1,pos);
RBlockRead(f1,&NU,4);
byte NNUM,xu,yu;
word NIndex;
for(int i=0;i<NU;i++){
RBlockRead(f1,&NIndex,2);
RBlockRead(f1,&NNUM,1);
RBlockRead(f1,&xu,1);
RBlockRead(f1,&yu,1);
Nation* NT=&NATIONS[NNUM];
CreateUnit(NT,xu,yu,NIndex);
};
//walls
LoadWalls(f1);
RClose(f1);
memset(&fmap[0][0],0,sizeof fmap);
};
void RestoreLock(int x,int y,int lx,int ly){
for(int j=x-1;j<x+lx-1;j++)for(int i=y-1;i<y+ly-1;i++){
byte k=Locking[tmap[j][i]];
if(k&1){
if(!LLock[i+1][j+1])IncLock(j+1,i+1);
LLock[i+1][j+1]=1;
TrMap[i+1][j+1]=1;
}else{
if(LLock[i+1][j+1])DecLock(j+1,i+1);
LLock[i+1][j+1]=0;
TrMap[i+1][j+1]=0;
};
k=Locking[tmap[j][i]];
if(k&2){
WLock[i+1][j+1]=1;
WMap[i+1][j+1]=1;
}else{
WLock[i+1][j+1]=0;
WMap[i+1][j+1]=0;
};
Mops[i+1][j+1]=0xFFFF;
};
};
void LoadMap(LPCSTR s)
{
PromptTime=0;
MAXOBJECT=0;
memset(Group,0,sizeof Group);
memset(TrMap,0,sizeof TrMap);
memset(LLock,0,sizeof LLock);
memset(WLock,0,sizeof WLock);
memset(WMap,0,sizeof WMap);
memset(map,0,sizeof map);
memset(NLocks,0,sizeof NLocks);
BuildMode=false;
for(int i=0;i<maxmap;i++)
for(int j=0;j<maxmap;j++){
//map[i][j].BuildingID=65535;
Mops[j][i]=65535;
Died[j][i]=65535;
FlyMops[j][i]=65535;
//map[i][j].FlyID=65535;
};
ResFile ff1=RReset(s);
if (IOresult())OutErr("Can't load map file.");
RBlockRead(ff1,&i,4);
if (i!=0x1B46504D) OutErr("Incorrect map file format.");
RBlockRead(ff1,&msx,4);
RBlockRead(ff1,&msy,4);
RBlockRead(ff1,&i,4);
RBlockRead(ff1,&i,4);
for(i=0;i<msy;i++)RBlockRead(ff1,&tmap[i][0],msx);
for(i=0;i<msx;i++)for(int j=0;j<msy;j++){
byte k=Locking[tmap[j][i]];
if(k&1){
LLock[i+1][j+1]=1;
IncLock(j+1,i+1);
TrMap[i+1][j+1]=1;
};
//if(k&2)map[j][i].WaterLock=true;
};
for(i=0;i<=msx+1;i++){
TrMap[i][0]=2;
TrMap[i][msy+1]=2;
LLock[i][0]=2;
IncLock(0,i);
LLock[i][msy+1]=2;
IncLock(msy+1,i);
};
for(i=0;i<msy+1;i++){
TrMap[0][i]=2;
TrMap[msx+1][i]=2;
LLock[0][i]=2;
IncLock(i,0);
LLock[msx+1][i]=2;
IncLock(i,msx+1);
};
RClose(ff1);
RSCRSizeX=RealLx;
RSCRSizeY=RealLy;
COPYSizeX=RealLx;
smaplx=17;
if(RSCRSizeY==768)smaplx=22;
smaply=smaplx;
smapx=COPYSizeX-(smaplx<<5)-32;
smapy=(RSCRSizeY-(smaply<<5))>>1;
//smapx=7*32;
//smapy=28;
//smaplx=19;
//smaply=19;
mapx=1;
mapy=1;
minix=32;
miniy=32;
MiniMade=false;
Nsel=0;
CreateResMap();
CreateWaterMap();
CreateTZones();
CreateCMap();
InitRenderMap();
};
void NewMap(int szX,int szY)
{
PromptTime=0;
MAXOBJECT=0;
memset(Group,0,sizeof Group);
memset(TrMap,0,sizeof TrMap);
memset(LLock,0,sizeof LLock);
memset(WLock,0,sizeof WLock);
memset(map,0,sizeof map);
memset(NLocks,0,sizeof NLocks);
BuildMode=false;
for(int i=0;i<maxmap;i++)
for(int j=0;j<maxmap;j++){
//map[i][j].BuildingID=65535;
Mops[j][i]=65535;
Died[j][i]=65535;
FlyMops[j][i]=65535;
//map[i][j].FlyID=65535;
};
memset(&tmap[0][0],0,sizeof tmap);
memset(&HiMap[0][0],0,sizeof HiMap);
for(i=0;i<msx;i++)for(int j=0;j<msy;j++){
byte k=Locking[tmap[j][i]];
if(k&1){
LLock[i+1][j+1]=1;
IncLock(j+1,i+1);
TrMap[i+1][j+1]=1;
};
//if(k&2)map[j][i].WaterLock=true;
};
for(i=0;i<=msx+1;i++){
TrMap[i][0]=2;
TrMap[i][msy+1]=2;
LLock[i][0]=2;
IncLock(0,i);
LLock[i][msy+1]=2;
IncLock(msy+1,i);
};
for(i=0;i<msy+1;i++){
TrMap[0][i]=2;
TrMap[msx+1][i]=2;
LLock[0][i]=2;
IncLock(i,0);
LLock[msx+1][i]=2;
IncLock(i,msx+1);
};
MiniMade=false;
Nsel=0;
CreateResMap();
CreateWaterMap();
CreateTZones();
CreateCMap();
InitRenderMap();
SetTiles(0,0,256);
};
void CreateMiniMap()
{
int i,j;
char *yy=(char*)(&tiles);
for(i=0;i<msx;i++)
for(j=0;j<msy;j++)
minimap[i>>1][j>>1]=yy[33+/*33*16+1+*/(int(tmap[j][i])<<10)];
MiniMade=true;
};
const drx[8]={0,1,1,1,0,-1,-1,-1};
const dry[8]={-1,-1,0,1,1,1,0,-1};
extern bool HealthMode;
void GetRect(OneObject* ZZ,int* x,int* y,int* Lx){
int scx,scy;
if(ZZ->OnWater){
scx=(int(ZZ->x)<<5)+(ZZ->Addx)-16;
scy=(int(ZZ->y)<<5)+(ZZ->Addy)-16;
int dy=64;
int dx=64;
if(ZZ->isMoving){
int nsp=ZZ->CurAnm->count;
if(nsp>3){
scx+=div((int(ZZ->CurrentSprite)<<6)*drx[ZZ->Direction],nsp).quot;
scy+=div((int(ZZ->CurrentSprite)<<6)*dry[ZZ->Direction],nsp).quot;
};
};
if(ZZ->capBuilding){
scx+=32;
scy+=32;
};
*x=scx;
*y=scy;
*Lx=dy;
return;
};
if(ZZ->Media==2){
scx=(ZZ->RealX>>4-32)-32;
scy=(ZZ->RealY>>4-32)-16-16+10-ZZ->Height;
*x=scx;
*y=scy;
*Lx=64;
return;
};
scx=(int(ZZ->x)<<5)+ZZ->Addx;
scy=(int(ZZ->y)<<5)+ZZ->Addy;
int dx=ZZ->Lx<<5;
if(ZZ->isMoving){
int nsp=ZZ->CurAnm->count;
if(nsp>3){
scx+=div((int(ZZ->CurrentSprite)<<5)*drx[ZZ->Direction],nsp).quot;
scy+=div((int(ZZ->CurrentSprite)<<5)*dry[ZZ->Direction],nsp).quot;
};
};
*x=scx;
*y=scy;
*Lx=dx;
};
void DrawMarker(OneObject* OB){
if(OB){
int x,y,Lx;
GetRect(OB,&x,&y,&Lx);
x+=smapx-(int(mapx)<<5);
y+=smapy-(int(mapy)<<5);
byte cl=clrYello;
byte c1=0;
byte c2=2;
byte dc=4;
int ddy=-12;
Hline(x+c1,y,x+c2,cl);
Hline(x+Lx-1-c2,y,x+Lx-1-c1,cl);
Hline(x+c1,y+Lx-1,x+c2,cl);
Hline(x+Lx-1-c2,y+Lx-1,x+Lx-1-c1,cl);
Vline(x,y+c1,y+c2,cl);
Vline(x+Lx-1,y+c1,y+c2,cl);
Vline(x,y+Lx-1-c2,y+Lx-1-c1,cl);
Vline(x+Lx-1,y+Lx-1-c2,y+Lx-1-c1,cl);
if(HealthMode){
int mhs=Lx-c2-c2-dc-dc;
int hs=mhs;
if(OB->MaxLife>0){
hs=div(mhs*OB->Life,OB->MaxLife).quot;
};
Vline(-2+x+c2+dc,y+ddy,y+ddy+2,255);
Vline(-2+x+Lx-1-c2,y+ddy,y+ddy+2,255);
Vline(-2+x+c2+dc+1,y+ddy,y+ddy,255);
Vline(-2+x+c2+dc+1,y+ddy+2,y+ddy+2,255);
Vline(-2+x+Lx-1-c2-1,y+ddy,y+ddy,255);
Vline(-2+x+Lx-1-c2-1,y+ddy+2,y+ddy+2,255);
Hline(-2+x+c2+dc+1,y+ddy+1,x+c2+hs+dc+1,clrGreen);
};
/*
Hline(x+1,y+1,x+1,cl);
Hline(x+1,y+Lx-2,x+1,cl);
Hline(x+Lx-2,y+1,x+Lx-2,cl);
Hline(x+Lx-2,y+Lx-2,x+Lx-2,cl);*/
};
};
void DrawMiniMarker(OneObject* OB){
if(OB){
int x,y,Lx;
GetRect(OB,&x,&y,&Lx);
x=x>>1;
y=y>>1;
Lx=Lx>>1;
x+=smapx-(int(mapx)<<4);
y+=smapy-(int(mapy)<<4);
byte cl=clrYello;
byte c1=0;
byte c2=2;
byte dc=4;
int ddy=-12;
Hline(x+c1,y,x+c2,cl);
Hline(x+Lx-1-c2,y,x+Lx-1-c1,cl);
Hline(x+c1,y+Lx-1,x+c2,cl);
Hline(x+Lx-1-c2,y+Lx-1,x+Lx-1-c1,cl);
Vline(x,y+c1,y+c2,cl);
Vline(x+Lx-1,y+c1,y+c2,cl);
Vline(x,y+Lx-1-c2,y+Lx-1-c1,cl);
Vline(x+Lx-1,y+Lx-1-c2,y+Lx-1-c1,cl);
if(HealthMode){
int mhs=Lx-c2-c2-dc-dc;
int hs=mhs;
if(OB->MaxLife>0){
hs=div(mhs*OB->Life,OB->MaxLife).quot;
};
Vline(-2+x+c2+dc,y+ddy,y+ddy+2,255);
Vline(-2+x+Lx-1-c2,y+ddy,y+ddy+2,255);
Vline(-2+x+c2+dc+1,y+ddy,y+ddy,255);
Vline(-2+x+c2+dc+1,y+ddy+2,y+ddy+2,255);
Vline(-2+x+Lx-1-c2-1,y+ddy,y+ddy,255);
Vline(-2+x+Lx-1-c2-1,y+ddy+2,y+ddy+2,255);
Hline(-2+x+c2+dc+1,y+ddy+1,x+c2+hs+dc+1,clrGreen);
};
/*
Hline(x+1,y+1,x+1,cl);
Hline(x+1,y+Lx-2,x+1,cl);
Hline(x+Lx-2,y+1,x+Lx-2,cl);
Hline(x+Lx-2,y+Lx-2,x+Lx-2,cl);*/
};
};
void ShowHealth(OneObject* ZZ){
if(!ZZ->Selected||ZZ->NNUM!=MyNation)return;
DrawMarker(ZZ);
return;
};
void ShowMiniHealth(OneObject* ZZ){
if(!ZZ->Selected||ZZ->NNUM!=MyNation)return;
DrawMiniMarker(ZZ);
return;
};
extern void MakeFog(int x,int y);
void ShowFog(OneObject* ZZ){
if(!(ZZ->InFire||ZZ->capBuilding))return;
if(ZZ->InFire){
if(rando()<2000)MakeFog((int(ZZ->x)<<7),(int(ZZ->y)<<7));
return;
};
if(ZZ->Stage!=ZZ->NStages)return;
int Life=ZZ->Life;
int maxl=ZZ->Ref.Visual->info.Basic.MaxLife;
int m1=maxl>>1;
int m3=m1>>1;
int m2=m1+m3;
int xx,yy;
int DX=int(ZZ->Lx-1)<<3;
if(!DX)DX=1;
if(Life<m1){
if(rando()<8000){
xx=(int(ZZ->x)<<7)+(int(RNTB[DX][rando()&255])<<4);
yy=(int(ZZ->y)<<7)+(int(RNTB[DX][rando()&255])<<4);
MakeFog(xx,yy);
};
if(Life<m2){
if(rando()<8000){
xx=(int(ZZ->x)<<7)+(int(RNTB[DX][rando()&255])<<4);
yy=(int(ZZ->y)<<7)+(int(RNTB[DX][rando()&255])<<4);
MakeFog(xx,yy);
};
};
};
};
void ShowProperty(OneObject* OB){
int mx=smapx+(int(OB->x-mapx)<<5)+OB->Addx;
int my=smapy+(int(OB->y-mapy)<<5)+OB->Addy;
if(OB->isMoving){
int nsp=OB->CurAnm->count;
if(nsp>3){
mx+=div(34*OB->CurrentSprite*drx[OB->Direction],nsp).quot;
my+=div(32*OB->CurrentSprite*dry[OB->Direction],nsp).quot;
};
};
if(OB->xForce>16&&OB->xForce<=32){
ShowRLCItem(mx,my-32,&IMM,3,0);
};
if(OB->xForce>32&&OB->xForce<=48){
ShowRLCItem(mx,my-32,&IMM,3,0);
ShowRLCItem(mx+10,my-32+10,&IMM,1,0);
};
if(OB->xForce>48){
ShowRLCItem(mx,my-32,&IMM,3,0);
ShowRLCItem(mx+10,my-32+10,&IMM,1,0);
ShowRLCItem(mx,my-32+12,&IMM,1,0);
};
if(OB->xForce<16){
ShowRLCItem(mx,my-32,&IMM,0,0);
};
if(OB->Invisible){
ShowRLCItem(mx,my-32,&IMM,3,0);
};
};
static int tmt=0;
void CBar(int x,int y,int Lx,int Ly,byte c);
void ShowMap()
{
int i;
int j;
int scr;
int til;
int uuu=(tmt&31);
tmt++;
for(j=0;j<smaply;j++)
for(i=0;i<smaplx;i++)if(fmap[j+mapy][i+mapx]>512){
scr=int(ScreenPtr)+(i<<5)+smapx+((j<<5)+smapy)*SCRSizeX;
til=int(&tiles)+(int(tmap[i+mapx-1][j+mapy-1])<<10);
int SDX=SCRSizeX-32;
//if(uuu<10)if(TrMap[j+mapy][i+mapx])til=int(&tiles)+1024*98;
//if(uuu>10&&uuu<21)
//if(LLock[j+mapy][i+mapx])til=int(&tiles)+1024*98;
/*__asm{
push esi
push edi
mov eax,31
cld
mov edi,scr
mov esi,til
Lab12: mov ecx,31
rep movsb
inc esi;
inc edi
add edi,ScreenSizeX32
dec eax
jnz Lab12
pop edi
pop esi
}*/
__asm{
push esi
push edi
mov eax,32
cld
mov edi,scr
mov esi,til
Lab12: mov ecx,8
rep movsd
/*fild qword ptr [esi]
fist qword ptr [edi]
fild qword ptr [esi+8]
fist qword ptr [edi+8]
fild qword ptr [esi+16]
fist qword ptr [edi+16]
fild qword ptr [esi+24]
fist qword ptr [edi+24]
add esi,32
add edi,32*/
add edi,SDX
dec eax
jnz Lab12
pop edi
pop esi
};
/*if(LLock[j+mapy][i+mapx])
Xbar(smapx+i*32+2,smapy+j*32+2,28,28,15);
if(TrMap[j+mapy][i+mapx]){
Xbar(smapx+i*32,smapy+j*32,32,32,15);
Xbar(smapx+i*32+1,smapy+j*32+1,30,30,15);
};*/
}
SetRLCWindow(0,smapy,COPYSizeX+128,32*smaply,SCRSizeX);
ShowResScreen();
//SetRLCWindow(smapx,smapy,32*smaplx,32*smaply,32*ScreenSizeX);
for(j=0;j<smaply;j++){
for(i=-1;i<=smaplx;i++){
int p=Died[j+mapy][i+mapx];
if(p!=0xFFFF){
OneObject* GG=Group[p];
Octant* Oc2=GG->CurAnm;
OneSlide* Oc1=&(Oc2->Movie[GG->CurrentSprite]);
byte clr=GG->NNUM;
int spr=Oc1->spr;
if(spr<4096)
if(Group[p]->Invert)
ShowRLCItem((i+1)*32+smapx-Oc1->dx,j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr+4096,clr);
else
ShowRLCItem(i*32+smapx+Oc1->dx,j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr,clr);
//ShowHealth(GG);
//ShowFog(GG);
};
};
for(i=-1;i<=smaplx;i++){
int p=Mops[j+mapy][i+mapx];
if(p!=0xFFFF){
OneObject* GG=Group[p];
int ddy=GG->Addy;
if(ddy<0){
byte clr=GG->NNUM;
Octant* Oc2=GG->CurAnm;
int ddx=GG->Addx;
OneSlide* Oc1=&(Oc2->Movie[GG->CurrentSprite]);
int spr=Oc1->spr;
if(spr<4096)
if(Group[p]->Invert)
ShowRLCItem(ddx+(i+1)*32+smapx-Oc1->dx,ddy+j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr+4096,clr);
else
ShowRLCItem(ddx+i*32+smapx+Oc1->dx,ddy+j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr,clr);
ShowHealth(GG);
ShowProperty(GG);
};
};
};
for(i=-3;i<smaplx;i++){
int p=i+mapx>0?Mops[j+mapy][i+mapx]:0xffff;
if(p!=0xFFFF){
OneObject* GG=Group[p];
int ddy=GG->Addy;
if(ddy==0){
byte clr=GG->NNUM;
if(!(GG->capBuilding&&(GG->x!=i+mapx||GG->y!=j+mapy))){
Octant* Oc2=GG->CurAnm;
int ddx=GG->Addx;
OneSlide* Oc1=&(Oc2->Movie[GG->CurrentSprite]);
int spr=Oc1->spr;
if(spr<4096)
if(Group[p]->Invert)
ShowRLCItem(ddx+(i+1)*32+smapx-Oc1->dx,ddy+j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr+4096,clr);
else
ShowRLCItem(ddx+i*32+smapx+Oc1->dx,ddy+j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr,clr);
ShowHealth(GG);
ShowProperty(GG);
};
};
};
};
for(i=0;i<smaplx;i++){
int p=Mops[j+mapy][i+mapx];
if(p!=0xFFFF){
OneObject* GG=Group[p];
int ddy=GG->Addy;
if(ddy>0){
byte clr=GG->NNUM;
Octant* Oc2=GG->CurAnm;
int ddx=GG->Addx;
OneSlide* Oc1=&(Oc2->Movie[GG->CurrentSprite]);
int spr=Oc1->spr;
if(spr<4096)
if(Group[p]->Invert)
ShowRLCItem(ddx+(i+1)*32+smapx-Oc1->dx,ddy+j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr+4096,clr);
else
ShowRLCItem(ddx+i*32+smapx+Oc1->dx,ddy+j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr,clr);
ShowHealth(GG);
ShowProperty(GG);
};
};
}
};
ProcessExpl();
ShowFlyingMonsters();
ProcessFog();
SetRLCWindow(0,0,COPYSizeX,RSCRSizeY,SCRSizeX);
//void* SCR1=ScreenPtr;
//if(!DDDebug)ScreenPtr=RealScreenPtr;
//ShowBorder();
if(!MiniMade)CreateMiniMap();
int ssx;
int ssy;
if(msx>128)ssx=msx>>3;else ssx=msx>>2;
if(msy>128)ssy=msy>>1;else ssy=msy;
for(i=0;i<ssy;i++){
//if(
scr=int(ScreenPtr)+minix+(i+miniy)*SCRSizeX;
//til=int(&TrMap)+i*maxmap;
til=int(&minimap)+i*maxmap;
//til=int(AsmUsage)+i*128;
//til=int(EUsage)+i*128;
//til=int(&T[0][0])+i*256;
__asm{
push esi
push edi
mov ecx,ssx
cld
mov esi,til
mov edi,scr
rep movsd
uiyt:
/* fild qword ptr [esi]
add esi,8
fist qword ptr [edi]
add edi,8
loop uiyt*/
pop edi
pop esi
}
}
CBar(minix-1,miniy-1,msx+2,msy+2,255);
/*for(i=0;i<msy;i++){
scr=int(RealScreenPtr)+minix+(i+miniy+140)*ScreenSizeX;
//til=int(&TrMap)+i*maxmap;
til=int(&minimap)+i*maxmap;
til=int(OrdUsage)+i*128;
//til=int(EUsage)+i*128;
__asm{
push esi
push edi
mov ecx,ssx
cld
mov esi,til
mov edi,scr
rep movsd
pop edi
pop esi
}
}*/
if(BuildMode){
if(mouseX>=smapx&&mouseY>=smapy&&mouseX<smapx*(smaplx-blx+1)*32&&mouseY<smapy+(smaply-bly+1)*32){
int xxx=mouseX&(65535-31);
int yyy=mouseY&(65535-31);
xxx=mapx+((xxx-smapx)>>5);
yyy=mapy+((yyy-smapy)>>5);
if(!(CheckGold(xxx,yyy,BNat->Mon[BuildingID])&&ManualFogCheck(xxx,yyy,BNat->Mon[BuildingID]->SizeX)&&BNat->CheckBuilding(BuildingID,xxx,yyy)))
RedBar(xxx,yyy,blx,bly);else
WhiteBar(xxx,yyy,blx,bly);
xxx=mouseX&(65535-31);
yyy=mouseY&(65535-31);
ShowRLCItem(xxx+OSB->dx,yyy+OSB->dy,
&MImage[OSB->FileID],OSB->spr,MyNation);
};
};
if(BuildWall)TMPCluster.ShowCluster();
ShowProp();
ShowAbility();
word mp;
OneObject* OO;
byte mxx,myy,val;
for(int g=0;g<MAXOBJECT;g++){
OO=Group[g];
if(OO){
mxx=OO->x>>1;
myy=OO->y>>1;
val=CLRT[OO->NNUM];
scr=int(ScreenPtr)+minix+mxx+(myy+miniy)*SCRSizeX;
__asm{
mov eax,scr
mov bl,val
mov [eax],bl
};
};
};
/*
for(i=0;i<msx;i++)for(j=0;j<msy;j++){
mp=Mops[j][i];
if(mp!=0xFFFF){
scr=int(ScreenPtr)+minix+i+(j+miniy)*SCRSizeX;
byte val=Group[mp]->NMask;
__asm{
mov eax,scr
mov bl,val
mov [eax],bl
};
};
};
*/
AcceptMiniMap();
ShowFoggedBattle();
Xbar(minix+(mapx>>1),miniy+(mapy>>1),smaplx>>1,smaply>>1,14);
//ScreenPtr=SCR1;
int x=mouseX;
int y=mouseY;
ssy=smapy+3;
//if(PromptTime>0){
// ShowString(smapx,smapy+smaply*32-32,Prompt,&f16x16w);
// PromptTime--;
//};
ProcessHint();
ssy+=20;
char ggg[600];
int uxxx=mapx+((mouseX-smapx)>>5);
int uyyy=mapy+((mouseY-smapy)>>5);
OutCInf(uxxx,uyyy);
int sy1=RSCRSizeY-128;
ShowString(5,sy1,"\x1 └Γ≥ε α≥αΩα",&f16x16w);
sy1+=16;
ShowString(5,sy1,"\x1 ╧ε∞επα≥ⁿ ≥εΓα≡Φ∙≤",&f16x16w);
sy1+=16;
ShowString(5,sy1,"\x1 ╬≥Γσ≈α≥ⁿ φα α≥αΩ≤",&f16x16w);
sy1+=16;
ShowString(5,sy1,"\x3\x4 ╧ε≡αµσφΦσ ±≥σφ:10%",&f16x16r);
sy1+=16;
//ShowString(20,RSCRSizeY-64,"\x1\x2\x3\x4\x5\x6\x7",&f16x16w);
sprintf(ggg,"(%d,%d)",uxxx,uyyy);
ShowString(smapx,smapy+smaply*32-64-32,ggg,&f16x16w);
Nation* NT=&NATIONS[MyNation];
//_CrtMemState CMS;
//_CrtMemCheckpoint(&CMS);
//sprintf(ggg,"ALLOCATED:%d" ,CMS.lTotalCount);
//ShowString(smapx,ssy,ggg,&f16x16w);
//ssy+=16;
//sprintf(ggg,"PITCH:%d" ,Pitch);
//ShowString(smapx,ssy,ggg,&f16x16w);
//ssy+=16;
sprintf(ggg,"Farms:%d,Gidot:%d" ,NT->NFarms,NT->NGidot);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"%d,%d" ,LASTIND,LASTRAND);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Time:%d" ,tmtmt);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Sequene errors:%d (%d)" ,SeqErrorsCount,LastRandDif);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
ShowRMap();
if(InfoMode)return;
sprintf(ggg,"Strong factor:%d" ,NForces[MyNation].StrongFactor);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
//if(AttackMode)ShowString(smapx,ssy,"╨σµΦ∞ α≥αΩΦ",&f16x16w);
//else ShowString(smapx,ssy,"╨σµΦ∞ ∩σ≡σ∞σ∙σφΦ ",&f16x16w);
//ssy+=16;
if(EgoFlag)ShowString(smapx,ssy,"╨σµΦ∞ ±ΓαδΦΓαφΦ ε≥ Γ≡απα",&f16x16w);
else ShowString(smapx,ssy,"╨σµΦ∞ ßε≡ⁿß√ ± Γ≡απε∞",&f16x16w);
ssy+=16;
sprintf(ggg,"FPS:%d, Waiting: %d" ,Flips,WaitCycle);
counter=0;
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"┬±σπε ≥Γα≡■Ω:%d",NMONS);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=20;
int sapx=smapx+4;
if(!NSL[MyNation])return;
OneObject* OBB=Group[Selm[MyNation][0]];
if(int(OBB)){
sprintf(ggg,"═ε∞σ≡ Φτß≡αφφεΘ ≥Γα≡■ΩΦ :%d,(x=%d,y=%d)",
OBB->Index,
OBB->x,
OBB->y);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"═≤∞σ≡ ∩δσ∞σφΦ:%d",OBB->NMask);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Vx,Vy=%d,%d",OBB->RealVx,OBB->RealVy);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
/*sprintf(ggg,"┬ετπε≡ΣΦδα±ⁿ δⁿ ≥Γα≡ⁿ?:%d",OBB->Important&1);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;*/
//sprintf(ggg,"╞δεß·:%d",OBB->Egoist&1);
//ShowString(sapx,ssy,ggg,&f16x16w);
//ssy+=16;
if(OBB->CrowdRef){
ssy+=10;
Crowd* CR=OBB->CrowdRef;
ShowString(sapx,ssy,CR->Message,&f16x16w);
ssy+=16;
sprintf(ggg,"└≥αΩεΓα≥ⁿ:");
char gxx[10];
for(int u=0;u<32;u++){
int pp=CR->ForAtt[u];
if(pp!=0xFFFF){
sprintf(gxx,"%d(%d) ",pp,u);
strcat(ggg,gxx);
};
};
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"╫Φ±δσφφε±≥ⁿ:%d",CR->NMembers);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
//sprintf(ggg,"SizeX:%d",L->SizeX1);
//ShowString(sapx,ssy,ggg,&f16x16w);
//ssy+=16;
};
if(OBB->MoveInRect){
sprintf(ggg,"╩ΓαΣ≡α≥ φατφα≈σφΦ :(%d,%d)-(%d,%d)",
OBB->destX,
OBB->destY,
OBB->destX1,
OBB->destY1);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"╥ε≈Ωα φατφα≈σφΦ :(%d,%d)",
OBB->lastX,
OBB->lastY);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=20;
};
if(int(OBB->LocalOrder)){
ShowString(sapx-4,ssy,"╪≥ε ∞φσ φεφ≈σ Σσδα≥ⁿ.",&f16x16w);
ssy+=16;
Order1* LOL=OBB->LocalOrder;
do{
switch(LOL->OrderType){
case 2: sprintf(ggg,"╧εΓσδσφΦσ:(╧εΣⁿ Ωα Γ:x=%d,y=%d)",
LOL->info.MoveToXY.x,
LOL->info.MoveToXY.y);
break;
case 77:sprintf(ggg,"╧εΓσδσφΦσ:(╙ΘΣΦ ± Σε≡επΦ, εΩα φφ√Θ!:dir=%d)%d",
LOL->info.MoveFrom.dir);
break;
case 3:sprintf(ggg,"╧εΓσδσφΦσ:(╠ε≈Φ≥ⁿ ≥Γα≡ⁿ:%d)",
OBB->EnemyID);
break;
default:sprintf(ggg,"╧εΓσδσφΦσ:(─≤≡φΦ÷i Ωi±ⁿ:%d)",
LOL->OrderType);
};
ShowString(sapx,ssy,ggg,&rlf_s);
ssy+=16;
LOL=LOL->NextOrder;
if(ssy>500)return;
}while(int(LOL));
};
ssy=smapy;
sapx=smapx+smaplx*16+100;
/*if(int(OBB->Wars)){
ShowString(sapx,ssy,"Legion information",&f16x16w);
ssy+=20;
Legion* L=OBB->Wars;
sprintf(ggg,"Members:%d",L->NMemb);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Full complectation:%d",L->NNeed);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Minx:%d",L->minx);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Miny:%d",L->miny);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Maxx:%d",L->maxx);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Maxy:%d",L->maxy);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"SizeX:%d",L->SizeX1);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"SizeY:%d",L->SizeY1);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"╧ε≡ ΣεΩ:%d",L->Ordering);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
int wdx=0;
int nn=0;
while(ssy<600-20&&nn<L->NMemb){
int zz=L->Member[nn];
sprintf(ggg,"%d",zz);
ShowString(sapx+wdx*32,ssy,ggg,&f16x16w);
wdx++;
if(wdx>5){
wdx=0;
ssy+=16;
};
nn++;
};
};*/
};
};
void ShowWinner(){
char sss[128]="";
if(!NMyUnits){
strcpy(sss,"┬█ ╧╨╬╚├╨└╦╚ !");
}else{
if(!NThemUnits)
strcpy(sss,"╧╬╟─╨└┬╦▀┼╠ ╧╬┴┼─╚╥┼╦▀!");
};
int lx=GetRLen(sss,&FPassive)>>1;
if(lx)ShowString(smapx+(smaplx<<(Shifter-1))-lx,smapy+(smaply<<(Shifter-1)),sss,&FPassive);
};
//final procedures for graphics output
void miniGFieldShow();
void GFieldShow(){
if(MiniMode){
miniGFieldShow();
return;
};
int i;
int j;
int scr;
int til;
int uuu=(tmt&31);
char ggg[600];
tmt++;
time1=GetTickCount();
if(FogMode){
for(j=0;j<smaply;j++)
for(i=0;i<smaplx;i++)if(fmap[j+mapy][i+mapx]>512){
int til=int(RenderSquare(i+mapx,j+mapy));
if(til){
scr=int(ScreenPtr)+(i<<5)+smapx+((j<<5)+smapy)*SCRSizeX;
int SDX=SCRSizeX-32;
__asm{
push esi
push edi
mov eax,32
cld
mov edi,scr
mov esi,til
Lab12: mov ecx,8
rep movsd
add edi,SDX
dec eax
jnz Lab12
pop edi
pop esi
};
};
};
}else{
for(j=0;j<smaply;j++)
for(i=0;i<smaplx;i++){
int til=int(RenderSquare(i+mapx,j+mapy));
if(til){
scr=int(ScreenPtr)+(i<<5)+smapx+((j<<5)+smapy)*SCRSizeX;
int SDX=SCRSizeX-32;
__asm{
push esi
push edi
mov eax,32
cld
mov edi,scr
mov esi,til
Labx12: mov ecx,8
rep movsd
add edi,SDX
dec eax
jnz Labx12
pop edi
pop esi
};
};
};
};
time6=GetTickCount()-time1;
/*
scr=int(ScreenPtr)+(i<<5)+smapx+((j<<5)+smapy)*SCRSizeX;
til=int(&tiles)+(int(tmap[i+mapx-1][j+mapy-1])<<10);
int SDX=SCRSizeX-32;
__asm{
push esi
push edi
mov eax,32
cld
mov edi,scr
mov esi,til
Lab12: mov ecx,8
rep movsd
add edi,SDX
dec eax
jnz Lab12
pop edi
pop esi
};*/
SetRLCWindow(smapx,smapy,smaplx<<5,smaply<<5,SCRSizeX);
if(EditMapMode){
for(i=0;i<8;i++){
int x=mapPos[i<<1];
int y=mapPos[(i<<1)+1];
if(x>=mapx&&y>=mapy&&x<mapx+smaplx&&y<mapy+smaply){
sprintf(ggg,"%d",i+1);
ShowString(smapx+((x-mapx)<<5)+8,smapy+((y-mapy)<<5)+2,ggg,&f32x32w);
};
};
};
ShowResScreen();
for(j=0;j<smaply;j++){
for(i=-1;i<=smaplx;i++){
int p=Died[j+mapy][i+mapx];
if(p!=0xFFFF){
OneObject* GG=Group[p];
Octant* Oc2=GG->CurAnm;
OneSlide* Oc1=&(Oc2->Movie[GG->CurrentSprite]);
byte clr=GG->NNUM;
int spr=Oc1->spr;
if(spr<4096)
if(Group[p]->Invert)
ShowRLCItem((i+1)*32+smapx-Oc1->dx,j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr+4096,clr);
else
ShowRLCItem(i*32+smapx+Oc1->dx,j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr,clr);
};
};
for(i=-1;i<=smaplx;i++){
int p=Mops[j+mapy][i+mapx];
if(p!=0xFFFF){
OneObject* GG=Group[p];
if(GG){
int ddy=GG->Addy;
if(ddy<0){
byte clr=GG->NNUM;
Octant* Oc2=GG->CurAnm;
int ddx=GG->Addx;
OneSlide* Oc1=&(Oc2->Movie[GG->CurrentSprite]);
int spr=Oc1->spr;
//-----------
int hy=GetHig((int(GG->x)<<5)+GG->Addx,(int(GG->y)<<5)+GG->Addy);
//-----------
if(spr<4096)
if(Group[p]->Invert)
ShowRLCItem(ddx+(i+1)*32+smapx-Oc1->dx,ddy+j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr+4096,clr);
else
ShowRLCItem(ddx+i*32+smapx+Oc1->dx,ddy+j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr,clr);
ShowHealth(GG);
ShowProperty(GG);
};
};
};
};
for(i=-3;i<smaplx;i++){
int p=i+mapx>0?Mops[j+mapy][i+mapx]:0xffff;
if(p!=0xFFFF){
OneObject* GG=Group[p];
if(GG){
int ddy=GG->Addy;
if(ddy==0){
byte clr=GG->NNUM;
if(!(GG->capBuilding&&(GG->x!=i+mapx||GG->y!=j+mapy))){
Octant* Oc2=GG->CurAnm;
//-----------
int hy=GetHig((int(GG->x)<<5)+GG->Addx,(int(GG->y)<<5)+GG->Addy);
//-----------
int ddx=GG->Addx;
OneSlide* Oc1=&(Oc2->Movie[GG->CurrentSprite]);
int spr=Oc1->spr;
if(spr<4096)
if(Group[p]->Invert)
ShowRLCItem(ddx+(i+1)*32+smapx-Oc1->dx,ddy+j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr+4096,clr);
else
ShowRLCItem(ddx+i*32+smapx+Oc1->dx,ddy+j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr,clr);
ShowHealth(GG);
ShowProperty(GG);
};
};
};
};
};
for(i=0;i<smaplx;i++){
int p=Mops[j+mapy][i+mapx];
if(p!=0xFFFF){
OneObject* GG=Group[p];
if(GG){
int ddy=GG->Addy;
if(ddy>0){
byte clr=GG->NNUM;
Octant* Oc2=GG->CurAnm;
//-----------
int hy=GetHig((int(GG->x)<<5)+GG->Addx,(int(GG->y)<<5)+GG->Addy);
//-----------
int ddx=GG->Addx;
OneSlide* Oc1=&(Oc2->Movie[GG->CurrentSprite]);
int spr=Oc1->spr;
if(spr<4096)
if(Group[p]->Invert)
ShowRLCItem(ddx+(i+1)*32+smapx-Oc1->dx,ddy+j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr+4096,clr);
else
ShowRLCItem(ddx+i*32+smapx+Oc1->dx,ddy+j*32+smapy+Oc1->dy,
&MImage[Oc1->FileID],spr,clr);
ShowHealth(GG);
ShowProperty(GG);
};
};
};
}
};
//for(int jj=0;jj<10;jj++)
//ShowSuperFluentFog(smapx+32,smapy+32,31,31,31,0);
ProcessExpl();
ShowFlyingMonsters();
if(FogMode)ProcessFog();
int v1=3;
int v2=158;
//ShowSuperFluentFog32_160(200,200,v1,v1,v1,v2);
//ShowSuperFluentFog32_160(200+32,200,v1,v1,v2,v1);
//ShowSuperFluentFog32_160(200,200+32,v1,v2,v1,v1);
//ShowSuperFluentFog32_160(200+32,200+32,v2,v1,v1,v1);
if(EditMapMode){
if(ChoosePosition)
sprintf(ggg,"╚π≡εΩ %d : ┬√ßε≡ ±≥α≡≥εΓεΘ ∩ετΦ÷ΦΦ.",MyNation);
else sprintf(ggg,"╚π≡εΩ %d.",MyNation+1);
ShowString(smapx+32,smapy+64,ggg,&f16x16w);
};
SetRLCWindow(0,0,COPYSizeX,RSCRSizeY,SCRSizeX);
if(BuildMode){
if(mouseX>=smapx&&mouseY>=smapy&&mouseX<smapx*(smaplx-blx+1)*32&&mouseY<smapy+(smaply-bly+1)*32){
int xxx=mouseX&(65535-31);
int yyy=mouseY&(65535-31);
xxx=mapx+((xxx-smapx)>>5);
yyy=mapy+((yyy-smapy)>>5);
if(!(CheckGold(xxx,yyy,BNat->Mon[BuildingID])&&ManualFogCheck(xxx,yyy,BNat->Mon[BuildingID]->SizeX)&&BNat->CheckBuilding(BuildingID,xxx,yyy)))
RedBar(xxx,yyy,blx,bly);else
WhiteBar(xxx,yyy,blx,bly);
xxx=mouseX&(65535-31);
yyy=mouseY&(65535-31);
ShowRLCItem(xxx+OSB->dx,yyy+OSB->dy,
&MImage[OSB->FileID],OSB->spr,MyNation&3);
};
};
if(BuildWall)TMPCluster.ShowCluster();
if(FogMode)ShowFoggedBattle();
ProcessHint();
ShowDestn();
time7=GetTickCount()-time1-time6;
if(SeqErrorsCount){
ShowString(HintX,HintY-100,"┬═╚╠└═╚┼!!! ═└╨╙╪┼═╚┼ ╤╚═╒╨╬═╚╟└╓╚╚ !!!!",&FActive);
SeqErrorsCount=0;
};
if(EditMapMode){
for(i=0;i<8;i++){
RESRC[i][1]=100000;
RESRC[i][2]=100000;
RESRC[i][3]=100000;
};
}else ShowWinner();
//information
if(HelpMode){
int scx=smapx+64;
int scy=smapy+128;
if(EditMapMode){
ShowString(scx+100,scy,"╨σαΩ≥ε≡ Ωα≡≥√. (F1 - ≤ß≡α≥ⁿ φαΣ∩Φ±Φ)",&f16x16w);
scy+=20;
ShowString(scx,scy,"'P' - Γ√ßε≡ εß·σΩ≥α",&f16x16w);
scy+=20;
ShowString(scx,scy,"F1 - Help",&f16x16w);
scy+=20;
ShowString(scx,scy,"F2 - ╥≡αΓα",&f16x16w);
scy+=20;
ShowString(scx,scy,"F3 - ╧≤±≥√φ ",&f16x16w);
scy+=20;
ShowString(scx,scy,"F4 - ╦σ±",&f16x16w);
scy+=20;
ShowString(scx,scy,"F5 - ┬εΣα",&f16x16w);
scy+=20;
ShowString(scx,scy,"F6 - ╩α∞φΦ",&f16x16w);
scy+=20;
ShowString(scx,scy,"F7 - ╤ετΣα≥ⁿ Γ√∩≤Ωδε±≥ⁿ",&f16x16w);
scy+=20;
ShowString(scx,scy,"F8 - ╤ετΣα≥ⁿ Γ∩αΣΦφ≤",&f16x16w);
scy+=20;
//ShowString(scx,scy,"F8 - ╤πδαµΦΓαφΦσ",&f16x16w);
//scy+=20;
ShowString(scx,scy,"F9 - ≡σµΦ∞ ≤∩≡αΓδσφΦ ",&f16x16w);
scy+=20;
ShowString(scx,scy,"'1'..'9' - ┬√ßε≡ ≡ατ∞σ≡α ∩σ≡α",&f16x16w);
scy+=20;
ShowString(scx,scy,"'W' - ╧ε±≥≡εΘΩα ±≥σφ√",&f16x16w);
scy+=20;
ShowString(scx,scy,"'T' - ┬√ßε≡ ±≥α≡≥εΓεΘ ∩ετΦ÷ΦΦ",&f16x16w);
scy+=20;
ShowString(scx,scy,"'R' - ═α≈αδⁿφ√σ ≡σ±≤≡±√",&f16x16w);
scy+=20;
ShowString(scx,scy,"NUM 1..8 - ┬√ßε≡ φα÷ΦΦ",&f16x16w);
scy+=20;
ShowString(scx,scy,"L - ╨σµΦ∞ Ωα≡≥√",&f16x16w);
scy+=20;
};
};
ShowRMap();
if(EditMapMode)return;
if(InfoMode)return;
int ssy=smapy+3;
ssy+=20;
sprintf(ggg,"LastKey=%d" ,LastKey);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
int uxxx=mapx+((mouseX-smapx)>>5);
int uyyy=mapy+((mouseY-smapy)>>5);
OutCInf(uxxx,uyyy);
sprintf(ggg,"(%d,%d)",uxxx,uyyy);
ShowString(smapx,smapy+smaply*32-64-32,ggg,&f16x16w);
Nation* NT=&NATIONS[MyNation];
sprintf(ggg,"AI=%d" ,NT->AI_Level+1);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Farms:%d,Gidot:%d" ,NT->NFarms,NT->NGidot);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"%d,%d" ,LASTIND,LASTRAND);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"CNTR: %d" ,COUNTER);
ShowString(smapx,ssy,ggg,&f16x16w);
COUNTER=0;
ssy+=16;
sprintf(ggg,"Time 2: %d" ,time2);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Time 3: %d" ,time3);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Time 4: %d" ,time4);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Time 5: %d" ,time5);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Time 6: %d" ,time6);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Time 7: %d" ,time7);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Time 8: %d" ,time8);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Time:%d" ,tmtmt);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Sequene errors:%d (%d)" ,SeqErrorsCount,LastRandDif);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
//if(!InfoMode)return;
sprintf(ggg,"Strong factor:%d" ,NForces[MyNation].StrongFactor);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"RSCRSizeX:%d" ,RSCRSizeX);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"minix=%d,miniy=%d" ,minix,miniy);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"mx=%d,my=%d,lp=%d" ,mouseX,mouseY,Lpressed);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"LPitch:%d" ,ddsd.lPitch);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
if(EgoFlag)ShowString(smapx,ssy,"╨σµΦ∞ ±ΓαδΦΓαφΦ ε≥ Γ≡απα",&f16x16w);
else ShowString(smapx,ssy,"╨σµΦ∞ ßε≡ⁿß√ ± Γ≡απε∞",&f16x16w);
ssy+=16;
sprintf(ggg,"FPS:%d, Waiting: %d" ,Flips,WaitCycle);
counter=0;
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"┬±σπε ≥Γα≡■Ω:%d",NMONS);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=20;
int sapx=smapx+4;
if(!NSL[MyNation])return;
OneObject* OBB=Group[Selm[MyNation][0]];
if(int(OBB)){
sprintf(ggg,"═ε∞σ≡ Φτß≡αφφεΘ ≥Γα≡■ΩΦ :%d,(x=%d,y=%d)",
OBB->Index,
OBB->x,
OBB->y);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"═≤∞σ≡ ∩δσ∞σφΦ:%d",OBB->NMask);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Vx,Vy=%d,%d",OBB->RealVx,OBB->RealVy);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
if(OBB->CrowdRef){
ssy+=10;
Crowd* CR=OBB->CrowdRef;
ShowString(sapx,ssy,CR->Message,&f16x16w);
ssy+=16;
sprintf(ggg,"└≥αΩεΓα≥ⁿ:");
char gxx[10];
for(int u=0;u<32;u++){
int pp=CR->ForAtt[u];
if(pp!=0xFFFF){
sprintf(gxx,"%d(%d) ",pp,u);
strcat(ggg,gxx);
};
};
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"╫Φ±δσφφε±≥ⁿ:%d",CR->NMembers);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
};
if(OBB->MoveInRect){
sprintf(ggg,"╩ΓαΣ≡α≥ φατφα≈σφΦ :(%d,%d)-(%d,%d)",
OBB->destX,
OBB->destY,
OBB->destX1,
OBB->destY1);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"╥ε≈Ωα φατφα≈σφΦ :(%d,%d)",
OBB->lastX,
OBB->lastY);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=20;
};
if(int(OBB->LocalOrder)){
ShowString(sapx-4,ssy,"╪≥ε ∞φσ φεφ≈σ Σσδα≥ⁿ.",&f16x16w);
ssy+=16;
Order1* LOL=OBB->LocalOrder;
do{
switch(LOL->OrderType){
case 2: sprintf(ggg,"╧εΓσδσφΦσ:(╧εΣⁿ Ωα Γ:x=%d,y=%d)",
LOL->info.MoveToXY.x,
LOL->info.MoveToXY.y);
break;
case 77:sprintf(ggg,"╧εΓσδσφΦσ:(╙ΘΣΦ ± Σε≡επΦ, εΩα φφ√Θ!:dir=%d)%d",
LOL->info.MoveFrom.dir);
break;
case 3:sprintf(ggg,"╧εΓσδσφΦσ:(╠ε≈Φ≥ⁿ ≥Γα≡ⁿ:%d)",
OBB->EnemyID);
break;
default:sprintf(ggg,"╧εΓσδσφΦσ:(─≤≡φΦ÷i Ωi±ⁿ:%d)",
LOL->OrderType);
};
ShowString(sapx,ssy,ggg,&rlf_s);
ssy+=16;
LOL=LOL->NextOrder;
if(ssy>500)return;
}while(int(LOL));
};
ssy=smapy;
sapx=smapx+smaplx*16+100;
};
};
void miniShowFlyingMonsters();
void miniShowSuperFog();
void miniGFieldShow(){
int i;
int j;
int scr;
int til;
int uuu=(tmt&31);
char ggg[600];
tmt++;
if(FogMode){
for(j=0;j<smaply;j++)
for(i=0;i<smaplx;i++)if(fmap[j+mapy][i+mapx]>512){
//int til=int(&mtiles[0][0])+(int(tmap[i+mapx-1][j+mapy-1])<<8);
int til=int(RenderMiniSquare(i+mapx,j+mapy));
if(til){
scr=int(ScreenPtr)+(i<<4)+smapx+((j<<4)+smapy)*SCRSizeX;
int SDX=SCRSizeX-16;
__asm{
push esi
push edi
mov eax,16
cld
mov edi,scr
mov esi,til
Lab12: mov ecx,4
rep movsd
add edi,SDX
dec eax
jnz Lab12
pop edi
pop esi
};
};
//if(LLock[j+mapy][i+mapx])
// Xbar((i<<4)+smapx+6,(j<<4)+smapy+6,4,4,255);
};
}else{
for(j=0;j<smaply;j++)
for(i=0;i<smaplx;i++){
//int til=int(&mtiles[0][0])+(int(tmap[i+mapx-1][j+mapy-1])<<8);
int til=int(RenderMiniSquare(i+mapx,j+mapy));
if(til){
scr=int(ScreenPtr)+(i<<4)+smapx+((j<<4)+smapy)*SCRSizeX;
int SDX=SCRSizeX-16;
__asm{
push esi
push edi
mov eax,16
cld
mov edi,scr
mov esi,til
Lab13: mov ecx,4
rep movsd
add edi,SDX
dec eax
jnz Lab13
pop edi
pop esi
};
};
//if(LLock[j+mapy][i+mapx])
// Xbar((i<<4)+smapx+6,(j<<4)+smapy+6,4,4,255);
};
};
SetRLCWindow(smapx,smapy,(smaplx<<4),(smaply<<4),SCRSizeX);
//ShowResScreen();
for(j=0;j<smaply;j++){
for(i=-1;i<=smaplx;i++){
int p=Died[j+mapy][i+mapx];
if(p!=0xFFFF){
OneObject* GG=Group[p];
Octant* Oc2=GG->CurAnm;
OneSlide* Oc1=&(Oc2->Movie[GG->CurrentSprite]);
byte clr=GG->NNUM;
int spr=Oc1->spr;
if(spr<4096)
if(Group[p]->Invert)
ShowRLCItem(((i+1)<<4)+smapx-(Oc1->dx>>1),(j<<4)+smapy+(Oc1->dy>>1),
&miniMImage[Oc1->FileID],spr+4096,clr);
else
ShowRLCItem((i<<4)+smapx+(Oc1->dx>>1),(j<<4)+smapy+(Oc1->dy>>1),
&miniMImage[Oc1->FileID],spr,clr);
};
};
for(i=-1;i<=smaplx;i++){
int p=Mops[j+mapy][i+mapx];
if(p!=0xFFFF){
OneObject* GG=Group[p];
int ddy=GG->Addy>>1;
if(ddy<0){
byte clr=GG->NNUM;
Octant* Oc2=GG->CurAnm;
int ddx=GG->Addx>>1;
OneSlide* Oc1=&(Oc2->Movie[GG->CurrentSprite]);
int spr=Oc1->spr;
//-----------
//int hy=GetHig((int(GG->x)<<5)+GG->Addx,(int(GG->y)<<5)+GG->Addy);
//-----------
if(spr<4096)
if(Group[p]->Invert)
ShowRLCItem(ddx+((i+1)<<4)+smapx-(Oc1->dx>>1),ddy+(j<<4)+smapy+(Oc1->dy>>1),
&miniMImage[Oc1->FileID],spr+4096,clr);
else
ShowRLCItem(ddx+(i<<4)+smapx+(Oc1->dx>>1),ddy+(j<<4)+smapy+(Oc1->dy>>1),
&miniMImage[Oc1->FileID],spr,clr);
ShowMiniHealth(GG);
//ShowProperty(GG);
};
};
};
for(i=-3;i<smaplx;i++){
int p=i+mapx>0?Mops[j+mapy][i+mapx]:0xffff;
if(p!=0xFFFF){
OneObject* GG=Group[p];
int ddy=GG->Addy>>1;
if(ddy==0){
byte clr=GG->NNUM;
if(!(GG->capBuilding&&(GG->x!=i+mapx||GG->y!=j+mapy))){
Octant* Oc2=GG->CurAnm;
//-----------
//int hy=GetHig((int(GG->x)<<5)+GG->Addx,(int(GG->y)<<5)+GG->Addy);
//-----------
int ddx=GG->Addx>>1;
OneSlide* Oc1=&(Oc2->Movie[GG->CurrentSprite]);
int spr=Oc1->spr;
if(spr<4096)
if(Group[p]->Invert)
ShowRLCItem(ddx+((i+1)<<4)+smapx-(Oc1->dx>>1),ddy+(j<<4)+smapy+(Oc1->dy>>1),
&miniMImage[Oc1->FileID],spr+4096,clr);
else
ShowRLCItem(ddx+(i<<4)+smapx+(Oc1->dx>>1),ddy+(j<<4)+smapy+(Oc1->dy>>1),
&miniMImage[Oc1->FileID],spr,clr);
ShowMiniHealth(GG);
//ShowProperty(GG);
};
};
};
};
for(i=0;i<smaplx;i++){
int p=Mops[j+mapy][i+mapx];
if(p!=0xFFFF){
OneObject* GG=Group[p];
int ddy=GG->Addy>>1;
if(ddy>0){
byte clr=GG->NNUM;
Octant* Oc2=GG->CurAnm;
//-----------
//int hy=GetHig((int(GG->x)<<5)+GG->Addx,(int(GG->y)<<5)+GG->Addy);
//-----------
int ddx=GG->Addx>>1;
OneSlide* Oc1=&(Oc2->Movie[GG->CurrentSprite]);
int spr=Oc1->spr;
if(spr<4096)
if(Group[p]->Invert)
ShowRLCItem(ddx+((i+1)<<4)+smapx-(Oc1->dx>>1),ddy+(j<<4)+smapy+(Oc1->dy>>1),
&miniMImage[Oc1->FileID],spr+4096,clr);
else
ShowRLCItem(ddx+(i<<4)+smapx+(Oc1->dx>>1),ddy+(j<<4)+smapy+(Oc1->dy>>1),
&miniMImage[Oc1->FileID],spr,clr);
ShowMiniHealth(GG);
//ShowProperty(GG);
};
};
}
};
//for(int jj=0;jj<10;jj++)
//ShowSuperFluentFog(smapx+32,smapy+32,31,31,31,0);
ProcessExpl();
miniShowFlyingMonsters();
if(FogMode){
ProcessFog();
};
int v1=3;
int v2=158;
//ShowSuperFluentFog32_160(200,200,v1,v1,v1,v2);
//ShowSuperFluentFog32_160(200+32,200,v1,v1,v2,v1);
//ShowSuperFluentFog32_160(200,200+32,v1,v2,v1,v1);
//ShowSuperFluentFog32_160(200+32,200+32,v2,v1,v1,v1);
if(EditMapMode){
if(ChoosePosition)
sprintf(ggg,"╚π≡εΩ %d : ┬√ßε≡ ±≥α≡≥εΓεΘ ∩ετΦ÷ΦΦ.",MyNation);
else sprintf(ggg,"╚π≡εΩ %d.",MyNation+1);
ShowString(smapx+32,smapy+64,ggg,&f16x16w);
};
SetRLCWindow(0,0,COPYSizeX,RSCRSizeY,SCRSizeX);
if(BuildMode){
if(mouseX>=smapx&&mouseY>=smapy&&mouseX<smapx*(smaplx-blx+1)*32&&mouseY<smapy+(smaply-bly+1)*32){
int xxx=mouseX&(65535-15);
int yyy=mouseY&(65535-15);
xxx=mapx+((xxx-smapx)>>4);
yyy=mapy+((yyy-smapy)>>4);
if(!(CheckGold(xxx,yyy,BNat->Mon[BuildingID])&&ManualFogCheck(xxx,yyy,BNat->Mon[BuildingID]->SizeX)&&BNat->CheckBuilding(BuildingID,xxx,yyy)))
RedMiniBar(xxx,yyy,blx,bly);else
WhiteMiniBar(xxx,yyy,blx,bly);
xxx=mouseX&(65535-15);
yyy=mouseY&(65535-15);
ShowRLCItem(xxx+(OSB->dx>>1),yyy+(OSB->dy>>1),
&miniMImage[OSB->FileID],OSB->spr,MyNation);
};
};
if(BuildWall)TMPCluster.ShowCluster();
if(FogMode)
miniShowSuperFog();
ProcessHint();
ShowDestn();
if(SeqErrorsCount){
for(i=0;i<20;i++)
Hline(smapx,i*32+smapy,RSCRSizeX,255);
};
if(EditMapMode){
for(i=0;i<8;i++){
RESRC[i][1]=100000;
RESRC[i][2]=100000;
RESRC[i][3]=100000;
};
}else ShowWinner();
//information
if(HelpMode){
int scx=smapx+64;
int scy=smapy+128;
if(EditMapMode){
ShowString(scx+100,scy,"╨σαΩ≥ε≡ Ωα≡≥√. (F1 - ≤ß≡α≥ⁿ φαΣ∩Φ±Φ)",&f16x16w);
scy+=20;
ShowString(scx,scy,"'P' - Γ√ßε≡ εß·σΩ≥α",&f16x16w);
scy+=20;
ShowString(scx,scy,"F1 - Help",&f16x16w);
scy+=20;
ShowString(scx,scy,"F2 - ╥≡αΓα",&f16x16w);
scy+=20;
ShowString(scx,scy,"F3 - ╧≤±≥√φ ",&f16x16w);
scy+=20;
ShowString(scx,scy,"F4 - ╦σ±",&f16x16w);
scy+=20;
ShowString(scx,scy,"F5 - ┬εΣα",&f16x16w);
scy+=20;
ShowString(scx,scy,"F6 - ╩α∞φΦ",&f16x16w);
scy+=20;
ShowString(scx,scy,"F7 - ╤ετΣα≥ⁿ Γ√∩≤Ωδε±≥ⁿ",&f16x16w);
scy+=20;
ShowString(scx,scy,"F8 - ╤ετΣα≥ⁿ Γ∩αΣΦφ≤",&f16x16w);
scy+=20;
//ShowString(scx,scy,"F8 - ╤πδαµΦΓαφΦσ",&f16x16w);
//scy+=20;
ShowString(scx,scy,"F9 - ≡σµΦ∞ ≤∩≡αΓδσφΦ ",&f16x16w);
scy+=20;
ShowString(scx,scy,"'1'..'9' - ┬√ßε≡ ≡ατ∞σ≡α ∩σ≡α",&f16x16w);
scy+=20;
ShowString(scx,scy,"'W' - ╧ε±≥≡εΘΩα ±≥σφ√",&f16x16w);
scy+=20;
ShowString(scx,scy,"'L' - ┬√ßε≡ ±≥α≡≥εΓεΘ ∩ετΦ÷ΦΦ",&f16x16w);
scy+=20;
ShowString(scx,scy,"'R' - ═α≈αδⁿφ√σ ≡σ±≤≡±√",&f16x16w);
scy+=20;
ShowString(scx,scy,"NUM 1..8 - ┬√ßε≡ φα÷ΦΦ",&f16x16w);
scy+=20;
};
};
ShowRMap();
if(EditMapMode&&NSL[MyNation]){
OneObject* OBB=Group[Selm[MyNation][0]];
if(int(OBB)){
if(EditMapMode){
if(OBB->PathX){
for(int i=OBB->CurIPoint;i<OBB->NIPoints;i++){
int xx=smapx+((int(OBB->PathX[i])-mapx)<<4);
int yy=smapy+((int(OBB->PathY[i])-mapy)<<4);
Xbar(xx+13,yy+13,6,6,255);
};
};
};
};
};
if(EditMapMode)return;
if(InfoMode)return;
int ssy=smapy+3;
ssy+=20;
sprintf(ggg,"LastKey=%d" ,LastKey);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
int uxxx=mapx+((mouseX-smapx)>>5);
int uyyy=mapy+((mouseY-smapy)>>5);
OutCInf(uxxx,uyyy);
sprintf(ggg,"(%d,%d)",uxxx,uyyy);
ShowString(smapx,smapy+smaply*32-64-32,ggg,&f16x16w);
Nation* NT=&NATIONS[MyNation];
sprintf(ggg,"AI=%d" ,NT->AI_Level+1);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Farms:%d,Gidot:%d" ,NT->NFarms,NT->NGidot);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"%d,%d" ,LASTIND,LASTRAND);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"%d" ,COUNTER);
COUNTER=0;
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Time:%d" ,tmtmt);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Sequene errors:%d (%d)" ,SeqErrorsCount,LastRandDif);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
//if(!InfoMode)return;
sprintf(ggg,"Strong factor:%d" ,NForces[MyNation].StrongFactor);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"RSCRSizeX:%d" ,RSCRSizeX);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"minix=%d,miniy=%d" ,minix,miniy);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"mx=%d,my=%d,lp=%d" ,mouseX,mouseY,Lpressed);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"LPitch:%d" ,ddsd.lPitch);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
if(EgoFlag)ShowString(smapx,ssy,"╨σµΦ∞ ±ΓαδΦΓαφΦ ε≥ Γ≡απα",&f16x16w);
else ShowString(smapx,ssy,"╨σµΦ∞ ßε≡ⁿß√ ± Γ≡απε∞",&f16x16w);
ssy+=16;
sprintf(ggg,"FPS:%d, Waiting: %d" ,Flips,WaitCycle);
counter=0;
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"┬±σπε ≥Γα≡■Ω:%d",NMONS);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=20;
int sapx=smapx+4;
if(!NSL[MyNation])return;
OneObject* OBB=Group[Selm[MyNation][0]];
if(int(OBB)){
sprintf(ggg,"═ε∞σ≡ Φτß≡αφφεΘ ≥Γα≡■ΩΦ :%d,(x=%d,y=%d)",
OBB->Index,
OBB->x,
OBB->y);
ShowString(smapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"═≤∞σ≡ ∩δσ∞σφΦ:%d",OBB->NMask);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"Vx,Vy=%d,%d",OBB->RealVx,OBB->RealVy);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
if(OBB->CrowdRef){
ssy+=10;
Crowd* CR=OBB->CrowdRef;
ShowString(sapx,ssy,CR->Message,&f16x16w);
ssy+=16;
sprintf(ggg,"└≥αΩεΓα≥ⁿ:");
char gxx[10];
for(int u=0;u<32;u++){
int pp=CR->ForAtt[u];
if(pp!=0xFFFF){
sprintf(gxx,"%d(%d) ",pp,u);
strcat(ggg,gxx);
};
};
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"╫Φ±δσφφε±≥ⁿ:%d",CR->NMembers);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
};
if(OBB->MoveInRect){
sprintf(ggg,"╩ΓαΣ≡α≥ φατφα≈σφΦ :(%d,%d)-(%d,%d)",
OBB->destX,
OBB->destY,
OBB->destX1,
OBB->destY1);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=16;
sprintf(ggg,"╥ε≈Ωα φατφα≈σφΦ :(%d,%d)",
OBB->lastX,
OBB->lastY);
ShowString(sapx,ssy,ggg,&f16x16w);
ssy+=20;
};
if(int(OBB->LocalOrder)){
ShowString(sapx-4,ssy,"╪≥ε ∞φσ φεφ≈σ Σσδα≥ⁿ.",&f16x16w);
ssy+=16;
Order1* LOL=OBB->LocalOrder;
do{
switch(LOL->OrderType){
case 2: sprintf(ggg,"╧εΓσδσφΦσ:(╧εΣⁿ Ωα Γ:x=%d,y=%d)",
LOL->info.MoveToXY.x,
LOL->info.MoveToXY.y);
break;
case 77:sprintf(ggg,"╧εΓσδσφΦσ:(╙ΘΣΦ ± Σε≡επΦ, εΩα φφ√Θ!:dir=%d)%d",
LOL->info.MoveFrom.dir);
break;
case 3:sprintf(ggg,"╧εΓσδσφΦσ:(╠ε≈Φ≥ⁿ ≥Γα≡ⁿ:%d)",
OBB->EnemyID);
break;
default:sprintf(ggg,"╧εΓσδσφΦσ:(─≤≡φΦ÷i Ωi±ⁿ:%d)",
LOL->OrderType);
};
ShowString(sapx,ssy,ggg,&rlf_s);
ssy+=16;
LOL=LOL->NextOrder;
if(ssy>500)return;
}while(int(LOL));
};
ssy=smapy;
sapx=smapx+smaplx*16+100;
};
};
void ShowNucl();
void GMiniShow(){
if(!MiniMade)CreateMiniMap();
int ssx;
int ssy;
if(msx>=128)ssx=msx>>3;else ssx=msx>>2;
if(msy>=128)ssy=msy>>1;else ssy=msy;
for(int i=0;i<ssy;i++){
int scr=int(ScreenPtr)+minix+(i+miniy)*SCRSizeX;
int til=int(&minimap)+i*maxmap;
//int til=int(OrdUsage)+i*128;
__asm{
push esi
push edi
mov ecx,ssx
cld
mov esi,til
mov edi,scr
rep movsd
uiyt: pop edi
pop esi
}
}
word mp;
OneObject* OO;
byte mxx,myy,val;
for(int g=0;g<MAXOBJECT;g++){
OO=Group[g];
if(OO){
mxx=(OO->x-1)>>1;
myy=(OO->y-1)>>1;
val=CLRT[OO->NNUM];
int scr=int(ScreenPtr)+minix+mxx+(myy+miniy)*SCRSizeX;
__asm{
mov eax,scr
mov bl,val
mov [eax],bl
};
};
};
if(EditMapMode){
int x=mapPos[(MyNation<<1)]>>1;
int y=mapPos[(MyNation<<1)+1]>>1;
SetRLCWindow(minix,miniy,msx>>1,msy>>1,SCRSizeX);
Hline(minix+x-2,miniy+y,minix+x-2+4,255);
Vline(minix+x,miniy+y-2,miniy+y-2+4,255);
SetRLCWindow(0,0,COPYSizeX,RSCRSizeY,SCRSizeX);
};
if(FogMode)AcceptMiniMap();
ShowNucl();
Xbar(minix+(mapx>>1),miniy+(mapy>>1),smaplx>>1,smaply>>1,14);
ShowMiniDestn();
int mx2=msx>>1;
int my2=msy>>1;
Hline(minix-1,miniy-1,minix+mx2,15);
Hline(minix-1,miniy+my2,minix+mx2,15);
Vline(minix-1,miniy-1,miniy+my2,15);
Vline(minix+mx2,miniy,miniy+my2,15);
};
//------------------------------------
#define step 1
void SetEgoFlag(bool Ego){
word MID;
OneObject* OB;
for(int i=0;i<Nsel;i++){
MID=SlMons[i];
if(MID!=0xFFFF){
OB=Group[MID];
if(int(OB))OB->Egoist=Ego;
};
};
};
extern int ReliefBrush;
extern int TerrBrush;
bool SelSoundDone;
extern int SelSoundType;
extern bool SelSoundReady;
void DoSelSound(int type){
if(!SelSoundDone){
SelSoundDone=true;
SelSoundReady=true;
SelSoundType=type;
};
};
extern bool fixed;
extern bool realLpressed;
extern bool realRpressed;
void MFix(){
fixed=true;
if(Lpressed)Lpressed=realLpressed;
if(Rpressed)Rpressed=realRpressed;
};
void HandleMouse(int x,int y)
{
bool cooren=false;
bool mini=false;
int xmx,ymy;
if(x>=minix&&y>=miniy&&x<minix+(msx>>1)&&y<miniy+(msy>>1)){
SetRLCWindow(minix,miniy,msx>>1,msy>>1,SCRSizeX);
Hline(x-4,y,x-4+8,255);
Vline(x,y-4,y-4+8,255);
SetRLCWindow(0,0,COPYSizeX,RSCRSizeY,SCRSizeX);
cooren=true;
xmx=(x-minix)<<1;
ymy=(y-miniy)<<1;
if(xmx<1)xmx=1;
if(ymy<1)ymy=1;
if(xmx>=msx)xmx=msx-1;
if(ymy>=msy)ymy=msy-1;
xmx=(xmx<<5)+16;
ymy=(ymy<<5)+16;
mini=true;
}else{
if(x>smapx&&y>smapy&&x<smapx+(smaplx<<5)&&y<smapy+(smaply<<5)){
xmx=(mapx<<5)+((x-smapx)<<(5-Shifter));
ymy=(mapy<<5)+((y-smapy)<<(5-Shifter));
cooren=true;
};
};
if(GetCoord){
if(Lpressed){
if(cooren){
if(UNIM)UNIM(0,xmx>>5,ymy>>5);
};
Lpressed=false;
curptr=0;
curdx=0;
curdy=0;
GetCoord=false;
DoSelSound(1);
MFix();
return;
}
if(Rpressed){
curptr=0;
curdx=0;
curdy=0;
GetCoord=false;
MFix();
return;
};
};
if(SpecCmd==1)
CmdCreateGoodSelection(MyNation,0,0,msx<<5,msy<<5);
if(SpecCmd==2)CmdCreateGoodSelection(MyNation,mapx<<5,mapy<<5,(mapx+smaplx-1)<<5,(mapy+smaply-1)<<5);
//Select all peasants
if(SpecCmd==3)CmdCreateGoodKindSelection(MyNation,0,0,msx<<5,msy<<5,0);
//On screen
if(SpecCmd==4)CmdCreateGoodKindSelection(MyNation,mapx<<5,mapy<<5,(mapx+smaplx-1)<<5,(mapy+smaply-1)<<5,0);
//Select all warriors
if(SpecCmd==5)CmdCreateGoodKindSelection(MyNation,0,0,msx<<5,msy<<5,2);
//On screen
if(SpecCmd==6)CmdCreateGoodKindSelection(MyNation,mapx<<5,mapy<<5,(mapx+smaplx-1)<<5,(mapy+smaply-1)<<5,2);
//Select all towers
if(SpecCmd==7)CmdCreateGoodKindSelection(MyNation,0,0,msx<<5,msy<<5,1);
//On screen
if(SpecCmd==8)CmdCreateGoodKindSelection(MyNation,mapx<<5,mapy<<5,(mapx+smaplx-1)<<5,(mapy+smaply-1)<<5,1);
//Select all buildings
if(SpecCmd==9)CmdCreateGoodKindSelection(MyNation,0,0,msx<<5,msy<<5,4);
//On screen
if(SpecCmd==10)CmdCreateGoodKindSelection(MyNation,mapx<<5,mapy<<5,(mapx+smaplx-1)<<5,(mapy+smaply-1)<<5,4);
//Select all dragons
if(SpecCmd==13)CmdCreateGoodKindSelection(MyNation,0,0,msx<<5,msy<<5,5);
//On screen
if(SpecCmd==14)CmdCreateGoodKindSelection(MyNation,mapx<<5,mapy<<5,(mapx+smaplx-1)<<5,(mapy+smaply-1)<<5,5);
if(SpecCmd==200)CmdDie(MyNation);
if(SpecCmd==201)CmdSitDown(MyNation);
if(SpecCmd==11){
word NSel=NSL[MyNation];
if(NSel){
word MID=Selm[MyNation][0];
if(MID!=0xFFFF){
OneObject* OB=Group[MID];
if(OB)CmdCreateGoodTypeSelection(MyNation,0,0,msx<<5,msy<<5,OB->NIndex);
};
};
};
if(SpecCmd==12){
word NSel=NSL[MyNation];
if(NSel){
word MID=Selm[MyNation][0];
if(MID!=0xFFFF){
OneObject* OB=Group[MID];
if(OB)CmdCreateGoodTypeSelection(MyNation,mapx<<5,mapy<<5,(mapx+smaplx-1)<<5,(mapy+smaply-1)<<5,OB->NIndex);
};
};
};
SpecCmd=0;
byte MyMask=NATIONS[MyNation].NMask;
ControlZones();
WallHandleMouse(x,y);
if(BuildWall)goto Edgetest;
int xxx;
int yyy;
if(cooren){
xxx=xmx>>5;
yyy=ymy>>5;
if(Lpressed&&!mini){
if(ChoosePosition){
mapPos[(MyNation<<1)]=xxx;
mapPos[(MyNation<<1)+1]=yyy;
ChoosePosition=false;
};
if(HeightEditMode){
CreateBlob(xxx-1,yyy-1,4*BlobMode,ReliefBrush);
goto Edgetest;
};
if(MEditMode){
PutPoint(xxx-1,yyy-1,TerrBrush,EditMedia);
goto Edgetest;
};
if(Creator<200){
//for(int i=0;i<2;i++)for(int j=0;j<2;j++)
CmdCreateTerrain(MyNation,xxx,yyy,Creator);
MFix();
return;
};
if(Creator==254){
OILMAP[yyy>>1][xxx>>1]=60000;
};
if(BuildMode){
if(CheckGold(xxx,yyy,BNat->Mon[BuildingID])&&ManualFogCheck(xxx,yyy,NATIONS[MyNation].Mon[BuildingID]->SizeX))
CmdCreateBuilding(MyNation,xxx,yyy,BuildingID);
if(!(GetKeyState(VK_SHIFT)&0x8000))BuildMode=false;
Lpressed=false;
MFix();
return;
};
};
};
if(cooren){
int gx=xmx;
int gy=ymy;
int gx1=StartX;
int gy1=StartY;
if(gx>gx1){int z=gx;gx=gx1;gx1=z;};
if(gy>gy1){int z=gy;gy=gy1;gy1=z;};
int xxx=xmx>>5;
int yyy=ymy>>5;
int xxx1=StartX>>5;
int yyy1=StartY>>5;
if(xxx1<xxx){int z=xxx;xxx=xxx1;xxx1=z;};
if(yyy1<yyy){int z=yyy;yyy=yyy1;yyy1=z;};
if(Lpressed&&!mini){
if(!SelSoundDone){
SelSoundDone=true;
SelSoundReady=true;
SelSoundType=0;
};
SetRLCWindow(smapx,smapy,smaplx<<Shifter,smaply<<Shifter,SCRSizeX);
Xbar(smapx+((StartX-(mapx<<5))>>(5-Shifter)),smapy+((StartY-(mapy<<5))>>(5-Shifter)),
x-(smapx+((StartX-(mapx<<5))>>(5-Shifter))),
y-(smapy+((StartY-(mapy<<5))>>(5-Shifter))),254);
int nn=0;
CmdCreateGoodSelection(MyNation,gx,gy,gx1,gy1);
} else{
if(!mini){
StartX=xmx;
StartY=ymy;
SelSoundReady=false;
SelSoundDone=false;
};
};
if(Rpressed&&NSL[MyNation]>0&&!mini){
DoSelSound(1);
Rpressed=false;
if(GetKeyState(VK_CONTROL)&0x8000){
CmdSetDst(MyNation,xxx,yyy);
return;
};
byte rk=GetResourceKind(xxx,yyy);
if(rk!=0){
CmdTakeRes(MyNation,xxx,yyy,rk);
CmdSendToXY(MyNation,xxx,yyy);
goto Edgetest;
};
word LNK=Links[yyy][xxx];
if(LNK!=0xFFFF){
WallCluster* WC=&GWALLS.GWC[LNK];
if(WC->OwnerID==MyNation)
CmdRepairWall(MyNation,LNK);
else CmdDamageWall(MyNation,LNK);
}else{
word Att=GetEnemy(gx,gy,MyNation);//Mops[yyy][xxx];
word Fri=GetFriend(gx,gy,MyNation);
if(Fri!=0xFFFF){
OneObject* FOBJ=Group[Fri];
if(FOBJ->Transport){
CmdSendToTransport(MyNation,Fri);
return;
};
if(FOBJ->capTeleport&&FOBJ->Ready){
CmdSendToPoint(MyNation,FOBJ->x+1,FOBJ->y+2);
return;
};
if((FOBJ->NMask&MyMask)&&FOBJ->Ref.General->OnOil&&FOBJ->Stage==FOBJ->NStages)
CmdGetOil(MyNation,Fri);
else if(FOBJ->capBuilding&&FOBJ->Life<FOBJ->MaxLife)
CmdBuildObj(MyNation,Fri);
else CmdSendToXY(MyNation,xxx,yyy);
};
if(Att!=0xFFFF){
OneObject* AOBJ=Group[Att];
if(int(AOBJ)){
if(AOBJ->capTeleport&&AOBJ->Ready){
CmdSendToPoint(MyNation,AOBJ->x+1,AOBJ->y+2);
return;
};
if(!(AOBJ->NMask&MyMask))
CmdAttackObj(MyNation,Att);
else CmdSendToXY(MyNation,xxx,yyy);
}else CmdSendToXY(MyNation,xxx,yyy);
}else CmdSendToXY(MyNation,xxx,yyy);
};
}else{
if(Rpressed&&NSL[MyNation]>0)CmdSendToXY(MyNation,xmx>>5,ymy>>5);
};
};
Edgetest:
if ((x<6)&&(mapx-step>0)) mapx-=step;
if ((y<6)&&(mapy-step>0)) mapy-=step;
if ((x>RealLx-29)&&(mapx+smaplx+step<msx)) mapx+=step;
if ((y>RealLy-6)&&(mapy+smaply+step<msy))
mapy+=step;
if((Lpressed)&&(mouseX>minix)&&(mouseY>miniy)&&
(mouseX<minix+(msx>>1))&&(mouseY<miniy+(msy>>1))){
mapx=(x-minix-(smaplx>>2))<<1;
mapy=(y-miniy-(smaply>>2))<<1;
if(mapx<=0)mapx=1;
if(mapy<=0)mapy=1;
if(mapx+smaplx>msx+1)mapx=msx-smaplx+1;
if(mapy+smaply>msy+1)mapy=msy-smaply+1;
}
MFix();
};
void doooo(){
Group[0]->Selected=true;
SlMons[0]=0;
Nsel=1;
mapx=20;
mapy=20;
Group[0]->SendTo(32,32,0);
};
void ReRenderMap();
void SetMiniMode(){
if(MiniMode)return;
ReRenderMap();
mapx=mapx-(smaplx>>1);
mapy=mapy-(smaply>>1);
if(mapx<1)mapx=1;
if(mapy<1)mapy=1;
smaplx=smaplx<<1;
smaply=smaply<<1;
MiniMode=true;
Shifter=4;
Multip=1;
if(mapx+smaplx>msx)mapx=msx-smaplx;
if(mapy+smaply>msy)mapy=msy-smaply;
};
void ClearMiniMode(){
MiniMode=false;
ReRenderMap();
Shifter=5;
Multip=0;
mapx+=(smaplx>>2);
mapy+=(smaply>>2);
smaplx=(RSCRSizeX-160)>>5;
smaply=RSCRSizeY>>5;
};