git » fp-git.git » commit 19f96f3

*** empty log message ***

author peter_k
2005-06-23 10:33:33 UTC
committer peter_k
2005-06-23 10:33:33 UTC
parent ed8bbc92f33dc7d745b29149b965611a0d22f944

*** empty log message ***

poprecog/poprecog.c +95 -45

diff --git a/poprecog/poprecog.c b/poprecog/poprecog.c
index e4d68f5..897a577 100644
--- a/poprecog/poprecog.c
+++ b/poprecog/poprecog.c
@@ -57,6 +57,7 @@ struct sDirInfo
   int optTwoDirections;
   int optMaxRecognizedNumber;
   int optMinImagePercent;
+  //int optVolatile;
 } dirInfo[MAX_DIRS];
 int dirsNumber;
 
@@ -65,16 +66,21 @@ typedef struct sRecognized
   int imageID;
   int posX, posY;
   int goodPixels;
+  int goodPixelsPercent;
   int ownedPixels; // for recognizeMap
 } tRecognized;
 tRecognized recognized[MAX_RECOGNIZED_ITEMS];
 int recognizedNumber;
 
 int recognizeMap[320][200]; // here are stored information which 'recognize result' have this pixel
+/*IN FUTUREint transparentMap[320][200];*/
 
 FILE *outputFile;
 char outputFileName[20];
 
+int optRecognizeMethod;
+int optMaxLayers;
+
 /* Functions */
 
 //#define MAX(A, B) (A > B) ? (A) : (B)
@@ -108,8 +114,8 @@ int cmptImage(void *a, void *b)
 
 int cmptRecognized(void *a, void *b)
 {
-  register int pxa = ((tRecognized*)(a))->ownedPixels;
-  register int pxb = ((tRecognized*)(b))->ownedPixels;
+  register int pxa = ((tRecognized*)(a))->goodPixelsPercent;
+  register int pxb = ((tRecognized*)(b))->goodPixelsPercent;
   if (pxa>pxb)
     return -1;
   if (pxa<pxb)
@@ -154,39 +160,62 @@ inline int putImageOnRecognizeMap(BITMAP *bitmap, int posX, int posY, int recogn
   register int x, y, value;
   register short transparentPixel = makecol16(0, 0, 0);
   register short screenShotTransparentPixel = makecol16(255, 0, 255);
-/*  int pixelsChanged = 0;
+  
+/*  int lastRecognizedID = -1, OK = 0;
   
   for (x = 0; x < bitmap->w; x++)
-    for (y = 0; y < bitmap->h; y++)
-      if (recognized[recognizedID].goodPixels > recognizeMap[posX+x][posY+y]) recognized[recognizedID].ownedPixels++;
-
-  do
   {
-    pixelsChanged = 0;*/
-    for (x = 0; x < bitmap->w; x++)
-      for (y = 0; y < bitmap->h; y++)  
+    for (y = 0; y < bitmap->h; y++)  
+    {
+      value = recognizeMap[posX+x][posY+y];
+      if ((((short *)bitmap->line[y])[x] != transparentPixel) &&       
+          (((short *)bitmap->line[y])[x] == ((short *)screenShot->line[posY+y])[posX+x]))
       {
-        value = recognizeMap[posX+x][posY+y];
-        if ((((short *)bitmap->line[y])[x] != transparentPixel) &&       
-            (((short *)bitmap->line[y])[x] == ((short *)screenShot->line[posY+y])[posX+x]))
+        if (value == -1)
         {
-          if (value == -1)
-          {
-            recognizeMap[posX+x][posY+y] = recognizedID;
-            recognized[recognizedID].ownedPixels++;
-          }
+        }
+        else
+        if (recognized[value].goodPixelsPercent < recognized[recognizedID].goodPixelsPercent)
+        {
+          if (lastRecognizedID == 0)
+            lastRecognizedID = value;
           else
-          if (recognized[value].goodPixels < recognized[recognizedID].goodPixels)
+          if (lastRecognizedID != value)
           {
-            recognized[value].ownedPixels--;
-            recognizeMap[posX+x][posY+y] = recognizedID;
-            recognized[recognizedID].ownedPixels++;
+            OK = 1;
+            break;
           }
         }
-      }  
-/*  }    
-  while (pixelsChange != 0)*/
-  return recognized[recognizedID].ownedPixels;  
+      }
+    }
+    if (OK) break;
+  }
+  if (lastRecognizedID == -1) OK = 1;
+    
+  if (!OK) return 0;*/
+
+  for (x = 0; x < bitmap->w; x++)
+    for (y = 0; y < bitmap->h; y++)  
+    {
+      value = recognizeMap[posX+x][posY+y];
+      if ((((short *)bitmap->line[y])[x] != transparentPixel) &&       
+          (((short *)bitmap->line[y])[x] == ((short *)screenShot->line[posY+y])[posX+x]))
+      {
+        if (value == -1)
+        {
+          recognizeMap[posX+x][posY+y] = recognizedID;
+          recognized[recognizedID].ownedPixels++;
+        }
+        else
+        if (recognized[value].goodPixelsPercent < recognized[recognizedID].goodPixelsPercent)
+        {
+          recognized[value].ownedPixels--;
+          recognizeMap[posX+x][posY+y] = recognizedID;
+          recognized[recognizedID].ownedPixels++;
+        }  
+      }
+    }
+ return recognized[recognizedID].ownedPixels;  
 }
 
 int removeImageFromRecognizeMap(BITMAP *bitmap, int posX, int posY)
