Files
bap-room-packager/loadrooms.go
2025-12-18 01:26:45 -06:00

132 lines
2.6 KiB
Go

package main
import (
"fmt"
"os"
"path"
"path/filepath"
"slices"
"strings"
)
var REQUIRED_IMAGES = []string{
"ART",
"MINI",
"CREDIT",
"INTERACT",
"FLOOR",
"LAYER",
"ROOF",
"WALL",
}
var ACCEPTED_IMAGE_EXT = []string{
".PNG",
".JPG",
".BMP",
}
var REQUIRED_AUDIO = []string{
"FOOT",
"MUSIC",
}
var ACCEPTED_AUDIO_EXT = []string{
".WAV",
".MP3",
".OGG",
".MIDI",
}
type RoomFolder struct {
path string
cfg RoomIni
}
func LoadRoomFolders(roomspath string) ([]RoomFolder, error) {
entries, err := os.ReadDir(roomspath)
if err != nil {
return nil, err
}
rooms := make([]RoomFolder, 0)
for _, entry := range entries {
entrypath := filepath.Join(roomspath, entry.Name())
if !entry.IsDir() {
fmt.Printf("WARN: unexpected non-directory found in rooms directory: %s\n", entrypath)
continue
}
roomfolder, err := loadRoom(entrypath)
if err != nil {
fmt.Printf("ERROR: unable to load directory: %s\n", entrypath)
continue
}
rooms = append(rooms, roomfolder)
}
return rooms, nil
}
func loadRoom(roompath string) (RoomFolder, error) {
entries, err := os.ReadDir(roompath)
if err != nil {
return RoomFolder{}, err
}
requiredImages := make([]string, len(REQUIRED_IMAGES))
copy(requiredImages, REQUIRED_IMAGES)
requiredAudio := make([]string, len(REQUIRED_AUDIO))
copy(requiredAudio, REQUIRED_AUDIO)
roominiName := ""
for _, entry := range entries {
filename := entry.Name()
if strings.ToLower(filename) == "room.ini" {
roominiName = filename
}
ext := strings.ToUpper(path.Ext(filename))
name := strings.ToUpper(filename[:len(filename)-len(ext)])
if index := slices.Index(requiredImages, name); index > -1 && slices.Contains(ACCEPTED_IMAGE_EXT, ext) {
requiredImages = append(requiredImages[:index], requiredImages[index+1:]...)
}
if index := slices.Index(requiredAudio, name); index > -1 && slices.Contains(ACCEPTED_AUDIO_EXT, ext) {
requiredAudio = append(requiredAudio[:index], requiredAudio[index+1:]...)
}
}
errormsg := ""
if len(requiredImages) > 0 && len(requiredAudio) > 0 {
errormsg = fmt.Sprintf("images: %v, audio: %v", requiredImages, requiredAudio)
}
if len(requiredImages) > 0 {
errormsg = fmt.Sprintf("images: %v", requiredImages)
}
if len(requiredAudio) > 0 {
errormsg = fmt.Sprintf("audio: %v", requiredAudio)
}
if errormsg != "" {
return RoomFolder{}, fmt.Errorf("unable to load room %s: missing required %s", roompath, errormsg)
}
cfg := NewRoomIni()
if roominiName != "" {
newcfg, err := ReadIni(filepath.Join(roompath, "room.ini"))
if err != nil {
return RoomFolder{}, err
}
cfg = newcfg
}
return RoomFolder{
path: roompath,
cfg: cfg,
}, nil
}