Files
questshock/modding/hacked/ss1/world/ids/Info.go
T

162 lines
7.4 KiB
Go

package ids
import (
"github.com/inkyblackness/hacked/ss1/content/archive"
"github.com/inkyblackness/hacked/ss1/content/archive/level/lvlids"
"github.com/inkyblackness/hacked/ss1/content/object"
"github.com/inkyblackness/hacked/ss1/resource"
)
// ResourceInfo describes a group of resources with their default serialization properties.
type ResourceInfo struct {
// StartID is the first ID of the resource block (inclusive).
StartID resource.ID
// EndID is the last ID of the resource block (exclusive).
EndID resource.ID
// ContentType describes how to interpret resource data.
ContentType resource.ContentType
// Compound indicates whether the resource has a variable amount of blocks. Simple resources always have one block.
Compound bool
// Compressed indicates that the resource data shall be stored in compressed form.
Compressed bool
// List is set for compound resources that have an atomic resource per block.
List bool
// MaxCount describes how many resources can be stored at maximum. Zero for unlimited / defined somewhere else.
MaxCount int
// ResFile specifies the .res file in which this resource should be stored.
ResFile Filename
}
// Info returns the resource information for the identified resource.
func Info(id resource.ID) (ResourceInfo, bool) {
info, existing := infoByID[id]
return info, existing
}
func init() {
register := func(info ResourceInfo) {
count := info.EndID.Value() - info.StartID.Value()
for offset := 0; offset < int(count); offset++ {
infoByID[info.StartID.Plus(offset)] = info
}
}
for _, info := range infoList {
register(info)
}
levelInfo := func(lvl int, lvlResID int, compressed bool) ResourceInfo {
resID := LevelResourcesStart.Plus(lvl*lvlids.PerLevel + lvlResID)
return ResourceInfo{
StartID: resID,
EndID: resID.Plus(1),
ContentType: resource.Archive,
Compound: false,
Compressed: compressed,
List: false,
MaxCount: 1,
ResFile: Archive,
}
}
// In the following, the compression flags were set if the vanilla archive had
// the respective resource compressed in at least one level.
// Most of them were compressed uniform across all levels, some had exceptions.
for lvl := 0; lvl < archive.MaxLevels; lvl++ {
register(levelInfo(lvl, lvlids.MapVersionNumber, false))
register(levelInfo(lvl, lvlids.ObjectVersionNumber, false))
register(levelInfo(lvl, lvlids.Information, true))
register(levelInfo(lvl, lvlids.TileMap, true))
register(levelInfo(lvl, lvlids.Schedules, false))
register(levelInfo(lvl, lvlids.TextureAtlas, false))
register(levelInfo(lvl, lvlids.ObjectMainTable, true))
register(levelInfo(lvl, lvlids.ObjectCrossRefTable, true))
for class := 0; class < object.ClassCount; class++ {
register(levelInfo(lvl, lvlids.ObjectClassTablesStart+class, true))
register(levelInfo(lvl, lvlids.ObjectDefaultTablesStart+class, true))
}
register(levelInfo(lvl, lvlids.SavefileVersion, false))
register(levelInfo(lvl, lvlids.Unused41, false))
register(levelInfo(lvl, lvlids.TextureAnimations, true))
register(levelInfo(lvl, lvlids.SurveillanceSources, true))
register(levelInfo(lvl, lvlids.SurveillanceSurrogates, true))
register(levelInfo(lvl, lvlids.Parameters, true))
register(levelInfo(lvl, lvlids.MapNotes, true))
register(levelInfo(lvl, lvlids.MapNotesPointer, false))
register(levelInfo(lvl, lvlids.Unknown48, true))
register(levelInfo(lvl, lvlids.Unknown49, true))
register(levelInfo(lvl, lvlids.Unknown50, false))
register(levelInfo(lvl, lvlids.LoopConfiguration, true))
register(levelInfo(lvl, lvlids.Unknown52, false))
register(levelInfo(lvl, lvlids.HeightSemaphores, true))
}
}
var infoByID = map[resource.ID]ResourceInfo{}
var infoList = []ResourceInfo{
{GamePalettesStart, GamePalettesStart.Plus(3), resource.Palette, false, false, false, 3, GamePal},
{IconTextures, IconTextures.Plus(1), resource.Bitmap, true, false, true, 293, Texture},
{SmallTextures, SmallTextures.Plus(1), resource.Bitmap, true, false, true, 293, Texture},
{MediumTextures, MediumTextures.Plus(293), resource.Bitmap, true, false, false, 293, Texture},
{LargeTextures, LargeTextures.Plus(293), resource.Bitmap, true, false, false, 293, Texture},
{TextureNames, TextureNames.Plus(1), resource.Text, true, false, true, 293, CybStrng},
{TextureUsages, TextureUsages.Plus(1), resource.Text, true, false, true, 293, CybStrng},
{ObjectBitmaps, ObjectBitmaps.Plus(1), resource.Bitmap, true, false, true, 0, ObjArt},
{ObjectTextureBitmaps, ObjectTextureBitmaps.Plus(64), resource.Bitmap, true, false, false, 64, CitMat},
{ObjectMaterialBitmaps, ObjectMaterialBitmaps.Plus(32), resource.Bitmap, true, false, false, 32, CitMat},
{ScreenTextures, ScreenTextures.Plus(102), resource.Bitmap, true, false, false, 102, Texture},
{IconBitmaps, IconBitmaps.Plus(1), resource.Bitmap, true, false, true, 64, ObjArt3},
{GraffitiBitmaps, GraffitiBitmaps.Plus(1), resource.Bitmap, true, false, true, 64, ObjArt3},
{MfdDataBitmaps, MfdDataBitmaps.Plus(1), resource.Bitmap, true, true, true, 256, MfdArt},
{VideoMailBitmapsStart, VideoMailBitmapsStart.Plus(12), resource.Bitmap, true, false, false, 12, VidMail},
{VideoMailAnimationsStart, VideoMailAnimationsStart.Plus(12), resource.Animation, true, false, false, 12, VidMail},
{MovieIntro, MovieIntro.Plus(1), resource.Movie, false, false, false, 1, SvgaIntr},
{MovieDeath, MovieDeath.Plus(1), resource.Movie, false, false, false, 1, SvgaDeth},
{MovieEnd, MovieEnd.Plus(1), resource.Movie, false, false, false, 1, SvgaEnd},
{PaperTextsStart, PaperTextsStart.Plus(16), resource.Text, true, false, false, 16, CybStrng},
{TrapMessageTexts, TrapMessageTexts.Plus(1), resource.Text, true, false, true, 256, CybStrng},
{TrapMessagesAudioStart, TrapMessagesAudioStart.Plus(256), resource.Movie, false, false, false, 256, CitBark},
{SoundEffectsAudioStart, SoundEffectsAudioStart.Plus(114), resource.Sound, false, false, false, 114, DigiFX},
{WordTexts, WordTexts.Plus(1), resource.Text, true, false, true, 512, CybStrng},
{PanelNameTexts, PanelNameTexts.Plus(1), resource.Text, true, false, true, 256, CybStrng},
{LogCategoryTexts, LogCategoryTexts.Plus(1), resource.Text, true, false, true, 16, CybStrng},
{VariousMessageTexts, VariousMessageTexts.Plus(1), resource.Text, true, false, true, 256, CybStrng},
{ScreenMessageTexts, ScreenMessageTexts.Plus(1), resource.Text, true, false, true, 120, CybStrng},
{InfoNodeMessageTexts, InfoNodeMessageTexts.Plus(1), resource.Text, true, false, true, 256, CybStrng},
{AccessCardNameTexts, AccessCardNameTexts.Plus(1), resource.Text, true, false, true, 32 * 2, CybStrng},
{DataletMessageTexts, DataletMessageTexts.Plus(1), resource.Text, true, false, true, 256, CybStrng},
{MailsStart, MailsStart.Plus(47), resource.Text, true, false, false, 47, CybStrng},
{LogsStart, LogsStart.Plus(136), resource.Text, true, false, false, 136, CybStrng},
{FragmentsStart, FragmentsStart.Plus(16), resource.Text, true, false, false, 16, CybStrng},
{MailsAudioStart, MailsAudioStart.Plus(47), resource.Movie, false, false, false, 47, CitALog},
{LogsAudioStart, LogsAudioStart.Plus(224), resource.Movie, false, false, false, 224, CitALog},
{ObjectLongNames, ObjectLongNames.Plus(1), resource.Text, true, false, true, 0, CybStrng},
{ObjectShortNames, ObjectShortNames.Plus(1), resource.Text, true, false, true, 0, CybStrng},
{ArchiveName, ArchiveName.Plus(1), resource.Archive, false, false, false, 1, Archive},
{GameState, GameState.Plus(1), resource.Archive, false, true, false, 1, Archive},
}