name: Dogmatikamatrix
card_text: When this card is activated: You can add 1 "Dogmatika" Ritual Monster or 1 "Dogmatika" Ritual Spell from your Deck to your hand, then if your opponent controls a monster, you can add 1 "Dogmatika" card from your Deck to your hand. Once per turn, if you control a "Dogmatika" Ritual Monster: You can look at either player's Extra Deck, and send 1 monster from it to the GY. You can only activate 1 "Dogmatikamatrix" per turn.
external_ids: local SETCARD_ID_0 = 0x145 --Dogmatika
  
lua: local SETCARD_ID_0 = 0x145 --Dogmatika
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--activate
  	local e1 = Effect.CreateEffect(c)
  	e1:SetCategory(CATEGORY_SEARCH + CATEGORY_TOHAND)
  	e1:SetType(EFFECT_TYPE_ACTIVATE)
  	e1:SetCode(EVENT_FREE_CHAIN)
  	e1:SetCountLimit(1, id + EFFECT_COUNT_CODE_OATH)
  	e1:SetOperation(s.activate)
  	c:RegisterEffect(e1)
  	--send to gy
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 2))
  	e2:SetCategory(CATEGORY_TOGRAVE)
  	e2:SetType(EFFECT_TYPE_IGNITION)
  	e2:SetRange(LOCATION_SZONE)
  	e2:SetCountLimit(1)
  	e2:SetCondition(s.tgcon)
  	e2:SetTarget(s.tgtg)
  	e2:SetOperation(s.tgop)
  	c:RegisterEffect(e2)
  end
  function s.thfilter(c, specify)
  	return c:IsSetCard(SETCARD_ID_0) and (not specify or (c:IsType(TYPE_RITUAL) and c:IsType(TYPE_MONSTER + TYPE_SPELL))) and c:IsAbleToHand()
  end
  function s.activate(e, tp, eg, ep, ev, re, r, rp)
  	local g = Duel.GetMatchingGroup(s.thfilter, tp, LOCATION_DECK, 0, nil, true)
  	if #g > 0 and Duel.SelectYesNo(tp, aux.Stringid(id, 0)) then
  		Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_ATOHAND)
  		local sg = g:Select(tp, 1, 1, nil)
  		if Duel.SendtoHand(sg, nil, REASON_EFFECT) > 0 and sg:GetFirst():IsLocation(LOCATION_HAND) then
  			Duel.ConfirmCards(1 - tp, sg)
  			local g2 = Duel.GetMatchingGroup(s.thfilter, tp, LOCATION_DECK, 0, nil)
  			if #g2 > 0 and Duel.GetFieldGroupCount(tp, 0, LOCATION_MZONE) > 0 and Duel.SelectYesNo(tp, aux.Stringid(id, 1)) then
  				Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_ATOHAND)
  				local sg2 = g2:Select(tp, 1, 1, nil)
  				Duel.BreakEffect()
  				Duel.SendtoHand(sg2, nil, REASON_EFFECT)
  				Duel.ConfirmCards(1 - tp, sg2)
  			end
  		end
  	end
  end
  function s.cfilter(c)
  	return c:IsFaceup() and c:IsSetCard(SETCARD_ID_0) and c:IsType(TYPE_RITUAL)
  end
  function s.tgcon(e, tp, eg, ep, ev, re, r, rp)
  	return Duel.IsExistingMatchingCard(s.cfilter, tp, LOCATION_MZONE, 0, 1, nil)
  end
  function s.tgfilter0(c, tp)
  	if c:IsControler(tp) then
  		return c:IsType(TYPE_MONSTER) and c:IsAbleToGrave()
  	else
  		return Duel.IsPlayerCanSendtoGrave(tp, c)
  	end
  end
  function s.tgtg(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.tgfilter0, tp, LOCATION_EXTRA, LOCATION_EXTRA, 1, nil, tp)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_TOGRAVE, nil, 1, PLAYER_ALL, LOCATION_EXTRA)
  end
  function s.tgfilter(c)
  	return c:IsType(TYPE_MONSTER) and c:IsAbleToGrave()
  end
  function s.tgop(e, tp, eg, ep, ev, re, r, rp)
  	local g1 = Duel.GetFieldGroup(tp, LOCATION_EXTRA, 0)
  	local g2 = Duel.GetFieldGroup(tp, 0, LOCATION_EXTRA)
  	if #g1 == 0 and #g2 == 0 then
  		return
  	end
  	local g
  	local off = 1
  	local ops = {}
  	local opval = {}
  	if #g1 > 0 then
  		ops[off] = aux.Stringid(id, 3)
  		opval[off] = 0
  		off = off + 1
  	end
  	if #g2 > 0 then
  		ops[off] = aux.Stringid(id, 4)
  		opval[off] = 1
  		off = off + 1
  	end
  	local op = Duel.SelectOption(tp, table.unpack(ops)) + 1
  	local sel = opval[op]
  	if sel == 0 then
  		g = g1
  	elseif sel == 1 then
  		g = g2
  		Duel.ConfirmCards(tp, g, true)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TOGRAVE)
  	local sg = g:FilterSelect(tp, s.tgfilter, 1, 1, nil)
  	if #sg > 0 then
  		Duel.BreakEffect()
  		Duel.SendtoGrave(sg, REASON_EFFECT)
  	end
  	if sel == 1 then
  		Duel.ShuffleExtra(1 - tp)
  	end
  end
  
  
