Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Explicit reveals #7873

Merged
merged 5 commits into from
Jan 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 30 additions & 35 deletions src/clj/game/cards/events.clj
Original file line number Diff line number Diff line change
Expand Up @@ -3608,7 +3608,14 @@
:effect (effect (gain-credits :runner eid (rez-cost state side (get-card state (:card context)))))}])))}})

(defcard "Spark of Inspiration"
(letfn [(install-program [state side eid card revealed-card rev-str]
(letfn [(shuffle-back [revealed-cards]
{:async true
:effect (req (wait-for
(reveal-loud state side card
{:and-then "shuffle the Stack"} revealed-cards)
(shuffle! state side :deck)
(effect-completed state side eid)))})
(install-program [state side eid card revealed-card revealed-cards]
(if (can-pay? state side (assoc eid :source card :source-type :runner-install)
revealed-card nil
[(->c :credit (install-cost state side revealed-card {:cost-bonus -10}))])
Expand All @@ -3618,47 +3625,35 @@
{:prompt (str "Install " (:title revealed-card) " paying 10 [Credits] less?")
:waiting-prompt true
:yes-ability
{:msg (msg "reveal " rev-str " from the top of the stack")
:async true
:effect (req (wait-for (runner-install
state side
(make-eid state {:source card :source-type :runner-install})
revealed-card {:cost-bonus -10
:msg-keys {:install-source card
:display-origin true}})
(shuffle! state side :deck)
(system-msg state side "shuffles the Stack")
(effect-completed state side eid)))}
:no-ability
{:msg (msg "reveal " rev-str " from the top of the stack")
:effect (effect (shuffle! :deck)
(system-msg "shuffles the Stack"))}}}
{:async true
:effect (req (wait-for
(reveal-loud state side card nil revealed-cards)
(wait-for
(runner-install
state side
(make-eid state {:source card :source-type :runner-install})
revealed-card {:cost-bonus -10
:msg-keys {:install-source card
:display-origin true}})
(shuffle! state side :deck)
(system-msg state side "shuffles the Stack")
(effect-completed state side eid))))}
:no-ability (shuffle-back revealed-cards)}}
card nil)
(continue-ability ;;can't afford to install it somehow
state side
{:msg (msg "reveal " rev-str " from the top of the stack")
:effect (effect (shuffle! :deck)
(system-msg "shuffles the Stack"))}
card nil)))
(spark-search-fn [state side eid card remainder rev-str]
;;can't afford to install it somehow
(continue-ability state side (shuffle-back revealed-cards) card nil)))
(spark-search-fn [state side eid card remainder revealed-cards]
(if (not-empty remainder)
(let [revealed-card (first remainder)
rest-of-deck (rest remainder)
rev-str (if (= "" rev-str)
(:title revealed-card)
(str rev-str ", " (:title revealed-card)))]
revealed-cards (conj revealed-cards revealed-card)]
(if (program? revealed-card)
(install-program state side eid card revealed-card rev-str)
(spark-search-fn state side eid card rest-of-deck rev-str)))
(continue-ability
state side
{:msg (msg "reveal " rev-str " from the top of the stack")
:effect (effect (shuffle! :deck)
(system-msg "shuffles the Stack"))}
card nil)))]
(install-program state side eid card revealed-card revealed-cards)
(spark-search-fn state side eid card rest-of-deck revealed-cards)))
(continue-ability state side (shuffle-back revealed-cards) card nil)))]
{:on-play {:async true
:change-in-game-state (req (seq (:deck runner)))
:effect (effect (spark-search-fn eid card (:deck runner) ""))}}))
:effect (effect (spark-search-fn eid card (:deck runner) []))}}))

(defcard "Spear Phishing"
{:makes-run true
Expand Down
1 change: 1 addition & 0 deletions src/clj/game/core/diffs.clj
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,7 @@
:encounters
:end-turn
:gameid
:last-revealed
:log
:mark
:options
Expand Down
4 changes: 3 additions & 1 deletion src/clj/game/core/revealing.clj
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
(defn reveal
"Trigger the event for revealing one or more cards."
[state side eid & targets]
(apply trigger-event-sync state side eid (if (= :corp side) :corp-reveal :runner-reveal) (flatten targets)))
(let [cards (flatten targets)]
(swap! state assoc :last-revealed cards)
(apply trigger-event-sync state side eid (if (= :corp side) :corp-reveal :runner-reveal) cards)))

(defn reveal-loud
"Trigger the event for revealing one or more cards, and also handle the log printout"
Expand Down
2 changes: 2 additions & 0 deletions src/clj/game/core/turns.clj
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@
;; Fix for Hayley triggers
(swap! state assoc :turn-events nil)
(swap! state assoc-in [side :turn-started] true)
;; clear out last-revealed so cards don't stick around all game
(swap! state assoc :last-revealed [])

;; Functions to set up state for undo-turn functionality
(doseq [s [:runner :corp]] (swap! state dissoc-in [s :undo-turn]))
Expand Down
1 change: 1 addition & 0 deletions src/cljc/i18n/en.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -739,6 +739,7 @@
:play-area "Play Area"
:current "Current"
:scored-area "Scored Area"
:last-revealed "Last Revealed"
:archives "Archives"
:max-hand "Max hand size"
:brain-damage "Core Damage"
Expand Down
64 changes: 34 additions & 30 deletions src/cljs/nr/gameboard/board.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -708,7 +708,7 @@
(or (active? card)
(playable? card)))
0)
:draggable (when (not-spectator?) true)
:draggable (when (and (not-spectator?) (not disable-click)) true)
:on-touch-start #(handle-touchstart % card)
:on-touch-end #(handle-touchend %)
:on-touch-move #(handle-touchmove %)
Expand Down Expand Up @@ -1006,30 +1006,32 @@
^{:key idx}
[:div (draw-card c false)]))]]))))

