Skip to content

Commit

Permalink
Starting Character CRU(D) loop
Browse files Browse the repository at this point in the history
  • Loading branch information
HielkeFellinger committed Sep 17, 2024
1 parent 675a692 commit a753ca6
Show file tree
Hide file tree
Showing 6 changed files with 182 additions and 14 deletions.
15 changes: 10 additions & 5 deletions app/game_engine/communication.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,17 @@ const (
TypeManagementOverviewEnd EventType = 560

TypeManagementCrudStart EventType = 5500
TypeLoadUpsertMap EventType = 5511
TypeRemoveMap EventType = 5512
TypeUpsertMap EventType = 5513

TypeLoadUpsertItem EventType = 5541
TypeUpsertItem EventType = 5542
TypeLoadUpsertMap EventType = 5511
TypeRemoveMap EventType = 5512
TypeUpsertMap EventType = 5513

TypeLoadUpsertItem EventType = 5541
TypeUpsertItem EventType = 5542

TypeLoadUpsertCharacter EventType = 5521
TypeUpsertCharacter EventType = 5522

TypeManagementCrudEnd EventType = 5600

TypeManagementError EventType = 5999
Expand Down
66 changes: 66 additions & 0 deletions app/game_engine/managementCrudEventHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,78 @@ func (e *baseEventMessageHandler) handleManagementCrudEvents(message EventMessag
handled = true
}

// Characters
if message.Type == TypeLoadUpsertCharacter {
err := e.typeLoadUpsertCharacter(message, pool)
if err != nil {
return err
}
handled = true
} else if message.Type == TypeUpsertCharacter {
err := e.typeUpsertCharacter(message, pool)
if err != nil {
return err
}
handled = true
}

if !handled {
return errors.New(fmt.Sprintf("message of type '%d' is not recognised by 'handleManagementCrudEvents()'", message.Type))
}
return nil
}

func (e *baseEventMessageHandler) typeLoadUpsertCharacter(message EventMessage, pool CampaignPool) error {
// Undo escaping
clearedBody := html.UnescapeString(message.Body)

// Check if user is lead
if message.Source != pool.GetLeadId() {
return errors.New("modifying characters is not allowed as non-lead")
}

data := make(map[string]any)

// Check if there is an existing map with the supplied uuid
uuidItemFilter, err := helpers.ParseStringToUuid(clearedBody)
if err == nil {
mapCandidate, match := pool.GetEngine().GetWorld().GetEntityByUuid(uuidItemFilter)
if match && mapCandidate.HasComponentType(ecs.CharacterComponentType) {
// data["Character"] = {}
}
}

rawJsonBytes, err := json.Marshal(
e.handleLoadHtmlBodyMultipleTemplateFiles([]string{"campaignUpsertCharacter.html", "diceSpinnerSvg.html"},
"campaignUpsertCharacter", data))
if err != nil {
return err
}

loadItemMessage := NewEventMessage()
loadItemMessage.Source = message.Source
loadItemMessage.Type = TypeLoadUpsertCharacter
loadItemMessage.Body = string(rawJsonBytes)
loadItemMessage.Destinations = append(loadItemMessage.Destinations, pool.GetLeadId())
pool.TransmitEventMessage(loadItemMessage)

return nil
}

func (e *baseEventMessageHandler) typeUpsertCharacter(message EventMessage, pool CampaignPool) error {
// Check if user is lead
if message.Source != pool.GetLeadId() {
return errors.New("modifying characters is not allowed as non-lead")
}

// Undo escaping
clearedBody := html.UnescapeString(message.Body)

log.Printf("- Game Management CRUD Events typeUpsertCharacter content: '%v'", clearedBody)

return errors.New("NOT IMPLEMENTED!")
}

func (e *baseEventMessageHandler) typeLoadUpsertMap(message EventMessage, pool CampaignPool) error {
// Undo escaping
clearedBody := html.UnescapeString(message.Body)
Expand Down
22 changes: 22 additions & 0 deletions web/templates/campaign.html
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,10 @@ <h3> No active event </h3>
if (payLoad.type === 5541) {
handleRightBarCrudHtml(payLoad);
}
// Character
if (payLoad.type === 5521) {
handleRightBarCrudHtml(payLoad);
}
return;
}
if (payLoad.type === 5999) {
Expand Down Expand Up @@ -335,6 +339,11 @@ <h3> No active event </h3>
sendEvent(wrapMessage(JSON.stringify(id), 5541));
}

let upsertCharacter = (id) => {
stopLoadSpinner();
sendEvent(wrapMessage(JSON.stringify(id), 5521));
}

let upsertMap = (id) => {
stopLoadSpinner();
sendEvent(wrapMessage(JSON.stringify(id), 5511));
Expand All @@ -359,6 +368,19 @@ <h3> No active event </h3>
}
}

let submitUpsertCharacter = () => {
let formElement = document.forms['upsertCharacterForm'];
if (formElement && formElement.reportValidity()) {
let formData = new FormData(formElement);
// TODO
console.warn(formData)
let item = {}
sendEvent(wrapMessage(JSON.stringify(item), 5522));
} else {
stopLoadSpinner();
}
}

