name: Link
card_text: Target 1 Link Monster you control or in your GY; return it to the Extra Deck, and if you do, draw cards equal to its Link Rating, then place cards from your hand on the bottom of the Deck, in any order, equal to the number of cards you drew. You can only activate 1 "Link Bound" per turn.
lua: local s, id, o = GetID()
  function s.initial_effect(c)
  	--Activate
  	local e1 = Effect.CreateEffect(c)
  	e1:SetCategory(CATEGORY_TODECK + CATEGORY_DRAW)
  	e1:SetType(EFFECT_TYPE_ACTIVATE)
  	e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
  	e1:SetCode(EVENT_FREE_CHAIN)
  	e1:SetCountLimit(1, id + EFFECT_COUNT_CODE_OATH)
  	e1:SetTarget(s.target)
  	e1:SetOperation(s.activate)
  	c:RegisterEffect(e1)
  end
  function s.filter(c, tp)
  	return (c:IsLocation(LOCATION_GRAVE) or c:IsFaceup()) and c:IsType(TYPE_LINK) and c:IsAbleToExtra() and Duel.IsPlayerCanDraw(tp, c:GetLink())
  end
  function s.target(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
  	if chkc then
  		return chkc:IsLocation(LOCATION_MZONE + LOCATION_GRAVE) and chkc:IsControler(tp) and s.filter(chkc, tp)
  	end
  	if chk == 0 then
  		return Duel.IsExistingTarget(s.filter, tp, LOCATION_MZONE + LOCATION_GRAVE, 0, 1, nil, tp)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TODECK)
  	local g = Duel.SelectTarget(tp, s.filter, tp, LOCATION_MZONE + LOCATION_GRAVE, 0, 1, 1, nil, tp)
  	Duel.SetOperationInfo(0, CATEGORY_TODECK, g, 1, 0, 0)
  	Duel.SetTargetPlayer(tp)
  	Duel.SetTargetParam(g:GetFirst():GetLink())
  	Duel.SetOperationInfo(0, CATEGORY_DRAW, nil, 0, tp, g:GetFirst():GetLink())
  	Duel.SetOperationInfo(0, CATEGORY_TODECK, nil, 0, tp, g:GetFirst():GetLink())
  end
  function s.activate(e, tp, eg, ep, ev, re, r, rp)
  	local p = Duel.GetChainInfo(0, CHAININFO_TARGET_PLAYER)
  	local tc = Duel.GetFirstTarget()
  	local ct = tc:GetLink()
  	if tc:IsRelateToEffect(e) and Duel.SendtoDeck(tc, nil, SEQ_DECKSHUFFLE, REASON_EFFECT) ~= 0 and tc:IsLocation(LOCATION_EXTRA) then
  		if Duel.Draw(p, ct, REASON_EFFECT) == ct then
  			local g = Duel.GetMatchingGroup(Card.IsAbleToDeck, p, LOCATION_HAND, 0, nil)
  			if g:GetCount() < ct then
  				return
  			end
  			Duel.ShuffleHand(p)
  			Duel.BreakEffect()
  			Duel.Hint(HINT_SELECTMSG, p, HINTMSG_TODECK)
  			local sg = g:Select(p, ct, ct, nil)
  			aux.PlaceCardsOnDeckBottom(p, sg)
  		end
  	end
  end
  
  
source_text: Link
  Target 1 Link Monster you control or in your GY; return it to the Extra Deck, and if you do, draw cards equal to its Link Rating, then place cards from your hand on the bottom of the Deck, in any order, equal to the number of cards you drew. You can only activate 1 "Link Bound" per turn.
target_text: -- Link
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--Activate
  	local e1 = Effect.CreateEffect(c)
  	e1:SetCategory(CATEGORY_TODECK + CATEGORY_DRAW)
  	e1:SetType(EFFECT_TYPE_ACTIVATE)
  	e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
  	e1:SetCode(EVENT_FREE_CHAIN)
  	e1:SetCountLimit(1, id + EFFECT_COUNT_CODE_OATH)
  	e1:SetTarget(s.target)
  	e1:SetOperation(s.activate)
  	c:RegisterEffect(e1)
  end
  function s.filter(c, tp)
  	return (c:IsLocation(LOCATION_GRAVE) or c:IsFaceup()) and c:IsType(TYPE_LINK) and c:IsAbleToExtra() and Duel.IsPlayerCanDraw(tp, c:GetLink())
  end
  function s.target(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
  	if chkc then
  		return chkc:IsLocation(LOCATION_MZONE + LOCATION_GRAVE) and chkc:IsControler(tp) and s.filter(chkc, tp)
  	end
  	if chk == 0 then
  		return Duel.IsExistingTarget(s.filter, tp, LOCATION_MZONE + LOCATION_GRAVE, 0, 1, nil, tp)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TODECK)
  	local g = Duel.SelectTarget(tp, s.filter, tp, LOCATION_MZONE + LOCATION_GRAVE, 0, 1, 1, nil, tp)
  	Duel.SetOperationInfo(0, CATEGORY_TODECK, g, 1, 0, 0)
  	Duel.SetTargetPlayer(tp)
  	Duel.SetTargetParam(g:GetFirst():GetLink())
  	Duel.SetOperationInfo(0, CATEGORY_DRAW, nil, 0, tp, g:GetFirst():GetLink())
  	Duel.SetOperationInfo(0, CATEGORY_TODECK, nil, 0, tp, g:GetFirst():GetLink())
  end
  function s.activate(e, tp, eg, ep, ev, re, r, rp)
  	local p = Duel.GetChainInfo(0, CHAININFO_TARGET_PLAYER)
  	local tc = Duel.GetFirstTarget()
  	local ct = tc:GetLink()
  	if tc:IsRelateToEffect(e) and Duel.SendtoDeck(tc, nil, SEQ_DECKSHUFFLE, REASON_EFFECT) ~= 0 and tc:IsLocation(LOCATION_EXTRA) then
  		if Duel.Draw(p, ct, REASON_EFFECT) == ct then
  			local g = Duel.GetMatchingGroup(Card.IsAbleToDeck, p, LOCATION_HAND, 0, nil)
  			if g:GetCount() < ct then
  				return
  			end
  			Duel.ShuffleHand(p)
  			Duel.BreakEffect()
  			Duel.Hint(HINT_SELECTMSG, p, HINTMSG_TODECK)
  			local sg = g:Select(p, ct, ct, nil)
  			aux.PlaceCardsOnDeckBottom(p, sg)
  		end
  	end
  end
  
  