Skip to content

Commit bc7bcd4

Browse files
committed
Merge pull request #1 from arxanas/autopick
Autopick, DFC fixes, MTGJSON change
2 parents d2365a6 + d17eebe commit bc7bcd4

File tree

7 files changed

+168
-15
lines changed

7 files changed

+168
-15
lines changed

public/src/cards.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,20 @@ function cube() {
218218
}
219219

220220
function clickPack(cardName) {
221-
if (clicked !== cardName)
222-
return clicked = cardName
223-
224221
let index = rawPack.findIndex(x => x.name === cardName)
222+
let card = rawPack[index]
223+
224+
if (clicked !== cardName) {
225+
clicked = cardName
226+
// There may be duplicate cards in a pack, but only one copy of a card is
227+
// shown in the pick view. We must be sure to mark them all since we don't
228+
// know which one is being displayed.
229+
rawPack.forEach(card => card.isAutopick = card.name === cardName)
230+
App.update()
231+
App.send('autopick', index)
232+
return clicked
233+
}
234+
225235
clicked = null
226236
Zones.pack = {}
227237
App.update()

public/src/components/grid.js

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,19 @@ function zone(zoneName) {
1515
let values = _.values(zone)
1616
let cards = _.flat(values)
1717

18+
let isAutopickable = card => zoneName === 'pack' && card.isAutopick
19+
1820
let items = cards.map(card =>
19-
d.img({
20-
onClick: App._emit('click', zoneName, card.name),
21-
src: card.url,
22-
alt: card.name
23-
}))
21+
d.span(
22+
{
23+
className: `card ${isAutopickable(card) ? 'autopick-card' : ''}`,
24+
title: isAutopickable(card) ? 'This card will be automatically picked if your time expires.' : '',
25+
onClick: App._emit('click', zoneName, card.name),
26+
},
27+
d.img({
28+
src: card.url,
29+
alt: card.name,
30+
})))
2431

2532
return d.div({ className: 'zone' },
2633
d.h1({}, `${zoneName} ${cards.length}`),

public/style.css

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,50 @@ time {
3939
color: white;
4040
}
4141

42+
.card {
43+
display: inline-block;
44+
position: relative;
45+
margin: 0;
46+
cursor: pointer;
47+
}
48+
49+
.card:hover:before, .autopick-card:before {
50+
content: '';
51+
52+
display: block;
53+
position: absolute;
54+
55+
top: 0;
56+
bottom: 0;
57+
left: 0;
58+
right: 0;
59+
60+
margin-bottom: 5px;
61+
border-radius: 12px;
62+
63+
background: rgba(200, 200, 200, 0.25);
64+
}
65+
66+
.autopick-card:after {
67+
content: 'Autopick';
68+
69+
display: inline-block;
70+
position: absolute;
71+
72+
/* Center in the middle of the bottom border on the card. */
73+
line-height: 25px;
74+
bottom: 5px;
75+
left: 0;
76+
right: 0;
77+
78+
color: #fff;
79+
font-family: Verdana, Arial, sans-serif;
80+
font-size: 13px;
81+
font-weight: 700;
82+
text-align: center;
83+
text-shadow: 0px 0px 2px #000;
84+
}
85+
4286
.error {
4387
color: red;
4488
}

src/game.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ var games = {}
1717
continue
1818
for (var p of game.players)
1919
if (p.time && !--p.time)
20-
p.pickRand()
20+
p.pickOnTimeout()
2121
}
2222
setTimeout(playerTimer, SECOND)
2323
})()

