Reputation: 167
Please use the script below for reference. Well, I'm trying to get into programming, and I'm creating my batch rpg to see if I could do it... anyway, sort of hit a wall: I keep getting the "goto was unexpected at this time" error. The errors were as follows: originally, after label game (:game), the input system worked, but incorrectly (i.e. you enter input 4 and get the operation for 8, input 8 and get nothing, etc.). I changed something, but I'm not exactly sure what I changed... resulting in "error: goto was unexpected at this time" upon reaching label game. I realized that I had added parentheses in the wrong place, so I changed it again (after %location%==1) so I corrected it- now, after accepting input "items" (set /p items="> "), it presents the same error, without displaying the backstory. Interestingly enough, if I remove all of the "if" arguments after ' set /p towna="> " ', the program ends (without error, simply ends) without displaying the backstory after "items", the possible actions in the town, or allowing the user to input for variable %towna%
Heres the script:
@echo off
title=Role Playing Game
cls
echo/
echo ##### ##### ####
echo # # # # #
echo ##### ##### # ###
echo # # # # #
echo # # # ####
echo/
echo/
pause
:menu
cls
echo MENU
echo Options:
echo Start New Game-------------1
echo Continue Previous Game-----2
echo About----------------------3
echo Quit-----------------------4
set /p a="> "
if %a%==1 goto new
if %a%==2 goto continue
if %a%==3 goto about
if %a%==4 exit
:new
cls
echo What is your name?
set /p name="> "
echo/
echo What is your race?
echo Human-----1
echo Dwarf-----2
echo Elf-------3
set /p race="> "
if %race%==1 (
set /a location=1
set /a agility=3
set /a strength=3
set /a magic=2
set /a stamina=0
)
if %race%==2 (
set /a location=2
set /a agility=0
set /a strength=6
set /a stamina=0
set /a magic=0
)
if %race%==3 (
set /a location=3
set /a strength=0
set /a agility=6
set /a magic=0
set /a stamina=0
)
echo/
echo What is your class?
echo Warrior------1
echo Assassin-----2
echo Wizard-------3
set /p class="> "
if %class%==1 (
set /a strength=%strength%+10
set /a stamina=10
set /a agility=%agility%+7
set /a magic=%magic%+0
)
if %class%==2 (
set /a strength=%strength%+7
set /a stamina=7
set /a agility=%agility%+10
set /a magic=%magic%+0
)
if %class%==3 (
set /a strength=%strength%+4
set /a stamina=5
set /a agility=%agility%+5
set /a magic=%magic%+10
)
echo/
echo What are your assets?
echo Monetary Wealth----------1
echo Arms and Armor-----------2
echo Potions and Trinkets-----3
set /p items="> "
set /a gold=100
set /a sword=1
set /a armor=1
set /a healthp=1
set /a focusp=0
set /a ragep=0
set /a trinket=0
if %items%==1 (
set /a gold=300
)
if %items%==2 (
set /a sword=3
set /a armor=3
)
if %items%==3 (
set /a healthp=5
set /a focusp=5
set /a ragep=5
set /a trinket=1
)
echo/
pause
cls
if %race%==1 (
if %class%==1 (
if %items%==1 (
echo For all of your life, you have been raised among humans on the WesterHam
echo plains. An aristocrat by birth, you longed for the thrill of combat and
echo apprenticed your-self to the service of an officer in the military, where you
echo became an excellent warrior. Now of age, you have decided to take your
echo inheritance and explore the world. Good luck, %name%.
)
if %items%==2 (
echo You come from a long line of noble warriors, descending of a race of pure
echo humans out of the WesterHam plains. While you were not always able to put
echo bread on the table, your family has an abundance of arms and armor. Now fully
echo grown, you set out, well equiped with family heirlooms in order to make a
echo better life for yourself. Good luck, %name%.
)
if %items%==3 (
echo Your family of humans comes out of the WesterHam plains, and has never
echo ventured out of this area. As a child, you were fascinated with the art of
echo magic, but were never able to grasp spellcasting and the like, and instead
echo took training as a warrior. But the fascination never died, and every bit of
echo money you earned as a child was spent buying potions and enchanted items. Now
echo grown, you have saved a small sum of money, in addition to several potions
echo you collected as a child. You set out to explore the world in search of a
echo magic art simple enough for you to grasp. Good luck, %name%.
)
)
if %class%==2 (
if %items%==1 (
echo In your early childhood, you were raised with the honor of your wealthy
echo human family of WesterHam. As you met adolescence, you rebeled and cast your
echo lot with the assassins, allowing them to teach you their ways. Now of legal
echo age, you demand your inheritance so that you may set off and prove your loyalty
echo to the assassins guild. Good luck, %name%.
)
if %items%==2 (
echo As a child, you grew up in the human-populated plains of WesterHam. You were
echo orphaned at a young age, but the assassins guild took you in and taught you
echo their ways. From them, you have recieved a set of arms with which to do the
echo work of an assassin. Now completely trained, you begin to search the world,
echo offering your services to those that pay. Good luck, %name%.
)
if %items%==3 (
echo As a child, your upbringing was among humans in the plains of WesterHam. You
echo had a natural skill in alchemy, and began to produce potions of sorts, which
echo you would sell on the black market in hopes of bringing some income for your
echo poor family. In this style of trade, you were introduced to assassins from
echo time to time. In order to help sustain your family, you joined the assassins
echo guild in hopes of increasing income. Now armed with a collection of potions,
echo you set off to make a new life. Good luck, %name%.
)
)
if %class%==3 (
if %items%==1 (
echo As a child, you were brought up as a wealthy human inhabitant of the WesterHam
echo plains. You proved to be very intelligent as a child, so your parents sent you
echo off to school to learn the magic arts. You learned quickly, and advanced much
echo faster than any of the other students. You are now of age, and have taken your
echo inheritance to set off and see how you may use your skills. Good luck,
echo %name%.
)
if %items%==2 (
echo Ever since you were young, you displayed a strong curiosity and sense of
echo intelligence. However, you came from a family of warriors, proud humans of the
echo WesterHam plains. Weapons you had, but the money to learn magic you had not.
echo instead, you were "self taught" in the arts of magic, aquiring what you know
echo by close, constant observation of those that had mastered the art. Now of age,
echo you have inherited your set of arms, and been sent off to make your own way in
echo the world. Good luck, %name%.
)
if %items%==3 (
echo Since your days of young, you have been entirely enthrolled with wizardry.
echo Having been raised as an honorable human wizard on the plains of WesterHam, you
echo learned to produce potions that would complement your magical talents. Now that
echo you are of age, you set off into the world, determined to rely on use of your
echo magic talents and the aid of potions. Good luck, %name%.
)
)
)
if %race%==2 (
if %class%==1 (
if %items%==1 (
echo For all of your life, you have been raised among dwarves in the Morrowvale
echo mines. Wealthy by birth, you longed for the honors of battle and enlisted in
echo defensive forces of Morrowvale, where you soon proved your talents. Now of age,
echo you have taken your inheritance to explore the world beyond Marrowvale. Good
echo luck, %name%.
)
if %items%==2 (
echo You come from a long line of noble warriors, descending of a race of dwarvish
echo folk out of the Morrowvale mines. While you were not always able to put bread
echo on the table, your family has an abundance of arms and armor. Now fully grown,
echo you set out, well equiped with family heirlooms in order to make a better life
echo for yourself. Good luck, %name%.
)
if %items%==3 (
echo Your family of dwarves comes out of the Morrowvale mines, and has never
echo ventured out of this area. As a child, you were fascinated with the art of
echo magic, but were never able to grasp spellcasting and the like, and instead
echo took training as a warrior. But the fascination never died, and every bit of
echo money you earned as a child was spent buying potions and enchanted items. Now
echo grown, you have saved a small sum of money, in addition to several potions
echo you collected as a child. You set out to explore the world in search of a
echo magic art simple enough for you to grasp. Good luck, %name%.
)
)
if %class%==2 (
if %items%==1 (
echo In your early childhood, you were raised with the honor of your wealthy
echo family of dwarves in Morrowvale. As you met adolescence, youre good natured
echo sense of adventure led you mistakenly to the assassins guild, where you learned
echo their ways. Now of age, you recieve your inheritance so that you may set off to
echo explore the world. Good luck, %name%.
)
if %items%==2 (
echo As a child, you grew up in the dwarf-populated mines of Morrowvale. You were
echo orphaned at a young age, but the assassins guild took you in and taught you
echo their ways. From them, you have recieved a set of arms with which to do the
echo work of your training. Now completely trained, you begin to search the world,
echo offering your services in the name of justice. Good luck, %name%.
)
if %items%==3 (
echo As a child, your upbringing was among dwarves in the mines of Morrowvale. You
echo "tinkered" some in alchemy, and began to produce potions of sorts, which you
echo would sell on the black market in hopes of bringing some income for your poor
echo family. In this style of trade, you were introduced to assassins from time to
echo time. In curiosity you joined the assassins guild. Now armed with a collection
echo of potions, you set off to explore the world. Good luck, %name%.
)
)
if %class%==3 (
if %items%==1 (
echo As a child, you were brought up as a well off dwarf of the Morrowvale mines.
echo You proved to be very intelligent as a child, so your parents sent you off to
echo school to learn the magic arts. You learned quickly, and advanced much faster
echo faster than any of the other dwarves. You are now of age, and have taken your
echo inheritance to set off and see how you may use your skills. Good luck,
echo %name%.
)
if %items%==2 (
echo Ever since you were young, you displayed a strong curiosity and sense of
echo intelligence. However, you came from a family of warriors, proud dwarves of
echo the Morrowvale mines. Arms you had, but the money to learn magic you had not.
echo instead, you were "self taught" in the arts of magic, aquiring what you know
echo by close, constant observation of elders who had mastered the art. Now of age,
echo you have inherited your set of arms, and been sent off to make your own way in
echo the world. Good luck, %name%.
)
if %items%==3 (
echo Since your days of young, you have been consumed with wizardry. Having been
echo raised as a witty dwarfish wizard on the mines of Morrowvale, you learned to
echo produce potions that would complement your magical talents. Now that you are of
echo age, you set off into the world, determined to rely on use of your magic talent
echo and the aid of potions. Good luck, %name%.
)
)
)
if %race%==3 (
if %class%==1 (
if %items%==1 (
echo For all of your life, you have been raised among elves in the Dalewood forests.
echo An aristocrat by birth, you wished to serve your people in the armed forces,
echo and quickly proved yourself among peers and superiors. Now of age, you have
echo a generous inheritance and skills in combat. You set off in conquest for the
echo elvish people. Good luck, %name%.
)
if %items%==2 (
echo You come from a long line of noble warriors, descending of a race of pure
echo elves out of the Dalewood forests. While you were not always able to put bread
echo on the table, your family has an abundance of arms and armor. Now fully grown,
echo you set out, well equiped with family heirlooms in order to make a better life
echo for yourself. Good luck, %name%.
)
if %items%==3 (
echo Your family of elves comes out of the Dalewood forests, and has never ventured
echo out of this area. As a child, you were fascinated with the art of magic, but
echo were never able to grasp spellcasting and the like, and instead took training
echo as a warrior. But the fascination never died, and every bit of coin you earned
echo as a child was spent buying potions and enchanted items. Now grown, you have
echo saved a small sum of money, in addition to several potions you collected as a
echo child. You set out to explore the world in search of a magic art simple enough
echo for you to grasp. Good luck, %name%.
)
)
if %class%==2 (
if %items%==1 (
echo In your early childhood, you were raised with the honor of your wealthy elvish
echo family of Dalewood. As you met adolescence, you chose the honorable path of a
echo royal assassin, being taught the ways of a fearless shadow on the battlefield.
echo As you are now of age, you aquire your inheritance so that you may set off and
echo prove your loyalty to elf-kind. Good luck, %name%.
)
if %items%==2 (
echo As a child, you grew up in the elf-populated forests of Dalewood. You were
echo chose your destiny at a young age, to be an elite assassin for the elvish army.
echo From them, you have recieved a set of arms with which to do the work of an
echo assassin. Now completely trained, you begin to search the world, using your
echo assets in the name of elf-kind. Good luck, %name%.
)
if %items%==3 (
echo As a child, your upbringing was among elves in the forests of Dalewood. You
echo had a natural skill in alchemy, producing fine elvish potions, which you would
echo sell for the commision of the elite elvish assassins. This introduction to the
echo assassins life intrigued you, and soon you began your training as an assassin.
echo Now having completed your training, you head off armed with a collection of
echo potions, to make a new life. Good luck, %name%.
)
)
if %class%==3 (
if %items%==1 (
echo As a child, you were brought up as a wealthy elvish inhabitant of the Dalewood
echo forests. You proved to be very intelligent as a child, so your parents sent you
echo off to the academy to learn the magic arts. You learned quickly, and advanced
echo faster than any of the other students. You are now of age, and have taken your
echo inheritance to set off and see how you may use your skills. Good luck,
echo %name%.
)
if %items%==2 (
echo Ever since you were young, you displayed a strong curiosity and sense of
echo intelligence. However, you came from a family of warriors, proud elves of the
echo Dalewood forests. Weapons you had, but the money to learn magic you had not.
echo instead, you were "self taught" in the arts of magic, aquiring what you know
echo by close, constant observation of those that had mastered the art. Now of age,
echo you have inherited your set of arms, and been sent off to make your own way in
echo the world. Good luck, %name%.
)
if %items%==3 (
echo Since your days of young, you have been entirely enthrolled with wizardry.
echo Having been raised as an honorable elvish wizard in the forests of Dalewood,
echo you learned to produce potions that would complement your magical talents. Now
echo that you are of age, you set off into the world, determined to rely on use of
echo your magic talents and the aid of potions. Good luck, %name%.
)
)
)
echo/
:game
cls
if %location%==1 (
echo Plains of WesterHam
echo/
echo You walk down the fading dirt road into the prarie town of WesterHam. The wind
echo blows the long, thin grass about in a ripple-type of pattern. As you enter the
echo town, you look about and note the busy market, characteristic of towns
echo inhabited by humans. You see a quaint looking inn directly to your left, and a
echo ways down the road you spot a bakery. On the right side or the street is a
echo blacksmith shop, as well as an apothecaries shop that advertises instruction in
echo magic as well. At the very end of the lane, you percieve a church of moderate
echo size.
echo/
echo/
echo What do you want to do?
echo Enter the inn---------------------1
echo Enter the bakery------------------2
echo Enter the blacksmith shop---------3
echo Enter the apothecaries------------4
echo Enter the church------------------5
echo Enter the market-place------------6
echo Loot some homes-------------------7
echo Turn around; travel elsewhere-----8
set /p towna="> "
if %towna%==1 goto inn
if %towna%==2 (
cls
echo Seems to be closed today. Maybe the owner is at the market-place.
pause
goto town1i
)
if %towna%==3 goto smith
if %towna%==4 goto apoth
if %towna%==5 goto church
if %towna%==6 (
cls
echo You don't have time for such things. Maybe in the Beta version you will.
pause
goto town1i
)
if %towna%==7 (
cls
echo No, youre too good for that. Maybe in the Beta version you won't be.
goto town1i
)
if %towna%==8 goto travel
)
if %location%==2 (
echo Mines of Morrowvale
)
if %location%==3 (
echo Forests of Dalewood
)
As far as I've seen, my code should work, and I have no idea what is causing the error message. As a side note, what might cause the error message "goto is unexpected"? is there an undefined target? Could this be fixed by adding target labels (unlikely because that would show the message saying label was undefined). How could this be avoided in the future?
Upvotes: 1
Views: 1322
Reputation: 79983
Major problem is that you haven't told us what you entered to the prompts, so tracing what should happen with unknown input would meand you'd have to supply new batteries for our crystal balls.
In general, where you are dealing with an input, you should be mindful of two characteristics. First, simply pressing Enter will leave the target variable unchanged. You can exploit this by using
set var=defaultvalue
set /p var="> "
which will sleave var
set to defaultvalue on Enter alone
OR
set "var="
set /p var="> "
if not defined var echo no input?
if you don't want a default.
Second issue is that batch replaces %var%
with that variable's current value before execution. Hence if %var%==something whatever
will become if ==something whatever
if var
is not set (or is "set" to anempty string) Further, an attempt would be made to execute if something with spaces==something whatever
if var
is set to "something with spaces". CMD
for historical reasons expectes the syntax IF string operator string dosomething withparameters
and hence you'd need to use if "%var%"=="string"...
in general to analyse user-input.
The syntax !var!
needs to be used within a "block statement" (ie. a parenthesised statement-sequence) IF the value of var
changes within the block and you want to access the NEW value. %var%
will give you the **OLD**
value (that is, the original value the variable had at the time the statement invoking the block was first encountered, before execution started.) To use !var!
, you need to be in delayedexpansion mode, that is, you need to have executed a setlocal enabledelayedexpansion
statement.
Also, a small unchanged segment segment
set /p towna="> "
if %towna%==1 goto inn
if %towna%==2 (
cls
echo Seems to be closed today. Maybe the owner is at the market-place.
pause
goto town1i
)
if %towna%==3 goto smith
if %towna%==4 goto apoth
if %towna%==5 goto church
if %towna%==6 (
cls
echo You don't have time for such things. Maybe in the Beta version you will.
pause
goto town1i
)
if %towna%==7 (
cls
echo No, youre too good for that. Maybe in the Beta version you won't be.
goto town1i
)
if %towna%==8 goto travel
) <<<<<<<<THIS STRAY ) can cause havoc!
Addendum to demonstrate difference between %var%
and !var!
within and outside of a block and with/without enabledelayedexpansion
@ECHO OFF
SETLOCAL
set var=before
if "%var%"=="before" (
set var=after
echo in-block results: %var% and !var!
)
echo after block results: %var% and !var!
ENDLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO DELAYEDEXPANSION invoked
set var=before
if "%var%"=="before" (
set var=after
echo in-block results: %var% and !var!
)
echo after block results: %var% and !var!
ENDLOCAL
GOTO :EOF
Upvotes: 1
Reputation: 2833
Your problem is that batch is expanding too early.
When your program reaches the line if %location%==1
, the entire following if
block is being expanded, including the nested if towna==*
lines.
To fix, you must do the following:
You have to call SETLOCAL ENABLEDELAYEDEXPANSION
at the start of
your code. This command enables delayed expansion of dynamic
variables.
You then must use if !towna!==*
instead of if %towna%==*
. This
kind of variable isn't expanded as soon as it's block is reached.
Instead, provided SETLOCAL ENABLEDELAYEDEXPANSION
has been called,
it will be expanded when it is physically reached by the
interpreter.
Be mindful, that these steps must be fulfilled whenever you are setting and calling a variable inside any statement block.
Upvotes: 1