Skip to content

Commit

Permalink
Done with Char CRU*(d) flow; D + Clone still needs to be done
Browse files Browse the repository at this point in the history
  • Loading branch information
HielkeFellinger committed Oct 1, 2024
1 parent 6153fed commit b128447
Show file tree
Hide file tree
Showing 7 changed files with 290 additions and 52 deletions.
2 changes: 1 addition & 1 deletion app/game_engine/characterLoadEventHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ func (e *baseEventMessageHandler) loadCharacters(message EventMessage, pool Camp

var image *ecs_components.ImageComponent
var imageDetails = charEntity.GetAllComponentsOfType(ecs.ImageComponentType)
if imageDetails != nil && len(imageDetails) == 1 {
if imageDetails != nil && len(imageDetails) > 0 {
image = imageDetails[0].(*ecs_components.ImageComponent)
} else {
// Set default
Expand Down
107 changes: 95 additions & 12 deletions app/game_engine/managementCrudEventHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"github.com/hielkefellinger/go-dnd/app/ecs"
"github.com/hielkefellinger/go-dnd/app/ecs_components"
"github.com/hielkefellinger/go-dnd/app/ecs_model_translation"
"github.com/hielkefellinger/go-dnd/app/helpers"
"golang.org/x/net/html"
Expand Down Expand Up @@ -114,11 +115,89 @@ func (e *baseEventMessageHandler) typeUpsertCharacter(message EventMessage, pool
// Undo escaping
clearedBody := html.UnescapeString(message.Body)

// @TODO
var charUpsertRequest characterUpsertRequest
err := json.Unmarshal([]byte(clearedBody), &charUpsertRequest)
if err != nil {
return err
}

// Upsert
charEntity, upsertError := upsertCharacter(charUpsertRequest, pool)
if upsertError != nil {
return upsertError
}

log.Printf("- Game Management CRUD Events typeUpsertCharacter content: '%v'", clearedBody)
// Add an Inventory
if charUpsertRequest.AddInventory {
newInventory := ecs.NewEntity()
// Set Entity to SlotType
if addErr := newInventory.AddComponent(ecs_components.NewSlotsComponent()); addErr != nil {
return SendManagementError("Error", addErr.Error(), pool)
}
// Add to world
if addErr := pool.GetEngine().GetWorld().AddEntity(&newInventory); addErr != nil {
return SendManagementError("Error", addErr.Error(), pool)
}

return errors.New("NOT IMPLEMENTED!")
// Build relation and add
hasRelation := ecs_components.NewHasRelationComponent().(*ecs_components.HasRelationComponent)
hasRelation.Count = 1
hasRelation.Entity = &newInventory
if addErr := charEntity.AddComponent(hasRelation); addErr != nil {
return SendManagementError("Error", addErr.Error(), pool)
}
}

// Refresh Character Ribbon
loadUpsertCharMessage := NewEventMessage()
loadUpsertCharMessage.Source = pool.GetLeadId()
loadUpsertCharMessage.Body = charEntity.GetId().String()
if typeLoadUpsertMapErr := e.typeLoadUpsertCharacter(loadUpsertCharMessage, pool); typeLoadUpsertMapErr != nil {
return e.sendManagementError("Error", typeLoadUpsertMapErr.Error(), pool)
}
if typeManageMapsErr := e.typeManageCharacters(loadUpsertCharMessage, pool); typeManageMapsErr != nil {
return e.sendManagementError("Error", typeManageMapsErr.Error(), pool)
}

// Update Char info
var reloadCharRibbon = NewEventMessage()
reloadCharRibbon.Source = ServerUser
reloadCharRibbon.Type = TypeLoadCharacters
e.loadCharacters(reloadCharRibbon, pool)

var closeCharDetailMessage = NewEventMessage()
closeCharDetailMessage.Source = ServerUser
closeCharDetailMessage.Type = TypeLoadCharactersDetails
closeCharDetailMessage.Body = charEntity.GetId().String()
if err := e.loadCharactersDetails(closeCharDetailMessage, pool); err != nil {
return err
}

// Reload Map info
// Update possible Map Entities
mapEntities := pool.GetEngine().GetWorld().GetMapEntities()
for _, mapEntity := range mapEntities {

// Only get the map with the relevant relation to entity
if !mapEntity.HasRelationWithEntityByUuid(charEntity.GetId()) {
continue
}

for _, mapItem := range mapEntity.GetAllComponentsOfType(ecs.MapItemRelationComponentType) {
mapItemRelComponent := mapItem.(*ecs_components.MapItemRelationComponent)

if mapItemRelComponent.Entity.GetId() == charEntity.GetId() {
reloadMapItemMessage := NewEventMessage()
reloadMapItemMessage.Source = ServerUser
reloadMapItemMessage.Body = mapItemRelComponent.Id.String()
reloadMapItemErr := e.typeLoadMapEntity(reloadMapItemMessage, pool)
if reloadMapItemErr != nil {
return reloadMapItemErr
}
}
}
}
return nil
}

func (e *baseEventMessageHandler) typeLoadUpsertMap(message EventMessage, pool CampaignPool) error {
Expand Down Expand Up @@ -161,7 +240,7 @@ func (e *baseEventMessageHandler) typeLoadUpsertMap(message EventMessage, pool C
func (e *baseEventMessageHandler) typeUpsertMap(message EventMessage, pool CampaignPool) error {
// Check if user is lead
if message.Source != pool.GetLeadId() {
return errors.New("modifying items is not allowed as non-lead")
return errors.New("modifying maps is not allowed as non-lead")
}

// Undo escaping
Expand Down Expand Up @@ -264,14 +343,18 @@ func (e *baseEventMessageHandler) typeUpsertItem(message EventMessage, pool Camp
}

type characterUpsertRequest struct {
Id string `json:"Id"`
Name string `json:"Name"`
Description string `json:"Description"`
X string `json:"X"`
Y string `json:"Y"`
ImageName string `json:"ImageName"`
RemoveImages []string `json:"RemoveImages"`
Image helpers.FileUpload `json:"Image"`
Id string `json:"Id"`
Name string `json:"Name"`
Description string `json:"Description"`
HealthDamage string `json:"HealthDamage"`
HealthTmp string `json:"HealthTmp"`
HealthMax string `json:"HealthMax"`
Level string `json:"Level"`
Image helpers.FileUpload `json:"Image"`
ImageName string `json:"ImageName"`
PlayerPlayable bool `json:"PlayerPlayable"`
AddInventory bool `json:"AddInventory"`
Hidden bool `json:"Hidden"`
}

type mapUpsertRequest struct {
Expand Down
4 changes: 2 additions & 2 deletions app/game_engine/managementEventHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ func (e *baseEventMessageHandler) typeManageCampaign(message EventMessage, pool

var image *ecs_components.ImageComponent
var imageDetails = character.GetAllComponentsOfType(ecs.ImageComponentType)
if imageDetails != nil && len(imageDetails) == 1 {
if imageDetails != nil && len(imageDetails) > 0 {
image = imageDetails[0].(*ecs_components.ImageComponent)
} else {
// Set default
Expand Down Expand Up @@ -210,7 +210,7 @@ func (e *baseEventMessageHandler) typeManageCharacters(message EventMessage, poo

var image *ecs_components.ImageComponent
var imageDetails = charEntity.GetAllComponentsOfType(ecs.ImageComponentType)
if imageDetails != nil && len(imageDetails) == 1 {
if imageDetails != nil && len(imageDetails) > 0 {
image = imageDetails[0].(*ecs_components.ImageComponent)
} else {
// Set default
Expand Down
161 changes: 158 additions & 3 deletions app/game_engine/upserts.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,167 @@ import (
"github.com/hielkefellinger/go-dnd/app/ecs"
"github.com/hielkefellinger/go-dnd/app/ecs_components"
"github.com/hielkefellinger/go-dnd/app/helpers"
"log"
"slices"
)

func upsertCharacter(charUpdateRequest characterUpsertRequest, pool CampaignPool) (ecs.BaseEntity, error) {
var isNewEntry = charUpdateRequest.Id == ""
var charEntity ecs.BaseEntity

if !isNewEntry {
charUuid, err := helpers.ParseStringToUuid(charUpdateRequest.Id)
if err != nil {
return ecs.BaseEntity{}, err
}
charEntityFromWorld, match := pool.GetEngine().GetWorld().GetCharacterEntityByUuid(charUuid)
if !match || charEntityFromWorld == nil {
return ecs.BaseEntity{}, SendManagementError("Error", "failure of loading Char by UUID", pool)
}
charEntityFromWorld.SetName(charUpdateRequest.Name)
charEntityFromWorld.SetDescription(charUpdateRequest.Description)
charEntity = *charEntityFromWorld.(*ecs.BaseEntity)
} else {
charEntity = ecs.NewEntity()
charEntity.Name = charUpdateRequest.Name
charEntity.Description = charUpdateRequest.Description
if addErr := charEntity.AddComponent(ecs_components.NewCharacterComponent()); addErr != nil {
return ecs.BaseEntity{}, SendManagementError("Error", addErr.Error(), pool)
}
}

// Update Character Details
if charDetails := charEntity.GetAllComponentsOfType(ecs.CharacterComponentType); len(charDetails) > 0 {
charDetail := charDetails[0].(*ecs_components.CharacterComponent)
if charDetail.Name != charUpdateRequest.Name {
charDetail.Name = charUpdateRequest.Name
}
if charDetail.Description != charUpdateRequest.Description {
charDetail.Description = charUpdateRequest.Description
}
}

// Add Health
if charUpdateRequest.HealthDamage != "" && charUpdateRequest.HealthTmp != "" && charUpdateRequest.HealthMax != "" {
health := charEntity.GetAllComponentsOfType(ecs.HealthComponentType)
if isNewEntry || len(health) == 0 {
if addErr := charEntity.AddComponent(ecs_components.NewHealthComponent()); addErr != nil {
return ecs.BaseEntity{}, SendManagementError("Error", addErr.Error(), pool)
}
health = charEntity.GetAllComponentsOfType(ecs.HealthComponentType)
}
if len(health) > 0 {
if charUpdateRequest.HealthDamage == "" {
charUpdateRequest.HealthDamage = "0"
}
if charUpdateRequest.HealthTmp == "" {
charUpdateRequest.HealthTmp = "0"
}
if charUpdateRequest.HealthMax == "" {
charUpdateRequest.HealthMax = "0"
}
healthComponent := health[0].(*ecs_components.HealthComponent)
if updateErr := healthComponent.MaximumFromString(charUpdateRequest.HealthDamage); updateErr != nil {
return ecs.BaseEntity{}, SendManagementError("Error", updateErr.Error(), pool)
}
if updateErr := healthComponent.MaximumFromString(charUpdateRequest.HealthTmp); updateErr != nil {
return ecs.BaseEntity{}, SendManagementError("Error", updateErr.Error(), pool)
}
if updateErr := healthComponent.MaximumFromString(charUpdateRequest.HealthMax); updateErr != nil {
return ecs.BaseEntity{}, SendManagementError("Error", updateErr.Error(), pool)
}
}
} else {
if health := charEntity.GetAllComponentsOfType(ecs.HealthComponentType); len(health) > 0 {
for _, healthComponent := range health {
charEntity.RemoveComponentByUuid(healthComponent.GetId())
}
}
}

// Update Level
if charUpdateRequest.Level != "" {
levels := charEntity.GetAllComponentsOfType(ecs.LevelComponentType)
if isNewEntry || len(levels) == 0 {
if addErr := charEntity.AddComponent(ecs_components.NewLevelComponent()); addErr != nil {
return ecs.BaseEntity{}, SendManagementError("Error", addErr.Error(), pool)
}
levels = charEntity.GetAllComponentsOfType(ecs.LevelComponentType)
}
if len(levels) > 0 {
level := levels[0].(*ecs_components.LevelComponent)
if updateErr := level.LevelFromString(charUpdateRequest.Level); updateErr != nil {
return ecs.BaseEntity{}, SendManagementError("Error", updateErr.Error(), pool)
}
}
} else {
if levels := charEntity.GetAllComponentsOfType(ecs.LevelComponentType); len(levels) > 0 {
for _, level := range levels {
charEntity.RemoveComponentByUuid(level.GetId())
}
}
}

// Player Playable
if charUpdateRequest.PlayerPlayable {
if playerRelations := charEntity.GetAllComponentsOfType(ecs.PlayerComponentType); isNewEntry || len(playerRelations) == 0 {
if addErr := charEntity.AddComponent(ecs_components.NewPlayerComponent()); addErr != nil {
return ecs.BaseEntity{}, SendManagementError("Error", addErr.Error(), pool)
}
}
} else {
if playerRelations := charEntity.GetAllComponentsOfType(ecs.PlayerComponentType); len(playerRelations) > 0 {
for _, playerRelation := range playerRelations {
charEntity.RemoveComponentByUuid(playerRelation.GetId())
}
}
}

// Player Hidden
hidden := charEntity.GetAllComponentsOfType(ecs.VisibilityComponentType)
if charUpdateRequest.Hidden {
if len(hidden) > 0 {
visibility := hidden[0].(*ecs_components.VisibilityComponent)
visibility.Hidden = true
} else {
visibility := ecs_components.NewVisibilityComponent().(*ecs_components.VisibilityComponent)
visibility.Hidden = true
if addErr := charEntity.AddComponent(visibility); addErr != nil {
return ecs.BaseEntity{}, SendManagementError("Error", addErr.Error(), pool)
}
}
} else {
for _, hiddenComponent := range hidden {
charEntity.RemoveComponentByUuid(hiddenComponent.GetId())
}
}

// Update Image if needed
if charUpdateRequest.Image != (helpers.FileUpload{}) && charUpdateRequest.ImageName != "" {
// Handle file-upload
link, imageErr := helpers.SaveImageToCampaign(charUpdateRequest.Image, pool.GetId(), charUpdateRequest.ImageName)
if imageErr != nil {
return ecs.BaseEntity{}, SendManagementError("Error", imageErr.Error(), pool)
}
imageComponent := ecs_components.NewImageComponent().(*ecs_components.ImageComponent)
imageComponent.Name = charUpdateRequest.ImageName
imageComponent.Active = isNewEntry
imageComponent.Url = link
imageComponent.Version = 1
if addErr := charEntity.AddComponent(imageComponent); addErr != nil {
return ecs.BaseEntity{}, SendManagementError("Error", addErr.Error(), pool)
}
}

// Add Char Entity
if isNewEntry {
if addErr := pool.GetEngine().GetWorld().AddEntity(&charEntity); addErr != nil {
return ecs.BaseEntity{}, SendManagementError("Error", addErr.Error(), pool)
}
}

return charEntity, nil
}

func upsertMap(mapUpdateRequest mapUpsertRequest, pool CampaignPool) (ecs.BaseEntity, error) {
var isNewEntry = mapUpdateRequest.Id == ""
var mapEntity ecs.BaseEntity
Expand Down Expand Up @@ -116,7 +273,6 @@ func upsertMap(mapUpdateRequest mapUpsertRequest, pool CampaignPool) (ecs.BaseEn

// Update Basis Entity Properties
if mapUpdateRequest.Name != "" && mapUpdateRequest.Name != mapEntity.Name {
log.Printf("Update Name")
mapEntity.SetName(mapUpdateRequest.Name)
if !isNewEntry && rawMapEntity != nil {
rawMapEntity.SetName(mapUpdateRequest.Name)
Expand All @@ -125,7 +281,6 @@ func upsertMap(mapUpdateRequest mapUpsertRequest, pool CampaignPool) (ecs.BaseEn
return ecs.BaseEntity{}, SendManagementError("Error", "Map should have a name", pool)
}
if mapUpdateRequest.Description != "" && mapUpdateRequest.Description != mapEntity.Description {
log.Printf("Update Description")
mapEntity.SetDescription(mapUpdateRequest.Description)
if !isNewEntry && rawMapEntity != nil {
rawMapEntity.SetDescription(mapUpdateRequest.Description)
Expand Down
Loading

0 comments on commit b128447

Please sign in to comment.