src/human.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module.exports = class extends EventEmitter {
1010
name: sock.name,
1111
time: 0,
1212
packs: [],
13+
autopick_index: -1,
1314
pool: []
1415
})
1516
this.attach(sock)
@@ -19,6 +20,7 @@ module.exports = class extends EventEmitter {
1920
this.sock.ws.close()
2021

2122
sock.mixin(this)
23+
sock.on('autopick', this._autopick.bind(this))
2224
sock.on('pick', this._pick.bind(this))
2325
sock.on('hash', this._hash.bind(this))
2426

@@ -34,6 +36,11 @@ module.exports = class extends EventEmitter {
3436
this.hash = hash(deck)
3537
this.emit('meta')
3638
}
39+
_autopick(index) {
40+
var [pack] = this.packs
41+
if (pack && index < pack.length)
42+
this.autopick_index = index
43+
}
3744
_pick(index) {
3845
var [pack] = this.packs
3946
if (pack && index < pack.length)
@@ -65,17 +72,20 @@ module.exports = class extends EventEmitter {
6572
else
6673
this.sendPack(next)
6774

75+
this.autopick_index = -1
6876
this.emit('pass', pack)
6977
}
70-
pickRand() {
71-
var index = _.rand(this.packs[0].length)
78+
pickOnTimeout() {
79+
let index = this.autopick_index
80+
if (index === -1)
81+
index = _.rand(this.packs[0].length)
7282
this.pick(index)
7383
}
7484
kick() {
7585
this.send = ()=>{}
7686
while(this.packs.length)
77-
this.pickRand()
78-
this.sendPack = this.pickRand
87+
this.pickOnTimeout()
88+
this.sendPack = this.pickOnTimeout
7989
this.isBot = true
8090
}
8191
}

src/make/cards.js

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,60 @@ function before() {
7676
}
7777

7878
function after() {
79+
var {ISD} = Sets
80+
ISD.special = {
81+
mythic: [
82+
'garruk relentless'
83+
],
84+
rare: [
85+
'bloodline keeper',
86+
'daybreak ranger',
87+
'instigator gang',
88+
'kruin outlaw',
89+
'ludevic\'s test subject',
90+
'mayor of avabruck'
91+
],
92+
uncommon: [
93+
'civilized scholar',
94+
'cloistered youth',
95+
'gatstaf shepherd',
96+
'hanweir watchkeep',
97+
'reckless waif',
98+
'screeching bat',
99+
'ulvenwald mystics'
100+
],
101+
common: [
102+
'delver of secrets',
103+
'grizzled outcasts',
104+
'thraben sentry',
105+
'tormented pariah',
106+
'village ironsmith',
107+
'villagers of estwald'
108+
]
109+
}
110+
var {DKA} = Sets
111+
DKA.special = {
112+
mythic: [
113+
'elbrus, the binding blade',
114+
'huntmaster of the fells'
115+
],
116+
rare: [
117+
'mondronen shaman',
118+
'ravenous demon'
119+
],
120+
uncommon: [
121+
'afflicted deserter',
122+
'chalice of life',
123+
'lambholt elder',
124+
'soul seizer'
125+
],
126+
common: [
127+
'chosen of markov',
128+
'hinterland hermit',
129+
'loyal cathar',
130+
'scorned villager'
131+
]
132+
}
79133
var {DGM} = Sets
80134
DGM.mythic.splice(DGM.mythic.indexOf("maze's end"), 1)
81135
DGM.special = {
@@ -167,7 +221,7 @@ function doCard(rawCard, cards, code, set) {
167221

168222
var {name} = rawCard
169223
if (['double-faced', 'flip'].indexOf(rawCard.layout) > -1
170-
&& name !== rawCard.names[0])
224+
&& rawCard.number.indexOf('b') > -1)
171225
return
172226

173227
if (rawCard.layout === 'split')

src/pool.js

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ function toPack(code) {
3232
_.choose(1, rare)
3333
)
3434

35+
let specialrnd
36+
3537
switch (code) {
3638
case 'DGM':
3739
special = _.rand(20)
@@ -53,7 +55,33 @@ function toPack(code) {
5355
special = _.rand(20)
5456
? special.common
5557
: special.fetch
56-
break
58+
break
59+
case 'ISD':
60+
//http://www.mtgsalvation.com/forums/magic-fundamentals/magic-general/327956-innistrad-block-transforming-card-pack-odds?comment=4
61+
//121 card sheet, 1 mythic, 12 rare (13), 42 uncommon (55), 66 common
62+
specialrnd = _.rand(121)
63+
if (specialrnd == 0)
64+
special = special.mythic
65+
else if (specialrnd < 13)
66+
special = special.rare
67+
else if (specialrnd < 55)
68+
special = special.uncommon
69+
else
70+
special = special.common
71+
break
72+
case 'DKA':
73+
//http://www.mtgsalvation.com/forums/magic-fundamentals/magic-general/327956-innistrad-block-transforming-card-pack-odds?comment=4
74+
//80 card sheet, 2 mythic, 6 rare (8), 24 uncommon (32), 48 common
75+
specialrnd = _.rand(80)
76+
if (specialrnd <= 1)
77+
special = special.mythic
78+
else if (specialrnd < 8)
79+
special = special.rare
80+
else if (specialrnd < 32)
81+
special = special.uncommon
82+
else
83+
special = special.common
84+
break
5785
}
5886

5987
if (special)

0 commit comments

Comments
 (0)