Compare commits
6 Commits
2a39eee0a1
...
6d58d12536
Author | SHA1 | Date | |
---|---|---|---|
6d58d12536 | |||
63d3ee0ed6 | |||
5c869fc33c | |||
4358951e15 | |||
250a6033c8 | |||
f64af717b7 |
27
README.md
27
README.md
@@ -32,6 +32,8 @@ result.
|
||||
|
||||
## Current status
|
||||
|
||||
### Chaos Gate
|
||||
|
||||
Some of the original file formats are either partially or fully decoded. Maps,
|
||||
menus, and most visual data can be rendered pixel-perfect. Sound can be played
|
||||
(with a preprocessing step). Some UI tookit work is done. No game mechanics are
|
||||
@@ -45,6 +47,31 @@ I've just been informed that another game from 1998, [Soldiers At War](https://e
|
||||
seems to use the same engine. Maybe at some point Ordoor will be able to play
|
||||
both. Will that need a rename? Hmm. Watch this space.
|
||||
|
||||
### Soldiers At War
|
||||
|
||||
(At least some) objects display. Map support is being worked on in the
|
||||
`soldiers-at-war` branch, which can more-or-less display them, albeit with many
|
||||
errors.
|
||||
|
||||
### Squad Leader
|
||||
|
||||
Squad Leader is the most recent of the games created with this engine. Nothing
|
||||
has been done with it yet, but a preliminary look at the game data suggests many
|
||||
changes are afoot. The object files are a different format, at the very least.
|
||||
|
||||
### Wages of War
|
||||
|
||||
This is the oldest of the four games. The object file format seems to be mostly
|
||||
the same. the installer only copies some data to the game directory; we may want
|
||||
to work directly from the CDROM instead, if we can.
|
||||
|
||||
Maps are uncompressed, around 243K, and no header is present. They look similar
|
||||
in principle to the tile data of Soldiers At War or Chaos Gate maps, otherwise.
|
||||
|
||||
The menu system seen in Chaos Gate is not present; instead, there is a `BUTTONS`
|
||||
directory and a lot of `pcx` files under `PIC` that, I suspect, do the job for
|
||||
this game.
|
||||
|
||||
## Long-term goals
|
||||
|
||||
Once full playthrough of the official single-player campaign for all four games
|
||||
|
@@ -58,7 +58,7 @@ func main() {
|
||||
|
||||
assets, err := assetstore.New(cfg.DefaultEngine())
|
||||
if err != nil {
|
||||
log.Fatal("Failed to set up asset store: %v", err)
|
||||
log.Fatalf("Failed to set up asset store: %v", err)
|
||||
}
|
||||
|
||||
state := state{
|
||||
|
@@ -57,7 +57,7 @@ func main() {
|
||||
|
||||
assets, err := assetstore.New(cfg.DefaultEngine())
|
||||
if err != nil {
|
||||
log.Fatal("Failed to set up asset store: %v", err)
|
||||
log.Fatalf("Failed to set up asset store: %v", err)
|
||||
}
|
||||
|
||||
var obj *assetstore.Object
|
||||
|
@@ -42,7 +42,7 @@ func (a *AssetStore) Object(name string) (*Object, error) {
|
||||
}
|
||||
log.Printf("Loading object %v", name)
|
||||
|
||||
filename, err := a.lookup(name, "obj", "Obj")
|
||||
filename, err := a.lookup(name, "obj", "Obj", "spr")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@@ -28,7 +28,11 @@ type SpriteHeader struct {
|
||||
|
||||
func (s SpriteHeader) Check(expectedSize uint32) error {
|
||||
if s.Padding1 != 0 || s.Padding2 != 0 {
|
||||
return fmt.Errorf("Sprite header padding contains unknown values: %d %d", s.Padding1, s.Padding2)
|
||||
if s.Padding1 == 271 && s.Padding2 == 0 {
|
||||
log.Printf("Sprite header padding matches FIXME value")
|
||||
} else {
|
||||
return fmt.Errorf("Sprite header padding contains unknown values: %d %d", s.Padding1, s.Padding2)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: WarHammer.ani sets Unknown1 to this for all 188,286 sprites. I am
|
||||
|
@@ -15,8 +15,8 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
expectedMagic = []byte("\x08\x00WHMAP\x00")
|
||||
expectedSetNameOffset = uint32(0x34)
|
||||
expectedMagic = []byte("\x15\x00AMB_MAP\x00")
|
||||
expectedSetNameOffset = uint32(0x10)
|
||||
notImplemented = fmt.Errorf("Not implemented")
|
||||
)
|
||||
|
||||
@@ -25,35 +25,25 @@ const (
|
||||
MaxLength = 100 // Y coordinate
|
||||
MaxWidth = 130 // X coordinate
|
||||
|
||||
CellSize = 16 // seems to be
|
||||
CellSize = 13 // seems to be
|
||||
|
||||
cellDataOffset = 0x110 // definitely
|
||||
cellDataOffset = 0xc0
|
||||
cellCount = MaxHeight * MaxLength * MaxWidth
|
||||
)
|
||||
|
||||
type Header struct {
|
||||
IsCampaignMap uint32 // Tentatively: 0 = no, 1 = yes
|
||||
MinWidth uint32
|
||||
MinLength uint32
|
||||
MaxWidth uint32
|
||||
MaxLength uint32
|
||||
Unknown1 uint32
|
||||
Unknown2 uint32
|
||||
Unknown3 uint32
|
||||
Unknown4 uint32
|
||||
Magic [8]byte // "\x08\x00WHMAP\x00"
|
||||
Unknown5 uint32
|
||||
Unknown6 uint32
|
||||
SetName [8]byte // Links to a filename in `/Sets/*.set`
|
||||
Magic [10]byte // "\x15\x00AMB_MAP\x00"
|
||||
SetName [8]byte // Links to a filename in `/Sets/*.set`
|
||||
// Need to investigate the rest of the header too
|
||||
IsCampaignMap byte
|
||||
}
|
||||
|
||||
func (h Header) Width() int {
|
||||
return int(h.MaxWidth - h.MinWidth)
|
||||
return MaxWidth
|
||||
}
|
||||
|
||||
func (h Header) Length() int {
|
||||
return int(h.MaxLength - h.MinLength)
|
||||
return MaxLength
|
||||
}
|
||||
|
||||
func (h Header) Height() int {
|
||||
@@ -80,7 +70,7 @@ type ObjRef struct {
|
||||
|
||||
// The index into a set palette to retrieve the object
|
||||
func (o ObjRef) Index() int {
|
||||
return int(o.AreaByte)
|
||||
return int(o.AreaByte & 0x7f)
|
||||
}
|
||||
|
||||
func (o ObjRef) Sprite() int {
|
||||
@@ -91,12 +81,13 @@ func (o ObjRef) Sprite() int {
|
||||
// The top bit seems to say whether we should draw or not.
|
||||
func (o ObjRef) IsActive() bool {
|
||||
return (o.SpriteAndFlagByte & 0x80) == 0x80
|
||||
}
|
||||
|
||||
} // PARIS is 78 x 60 x 7
|
||||
// 4E 3C 7
|
||||
/*
|
||||
type Cell struct {
|
||||
DoorAndCanisterRelated byte
|
||||
DoorLockAndReactorRelated byte
|
||||
Unknown2 byte
|
||||
// DoorLockAndReactorRelated byte
|
||||
// Unknown2 byte
|
||||
Surface ObjRef
|
||||
Left ObjRef
|
||||
Right ObjRef
|
||||
@@ -105,43 +96,60 @@ type Cell struct {
|
||||
Unknown12 byte
|
||||
Unknown13 byte
|
||||
Unknown14 byte
|
||||
SquadRelated byte
|
||||
// SquadRelated byte
|
||||
}*/
|
||||
|
||||
type Cell struct {
|
||||
Unknown1 byte
|
||||
Surface ObjRef
|
||||
Left ObjRef
|
||||
Right ObjRef
|
||||
Center ObjRef
|
||||
Unknown2 [4]byte
|
||||
|
||||
/*
|
||||
DoorAndCanisterRelated byte
|
||||
// DoorLockAndReactorRelated byte
|
||||
// Unknown2 byte
|
||||
Surface ObjRef
|
||||
Left ObjRef
|
||||
Right ObjRef
|
||||
Center ObjRef
|
||||
Unknown11 byte
|
||||
Unknown12 byte
|
||||
Unknown13 byte
|
||||
Unknown14 byte
|
||||
SquadRelated byte*/
|
||||
}
|
||||
|
||||
func (c *Cell) At(n int) byte {
|
||||
switch n {
|
||||
case 0:
|
||||
return c.DoorAndCanisterRelated
|
||||
return c.Unknown1
|
||||
case 1:
|
||||
return c.DoorLockAndReactorRelated
|
||||
case 2:
|
||||
return c.Unknown2
|
||||
case 3:
|
||||
return c.Surface.AreaByte
|
||||
case 4:
|
||||
case 2:
|
||||
return c.Surface.SpriteAndFlagByte
|
||||
case 5:
|
||||
case 3:
|
||||
return c.Left.AreaByte
|
||||
case 6:
|
||||
case 4:
|
||||
return c.Left.SpriteAndFlagByte
|
||||
case 7:
|
||||
case 5:
|
||||
return c.Right.AreaByte
|
||||
case 8:
|
||||
case 6:
|
||||
return c.Right.SpriteAndFlagByte
|
||||
case 9:
|
||||
case 7:
|
||||
return c.Center.AreaByte
|
||||
case 10:
|
||||
case 8:
|
||||
return c.Center.SpriteAndFlagByte
|
||||
case 9:
|
||||
return c.Unknown2[0]
|
||||
case 10:
|
||||
return c.Unknown2[1]
|
||||
case 11:
|
||||
return c.Unknown11
|
||||
return c.Unknown2[2]
|
||||
case 12:
|
||||
return c.Unknown12
|
||||
case 13:
|
||||
return c.Unknown13
|
||||
case 14:
|
||||
return c.Unknown14
|
||||
case 15:
|
||||
return c.SquadRelated
|
||||
return c.Unknown2[3]
|
||||
}
|
||||
|
||||
return 0
|
||||
@@ -150,15 +158,23 @@ func (c *Cell) At(n int) byte {
|
||||
// Cells is always a fixed size; use At to get a cell according to x,y,z
|
||||
type Cells []Cell
|
||||
|
||||
// 6 Possibilities for being laid out in memory. Most likely:
|
||||
// XXYYZZ
|
||||
// OR
|
||||
// XYZXYZ
|
||||
|
||||
func (c Cells) At(x, y, z int) Cell {
|
||||
return c[(z*MaxLength*MaxWidth)+(y*MaxWidth)+x]
|
||||
// log.Printf("At (%v,%v,%v)=%v", x, y, z, x*y*z)
|
||||
return c[(z*MaxLength*MaxWidth)+
|
||||
(y*MaxWidth)+
|
||||
x]
|
||||
}
|
||||
|
||||
func (h Header) Check() []error {
|
||||
var out []error
|
||||
if h.IsCampaignMap > 1 {
|
||||
out = append(out, fmt.Errorf("Expected 0 or 1 for IsCampaignMap, got %v", h.IsCampaignMap))
|
||||
}
|
||||
// if h.IsCampaignMap > 1 {
|
||||
// out = append(out, fmt.Errorf("Expected 0 or 1 for IsCampaignMap, got %v", h.IsCampaignMap))
|
||||
// }
|
||||
|
||||
if bytes.Compare(expectedMagic, h.Magic[:]) != 0 {
|
||||
out = append(out, fmt.Errorf("Unexpected magic value: %v", h.Magic))
|
||||
@@ -176,10 +192,10 @@ type GameMap struct {
|
||||
|
||||
func (m *GameMap) Rect() image.Rectangle {
|
||||
return image.Rect(
|
||||
int(m.Header.MinWidth),
|
||||
int(m.Header.MinLength),
|
||||
int(m.Header.MaxWidth),
|
||||
int(m.Header.MaxLength),
|
||||
int(0),
|
||||
int(0),
|
||||
int(m.Width()-1),
|
||||
int(m.Length()-1),
|
||||
)
|
||||
}
|
||||
|
||||
|
269
internal/palettes/wages_of_war.go
Normal file
269
internal/palettes/wages_of_war.go
Normal file
@@ -0,0 +1,269 @@
|
||||
package palettes
|
||||
|
||||
import "image/color"
|
||||
|
||||
var (
|
||||
WagesOfWarPalette = color.Palette{
|
||||
Transparent,
|
||||
|
||||
color.RGBA{R: 1, G: 1, B: 1, A: 255},
|
||||
color.RGBA{R: 254, G: 254, B: 254, A: 255},
|
||||
color.RGBA{R: 187, G: 4, B: 4, A: 255},
|
||||
color.RGBA{R: 181, G: 195, B: 2, A: 255},
|
||||
color.RGBA{R: 94, G: 79, B: 148, A: 255},
|
||||
color.RGBA{R: 233, G: 91, B: 4, A: 255},
|
||||
color.RGBA{R: 60, G: 60, B: 60, A: 255},
|
||||
color.RGBA{R: 102, G: 102, B: 102, A: 255},
|
||||
color.RGBA{R: 170, G: 170, B: 170, A: 255},
|
||||
color.RGBA{R: 197, G: 195, B: 193, A: 255},
|
||||
color.RGBA{R: 234, G: 234, B: 235, A: 255},
|
||||
color.RGBA{R: 218, G: 218, B: 240, A: 255},
|
||||
color.RGBA{R: 202, G: 202, B: 245, A: 255},
|
||||
color.RGBA{R: 186, G: 186, B: 250, A: 255},
|
||||
color.RGBA{R: 170, G: 170, B: 255, A: 255},
|
||||
color.RGBA{R: 238, G: 238, B: 238, A: 255},
|
||||
color.RGBA{R: 222, G: 222, B: 222, A: 255},
|
||||
color.RGBA{R: 206, G: 206, B: 206, A: 255},
|
||||
color.RGBA{R: 190, G: 190, B: 190, A: 255},
|
||||
color.RGBA{R: 174, G: 174, B: 174, A: 255},
|
||||
color.RGBA{R: 157, G: 157, B: 157, A: 255},
|
||||
color.RGBA{R: 141, G: 141, B: 141, A: 255},
|
||||
color.RGBA{R: 129, G: 129, B: 129, A: 255},
|
||||
color.RGBA{R: 113, G: 113, B: 113, A: 255},
|
||||
color.RGBA{R: 97, G: 97, B: 97, A: 255},
|
||||
color.RGBA{R: 80, G: 80, B: 80, A: 255},
|
||||
color.RGBA{R: 64, G: 64, B: 64, A: 255},
|
||||
color.RGBA{R: 48, G: 48, B: 48, A: 255},
|
||||
color.RGBA{R: 32, G: 32, B: 32, A: 255},
|
||||
color.RGBA{R: 16, G: 16, B: 16, A: 255},
|
||||
color.RGBA{R: 4, G: 4, B: 4, A: 255},
|
||||
color.RGBA{R: 255, G: 238, B: 238, A: 255},
|
||||
color.RGBA{R: 246, G: 194, B: 194, A: 255},
|
||||
color.RGBA{R: 238, G: 153, B: 153, A: 255},
|
||||
color.RGBA{R: 230, G: 117, B: 117, A: 255},
|
||||
color.RGBA{R: 222, G: 80, B: 80, A: 255},
|
||||
color.RGBA{R: 214, G: 48, B: 48, A: 255},
|
||||
color.RGBA{R: 210, G: 16, B: 16, A: 255},
|
||||
color.RGBA{R: 190, G: 12, B: 12, A: 255},
|
||||
color.RGBA{R: 170, G: 8, B: 8, A: 255},
|
||||
color.RGBA{R: 153, G: 4, B: 4, A: 255},
|
||||
color.RGBA{R: 133, G: 4, B: 4, A: 255},
|
||||
color.RGBA{R: 113, G: 0, B: 0, A: 255},
|
||||
color.RGBA{R: 97, G: 0, B: 0, A: 255},
|
||||
color.RGBA{R: 76, G: 0, B: 0, A: 255},
|
||||
color.RGBA{R: 56, G: 0, B: 0, A: 255},
|
||||
color.RGBA{R: 40, G: 0, B: 0, A: 255},
|
||||
color.RGBA{R: 255, G: 255, B: 250, A: 255},
|
||||
color.RGBA{R: 255, G: 255, B: 165, A: 255},
|
||||
color.RGBA{R: 255, G: 255, B: 80, A: 255},
|
||||
color.RGBA{R: 255, G: 255, B: 0, A: 255},
|
||||
color.RGBA{R: 234, G: 222, B: 12, A: 255},
|
||||
color.RGBA{R: 214, G: 194, B: 28, A: 255},
|
||||
color.RGBA{R: 194, G: 170, B: 40, A: 255},
|
||||
color.RGBA{R: 174, G: 149, B: 52, A: 255},
|
||||
color.RGBA{R: 255, G: 202, B: 153, A: 255},
|
||||
color.RGBA{R: 255, G: 170, B: 101, A: 255},
|
||||
color.RGBA{R: 255, G: 133, B: 48, A: 255},
|
||||
color.RGBA{R: 255, G: 93, B: 0, A: 255},
|
||||
color.RGBA{R: 222, G: 89, B: 12, A: 255},
|
||||
color.RGBA{R: 190, G: 85, B: 28, A: 255},
|
||||
color.RGBA{R: 157, G: 76, B: 36, A: 255},
|
||||
color.RGBA{R: 129, G: 68, B: 40, A: 255},
|
||||
color.RGBA{R: 198, G: 255, B: 206, A: 255},
|
||||
color.RGBA{R: 170, G: 238, B: 182, A: 255},
|
||||
color.RGBA{R: 149, G: 222, B: 157, A: 255},
|
||||
color.RGBA{R: 125, G: 206, B: 137, A: 255},
|
||||
color.RGBA{R: 105, G: 190, B: 113, A: 255},
|
||||
color.RGBA{R: 89, G: 174, B: 97, A: 255},
|
||||
color.RGBA{R: 72, G: 157, B: 76, A: 255},
|
||||
color.RGBA{R: 56, G: 141, B: 64, A: 255},
|
||||
color.RGBA{R: 40, G: 125, B: 48, A: 255},
|
||||
color.RGBA{R: 32, G: 109, B: 36, A: 255},
|
||||
color.RGBA{R: 20, G: 93, B: 24, A: 255},
|
||||
color.RGBA{R: 12, G: 76, B: 16, A: 255},
|
||||
color.RGBA{R: 4, G: 60, B: 8, A: 255},
|
||||
color.RGBA{R: 0, G: 44, B: 4, A: 255},
|
||||
color.RGBA{R: 0, G: 32, B: 0, A: 255},
|
||||
color.RGBA{R: 0, G: 16, B: 0, A: 255},
|
||||
color.RGBA{R: 210, G: 255, B: 255, A: 255},
|
||||
color.RGBA{R: 182, G: 238, B: 234, A: 255},
|
||||
color.RGBA{R: 157, G: 222, B: 218, A: 255},
|
||||
color.RGBA{R: 137, G: 210, B: 202, A: 255},
|
||||
color.RGBA{R: 113, G: 194, B: 186, A: 255},
|
||||
color.RGBA{R: 97, G: 178, B: 165, A: 255},
|
||||
color.RGBA{R: 76, G: 165, B: 149, A: 255},
|
||||
color.RGBA{R: 64, G: 149, B: 129, A: 255},
|
||||
color.RGBA{R: 48, G: 133, B: 113, A: 255},
|
||||
color.RGBA{R: 36, G: 121, B: 97, A: 255},
|
||||
color.RGBA{R: 24, G: 105, B: 80, A: 255},
|
||||
color.RGBA{R: 16, G: 89, B: 64, A: 255},
|
||||
color.RGBA{R: 8, G: 76, B: 52, A: 255},
|
||||
color.RGBA{R: 4, G: 60, B: 36, A: 255},
|
||||
color.RGBA{R: 0, G: 44, B: 24, A: 255},
|
||||
color.RGBA{R: 0, G: 32, B: 16, A: 255},
|
||||
color.RGBA{R: 255, G: 255, B: 170, A: 255},
|
||||
color.RGBA{R: 238, G: 238, B: 149, A: 255},
|
||||
color.RGBA{R: 222, G: 222, B: 129, A: 255},
|
||||
color.RGBA{R: 206, G: 210, B: 109, A: 255},
|
||||
color.RGBA{R: 190, G: 194, B: 93, A: 255},
|
||||
color.RGBA{R: 174, G: 182, B: 76, A: 255},
|
||||
color.RGBA{R: 157, G: 165, B: 64, A: 255},
|
||||
color.RGBA{R: 141, G: 149, B: 52, A: 255},
|
||||
color.RGBA{R: 125, G: 137, B: 40, A: 255},
|
||||
color.RGBA{R: 109, G: 121, B: 28, A: 255},
|
||||
color.RGBA{R: 97, G: 109, B: 20, A: 255},
|
||||
color.RGBA{R: 80, G: 93, B: 12, A: 255},
|
||||
color.RGBA{R: 64, G: 76, B: 4, A: 255},
|
||||
color.RGBA{R: 52, G: 64, B: 4, A: 255},
|
||||
color.RGBA{R: 40, G: 48, B: 0, A: 255},
|
||||
color.RGBA{R: 28, G: 36, B: 0, A: 255},
|
||||
color.RGBA{R: 214, G: 255, B: 214, A: 255},
|
||||
color.RGBA{R: 157, G: 255, B: 157, A: 255},
|
||||
color.RGBA{R: 105, G: 255, B: 105, A: 255},
|
||||
color.RGBA{R: 48, G: 255, B: 48, A: 255},
|
||||
color.RGBA{R: 0, G: 255, B: 0, A: 255},
|
||||
color.RGBA{R: 24, G: 210, B: 28, A: 255},
|
||||
color.RGBA{R: 44, G: 165, B: 48, A: 255},
|
||||
color.RGBA{R: 52, G: 125, B: 56, A: 255},
|
||||
color.RGBA{R: 226, G: 121, B: 0, A: 255},
|
||||
color.RGBA{R: 198, G: 89, B: 0, A: 255},
|
||||
color.RGBA{R: 174, G: 64, B: 0, A: 255},
|
||||
color.RGBA{R: 145, G: 40, B: 0, A: 255},
|
||||
color.RGBA{R: 121, G: 24, B: 0, A: 255},
|
||||
color.RGBA{R: 93, G: 8, B: 0, A: 255},
|
||||
color.RGBA{R: 64, G: 4, B: 0, A: 255},
|
||||
color.RGBA{R: 40, G: 0, B: 0, A: 255},
|
||||
color.RGBA{R: 194, G: 255, B: 255, A: 255},
|
||||
color.RGBA{R: 165, G: 255, B: 255, A: 255},
|
||||
color.RGBA{R: 109, G: 255, B: 255, A: 255},
|
||||
color.RGBA{R: 0, G: 255, B: 255, A: 255},
|
||||
color.RGBA{R: 4, G: 222, B: 222, A: 255},
|
||||
color.RGBA{R: 16, G: 194, B: 194, A: 255},
|
||||
color.RGBA{R: 20, G: 161, B: 161, A: 255},
|
||||
color.RGBA{R: 24, G: 133, B: 133, A: 255},
|
||||
color.RGBA{R: 137, G: 157, B: 255, A: 255},
|
||||
color.RGBA{R: 101, G: 121, B: 255, A: 255},
|
||||
color.RGBA{R: 64, G: 80, B: 255, A: 255},
|
||||
color.RGBA{R: 28, G: 40, B: 255, A: 255},
|
||||
color.RGBA{R: 0, G: 0, B: 255, A: 255},
|
||||
color.RGBA{R: 12, G: 12, B: 206, A: 255},
|
||||
color.RGBA{R: 20, G: 20, B: 157, A: 255},
|
||||
color.RGBA{R: 24, G: 24, B: 109, A: 255},
|
||||
color.RGBA{R: 234, G: 234, B: 255, A: 255},
|
||||
color.RGBA{R: 202, G: 202, B: 238, A: 255},
|
||||
color.RGBA{R: 178, G: 178, B: 222, A: 255},
|
||||
color.RGBA{R: 153, G: 153, B: 206, A: 255},
|
||||
color.RGBA{R: 129, G: 129, B: 194, A: 255},
|
||||
color.RGBA{R: 105, G: 105, B: 178, A: 255},
|
||||
color.RGBA{R: 89, G: 89, B: 161, A: 255},
|
||||
color.RGBA{R: 68, G: 68, B: 145, A: 255},
|
||||
color.RGBA{R: 52, G: 52, B: 133, A: 255},
|
||||
color.RGBA{R: 40, G: 40, B: 117, A: 255},
|
||||
color.RGBA{R: 28, G: 28, B: 101, A: 255},
|
||||
color.RGBA{R: 16, G: 16, B: 89, A: 255},
|
||||
color.RGBA{R: 8, G: 8, B: 72, A: 255},
|
||||
color.RGBA{R: 4, G: 4, B: 56, A: 255},
|
||||
color.RGBA{R: 0, G: 0, B: 40, A: 255},
|
||||
color.RGBA{R: 0, G: 0, B: 28, A: 255},
|
||||
color.RGBA{R: 250, G: 218, B: 170, A: 255},
|
||||
color.RGBA{R: 234, G: 198, B: 145, A: 255},
|
||||
color.RGBA{R: 218, G: 182, B: 129, A: 255},
|
||||
color.RGBA{R: 202, G: 165, B: 109, A: 255},
|
||||
color.RGBA{R: 190, G: 149, B: 93, A: 255},
|
||||
color.RGBA{R: 174, G: 133, B: 76, A: 255},
|
||||
color.RGBA{R: 157, G: 117, B: 60, A: 255},
|
||||
color.RGBA{R: 141, G: 105, B: 48, A: 255},
|
||||
color.RGBA{R: 129, G: 93, B: 36, A: 255},
|
||||
color.RGBA{R: 113, G: 76, B: 28, A: 255},
|
||||
color.RGBA{R: 97, G: 64, B: 16, A: 255},
|
||||
color.RGBA{R: 85, G: 52, B: 12, A: 255},
|
||||
color.RGBA{R: 68, G: 40, B: 4, A: 255},
|
||||
color.RGBA{R: 52, G: 32, B: 0, A: 255},
|
||||
color.RGBA{R: 36, G: 20, B: 0, A: 255},
|
||||
color.RGBA{R: 24, G: 12, B: 0, A: 255},
|
||||
color.RGBA{R: 255, G: 230, B: 186, A: 255},
|
||||
color.RGBA{R: 238, G: 210, B: 161, A: 255},
|
||||
color.RGBA{R: 226, G: 190, B: 141, A: 255},
|
||||
color.RGBA{R: 214, G: 170, B: 121, A: 255},
|
||||
color.RGBA{R: 202, G: 149, B: 105, A: 255},
|
||||
color.RGBA{R: 186, G: 133, B: 89, A: 255},
|
||||
color.RGBA{R: 174, G: 113, B: 72, A: 255},
|
||||
color.RGBA{R: 161, G: 93, B: 60, A: 255},
|
||||
color.RGBA{R: 145, G: 76, B: 48, A: 255},
|
||||
color.RGBA{R: 133, G: 60, B: 36, A: 255},
|
||||
color.RGBA{R: 121, G: 44, B: 24, A: 255},
|
||||
color.RGBA{R: 109, G: 32, B: 16, A: 255},
|
||||
color.RGBA{R: 93, G: 20, B: 8, A: 255},
|
||||
color.RGBA{R: 80, G: 8, B: 4, A: 255},
|
||||
color.RGBA{R: 68, G: 4, B: 0, A: 255},
|
||||
color.RGBA{R: 56, G: 0, B: 0, A: 255},
|
||||
color.RGBA{R: 218, G: 218, B: 198, A: 255},
|
||||
color.RGBA{R: 194, G: 194, B: 170, A: 255},
|
||||
color.RGBA{R: 170, G: 170, B: 145, A: 255},
|
||||
color.RGBA{R: 145, G: 145, B: 121, A: 255},
|
||||
color.RGBA{R: 125, G: 125, B: 101, A: 255},
|
||||
color.RGBA{R: 101, G: 101, B: 76, A: 255},
|
||||
color.RGBA{R: 76, G: 76, B: 56, A: 255},
|
||||
color.RGBA{R: 56, G: 56, B: 40, A: 255},
|
||||
color.RGBA{R: 246, G: 222, B: 206, A: 255},
|
||||
color.RGBA{R: 234, G: 206, B: 190, A: 255},
|
||||
color.RGBA{R: 226, G: 194, B: 170, A: 255},
|
||||
color.RGBA{R: 214, G: 178, B: 153, A: 255},
|
||||
color.RGBA{R: 206, G: 165, B: 141, A: 255},
|
||||
color.RGBA{R: 194, G: 153, B: 125, A: 255},
|
||||
color.RGBA{R: 186, G: 141, B: 113, A: 255},
|
||||
color.RGBA{R: 174, G: 129, B: 101, A: 255},
|
||||
color.RGBA{R: 165, G: 117, B: 89, A: 255},
|
||||
color.RGBA{R: 153, G: 109, B: 76, A: 255},
|
||||
color.RGBA{R: 145, G: 97, B: 64, A: 255},
|
||||
color.RGBA{R: 133, G: 89, B: 56, A: 255},
|
||||
color.RGBA{R: 125, G: 76, B: 48, A: 255},
|
||||
color.RGBA{R: 113, G: 68, B: 36, A: 255},
|
||||
color.RGBA{R: 105, G: 60, B: 32, 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: 44, G: 16, B: 0, A: 255},
|
||||
color.RGBA{R: 36, G: 12, B: 0, A: 255},
|
||||
color.RGBA{R: 24, G: 8, B: 0, A: 255},
|
||||
color.RGBA{R: 16, G: 4, B: 0, A: 255},
|
||||
color.RGBA{R: 255, G: 255, B: 234, A: 255},
|
||||
color.RGBA{R: 255, G: 250, B: 198, A: 255},
|
||||
color.RGBA{R: 255, G: 242, B: 165, A: 255},
|
||||
color.RGBA{R: 255, G: 234, B: 129, A: 255},
|
||||
color.RGBA{R: 255, G: 218, B: 97, A: 255},
|
||||
color.RGBA{R: 255, G: 202, B: 60, A: 255},
|
||||
color.RGBA{R: 255, G: 182, B: 28, A: 255},
|
||||
color.RGBA{R: 255, G: 157, B: 0, A: 255},
|
||||
color.RGBA{R: 222, G: 222, B: 234, A: 255},
|
||||
color.RGBA{R: 202, G: 202, B: 218, A: 255},
|
||||
color.RGBA{R: 182, G: 182, B: 202, A: 255},
|
||||
color.RGBA{R: 165, G: 165, B: 186, A: 255},
|
||||
color.RGBA{R: 149, G: 149, B: 170, A: 255},
|
||||
color.RGBA{R: 133, G: 133, B: 157, A: 255},
|
||||
color.RGBA{R: 117, G: 117, B: 141, A: 255},
|
||||
color.RGBA{R: 101, G: 101, B: 125, A: 255},
|
||||
color.RGBA{R: 85, G: 85, B: 109, A: 255},
|
||||
color.RGBA{R: 72, G: 72, B: 97, A: 255},
|
||||
color.RGBA{R: 60, G: 60, B: 80, A: 255},
|
||||
color.RGBA{R: 44, G: 44, B: 64, A: 255},
|
||||
color.RGBA{R: 32, G: 32, B: 48, A: 255},
|
||||
color.RGBA{R: 20, G: 20, B: 32, A: 255},
|
||||
color.RGBA{R: 12, G: 12, B: 24, 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: 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},
|
||||
}
|
||||
)
|
||||
|
||||
func init() {
|
||||
Palettes["WagesOfWar"] = WagesOfWarPalette
|
||||
}
|
@@ -27,7 +27,7 @@ var (
|
||||
|
||||
EOF
|
||||
|
||||
bytes.read(3) # Ignore idx 0 so we can make it transparent
|
||||
f.read(3) # Ignore idx 0 so we can make it transparent
|
||||
|
||||
255.times do
|
||||
r, g, b = f.read(3).bytes
|
||||
|
Reference in New Issue
Block a user