From 70322bc1a19ec1a84b258f421410d83ed1811255 Mon Sep 17 00:00:00 2001 From: Marvin Arnold Date: Sat, 29 Oct 2022 12:48:16 -0500 Subject: [PATCH] feat: SoundUriComponent and UploadSoundSystem --- .../src/layers/network/createNetworkLayer.ts | 7 +++++- packages/contracts/deploy.json | 5 ++-- .../src/components/SoundUriComponent.sol | 9 +++++++ .../src/systems/UploadSoundSystem.sol | 24 +++++++++++++++++++ 4 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 packages/contracts/src/components/SoundUriComponent.sol create mode 100644 packages/contracts/src/systems/UploadSoundSystem.sol diff --git a/packages/client/src/layers/network/createNetworkLayer.ts b/packages/client/src/layers/network/createNetworkLayer.ts index 46b672c2..8ccfb164 100644 --- a/packages/client/src/layers/network/createNetworkLayer.ts +++ b/packages/client/src/layers/network/createNetworkLayer.ts @@ -48,6 +48,11 @@ export async function createNetworkLayer(config: GameConfig) { systems["system.Catch"].executeTyped(coord); } + function uploadSound(soundUri: string) { + systems["system.UploadSound"].executeTyped(soundUri); + } + + // --- CONTEXT -------------------------------------------------------------------- const context = { world, @@ -58,7 +63,7 @@ export async function createNetworkLayer(config: GameConfig) { startSync, network, actions, - api: { move, pickup }, + api: { move, pickup, uploadSound }, dev: setupDevSystems(world, encoders, systems), }; diff --git a/packages/contracts/deploy.json b/packages/contracts/deploy.json index d8bb12ce..2b3ebdeb 100644 --- a/packages/contracts/deploy.json +++ b/packages/contracts/deploy.json @@ -1,8 +1,9 @@ { - "components": ["PositionComponent", "CarriedByComponent"], + "components": ["PositionComponent", "CarriedByComponent", "SoundUriComponent"], "systems": [ { "name": "ComponentDevSystem", "writeAccess": ["*"] }, { "name": "MoveSystem", "writeAccess": ["PositionComponent"] }, - { "name": "CatchSystem", "writeAccess": ["PositionComponent", "CarriedByComponent"] } + { "name": "CatchSystem", "writeAccess": ["PositionComponent", "CarriedByComponent"] }, + { "name": "UploadSoundSystem", "writeAccess": ["SoundUriComponent"] } ] } diff --git a/packages/contracts/src/components/SoundUriComponent.sol b/packages/contracts/src/components/SoundUriComponent.sol new file mode 100644 index 00000000..18df5299 --- /dev/null +++ b/packages/contracts/src/components/SoundUriComponent.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: Unlicense +pragma solidity >=0.8.0; +import "std-contracts/components/StringComponent.sol"; + +uint256 constant ID = uint256(keccak256("component.SoundUri")); + +contract SoundUriComponent is StringComponent { + constructor(address world) StringComponent(world, ID) {} +} diff --git a/packages/contracts/src/systems/UploadSoundSystem.sol b/packages/contracts/src/systems/UploadSoundSystem.sol new file mode 100644 index 00000000..894b2f9c --- /dev/null +++ b/packages/contracts/src/systems/UploadSoundSystem.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0; +import "solecs/System.sol"; +import { IWorld } from "solecs/interfaces/IWorld.sol"; +import { getAddressById } from "solecs/utils.sol"; + +import { SoundUriComponent, ID as SoundUriComponentID } from "../components/SoundUriComponent.sol"; + +uint256 constant ID = uint256(keccak256("system.UploadSound")); + +contract UploadSoundSystem is System { + constructor(IWorld _world, address _components) System(_world, _components) {} + + function execute(bytes memory arguments) public returns (bytes memory) { + (uint256 entity, string memory targetSoundUri) = abi.decode(arguments, (uint256, string)); + + SoundUriComponent soundComponent = SoundUriComponent(getAddressById(components, SoundUriComponentID)); + soundComponent.set(entity, targetSoundUri); + } + + function executeTyped(uint256 entity, string memory targetSound) public returns (bytes memory) { + return execute(abi.encode(entity, targetSound)); + } +}