diff options
-rw-r--r-- | events.txt | 6 | ||||
-rw-r--r-- | play.css | 142 | ||||
-rw-r--r-- | play.html | 3 | ||||
-rw-r--r-- | play.js | 35 | ||||
-rw-r--r-- | rules.js | 62 |
5 files changed, 171 insertions, 77 deletions
@@ -92,8 +92,8 @@ SHADED 4 EVENT 5 stay_eligible current REBEL_FACTIONS - prompt `Replace up to 3 Delhi Sultanate Units with Rebelling ${PIECE_FACTION_TYPE_NAME[game.current][ELITE]}.` - piece_undo_opt 3 (is_adjacent_to_city(C_CHITTOR, piece_space(p)) && can_place_piece(piece_space(p), game.current, ELITE) && is_ds_unit(p)) + prompt `Replace up to 2 Delhi Sultanate Units with Rebelling ${PIECE_FACTION_TYPE_NAME[game.current][ELITE]}.` + piece_undo_opt 2 (is_adjacent_to_city(C_CHITTOR, piece_space(p)) && can_place_piece(piece_space(p), game.current, ELITE) && is_ds_unit(p)) set_piece_space remove auto_place_rebel (game.current) ELITE @@ -578,7 +578,7 @@ SHADED 25 EVENT 26 stay_eligible - log "NOT IMPLEMENTED" + event_26 EVENT 27 current BK @@ -375,21 +375,25 @@ path.campaign { stroke: black; stroke-dasharray: 4 4; } #this_card { position: relative; } -#this_card.c #shaded_event { border-top-color: transparent; } -#this_card.c #unshaded_event { border-image: radial-gradient(100px 30px at bottom, transparent 65%, white) 3 } +#this_card.c .shaded_event { border-top-color: transparent; } +#this_card.c .unshaded_event { border-image: radial-gradient(100px 30px at bottom, transparent 65%, white) 3 } -#unshaded_event, #shaded_event { +#of_gods_and_kings.c .shaded_event { border-top-color: transparent; } +#of_gods_and_kings.c .unshaded_event { border-image: radial-gradient(100px 30px at bottom, transparent 65%, white) 3 } + + +.unshaded_event, .shaded_event { display: none; position: absolute; box-sizing: border-box; border: 3px solid white; } -#shaded_event.action, #unshaded_event.action { +.shaded_event.action, .unshaded_event.action { display: block; } -#unshaded_event { +.unshaded_event { left: 5px; right: 5px; top: 202px; @@ -397,7 +401,7 @@ path.campaign { stroke: black; stroke-dasharray: 4 4; } border-radius: 10px; } -#shaded_event { +.shaded_event { left: 4px; right: 4px; bottom: 3px; @@ -405,101 +409,103 @@ path.campaign { stroke: black; stroke-dasharray: 4 4; } border-radius: 10px; } -#this_card.card_1 #shaded_event { bottom: 3px; } +#this_card, #of_gods_and_kings { + &.card_1 .shaded_event { bottom: 3px; } -#this_card.card_2 #unshaded_event { height: 64px; top: 204px; left: 20px; right: 20px; } + &.card_2 .unshaded_event { height: 64px; top: 204px; left: 20px; right: 20px; } -#this_card.card_3 #unshaded_event { height: 72px; left: 10px; right: 10px; } -#this_card.card_3 #shaded_event { height: 76px; } + &.card_3 .unshaded_event { height: 72px; left: 10px; right: 10px; } + &.card_3 .shaded_event { height: 76px; } -#this_card.card_4 #unshaded_event { height: 76px; top: 206px; left: 10px; right: 10px; } -#this_card.card_4 #shaded_event { height: 68px; } + &.card_4 .unshaded_event { height: 76px; top: 206px; left: 10px; right: 10px; } + &.card_4 .shaded_event { height: 68px; } -#this_card.card_5 #unshaded_event { height: 68px; top: 204px; left: 3px; right: 3px; } -#this_card.card_5 #shaded_event { height: 78px; } + &.card_5 .unshaded_event { height: 68px; top: 204px; left: 3px; right: 3px; } + &.card_5 .shaded_event { height: 78px; } -#this_card.card_6 #unshaded_event { height: 74px; top: 206px; left: 7px; right: 7px; } -#this_card.card_6 #shaded_event { height: 70px; } + &.card_6 .unshaded_event { height: 74px; top: 206px; left: 7px; right: 7px; } + &.card_6 .shaded_event { height: 70px; } -#this_card.card_7 #unshaded_event { height: 73px; top: 201px; left: 8px; right: 8px; } -#this_card.card_7 #shaded_event { height: 75px; } + &.card_7 .unshaded_event { height: 73px; top: 201px; left: 8px; right: 8px; } + &.card_7 .shaded_event { height: 75px; } -#this_card.card_8 #unshaded_event { height: 70px; left: 10px; right: 10px; } -#this_card.card_8 #shaded_event { height: 78px; right: 3px; left: 3px; } + &.card_8 .unshaded_event { height: 70px; left: 10px; right: 10px; } + &.card_8 .shaded_event { height: 78px; right: 3px; left: 3px; } -#this_card.card_9 #unshaded_event { height: 69px; top: 200px; left: 10px; right: 10px; } -#this_card.card_9 #shaded_event { height: 80px; bottom: 4px; } + &.card_9 .unshaded_event { height: 69px; top: 200px; left: 10px; right: 10px; } + &.card_9 .shaded_event { height: 80px; bottom: 4px; } -#this_card.card_10 #unshaded_event { height: 81px; top: 201px; left: 16px; right: 16px; } -#this_card.card_10 #shaded_event { height: 68px; } + &.card_10 .unshaded_event { height: 81px; top: 201px; left: 16px; right: 16px; } + &.card_10 .shaded_event { height: 68px; } -#this_card.card_11 #unshaded_event { height: 76px; top: 206px; left: 12px; right: 12px; } -#this_card.card_11 #shaded_event { height: 68px; } + &.card_11 .unshaded_event { height: 76px; top: 206px; left: 12px; right: 12px; } + &.card_11 .shaded_event { height: 68px; } -#this_card.card_12 #unshaded_event { height: 68px; top: 200px; left: 16px; right: 16px; } + &.card_12 .unshaded_event { height: 68px; top: 200px; left: 16px; right: 16px; } -#this_card.card_13 #unshaded_event { height: 68px; top: 200px; left: 10px; right: 10px; } + &.card_13 .unshaded_event { height: 68px; top: 200px; left: 10px; right: 10px; } -#this_card.card_14 #unshaded_event { height: 68px; top: 199px; left: 1px; right: 1px; } -#this_card.card_14 #shaded_event { bottom: 4px; } + &.card_14 .unshaded_event { height: 68px; top: 199px; left: 1px; right: 1px; } + &.card_14 .shaded_event { bottom: 4px; } -#this_card.card_15 #unshaded_event { height: 74px; top: 205px; } -#this_card.card_15 #shaded_event { height: 71px; } + &.card_15 .unshaded_event { height: 74px; top: 205px; } + &.card_15 .shaded_event { height: 71px; } -#this_card.card_16 #unshaded_event { height: 67px; top: 201px; left: 18px; right: 18px; } + &.card_16 .unshaded_event { height: 67px; top: 201px; left: 18px; right: 18px; } -#this_card.card_17 #unshaded_event { height: 70px; top: 204px; left: 16px; right: 16px; } -#this_card.card_17 #shaded_event { height: 76px; } + &.card_17 .unshaded_event { height: 70px; top: 204px; left: 16px; right: 16px; } + &.card_17 .shaded_event { height: 76px; } -#this_card.card_18 #unshaded_event { height: 76px; top: 206px; } -#this_card.card_18 #shaded_event { height: 68px; } + &.card_18 .unshaded_event { height: 76px; top: 206px; } + &.card_18 .shaded_event { height: 68px; } -#this_card.card_19 #unshaded_event { height: 74px; } -#this_card.card_19 #shaded_event { height: 74px; } + &.card_19 .unshaded_event { height: 74px; } + &.card_19 .shaded_event { height: 74px; } -#this_card.card_20 #unshaded_event { height: 72px; } -#this_card.card_20 #shaded_event { height: 76px; } + &.card_20 .unshaded_event { height: 72px; } + &.card_20 .shaded_event { height: 76px; } -#this_card.card_21 #unshaded_event { height: 78px; top: 204px; left: 12px; right: 12px; } -#this_card.card_21 #shaded_event { height: 68px; } + &.card_21 .unshaded_event { height: 78px; top: 204px; left: 12px; right: 12px; } + &.card_21 .shaded_event { height: 68px; } -#this_card.card_22 #unshaded_event { height: 70px; top: 204px; left: 2px; right: 2px; } -#this_card.card_22 #shaded_event { height: 76px; } + &.card_22 .unshaded_event { height: 70px; top: 204px; left: 2px; right: 2px; } + &.card_22 .shaded_event { height: 76px; } -#this_card.card_23 #unshaded_event { height: 82px; top: 200px; left: 8px; right: 8px; } -#this_card.card_23 #shaded_event { height: 68px; } + &.card_23 .unshaded_event { height: 82px; top: 200px; left: 8px; right: 8px; } + &.card_23 .shaded_event { height: 68px; } -#this_card.card_24 #unshaded_event { height: 75px; top: 206px; left: 3px; right: 3px; } -#this_card.card_24 #shaded_event { height: 69px; } + &.card_24 .unshaded_event { height: 75px; top: 206px; left: 3px; right: 3px; } + &.card_24 .shaded_event { height: 69px; } -#this_card.card_26 #unshaded_event { height: 145px; left: 1px; right: 1px; } + &.card_26 .unshaded_event { height: 145px; left: 1px; right: 1px; } -#this_card.card_27 #unshaded_event { height: 72px; left: 3px; right: 3px; } -#this_card.card_27 #shaded_event { height: 76px; } + &.card_27 .unshaded_event { height: 72px; left: 3px; right: 3px; } + &.card_27 .shaded_event { height: 76px; } -#this_card.card_28 #unshaded_event { height: 76px; top: 204px; left: 2px; right: 2px; } -#this_card.card_28 #shaded_event { height: 70px; left: 2px; right: 2px; } + &.card_28 .unshaded_event { height: 76px; top: 204px; left: 2px; right: 2px; } + &.card_28 .shaded_event { height: 70px; left: 2px; right: 2px; } -#this_card.card_29 #unshaded_event { height: 65px; top: 206px; left: 18px; right: 18px; } -#this_card.card_29 #shaded_event { height: 80px; bottom: 2px; } + &.card_29 .unshaded_event { height: 65px; top: 206px; left: 18px; right: 18px; } + &.card_29 .shaded_event { height: 80px; bottom: 2px; } -#this_card.card_31 #unshaded_event { height: 74px; top: 202px; left: 9px; right: 9px; } -#this_card.card_31 #shaded_event { height: 74px; } + &.card_31 .unshaded_event { height: 74px; top: 202px; left: 9px; right: 9px; } + &.card_31 .shaded_event { height: 74px; } -#this_card.card_32 #unshaded_event { height: 83px; top: 207px; left: 10px; right: 10px; } -#this_card.card_32 #shaded_event { height: 60px; } + &.card_32 .unshaded_event { height: 83px; top: 207px; left: 10px; right: 10px; } + &.card_32 .shaded_event { height: 60px; } -#this_card.card_33 #unshaded_event { height: 76px; top: 206px; left: 1px; right: 1px; } -#this_card.card_33 #shaded_event { height: 68px; } + &.card_33 .unshaded_event { height: 76px; top: 206px; left: 1px; right: 1px; } + &.card_33 .shaded_event { height: 68px; } -#this_card.card_34 #unshaded_event { height: 74px; top: 206px; left: 8px; right: 8px; } -#this_card.card_34 #shaded_event { height: 70px; } + &.card_34 .unshaded_event { height: 74px; top: 206px; left: 8px; right: 8px; } + &.card_34 .shaded_event { height: 70px; } -#this_card.card_35 #unshaded_event { height: 83px; top: 205px; left: 3px; right: 3px; } -#this_card.card_35 #shaded_event { height: 62px; } + &.card_35 .unshaded_event { height: 83px; top: 205px; left: 3px; right: 3px; } + &.card_35 .shaded_event { height: 62px; } -#this_card.card_36 #unshaded_event { height: 76px; top: 205px; left: 2px; right: 2px; } -#this_card.card_36 #shaded_event { height: 69px; } + &.card_36 .unshaded_event { height: 76px; top: 205px; left: 2px; right: 2px; } + &.card_36 .shaded_event { height: 69px; } +} /* TOKEN IMAGES */ @@ -345,9 +345,10 @@ c-32 0 -38 0 -46 2 -11 2 -20 5 -23 6 -2 0 -5 2 -8 3 -4 1 -10 4 -14 6 -6 4 </div> <div id="card_panel"> - <div id="this_card" class="card card_1"><div id="unshaded_event"></div><div id="shaded_event"></div></div> + <div id="this_card" class="card card_1"><div id="unshaded_event" class="unshaded_event"></div><div id="shaded_event" class="shaded_event"></div></div> <div id="deck_outer" class="card card_back"><div id="deck_size">35</div></div> <div id="dynasty_card" class="card card_dynasty_khalji"></div> + <div id="of_gods_and_kings" class="hide"><div id="gk_unshaded_event" class="unshaded_event"></div><div id="gk_shaded_event" class="shaded_event"></div></div> </div> </div> @@ -444,6 +444,8 @@ let ui = { this_card: document.getElementById("this_card"), shaded_event: document.getElementById("shaded_event"), unshaded_event: document.getElementById("unshaded_event"), + gk_shaded_event: document.getElementById("gk_shaded_event"), + gk_unshaded_event: document.getElementById("gk_unshaded_event"), deck_outer: document.getElementById("deck_outer"), deck_size: document.getElementById("deck_size"), of_gods_and_kings: document.getElementById("of_gods_and_kings"), @@ -517,6 +519,8 @@ function init_ui() { register_action(ui.this_card, "event", undefined) register_action(ui.unshaded_event, "unshaded", undefined) register_action(ui.shaded_event, "shaded", undefined) + register_action(ui.gk_unshaded_event, "gk_unshaded", undefined) + register_action(ui.gk_shaded_event, "gk_shaded", undefined) register_action(ui.resources[DS], "resources", DS) register_action(ui.resources[BK], "resources", BK) register_action(ui.resources[VE], "resources", VE) @@ -530,6 +534,10 @@ function init_ui() { ui.shaded_event.onmouseleave = on_focus_this_event ui.unshaded_event.onmouseenter = on_focus_unshaded_event ui.unshaded_event.onmouseleave = on_focus_this_event + ui.gk_shaded_event.onmouseenter = on_focus_gk_shaded_event + ui.gk_shaded_event.onmouseleave = on_focus_this_event + ui.gk_unshaded_event.onmouseenter = on_focus_gk_unshaded_event + ui.gk_unshaded_event.onmouseleave = on_focus_this_event // Make combat table draggable dragElement(ui.attack_table) @@ -982,10 +990,17 @@ function on_update() { ui.deck_outer.className = "hide" } + if (view.deck[2][1] !== null) + ui.of_gods_and_kings.className = make_card_class_name(view.deck[2][0]) + else + ui.of_gods_and_kings.className = "hide" + ui.this_card.classList.toggle("action", !!(view.actions && view.actions.event === 1)) ui.shaded_event.classList.toggle("action", !!(view.actions && view.actions.shaded === 1)) ui.unshaded_event.classList.toggle("action", !!(view.actions && view.actions.unshaded === 1)) - + ui.gk_shaded_event.classList.toggle("action", !!(view.actions && view.actions.gk_shaded === 1)) + ui.gk_unshaded_event.classList.toggle("action", !!(view.actions && view.actions.gk_unshaded === 1)) + console.log(view.actions) // Dynasty card if (view.succ > 0) ui.dynasty_card.className = "card card_dynasty_tughlaq" @@ -1410,6 +1425,17 @@ function on_focus_unshaded_event() { } } +function on_focus_gk_unshaded_event() { + let c = view.deck[2][0] + if (c > 0) { + let f = data.card_flavor[c] + if (f) + ui.status.textContent = data.card_title[c] + " - " + f + else + ui.status.textContent = data.card_title[c] + } +} + function on_focus_shaded_event() { let c = view.deck[0] if (c > 0) { @@ -1417,6 +1443,13 @@ function on_focus_shaded_event() { } } +function on_focus_gk_shaded_event() { + let c = view.deck[2][0] + if (c > 0) { + ui.status.textContent = data.card_title[c] + " - " + data.card_flavor_shaded[c] + } +} + function on_blur_event() { ui.status.textContent = "" } @@ -229,6 +229,7 @@ exports.setup = function (seed, scenario, _options) { pieces: Array(104).fill(AVAILABLE), // piece locations cavalry: Array(10).fill(AVAILABLE), deck: [], + of_gods_and_kings: [null, null, 0], order: [], cmd: { type: null, @@ -288,7 +289,9 @@ function setup_deck() { if (p<3) deck = deck.concat([45+p]) } + game.of_gods_and_kings[0] = cards[cards.length-1] game.deck = deck + game.deck = [1, 26, 23, 22] } function setup_standard() { @@ -700,6 +703,8 @@ states.main_phase = { event() { goto_event(0) }, unshaded() { goto_event(0) }, shaded() { goto_event(1) }, + gk_unshaded() { goto_gk_event(0) }, + gk_shaded() { goto_gk_event(1) }, end_of_turn: resume_event_card, } @@ -3873,12 +3878,42 @@ function gen_any_event() { view.actions.unshaded = 1 view.actions.shaded = 1 } + + if (game.of_gods_and_kings[1] === game.current) { + view.actions.gk_shaded = 1 + view.actions.gk_unshaded = 1 + } +} + +function goto_gk_event(shaded) { + push_undo() + let c = game.of_gods_and_kings[0] + game.of_gods_and_kings[2] = 1 + game.cmd = 0 + + if (shaded) { + log_h2(faction_name[game.current] + " - Shaded Event") + log(faction_acronyms[game.current] + " is using the set-aside Event Card.") + log_br() + log("C" + c) + log(".i " + data.card_flavor_shaded[c] + ".") + log_br() + goto_vm(c * 2 + 1) + } else { + log_h2(faction_name[game.current] + " - Event") + log(faction_acronyms[game.current] + " is using the set-aside Event Card.") + log_br() + log("C" + c) + if (data.card_flavor[c]) + log(".i " + data.card_flavor[c] + ".") + log_br() + goto_vm(c * 2 + 0) + } } function goto_event(shaded) { push_undo() let c = this_card() - game.cmd = 0 if (shaded) { @@ -3898,6 +3933,8 @@ function goto_event(shaded) { } function end_event() { + if (game.of_gods_and_kings[2] === 1) + clean_gk() game.vm = null resume_event_card() } @@ -3907,7 +3944,10 @@ function event_prompt(str) { str = CODE[game.vm.fp][game.vm.prompt][1] if (typeof str === "function") str = str() - view.prompt = data.card_title[this_card()] + ": " + str + if (game.of_gods_and_kings[2] === 1) + view.prompt = data.card_title[game.of_gods_and_kings[0]] + ": " + str + else + view.prompt = data.card_title[this_card()] + ": " + str } // === VM === @@ -4228,7 +4268,7 @@ function vm_set_space() { } function vm_stay_eligible() { - log("Marked " + faction_name[game.current] + " Eligible.") + log(faction_acronyms[game.current] + " stays Eligible.") game.marked |= (16 << game.current) vm_next() } @@ -5032,6 +5072,20 @@ states.event_25 = { } } +// VM: EVENT_26 + +function vm_event_26() { + game.of_gods_and_kings[1] = game.current + game.state = "event_26" + log(faction_acronyms[game.current] + " draws C" + game.of_gods_and_kings[0]) + vm_next() +} + +function clean_gk() { + game.of_gods_and_kings[1] = null + game.of_gods_and_kings[2] = 0 +} + // VM: SHADED_29 function vm_shaded_29() { @@ -5840,7 +5894,7 @@ CODE[25 * 2 + 1] = [ // EVENT 26 CODE[26 * 2 + 0] = [ [ vm_stay_eligible ], - [ vm_log, "NOT IMPLEMENTED" ], + [ vm_event_26 ], [ vm_return ], ] |