Move the palette code into internal/ so view-map can share it

This commit is contained in:
2018-03-22 01:56:46 +00:00
parent 801cf7754d
commit 62bff1aa44
3 changed files with 372 additions and 320 deletions

View File

@@ -1,20 +1,17 @@
package main
import (
"bytes"
"flag"
"image/color"
// "image/color/palette"
"log"
"math"
"os"
"path/filepath"
"github.com/faiface/pixel"
// "github.com/faiface/pixel/imdraw"
"github.com/faiface/pixel/pixelgl"
"golang.org/x/image/colornames"
"ur.gs/chaos-gate/internal/conv"
"ur.gs/chaos-gate/internal/data"
"ur.gs/chaos-gate/internal/sets"
"ur.gs/chaos-gate/internal/ui"
@@ -23,271 +20,11 @@ import (
var (
gamePath = flag.String("game-path", "./orig", "Path to a WH40K: Chaos Gate installation")
setFile = flag.String("set", "", "Path to a .set file, e.g. ./orig/Sets/map01.set")
// From Pic/wh40k.pcx
ourPalette = color.Palette{
color.RGBA{R: 0, G: 0, B: 0, A: 255},
color.RGBA{R: 128, G: 0, B: 0, A: 255},
color.RGBA{R: 0, G: 128, B: 0, A: 255},
color.RGBA{R: 128, G: 128, B: 0, A: 255},
color.RGBA{R: 0, G: 0, B: 128, A: 255},
color.RGBA{R: 128, G: 0, B: 128, A: 255},
color.RGBA{R: 0, G: 128, B: 128, A: 255},
color.RGBA{R: 192, G: 192, B: 192, A: 255},
color.RGBA{R: 192, G: 220, B: 192, A: 255},
color.RGBA{R: 166, G: 202, B: 240, A: 255},
color.RGBA{R: 255, G: 255, B: 255, A: 255},
color.RGBA{R: 240, G: 240, B: 240, A: 255},
color.RGBA{R: 221, G: 221, B: 221, A: 255},
color.RGBA{R: 203, G: 203, B: 203, A: 255},
color.RGBA{R: 187, G: 187, B: 187, A: 255},
color.RGBA{R: 178, G: 178, B: 178, A: 255},
color.RGBA{R: 168, G: 168, B: 168, A: 255},
color.RGBA{R: 157, G: 157, B: 157, A: 255},
color.RGBA{R: 147, G: 147, B: 147, A: 255},
color.RGBA{R: 137, G: 137, B: 137, A: 255},
color.RGBA{R: 127, G: 127, B: 127, A: 255},
color.RGBA{R: 117, G: 117, B: 117, A: 255},
color.RGBA{R: 106, G: 106, B: 106, A: 255},
color.RGBA{R: 96, G: 96, B: 96, A: 255},
color.RGBA{R: 86, G: 86, B: 86, A: 255},
color.RGBA{R: 76, G: 76, B: 76, A: 255},
color.RGBA{R: 61, G: 61, B: 61, A: 255},
color.RGBA{R: 49, G: 49, B: 49, A: 255},
color.RGBA{R: 36, G: 36, B: 36, A: 255},
color.RGBA{R: 24, G: 24, B: 24, A: 255},
color.RGBA{R: 12, G: 12, B: 12, A: 255},
color.RGBA{R: 0, G: 0, B: 0, A: 255},
color.RGBA{R: 134, G: 134, B: 255, A: 255},
color.RGBA{R: 113, G: 113, B: 241, A: 255},
color.RGBA{R: 93, G: 93, B: 228, A: 255},
color.RGBA{R: 72, G: 72, B: 214, A: 255},
color.RGBA{R: 63, G: 63, B: 200, A: 255},
color.RGBA{R: 55, G: 55, B: 186, A: 255},
color.RGBA{R: 46, G: 46, B: 172, A: 255},
color.RGBA{R: 38, G: 38, B: 158, A: 255},
color.RGBA{R: 29, G: 29, B: 144, A: 255},
color.RGBA{R: 20, G: 20, B: 131, A: 255},
color.RGBA{R: 12, G: 12, B: 117, A: 255},
color.RGBA{R: 3, G: 3, B: 103, A: 255},
color.RGBA{R: 3, G: 3, B: 91, A: 255},
color.RGBA{R: 3, G: 3, B: 79, A: 255},
color.RGBA{R: 3, G: 3, B: 68, A: 255},
color.RGBA{R: 3, G: 3, B: 56, A: 255},
color.RGBA{R: 255, G: 145, B: 145, A: 255},
color.RGBA{R: 242, G: 123, B: 123, A: 255},
color.RGBA{R: 230, G: 101, B: 101, A: 255},
color.RGBA{R: 217, G: 79, B: 79, A: 255},
color.RGBA{R: 205, G: 70, B: 70, A: 255},
color.RGBA{R: 193, G: 61, B: 61, A: 255},
color.RGBA{R: 181, G: 53, B: 53, A: 255},
color.RGBA{R: 169, G: 44, B: 44, A: 255},
color.RGBA{R: 157, G: 35, B: 35, A: 255},
color.RGBA{R: 144, G: 26, B: 26, A: 255},
color.RGBA{R: 132, G: 18, B: 18, A: 255},
color.RGBA{R: 120, G: 9, B: 9, A: 255},
color.RGBA{R: 108, G: 8, B: 8, A: 255},
color.RGBA{R: 94, G: 7, B: 7, A: 255},
color.RGBA{R: 79, G: 7, B: 7, A: 255},
color.RGBA{R: 65, G: 6, B: 6, A: 255},
color.RGBA{R: 147, G: 142, B: 185, A: 255},
color.RGBA{R: 132, G: 126, B: 172, A: 255},
color.RGBA{R: 117, G: 109, B: 159, A: 255},
color.RGBA{R: 102, G: 93, B: 146, A: 255},
color.RGBA{R: 95, G: 86, B: 133, A: 255},
color.RGBA{R: 88, G: 78, B: 123, A: 255},
color.RGBA{R: 82, G: 73, B: 115, A: 255},
color.RGBA{R: 77, G: 67, B: 107, A: 255},
color.RGBA{R: 72, G: 61, B: 100, A: 255},
color.RGBA{R: 67, G: 55, B: 92, A: 255},
color.RGBA{R: 61, G: 50, B: 84, A: 255},
color.RGBA{R: 56, G: 44, B: 76, A: 255},
color.RGBA{R: 51, G: 38, B: 68, A: 255},
color.RGBA{R: 46, G: 32, B: 60, A: 255},
color.RGBA{R: 40, G: 27, B: 52, A: 255},
color.RGBA{R: 35, G: 21, B: 44, A: 255},
color.RGBA{R: 200, G: 150, B: 137, A: 255},
color.RGBA{R: 187, G: 130, B: 115, A: 255},
color.RGBA{R: 175, G: 110, B: 94, A: 255},
color.RGBA{R: 164, G: 95, B: 77, A: 255},
color.RGBA{R: 154, G: 79, B: 61, A: 255},
color.RGBA{R: 143, G: 64, B: 44, A: 255},
color.RGBA{R: 137, G: 60, B: 42, A: 255},
color.RGBA{R: 132, G: 55, B: 38, A: 255},
color.RGBA{R: 125, G: 50, B: 33, A: 255},
color.RGBA{R: 120, G: 48, B: 29, A: 255},
color.RGBA{R: 111, G: 44, B: 26, A: 255},
color.RGBA{R: 103, G: 39, B: 24, A: 255},
color.RGBA{R: 94, G: 35, B: 21, A: 255},
color.RGBA{R: 83, G: 30, B: 18, A: 255},
color.RGBA{R: 72, G: 25, B: 14, A: 255},
color.RGBA{R: 61, G: 20, B: 10, A: 255},
color.RGBA{R: 121, G: 107, B: 34, A: 255},
color.RGBA{R: 109, G: 94, B: 29, A: 255},
color.RGBA{R: 96, G: 82, B: 25, A: 255},
color.RGBA{R: 84, G: 69, B: 20, A: 255},
color.RGBA{R: 77, G: 62, B: 17, A: 255},
color.RGBA{R: 70, G: 55, B: 14, A: 255},
color.RGBA{R: 63, G: 47, B: 12, A: 255},
color.RGBA{R: 56, G: 40, B: 9, A: 255},
color.RGBA{R: 93, G: 120, B: 53, A: 255},
color.RGBA{R: 80, G: 103, B: 42, A: 255},
color.RGBA{R: 66, G: 86, B: 31, A: 255},
color.RGBA{R: 53, G: 69, B: 20, A: 255},
color.RGBA{R: 49, G: 60, B: 16, A: 255},
color.RGBA{R: 45, G: 52, B: 12, A: 255},
color.RGBA{R: 43, G: 44, B: 10, A: 255},
color.RGBA{R: 43, G: 38, B: 8, A: 255},
color.RGBA{R: 136, G: 145, B: 44, A: 255},
color.RGBA{R: 118, G: 128, B: 37, A: 255},
color.RGBA{R: 101, G: 111, B: 30, A: 255},
color.RGBA{R: 83, G: 94, B: 23, A: 255},
color.RGBA{R: 70, G: 79, B: 17, A: 255},
color.RGBA{R: 56, G: 65, B: 11, A: 255},
color.RGBA{R: 42, G: 50, B: 6, A: 255},
color.RGBA{R: 28, G: 36, B: 0, A: 255},
color.RGBA{R: 57, G: 134, B: 64, A: 255},
color.RGBA{R: 48, G: 118, B: 54, A: 255},
color.RGBA{R: 38, G: 101, B: 43, A: 255},
color.RGBA{R: 29, G: 85, B: 33, A: 255},
color.RGBA{R: 22, G: 71, B: 25, A: 255},
color.RGBA{R: 15, G: 58, B: 17, A: 255},
color.RGBA{R: 7, G: 45, B: 8, A: 255},
color.RGBA{R: 0, G: 32, B: 0, A: 255},
color.RGBA{R: 143, G: 87, B: 56, A: 255},
color.RGBA{R: 126, G: 75, B: 45, A: 255},
color.RGBA{R: 110, G: 64, B: 35, A: 255},
color.RGBA{R: 93, G: 52, B: 24, A: 255},
color.RGBA{R: 85, G: 44, B: 16, A: 255},
color.RGBA{R: 72, G: 36, B: 12, A: 255},
color.RGBA{R: 64, G: 32, B: 8, A: 255},
color.RGBA{R: 56, G: 24, B: 4, A: 255},
color.RGBA{R: 127, G: 96, B: 54, A: 255},
color.RGBA{R: 115, G: 85, B: 46, A: 255},
color.RGBA{R: 102, G: 75, B: 39, A: 255},
color.RGBA{R: 90, G: 64, B: 31, A: 255},
color.RGBA{R: 82, G: 57, B: 25, A: 255},
color.RGBA{R: 75, G: 51, B: 20, A: 255},
color.RGBA{R: 68, G: 44, B: 15, A: 255},
color.RGBA{R: 61, G: 38, B: 10, A: 255},
color.RGBA{R: 141, G: 86, B: 56, A: 255},
color.RGBA{R: 126, G: 75, B: 46, A: 255},
color.RGBA{R: 110, G: 65, B: 36, A: 255},
color.RGBA{R: 95, G: 54, B: 26, A: 255},
color.RGBA{R: 88, G: 51, B: 25, A: 255},
color.RGBA{R: 73, G: 40, B: 18, A: 255},
color.RGBA{R: 57, G: 29, B: 10, A: 255},
color.RGBA{R: 42, G: 18, B: 3, A: 255},
color.RGBA{R: 172, G: 199, B: 199, A: 255},
color.RGBA{R: 138, G: 173, B: 173, A: 255},
color.RGBA{R: 104, G: 148, B: 148, A: 255},
color.RGBA{R: 71, G: 122, B: 122, A: 255},
color.RGBA{R: 37, G: 97, B: 97, A: 255},
color.RGBA{R: 3, G: 71, B: 71, A: 255},
color.RGBA{R: 4, G: 56, B: 56, A: 255},
color.RGBA{R: 4, G: 41, B: 41, A: 255},
color.RGBA{R: 217, G: 209, B: 200, A: 255},
color.RGBA{R: 202, G: 194, B: 184, A: 255},
color.RGBA{R: 188, G: 178, B: 167, A: 255},
color.RGBA{R: 173, G: 163, B: 151, A: 255},
color.RGBA{R: 158, G: 147, B: 134, A: 255},
color.RGBA{R: 148, G: 136, B: 123, A: 255},
color.RGBA{R: 137, G: 125, B: 112, A: 255},
color.RGBA{R: 126, G: 114, B: 101, A: 255},
color.RGBA{R: 116, G: 104, B: 91, A: 255},
color.RGBA{R: 105, G: 93, B: 80, A: 255},
color.RGBA{R: 94, G: 82, B: 69, A: 255},
color.RGBA{R: 84, G: 71, B: 58, A: 255},
color.RGBA{R: 73, G: 60, B: 47, A: 255},
color.RGBA{R: 62, G: 50, B: 36, A: 255},
color.RGBA{R: 52, G: 39, B: 25, A: 255},
color.RGBA{R: 41, G: 28, B: 14, A: 255},
color.RGBA{R: 231, G: 232, B: 207, A: 255},
color.RGBA{R: 219, G: 217, B: 180, A: 255},
color.RGBA{R: 208, G: 201, B: 152, A: 255},
color.RGBA{R: 196, G: 186, B: 125, A: 255},
color.RGBA{R: 184, G: 171, B: 98, A: 255},
color.RGBA{R: 173, G: 155, B: 70, A: 255},
color.RGBA{R: 161, G: 140, B: 43, A: 255},
color.RGBA{R: 150, G: 129, B: 39, A: 255},
color.RGBA{R: 139, G: 119, B: 37, A: 255},
color.RGBA{R: 127, G: 109, B: 33, A: 255},
color.RGBA{R: 117, G: 99, B: 29, A: 255},
color.RGBA{R: 105, G: 89, B: 25, A: 255},
color.RGBA{R: 90, G: 76, B: 21, A: 255},
color.RGBA{R: 75, G: 62, B: 18, A: 255},
color.RGBA{R: 60, G: 49, B: 14, A: 255},
color.RGBA{R: 45, G: 35, B: 10, A: 255},
color.RGBA{R: 128, G: 99, B: 127, A: 255},
color.RGBA{R: 113, G: 73, B: 112, A: 255},
color.RGBA{R: 97, G: 47, B: 97, A: 255},
color.RGBA{R: 82, G: 21, B: 82, A: 255},
color.RGBA{R: 75, G: 2, B: 74, A: 255},
color.RGBA{R: 68, G: 2, B: 67, A: 255},
color.RGBA{R: 52, G: 3, B: 50, A: 255},
color.RGBA{R: 35, G: 4, B: 33, A: 255},
color.RGBA{R: 247, G: 178, B: 102, A: 255},
color.RGBA{R: 229, G: 152, B: 75, A: 255},
color.RGBA{R: 212, G: 127, B: 48, A: 255},
color.RGBA{R: 194, G: 101, B: 21, A: 255},
color.RGBA{R: 179, G: 87, B: 16, A: 255},
color.RGBA{R: 161, G: 73, B: 12, A: 255},
color.RGBA{R: 142, G: 59, B: 9, A: 255},
color.RGBA{R: 124, G: 45, B: 5, A: 255},
color.RGBA{R: 255, G: 0, B: 0, A: 255},
color.RGBA{R: 194, G: 3, B: 3, A: 255},
color.RGBA{R: 161, G: 2, B: 2, A: 255},
color.RGBA{R: 255, G: 227, B: 11, A: 255},
color.RGBA{R: 209, G: 185, B: 8, A: 255},
color.RGBA{R: 169, G: 150, B: 6, A: 255},
color.RGBA{R: 103, G: 190, B: 255, A: 255},
color.RGBA{R: 2, G: 130, B: 232, A: 255},
color.RGBA{R: 4, G: 4, B: 209, A: 255},
color.RGBA{R: 0, G: 255, B: 0, A: 255},
color.RGBA{R: 7, G: 180, B: 7, A: 255},
color.RGBA{R: 3, G: 132, B: 3, A: 255},
color.RGBA{R: 255, G: 114, B: 230, A: 255},
color.RGBA{R: 255, G: 17, B: 205, A: 255},
color.RGBA{R: 203, G: 6, B: 156, A: 255},
color.RGBA{R: 246, G: 164, B: 73, A: 255},
color.RGBA{R: 221, G: 123, B: 16, A: 255},
color.RGBA{R: 177, G: 95, B: 4, A: 255},
color.RGBA{R: 0, G: 0, B: 0, A: 255},
color.RGBA{R: 0, G: 0, B: 0, A: 255},
color.RGBA{R: 0, G: 0, B: 0, A: 255},
color.RGBA{R: 0, G: 0, B: 0, A: 255},
color.RGBA{R: 0, G: 0, B: 0, A: 255},
color.RGBA{R: 132, G: 18, B: 18, A: 255},
color.RGBA{R: 113, G: 13, B: 13, A: 255},
color.RGBA{R: 94, G: 7, B: 7, A: 255},
color.RGBA{R: 107, G: 8, B: 8, A: 255},
color.RGBA{R: 120, G: 9, B: 9, A: 255},
color.RGBA{R: 193, G: 62, B: 62, A: 255},
color.RGBA{R: 181, G: 54, B: 54, A: 255},
color.RGBA{R: 168, G: 45, B: 45, A: 255},
color.RGBA{R: 157, G: 36, B: 36, A: 255},
color.RGBA{R: 144, G: 27, B: 27, A: 255},
color.RGBA{R: 62, G: 50, B: 36, A: 255},
color.RGBA{R: 57, G: 45, B: 31, A: 255},
color.RGBA{R: 52, G: 39, B: 25, A: 255},
color.RGBA{R: 46, G: 34, B: 20, A: 255},
color.RGBA{R: 41, G: 28, B: 14, A: 255},
color.RGBA{R: 255, G: 251, B: 240, A: 255},
color.RGBA{R: 160, G: 160, B: 164, A: 255},
color.RGBA{R: 128, G: 128, B: 128, A: 255},
color.RGBA{R: 255, G: 0, B: 0, A: 255},
color.RGBA{R: 0, G: 255, B: 0, A: 255},
color.RGBA{R: 255, G: 255, B: 0, A: 255},
color.RGBA{R: 0, G: 0, B: 255, A: 255},
color.RGBA{R: 255, G: 0, B: 255, A: 255},
color.RGBA{R: 0, G: 255, B: 255, A: 255},
color.RGBA{R: 255, G: 255, B: 255, A: 255},
}
)
type env struct {
set *sets.MapSet
objects map[string]*data.Object
objects map[string]*conv.Object
}
type state struct {
@@ -313,10 +50,10 @@ func main() {
mapSet, err := sets.LoadSet(*setFile)
if err != nil {
log.Fatalf("Couldn't load set file %s: %v", setFile, err)
log.Fatalf("Couldn't load set file %s: %v", *setFile, err)
}
objects := make(map[string]*data.Object)
objects := make(map[string]*conv.Object)
for _, name := range mapSet.Palette {
objFile := filepath.Join(*gamePath, "Obj", name+".obj")
@@ -325,7 +62,7 @@ func main() {
log.Fatalf("Failed to load %s: %v", name, err)
}
objects[filepath.Base(objFile)] = obj
objects[name] = conv.ConvertObject(obj, name)
}
env := &env{objects: objects, set: mapSet}
@@ -359,7 +96,7 @@ func (e *env) run() {
state.env.set.Count(),
state.objIdx,
state.env.set.Palette[state.objIdx], // FIXME: palette is a confusing name
state.curObject().NumSprites,
len(state.curObject().Sprites),
state.spriteIdx,
state.zoom,
)
@@ -377,54 +114,9 @@ func (s *state) runStep(pWin *pixelgl.Window) *state {
return &newState
}
// WIP. Try to convert the pixeldata into a picture.
func spriteToPic(sprite *data.Sprite) *pixel.PictureData {
pic := pixel.MakePictureData(pixel.R(float64(0), float64(0), float64(sprite.Width), float64(sprite.Height)))
buf := bytes.NewBuffer(sprite.PixelData)
// The pixeldata seems to be formed of Y null-terminated records, with
// varying numbers of bytes in each row. Probably [type, *data] but ignore
// type for now.
//
// Theory: perhaps the data in each X is centered around the origin?
for y := 0; y < int(sprite.Height); y++ {
insn := buf.Next(1)[0] // Take the instruction byte, if that's what it is
switch insn {
case 0:
log.Printf("Reached the end of the sprite at y=%v (height=%v)", y, sprite.Height)
case 1, 0x80:
// Ignore these, as we know they exist and the logic below seems to handle them
default:
log.Printf("Record of unknown type %v", insn)
}
rowData, err := buf.ReadBytes(0)
if err != nil {
log.Printf("Error at y=%d: %v", y, err)
continue
}
// Ignore the record separator
rowData = rowData[0 : len(rowData)-1]
leftPad := (int(sprite.Width) - len(rowData)) / 2
for x, b := range rowData {
idx := pic.Index(pixel.V(float64(leftPad+x), float64(y)))
r, g, b, a := ourPalette[int(b)].RGBA()
pic.Pix[idx] = color.RGBA{uint8(r), uint8(g), uint8(b), uint8(a)}
}
}
return pic
}
func (s *state) present(pWin *pixelgl.Window) {
obj := s.curObject()
sprite := obj.Sprites[s.spriteIdx]
pic := spriteToPic(sprite)
center := pWin.Bounds().Center()
@@ -437,7 +129,7 @@ func (s *state) present(pWin *pixelgl.Window) {
pWin.SetMatrix(s.cam)
pWin.Clear(colornames.Black)
pixel.NewSprite(pic, pic.Bounds()).Draw(pWin, pixel.IM.Moved(center))
pixel.NewSprite(sprite.Pic, sprite.Pic.Bounds()).Draw(pWin, pixel.IM.Moved(center))
}
func (s *state) handleKeys(pWin *pixelgl.Window) {
@@ -462,7 +154,7 @@ func (s *state) handleKeys(pWin *pixelgl.Window) {
}
if pWin.JustPressed(pixelgl.KeyUp) {
if s.spriteIdx < int(s.curObject().NumSprites)-1 {
if s.spriteIdx < len(s.curObject().Sprites)-1 {
s.spriteIdx += 1
}
}
@@ -471,8 +163,8 @@ func (s *state) handleKeys(pWin *pixelgl.Window) {
s.zoom *= math.Pow(1.2, pWin.MouseScroll().Y)
}
func (s *state) curObject() *data.Object {
name := s.env.set.Palette[s.objIdx] + ".obj"
return s.env.objects[name] // FIXME: we should use consistent naming!
func (s *state) curObject() *conv.Object {
name := s.env.set.Palette[s.objIdx]
log.Printf("name: %v, objects: %#v", name, s.env.objects)
return s.env.objects[name]
}

91
internal/conv/object.go Normal file
View File

@@ -0,0 +1,91 @@
package conv
import (
"bytes"
"image/color"
"log"
"github.com/faiface/pixel"
"ur.gs/chaos-gate/internal/data"
)
// Important conversions:
//
// * Width & height now stored using int
// * Colour data is now 32-bit rather than using a palette
type Sprite struct {
Width int
Height int
Pic *pixel.PictureData
}
type Object struct {
Name string
Sprites []Sprite
}
func ConvertObject(rawObj *data.Object, name string) *Object {
out := &Object{
Name: name,
Sprites: make([]Sprite, len(rawObj.Sprites)),
}
for i, rawSpr := range rawObj.Sprites {
out.Sprites[i] = Sprite{
Width: int(rawSpr.Width),
Height: int(rawSpr.Height),
Pic: spriteToPic(rawSpr),
}
}
return out
}
// WIP. Try to convert the pixeldata into a picture.
func spriteToPic(sprite *data.Sprite) *pixel.PictureData {
pic := pixel.MakePictureData(pixel.R(float64(0), float64(0), float64(sprite.Width), float64(sprite.Height)))
buf := bytes.NewBuffer(sprite.PixelData)
// The pixeldata seems to be formed of Y null-terminated records, with
// varying numbers of bytes in each row. Probably [type, *data] but ignore
// type for now.
//
// Theory: perhaps the data in each X is centered around the origin?
for y := 0; y < int(sprite.Height); y++ {
insn := buf.Next(1)[0] // Take the instruction byte, if that's what it is
switch insn {
case 0:
log.Printf("Reached the end of the sprite at y=%v (height=%v)", y, sprite.Height)
case 1, 0x80:
// Ignore these, as we know they exist and the logic below seems to handle them
// Although I suspect 0x80 means "centered run of bytes" while 0x1
// means "left-aligned run of bytes", since all 0x1 rows seem to be
// for 1x1 images, it makes no practical difference
default:
log.Printf("Record of unknown type %v", insn)
}
rowData, err := buf.ReadBytes(0)
if err != nil {
log.Printf("Error at y=%d: %v", y, err)
continue
}
// Ignore the record separator
rowData = rowData[0 : len(rowData)-1]
leftPad := (int(sprite.Width) - len(rowData)) / 2
for x, b := range rowData {
idx := pic.Index(pixel.V(float64(leftPad+x), float64(y)))
r, g, b, a := data.ColorPalette[int(b)].RGBA()
pic.Pix[idx] = color.RGBA{uint8(r), uint8(g), uint8(b), uint8(a)}
}
}
return pic
}

269
internal/data/palette.go Normal file
View File

@@ -0,0 +1,269 @@
package data
import (
"image/color"
)
var (
// From Pic/wh40k.pcx. I didn't feel like implementing the read-in for this.
// Not yet, anyway.
// TODO: at least one of these colours is actually transparent.
ColorPalette = color.Palette{
color.RGBA{R: 0, G: 0, B: 0, A: 255},
color.RGBA{R: 128, G: 0, B: 0, A: 255},
color.RGBA{R: 0, G: 128, B: 0, A: 255},
color.RGBA{R: 128, G: 128, B: 0, A: 255},
color.RGBA{R: 0, G: 0, B: 128, A: 255},
color.RGBA{R: 128, G: 0, B: 128, A: 255},
color.RGBA{R: 0, G: 128, B: 128, A: 255},
color.RGBA{R: 192, G: 192, B: 192, A: 255},
color.RGBA{R: 192, G: 220, B: 192, A: 255},
color.RGBA{R: 166, G: 202, B: 240, A: 255},
color.RGBA{R: 255, G: 255, B: 255, A: 255},
color.RGBA{R: 240, G: 240, B: 240, A: 255},
color.RGBA{R: 221, G: 221, B: 221, A: 255},
color.RGBA{R: 203, G: 203, B: 203, A: 255},
color.RGBA{R: 187, G: 187, B: 187, A: 255},
color.RGBA{R: 178, G: 178, B: 178, A: 255},
color.RGBA{R: 168, G: 168, B: 168, A: 255},
color.RGBA{R: 157, G: 157, B: 157, A: 255},
color.RGBA{R: 147, G: 147, B: 147, A: 255},
color.RGBA{R: 137, G: 137, B: 137, A: 255},
color.RGBA{R: 127, G: 127, B: 127, A: 255},
color.RGBA{R: 117, G: 117, B: 117, A: 255},
color.RGBA{R: 106, G: 106, B: 106, A: 255},
color.RGBA{R: 96, G: 96, B: 96, A: 255},
color.RGBA{R: 86, G: 86, B: 86, A: 255},
color.RGBA{R: 76, G: 76, B: 76, A: 255},
color.RGBA{R: 61, G: 61, B: 61, A: 255},
color.RGBA{R: 49, G: 49, B: 49, A: 255},
color.RGBA{R: 36, G: 36, B: 36, A: 255},
color.RGBA{R: 24, G: 24, B: 24, A: 255},
color.RGBA{R: 12, G: 12, B: 12, A: 255},
color.RGBA{R: 0, G: 0, B: 0, A: 255},
color.RGBA{R: 134, G: 134, B: 255, A: 255},
color.RGBA{R: 113, G: 113, B: 241, A: 255},
color.RGBA{R: 93, G: 93, B: 228, A: 255},
color.RGBA{R: 72, G: 72, B: 214, A: 255},
color.RGBA{R: 63, G: 63, B: 200, A: 255},
color.RGBA{R: 55, G: 55, B: 186, A: 255},
color.RGBA{R: 46, G: 46, B: 172, A: 255},
color.RGBA{R: 38, G: 38, B: 158, A: 255},
color.RGBA{R: 29, G: 29, B: 144, A: 255},
color.RGBA{R: 20, G: 20, B: 131, A: 255},
color.RGBA{R: 12, G: 12, B: 117, A: 255},
color.RGBA{R: 3, G: 3, B: 103, A: 255},
color.RGBA{R: 3, G: 3, B: 91, A: 255},
color.RGBA{R: 3, G: 3, B: 79, A: 255},
color.RGBA{R: 3, G: 3, B: 68, A: 255},
color.RGBA{R: 3, G: 3, B: 56, A: 255},
color.RGBA{R: 255, G: 145, B: 145, A: 255},
color.RGBA{R: 242, G: 123, B: 123, A: 255},
color.RGBA{R: 230, G: 101, B: 101, A: 255},
color.RGBA{R: 217, G: 79, B: 79, A: 255},
color.RGBA{R: 205, G: 70, B: 70, A: 255},
color.RGBA{R: 193, G: 61, B: 61, A: 255},
color.RGBA{R: 181, G: 53, B: 53, A: 255},
color.RGBA{R: 169, G: 44, B: 44, A: 255},
color.RGBA{R: 157, G: 35, B: 35, A: 255},
color.RGBA{R: 144, G: 26, B: 26, A: 255},
color.RGBA{R: 132, G: 18, B: 18, A: 255},
color.RGBA{R: 120, G: 9, B: 9, A: 255},
color.RGBA{R: 108, G: 8, B: 8, A: 255},
color.RGBA{R: 94, G: 7, B: 7, A: 255},
color.RGBA{R: 79, G: 7, B: 7, A: 255},
color.RGBA{R: 65, G: 6, B: 6, A: 255},
color.RGBA{R: 147, G: 142, B: 185, A: 255},
color.RGBA{R: 132, G: 126, B: 172, A: 255},
color.RGBA{R: 117, G: 109, B: 159, A: 255},
color.RGBA{R: 102, G: 93, B: 146, A: 255},
color.RGBA{R: 95, G: 86, B: 133, A: 255},
color.RGBA{R: 88, G: 78, B: 123, A: 255},
color.RGBA{R: 82, G: 73, B: 115, A: 255},
color.RGBA{R: 77, G: 67, B: 107, A: 255},
color.RGBA{R: 72, G: 61, B: 100, A: 255},
color.RGBA{R: 67, G: 55, B: 92, A: 255},
color.RGBA{R: 61, G: 50, B: 84, A: 255},
color.RGBA{R: 56, G: 44, B: 76, A: 255},
color.RGBA{R: 51, G: 38, B: 68, A: 255},
color.RGBA{R: 46, G: 32, B: 60, A: 255},
color.RGBA{R: 40, G: 27, B: 52, A: 255},
color.RGBA{R: 35, G: 21, B: 44, A: 255},
color.RGBA{R: 200, G: 150, B: 137, A: 255},
color.RGBA{R: 187, G: 130, B: 115, A: 255},
color.RGBA{R: 175, G: 110, B: 94, A: 255},
color.RGBA{R: 164, G: 95, B: 77, A: 255},
color.RGBA{R: 154, G: 79, B: 61, A: 255},
color.RGBA{R: 143, G: 64, B: 44, A: 255},
color.RGBA{R: 137, G: 60, B: 42, A: 255},
color.RGBA{R: 132, G: 55, B: 38, A: 255},
color.RGBA{R: 125, G: 50, B: 33, A: 255},
color.RGBA{R: 120, G: 48, B: 29, A: 255},
color.RGBA{R: 111, G: 44, B: 26, A: 255},
color.RGBA{R: 103, G: 39, B: 24, A: 255},
color.RGBA{R: 94, G: 35, B: 21, A: 255},
color.RGBA{R: 83, G: 30, B: 18, A: 255},
color.RGBA{R: 72, G: 25, B: 14, A: 255},
color.RGBA{R: 61, G: 20, B: 10, A: 255},
color.RGBA{R: 121, G: 107, B: 34, A: 255},
color.RGBA{R: 109, G: 94, B: 29, A: 255},
color.RGBA{R: 96, G: 82, B: 25, A: 255},
color.RGBA{R: 84, G: 69, B: 20, A: 255},
color.RGBA{R: 77, G: 62, B: 17, A: 255},
color.RGBA{R: 70, G: 55, B: 14, A: 255},
color.RGBA{R: 63, G: 47, B: 12, A: 255},
color.RGBA{R: 56, G: 40, B: 9, A: 255},
color.RGBA{R: 93, G: 120, B: 53, A: 255},
color.RGBA{R: 80, G: 103, B: 42, A: 255},
color.RGBA{R: 66, G: 86, B: 31, A: 255},
color.RGBA{R: 53, G: 69, B: 20, A: 255},
color.RGBA{R: 49, G: 60, B: 16, A: 255},
color.RGBA{R: 45, G: 52, B: 12, A: 255},
color.RGBA{R: 43, G: 44, B: 10, A: 255},
color.RGBA{R: 43, G: 38, B: 8, A: 255},
color.RGBA{R: 136, G: 145, B: 44, A: 255},
color.RGBA{R: 118, G: 128, B: 37, A: 255},
color.RGBA{R: 101, G: 111, B: 30, A: 255},
color.RGBA{R: 83, G: 94, B: 23, A: 255},
color.RGBA{R: 70, G: 79, B: 17, A: 255},
color.RGBA{R: 56, G: 65, B: 11, A: 255},
color.RGBA{R: 42, G: 50, B: 6, A: 255},
color.RGBA{R: 28, G: 36, B: 0, A: 255},
color.RGBA{R: 57, G: 134, B: 64, A: 255},
color.RGBA{R: 48, G: 118, B: 54, A: 255},
color.RGBA{R: 38, G: 101, B: 43, A: 255},
color.RGBA{R: 29, G: 85, B: 33, A: 255},
color.RGBA{R: 22, G: 71, B: 25, A: 255},
color.RGBA{R: 15, G: 58, B: 17, A: 255},
color.RGBA{R: 7, G: 45, B: 8, A: 255},
color.RGBA{R: 0, G: 32, B: 0, A: 255},
color.RGBA{R: 143, G: 87, B: 56, A: 255},
color.RGBA{R: 126, G: 75, B: 45, A: 255},
color.RGBA{R: 110, G: 64, B: 35, A: 255},
color.RGBA{R: 93, G: 52, B: 24, A: 255},
color.RGBA{R: 85, G: 44, B: 16, A: 255},
color.RGBA{R: 72, G: 36, B: 12, A: 255},
color.RGBA{R: 64, G: 32, B: 8, A: 255},
color.RGBA{R: 56, G: 24, B: 4, A: 255},
color.RGBA{R: 127, G: 96, B: 54, A: 255},
color.RGBA{R: 115, G: 85, B: 46, A: 255},
color.RGBA{R: 102, G: 75, B: 39, A: 255},
color.RGBA{R: 90, G: 64, B: 31, A: 255},
color.RGBA{R: 82, G: 57, B: 25, A: 255},
color.RGBA{R: 75, G: 51, B: 20, A: 255},
color.RGBA{R: 68, G: 44, B: 15, A: 255},
color.RGBA{R: 61, G: 38, B: 10, A: 255},
color.RGBA{R: 141, G: 86, B: 56, A: 255},
color.RGBA{R: 126, G: 75, B: 46, A: 255},
color.RGBA{R: 110, G: 65, B: 36, A: 255},
color.RGBA{R: 95, G: 54, B: 26, A: 255},
color.RGBA{R: 88, G: 51, B: 25, A: 255},
color.RGBA{R: 73, G: 40, B: 18, A: 255},
color.RGBA{R: 57, G: 29, B: 10, A: 255},
color.RGBA{R: 42, G: 18, B: 3, A: 255},
color.RGBA{R: 172, G: 199, B: 199, A: 255},
color.RGBA{R: 138, G: 173, B: 173, A: 255},
color.RGBA{R: 104, G: 148, B: 148, A: 255},
color.RGBA{R: 71, G: 122, B: 122, A: 255},
color.RGBA{R: 37, G: 97, B: 97, A: 255},
color.RGBA{R: 3, G: 71, B: 71, A: 255},
color.RGBA{R: 4, G: 56, B: 56, A: 255},
color.RGBA{R: 4, G: 41, B: 41, A: 255},
color.RGBA{R: 217, G: 209, B: 200, A: 255},
color.RGBA{R: 202, G: 194, B: 184, A: 255},
color.RGBA{R: 188, G: 178, B: 167, A: 255},
color.RGBA{R: 173, G: 163, B: 151, A: 255},
color.RGBA{R: 158, G: 147, B: 134, A: 255},
color.RGBA{R: 148, G: 136, B: 123, A: 255},
color.RGBA{R: 137, G: 125, B: 112, A: 255},
color.RGBA{R: 126, G: 114, B: 101, A: 255},
color.RGBA{R: 116, G: 104, B: 91, A: 255},
color.RGBA{R: 105, G: 93, B: 80, A: 255},
color.RGBA{R: 94, G: 82, B: 69, A: 255},
color.RGBA{R: 84, G: 71, B: 58, A: 255},
color.RGBA{R: 73, G: 60, B: 47, A: 255},
color.RGBA{R: 62, G: 50, B: 36, A: 255},
color.RGBA{R: 52, G: 39, B: 25, A: 255},
color.RGBA{R: 41, G: 28, B: 14, A: 255},
color.RGBA{R: 231, G: 232, B: 207, A: 255},
color.RGBA{R: 219, G: 217, B: 180, A: 255},
color.RGBA{R: 208, G: 201, B: 152, A: 255},
color.RGBA{R: 196, G: 186, B: 125, A: 255},
color.RGBA{R: 184, G: 171, B: 98, A: 255},
color.RGBA{R: 173, G: 155, B: 70, A: 255},
color.RGBA{R: 161, G: 140, B: 43, A: 255},
color.RGBA{R: 150, G: 129, B: 39, A: 255},
color.RGBA{R: 139, G: 119, B: 37, A: 255},
color.RGBA{R: 127, G: 109, B: 33, A: 255},
color.RGBA{R: 117, G: 99, B: 29, A: 255},
color.RGBA{R: 105, G: 89, B: 25, A: 255},
color.RGBA{R: 90, G: 76, B: 21, A: 255},
color.RGBA{R: 75, G: 62, B: 18, A: 255},
color.RGBA{R: 60, G: 49, B: 14, A: 255},
color.RGBA{R: 45, G: 35, B: 10, A: 255},
color.RGBA{R: 128, G: 99, B: 127, A: 255},
color.RGBA{R: 113, G: 73, B: 112, A: 255},
color.RGBA{R: 97, G: 47, B: 97, A: 255},
color.RGBA{R: 82, G: 21, B: 82, A: 255},
color.RGBA{R: 75, G: 2, B: 74, A: 255},
color.RGBA{R: 68, G: 2, B: 67, A: 255},
color.RGBA{R: 52, G: 3, B: 50, A: 255},
color.RGBA{R: 35, G: 4, B: 33, A: 255},
color.RGBA{R: 247, G: 178, B: 102, A: 255},
color.RGBA{R: 229, G: 152, B: 75, A: 255},
color.RGBA{R: 212, G: 127, B: 48, A: 255},
color.RGBA{R: 194, G: 101, B: 21, A: 255},
color.RGBA{R: 179, G: 87, B: 16, A: 255},
color.RGBA{R: 161, G: 73, B: 12, A: 255},
color.RGBA{R: 142, G: 59, B: 9, A: 255},
color.RGBA{R: 124, G: 45, B: 5, A: 255},
color.RGBA{R: 255, G: 0, B: 0, A: 255},
color.RGBA{R: 194, G: 3, B: 3, A: 255},
color.RGBA{R: 161, G: 2, B: 2, A: 255},
color.RGBA{R: 255, G: 227, B: 11, A: 255},
color.RGBA{R: 209, G: 185, B: 8, A: 255},
color.RGBA{R: 169, G: 150, B: 6, A: 255},
color.RGBA{R: 103, G: 190, B: 255, A: 255},
color.RGBA{R: 2, G: 130, B: 232, A: 255},
color.RGBA{R: 4, G: 4, B: 209, A: 255},
color.RGBA{R: 0, G: 255, B: 0, A: 255},
color.RGBA{R: 7, G: 180, B: 7, A: 255},
color.RGBA{R: 3, G: 132, B: 3, A: 255},
color.RGBA{R: 255, G: 114, B: 230, A: 255},
color.RGBA{R: 255, G: 17, B: 205, A: 255},
color.RGBA{R: 203, G: 6, B: 156, A: 255},
color.RGBA{R: 246, G: 164, B: 73, A: 255},
color.RGBA{R: 221, G: 123, B: 16, A: 255},
color.RGBA{R: 177, G: 95, B: 4, A: 255},
color.RGBA{R: 0, G: 0, B: 0, A: 255},
color.RGBA{R: 0, G: 0, B: 0, A: 255},
color.RGBA{R: 0, G: 0, B: 0, A: 255},
color.RGBA{R: 0, G: 0, B: 0, A: 255},
color.RGBA{R: 0, G: 0, B: 0, A: 255},
color.RGBA{R: 132, G: 18, B: 18, A: 255},
color.RGBA{R: 113, G: 13, B: 13, A: 255},
color.RGBA{R: 94, G: 7, B: 7, A: 255},
color.RGBA{R: 107, G: 8, B: 8, A: 255},
color.RGBA{R: 120, G: 9, B: 9, A: 255},
color.RGBA{R: 193, G: 62, B: 62, A: 255},
color.RGBA{R: 181, G: 54, B: 54, A: 255},
color.RGBA{R: 168, G: 45, B: 45, A: 255},
color.RGBA{R: 157, G: 36, B: 36, A: 255},
color.RGBA{R: 144, G: 27, B: 27, A: 255},
color.RGBA{R: 62, G: 50, B: 36, A: 255},
color.RGBA{R: 57, G: 45, B: 31, A: 255},
color.RGBA{R: 52, G: 39, B: 25, A: 255},
color.RGBA{R: 46, G: 34, B: 20, A: 255},
color.RGBA{R: 41, G: 28, B: 14, A: 255},
color.RGBA{R: 255, G: 251, B: 240, A: 255},
color.RGBA{R: 160, G: 160, B: 164, A: 255},
color.RGBA{R: 128, G: 128, B: 128, A: 255},
color.RGBA{R: 255, G: 0, B: 0, A: 255},
color.RGBA{R: 0, G: 255, B: 0, A: 255},
color.RGBA{R: 255, G: 255, B: 0, A: 255},
color.RGBA{R: 0, G: 0, B: 255, A: 255},
color.RGBA{R: 255, G: 0, B: 255, A: 255},
color.RGBA{R: 0, G: 255, B: 255, A: 255},
color.RGBA{R: 255, G: 255, B: 255, A: 255},
}
)