// BASKETBALL
//
// 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;
}

var s = [0, 0];
var z;
var d;
var p;
var your_turn;
var game_restart;

function two_minutes()
{
    print("\n");
    print("   *** TWO MINUTES LEFT IN THE GAME ***\n");
    print("\n");
}

function show_scores()
{
    print("SCORE: " + s[1] + " TO " + s[0] + "\n");
}

function score_computer()
{
    s[0] = s[0] + 2;
    show_scores();
}

function score_player()
{
    s[1] = s[1] + 2;
    show_scores();
}

function half_time()
{
    print("\n");
    print("   ***** END OF FIRST HALF *****\n");
    print("SCORE: DARMOUTH: " + s[1] + "  " + os + ": " + s[0] + "\n");
    print("\n");
    print("\n");
}

function foul()
{
    if (Math.random() <= 0.49) {
        print("SHOOTER MAKES BOTH SHOTS.\n");
        s[1 - p] = s[1 - p] + 2;
        show_scores();
    } else if (Math.random() <= 0.75) {
        print("SHOOTER MAKES ONE SHOT AND MISSES ONE.\n");
        s[1 - p] = s[1 - p] + 1;
        show_scores();
    } else {
        print("BOTH SHOTS MISSED.\n");
        show_scores();
    }
}

function player_play()
{
    if (z == 1 || z == 2) {
        t++;
        if (t == 50) {
            half_time();
            game_restart = 1;
            return;
        }
        if (t == 92)
            two_minutes();
        print("JUMP SHOT\n");
        if (Math.random() <= 0.341 * d / 8) {
            print("SHOT IS GOOD.\n");
            score_player();
            return;
        }
        if (Math.random() <= 0.682 * d / 8) {
            print("SHOT IS OFF TARGET.\n");
            if (d / 6 * Math.random() >= 0.45) {
                print("REBOUND TO " + os + "\n");
                return;
            }
            print("DARTMOUTH CONTROLS THE REBOUND.\n");
            if (Math.random() > 0.4) {
                if (d == 6) {
                    if (Math.random() > 0.6) {
                        print("PASS STOLEN BY " + os + " EASY LAYUP.\n");
                        score_computer();
                        return;
                    }
                }
                print("BALL PASSED BACK TO YOU. ");
                your_turn = 1;
                return;
            }
        } else if (Math.random() <= 0.782 * d / 8) {
            print("SHOT IS BLOCKED.  BALL CONTROLLED BY ");
            if (Math.random() <= 0.5) {
                print("DARTMOUTH.\n");
                your_turn = 1;
                return;
            }
            print(os + ".\n");
            return;
        } else if (Math.random() <= 0.843 * d / 8) {
            print("SHOOTER IS FOULED.  TWO SHOTS.\n");
            foul();
            return;
            // In original code but lines 1180-1195 aren't used (maybe replicate from computer's play)
            //        } else if (Math.random() <= 0.9 * d / 8) {
            //            print("PLAYER FOULED, TWO SHOTS.\n");
            //            foul();
            //            return;
        } else {
            print("CHARGING FOUL.  DARTMOUTH LOSES BALL.\n");
            return;
        }
    }
    while (1) {
        if (++t == 50) {
            half_time();
            game_restart = 1;
            return;
        }
        if (t == 92)
            two_minutes();
        if (z == 0) {
            your_turn = 2;
            return;
        }
        if (z <= 3)
            print("LAY UP.\n");
        else
            print("SET SHOT.\n");
        if (7 / d * Math.random() <= 0.4) {
            print("SHOT IS GOOD.  TWO POINTS.\n");
            score_player();
            return;
        }
        if (7 / d * Math.random() <= 0.7) {
            print("SHOT IS OFF THE RIM.\n");
            if (Math.random() <= 2.0 / 3.0) {
                print(os + " CONTROLS THE REBOUND.\n");
                return;
            }
            print("DARMOUTH CONTROLS THE REBOUND.\n");
            if (Math.random() <= 0.4)
                continue;
            print("BALL PASSED BACK TO YOU.\n");
            your_turn = 1;
            return;
        }
        if (7 /d * Math.random() <= 0.875) {
            print("SHOOTER FOULED.  TWO SHOTS.\n");
            foul();
            return;
        }
        if (7 /d * Math.random() <= 0.925) {
            print("SHOT BLOCKED. " + os + "'S BALL.\n");
            return;
        }
        print("CHARGING FOUL.  DARTHMOUTH LOSES THE BALL.\n");
        return;
    }
}