source_text: Dogmatikamatrix
  When this card is activated: You can add 1 "Dogmatika" Ritual Monster or 1 "Dogmatika" Ritual Spell from your Deck to your hand, then if your opponent controls a monster, you can add 1 "Dogmatika" card from your Deck to your hand. Once per turn, if you control a "Dogmatika" Ritual Monster: You can look at either player's Extra Deck, and send 1 monster from it to the GY. You can only activate 1 "Dogmatikamatrix" per turn.
target_text: -- Dogmatikamatrix
  local SETCARD_ID_0 = 0x145 --Dogmatika
  local s, id, o = GetID()
  function s.initial_effect(c)
  	--activate
  	local e1 = Effect.CreateEffect(c)
  	e1:SetCategory(CATEGORY_SEARCH + CATEGORY_TOHAND)
  	e1:SetType(EFFECT_TYPE_ACTIVATE)
  	e1:SetCode(EVENT_FREE_CHAIN)
  	e1:SetCountLimit(1, id + EFFECT_COUNT_CODE_OATH)
  	e1:SetOperation(s.activate)
  	c:RegisterEffect(e1)
  	--send to gy
  	local e2 = Effect.CreateEffect(c)
  	e2:SetDescription(aux.Stringid(id, 2))
  	e2:SetCategory(CATEGORY_TOGRAVE)
  	e2:SetType(EFFECT_TYPE_IGNITION)
  	e2:SetRange(LOCATION_SZONE)
  	e2:SetCountLimit(1)
  	e2:SetCondition(s.tgcon)
  	e2:SetTarget(s.tgtg)
  	e2:SetOperation(s.tgop)
  	c:RegisterEffect(e2)
  end
  function s.thfilter(c, specify)
  	return c:IsSetCard(SETCARD_ID_0) and (not specify or (c:IsType(TYPE_RITUAL) and c:IsType(TYPE_MONSTER + TYPE_SPELL))) and c:IsAbleToHand()
  end
  function s.activate(e, tp, eg, ep, ev, re, r, rp)
  	local g = Duel.GetMatchingGroup(s.thfilter, tp, LOCATION_DECK, 0, nil, true)
  	if #g > 0 and Duel.SelectYesNo(tp, aux.Stringid(id, 0)) then
  		Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_ATOHAND)
  		local sg = g:Select(tp, 1, 1, nil)
  		if Duel.SendtoHand(sg, nil, REASON_EFFECT) > 0 and sg:GetFirst():IsLocation(LOCATION_HAND) then
  			Duel.ConfirmCards(1 - tp, sg)
  			local g2 = Duel.GetMatchingGroup(s.thfilter, tp, LOCATION_DECK, 0, nil)
  			if #g2 > 0 and Duel.GetFieldGroupCount(tp, 0, LOCATION_MZONE) > 0 and Duel.SelectYesNo(tp, aux.Stringid(id, 1)) then
  				Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_ATOHAND)
  				local sg2 = g2:Select(tp, 1, 1, nil)
  				Duel.BreakEffect()
  				Duel.SendtoHand(sg2, nil, REASON_EFFECT)
  				Duel.ConfirmCards(1 - tp, sg2)
  			end
  		end
  	end
  end
  function s.cfilter(c)
  	return c:IsFaceup() and c:IsSetCard(SETCARD_ID_0) and c:IsType(TYPE_RITUAL)
  end
  function s.tgcon(e, tp, eg, ep, ev, re, r, rp)
  	return Duel.IsExistingMatchingCard(s.cfilter, tp, LOCATION_MZONE, 0, 1, nil)
  end
  function s.tgfilter0(c, tp)
  	if c:IsControler(tp) then
  		return c:IsType(TYPE_MONSTER) and c:IsAbleToGrave()
  	else
  		return Duel.IsPlayerCanSendtoGrave(tp, c)
  	end
  end
  function s.tgtg(e, tp, eg, ep, ev, re, r, rp, chk)
  	if chk == 0 then
  		return Duel.IsExistingMatchingCard(s.tgfilter0, tp, LOCATION_EXTRA, LOCATION_EXTRA, 1, nil, tp)
  	end
  	Duel.SetOperationInfo(0, CATEGORY_TOGRAVE, nil, 1, PLAYER_ALL, LOCATION_EXTRA)
  end
  function s.tgfilter(c)
  	return c:IsType(TYPE_MONSTER) and c:IsAbleToGrave()
  end
  function s.tgop(e, tp, eg, ep, ev, re, r, rp)
  	local g1 = Duel.GetFieldGroup(tp, LOCATION_EXTRA, 0)
  	local g2 = Duel.GetFieldGroup(tp, 0, LOCATION_EXTRA)
  	if #g1 == 0 and #g2 == 0 then
  		return
  	end
  	local g
  	local off = 1
  	local ops = {}
  	local opval = {}
  	if #g1 > 0 then
  		ops[off] = aux.Stringid(id, 3)
  		opval[off] = 0
  		off = off + 1
  	end
  	if #g2 > 0 then
  		ops[off] = aux.Stringid(id, 4)
  		opval[off] = 1
  		off = off + 1
  	end
  	local op = Duel.SelectOption(tp, table.unpack(ops)) + 1
  	local sel = opval[op]
  	if sel == 0 then
  		g = g1
  	elseif sel == 1 then
  		g = g2
  		Duel.ConfirmCards(tp, g, true)
  	end
  	Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_TOGRAVE)
  	local sg = g:FilterSelect(tp, s.tgfilter, 1, 1, nil)
  	if #sg > 0 then
  		Duel.BreakEffect()
  		Duel.SendtoGrave(sg, REASON_EFFECT)
  	end
  	if sel == 1 then
  		Duel.ShuffleExtra(1 - tp)
  	end
  end
  
  