DIV (Game Maker 2000) FPG und MAP Ausleser

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Suco-X

Betreff: DIV (Game Maker 2000) FPG und MAP Ausleser

BeitragMo, Feb 20, 2006 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Der Game Maker 2000, auch bekannt unter DIV, war früher eine der besten BASIC ähnlichen Sprachen für DOS.
Da es dafür recht hübsche Grafiken gibt, wünschen sich viele schon seit Ewigkeiten einen Konverter, der ihnen die Grafiken aus FPG und MAP Dateien ausliest und in ein moderneres Format speichert.
Gesagt, getan. Danke an D20 für das Einscannen der Formatdaten, hier die Lib.

Code: [AUSKLAPPEN]

Strict

Rem
DIV (Game Maker 2000) Fpg und Map reader by Suco-X

End Rem


Type TDivPaletteHeader
   Field HeaderName:String
   Field Unknown:Int
   Field Version:Byte
End Type


Type TDivPalette
   Field R:Byte[256]
   Field G:Byte[256]
   Field B:Byte[256]
End Type


Type TFpgPack
   Field Files:TList = New TList

   Method AddFile(File:TFPGFIle)
      Files.AddLast(File)
   End Method
   
   Method Mask(R:Byte, G:Byte, B:Byte)
      For Local File:TFpgFile = EachIn Files
         File.Mask(R, G, B)
      Next
   End Method
   
End Type



Type TDivFile
   Field Pixmap:TPixmap
   Field Width:Int
   Field Height:Int
   Field Beschreibung:String
   
   Method Mask(R:Byte, G:Byte, B:Byte)
      Pixmap = MaskPixmap(Pixmap, R, G, B)
   End Method
   
End Type


Type TFpgFile Extends TDivFile
   Field Dateiname:String
End Type


Type TMapFile Extends TDivFile
End Type


