From 0b4af07407d64b23eb4b7662a3f0fe71e86e7dfc Mon Sep 17 00:00:00 2001 From: Melvin Valster Date: Mon, 22 Jul 2019 22:58:32 +0200 Subject: [PATCH] Add arrow active state --- .../arrows/{down2.png => down-active.png} | Bin public/images/arrows/left-active.png | Bin 0 -> 2033 bytes public/images/arrows/leftdown-active.png | Bin 0 -> 1940 bytes public/images/arrows/right-active.png | Bin 0 -> 2032 bytes public/images/arrows/rightdown-active.png | Bin 0 -> 1960 bytes src/components/Arrow.scss | 18 +++++++++-- src/components/Arrow.tsx | 4 ++- src/components/TalentTree.tsx | 5 +-- src/lib/tree.ts | 30 +++++++++++------- 9 files changed, 40 insertions(+), 17 deletions(-) rename public/images/arrows/{down2.png => down-active.png} (100%) create mode 100644 public/images/arrows/left-active.png create mode 100644 public/images/arrows/leftdown-active.png create mode 100644 public/images/arrows/right-active.png create mode 100644 public/images/arrows/rightdown-active.png diff --git a/public/images/arrows/down2.png b/public/images/arrows/down-active.png similarity index 100% rename from public/images/arrows/down2.png rename to public/images/arrows/down-active.png diff --git a/public/images/arrows/left-active.png b/public/images/arrows/left-active.png new file mode 100644 index 0000000000000000000000000000000000000000..c11d7d5758d330319216f328e9d1d2f174ed5814 GIT binary patch literal 2033 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 = ({ from, to }) => { +export const Arrow: FC = ({ from, to, active = false }) => { const length = to.row === from.row ? Math.abs(to.col - from.col) : to.row - from.row @@ -19,6 +20,7 @@ export const Arrow: FC = ({ from, to }) => { } const className = classNames('arrow', { + 'arrow--active': active, 'arrow--down': to.row > from.row, 'arrow--right': to.row === from.row && to.col > from.col, 'arrow--left': to.row === from.row && to.col < from.col, diff --git a/src/components/TalentTree.tsx b/src/components/TalentTree.tsx index 4706c14..6d72720 100644 --- a/src/components/TalentTree.tsx +++ b/src/components/TalentTree.tsx @@ -1,7 +1,7 @@ import React, { useCallback } from 'react' import { Map } from 'immutable' import { TalentSlot } from './TalentSlot'; -import { getPointsInSpec } from '../lib/tree'; +import { getPointsInSpec, canLearnTalent } from '../lib/tree'; import { talentsBySpec, specNames, talentsById } from '../data/talents' import { Arrow } from './Arrow' @@ -34,7 +34,8 @@ export const TalentTree: React.FC = ({ specId, knownTalents, availablePoi return 0 || canLearnTalent(knownTalents, talent)} /> }) diff --git a/src/lib/tree.ts b/src/lib/tree.ts index efc7483..ddaf6bf 100644 --- a/src/lib/tree.ts +++ b/src/lib/tree.ts @@ -43,31 +43,39 @@ export function calcMeetsRequirements(talent: TalentData, known: Map, talent: TalentData): Map => { - const currentPoints = known.get(talent.id, 0) - - // Reached the max rank? - if (currentPoints >= talent.ranks.length) { - return known +export const canLearnTalent = (known: Map, talent: TalentData): boolean => { + // Reached the max rank? + if (known.get(talent.id, 0) >= talent.ranks.length) { + return false } // Spend a maximum of 51 points if (calcAvailablePoints(known) === 0) { - return known + return false } // Support for specific Talent dependency requirement. if (talent.requires.length > 0 && !calcMeetsRequirements(talent, known)) { - return known + return false } // Check we have the required amount of points spent in the tree for this talent const requiredPoints = talent.row * 5 const pointsInSpec = getPointsInSpec(talentToSpec[talent.id], known) if (requiredPoints > pointsInSpec) { + return false + } + + return true +} + +/** + * Adds a single talent point to the Map, if possible. + */ +export const addTalentPoint = (known: Map, talent: TalentData): Map => { + const currentPoints = known.get(talent.id, 0) + + if (!canLearnTalent(known, talent)) { return known }