Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 25 additions & 28 deletions packages/client/src/components/ItemCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,14 @@ import {
Box,
Card,
CardBody,
CardFooter,
CardHeader,
Center,
HStack,
Stack,
Text,
} from '@chakra-ui/react';
import { FaHatWizard } from 'react-icons/fa';
import { GiAxeSword, GiRogue } from 'react-icons/gi';

import { type Armor, StatsClasses, type Weapon } from '../utils/types';
import { type Armor, type Weapon } from '../utils/types';

const getStatSymbol = (stat: string): string => (Number(stat) >= 0 ? '+' : '');

Expand All @@ -29,8 +26,8 @@ export const ItemCard: React.FC<ItemCardProps> = ({
const {
agiModifier,
balance,
classRestrictions,
intModifier,
statRestrictions,
strModifier,
name,
} = item;
Expand Down Expand Up @@ -66,30 +63,30 @@ export const ItemCard: React.FC<ItemCardProps> = ({
</Text>
</Text>

<Text size={{ base: '2xs', sm: 'sm' }}>
STR{getStatSymbol(strModifier)}
{strModifier} AGI{getStatSymbol(agiModifier)}
{agiModifier} INT{getStatSymbol(intModifier)}
{intModifier}{' '}
{(item as Armor).armorModifier
? `ARM${getStatSymbol((item as Armor).armorModifier)}${(item as Armor).armorModifier}`
: ''}
</Text>
<HStack alignItems="start">
<Text fontWeight="bold" size={{ base: '2xs', sm: 'sm' }}>
Mods:
</Text>
<Text size={{ base: '2xs', sm: 'sm' }}>
STR {getStatSymbol(strModifier)}
{strModifier} AGI {getStatSymbol(agiModifier)}
{agiModifier} INT {getStatSymbol(intModifier)}
{intModifier}{' '}
{(item as Armor).armorModifier
? `ARM ${getStatSymbol((item as Armor).armorModifier)}${(item as Armor).armorModifier}`
: ''}
</Text>
</HStack>
<HStack alignItems="start">
<Text fontWeight="bold" size={{ base: '2xs', sm: 'sm' }}>
Requirements:
</Text>
<Text size={{ base: '2xs', sm: 'sm' }}>
STR {statRestrictions.minStrength} AGI {statRestrictions.minAgility}{' '}
INT {statRestrictions.minIntelligence}
</Text>
</HStack>
</CardBody>

<CardFooter>
<Center>
{classRestrictions.includes(StatsClasses.Warrior) && (
<GiAxeSword size={28} />
)}
{classRestrictions.includes(StatsClasses.Rogue) && (
<GiRogue size={28} />
)}
{classRestrictions.includes(StatsClasses.Mage) && (
<FaHatWizard size={28} />
)}
</Center>
</CardFooter>
</Card>
);
};
Expand Down
14 changes: 12 additions & 2 deletions packages/client/src/contexts/CharacterContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -272,12 +272,17 @@ export const CharacterProvider = ({
agiModifier: decodedArmorStats.agiModifier,
armorModifier: decodedArmorStats.armorModifier,
balance: item.balance,
classRestrictions: decodedArmorStats.classRestrictions,
hitPointModifier: decodedArmorStats.hitPointModifier,
intModifier: decodedArmorStats.intModifier,
itemId: item.itemId,
minLevel: decodedArmorStats.minLevel,
owner: item.owner,
statRestrictions: {
minAgility: decodedArmorStats.statRestrictions.minAgility,
minIntelligence:
decodedArmorStats.statRestrictions.minIntelligence,
minStrength: decodedArmorStats.statRestrictions.minStrength,
},
strModifier: decodedArmorStats.strModifier,
tokenId: item.tokenId,
} as Armor;
Expand Down Expand Up @@ -312,14 +317,19 @@ export const CharacterProvider = ({
...metadata,
agiModifier: decodedWeaponStats.agiModifier,
balance: item.balance,
classRestrictions: decodedWeaponStats.classRestrictions,
hitPointModifier: decodedWeaponStats.hitPointModifier,
intModifier: decodedWeaponStats.intModifier,
itemId: item.itemId,
maxDamage: decodedWeaponStats.maxDamage,
minDamage: decodedWeaponStats.minDamage,
minLevel: decodedWeaponStats.minLevel,
owner: item.owner,
statRestrictions: {
minAgility: decodedWeaponStats.statRestrictions.minAgility,
minIntelligence:
decodedWeaponStats.statRestrictions.minIntelligence,
minStrength: decodedWeaponStats.statRestrictions.minStrength,
},
strModifier: decodedWeaponStats.strModifier,
tokenId: item.tokenId,
} as Weapon;
Expand Down
14 changes: 12 additions & 2 deletions packages/client/src/pages/Character.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -540,11 +540,16 @@ const ItemsPanel = ({ character }: { character: Character }): JSX.Element => {
agiModifier: decodedArmorStats.agiModifier,
armorModifier: decodedArmorStats.armorModifier,
balance: item.balance,
classRestrictions: decodedArmorStats.classRestrictions,
hitPointModifier: decodedArmorStats.hitPointModifier,
intModifier: decodedArmorStats.intModifier,
itemId: item.itemId,
owner: item.owner,
statRestrictions: {
minAgility: decodedArmorStats.statRestrictions.minAgility,
minIntelligence:
decodedArmorStats.statRestrictions.minIntelligence,
minStrength: decodedArmorStats.statRestrictions.minStrength,
},
strModifier: decodedArmorStats.strModifier,
tokenId: item.tokenId,
} as Armor;
Expand Down Expand Up @@ -573,14 +578,19 @@ const ItemsPanel = ({ character }: { character: Character }): JSX.Element => {
...metadata,
agiModifier: decodedWeaponStats.agiModifier,
balance: item.balance,
classRestrictions: decodedWeaponStats.classRestrictions,
hitPointModifier: decodedWeaponStats.hitPointModifier,
intModifier: decodedWeaponStats.intModifier,
itemId: item.itemId,
maxDamage: decodedWeaponStats.maxDamage,
minDamage: decodedWeaponStats.minDamage,
minLevel: decodedWeaponStats.minLevel,
owner: item.owner,
statRestrictions: {
minAgility: decodedWeaponStats.statRestrictions.minAgility,
minIntelligence:
decodedWeaponStats.statRestrictions.minIntelligence,
minStrength: decodedWeaponStats.statRestrictions.minStrength,
},
strModifier: decodedWeaponStats.strModifier,
tokenId: item.tokenId,
} as Weapon;
Expand Down
14 changes: 12 additions & 2 deletions packages/client/src/pages/CharacterCreation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,14 @@ export const CharacterCreation = (): JSX.Element => {
return {
agiModifier: decodedArmorStats.agiModifier,
armorModifier: decodedArmorStats.armorModifier,
classRestrictions: decodedArmorStats.classRestrictions,
hitPointModifier: decodedArmorStats.hitPointModifier,
intModifier: decodedArmorStats.intModifier,
statRestrictions: {
minAgility: decodedArmorStats.statRestrictions.minAgility,
minIntelligence:
decodedArmorStats.statRestrictions.minIntelligence,
minStrength: decodedArmorStats.statRestrictions.minStrength,
},
strModifier: decodedArmorStats.strModifier,
...fetachedMetadata,
} as Armor;
Expand Down Expand Up @@ -153,12 +158,17 @@ export const CharacterCreation = (): JSX.Element => {

return {
agiModifier: decodedWeaponStats.agiModifier,
classRestrictions: decodedWeaponStats.classRestrictions,
hitPointModifier: decodedWeaponStats.hitPointModifier,
intModifier: decodedWeaponStats.intModifier,
maxDamage: decodedWeaponStats.maxDamage,
minDamage: decodedWeaponStats.minDamage,
minLevel: decodedWeaponStats.minLevel,
statRestrictions: {
minAgility: decodedWeaponStats.statRestrictions.minAgility,
minIntelligence:
decodedWeaponStats.statRestrictions.minIntelligence,
minStrength: decodedWeaponStats.statRestrictions.minStrength,
},
strModifier: decodedWeaponStats.strModifier,
...fetachedMetadata,
} as Weapon;
Expand Down
45 changes: 31 additions & 14 deletions packages/client/src/utils/helpers.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
import { decodeAbiParameters, hexToBigInt } from 'viem';

import {
type ArmorStats,
type Metadata,
StatsClasses,
WeaponStats,
} from '../utils/types';
import { type ArmorStats, type Metadata, WeaponStats } from '../utils/types';

export const decodeArmorStats = (statsBytes: string): ArmorStats => {
const itemTemplateStats = decodeAbiParameters(
Expand All @@ -16,10 +11,18 @@ export const decodeArmorStats = (statsBytes: string): ArmorStats => {
components: [
{ name: 'agiModifier', type: 'int256' },
{ name: 'armorModifier', type: 'uint256' },
{ name: 'classRestrictions', type: 'uint8[]' },
{ name: 'hitPointModifier', type: 'int256' },
{ name: 'intModifier', type: 'int256' },
{ name: 'minLevel', type: 'uint256' },
{
name: 'statRestrictions',
type: 'tuple',
components: [
{ name: 'minAgility', type: 'uint256' },
{ name: 'minIntelligence', type: 'uint256' },
{ name: 'minStrength', type: 'uint256' },
],
},
{ name: 'strModifier', type: 'int256' },
],
},
Expand All @@ -30,12 +33,15 @@ export const decodeArmorStats = (statsBytes: string): ArmorStats => {
return {
agiModifier: itemTemplateStats.agiModifier.toString(),
armorModifier: itemTemplateStats.armorModifier.toString(),
classRestrictions: itemTemplateStats.classRestrictions.map(
(classRestriction: number) => classRestriction as StatsClasses,
),
hitPointModifier: itemTemplateStats.hitPointModifier.toString(),
intModifier: itemTemplateStats.intModifier.toString(),
minLevel: itemTemplateStats.minLevel.toString(),
statRestrictions: {
minAgility: itemTemplateStats.statRestrictions.minAgility.toString(),
minIntelligence:
itemTemplateStats.statRestrictions.minIntelligence.toString(),
minStrength: itemTemplateStats.statRestrictions.minStrength.toString(),
},
strModifier: itemTemplateStats.strModifier.toString(),
};
};
Expand Down Expand Up @@ -83,12 +89,20 @@ export const decodeWeaponStats = (statsBytes: string): WeaponStats => {
type: 'tuple',
components: [
{ name: 'agiModifier', type: 'int256' },
{ name: 'classRestrictions', type: 'uint8[]' },
{ name: 'hitPointModifier', type: 'int256' },
{ name: 'intModifier', type: 'int256' },
{ name: 'maxDamage', type: 'uint256' },
{ name: 'minDamage', type: 'uint256' },
{ name: 'minLevel', type: 'uint256' },
{
name: 'statRestrictions',
type: 'tuple',
components: [
{ name: 'minAgility', type: 'uint256' },
{ name: 'minIntelligence', type: 'uint256' },
{ name: 'minStrength', type: 'uint256' },
],
},
{ name: 'strModifier', type: 'int256' },
],
},
Expand All @@ -98,14 +112,17 @@ export const decodeWeaponStats = (statsBytes: string): WeaponStats => {

return {
agiModifier: itemTemplateStats.agiModifier.toString(),
classRestrictions: itemTemplateStats.classRestrictions.map(
(classRestriction: number) => classRestriction as StatsClasses,
),
hitPointModifier: itemTemplateStats.hitPointModifier.toString(),
intModifier: itemTemplateStats.intModifier.toString(),
maxDamage: itemTemplateStats.maxDamage.toString(),
minDamage: itemTemplateStats.minDamage.toString(),
minLevel: itemTemplateStats.minLevel.toString(),
statRestrictions: {
minAgility: itemTemplateStats.statRestrictions.minAgility.toString(),
minIntelligence:
itemTemplateStats.statRestrictions.minIntelligence.toString(),
minStrength: itemTemplateStats.statRestrictions.minStrength.toString(),
},
strModifier: itemTemplateStats.strModifier.toString(),
};
};
Expand Down
10 changes: 8 additions & 2 deletions packages/client/src/utils/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ export type Armor = ArmorStats &
export type ArmorStats = {
agiModifier: string;
armorModifier: string;
classRestrictions: StatsClasses[];
hitPointModifier: string;
intModifier: string;
minLevel: string;
statRestrictions: StatRestrictions;
strModifier: string;
};

Expand Down Expand Up @@ -132,12 +132,12 @@ export type Weapon = WeaponStats &

export type WeaponStats = {
agiModifier: string;
classRestrictions: StatsClasses[];
hitPointModifier: string;
intModifier: string;
maxDamage: string;
minDamage: string;
minLevel: string;
statRestrictions: StatRestrictions;
strModifier: string;
};

Expand Down Expand Up @@ -167,3 +167,9 @@ export type ConsiderationData = {
tokenType: string;
recipient: string;
};

export type StatRestrictions = {
minAgility: string;
minIntelligence: string;
minStrength: string;
};
Loading