From 58f18cae94952eb5946cd1bb5c76414e4cac791c Mon Sep 17 00:00:00 2001 From: Thanatos Date: Sat, 30 Sep 2023 18:02:19 +0200 Subject: [PATCH] Add Pickups on Metroids --- open_samus_returns_rando/files/schema.json | 75 +- .../metroid_template.lua} | 4 + open_samus_returns_rando/lua_editor.py | 12 + open_samus_returns_rando/pickup.py | 13 +- .../specific_patches/metroid_patches.py | 2 - tests/test_files/metroid_test.json | 882 +----------------- 6 files changed, 109 insertions(+), 879 deletions(-) rename open_samus_returns_rando/files/{custom_metroid.lua => templates/metroid_template.lua} (92%) diff --git a/open_samus_returns_rando/files/schema.json b/open_samus_returns_rando/files/schema.json index a3b594f..19ed095 100644 --- a/open_samus_returns_rando/files/schema.json +++ b/open_samus_returns_rando/files/schema.json @@ -26,22 +26,15 @@ "type": "object", "properties": { "pickup_type": { - "type": "string" + "type": "string", + "enum": [ + "actor", + "metroid" + ] }, "caption": { "type": "string" }, - "pickup_actor": { - "$ref": "#/$defs/actor_reference_with_layer" - }, - "model": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "description": "A list of model identifiers used by this pickup. Non-progressive items will only have one model identifier." - }, "resources": { "type": "array", "items": { @@ -78,10 +71,45 @@ "required": [ "pickup_type", "caption", - "resources", - "pickup_actor", - "model" - ] + "resources" + ], + "if": { + "properties": { + "pickup_type": { + "const": "actor" + } + } + }, + "then": { + "properties": { + "pickup_actor": { + "$ref": "#/$defs/actor_reference_with_layer" + }, + "model": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "A list of model identifiers used by this pickup. Non-progressive items will only have one model identifier." + } + }, + "required": [ + "pickup_actor", + "model" + ] + }, + "else": { + "properties": { + "metroid_callback": { + "$ref": "#/$defs/metroid_callback" + } + }, + "required": [ + "metroid_callback" + ] + } + } }, "elevators": { @@ -336,6 +364,21 @@ "y", "z" ] + }, + "metroid_callback": { + "type": "object", + "properties": { + "scenario": { + "$ref": "#/$defs/scenario_name" + }, + "spawngroup": { + "type": "string" + } + }, + "required": [ + "scenario", + "spawngroup" + ] } } } diff --git a/open_samus_returns_rando/files/custom_metroid.lua b/open_samus_returns_rando/files/templates/metroid_template.lua similarity index 92% rename from open_samus_returns_rando/files/custom_metroid.lua rename to open_samus_returns_rando/files/templates/metroid_template.lua index 4cb1680..4eac6b9 100644 --- a/open_samus_returns_rando/files/custom_metroid.lua +++ b/open_samus_returns_rando/files/templates/metroid_template.lua @@ -28,9 +28,13 @@ function Metroid.RemoveMetroid(_ARG_0_) CurrentScenario.currentMetroidSpawngroup = nil + Metroid.Pickups[Scenario.CurrentScenarioID][spawnGroupName].OnPickedUp() + -- TODO: This is only for tests -- Game.SaveGame("checkpoint", "Bla", "ST_SG_Alpha_004_Out", true) else GUI.LaunchMessage("Oops 2", "Metroid.Dummy", "") end end + +Metroid.Pickups = TEMPLATE("mapping") \ No newline at end of file diff --git a/open_samus_returns_rando/lua_editor.py b/open_samus_returns_rando/lua_editor.py index 8c73cc6..81f030f 100644 --- a/open_samus_returns_rando/lua_editor.py +++ b/open_samus_returns_rando/lua_editor.py @@ -46,6 +46,7 @@ def _read_level_lua(level_id: str) -> str: class LuaEditor: def __init__(self): self._item_classes = {} + self._metroid_dict = {} self._powerup_script = _read_powerup_lua() self._custom_level_scripts: dict[str, dict] = self._read_levels() @@ -124,8 +125,19 @@ def add_progressive_models(self, pickup: dict, actordef_name: str): self._powerup_script += models.encode("utf-8") def save_modifications(self, editor: PatcherEditor): + final_metroid_script = lua_util.replace_lua_template("metroid_template.lua", {"mapping": self._metroid_dict}) + editor.replace_asset("actors/items/randomizer_powerup/scripts/randomizer_powerup.lc", self._powerup_script) + editor.replace_asset("actors/scripts/metroid.lc", final_metroid_script.encode("utf-8")) editor.replace_asset("actors/props/heatzone/scripts/heatzone.lc", files_path().joinpath("heatzone.lua").read_bytes()) for scenario, script in self._custom_level_scripts.items(): editor.replace_asset(path_for_level(scenario) + ".lc", script["script"].encode("utf-8")) + + def add_metroid_pickup(self, metroid_callback: dict, lua_class: str) -> None: + scenario = metroid_callback["scenario"] + spawngroup = metroid_callback["spawngroup"] + if scenario not in self._metroid_dict: + self._metroid_dict[scenario] = {} + scenario_list = self._metroid_dict[scenario] + scenario_list[spawngroup] = lua_class diff --git a/open_samus_returns_rando/pickup.py b/open_samus_returns_rando/pickup.py index 8108d09..44d5cf2 100644 --- a/open_samus_returns_rando/pickup.py +++ b/open_samus_returns_rando/pickup.py @@ -30,6 +30,7 @@ def _read_template_powerup(): class PickupType(Enum): ACTOR = "actor" + METROID = "metroid" class BasePickup: def __init__(self, lua_editor: LuaEditor, pickup: dict, pickup_id: int, configuration: dict): @@ -101,6 +102,7 @@ def patch_multi_item_pickup(self, bmsad: dict) -> dict: ) return bmsad + def patch_model(self, model_names: list[str], new_template: dict) -> None: if len(model_names) == 1: model_data = get_data(model_names[0]) @@ -187,12 +189,19 @@ def patch(self, editor: PatcherEditor): # json.dumps(new_template, indent=4) # ) +class MetroidPickup(BasePickup): + def patch(self, editor: PatcherEditor): + lua_class = self.lua_editor.get_script_class(self.pickup) + self.lua_editor.add_metroid_pickup(self.pickup["metroid_callback"], lua_class) + + def ensure_base_models(editor: PatcherEditor) -> None: for level_pkg in editor.get_all_level_pkgs(): # ensure base stuff editor.ensure_present(level_pkg, "system/animtrees/base.bmsat") editor.ensure_present(level_pkg, "sounds/generic/obtencion.bcwav") editor.ensure_present(level_pkg, "actors/items/randomizer_powerup/scripts/randomizer_powerup.lc") + editor.ensure_present(level_pkg, "actors/scripts/metroid.lc") # ensure itemsphere stuff (base for many majors) editor.ensure_present(level_pkg, "actors/items/itemsphere/animations/relax.bcskla") @@ -207,9 +216,9 @@ def ensure_base_models(editor: PatcherEditor) -> None: editor.ensure_present(level_pkg, dep) - def patch_pickups(editor: PatcherEditor, lua_scripts: LuaEditor, pickups_config: list[dict], configuration: dict): editor.add_new_asset("actors/items/randomizer_powerup/scripts/randomizer_powerup.lc", b'', []) + editor.add_new_asset("actors/scripts/metroid.lc", b'', []) ensure_base_models(editor) for i, pickup in enumerate(pickups_config): @@ -219,9 +228,9 @@ def patch_pickups(editor: PatcherEditor, lua_scripts: LuaEditor, pickups_config: except NotImplementedError as e: LOG.warning(e) - _PICKUP_TYPE_TO_CLASS: dict[PickupType, type[BasePickup]] = { PickupType.ACTOR: ActorPickup, + PickupType.METROID: MetroidPickup, } def pickup_object_for(lua_scripts: LuaEditor, pickup: dict, pickup_id: int, configuration: dict) -> "BasePickup": diff --git a/open_samus_returns_rando/specific_patches/metroid_patches.py b/open_samus_returns_rando/specific_patches/metroid_patches.py index 2ef4678..a5de390 100644 --- a/open_samus_returns_rando/specific_patches/metroid_patches.py +++ b/open_samus_returns_rando/specific_patches/metroid_patches.py @@ -5,7 +5,6 @@ from mercury_engine_data_structures.formats import Bmsad from open_samus_returns_rando.constants import ALL_AREAS -from open_samus_returns_rando.files import files_path from open_samus_returns_rando.patcher_editor import PatcherEditor LOG = logging.getLogger("metroid_patches") @@ -59,7 +58,6 @@ def patch_metroids(editor: PatcherEditor): }, ] - editor.add_new_asset("actors/scripts/metroid.lc", files_path().joinpath("custom_metroid.lua").read_bytes(), []) for area_name in ALL_AREAS: editor.ensure_present_in_scenario(area_name, "actors/scripts/metroid.lc") diff --git a/tests/test_files/metroid_test.json b/tests/test_files/metroid_test.json index c2391b4..2bfafdb 100644 --- a/tests/test_files/metroid_test.json +++ b/tests/test_files/metroid_test.json @@ -26,219 +26,9 @@ "ITEM_SPACE_JUMP": 1, "ITEM_SPRING_BALL": 1, "ITEM_WEAPON_GRAPPLE_BEAM": 1, - "ITEM_VARIA_SUIT": 1, - "ITEM_GRAVITY_SUIT": 1 + "ITEM_VARIA_SUIT": 1 }, "pickups": [ - { - "pickup_type": "actor", - "caption": "Morph Ball acquired.", - "resources": [ - [ - { - "item_id": "ITEM_MORPH_BALL", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup1" - }, - "model": [ - "powerup_morphball" - ] - }, - { - "pickup_type": "actor", - "caption": "Bomb acquired.", - "resources": [ - [ - { - "item_id": "ITEM_WEAPON_BOMB", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup2" - }, - "model": [ - "powerup_bomb" - ] - }, - { - "pickup_type": "actor", - "caption": "Spider Ball acquired.", - "resources": [ - [ - { - "item_id": "ITEM_SPIDER_BALL", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup3" - }, - "model": [ - "powerup_spiderball" - ] - }, - { - "pickup_type": "actor", - "caption": "Power Bomb acquired.", - "resources": [ - [ - { - "item_id": "ITEM_WEAPON_POWER_BOMB_MAX", - "quantity": 5 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup4" - }, - "model": [ - "powerup_powerbomb" - ] - }, - { - "pickup_type": "actor", - "caption": "Charge Beam acquired.", - "resources": [ - [ - { - "item_id": "ITEM_WEAPON_CHARGE_BEAM", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup5" - }, - "model": [ - "powerup_chargebeam" - ] - }, - { - "pickup_type": "actor", - "caption": "Ice Beam acquired.", - "resources": [ - [ - { - "item_id": "ITEM_WEAPON_ICE_BEAM", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup6" - }, - "model": [ - "powerup_icebeam" - ] - }, - { - "pickup_type": "actor", - "caption": "Wave Beam acquired.", - "resources": [ - [ - { - "item_id": "ITEM_WEAPON_WAVE_BEAM", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup7" - }, - "model": [ - "powerup_wavebeam" - ] - }, - { - "pickup_type": "actor", - "caption": "Spazer Beam acquired.", - "resources": [ - [ - { - "item_id": "ITEM_WEAPON_SPAZER_BEAM", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup8" - }, - "model": [ - "powerup_spazerbeam" - ] - }, - { - "pickup_type": "actor", - "caption": "Plasma Beam acquired.", - "resources": [ - [ - { - "item_id": "ITEM_WEAPON_PLASMA_BEAM", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup9" - }, - "model": [ - "powerup_plasmabeam" - ] - }, - { - "pickup_type": "actor", - "caption": "Grapple Beam acquired.", - "resources": [ - [ - { - "item_id": "ITEM_WEAPON_GRAPPLE_BEAM", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup10" - }, - "model": [ - "powerup_grapplebeam" - ] - }, - { - "pickup_type": "actor", - "caption": "High Jump Boots acquired.", - "resources": [ - [ - { - "item_id": "ITEM_HIGH_JUMP_BOOTS", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup11" - }, - "model": [ - "powerup_highjumpboots" - ] - }, { "pickup_type": "actor", "caption": "Space Jump acquired.", @@ -259,26 +49,7 @@ ] }, { - "pickup_type": "actor", - "caption": "Varia Suit acquired.", - "resources": [ - [ - { - "item_id": "ITEM_VARIA_SUIT", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup13" - }, - "model": [ - "powerup_variasuit" - ] - }, - { - "pickup_type": "actor", + "pickup_type": "metroid", "caption": "Gravity Suit acquired.", "resources": [ [ @@ -288,73 +59,13 @@ } ] ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup14" - }, - "model": [ - "powerup_gravitysuit" - ] - }, - { - "pickup_type": "actor", - "caption": "Super Missile acquired.", - "resources": [ - [ - { - "item_id": "ITEM_WEAPON_SUPER_MISSILE_MAX", - "quantity": 5 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup15" - }, - "model": [ - "powerup_supermissile" - ] - }, - { - "pickup_type": "actor", - "caption": "Screw Attack acquired.", - "resources": [ - [ - { - "item_id": "ITEM_SCREW_ATTACK", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup16" - }, - "model": [ - "powerup_screwattack" - ] - }, - { - "pickup_type": "actor", - "caption": "Spring Ball acquired.", - "resources": [ - [ - { - "item_id": "ITEM_SPRING_BALL", - "quantity": 1 - } - ] - ], - "pickup_actor": { + "metroid_callback": { "scenario": "s020_area2", - "actor": "another_pickup17" - }, - "model": [ - "powerup_springball" - ] + "spawngroup": "SG_Alpha_004" + } }, { - "pickup_type": "actor", + "pickup_type": "metroid", "caption": "Scan Pulse acquired.", "resources": [ [ @@ -364,235 +75,24 @@ } ] ], - "pickup_actor": { + "metroid_callback": { "scenario": "s020_area2", - "actor": "another_pickup18" - }, - "model": [ - "powerup_scanningpulse" - ] - }, + "spawngroup": "SG_Alpha_003" + } + } + + ], + "energy_per_tank": 100, + "aeion_per_tank": 50, + "reveal_map_on_start": true, + "game_patches": { + "nerf_power_bombs": false + }, + "new_spawn_points": [ { - "pickup_type": "actor", - "caption": "Lightning Armor acquired.", - "resources": [ - [ - { - "item_id": "ITEM_SPECIAL_ENERGY_ENERGY_SHIELD", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup19" - }, - "model": [ - "powerup_energyshield" - ] - }, - { - "pickup_type": "actor", - "caption": "Beam Burst acquired.", - "resources": [ - [ - { - "item_id": "ITEM_SPECIAL_ENERGY_ENERGY_WAVE", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup20" - }, - "model": [ - "powerup_energywave" - ] - }, - { - "pickup_type": "actor", - "caption": "Phase Drift acquired.", - "resources": [ - [ - { - "item_id": "ITEM_SPECIAL_ENERGY_PHASE_DISPLACEMENT", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup21" - }, - "model": [ - "powerup_phasedisplacement" - ] - }, - { - "pickup_type": "actor", - "caption": "Energy Tank acquired. Energy capacity increased by 100.", - "resources": [ - [ - { - "item_id": "ITEM_ENERGY_TANKS", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup22" - }, - "model": [ - "item_energytank" - ] - }, - { - "pickup_type": "actor", - "caption": "Missile Tank acquired. Missile capacity increased by 3.", - "resources": [ - [ - { - "item_id": "ITEM_WEAPON_MISSILE_MAX", - "quantity": 3 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup23" - }, - "model": [ - "item_missiletank" - ] - }, - { - "pickup_type": "actor", - "caption": "Super Missile Tank acquired. Super Missile capacity increased by 1.", - "resources": [ - [ - { - "item_id": "ITEM_RANDO_LOCKED_SUPERS", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup24" - }, - "model": [ - "item_supermissiletank" - ] - }, - { - "pickup_type": "actor", - "caption": "Power Bomb Tank acquired. Power Bomb capacity increased by 1.", - "resources": [ - [ - { - "item_id": "ITEM_RANDO_LOCKED_PBS", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup25" - }, - "model": [ - "item_powerbombtank" - ] - }, - { - "pickup_type": "actor", - "caption": "Aeion Tank acquired. Aeion capacity increased.", - "resources": [ - [ - { - "item_id": "ITEM_AEION_TANKS", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup26" - }, - "model": [ - "item_senergytank" - ] - }, - { - "pickup_type": "actor", - "caption": "Nothing acquired.", - "resources": [ - [ - { - "item_id": "ITEM_NONE", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup27" - }, - "model": [ - "itemsphere" - ] - }, - { - "pickup_type": "actor", - "caption": "Metroid DNA acquired.", - "resources": [ - [ - { - "item_id": "ITEM_ADN", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup28" - }, - "model": [ - "adn" - ] - }, - { - "pickup_type": "actor", - "caption": "Baby Metroid acquired.", - "resources": [ - [ - { - "item_id": "ITEM_BABY_HATCHLING", - "quantity": 1 - } - ] - ], - "pickup_actor": { - "scenario": "s020_area2", - "actor": "another_pickup29" - }, - "model": [ - "babyhatchling" - ] - } - ], - "energy_per_tank": 100, - "aeion_per_tank": 50, - "reveal_map_on_start": true, - "game_patches": { - "nerf_power_bombs": false - }, - "new_spawn_points": [ - { - "new_actor": { - "actor": "SP_RDV_000", - "scenario": "s020_area2" + "new_actor": { + "actor": "SP_RDV_000", + "scenario": "s020_area2" }, "location": { "x": -8000.0, @@ -603,138 +103,6 @@ } ], "custom_pickups": [ - { - "new_actor": { - "actor": "another_pickup1", - "scenario": "s020_area2" - }, - "location": { - "x": -7500.0, - "y": 3300.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup2", - "scenario": "s020_area2" - }, - "location": { - "x": -7400.0, - "y": 3300.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup3", - "scenario": "s020_area2" - }, - "location": { - "x": -7300.0, - "y": 3300.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup4", - "scenario": "s020_area2" - }, - "location": { - "x": -7200.0, - "y": 3300.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup5", - "scenario": "s020_area2" - }, - "location": { - "x": -7100.0, - "y": 3300.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup6", - "scenario": "s020_area2" - }, - "location": { - "x": -7000.0, - "y": 3300.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup7", - "scenario": "s020_area2" - }, - "location": { - "x": -6900.0, - "y": 3300.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup8", - "scenario": "s020_area2" - }, - "location": { - "x": -6800.0, - "y": 3300.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup9", - "scenario": "s020_area2" - }, - "location": { - "x": -6700.0, - "y": 3300.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup10", - "scenario": "s020_area2" - }, - "location": { - "x": -6600.0, - "y": 3300.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup11", - "scenario": "s020_area2" - }, - "location": { - "x": -6500.0, - "y": 3300.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, { "new_actor": { "actor": "another_pickup12", @@ -746,210 +114,6 @@ "z": 0.0 }, "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup13", - "scenario": "s020_area2" - }, - "location": { - "x": -6300.0, - "y": 3300.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup14", - "scenario": "s020_area2" - }, - "location": { - "x": -6200.0, - "y": 3300.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup15", - "scenario": "s020_area2" - }, - "location": { - "x": -7500.0, - "y": 3100.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup16", - "scenario": "s020_area2" - }, - "location": { - "x": -7400.0, - "y": 3100.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup17", - "scenario": "s020_area2" - }, - "location": { - "x": -7300.0, - "y": 3100.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup18", - "scenario": "s020_area2" - }, - "location": { - "x": -7200.0, - "y": 3100.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup19", - "scenario": "s020_area2" - }, - "location": { - "x": -7100.0, - "y": 3100.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup20", - "scenario": "s020_area2" - }, - "location": { - "x": -7000.0, - "y": 3100.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup21", - "scenario": "s020_area2" - }, - "location": { - "x": -6900.0, - "y": 3100.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup22", - "scenario": "s020_area2" - }, - "location": { - "x": -6800.0, - "y": 3100.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup23", - "scenario": "s020_area2" - }, - "location": { - "x": -6700.0, - "y": 3100.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup24", - "scenario": "s020_area2" - }, - "location": { - "x": -6600.0, - "y": 3100.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup25", - "scenario": "s020_area2" - }, - "location": { - "x": -6500.0, - "y": 3100.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup26", - "scenario": "s020_area2" - }, - "location": { - "x": -6400.0, - "y": 3100.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup27", - "scenario": "s020_area2" - }, - "location": { - "x": -6300.0, - "y": 3100.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup28", - "scenario": "s020_area2" - }, - "location": { - "x": -6200.0, - "y": 3100.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" - }, - { - "new_actor": { - "actor": "another_pickup29", - "scenario": "s020_area2" - }, - "location": { - "x": -7500.0, - "y": 3000.0, - "z": 0.0 - }, - "collision_camera_name": "collision_camera_005" } ] - } \ No newline at end of file +} \ No newline at end of file