Adding modding folder with a hacked build.
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
package media
|
||||
|
||||
import (
|
||||
"github.com/inkyblackness/hacked/ss1/content/audio"
|
||||
"github.com/inkyblackness/hacked/ss1/content/movie"
|
||||
"github.com/inkyblackness/hacked/ss1/resource"
|
||||
)
|
||||
|
||||
// AudioBlockSetter modifies storage of raw resource data.
|
||||
type AudioBlockSetter interface {
|
||||
SetResourceBlocks(lang resource.Language, id resource.ID, data [][]byte)
|
||||
DelResource(lang resource.Language, id resource.ID)
|
||||
}
|
||||
|
||||
// AudioSetterService provides methods to change audio resources.
|
||||
type AudioSetterService struct{}
|
||||
|
||||
// NewAudioSetterService returns a new instance.
|
||||
func NewAudioSetterService() AudioSetterService {
|
||||
return AudioSetterService{}
|
||||
}
|
||||
|
||||
// Remove deletes any audio resource for given key.
|
||||
func (service AudioSetterService) Remove(setter AudioBlockSetter, key resource.Key) {
|
||||
setter.DelResource(key.Lang, key.ID)
|
||||
}
|
||||
|
||||
// Clear resets the identified audio resource to a silent one-sample audio.
|
||||
func (service AudioSetterService) Clear(setter AudioBlockSetter, key resource.Key) {
|
||||
silence := audio.L8{SampleRate: 22050, Samples: []byte{0x80}}
|
||||
service.Set(setter, key, silence)
|
||||
}
|
||||
|
||||
// Set stores the given sound as the identified resource.
|
||||
func (service AudioSetterService) Set(setter AudioBlockSetter, key resource.Key, sound audio.L8) {
|
||||
movieData := movie.ContainSoundData(sound)
|
||||
blockData := [][]byte{movieData}
|
||||
setter.SetResourceBlocks(key.Lang, key.ID, blockData)
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package media
|
||||
|
||||
import (
|
||||
"github.com/inkyblackness/hacked/ss1/content/audio"
|
||||
"github.com/inkyblackness/hacked/ss1/content/movie"
|
||||
"github.com/inkyblackness/hacked/ss1/resource"
|
||||
)
|
||||
|
||||
// AudioBlockGetter provides raw data of blocks.
|
||||
type AudioBlockGetter interface {
|
||||
ModifiedBlock(lang resource.Language, id resource.ID, index int) []byte
|
||||
}
|
||||
|
||||
// AudioViewerService provides read-only access to audio resources.
|
||||
type AudioViewerService struct {
|
||||
movieCache *movie.Cache
|
||||
getter AudioBlockGetter
|
||||
}
|
||||
|
||||
// NewAudioViewerService returns a new instance.
|
||||
func NewAudioViewerService(movieCache *movie.Cache, getter AudioBlockGetter) AudioViewerService {
|
||||
return AudioViewerService{
|
||||
movieCache: movieCache,
|
||||
getter: getter,
|
||||
}
|
||||
}
|
||||
|
||||
// Audio returns the sound data associated with the given key.
|
||||
func (service AudioViewerService) Audio(key resource.Key) audio.L8 {
|
||||
sound, _ := service.movieCache.Audio(key)
|
||||
return sound
|
||||
}
|
||||
|
||||
// Modified returns true if the identified audio resource is marked as modified.
|
||||
func (service AudioViewerService) Modified(key resource.Key) bool {
|
||||
data := service.getter.ModifiedBlock(key.Lang, key.ID, 0)
|
||||
return len(data) > 0
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package media
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
|
||||
"github.com/inkyblackness/hacked/ss1/content/movie"
|
||||
"github.com/inkyblackness/hacked/ss1/content/text"
|
||||
"github.com/inkyblackness/hacked/ss1/resource"
|
||||
)
|
||||
|
||||
// MovieBlockSetter modifies storage of raw resource data.
|
||||
type MovieBlockSetter interface {
|
||||
SetResourceBlocks(lang resource.Language, id resource.ID, data [][]byte)
|
||||
DelResource(lang resource.Language, id resource.ID)
|
||||
}
|
||||
|
||||
// MovieSetterService can be used to set movie data.
|
||||
type MovieSetterService struct {
|
||||
cp text.Codepage
|
||||
}
|
||||
|
||||
// NewMovieSetterService returns a new instance.
|
||||
func NewMovieSetterService(cp text.Codepage) MovieSetterService {
|
||||
return MovieSetterService{cp: cp}
|
||||
}
|
||||
|
||||
// Remove deletes any movie resource for given key.
|
||||
func (service MovieSetterService) Remove(setter MovieBlockSetter, key resource.Key) {
|
||||
setter.DelResource(key.Lang, key.ID)
|
||||
}
|
||||
|
||||
// Set exports the given container.
|
||||
func (service MovieSetterService) Set(setter MovieBlockSetter, key resource.Key, container movie.Container) {
|
||||
buf := bytes.NewBuffer(nil)
|
||||
_ = movie.Write(buf, container, service.cp)
|
||||
setter.SetResourceBlocks(key.Lang, key.ID, [][]byte{buf.Bytes()})
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
package media
|
||||
|
||||
import (
|
||||
"github.com/inkyblackness/hacked/ss1/content/audio"
|
||||
"github.com/inkyblackness/hacked/ss1/content/movie"
|
||||
"github.com/inkyblackness/hacked/ss1/resource"
|
||||
)
|
||||
|
||||
// MovieBlockGetter provides raw data of blocks.
|
||||
type MovieBlockGetter interface {
|
||||
ModifiedBlock(lang resource.Language, id resource.ID, index int) []byte
|
||||
}
|
||||
|
||||
// MovieViewerService provides read-only access to movie resources.
|
||||
type MovieViewerService struct {
|
||||
movieCache *movie.Cache
|
||||
getter MovieBlockGetter
|
||||
}
|
||||
|
||||
// NewMovieViewerService returns a new instance.
|
||||
func NewMovieViewerService(movieCache *movie.Cache, getter MovieBlockGetter) MovieViewerService {
|
||||
return MovieViewerService{
|
||||
movieCache: movieCache,
|
||||
getter: getter,
|
||||
}
|
||||
}
|
||||
|
||||
// Modified returns true if the identified text resource is marked as modified.
|
||||
func (service MovieViewerService) Modified(key resource.Key) bool {
|
||||
return len(service.getter.ModifiedBlock(key.Lang, key.ID, key.Index)) > 0
|
||||
}
|
||||
|
||||
// SizeWarning returns true if the given movie is larger than the underlying archive would support.
|
||||
func (service MovieViewerService) SizeWarning(key resource.Key) bool {
|
||||
return service.movieCache.SizeWarning(key)
|
||||
}
|
||||
|
||||
// Container returns the base container of the movie.
|
||||
func (service MovieViewerService) Container(key resource.Key) (movie.Container, error) {
|
||||
return service.movieCache.Container(key)
|
||||
}
|
||||
|
||||
// Video returns the visual component associated with the given key.
|
||||
func (service MovieViewerService) Video(key resource.Key) []movie.Scene {
|
||||
currentValue, cacheErr := service.movieCache.Video(key)
|
||||
if cacheErr != nil {
|
||||
return nil
|
||||
}
|
||||
return currentValue
|
||||
}
|
||||
|
||||
// Audio returns the audio data associated with the given key.
|
||||
func (service MovieViewerService) Audio(key resource.Key) audio.L8 {
|
||||
currentValue, cacheErr := service.movieCache.Audio(key)
|
||||
if cacheErr != nil {
|
||||
return audio.L8{}
|
||||
}
|
||||
return currentValue
|
||||
}
|
||||
|
||||
// Subtitles returns the subtitles associated with the given key.
|
||||
func (service MovieViewerService) Subtitles(key resource.Key, language resource.Language) movie.SubtitleList {
|
||||
currentValue, cacheErr := service.movieCache.Subtitles(key, language)
|
||||
if cacheErr != nil {
|
||||
return movie.SubtitleList{}
|
||||
}
|
||||
return currentValue
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package media
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
|
||||
"github.com/inkyblackness/hacked/ss1/content/audio"
|
||||
"github.com/inkyblackness/hacked/ss1/content/audio/voc"
|
||||
"github.com/inkyblackness/hacked/ss1/resource"
|
||||
)
|
||||
|
||||
// SoundEffectBlockSetter modifies storage of raw resource data.
|
||||
type SoundEffectBlockSetter interface {
|
||||
SetResourceBlocks(lang resource.Language, id resource.ID, data [][]byte)
|
||||
DelResource(lang resource.Language, id resource.ID)
|
||||
}
|
||||
|
||||
// SoundEffectSetterService provides methods to change sound resources.
|
||||
type SoundEffectSetterService struct{}
|
||||
|
||||
// NewSoundSetterService returns a new instance.
|
||||
func NewSoundSetterService() SoundEffectSetterService {
|
||||
return SoundEffectSetterService{}
|
||||
}
|
||||
|
||||
// Remove deletes any audio resource for given key.
|
||||
func (service SoundEffectSetterService) Remove(setter SoundEffectBlockSetter, key resource.Key) {
|
||||
setter.DelResource(key.Lang, key.ID.Plus(key.Index))
|
||||
}
|
||||
|
||||
// Clear resets the identified audio resource to a silent one-sample audio.
|
||||
func (service SoundEffectSetterService) Clear(setter SoundEffectBlockSetter, key resource.Key) {
|
||||
silence := audio.L8{SampleRate: 22050, Samples: []byte{0x80}}
|
||||
service.Set(setter, key, silence)
|
||||
}
|
||||
|
||||
// Set stores the given sound as the identified resource.
|
||||
func (service SoundEffectSetterService) Set(setter SoundEffectBlockSetter, key resource.Key, data audio.L8) {
|
||||
buf := bytes.NewBuffer(nil)
|
||||
_ = voc.Save(buf, data.SampleRate, data.Samples)
|
||||
blockData := [][]byte{buf.Bytes()}
|
||||
setter.SetResourceBlocks(key.Lang, key.ID.Plus(key.Index), blockData)
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package media
|
||||
|
||||
import (
|
||||
"github.com/inkyblackness/hacked/ss1/content/audio"
|
||||
"github.com/inkyblackness/hacked/ss1/content/sound"
|
||||
"github.com/inkyblackness/hacked/ss1/resource"
|
||||
)
|
||||
|
||||
// SoundEffectBlockGetter provides raw data of blocks.
|
||||
type SoundEffectBlockGetter interface {
|
||||
ModifiedBlock(lang resource.Language, id resource.ID, index int) []byte
|
||||
}
|
||||
|
||||
// SoundEffectViewerService provides read-only access to audio resources.
|
||||
type SoundEffectViewerService struct {
|
||||
soundCache *sound.EffectCache
|
||||
getter SoundEffectBlockGetter
|
||||
}
|
||||
|
||||
// NewSoundViewerService returns a new instance.
|
||||
func NewSoundViewerService(soundCache *sound.EffectCache, getter SoundEffectBlockGetter) SoundEffectViewerService {
|
||||
return SoundEffectViewerService{
|
||||
soundCache: soundCache,
|
||||
getter: getter,
|
||||
}
|
||||
}
|
||||
|
||||
// Audio returns the audio data associated with the given key.
|
||||
func (service SoundEffectViewerService) Audio(key resource.Key) audio.L8 {
|
||||
sound, _ := service.soundCache.Audio(key)
|
||||
return sound
|
||||
}
|
||||
|
||||
// Modified returns true if the identified sound resource is marked as modified.
|
||||
func (service SoundEffectViewerService) Modified(key resource.Key) bool {
|
||||
data := service.getter.ModifiedBlock(key.Lang, key.ID.Plus(key.Index), 0)
|
||||
return len(data) > 0
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
package media
|
||||
|
||||
import (
|
||||
"github.com/inkyblackness/hacked/ss1/content/text"
|
||||
"github.com/inkyblackness/hacked/ss1/resource"
|
||||
"github.com/inkyblackness/hacked/ss1/world/ids"
|
||||
)
|
||||
|
||||
// TextBlockSetter modifies storage of raw resource data.
|
||||
type TextBlockSetter interface {
|
||||
SetResourceBlock(lang resource.Language, id resource.ID, index int, data []byte)
|
||||
SetResourceBlocks(lang resource.Language, id resource.ID, data [][]byte)
|
||||
DelResource(lang resource.Language, id resource.ID)
|
||||
}
|
||||
|
||||
// TextSetterService provides methods to change text resources.
|
||||
type TextSetterService struct {
|
||||
cp text.Codepage
|
||||
}
|
||||
|
||||
// NewTextSetterService returns a new instance.
|
||||
func NewTextSetterService(cp text.Codepage) TextSetterService {
|
||||
return TextSetterService{
|
||||
cp: cp,
|
||||
}
|
||||
}
|
||||
|
||||
// Remove deletes any text resource for given key.
|
||||
func (service TextSetterService) Remove(setter TextBlockSetter, key resource.Key) {
|
||||
info, _ := ids.Info(key.ID)
|
||||
if info.List {
|
||||
setter.SetResourceBlock(key.Lang, key.ID, key.Index, nil)
|
||||
} else {
|
||||
id := key.ID.Plus(key.Index)
|
||||
setter.DelResource(key.Lang, id)
|
||||
}
|
||||
}
|
||||
|
||||
// Clear resets the identified text resource to an empty string.
|
||||
func (service TextSetterService) Clear(setter TextBlockSetter, key resource.Key) {
|
||||
service.Set(setter, key, "")
|
||||
}
|
||||
|
||||
// Set stores the given text as the identified resource.
|
||||
func (service TextSetterService) Set(setter TextBlockSetter, key resource.Key, value string) {
|
||||
blockedValue := text.Blocked(value)
|
||||
info, _ := ids.Info(key.ID)
|
||||
if info.List {
|
||||
newData := service.cp.Encode(blockedValue[0])
|
||||
setter.SetResourceBlock(key.Lang, key.ID, key.Index, newData)
|
||||
} else {
|
||||
newData := make([][]byte, len(blockedValue))
|
||||
for index, blockLine := range blockedValue {
|
||||
newData[index] = service.cp.Encode(blockLine)
|
||||
}
|
||||
id := key.ID.Plus(key.Index)
|
||||
setter.SetResourceBlocks(key.Lang, id, newData)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package media
|
||||
|
||||
import (
|
||||
"github.com/inkyblackness/hacked/ss1/content/text"
|
||||
"github.com/inkyblackness/hacked/ss1/resource"
|
||||
"github.com/inkyblackness/hacked/ss1/world/ids"
|
||||
)
|
||||
|
||||
// TextBlockGetter provides raw data of blocks.
|
||||
type TextBlockGetter interface {
|
||||
ModifiedBlock(lang resource.Language, id resource.ID, index int) []byte
|
||||
ModifiedBlocks(lang resource.Language, id resource.ID) [][]byte
|
||||
}
|
||||
|
||||
// TextViewerService provides read-only access to text resources.
|
||||
type TextViewerService struct {
|
||||
lineCache *text.Cache
|
||||
pageCache *text.Cache
|
||||
getter TextBlockGetter
|
||||
}
|
||||
|
||||
// NewTextViewerService returns a new instance.
|
||||
func NewTextViewerService(lineCache, pageCache *text.Cache, getter TextBlockGetter) TextViewerService {
|
||||
return TextViewerService{
|
||||
lineCache: lineCache,
|
||||
pageCache: pageCache,
|
||||
getter: getter,
|
||||
}
|
||||
}
|
||||
|
||||
// Text returns the text data associated with the given key.
|
||||
func (service TextViewerService) Text(key resource.Key) string {
|
||||
var cache *text.Cache
|
||||
resourceInfo, existing := ids.Info(key.ID)
|
||||
if !existing || resourceInfo.List {
|
||||
cache = service.lineCache
|
||||
} else {
|
||||
cache = service.pageCache
|
||||
}
|
||||
currentValue, cacheErr := cache.Text(key)
|
||||
if cacheErr != nil {
|
||||
currentValue = ""
|
||||
}
|
||||
return currentValue
|
||||
}
|
||||
|
||||
// Modified returns true if the identified text resource is marked as modified.
|
||||
func (service TextViewerService) Modified(key resource.Key) bool {
|
||||
info, _ := ids.Info(key.ID)
|
||||
if info.List {
|
||||
return len(service.getter.ModifiedBlock(key.Lang, key.ID, key.Index)) > 0
|
||||
}
|
||||
return len(service.getter.ModifiedBlocks(key.Lang, key.ID.Plus(key.Index))) > 0
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
// Package media contains low-level media accessors and modifier.
|
||||
package media
|
||||
Reference in New Issue
Block a user