@@ -387,6 +416,7 @@ int findImageOnScreenShot(int imageID)
           recognized[recognizedNumber].posX = posX;  
           recognized[recognizedNumber].posY = posY;
           recognized[recognizedNumber].goodPixels = /*(*/tmp/* * 100) / image[imageID].pixelsNumber*//* + tmp*/;
+          recognized[recognizedNumber].goodPixelsPercent = (recognized[recognizedNumber].goodPixels*100)/image[recognized[recognizedNumber].imageID].pixelsNumber;
           recognized[recognizedNumber].ownedPixels = 0;
           recognizedNumber++;          
           dirInfo[image[imageID].dirID].recognizedNumber++;
@@ -404,7 +434,7 @@ int findImageOnScreenShot(int imageID)
         //if (recognizedNumber%100 == 0) printf("# Already recognized %d images\n", recognizedNumber);
 //          printf("Found %s %c %d %d\n", image[imageID].filePath, image[imageID].direction, posX, posY);        
         // int putImageOnRecognizeMap(BITMAP *bitmap, int posX, int posY, int recognizedID)
-          if (putImageOnRecognizeMap(image[imageID].bitmap, posX, posY, recognizedNumber-1))
+/*          if (putImageOnRecognizeMap(image[imageID].bitmap, posX, posY, recognizedNumber-1))
           {
             //cutImageFromTransparentScreenShot(image[imageID].bitmap, posX, posY);
             
@@ -415,7 +445,7 @@ int findImageOnScreenShot(int imageID)
             //save_bitmap(buf, bitmapToFind, 0);
           }
           else
-            recognizedNumber--;
+            recognizedNumber--;*/
         }  
       }  
     }
@@ -427,11 +457,11 @@ void recognizeScreenShot(int screenShotID)
   char buf[100];
   int x, y;  
   int i, j, k, l, tmp;
-  int sessionNumber = 0;
+  int layerNumber = 0;
   int totalNumberOfRecognizedImages = 0;
   short transparentPixel = makecol(0, 0, 0);
   register short screenShotTransparentPixel = makecol(255, 0, 255);  
-  int maxPixelsNumber, maxPixelsID;
+  int maxPixelsPercent, maxPixelsID;
   //int maxImages, tmp, nrOfRecognizedImages, nrOfRecognizedImagesThisSession;
   
   printf("Recognizing %s\n", screenShotList[screenShotID].fileName);
@@ -446,15 +476,18 @@ void recognizeScreenShot(int screenShotID)
     {
       recognizeMap[i][j] = -1;
     }
+/*IN FUTURE  for (i = 0; i < 320; i++)
+    for (j = 0; j < 200; j++)
+    {
+      transparentMap[i][j] = -1;
+    }    */
   for (i = 0; i < dirsNumber; i++)
     dirInfo[i].recognizedNumber = 0;
     
   do
   {
-    sessionNumber++;
-    if (sessionNumber > 3) break;
-    printf("# Session %d\n", sessionNumber);
-    fprintf(outputFile, "# Session %d\n", sessionNumber);   
+    if ((optMaxLayers != 0) && (layerNumber+1 > optMaxLayers)) break;
+    printf("# Checking layer %d\n", layerNumber);
 //    i = 0;
 //    for (y = 0; y < recognizedNumber; y++)
 //      if (recognized[y].ownedPixels != 0) i++;
@@ -470,8 +503,10 @@ void recognizeScreenShot(int screenShotID)
 //    for (y = 0; y < recognizedNumber; y++)
 //      if (recognized[y].ownedPixels != 0) j++;    
     j = recognizedNumber;
-    sprintf(buf, "ss_%02d_s_%d.bmp", screenShotID, sessionNumber);
+    sprintf(buf, "ss_%02d_s_%d.bmp", screenShotID, layerNumber);
     save_bitmap(buf, transparentScreenShot, 0);      
+    
+    layerNumber++;    
   }
   while (j - i != 0);
   
@@ -481,17 +516,25 @@ void recognizeScreenShot(int screenShotID)
 //      recognizeMap[i][j] = -1;
 //    }
     
