Skip to content

Instantly share code, notes, and snippets.

@codec-abc
Created May 28, 2021 21:23
Show Gist options
  • Select an option

  • Save codec-abc/e6aaa77438d317fed508351eb6e38ec2 to your computer and use it in GitHub Desktop.

Select an option

Save codec-abc/e6aaa77438d317fed508351eb6e38ec2 to your computer and use it in GitHub Desktop.
open System
open System.Collections.Generic
open System.IO
open SixLabors.ImageSharp
open SixLabors.ImageSharp.PixelFormats
let mapTut1 = @"C:\Users\codec\Desktop\Stealth_Combat_Tools-master\data\uncompressed\app\maps\tut1"
let originalDataFile = @"C:\Users\codec\Desktop\Stealth_Combat_Tools-master\scripts\data\SCom.idp"
let tut1Map = @"C:\Users\codec\Desktop\Stealth_Combat_Tools-master\scripts\data\tut1"
let outputFile = @"C:\Users\codec\Desktop\Stealth_Combat_Tools-master\Stealth Combat\SCom.idp"
let startPos = 0xD62B
let startIndexTut1Map = 0x380B76F
// let reverseBytes(bytes: byte [], startPos: int, length: int, reverse: bool): byte[] =
// let mutable subSequence = List<byte>()
// for i in 0..length - 1 do
// // Console.WriteLine ("Hex: {0:X}", bytes.[startPos + i])
// subSequence.Add(bytes.[startPos + i])
// let inOrderArray = Array.ofSeq subSequence
// if reverse then
// Array.rev inOrderArray
// else
// inOrderArray
// [<EntryPoint>]
// let main argv =
// let bytes = File.ReadAllBytes(mapTut1)
// for i in 0..(3*4) do
// let subArray = reverseBytes(bytes, startPos + (i * 4), 4, true)
// let number = BitConverter.ToInt32(subArray, 0)
// Console.WriteLine ("Hex: {0:X}", number)
// let number = BitConverter.ToSingle(subArray, 0)
// printfn "number is %f" number
// printfn "Done"
// 0
//[<EntryPoint>]
//let main argv =
// let tut1MapBytes = File.ReadAllBytes(tut1Map)
// let dataFileBytes = File.ReadAllBytes(originalDataFile)
// let mutable offset = 0
// for b in tut1MapBytes do
// dataFileBytes.[startIndexTut1Map + offset] <- tut1MapBytes.[offset]
// offset <- offset + 1
// File.WriteAllBytes(outputFile, dataFileBytes)
// 0
//[<EntryPoint>]
//let main argv =
// let binMapPath = @"C:\Users\codec\Desktop\Stealth_Combat_Tools-master\scripts\data\map.bin"
// let binMapBytes = File.ReadAllBytes(binMapPath)
// let reader = new BinaryReader(new MemoryStream(binMapBytes))
// let image = Image<L16>(640, 640)
// let lines = List<String>()
// lines.Add("o heightmap")
// lines.Add(" ")
// //let pixmap = Array.create 640 (Array.create 640 (int16 0))
// let pixmap = Array2D.init 640 640 (fun a b -> (int16) 0)
// for t in 0..39 do
// for x in 0..639 do
// for y in 0..15 do
// let height = reader.ReadInt16() // height as a 16 bit integer
// let flags = reader.ReadInt16() // FF 8F
// let flags1 = reader.ReadInt16() // unknown
// let flags2 = reader.ReadInt16() // unknown
// let xf = (float) x
// let yf = (float) y + (16.0 * (float) t)
// let mutable heightf = (float) height
// let scaleFactor = 1.0 / 300.0
// heightf <- heightf * scaleFactor
// let line = sprintf "v %f %f %f" xf yf heightf
// pixmap.[(int) xf, (int) yf] <- height
// lines.Add(line)
// ()
// reader.Dispose()
// let objOutputPath = @"C:\Users\codec\Desktop\Stealth_Combat_Tools-master\scripts\data\heightmap.obj"
// File.WriteAllLines(objOutputPath, lines)
// for y in 0..639 do
// let pixelRowSpan = image.GetPixelRowSpan(y)
// for x in 0..639 do
// pixelRowSpan.[x] <- L16((uint16) pixmap.[x, y])
// let pngPath = @"C:\Users\codec\Desktop\Stealth_Combat_Tools-master\scripts\data\heightmap.png"
// let encoder = Formats.Png.PngEncoder()
// encoder.BitDepth <- Formats.Png.PngBitDepth.Bit16
// image.SaveAsPng(pngPath, encoder)
// printfn "%s" "done"
// Console.ReadLine()
// 0
let rgb565ToRGB2 hexValue =
let r = (hexValue &&& 0xF800) >>> 8 // rrrrr... ........ -> rrrrr000
let g = (hexValue &&& 0x07E0) >>> 3 // .....ggg ggg..... -> gggggg00
let b = (hexValue &&& 0x1F) <<< 3
(byte r, byte g, byte b)
let rgb565ToRGB1 hexValue =
let r = (hexValue &&& 0xF800) >>> 11
let g = (hexValue &&& 0x07E0) >>> 5
let b = hexValue &&& 0x001F
let r = (r * 255) / 31
let g = (g * 255) / 63
let b = (b * 255) / 31
(byte r, byte g, byte b)
[<EntryPoint>]
let main argv =
let tut1MapBytes = File.ReadAllBytes(@"C:\Users\codec\Desktop\Stealth_Combat_Tools-master\scripts\data\tut4map.texture")
let nbBytes = tut1MapBytes.Length
let nbPixels = nbBytes / 4
let sizeX = 128
let sizeY = 128
let backgroundColor = Rgba32(byte 0, byte 255, byte 255, byte 255)
let mutable counter = 0
let tileX = 3
let tileY = 44
let image = new Image<Rgba32>(tileX * sizeX + 500, tileY * sizeY + 500, backgroundColor)
let readPalette = fun () ->
let palette = List<Rgba32>()
for index in 0..(256 + 8 - 1) do
if index = 1 then
let letter = tut1MapBytes.[counter]
let letterString = System.Text.Encoding.ASCII.GetString([|letter|])
printfn "%s" letterString
let r = tut1MapBytes.[counter]
counter <- counter + 1
let g = tut1MapBytes.[counter]
counter <- counter + 1
let b = tut1MapBytes.[counter]
counter <- counter + 1
let a = tut1MapBytes.[counter]
counter <- counter + 1
let pixel = Rgba32(r, g, b, (byte) 255 - a)
palette.Add(pixel)
palette
let readChunk = fun (tileIndexX, tileIndexY) ->
let currentTile = new Image<Rgba32>(sizeX, sizeY, backgroundColor)
let palette = readPalette()
for y in 0..(sizeY - 1) do
for x in 0..(sizeX - 1) do
let index = tut1MapBytes.[counter]
let pixel = palette.[(int) index + 8]
let margin = 0
let xIndex = x + tileIndexX * (sizeX + margin)
let yIndex = y + (tileIndexY * (sizeY + margin))
image.[xIndex, yIndex] <- pixel
currentTile.[x, y] <- pixel
counter <- counter + 1
let imagePalette = new Image<Rgba32>(17, 17)
let path = sprintf "%s-%i-%i.png" @"C:\Users\codec\Desktop\Stealth_Combat_Tools-master\scripts\data\textures\palette-(yx)-" tileIndexY tileIndexX
let mutable paletteCurrentIndex = 0
for pixel in palette do
let paletteIndexX = paletteCurrentIndex % 17
let paletteIndexY = paletteCurrentIndex / 17
imagePalette.[paletteIndexX, paletteIndexY] <- pixel
paletteCurrentIndex <- paletteCurrentIndex + 1
imagePalette.SaveAsPng(path)
let path = sprintf "%s-%i-%i.png" @"C:\Users\codec\Desktop\Stealth_Combat_Tools-master\scripts\data\textures\tile-(yx)-" tileIndexY tileIndexX
currentTile.SaveAsPng(path)
for tileIndexY in 0..(tileY - 1) do
for tileIndexX in 0..(tileX - 1) do
readChunk(tileIndexX, tileIndexY)
readChunk(0, tileY)
let nbBytesLeft = nbBytes - counter
let nbPixelLeft = nbBytesLeft / 4
let nbPixelsByChunk = sizeX * sizeY
image.SaveAsPng(@"C:\Users\codec\Desktop\Stealth_Combat_Tools-master\scripts\data\tut4map.png")
0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment