summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--events.txt6
-rw-r--r--play.css142
-rw-r--r--play.html3
-rw-r--r--play.js35
-rw-r--r--rules.js62
5 files changed, 171 insertions, 77 deletions
diff --git a/events.txt b/events.txt
index bf830c9..174bdfd 100644
--- a/events.txt
+++ b/events.txt
@@ -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
diff --git a/play.css b/play.css
index c0be34c..927f9aa 100644
--- a/play.css
+++ b/play.css
@@ -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 */
diff --git a/play.html b/play.html
index b8399e7..43cb4b7 100644
--- a/play.html
+++ b/play.html
@@ -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>
diff --git a/play.js b/play.js
index 15ab76c..b9a352c 100644
--- a/play.js
+++ b/play.js
@@ -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 = ""
}
diff --git a/rules.js b/rules.js
index 42b97a6..d0bf23a 100644
--- a/rules.js
+++ b/rules.js
@@ -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 ],
]