name: Mermail
card_text: 2+ monsters, including a Fish, Sea Serpent, or Aqua monster
  Your opponent cannot target WATER monsters this card points to with card effects. You can only use each of the following effects of "Mermail King - Neptabyss" once per turn. If a WATER monster(s) is sent to the GY to activate a card or effect (except during the Damage Step): You can take 1 "Abyss-" Equip Spell from your Deck or GY and either add it to your hand or equip it to this card. If this card in its owner's possession is destroyed by an opponent's card: You can add 1 "Atlantean" or "Mermail" monster from your Deck to your hand.
external_ids: local SETCARD_ID_0 = 0x74 --Mermail
  local SETCARD_ID_1 = 0x75 --Abyss-
  
lua: local SETCARD_ID_0 = 0x74 --Mermail
  local SETCARD_ID_1 = 0x75 --Abyss-
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--link summon
  	aux.AddLinkProcedure(c, nil, 2, 3, s.lcheck)
  	c:EnableReviveLimit()
  	--cannot be effect target
  	local e1 = Effect.CreateEffect(c)
  	e1:SetType(EFFECT_TYPE_FIELD)
  	e1:SetCode(EFFECT_CANNOT_BE_EFFECT_TARGET)
  	e1:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE)
  	e1:SetRange(LOCATION_MZONE)
  	e1:SetTargetRange(LOCATION_MZONE, LOCATION_MZONE)
  	e1:SetTarget(s.etlimit)
  	e1:SetValue(aux.tgoval)
  	c:RegisterEffect(e1)
  	--to hand or equip
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 1))
  	e2:SetCategory(CATEGORY_TOHAND + CATEGORY_SEARCH + CATEGORY_EQUIP + CATEGORY_GRAVE_ACTION)
  	e2:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_TRIGGER_O)
  	e2:SetCode(EVENT_TO_GRAVE)
  	e2:SetProperty(EFFECT_FLAG_DELAY)
  	e2:SetRange(LOCATION_MZONE)
  	e2:SetCountLimit(1, id)
  	e2:SetCondition(s.thcon)
  	e2:SetTarget(s.thtg)
  	e2:SetOperation(s.thop)
  	c:RegisterEffect(e2)
  	--search
  	local e3 = Effect.CreateEffect(c)
  	e3:SetDescription(aux.Stringid(id, 2))
  	e3:SetCategory(CATEGORY_TOHAND + CATEGORY_SEARCH)
  	e3:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_TRIGGER_O)
  	e3:SetProperty(EFFECT_FLAG_DELAY)
  	e3:SetCode(EVENT_DESTROYED)
  	e3:SetCountLimit(1, id + o)
  	e3:SetCondition(s.thcon2)
  	e3:SetTarget(s.thtg2)
  	e3:SetOperation(s.thop2)
  	c:RegisterEffect(e3)
  end
  function s.lcheck(g, lc)
  	return g:IsExists(Card.IsLinkRace, 1, nil, RACE_AQUA + RACE_FISH + RACE_SEASERPENT)
  end
  function s.etlimit(e, c)
  	return e:GetHandler():GetLinkedGroup():IsContains(c) and c:IsAttribute(ATTRIBUTE_WATER) and c:IsFaceup()
  end
  function s.cfilter(c, tp, re)
  	return c:IsReason(REASON_COST) and re:IsActivated() and c:GetOriginalAttribute() == ATTRIBUTE_WATER
  end
  function s.thcon(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	return eg:IsExists(s.cfilter, 1, c, tp, re)
  end
  function s.eqfilter(c, tp, ec)
  	return c:IsType(TYPE_EQUIP)
  		and c:IsSetCard(SETCARD_ID_1)
  		and (c:IsAbleToHand() or c:CheckUniqueOnField(tp) and not c:IsForbidden() and c:CheckEquipTarget(ec) and Duel.GetLocationCount(tp, LOCATION_SZONE) > 0)
  end
  function s.thtg(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.eqfilter, tp, LOCATION_DECK + LOCATION_GRAVE, 0, 1, nil, tp, e:GetHandler())
  	end
  end
  function s.thop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_OPERATECARD)
  	local g = Duel.SelectMatchingCard(tp, aux.NecroValleyFilter(s.eqfilter), tp, LOCATION_DECK + LOCATION_GRAVE, 0, 1, 1, nil, tp, c)
  	local tc = g:GetFirst()
  	if g:GetCount() > 0 then
  		if tc:CheckEquipTarget(c) and tc:CheckUniqueOnField(tp) and not tc:IsForbidden() and (not tc:IsAbleToHand() or Duel.SelectOption(tp, 1190, aux.Stringid(id, 3)) == 1) then
  			Duel.Equip(tp, tc, c)
  		else
  			Duel.SendtoHand(g, nil, REASON_EFFECT)
  			Duel.ConfirmCards(1 - tp, g)
  		end
  	end
  end
  function s.thcon2(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	return rp == 1 - tp and c:IsPreviousControler(tp)
  end
  function s.thfilter2(c)
  	return c:IsAbleToHand() and c:IsType(TYPE_MONSTER) and c:IsSetCard(SETCARD_ID_1, 0x77)
  end
  function s.thtg2(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.thfilter2, tp, LOCATION_DECK, 0, 1, nil)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_TOHAND, nil, 1, tp, LOCATION_DECK)
  end
  function s.thop2(e, tp, eg, ep, ev, re, r, rp)
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_ATOHAND)
  	local g = Duel.SelectMatchingCard(tp, s.thfilter2, tp, LOCATION_DECK, 0, 1, 1, nil)
  	if #g > 0 then
  		Duel.SendtoHand(g, nil, REASON_EFFECT)
  		Duel.ConfirmCards(1 - tp, g)
  	end
  end
  
  
