From 990658b8e6945107d77bd2b04dbefa95b6357e5d Mon Sep 17 00:00:00 2001 From: nanochess Date: Wed, 3 Mar 2021 15:24:21 -0600 Subject: [PATCH 1/4] Ported CRAPS to Javascript --- 28 Combat/javascript/combat.js | 2 +- 29 Craps/javascript/craps.html | 9 +++ 29 Craps/javascript/craps.js | 128 +++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 29 Craps/javascript/craps.html create mode 100644 29 Craps/javascript/craps.js diff --git a/28 Combat/javascript/combat.js b/28 Combat/javascript/combat.js index be4d72a9..a2e43c71 100644 --- a/28 Combat/javascript/combat.js +++ b/28 Combat/javascript/combat.js @@ -1,4 +1,4 @@ -// CHOMP +// COMBAT // // Converted from BASIC to Javascript by Oscar Toledo G. (nanochess) // diff --git a/29 Craps/javascript/craps.html b/29 Craps/javascript/craps.html new file mode 100644 index 00000000..50b2ca9b --- /dev/null +++ b/29 Craps/javascript/craps.html @@ -0,0 +1,9 @@ + + +CRAPS + + +

+
+
+
diff --git a/29 Craps/javascript/craps.js b/29 Craps/javascript/craps.js
new file mode 100644
index 00000000..93351011
--- /dev/null
+++ b/29 Craps/javascript/craps.js	
@@ -0,0 +1,128 @@
+// CRAPS
+//
+// 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;
+}
+
+// Main program
+async function main()
+{
+    print(tab(33) + "CRAPS\n");
+    print(tab(15) + "CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY\n");
+    print("\n");
+    print("\n");
+    print("\n");
+    r = 0;
+    print("2,3,12 ARE LOSERS: 4,5,6,8,9,10 ARE POINTS: 7,11 ARE NATURAL WINNERS.\n");
+    t = 1;
+    print("PICK A NUMBER AND INPUT TO ROLL DICE");
+    z = parseInt(await input());
+    do {
+        x = Math.random();
+        t++;
+    } while (t <= z) ;
+    while (1) {
+        print("INPUT THE AMOUNT OF YOUR WAGER.");
+        f = parseInt(await input());
+        print("I WILL NOW THROW THE DICE\n");
+        do {
+            e = Math.floor(7 * Math.random());
+            s = Math.floor(7 * Math.random());
+            x = e + s;
+        } while (x == 0 || x == 1) ;
+        if (x == 7 || x == 11) {
+            print(x + " - NATURAL....A WINNER!!!!\n");
+            print(x + " PAYS EVEN MONEY, YOU WIN " + f + " DOLLARS\n");
+            r += f;
+        } else if (x == 2) {
+            print(x + " - SNAKE EYES....YOU LOSE.\n");
+            print("YOU LOSE " + f + " DOLLARS.\n");
+            r -= f;
+        } else if (x == 3 || x == 12) { // Original duplicates comparison in line 70
+            print(x + " - CRAPS....YOU LOSE.\n");
+            print("YOU LOSE " + f + " DOLLARS.\n");
+            r -= f;
+        } else {
+            print(x + " IS THE POINT. I WILL ROLL AGAIN\n");
+            while (1) {
+                do {
+                    h = Math.floor(7 * Math.random());
+                    q = Math.floor(7 * Math.random());
+                    o = h + q;
+                } while (o == 0 || o == 1) ;
+                if (o == 7) {
+                    print(o + " - CRAPS, YOU LOSE.\n");
+                    print("YOU LOSE $" + f + "\n");
+                    r -= f;
+                    break;
+                }
+                if (o == x) {
+                    print(x + " - A WINNER.........CONGRATS!!!!!!!!\n");
+                    print(x + " AT 2 TO 1 ODDS PAYS YOU...LET ME SEE..." + 2 * f + " DOLLARS\n");
+                    r += f * 2;
+                    break;
+                }
+                print(o + " - NO POINT. I WILL ROLL AGAIN\n");
+            }
+        }
+        print(" IF YOU WANT TO PLAY AGAIN PRINT 5 IF NOT PRINT 2");
+        m = parseInt(await input());
+        if (r < 0) {
+            print("YOU ARE NOW UNDER $" + -r + "\n");
+        } else if (r > 0) {
+            print("YOU ARE NOW AHEAD $" + r + "\n");
+        } else {
+            print("YOU ARE NOW EVEN AT 0\n");
+        }
+        if (m != 5)
+            break;
+    }
+    if (r < 0) {
+        print("TOO BAD, YOU ARE IN THE HOLE. COME AGAIN.\n");
+    } else if (r > 0) {
+        print("CONGRATULATIONS---YOU CAME OUT A WINNER. COME AGAIN!\n");
+    } else {
+        print("CONGRATULATIONS---YOU CAME OUT EVEN, NOT BAD FOR AN AMATEUR\n");
+    }
+    
+}
+
+main();