(defn rfg-view [cards name popup]
(let [dom (atom {})]
(fn [cards name popup]
(when-not (empty? @cards)
(let [size (count @cards)]
[:div.panel.blue-shade.rfg {:class (when (> size 2) "squeeze")
:on-click (when popup #(-> (:rfg-popup @dom) js/$ .fadeToggle))}
(doall
(map-indexed (fn [i card]
[:div.card-wrapper {:key i
:style {:left (when (> size 1) (* (/ 128 size) i))}}
[:div [card-view card]]])
@cards))
[label @cards {:opts {:name name}}]
(when popup
[:div.panel.blue-shade.popup {:ref #(swap! dom assoc :rfg-popup %)
:class "opponent"}
[:div
[:a {:on-click #(close-popup % (:rfg-popup @dom) nil false false)} (tr [:game.close "Close"])]
[:label (tr [:game.card-count] size)]]
(doall
(for [c @cards]
^{:key (:cid c)}
[card-view c]))])])))))
(defn rfg-view
([cards name popup] (rfg-view cards name popup nil))
([cards name popup noclick]
(let [dom (atom {})]
(fn [cards name popup]
(when-not (empty? @cards)
(let [size (count @cards)]
[:div.panel.blue-shade.rfg {:class (when (> size 2) "squeeze")
:on-click (when popup #(-> (:rfg-popup @dom) js/$ .fadeToggle))}
(doall
(map-indexed (fn [i card]
[:div.card-wrapper {:key i
:style {:left (when (> size 1) (* (/ 128 size) i))}}
[:div [card-view card nil noclick]]])
@cards))
[label @cards {:opts {:name name}}]
(when popup
[:div.panel.blue-shade.popup {:ref #(swap! dom assoc :rfg-popup %)
:class "opponent"}
[:div
[:a {:on-click #(close-popup % (:rfg-popup @dom) nil false false)} (tr [:game.close "Close"])]
[:label (tr [:game.card-count] size)]]
(doall
(for [c @cards]
^{:key (:cid c)}
[card-view c]))])]))))))

(defn play-area-view [user name cards]
(fn [user name cards]
Expand Down Expand Up @@ -2152,7 +2154,7 @@
:reagent-render
(fn []
(when (and @corp @runner @side true)
(let [me-side (if (= :spectator @side)
(let [me-side (if (= :spectator @side)
(or (spectate-side) :corp)
@side)
op-side (utils/other-side me-side)
Expand Down Expand Up @@ -2248,6 +2250,7 @@
op-set-aside (r/cursor game-state [op-side :set-aside])
op-current (r/cursor game-state [op-side :current])
op-play-area (r/cursor game-state [op-side :play-area])
last-revealed (r/cursor game-state [:last-revealed])
me-rfg (r/cursor game-state [me-side :rfg])
me-set-aside (r/cursor game-state [me-side :set-aside])
me-current (r/cursor game-state [me-side :current])
Expand All @@ -2257,18 +2260,19 @@
[starting-timestamp @start-date @timer])
[rfg-view op-rfg (tr [:game.rfg "Removed from the game"]) true]
[rfg-view me-rfg (tr [:game.rfg "Removed from the game"]) true]
[rfg-view op-set-aside (tr [:game.set-aside "Set aside"]) true]
[rfg-view me-set-aside (tr [:game.set-aside "Set aside"]) true]
[rfg-view op-set-aside (tr [:game.set-aside "Set aside"]) false]
[rfg-view me-set-aside (tr [:game.set-aside "Set aside"]) false]
[play-area-view op-user (tr [:game.play-area "Play Area"]) op-play-area]
[play-area-view me-user (tr [:game.play-area "Play Area"]) me-play-area]
[rfg-view op-current (tr [:game.current "Current"]) false]
[rfg-view me-current (tr [:game.current "Current"]) false]])
[rfg-view me-current (tr [:game.current "Current"]) false]
[rfg-view last-revealed (tr [:game.last-revealed "Last Revealed"]) false true]])
(when (or (not= @side :spectator)
(and (spectator-view-hidden?) (spectate-side)))
[button-pane {:side me-side :active-player active-player :run run :encounters encounters
:end-turn end-turn :runner-phase-12 runner-phase-12
:corp-phase-12 corp-phase-12 :corp corp :runner runner
:me me :opponent opponent :prompt-state prompt-state}])]]
:me me :opponent opponent :prompt-state prompt-state}])]]

[:div.me
[hand-view me-side me-hand me-hand-size me-hand-count prompt-state true]]]]
Expand Down
Loading