diff --git a/27 Civil War/civilwar.bas b/27 Civil War/civilwar.bas
index 5720d767..2311711e 100644
--- a/27 Civil War/civilwar.bas
+++ b/27 Civil War/civilwar.bas
@@ -284,7 +284,7 @@
2940 PRINT "THE UNION HAS WON THE WAR"
2950 PRINT
2960 IF R1=0 THEN 3100
-2970 PRINT "FOR THE "W+L+W0" BATTLES FOUGHT (EXCUDING RERUNS)"
+2970 PRINT "FOR THE "W+L+W0" BATTLES FOUGHT (EXCLUDING RERUNS)"
2980 PRINT " "," "," ";
2990 PRINT "CONFEDERACY"," UNION"
3000 PRINT "HISTORICAL LOSSES",INT(P1+.5),INT(P2+.5)
@@ -295,7 +295,7 @@
3050 PRINT
3060 PRINT "UNION INTELLIGENCE SUGGESTS THAT THE SOUTH USED "
3070 PRINT "STRATEGIES 1, 2, 3, 4 IN THE FOLLOWING PERCENTAGES"
-3080 PRINT S(1);S2(2);S(3);S(4)
+3080 PRINT S(1);S(2);S(3);S(4)
3090 REM---------------------------------
3100 STOP
3110 REM - UNION STRATEGY IS COMPUTER CHOSEN
diff --git a/27 Civil War/javascript/civilwar.html b/27 Civil War/javascript/civilwar.html
new file mode 100644
index 00000000..dcff69ff
--- /dev/null
+++ b/27 Civil War/javascript/civilwar.html
@@ -0,0 +1,9 @@
+
+
+CIVIL WAR
+
+
+
+
+
+
diff --git a/27 Civil War/javascript/civilwar.js b/27 Civil War/javascript/civilwar.js
new file mode 100644
index 00000000..489e2955
--- /dev/null
+++ b/27 Civil War/javascript/civilwar.js
@@ -0,0 +1,528 @@
+// CIVIL WAR
+//
+// Converted from BASIC to Javascript by Oscar Toledo G. (nanochess)
+//
+
+function print(str)
+{
+ document.getElementById("output").appendChild(document.createTextNode(str));
+}
+
+function input()
+{
+ var input_element;
+ var input_str;
+
+ return new Promise(function (resolve) {
+ input_element = document.createElement("INPUT");
+
+ print("? ");
+ input_element.setAttribute("type", "text");
+ input_element.setAttribute("length", "50");
+ document.getElementById("output").appendChild(input_element);
+ input_element.focus();
+ input_str = undefined;
+ input_element.addEventListener("keydown", function (event) {
+ if (event.keyCode == 13) {
+ input_str = input_element.value;
+ document.getElementById("output").removeChild(input_element);
+ print(input_str);
+ print("\n");
+ resolve(input_str);
+ }
+ });
+ });
+}
+
+function tab(space)
+{
+ var str = "";
+ while (space-- > 0)
+ str += " ";
+ return str;
+}
+
+// Historical data...can add more (strat., etc) by inserting
+// data statements after appro. info, and adjusting read
+// 0 - C$ 1-M1 2-M2 3-C1 4-C2 5-D
+var historical_data = [,
+ ["BULL RUN",18000,18500,1967,2708,1],
+ ["SHILOH",40000.,44894.,10699,13047,3],
+ ["SEVEN DAYS",95000.,115000.,20614,15849,3],
+ ["SECOND BULL RUN",54000.,63000.,10000,14000,2],
+ ["ANTIETAM",40000.,50000.,10000,12000,3],
+ ["FREDERICKSBURG",75000.,120000.,5377,12653,1],
+ ["MURFREESBORO",38000.,45000.,11000,12000,1],
+ ["CHANCELLORSVILLE",32000,90000.,13000,17197,2],
+ ["VICKSBURG",50000.,70000.,12000,19000,1],
+ ["GETTYSBURG",72500.,85000.,20000,23000,3],
+ ["CHICKAMAUGA",66000.,60000.,18000,16000,2],
+ ["CHATTANOOGA",37000.,60000.,36700.,5800,2],
+ ["SPOTSYLVANIA",62000.,110000.,17723,18000,2],
+ ["ATLANTA",65000.,100000.,8500,3700,1]];
+var sa = [];
+var da = [];
+var fa = [];
+var ha = [];
+var ba = [];
+var oa = [];
+
+// Main program
+async function main()
+{
+ print(tab(26) + "CIVIL WAR\n");
+ print(tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n");
+ print("\n");
+ print("\n");
+ print("\n");
+ // Original game design: Cram, Goodie, Hibbard Lexington H.S.
+ // Modifications: G. Paul, R. Hess (Ties), 1973
+ // Union info on likely confederate strategy
+ sa[1] = 25;
+ sa[2] = 25;
+ sa[3] = 25;
+ sa[4] = 25;
+ d = Math.random();
+ print("\n");
+ print("DO YOU WANT INSTRUCTIONS");
+ while (1) {
+ str = await input();
+ if (str == "YES" || str == "NO")
+ break;
+ print("YES OR NO -- \n");
+ }
+ if (str == "YES") {
+ print("\n");
+ print("\n");
+ print("\n");
+ print("\n");
+ print("THIS IS A CIVIL WAR SIMULATION.\n");
+ print("TO PLAY TYPE A RESPONSE WHEN THE COMPUTER ASKS.\n");
+ print("REMEMBER THAT ALL FACTORS ARE INTERRELATED AND THAT YOUR\n");
+ print("RESPONSES COULD CHANGE HISTORY. FACTS AND FIGURES USED ARE\n");
+ print("BASED ON THE ACTUAL OCCURRENCE. MOST BATTLES TEND TO RESULT\n");
+ print("AS THEY DID IN THE CIVIL WAR, BUT IT ALL DEPENDS ON YOU!!\n");
+ print("\n");
+ print("THE OBJECT OF THE GAME IS TO WIN AS MANY BATTLES AS ");
+ print("POSSIBLE.\n");
+ print("\n");
+ print("YOUR CHOICES FOR DEFENSIVE STRATEGY ARE:\n");
+ print(" (1) ARTILLERY ATTACK\n");
+ print(" (2) FORTIFICATION AGAINST FRONTAL ATTACK\n");
+ print(" (3) FORTIFICATION AGAINST FLANKING MANEUVERS\n");
+ print(" (4) FALLING BACK\n");
+ print(" YOUR CHOICES FOR OFFENSIVE STRATEGY ARE:\n");
+ print(" (1) ARTILLERY ATTACK\n");
+ print(" (2) FRONTAL ATTACK\n");
+ print(" (3) FLANKING MANEUVERS\n");
+ print(" (4) ENCIRCLEMENT\n");
+ print("YOU MAY SURRENDER BY TYPING A '5' FOR YOUR STRATEGY.\n");
+ }
+ print("\n");
+ print("\n");
+ print("\n");
+ print("ARE THERE TWO GENERALS PRESENT ");
+ while (1) {
+ print("(ANSWER YES OR NO)");
+ bs = await input();
+ if (bs == "YES") {
+ d = 2;
+ break;
+ } else if (bs == "NO") {
+ print("\n");
+ print("YOU ARE THE CONFEDERACY. GOOD LUCK!\n");
+ print("\n");
+ d = 1;
+ break;
+ }
+ }
+ print("SELECT A BATTLE BY TYPING A NUMBER FROM 1 TO 14 ON\n");
+ print("REQUEST. TYPE ANY OTHER NUMBER TO END THE SIMULATION.\n");
+ print("BUT '0' BRINGS BACK EXACT PREVIOUS BATTLE SITUATION\n");
+ print("ALLOWING YOU TO REPLAY IT\n");
+ print("\n");
+ print("NOTE: A NEGATIVE FOOD$ ENTRY CAUSES THE PROGRAM TO \n");
+ print("USE THE ENTRIES FROM THE PREVIOUS BATTLE\n");
+ print("\n");
+ print("AFTER REQUESTING A BATTLE, DO YOU WISH ");
+ print("BATTLE DESCRIPTIONS ");
+ while (1) {
+ print("(ANSWER YES OR NO)");
+ xs = await input();
+ if (xs == "YES" || xs == "NO")
+ break;
+ }
+ l = 0;
+ w = 0;
+ r1 = 0;
+ q1 = 0;
+ m3 = 0;
+ m4 = 0;
+ p1 = 0;
+ p2 = 0;
+ t1 = 0;
+ t2 = 0;
+ for (i = 1; i <= 2; i++) {
+ da[i] = 0;
+ fa[i] = 0;
+ ha[i] = 0;
+ ba[i] = 0;
+ oa[i] = 0;
+ }
+ r2 = 0;
+ q2 = 0;
+ c6 = 0;
+ f = 0;
+ w0 = 0;
+ y = 0;
+ y2 = 0;
+ u = 0;
+ u2 = 0;
+ while (1) {
+ print("\n");
+ print("\n");
+ print("\n");
+ print("WHICH BATTLE DO YOU WISH TO SIMULATE");
+ a = parseInt(await input());
+ if (a < 1 || a > 14)
+ break;
+ if (a != 0 || r == 0) {
+ cs = historical_data[a][0];
+ m1 = historical_data[a][1];
+ m2 = historical_data[a][2];
+ c1 = historical_data[a][3];
+ c2 = historical_data[a][4];
+ m = historical_data[a][5];
+ u = 0;
+ // Inflation calc
+ i1 = 10 + (l - w) * 2;
+ i2 = 10 + (w - l) * 2;
+ // Money available
+ da[1] = 100 * Math.floor((m1 * (100 - i1) / 2000) * (1 + (r1 - q1) / (r1 + 1)) + 0.5);
+ da[2] = 100 * Math.floor(m2 * (100 - i2) / 2000 + 0.5);
+ if (bs == "YES") {
+ da[2] = 100 * Math.floor((m2 * (100 - i2) / 2000) * (1 + (r2 - q2) / (r2 + 1)) + 0.5);
+ }
+ // Men available
+ m5 = Math.floor(m1 * (1 + (p1 - t1) / (m3 + 1)));
+ m6 = Math.floor(m2 * (1 + (p2 - t2) / (m4 + 1)));
+ f1 = 5 * m1 / 6;
+ print("\n");
+ print("\n");
+ print("\n");
+ print("\n");
+ print("\n");
+ print("THIS IS THE BATTLE OF " + cs + "\n");
+ if (xs != "NO") {
+ switch (a) {
+ case 1:
+ print("JULY 21, 1861. GEN. BEAUREGARD, COMMANDING THE SOUTH, MET\n");
+ print("UNION FORCES WITH GEN. MCDOWELL IN A PREMATURE BATTLE AT\n");
+ print("BULL RUN. GEN. JACKSON HELPED PUSH BACK THE UNION ATTACK.\n");
+ break;
+ case 2:
+ print("APRIL 6-7, 1862. THE CONFEDERATE SURPRISE ATTACK AT\n");
+ print("SHILOH FAILED DUE TO POOR ORGANIZATION.\n");
+ break;
+ case 3:
+ print("JUNE 25-JULY 1, 1862. GENERAL LEE (CSA) UPHELD THE\n");
+ print("OFFENSIVE THROUGHOUT THE BATTLE AND FORCED GEN. MCCLELLAN\n");
+ print("AND THE UNION FORCES AWAY FROM RICHMOND.\n");
+ break;
+ case 4:
+ print("AUG 29-30, 1862. THE COMBINED CONFEDERATE FORCES UNDER LEE\n");
+ print("AND JACKSON DROVE THE UNION FORCES BACK INTO WASHINGTON.\n");
+ break;
+ case 5:
+ print("SEPT 17, 1862. THE SOUTH FAILED TO INCORPORATE MARYLAND\n");
+ print("INTO THE CONFEDERACY.\n");
+ break;
+ case 6:
+ print("DEC 13, 1862. THE CONFEDERACY UNDER LEE SUCCESSFULLY\n");
+ print("REPULSED AN ATTACK BY THE UNION UNDER GEN. BURNSIDE.\n");
+ break;
+ case 7:
+ print("DEC 31, 1862. THE SOUTH UNDER GEN. BRAGG WON A CLOSE BATTLE.\n");
+ break;
+ case 8:
+ print("MAY 1-6, 1863. THE SOUTH HAD A COSTLY VICTORY AND LOST\n");
+ print("ONE OF THEIR OUTSTANDING GENERALS, 'STONEWALL' JACKSON.\n");
+ break;
+ case 9:
+ print("JULY 4, 1863. VICKSBURG WAS A COSTLY DEFEAT FOR THE SOUTH\n");
+ print("BECAUSE IT GAVE THE UNION ACCESS TO THE MISSISSIPPI.\n");
+ break;
+ case 10:
+ print("JULY 1-3, 1863. A SOUTHERN MISTAKE BY GEN. LEE AT GETTYSBURG\n");
+ print("COST THEM ONE OF THE MOST CRUCIAL BATTLES OF THE WAR.\n");
+ break;
+ case 11:
+ print("SEPT. 15, 1863. CONFUSION IN A FOREST NEAR CHICKAMAUGA LED\n");
+ print("TO A COSTLY SOUTHERN VICTORY.\n");
+ break;
+ case 12:
+ print("NOV. 25, 1863. AFTER THE SOUTH HAD SIEGED GEN. ROSENCRANS'\n");
+ print("ARMY FOR THREE MONTHS, GEN. GRANT BROKE THE SIEGE.\n");
+ break;
+ case 13:
+ print("MAY 5, 1864. GRANT'S PLAN TO KEEP LEE ISOLATED BEGAN TO\n");
+ print("FAIL HERE, AND CONTINUED AT COLD HARBOR AND PETERSBURG.\n");
+ break;
+ case 14:
+ print("AUGUST, 1864. SHERMAN AND THREE VETERAN ARMIES CONVERGED\n");
+ print("ON ATLANTA AND DEALT THE DEATH BLOW TO THE CONFEDERACY.\n");
+ break;
+ }
+ }
+ } else {
+ print(cs + " INSTANT REPLAY\n");
+ }
+ print("\n");
+ print(" \tCONFEDERACY\t UNION\n"),
+ print("MEN\t " + m5 + "\t\t " + m6 + "\n");
+ print("MONEY\t $" + da[1] + "\t\t$" + da[2] + "\n");
+ print("INFLATION\t " + (i1 + 15) + "%\t " + i2 + "%\n");
+ print("\n");
+ // ONLY IN PRINTOUT IS CONFED INFLATION = I1 + 15%
+ // IF TWO GENERALS, INPUT CONFED, FIRST
+ for (i = 1; i <= d; i++) {
+ if (bs == "YES" && i == 1)
+ print("CONFEDERATE GENERAL---");
+ print("HOW MUCH DO YOU WISH TO SPEND FOR\n");
+ while (1) {
+ print(" - FOOD......");
+ f = parseInt(await input());
+ if (f < 0) {
+ if (r1 == 0) {
+ print("NO PREVIOUS ENTRIES\n");
+ continue;
+ }
+ print("ASSUME YOU WANT TO KEEP SAME ALLOCATIONS\n");
+ print("\n");
+ break;
+ }
+ fa[i] = f;
+ while (1) {
+ print(" - SALARIES..");
+ ha[i] = parseInt(await input());
+ if (ha[i] >= 0)
+ break;
+ print("NEGATIVE VALUES NOT ALLOWED.\n");
+ }
+ while (1) {
+ print(" - AMMUNITION");
+ ba[i] = parseInt(await input());
+ if (ba[i] >= 0)
+ break;
+ print("NEGATIVE VALUES NOT ALLOWED.\n");
+ }
+ print("\n");
+ if (fa[i] + ha[i] + ba[i] > da[i]) {
+ print("THINK AGAIN! YOU HAVE ONLY $" + da[i] + "\n");
+ } else {
+ break;
+ }
+ }
+ if (bs != "YES" || i == 2)
+ break;
+ print("UNION GENERAL---");
+ }
+ for (z = 1; z <= d; z++) {
+ if (bs == "YES") {
+ if (z == 1)
+ print("CONFEDERATE ");
+ else
+ print(" UNION ");
+ }
+ // Find morale
+ o = ((2 * Math.pow(fa[z], 2) + Math.pow(ha[z], 2)) / Math.pow(f1, 2) + 1);
+ if (o >= 10) {
+ print("MORALE IS HIGH\n");
+ } else if (o >= 5) {
+ print("MORALE IS FAIR\n");
+ } else {
+ print("MORALE IS POOR\n");
+ }
+ if (bs != "YES")
+ break;
+ oa[z] = o;
+ }
+ o2 = oa[2];
+ o = oa[1];
+ print("CONFEDERATE GENERAL---");
+ // Actual off/def battle situation
+ if (m == 3) {
+ print("YOU ARE ON THE OFFENSIVE\n");
+ } else if (m == 1) {
+ print("YOU ARE ON THE DEFENSIVE\n");
+ } else {
+ print("BOTH SIDES ARE ON THE OFFENSIVE \n");
+ }
+ print("\n");
+ // Choose strategies
+ if (bs != "YES") {
+ print("YOUR STRATEGY ");
+ while (1) {
+ y = parseInt(await input());
+ if (Math.abs(y - 3) < 3)
+ break;
+ print("STRATEGY " + y + " NOT ALLOWED.\n");
+ }
+ if (y == 5) {
+ print("THE CONFEDERACY HAS SURRENDERED.\n");
+ break;
+ }
+ // Union strategy is computer choesn
+ print("UNION STRATEGY IS ");
+ if (a == 0) {
+ while (1) {
+ y2 = parseInt(await input());
+ if (y2 > 0 && y2 < 5)
+ break;
+ print("ENTER 1, 2, 3, OR 4 (USUALLY PREVIOUS UNION STRATEGY)\n");
+ }
+ } else {
+ s0 = 0;
+ r = Math.random() * 100;
+ for (i = 1; i <= 4; i++) {
+ s0 += sa[i];
+ // If actual strategy info is in program data statements
+ // then r-100 is extra weight given to that strategy.
+ if (r < s0)
+ break;
+ }
+ y2 = i;
+ print(y2 + "\n");
+ }
+ } else {
+ for (i = 1; i <= 2; i++) {
+ if (i == 1)
+ print("CONFEDERATE STRATEGY ");
+ while (1) {
+ y = parseInt(await input());
+ if (Math.abs(y - 3) < 3)
+ break;
+ print("STRATEGY " + y + " NOT ALLOWED.\n");
+ }
+ if (i == 2) {
+ y2 = y;
+ y = y1;
+ if (y2 != 5)
+ break;
+ } else {
+ y1 = y;
+ }
+ print("UNION STRATEGY ");
+ }
+ // Simulated losses - North
+ c6 = (2 * c2 / 5) * (1 + 1 / (2 * (Math.abs(y2 - y) + 1)));
+ c6 = c6 * (1.28 + (5 * m2 / 6) / (b[2] + 1));
+ c6 = Math.floor(c6 * (1 + 1 / o2) + 0.5);
+ // If loss > men present, rescale losses
+ e2 = 100 / o2;
+ if (Math.floor(c6 + e2) >= m6) {
+ c6 = Math.floor(13 * m6 / 20);
+ e2 = 7 * c6 / 13;
+ u2 = 1;
+ }
+ }
+ // Calculate simulated losses
+ print("\n");
+ print("\n");
+ print("\n");
+ print("\t\tCONFEDERACY\tUNION\n");
+ c5 = (2 * c1 / 5) * (1 + 1 / (2 * (Math.abs(y2 - y) + 1)));
+ c5 = Math.floor(c5 * (1 + 1 / o) * (1.28 + f1 / (ba[1] + 1)) + 0.5);
+ e = 100 / o;
+ if (c5 + 100 / o >= m1 * (1 + (p1 - t1) / (m3 + 1))) {
+ c5 = Math.floor(13 * m1 / 20 * (1 + (p1 - t1) / (m3 + 1)));
+ e = 7 * c5 / 13;
+ u = 1;
+ }
+ if (d == 1) {
+ c6 = Math.floor(17 * c2 * c1 / (c5 * 20));
+ e2 = 5 * o;
+ }
+ print("CASUALTIES\t" + c5 + "\t\t" + c6 + "\n");
+ print("DESERTIONS\t" + Math.floor(e) + "\t\t" + Math.floor(e2) + "\n");
+ print("\n");
+ if (bs == "YES") {
+ print("COMPARED TO THE ACTUAL CASUALTIES AT " + cs + "\n");
+ print("CONFEDERATE: " + Math.floor(100 * (c5 / c1) + 0.5) + "% OF THE ORIGINAL\n");
+ print("UNION: " + Math.floor(100 * (c6 / c2) + 0.5) + "% OF THE ORIGINAL\n");
+ }
+ print("\n");
+ // 1 Who one
+ if (u == 1 && u2 == 1 || (u != 1 && u2 != 1 && c5 + e == c6 + e2)) {
+ print("BATTLE OUTCOME UNRESOLVED\n");
+ w0++;
+ } else if (u == 1 || (u != 1 && u2 != 1 && c5 + e > c6 + e2)) {
+ print("THE UNION WINS " + cs + "\n");
+ if (a != 0)
+ l++;
+ } else {
+ print("THE CONFEDERACY WINS " + cs + "\n");
+ if (a != 0)
+ w++;
+ }
+ // Lines 2530 to 2590 from original are unreachable.
+ if (a != 0) {
+ t1 += c5 + e;
+ t2 += c6 + e2;
+ p1 += c1;
+ p2 += c2;
+ q1 += fa[1] + ha[1] + ba[1];
+ q2 += fa[2] + ha[2] + ba[2];
+ r1 += m1 * (100 - i1) / 20;
+ r2 += m2 * (100 - i2) / 20;
+ m3 += m1;
+ m4 += m2;
+ // Learn present strategy, start forgetting old ones
+ // present startegy of south gains 3*s, others lose s
+ // probability points, unless a strategy falls below 5%.
+ s = 3;
+ s0 = 0;
+ for (i = 1; i <= 4; i++) {
+ if (s[i] <= 5)
+ continue;
+ s[i] -= 5;
+ s0 += s;
+ }
+ s[y] += s0;
+ }
+ u = 0;
+ u2 = 0;
+ print("---------------");
+ continue;
+ }
+ print("\n");
+ print("\n");
+ print("\n");
+ print("\n");
+ print("\n");
+ print("\n");
+ print("THE CONFEDERACY HAS WON " + w + " BATTLES AND LOST " + l + "\n");
+ if (y == 5 || (y2 != 5 && w <= l)) {
+ print("THE UNION HAS WON THE WAR\n");
+ } else {
+ print("THE CONFEDERACY HAS WON THE WAR\n");
+ }
+ print("\n");
+ if (r1) {
+ print("FOR THE " + (w + l + w0) + " BATTLES FOUGHT (EXCLUDING RERUNS)\n");
+ print(" \t \t ");
+ print("CONFEDERACY\t UNION\n");
+ print("HISTORICAL LOSSES\t" + Math.floor(p1 + 0.5) + "\t" + Math.floor(p2 + 0.5) + "\n");
+ print("SIMULATED LOSSES\t" + Math.floor(t1 + 0.5) + "\t" + Math.floor(t2 + 0.5) + "\n");
+ print("\n");
+ print(" % OF ORIGINAL\t" + Math.floor(100 * (t1 / p1) + 0.5) + "\t" + Math.floor(100 * (t2 / p2) + 0.5) + "\n");
+ if (bs != "YES") {
+ print("\n");
+ print("UNION INTELLIGENCE SUGGEST THAT THE SOUTH USED \n");
+ print("STRATEGIES 1, 2, 3, 4 IN THE FOLLOWING PERCENTAGES\n");
+ print(sa[1] + " " + sa[2] + " " + sa[3] + " " + sa[4] + "\n");
+ }
+ }
+}
+
+main();