let submitUpsertMap = () => {
let formElement = document.forms['upsertMapForm'];
if (formElement && formElement.reportValidity()) {
Expand Down
2 changes: 1 addition & 1 deletion web/templates/campaignManageCharacters.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<div style="display: flex; flex-direction: row;">
<h2 style="width: max-content;">Character Overview</h2>
<b style="margin: 0.5em 0.5em 0.5em;">|</b>
<button class="btn" style="height: 2.4em;" onclick="">
<button class="btn" style="height: 2.4em;" onclick="upsertCharacter('')">
<i class="bi bi-plus"></i>
</button>
<input type="text" placeholder="filter" style="margin-left: 0.5em; height: 2.4em; border-radius:.25rem;">
Expand Down
68 changes: 68 additions & 0 deletions web/templates/campaignUpsertCharacter.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
{{define "campaignUpsertCharacter"}}

<h2>{{ if and .Character .Character.Id }}Update{{else}}Add{{end}} Character</h2>
<div style="width: 100%;">
<form class="form" onsubmit="return false" style="width: 100%;" id="upsertCharacterForm">

<!-- If there's an error, display -->
<p class="bg-danger" id="managementCrudError" style="visibility: hidden">

</p>

{{ if and .Character .Character.Id }}
<div class="form-group">
<label for="id">Id</label>
<input type="text" name="id" class="form-control" id="id" placeholder="Id" required readonly value="{{.Character.Id}}">
</div>
{{end}}
<div class="form-group">
<label for="name">Name</label>
<input type="text" name="name" class="form-control" id="name" placeholder="Name" required
value="{{ if and .Character .Character.Name }}{{.Character.Name}}{{end}}">
</div>
<div class="form-group">
<label for="description">Description</label>
<textarea name="description" class="form-control" id="description" placeholder="Description">{{ if and .Character .Character.Description }}{{.Character.Description}}{{end}}</textarea>
</div>

<div style="display: flex; flex-flow: row nowrap; align-content: center; width: 100%;">
<div style="flex: 1 1 0;">
<label for="healthDamage">Current Damage</label>
<input id="healthDamage" type="number" style="font-size: 2em; max-width: 4em"
value="{{ if and .Character .Character.Health }}{{ .character.Health.Damage }}{{end}}" />
</div>
<div style="flex: 1 1 0;">
<label for="healthTmp">Temp HP</label>
<input id="healthTmp" type="number" style="font-size: 2em; max-width: 4em"
value="{{ if and .Character .Character.Health }}{{ .character.Health.TemporaryHitPoints }}{{end}}" />
</div>
<div style="flex: 1 1 0;">
<label for="healthMax">Max HP</label>
<input id="healthMax" type="number" style="font-size: 2em; max-width: 4em"
value="{{ if and .Character .Character.Health }}{{ .character.Health.MaximumHitPoints }}{{end}}" />
</div>
</div>
<div style="display: flex; flex-direction: row; flex-grow: 2; flex-wrap: wrap; padding-top: 1em;">
<div class="form-group" style="margin-right: 2em;">
<label for="level">Level</label>
<input type="text" name="level" class="form-control" id="level" placeholder="Level"
value="{{ if and .Character .Character.Damage }}{{.Character.Damage}}{{end}}">
</div>
<div class="form-group">
<label for="playerPlayable">Player Playable</label>
<input type="checkbox" name="playerPlayable" class="form-control" id="playerPlayable" placeholder="playerPlayable"
value="{{ if and .Character .Character.PlayerPlayable }}{{.Character.PlayerPlayable}}{{end}}">
</div>
</div>
<div style="min-height: 4em; width: 12em; display: flex; flex-flow: row;">
<div style="flex: 1 1 0;">
<button id="CharacterUpsertSubmit" type="submit" class="btn btn-primary" onclick="loadSpinner();submitUpsertCharacter()">Save</button>
</div>
<div id="spinner" style="flex: 1 1 0; display: none">
{{ template "diceSpinnerSvg.html" .}}
</div>
</div>
</form>
</div>

{{ end }}
23 changes: 15 additions & 8 deletions web/templates/characterDetails.html
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,23 @@ <h3>{{ .character.Description }}</h3>
</div>

<!-- Stats -->
<div>
...
</div>
<details open="" style="padding-top: 1em;">
<summary style="font-size: 1.5em;">Stats</summary>
<div>
...
</div>
</details>


<!-- Just Dump inventory -->
{{ range .character.Inventories }}
<div style="display: flex; flex-flow: row nowrap; align-content: center; width: 100%;">
{{ template "inventory" . }}
</div>
{{ end }}
<details open="" style="padding-top: 1em;">
<summary style="font-size: 1.5em;">Inventory</summary>
{{ range .character.Inventories }}
<div style="display: flex; flex-flow: row nowrap; align-content: center; width: 100%;">
{{ template "inventory" . }}
</div>
{{ end }}
</details>

</div>

Expand Down

0 comments on commit a753ca6

Please sign in to comment.