-//  qsort(recognized, recognizedNumber, sizeof(tRecognized), cmptRecognized);    
+  qsort(recognized, recognizedNumber, sizeof(tRecognized), cmptRecognized);    
+  
+  for (i = 0; i < recognizedNumber; i++)
+  {
+    printf("Found %s %c %d %d (OW:%d / GO:%d / PR: %d / TO:%d)\n", image[recognized[i].imageID].filePath, image[recognized[i].imageID].direction, recognized[i].posX, recognized[i].posY, recognized[i].ownedPixels, recognized[i].goodPixels, recognized[i].goodPixelsPercent, image[recognized[i].imageID].pixelsNumber);
+    rest(100);
+  }  
+  
+  return 13;
 
   for(;;)
   {
-    maxPixelsNumber = 0;
+    maxPixelsPercent = 0;
     maxPixelsID = -1;
     for (i = 0; i < recognizedNumber; i++)
     {
-      if (recognized[i].goodPixels > maxPixelsNumber)
+      if /*((recognized[i].ownedPixels != 0) &&*/ (recognized[i].goodPixelsPercent > maxPixelsPercent)/*)*/
       {
-        maxPixelsNumber = recognized[i].goodPixels;
+        maxPixelsPercent = recognized[i].goodPixelsPercent;
         maxPixelsID = i;
       }
     }
@@ -506,7 +549,7 @@ void recognizeScreenShot(int screenShotID)
       totalNumberOfRecognizedImages++;     
       cutImageFromDEBUGScreenShot(image[recognized[maxPixelsID].imageID].bitmap, recognized[maxPixelsID].posX, recognized[maxPixelsID].posY);
       cutImageFromScreenShot(image[recognized[maxPixelsID].imageID].bitmap, recognized[maxPixelsID].posX, recognized[maxPixelsID].posY);
-      recognized[maxPixelsID].goodPixels = 0;
+      recognized[maxPixelsID].goodPixelsPercent = 0;
 /*      for (k = 0; k < 320; k++)
         for (l = 0; l < 200; l++)
         {
@@ -524,10 +567,10 @@ void recognizeScreenShot(int screenShotID)
       printf("Found %s %c %d %d (OW:%d / GO:%d / TO:%d)\n", image[recognized[maxPixelsID].imageID].filePath, image[recognized[maxPixelsID].imageID].direction, recognized[maxPixelsID].posX, recognized[maxPixelsID].posY, recognized[maxPixelsID].ownedPixels, recognized[maxPixelsID].goodPixels, image[recognized[maxPixelsID].imageID].pixelsNumber);
       fprintf(outputFile, "Found %s %c %d %d (OW:%d / GO:%d / TO:%d)\n", image[recognized[maxPixelsID].imageID].filePath, image[recognized[maxPixelsID].imageID].direction, recognized[maxPixelsID].posX, recognized[maxPixelsID].posY, recognized[maxPixelsID].ownedPixels, recognized[maxPixelsID].goodPixels, image[recognized[maxPixelsID].imageID].pixelsNumber);      
       /* debug screenshots */
-      //blit(transparentScreenShot, DEBUGScreenShot, 0, 0, 0, 0, 320, 200);
-      //blit(image[recognized[maxPixelsID].imageID].bitmap, DEBUGScreenShot, 0, 0, recognized[maxPixelsID].posX, recognized[maxPixelsID].posY, image[recognized[maxPixelsID].imageID].bitmap->w, image[recognized[maxPixelsID].imageID].bitmap->h);
-      //sprintf(buf, "ss_%02d_%03d.bmp", screenShotID, totalNumberOfRecognizedImages);
-      //save_bitmap(buf, DEBUGScreenShot, 0);      
+      /*blit(transparentScreenShot, DEBUGScreenShot, 0, 0, 0, 0, 320, 200);
+      blit(image[recognized[maxPixelsID].imageID].bitmap, DEBUGScreenShot, 0, 0, recognized[maxPixelsID].posX, recognized[maxPixelsID].posY, image[recognized[maxPixelsID].imageID].bitmap->w, image[recognized[maxPixelsID].imageID].bitmap->h);
+      sprintf(buf, "ss_ds_%02d_%03d.bmp", screenShotID, totalNumberOfRecognizedImages);
+      save_bitmap(buf, DEBUGScreenShot, 0);*/
     }
     else
       break;
@@ -651,6 +694,7 @@ void readDir(int dirID)
     dirInfo[dirID].optTwoDirections = 1;    
     dirInfo[dirID].optMaxRecognizedNumber = 9999;
     dirInfo[dirID].optMinImagePercent = 30;
+    //dirInfo[dirID].optVolatile = 0;
   }  
 
   while (file = readdir(dir))
@@ -783,7 +827,13 @@ void readParameters()
       break; 
   }
   
-  printf("\nStep 3. Type output filename\nIf you will type file which exist it will be appended.\n");
+  printf("\nStep 3. Type number of recognize method\n0 = Fast (the best for pop1&2 kid's&enemy's)\n1 = Volatile (for pop1 swords and pop1&2 tiles, walls etc)\n");
+  scanf("%d", &optRecognizeMethod);
+  
+  printf("\nStep 4. Type number of maximum layers\nHINT:\nIf you'll type 0, poprecog will automatically detect the number of layers,\nbut it is not recommended for tiles, walls, cinematic etc.\n");
+  scanf("%d", &optMaxLayers);  
+  
+  printf("\nStep 5. Type output filename\nIf you will type file which exist it will be appended.\n");
   scanf("%s", outputFileName);  
   
   printf("\n");