function computer_play()
{
    rebound = 0;
    while (1) {
        p = 1;
        if (++t == 50) {
            half_time();
            game_restart = 1;
            return;
        }
        print("\n");
        z1 = 10 / 4 * Math.random() + 1;
        if (z1 <= 2) {
            print("JUMP SHOT.\n");
            if (8 / d * Math.random() <= 0.35) {
                print("SHOT IS GOOD.\n");
                score_computer();
                return;
            }
            if (8 / d * Math.random() <= 0.75) {
                print("SHOT IS OFF RIM.\n");
                if (d / 6 * Math.random() <= 0.5) {
                    print("DARMOUTH CONTROLS THE REBOUND.\n");
                    return;
                }
                print(os + " CONTROLS THE REBOUND.\n");
                if (d == 6) {
                    if (Math.random() <= 0.75) {
                        print("BALL STOLEN.  EASY LAP UP FOR DARTMOUTH.\n");
                        score_player();
                        continue;
                    }
                    if (Math.random() > 0.6) {
                        print("PASS STOLEN BY " + os + " EASY LAYUP.\n");
                        score_computer();
                        return;
                    }
                    print("BALL PASSED BACK TO YOU. ");
                    return;
                }
                if (Math.random() <= 0.5) {
                    print("PASS BACK TO " + os + " GUARD.\n");
                    continue;
                }
            } else if (8 / d * Math.random() <= 0.90) {
                print("PLAYER FOULED.  TWO SHOTS.\n");
                foul();
                return;
            } else {
                print("OFFENSIVE FOUL.  DARTMOUTH'S BALL.\n");
                return;
            }
        }
        while (1) {
            if (z1 > 3) {
                print("SET SHOT.\n");
            } else {
                print("LAY UP.\n");
            }
            if (7 / d * Math.random() <= 0.413) {
                print("SHOT IS GOOD.\n");
                score_computer();
                return;
            }
            print("SHOT IS MISSED.\n");
            // Spaguetti jump, better to replicate code
            if (d / 6 * Math.random() <= 0.5) {
                print("DARMOUTH CONTROLS THE REBOUND.\n");
                return;
            }
            print(os + " CONTROLS THE REBOUND.\n");
            if (d == 6) {
                if (Math.random() <= 0.75) {
                    print("BALL STOLEN.  EASY LAP UP FOR DARTMOUTH.\n");
                    score_player();
                    break;
                }
                if (Math.random() > 0.6) {
                    print("PASS STOLEN BY " + os + " EASY LAYUP.\n");
                    score_computer();
                    return;
                }
                print("BALL PASSED BACK TO YOU. ");
                return;
            }
            if (Math.random() <= 0.5) {
                print("PASS BACK TO " + os + " GUARD.\n");
                break;
            }
        }
    }
}

// Main program
async function main()
{
    print(tab(31) + "BASKETBALL\n");
    print(tab(15) + "CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY\n");
    print("\n");
    print("\n");
    print("\n");
    print("THIS IS DARTMOUTH COLLEGE BASKETBALL.  YOU WILL BE DARTMOUTH\n");
    print(" CAPTAIN AND PLAYMAKER.  CALL SHOTS AS FOLLOWS:  1. LONG\n");
    print(" (30 FT.) JUMP SHOT; 2. SHORT (15 FT.) JUMP SHOT; 3. LAY\n");
    print(" UP; 4. SET SHOT.\n");
    print("BOTH TEAMS WILL USE THE SAME DEFENSE.  CALL DEFENSE AS\n");
    print("FOLLOWS:  6. PRESS; 6.5 MAN-TO MAN; 7. ZONE; 7.5 NONE.\n");
    print("TO CHANGE DEFENSE, JUST TYPE 0 AS YOUR NEXT SHOT.\n");
    print("YOUR STARTING DEFENSE WILL BE");
    t = 0;
    p = 0;
    d = parseFloat(await input());
    if (d < 6) {
        your_turn = 2;
    } else {
        print("\n");
        print("CHOOSE YOUR OPPONENT");
        os = await input();
        game_restart = 1;
    }
    while (1) {
        if (game_restart) {
            game_restart = 0;
            print("CENTER JUMP\n");
            if (Math.random() > 3.0 / 5.0) {
                print("DARMOUTH CONTROLS THE TAP.\n");
            } else {
                print(os + " CONTROLS THE TAP.\n");
                computer_play();
            }
        }
        if (your_turn == 2) {
            print("YOUR NEW DEFENSIVE ALLIGNMENT IS");
            d = parseFloat(await input());
        }
        print("\n");
        while (1) {
            print("YOUR SHOT");
            z = parseInt(await input());
            p = 0;
            if (z != Math.floor(z) || z < 0 || z > 4)
                print("INCORRECT ANSWER.  RETYPE IT. ");
            else
                break;
        }
        if (Math.random() < 0.5 || t < 100) {
            game_restart = 0;
            your_turn = 0;
            player_play();
            if (game_restart == 0 && your_turn == 0)
                computer_play();
        } else {
            print("\n");
            if (s[1] == s[0]) {
                print("\n");
                print("   ***** END OF SECOND HALF *****\n");
                print("\n");
                print("SCORE AT END OF REGULATION TIME:\n");
                print("        DARTMOUTH: " + s[1] + "  " + os + ": " + s[0] + "\n");
                print("\n");
                print("BEGIN TWO MINUTE OVERTIME PERIOD\n");
                t = 93;
                print("CENTER JUMP\n");
                if (Math.random() > 3.0 / 5.0)
                    print("DARMOUTH CONTROLS THE TAP.\n");
                else
                    print(os + " CONTROLS THE TAP.\n");
            } else {
                print("   ***** END OF GAME *****\n");
                print("FINAL SCORE: DARMOUTH: " + s[1] + "  " + os + ": " + s[0] + "\n");
                break;
            }
        }
    }
}

main();
