summaryrefslogtreecommitdiff
path: root/rules.js
diff options
context:
space:
mode:
authorTor Andersson <tor@ccxvii.net>2025-02-09 11:19:25 +0100
committerTor Andersson <tor@ccxvii.net>2025-02-09 12:13:54 +0100
commit5ee57d1a8ef1bcb5e228b171016626a9f7c10f71 (patch)
treec379e8d6a930321e81fd3ad144294b701d02f21a /rules.js
parent423c8b68dd1213939dc3591b28a7f08ab56ae78d (diff)
downloadcrusader-rex-5ee57d1a8ef1bcb5e228b171016626a9f7c10f71.tar.gz
Add handicap scenarios to adjust initial draws.
Diffstat (limited to 'rules.js')
-rw-r--r--rules.js63
1 files changed, 57 insertions, 6 deletions
diff --git a/rules.js b/rules.js
index d874126..3318b2a 100644
--- a/rules.js
+++ b/rules.js
@@ -8,7 +8,10 @@
// TODO: sea move into attacked fortified port as defender responder? -- not besieged yet
exports.scenarios = [
- "Standard"
+ "Standard",
+ "+1/-1 Handicap",
+ "+2/-2 Handicap",
+ "+3/-3 Handicap",
]
exports.roles = [
@@ -44,6 +47,7 @@ const MASYAF = town_index["Masyaf"]
const ST_SIMEON = town_index["St. Simeon"]
const TRIPOLI = town_index["Tripoli"]
const TYRE = town_index["Tyre"]
+const ACRE = town_index["Acre"]
const NOBODY = -1
const ASSASSINS = block_index["Assassins"]
@@ -1023,6 +1027,25 @@ function is_valid_frank_deployment() {
}
function goto_frank_deployment() {
+ // handicap option (pilgrims to port, crusaders to holding)
+ for (let i = 0; i < game.f_draw; ++i) {
+ let b = select_random_block(F_POOL)
+ log(BLOCKS[b].name + " arrived.")
+ switch (block_type(b)) {
+ case 'pilgrims':
+ deploy(b, ACRE) // start pilgrims at Acre, can redeploy to any other port
+ break
+ case 'crusaders':
+ deploy(b, block_home(b))
+ break
+ default:
+ throw "IMPOSSIBLE"
+ }
+ }
+ if (game.f_draw > 0)
+ log("")
+ delete game.f_draw
+
game.active = FRANKS
game.state = 'frank_deployment'
}
@@ -1037,7 +1060,9 @@ states.frank_deployment = {
gen_action(view, 'next')
for (let b = 0; b <= last_block; ++b) {
if (block_owner(b) === game.active && is_block_on_land(b))
- if (block_seats[b].length > 1)
+ if (block_type(b) === 'pilgrims')
+ gen_action(view, 'block', b)
+ else if (block_seats[b].length > 1)
gen_action(view, 'block', b)
}
if (errors.length > 0)
@@ -1065,9 +1090,15 @@ states.frank_deployment_to = {
gen_action_undo(view)
gen_action(view, 'block', game.who)
let from = game.location[game.who]
- for (let town of block_seats[game.who])
- if (town !== from)
- gen_action(view, 'town', town)
+ if (block_type(game.who) === 'pilgrims') {
+ for (let town = first_town; town <= last_town; ++town)
+ if (town !== from && is_friendly_port(town))
+ gen_action(view, 'town', town)
+ } else {
+ for (let town of block_seats[game.who])
+ if (town !== from)
+ gen_action(view, 'town', town)
+ }
},
town: function (where) {
game.location[game.who] = where
@@ -1079,11 +1110,13 @@ states.frank_deployment_to = {
}
function goto_saracen_deployment() {
- for (let i = 0; i < 4; ++i) {
+ for (let i = 0; i < game.s_draw; ++i) {
let nomad = select_random_block(S_POOL)
log(BLOCKS[nomad].name + " arrived in #" + block_home(nomad) + ".")
deploy(nomad, block_home(nomad))
}
+ delete game.s_draw
+
game.active = SARACENS
game.state = 'saracen_deployment'
game.who = SALADIN
@@ -3889,6 +3922,24 @@ exports.setup = function (seed, scenario, options) {
log(".h1 Crusader Rex")
log("")
+ game.f_draw = 0
+ game.s_draw = 4
+
+ switch (scenario) {
+ case "+1/-1 Handicap":
+ game.f_draw = 1
+ game.s_draw = 3
+ break
+ case "+2/-2 Handicap":
+ game.f_draw = 2
+ game.s_draw = 2
+ break
+ case "+3/-3 Handicap":
+ game.f_draw = 3
+ game.s_draw = 1
+ break
+ }
+
if (options && options.iron_bridge) {
game.iron_bridge = 1
log("Iron Bridge:\nThe road between Antioch and Harim has a move limit of 3.")