summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README3
-rw-r--r--about.html21
-rw-r--r--cover.1x.jpgbin0 -> 28162 bytes
-rw-r--r--cover.2x.jpgbin0 -> 96136 bytes
-rw-r--r--cover.pngbin0 -> 208551 bytes
-rw-r--r--create.html0
-rw-r--r--play.html109
-rw-r--r--rules.js55
-rw-r--r--thumbnail.jpgbin0 -> 16465 bytes
-rw-r--r--title.sql1
10 files changed, 189 insertions, 0 deletions
diff --git a/README b/README
new file mode 100644
index 0000000..68dd7ba
--- /dev/null
+++ b/README
@@ -0,0 +1,3 @@
+This game is implemented with the generous permission of Fort Circle Games.
+
+Rules and art assets are Copyright 2022 Fort Circle Games.
diff --git a/about.html b/about.html
new file mode 100644
index 0000000..2687996
--- /dev/null
+++ b/about.html
@@ -0,0 +1,21 @@
+<p>
+Votes for Women is a card-driven game covering the American women's suffrage
+movement from 1848-1920, culminating with the ratification (or rejection) of
+the Nineteenth Amendment.
+
+<p>
+To win, the Suffragist player must have Congress pass the proposed Amendment
+and then have three-fourths of the states (36 of the then 48 states) ratify the
+Amendment. The Opposition player wins by either preventing Congress from
+passing the proposed Amendment or by having 13 states reject the Amendment.
+
+<p>
+Designer: Tory Brown.
+<br>Publisher: Fort Circle Games.
+<br>Programming: Mischa Untaga.
+
+<ul>
+<li><a href="/votes-for-women/info/rules.html">Rules of the Game</a>
+<li><a href="/votes-for-women/info/history.html">Historical Supplement</a>
+<li><a href="/votes-for-women/info/cards.html">Card Gallery</a>
+</ul>
diff --git a/cover.1x.jpg b/cover.1x.jpg
new file mode 100644
index 0000000..727fb68
--- /dev/null
+++ b/cover.1x.jpg
Binary files differ
diff --git a/cover.2x.jpg b/cover.2x.jpg
new file mode 100644
index 0000000..0d50825
--- /dev/null
+++ b/cover.2x.jpg
Binary files differ
diff --git a/cover.png b/cover.png
new file mode 100644
index 0000000..d6b6fd5
--- /dev/null
+++ b/cover.png
Binary files differ
diff --git a/create.html b/create.html
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/create.html
diff --git a/play.html b/play.html
new file mode 100644
index 0000000..4721946
--- /dev/null
+++ b/play.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<!-- vim:set nowrap: -->
+<html>
+<head>
+<meta name="viewport" content="width=device-width, height=device-height, user-scalable=no, interactive-widget=resizes-content, viewport-fit=cover">
+<meta name="theme-color" content="#444">
+<meta charset="UTF-8">
+<title>VOTES FOR WOMEN</title>
+<link rel="icon" href="Flag_of_Tripoli_18th_century.svg">
+<link rel="stylesheet" href="/fonts/fonts.css">
+<link rel="stylesheet" href="/common/client.css">
+<script defer src="/common/client.js"></script>
+<script defer src="play.js"></script>
+<style>
+
+main {
+ background-color: slategray;
+}
+
+#mapwrap {
+ width: 2200px;
+ height: 1700px;
+ box-shadow: 0 1px 8px #0008;
+}
+
+#map {
+ width: 2200px;
+ height: 1700px;
+ background-color: #f0e7d0;
+ background-image: url(map.webp);
+}
+
+#map-texture {
+ position: absolute;
+ width: 2200px;
+ height: 1700px;
+ background-image: url(map-texture.jpg);
+ mix-blend-mode: multiply;
+}
+
+</style>
+</head>
+<body>
+
+<div id="tooltip" class="card"></div>
+
+<menu id="popup">
+ <li class="title">TITLE
+ <li class="separator">
+ <li data-action="card_event"> &#x1f3b4; &nbsp; Event
+</menu>
+
+<header>
+ <div id="toolbar">
+ <details>
+ <summary><img src="/images/cog.svg"></summary>
+ <menu>
+ <li><a href="info/rules.html" target="_blank">Rules</a>
+ <li><a href="info/history.html" target="_blank">History</a>
+ <li><a href="info/cards.html" target="_blank">Cards</a>
+ <li class="resign separator">
+ <li class="resign" onclick="confirm_resign()">Resign
+ </menu>
+ </details>
+ </div>
+</header>
+
+<aside>
+ <div id="roles">
+ <div class="role" id="role_Suffragist">
+ <div class="role_name">
+ Suffragist
+ <div class="role_user">-</div>
+ </div>
+ </div>
+ <div class="role" id="role_Opposition">
+ <div class="role_name">
+ Opposition
+ <div class="role_user">-</div>
+ </div>
+ </div>
+ <div class="card_info"></div></div>
+ </div>
+ <div id="log"></div>
+</aside>
+
+<main data-min-zoom="0.75" data-max-zoom="1.5" onclick="hide_popup_menu()">
+
+ <div id="map">
+
+ <svg id="svgmap" width="2200px" height="1700px" viewBox="0 0 2200 1700">
+ </svg>
+
+ <div id="pieces">
+ </div>
+
+ </div>
+
+ <div id="hand" class="hand">
+ </div>
+
+ <br><br><br>
+ <br><br><br>
+
+</main>
+
+<footer id="status"></footer>
+
+</body>
diff --git a/rules.js b/rules.js
new file mode 100644
index 0000000..3486699
--- /dev/null
+++ b/rules.js
@@ -0,0 +1,55 @@
+"use strict"
+
+var game
+var view
+var states
+
+const SUF = "Suffragist"
+const OPP = "Opposition"
+
+exports.scenarios = [ "Standard" ]
+exports.roles = [ SUF, OPP ]
+
+exports.setup = function (seed, scenario, options) {
+ game = {
+ seed: seed,
+ log: [],
+ undo: [],
+ active: null,
+ state: null,
+ }
+ return game
+}
+
+exports.action = function (state, current, action, arg) {
+ game = state
+ let S = states[game.state]
+ if (action in S)
+ S[action](arg, current)
+ else
+ throw new Error("Invalid action: " + action)
+ return game
+}
+
+exports.resign = function (state, current) {
+ game = state
+ if (game.state !== "game_over") {
+ if (current === SUF)
+ goto_game_over(OPP, "Suffragist resigned.")
+ if (current === OPP)
+ goto_game_over(SUF, "Opposition resigned.")
+ }
+ return game
+}
+
+exports.view = function(state, current) {
+ game = state
+
+ let view = {
+ log: game.log,
+ prompt: null,
+ actions: null,
+ }
+
+ return view
+}
diff --git a/thumbnail.jpg b/thumbnail.jpg
new file mode 100644
index 0000000..55b2a93
--- /dev/null
+++ b/thumbnail.jpg
Binary files differ
diff --git a/title.sql b/title.sql
new file mode 100644
index 0000000..dab8f33
--- /dev/null
+++ b/title.sql
@@ -0,0 +1 @@
+insert or replace into titles ( title_id, title_name, bgg ) values ( 'votes-for-women', 'Votes for Women', 311900 );