Files
questshock/modding/hacked/ss1/edit/undoable/SoundEffectService.go
T

77 lines
2.4 KiB
Go

package undoable
import (
"github.com/inkyblackness/hacked/ss1/content/audio"
"github.com/inkyblackness/hacked/ss1/edit"
"github.com/inkyblackness/hacked/ss1/edit/media"
"github.com/inkyblackness/hacked/ss1/edit/undoable/cmd"
"github.com/inkyblackness/hacked/ss1/resource"
"github.com/inkyblackness/hacked/ss1/world"
)
// SoundEffectService provides read/write functionality with undo capability.
type SoundEffectService struct {
wrapped edit.SoundEffectService
commander cmd.Commander
}
// NewSoundEffectService returns a new instance of a service.
func NewSoundEffectService(wrapped edit.SoundEffectService, commander cmd.Commander) SoundEffectService {
return SoundEffectService{
wrapped: wrapped,
commander: commander,
}
}
// Modified returns true if the identified sound resource is marked as modified.
func (service SoundEffectService) Modified(key resource.Key) bool {
return service.wrapped.Modified(key)
}
// RequestRemove queues to erase the sound from the resources.
func (service SoundEffectService) RequestRemove(key resource.Key, restoreFunc func()) {
service.requestCommand(
func(setter media.SoundEffectBlockSetter) {
service.wrapped.Remove(setter, key)
},
service.wrapped.RestoreFunc(key),
restoreFunc)
}
// RequestClear queues to reset the identified audio resource to a silent one-sample audio.
func (service SoundEffectService) RequestClear(key resource.Key, restoreFunc func()) {
service.requestCommand(
func(setter media.SoundEffectBlockSetter) {
service.wrapped.Clear(setter, key)
},
service.wrapped.RestoreFunc(key),
restoreFunc)
}
// Audio returns the audio component of identified sound effect.
func (service SoundEffectService) Audio(key resource.Key) audio.L8 {
return service.wrapped.Audio(key)
}
// RequestSetAudio queues the change to update the audio.
func (service SoundEffectService) RequestSetAudio(key resource.Key, data audio.L8, restoreFunc func()) {
service.requestCommand(
func(setter media.SoundEffectBlockSetter) {
service.wrapped.SetAudio(setter, key, data)
},
service.wrapped.RestoreFunc(key),
restoreFunc)
}
func (service SoundEffectService) requestCommand(
forward func(modder media.SoundEffectBlockSetter),
reverse func(modder media.SoundEffectBlockSetter),
restore func()) {
c := command{
forward: func(modder world.Modder) { forward(modder) },
reverse: func(modder world.Modder) { reverse(modder) },
restore: restore,
}
service.commander.Queue(c)
}