Source code for ndspy.soundGroup
# Copyright 2019 RoadrunnerWMC
#
# This file is part of ndspy.
#
# ndspy is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ndspy is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ndspy. If not, see <https://www.gnu.org/licenses/>.
"""
Support for sound groups within SDATs.
"""
import enum
[docs]class GroupEntryType(enum.IntEnum):
"""
An enumeration that distinguishes between the types of files that
a group entry can refer to.
"""
SSEQ = 0
SBNK = 1
SWAR = 2
SSAR = 3
[docs]class SWARLoadMethod(enum.IntEnum):
"""
An enumeration that distinguishes between the ways in which a *SWAR*
can be loaded.
"""
FILE_IDS = 0
SWAR_IDS = 1
[docs]class GroupEntry:
"""
An entry in a sound group.
"""
# Default options value is "2" to set SWAR load method to SWAR IDs,
# which is what we want to be the default
def __init__(self, type=GroupEntryType.SSEQ, options=2, id=0):
self.type = GroupEntryType(type)
self.id = id
# The variable names are based on actual code RE.
# Note that a SSEQ will pass its "options" value on to the
# SBNK it loads, and a SBNK will do the same with the SWARs it
# loads.
self.loadSSEQ = bool(options & 1)
self.loadSBNKSWARsFrom = SWARLoadMethod(bool(options & 2))
self.loadSWAR = bool(options & 4)
self.loadSSAR = bool(options & 8)
[docs] @classmethod
def fromFlags(cls, type, id, loadSSEQ=False,
loadSBNKSWARsFrom=SWARLoadMethod.SWAR_IDS, loadSWAR=False,
loadSSAR=False):
"""
Create a sound group entry from individual attribute values.
"""
self = cls(type, 0, id)
self.loadSSEQ = loadSSEQ
self.loadSBNKSWARsFrom = loadSBNKSWARsFrom
self.loadSWAR = loadSWAR
self.loadSSAR = loadSSAR
return self
[docs] def save(self):
"""
Return this sound group entry's type, options value, and ID as a
3-tuple. This matches the parameters of the default class
constructor.
"""
options = 0
if self.loadSSEQ: options |= 1
if self.loadSBNKSWARsFrom == SWARLoadMethod.SWAR_IDS: options |= 2
if self.loadSWAR: options |= 4
if self.loadSSAR: options |= 8
return self.type, options, self.id
def __str__(self):
typeName = {
GroupEntryType.SSEQ: 'sseq',
GroupEntryType.SBNK: 'sbnk',
GroupEntryType.SWAR: 'swar',
GroupEntryType.SSAR: 'ssar',
}.get(self.type, str(int(self.type)))
optionsL = []
if self.loadSSEQ: optionsL.append('load-sseq')
if self.loadSBNKSWARsFrom:
method = {
SWARLoadMethod.FILE_IDS: 'file-id',
SWARLoadMethod.SWAR_IDS: 'swar-id',
}[self.loadSBNKSWARsFrom]
optionsL.append('load-swars-by-' + method)
if self.loadSWAR: optionsL.append('load-swar')
if self.loadSSAR: optionsL.append('load-ssar')
options = ' '.join(optionsL)
return f'<group-entry-{typeName} {self.id}{" " if options else ""}{options}>'
def __repr__(self):
args = []
args.append(repr(self.type))
args.append(repr(self.id))
if self.loadSSEQ:
args.append(f'loadSSEQ={self.loadSSEQ!r}')
if self.loadSBNKSWARsFrom != SWARLoadMethod.SWAR_IDS:
args.append(f'loadSBNKSWARsFrom={self.loadSBNKSWARsFrom!r}')
if self.loadSWAR:
args.append(f'loadSWAR={self.loadSWAR!r}')
if self.loadSSAR:
args.append(f'loadSSAR={self.loadSSAR!r}')
return f'{type(self).__name__}.fromFlags({", ".join(args)})'