From ac88a74bd7413bf91daabf5fda557ee03f70a96d Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Tue, 27 Feb 2024 16:52:20 +0100 Subject: [PATCH] turn player into primary if only one left --- assets/levels/04-mayhem.lvl | 2 +- observers/game_observer.go | 3 +++ systems/player_system.go | 26 ++++++++++++++++++-------- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/assets/levels/04-mayhem.lvl b/assets/levels/04-mayhem.lvl index 52353b9..ebd53b6 100644 --- a/assets/levels/04-mayhem.lvl +++ b/assets/levels/04-mayhem.lvl @@ -5,7 +5,7 @@ Background: background-lila ########W# - # v # + # v# # # #S s# ############ diff --git a/observers/game_observer.go b/observers/game_observer.go index 4a28853..1e0568a 100644 --- a/observers/game_observer.go +++ b/observers/game_observer.go @@ -3,6 +3,8 @@ package observers import ( "openquell/components" + "log/slog" + "github.com/mlange-42/arche/ecs" "github.com/mlange-42/arche/ecs/event" "github.com/mlange-42/arche/generic" @@ -27,6 +29,7 @@ func (observer *GameObserver) GetListenerCallback(comp ecs.ID) listener.Callback return listener.NewCallback( func(world *ecs.World, event ecs.EntityEvent) { observer.RemoveEntity(event.Entity, comp) + slog.Debug("player removed") }, event.EntityRemoved, comp, diff --git a/systems/player_system.go b/systems/player_system.go index 078d7b1..979aa6b 100644 --- a/systems/player_system.go +++ b/systems/player_system.go @@ -32,6 +32,8 @@ func (system PlayerSystem) Update() error { // first check if we need to switch player switchable := false query := system.Selector.Query(system.World) + count := query.Count() + for query.Next() { _, _, player, _ := query.Get() if !player.IsPrimary { @@ -43,14 +45,22 @@ func (system PlayerSystem) Update() error { query := system.Selector.Query(system.World) for query.Next() { _, _, player, render := query.Get() - if inpututil.IsKeyJustPressed(ebiten.KeyTab) { - slog.Debug("switch players") - if player.IsPrimary { - player.IsPrimary = false - render.Image = player.SwitchSprite() - } else { - player.IsPrimary = true - render.Image = player.SwitchSprite() + + if count == 1 && !player.IsPrimary { + // there's only one player left, make it the primary one + player.IsPrimary = true + render.Image = player.SwitchSprite() + } else { + // many players, switch when requested + if inpututil.IsKeyJustPressed(ebiten.KeyTab) { + slog.Debug("switch players") + if player.IsPrimary { + player.IsPrimary = false + render.Image = player.SwitchSprite() + } else { + player.IsPrimary = true + render.Image = player.SwitchSprite() + } } } }