Skip to content

Commit

Permalink
Merge pull request #275 from Dallinger/feature/271-automatic-trasitions
Browse files Browse the repository at this point in the history
Autonomous transitions
  • Loading branch information
silviot authored Oct 13, 2023
2 parents 630d01f + 219de29 commit aa7ff6a
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 0 deletions.
26 changes: 26 additions & 0 deletions dlgr/griduniverse/experiment.py
Original file line number Diff line number Diff line change
Expand Up @@ -683,6 +683,30 @@ def items_changed(self, last_items):
return True
return False

def trigger_transitions(self, time=time.time):
now = time()
to_change = []
for position, item in self.item_locations.items():
item_type = self.item_config.get(item.item_id)
if not item_type:
continue
if "auto_transition_time" in item_type:
if now - item.creation_timestamp >= item_type["auto_transition_time"]:
target = item_type.get("auto_transition_target")
new_target_item = target and Item(
id=item.id,
position=position,
item_config=self.item_config[target],
)
to_change.append((position, new_target_item))
if to_change:
self.items_updated = True
for position, new_target_item in to_change:
if new_target_item is None:
del self.item_locations[position]
else:
self.item_locations[position] = new_target_item

def replenish_items(self):
items_by_type = collections.defaultdict(list)
for item in self.item_locations.values():
Expand Down Expand Up @@ -1748,6 +1772,8 @@ def game_loop(self):
if (now - previous_second_timestamp) > 1.000:
# Grow or shrink the item stores.
self.grid.replenish_items()
# Trigger automatic transitions.
self.grid.trigger_transitions()

abundances = {}
for player in self.grid.players.values():
Expand Down
46 changes: 46 additions & 0 deletions dlgr/griduniverse/game_config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,52 @@ items:
portable: false
crossable: true

- name: Sunflower sprout
item_id: sunflower_sprout
n_uses: 1
sprite: "emoji:🌱"
interactive: true
spawn_rate: 0.9
item_count: 90
portable: false
crossable: true
auto_transition_time: 5
auto_transition_target: sunflower_bud

- name: Sunflower bud
item_id: sunflower_bud
n_uses: 1
sprite: "emoji:🌼"
interactive: true
spawn_rate: 0
item_count: 0
portable: false
crossable: true
auto_transition_time: 5
auto_transition_target: sunflower_bloom

- name: Sunflower bloom
item_id: sunflower_bloom
n_uses: 1
sprite: "emoji:🌻"
interactive: true
spawn_rate: 0
item_count: 0
portable: false
crossable: true
auto_transition_time: 5
auto_transition_target: sunflower_dried

- name: Sunflower dried
item_id: sunflower_dried
n_uses: 1
sprite: "emoji:🥀"
interactive: true
spawn_rate: 0
item_count: 0
portable: false
crossable: true

transitions:
- actor_start: stone
actor_end: sharp_stone
Expand Down
57 changes: 57 additions & 0 deletions test/test_automatic_transitions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import time

import pytest


class TestAutoTransition(object):
messages = []

def test_automatic_transition(self, exp):
from dlgr.griduniverse.experiment import Item

item = Item(
{
"id": 1,
"item_id": "sunflower_sprout",
"name": "Sunflower Sprout",
"n_uses": 1,
}
)
exp.grid.item_locations[(2, 2)] = item

exp.grid.trigger_transitions(time=lambda: time.time() + 5)
assert exp.grid.item_locations[(2, 2)].item_id == "sunflower_bud"

def test_null_target(self, exp):
from dlgr.griduniverse.experiment import Item

item = Item(
{
"id": 1,
"item_id": "sunflower_dried",
"name": "Sunflower Dried",
"n_uses": 1,
}
)
exp.grid.item_locations[(2, 2)] = item

exp.item_config["sunflower_sprout"]["auto_transition_target"] = None
exp.grid.trigger_transitions(time=lambda: time.time() + 5)
assert (2, 2) not in exp.grid.item_locations


@pytest.fixture(autouse=True)
def add_item_config(exp):
"""Make sure item configs needed for these tests are set"""
exp.grid.item_config["sunflower_dried"] = {
"name": "Sunflower dried",
"item_id": "sunflower_dried",
"n_uses": 1,
"auto_transition_time": 5,
}
exp.grid.item_config["sunflower_sprout"] = {
"auto_transition_target": "sunflower_bud",
"auto_transition_time": 5,
"n_uses": 1,
"name": "Sunflower sprout",
}

0 comments on commit aa7ff6a

Please sign in to comment.