279 lines
6.9 KiB
Go
279 lines
6.9 KiB
Go
package register
|
|
|
|
import (
|
|
"slices"
|
|
|
|
"gitea.maximumdirect.net/eric/notarius/internal/core/source"
|
|
"gitea.maximumdirect.net/eric/notarius/internal/modules/dnd"
|
|
)
|
|
|
|
func appendSpellLists(values []dnd.SpellList) (dnd.SpellList, error) {
|
|
count := 0
|
|
present := false
|
|
for _, value := range values {
|
|
if value.SpellCasts != nil {
|
|
present = true
|
|
}
|
|
count += len(value.SpellCasts)
|
|
}
|
|
if !present {
|
|
return dnd.SpellList{}, nil
|
|
}
|
|
combined := dnd.SpellList{SpellCasts: make([]dnd.SpellCast, 0, count)}
|
|
for _, value := range values {
|
|
for _, spellCast := range value.SpellCasts {
|
|
combined.SpellCasts = append(combined.SpellCasts, cloneSpellCast(spellCast))
|
|
}
|
|
}
|
|
return combined, nil
|
|
}
|
|
|
|
func appendNPCRegistries(values []dnd.NPCRegistry) (dnd.NPCRegistry, error) {
|
|
count := 0
|
|
present := false
|
|
for _, value := range values {
|
|
if value.NPCs != nil {
|
|
present = true
|
|
}
|
|
count += len(value.NPCs)
|
|
}
|
|
if !present {
|
|
return dnd.NPCRegistry{}, nil
|
|
}
|
|
combined := dnd.NPCRegistry{NPCs: make([]dnd.NPC, 0, count)}
|
|
for _, value := range values {
|
|
for _, npc := range value.NPCs {
|
|
combined.NPCs = append(combined.NPCs, cloneNPC(npc))
|
|
}
|
|
}
|
|
return combined, nil
|
|
}
|
|
|
|
func appendCombatTurnLists(values []dnd.CombatTurnList) (dnd.CombatTurnList, error) {
|
|
count := 0
|
|
present := false
|
|
for _, value := range values {
|
|
if value.CombatTurns != nil {
|
|
present = true
|
|
}
|
|
count += len(value.CombatTurns)
|
|
}
|
|
if !present {
|
|
return dnd.CombatTurnList{}, nil
|
|
}
|
|
combined := dnd.CombatTurnList{CombatTurns: make([]dnd.CombatTurn, 0, count)}
|
|
for _, value := range values {
|
|
for _, turn := range value.CombatTurns {
|
|
combined.CombatTurns = append(combined.CombatTurns, cloneCombatTurn(turn))
|
|
}
|
|
}
|
|
return combined, nil
|
|
}
|
|
|
|
func appendEnemyEventLists(values []dnd.EnemyEventList) (dnd.EnemyEventList, error) {
|
|
count := 0
|
|
present := false
|
|
for _, value := range values {
|
|
if value.Events != nil {
|
|
present = true
|
|
}
|
|
count += len(value.Events)
|
|
}
|
|
if !present {
|
|
return dnd.EnemyEventList{}, nil
|
|
}
|
|
combined := dnd.EnemyEventList{Events: make([]dnd.EnemyEvent, 0, count)}
|
|
for _, value := range values {
|
|
for _, event := range value.Events {
|
|
combined.Events = append(combined.Events, cloneEnemyEvent(event))
|
|
}
|
|
}
|
|
return combined, nil
|
|
}
|
|
|
|
func appendItemEventLists(values []dnd.ItemEventList) (dnd.ItemEventList, error) {
|
|
count := 0
|
|
present := false
|
|
for _, value := range values {
|
|
if value.Events != nil {
|
|
present = true
|
|
}
|
|
count += len(value.Events)
|
|
}
|
|
if !present {
|
|
return dnd.ItemEventList{}, nil
|
|
}
|
|
combined := dnd.ItemEventList{Events: make([]dnd.ItemEvent, 0, count)}
|
|
for _, value := range values {
|
|
for _, event := range value.Events {
|
|
combined.Events = append(combined.Events, cloneItemEvent(event))
|
|
}
|
|
}
|
|
return combined, nil
|
|
}
|
|
|
|
func appendItemRegistries(values []dnd.ItemRegistry) (dnd.ItemRegistry, error) {
|
|
count := 0
|
|
present := false
|
|
for _, value := range values {
|
|
if value.Items != nil {
|
|
present = true
|
|
}
|
|
count += len(value.Items)
|
|
}
|
|
if !present {
|
|
return dnd.ItemRegistry{}, nil
|
|
}
|
|
combined := dnd.ItemRegistry{Items: make([]dnd.Item, 0, count)}
|
|
for _, value := range values {
|
|
for _, item := range value.Items {
|
|
combined.Items = append(combined.Items, cloneItem(item))
|
|
}
|
|
}
|
|
return combined, nil
|
|
}
|
|
|
|
func appendNPCOccurrenceLists(values []dnd.NPCOccurrenceList) (dnd.NPCOccurrenceList, error) {
|
|
count := 0
|
|
present := false
|
|
for _, value := range values {
|
|
if value.Occurrences != nil {
|
|
present = true
|
|
}
|
|
count += len(value.Occurrences)
|
|
}
|
|
if !present {
|
|
return dnd.NPCOccurrenceList{}, nil
|
|
}
|
|
combined := dnd.NPCOccurrenceList{Occurrences: make([]dnd.NPCOccurrence, 0, count)}
|
|
for _, value := range values {
|
|
for _, occurrence := range value.Occurrences {
|
|
combined.Occurrences = append(combined.Occurrences, cloneNPCOccurrence(occurrence))
|
|
}
|
|
}
|
|
return combined, nil
|
|
}
|
|
|
|
func appendSceneDescriptionLists(values []dnd.SceneDescriptionList) (dnd.SceneDescriptionList, error) {
|
|
count := 0
|
|
present := false
|
|
for _, value := range values {
|
|
if value.Scenes != nil {
|
|
present = true
|
|
}
|
|
count += len(value.Scenes)
|
|
}
|
|
if !present {
|
|
return dnd.SceneDescriptionList{}, nil
|
|
}
|
|
combined := dnd.SceneDescriptionList{Scenes: make([]dnd.SceneDescription, 0, count)}
|
|
for _, value := range values {
|
|
combined.Scenes = append(combined.Scenes, value.Scenes...)
|
|
}
|
|
return combined, nil
|
|
}
|
|
|
|
func appendLocationRegistries(values []dnd.LocationRegistry) (dnd.LocationRegistry, error) {
|
|
count := 0
|
|
present := false
|
|
for _, value := range values {
|
|
if value.Locations != nil {
|
|
present = true
|
|
}
|
|
count += len(value.Locations)
|
|
}
|
|
if !present {
|
|
return dnd.LocationRegistry{}, nil
|
|
}
|
|
combined := dnd.LocationRegistry{Locations: make([]dnd.Location, 0, count)}
|
|
for _, value := range values {
|
|
for _, location := range value.Locations {
|
|
combined.Locations = append(combined.Locations, cloneLocation(location))
|
|
}
|
|
}
|
|
return combined, nil
|
|
}
|
|
|
|
func appendLocationOccurrenceLists(values []dnd.LocationOccurrenceList) (dnd.LocationOccurrenceList, error) {
|
|
count := 0
|
|
present := false
|
|
for _, value := range values {
|
|
if value.Occurrences != nil {
|
|
present = true
|
|
}
|
|
count += len(value.Occurrences)
|
|
}
|
|
if !present {
|
|
return dnd.LocationOccurrenceList{}, nil
|
|
}
|
|
combined := dnd.LocationOccurrenceList{Occurrences: make([]dnd.LocationOccurrence, 0, count)}
|
|
for _, value := range values {
|
|
for _, occurrence := range value.Occurrences {
|
|
combined.Occurrences = append(combined.Occurrences, cloneLocationOccurrence(occurrence))
|
|
}
|
|
}
|
|
return combined, nil
|
|
}
|
|
|
|
func cloneCombatTurn(value dnd.CombatTurn) dnd.CombatTurn {
|
|
clone := value
|
|
clone.SourceRefs = cloneSourceRefs(value.SourceRefs)
|
|
return clone
|
|
}
|
|
|
|
func cloneEnemyEvent(value dnd.EnemyEvent) dnd.EnemyEvent {
|
|
clone := value
|
|
clone.SourceRefs = cloneSourceRefs(value.SourceRefs)
|
|
return clone
|
|
}
|
|
|
|
func cloneItemEvent(value dnd.ItemEvent) dnd.ItemEvent {
|
|
clone := value
|
|
if value.Quantity != nil {
|
|
quantity := *value.Quantity
|
|
clone.Quantity = &quantity
|
|
}
|
|
clone.SourceRefs = cloneSourceRefs(value.SourceRefs)
|
|
return clone
|
|
}
|
|
|
|
func cloneItem(value dnd.Item) dnd.Item {
|
|
clone := value
|
|
clone.SourceRefs = cloneSourceRefs(value.SourceRefs)
|
|
return clone
|
|
}
|
|
|
|
func cloneSpellCast(value dnd.SpellCast) dnd.SpellCast {
|
|
clone := value
|
|
clone.SourceRefs = cloneSourceRefs(value.SourceRefs)
|
|
return clone
|
|
}
|
|
|
|
func cloneNPC(value dnd.NPC) dnd.NPC {
|
|
clone := value
|
|
clone.SourceRefs = cloneSourceRefs(value.SourceRefs)
|
|
return clone
|
|
}
|
|
|
|
func cloneNPCOccurrence(value dnd.NPCOccurrence) dnd.NPCOccurrence {
|
|
clone := value
|
|
clone.SourceRefs = cloneSourceRefs(value.SourceRefs)
|
|
return clone
|
|
}
|
|
|
|
func cloneLocation(value dnd.Location) dnd.Location {
|
|
clone := value
|
|
clone.SourceRefs = cloneSourceRefs(value.SourceRefs)
|
|
return clone
|
|
}
|
|
|
|
func cloneLocationOccurrence(value dnd.LocationOccurrence) dnd.LocationOccurrence {
|
|
clone := value
|
|
clone.SourceRefs = cloneSourceRefs(value.SourceRefs)
|
|
return clone
|
|
}
|
|
|
|
func cloneSourceRefs(refs []source.SourceRef) []source.SourceRef {
|
|
return slices.Clone(refs)
|
|
}
|