summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor@ccxvii.net>2023-11-25 18:14:11 +0100
committerTor Andersson <tor@ccxvii.net>2024-01-08 16:36:47 +0100
commitf49494f1d9cfcd22affed0329a1d12087a90583c (patch)
treed67d40a0a57a3b964de7770641ce0bfea4df4b95
parentf52aa19ff8e60710b1bff4ccdabf72fa70f8cd57 (diff)
downloadtable-battles-f49494f1d9cfcd22affed0329a1d12087a90583c.tar.gz
retire and reserves
-rw-r--r--cards.css12
-rw-r--r--play.html5
-rw-r--r--play.js2
-rw-r--r--rules.js72
4 files changed, 79 insertions, 12 deletions
diff --git a/cards.css b/cards.css
index fa77ce5..9640d1d 100644
--- a/cards.css
+++ b/cards.css
@@ -148,6 +148,18 @@
text-align: center;
}
+.retire {
+ position: absolute;
+ font-size: 12px;
+ line-height: 12px;
+ bottom: 6px;
+ left: 60px;
+ padding: 2px 0;
+ width: 120px;
+ text-align: center;
+ border-radius: 7px;
+}
+
.number {
position: absolute;
font-size: 10px;
diff --git a/play.html b/play.html
index 9f16e30..150fe84 100644
--- a/play.html
+++ b/play.html
@@ -252,6 +252,11 @@ main[data-scenario="5"] {
box-shadow: 0 0 0 2px black;
}
+.retire.action {
+ box-shadow: 0 0 0 3px white;
+ background-color: #fff4;
+}
+
/*
.card.blue.selected { box-shadow: 0 0 0px 3px dodgerblue; }
.card.dkblue.selected { box-shadow: 0 0 0px 3px dodgerblue; }
diff --git a/play.js b/play.js
index 176a006..baa023a 100644
--- a/play.js
+++ b/play.js
@@ -143,7 +143,7 @@ function create_formation_card(id) {
append_div(e, "lore_text", card.lore_text)
if (card.retire) {
- let ee = append_div(e, "reserve", "RETIRE")
+ let ee = append_div(e, "retire", "RETIRE")
register_action(ee, "retire", id)
} else if (card.pursuit) {
append_div(e, "reserve", "PURSUIT")
diff --git a/rules.js b/rules.js
index a3daf79..aa2bd66 100644
--- a/rules.js
+++ b/rules.js
@@ -1,5 +1,9 @@
"use strict"
+// TODO: manual take hits?
+// TODO: manual "enter reserves" ?
+// TODO: manual "pursuit" ?
+
const data = require("./data.js")
const P1 = "First"
@@ -189,9 +193,9 @@ function add_cubes(c, n) {
map_set(game.cubes, c, Math.min(limit, old + n))
}
-function remove_cube(c) {
+function remove_cubes(c, n) {
let old = map_get(game.cubes, c, 0)
- map_set(game.cubes, c, Math.min(0, old - 1))
+ map_set(game.cubes, c, Math.min(0, old - n))
}
function add_sticks(c, n) {
@@ -210,9 +214,16 @@ function remove_dice(c) {
set_dice_location(i, POOL)
}
+function eliminate_card(c) {
+ remove_dice(c)
+ remove_cubes(c, 3)
+ array_remove_item(game.front[0], c)
+ array_remove_item(game.front[1], c)
+}
+
function pay_for_action(c) {
if (data.cards[c].special)
- remove_cube(c)
+ remove_cubes(c, 1)
else
remove_dice(c)
}
@@ -507,7 +518,7 @@ function check_all_3(c, x, y, z) {
function check_all_4(c, x, y, z, w) {
if (!can_place_value(c, x))
return false
- return pool_has_single(c, x) && pool_has_single(y) && pool_has_single(z) && pool_has_single(w)
+ return pool_has_single(x) && pool_has_single(y) && pool_has_single(z) && pool_has_single(w)
}
function check_straight_3(c) {
@@ -652,6 +663,7 @@ function goto_roll_phase() {
for (let i = 0; i < 6; ++i)
if (get_player_dice_location(p, i) < 0)
set_player_dice_value(p, i, 0)
+
game.state = "roll"
}
@@ -662,16 +674,18 @@ states.roll = {
},
roll() {
clear_undo()
-
- let p = player_index()
- for (let i = 0; i < 6; ++i)
- if (get_player_dice_location(p, i) < 0)
- set_player_dice_value(p, i, random(6) + 1)
-
- game.state = "place"
+ roll_dice_in_pool()
},
}
+function roll_dice_in_pool() {
+ let p = player_index()
+ for (let i = 0; i < 6; ++i)
+ if (get_player_dice_location(p, i) < 0)
+ set_player_dice_value(p, i, random(6) + 1)
+ game.state = "place"
+}
+
function gen_place_dice_select_card() {
let p = player_index()
for (let c of game.front[p]) {
@@ -887,6 +901,7 @@ states.action = {
prompt() {
view.prompt = "Take an action."
view.actions.pass = 1
+ view.actions.roll = 1
let p = player_index()
for (let c of game.front[p]) {
@@ -914,6 +929,12 @@ states.action = {
}
}
},
+ retire(c) {
+ push_undo()
+ log(card_name(c) + " retired.")
+ eliminate_card(c)
+ end_action_phase()
+ },
a1(c) {
push_undo()
goto_take_action(c, 0)
@@ -934,6 +955,11 @@ states.action = {
push_undo()
goto_roll_phase()
},
+ roll() {
+ push_undo()
+ goto_roll_phase()
+ roll_dice_in_pool()
+ },
}
function goto_fizzle(c) {
@@ -989,6 +1015,7 @@ states.bombard = {
view.actions.bombard = 1
},
bombard() {
+ log(card_name(game.selected) + " bombarded.")
let opp = 1 - player_index()
game.morale[opp] --
pay_for_action(game.selected)
@@ -1004,6 +1031,7 @@ states.attack = {
gen_action_card(t)
},
card(c) {
+ log(card_name(game.selected) + " attacked " + card_name(c) + ".")
game.target = c
apply_attack(current_action())
pay_for_action(game.selected)
@@ -1019,6 +1047,7 @@ states.command = {
gen_action_card(t)
},
card(c) {
+ log(card_name(game.selected) + " commanded " + card_name(c) + " out of reserve.")
let p = player_index()
array_remove_item(game.reserve[p], c)
// TODO: insert where?
@@ -1028,7 +1057,28 @@ states.command = {
},
}
+function has_reserve_target_routed(reserve) {
+ for (let c of reserve)
+ if (!game.front[0].includes(c) && !game.front[1].includes(c))
+ return true
+ return false
+}
+
function end_action_phase() {
+ // Bring on reinforcements (on both sides).
+ for (let p = 0; p <= 1; ++p) {
+ for (let i = 0; i < game.reserve[p].length; ++i) {
+ let c = game.reserve[p][i]
+ if (has_reserve_target_routed(data.cards[c].reserve)) {
+ console.log("COMING OUT!", c)
+ log(card_name(c) + " came out of reserve.")
+ game.front[p].push(c)
+ array_remove(game.reserve[p], i)
+ --i
+ }
+ }
+ }
+
goto_roll_phase()
}