My menu fails to exit 
	 
	
		| Author | 
		Message | 
	 
		 
		Legion
 
 
 
    
		 | 
		
		
			
				  Posted: Thu May 01, 2014 7:40 pm    Post subject: My menu fails to exit  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				What is it you are trying to achieve?
 
I want my menu to remain at the top of the screen and the game to exit the menu when the enemy is out of hp.
 
 
 
What is the problem you are having?
 
No matter what I do, it seems to be impossible to have the enemy die when he should and have the menu close as a result.
 
 
Describe what you have tried to solve this problem
 
I have tried rearranging the exit when.
 
 
Post any relevant code (You may choose to attach the file instead of posting the code if it is too long)
 
<Answer Here>
 
 
	  | Turing: | 	 		  
proc attack
     if spd >= eSpd  then                                      %If your speed is greater than you will be prompted to attack first
        if Rand.Int  (1,  100) <= eEvas  and eEvas > style  then
            %If a random number generated is less than the enemy's evasivness and their evasivness is greater than your style, the enemy dodges your attack
            put "The enemy avoided your attack!"
        else
            eHealthPhy                                               %Enemy health calculations are made
            put "You heroically attack the enemy!"
            put "Enemy Health: ", eHp
             Input.Pause
            Draw.Cls
            bars
         end if
        put "Trooper is charging towards you!"
        if Rand.Int  (1,  100) <= evas  and evas > eStyle  then
            %If a random number less than your evasivness is generated and your evasivness is greater than the enemy's style you dodge the attack
            put "You expertly evaded the enemy attack!"
        else
            healthPhy
             put "Trooper bit you!"
            put "Health: ", hp
             Input.Pause
            Draw.Cls
            bars
             if hp <=  0 then
                cls
                put "You have been slain by the Trooper!"
                Input.Pause
            end if
        end if
    else
        put "Trooper is charging towards you!"
        if Rand.Int  (1,  100) <= evas  and evas > eStyle  then
            %%If a random number less than your evasivness is generated and your evasivness is greater than the enemy's style you dodge the attack
            put "You expertly evaded the enemy attack!"
        else
            healthPhy
             put "Trooper bit you!"
            put "Health: ", hp
             Input.Pause
            Draw.Cls
            bars
             if hp <=  0 then
                cls
                put "You have been slain by the Trooper!"
                Input.Pause
                Window.Close (defWinID )
            end if
            if Rand.Int  (1,  100) <= eEvas  and eEvas > style  then
                %If a random number generated is less than the enemy's evasivness and their evasivness is greater than your style, the enemy dodges your attack
                put "The enemy avoided your attack!"
            else
                eHealthPhy
                 put "You heroically attack the enemy!"
                put "Enemy Health: ", eHp
                 Input.Pause
                Draw.Cls
                bars
                 %exit when eHp <= 0
            end if
        end if
    end if
end attack
 proc magic
     if spd >= eSpd  then                                     %If your speed is greater than you will be prompted to attack first
        if Rand.Int  (1,  100) <= eEvas  and eEvas > style  then
            %If a random number generated is less than the enemy's evasivness and their evasivness is greater than your style, the enemy dodges your attack
            put "The enemy avoided your attack!"
        else
            eHealthMag                                                 %Enemy health calculations are made
            put "You blast the enemy with your magical powers!"
            put "Enemy Health: ", eHp
             Input.Pause
            Draw.Cls
            bars
             %exit when eHp <= 0
            Input.Pause
            put "Trooper is charging towards you!"
        end if
        if Rand.Int  (1,  100) <= evas  and evas > eStyle  then
            %If a random number less than your evasivness is generated and your evasivness is greater than the enemy's style you dodge the attack
            put "You expertly evaded the enemy attack!"
        else
            healthPhy
             put "Trooper bit you!"
            put "Health: ", hp
             Input.Pause
            Draw.Cls
            bars
             if hp <=  0 then
                cls
                put "You have been slain by the Trooper!"
                Input.Pause
            end if
        end if
    else
        put "Trooper is charging towards you!"
        if Rand.Int  (1,  100) <= evas  and evas > eStyle  then
            %%If a random number less than your evasivness is generated and your evasivness is greater than the enemy's style you dodge the attack
            put "You expertly evaded the enemy attack!"
        else
            healthPhy
             put "Trooper bit you!"
            put "Health: ", hp
             Input.Pause
            Draw.Cls
            bars
             if hp <=  0 then
                cls
                put "You have been slain by the Trooper!"
                Input.Pause
                Window.Close (defWinID )
            end if
            if Rand.Int  (1,  100) <= eEvas  and eEvas > style  then
                %If a random number generated is less than the enemy's evasivness and their evasivness is greater than your style, the enemy dodges your attack
                put "The enemy avoided your attack!"
            else
                eHealthMag
                 put "You blast the enemy with your magical powers!"
                put "Enemy Health: ", eHp
                 Input.Pause
                Draw.Cls
                bars
                 %exit when eHp <= 0
            end if
        end if
    end if
