Просмотр исходного кода

Merge pull request #123 from myst6re/master

Do not use data_page2 if layer_index == 0
paulsapps 11 лет назад
Родитель
Сommit
4bbf5c87c6

+ 3 - 0
QGearsMain/include/data/QGearsBackgroundFileSerializer.h

@@ -47,6 +47,7 @@ namespace QGears
            ,BIT_MASK_BLUE   = 0x001F
            ,BIT_SIZE        = 0x001F
            ,BIT_MASK_RGB    = BIT_MASK_BLUE | BIT_MASK_GREEN | BIT_MASK_RED
+           ,SPRITE_DST_MAX      = 1024
         };
 
         struct Header
@@ -98,6 +99,8 @@ namespace QGears
         static const Ogre::Real src_big_SCALE;
 
     private:
+        void removeBuggySprites( SpriteList &sprites );
+
         Header  m_header;
         size_t m_layer_index;
     };

+ 16 - 1
QGearsMain/src/data/QGearsBackgroundFile.cpp

@@ -265,7 +265,22 @@ namespace QGears
             {
                 if (sprite.palette_page >= palette->getPages().size())
                 {
-                    Ogre::LogManager::getSingleton().stream() << "Error: palette page Index out of Bounds " << sprite.palette_page;
+                    // fr_e substrative blending hack
+                    if (mName.compare("fr_e.background") == 0 && sprite.has_blending && palette->getPages().size() == 2)
+                    {
+                        sprite.palette_page = sprite.data_page > 16; // Repair palette id
+                        sprite.blending = 2; // Substrative blending
+                    }
+                    // lastmap hack
+                    else if (mName.compare("lastmap.background") == 0 && sprite.has_blending && palette->getPages().size() >= 7)
+                    {
+                        sprite.palette_page = 6; // Repair palette id
+                        sprite.blending = 2; // Substrative blending
+                    }
+                    else
+                    {
+                        Ogre::LogManager::getSingleton().stream() << "Error: palette page Index out of Bounds " << sprite.palette_page;
+                    }
                 }
                 const PaletteFile::Page& palette_page(palette->getPage(sprite.palette_page));
                 bool firstColorHidden(false);

+ 25 - 2
QGearsMain/src/data/QGearsBackgroundFileSerializer.cpp

@@ -152,6 +152,29 @@ namespace QGears
         stream->skip( 2 * 2 ); // 2 * uint16 unused;
         m_layer_index = layer_index;
         readVector( stream, pDest->sprites, sprite_count );
+
+        removeBuggySprites( pDest->sprites );
+    }
+
+    //---------------------------------------------------------------------
+    void
+    BackgroundFileSerializer::removeBuggySprites( SpriteList &sprites )
+    {
+        auto it = sprites.begin();
+        while (it != sprites.end())
+        {
+            const SpriteData &sprite = (*it);
+
+            if (std::abs(sprite.dst.x) > SPRITE_DST_MAX
+                    || std::abs(sprite.dst.y) > SPRITE_DST_MAX)
+            {
+                it = sprites.erase(it);
+            }
+            else
+            {
+                ++it;
+            }
+        }
     }
 
     //---------------------------------------------------------------------
@@ -212,8 +235,8 @@ namespace QGears
         readShort( stream, pDest.blending );
         readShort( stream, pDest.data_page );
         readShort( stream, pDest.data_page2 );
-        // when data_page2 != 0, it must be used instead of data_page
-        if ( pDest.data_page2 )
+        // when data_page2 != 0, it must be used instead of data_page (not for the first layer)
+        if ( m_layer_index > 0 && pDest.data_page2 )
         {
             pDest.src = pDest.src2;
             pDest.data_page = pDest.data_page2;