source_text: Mermail
  2+ monsters, including a Fish, Sea Serpent, or Aqua monster
  Your opponent cannot target WATER monsters this card points to with card effects. You can only use each of the following effects of "Mermail King - Neptabyss" once per turn. If a WATER monster(s) is sent to the GY to activate a card or effect (except during the Damage Step): You can take 1 "Abyss-" Equip Spell from your Deck or GY and either add it to your hand or equip it to this card. If this card in its owner's possession is destroyed by an opponent's card: You can add 1 "Atlantean" or "Mermail" monster from your Deck to your hand.
target_text: -- Mermail
  local SETCARD_ID_0 = 0x74 --Mermail
  local SETCARD_ID_1 = 0x75 --Abyss-
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--link summon
  	aux.AddLinkProcedure(c, nil, 2, 3, s.lcheck)
  	c:EnableReviveLimit()
  	--cannot be effect target
  	local e1 = Effect.CreateEffect(c)
  	e1:SetType(EFFECT_TYPE_FIELD)
  	e1:SetCode(EFFECT_CANNOT_BE_EFFECT_TARGET)
  	e1:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE)
  	e1:SetRange(LOCATION_MZONE)
  	e1:SetTargetRange(LOCATION_MZONE, LOCATION_MZONE)
  	e1:SetTarget(s.etlimit)
  	e1:SetValue(aux.tgoval)
  	c:RegisterEffect(e1)
  	--to hand or equip
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 1))
  	e2:SetCategory(CATEGORY_TOHAND + CATEGORY_SEARCH + CATEGORY_EQUIP + CATEGORY_GRAVE_ACTION)
  	e2:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_TRIGGER_O)
  	e2:SetCode(EVENT_TO_GRAVE)
  	e2:SetProperty(EFFECT_FLAG_DELAY)
  	e2:SetRange(LOCATION_MZONE)
  	e2:SetCountLimit(1, id)
  	e2:SetCondition(s.thcon)
  	e2:SetTarget(s.thtg)
  	e2:SetOperation(s.thop)
  	c:RegisterEffect(e2)
  	--search
  	local e3 = Effect.CreateEffect(c)
  	e3:SetDescription(aux.Stringid(id, 2))
  	e3:SetCategory(CATEGORY_TOHAND + CATEGORY_SEARCH)
  	e3:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_TRIGGER_O)
  	e3:SetProperty(EFFECT_FLAG_DELAY)
  	e3:SetCode(EVENT_DESTROYED)
  	e3:SetCountLimit(1, id + o)
  	e3:SetCondition(s.thcon2)
  	e3:SetTarget(s.thtg2)
  	e3:SetOperation(s.thop2)
  	c:RegisterEffect(e3)
  end
  function s.lcheck(g, lc)
  	return g:IsExists(Card.IsLinkRace, 1, nil, RACE_AQUA + RACE_FISH + RACE_SEASERPENT)
  end
  function s.etlimit(e, c)
  	return e:GetHandler():GetLinkedGroup():IsContains(c) and c:IsAttribute(ATTRIBUTE_WATER) and c:IsFaceup()
  end
  function s.cfilter(c, tp, re)
  	return c:IsReason(REASON_COST) and re:IsActivated() and c:GetOriginalAttribute() == ATTRIBUTE_WATER
  end
  function s.thcon(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	return eg:IsExists(s.cfilter, 1, c, tp, re)
  end
  function s.eqfilter(c, tp, ec)
  	return c:IsType(TYPE_EQUIP)
  		and c:IsSetCard(SETCARD_ID_1)
  		and (c:IsAbleToHand() or c:CheckUniqueOnField(tp) and not c:IsForbidden() and c:CheckEquipTarget(ec) and Duel.GetLocationCount(tp, LOCATION_SZONE) > 0)
  end
  function s.thtg(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.eqfilter, tp, LOCATION_DECK + LOCATION_GRAVE, 0, 1, nil, tp, e:GetHandler())
  	end
  end
  function s.thop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_OPERATECARD)
  	local g = Duel.SelectMatchingCard(tp, aux.NecroValleyFilter(s.eqfilter), tp, LOCATION_DECK + LOCATION_GRAVE, 0, 1, 1, nil, tp, c)
  	local tc = g:GetFirst()
  	if g:GetCount() > 0 then
  		if tc:CheckEquipTarget(c) and tc:CheckUniqueOnField(tp) and not tc:IsForbidden() and (not tc:IsAbleToHand() or Duel.SelectOption(tp, 1190, aux.Stringid(id, 3)) == 1) then
  			Duel.Equip(tp, tc, c)
  		else
  			Duel.SendtoHand(g, nil, REASON_EFFECT)
  			Duel.ConfirmCards(1 - tp, g)
  		end
  	end
  end
  function s.thcon2(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	return rp == 1 - tp and c:IsPreviousControler(tp)
  end
  function s.thfilter2(c)
  	return c:IsAbleToHand() and c:IsType(TYPE_MONSTER) and c:IsSetCard(SETCARD_ID_1, 0x77)
  end
  function s.thtg2(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.thfilter2, tp, LOCATION_DECK, 0, 1, nil)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_TOHAND, nil, 1, tp, LOCATION_DECK)
  end
  function s.thop2(e, tp, eg, ep, ev, re, r, rp)
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_ATOHAND)
  	local g = Duel.SelectMatchingCard(tp, s.thfilter2, tp, LOCATION_DECK, 0, 1, 1, nil)
  	if #g > 0 then
  		Duel.SendtoHand(g, nil, REASON_EFFECT)
  		Duel.ConfirmCards(1 - tp, g)
  	end
  end
  
  