end magic
 proc run
     if spd  * evas >= eSpd  * eEvas  then
        put "You succefully escaped!"
        Input.Pause
        cls
    else
        put "The Trooper is too fast for you!"
    end if
end run
 proc fightMenu
     loop
        first  := GUI.CreateMenu ("Attack")
        item  (1) := GUI.CreateMenuItem ("Basic Attack", attack )
        item  (2) := GUI.CreateMenuItem ("Double Slash", doubleSlash )
        item  (3) := GUI.CreateMenuItem ("Stun Stab", stunStab )
        item  (4) := GUI.CreateMenuItem ("Spirit Swipe", spiritSwipe )
        item  (5) := GUI.CreateMenuItem ("Heart Rend ", heartRend )
        item  (6) := GUI.CreateMenuItem ("Judgement", judgement )
        second  := GUI.CreateMenu ("Magic")
        item  (7) := GUI.CreateMenuItem ("Basic Magic", magic )
        item  (7) := GUI.CreateMenuItem ("Fire Ball", fireball )
        item  (8) := GUI.CreateMenuItem ("Glaciate", glaciate )
        item  (9) := GUI.CreateMenuItem ("Snapping Vines", snappingVines )
        item  (10) := GUI.CreateMenuItem ("Earth's Embrace", earthsEmbrace )
        item  (11) := GUI.CreateMenuItem ("Shatter the Sky", shatterSky )
        third  := GUI.CreateMenu ("Other")
        item  (12) := GUI.CreateMenuItem ("Health Potion ", healthPot )
        item  (13) := GUI.CreateMenuItem ("Mana Potion", manaPot )
        item  (14) := GUI.CreateMenuItem ("Stamina Potion", staminaPot )
        item  (15) := GUI.CreateMenuItem ("Run", run )
        loop
            exit when GUI.ProcessEvent
        end loop
        exit when eHp <=  0
        
    end loop
end fightMenu
 loop
    bars
 
    fightMenu
 end loop
  | 	  
 
 
Please specify what version of Turing you are using
 
4.1.1 | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
		 
		Sponsor Sponsor 
		 
  
		 | 
		
 | 
	 
	 
		  | 
	 
				 
		Insectoid
 
  
 
    
		 | 
		
		
			
				  Posted: Thu May 01, 2014 8:02 pm    Post subject: RE:My menu fails to exit  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				| Without seeing the bars function, I can't find anything wrong with this. It's possible that it is exiting, then skipping bars, then relaunching the fightMenu. | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		Tony
 
  
 
    
		 | 
		
		
			
				  Posted: Thu May 01, 2014 8:08 pm    Post subject: RE:My menu fails to exit  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
					  | code: | 	 		  
 
loop 
 
            exit when GUI.ProcessEvent 
 
        end loop 
 
        exit when eHp <= 0 
 
  | 	  
 
The first loop doesn't exit until you click GUI.Quit button (which doesn't seem to exist in this example). So the program never gets to consider if eHp is 0 or not. | 
			 
			
				 
Tony's programming blog. DWITE - a programming contest. | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		Legion
 
 
 
    
		 | 
		
		
			
				  Posted: Thu May 01, 2014 8:52 pm    Post subject: Re: RE:My menu fails to exit  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				Tony @ Thu May 01, 2014 8:08 pm wrote: 	  | code: | 	 		  
 
loop 
 
            exit when GUI.ProcessEvent 
 
        end loop 
 
        exit when eHp <= 0 
 
  | 	  
 
The first loop doesn't exit until you click GUI.Quit button (which doesn't seem to exist in this example). So the program never gets to consider if eHp is 0 or not. 
 
 
Do I need to use a GUI.Quit button? Because I feel that would detract from the feel of the game. I tried to implement GUI.Quit some other way but it does not exit the menu until called again. I know what I'm missing is probably really obvious, it usually really is, but I need help.
 
	  | Turing: | 	 		  
import GUI  in "%oot/lib/GUI"
%Variables for the base stats and in game choices are declared, key gameplay
%elements are also established
var atk, spd, prtct, matk, mprtct  : real := 5
var maxhp, maxmp, maxsp  : real := 20
var mp, sp, hp  : real
var evas, chrm, style  : real := 1
var eAtk, eSpd, ePrtct, eMatk, eMprtct  : real := 3
var eMaxhp  : real := 20
var eHp  : real
eHp  := eMaxhp
 var eEvas, eStyle  : real := 1
