
-----------------------------------
programmerNeedsHelp2.0
Thu Jun 15, 2017 8:29 pm

In need of help for my Turing Game!!
-----------------------------------
I am currently making a game which consists of four levels. I want to program the game so that if the user loses any level (in which a "game over screen" is displayed), it tells the user to press a certain key to go back to the main menu of the game, in which the user can play the game again if he/she wants to. (so it has to repeat all code written prior to the displaying of "game over" screen, within the same file) But I can't figure this out! Is there anything similar to a goto statement as seen in c, python, and other languages? Here is the code:

% June 7th 2017
% SwordQuest.t
% A Sword Fighting Game Based On The Popular Title Nidhogg. The User Must
% Fight Their Way Through Four Levels Of Battles In Order To Win The Game.

% Indicate Screen Size and Background Image
View.Set ("graphics,offscreenonly")
var window : int := Window.Open ("graphics:930;605,nobuttonbar")
View.Set ("nocursor")

% Indicate Variables
var swordQuestLogoImage : int
var forestBackground : int
const CENTREX : int := maxx div 2
const CENTREY : int := maxy div 2
var msSerifFont : int
var startOption : char
var player : int
var playerSprite : int
var playerYValue : int := 290
var ground : int := 290
var playerXValue : int := CENTREX - 300
var playerXValueOriginal : int
var enemyOne : int
var enemyOneSprite : int
var enemyOneYValue : int := ground
var enemyOneXValue : int := CENTREX + 400
var enemyTwo : int
var enemyTwoSprite : int
var enemyTwoYValue : int := ground
var enemyTwoXValue : int := CENTREX + 400
var enemyThree : int
var lordZolton : int
var pressSToStartPic : int
var pressSToStartSprite : int
var arrowInput : array char of boolean
var arrowInputFireball : array char of boolean
var arrowInputTwo : array char of boolean
var arrowInputFireballTwo : array char of boolean
var arrowInputThree : array char of boolean
var arrowInputFireballThree : array char of boolean
var arrowInputFour : array char of boolean
var mainMenu : int
var levelOneBackground : int
var aboutGameButtonPic : int
var controlsButtonPic : int
var startButtonPic : int
var quitGameButtonPic : int
var aboutGameScreenOne : int
var aboutGameScreenTwo : int
var aboutGameScreenThree : int
var controlsScreen : int
var backButtonPic : int
var fireball : int
var fireballSprite : int
var fireballXValue : int
var enemyOnePlayerDistance : real := 0
var attackChance : int
var numLives : int := 3
var gameOver : int
var lifeHearts : int
var lifeHeartsSprite : int
var playerAttack : int
var enemyOneSword : int
var levelOneComplete : int
var fireballEnemyOneDistance : real
var enemyOneLives : int := 10
var enemyLifeHearts : int
var enemyLifeHeartsSprite : int
var fireballMovement : int
var winLoseSeperator : int := 0
var levelTwoBackground : int
var enemyTwoSword : int
var enemyTwoLives : int := 10
var enemyThreeLives : int := 10
var lordZoltonLives : int := 10
var numPoints : int := 0
var levelTwoComplete : int
var enemyTwoPlayerDistance : real := 0
var fireballEnemyTwoDistance : real
var lifeHeartsThree : int
var enemyLifeHeartsTen : int
var levelThreeComplete : int
var enemyThreeSprite : int
var enemyThreePlayerDistance : real := 0
var enemyThreeSword : int
var enemyThreeXValue : int := CENTREX + 400
var enemyThreeYValue : int := ground
var levelFourBackground : int
var lordZoltonSprite : int
var lordZoltonSword : int
var lordZoltonPlayerDistance : real := 0
var lordZoltonXValue : int := CENTREX + 400
var lordZoltonYValue : int := ground
var fireballLordZoltonDistance : real := 0
var playerMovementSeperator : int := 0
var fireballSeperator : int := 0
var aiSeperator : int := 0
var fireballXValueNew : int
var level : boolean := true
var level2 : boolean := true
var level3 : boolean := true
var enemyThreSprite : int

% Indicate Variables For Menu Buttons
var playGame, aboutGame, exitAboutGame, exitAbout, menuDraw, exitGameControls : boolean
var buttonX, buttonY, button : int
var buttonXOne, buttonYOne, buttonOne : int
var buttonXTwo, buttonYTwo, buttonTwo : int
var buttonXThree, buttonYThree, buttonThree : int
var buttonX1, buttonY1, button1 : int

% Import Start Screen Music
Music.PlayFileLoop ("StartOfGameSoundtrack.mp3")

% Start Screen

% Import Forest Background
forestBackground := Pic.FileNew ("StartScreenForestBackground.bmp")
forestBackground := Pic.Scale (forestBackground, 930, 605)
Pic.Draw (forestBackground, 0, 0, picMerge)

% Import Game Logo/Title
swordQuestLogoImage := Pic.FileNew ("SwordQuestLogo.bmp")
swordQuestLogoImage := Pic.Scale (swordQuestLogoImage, 430, 270)
Pic.Draw (swordQuestLogoImage, CENTREX - 220, CENTREY - 120, picMerge)

% Start Option
pressSToStartPic := Pic.FileNew ("pressSToStart.bmp")
pressSToStartPic := Pic.Scale (pressSToStartPic, 500, 200)
pressSToStartSprite := Sprite.New (pressSToStartPic)
Sprite.Show (pressSToStartSprite)
for startLocation : 0 .. 40
    Sprite.SetPosition (pressSToStartSprite, CENTREX, startLocation - 25, true)
    View.Update
    delay (20)
end for
loop
    % Get input of (s) key to start game
    startOption := getchar
    if startOption = "s" or startOption = "S" then
        Sprite.Hide (pressSToStartSprite)
        cls
        exit
    end if
end loop

% Set menuDraw as false
menuDraw := false

