{:abilities[{:cost[:click1]:msg"shuffle 15 Minutes into R&D":label"Shuffle 15 Minutes into R&D":effect(req(let[corp-agendas(get-incorp[:scored])agenda-owner(if(some#(=(:cid%)(:cidcard))corp-agendas):corp:runner)](gain-agenda-pointstateagenda-owner(-(:agendapointscard)))); refresh agendapoints to 1 before shuffle in case it was modified by e.g. The Board
(movestate:corp(dissoc(assoccard:agendapoints1):seen:rezzed):deck{:fronttrue})(shuffle!state:corp:deck))}]:flags{:has-abilities-when-stolentrue}}
(letfn[(abt[ni](if(pos?i){:delayed-completiontrue:prompt"Select a piece of ICE from the Temporary Zone to install":choices{:req#(and(=(:side%)"Corp")(ice?%)(=(:zone%)[:play-area]))}:effect(req(when-completed(corp-installstatesidetargetnil{:no-install-costtrue:install-state:rezzed-no-cost})(let[card(get-cardstatecard)](unregister-eventsstatesidecard)(if(not(:shuffle-occurredcard))(if(<ni)(continue-abilitystateside(abt(incn)i)cardnil)(do(doseq[c(get-in@state[:corp:play-area])](system-msgstateside"trashes a card")(trashstatesidec{:unpreventabletrue}))(effect-completedstatesideeid)))(do(doseq[c(get-in@state[:corp:play-area])](movestatesidec:deck))(shuffle!stateside:deck)(effect-completedstatesideeid)))))):cancel-effect(req(doseq[c(get-in@state[:corp:play-area])](system-msgstateside"trashes a card")(trashstatesidec{:unpreventabletrue})))}{:prompt"None of the cards are ice. Say goodbye!":choices["I have no regrets"]:effect(req(doseq[c(get-in@state[:corp:play-area])](system-msgstateside"trashes a card")(trashstatesidec{:unpreventabletrue})))}))]{:interactive(reqtrue):optional{:prompt"Look at the top 3 cards of R&D?":yes-ability{:delayed-completiontrue:msg"look at the top 3 cards of R&D":effect(req(register-eventsstateside{:corp-shuffle-deck{:effect(effect(update!(assoccard:shuffle-occurredtrue)))}}card)(let[n(count(filterice?(take3(:deckcorp))))](doseq[c(take3(:deckcorp))](movestatesidec:play-area))(continue-abilitystateside(abt1n)cardnil)))}}})
{:events{:run{:req(req(first-event?stateside:run)):effect(effect(show-wait-prompt:runner"Corp to use Advanced Concept Hopper")(continue-ability{:player:corp:prompt"Use Advanced Concept Hopper to draw 1 card or gain 1 [Credits]?":once:per-turn:choices["Draw 1 card""Gain 1 [Credits]""No action"]:effect(req(casetarget"Gain 1 [Credits]"(do(gainstate:corp:credit1)(system-msgstate:corp(str"uses Advanced Concept Hopper to gain 1 [Credits]")))"Draw 1 card"(do(drawstate:corp)(system-msgstate:corp(str"uses Advanced Concept Hopper to draw 1 card")))"No action"(system-msgstate:corp(str"doesn't use Advanced Concept Hopper")))(clear-wait-promptstate:runner)(effect-completedstatesideeidcard))}cardnil))}}}
{:access{:delayed-completiontrue:req(req(not-empty(filter#(can-be-advanced?%)(all-installedstate:corp)))):effect(effect(show-wait-prompt:runner"Corp to place advancement tokens with Award Bait")(continue-ability{:delayed-completiontrue:choices["0","1","2"]:prompt"How many advancement tokens?":effect(req(let[c(Integer/parseInttarget)](continue-abilitystateside{:choices{:reqcan-be-advanced?}:msg(msg"place "c" advancement tokens on "(card-strstatetarget)):cancel-effect(effect(clear-wait-prompt:runner)):effect(effect(add-prop:corptarget:advance-counterc{:placedtrue})(clear-wait-prompt:runner))}cardnil)))}cardnil))}}
{:req(req(not(empty?(filter#(not=(:title%)"Bifrost Array")(:scoredcorp))))):optional{:prompt"Trigger the ability of a scored agenda?":yes-ability{:prompt"Choose an agenda to trigger its \"when scored\" ability":choices{:req#(and(is-type?%"Agenda")(not=(:title%)"Bifrost Array")(=(first(:zone%)):scored)(:abilities%))}:msg(msg"trigger the \"when scored\" ability of "(:titletarget)):effect(effect(continue-ability(card-deftarget)targetnil))}}}
{:delayed-completiontrue:effect(effect(tag-runner:runnereid2)):silent(reqtrue):msg"give the Runner 2 tags":end-turn{:effect(effect(lose:runner:tag2)):msg"make the Runner lose 2 tags"}}
{:prompt"Choose a resource to trash":choices{:req#(and(installed?%)(is-type?%"Resource"))}:msg(msg"trash "(:titletarget)):interactive(reqtrue):delayed-completiontrue:effect(effect(trasheidtarget{:unpreventabletrue}))}
{:msg"remove 1 bad publicity":effect(effect(lose:bad-publicity1)):silent(reqtrue):stolen{:msg"force the Corp to take 1 bad publicity":effect(effect(gain:corp:bad-publicity1))}}
{:msg(msg(if(>(:creditcorp)6)"gain 7 [Credits]""lose all credits")):interactive(reqtrue):effect(req(if(>(:creditcorp)6)(gainstate:corp:credit7)(losestate:corp:credit:all)))}
(letfn[(access-hq[cards]{:prompt"Select a card to access.":player:runner:choices[(str"Card from HQ")]:effect(req(system-msgstateside(str"accesses "(:title(firstcards))))(when-completed(handle-accessstateside[(firstcards)])(do(if(<1(countcards))(continue-abilitystateside(access-hq(nextcards))cardnil)(effect-completedstatesideeidcard)))))})](let[psi-effect{:delayed-completiontrue:mandatorytrue:effect(req(if(not-empty(:handcorp))(do(show-wait-promptstate:runner"Corp to select cards in HQ to be accessed")(continue-abilitystate:corp{:prompt(msg"Select "(access-countstateside:hq-access)" cards in HQ for the Runner to access"):choices{:req#(and(in-hand?%)(card-is?%:side:corp)):max(req(access-countstateside:hq-access))}:effect(effect(clear-wait-prompt:runner)(continue-ability:runner(access-hq(shuffletargets))cardnil))}cardnil))(effect-completedstatesideeidcard)))}]{:events{:successful-run{:interactive(reqtrue):psi{:req(req(=target:hq)):once:per-turn:not-equal{:effect(req(when-not(:replace-access(get-in@state[:run:run-effect]))(swap!stateupdate-in[:run:run-effect]#(assoc%:replace-accesspsi-effect)))(effect-completedstatesideeid))}}}}}))
(let[dhelper(fndpp[n]{:prompt"Select a card to install":show-discardtrue:choices{:req#(and(=(:side%)"Corp")(not(is-type?%"Operation"))(#{[:hand][:discard]}(:zone%)))}:effect(req(corp-installstatesidetarget(last(get-remote-names@state)){:no-install-costtrue})(if(<n2)(continue-abilitystateside(dpp(incn))cardnil)(effect-completedstatesideeidcard))):msg(msg(corp-install-msgtarget))})]{:optional{:prompt"Create a new remote server?":yes-ability{:prompt"Select a card to install":show-discardtrue:choices{:req#(and(=(:side%)"Corp")(not(is-type?%"Operation"))(#{[:hand][:discard]}(:zone%)))}:effect(req(corp-installstatesidetarget"New remote"{:no-install-costtrue})(continue-abilitystateside(dhelper1)cardnil)):msg"create a new remote server, installing cards at no cost"}}})
{:events{:pre-corp-install{:req(req(and(is-type?target"ICE")(empty?(let[cards(mapfirst(turn-eventsstateside:corp-install))](filter#(is-type?%"ICE")cards))))):effect(effect(ignore-install-costtrue))}:corp-install{:req(req(and(is-type?target"ICE")(empty?(let[cards(mapfirst(turn-eventsstateside:corp-install))](filter#(is-type?%"ICE")cards))))):msg(msg"ignore the install cost of the first ICE this turn")}}}
{:silent(reqtrue):effect(effect(add-countercard:agenda3)):abilities[{:cost[:click1]:counter-cost[:agenda1]:effect(effect(gain:click2)(register-turn-flag!card:can-advance(fn[statesidecard]((constantlyfalse)(toaststate:corp"Cannot advance cards this turn due to Efficiency Committee.""warning"))))):msg"gain [Click][Click]"}]}
{:access{:delayed-completiontrue:effect(effect(show-wait-prompt:runner"Corp to use Explode-a-palooza")(continue-ability{:optional{:prompt"Gain 5 [Credits] with Explode-a-palooza ability?":yes-ability{:msg"gain 5 [Credits]":effect(effect(gain:corp:credit5)(clear-wait-prompt:runner))}:no-ability{:effect(effect(clear-wait-prompt:runner))}}}cardnil))}}
{:access{:delayed-completiontrue:req(req(not=(first(:zonecard)):discard)):msg"do 2 net damage":effect(effect(damageeid:net2{:cardcard}))}:steal-cost-bonus(req[:credit2])}
{:effect(effect(add-countercard:agenda2)):silent(reqtrue):abilities[{:cost[:click1]:counter-cost[:agenda1]:msg"gain 7 [Credits] and take 1 bad publicity":effect(effect(gain:credit7:bad-publicity1))}]}
{:abilities[{:label"Host a card from HQ on Glenn Station":cost[:click1]:prompt"Choose a card to host on Glenn Station":choices(req(:handcorp)):msg"host a card from HQ":effect(effect(hostcardtarget{:facedowntrue}))}{:label"Add a card on Glenn Station to HQ":cost[:click1]:prompt"Choose a card on Glenn Station":choices(req(:hostedcard)):msg"add a hosted card to HQ":effect(effect(movetarget:hand))}]}
{:flags{:corp-phase-12(req(and(not-empty(get-in@state[:corp:discard]))(is-scored?state:corpcard)))}:abilities[{:prompt"Choose a card to add to the bottom of R&D":show-discardtrue:choices{:req#(and(=(:side%)"Corp")(=(:zone%)[:discard]))}:effect(effect(movetarget:deck)):msg(msg"add "(if(:seentarget)(:titletarget)"a card")" to the bottom of R&D")}]}
{:interactive(reqtrue):choices["0","1","2"]:prompt"How many power counters?":effect(req(let[c(Integer/parseInttarget)](continue-abilitystateside{:choices{:req#(<0(get-in%[:counter:power]0))}:msg(msg"add "c" power counters on "(:titletarget)):effect(final-effect(add-countertarget:powerc))}cardnil)))}
{:install-state:face-up:events{:advance{:req(req(=(:cidcard)(:cidtarget))):effect(req(let[n(if(>=(:advance-counter(get-cardstatecard))6)21)](continue-abilitystateside{:choices{:req#(and(not=(:cid%)(:cidcard))(can-be-advanced?%))}:msg(msg"place "n" advancement tokens on "(card-strstatetarget)):effect(final-effect(add-prop:corptarget:advance-countern{:placedtrue}))}cardnil)))}}}
{:effect(effect(add-countercard:agenda3)):silent(reqtrue):abilities[{:counter-cost[:agenda1]:msg"do 1 net damage":req(req(:run@state)):once:per-run:effect(effect(damageeid:net1{:cardcard}))}]}
{:msg"make the Runner gain 4 [Credits]":effect(effect(gain:runner:credit4)):interactive(reqtrue):stolen{:msg"make the Runner gain 4 [Credits]":effect(effect(gain:runner:credit4))}}
{:prevent{:jack-out[:all]}:silent(reqtrue):effect(effect(add-countercard:power2)):abilities[{:req(req(:run@state)):counter-cost[:power1]:effect(req(let[ls(filter#(="Labyrinthine Servers"(:title%))(:scoredcorp))](jack-out-preventstateside)(when(zero?(reduce+(for[cls](get-inc[:counter:power]))))(swap!stateupdate-in[:prevent]dissoc:jack-out)))):msg"prevent the Runner from jacking out"}]}
{:interactive(reqtrue):prompt"Choose an asset or upgrade to install from Archives or HQ":show-discardtrue:msg(msg"install and rez "(:titletarget)):choices{:req#(and(#{"Asset""Upgrade"}(:type%))(#{[:hand][:discard]}(:zone%))(=(:side%)"Corp"))}:effect(effect(corp-installeidtargetnil{:install-state:rezzed-no-cost}))}
{:msg"gain an additional [Click] per turn":silent(reqtrue):effect(effect(gain:click1:click-per-turn1)):swapped{:msg"gain an additional [Click] per turn":effect(req(when(=(:active-player@state):corp)(gainstate:corp:click1))(gainstate:corp:click-per-turn1))}:leave-play(req(losestate:corp:click1:click-per-turn1))}
{:install-state:face-up:events{:advance{:optional{:req(req(=(:cidcard)(:cidtarget))):prompt"Install a card from HQ in a new remote?":yes-ability{:prompt"Choose a card in HQ to install":choices{:req#(and(not(is-type?%"Operation"))(not(is-type?%"ICE"))(=(:side%)"Corp")(in-hand?%))}:msg(msg"install a card from HQ"(when(>=(:advance-counter(get-cardstatecard))5)" and rez it, ignoring all costs")):effect(req(if(>=(:advance-counter(get-cardstatecard))5)(do(corp-installstatesidetarget"New remote"{:install-state:rezzed-no-cost})(trigger-eventstateside:reztarget))(corp-installstatesidetarget"New remote")))}}}}}
(let[nq{:effect(req(let[extra(int(/(:runner-spenttarget)2))](when(pos?extra)(gainstateside:creditextra)(system-msgstate:corp(str"uses Net Quarantine to gain "extra" [Credits]")))(when(some?(get-in@state[:runner:temp-link]))(swap!stateassoc-in[:runner:link](:temp-linkrunner))(swap!statedissoc-in[:runner:temp-link]))))}]{:events{:trace{:once:per-turn:silent(reqtrue):effect(req(system-msgstate:corp"uses Net Quarantine to reduce Runner's base link to zero")(swap!stateassoc-in[:runner:temp-link](:linkrunner))(swap!stateassoc-in[:runner:link]0))}:successful-tracenq:unsuccessful-tracenq}})
{:silent(reqtrue):effect(effect(add-countercard:agenda1)):abilities[{:req(req(:run@state)):counter-cost[:agenda1]:msg"end the run":effect(effect(end-run))}]}
(let[pp{:req(req(pos?(count(:handrunner)))):effect(effect(trash(first(shuffle(:handrunner))))):msg(msg"force the Runner to trash "(:title(first(:discardrunner)))" from their Grip at random")}]{:events{:searched-stackpp:runner-install(assocpp:req(req(and(some#{:discard}(:previous-zonetarget))(pos?(count(:handrunner))))))}})
{:interactive(reqtrue):req(req(>(count(:scoredrunner))0)):msg(msg"do "(count(:scoredrunner))" net damage"):effect(effect(damageeid:net(count(:scoredrunner)){:cardcard}))}
{:optional{:prompt"Forfeit Posted Bounty to give the Runner 1 tag and take 1 bad publicity?":yes-ability{:msg"give the Runner 1 tag and take 1 bad publicity":delayed-completiontrue:effect(effect(gain:bad-publicity1)(tag-runner:runnereid1)(forfeitcard))}}}
{:interactive(reqtrue):choices{:req#(and(ice?%)(not(rezzed?%)))}:msg(msg"rez "(:titletarget)" at no cost"):effect(effect(reztarget{:ignore-cost:all-costs}))}
{:interactive(reqtrue):choices["0""1""2""3"]:prompt"How many bad publicity?":msg(msg"take "target" bad publicity and gain "(*5(Integer/parseInttarget))" [Credits]"):effect(final-effect(gain:credit(*5(Integer/parseInttarget)):bad-publicity(Integer/parseInttarget)))}
{:silent(reqtrue):req(req(and(>(:advance-countercard)4)(pos?(count(all-installedstate:runner))))):msg(msg(str"force the Runner to trash "(-(:advance-countercard)4)" installed card"(when(>(-(:advance-countercard)4)1)"s")" and take 1 bad publicity")):delayed-completiontrue:effect(req(show-wait-promptstate:corp"Runner to trash installed cards")(continue-abilitystate:runner{:prompt(msg"Choose "(-(:advance-countercard)4)" installed card"(when(>(-(:advance-countercard)4)1)"s")" to trash"):choices{:req#(and(:installed%)(=(:side%)"Runner")):max(min(-(:advance-countercard)4)(count(all-installedstate:runner)))}:effect(final-effect(trash-cardstargets)(system-msg(str"trashes "(join", "(map:titletargets))))(gain:corp:bad-publicity1))}cardnil)(clear-wait-promptstate:corp))}
{:silent(reqtrue):effect(effect(add-countercard:agenda(max0(-(:advance-countercard)3)))):abilities[{:counter-cost[:agenda1]:prompt"Choose a card":label"Search R&D and add 1 card to HQ";; we need the req or the prompt will still show
:req(req(<0(get-incard[:counter:agenda]0))):msg(msg"add "(:titletarget)" to HQ from R&D"):choices(req(cancellable(:deckcorp):sorted)):cancel-effect(effect(system-msg"cancels the effect of Project Atlas")):effect(effect(shuffle!:deck)(movetarget:hand))}]}
{:silent(reqtrue):effect(effect(add-countercard:agenda(-(:advance-countercard)2))):abilities[{:counter-cost[:agenda1]:msg"make a piece of ICE gain \"[Subroutine] Do 1 net damage\" after all its other subroutines for the remainder of the run"}]}
{:silent(reqtrue):effect(effect(add-countercard:agenda(-(:advance-countercard)3))):abilities[{:counter-cost[:agenda1]:prompt"Choose a card":req(req(<0(get-incard[:counter:agenda]0))):msg(msg"add "(if(:seentarget)(:titletarget)"an unseen card ")" to HQ from Archives"):choices(req(:discardcorp)):effect(effect(movetarget:hand))}]}
{:silent(reqtrue):effect(effect(add-countercard:agenda3)):abilities[{:req(req(and(ice?current-ice)(rezzed?current-ice)(has-subtype?current-ice"Bioroid"))):counter-cost[:agenda1]:msg"make the approached piece of bioroid ICE gain \"[Subroutine] End the run\" after all its other subroutines for the remainder of the run"}]}
{:events{:successful-run{:interactive(reqtrue):delayed-completiontrue:effect(req(show-wait-promptstate:runner"Corp to use Puppet Master")(continue-abilitystate:corp{:prompt"Choose a card to place 1 advancement token on with Puppet Master":player:corp:choices{:reqcan-be-advanced?}:cancel-effect(final-effect(clear-wait-prompt:runner)):msg(msg"place 1 advancement token on "(card-strstatetarget)):effect(final-effect(add-prop:corptarget:advance-counter1{:placedtrue})(clear-wait-prompt:runner))}cardnil))}}}
(letfn[(get-assets[statecorp](filter#(is-type?%"Asset")(concat(all-installedstate:corp)(:deckcorp)(:handcorp)(:discardcorp))))(add-ad[statesidec](update!stateside(assocc:subtype(combine-subtypesfalse;append ad even if it is already an ad
(:subtypec"")"Advertisement"))))]{:interactive(reqtrue):msg"make all assets gain Advertisement":effect(req(doseq[c(get-assetsstatecorp)](add-adstatesidec))):swapped{:msg"make all assets gain Advertisement":effect(req(doseq[c(get-assetsstatecorp)](add-adstatesidec)))}:leave-play(req(doseq[c(get-assetsstatecorp)](update!stateside(assocc:subtype(->>(split(or(:subtypec)"")#" - ")(drop1);so that all actual ads remain ads if agenda leaves play
(join" - "))))))})
{:silent(reqtrue):msg"increase their maximum hand size by 2":effect(effect(gain:hand-size-modification2)):swapped{:msg"increase their maximum hand size by 2":effect(effect(gain:hand-size-modification2))}:leave-play(effect(lose:hand-size-modification2))}
{:interactive(reqtrue):req(req(not(empty?(filter#(=(:title%)"Research Grant")(all-installedstate:corp))))):delayed-completiontrue:effect(effect(continue-ability{:prompt"Choose another installed copy of Research Grant to score":choices{:req#(=(:title%)"Research Grant")}:effect(effect(set-proptarget:advance-counter(:advancementcosttarget))(scoretarget)):msg"score another copy of Research Grant"}cardnil))}
{:silent(reqtrue):msg"decrease the Runner's maximum hand size by 1":effect(effect(lose:runner:hand-size-modification1)):swapped{:msg"decrease the Runner's maximum hand size by 1":effect(effect(lose:runner:hand-size-modification1))}:leave-play(effect(gain:runner:hand-size-modification1))}
{:effect(effect(add-countercard:agenda1)):silent(reqtrue):abilities[{:counter-cost[:agenda1]:req(req(some#(and(has-subtype?%"Bioroid")(not(rezzed?%)))(all-installedstate:corp))):prompt"Choose a bioroid to rez, ignoring all costs":choices{:req#(and(has-subtype?%"Bioroid")(not(rezzed?%)))}:msg(msg"rez "(card-strstatetarget)", ignoring all costs"):effect(req(let[ctarget](rezstatesidec{:ignore-cost:all-costs})(register-eventsstateside{:corp-turn-ends{:effect(effect(derezc)(unregister-eventscard))}:runner-turn-ends{:effect(effect(derezc)(unregister-eventscard))}}card)))}]:events{:corp-turn-endsnil:runner-turn-endsnil}}
{:interactive(reqtrue):prompt"Choose a card to add to HQ":choices(req(:deckcorp)):msg(msg"add a card from R&D to HQ and shuffle R&D"):effect(effect(shuffle!:deck)(movetarget:hand))}
{:access{:psi{:req(req(notinstalled)):not-equal{:msg(msg"prevent it from being stolen"):effect(final-effect(register-run-flag!card:can-steal(fn[__c](not=(:cidc)(:cidcard)))))}}}}
{:install-state:face-up:events{:advance{:req(req(=(:cidcard)(:cidtarget))):msg(msg(let[deck(:deckrunner)anydeck?(pos?(countdeck))adv4?(>=(:advance-counter(get-cardstatecard))4)](cond(andanydeck?adv4?)(str"trash "(join", "(map:title(take2deck)))" from the Runner's stack")(andanydeck?(notadv4?))(str"trash "(:title(firstdeck))" from the Runner's stack")(false?anydeck?)"trash from the Runner's stack but it is empty"))):effect(effect(mill:runner(if(>=(:advance-counter(get-cardstatecard))4)21)))}
{:implementation"Prevention of subroutine breaking is not enforced":delayed-completionfalse:prompt"Choose an ICE type for Unorthodox Predictions":choices["Sentry","Code Gate","Barrier"]:msg(msg"prevent subroutines on "target" ICE from being broken until next turn.")}
{:silent(reqtrue):effect(effect(add-countercard:agenda3)):abilities[{:optional{:req(req(>(get-incard[:counter:agenda]0)(:vmi-countcard0))):prompt"Cause the Runner to lose [Click] at the start of their next turn?":yes-ability{:effect(effect(toast(str"The Runner will lose "(inc(:vmi-countcard0))" [Click] at the start of their next turn")"info")(update!(update-incard[:vmi-count]#(inc(or%0)))))}}}]:events{:runner-turn-begins{:req(req(pos?(:vmi-countcard0))):msg(msg"to force the Runner to lose "(:vmi-countcard)" [Click]"):effect(effect(lose:runner:click(:vmi-countcard))(add-counter(dissoccard:vmi-count):agenda(-(:vmi-countcard))))}}}
{:interactive(reqtrue):msg"do 2 meat damage":effect(effect(damageeid:meat2{:cardcard})):stolen{:msg"force the Corp to take 1 bad publicity":effect(effect(gain:corp:bad-publicity1))}}