diff --git a/dlgr/griduniverse/experiment.py b/dlgr/griduniverse/experiment.py index 476bd5ca..6d3d0aba 100644 --- a/dlgr/griduniverse/experiment.py +++ b/dlgr/griduniverse/experiment.py @@ -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(): @@ -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(): diff --git a/dlgr/griduniverse/game_config.yml b/dlgr/griduniverse/game_config.yml index e3e4fc7c..ada550fe 100644 --- a/dlgr/griduniverse/game_config.yml +++ b/dlgr/griduniverse/game_config.yml @@ -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 diff --git a/test/test_automatic_transitions.py b/test/test_automatic_transitions.py new file mode 100644 index 00000000..23f701b3 --- /dev/null +++ b/test/test_automatic_transitions.py @@ -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", + }