// 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 { State state = GetState(ds); // NOTE: Added 64 bits (8 bytes) of padding to the 24 byte ID ds.getDispatcher().dispatch( abi.encodeCall( Actions.SET_DATA_ON_BUILDING, (buildingInstance, "actor", bytes32(abi.encodePacked(uint64(0), actor))) ) ); uint256 increment = uint256(state.getData(buildingInstance, "increment")); ds.getDispatcher().dispatch( abi.encodeCall(Actions.SET_DATA_ON_BUILDING, (buildingInstance, "increment", bytes32(increment + 1))) ); bool b = uint256(state.getData(buildingInstance, "boolVal")) == 1; ds.getDispatcher().dispatch( abi.encodeCall(Actions.SET_DATA_ON_BUILDING, (buildingInstance, "boolVal", bytes32(uint256(!b ? 1 : 0)))) ); } 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; } }