From ec03b4cee8666716d719f785c8597f49cee8dad9 Mon Sep 17 00:00:00 2001 From: ECWireless Date: Wed, 21 Aug 2024 19:34:51 -0600 Subject: [PATCH 1/3] Fix ItemCard stat number symbols --- packages/client/src/components/ItemCard.tsx | 18 +++++++++++------- packages/contracts/script/PostDeploy.s.sol | 4 ++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/client/src/components/ItemCard.tsx b/packages/client/src/components/ItemCard.tsx index 016afb5bc..6d9eca234 100644 --- a/packages/client/src/components/ItemCard.tsx +++ b/packages/client/src/components/ItemCard.tsx @@ -14,6 +14,8 @@ import { GiAxeSword, GiRogue } from 'react-icons/gi'; import { type Armor, StatsClasses, type Weapon } from '../utils/types'; +const getStatSymbol = (stat: string): string => (Number(stat) >= 0 ? '+' : ''); + type ItemCardProps = (Armor | Weapon) & { isEquipped?: boolean; onClick?: () => void; @@ -65,10 +67,12 @@ export const ItemCard: React.FC = ({ - STR+{strModifier} AGI+{agiModifier} INT+ + STR{getStatSymbol(strModifier)} + {strModifier} AGI{getStatSymbol(agiModifier)} + {agiModifier} INT{getStatSymbol(intModifier)} {intModifier}{' '} {(item as Armor).armorModifier - ? `ARM+${(item as Armor).armorModifier}` + ? `ARM${getStatSymbol((item as Armor).armorModifier)}${(item as Armor).armorModifier}` : ''} @@ -109,12 +113,12 @@ export const ItemCardSmall: React.FC = ({ {item.name.slice(0, -3)} - STR+ - {item.strModifier} AGI+ - {item.agiModifier} INT+ - {item.intModifier} + STR{getStatSymbol(item.strModifier)} + {item.strModifier} AGI{getStatSymbol(item.agiModifier)} + {item.agiModifier} INT{getStatSymbol(item.intModifier)} + {item.intModifier}{' '} {(item as Armor).armorModifier - ? ` ARM+${(item as Armor).armorModifier}` + ? `ARM${getStatSymbol((item as Armor).armorModifier)}${(item as Armor).armorModifier}` : ''} diff --git a/packages/contracts/script/PostDeploy.s.sol b/packages/contracts/script/PostDeploy.s.sol index 6959c1f55..26e74fbb4 100644 --- a/packages/contracts/script/PostDeploy.s.sol +++ b/packages/contracts/script/PostDeploy.s.sol @@ -330,10 +330,10 @@ contract PostDeploy is Script { if (i == 0) { warriorItemIds[1] = starterWeaponId; } - if (i == 1) { + if (i == 0) { rogueItemIds[1] = starterWeaponId; } - if (i == 2) { + if (i == 0) { mageItemIds[1] = starterWeaponId; } } From 8473a50e4dd70e1dc8b510418a8402d2f877f8b9 Mon Sep 17 00:00:00 2001 From: ECWireless Date: Wed, 21 Aug 2024 19:49:29 -0600 Subject: [PATCH 2/3] Add draft 1 of items --- .../src/components/BattleOutcomeModal.tsx | 10 +- .../client/src/contexts/BattleContext.tsx | 5 +- .../client/src/lib/mud/createSystemCalls.ts | 26 ++-- .../client/src/pages/CharacterCreation.tsx | 38 ++--- packages/contracts/items.json | 144 ++++++++++++++---- packages/contracts/monsters.json | 42 ++--- 6 files changed, 172 insertions(+), 93 deletions(-) diff --git a/packages/client/src/components/BattleOutcomeModal.tsx b/packages/client/src/components/BattleOutcomeModal.tsx index 5abb2008e..f93068f72 100644 --- a/packages/client/src/components/BattleOutcomeModal.tsx +++ b/packages/client/src/components/BattleOutcomeModal.tsx @@ -53,7 +53,7 @@ export const BattleOutcomeModal: React.FC = ({ const { components: { Items, ItemsBaseURI, ItemsTokenURI, Levels }, } = useMUD(); - const { character, refreshCharacter } = useCharacter(); + const { character } = useCharacter(); const { onContinueToBattleOutcome, opponent } = useBattle(); const [armor, setArmor] = useState([]); @@ -63,14 +63,8 @@ export const BattleOutcomeModal: React.FC = ({ const onAcknowledge = useCallback(() => { localStorage.setItem(BATTLE_OUTCOME_SEEN_KEY, battleOutcome.encounterId); onContinueToBattleOutcome(false); - refreshCharacter(); onClose(); - }, [ - battleOutcome.encounterId, - onContinueToBattleOutcome, - onClose, - refreshCharacter, - ]); + }, [battleOutcome.encounterId, onContinueToBattleOutcome, onClose]); const nextLevelXpRequirement = useComponentValue( diff --git a/packages/client/src/contexts/BattleContext.tsx b/packages/client/src/contexts/BattleContext.tsx index a969f1514..f250e1771 100644 --- a/packages/client/src/contexts/BattleContext.tsx +++ b/packages/client/src/contexts/BattleContext.tsx @@ -73,7 +73,7 @@ export const BattleProvider = ({ delegatorAddress, systemCalls: { endTurn }, } = useMUD(); - const { character } = useCharacter(); + const { character, refreshCharacter } = useCharacter(); const { allMonsters, allCharacters } = useMap(); const [attackingItemId, setAttackingItemId] = useState(null); @@ -272,6 +272,8 @@ export const BattleProvider = ({ localStorage.removeItem(CURRENT_BATTLE_OPPONENT_TURN_KEY); localStorage.removeItem(CURRENT_BATTLE_USER_TURN_KEY); + + refreshCharacter(); } catch (e) { renderError((e as Error)?.message ?? 'Failed to attack.', e); } finally { @@ -285,6 +287,7 @@ export const BattleProvider = ({ delegatorAddress, endTurn, opponent, + refreshCharacter, renderError, ], ); diff --git a/packages/client/src/lib/mud/createSystemCalls.ts b/packages/client/src/lib/mud/createSystemCalls.ts index 6dfae840f..cf115eed8 100644 --- a/packages/client/src/lib/mud/createSystemCalls.ts +++ b/packages/client/src/lib/mud/createSystemCalls.ts @@ -180,11 +180,16 @@ export function createSystemCalls( functionName: 'UD__endTurn', }); - const tx = await worldContract.write.UD__endTurn([ - encounterId.toString() as `0x${string}`, - playerId.toString() as `0x${string}`, - actions, - ]); + const tx = await worldContract.write.UD__endTurn( + [ + encounterId.toString() as `0x${string}`, + playerId.toString() as `0x${string}`, + actions, + ], + { + gas: BigInt('10000000'), + }, + ); await waitForTransaction(tx); @@ -407,11 +412,12 @@ export function createSystemCalls( }); try { - const tx = await worldContract.write.UD__move([ - characterEntity.toString() as `0x${string}`, - x, - y, - ]); + const tx = await worldContract.write.UD__move( + [characterEntity.toString() as `0x${string}`, x, y], + { + gas: BigInt('10000000'), + }, + ); await waitForTransaction(tx); const { x: newX, y: newY } = getComponentValueStrict( diff --git a/packages/client/src/pages/CharacterCreation.tsx b/packages/client/src/pages/CharacterCreation.tsx index 0f45f3cab..0cb12bc24 100644 --- a/packages/client/src/pages/CharacterCreation.tsx +++ b/packages/client/src/pages/CharacterCreation.tsx @@ -38,12 +38,7 @@ import { shortenAddress, uriToHttp, } from '../utils/helpers'; -import { - type Armor, - ItemType, - StatsClasses, - type Weapon, -} from '../utils/types'; +import { type Armor, StatsClasses, type Weapon } from '../utils/types'; export const CharacterCreation = (): JSX.Element => { const navigate = useNavigate(); @@ -181,31 +176,20 @@ export const CharacterCreation = (): JSX.Element => { ); useEffect(() => { - const starterItemTokenIds = Array.from(runQuery([Has(StarterItems)])) - .map(entity => { + const starterItemTokenIds = Array.from(runQuery([Has(StarterItems)])).map( + entity => { const tokenIds = getComponentValueStrict(StarterItems, entity).itemIds; return tokenIds; - }) - .flat() - .filter((value, index, self) => self.indexOf(value) === index); - - const starterItemType = starterItemTokenIds.map(tokenId => { - const tokenIdEntity = encodeEntity({ tokenId: 'uint256' }, { tokenId }); - const itemTemplate = getComponentValueStrict(Items, tokenIdEntity); - - return { - itemType: itemTemplate.itemType, - tokenId, - }; - }); + }, + ); - const starterArmorTokenIds = starterItemType - .filter(item => item.itemType === ItemType.Armor) - .map(item => item.tokenId); + const starterArmorTokenIds = starterItemTokenIds + .map(item => item[0] as bigint) + .filter((value, index, self) => self.indexOf(value) === index); - const starterWeaponTokenIds = starterItemType - .filter(item => item.itemType === ItemType.Weapon) - .map(item => item.tokenId); + const starterWeaponTokenIds = starterItemTokenIds.map( + item => item[1] as bigint, + ); fetchStarterItems(starterArmorTokenIds, starterWeaponTokenIds); }, [fetchStarterItems, Items, StarterItems]); diff --git a/packages/contracts/items.json b/packages/contracts/items.json index 85c0ffa2d..7d3fa1a84 100644 --- a/packages/contracts/items.json +++ b/packages/contracts/items.json @@ -11,59 +11,151 @@ "classRestrictions": [], "hitPointModifier": 0, "intModifier": 0, - "minLevel": 0, + "minLevel": 1, + "strModifier": 0 + } + }, + { + "dropChance": 10000000, + "initialSupply": 10000000000000000000, + "metadataUri": "2_steel_breastplate.json", + "name": "Steel Breastplate", + "stats": { + "agiModifier": -3, + "armorModifier": 3, + "classRestrictions": [0], + "hitPointModifier": 0, + "intModifier": 0, + "minLevel": 3, "strModifier": 0 } + }, + { + "dropChance": 10000000, + "initialSupply": 10000000000000000000, + "metadataUri": "3_light_chainmail.json", + "name": "Light Chainmail", + "stats": { + "agiModifier": -1, + "armorModifier": 2, + "classRestrictions": [1], + "hitPointModifier": 0, + "intModifier": 0, + "minLevel": 3, + "strModifier": 0 + } + }, + { + "dropChance": 10000000, + "initialSupply": 10000000000000000000, + "metadataUri": "4_apprentice_robe.json", + "name": "Apprentice Robe", + "stats": { + "agiModifier": 0, + "armorModifier": 1, + "classRestrictions": [2], + "hitPointModifier": 0, + "intModifier": 3, + "minLevel": 3, + "strModifier": 0 + } + }, + { + "dropChance": 5000000, + "initialSupply": 10000000000000000000, + "metadataUri": "5_enchanted_armor.json", + "name": "Enchanted Armor", + "stats": { + "agiModifier": -2, + "armorModifier": 4, + "classRestrictions": [0, 2], + "hitPointModifier": 0, + "intModifier": 3, + "minLevel": 5, + "strModifier": 3 + } } ], - "metadataUriPrefix": "ipfs://QmPooDEwqeGh3Qszig7veD1yEoa6EoVyDUmLqWUZ1riiDS/", + "metadataUriPrefix": "ipfs://QmcEgdrkuCYj9xjoo8ofuDfdr9kyAk8CCYpzqeMA4f9hp3/", "weapons": [ { "dropChance": 20000000, "initialSupply": 10000000000000000000, - "metadataUri": "2_rusty_sword.json", - "name": "Rusty Sword", + "metadataUri": "6_rusty_axe.json", + "name": "Rusty Axe", "stats": { - "agiModifier": 2, + "agiModifier": 0, "classRestrictions": [], "hitPointModifier": 0, - "intModifier": 1, + "intModifier": 0, "maxDamage": 5, "minDamage": 1, "minLevel": 1, - "strModifier": 5 + "strModifier": 2 } }, { - "dropChance": 20000000, + "dropChance": 10000000, "initialSupply": 10000000000000000000, - "metadataUri": "3_cracked_dagger.json", - "name": "Cracked Dagger", + "metadataUri": "7_iron_sword.json", + "name": "Iron Sword", "stats": { - "agiModifier": 4, - "classRestrictions": [], + "agiModifier": 0, + "classRestrictions": [0], "hitPointModifier": 0, - "intModifier": 2, - "maxDamage": 3, - "minDamage": 1, - "minLevel": 1, - "strModifier": 2 + "intModifier": 0, + "maxDamage": 8, + "minDamage": 4, + "minLevel": 3, + "strModifier": 5 } }, { - "dropChance": 20000000, + "dropChance": 10000000, "initialSupply": 10000000000000000000, - "metadataUri": "4_cobbled_wand.json", - "name": "Cobbled Wand", + "metadataUri": "8_novice_staff.json", + "name": "Novice Staff", "stats": { - "agiModifier": 2, - "classRestrictions": [], + "agiModifier": 0, + "classRestrictions": [2], "hitPointModifier": 0, "intModifier": 5, - "maxDamage": 2, - "minDamage": 1, - "minLevel": 1, - "strModifier": 1 + "maxDamage": 8, + "minDamage": 4, + "minLevel": 3, + "strModifier": 0 + } + }, + { + "dropChance": 10000000, + "initialSupply": 10000000000000000000, + "metadataUri": "9_throwing_dagger.json", + "name": "Throwing Dagger", + "stats": { + "agiModifier": 5, + "classRestrictions": [1], + "hitPointModifier": 0, + "intModifier": 0, + "maxDamage": 8, + "minDamage": 4, + "minLevel": 3, + "strModifier": 0 + } + }, + { + "dropChance": 5000000, + "initialSupply": 10000000000000000000, + "metadataUri": "10_steel_sword.json", + "name": "Steel Sword", + "stats": { + "agiModifier": 0, + "classRestrictions": [0], + "hitPointModifier": 0, + "intModifier": 0, + "maxDamage": 15, + "minDamage": 10, + "minLevel": 5, + "strModifier": 9 } } ] diff --git a/packages/contracts/monsters.json b/packages/contracts/monsters.json index da73fe338..5fa36d914 100644 --- a/packages/contracts/monsters.json +++ b/packages/contracts/monsters.json @@ -13,7 +13,7 @@ "experience": 35, "hitPoints": 5, "intelligence": 4, - "inventory": [2], + "inventory": [6], "level": 1, "strength": 4 } @@ -31,7 +31,7 @@ "experience": 30, "hitPoints": 8, "intelligence": 8, - "inventory": [4], + "inventory": [6], "level": 1, "strength": 2 } @@ -49,7 +49,7 @@ "experience": 60, "hitPoints": 6, "intelligence": 6, - "inventory": [3], + "inventory": [6], "level": 2, "strength": 8 } @@ -67,7 +67,7 @@ "experience": 55, "hitPoints": 9, "intelligence": 8, - "inventory": [4], + "inventory": [6], "level": 2, "strength": 2 } @@ -85,7 +85,7 @@ "experience": 90, "hitPoints": 12, "intelligence": 6, - "inventory": [2], + "inventory": [6], "level": 3, "strength": 13 } @@ -103,7 +103,7 @@ "experience": 85, "hitPoints": 10, "intelligence": 6, - "inventory": [3], + "inventory": [6], "level": 3, "strength": 8 } @@ -121,7 +121,7 @@ "experience": 135, "hitPoints": 14, "intelligence": 7, - "inventory": [2], + "inventory": [7], "level": 4, "strength": 15 } @@ -139,7 +139,7 @@ "experience": 155, "hitPoints": 12, "intelligence": 7, - "inventory": [3], + "inventory": [9], "level": 4, "strength": 12 } @@ -157,7 +157,7 @@ "experience": 205, "hitPoints": 14, "intelligence": 12, - "inventory": [4], + "inventory": [8], "level": 5, "strength": 14 } @@ -175,7 +175,7 @@ "experience": 215, "hitPoints": 18, "intelligence": 10, - "inventory": [2], + "inventory": [7], "level": 5, "strength": 18 } @@ -193,7 +193,7 @@ "experience": 310, "hitPoints": 17, "intelligence": 18, - "inventory": [4], + "inventory": [8], "level": 6, "strength": 16 } @@ -211,7 +211,7 @@ "experience": 300, "hitPoints": 15, "intelligence": 13, - "inventory": [3], + "inventory": [9], "level": 6, "strength": 18 } @@ -229,7 +229,7 @@ "experience": 460, "hitPoints": 21, "intelligence": 14, - "inventory": [2], + "inventory": [10], "level": 7, "strength": 22 } @@ -247,7 +247,7 @@ "experience": 440, "hitPoints": 18, "intelligence": 21, - "inventory": [4], + "inventory": [8], "level": 7, "strength": 16 } @@ -265,7 +265,7 @@ "experience": 610, "hitPoints": 18, "intelligence": 14, - "inventory": [3], + "inventory": [9], "level": 8, "strength": 20 } @@ -283,7 +283,7 @@ "experience": 625, "hitPoints": 24, "intelligence": 18, - "inventory": [2], + "inventory": [10], "level": 8, "strength": 25 } @@ -301,7 +301,7 @@ "experience": 880, "hitPoints": 24, "intelligence": 25, - "inventory": [4], + "inventory": [8], "level": 9, "strength": 22 } @@ -319,7 +319,7 @@ "experience": 900, "hitPoints": 22, "intelligence": 22, - "inventory": [3], + "inventory": [9], "level": 9, "strength": 22 } @@ -337,7 +337,7 @@ "experience": 3600, "hitPoints": 28, "intelligence": 25, - "inventory": [3], + "inventory": [9], "level": 10, "strength": 26 } @@ -355,7 +355,7 @@ "experience": 4000, "hitPoints": 34, "intelligence": 27, - "inventory": [2], + "inventory": [10], "level": 10, "strength": 34 } @@ -373,7 +373,7 @@ "experience": 4000, "hitPoints": 32, "intelligence": 36, - "inventory": [4], + "inventory": [8], "level": 10, "strength": 30 } From aec07d315e284255c71e9ee0b80a459ce0faeb09 Mon Sep 17 00:00:00 2001 From: ECWireless Date: Wed, 21 Aug 2024 20:11:07 -0600 Subject: [PATCH 3/3] Deploy new garnet world --- packages/contracts/worlds.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/contracts/worlds.json b/packages/contracts/worlds.json index 3a583c902..f086d0fd4 100644 --- a/packages/contracts/worlds.json +++ b/packages/contracts/worlds.json @@ -1,10 +1,10 @@ { "17069": { - "address": "0x19ab668185117ca8be439f1912f54b5f9909a98e", - "blockNumber": 5828147 + "address": "0x70c5131bad5a524ff56f166b77f20dacd8988abe", + "blockNumber": 6060785 }, "31337": { - "address": "0xecfb9f0e5589122aab499e60b3caa4c7892dac76" + "address": "0x6573d1981ed71556d2555d051dbbe634bd51d25d" }, "84532": { "address": "0x3cf01199a18fd3900c49710563177505085371ca",