diff --git a/cardinal/main.go b/cardinal/main.go index 55bbe03..770e9b7 100644 --- a/cardinal/main.go +++ b/cardinal/main.go @@ -33,7 +33,7 @@ func main() { // Register queries // NOTE: You must register your queries here for it to be accessible. Must( - cardinal.RegisterQuery[query.WorldVarsRequest, query.WorldVarsResponse](w, "world-vars", query.WorldVars), + cardinal.RegisterQuery[query.PlayerHealthRequest, query.PlayerHealthResponse](w, "player-health", query.PlayerHealth), ) // Each system executes deterministically in the order they are added. diff --git a/cardinal/query/query_player_health.go b/cardinal/query/query_player_health.go new file mode 100644 index 0000000..8c74a93 --- /dev/null +++ b/cardinal/query/query_player_health.go @@ -0,0 +1,53 @@ +package query + +import ( + "fmt" + + comp "github.com/argus-labs/starter-game-template/cardinal/component" + + "pkg.world.dev/world-engine/cardinal" +) + +type PlayerHealthRequest struct { + Nickname string +} + +type PlayerHealthResponse struct { + HP int +} + +func PlayerHealth(world cardinal.WorldContext, req *PlayerHealthRequest) (*PlayerHealthResponse, error) { + search, err := world.NewSearch(cardinal.Exact(comp.Player{}, comp.Health{})) + if err != nil { + return nil, err + } + + var playerHealth *comp.Health + err = search.Each(world, func(id cardinal.EntityID) bool { + player, err := cardinal.GetComponent[comp.Player](world, id) + if err != nil { + return false + } + + // Terminates the search if the player is found + if player.Nickname == req.Nickname { + playerHealth, err = cardinal.GetComponent[comp.Health](world, id) + if err != nil { + return false + } + return false + } + + // Continue searching if the player is not the target player + return true + }) + if err != nil { + return nil, err + } + + if playerHealth == nil { + return nil, fmt.Errorf("player %s does not exist", req.Nickname) + } + + return &PlayerHealthResponse{HP: playerHealth.HP}, nil +} diff --git a/cardinal/query/query_world_vars.go b/cardinal/query/query_world_vars.go deleted file mode 100644 index c3b3244..0000000 --- a/cardinal/query/query_world_vars.go +++ /dev/null @@ -1,30 +0,0 @@ -package query - -import ( - "github.com/argus-labs/starter-game-template/cardinal/world" - "pkg.world.dev/world-engine/cardinal" -) - -type WorldVarsRequest struct { - Key world.VarsKey `json:"key"` -} - -type WorldVarsResponse struct { - Result map[world.VarsKey]interface{} -} - -func WorldVars(_ cardinal.WorldContext, req *WorldVarsRequest) (*WorldVarsResponse, error) { - // Handle all world vars query - if req.Key == "*" { - return &WorldVarsResponse{Result: world.WorldVars}, nil - } - - if value, ok := world.WorldVars[req.Key]; ok { - mapKey := make(map[world.VarsKey]interface{}) - mapKey[req.Key] = value - return &WorldVarsResponse{Result: mapKey}, nil - } - - // Default case for unhandled keys - return &WorldVarsResponse{Result: map[world.VarsKey]interface{}{}}, nil -} diff --git a/cardinal/world/vars.go b/cardinal/world/vars.go deleted file mode 100644 index dbb9104..0000000 --- a/cardinal/world/vars.go +++ /dev/null @@ -1,12 +0,0 @@ -package world - -type VarsKey string - -const ( - PlayerCount = VarsKey("playerCount") -) - -// WorldVars Register your own world vars here! -var WorldVars = map[VarsKey]interface{}{ - PlayerCount: 0, -}