First attempt at character orientation

This commit is contained in:
2020-06-13 23:10:21 +01:00
parent 5df050b4ef
commit c5e6abb798
6 changed files with 45 additions and 22 deletions

View File

@@ -184,3 +184,10 @@ $ ./scripts/convert-wav ./orig/Wav
As with video playback, the ambition is to *eventually* remove this dependency As with video playback, the ambition is to *eventually* remove this dependency
and operate on the unmodified files instead. and operate on the unmodified files instead.
## Resources
Here's a collection of links that I'm finding useful or otherwise interesting,
and don't want to lose track of...
* [Historical geocities modders](http://www.oocities.org/timessquare/galaxy/6777/)

View File

@@ -221,5 +221,8 @@ func loadIdx(idxPath string) {
for i, group := range idx.Groups { for i, group := range idx.Groups {
log.Printf("Group %2d: %4d records, start sprite is %6d", i, len(group.Records), group.Spec.SpriteIdx) log.Printf("Group %2d: %4d records, start sprite is %6d", i, len(group.Records), group.Spec.SpriteIdx)
for i, rec := range group.Records {
log.Printf("\t%3d: %#+v", i, rec)
}
} }
} }

View File

@@ -610,11 +610,6 @@ ignoring it for now.
thingies, and it, padding? Minus a bit? 0x50 is another non-null byte. Then thingies, and it, padding? Minus a bit? 0x50 is another non-null byte. Then
it's all zeroes until one byte before the first name at 0xee. it's all zeroes until one byte before the first name at 0xee.
It's hard to say where the alignment should be at this point. We need to compare
more characters with each other. Other notes...
Characters are organised into Squads somehow.
Individual cells seem to have a flag to say "We have a character in us", but not Individual cells seem to have a flag to say "We have a character in us", but not
the number for the character themselves, so the coordinates must be in the the number for the character themselves, so the coordinates must be in the
per-character records also. There are several candidates for this. per-character records also. There are several candidates for this.
@@ -645,8 +640,10 @@ suggested above:
| 267 | 1 | Unknown | | 267 | 1 | Unknown |
| 268 | 1 | Health | | 268 | 1 | Health |
| 269 | 495 | ??? | | 269 | 495 | ??? |
| 764 | 1(?) | Squad number? | | 764 | 1(?) | Squad number |
| 765 | 927 | ??? | | 765 | 895 | ??? |
| 1660 | 1? | Orientation? Could also be `0x680`... |
| 1661 | 31 | ??? |
There's still a lot of bytes to dig through, but this allows me to load the There's still a lot of bytes to dig through, but this allows me to load the
character names from Chapter01 correctly, with the exception of record 57 which character names from Chapter01 correctly, with the exception of record 57 which
@@ -654,10 +651,13 @@ just contains `\x02` and is then null-terminated all the way through - but maybe
that's just a data thing. that's just a data thing.
How about their types? `HasAction.dat` lists numbers for character types, and How about their types? `HasAction.dat` lists numbers for character types, and
those show up immediately before the name. going from the character type to the those show up immediately before the name. Going from the character type to the
animation group is not yet fully deciphered - captains mess up a direct animation group is not yet fully deciphered - squad leaders mess up a direct
correlation - but a fixed offset table allows me to draw the characters \o/. correlation - but a fixed offset table allows me to draw the characters \o/.
Orientation is not yet deciphered, however.
Putting 8 characters onto a map and orienting them in the compass points, we see
numbers ranging from 0 to 7 at 0x67c and 0x680. Assuming this is the scheme
used, north is value 1, northeast value 2, and northwest value 0.
Given two characters of the same type, just in different locations, differing Given two characters of the same type, just in different locations, differing
values are seen at: values are seen at:

View File

@@ -49,24 +49,37 @@ func (a *AssetStore) AnimationsObject() (*Object, error) {
return obj, nil return obj, nil
} }
func (a *AssetStore) Animation(groupIdx, recIdx int) (*Animation, error) { func (a *AssetStore) Animation(groupIdx int, recId int, compass int) (*Animation, error) {
idx, err := a.AnimationsIndex() realIdx, err := a.AnimationsIndex()
if err != nil { if err != nil {
return nil, err return nil, err
} }
// FIXME: are we using the right value if we need to make this change?
if compass == 0 {
compass = 8
}
obj, err := a.AnimationsObject() obj, err := a.AnimationsObject()
if err != nil { if err != nil {
return nil, err return nil, err
} }
group := idx.Groups[groupIdx] group := realIdx.Groups[groupIdx]
if group.Spec.Count == 0 { if group.Spec.Count == 0 {
return &Animation{}, nil return &Animation{}, nil
} }
// rec := group.Records[recIdx] var det *idx.Detail
det := group.Details[recIdx] for i, rec := range group.Records {
if /*int(rec.ActionID) == int(action) && */ int(rec.Compass) == compass {
det = &group.Details[i]
}
}
if det == nil {
return nil, fmt.Errorf("Couldn't find anim (%v %v %v)", groupIdx, recId, compass)
}
first := int(group.Spec.SpriteIdx) + int(det.FirstSprite) first := int(group.Spec.SpriteIdx) + int(det.FirstSprite)
last := int(group.Spec.SpriteIdx) + int(det.LastSprite) last := int(group.Spec.SpriteIdx) + int(det.LastSprite)
@@ -80,7 +93,7 @@ func (a *AssetStore) Animation(groupIdx, recIdx int) (*Animation, error) {
return &Animation{Frames: sprites}, nil return &Animation{Frames: sprites}, nil
} }
func (a *AssetStore) CharacterAnimation(ctype data.CharacterType, action data.AnimAction) (*Animation, error) { func (a *AssetStore) CharacterAnimation(ctype data.CharacterType, action data.AnimAction, compass int) (*Animation, error) {
ha, err := a.HasAction() ha, err := a.HasAction()
if err != nil { if err != nil {
return nil, err return nil, err
@@ -122,7 +135,5 @@ func (a *AssetStore) CharacterAnimation(ctype data.CharacterType, action data.An
return nil, fmt.Errorf("Unknown character type: %s", ctype) return nil, fmt.Errorf("Unknown character type: %s", ctype)
} }
rec := ha.Index(ctype, action) return a.Animation(group, int(action), compass)
return a.Animation(group, rec)
} }

View File

@@ -103,8 +103,8 @@ func (m *Map) SpritesForCell(x, y, z int) ([]*Sprite, error) {
sprites = append(sprites, sprite) sprites = append(sprites, sprite)
} }
if chr := m.CharacterAt(x, y, z); chr != nil { if chr := m.CharacterAt(x, y, z); chr != nil {
// Look up the correct animation, get the frame, boom // Look up the correct animation, get the frame, boom shakalaka
anim, err := m.assets.CharacterAnimation(chr.Type, data.AnimActionNone) anim, err := m.assets.CharacterAnimation(chr.Type, data.AnimActionNone, int(chr.Orientation))
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -124,7 +124,9 @@ type Character struct {
XPos int `struc:"byte"` XPos int `struc:"byte"`
Unknown7 []byte `struc:"[317]byte"` Unknown7 []byte `struc:"[317]byte"`
SquadNumber byte `struc:"byte"` SquadNumber byte `struc:"byte"`
Unknown8 []byte `struc:"[927]byte"` Unknown8 []byte `struc:"[895]byte"`
Orientation byte `struc:"byte"`
Unknown9 []byte `struc:"[31]byte"`
// TODO: each character may have a fixed number of subrecords for inventory // TODO: each character may have a fixed number of subrecords for inventory
} }