From ea93a0779441ceaa5fc7ae9445f7a1fde7525e29 Mon Sep 17 00:00:00 2001
From: nanochess 
Date: Wed, 3 Mar 2021 17:11:09 -0600
Subject: [PATCH 2/4] Ported CUBE to Javascript

---
 30 Cube/cube.bas             |   4 +-
 30 Cube/javascript/cube.html |   9 ++
 30 Cube/javascript/cube.js   | 207 +++++++++++++++++++++++++++++++++++
 3 files changed, 218 insertions(+), 2 deletions(-)
 create mode 100644 30 Cube/javascript/cube.html
 create mode 100644 30 Cube/javascript/cube.js

diff --git a/30 Cube/cube.bas b/30 Cube/cube.bas
index e661ab66..1e4462f6 100644
--- a/30 Cube/cube.bas	
+++ b/30 Cube/cube.bas	
@@ -76,7 +76,7 @@
 820 LET O=3
 830 PRINT "WANT TO MAKE A WAGER?"
 840 INPUT Z
-850 IF Z=0 THEN 920
+850 IF Z=0 THEN 880
 860 PRINT "HOW MUCH ";
 870 INPUT Z1
 876 IF A1
+
+CUBE
+
+
+

+
+
+
diff --git a/30 Cube/javascript/cube.js b/30 Cube/javascript/cube.js
new file mode 100644
index 00000000..edbaaedc
--- /dev/null
+++ b/30 Cube/javascript/cube.js	
@@ -0,0 +1,207 @@
+// CUBE
+//
+// 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;
+}
+
+// Main program
+async function main()
+{
+    print(tab(33) + "CUBE\n");
+    print(tab(15) + "CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY\n");
+    print("\n");
+    print("\n");
+    print("\n");
+    print("DO YOU WANT TO SEE THE INSTRUCTIONS? (YES--1,NO--0)");
+    b7 = parseInt(await input());
+    if (b7 != 0) {
+        print("THIS IS A GAME IN WHICH YOU WILL BE PLAYING AGAINST THE\n");
+        print("RANDOM DECISION OF THE COMPUTER. THE FIELD OF PLAY IS A\n");
+        print("CUBE OF SIDE 3. ANY OF THE 27 LOCATIONS CAN BE DESIGNATED\n");
+        print("BY INPUTING THREE NUMBERS SUCH AS 2,3,1. AT THE START,\n");
+        print("YOU ARE AUTOMATICALLY AT LOCATION 1,1,1. THE OBJECT OF\n");
+        print("THE GAME IS TO GET TO LOCATION 3,3,3. ONE MINOR DETAIL:\n");
+        print("THE COMPUTER WILL PICK, AT RANDOM, 5 LOCATIONS AT WHICH\n");
+        print("IT WILL PLANT LAND MINES. IF YOU HIT ONE OF THESE LOCATIONS\n");
+        print("YOU LOSE. ONE OTHER DETAIL: YOU MAY MOVE ONLY ONE SPACE \n");
+        print("IN ONE DIRECTION EACH MOVE. FOR  EXAMPLE: FROM 1,1,2 YOU\n");
+        print("MAY MOVE TO 2,1,2 OR 1,1,3. YOU MAY NOT CHANGE\n");
+        print("TWO OF THE NUMBERS ON THE SAME MOVE. IF YOU MAKE AN ILLEGAL\n");
+        print("MOVE, YOU LOSE AND THE COMPUTER TAKES THE MONEY YOU MAY\n");
+        print("HAVE BET ON THAT ROUND.\n");
+        print("\n");
+        print("\n");
+        print("ALL YES OR NO QUESTIONS WILL BE ANSWERED BY A 1 FOR YES\n");
+        print("OR A 0 (ZERO) FOR NO.\n");
+        print("\n");
+        print("WHEN STATING THE AMOUNT OF A WAGER, PRINT ONLY THE NUMBER\n");
+        print("OF DOLLARS (EXAMPLE: 250)  YOU ARE AUTOMATICALLY STARTED WITH\n");
+        print("500 DOLLARS IN YOUR ACCOUNT.\n");
+        print("\n");
+        print("GOOD LUCK!\n");
+    }
+    a1 = 500;
+    while (1) {
+        a = Math.floor(3 * Math.random());
+        if (a == 0)
+            a = 3;
+        b = Math.floor(3 * Math.random());
+        if (b == 0)
+            b = 2;
+        c = Math.floor(3 * Math.random());
+        if (c == 0)
+            c = 3;
+        d = Math.floor(3 * Math.random());
+        if (d == 0)
+            d = 1;
+        e = Math.floor(3 * Math.random());
+        if (e == 0)
+            e = 3;
+        f = Math.floor(3 * Math.random());
+        if (f == 0)
+            f = 3;
+        g = Math.floor(3 * Math.random());
+        if (g == 0)
+            g = 3;
+        h = Math.floor(3 * Math.random());
+        if (h == 0)
+            h = 3;
+        i = Math.floor(3 * Math.random());
+        if (i == 0)
+            i = 2;
+        j = Math.floor(3 * Math.random());
+        if (j == 0)
+            j = 3;
+        k = Math.floor(3 * Math.random());
+        if (k == 0)
+            k = 2;
+        l = Math.floor(3 * Math.random());
+        if (l == 0)
+            l = 3;
+        m = Math.floor(3 * Math.random());
+        if (m == 0)
+            m = 3;
+        n = Math.floor(3 * Math.random());
+        if (n == 0)
+            n = 1;
+        o = Math.floor(3 * Math.random());
+        if (o == 0)
+            o = 3;
+        print("WANT TO MAKE A WAGER?");
+        z = parseInt(await input());
+        if (z != 0) {
+            print("HOW MUCH ");
+            while (1) {
+                z1 = parseInt(await input());
+                if (a1 < z1) {
+                    print("TRIED TO FOOL ME; BET AGAIN");
+                } else {
+                    break;
+                }
+            }
+        }
+        w = 1;
+        x = 1;
+        y = 1;
+        print("\n");
+        print("IT'S YOUR MOVE:  ");
+        while (1) {
+            str = await input();
+            p = parseInt(str);
+            q = parseInt(str.substr(str.indexOf(",") + 1));
+            r = parseInt(str.substr(str.lastIndexOf(",") + 1));
+            if (p > w + 1 || q > x + 1 || r > y + 1 || (p == w + 1 && (q >= x + 1 || r >= y + 1)) || (q == x + 1 && r >= y + 1)) {
+                print("\n");
+                print("ILLEGAL MOVE, YOU LOSE.\n");
+                break;
+            }
+            w = p;
+            x = q;
+            y = r;
+            if (p == 3 && q == 3 && r == 3) {
+                won = true;
+                break;
+            }
+            if (p == a && q == b && r == c
+             || p == d && q == e && r == f
+             || p == g && q == h && r == i
+             || p == j && q == k && r == l
+             || p == m && q == n && r == o) {
+                print("******BANG******");
+                print("YOU LOSE!");
+                print("\n");
+                print("\n");
+                won = false;
+                break;
+            }
+            print("NEXT MOVE: ");
+        }
+        if (won) {
+            print("CONGRATULATIONS!\n");
+            if (z != 0) {
+                z2 = a1 + z1;
+                print("YOU NOW HAVE " + z2 + " DOLLARS.\n");
+                a1 = z2;
+            }
+        } else {
+            if (z != 0) {
+                print("\n");
+                z2 = a1 - z1;
+                if (z2 <= 0) {
+                    print("YOU BUST.\n");
+                    break;
+                } else {
+                    print(" YOU NOW HAVE " + z2 + " DOLLARS.\n");
+                    a1 = z2;
+                }
+            }
+        }
+        print("DO YOU WANT TO TRY AGAIN ");
+        s = parseInt(await input());
+        if (s != 1)
+            break;
+    }
+    print("TOUGH LUCK!\n");
+    print("\n");
+    print("GOODBYE.\n");
+}
+
+main();