var choice  : string
var charName, levelFont  : int
charName  := Font.New ("Gulim:12")
levelFont  := Font.New ("Gulim:8")
View.Set ("nobuttonbar")
var first, second, third, fourth, fifth, sixth  : int             % The menus.
var shift  : int := 0
var item  : array 1 ..  20 of int         % The menu items.
var name  : array 1 ..  12 of string (20)
% Key procedures are written, they are critical to gameplay and host many
% important elements of the game.
proc showStats
     put "Attack: ", atk
     put "Protect: ", prtct
     put "Health: ", maxhp
     put "Stamina: ", maxsp
     put "Mana ", maxmp
     put "Magic Attack: ", matk
     put "Magic Protect: ", mprtct
     put "Speed: ", spd
     put "Evasion: ", evas
     put "Style: ", style
     put "Charm: ", chrm
 
    mp  := maxmp
 
    sp  := maxsp
 
    hp  := maxhp
 end showStats
 proc bars
     drawfillbox (0,  0,  170,  100,  30)
    drawbox (0,  0,  170,  100,  black)
    Font.Draw ("You", 10,  80, charName,  black)
    Font.Draw ("LV: 1", 10,  65, levelFont,  black)
    drawfillbox (0,  60,  round (150 * (hp / maxhp )), 40,  12)
    drawbox (0,  60,  150,  40,  black)
    drawfillbox (0,  40,  round (150 * (mp / maxmp )), 20,  54)
    drawbox (0,  40,  150,  20,  black)
    drawfillbox (0,  20,  round (150 * (sp / maxsp )), 0,  120)
    drawbox (0,  20,  150,  0,  black)
    drawfillbox (maxx,  60,  466,  0,  30)
    drawbox (maxx,  60,  466,  0,  black)
    Font.Draw ("Enemy", 488,  40, charName,  black)
    Font.Draw ("LV: 1", 488,  25, levelFont,  black)
    drawfillbox (488,  20,  round (150 * (eHp / eMaxhp ) +  488), 0,  12)
    drawbox (488,  0,  638,  20,  black)
end bars
 proc emptyBars
     drawfillbox (0,  60,  round (150 * (hp / maxhp )), 40,  12)
    drawbox (0,  60,  150,  40,  black)
    drawfillbox (0,  40,  round (150 * (mp / maxmp )), 20,  54)
    drawbox (0,  40,  150,  20,  black)
    drawfillbox (0,  20,  round (150 * (sp / maxsp )), 0,  120)
    drawbox (0,  20,  150,  0,  black)
    drawbox (488,  0,  638,  20,  black)
end emptyBars
 proc eHealthPhy
 
    eHp  := eHp -  round (atk  * 3 / ePrtct )
end eHealthPhy
 proc healthPhy
 
    hp  := hp -  round (eAtk  * 2 / prtct )
end healthPhy
 proc eHealthMag
 
    eHp  := eHp -  round (matk  * 3 / eMprtct )
end eHealthMag
 proc healthMag
 
    hp  := hp -  round (eMatk  * 2 / mprtct )
end healthMag
 proc attack
     if spd >= eSpd  then                                      %If your speed is greater than you will be prompted to attack first
        if Rand.Int  (1,  100) <= eEvas  and eEvas > style  then
            %If a random number generated is less than the enemy's evasivness and their evasivness is greater than your style, the enemy dodges your attack
            put "The enemy avoided your attack!"
        else
            eHealthPhy                                               %Enemy health calculations are made
            put "You heroically attack the enemy!"
            put "Enemy Health: ", eHp
             Input.Pause
            Draw.Cls
            bars
         end if
        put "Trooper is charging towards you!"
        if Rand.Int  (1,  100) <= evas  and evas > eStyle  then
            %If a random number less than your evasivness is generated and your evasivness is greater than the enemy's style you dodge the attack
            put "You expertly evaded the enemy attack!"
        else
            healthPhy
             put "Trooper bit you!"
            put "Health: ", hp
             Input.Pause
            Draw.Cls
            bars
             if hp <=  0 then
                cls
                put "You have been slain by the Trooper!"
                Input.Pause
            end if
        end if
    else
        put "Trooper is charging towards you!"
        if Rand.Int  (1,  100) <= evas  and evas > eStyle  then
            %If a random number less than your evasivness is generated and your evasivness is greater than the enemy's style you dodge the attack
            put "You expertly evaded the enemy attack!"
        else
            healthPhy
             put "Trooper bit you!"
            put "Health: ", hp
             Input.Pause
            Draw.Cls
            bars
             if hp <=  0 then
                cls
                put "You have been slain by the Trooper!"
                Input.Pause
                Window.Close (defWinID )
            end if
            if Rand.Int  (1,  100) <= eEvas  and eEvas > style  then
                %If a random number generated is less than the enemy's evasivness and their evasivness is greater than your style, the enemy dodges your attack
                put "The enemy avoided your attack!"
            else
                eHealthPhy
                 put "You heroically attack the enemy!"
                put "Enemy Health: ", eHp
                 Input.Pause
                Draw.Cls
                bars
                 %exit when eHp <= 0
            end if
        end if
    end if
end attack
 proc magic
     if spd >= eSpd  then                                     %If your speed is greater than you will be prompted to attack first
        if Rand.Int  (1,  100) <= eEvas  and eEvas > style  then
            %If a random number generated is less than the enemy's evasivness and their evasivness is greater than your style, the enemy dodges your attack
            put "The enemy avoided your attack!"
        else
            eHealthMag                                                 %Enemy health calculations are made
            put "You blast the enemy with your magical powers!"
            put "Enemy Health: ", eHp
             Input.Pause
            Draw.Cls
            bars
             %exit when eHp <= 0
            Input.Pause
            put "Trooper is charging towards you!"
        end if
        if Rand.Int  (1,  100) <= evas  and evas > eStyle  then
            %If a random number less than your evasivness is generated and your evasivness is greater than the enemy's style you dodge the attack
            put "You expertly evaded the enemy attack!"
        else
            healthPhy
             put "Trooper bit you!"
            put "Health: ", hp
             Input.Pause
            Draw.Cls
            bars
             if hp <=  0 then
                cls
                put "You have been slain by the Trooper!"
                Input.Pause
            end if
        end if
    else
        put "Trooper is charging towards you!"
        if Rand.Int  (1,  100) <= evas  and evas > eStyle  then
            %%If a random number less than your evasivness is generated and your evasivness is greater than the enemy's style you dodge the attack
            put "You expertly evaded the enemy attack!"
        else
            healthPhy
             put "Trooper bit you!"
            put "Health: ", hp
             Input.Pause
            Draw.Cls
            bars
             if hp <=  0 then
                cls
                put "You have been slain by the Trooper!"
                Input.Pause
                Window.Close (defWinID )
            end if
            if Rand.Int  (1,  100) <= eEvas  and eEvas > style  then
                %If a random number generated is less than the enemy's evasivness and their evasivness is greater than your style, the enemy dodges your attack
                put "The enemy avoided your attack!"
            else
                eHealthMag
                 put "You blast the enemy with your magical powers!"
                put "Enemy Health: ", eHp
                 Input.Pause
                Draw.Cls
                bars
                 %exit when eHp <= 0
            end if
        end if
    end if
end magic
 proc run
     if spd  * evas >= eSpd  * eEvas  then
        put "You succefully escaped!"
        Input.Pause
        cls
    else
        put "The Trooper is too fast for you!"
    end if
end run
 proc doubleSlash
 
    atk  := atk  * 2
    attack
 
    atk  := atk /  2
end doubleSlash
 proc stunStab
 
    atk  := atk  * 1. 5
    attack
 
    atk  := atk /  1. 5
    eSpd  := -eSpd
 end stunStab
 proc spiritSwipe
 
    atk  := atk  * (matk  * 2)
    attack
 
    atk  := atk /  (matk  * 2)
end spiritSwipe
 proc heartRend
 
    atk  := atk  * 3. 5
    attack
 
    atk  := atk /  3. 5
end heartRend
 proc judgement
 
    atk  := atk  * 5. 5
    attack
 
    atk  := atk /  5. 5
end judgement
 proc fireball
 
    matk  := matk  * 1. 9
    magic
 
    matk  := matk /  1. 9
end fireball
 proc glaciate
 
    matk  := matk  * 1. 9
    magic
 
    matk  := matk /  1. 9
    eSpd  := eSpd  * 0. 8
end glaciate
 proc snappingVines
 
    matk  := matk  * 1. 9
    magic
 
    matk  := matk /  1. 9
    eSpd  := 0
    eEvas  := 0
end snappingVines
 proc earthsEmbrace
 
    matk  := matk  * 3. 5
    magic
 
    matk  := matk /  3. 5
    eSpd  := 0
    eEvas  := 0
end earthsEmbrace
 proc shatterSky
 
    matk  := matk  * 5. 5
    magic
 
    matk  := matk /  5. 5
end shatterSky
 proc healthPot
 
    hp  := hp + maxhp  * 0. 25
    if hp > maxhp  then
        hp  := maxhp
     end if
    bars
 end healthPot
 proc manaPot
 
    mp  := mp + maxmp  * 0. 25
    if mp > maxmp  then
        mp  := maxmp
     end if
    bars
 end manaPot
 proc staminaPot
 
    sp  := sp + maxsp  * 0. 25
    if sp > maxsp  then
        sp  := maxsp
     end if
    bars
 end staminaPot
 proc fightMenu
     loop
        first  := GUI.CreateMenu ("Attack")
        item  (1) := GUI.CreateMenuItem ("Basic Attack", attack )
        item  (2) := GUI.CreateMenuItem ("Double Slash", doubleSlash )
        item  (3) := GUI.CreateMenuItem ("Stun Stab", stunStab )
        item  (4) := GUI.CreateMenuItem ("Spirit Swipe", spiritSwipe )
        item  (5) := GUI.CreateMenuItem ("Heart Rend ", heartRend )
        item  (6) := GUI.CreateMenuItem ("Judgement", judgement )
        second  := GUI.CreateMenu ("Magic")
        item  (7) := GUI.CreateMenuItem ("Basic Magic", magic )
        item  (7) := GUI.CreateMenuItem ("Fire Ball", fireball )
        item  (8) := GUI.CreateMenuItem ("Glaciate", glaciate )
        item  (9) := GUI.CreateMenuItem ("Snapping Vines", snappingVines )
        item  (10) := GUI.CreateMenuItem ("Earth's Embrace", earthsEmbrace )
        item  (11) := GUI.CreateMenuItem ("Shatter the Sky", shatterSky )
        third  := GUI.CreateMenu ("Other")
        item  (12) := GUI.CreateMenuItem ("Health Potion ", healthPot )
        item  (13) := GUI.CreateMenuItem ("Mana Potion", manaPot )
        item  (14) := GUI.CreateMenuItem ("Stamina Potion", staminaPot )
        item  (15) := GUI.CreateMenuItem ("Run", run )
        if eHp <=  0 then
            GUI.Quit
        end if
        loop
            exit when GUI.ProcessEvent
        end loop
    end loop
end fightMenu
 %The user is prompted to pick their class, this determines what benefits they
%will gain
put "Pick your class"
put "Warrior, strong and sturdy."
put "Mage, inclined to magic."
put "Ranger, nimble and deadly."
get choice
 if choice  = "warrior" then                                   %Stat multipliers for each class adds an element of choice to selecting a class
    atk  := atk  * 1. 6
    prtct  := prtct  * 2
    maxhp  := maxhp  * 2
    maxsp  := maxsp  * 1
    maxmp  := maxmp  * 0. 4
    matk  := matk  * 0. 6
    mprtct  := mprtct  * 2
    spd  := spd  * 0. 4
    evas  := evas  * 0
    style  := style  * 0. 4
    chrm  := chrm  * 1
    showStats
 elsif choice  = "ranger" then
    atk  := atk  * 2. 2
    prtct  := prtct  * 0. 2
    maxhp  := maxhp  * 0. 8
    maxsp  := maxsp  * 1. 4
    maxmp  := maxmp  * 0. 2
    matk  := matk  * 0. 2
    mprtct  := mprtct  * 0. 2
    spd  := spd  * 2. 2
    evas  := evas  * 1. 6
    style  := style  * 1. 6
    chrm  := chrm  * 1
    showStats
 elsif choice  = "mage" then
    atk  := atk  * 0. 2
    prtct  := prtct  * 0. 2
    maxhp  := maxhp  * 0. 8
    maxsp  := maxsp  * 0. 2
    maxmp  := maxmp  * 1. 6
    matk  := matk  * 2. 4
    mprtct  := mprtct  * 2. 2
    spd  := spd  * 1
    evas  := evas  * 1
    style  := style  * 1
    chrm  := chrm  * 1
    showStats
 end if
Input.Pause
cls
loop
    bars
 
    fightMenu
 end loop
  | 	 
  | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		Tony
 
  
 
    
		 | 
		
		
			
				  Posted: Thu May 01, 2014 10:56 pm    Post subject: RE:My menu fails to exit  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				You just need to actually exit that loop. Previously it could be shown that you've had an infinite loop that never exited. You could do something like
 
	  | code: | 	 		  
 
        loop 
 
            exit when GUI.ProcessEvent or eHp <= 0 
 
        end loop 
 
  | 	 
  | 
			 
			
				 
Tony's programming blog. DWITE - a programming contest. | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		 | 
	 
 
	
	
	 
	
	 |