summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor@ccxvii.net>2023-06-23 01:32:25 +0200
committerTor Andersson <tor@ccxvii.net>2023-07-07 18:39:37 +0200
commite05ce5bf91eefbe70d4ee7780a4c9980ed23c8e9 (patch)
tree583a71d92734d32285af39807ddce737dfd85b85
parent1c5341697eb1bd41dd05e97a75c88fa461323a74 (diff)
downloadtime-of-crisis-e05ce5bf91eefbe70d4ee7780a4c9980ed23c8e9.tar.gz
Pretender (occupy).
-rw-r--r--play.css22
-rw-r--r--rules.js163
2 files changed, 171 insertions, 14 deletions
diff --git a/play.css b/play.css
index 3e2a722..d338b14 100644
--- a/play.css
+++ b/play.css
@@ -70,6 +70,11 @@ svg .region.action, svg .sea.action {
fill-opacity: 0.3;
}
+svg .region.selected {
+ fill-opacity: 0.3;
+ stroke-dasharray: 8 4;
+}
+
body.military svg .region.action {
fill: hsl(358, 78%, 51%);
}
@@ -82,23 +87,24 @@ body.populace svg .region.action {
fill: hsl(44, 80%, 52%);
}
+body.military svg .region.selected {
+ fill: hsl(358, 78%, 51%);
+ stroke: hsl(358, 78%, 51%);
+}
+
body.senate svg .region.selected {
fill: hsl(206, 100%, 35%);
fill-opacity: 0.3;
stroke: hsl(206, 100%, 35%);
- stroke-width: 4px;
- stroke-dasharray: 8 4;
}
-body.military svg .region.selected {
- fill: hsl(358, 78%, 51%);
+body.populace svg .region.selected {
+ fill: hsl(44, 80%, 52%);
fill-opacity: 0.3;
- stroke: hsl(358, 78%, 51%);
- stroke-width: 4px;
- stroke-dasharray: 8 4;
+ stroke: hsl(44, 80%, 52%);
}
-body.military svg .sea.action {
+body svg .sea.action {
fill: hsl(206, 100%, 35%);
fill-opacity: 0.25;
}
diff --git a/rules.js b/rules.js
index 2abc607..15b79ab 100644
--- a/rules.js
+++ b/rules.js
@@ -191,6 +191,30 @@ const ADJACENT = [
/* PONTUS_EUXINUS */ [ ASIA, THRACIA, GALATIA, GOTHS_HOMELAND, SASSANIDS_HOMELAND ],
]
+const PRETENDER_ADJACENT = [
+ /* ITALIA */ [ GALLIA, PANNONIA, MARE_OCCIDENTALE ],
+ /* ASIA */ [ THRACIA, GALATIA, MARE_ORIENTALE, PONTUS_EUXINUS ],
+ /* GALLIA */ [ ITALIA, PANNONIA, HISPANIA, BRITANNIA, FRANKS_HOMELAND, MARE_OCCIDENTALE, OCEANUS_ATLANTICUS ],
+ /* MACEDONIA */ [ PANNONIA, THRACIA, MARE_OCCIDENTALE, MARE_ORIENTALE ],
+ /* PANNONIA */ [ ITALIA, GALLIA, MACEDONIA, THRACIA, ALAMANNI_HOMELAND, FRANKS_HOMELAND, MARE_OCCIDENTALE ],
+ /* THRACIA */ [ ASIA, MACEDONIA, PANNONIA, ALAMANNI_HOMELAND, GOTHS_HOMELAND, MARE_ORIENTALE, PONTUS_EUXINUS ],
+ /* AEGYPTUS */ [ AFRICA, SYRIA, NOMADS_HOMELAND, MARE_ORIENTALE ],
+ /* AFRICA */ [ AEGYPTUS, HISPANIA, NOMADS_HOMELAND, MARE_OCCIDENTALE, MARE_ORIENTALE, OCEANUS_ATLANTICUS ],
+ /* HISPANIA */ [ GALLIA, AFRICA, MARE_OCCIDENTALE, OCEANUS_ATLANTICUS ],
+ /* BRITANNIA */ [ GALLIA, OCEANUS_ATLANTICUS ],
+ /* GALATIA */ [ ASIA, SYRIA, SASSANIDS_HOMELAND, MARE_ORIENTALE, PONTUS_EUXINUS ],
+ /* SYRIA */ [ AEGYPTUS, GALATIA, SASSANIDS_HOMELAND, MARE_ORIENTALE ],
+ /* ALAMANNI_HOMELAND */ [ PANNONIA, THRACIA, FRANKS_HOMELAND, GOTHS_HOMELAND ],
+ /* FRANKS_HOMELAND */ [ GALLIA, PANNONIA, ALAMANNI_HOMELAND ],
+ /* GOTHS_HOMELAND */ [ THRACIA, ALAMANNI_HOMELAND, PONTUS_EUXINUS ],
+ /* NOMADS_HOMELAND */ [ AEGYPTUS, AFRICA, OCEANUS_ATLANTICUS ],
+ /* SASSANIDS_HOMELAND */ [ GALATIA, SYRIA, PONTUS_EUXINUS ],
+ /* MARE_OCCIDENTALE */ [ ITALIA, GALLIA, MACEDONIA, PANNONIA, AFRICA, HISPANIA, MARE_ORIENTALE, OCEANUS_ATLANTICUS ],
+ /* MARE_ORIENTALE */ [ ASIA, MACEDONIA, THRACIA, AEGYPTUS, AFRICA, GALATIA, SYRIA, MARE_OCCIDENTALE ],
+ /* OCEANUS_ATLANTICUS */ [ GALLIA, AFRICA, HISPANIA, BRITANNIA, NOMADS_HOMELAND, MARE_OCCIDENTALE ],
+ /* PONTUS_EUXINUS */ [ ASIA, THRACIA, GALATIA, GOTHS_HOMELAND, SASSANIDS_HOMELAND ],
+]
+
// BARBARIANS
const ALAMANNI = 0
@@ -701,6 +725,13 @@ function get_province_governor(where) {
return find_governor((id, loc) => loc === where)
}
+function get_province_player(where) {
+ let gov = find_governor((id, loc) => loc === where)
+ if (gov >= 0)
+ return gov / 6 | 0
+ return -1
+}
+
function get_capital_general(where) {
return find_general((id, loc, cap) => loc === where && cap)
}
@@ -785,6 +816,13 @@ function has_enemy_army_in_province(where) {
return false
}
+function has_available_governor() {
+ for (let i = 0; i < 6; ++i)
+ if (get_governor_location(game.current * 6 + i) === AVAILABLE)
+ return true
+ return false
+}
+
function spend_ip(type, n) {
game.ip[type] -= n
}
@@ -1013,7 +1051,7 @@ function find_seat_of_power() {
function is_possible_seat_of_power(from) {
if (is_own_province(from) && get_support(from) >= 3)
- for (let to of ADJACENT[from])
+ for (let to of PRETENDER_ADJACENT[from])
if (is_own_province(to) && get_support(to) >= 3)
return true
return false
@@ -1021,7 +1059,7 @@ function is_possible_seat_of_power(from) {
function is_expand_pretender_province(from) {
if (get_support(from) >= 3 && !is_pretender_province(from) && is_own_province(from))
- for (let to of ADJACENT[from])
+ for (let to of PRETENDER_ADJACENT[from])
if (is_pretender_province(to) && is_own_province(to))
return true
return false
@@ -1665,8 +1703,105 @@ states.take_actions = {
// FREE ACTION: ENTER PROVINCIAL CAPITAL
function enter_capital() {
+ let where = get_general_location(game.selected_general)
+
set_general_inside_capital(game.selected_general)
- // TODO: seat of power / breakaway
+
+ if (is_pretender_province(where) && is_enemy_province(where)) {
+ game.count = get_province_governor(where) / 6 | 0
+ game.where = where
+ if (is_seat_of_power(where))
+ game.state = "occupy_seat_of_power_1"
+ else
+ game.state = "occupy_breakaway"
+ }
+}
+
+function resume_occupy_seat_of_power() {
+ for (let where = 1; where < 12; ++where) {
+ if (is_breakaway(where) && (get_province_governor(where) / 6 | 0) === game.count) {
+ game.state = "occupy_seat_of_power_2"
+ return
+ }
+ }
+ goto_replace_pretender()
+}
+
+states.occupy_seat_of_power_1 = {
+ prompt() {
+ prompt("Occupy Pretender Provincial Capital: Remove Seat of Power and pretender.")
+ view.color = POPULACE
+ gen_action_region(game.where)
+ },
+ region(where) {
+ push_undo()
+ log("Removed Seat of Power in S" + where)
+ remove_seat_of_power(where)
+ remove_governor(where)
+ resume_occupy_seat_of_power()
+ },
+}
+
+states.occupy_seat_of_power_2 = {
+ prompt() {
+ prompt("Occupy Pretender Provincial Capital: Remove Breakaway markers.")
+ view.color = POPULACE
+ for (let where = 1; where < 12; ++where)
+ if (is_breakaway(where) && (get_province_governor(where) / 6 | 0) === game.count)
+ gen_action_region(where)
+ },
+ region(where) {
+ push_undo()
+ log("Removed Breakaway in S" + where)
+ remove_breakaway(where)
+ resume_occupy_seat_of_power()
+ },
+}
+
+states.occupy_breakaway = {
+ prompt() {
+ prompt("Occupy Pretender Provincial Capital: Remove Breakaway marker.")
+ view.color = POPULACE
+ gen_action_region(game.where)
+ },
+ region(where) {
+ push_undo()
+ log("Removed Breakaway in S" + where)
+ remove_breakaway(where)
+ remove_governor(where)
+ goto_replace_pretender()
+ },
+}
+
+function goto_replace_pretender() {
+ if (has_available_governor())
+ game.state = "replace_pretender_governor"
+ else
+ game.state = "take_actions"
+}
+
+states.replace_pretender_governor = {
+ prompt() {
+ prompt("Occupy Pretender Provincial Capital: You may place an available Governor.")
+ view.selected_region = game.where
+ view.color = SENATE
+ for (let i = 0; i < 6; ++i) {
+ let id = game.current * 6 + i
+ if (get_governor_location(id) === AVAILABLE)
+ gen_action_governor(id)
+ }
+ view.actions.pass = 1
+ },
+ governor(id) {
+ push_undo()
+ log("Placed Governor in S" + game.where)
+ set_governor_location(id, game.where)
+ game.state = "take_actions"
+ },
+ pass() {
+ push_undo()
+ game.state = "take_actions"
+ },
}
// ACTION: IMPROVE SUPPORT
@@ -1687,7 +1822,6 @@ function recall_governor() {
spend_ip(SENATE, 2)
set_placed_governor(where)
remove_governor(where)
- update_neutral_italia()
}
// ACTION: PLACE GOVERNOR
@@ -1719,6 +1853,11 @@ function remove_governor(where) {
remove_all_mobs(where)
remove_quaestor(where)
+ // TODO: manual?
+ if (is_seat_of_power(where))
+ auto_remove_pretender_empire(where)
+ remove_breakaway(where)
+
let old_governor = get_province_governor(where)
if (old_governor >= 0) {
set_governor_location(old_governor, AVAILABLE)
@@ -2136,6 +2275,18 @@ states.mob = {
// CARD: PRETENDER
+function auto_remove_pretender_empire(seat) {
+ let pretender = get_province_governor(seat) / 6 | 0
+ log("Removed Seat of Power in S" + seat)
+ remove_seat_of_power(seat)
+ for (let where = 1; where < 12; ++where) {
+ if (is_breakaway(where) && (get_province_governor(where) / 6 | 0) === pretender) {
+ log("Removed Breakaway in S" + where)
+ remove_breakaway(where)
+ }
+ }
+}
+
function can_play_pretender() {
if (is_emperor_player())
return false
@@ -2171,7 +2322,7 @@ states.pretender_seat_of_power = {
function goto_pretender_breakaway() {
let seat = find_seat_of_power()
- for (let where of ADJACENT[seat]) {
+ for (let where of PRETENDER_ADJACENT[seat]) {
if (get_support(where) >= 3 && !is_breakaway(where) && is_own_province(where)) {
game.state = "pretender_breakaway"
return
@@ -2185,7 +2336,7 @@ states.pretender_breakaway = {
prompt("Pretender: Place Breakaway markers.")
view.color = POPULACE
let seat = find_seat_of_power()
- for (let where of ADJACENT[seat])
+ for (let where of PRETENDER_ADJACENT[seat])
if (get_support(where) >= 3 && !is_breakaway(where) && is_own_province(where))
gen_action_region(where)
},