Template usage

This commit is contained in:
2026-04-10 15:26:27 +02:00
parent 9300033e95
commit ae58c4ae71
7 changed files with 492 additions and 50 deletions
+36 -2
View File
@@ -7,6 +7,11 @@ import (
)
var portraitColumns = []string{"BaseResRef", "Sex", "Race", "InanimateType", "Plot", "LowGore"}
var portraitMetadataInjectionDatasets = map[string]struct{}{
"appearance": {},
"genericdoors": {},
"placeables": {},
}
func parseRowMetadata(raw any) (map[string]any, error) {
if raw == nil {
@@ -101,6 +106,19 @@ func portraitMetaFromRow(row map[string]any) (map[string]any, bool) {
return portrait, true
}
func rowHasPortraitMetadata(row map[string]any) bool {
_, ok := portraitMetaFromRow(row)
return ok
}
func portraitMetadataMayInject(datasetName string, row map[string]any) bool {
if _, ok := portraitMetadataInjectionDatasets[datasetName]; !ok {
return false
}
optIn, _ := row[internalPortraitModuleAuthoredKey].(bool)
return optIn && rowHasPortraitMetadata(row)
}
func mergePortraitMetadata(collected []nativeCollectedDataset) ([]nativeCollectedDataset, error) {
portraitIndex := -1
for i, dataset := range collected {
@@ -135,17 +153,22 @@ func mergePortraitMetadata(collected []nativeCollectedDataset) ([]nativeCollecte
}
nextID := nextAvailableID(usedIDs)
lockModified := false
activeAutoLockKeys := map[string]struct{}{}
for _, dataset := range collected {
if _, ok := portraitMetadataInjectionDatasets[dataset.Dataset.Name]; !ok {
continue
}
for _, row := range dataset.Rows {
portrait, ok := portraitMetaFromRow(row)
if !ok {
if !portraitMetadataMayInject(dataset.Dataset.Name, row) {
continue
}
portrait, _ := portraitMetaFromRow(row)
resref := portrait["resref"].(string)
target, ok := rowByResref[resref]
if !ok {
lockKey := "portraits:auto:" + resref
activeAutoLockKeys[lockKey] = struct{}{}
rowID, found := portraits.LockData[lockKey]
if !found {
rowID = nextID
@@ -171,6 +194,17 @@ func mergePortraitMetadata(collected []nativeCollectedDataset) ([]nativeCollecte
}
}
for lockKey := range portraits.LockData {
if !strings.HasPrefix(lockKey, "portraits:auto:") {
continue
}
if _, ok := activeAutoLockKeys[lockKey]; ok {
continue
}
delete(portraits.LockData, lockKey)
lockModified = true
}
if lockModified && portraits.Dataset.LockPath != "" {
if err := saveLockfile(portraits.Dataset.LockPath, portraits.LockData); err != nil {
return nil, fmt.Errorf("dataset %s: %w", portraits.Dataset.Name, err)