142 lines
4.0 KiB
Go
142 lines
4.0 KiB
Go
package model
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/robertjanetzko/LegendsBrowser2/backend/util"
|
|
"golang.org/x/exp/slices"
|
|
)
|
|
|
|
func (w *DfWorld) process() {
|
|
|
|
// set site in structure
|
|
for _, site := range w.Sites {
|
|
for _, structure := range site.Structures {
|
|
structure.SiteId = site.Id_
|
|
}
|
|
}
|
|
|
|
w.processEvents()
|
|
w.processCollections()
|
|
|
|
// check events texts
|
|
for _, e := range w.HistoricalEvents {
|
|
e.Details.Html(&Context{World: w})
|
|
}
|
|
}
|
|
|
|
func (w *DfWorld) processEvents() {
|
|
for _, e := range w.HistoricalEvents {
|
|
switch d := e.Details.(type) {
|
|
case *HistoricalEventHfDoesInteraction:
|
|
if strings.HasPrefix(d.Interaction, "DEITY_CURSE_WEREBEAST_") {
|
|
w.HistoricalFigures[d.TargetHfid].Werebeast = true
|
|
}
|
|
if strings.HasPrefix(d.Interaction, "DEITY_CURSE_VAMPIRE_") {
|
|
w.HistoricalFigures[d.TargetHfid].Vampire = true
|
|
}
|
|
case *HistoricalEventCreatedSite:
|
|
w.addEntitySite(d.CivId, d.SiteId)
|
|
w.addEntitySite(d.SiteCivId, d.SiteId)
|
|
case *HistoricalEventDestroyedSite:
|
|
w.addEntitySite(d.DefenderCivId, d.SiteId)
|
|
w.addEntitySite(d.SiteCivId, d.SiteId)
|
|
w.Sites[d.SiteId].Ruin = true
|
|
case *HistoricalEventSiteTakenOver:
|
|
w.addEntitySite(d.AttackerCivId, d.SiteId)
|
|
w.addEntitySite(d.SiteCivId, d.SiteId)
|
|
w.addEntitySite(d.DefenderCivId, d.SiteId)
|
|
w.addEntitySite(d.NewSiteCivId, d.SiteId)
|
|
case *HistoricalEventHfDestroyedSite:
|
|
w.addEntitySite(d.SiteCivId, d.SiteId)
|
|
w.addEntitySite(d.DefenderCivId, d.SiteId)
|
|
w.Sites[d.SiteId].Ruin = true
|
|
case *HistoricalEventReclaimSite:
|
|
w.addEntitySite(d.SiteCivId, d.SiteId)
|
|
w.addEntitySite(d.SiteCivId, d.SiteId)
|
|
w.Sites[d.SiteId].Ruin = false
|
|
}
|
|
}
|
|
}
|
|
|
|
func (w *DfWorld) processCollections() {
|
|
for _, col := range w.HistoricalEventCollections {
|
|
for _, eventId := range col.Event {
|
|
if e, ok := w.HistoricalEvents[eventId]; ok {
|
|
e.Collection = col.Id_
|
|
}
|
|
}
|
|
|
|
switch cd := col.Details.(type) {
|
|
case *HistoricalEventCollectionAbduction:
|
|
targets := make(map[int]bool)
|
|
for _, eventId := range col.Event {
|
|
if e, ok := w.HistoricalEvents[eventId]; ok {
|
|
switch d := e.Details.(type) {
|
|
case *HistoricalEventHfAbducted:
|
|
targets[d.TargetHfid] = true
|
|
}
|
|
}
|
|
}
|
|
delete(targets, -1)
|
|
cd.TargetHfids = util.Keys(targets)
|
|
case *HistoricalEventCollectionBeastAttack:
|
|
attackers := make(map[int]bool)
|
|
for _, eventId := range col.Event {
|
|
if e, ok := w.HistoricalEvents[eventId]; ok {
|
|
switch d := e.Details.(type) {
|
|
case *HistoricalEventHfSimpleBattleEvent:
|
|
attackers[d.Group1Hfid] = true
|
|
case *HistoricalEventHfAttackedSite:
|
|
attackers[d.AttackerHfid] = true
|
|
case *HistoricalEventHfDestroyedSite:
|
|
attackers[d.AttackerHfid] = true
|
|
case *HistoricalEventAddHfEntityLink:
|
|
attackers[d.Hfid] = true
|
|
case *HistoricalEventCreatureDevoured:
|
|
attackers[d.Eater] = true
|
|
case *HistoricalEventItemStolen:
|
|
attackers[d.Histfig] = true
|
|
}
|
|
}
|
|
}
|
|
delete(attackers, -1)
|
|
cd.AttackerHfIds = util.Keys(attackers)
|
|
case *HistoricalEventCollectionJourney:
|
|
HistoricalEventCollectionJourneyLoop:
|
|
for _, eventId := range col.Event {
|
|
if e, ok := w.HistoricalEvents[eventId]; ok {
|
|
switch d := e.Details.(type) {
|
|
case *HistoricalEventHfTravel:
|
|
cd.TravellerHfIds = d.GroupHfid
|
|
break HistoricalEventCollectionJourneyLoop
|
|
}
|
|
}
|
|
}
|
|
case *HistoricalEventCollectionOccasion:
|
|
for _, eventcolId := range col.Eventcol {
|
|
if e, ok := w.HistoricalEventCollections[eventcolId]; ok {
|
|
switch d := e.Details.(type) {
|
|
case *HistoricalEventCollectionCeremony:
|
|
d.OccasionEventcol = col.Id_
|
|
case *HistoricalEventCollectionCompetition:
|
|
d.OccasionEventcol = col.Id_
|
|
case *HistoricalEventCollectionPerformance:
|
|
d.OccasionEventcol = col.Id_
|
|
case *HistoricalEventCollectionProcession:
|
|
d.OccasionEventcol = col.Id_
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (w *DfWorld) addEntitySite(entityId, siteId int) {
|
|
if e, ok := w.Entities[entityId]; ok {
|
|
if !slices.Contains(e.Sites, siteId) {
|
|
e.Sites = append(e.Sites, siteId)
|
|
}
|
|
}
|
|
}
|