Skip to content
Snippets Groups Projects
Commit 181d8ae2 authored by Fabian Heinrich's avatar Fabian Heinrich
Browse files

Merge branch '73-create-only-an-image-for-a-json-state' into 'main'

Resolve "Create only an image for a json state"

Closes #73

See merge request scs/cocosy/overcooked-simulator!39
parents 8ee3d5a9 2ce352c8
No related branches found
No related tags found
1 merge request!39Resolve "Create only an image for a json state"
Pipeline #45099 passed
import colorsys import colorsys
import json
import math import math
from datetime import datetime, timedelta from datetime import datetime, timedelta
from pathlib import Path from pathlib import Path
...@@ -6,6 +7,7 @@ from pathlib import Path ...@@ -6,6 +7,7 @@ from pathlib import Path
import numpy as np import numpy as np
import numpy.typing as npt import numpy.typing as npt
import pygame import pygame
import yaml
from scipy.spatial import KDTree from scipy.spatial import KDTree
from overcooked_simulator import ROOT_DIR from overcooked_simulator import ROOT_DIR
...@@ -17,8 +19,8 @@ from overcooked_simulator.state_representation import ( ...@@ -17,8 +19,8 @@ from overcooked_simulator.state_representation import (
) )
USE_PLAYER_COOK_SPRITES = True USE_PLAYER_COOK_SPRITES = True
SHOW_INTERACTION_RANGE = True SHOW_INTERACTION_RANGE = False
SHOW_COUNTER_CENTERS = True SHOW_COUNTER_CENTERS = False
def create_polygon(n, length): def create_polygon(n, length):
...@@ -88,6 +90,8 @@ class Visualizer: ...@@ -88,6 +90,8 @@ class Visualizer:
grid_size, grid_size,
) )
print(state)
def draw_background(self, surface, width, height, grid_size): def draw_background(self, surface, width, height, grid_size):
"""Visualizes a game background.""" """Visualizes a game background."""
block_size = grid_size // 2 # Set the size of the grid block block_size = grid_size // 2 # Set the size of the grid block
...@@ -496,3 +500,32 @@ class Visualizer: ...@@ -496,3 +500,32 @@ class Visualizer:
orders_height // 2, orders_height // 2,
] ]
screen.blit(order_screen, orders_rect) screen.blit(order_screen, orders_rect)
def save_state_image(
self, grid_size: int, state: dict, filename: str | Path
) -> None:
width = int(np.ceil(state["kitchen"]["width"] * grid_size))
height = int(np.ceil(state["kitchen"]["height"] * grid_size))
flags = pygame.HIDDEN
screen = pygame.display.set_mode((width, height), flags=flags)
self.draw_gamescreen(screen, state, grid_size)
pygame.image.save(screen, filename)
def save_screenshot(state: dict, config: dict, filename: str | Path) -> None:
viz = Visualizer(config)
viz.create_player_colors(len(state["players"]))
pygame.init()
pygame.font.init()
viz.save_state_image(grid_size=40, state=state, filename=filename)
if __name__ == "__main__":
with open(ROOT_DIR / "gui_2d_vis" / "visualization.yaml", "r") as conf_file:
viz_config = yaml.safe_load(conf_file)
with open(ROOT_DIR / "gui_2d_vis" / "sample_state.json", "r") as jsonf:
sample_state = json.load(jsonf)
screenshot_filename = ROOT_DIR / "gui_2d_vis" / "screenshot.jpg"
save_screenshot(sample_state, viz_config, screenshot_filename)
{
"players": [
{
"id": "0",
"pos": [
3.0,
4.0
],
"facing_direction": [
0,
1
],
"holding": null,
"current_nearest_counter_pos": null,
"current_nearest_counter_id": null
},
{
"id": "1",
"pos": [
9.0,
4.0
],
"facing_direction": [
0,
1
],
"holding": null,
"current_nearest_counter_pos": null,
"current_nearest_counter_id": null
}
],
"counters": [
{
"id": "b032a0fcf1c54828a7bf3afc189547a6",
"category": "Counter",
"type": "Counter",
"pos": [
0.0,
0.0
],
"occupied_by": null
},
{
"id": "7b46f1d45f1e463494940d19f47648d2",
"category": "Counter",
"type": "Stove",
"pos": [
1.0,
0.0
],
"occupied_by": {
"id": "240eb5d4e4dd4215a0ab9fbaa93f02f5",
"category": "Cooking Equipment",
"type": "Pan",
"progress_percentage": 0.0,
"content_list": [],
"content_ready": null
}
},
{
"id": "9675528d610c4a90b8cdea2f52203151",
"category": "Counter",
"type": "Stove",
"pos": [
2.0,
0.0
],
"occupied_by": {
"id": "54124ff47f9a4b2abb6e2df96a9db919",
"category": "Cooking Equipment",
"type": "Pot",
"progress_percentage": 0.0,
"content_list": [],
"content_ready": null
}
},
{
"id": "08d334733913488789fa7d195405c931",
"category": "Counter",
"type": "Counter",
"pos": [
3.0,
0.0
],
"occupied_by": null
},
{
"id": "abace5244d92463693c5d57cd70ab9da",
"category": "Counter",
"type": "DeepFryer",
"pos": [
4.0,
0.0
],
"occupied_by": {
"id": "987ea1da780c44cabc06883f5c721414",
"category": "Cooking Equipment",
"type": "Basket",
"progress_percentage": 0.0,
"content_list": [],
"content_ready": null
}
},
{
"id": "6fd0f625ee2b43609d10b9163c6fbfcf",
"category": "Counter",
"type": "Oven",
"pos": [
5.0,
0.0
],
"occupied_by": {
"id": "a8609b417c0a4c1f8a0d10ef042f2df6",
"category": "Cooking Equipment",
"type": "Peel",
"progress_percentage": 0.0,
"content_list": [],
"content_ready": null
}
},
{
"id": "d5e5f842e2fb490f9ac7b837cca583f2",
"category": "Counter",
"type": "Counter",
"pos": [
6.0,
0.0
],
"occupied_by": null
},
{
"id": "3b054bbd2d5f49a39fa7d1bf10801575",
"category": "Counter",
"type": "TomatoDispenser",
"pos": [
7.0,
0.0
],
"occupied_by": {
"id": "8d431317da8a439ab25a69f592d7e30d",
"category": "Item",
"type": "Tomato",
"progress_percentage": 0.0
}
},
{
"id": "0b88cdca1637439db60152762f9c535c",
"category": "Counter",
"type": "OnionDispenser",
"pos": [
8.0,
0.0
],
"occupied_by": {
"id": "c2143424f8424e33aee383396a00f50b",
"category": "Item",
"type": "Onion",
"progress_percentage": 0.0
}
},
{
"id": "7608477a75cd4e4db83add343f721b10",
"category": "Counter",
"type": "LettuceDispenser",
"pos": [
9.0,
0.0
],
"occupied_by": {
"id": "0301dd77d05044ab80d7bc45808546e9",
"category": "Item",
"type": "Lettuce",
"progress_percentage": 0.0
}
},
{
"id": "7510d5c4af424d3d988de020a80a3c63",
"category": "Counter",
"type": "BunDispenser",
"pos": [
10.0,
0.0
],
"occupied_by": {
"id": "8c2e04c5828447088f8553f52c849132",
"category": "Item",
"type": "Bun",
"progress_percentage": 0.0
}
},
{
"id": "b4a03b6cdc8a4a088f46ceb68eaa0eff",
"category": "Counter",
"type": "Counter",
"pos": [
11.0,
0.0
],
"occupied_by": null
},
{
"id": "9396b59b16834e4ca594bcd7fe91f74f",
"category": "Counter",
"type": "Counter",
"pos": [
0.0,
1.0
],
"occupied_by": null
},
{
"id": "1bf2e112845442e09ce33f2807981c3a",
"category": "Counter",
"type": "MeatDispenser",
"pos": [
11.0,
1.0
],
"occupied_by": {
"id": "d723a509ef6740538c42d0f491c2cdac",
"category": "Item",
"type": "Meat",
"progress_percentage": 0.0
}
},
{
"id": "fa6e820423ca41a5874f12e71419cf2a",
"category": "Counter",
"type": "Counter",
"pos": [
0.0,
2.0
],
"occupied_by": null
},
{
"id": "9525e23ec15445bb86962ead0b6f1076",
"category": "Counter",
"type": "PotatoDispenser",
"pos": [
11.0,
2.0
],
"occupied_by": {
"id": "5f52f039c4f549418ee0be66ca98bee7",
"category": "Item",
"type": "Potato",
"progress_percentage": 0.0
}
},
{
"id": "638e272aeaa14bf8b6287a8a05a27ab8",
"category": "Counter",
"type": "ServingWindow",
"pos": [
0.0,
3.0
],
"occupied_by": null
},
{
"id": "5df4d8b89e01407facfb309c253d9b61",
"category": "Counter",
"type": "FishDispenser",
"pos": [
11.0,
3.0
],
"occupied_by": {
"id": "f5f4ac928e4845b7a1b31d84861d1f49",
"category": "Item",
"type": "Fish",
"progress_percentage": 0.0
}
},
{
"id": "b1ab927ccbe140988bca5fe51694c299",
"category": "Counter",
"type": "Counter",
"pos": [
0.0,
4.0
],
"occupied_by": null
},
{
"id": "e3592afac20e4247b15641eae1818366",
"category": "Counter",
"type": "DoughDispenser",
"pos": [
11.0,
4.0
],
"occupied_by": {
"id": "b7d7d308359849e6bbd2fe7baa6d87a8",
"category": "Item",
"type": "Dough",
"progress_percentage": 0.0
}
},
{
"id": "9d4a6e4726094f49873888bc74faf530",
"category": "Counter",
"type": "CuttingBoard",
"pos": [
0.0,
5.0
],
"occupied_by": null,
"progressing": false
},
{
"id": "c436371aeab84e4ab47454b89a3f4cb2",
"category": "Counter",
"type": "CheeseDispenser",
"pos": [
11.0,
5.0
],
"occupied_by": {
"id": "e2fd82e3fab84dc59ab8b6c6c7963379",
"category": "Item",
"type": "Cheese",
"progress_percentage": 0.0
}
},
{
"id": "2ca7c251080c404787ef46e08e574290",
"category": "Counter",
"type": "CuttingBoard",
"pos": [
0.0,
6.0
],
"occupied_by": null,
"progressing": false
},
{
"id": "9c824c5009814894918c17ea951e34b5",
"category": "Counter",
"type": "SausageDispenser",
"pos": [
11.0,
6.0
],
"occupied_by": {
"id": "d6d343968b9b4175a4e621f1febaaf1f",
"category": "Item",
"type": "Sausage",
"progress_percentage": 0.0
}
},
{
"id": "2c13a76d110749b39ff62866c658ae3e",
"category": "Counter",
"type": "Counter",
"pos": [
0.0,
7.0
],
"occupied_by": null
},
{
"id": "14b547181dd346daac28467b07277a3d",
"category": "Counter",
"type": "Counter",
"pos": [
11.0,
7.0
],
"occupied_by": null
},
{
"id": "188db4c4275f4ba7835989333b252b26",
"category": "Counter",
"type": "Counter",
"pos": [
0.0,
8.0
],
"occupied_by": null
},
{
"id": "f0a4790c290144cba2942705c3240a0f",
"category": "Counter",
"type": "PlateDispenser",
"pos": [
1.0,
8.0
],
"occupied_by": [
{
"id": "db41a69e880d4d64b535b265199d4148",
"category": "Cooking Equipment",
"type": "DirtyPlate",
"progress_percentage": 0.0,
"content_list": [],
"content_ready": null
},
{
"id": "13fd4df8399d48c490091bb9ed3e1302",
"category": "Cooking Equipment",
"type": "DirtyPlate",
"progress_percentage": 0.0,
"content_list": [],
"content_ready": null
},
{
"id": "5075019e20ed45c1aa7aa01ca5198c50",
"category": "Cooking Equipment",
"type": "Plate",
"progress_percentage": 0.0,
"content_list": [],
"content_ready": null
}
]
},
{
"id": "439b6269458c42f5b8be157da1bc0e22",
"category": "Counter",
"type": "Counter",
"pos": [
2.0,
8.0
],
"occupied_by": null
},
{
"id": "6a92b071a1db46bf80d82a413ea400d4",
"category": "Counter",
"type": "Sink",
"pos": [
3.0,
8.0
],
"occupied_by": [],
"progressing": false
},
{
"id": "b3852e97d88f42d4b724d4fb9b0cf8d8",
"category": "Counter",
"type": "SinkAddon",
"pos": [
4.0,
8.0
],
"occupied_by": []
},
{
"id": "9f13c6729dd647f39575d1654d67a094",
"category": "Counter",
"type": "Counter",
"pos": [
5.0,
8.0
],
"occupied_by": null
},
{
"id": "0dc1e47f4a6448cb9e457c0d998f25f6",
"category": "Counter",
"type": "Trashcan",
"pos": [
6.0,
8.0
],
"occupied_by": null
},
{
"id": "87e13494ebaf44318f3ea05ef9d137a6",
"category": "Counter",
"type": "Counter",
"pos": [
7.0,
8.0
],
"occupied_by": null
},
{
"id": "6b83337a91414633a0793dfa4086f442",
"category": "Counter",
"type": "Counter",
"pos": [
8.0,
8.0
],
"occupied_by": null
},
{
"id": "355025b2ec144d008264009761caaee7",
"category": "Counter",
"type": "Sink",
"pos": [
9.0,
8.0
],
"occupied_by": [],
"progressing": false
},
{
"id": "3a12e9b62b8c4473b7b84f307cf3de4b",
"category": "Counter",
"type": "SinkAddon",
"pos": [
10.0,
8.0
],
"occupied_by": []
},
{
"id": "b3ce6a85df3d40c0b376a61c3346fd09",
"category": "Counter",
"type": "Counter",
"pos": [
11.0,
8.0
],
"occupied_by": null
}
],
"kitchen": {
"width": 12.0,
"height": 9.0
},
"score": 0,
"orders": [
{
"id": "823ab5e3211840778261c405ff7df91b",
"category": "Order",
"meal": "FriedFish",
"start_time": "2000-01-01T00:00:00",
"max_duration": 47.371306
},
{
"id": "2cb614440155426cae04b212f8f2729f",
"category": "Order",
"meal": "FriedFish",
"start_time": "2000-01-01T00:00:00",
"max_duration": 53.237394
}
],
"ended": false,
"env_time": "2000-01-01T00:00:00.675141",
"remaining_time": 299.324859
}
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