From 04f5f8d71e9e8eb42fac58a9af5d66be3c50ad47 Mon Sep 17 00:00:00 2001
From: nanochess 
Date: Wed, 3 Mar 2021 19:11:42 -0600
Subject: [PATCH 3/4] Ported CIVIL WAR to Javascript

---
 27 Civil War/civilwar.bas             |   4 +-
 27 Civil War/javascript/civilwar.html |   9 +
 27 Civil War/javascript/civilwar.js   | 528 ++++++++++++++++++++++++++
 3 files changed, 539 insertions(+), 2 deletions(-)
 create mode 100644 27 Civil War/javascript/civilwar.html
 create mode 100644 27 Civil War/javascript/civilwar.js

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();

From e5d1b730ccd258da61b8120d2d4662ed79bf15f6 Mon Sep 17 00:00:00 2001
From: nanochess 
Date: Wed, 3 Mar 2021 19:14:42 -0600
Subject: [PATCH 4/4] Corrected bug in CIVIL WAR Javascript

---
 27 Civil War/javascript/civilwar.js | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/27 Civil War/javascript/civilwar.js b/27 Civil War/javascript/civilwar.js
index 489e2955..c1630621 100644
--- a/27 Civil War/javascript/civilwar.js	
+++ b/27 Civil War/javascript/civilwar.js	
@@ -416,7 +416,7 @@ async function main()
             }
             // 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 = c6 * (1.28 + (5 * m2 / 6) / (ba[2] + 1));
             c6 = Math.floor(c6 * (1 + 1 / o2) + 0.5);
             // If loss > men present, rescale losses
             e2 = 100 / o2;
@@ -483,12 +483,12 @@ async function main()
             s = 3;
             s0 = 0;
             for (i = 1; i <= 4; i++) {
-                if (s[i] <= 5)
+                if (sa[i] <= 5)
                     continue;
-                s[i] -= 5;
+                sa[i] -= 5;
                 s0 += s;
             }
-            s[y] += s0;
+            sa[y] += s0;
         }
         u = 0;
         u2 = 0;