Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- enum Sides {UP, RIGHT, DOWN, LEFT};
- int P[4][256];
- int Z[4][256];
- int getp(int s, int x)
- {
- if (P[s][P[s][x]]!=P[s][x])
- P[s][x] = getp(s,P[s][x]);
- return P[s][x];
- }
- void join(int s, int x, int y)
- {
- x = getp(s,x);
- y = getp(s,y);
- if (rand()&1)
- P[s][x] = y;
- else
- P[s][y] = x;
- }
- // MAIN CODE
- for (int s=0; s<4; ++s)
- for (int i=0; i<256; ++i)
- {
- P[s][i] = i;
- Z[s][i] = -1;
- }
- FILE *log = fopen("log.txt","w");
- for (int i=4; i<6; ++i)
- {
- char buff[20];
- sprintf(buff,"maps\\map_%02d.bin",i);
- LoadMap(buff);
- for (int x=3; x<60; ++x)
- for (int y=3; y<60; ++y)
- {
- int a = duneGround[x][y];
- if (x>0)
- {
- // b|a
- int b = duneGround[x-1][y];
- if (Z[LEFT][a] != -1)
- join(RIGHT,b,Z[LEFT][a]);
- if (Z[RIGHT][b] != -1)
- join(LEFT,a,Z[RIGHT][b]);
- Z[LEFT][a] = b;
- Z[RIGHT][b] = a;
- }
- if (x<64-1)
- {
- // a|b
- int b = duneGround[x+1][y];
- if (Z[RIGHT][a] != -1)
- join(LEFT,b,Z[RIGHT][a]);
- if (Z[LEFT][b] != -1)
- join(RIGHT,a,Z[LEFT][b]);
- Z[RIGHT][a] = b;
- Z[LEFT][b] = a;
- }
- if (y>0)
- {
- // b
- // a
- int b = duneGround[x][y-1];
- if (Z[UP][a] != -1)
- join(DOWN,b,Z[UP][a]);
- if (Z[DOWN][b] != -1)
- join(UP,a,Z[DOWN][b]);
- Z[UP][a] = b;
- Z[DOWN][b] = a;
- }
- if (x<64-1)
- {
- // a
- // b
- int b = duneGround[x][y+1];
- if (Z[DOWN][a] != -1)
- join(UP,b,Z[DOWN][a]);
- if (Z[UP][b] != -1)
- join(DOWN,a,Z[UP][b]);
- Z[DOWN][a] = b;
- Z[UP][b] = a;
- }
- }
- }
- for (int s=0; s<4; ++s)
- for (int i=0; i<256; ++i)
- {
- getp(s,i);
- }
- for (int x=0; x<64; ++x)
- for (int y=0; y<64; ++y)
- duneGround[x][y]=0;
- bool was[256];
- int ww[256];
- memset(was,0,sizeof(was));
- memset(ww,-1,sizeof(ww));
- int X = 0, Y = 0, side = RIGHT, type = 0;
- for (;;)
- {
- int id;
- bool q = false;
- for (id=0; id<256; ++id)
- if (!was[id])
- break;
- if (id == 256)
- break;
- id = getp(side,id);
- fprintf(log,"\nTYPE %d:\n",type);
- int b = -1;
- for (int i=0; i<256; ++i)
- if (getp(side,i) == id)
- if (Z[side][i] != -1)
- {
- b = Z[side][i];
- break;
- }
- for (int i=0; i<256; ++i)
- if (getp(side,i) == id)
- {
- was[i] = true;
- if (b == -1)
- continue;
- q = true;
- fprintf(log,"%02X ",i);
- ww[i] = type;
- duneGround[X][Y]=i;
- duneGround[X+1][Y]=b;
- X+=4;
- if (X == 64)
- {
- Y+=2;
- X=0;
- if (Y == 64)
- break;
- }
- }
- if (q)
- ++type;
- if (Y == 64)
- break;
- if (b != -1)
- {
- Y+=2;
- X=0;
- if (Y == 64)
- break;
- }
- if (Y == 64)
- break;
- }
- for (int i=0; i<256; ++i)
- if (ww[i] != -1)
- fprintf(log,"type[%02X]=%d\n",i,ww[i]);
- fprintf(log,"====\n");
- type = 0;
- Y-=2;
- memset(was,0,sizeof(was));
- memset(ww,-1,sizeof(ww));
- for (;;)
- {
- int id;
- bool q = false;
- for (id=0; id<256; ++id)
- if (!was[id])
- break;
- if (id == 256)
- break;
- id = getp(DOWN,id);
- fprintf(log,"\nTYPE %d:\n",type);
- int b = -1;
- for (int i=0; i<256; ++i)
- if (getp(DOWN,i) == id)
- if (Z[DOWN][i] != -1)
- {
- b = Z[DOWN][i];
- break;
- }
- for (int i=0; i<256; ++i)
- if (getp(DOWN,i) == id)
- {
- was[i] = true;
- if (b == -1)
- continue;
- q = true;
- fprintf(log,"%02X ",i);
- ww[i] = type;
- duneGround[X][Y]=i;
- duneGround[X][Y+1]=b;
- X+=2;
- if (X == 64)
- {
- Y+=2;
- X=0;
- if (Y == 64)
- break;
- }
- }
- if (q)
- ++type;
- if (Y == 64)
- break;
- X+=2;
- if (X == 64)
- {
- Y+=2;
- X=0;
- if (Y == 64)
- break;
- }
- if (Y == 64)
- break;
- }
- for (int i=0; i<256; ++i)
- if (ww[i] != -1)
- fprintf(log,"type[%02X]=%d\n",i,ww[i]);
- //LoadMap("maps\\map_03.bin");
- fclose(log);
Advertisement
Add Comment
Please, Sign In to add comment