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
|
## Current status
|
||||||
|
|
||||||
|
### Chaos Gate
|
||||||
|
|
||||||
Some of the original file formats are either partially or fully decoded. Maps,
|
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
|
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
|
(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
|
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.
|
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
|
## Long-term goals
|
||||||
|
|
||||||
Once full playthrough of the official single-player campaign for all four games
|
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())
|
assets, err := assetstore.New(cfg.DefaultEngine())
|
||||||
if err != nil {
|
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{
|
state := state{
|
||||||
|
@@ -57,7 +57,7 @@ func main() {
|
|||||||
|
|
||||||
assets, err := assetstore.New(cfg.DefaultEngine())
|
assets, err := assetstore.New(cfg.DefaultEngine())
|
||||||
if err != nil {
|
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
|
var obj *assetstore.Object
|
||||||
|
@@ -42,7 +42,7 @@ func (a *AssetStore) Object(name string) (*Object, error) {
|
|||||||
}
|
}
|
||||||
log.Printf("Loading object %v", name)
|
log.Printf("Loading object %v", name)
|
||||||
|
|
||||||
filename, err := a.lookup(name, "obj", "Obj")
|
filename, err := a.lookup(name, "obj", "Obj", "spr")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@@ -28,7 +28,11 @@ type SpriteHeader struct {
|
|||||||
|
|
||||||
func (s SpriteHeader) Check(expectedSize uint32) error {
|
func (s SpriteHeader) Check(expectedSize uint32) error {
|
||||||
if s.Padding1 != 0 || s.Padding2 != 0 {
|
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
|
// TODO: WarHammer.ani sets Unknown1 to this for all 188,286 sprites. I am
|
||||||
|
@@ -15,8 +15,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
expectedMagic = []byte("\x08\x00WHMAP\x00")
|
expectedMagic = []byte("\x15\x00AMB_MAP\x00")
|
||||||
expectedSetNameOffset = uint32(0x34)
|
expectedSetNameOffset = uint32(0x10)
|
||||||
notImplemented = fmt.Errorf("Not implemented")
|
notImplemented = fmt.Errorf("Not implemented")
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -25,35 +25,25 @@ const (
|
|||||||
MaxLength = 100 // Y coordinate
|
MaxLength = 100 // Y coordinate
|
||||||
MaxWidth = 130 // X coordinate
|
MaxWidth = 130 // X coordinate
|
||||||
|
|
||||||
CellSize = 16 // seems to be
|
CellSize = 13 // seems to be
|
||||||
|
|
||||||
cellDataOffset = 0x110 // definitely
|
cellDataOffset = 0xc0
|
||||||
cellCount = MaxHeight * MaxLength * MaxWidth
|
cellCount = MaxHeight * MaxLength * MaxWidth
|
||||||
)
|
)
|
||||||
|
|
||||||
type Header struct {
|
type Header struct {
|
||||||
IsCampaignMap uint32 // Tentatively: 0 = no, 1 = yes
|
Magic [10]byte // "\x15\x00AMB_MAP\x00"
|
||||||
MinWidth uint32
|
SetName [8]byte // Links to a filename in `/Sets/*.set`
|
||||||
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`
|
|
||||||
// Need to investigate the rest of the header too
|
// Need to investigate the rest of the header too
|
||||||
|
IsCampaignMap byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h Header) Width() int {
|
func (h Header) Width() int {
|
||||||
return int(h.MaxWidth - h.MinWidth)
|
return MaxWidth
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h Header) Length() int {
|
func (h Header) Length() int {
|
||||||
return int(h.MaxLength - h.MinLength)
|
return MaxLength
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h Header) Height() int {
|
func (h Header) Height() int {
|
||||||
@@ -80,7 +70,7 @@ type ObjRef struct {
|
|||||||
|
|
||||||
// The index into a set palette to retrieve the object
|
// The index into a set palette to retrieve the object
|
||||||
func (o ObjRef) Index() int {
|
func (o ObjRef) Index() int {
|
||||||
return int(o.AreaByte)
|
return int(o.AreaByte & 0x7f)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o ObjRef) Sprite() int {
|
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.
|
// The top bit seems to say whether we should draw or not.
|
||||||
func (o ObjRef) IsActive() bool {
|
func (o ObjRef) IsActive() bool {
|
||||||
return (o.SpriteAndFlagByte & 0x80) == 0x80
|
return (o.SpriteAndFlagByte & 0x80) == 0x80
|
||||||
}
|
} // PARIS is 78 x 60 x 7
|
||||||
|
// 4E 3C 7
|
||||||
|
/*
|
||||||
type Cell struct {
|
type Cell struct {
|
||||||
DoorAndCanisterRelated byte
|
DoorAndCanisterRelated byte
|
||||||
DoorLockAndReactorRelated byte
|
// DoorLockAndReactorRelated byte
|
||||||
Unknown2 byte
|
// Unknown2 byte
|
||||||
Surface ObjRef
|
Surface ObjRef
|
||||||
Left ObjRef
|
Left ObjRef
|
||||||
Right ObjRef
|
Right ObjRef
|
||||||
@@ -105,43 +96,60 @@ type Cell struct {
|
|||||||
Unknown12 byte
|
Unknown12 byte
|
||||||
Unknown13 byte
|
Unknown13 byte
|
||||||
Unknown14 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 {
|
func (c *Cell) At(n int) byte {
|
||||||
switch n {
|
switch n {
|
||||||
case 0:
|
case 0:
|
||||||
return c.DoorAndCanisterRelated
|
return c.Unknown1
|
||||||
case 1:
|
case 1:
|
||||||
return c.DoorLockAndReactorRelated
|
|
||||||
case 2:
|
|
||||||
return c.Unknown2
|
|
||||||
case 3:
|
|
||||||
return c.Surface.AreaByte
|
return c.Surface.AreaByte
|
||||||
case 4:
|
case 2:
|
||||||
return c.Surface.SpriteAndFlagByte
|
return c.Surface.SpriteAndFlagByte
|
||||||
case 5:
|
case 3:
|
||||||
return c.Left.AreaByte
|
return c.Left.AreaByte
|
||||||
case 6:
|
case 4:
|
||||||
return c.Left.SpriteAndFlagByte
|
return c.Left.SpriteAndFlagByte
|
||||||
case 7:
|
case 5:
|
||||||
return c.Right.AreaByte
|
return c.Right.AreaByte
|
||||||
case 8:
|
case 6:
|
||||||
return c.Right.SpriteAndFlagByte
|
return c.Right.SpriteAndFlagByte
|
||||||
case 9:
|
case 7:
|
||||||
return c.Center.AreaByte
|
return c.Center.AreaByte
|
||||||
case 10:
|
case 8:
|
||||||
return c.Center.SpriteAndFlagByte
|
return c.Center.SpriteAndFlagByte
|
||||||
|
case 9:
|
||||||
|
return c.Unknown2[0]
|
||||||
|
case 10:
|
||||||
|
return c.Unknown2[1]
|
||||||
case 11:
|
case 11:
|
||||||
return c.Unknown11
|
return c.Unknown2[2]
|
||||||
case 12:
|
case 12:
|
||||||
return c.Unknown12
|
return c.Unknown2[3]
|
||||||
case 13:
|
|
||||||
return c.Unknown13
|
|
||||||
case 14:
|
|
||||||
return c.Unknown14
|
|
||||||
case 15:
|
|
||||||
return c.SquadRelated
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0
|
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
|
// Cells is always a fixed size; use At to get a cell according to x,y,z
|
||||||
type Cells []Cell
|
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 {
|
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 {
|
func (h Header) Check() []error {
|
||||||
var out []error
|
var out []error
|
||||||
if h.IsCampaignMap > 1 {
|
// if h.IsCampaignMap > 1 {
|
||||||
out = append(out, fmt.Errorf("Expected 0 or 1 for IsCampaignMap, got %v", h.IsCampaignMap))
|
// out = append(out, fmt.Errorf("Expected 0 or 1 for IsCampaignMap, got %v", h.IsCampaignMap))
|
||||||
}
|
// }
|
||||||
|
|
||||||
if bytes.Compare(expectedMagic, h.Magic[:]) != 0 {
|
if bytes.Compare(expectedMagic, h.Magic[:]) != 0 {
|
||||||
out = append(out, fmt.Errorf("Unexpected magic value: %v", h.Magic))
|
out = append(out, fmt.Errorf("Unexpected magic value: %v", h.Magic))
|
||||||
@@ -176,10 +192,10 @@ type GameMap struct {
|
|||||||
|
|
||||||
func (m *GameMap) Rect() image.Rectangle {
|
func (m *GameMap) Rect() image.Rectangle {
|
||||||
return image.Rect(
|
return image.Rect(
|
||||||
int(m.Header.MinWidth),
|
int(0),
|
||||||
int(m.Header.MinLength),
|
int(0),
|
||||||
int(m.Header.MaxWidth),
|
int(m.Width()-1),
|
||||||
int(m.Header.MaxLength),
|
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
|
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
|
255.times do
|
||||||
r, g, b = f.read(3).bytes
|
r, g, b = f.read(3).bytes
|
||||||
|
Reference in New Issue
Block a user