         {cards: 3}
       ])
       applyBenefit(state, benefit)
+}
+
+makeCard 'Silk Road', c.Estate, {
+  cost: 4
+  getVP: (state) -> Math.floor(state.current.countCardTypeInDeck('Victory') / 4)
+}
+
+# Revealing Tunnel for Gold as it is discarded is automatic.
+# TODO: add code to gamestate for reactToDiscard
+makeCard 'Tunnel', c.Estate, {
+  isReaction: true
+  cost: 3
+  vp: 2
+
+  reactToDiscard: (state, player) ->
+    if state.phase isnt 'cleanup'
+      state.gainCard(player, c.Gold)
+    
 }
 
 makeCard 'Vineyard', c.Estate, {

      transferCard(c['Horse Traders'], player.hand, player.duration)
}

makeCard 'Hunting Party', action, {
  cost: 5
  actions: +1
  cards: +1

  playEffect: (state) ->
    state.revealHand(state.current)
    cardsDrawn = 0;
    while cardsDrawn < 1
      drawn = state.current.getCardsFromDeck(1)
      if drawn.length == 0
        break
      card = drawn[0]
      state.log("...revealing a #{card}")

      if card not in state.current.hand
        cardsDrawn += 1
        state.current.hand.push(card)
        state.log("...drawing a #{card}.")
      else
        state.current.setAside.push(card)
    state.current.discard = state.current.discard.concat(state.current.setAside)
    state.current.setAside = []
}

makeCard 'Ironworks', action, {

  reactToGain: (state, player, card) ->
  # - What happens when this card is in hand and someone else gains a card?
  reactToOpponentGain: (state, player, opponent, card) ->
  # - What happens when this card is discarded?
  reactToDiscard: (state, player) ->
  
  # This defines everything that happens when a card is played, including
  # basic effects and complex effects defined in `playEffect`. Cards
