name: Geistgrinder
card_text: You can only Special Summon "Geistgrinder Golem" once per turn. You can reveal 1 "Yubel" monster in your hand; Special Summon this card from your hand to your opponent's field, then you can Special Summon the revealed monster to your field. Once per turn, during damage calculation, if this card battles a "Yubel" monster: Your opponent gains 3000 LP. If you Special Summon "Yubel" while this card is in your GY (except during the Damage Step): You can Special Summon this card to your opponent's field.
external_ids: local CARD_ID_0 = 78371393 --Yubel
  local SETCARD_ID_0 = 0x1a5 --Yubel
  
lua: local CARD_ID_0 = 78371393 --Yubel
  local SETCARD_ID_0 = 0x1a5 --Yubel
  local s, id, o = GetID()
  function s.initial_effect(c)
  	aux.AddCodeList(c, CARD_ID_0)
  	aux.AddSetNameMonsterList(c, SETCARD_ID_0)
  	c:SetSPSummonOnce(id)
  	local e0 = aux.AddThisCardInGraveAlreadyCheck(c)
  	--spsummon
  	local e1 = Effect.CreateEffect(c)
  	e1:SetDescription(aux.Stringid(id, 0))
  	e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e1:SetType(EFFECT_TYPE_IGNITION)
  	e1:SetRange(LOCATION_HAND)
  	e1:SetCost(s.spcost)
  	e1:SetTarget(s.sptg)
  	e1:SetOperation(s.spop)
  	c:RegisterEffect(e1)
  	--recover
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 1))
  	e2:SetCategory(CATEGORY_RECOVER)
  	e2:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_TRIGGER_F)
  	e2:SetCode(EVENT_PRE_DAMAGE_CALCULATE)
  	e2:SetCountLimit(1)
  	e2:SetCondition(s.reccon)
  	e2:SetTarget(s.rectg)
  	e2:SetOperation(s.recop)
  	c:RegisterEffect(e2)
  	--special summon from grave
  	local e3 = Effect.CreateEffect(c)
  	e3:SetDescription(aux.Stringid(id, 2))
  	e3:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e3:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_TRIGGER_O)
  	e3:SetProperty(EFFECT_FLAG_DELAY + EFFECT_FLAG_CARD_TARGET)
  	e3:SetCode(EVENT_SPSUMMON_SUCCESS)
  	e3:SetRange(LOCATION_GRAVE)
  	e3:SetLabelObject(e0)
  	e3:SetCondition(s.spfgcon)
  	e3:SetTarget(s.spfgtg)
  	e3:SetOperation(s.spfgop)
  	c:RegisterEffect(e3)
  end
  function s.cfilter(c)
  	return c:IsSetCard(SETCARD_ID_0) and c:IsType(TYPE_MONSTER) and not c:IsPublic()
  end
  function s.spcost(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.cfilter, tp, LOCATION_HAND, 0, 1, nil)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_CONFIRM)
  	local g = Duel.SelectMatchingCard(tp, s.cfilter, tp, LOCATION_HAND, 0, 1, 1, nil)
  	local sc = g:GetFirst()
  	Duel.ConfirmCards(1 - tp, sc)
  	Duel.ShuffleHand(tp)
  	sc:CreateEffectRelation(e)
  	e:SetLabelObject(sc)
  end
  function s.sptg(e, tp, eg, ep, ev, re, r, rp, chk)
  	local c = e:GetHandler()
  	if chk == 0 then
  		return Duel.GetLocationCount(1 - tp, LOCATION_MZONE) > 0 and c:IsCanBeSpecialSummoned(e, 0, tp, false, false)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, c, 1, 0, 0)
  end
  function s.spop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	if c:IsRelateToEffect(e) then
  		Duel.SpecialSummon(c, 0, tp, 1 - tp, false, false, POS_FACEUP)
  	end
  	local sc = e:GetLabelObject()
  	if sc:IsRelateToEffect(e) and sc:IsCanBeSpecialSummoned(e, 0, tp, false, false) and Duel.GetLocationCount(tp, LOCATION_MZONE) > 0 and Duel.SelectYesNo(tp, aux.Stringid(id, 3)) then
  		Duel.BreakEffect()
  		Duel.SpecialSummon(sc, 0, tp, tp, false, false, POS_FACEUP)
  	end
  end
  function s.reccon(e, tp, eg, ep, ev, re, r, rp, chk)
  	local c = e:GetHandler()
  	local bc = c:GetBattleTarget()
  	return bc and bc:IsFaceup() and bc:IsSetCard(SETCARD_ID_0)
  end
  function s.rectg(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return true
  	end
  	Duel.SetOperationInfo(0, CATEGORY_RECOVER, nil, 0, 1 - tp, 3000)
  end
  function s.recop(e, tp, eg, ep, ev, re, r, rp)
  	Duel.Recover(1 - tp, 3000, REASON_EFFECT)
  end
  function s.spfgfilter(c, tp, se)
  	return c:IsFaceup() and c:IsSummonPlayer(tp) and c:IsCode(CARD_ID_0) and c:IsType(TYPE_MONSTER) and (se == nil or c:GetReasonEffect() ~= se)
  end
  function s.spfgcon(e, tp, eg, ep, ev, re, r, rp)
  	local se = e:GetLabelObject():GetLabelObject()
  	return eg:IsExists(s.spfgfilter, 1, nil, tp, se)
  end
  function s.spfgtg(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
  	if chk == 0 then
  		return Duel.GetLocationCount(1 - tp, LOCATION_MZONE, tp) > 0 and e:GetHandler():IsCanBeSpecialSummoned(e, 0, tp, false, false)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, e:GetHandler(), 1, 0, 0)
  end
  function s.spfgop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	if c:IsRelateToEffect(e) then
  		Duel.SpecialSummon(c, 0, tp, 1 - tp, false, false, POS_FACEUP)
  	end
  end
  
  
source_text: Geistgrinder
  You can only Special Summon "Geistgrinder Golem" once per turn. You can reveal 1 "Yubel" monster in your hand; Special Summon this card from your hand to your opponent's field, then you can Special Summon the revealed monster to your field. Once per turn, during damage calculation, if this card battles a "Yubel" monster: Your opponent gains 3000 LP. If you Special Summon "Yubel" while this card is in your GY (except during the Damage Step): You can Special Summon this card to your opponent's field.
target_text: -- Geistgrinder
  local CARD_ID_0 = 78371393 --Yubel
  local SETCARD_ID_0 = 0x1a5 --Yubel
  local s, id, o = GetID()
  function s.initial_effect(c)
  	aux.AddCodeList(c, CARD_ID_0)
  	aux.AddSetNameMonsterList(c, SETCARD_ID_0)
  	c:SetSPSummonOnce(id)
  	local e0 = aux.AddThisCardInGraveAlreadyCheck(c)
  	--spsummon
  	local e1 = Effect.CreateEffect(c)
  	e1:SetDescription(aux.Stringid(id, 0))
  	e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e1:SetType(EFFECT_TYPE_IGNITION)
  	e1:SetRange(LOCATION_HAND)
  	e1:SetCost(s.spcost)
  	e1:SetTarget(s.sptg)
  	e1:SetOperation(s.spop)
  	c:RegisterEffect(e1)
  	--recover
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 1))
  	e2:SetCategory(CATEGORY_RECOVER)
  	e2:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_TRIGGER_F)
  	e2:SetCode(EVENT_PRE_DAMAGE_CALCULATE)
  	e2:SetCountLimit(1)
  	e2:SetCondition(s.reccon)
  	e2:SetTarget(s.rectg)
  	e2:SetOperation(s.recop)
  	c:RegisterEffect(e2)
  	--special summon from grave
  	local e3 = Effect.CreateEffect(c)
  	e3:SetDescription(aux.Stringid(id, 2))
  	e3:SetCategory(CATEGORY_SPECIAL_SUMMON)
  	e3:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_TRIGGER_O)
  	e3:SetProperty(EFFECT_FLAG_DELAY + EFFECT_FLAG_CARD_TARGET)
  	e3:SetCode(EVENT_SPSUMMON_SUCCESS)
  	e3:SetRange(LOCATION_GRAVE)
  	e3:SetLabelObject(e0)
  	e3:SetCondition(s.spfgcon)
  	e3:SetTarget(s.spfgtg)
  	e3:SetOperation(s.spfgop)
  	c:RegisterEffect(e3)
  end
  function s.cfilter(c)
  	return c:IsSetCard(SETCARD_ID_0) and c:IsType(TYPE_MONSTER) and not c:IsPublic()
  end
  function s.spcost(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.cfilter, tp, LOCATION_HAND, 0, 1, nil)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_CONFIRM)
  	local g = Duel.SelectMatchingCard(tp, s.cfilter, tp, LOCATION_HAND, 0, 1, 1, nil)
  	local sc = g:GetFirst()
  	Duel.ConfirmCards(1 - tp, sc)
  	Duel.ShuffleHand(tp)
  	sc:CreateEffectRelation(e)
  	e:SetLabelObject(sc)
  end
  function s.sptg(e, tp, eg, ep, ev, re, r, rp, chk)
  	local c = e:GetHandler()
  	if chk == 0 then
  		return Duel.GetLocationCount(1 - tp, LOCATION_MZONE) > 0 and c:IsCanBeSpecialSummoned(e, 0, tp, false, false)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, c, 1, 0, 0)
  end
  function s.spop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	if c:IsRelateToEffect(e) then
  		Duel.SpecialSummon(c, 0, tp, 1 - tp, false, false, POS_FACEUP)
  	end
  	local sc = e:GetLabelObject()
  	if sc:IsRelateToEffect(e) and sc:IsCanBeSpecialSummoned(e, 0, tp, false, false) and Duel.GetLocationCount(tp, LOCATION_MZONE) > 0 and Duel.SelectYesNo(tp, aux.Stringid(id, 3)) then
  		Duel.BreakEffect()
  		Duel.SpecialSummon(sc, 0, tp, tp, false, false, POS_FACEUP)
  	end
  end
  function s.reccon(e, tp, eg, ep, ev, re, r, rp, chk)
  	local c = e:GetHandler()
  	local bc = c:GetBattleTarget()
  	return bc and bc:IsFaceup() and bc:IsSetCard(SETCARD_ID_0)
  end
  function s.rectg(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return true
  	end
  	Duel.SetOperationInfo(0, CATEGORY_RECOVER, nil, 0, 1 - tp, 3000)
  end
  function s.recop(e, tp, eg, ep, ev, re, r, rp)
  	Duel.Recover(1 - tp, 3000, REASON_EFFECT)
  end
  function s.spfgfilter(c, tp, se)
  	return c:IsFaceup() and c:IsSummonPlayer(tp) and c:IsCode(CARD_ID_0) and c:IsType(TYPE_MONSTER) and (se == nil or c:GetReasonEffect() ~= se)
  end
  function s.spfgcon(e, tp, eg, ep, ev, re, r, rp)
  	local se = e:GetLabelObject():GetLabelObject()
  	return eg:IsExists(s.spfgfilter, 1, nil, tp, se)
  end
  function s.spfgtg(e, tp, eg, ep, ev, re, r, rp, chk, chkc)
  	if chk == 0 then
  		return Duel.GetLocationCount(1 - tp, LOCATION_MZONE, tp) > 0 and e:GetHandler():IsCanBeSpecialSummoned(e, 0, tp, false, false)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_SPECIAL_SUMMON, e:GetHandler(), 1, 0, 0)
  end
  function s.spfgop(e, tp, eg, ep, ev, re, r, rp)
  	local c = e:GetHandler()
  	if c:IsRelateToEffect(e) then
  		Duel.SpecialSummon(c, 0, tp, 1 - tp, false, false, POS_FACEUP)
  	end
  end
  
  