Skip to content
Snippets Groups Projects
Commit 1efc5493 authored by Florian Schröder's avatar Florian Schröder
Browse files

Merge branch '79-info-screens-pop-ups-etc' into 'main'

Resolve "Info screens (pop ups etc)"

Closes #79

See merge request scs/cocosy/overcooked-simulator!53
parents 038000bf 98464097
No related branches found
No related tags found
1 merge request!53Resolve "Info screens (pop ups etc)"
Pipeline #46132 passed
......@@ -12,7 +12,7 @@ from overcooked_simulator.game_items import (
Effect,
CookingEquipment,
)
from overcooked_simulator.hooks import Hooks
from overcooked_simulator.hooks import Hooks, NEW_FIRE, FIRE_SPREADING
from overcooked_simulator.utils import get_touching_counters, find_item_on_counters
if TYPE_CHECKING:
......@@ -74,6 +74,7 @@ class FireEffectManager(EffectManager):
self.next_finished_timer = min(
self.next_finished_timer, self.effect_to_timer[effect.uuid]
)
self.hook(NEW_FIRE, target=target)
self.active_effects.append((effect, target))
self.new_effects = []
if self.next_finished_timer < now:
......@@ -110,6 +111,7 @@ class FireEffectManager(EffectManager):
if effect.name not in target.active_effects and target.uuid not in [
t.uuid for _, t in self.active_effects
]:
self.hook(FIRE_SPREADING, target=target)
if isinstance(target, CookingEquipment):
if target.content_list:
for content in target.content_list:
......
......@@ -140,4 +140,18 @@ extra_setup_functions:
log_class_kwargs:
log_path: USER_LOG_DIR/ENV_NAME/LOG_RECORD_NAME.jsonl
add_hook_ref: true
info_msg:
func: !!python/name:overcooked_simulator.recording.class_recording_with_hooks ''
kwargs:
hooks: [ cutting_board_100 ]
log_class: !!python/name:overcooked_simulator.info_msg.InfoMsgManager ''
log_class_kwargs:
msg: Glückwunsch du hast was geschnitten!
fire_msg:
func: !!python/name:overcooked_simulator.recording.class_recording_with_hooks ''
kwargs:
hooks: [ new_fire ]
log_class: !!python/name:overcooked_simulator.info_msg.InfoMsgManager ''
log_class_kwargs:
msg: Feuer, Feuer, Feuer
level: Warning
\ No newline at end of file
......@@ -630,6 +630,24 @@ class PyGameGUI:
self.update_score_label(state)
if state["info_msg"]:
for idx, msg in enumerate(reversed(state["info_msg"])):
text_surface = self.comic_sans.render(
msg[0],
antialias=True,
color=(0, 0, 0)
if msg[1] == "Normal"
else ((255, 0, 0) if msg[1] == "Warning" else (0, 255, 0)),
# bgcolor=(255, 255, 255),
)
self.main_window.blit(
text_surface,
(
self.window_width / 4,
self.window_height - self.screen_margin + 5 + (20 * idx),
),
)
def set_window_size(self):
self.game_screen = pygame.Surface(
(
......@@ -1002,6 +1020,8 @@ class PyGameGUI:
"""Starts pygame and the gui loop. Each frame the game state is visualized and keyboard inputs are read."""
log.debug(f"Starting pygame gui at {self.FPS} fps")
pygame.font.init()
self.comic_sans = pygame.font.SysFont("Comic Sans MS", 30)
pygame.display.set_caption("Simple Overcooked Simulator")
clock = pygame.time.Clock()
......
......@@ -96,6 +96,10 @@ ACTION_PUT = "action_put"
ACTION_INTERACT_START = "action_interact_start"
NEW_FIRE = "new_fire"
FIRE_SPREADING = "fire_spreading"
class Hooks:
def __init__(self, env):
......
from datetime import timedelta
from overcooked_simulator.overcooked_environment import Environment
class InfoMsgManager:
def __init__(
self,
name: str,
env: Environment,
msg: str,
duration: int = 5,
level: str = "Normal",
):
self.msg = msg
self.duration = timedelta(seconds=duration)
self.level = level
def __call__(self, hook_ref: str, env: Environment, **kwargs):
for player_id in env.players:
env.info_msgs_per_player[player_id].append(
{
"msg": self.msg,
"start_time": env.env_time,
"end_time": env.env_time + self.duration,
"level": self.level,
}
)
self.remove_old_msgs(env)
@staticmethod
def remove_old_msgs(env: Environment):
for player_id, msgs in env.info_msgs_per_player.items():
delete_msgs = []
for idx, msg in enumerate(msgs):
if msg["end_time"] < env.env_time:
delete_msgs.append(idx)
for idx in reversed(delete_msgs):
msgs.pop(idx)
......@@ -5,6 +5,7 @@ import inspect
import json
import logging
import sys
from collections import defaultdict
from datetime import timedelta, datetime
from enum import Enum
from pathlib import Path
......@@ -50,7 +51,7 @@ from overcooked_simulator.order import (
OrderConfig,
)
from overcooked_simulator.player import Player, PlayerConfig
from overcooked_simulator.state_representation import StateRepresentation
from overcooked_simulator.state_representation import StateRepresentation, InfoMsg
from overcooked_simulator.utils import create_init_env_time, get_closest
log = logging.getLogger(__name__)
......@@ -285,6 +286,8 @@ class Environment:
str, EffectManager
] = self.counter_factory.setup_effect_manger(self.counters)
self.info_msgs_per_player: dict[str, list[InfoMsg]] = defaultdict(list)
self.hook(
ENV_INITIALIZED,
environment_config=env_config,
......@@ -825,6 +828,12 @@ class Environment:
}
if self.player_view_restricted
else None,
"info_msg": [
(msg["msg"], msg["level"])
for msg in self.info_msgs_per_player[player_id]
if msg["start_time"] < self.env_time
and msg["end_time"] > self.env_time
],
}
self.hook(STATE_DICT, state=state, player_id=player_id)
json_data = json.dumps(state)
......
......@@ -2,6 +2,7 @@
Type hint classes for the representation of the json state.
"""
from datetime import datetime
from enum import Enum
from pydantic import BaseModel
from typing_extensions import Literal, TypedDict
......@@ -74,6 +75,19 @@ class ViewRestriction(BaseModel):
range: float | None
class InfoMsgLevel(Enum):
Normal = "Normal"
Warning = "Warning"
Success = "Success"
class InfoMsg(TypedDict):
msg: str
start_time: datetime
end_time: datetime
level: InfoMsgLevel
class StateRepresentation(BaseModel):
"""The format of the returned state representation."""
......@@ -86,6 +100,7 @@ class StateRepresentation(BaseModel):
env_time: datetime # isoformat str
remaining_time: float
view_restriction: None | ViewRestriction
info_msg: list[tuple[str, str]]
def create_json_schema():
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment