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}, }