turn player into primary if only one left

This commit is contained in:
Thomas von Dein 2024-02-27 16:52:20 +01:00
parent 18be0ebe38
commit ac88a74bd7
3 changed files with 22 additions and 9 deletions

View File

@ -5,7 +5,7 @@ Background: background-lila
########W# ########W#
# v # # v#
# # # #
#S s# #S s#
############ ############

View File

@ -3,6 +3,8 @@ package observers
import ( import (
"openquell/components" "openquell/components"
"log/slog"
"github.com/mlange-42/arche/ecs" "github.com/mlange-42/arche/ecs"
"github.com/mlange-42/arche/ecs/event" "github.com/mlange-42/arche/ecs/event"
"github.com/mlange-42/arche/generic" "github.com/mlange-42/arche/generic"
@ -27,6 +29,7 @@ func (observer *GameObserver) GetListenerCallback(comp ecs.ID) listener.Callback
return listener.NewCallback( return listener.NewCallback(
func(world *ecs.World, event ecs.EntityEvent) { func(world *ecs.World, event ecs.EntityEvent) {
observer.RemoveEntity(event.Entity, comp) observer.RemoveEntity(event.Entity, comp)
slog.Debug("player removed")
}, },
event.EntityRemoved, event.EntityRemoved,
comp, comp,

View File

@ -32,6 +32,8 @@ func (system PlayerSystem) Update() error {
// first check if we need to switch player // first check if we need to switch player
switchable := false switchable := false
query := system.Selector.Query(system.World) query := system.Selector.Query(system.World)
count := query.Count()
for query.Next() { for query.Next() {
_, _, player, _ := query.Get() _, _, player, _ := query.Get()
if !player.IsPrimary { if !player.IsPrimary {
@ -43,14 +45,22 @@ func (system PlayerSystem) Update() error {
query := system.Selector.Query(system.World) query := system.Selector.Query(system.World)
for query.Next() { for query.Next() {
_, _, player, render := query.Get() _, _, player, render := query.Get()
if inpututil.IsKeyJustPressed(ebiten.KeyTab) {
slog.Debug("switch players") if count == 1 && !player.IsPrimary {
if player.IsPrimary { // there's only one player left, make it the primary one
player.IsPrimary = false player.IsPrimary = true
render.Image = player.SwitchSprite() render.Image = player.SwitchSprite()
} else { } else {
player.IsPrimary = true // many players, switch when requested
render.Image = player.SwitchSprite() 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()
}
} }
} }
} }