diff --git a/src/assets/images/survivors/duke.png b/src/assets/images/survivors/duke.png new file mode 100644 index 0000000..fbbf197 Binary files /dev/null and b/src/assets/images/survivors/duke.png differ diff --git a/src/assets/images/survivors/tommy.png b/src/assets/images/survivors/tommy.png new file mode 100644 index 0000000..6fce157 Binary files /dev/null and b/src/assets/images/survivors/tommy.png differ diff --git a/src/components/NewGame/styles.js b/src/components/NewGame/styles.js index 6ba0885..19269b3 100644 --- a/src/components/NewGame/styles.js +++ b/src/components/NewGame/styles.js @@ -58,6 +58,27 @@ export const CharacterArea = styled.div` return null; }} } + + @media all and (min-width: 1600px) { + ${({ number }) => { + if (number >= 8) { + return css` + top: 200px; + display: grid; + grid-template-columns: repeat(10, 1fr); + grid-template-rows: repeat(auto-fill, 100px); + `; + } + if (number) { + return css` + display: grid; + width: 90%; + grid-template-columns: repeat(${number}, 1fr); + `; + } + return null; + }} + } `; CharacterArea.displayName = 'CharacterArea'; @@ -80,6 +101,10 @@ export const CharacterImage = styled.img` css` ${activeImage} `} + +@media all and (min-width: 1600px) { + margin: 0 -20px; + } `; CharacterImage.displayName = 'CharacterImage'; @@ -145,6 +170,14 @@ export const CharacterName = styled.h1` font-size: 2rem; `} } + + @media all and (min-width: 1600px) { + top: unset; + bottom: 0; + left: -40%; + font-size: 2.4rem; + color: rgba(255, 255, 255, 0.8); + } `; CharacterName.displayName = 'CharacterName'; diff --git a/src/setup/abilities.js b/src/setup/abilities.js index 8b6b286..d0e921e 100644 --- a/src/setup/abilities.js +++ b/src/setup/abilities.js @@ -61,7 +61,7 @@ const MOVE_ACTION = { effect: ([gen, mov, att, sea, bon]) => [gen, mov + 1, att, sea, bon] }; const SEARCH_ACTION = { - name: '+1 free Search Action ', + name: '+1 free Search Action', description: 'The Survivor has one free extra Search Action. This Action may only be used to Search and the Survivor can still only Search once per turn.', effect: ([gen, mov, att, sea, bon]) => [gen, mov, att, sea + 1, bon] @@ -185,7 +185,7 @@ const TOUGH = { 'The Survivor ignores the first Attack he receives from a single Zombie every Zombies’ Phase' }; const TRICK_SHOT = { - name: 'Trick shot ', + name: 'Trick shot', description: 'When the Survivor is equipped with Dual Ranged weapons, he can aim at targets in different Zones with each weapon in the same Action.' }; @@ -229,14 +229,49 @@ export const ABILITIES_S1 = { TRICK_SHOT }; +const ACTION_MELEE = { + name: '+1 free Melee Action', + description: + 'The Survivor has one extra free Melee Combat Action. This Action may only be used for Melee Combat.', + effect: ([gen, mov, att, sea, bon]) => [ + gen, + mov, + [att[0], att[1] + 1, att[2]], + sea, + bon + ] +}; + const ACTION_RANGED = { - name: '1 free Ranged Action ', + name: '+1 free Ranged Action', description: 'The Survivor has one extra, free Ranged Combat Action. This Action can only be used for Ranged Combat.' }; +const SUPER_STRENGTH = { + name: 'Super strength', + description: + 'Consider the Damage value of Melee weapons used by the Survivor to be 3.' +}; + +const WEBBING = { + name: 'Webbing', + description: + 'All equipment in the Survivor’s inventory is considered equipped in hand.' +}; + +const ZOMBIE_LINK = { + name: 'Zombie link', + description: + 'The Survivor plays an extra turn each time an extra activation card is drawn in the Zombie pile.' +}; + export const ABILITIES_MALL = { - ACTION_RANGED + ACTION_MELEE, + ACTION_RANGED, + SUPER_STRENGTH, + WEBBING, + ZOMBIE_LINK }; const REAPER_RANGED = { @@ -249,13 +284,76 @@ const BLITZ = { description: 'Each time your Survivor kills the last Zombie of a Zone, he gets 1 free Move Action to use immediately' }; - +const BLOODLUST_MELEE = { + name: 'Bloodlust: Melee', + description: + 'Spend one Action with the Survivor: He moves up to two Zones to a Zone containing at least one Zombie (or rival Survivor). He then gains one free Melee Action' +}; +const REAPER_COMBAT = { + name: 'Reaper: Combat', + description: + 'Use this Skill when assigning hits while resolving a Combat Action. One of these hits can freely kill an additional identical Zombie in the same Zone. Only a single additional Zombie can be killed per Action when using this Skill..', + effect: ({ combat, melee, ranged }) => ({ combat: combat + 1, melee, ranged }) +}; +const REAPER_MELEE = { + name: 'Reaper: Melee', + description: + 'Use this Skill when assigning hits while resolving a Ranged Action. One of these hits can freely kill an additional identical Zombie in the same Zone. Only a single additional Zombie can be killed per Action when using this Skill.', + effect: ({ combat, melee, ranged }) => ({ combat, melee: melee + 1, ranged }) +}; +const REAPER_RANGED = { + name: 'Reaper: Ranged', + description: + 'Use this Skill when assigning hits while resolving a Ranged Action. One of these hits can freely kill an additional identical Zombie in the same Zone. Only a single additional Zombie can be killed per Action when using this Skill.', + effect: ({ combat, melee, ranged }) => ({ combat, melee, ranged: ranged + 1 }) +}; +const TAUNT = { + name: 'Taunt', + description: + 'The Survivor can use this Skill, for free, once during each of his Activations. Select a Zone your Survivor can see. All Zombies standing in the selected Zone immediately gain an extra Activation: They try to reach the taunting Survivor by any means available. Taunted Zombies ignore all other Survivors. They do not attack them and cross the Zone they stand in if needed to reach the taunting Survivor.' +}; +const TACTICIAN = { + name: 'Tactician', + description: + 'The Survivor’s turn can be resolved anytime during the Players’ Phase, before or after any other Survivor’s turn. If several teammates benefit from this Skill at the same time, the team’s players choose their activation order.' +}; export const ABILITIES_S2 = { + BLITZ, + BLOODLUST_MELEE, + REAPER_COMBAT, + REAPER_MELEE, REAPER_RANGED, - BLITZ + TAUNT, + TACTICIAN +}; + +const HIT_N_RUN = { + name: 'Hit & Run', + description: + 'The Survivor can use this Skill for free, just after he resolved Melee or Ranged Combat Action resulting in at least a Zombie kill (or a rival Survivor kill). He can then resolve a free Move Action. The Survivor does not spend extra Actions to perform this free Move Action if Zombies are standing in his Zone.' +}; +const SEARCH_PLUS_ONE = { + name: 'Search: +1 card', + description: 'Draw an extra card when Searching with the Survivor.' +}; +export const ABILITIES_S3 = { + HIT_N_RUN, + SEARCH_PLUS_ONE +}; + +const CANT_BE_THAT_UNLUCKY = { + name: "Can't be THAT unlucy", + description: + 'Unlucky with dice results? Not anymore... Re-roll once any 1 on dice rolls.' +}; +export const NIGHT_SHIFT = { + CANT_BE_THAT_UNLUCKY }; export const ALL_ABILITIES = { ...ABILITIES_S1, - ...ABILITIES_S2 + ...ABILITIES_MALL, + ...ABILITIES_S2, + ...ABILITIES_S3, + ...NIGHT_SHIFT }; diff --git a/src/setup/characters.js b/src/setup/characters.js index d7311ad..9d47420 100644 --- a/src/setup/characters.js +++ b/src/setup/characters.js @@ -1,74 +1,102 @@ /* eslint-disable no-unused-vars */ import Amy from '../assets/images/survivors/amy.png'; import Ben from '../assets/images/survivors/ben.png'; +import Clara from '../assets/images/survivors/clara.png'; +import Debra from '../assets/images/survivors/debra.png'; +import Doug from '../assets/images/survivors/doug.png'; +import Duke from '../assets/images/survivors/duke.png'; +import Josh from '../assets/images/survivors/josh.png'; import Mary from '../assets/images/survivors/mary.png'; import Ned from '../assets/images/survivors/ned.png'; import Phil from '../assets/images/survivors/phil.png'; +import Ruiz from '../assets/images/survivors/ruiz.png'; +import Tommy from '../assets/images/survivors/tommy.png'; import Wanda from '../assets/images/survivors/wanda.png'; -import Josh from '../assets/images/survivors/josh.png'; -import Doug from '../assets/images/survivors/doug.png'; -import AmyFace from '../assets/images/survivors/faces/amy-face.png'; -import BenFace from '../assets/images/survivors/faces/ben-face.png'; -import MaryFace from '../assets/images/survivors/faces/mary-face.png'; -import NedFace from '../assets/images/survivors/faces/ned-face.png'; -import PhilFace from '../assets/images/survivors/faces/phil-face.png'; -import WandaFace from '../assets/images/survivors/faces/wanda-face.png'; -import JoshFace from '../assets/images/survivors/faces/josh-face.png'; -import DougFace from '../assets/images/survivors/faces/doug-face.png'; +import AmyFace from '../assets/images/survivors/amy-face.png'; +import BenFace from '../assets/images/survivors/ben-face.png'; +import ClaraFace from '../assets/images/survivors/clara-face.png'; +import DebraFace from '../assets/images/survivors/debra-face.png'; +import DougFace from '../assets/images/survivors/doug-face.png'; +import DukeFace from '../assets/images/survivors/duke-face.png'; +import JoshFace from '../assets/images/survivors/josh-face.png'; +import MaryFace from '../assets/images/survivors/mary-face.png'; +import NedFace from '../assets/images/survivors/ned-face.png'; +import PhilFace from '../assets/images/survivors/phil-face.png'; +import RuizFace from '../assets/images/survivors/ruiz-face.png'; +import TommyFace from '../assets/images/survivors/tommy-face.png'; +import WandaFace from '../assets/images/survivors/wanda-face.png'; -import SelectorAmy from '../assets/images/survivors/selectors/selector-amy.png'; -import SelectorBen from '../assets/images/survivors/selectors/selector-ben.png'; -import SelectorMary from '../assets/images/survivors/selectors/selector-mary.png'; -import SelectorNed from '../assets/images/survivors/selectors/selector-ned.png'; -import SelectorPhil from '../assets/images/survivors/selectors/selector-phil.png'; -import SelectorWanda from '../assets/images/survivors/selectors/selector-wanda.png'; -import SelectorJosh from '../assets/images/survivors/selectors/selector-josh.png'; -import SelectorDoug from '../assets/images/survivors/selectors/selector-doug.png'; +import SelectorAmy from '../assets/images/selectors/selector-amy.png'; +import SelectorBen from '../assets/images/selectors/selector-ben.png'; +import SelectorClara from '../assets/images/selectors/selector-clara.png'; +import SelectorDebra from '../assets/images/selectors/selector-debra.png'; +import SelectorDoug from '../assets/images/selectors/selector-doug.png'; +import SelectorDuke from '../assets/images/selectors/selector-duke.png'; +import SelectorJosh from '../assets/images/selectors/selector-josh.png'; +import SelectorMary from '../assets/images/selectors/selector-mary.png'; +import SelectorNed from '../assets/images/selectors/selector-ned.png'; +import SelectorPhil from '../assets/images/selectors/selector-phil.png'; +import SelectorRuiz from '../assets/images/selectors/selector-ruiz.png'; +import SelectorTommy from '../assets/images/selectors/selector-tommy.png'; +import SelectorWanda from '../assets/images/selectors/selector-wanda.png'; import { FEMALE, MALE } from '../constants'; import { ABILITIES_S1, ABILITIES_S2, ABILITIES_MALL } from './abilities'; const { ACTION, + ACTION_MELEE, + ACTION_RANGED, + ALL_YOUVE_GOT, + AMBIDEXTROUS, + BLITZ, + BLOODLUST_MELEE, + BORN_LEADER, + CANT_BE_THAT_UNLUCKY, + COMBAT_ACTION, DAMAGEMELEE, DAMAGE_RANGED, + DESTINY, DICE_ROLL_COMBAT, DICE_ROLL_MEELEE, DICE_ROLL_RANGED, DIE_COMBAT, DIE_MELEE, DIE_RANGED, - COMBAT_ACTION, - MOVE_ACTION, - SEARCH_ACTION, - MAX_RANGE, - ZONE_PER_MOVE, - RE_ROLL, - TWO_COCKTAILS, - TWO_ZONES_MOVE, - AMBIDEXTROUS, - BORN_LEADER, - DESTINY, GUNSLINGER, - HEARD, + HOARD, + HIT_N_RUN, HOLD_YOUR_NOSE, - ALL_YOUVE_GOT, LOCK_IT_DOWN, LOUD, LUCKY, MATCHING_SET, + MAX_RANGE, MEDIC, + MOVE_ACTION, NINJA, + REAPER_COMBAT, + REAPER_MELEE, + REAPER_RANGED, + RE_ROLL, + SEARCH_ACTION, + SEARCH_PLUS_ONE, SLIPPERY, SNIPER, STARTS_WITH, + SUPER_STRENGTH, SWORDMASTER, + TACTICIAN, + TAUNT, TOUGH, - TRICK_SHOT -} = ABILITIES_S1; -const { REAPER_RANGED, BLITZ } = ABILITIES_S2; -const { ACTION_RANGED } = ABILITIES_MALL; + TRICK_SHOT, + TWO_COCKTAILS, + TWO_ZONES_MOVE, + WEBBING, + ZOMBIE_LINK, + ZONE_PER_MOVE +} = ALL_ABILITIES; export const CHARACTERS_S1 = { Amy: { @@ -288,5 +316,116 @@ export const CHARACTERS_KOPINSKI = { selector: SelectorMary, voice: FEMALE, wounded: false + }, + Duke: { + abilities: [], + abilitiesUsed: [], + actions: [3, 0, [0, 0, 0], 0, 0], + actionsLeft: [3, 0, [0, 0, 0], 0, 0], + bonusDice: { combat: 0, melee: 0, ranged: 0 }, + color: '#537c6f', + experience: 0, + face: DukeFace, + img: Duke, + inReserve: [null, null, null], + inHand: [null, null], + location: null, + movement: 'confident', + name: 'Duke', + noise: 0, + player: null, + promotions: { + blue: SUPER_STRENGTH, + yellow: ACTION, + orange: [TAUNT, HOARD], + red: [REAPER_MELEE, COMBAT_ACTION, ALL_YOUVE_GOT] + }, + selector: SelectorDuke, + voice: MALE, + wounded: false + }, + Ruiz: { + abilities: [], + abilitiesUsed: [], + actions: [3, 0, [0, 0, 0], 0, 0], + actionsLeft: [3, 0, [0, 0, 0], 0, 0], + bonusDice: { combat: 0, melee: 0, ranged: 0 }, + color: '#3e4c84', + experience: 0, + face: RuizFace, + img: Ruiz, + inReserve: [null, null, null], + inHand: [null, null], + location: null, + movement: 'normal', + name: 'Ruiz', + noise: 0, + player: null, + promotions: { + blue: WEBBING, + yellow: ACTION, + orange: [SEARCH_PLUS_ONE, BORN_LEADER], + red: [DIE_RANGED, TACTICIAN, BLOODLUST_MELEE] + }, + selector: SelectorRuiz, + voice: MALE, + wounded: false + } +}; + +export const CHARACTERS_NIGHT_SHIFT = { + Duke: { + abilities: [], + abilitiesUsed: [], + actions: [3, 0, [0, 0, 0], 0, 0], + actionsLeft: [3, 0, [0, 0, 0], 0, 0], + bonusDice: { combat: 0, melee: 0, ranged: 0 }, + color: '#537c6f', + experience: 0, + face: DukeFace, + img: Duke, + inReserve: [null, null, null], + inHand: [null, null], + location: null, + movement: 'confident', + name: 'Duke', + noise: 0, + player: null, + promotions: { + blue: SUPER_STRENGTH, + yellow: ACTION, + orange: [TAUNT, HOARD], + red: [REAPER_MELEE, COMBAT_ACTION, ALL_YOUVE_GOT] + }, + selector: SelectorDuke, + voice: MALE, + wounded: false + }, + Ruiz: { + abilities: [], + abilitiesUsed: [], + actions: [3, 0, [0, 0, 0], 0, 0], + actionsLeft: [3, 0, [0, 0, 0], 0, 0], + bonusDice: { combat: 0, melee: 0, ranged: 0 }, + color: '#3e4c84', + experience: 0, + face: RuizFace, + img: Ruiz, + inReserve: [null, null, null], + inHand: [null, null], + location: null, + movement: 'normal', + name: 'Ruiz', + noise: 0, + player: null, + promotions: { + blue: WEBBING, + yellow: ACTION, + orange: [SEARCH_PLUS_ONE, BORN_LEADER], + red: [DIE_RANGED, TACTICIAN, BLOODLUST_MELEE] + }, + selector: SelectorRuiz, + voice: MALE, + wounded: false } };