// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; import {Game} from "cog/IGame.sol"; import {State} from "cog/IState.sol"; import {Schema} from "@ds/schema/Schema.sol"; import {Actions} from "@ds/actions/Actions.sol"; import {BuildingKind} from "@ds/ext/BuildingKind.sol"; using Schema for State; contract BasicFactory is BuildingKind { function use(Game ds, bytes24 buildingInstance, bytes24, /*actor*/ bytes memory /*payload*/ ) public override { ds.getDispatcher().dispatch(abi.encodeCall(Actions.CRAFT, (buildingInstance))); } // version of use that restricts crafting to building owner, author or allow list // these restrictions will not be reflected in the UI unless you make // similar changes in BasicFactory.js /*function use(Game ds, bytes24 buildingInstance, bytes24 actor, bytes memory ) public override { State state = GetState(ds); CheckIsFriendlyUnit(state, actor, buildingInstance); ds.getDispatcher().dispatch(abi.encodeCall(Actions.CRAFT, (buildingInstance))); }*/ // version of use that restricts crafting to units carrying a certain item /*function use(Game ds, bytes24 buildingInstance, bytes24 actor, bytes memory ) public override { // require carrying an idCard // you can change idCardItemId to another item id CheckIsCarryingItem(state, actor, idCardItemId); ds.getDispatcher().dispatch(abi.encodeCall(Actions.CRAFT, (buildingInstance))); }*/ function GetState(Game ds) internal returns (State) { return ds.getState(); } function GetBuildingOwner(State state, bytes24 buildingInstance) internal view returns (bytes24) { return state.getOwner(buildingInstance); } function GetBuildingAuthor(State state, bytes24 buildingInstance) internal view returns (bytes24) { bytes24 buildingKind = state.getBuildingKind(buildingInstance); return state.getOwner(buildingKind); } function CheckIsFriendlyUnit(State state, bytes24 actor, bytes24 buildingInstance) internal view { require( UnitOwnsBuilding(state, actor, buildingInstance) || UnitAuthoredBuilding(state, actor, buildingInstance) || UnitOwnedByFriendlyPlayer(state, actor), "Unit does not have permission to use this building" ); } function UnitOwnsBuilding(State state, bytes24 actor, bytes24 buildingInstance) internal view returns (bool) { return state.getOwner(actor) == GetBuildingOwner(state, buildingInstance); } function UnitAuthoredBuilding(State state, bytes24 actor, bytes24 buildingInstance) internal view returns (bool) { return state.getOwner(actor) == GetBuildingAuthor(state, buildingInstance); } address[] private friendlyPlayerAddresses = [0x402462EefC217bf2cf4E6814395E1b61EA4c43F7]; function UnitOwnedByFriendlyPlayer(State state, bytes24 actor) internal view returns (bool) { address ownerAddress = state.getOwnerAddress(actor); for (uint256 i = 0; i < friendlyPlayerAddresses.length; i++) { if (friendlyPlayerAddresses[i] == ownerAddress) { return true; } } return false; } // use cli command 'ds get items' for all current possible ids. bytes24 idCardItemId = 0x6a7a67f0b29554460000000100000064000000640000004c; function CheckIsCarryingItem(State state, bytes24 actor, bytes24 item) internal view { require((UnitIsCarryingItem(state, actor, item)), "Unit must be carrying specified item"); } function UnitIsCarryingItem(State state, bytes24 actor, bytes24 item) internal view returns (bool) { for (uint8 bagIndex = 0; bagIndex < 2; bagIndex++) { bytes24 bag = state.getEquipSlot(actor, bagIndex); if (bag != 0) { for (uint8 slot = 0; slot < 4; slot++) { (bytes24 resource, uint64 balance) = state.getItemSlot(bag, slot); if (resource == item && balance > 0) { return true; } } } } return false; } }