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",