loop

    % Declare boolean values as false
    exitAboutGame := false
    playGame := false
    exitGameControls := false
    if menuDraw = false then

        % Main Menu
        mainMenu := Pic.FileNew ("mainMenu.bmp")
        mainMenu := Pic.Scale (mainMenu, 930, 605)
        Pic.Draw (mainMenu, 0, 0, picMerge)

        % Create the pictures for main menu buttons
        aboutGameButtonPic := Pic.FileNew ("aboutGameButtonPic.bmp")
        Pic.Draw (aboutGameButtonPic, 8, 202, picMerge)
        controlsButtonPic := Pic.FileNew ("controlsButtonPic.bmp")
        Pic.Draw (controlsButtonPic, 319, 202, picMerge)
        startButtonPic := Pic.FileNew ("startButtonPic.bmp")
        Pic.Draw (startButtonPic, 630, 202, picMerge)
        quitGameButtonPic := Pic.FileNew ("quitGameButtonPic.bmp")
        Pic.Draw (quitGameButtonPic, 650, 20, picMerge)
        menuDraw := true
    end if

    loop
        mousewhere (buttonX, buttonY, button)

        % In-game buttons

        % Start Game Button
        if (buttonX >= 631 and buttonX = 205 and buttonY = 652 and buttonX = 21 and buttonY = 321 and buttonX = 202 and buttonY = 602 and buttonX1 = 38 and buttonY1 = 8 and buttonX = 202 and buttonY = 594 and buttonXOne = 98 and buttonYOne = 489 and buttonXOne = 92 and buttonYOne = 594 and buttonXThree = 98 and buttonYThree = 100 then
                playerMovementSeperator := 0
            end if
            % Arrow Key Input

            % Player Movement With Down Key
            Input.KeyDown (arrowInput)

            % Player Movement With Up Key
            if arrowInput (KEY_UP_ARROW) and playerYValue = ground then
                playerXValueOriginal := playerXValue
                loop

                    % Parabola Shape of Jump Motion
                    playerYValue := floor (-0.015 * ((playerXValue - playerXValueOriginal) div 2) ** 2 + 420)
                    playerXValue := playerXValue + 1
                    Sprite.SetPosition (playerSprite, playerXValue, playerYValue, false)
                    Sprite.Show (playerSprite)
                    delay (2)

                    % Exit Parabola Motion When The Player Has Reached The Ground
                    exit when playerYValue = maxx then
                    playerXValue := 0
                end if

                % Player Movement With Left Key
            elsif arrowInput (KEY_LEFT_ARROW) then
                playerXValue := playerXValue - 1

                % Restrict Player Movement on Right Side of Screen
                if playerXValue = 0 then
                    playerXValue := maxx
                end if

                % Sword Attack
            elsif arrowInput (' ') and playerYValue = 40 then
                fireballSeperator := 0
            end if

            % Dissallows Use Of Fireball When Behind Player (Doesnt make Physical Sense To Allow, Would Cause No Advantage In Game)
            if playerXValue < enemyOneXValue then
                Input.KeyDown (arrowInputFireball)
                if arrowInputFireball (KEY_DOWN_ARROW) and playerYValue  40 then
                            if fireballSeperator = 0 then
                                fireballSeperator := 1
                            end if
                        end if
                        delay (2)
                        Sprite.Show (fireballSprite)
                        exit when (fireballXValueNew - enemyOneXValue) >= 40 and fireballSeperator = 1
                    end for
                    Sprite.Hide (fireballSprite)
                    enemyOneLives := enemyOneLives - 1
                    numPoints := numPoints + 50
                    if enemyOneLives = 9 then

                        % Replace Enemy Heart Sprite Pic to the One With Nine Hearts
                        Sprite.Hide (enemyLifeHeartsSprite)
                        enemyLifeHearts := Pic.FileNew ("enemyHeartsNine.bmp")
                        enemyLifeHearts := Pic.Scale (enemyLifeHearts, 360, 60)
                        View.Update
                        Sprite.ChangePic (enemyLifeHeartsSprite, enemyLifeHearts)
                        Sprite.Show (enemyLifeHeartsSprite)
                        Sprite.SetPosition (enemyLifeHeartsSprite, CENTREX + 270, CENTREY + 270, true)

                        % Replace Enemy Heart Sprite Pic to the One With Eight Hearts
                    elsif enemyOneLives = 8 then
                        Sprite.Hide (enemyLifeHeartsSprite)
                        enemyLifeHearts := Pic.FileNew ("enemyHeartsEight.bmp")
                        enemyLifeHearts := Pic.Scale (enemyLifeHearts, 320, 60)
                        View.Update
                        Sprite.ChangePic (enemyLifeHeartsSprite, enemyLifeHearts)
                        Sprite.Show (enemyLifeHeartsSprite)
                        Sprite.SetPosition (enemyLifeHeartsSprite, CENTREX + 270, CENTREY + 270, true)

                        % Replace Enemy Heart Sprite Pic to the One With Seven Hearts
                    elsif enemyOneLives = 7 then
                        Sprite.Hide (enemyLifeHeartsSprite)
                        enemyLifeHearts := Pic.FileNew ("enemyHeartsSeven.bmp")
                        enemyLifeHearts := Pic.Scale (enemyLifeHearts, 280, 60)
                        View.Update
                        Sprite.ChangePic (enemyLifeHeartsSprite, enemyLifeHearts)
                        Sprite.Show (enemyLifeHeartsSprite)
                        Sprite.SetPosition (enemyLifeHeartsSprite, CENTREX + 270, CENTREY + 270, true)

                        % Replace Enemy Heart Sprite Pic to the One With Six Hearts
                    elsif enemyOneLives = 6 then
                        Sprite.Hide (enemyLifeHeartsSprite)
                        enemyLifeHearts := Pic.FileNew ("enemyHeartsSix.bmp")
                        enemyLifeHearts := Pic.Scale (enemyLifeHearts, 240, 60)
                        View.Update
                        Sprite.ChangePic (enemyLifeHeartsSprite, enemyLifeHearts)
                        Sprite.Show (enemyLifeHeartsSprite)
                        Sprite.SetPosition (enemyLifeHeartsSprite, CENTREX + 270, CENTREY + 270, true)

                        % Replace Enemy Heart Sprite Pic to the One With Five Hearts
                    elsif enemyOneLives = 5 then
                        Sprite.Hide (enemyLifeHeartsSprite)
                        enemyLifeHearts := Pic.FileNew ("enemyHeartsFive.bmp")
                        enemyLifeHearts := Pic.Scale (enemyLifeHearts, 200, 60)
                        View.Update
                        Sprite.ChangePic (enemyLifeHeartsSprite, enemyLifeHearts)
                        Sprite.Show (enemyLifeHeartsSprite)
                        Sprite.SetPosition (enemyLifeHeartsSprite, CENTREX + 270, CENTREY + 270, true)

                        % Replace Enemy Heart Sprite Pic to the One With Four Hearts
                    elsif enemyOneLives = 4 then
                        Sprite.Hide (enemyLifeHeartsSprite)
                        enemyLifeHearts := Pic.FileNew ("enemyHeartsFour.bmp")
                        enemyLifeHearts := Pic.Scale (enemyLifeHearts, 160, 60)
                        View.Update
                        Sprite.ChangePic (enemyLifeHeartsSprite, enemyLifeHearts)
                        Sprite.Show (enemyLifeHeartsSprite)
                        Sprite.SetPosition (enemyLifeHeartsSprite, CENTREX + 270, CENTREY + 270, true)

                        % Replace Enemy Heart Sprite Pic to the One With Three Hearts
                    elsif enemyOneLives = 3 then
                        Sprite.Hide (enemyLifeHeartsSprite)
                        enemyLifeHearts := Pic.FileNew ("enemyHeartsThree.bmp")
                        enemyLifeHearts := Pic.Scale (enemyLifeHearts, 120, 60)
                        View.Update
                        Sprite.ChangePic (enemyLifeHeartsSprite, enemyLifeHearts)
                        Sprite.Show (enemyLifeHeartsSprite)
                        Sprite.SetPosition (enemyLifeHeartsSprite, CENTREX + 270, CENTREY + 270, true)

                        % Replace Enemy Heart Sprite Pic to the One With Two Hearts
                    elsif enemyOneLives = 2 then
                        Sprite.Hide (enemyLifeHeartsSprite)
                        enemyLifeHearts := Pic.FileNew ("enemyHeartsTwo.bmp")
                        enemyLifeHearts := Pic.Scale (enemyLifeHearts, 100, 60)
                        View.Update
                        Sprite.ChangePic (enemyLifeHeartsSprite, enemyLifeHearts)
                        Sprite.Show (enemyLifeHeartsSprite)
                        Sprite.SetPosition (enemyLifeHeartsSprite, CENTREX + 270, CENTREY + 270, true)

                        % Replace Enemy Heart Sprite Pic to the One With One Heart
                    elsif enemyOneLives = 1 then
                        Sprite.Hide (enemyLifeHeartsSprite)
                        enemyLifeHearts := Pic.FileNew ("enemyHeartsOne.bmp")
                        enemyLifeHearts := Pic.Scale (enemyLifeHearts, 60, 60)
                        View.Update
                        Sprite.ChangePic (enemyLifeHeartsSprite, enemyLifeHearts)
                        Sprite.Show (enemyLifeHeartsSprite)
                        Sprite.SetPosition (enemyLifeHeartsSprite, CENTREX + 270, CENTREY + 270, true)
                    elsif enemyOneLives = 0 then
                        View.Update
                        loop

                            % Display Game Over Screen and Hide All Sprites (So Player Must Re-Start, and Cant Continue Game)
                            Pic.Draw (levelOneComplete, 0, 0, picMerge)
                            Sprite.Hide (lifeHeartsSprite)
                            Sprite.Hide (enemyOneSprite)
                            Sprite.Hide (playerSprite)
                            Sprite.Hide (fireballSprite)
                            Sprite.Hide (enemyLifeHeartsSprite)

                            % Setting this Variable to 1 Helps To Seperate The Game Over and
                            % Winning Screen, When an Player Has Lost A Life After Winning
                            % In The Background
                            winLoseSeperator := 1

                            delay (1)
                            exit
                        end loop
                    end if
                end if
            end if
        end if
    end loop
end fireballMoving

% Enemy AI
process enemyOneAttack

    % Seperates AI Movements Frim Attacks, In Order To Avoid Glitches and Freezes
    aiSeperator := 0
    loop
        if level = true then
            % Calculate Distance Between Enemy and Player
            enemyOnePlayerDistance := Math.Distance (playerXValue, playerYValue, enemyOneXValue, enemyOneYValue)
            if enemyOnePlayerDistance >= 200 then
                aiSeperator := 0
            end if

            % Makes Enemy Follow Player Towards The Left
            if enemyOnePlayerDistance > 0 and playerXValue < enemyOneXValue then
                enemyOneXValue := enemyOneXValue - 2
                Sprite.SetPosition (enemyOneSprite, enemyOneXValue, enemyOneYValue, true)

                % Makes Enemy Follow Player Towards The Right
            elsif enemyOnePlayerDistance > 0 and playerXValue > enemyOneXValue then
                enemyOneXValue := enemyOneXValue + 2
                Sprite.SetPosition (enemyOneSprite, enemyOneXValue, enemyOneYValue, true)
            elsif enemyOnePlayerDistance < 200 then

                % Generates A Number Predicting The Chance of Enemy Attack
                randint (attackChance, 1, 4)
                if attackChance = 1 then
                    Sprite.ChangePic (enemyOneSprite, enemyOneSword)
                    Sprite.SetPosition (enemyOneSprite, enemyOneXValue, enemyOneYValue, true)
                    View.Update

                    if aiSeperator = 0 then

                        % Decreases Life Count When Enemy Successfully Attacks Player
                        numLives := numLives - 1
                        if numLives = 2 then

                            % Changes Player Life Hearts Sprite Pic To Two Lives (Two Hearts)
                            Sprite.Hide (lifeHeartsSprite)
                            lifeHearts := Pic.FileNew ("lifeHeartsTwo.bmp")
                            lifeHearts := Pic.Scale (lifeHearts, 80, 40)
                            Sprite.ChangePic (lifeHeartsSprite, lifeHearts)
                            Sprite.Show (lifeHeartsSprite)
                            Sprite.SetPosition (lifeHeartsSprite, CENTREX - 370, CENTREY + 250, true)

                            % Changes Player Life Hearts Sprite Pic To Two Lives (One Heart)
                        elsif numLives = 1 then
                            Sprite.Hide (lifeHeartsSprite)
                            lifeHearts := Pic.FileNew ("lifeHeartsOne.bmp")
                            lifeHearts := Pic.Scale (lifeHearts, 40, 40)
                            Sprite.ChangePic (lifeHeartsSprite, lifeHearts)
                            Sprite.Show (lifeHeartsSprite)
                            Sprite.SetPosition (lifeHeartsSprite, CENTREX - 370, CENTREY + 250, true)
                        end if
                        aiSeperator := 1
                    end if
                    exit when numLives = 0
                end if

            end if

            delay (7)
        end if
    end loop
    if winLoseSeperator = 0 then
        Sprite.Hide (enemyOneSprite)
        Sprite.Hide (playerSprite)
        gameOver := Pic.FileNew ("gameOver.bmp")
        gameOver := Pic.Scale (gameOver, 930, 605)
        Pic.Draw (gameOver, 0, 0, picMerge)
        View.Update
        loop

            % Displays Game Over Screen When All Lives Are Lost (This is Being Repeated In The Same Level Bacause
            % It Must Be Done For The Fireball And Sword Seperately
            Pic.Draw (gameOver, 0, 0, picMerge)
            Sprite.Hide (enemyLifeHeartsSprite)
            Sprite.Hide (lifeHeartsSprite)
            Sprite.Hide (enemyOneSprite)
            Sprite.Hide (playerSprite)
            Sprite.Hide (fireballSprite)
        end loop
    end if
end enemyOneAttack

% Level One Process Components
loop
    if level = true then
        fork playerMovement
        fork enemyOneAttack
        fork fireballMoving
    end if
    exit
end loop

loop
    % Get input of (a) key to start game
    if winLoseSeperator = 1 then
        startOption := getchar
        Sprite.Hide (playerSprite)
        if startOption = "a" or startOption = "A" then
            cls
            exit
        end if
    end if
end loop

level := false

include "Sword Quest Level 2.t"

-----------------------------------
Insectoid
Fri Jun 16, 2017 5:51 am

RE:In need of help for my Turing Game!!
-----------------------------------
This is extremely difficult to do if you're using processes at all in your code. You should be using procedures instead. Processes will give you all kinds of unpredictable bugs that are impossible to solve. 

The easiest way to do what you're asking is to wrap the entire game in a loop. The first thing that loop does is set all variables to the starting condition. The next thing it does is ruin your game loop (again, inside the giant everything loop). When the game is won/lost, the game loop exits, which returns control to the giant loop, which restarts and automatically resets all variables. It should look like this:

%declare all variables
Loop
    %assign all variables
    Loop %main game loop
         %game code goes here
         Exit when game is lost or won
    End loop
End loop
