Skip to content

Commit a9a8a18

Browse files
committed
add african empire cards
use multi-automa instead of actual automa card in deck
1 parent 6810745 commit a9a8a18

File tree

9 files changed

+182
-48
lines changed

9 files changed

+182
-48
lines changed

src/services/Bot.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import BotCardAction from './BotCardAction'
88
import Card, { CardAction } from './Card'
99
import toCardNames from '@/util/toCardNames'
1010
import toCards from '@/util/toCards'
11+
import CardName from './enum/CardName'
12+
import Cards from './Cards'
13+
import Expansion from './enum/Expansion'
14+
import Module from './enum/Module'
1115

1216
export default class Bot {
1317

@@ -90,26 +94,31 @@ export default class Bot {
9094
*/
9195
public drawCard(inspector? : (card: Card) => DrawCardInspection) : Card {
9296
this._cardDeck.discardAll()
93-
const card = this._cardDeck.draw()
97+
const drawnCard = this._cardDeck.draw()
98+
let actualCard = drawnCard
99+
if (actualCard.name == CardName.MULTI_AUTOMA) {
100+
// Replace multi-automa card with actual civilization card
101+
actualCard = Cards.getCivilization(this._civilization.name)
102+
}
94103
let actions : CardAction[]
95104
if (inspector) {
96-
const inspection = inspector(card)
105+
const inspection = inspector(actualCard)
97106
if (inspection.accept ?? true) {
98-
actions = inspection.actions ?? card.actions
107+
actions = inspection.actions ?? actualCard.actions
99108
}
100109
else {
101-
this._cardDeck.discardCard(card)
110+
this._cardDeck.discardCard(drawnCard)
102111
return this.drawCard(inspector)
103112
}
104113
}
105114
else {
106-
actions = this.filterByCivilizationType(card.actions)
115+
actions = this.filterByCivilizationType(actualCard.actions)
107116
}
108117
const cardNumber = this._cardsDrawn.length + 1
109118
this.addActions(cardNumber, actions)
110-
this._cardsDrawn.push(card)
119+
this._cardsDrawn.push(drawnCard)
111120
this.checkNextActionPlayAutomatically()
112-
return card
121+
return actualCard
113122
}
114123

115124
/**
@@ -226,9 +235,10 @@ export default class Bot {
226235
/**
227236
* Creates a new bot for a new game.
228237
*/
229-
public static new(numAdvancedCards: number, civilizationName: CivilizationName, gold: number) : Bot {
238+
public static new(numAdvancedCards: number, civilizationName: CivilizationName, gold: number,
239+
expansions: Expansion[], modules: Module[]) : Bot {
230240
const civilization = Civilizations.get(civilizationName)
231-
const cardDeck = CardDeck.new(numAdvancedCards, civilizationName)
241+
const cardDeck = CardDeck.new(numAdvancedCards, expansions, modules)
232242
return new Bot(civilization, cardDeck, gold, 0, [], [], 0)
233243
}
234244

src/services/Card.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@ import Action from './enum/Action'
22
import CardName from './enum/CardName'
33
import CivilizationType from './enum/CivilizationType'
44
import CivilizationName from './enum/CivilizationName'
5+
import Expansion from './enum/Expansion'
6+
import Module from './enum/Module'
57

68
export default interface Card {
79
name: CardName
810
actions: CardAction[],
911
advanced?: boolean,
1012
civilization?: CivilizationName
13+
expansion?: Expansion
14+
module?: Module
1115
}
1216

1317
export interface CardAction {

src/services/CardDeck.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { shuffle, remove, random } from 'lodash'
22
import Card from './Card'
33
import Cards from './Cards'
4-
import CivilizationName from './enum/CivilizationName'
54
import { CardDeckPersistence } from '@/store/state'
65
import toCardNames from '@/util/toCardNames'
76
import toCards from '@/util/toCards'
7+
import Expansion from './enum/Expansion'
8+
import Module from './enum/Module'
89

910
export default class CardDeck {
1011

@@ -116,12 +117,12 @@ export default class CardDeck {
116117
/**
117118
* Creates a shuffled new card deck with random advanced cards.
118119
*/
119-
public static new(numAdvancedCards: number, civilizationName: CivilizationName) : CardDeck {
120+
public static new(numAdvancedCards: number,
121+
expansions: Expansion[], modules: Module[]) : CardDeck {
120122
// prepare draw pile
121123
const drawPile : Card[] = []
122-
drawPile.push(...Cards.getStandard())
123-
drawPile.push(...CardDeck.pickRandomAdvancedCards(numAdvancedCards))
124-
drawPile.push(Cards.getCivilization(civilizationName))
124+
drawPile.push(...Cards.getStandard(expansions, modules))
125+
drawPile.push(...CardDeck.pickRandomAdvancedCards(numAdvancedCards, expansions, modules))
125126
const cardDeck = new CardDeck(drawPile, [], [], [])
126127
cardDeck.shuffleDiscardDrawPile()
127128
return cardDeck
@@ -142,11 +143,12 @@ export default class CardDeck {
142143
/**
143144
* Randomly picks the given number of advanced cards.
144145
*/
145-
private static pickRandomAdvancedCards(numAdvancedCards: number) : Card[] {
146+
private static pickRandomAdvancedCards(numAdvancedCards: number,
147+
expansions: Expansion[], modules: Module[]) : Card[] {
146148
const advancedCards : Card[] = []
147149

148150
if (numAdvancedCards > 0) {
149-
const allAdvancedCards = Cards.getAdvanced()
151+
const allAdvancedCards = Cards.getAdvanced(expansions, modules)
150152
if (numAdvancedCards >= allAdvancedCards.length) {
151153
advancedCards.push(...allAdvancedCards)
152154
}

src/services/Cards.ts

Lines changed: 87 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import CivilizationType from './enum/CivilizationType'
44
import Action from './enum/Action'
55
import CivilizationName from './enum/CivilizationName'
66
import findMandatory from '@brdgm/brdgm-commons/src/util/map/findMandatory'
7+
import Expansion from './enum/Expansion'
8+
import Module from './enum/Module'
79

8-
const cards = [
10+
const cards : Card[] = [
911
/* Standard Action Cards */
1012
{ name: CardName.CONQUER_IF_ARCHITECTURAL, actions: [
1113
{ action: Action.CONQUER_1_ADJACENT_LOWEST_COST },
@@ -104,6 +106,48 @@ const cards = [
104106
{ action: Action.BUILDING_TAKE_LOWEST_COST },
105107
{ action: Action.DEVELOP_1_CULTURAL_POLICY_2_GOLD_PER_POLICY, ifType: CivilizationType.CULTURAL },
106108
]},
109+
{ name: CardName.TRADE_TRACK_IF_ARCHITECTURAL, expansion:Expansion.AFRICAN_EMPIRES, actions: [
110+
{ action: Action.TRADE_TRACK_1_STEP },
111+
{ action: Action.TRADE_TRACK_1_STEP, gold: 1 },
112+
{ action: Action.TRADE_TRACK_1_STEP, gold: 1 },
113+
{ action: Action.DRAW_RESERVE_CARD_2_GAIN_WONDERS, ifType: CivilizationType.ARCHITECTURAL },
114+
]},
115+
{ name: CardName.TRADE_TRACK_IF_CULTURAL, expansion:Expansion.AFRICAN_EMPIRES, actions: [
116+
{ action: Action.TRADE_TRACK_1_STEP },
117+
{ action: Action.TRADE_TRACK_1_STEP, gold: 1 },
118+
{ action: Action.TRADE_TRACK_1_STEP, gold: 1 },
119+
{ action: Action.GAIN_2_GOLD_PER_POLICY, ifType: CivilizationType.CULTURAL },
120+
]},
121+
{ name: CardName.TRADE_TRACK_IF_ECONOMIC, expansion:Expansion.AFRICAN_EMPIRES, actions: [
122+
{ action: Action.TRADE_TRACK_1_STEP },
123+
{ action: Action.TRADE_TRACK_1_STEP, gold: 1 },
124+
{ action: Action.TRADE_TRACK_1_STEP, gold: 1 },
125+
{ action: Action.TRADE_TRACK_2_STEP, ifType: CivilizationType.ECONOMIC },
126+
]},
127+
{ name: CardName.TRADE_TRACK_IF_TECHNOLOGICAL, expansion:Expansion.AFRICAN_EMPIRES, actions: [
128+
{ action: Action.TRADE_TRACK_1_STEP },
129+
{ action: Action.TRADE_TRACK_1_STEP, gold: 1 },
130+
{ action: Action.TRADE_TRACK_1_STEP, gold: 1 },
131+
{ action: Action.DRAW_RESERVE_CARD_3_GAIN_KNOWLEDGE, ifType: CivilizationType.TECHNOLOGICAL },
132+
]},
133+
{ name: CardName.TRADE_TRACK_IF_AGGRESSIVE, expansion:Expansion.AFRICAN_EMPIRES, actions: [
134+
{ action: Action.TRADE_TRACK_1_STEP },
135+
{ action: Action.TRADE_TRACK_1_STEP, gold: 1 },
136+
{ action: Action.TRADE_TRACK_1_STEP, gold: 1 },
137+
{ action: Action.OPPONENTS_UNREST_DECK_DISCARD, ifType: CivilizationType.AGGRESSIVE },
138+
]},
139+
{ name: CardName.TRADING_POST_1, expansion:Expansion.AFRICAN_EMPIRES, actions: [
140+
{ action: Action.BUILD_TRADING_POST },
141+
{ action: Action.REMOVE_CARD }
142+
]},
143+
{ name: CardName.TRADING_POST_2, expansion:Expansion.AFRICAN_EMPIRES, actions: [
144+
{ action: Action.BUILD_TRADING_POST },
145+
{ action: Action.REMOVE_CARD }
146+
]},
147+
{ name: CardName.TAKE_HERO, module:Module.HEROES, actions: [
148+
{ action: Action.TAKE_RETURN_HERO },
149+
{ action: Action.DRAW_CARD }
150+
]},
107151
/* Advanced Action Cards */
108152
{ name: CardName.ADVANCED_EXPLORERS_KNOWLEDGE, advanced: true, actions: [
109153
{ action: Action.EXPLORER_BOTH_MOVE_1_SPACE },
@@ -133,7 +177,24 @@ const cards = [
133177
{ action: Action.CONQUER_1_ADJACENT_LOWEST_COST },
134178
{ action: Action.CONQUER_1_ADJACENT_HIGHEST_COST },
135179
]},
180+
{ name: CardName.ADVANCED_FEWEST_WONDERS, advanced: true, actions: [
181+
{ action: Action.FEWEST_WONDERS_WONDER_COMPLETE_ACQUIRE_GAIN_BUILDING_LOSTEST_COST },
182+
{ action: Action.DRAW_CARD },
183+
]},
184+
{ name: CardName.ADVANCED_FEWEST_CULTURAL_POLICIES, advanced: true, actions: [
185+
{ action: Action.FEWEST_CULTURAL_POLICIES_DEVELOP_1_CULTURAL_POLICY },
186+
{ action: Action.DRAW_CARD },
187+
]},
188+
{ name: CardName.ADVANCED_LAST_TRADE_TRACK, advanced: true, expansion:Expansion.AFRICAN_EMPIRES, actions: [
189+
{ action: Action.TRADE_TRACK_LAST_TRADE_TRACK_2_STEP },
190+
{ action: Action.DRAW_CARD },
191+
]},
192+
{ name: CardName.ADVANCED_FEWEST_PROVINCES, advanced: true, actions: [
193+
{ action: Action.FEWEST_PROVINCES_CONQUER_1_ADJACENT_LOWEST_COST },
194+
{ action: Action.DRAW_CARD },
195+
]},
136196
/* Civilization Cards */
197+
{ name: CardName.MULTI_AUTOMA, actions: []},
137198
{ name: CardName.AMAZON_CIVILIZATION, civilization: CivilizationName.AMAZONS, actions: [
138199
{ action: Action.AMAZON_GAIN_MOUNT_2_HORSES },
139200
{ action: Action.DRAW_CARD },
@@ -165,6 +226,19 @@ const cards = [
165226
{ action: Action.MUGHALS_DRAW_NEXT_REMOVE_NON_ECONOMIC },
166227
{ action: Action.DRAW_CARD },
167228
]},
229+
{ name: CardName.MALIANS_CIVILIZATION, civilization: CivilizationName.MALIANS, actions: [
230+
{ action: Action.GAIN_2_GOLD },
231+
{ action: Action.TRADE_TRACK_1_STEP },
232+
{ action: Action.DRAW_CARD },
233+
]},
234+
{ name: CardName.ZULU_CIVILIZATION, civilization: CivilizationName.ZULU, actions: [
235+
{ action: Action.OPPONENTS_UNREST_DECK_DISCARD },
236+
{ action: Action.DRAW_CARD },
237+
]},
238+
{ name: CardName.AKSUMITES_CIVILIZATION, civilization: CivilizationName.AKSUMITES, actions: [
239+
{ action: Action.DRAW_RESERVE_CARD_1_GAIN },
240+
{ action: Action.DRAW_CARD },
241+
]},
168242
]
169243

170244
const cardsMap = new Map<CardName,Card>()
@@ -185,16 +259,19 @@ export default {
185259
* Get standard action cards
186260
* @returns cards
187261
*/
188-
getStandard() : Card[] {
189-
return cards.filter(card => card.advanced == undefined && card.civilization == undefined)
262+
getStandard(expansions: Expansion[], modules: Module[]) : Card[] {
263+
return cards.filter(card => card.advanced == undefined
264+
&& card.civilization == undefined
265+
&& matches(card, expansions, modules))
190266
},
191267

192268
/**
193269
* Get standard action cards
194270
* @returns cards
195271
*/
196-
getAdvanced() : Card[] {
197-
return cards.filter(card => card.advanced)
272+
getAdvanced(expansions: Expansion[], modules: Module[]) : Card[] {
273+
return cards.filter(card => card.advanced
274+
&& matches(card,expansions, modules))
198275
},
199276

200277
/**
@@ -210,3 +287,8 @@ export default {
210287
}
211288

212289
}
290+
291+
function matches(card: Card, expansions: Expansion[], modules: Module[]) {
292+
return (!card.expansion || expansions.includes(card.expansion))
293+
&& (!card.module || modules.includes(card.module))
294+
}

src/services/enum/Action.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,36 @@
11
enum Action {
22
WONDER_COMPLETE_ACQUIRE_LOWEST_COST = 'wonder-complete-acquire-lowest-cost',
3+
FEWEST_WONDERS_WONDER_COMPLETE_ACQUIRE_GAIN_BUILDING_LOSTEST_COST = 'fewest-wonders-wonder-complete-acquire-gain-building-lowest-cost',
34
BUILDING_TAKE_LOWEST_COST = 'building-lowest-cost',
45
BUILDING_TAKE_HIGHTEST_COST = 'building-highest-cost',
56
DEVELOP_1_CULTURAL_POLICY = 'develop-1-cultural-policy',
67
DEVELOP_1_CULTURAL_POLICY_2_GOLD_PER_POLICY = 'develop-1-cultural-policy-2-gold-per-policy',
8+
FEWEST_CULTURAL_POLICIES_DEVELOP_1_CULTURAL_POLICY = 'fewest-cultural-policies-develop-1-cultural-policy',
79
EXPLORER_BOTH_MOVE_1_SPACE = 'explorers-both-move-1-space',
810
EXPLORER_BOTH_MOVE_2_SPACE = 'explorers-both-move-2-space',
911
EXPLORER_BOTH_MOVE_3_SPACE = 'explorers-both-move-3-space',
1012
KNOWLEDGE_TAKE_LOWEST_COST = 'knowledge-take-lowest-cost',
1113
KNOWLEDGE_TAKE_HIGHEST_COST = 'knowledge-take-highest-cost',
1214
KNOWLEDGE_TAKE_ALL = 'knowledge-take-all',
15+
GAIN_2_GOLD = 'gain-2-gold',
1316
GAIN_3_GOLD = 'gain-3-gold',
17+
GAIN_2_GOLD_PER_POLICY = 'gain-2-gold-per-policy',
1418
CONQUER_1_ADJACENT_LOWEST_COST = 'conquer-1-adjacent-lowest-cost',
1519
CONQUER_1_ADJACENT_HIGHEST_COST = 'conquer-1-adjacent-highest-cost',
1620
CONQUER_3_ADJACENT_HIGHEST_COST = 'conquer-3-adjacent-highest-cost',
21+
FEWEST_PROVINCES_CONQUER_1_ADJACENT_LOWEST_COST = 'fewest-provinces-conquer-1-adjacent-lowest-cost',
22+
TRADE_TRACK_1_STEP = 'trade-track-1-step',
23+
TRADE_TRACK_2_STEP = 'trade-track-2-step',
24+
TRADE_TRACK_LAST_TRADE_TRACK_2_STEP = 'trade-track-last-trade-track-2-step',
25+
DRAW_RESERVE_CARD_1_GAIN = 'draw-reserve-card-1-gain',
26+
DRAW_RESERVE_CARD_2_GAIN_WONDERS = 'draw-reserve-card-2-gain-wonders',
27+
DRAW_RESERVE_CARD_3_GAIN_KNOWLEDGE = 'draw-reserve-card-3-gain-knowledge',
28+
OPPONENTS_UNREST_DECK_DISCARD = 'opponents-unrest-deck-discard',
29+
BUILD_TRADING_POST = 'build-trading-post',
30+
TAKE_RETURN_HERO = 'take-return-hero',
1731
SHUFFLE_CARDS = 'shuffle-cards',
1832
DRAW_CARD = 'draw-card',
33+
REMOVE_CARD = 'remove-card',
1934
CHOOSE_ACTION = 'choose-action',
2035
AMAZON_GAIN_MOUNT_2_HORSES = 'amazon-gain-mount-2-horses',
2136
ATLANTIS_NEXUS_PLACE_NEXT_USE_ALL = 'atlantis-nexus-place-next-use-all',
@@ -24,6 +39,6 @@ enum Action {
2439
DENMARK_COASTAL_PROVINCES_GOLD = 'denmark-coastal-provinces-gold',
2540
EGYPT_DRAW_CARD_GET_TWICE_ACTION_NON_SPECIAL = 'egypt-draw-card-twice-action-non-special',
2641
GREECE_DRAW_GET_ACTION_SPECIAL = 'greece-draw-card-get-action-special',
27-
MUGHALS_DRAW_NEXT_REMOVE_NON_ECONOMIC = 'mughals-draw-next-remove-non-economic',
42+
MUGHALS_DRAW_NEXT_REMOVE_NON_ECONOMIC = 'mughals-draw-next-remove-non-economic'
2843
}
2944
export default Action

src/services/enum/CardName.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,25 @@ enum CardName {
1515
EXPLORERS_IF_TECHNOLOGICAL = 'explorers-if-technological',
1616
EXPLORERS_IF_ECONOMIC = 'explorers-if-economic',
1717
WONDER_IF_CULTURAL = 'wonder-if-cultural',
18+
TRADE_TRACK_IF_ARCHITECTURAL = 'trade-track-if-architectural',
19+
TRADE_TRACK_IF_CULTURAL = 'trade-track-if-cultural',
20+
TRADE_TRACK_IF_ECONOMIC = 'trade-track-if-economic',
21+
TRADE_TRACK_IF_TECHNOLOGICAL = 'trade-track-if-technological',
22+
TRADE_TRACK_IF_AGGRESSIVE = 'trade-track-if-aggressive',
23+
TRADING_POST_1 = 'trading-post-1',
24+
TRADING_POST_2 = 'trading-post-2',
25+
TAKE_HERO = 'take-hero',
1826
/* Advanced Action Cards */
1927
ADVANCED_EXPLORERS_KNOWLEDGE = 'advanced-explorers-knowledge',
2028
ADVANCED_EXPLORERS_CULTURAL_POLICY = 'advanced-explorers-cultural-policy',
2129
ADVANCED_EXPLORERS_WONDER = 'advanced-explorers-wonder',
2230
ADVANCED_EXPLORERS_CONQUER = 'advanced-explorers-conquer',
31+
ADVANCED_FEWEST_WONDERS = 'advanced-fewest-wonders',
32+
ADVANCED_FEWEST_CULTURAL_POLICIES = 'advanced-fewest-cultural-policies',
33+
ADVANCED_LAST_TRADE_TRACK = 'advanced-last-trade-track',
34+
ADVANCED_FEWEST_PROVINCES = 'advanced-fewest-provinces',
2335
/* Civilization Cards */
36+
MULTI_AUTOMA = 'multi-automa',
2437
AMAZON_CIVILIZATION = 'amazon-civilization',
2538
ATLANTIS_CIVILIZATION = 'atlantis-civilization',
2639
AZTECS_CIVILIZATION = 'aztecs-civilization',
@@ -30,5 +43,8 @@ enum CardName {
3043
GREECE_CIVILIZATION = 'greece-civilization',
3144
JAPAN_CIVILIZATION = 'japan-civilization',
3245
MUGHALS_CIVILIZATION = 'mughals-civilization',
46+
MALIANS_CIVILIZATION = 'malians-civilization',
47+
ZULU_CIVILIZATION = 'zulu-civilization',
48+
AKSUMITES_CIVILIZATION = 'aksumites-civilization'
3349
}
34-
export default CardName
50+
export default CardName

0 commit comments

Comments
 (0)