From e7deec7acc1e29b60f02312be64bbe2bd0f22780 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Sat, 1 Jun 2024 18:12:59 +0200 Subject: track which deck a card comes from in log show deck as tinted background color with shift key --- info/readme.html | 2 +- play.css | 23 +++++++++++++++++++++++ play.js | 37 +++++++++++++++++++++++++++++++++++-- rules.js | 43 +++++++++++++++++++++++++++++++------------ 4 files changed, 90 insertions(+), 15 deletions(-) diff --git a/info/readme.html b/info/readme.html index e64a9e4..f8a5b41 100644 --- a/info/readme.html +++ b/info/readme.html @@ -63,4 +63,4 @@ Click the name and the city will scroll into view.

- + diff --git a/play.css b/play.css index 1f72299..89b1bdd 100644 --- a/play.css +++ b/play.css @@ -149,6 +149,8 @@ body { #log span.suit { font-size: 11px; } +span.value { padding: 0 1px } + span.suit.reserve { padding: 0 1px; } span.suit.spades { color: var(--color-spades) } @@ -156,6 +158,7 @@ span.suit.clubs { color: var(--color-clubs) } span.suit.hearts { color: var(--color-hearts) } span.suit.diamonds { color: var(--color-diamonds) } span.suit.reserve { color: var(--color-reserve); font-weight: bold; font-family: "Source Serif SmText"; } +span.suit.reserve { font-weight: bold; font-family: "Source Serif SmText"; } /* PANELS */ @@ -431,6 +434,26 @@ span.suit.reserve { color: var(--color-reserve); font-weight: bold; font-family: } } +body.shift span.value.deck_1 { background-color: #9513 } +body.shift span.value.deck_2 { background-color: #04f2 } +body.shift span.value.deck_3 { background-color: #0f03 } +body.shift span.value.deck_4 { background-color: #f002 } +body.shift span.value.deck_5 { background-color: #0002 } + +/* +body.shift .card.tc.face.deck_1 { border-color: #7d643d; } +body.shift .card.tc.face.deck_2 { border-color: #3e6c8c; } +body.shift .card.tc.face.deck_3 { border-color: #687e33; } +body.shift .card.tc.face.deck_4 { border-color: #ac4531; } +body.shift .card.tc.face.deck_1 { border-color: silver; } + +body.shift .card.tc.face.deck_1 { box-shadow: 0 0 0 2px #7d643d; } +body.shift .card.tc.face.deck_2 { box-shadow: 0 0 0 2px #3e6c8c; } +body.shift .card.tc.face.deck_3 { box-shadow: 0 0 0 2px #687e33; } +body.shift .card.tc.face.deck_4 { box-shadow: 0 0 0 2px #ac4531; } +body.shift .card.tc.face.deck_1 { box-shadow: 0 0 0 2px silver; } +*/ + /* CARDS */ .card { diff --git a/play.js b/play.js index 2e54aec..1d6f3bb 100644 --- a/play.js +++ b/play.js @@ -133,6 +133,8 @@ function to_suit(c) { } function to_value(c) { + if (to_suit(c) === 4) + return 10 return c & 15 } @@ -930,12 +932,26 @@ const colorize_H = '\u2665' const colorize_D = '\u2666' const colorize_R = '$1R' +const colorize_1 = '$1' +const colorize_2 = '$1' +const colorize_3 = '$1' +const colorize_4 = '$1' +const colorize_5 = '$1' + function colorize(text) { + text = text.replace(/1\^(\d+[\u2660\u2663\u2665\u2666R])/g, colorize_1) + text = text.replace(/2\^(\d+[\u2660\u2663\u2665\u2666R])/g, colorize_2) + text = text.replace(/3\^(\d+[\u2660\u2663\u2665\u2666R])/g, colorize_3) + text = text.replace(/4\^(\d+[\u2660\u2663\u2665\u2666R])/g, colorize_4) + text = text.replace(/5\^(\d+[\u2660\u2663\u2665\u2666R])/g, colorize_5) + text = text.replace(/(\d+)R/g, colorize_R) text = text.replaceAll("\u2660", colorize_S) text = text.replaceAll("\u2663", colorize_C) text = text.replaceAll("\u2665", colorize_H) text = text.replaceAll("\u2666", colorize_D) - text = text.replace(/(\d+)R/g, colorize_R) + +/* + */ return text } @@ -1242,6 +1258,22 @@ function sub_space(_match, p1) { return `${n}` } +const suit_icon = [ + '\u2660', + '\u2663', + '\u2665', + '\u2666', + 'R', +] + +function sub_tc(_match, p1) { + let c = p1 | 0 + let d = to_deck(c) + let v = to_value(c) + let s = to_suit(c) + return `${v}${suit_icon[s]}` +} + function on_log(text) { let p = document.createElement("div") @@ -1264,9 +1296,10 @@ function on_log(text) { text = text.replace(//g, ">") + text = colorize(text) text = text.replace(/S(\d+)/g, sub_space) text = text.replace(/P(\d+)/g, sub_piece) - text = colorize(text) + text = text.replace(/C(\d+)/g, sub_tc) if (text.match(/^\$(\d+)/)) { let fx = parseInt(text.substring(1)) diff --git a/rules.js b/rules.js index ac65ea3..89d84e3 100644 --- a/rules.js +++ b/rules.js @@ -311,12 +311,20 @@ function to_value(c) { return c & 15 } -function format_card(c) { +function format_card_prompt(c) { if (is_reserve(c)) return "10R" return to_value(c) + suit_name[to_suit(c)] } +function format_card(c) { + return (to_deck(c)+1) + "^" + format_card_prompt(c) +} + +function format_reserve(c, v) { + return (to_deck(c)+1) + "^" + v + "R" +} + function is_reserve(c) { return to_suit(c) === RESERVE } @@ -332,12 +340,18 @@ function is_west_of(here, there) { return dx < 0 && Math.abs(dx) >= Math.abs(dy) } -function format_cards(list) { +function format_card_list(list) { if (list.length > 0) return list.map(format_card).join(", ") return "nothing" } +function format_card_list_prompt(list) { + if (list.length > 0) + return list.map(format_card_prompt).join(", ") + return "nothing" +} + function format_selected() { if (game.selected.length === 0) return "nobody" @@ -1125,7 +1139,7 @@ states.tactical_cards_discard = { inactive: "draw tactical cards", prompt() { view.draw = game.draw - prompt("Draw " + format_cards(game.draw) + ". Discard one of them.") + prompt("Draw " + format_card_list_prompt(game.draw) + ". Discard one of them.") for (let c of game.draw) gen_action_card(c) }, @@ -1141,7 +1155,7 @@ states.tactical_cards_discard_done = { inactive: "draw tactical cards", prompt() { view.draw = game.draw - prompt("Draw " + format_cards(game.draw) + ".") + prompt("Draw " + format_card_list_prompt(game.draw) + ".") view.actions.end_cards = 1 }, end_cards() { @@ -1153,7 +1167,7 @@ states.tactical_cards_show = { inactive: "draw tactical cards", prompt() { view.draw = game.draw - prompt("Draw " + format_cards(game.draw) + ".") + prompt("Draw " + format_card_list_prompt(game.draw) + ".") view.actions.end_cards = 1 }, end_cards() { @@ -2411,10 +2425,12 @@ function play_card(c, sign) { } function play_reserve(v, sign) { + let c = game.reserve + delete game.reserve let prefix = (sign < 0 ? ">>" : ">") + POWER_NAME[game.power] if (fate_card_zero()) { let score = signed_number(sign * game.count) - log(`${prefix} 0R = ${score}`) + log(`${prefix} ${format_reserve(c, 0)} = ${score}`) clear_fate_effect() return } @@ -2425,9 +2441,9 @@ function play_reserve(v, sign) { game.count += v let score = signed_number(sign * game.count) if (bonus > 0) - log(`${prefix} ${v-bonus}R + ${bonus} = ${score}`) + log(`${prefix} ${format_reserve(c, v-bonus)} + ${bonus} = ${score}`) else - log(`${prefix} ${v}R = ${score}`) + log(`${prefix} ${format_reserve(c, v)} = ${score}`) if (bonus > 0) clear_fate_effect() } @@ -2437,6 +2453,7 @@ function play_combat_card(c, sign, resume, next_state) { array_remove_item(game.hand[game.power], c) if (is_reserve(c)) { game.state = next_state + game.reserve = c } else { play_card(c, sign) resume() @@ -2477,6 +2494,7 @@ states.combat_attack_reserve = { inactive: inactive_attack, prompt() { prompt_combat(game.count, "Choose value.") + view.draw = [ game.reserve ] gen_play_reserve() }, value(v) { @@ -2489,6 +2507,7 @@ states.combat_defend_reserve = { inactive: inactive_defend, prompt() { prompt_combat(-game.count, "Choose value.") + view.draw = [ game.reserve ] gen_play_reserve() }, value(v) { @@ -3656,7 +3675,7 @@ states.austria_and_russia_may_exchange_one_tc_with_each_other_2 = { states.austria_and_russia_may_exchange_one_tc_with_each_other_3 = { inactive: "exchange TC with Austria", prompt() { - prompt("You received " + format_card(game.exchange_a) + " from Austria.") + prompt("You received " + format_card_prompt(game.exchange_a) + " from Austria.") view.draw = [ game.exchange_a ] view.actions.done = 1 }, @@ -3672,7 +3691,7 @@ states.austria_and_russia_may_exchange_one_tc_with_each_other_3 = { states.austria_and_russia_may_exchange_one_tc_with_each_other_4 = { inactive: "exchange TC with Russia", prompt() { - prompt("You received " + format_card(game.exchange_r) + " from Russia.") + prompt("You received " + format_card_prompt(game.exchange_r) + " from Russia.") view.draw = [ game.exchange_r ] view.actions.done = 1 }, @@ -3705,7 +3724,7 @@ states.france_may_discard_any_one_tc_for_a_new_one_from_the_draw_deck = { states.france_may_discard_any_one_tc_for_a_new_one_from_the_draw_deck_2 = { inactive: "discard a TC for a new one", prompt() { - prompt("You drew " + format_cards(game.draw) + " from the draw deck.") + prompt("You drew " + format_card_list_prompt(game.draw) + " from the draw deck.") view.draw = game.draw view.actions.done = 1 }, @@ -3747,7 +3766,7 @@ states.prussia_may_draw_randomly_one_tc_from_austria_after_first_giving_one_tc_o states.prussia_may_draw_randomly_one_tc_from_austria_after_first_giving_one_tc_of_her_choice_to_austria_2 = { inactive: "randomly draw one TC from Austria", prompt() { - prompt("You randomly drew " + format_card(game.draw) + " from Austria.") + prompt("You randomly drew " + format_card_prompt(game.draw) + " from Austria.") view.draw = [ game.draw ] view.actions.done = 1 }, -- cgit v1.2.3