Type TDiv

   Function ReadFPG:TFpgPack(Filename:String)
      Local Stream:TStream     = Null
      Local HeaderName:String  = ""
      Local Unknown:Int        = 0
      Local Version:Int        = 0
      Local Palette:TDivPalette   = Null
      Local FpgPack:TFpgPack   = Null
      
      
      Stream = ReadFile(Filename)
      
      If Not Stream
         Return Null
      EndIf
      
      HeaderName = Stream.ReadString(3)
      
      If HeaderName<>"fpg"
         Return Null
      EndIf
      
      Unknown    = Stream.ReadInt()
      Version    = Stream.ReadByte()
      
      SeekStream(Stream, 8)
      Palette = ReadPalette(Stream)
   
      SeekStream(Stream, 1352)
      FpgPack = New TFpgPack
      
      While Not Stream.EOF()
         Local GrafikCode:Int      = Stream.ReadInt()
         Local RegisterSize:Int    = Stream.ReadInt()
         Local Beschreibung:String = Stream.ReadString(32).Trim()
         Local Dateiname:String    = Stream.ReadString(12).Trim()
         Local Width:Int           = Stream.ReadInt()
         Local Height:Int          = Stream.ReadInt()
         Local PointCount:Int      = Stream.ReadInt()
         Local Pixmap:TPixmap      = Null

         
         For Local i:Int = 0 Until Dateiname.Length
            If Dateiname[i] = 0
               Dateiname = Dateiname[..i].Trim()
            EndIf
         Next
         
         
         For Local i:Int = 0 Until Beschreibung.length
            If Beschreibung[i] = 0
               Beschreibung = Beschreibung[..i].Trim()
            EndIf
         Next
   
         For Local i:Int = 0 Until PointCount
            Stream.ReadShort()
            Stream.ReadShort()
         Next
         
         Pixmap = CreatePixmap(Width, Height, PF_RGB888)
         
         For Local Y:Int = 0 Until Height
            For Local X:Int = 0 Until Width
               Local Index:Byte
               Local Data:Byte Ptr
               
               index   = Stream.ReadByte()
               Data    = Pixmap.PixelPtr(X,Y)
               
               Data[0] = Palette.R[Index]
               Data[1] = Palette.G[Index]
               Data[2] = Palette.B[Index]
            Next
         Next
         
         If Pixmap
            Local FpgFile:TFpgFile = New TFpgFile
            FpgFile.Pixmap       = Pixmap
            FpgFile.Width        = Width
            FpgFile.Height       = Height
            FpgFile.Beschreibung = Beschreibung
            FpgFile.Dateiname    = Dateiname
            FpgPack.AddFile(FpgFile)
         EndIf
         
      Wend
      
      Stream.Close()
      
      Return FpgPack
   End Function


   Function ReadMap:TMapFile(Filename:String)

      Local Stream:TStream      = Null
      Local HeaderName:String   = ""
      Local Unklar:Int          = 0
      Local Version:Byte        = 0
      Local Width:Int           = 0
      Local Height:Int          = 0
      Local Grafikcode:Int      = 0
      Local Beschreibung:String = ""
      Local PointCount:Int      = 0
      Local Palette:TDivPalette    = Null
      Local Pixmap:TPixmap      = Null
      Local MapFile:TMapFile    = Null
      
      Stream = ReadFile(Filename)
      
      If Not Stream
         Return Null
      EndIf
      
      HeaderName   = Stream.ReadString(3)
      
      If HeaderName<>"map"
         Return Null
      EndIf
      
      Unklar       = Stream.ReadInt()
      Version      = Stream.ReadByte()
      Width        = Stream.ReadShort()
      Height       = Stream.ReadShort()
      Grafikcode   = Stream.ReadInt()
      Beschreibung = Stream.ReadString(32)
      Beschreibung = Beschreibung.Trim()
      
      For Local i:Int = 0 Until Beschreibung.length
         If Beschreibung[i] = 0
            Beschreibung = Beschreibung[..i].Trim()
         EndIf
      Next
      
      
      SeekStream(Stream, 48)
      Palette = ReadPalette(Stream)
      
      SeekStream(Stream, 1392)
      PointCount = Stream.ReadShort()
      
      SeekStream(Stream, 1394+(4*PointCount))
      Pixmap = CreatePixmap(Width, Height, PF_RGB888)
      
      For Local Y:Int = 0 Until Height
         For Local X:Int = 0 Until Width
            Local Index:Byte
            Local Data:Byte Ptr
            
            index   = Stream.ReadByte()
            Data    = Pixmap.PixelPtr(X,Y)
            
            Data[0] = Palette.R[Index]
            Data[1] = Palette.G[Index]
            Data[2] = Palette.B[Index]
         Next
      Next
      
      If Pixmap
         MapFile                = New TMapFile
         MapFile.Width          = Width
         MapFile.Height         = Height
         MapFile.Beschreibung   = Beschreibung
         MapFile.Pixmap         = Pixmap
      EndIf
      
      Stream.Close()
      
      Return MapFile
   End Function


   Function ReadPalette:TDivPalette(Stream:TStream)
      Local Palette:TDivPalette
      Local Mul:Int
      
      Palette = New TDivPalette
      Mul =  (256/63)
      For Local i:Int = 0 Until 256
         Palette.R[i] = Stream.ReadByte()*Mul
         Palette.G[i] = Stream.ReadByte()*Mul
         Palette.B[i] = Stream.ReadByte()*Mul
      Next
      
      Return Palette
   End Function
   
   
   Function ReadPaletteHeader:TDivPaletteHeader(Stream:TStream)
      Local Header:TDivPaletteHeader
      Header            = New TDivPaletteHeader
      Header.HeaderName = Stream.ReadString(3)
      Header.Unknown    = Stream.ReadInt()
      Header.Version    = Stream.ReadByte()
      Return Header
   End Function
   
End Type


'Beispiel für dass auslesen und speichern einer DIV Fpg Datei
Rem
Local Pack1:TFpgPack = TDiv.ReadFPG("WOMAN.FPG")

If Not Pack1
   End
EndIf

Pack1.Mask(0,0,0)

For Local File:TFpgFile = EachIn Pack1.Files
   SavePixmapPNG(File.Pixmap,"grafiken/"+File.Beschreibung+".png")
Next
End Rem




'Beispiel für dass auslesen und speichern einer DIV Map Datei
Rem
Local Map1:TMapFile = TDiv.ReadMap("MENU.MAP")
SavePixmapPNG(Map1.Pixmap, "MENU.png")
End Rem



Alternativ noch eine Zip Datei mit Code und Beispielen. Kann aber nicht für die ewige Existenz des Links bürgen.

http://www.eastwestgames.de/file.php?id=150

Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

NBGames

Betreff: Wie meinst du das mit dem Stream ?

BeitragMo, Mai 15, 2006 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab Netzwerk aufgebaut E0F kam (ist ja klar dabei heraus) doch mit der Datei ist die Information verloren gegangen und es bricht ab...

Ich mach zurzeit ein genial tolles Groß projekt... Wink bin ganz stolz wenns Fertig ist ..

Ps NBGames
Ps: Niko - NBGames° - www.nbgames.de.gg

Suco-X

BeitragMo, Mai 15, 2006 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Sicher das du hier richtig bist?
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group