QB64.org Forum

Active Forums => Programs => Topic started by: Juan Tamarit on September 24, 2020, 01:12:13 am

Title: Fantasy
Post by: Juan Tamarit on September 24, 2020, 01:12:13 am
I'm working on an RPG and i'm having a problem that i cant explain. I have an array with little hearts images for drawing life of the character and i did the following serires of IF...THEN & SELECT CASE...END SELECT statements:
Code: QB64: [Select]
  1.     lifeAsPercent% = CINT((Hero.life * 100) / Hero.maxLife) ' calculate percentage
  2.  
  3.     IF lifeAsPercent% > 99 THEN
  4.         _PUTIMAGE (32, 3), LifeImg&(0)
  5.         _PUTIMAGE (40, 3), LifeImg&(0)
  6.         _PUTIMAGE (48, 3), LifeImg&(0)
  7.         _PUTIMAGE (56, 3), LifeImg&(0)
  8.     ELSE
  9.         IF lifeAsPercent% > 74 THEN
  10.             _PUTIMAGE (32, 3), LifeImg&(0)
  11.             _PUTIMAGE (40, 3), LifeImg&(0)
  12.             _PUTIMAGE (48, 3), LifeImg&(0)
  13.             SELECT CASE lifeAsPercent%
  14.                 CASE 99 TO 95: _PUTIMAGE (56, 3), LifeImg&(1)
  15.                 CASE 94 TO 90: _PUTIMAGE (56, 3), LifeImg&(2)
  16.                 CASE 89 TO 85: _PUTIMAGE (56, 3), LifeImg&(3)
  17.                 CASE 84 TO 80: _PUTIMAGE (56, 3), LifeImg&(4)
  18.                 CASE 79 TO 75: _PUTIMAGE (56, 3), LifeImg&(5)
  19.             END SELECT
  20.         ELSE
  21.             IF lifeAsPercent% > 49 THEN
  22.                 _PUTIMAGE (32, 3), LifeImg&(0)
  23.                 _PUTIMAGE (40, 3), LifeImg&(0)
  24.                 _PUTIMAGE (56, 3), LifeImg&(5)
  25.                 SELECT CASE lifeAsPercent%
  26.                     CASE 74 TO 70: _PUTIMAGE (48, 3), LifeImg&(1)
  27.                     CASE 69 TO 65: _PUTIMAGE (48, 3), LifeImg&(2)
  28.                     CASE 64 TO 60: _PUTIMAGE (48, 3), LifeImg&(3)
  29.                     CASE 59 TO 55: _PUTIMAGE (48, 3), LifeImg&(4)
  30.                     CASE 54 TO 50: _PUTIMAGE (48, 3), LifeImg&(5)
  31.                 END SELECT
  32.             ELSE
  33.                 IF lifeAsPercent% > 24 THEN
  34.                     _PUTIMAGE (32, 3), LifeImg&(0)
  35.                     _PUTIMAGE (48, 3), LifeImg&(5)
  36.                     _PUTIMAGE (56, 3), LifeImg&(5)
  37.                     SELECT CASE lifeAsPercent%
  38.                         CASE 49 TO 45: _PUTIMAGE (40, 3), LifeImg&(1)
  39.                         CASE 44 TO 40: _PUTIMAGE (40, 3), LifeImg&(2)
  40.                         CASE 39 TO 35: _PUTIMAGE (40, 3), LifeImg&(3)
  41.                         CASE 34 TO 30: _PUTIMAGE (40, 3), LifeImg&(4)
  42.                         CASE 29 TO 25: _PUTIMAGE (40, 3), LifeImg&(5)
  43.                     END SELECT
  44.                 ELSE
  45.                     _PUTIMAGE (40, 3), LifeImg&(5)
  46.                     _PUTIMAGE (48, 3), LifeImg&(5)
  47.                     _PUTIMAGE (56, 3), LifeImg&(5)
  48.                     SELECT CASE lifeAsPercent%
  49.                         CASE 24 TO 20: _PUTIMAGE (32, 3), LifeImg&(1)
  50.                         CASE 19 TO 15: _PUTIMAGE (32, 3), LifeImg&(2)
  51.                         CASE 14 TO 10: _PUTIMAGE (32, 3), LifeImg&(3)
  52.                         CASE 9 TO 5: _PUTIMAGE (32, 3), LifeImg&(4)
  53.                         CASE 4 TO 0: _PUTIMAGE (32, 3), LifeImg&(5)
  54.                     END SELECT
  55.                 END IF ' > 24
  56.             END IF ' > 49
  57.         END IF ' > 74
  58.     END IF ' > 99

now, by some reason i can't figure it never enters the SELECT CASE...END SELECT statements. The if are working properly, but when it's suposed to get inside the corresponding SELECT CASE...END SELECT it dosn't. Is this construction i made wrong? And if it is wheres the mistake? I chequed the wiki and seems to be that what im doing is logical and ok... Any ideas on this?
Title: Re: Fantasy
Post by: bplus on September 24, 2020, 01:21:30 am
Try putting all IF's on same level:

Code: QB64: [Select]
  1. lifeAsPercent% = CINT((Hero.life * 100) / Hero.maxLife) ' calculate percentage
  2.  
  3. IF lifeAsPercent% > 99 THEN
  4.     _PUTIMAGE (32, 3), LifeImg&(0)
  5.     _PUTIMAGE (40, 3), LifeImg&(0)
  6.     _PUTIMAGE (48, 3), LifeImg&(0)
  7.     _PUTIMAGE (56, 3), LifeImg&(0)
  8.  
  9. ELSEIF lifeAsPercent% > 74 THEN
  10.     _PUTIMAGE (32, 3), LifeImg&(0)
  11.     _PUTIMAGE (40, 3), LifeImg&(0)
  12.     _PUTIMAGE (48, 3), LifeImg&(0)
  13.     SELECT CASE lifeAsPercent%
  14.         CASE 99 TO 95: _PUTIMAGE (56, 3), LifeImg&(1)
  15.         CASE 94 TO 90: _PUTIMAGE (56, 3), LifeImg&(2)
  16.         CASE 89 TO 85: _PUTIMAGE (56, 3), LifeImg&(3)
  17.         CASE 84 TO 80: _PUTIMAGE (56, 3), LifeImg&(4)
  18.         CASE 79 TO 75: _PUTIMAGE (56, 3), LifeImg&(5)
  19.     END SELECT
  20.  
  21. ELSEIF lifeAsPercent% > 49 THEN
  22.     _PUTIMAGE (32, 3), LifeImg&(0)
  23.     _PUTIMAGE (40, 3), LifeImg&(0)
  24.     _PUTIMAGE (56, 3), LifeImg&(5)
  25.     SELECT CASE lifeAsPercent%
  26.         CASE 74 TO 70: _PUTIMAGE (48, 3), LifeImg&(1)
  27.         CASE 69 TO 65: _PUTIMAGE (48, 3), LifeImg&(2)
  28.         CASE 64 TO 60: _PUTIMAGE (48, 3), LifeImg&(3)
  29.         CASE 59 TO 55: _PUTIMAGE (48, 3), LifeImg&(4)
  30.         CASE 54 TO 50: _PUTIMAGE (48, 3), LifeImg&(5)
  31.     END SELECT
  32.  
  33. ELSEIF lifeAsPercent% > 24 THEN
  34.     _PUTIMAGE (32, 3), LifeImg&(0)
  35.     _PUTIMAGE (48, 3), LifeImg&(5)
  36.     _PUTIMAGE (56, 3), LifeImg&(5)
  37.     SELECT CASE lifeAsPercent%
  38.         CASE 49 TO 45: _PUTIMAGE (40, 3), LifeImg&(1)
  39.         CASE 44 TO 40: _PUTIMAGE (40, 3), LifeImg&(2)
  40.         CASE 39 TO 35: _PUTIMAGE (40, 3), LifeImg&(3)
  41.         CASE 34 TO 30: _PUTIMAGE (40, 3), LifeImg&(4)
  42.         CASE 29 TO 25: _PUTIMAGE (40, 3), LifeImg&(5)
  43.     END SELECT
  44.  
  45.     _PUTIMAGE (40, 3), LifeImg&(5)
  46.     _PUTIMAGE (48, 3), LifeImg&(5)
  47.     _PUTIMAGE (56, 3), LifeImg&(5)
  48.     SELECT CASE lifeAsPercent%
  49.         CASE 24 TO 20: _PUTIMAGE (32, 3), LifeImg&(1)
  50.         CASE 19 TO 15: _PUTIMAGE (32, 3), LifeImg&(2)
  51.         CASE 14 TO 10: _PUTIMAGE (32, 3), LifeImg&(3)
  52.         CASE 9 TO 5: _PUTIMAGE (32, 3), LifeImg&(4)
  53.         CASE 4 TO 0: _PUTIMAGE (32, 3), LifeImg&(5)
  54.     END SELECT
  55.  


Title: Re: Fantasy
Post by: Juan Tamarit on September 24, 2020, 08:11:26 am
Dear bro B+! Sup? I tried and didn't work. =( But thanks anyway for the suggestion =)

I don't understand what is wrong with the original code i presented, seems so logical to me... The ELSEIF has the same output on the screen.

By the way, and since we are talking about IF's : what's the advantage on the ELSEIF's over the more conventional aproach of ELSE's? (besides cleaner code, now that i see it it a lot less indentend)

This looks annoying! Any more suggestions?
Title: Re: Fantasy
Post by: bplus on September 24, 2020, 11:03:08 am
Fresh in the morning now I see the problem clear as a bell!

BTW the advantage = cleaner code is exactly right!

So crispy clean it's obvious what the problem is!

EDIT: remove redundant code block

OK at first I thought missing or overlapping blocks, nope not that.

Now ALL these might be wrong:
Code: QB64: [Select]
  1. CASE 94 TO 90

I've never see CASE X TO Y and I certainly am surprised that Y is less than X

Try an experiment:
Code: QB64: [Select]
  1. FOR x = 1 TO 10
  2.     SELECT CASE x
  3.         CASE 10 TO 5: PRINT "I am a high level x"
  4.         CASE 5 TO 0: PRINT "I am a low level x"
  5.         CASE ELSE: PRINT "You should not see me in this code!"
  6.     END SELECT
  7.  

Yep! disaster! Here is the fix
Code: QB64: [Select]
  1. FOR x = 1 TO 10
  2.     SELECT CASE x
  3.         CASE 6, 7, 8, 9, 10: PRINT "I am a high level x"
  4.         CASE 1, 2, 3, 4, 5: PRINT "I am a low level x"
  5.         CASE ELSE: PRINT "You should not see me in this code!"
  6.     END SELECT
  7.  

Here is a better fix:
Code: QB64: [Select]
  1. FOR x = 1 TO 10
  2.     SELECT CASE x
  3.         CASE IS > 5: PRINT "I am a high level x"
  4.         CASE IS > 0: PRINT "I am a low level x"
  5.         CASE ELSE: PRINT "You should not see me in this code!"
  6.     END SELECT
  7.  
  8.  
Title: Re: Fantasy
Post by: bplus on September 24, 2020, 11:44:00 am
Ha! even this works! Just put the lower number first.
Code: QB64: [Select]
  1. FOR x = 1 TO 10
  2.     SELECT CASE x
  3.         CASE 5 TO 10: PRINT "I am a high level x"
  4.         CASE 0 TO 5: PRINT "I am a low level x"
  5.         CASE ELSE: PRINT "You should not see me in this code!"
  6.     END SELECT
  7.  
Title: Re: Fantasy
Post by: Juan Tamarit on September 24, 2020, 11:32:36 pm
broooooo, what can i say? how you do it?

i would never tought that the order matters on this! Thanks for the lesson! It will be well used. How did you came to this?

Title: Re: Fantasy
Post by: bplus on September 25, 2020, 09:13:02 am
Quote
How did you came to this?

:) well you saw my experiment. I knew SELECT CASE works when you tell it to do something nicely.

Different Basics have slight differences in syntax, so I just played with simple example until it worked, didn't take long. Another good resource is Wiki or Help files or this forum :)
Title: Re: Fantasy
Post by: SpriggsySpriggs on September 25, 2020, 11:23:00 am
I figured it was the CASEs having the values in the wrong spot but I didn't want to say it without knowing for sure. Glad you two figured it out!
Title: Re: Fantasy
Post by: bplus on September 25, 2020, 11:43:31 am
Yes and I am glad to learn SELECT CASE recognizes the TO keyword with a demo how to use it.
Title: Re: Fantasy
Post by: Cobalt on September 25, 2020, 12:05:04 pm
Yes and I am glad to learn SELECT CASE recognizes the TO keyword with a demo how to use it.

Wow I would have thought this was common knowledge, my bad.

Guess when you use certain things enough it starts to feel like second nature and you don't think twice about it.
When I originally saw you had posted to this I thought you would have had the issue nailed in the first few lines of your post(you normally do) so I didn't bother.
Title: Re: Fantasy
Post by: bplus on September 25, 2020, 01:12:25 pm
Wow I would have thought this was common knowledge, my bad.

Guess when you use certain things enough it starts to feel like second nature and you don't think twice about it.
When I originally saw you had posted to this I thought you would have had the issue nailed in the first few lines of your post(you normally do) so I didn't bother.

I am favorable to IF ELSEIF ELSE ENDIF because I don't have to remember which Basic set of rules I have to follow for SELECT CASE when dealing with ranges. QB64 just translates to IF ELSEIF ELSE ENDIF anyway. But it does look neater doing CASE with colon, less lines.
Title: Re: Fantasy
Post by: Juan Tamarit on June 13, 2021, 07:51:48 pm
Hello there!

I lost contact with this project for a long time, and i have come back to it. The idea is to get an turn based RPG, very simple one, Diablo style but for turns: the player has his turn first, he performs an action and then one by one the enemies in the actual map perform in response.

I did some very good advances in the inventory system, but i still think that im too newbie and start to feel like im making spaghetti here. Also im quite lost about how to make a turn based system inside a loop. I know that the loop is limited to 60Hz, so i could do some math and follow a variable, but im not sure exactly how that could come in handy for the needs im thinking. I would appreciate all class of comments and critics, i really need them in this moment.

I also want to excuse myself for my english too, not really english-speaker, but i try to do my best. If theres any english related corrections on the code i would appreciate the mention.

As the full thing is in procces it's more than messy.


Code: QB64: [Select]
  1. '----------------------------------------------------------------------------------------------------------Û    SETUP    Ã›--------------------------------------------------------------------------------------------------------------
  2. SCREEN _NEWIMAGE(640, 480, 32) ' enter in graphics mode 640x480 32 bith color depth
  3. _FULLSCREEN ' fullscreen mode, make it shine
  4. _MOUSEHIDE ' dont show OS cursor, we will use our own
  5. 'x = 20 cells
  6. 'y = 15 cells(14 in fact for gameplay, the upper one holds the HUD)
  7.  
  8. '----------------------------------------------------------------------------------------------------------Û VARAIABLES Û--------------------------------------------------------------------------------------------------------------
  9. 'Û PROGRAM GLOBALS Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  10. CONST FALSE = 0: CONST TRUE = NOT FALSE ' ying-yang
  11.  
  12. DIM SHARED actualMenuWorking%
  13. DIM SHARED actualMapWorking%
  14. DIM SHARED gameTurn%
  15. DIM SHARED clockForFantasy%
  16.  
  17.  
  18. 'Û COLORS Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  19. CONST GREEN1 = _RGB32(215, 232, 148) ' lighter ¿
  20. CONST GREEN2 = _RGB32(174, 196, 64) '          Â³ colors
  21. CONST GREEN3 = _RGB32(82, 127, 57) '           ³
  22. CONST GREEN4 = _RGB32(32, 70, 49) ' darker     Ù
  23. CONST GRAY = _RGB32(127, 127, 127) ' gray
  24.  
  25. 'Û IMAGES Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  26. DIM SHARED LightImg&(7): DIM SHARED WorldImg&(23): DIM SHARED PotionImg&(7): DIM SHARED SwordImg&(7): DIM SHARED AxeImg&(7): DIM SHARED ArmorImg&(7): DIM SHARED HelmImg&(7): DIM SHARED ShieldImg&(7): DIM SHARED WandImg&(7)
  27. DIM SHARED HeroImg&(7): DIM SHARED EnemyImg&(31): DIM SHARED LvlImg&(10): DIM SHARED ThrowImg&(2): DIM SHARED BombImg&(2): DIM SHARED ArrowImg&(2): DIM SHARED FingerImg&(5): DIM SHARED KeysImg&(5): DIM SHARED UtileryImg&(5)
  28. DIM SHARED SpellImg&(5): DIM SHARED LifeImg&(5): DIM SHARED BonusImg&(12): DIM SHARED DirArrowImg&(12): DIM SHARED ManaImg&(6): DIM SHARED BowImg&(4): DIM SHARED PaperImg&(3): DIM SHARED BookImg&(3): DIM SHARED MoneyImg&(3)
  29. DIM SHARED JewelImg&(3): DIM SHARED ChestImg&(1): DIM SHARED SpearImg&(1): DIM SHARED WonderImg&(1): DIM SHARED BannerImg&(1): DIM SHARED BlankImg&
  30.  
  31. 'Û MECHS Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  32. TYPE MECHANICAL
  33.     x AS INTEGER ' mouse x position
  34.     y AS INTEGER ' mouse y position
  35.     kind AS _BYTE
  36.     map AS _BYTE
  37.     state AS _BYTE
  38.  
  39. REDIM SHARED Mechs(0) AS MECHANICAL
  40.  
  41. 'Û POINTER/MOUSE Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  42. TYPE POINTER '
  43.     x AS INTEGER ' mouse x position
  44.     y AS INTEGER ' mouse y position
  45.     image AS LONG ' mouse aspect
  46.     clickL AS INTEGER ' left click
  47.     clickR AS INTEGER ' right click
  48.     tmpClickL AS INTEGER '¿
  49.     tmpClickR AS INTEGER '³ debouncing
  50.     oldClickL AS INTEGER '³ stuff
  51.     oldClickR AS INTEGER 'Ù
  52.  
  53. DIM SHARED Finger AS POINTER ' create the mouse
  54.  
  55. 'Û HERO Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  56. TYPE USER '
  57.     x AS INTEGER ' x position
  58.     y AS INTEGER ' y position
  59.     id AS STRING ' player name
  60.     class AS STRING ' Barbarian, Clerig, Assasin or Wizard
  61.     lvl AS _BYTE ' current character level
  62.     strength AS _BYTE '¿
  63.     agility AS _BYTE ' ³ basic
  64.     power AS _BYTE '   ³ skills
  65.     vigor AS _BYTE '   Ù
  66.     life AS INTEGER ' actual life ammount
  67.     mana AS INTEGER ' actual life ammount
  68.     xp AS INTEGER ' actual experience level
  69.     nextXp AS INTEGER ' the next target for lvlUp
  70.     prevNextXp AS INTEGER '
  71.     image AS LONG ' aspect of the hero
  72.     attributePoints AS INTEGER
  73. '
  74. DIM SHARED Hero AS USER ' create the hero
  75.  
  76. 'Û ITEMS Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  77. TYPE OBJECT
  78.     x AS INTEGER
  79.     y AS INTEGER
  80.     kind AS _BYTE
  81.     lvl AS _BYTE ' level of the object
  82.     ammount AS INTEGER ' can be simply 1 or more
  83.     special AS STRING '<--------------------------¿
  84.     map AS _BYTE 'MAP number OR -1 for POCKET     ³
  85. END TYPE '                                        Â³
  86. ' ITEMS SPECIAL VARIABLE:-------------------------¾
  87. 's=adds strength; a=adds agility; p=adds power; v=adds vigor;¿ CAN BE
  88. 'd=adds defense; b=adds to base damage;m=adds to max damage; ³ FROM 1              eg:a1,v3,d2,etc...
  89. 'c=adds to chance TO HIT% ;                                  Â¾ TO 3
  90. 't= teaches some spell(from 0 to 5);
  91. 'u=unidentified (has no number)
  92.  
  93. DIM SHARED Pocket(22) AS OBJECT
  94. DIM SHARED inHand AS OBJECT
  95. REDIM SHARED Items(0) AS OBJECT
  96.  
  97. 'Û WORLD Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  98. DIM SHARED WorldTiles%%(19, 13)
  99. DIM SHARED lastMapWorking%
  100.  
  101. 'Û ENEMIES Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  102. TYPE PROGRAMMER '
  103.     x AS INTEGER ' x position
  104.     y AS INTEGER ' y position
  105.     map AS _BYTE ' in wich map enemy is
  106.     lvl AS _BYTE ' enemies level goes from 0 to 31, same as the image array
  107.     life AS INTEGER 'enemy remaining life
  108.  
  109. REDIM SHARED Enemy(2) AS PROGRAMMER ' create enemies
  110.  
  111. 'Û SPELLS Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  112. DIM SHARED SpellsIknow%%(5) ' array contains the level that the player knows from each one of the spells 0 to 5. Never will be greater than 10
  113.  
  114. '----------------------------------------------------------------------------------------------------------Û PRE-PROGRAM Û--------------------------------------------------------------------------------------------------------------
  115. IF _DIREXISTS(".\data") THEN '     ¿
  116.     CHDIR ".\data" '               ³ Change
  117. ELSE '                             ³ Directory
  118.     PRINT "Data folder not found" '³ + Check
  119.     SYSTEM '                       ³ + Error CASE
  120. END IF '                           ¾
  121. loadImages
  122.  
  123. _ICON SpellImg&(0)
  124. _TITLE "Fantasy"
  125.  
  126. loadProgramInitialVariables
  127.  
  128. '----------------------------------------------------------------------------------------------------------Û   PROGRAM   Û--------------------------------------------------------------------------------------------------------------
  129.     _LIMIT 60 ' relax the CPU
  130.     CLS
  131.     'What happened to the MUSIC????? XD
  132.     playerInputs
  133.  
  134.     IF actualMapWorking% <> -1 THEN
  135.         drawMyFantasy
  136.     ELSE
  137.         CLS , GREEN3
  138.     END IF
  139.  
  140.     SELECT CASE actualMenuWorking%
  141.         CASE 0 ' GAME
  142.             IF NOT gameTurn% = -1 THEN
  143.                 'drawTrhows         -------> first show the action performed by the player, be it a spell or arrow/bolt/throw/bomb
  144.                 enemiesTurns
  145.             ELSE
  146.             END IF
  147.         CASE -1: lookInPocket ' POCKET
  148.         CASE -2: selectSomeSpell ' SPELLS
  149.         CASE -3: showTheStats ' STATS
  150.         CASE -4: mainMenu ' MENU
  151.         CASE -5: newGame ' NEW GAME
  152.         CASE -6: loadGame
  153.         CASE -7: saveGame
  154.         CASE -8: unloadImages: SYSTEM ' EXIT
  155.         CASE -9: helpMenu ' HELP
  156.         CASE -10: lookAtMap ' MAP
  157.     END SELECT
  158.  
  159.     IF Hero.life > calculateMaxLife% THEN Hero.life = calculateMaxLife%
  160.     IF Hero.mana > calculateMaxMana% THEN Hero.mana = calculateMaxMana%
  161.  
  162.     doWithFinger
  163.     TESTER
  164.     _DISPLAY ' update screen
  165.  
  166. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  167. SUB helpMenu () ' INCOMPLETE°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û MENUS Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  168.     LOCATE 1, 1
  169.     PRINT "How to play"
  170.     doWithFinger
  171.     keyboardInputs
  172. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  173.  
  174. SUB showTheStats () ' STILL HAVE TO: !!!ARROW FOR UPGRADING CAN'T APPEAR IF WE REACHED TOP OF SKILL FOR CLASS!!!! Also reorganize the text and positions to imitate Diablo style of skills: base & now
  175.  
  176.     drawMenuBack 247, 99, 391, 274
  177.     LOCATE 8, 38 '  Â¿ TITLE
  178.     PRINT "STATS"; 'Ù
  179.     closeWindowButton 375, 102
  180.  
  181.     LINE (298, 127)-(332, 142), GREEN2, BF '                   ¿
  182.     _PUTIMAGE (299, 128), LvlImg&(0) ' static "Lvl" img        Â³ROMAN number
  183.     _PUTIMAGE (315, 128), LvlImg&(Hero.lvl) ' Lvl roman number Ù
  184.  
  185.     drawItemSlots 255, 143: _PUTIMAGE (255, 143), Hero.image '
  186.  
  187.     LOCATE 10, 38: PRINT Hero.id;
  188.     LOCATE 11, 38: PRINT Hero.class;
  189.  
  190.     LOCATE 12, 33
  191.     PRINT "STR"; calculateHeroActualStrength%;
  192.     LOCATE 12, 42
  193.     PRINT "AGI"; calculateHeroActualAgility%;
  194.     LOCATE 13, 33
  195.     PRINT "POW"; calculateHeroActualPower%;
  196.     LOCATE 13, 42
  197.     PRINT "VIG"; calculateHeroActualVigor%;
  198.  
  199.  
  200.     LOCATE 15, 35: PRINT "DMG" + _TRIM$(STR$(calculateHeroBaseDmg%)) + "-" + _TRIM$(STR$(calculateHeroMaxDmg%));
  201.     LOCATE 16, 33: PRINT "DEF"; calculateHeroDefense%;
  202.     LOCATE 16, 40: PRINT "HIT%"; calculateHeroChanceToHit%;
  203.  
  204.  
  205.     IF Hero.attributePoints > 0 THEN ' if you have points
  206.  
  207.         _PUTIMAGE (304, 176), DirArrowImg&(4) ' strength         ¿
  208.         IF fingerIsOnSurface%(304, 176, 16, 16) THEN '           ³
  209.             printHUDpromt "Increase your strength" '             ³
  210.             IF Finger.clickL THEN '                              Â³
  211.                 Hero.strength = Hero.strength + 1 '              Â³
  212.                 Hero.attributePoints = Hero.attributePoints - 1 '³
  213.             END IF '                                             ³
  214.         END IF '                                                 ³
  215.         _PUTIMAGE (376, 176), DirArrowImg&(4) ' agility          Â³
  216.         IF fingerIsOnSurface%(376, 176, 16, 16) THEN '           ³
  217.             printHUDpromt "Increase your agility" '              Â³
  218.             IF Finger.clickL THEN '                              Â³
  219.                 Hero.agility = Hero.agility + 1 '                Â³ ARROWS
  220.                 Hero.attributePoints = Hero.attributePoints - 1 '³ FOR
  221.             END IF '                                             ³ UPGRADING  <---------------Need to make functions for checking topStrength, topPower, etc... calculateHeroTopVigor
  222.         END IF '                                                 ³ SKILLS
  223.         _PUTIMAGE (304, 192), DirArrowImg&(4) ' power            Â³
  224.         IF fingerIsOnSurface%(304, 192, 16, 16) THEN '           ³
  225.             printHUDpromt "Increase your power" '                Â³
  226.             IF Finger.clickL THEN '                              Â³
  227.                 Hero.power = Hero.power + 1 '                    Â³
  228.                 Hero.attributePoints = Hero.attributePoints - 1 '³
  229.             END IF '                                             ³
  230.         END IF '                                                 ³
  231.         _PUTIMAGE (376, 192), DirArrowImg&(4) ' vigor            Â³
  232.         IF fingerIsOnSurface%(376, 192, 16, 16) THEN '           ³
  233.             printHUDpromt "Increase your vigor" '                Â³
  234.             IF Finger.clickL THEN '                              Â³
  235.                 Hero.vigor = Hero.vigor + 1 '                    Â³
  236.                 Hero.attributePoints = Hero.attributePoints - 1 '³
  237.             END IF '                                             ³
  238.         END IF '                                                 ¾
  239.  
  240.         drawMenuBack 272, 296, 359, 359 '¿
  241.         LOCATE 20, 36 '                  Â³
  242.         PRINT "ATTRIBUTE"; '             ³ bottom
  243.         LOCATE 21, 37 '                  Â³ box
  244.         PRINT "POINTS"; '                Â³
  245.         LOCATE 22, 39 '                  Â³
  246.         PRINT Hero.attributePoints; '    Â¾
  247.     END IF
  248.  
  249.  
  250. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  251. SUB newGame () '!!!!!!! set me to 0 after testing
  252.  
  253.     DIM i%
  254.  
  255.     actualMapWorking% = -1 'leave actual game
  256.  
  257.     chooseClass '¿ don't switch
  258.     enterName '  Ã™ the order!
  259.  
  260.     Hero.lvl = 1 ' start with a fresh character
  261.     Hero.xp = 0 '              Â¿
  262.     Hero.nextXp = 100 '        Â³ with no xp
  263.     Hero.prevNextXp = 0 '      Â³
  264.     Hero.attributePoints = 5 ' ¾ <--------------------------!!!!!!! set me to 0 after testing
  265.  
  266.     FOR i% = 0 TO 5
  267.         SpellsIknow%%(i%) = 0 ' you don't know any spells
  268.     NEXT i%
  269.  
  270.     'Û LOAD CHARACTER INITIAL VARIABLES Û
  271.     SELECT CASE Hero.class 'according to class
  272.         CASE "Barbarian" '      Â¿
  273.             Hero.strength = 20 '³
  274.             Hero.agility = 10 ' ³ BARBARIAN
  275.             Hero.power = 5 '    Â³ SKILLS
  276.             Hero.vigor = 15 '   Ù
  277.         CASE "Clerig" '         ¿
  278.             Hero.strength = 15 '³
  279.             Hero.agility = 5 '  Â³ CLERIG
  280.             Hero.power = 10 '   ³ SKILLS
  281.             Hero.vigor = 20 '   Ù
  282.         CASE "Assasin" '        Â¿
  283.             Hero.strength = 10 '³
  284.             Hero.agility = 20 ' ³ ASSASIN
  285.             Hero.power = 5 '    Â³ SKILLS
  286.             Hero.vigor = 15 '   Ù
  287.         CASE "Wizard" '         ¿
  288.             Hero.strength = 5 ' ³
  289.             Hero.agility = 10 ' ³ WIZARD
  290.             Hero.power = 20 '   ³ SKILLS
  291.             Hero.vigor = 15 '   ³
  292.     END SELECT '                Ã™
  293.  
  294.     Hero.life = calculateMaxLife%
  295.     Hero.mana = calculateMaxMana%
  296.  
  297.     FOR i% = 0 TO 22
  298.         cleanOnePocketSlot i% ' clearPocket
  299.     NEXT i%
  300.  
  301.     equipOurHero
  302.  
  303.     actualMapWorking% = 0 ' ¿ we start
  304.     Hero.x = 32 '           ³ at this
  305.     Hero.y = 64 '           Ù place
  306.  
  307.     loadEnemiesInitialVariables
  308.     loadMechsInitialVariables
  309.     showHistory 0
  310.  
  311.     actualMenuWorking% = 0 ' LAUNCH GAME!
  312.  
  313. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  314.  
  315. SUB chooseClass ()
  316.  
  317.     Hero.class = "" ' we have no class at start
  318.  
  319.     DIM i% ' ¿ LOCALS
  320.     DIM ii% 'Ù
  321.  
  322.     DO
  323.         _LIMIT 60
  324.  
  325.         playerInputs
  326.  
  327.         IF actualMapWorking% <> -1 THEN
  328.             CLS
  329.             drawMyFantasy
  330.         ELSE
  331.             CLS , GREEN3 'all screen clear on green3
  332.         END IF
  333.  
  334.         drawMenuBack 247, 99, 391, 274
  335.         LOCATE 8, 35 '                                               ¿ TITLE
  336.         PRINT "CHOOSE CLASS"; ' Barbarian, Clerig, Assasin or Wizard Ù
  337.  
  338.         FOR i% = 0 TO 3
  339.             drawItemSlots 252 + i% * 34, 139 ' slots for hero images
  340.         NEXT i%
  341.  
  342.         _PUTIMAGE (252, 139), HeroImg&(0) ' Barbarian ¿
  343.         _PUTIMAGE (286, 139), HeroImg&(1) ' Clerig    Â³ characters
  344.         _PUTIMAGE (320, 139), HeroImg&(3) ' Assasin   ³ images
  345.         _PUTIMAGE (354, 139), HeroImg&(6) ' Wizard    Ã™
  346.  
  347.         LOCATE 14, 33: PRINT "Strength"; '¿ static
  348.         LOCATE 15, 34: PRINT "Agility"; ' ³ ATRIBUTTE
  349.         LOCATE 16, 36: PRINT "Power"; '   ³ WORDS
  350.         LOCATE 17, 36: PRINT "Vigor"; '   Ù
  351.  
  352.         FOR i% = 0 TO 3 '                                              Â¿
  353.             _PUTIMAGE (327, i% * 16 + 212), ManaImg&(0) ' open         ³
  354.             _PUTIMAGE (367, i% * 16 + 212), ManaImg&(6) ' close        Â³ static
  355.             FOR ii% = 0 TO 3 '                                         ³ BARS
  356.                 _PUTIMAGE (ii% * 8 + 335, i% * 16 + 212), ManaImg&(5) '³
  357.             NEXT ii% '                                                 ³
  358.         NEXT i% '                                                      Ã™
  359.  
  360.         IF ((Finger.x > 251 AND Finger.x < 285) AND (Finger.y > 138 AND Finger.y < 172)) THEN '    Â¿
  361.             LOCATE 13, 37 '                                                                        Â³
  362.             PRINT "Barbarian"; '                                                                   ³
  363.             barShowingPercentage 327, 212, 100 'STRENGTH                                           ³
  364.             barShowingPercentage 327, 228, 50 'AGILITY                                             ³
  365.             barShowingPercentage 327, 244, 25 'POWER                                               ³
  366.             barShowingPercentage 327, 260, 75 ' VIGOR                                              Â³
  367.             IF Finger.clickL THEN Hero.class = "Barbarian" 'if click, confirm                      Ã™
  368.  
  369.         ELSEIF ((Finger.x > 285 AND Finger.x < 319) AND (Finger.y > 138 AND Finger.y < 172)) THEN '¿
  370.             LOCATE 13, 38 '                                                                        Â³
  371.             PRINT "Clerig"; '                                                                      Â³
  372.             barShowingPercentage 327, 212, 75 'STRENGTH                                            Â³
  373.             barShowingPercentage 327, 228, 25 'AGILITY                                             ³
  374.             barShowingPercentage 327, 244, 50 'POWER                                               ³
  375.             barShowingPercentage 327, 260, 100 ' VIGOR                                             ³
  376.             IF Finger.clickL THEN Hero.class = "Clerig" 'if click, confirm                         Ù
  377.  
  378.         ELSEIF ((Finger.x > 319 AND Finger.x < 353) AND (Finger.y > 138 AND Finger.y < 172)) THEN '¿
  379.             LOCATE 13, 38 '                                                                        Â³
  380.             PRINT "Assasin"; '                                                                     ³
  381.             barShowingPercentage 327, 212, 50 'STRENGTH                                            Â³
  382.             barShowingPercentage 327, 228, 100 'AGILITY                                            Â³
  383.             barShowingPercentage 327, 244, 25 'POWER                                               ³
  384.             barShowingPercentage 327, 260, 75 ' VIGOR                                              Â³
  385.             IF Finger.clickL THEN Hero.class = "Assasin" 'if click, confirm                        Ã™
  386.  
  387.         ELSEIF ((Finger.x > 353 AND Finger.x < 387) AND (Finger.y > 138 AND Finger.y < 172)) THEN '¿
  388.             LOCATE 13, 38 '                                                                        Â³
  389.             PRINT "Wizard"; '                                                                      Â³
  390.             barShowingPercentage 327, 212, 25 'STRENGTH                                            Â³
  391.             barShowingPercentage 327, 228, 50 'AGILITY                                             ³
  392.             barShowingPercentage 327, 244, 100 'POWER                                              Â³
  393.             barShowingPercentage 327, 260, 75 ' VIGOR                                              Â³
  394.             IF Finger.clickL THEN Hero.class = "Wizard" 'if click, confirm                         ³
  395.         END IF '                                                                                   Ù
  396.  
  397.         doWithFinger
  398.  
  399.         _DISPLAY
  400.     LOOP UNTIL Hero.class <> "" ' leave when we have a class
  401.  
  402.  
  403. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - -
  404. SUB enterName () ' first letter should always capitalize
  405.  
  406.     DIM playerChoosingName$ '¿
  407.     DIM suffixForName$ '     ³
  408.     DIM key$ '               ³ LOCALS
  409.     DIM i% '                 ³
  410.     DIM ii% '                Ã™
  411.  
  412.     Hero.id = "" '             ¿ get ready for recive
  413.     playerChoosingName$ = "" ' Ù something
  414.  
  415.     suffixForName$ = "the " + Hero.class '¿ we already have
  416.     'center it                            Â³ an rpg class ;)
  417.     ii% = 40 - (LEN(suffixForName$) \ 2) 'Ù
  418.  
  419.     DO
  420.         _LIMIT 60
  421.  
  422.         getMouseData
  423.  
  424.         IF actualMapWorking% <> -1 THEN
  425.             drawMyFantasy
  426.         ELSE
  427.             CLS , GREEN3 'all screen clear on green3
  428.         END IF
  429.  
  430.         drawMenuBack 247, 99, 391, 274
  431.         LOCATE 8, 34 '              Â¿ TITLE
  432.         PRINT "ENTER YOUR NAME"; '  Ã™
  433.  
  434.         drawItemSlots 303, 139 ' slot for hero image
  435.         SELECT CASE Hero.class ' images of possible hero to choose
  436.             CASE "Barbarian": _PUTIMAGE (303, 139), HeroImg&(0)
  437.             CASE "Clerig": _PUTIMAGE (303, 139), HeroImg&(1)
  438.             CASE "Assasin": _PUTIMAGE (303, 139), HeroImg&(3)
  439.             CASE "Wizard": _PUTIMAGE (303, 139), HeroImg&(6)
  440.         END SELECT '
  441.  
  442.         LOCATE 12, 32 '               ¿ print
  443.         PRINT "This story begins"; '  Â³ text pre
  444.         LOCATE 13, 32 '               ³ name
  445.         PRINT "with a hero called"; ' Ù
  446.  
  447.         key$ = INKEY$ ' get the key                                                                                                                     ¿
  448.         IF key$ <> "" THEN '                                                                                                                            Â³
  449.             ' write                                                                                                                                     ³
  450.             IF LEN(playerChoosingName$) < 11 THEN '                                                                                                     ³ keyboard
  451.                 IF ((ASC(key$) > 64 AND ASC(key$) < 91) OR (ASC(key$) > 96 AND ASC(key$) < 123)) THEN playerChoosingName$ = playerChoosingName$ + key$ '³ inputs
  452.             END IF '                                                                                                                                    Â³ for this
  453.             IF LEN(playerChoosingName$) > 0 THEN ' if the name has at least one character                                                               ³ particular
  454.                 IF ASC(key$) = 8 THEN playerChoosingName$ = LEFT$(playerChoosingName$, LEN(playerChoosingName$) - 1) ' erease letter from name          Â³ menu
  455.                 IF ASC(key$) = 13 THEN Hero.id = playerChoosingName$ ' confirm name                                                                     ³
  456.             END IF '                                                                                                                                    Â³
  457.         END IF '                                                                                                                                        Ã™
  458.  
  459.         i% = 40 - (LEN(playerChoosingName$) \ 2) '¿ print the name
  460.         LOCATE 14, i% '                           ³ the player is
  461.         PRINT playerChoosingName$; "_"; '         Ù actually writing
  462.  
  463.         LOCATE 15, ii% '       ¿ print
  464.         PRINT suffixForName$; 'Ù "the " + Hero.class
  465.  
  466.         _PUTIMAGE (287, 245), FingerImg&(3) ' GO ¿ print
  467.         _PUTIMAGE (335, 245), FingerImg&(1) ' X  Ã™ "buttons"
  468.  
  469.         IF Finger.clickL THEN ' when u click                                                                                         ¿
  470.             IF LEN(playerChoosingName$) > 0 THEN ' and some name has been written                                                    Â³
  471.                 ' if finger position ok, then confirm name                                                                           ³ mouse click
  472.                 IF ((Finger.x > 286 AND Finger.x < 302) AND (Finger.y > 244 AND Finger.y < 260)) THEN Hero.id = playerChoosingName$ '³ inputs in
  473.             END IF '                                                                                                                 ³ this particular
  474.             ' if u click on the cross erease the pre-name                                                                            Â³ menu
  475.             IF ((Finger.x > 334 AND Finger.x < 350) AND (Finger.y > 244 AND Finger.y < 260)) THEN playerChoosingName$ = "" '         ³
  476.         END IF '                                                                                                                     Ù
  477.  
  478.         doWithFinger
  479.  
  480.         _DISPLAY
  481.     LOOP UNTIL Hero.id <> "" ' leave here when we have a name
  482.  
  483. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  484. SUB selectSomeSpell () ' INCOMPLETE
  485.  
  486.     drawMenuBack 247, 99, 391, 274
  487.     LOCATE 8, 38 '    Â¿ TITLE
  488.     PRINT "SPELLS"; ' Ù
  489.     closeWindowButton 375, 102
  490.  
  491. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  492. SUB mainMenu ()
  493.  
  494.     drawMenuBack 247, 99, 391, 306
  495.  
  496.     LOCATE 8, 37 '          Â¿
  497.     PRINT "FANTASY"; '      Â¾  TITLE
  498.  
  499.     _PUTIMAGE (259, 103), SpellImg&(0) '¿ demoniac
  500.     _PUTIMAGE (340, 103), SpellImg&(0) 'Ù stars
  501.  
  502.     IF actualMapWorking% <> -1 THEN closeWindowButton 375, 102 ' if we are playing we should be able to see and press this button
  503.  
  504.     LOCATE 10, 36 '                                                                  Â¿
  505.     IF fingerIsOnSurface%(280, 144, 72, 16) THEN '                                   ³
  506.         COLOR GREEN4, GREEN1 '                                                       ³
  507.         IF Finger.clickL THEN actualMenuWorking% = -5 '                              Â³ NEW GAME
  508.     ELSE '                                                                           ³
  509.         COLOR GREEN1, GREEN4 '                                                       ³
  510.     END IF '                                                                         ³
  511.     PRINT "New  game"; '                                                             ³
  512.     IF fingerIsOnSurface%(280, 144, 72, 16) THEN printHUDpromt "Start a new game" '  Â¾
  513.  
  514.  
  515.     LOCATE 12, 36 '                                                                  Â¿
  516.     IF _FILEEXISTS(".\fantasy.txt") THEN ' is there a file for loading?              Â³
  517.         IF fingerIsOnSurface%(280, 176, 72, 16) THEN '                               ³
  518.             COLOR GREEN4, GREEN1 '                                                   ³
  519.             IF Finger.clickL THEN actualMenuWorking% = -6 '                          Â³
  520.         ELSE '                                                                       ³ LOAD GAME
  521.             COLOR GREEN1, GREEN4 '                                                   ³
  522.         END IF '                                                                     ³
  523.     ELSE '                                                                           ³
  524.         COLOR GREEN3, GREEN4 ' no file for loading                                   ³
  525.     END IF '                                                                         ³
  526.     PRINT "Load game"; '                                                             ³
  527.     IF fingerIsOnSurface%(280, 176, 72, 16) THEN printHUDpromt "Load a saved game" ' ¾
  528.  
  529.     LOCATE 14, 36 '                                                                  Â¿
  530.     IF actualMapWorking% <> -1 THEN '                                                Â³
  531.         IF fingerIsOnSurface%(280, 208, 72, 16) THEN '                               ³
  532.             COLOR GREEN4, GREEN1 '                                                   ³
  533.             IF Finger.clickL THEN actualMenuWorking% = -7 '                          Â³
  534.         ELSE '                                                                       ³ SAVE GAME
  535.             COLOR GREEN1, GREEN4 '                                                   ³
  536.         END IF '                                                                     ³
  537.     ELSE '                                                                           ³
  538.         COLOR GREEN3, GREEN4 ' if NOT in game                                        Â³
  539.     END IF '                                                                         ³
  540.     PRINT "Save Game"; '                                                             ³
  541.     IF fingerIsOnSurface%(280, 208, 72, 16) THEN printHUDpromt "Save current game" ' ¾
  542.  
  543.     LOCATE 16, 38 '                                                                  Â¿
  544.     IF fingerIsOnSurface%(296, 240, 32, 16) THEN '                                   ³
  545.         COLOR GREEN4, GREEN1 '                                                       ³
  546.         IF Finger.clickL THEN actualMenuWorking% = -9 '                              Â³ HELP
  547.     ELSE '                                                                           ³
  548.         COLOR GREEN1, GREEN4 '                                                       ³
  549.     END IF '                                                                         ³
  550.     PRINT "Help"; '                                                                  Â³
  551.     IF fingerIsOnSurface%(296, 240, 32, 16) THEN printHUDpromt "Learn how to play" ' ¾
  552.  
  553.     LOCATE 18, 38 '                                                                  Â¿
  554.     IF fingerIsOnSurface%(296, 272, 32, 16) THEN '                                   ³
  555.         COLOR GREEN4, GREEN1 '                                                       ³
  556.         IF Finger.clickL THEN actualMenuWorking% = -8 '                              Â³ EXIT
  557.     ELSE '                                                                           ³ GAME
  558.         COLOR GREEN1, GREEN4 '                                                       ³
  559.     END IF '                                                                         ³
  560.     PRINT "Exit"; '                                                                  Â³
  561.     IF fingerIsOnSurface%(296, 272, 32, 16) THEN printHUDpromt "Close and leave" '   ¾
  562.  
  563.     COLOR GREEN1, GREEN4 ' don't conlictuate with other stuf
  564.  
  565.  
  566. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  567. SUB lookInPocket () 'what about in case of commerce or chest, bag, bones, etc....????
  568.  
  569.     drawMenuBack 247, 99, 391, 274 '
  570.     LOCATE 8, 38 '
  571.     PRINT "POCKET"; '
  572.     closeWindowButton 375, 102
  573.  
  574.     drawMenuBack 459, 99, 603, 274 '
  575.     LOCATE 8, 64 '
  576.     PRINT "EQUIPPED"; '
  577.  
  578.     FOR i% = 0 TO 22
  579.         drawItemSlots Pocket(i%).x, Pocket(i%).y ' POCKET & EQUIPPED slots draw
  580.     NEXT i%
  581.  
  582.     drawMenuBack 29, 284, 610, 450 ' ITEM INFO
  583.  
  584.     drawItemsInPocket
  585.  
  586. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  587.  
  588. SUB lookAtMap () ' INCOMPLETE
  589.     drawMenuBack 16, 48, 624, 464
  590.     LOCATE 4, 38
  591.     PRINT "MAP"
  592.     closeWindowButton 608, 52
  593. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  594. SUB loadGame () 'INCOMPLETE
  595.     drawMenuBack 247, 99, 391, 274
  596.     LOCATE 8, 36 '    Â¿ TITLE
  597.     PRINT "LOAD  GAME"; ' Ù
  598.     closeWindowButton 375, 102
  599. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  600. SUB saveGame () 'INCOMPLETE
  601.     drawMenuBack 247, 99, 391, 274
  602.     LOCATE 8, 36 '    Â¿ TITLE
  603.     PRINT "SAVE  GAME"; ' Ù
  604.     closeWindowButton 375, 102
  605. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  606.  
  607. SUB cleanYourHand () '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û ITEMS Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  608.     inHand.kind = -1
  609.     inHand.lvl = -1
  610.     inHand.ammount = 0
  611.     inHand.special = ""
  612. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  613. FUNCTION lookForSpaceInPocket% ()
  614.     DIM i%
  615.     FOR i% = 7 TO 22
  616.         IF Pocket(i%).kind = -1 THEN lookForSpaceInPocket% = i%: EXIT FUNCTION
  617.     NEXT i%
  618.     lookForSpaceInPocket% = FALSE
  619. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  620. SUB clearPocket ()
  621.     FOR i% = 0 TO 22
  622.         Pocket(i%).kind = -1
  623.         Pocket(i%).lvl = -1
  624.         Pocket(i%).ammount = 0
  625.         Pocket(i%).special = ""
  626.     NEXT i%
  627. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  628.  
  629. SUB drawItemsInPocket ()
  630.     FOR i% = 0 TO 22
  631.         _PUTIMAGE (Pocket(i%).x, Pocket(i%).y), calculateItemImage&(Pocket(i%).kind, Pocket(i%).lvl)
  632.     NEXT i%
  633.     _PUTIMAGE (inHand.x - 16, inHand.y - 16), calculateItemImage&(inHand.kind, inHand.lvl)
  634. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  635.  
  636. SUB createItemInPocket (kind%, lvl%, ammount%, slot%, special$)
  637.     Pocket(slot%).kind = kind%
  638.     Pocket(slot%).lvl = lvl%
  639.     Pocket(slot%).ammount = ammount%
  640.     Pocket(slot%).special = special$
  641. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  642. SUB cleanOnePocketSlot (indexOfSlot%)
  643.     Pocket(indexOfSlot%).kind = -1
  644.     Pocket(indexOfSlot%).lvl = -1
  645.     Pocket(indexOfSlot%).ammount = 0
  646.     Pocket(indexOfSlot%).special = ""
  647. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  648. FUNCTION calculateItemImage& (kind%, lvl%)
  649.     SELECT CASE kind%
  650.         CASE -1: calculateItemImage& = BlankImg&
  651.         CASE 0: calculateItemImage& = KeysImg&(lvl%)
  652.         CASE 1: calculateItemImage& = PotionImg&(lvl%)
  653.         CASE 2: calculateItemImage& = PaperImg&(lvl%)
  654.         CASE 3: calculateItemImage& = BookImg&(lvl%)
  655.         CASE 4: calculateItemImage& = SwordImg&(lvl%)
  656.         CASE 5: calculateItemImage& = AxeImg&(lvl%)
  657.         CASE 6: calculateItemImage& = ThrowImg&(lvl%)
  658.         CASE 7: calculateItemImage& = BowImg&(lvl%)
  659.         CASE 8: calculateItemImage& = BowImg&(lvl% + 3)
  660.         CASE 9: calculateItemImage& = BombImg&(lvl%)
  661.         CASE 10: calculateItemImage& = ArrowImg&(lvl%)
  662.         CASE 11: calculateItemImage& = SpearImg&(lvl%)
  663.         CASE 12: calculateItemImage& = ArmorImg&(lvl%)
  664.         CASE 13: calculateItemImage& = HelmImg&(lvl%)
  665.         CASE 14: calculateItemImage& = ShieldImg&(lvl%)
  666.         CASE 15: calculateItemImage& = WandImg&(lvl%)
  667.         CASE 16: calculateItemImage& = MoneyImg&(lvl%)
  668.         CASE 17: calculateItemImage& = JewelImg&(lvl%)
  669.         CASE 18: calculateItemImage& = WonderImg&(lvl%)
  670.     END SELECT
  671. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  672. FUNCTION calculateItemDefense% (kind%, lvl%, special$)
  673.     DIM tmp%
  674.     tmp% = 0
  675.     SELECT CASE kind%
  676.         CASE 12: tmp% = 3 + 3 * lvl% ' ARMORS
  677.         CASE 13: tmp% = 1 + 1 * lvl% ' HELMS
  678.         CASE 14: tmp% = 2 + 2 * lvl% ' SHIELDS
  679.     END SELECT
  680.     IF special$ <> "" THEN
  681.         IF INSTR(special$, "d") THEN
  682.             tmp% = tmp% + VAL(RIGHT$(special$, 1))
  683.         END IF
  684.     END IF
  685.     calculateItemDefense% = tmp%
  686. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  687. FUNCTION calculateItemBaseDmg% (kind%, lvl%, special$)
  688.     DIM tmp%
  689.     tmp% = 0
  690.     SELECT CASE kind%
  691.         CASE 4: tmp% = (lvl% + 1) * 2 ' SWORDS
  692.         CASE 5: tmp% = (lvl% + 1) * 3 'AXES
  693.         CASE 6: tmp% = (lvl% + 1) 'THROWS
  694.         CASE 7: tmp% = (lvl% + 1) * 2 'BOWS
  695.         CASE 8: tmp% = (lvl% + 1) * 3 'CROSSBOWS
  696.         CASE 9: tmp% = (lvl% + 1) * 15 'BOMBS
  697.         CASE 10: tmp% = (lvl% + 1) * 2 'ARROWS
  698.         CASE 11: tmp% = (lvl% + 1) * 3 'BOLTS
  699.         CASE 15: tmp% = (lvl% + 1) 'WANDS
  700.     END SELECT
  701.     IF special$ <> "" THEN
  702.         IF INSTR(special$, "b") THEN
  703.             tmp% = tmp% + VAL(RIGHT$(special$, 1))
  704.         END IF
  705.     END IF
  706.     calculateItemBaseDmg% = tmp%
  707. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  708. FUNCTION calculateItemMaxDmg% (kind%, lvl%, special$)
  709.     DIM k%
  710.     DIM l%
  711.     DIM s$
  712.     DIM tmp%
  713.     k% = kind%
  714.     l% = lvl%
  715.     s$ = special$
  716.     SELECT CASE kind%
  717.         CASE 4: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 3 ' SWORDS
  718.         CASE 5: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 4 'AXES
  719.         CASE 6: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 1 'THROWS
  720.         CASE 7: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 2 'BOWS
  721.         CASE 8: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 3 'CROSSBOWS
  722.         CASE 9: tmp% = calculateItemBaseDmg%(k%, l%, s$) + (l% + 1) * 5 'BOMBS
  723.         CASE 10: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 1 'ARROWS
  724.         CASE 11: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 2 'BOLTS
  725.         CASE 15: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 1 'WANDS
  726.     END SELECT
  727.     IF s$ <> "" THEN
  728.         IF INSTR(s$, "m") THEN
  729.             tmp% = tmp% + VAL(RIGHT$(s$, 1))
  730.         END IF
  731.     END IF
  732.     calculateItemMaxDmg% = tmp%
  733. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  734. FUNCTION nameAnItem$ (kind%, lvl%, special$)
  735.  
  736.     DIM tmp$
  737.  
  738.     SELECT CASE kind%
  739.         CASE -1 ' nothing
  740.             tmp$ = ""
  741.         CASE 0 '  KEYS
  742.             SELECT CASE lvl%
  743.                 CASE 0: tmp$ = "Tiny"
  744.                 CASE 1: tmp$ = "Elegant"
  745.                 CASE 2: tmp$ = "Rare"
  746.                 CASE 3: tmp$ = "Heavy"
  747.                 CASE 4: tmp$ = "Criptyc"
  748.                 CASE 5: tmp$ = "Twisted"
  749.             END SELECT
  750.             tmp$ = tmp$ + " key"
  751.         CASE 1 '  POTIONS
  752.             SELECT CASE lvl% '
  753.                 CASE 0: tmp$ = "Minor"
  754.                 CASE 1: tmp$ = "Light"
  755.                 CASE 2: tmp$ = "Small"
  756.                 CASE 3: tmp$ = "Medium"
  757.                 CASE 4: nameAnItem$ = "Potion": EXIT FUNCTION
  758.                 CASE 5: tmp$ = "Large"
  759.                 CASE 6: tmp$ = "Big"
  760.                 CASE 7: tmp$ = "Full"
  761.             END SELECT
  762.             tmp$ = tmp$ + " potion"
  763.         CASE 2 '  PAPERS
  764.             SELECT CASE lvl%
  765.                 CASE 0: tmp$ = "Papers"
  766.                 CASE 1: tmp$ = "Dark spell"
  767.                 CASE 2: tmp$ = "Prophecy"
  768.                 CASE 3: tmp$ = "Map"
  769.             END SELECT
  770.         CASE 3 '  BOOKS
  771.             SELECT CASE lvl%
  772.                 CASE 0: tmp$ = "Ancient book"
  773.                 CASE 1: tmp$ = "Old book"
  774.                 CASE 2: tmp$ = "Tome"
  775.                 CASE 3: tmp$ = "Enciclopedy"
  776.             END SELECT
  777.         CASE 4 '  SWORDS
  778.             SELECT CASE lvl%
  779.                 CASE 0: tmp$ = "Small"
  780.                 CASE 1: tmp$ = "Curve"
  781.                 CASE 2: tmp$ = "Templed"
  782.                 CASE 3: tmp$ = "Medium"
  783.                 CASE 4: nameAnItem$ = "Sabre" + itemSpecialSuffix$(special$): EXIT FUNCTION
  784.                 CASE 5: tmp$ = "Sharpened"
  785.                 CASE 6: tmp$ = "Celestial"
  786.                 CASE 7: tmp$ = "Demoniac"
  787.             END SELECT
  788.             tmp$ = tmp$ + " sword"
  789.         CASE 5 '  AXES
  790.             SELECT CASE lvl%
  791.                 CASE 0: tmp$ = "Bushcraft"
  792.                 CASE 1: tmp$ = "Small"
  793.                 CASE 2: nameAnItem$ = "Bardiche" + itemSpecialSuffix$(special$): EXIT FUNCTION
  794.                 CASE 3: tmp$ = "Medium"
  795.                 CASE 4: tmp$ = "Double"
  796.                 CASE 5: tmp$ = "Sharp double"
  797.                 CASE 6: tmp$ = "War"
  798.                 CASE 7: tmp$ = "Demoniac"
  799.             END SELECT
  800.             tmp$ = tmp$ + " axe"
  801.         CASE 6 '  THROWS
  802.             SELECT CASE lvl%
  803.                 CASE 0: tmp$ = "Light"
  804.                 CASE 1: tmp$ = "Heavy"
  805.                 CASE 2: nameAnItem$ = "Throwin knives": EXIT FUNCTION
  806.             END SELECT
  807.             tmp$ = tmp$ + " shurikens"
  808.         CASE 7 '  BOWS
  809.             SELECT CASE lvl%
  810.                 CASE 0: tmp$ = "Hunter"
  811.                 CASE 1: tmp$ = "Composite"
  812.                 CASE 2: tmp$ = "War"
  813.             END SELECT
  814.             tmp$ = tmp$ + " bow"
  815.         CASE 8 '  CROSSBOWS
  816.             SELECT CASE lvl%
  817.                 CASE 0: tmp$ = "Light"
  818.                 CASE 1: tmp$ = "Heavy"
  819.             END SELECT
  820.             tmp$ = tmp$ + " crossbow"
  821.         CASE 9 '  BOMBS
  822.             SELECT CASE lvl%
  823.                 CASE 0: tmp$ = "Small"
  824.                 CASE 1: tmp$ = "Medium"
  825.                 CASE 2: tmp$ = "Large"
  826.             END SELECT
  827.             tmp$ = tmp$ + " bombs"
  828.         CASE 10 ' ARROWS
  829.             SELECT CASE lvl%
  830.                 CASE 0: tmp$ = "Light"
  831.                 CASE 1: tmp$ = "Sharp"
  832.                 CASE 2: tmp$ = "Heavy"
  833.             END SELECT
  834.             tmp$ = tmp$ + " arrows"
  835.         CASE 11 ' BOLTS
  836.             SELECT CASE lvl%
  837.                 CASE 0: tmp$ = "Light"
  838.                 CASE 1: tmp$ = "Heavy"
  839.             END SELECT
  840.             tmp$ = tmp$ + " bolts"
  841.         CASE 12 ' ARMORS
  842.             SELECT CASE lvl%
  843.                 CASE 0: nameAnItem$ = "Leather vest" + itemSpecialSuffix$(special$): EXIT FUNCTION
  844.                 CASE 1: nameAnItem$ = "Leather armor" + itemSpecialSuffix$(special$): EXIT FUNCTION
  845.                 CASE 2: nameAnItem$ = "Ring mail" + itemSpecialSuffix$(special$): EXIT FUNCTION
  846.                 CASE 3: tmp$ = "Small"
  847.                 CASE 4: tmp$ = "Medium"
  848.                 CASE 5: tmp$ = "Heavy"
  849.                 CASE 6: tmp$ = "War"
  850.                 CASE 7: tmp$ = "Full"
  851.             END SELECT
  852.             tmp$ = tmp$ + " plate"
  853.         CASE 13 ' HELMS
  854.             SELECT CASE lvl%
  855.                 CASE 0: tmp$ = "Small"
  856.                 CASE 1: tmp$ = "Medium"
  857.                 CASE 2: tmp$ = "Full"
  858.                 CASE 3: nameAnItem$ = "Half helm" + itemSpecialSuffix$(special$): EXIT FUNCTION
  859.                 CASE 4: nameAnItem$ = "Full helm" + itemSpecialSuffix$(special$): EXIT FUNCTION
  860.                 CASE 5: nameAnItem$ = "Small Helmet" + itemSpecialSuffix$(special$): EXIT FUNCTION
  861.                 CASE 6: nameAnItem$ = "Great healmet" + itemSpecialSuffix$(special$): EXIT FUNCTION
  862.                 CASE 7: nameAnItem$ = "Hellking Crown" + itemSpecialSuffix$(special$): EXIT FUNCTION
  863.             END SELECT
  864.             tmp$ = tmp$ + " cap"
  865.         CASE 14 ' SHIELDS
  866.             SELECT CASE lvl%
  867.                 CASE 0: tmp$ = "Small"
  868.                 CASE 1: tmp$ = "Medium"
  869.                 CASE 2: tmp$ = "Large"
  870.                 CASE 3: tmp$ = "Great"
  871.                 CASE 4: tmp$ = "Bronze"
  872.                 CASE 5: tmp$ = "Iron"
  873.                 CASE 6: tmp$ = "Steel"
  874.                 CASE 7: tmp$ = "War"
  875.             END SELECT
  876.             tmp$ = tmp$ + " shield"
  877.         CASE 15 ' WANDS
  878.             SELECT CASE lvl%
  879.                 CASE 0: tmp$ = "Apprentice"
  880.                 CASE 1: tmp$ = "Initiate"
  881.                 CASE 2: tmp$ = "Learner"
  882.                 CASE 3: tmp$ = "Academic"
  883.                 CASE 4: tmp$ = "Sacred"
  884.                 CASE 5: tmp$ = "Dark"
  885.                 CASE 6: tmp$ = "Egiptian"
  886.                 CASE 7: tmp$ = "Voodoo"
  887.             END SELECT
  888.             tmp$ = tmp$ + " wand"
  889.         CASE 16 ' MONEY
  890.             SELECT CASE lvl%
  891.                 CASE 0: tmp$ = "Coins"
  892.                 CASE 1: tmp$ = "Many coins"
  893.                 CASE 2: tmp$ = "Crude gemstones"
  894.                 CASE 3: tmp$ = "Gemstone"
  895.             END SELECT
  896.         CASE 17 ' JEWELERY
  897.             SELECT CASE lvl%
  898.                 CASE 0: tmp$ = "Circlet"
  899.                 CASE 1: tmp$ = "Ring"
  900.                 CASE 2: tmp$ = "Said"
  901.                 CASE 3: tmp$ = "Necklace"
  902.             END SELECT
  903.         CASE 18 ' WONDER
  904.             SELECT CASE lvl%
  905.                 CASE 0: tmp$ = "Dyran crystals"
  906.                 CASE 1: tmp$ = "The Orb"
  907.             END SELECT
  908.     END SELECT
  909.     nameAnItem$ = tmp$ + itemSpecialSuffix$(special$)
  910. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  911. FUNCTION itemSpecialSuffix$ (s$)
  912.  
  913.     DIM tmp$
  914.  
  915.     IF s$ <> "" THEN
  916.         IF INSTR(s$, "s") THEN ' adds to STR
  917.             SELECT CASE VAL(RIGHT$(s$, 1))
  918.                 CASE 1: tmp$ = "might"
  919.                 CASE 2: tmp$ = "warriors"
  920.                 CASE 3: tmp$ = "titans"
  921.             END SELECT
  922.         ELSEIF INSTR(s$, "a") THEN ' adds to AGI
  923.             SELECT CASE VAL(RIGHT$(s$, 1))
  924.                 CASE 1: tmp$ = "reflex"
  925.                 CASE 2: tmp$ = "swiftness"
  926.                 CASE 3: tmp$ = "martiality"
  927.             END SELECT
  928.         ELSEIF INSTR(s$, "p") THEN ' adds to PWR
  929.             SELECT CASE VAL(RIGHT$(s$, 1))
  930.                 CASE 1: tmp$ = "ilusionism"
  931.                 CASE 2: tmp$ = "invocation"
  932.                 CASE 3: tmp$ = "necromancy"
  933.             END SELECT
  934.         ELSEIF INSTR(s$, "v") THEN ' adds to VIG
  935.             SELECT CASE VAL(RIGHT$(s$, 1))
  936.                 CASE 1: tmp$ = "youthness"
  937.                 CASE 2: tmp$ = "longevity"
  938.                 CASE 3: tmp$ = "eternity"
  939.             END SELECT
  940.         ELSEIF INSTR(s$, "d") THEN ' adds to DEF
  941.             SELECT CASE VAL(RIGHT$(s$, 1))
  942.                 CASE 1: tmp$ = "protection"
  943.                 CASE 2: tmp$ = "guardian"
  944.                 CASE 3: tmp$ = "angels"
  945.             END SELECT
  946.         ELSEIF INSTR(s$, "m") THEN ' adds to MAX DMG
  947.             SELECT CASE VAL(RIGHT$(s$, 1))
  948.                 CASE 1: tmp$ = "fatality"
  949.                 CASE 2: tmp$ = "brutality"
  950.                 CASE 3: tmp$ = "animality"
  951.             END SELECT
  952.         ELSEIF INSTR(s$, "b") THEN ' adds to BASE DMG
  953.             SELECT CASE VAL(RIGHT$(s$, 1))
  954.                 CASE 1: tmp$ = "craftmanship"
  955.                 CASE 2: tmp$ = "technicism"
  956.                 CASE 3: tmp$ = "engineering"
  957.             END SELECT
  958.         ELSEIF INSTR(s$, "c") THEN ' adds to TO HIT%
  959.             SELECT CASE VAL(RIGHT$(s$, 1))
  960.                 CASE 1: tmp$ = "aiming"
  961.                 CASE 2: tmp$ = "exactitud"
  962.                 CASE 3: tmp$ = "precision"
  963.             END SELECT
  964.         ELSEIF INSTR(s$, "t") THEN ' teaches some spell
  965.             SELECT CASE VAL(RIGHT$(s$, 1))
  966.                 CASE 0: tmp$ = "firebolt"
  967.                 CASE 1: tmp$ = "blessing"
  968.                 CASE 2: tmp$ = "infravision"
  969.                 CASE 3: tmp$ = "teleport"
  970.                 CASE 4: tmp$ = "healing"
  971.                 CASE 5: tmp$ = "mana shield"
  972.             END SELECT
  973.         ELSEIF INSTR(s$, "u") THEN ' unidentified
  974.             itemSpecialSuffix$ = " (Unidentified)": EXIT FUNCTION
  975.         END IF
  976.         itemSpecialSuffix$ = " of " + tmp$
  977.     ELSE
  978.         itemSpecialSuffix$ = ""
  979.     END IF
  980.  
  981. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  982. SUB fromPocketToHand (slotIndex%)
  983.     inHand.kind = Pocket(slotIndex%).kind
  984.     inHand.lvl = Pocket(slotIndex%).lvl
  985.     inHand.ammount = Pocket(slotIndex%).ammount
  986.     inHand.special = Pocket(slotIndex%).special
  987.     cleanOnePocketSlot slotIndex%
  988. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  989. SUB fromHandToPocket (slotIndex%)
  990.     Pocket(slotIndex%).kind = inHand.kind
  991.     Pocket(slotIndex%).lvl = inHand.lvl
  992.     Pocket(slotIndex%).ammount = inHand.ammount
  993.     Pocket(slotIndex%).special = inHand.special
  994.     cleanYourHand
  995. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  996.  
  997. FUNCTION itemRequirementsMet% () ' NEEDS TO BE MAKED, then apply it in itemManipulationSUB
  998.  
  999. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1000. SUB itemManipulation ()
  1001.  
  1002.     DIM i%
  1003.  
  1004.  
  1005.  
  1006.     FOR i% = 7 TO 22 ' INVENTORY
  1007.         IF fingerIsOnSurface%(Pocket(i%).x, Pocket(i%).y, 32, 32) THEN
  1008.             itemInformation i%
  1009.             IF Finger.clickL AND (Pocket(i%).lvl <> -1 AND inHand.lvl = -1) THEN
  1010.                 fromPocketToHand i% 'grabbing an item from a slot
  1011.             ELSEIF Finger.clickL AND (Pocket(i%).lvl = -1 AND inHand.lvl <> -1) THEN
  1012.                 fromHandToPocket i% 'droping an item into a slot
  1013.             END IF
  1014.  
  1015.             IF Finger.clickR THEN ' if RIGHT click
  1016.                 SELECT CASE Pocket(i%).kind
  1017.                     CASE 1 ' potions
  1018.                         SOUND 440, 1
  1019.                         Hero.life = Hero.life + (Pocket(i%).lvl + 1) * 5 ' increase helth ¿ DRINKING A POTION
  1020.                         cleanOnePocketSlot i% '                      and destroy the item ¾
  1021.                     CASE 2 ' papers
  1022.                         SELECT CASE Pocket(i%).lvl '       <------------------ OTHER PAPER CASES?
  1023.                             CASE 0
  1024.                             CASE 1
  1025.                             CASE 2
  1026.                             CASE 3: actualMenuWorking% = -10 ' map
  1027.                         END SELECT
  1028.                     CASE 3 ' <-------------------------I HAVE TO CHECK IF BOOK REQUIREMENTS ARE MET
  1029.  
  1030.                 END SELECT
  1031.             END IF
  1032.         END IF
  1033.     NEXT i%
  1034.  
  1035.     FOR i% = 0 TO 6 ' EQUIPPED
  1036.         IF fingerIsOnSurface%(Pocket(i%).x, Pocket(i%).y, 32, 32) THEN
  1037.             itemInformation i%
  1038.             IF Finger.clickL AND (Pocket(i%).lvl <> -1 AND inHand.lvl = -1) THEN
  1039.                 fromPocketToHand i% ' if LEFT click grab an item from a slot. No big deal on this
  1040.  
  1041.             ELSEIF Pocket(i%).lvl = -1 AND inHand.lvl <> -1 THEN 'droping an item into a slot needs to check and inform some things
  1042.                 IF itemFitsEquipmentSlot%(i%) THEN
  1043.                     'IF itemRequirementsMet% THEN
  1044.                     IF Finger.clickL THEN fromHandToPocket i%
  1045.                     'ELSE
  1046.                     '    'printhudpromt "Requirements not met"
  1047.                     'END IF
  1048.                 END IF
  1049.             END IF
  1050.  
  1051.         END IF
  1052.     NEXT i%
  1053.  
  1054.  
  1055.  
  1056. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1057. FUNCTION itemFitsEquipmentSlot% (indexOfSlot%)
  1058.     SELECT CASE indexOfSlot% ' we are checking where you wanna put the item
  1059.         CASE 0 ' head
  1060.             IF inHand.kind = 13 THEN itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION ' if you holding a helm
  1061.         CASE 1 ' neck
  1062.             IF inHand.kind = 17 AND inHand.lvl >= 2 THEN itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION
  1063.         CASE 2 ' right hand
  1064.             SELECT CASE inHand.kind
  1065.                 CASE 4, 5, 6, 9, 15: itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION 'if in hand you have: swords,axes,throws,bombs or wands
  1066.                 CASE 7, 8 ' if a bow or crossbow in hand
  1067.                     IF Pocket(4).kind <> -1 THEN '& left hand is occupied
  1068.                         printHUDpromt "Left hand is occupied"
  1069.                     ELSE
  1070.                         itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION
  1071.                     END IF
  1072.             END SELECT
  1073.         CASE 3 ' torso
  1074.             IF inHand.kind = 12 THEN itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION ' if you holding an armor
  1075.         CASE 4 ' left hand
  1076.             SELECT CASE inHand.kind
  1077.                 CASE 14 ' if you have a shield in hand
  1078.                     IF (Pocket(2).kind = 7 OR Pocket(2).kind = 8) THEN ' &  on right hand you have a two handed weapon
  1079.                         printHUDpromt "Can't use it with a two handed weapon"
  1080.                     ELSE
  1081.                         itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION
  1082.                     END IF
  1083.                 CASE 10 'and you have arrows in hand
  1084.                     IF Pocket(2).kind = 7 THEN '  & a bow equiped
  1085.                         itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION
  1086.                     ELSE
  1087.                         printHUDpromt "You need to equip a bow"
  1088.                     END IF
  1089.                 CASE 11 ' if you have a bolts in hand
  1090.                     IF Pocket(2).kind = 8 THEN ' and a crossbow equiped
  1091.                         itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION
  1092.                     ELSE
  1093.                         printHUDpromt "You need to equip a crossbow"
  1094.                     END IF
  1095.             END SELECT
  1096.         CASE 5, 6 ' fingers
  1097.             IF inHand.kind = 17 AND inHand.lvl <= 1 THEN itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION
  1098.     END SELECT
  1099.  
  1100.     itemFitsEquipmentSlot% = FALSE
  1101.  
  1102. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1103. SUB itemInformation (whichOfTheSlots%) ' organize a bit this later
  1104.  
  1105.     DIM kindOfItem%
  1106.     DIM lvlOfItem%
  1107.     DIM specialOfItem$
  1108.     DIM tmp$
  1109.  
  1110.     kindOfItem% = Pocket(whichOfTheSlots%).kind
  1111.     lvlOfItem% = Pocket(whichOfTheSlots%).lvl
  1112.     specialOfItem$ = Pocket(whichOfTheSlots%).special
  1113.  
  1114.     IF whichOfTheSlots% < 7 AND kindOfItem% = -1 THEN
  1115.         SELECT CASE whichOfTheSlots%
  1116.             CASE 0: tmp$ = "Head"
  1117.             CASE 1: tmp$ = "Neck"
  1118.             CASE 2: tmp$ = "Right hand"
  1119.             CASE 3: tmp$ = "Torso"
  1120.             CASE 4: tmp$ = "Left hand"
  1121.             CASE 5: tmp$ = "Right finger"
  1122.             CASE 6: tmp$ = "Left finger"
  1123.         END SELECT
  1124.     ELSE
  1125.         tmp$ = nameAnItem$(kindOfItem%, lvlOfItem%, specialOfItem$)
  1126.     END IF
  1127.     LOCATE 20, 40 - (LEN(tmp$) \ 2)
  1128.     PRINT tmp$;
  1129.  
  1130.     tmp$ = "" ' kill me after testing!!!!!!!
  1131.     SELECT CASE kindOfItem%
  1132.         CASE 0 'keys
  1133.             tmp$ = "Opens some door"
  1134.         CASE 1 ' potions
  1135.             tmp$ = "Heals" + STR$((lvlOfItem% + 1) * 5) + " points"
  1136.         CASE 2 ' papers
  1137.             '?
  1138.         CASE 3 'books
  1139.             tmp$ = "Learn about this spell"
  1140.         CASE 4, 5, 7, 8, 15 ' weapons
  1141.             'PRINT "Damage:"; Pocket(whichOfTheSlots%).minDmg; " -"; Pocket(whichOfTheSlots%).maxDmg
  1142.         CASE 6, 9, 10, 11 'ammunitions + throws
  1143.             'PRINT "Damage:"; Pocket(whichOfTheSlots%).minDmg; " -"; Pocket(whichOfTheSlots%).maxDmg; " , Ammount:"; Pocket(whichOfTheSlots%).ammount
  1144.         CASE 12, 13, 14 ' armors, helms & shields
  1145.             tmp$ = "Defense:" + STR$(calculateItemDefense%(kindOfItem%, lvlOfItem%, specialOfItem$))
  1146.         CASE 16 ' money
  1147.             tmp$ = "Ammount:" + STR$(Pocket(whichOfTheSlots%).ammount)
  1148.         CASE 17 ' jewlery
  1149.             IF lvlOfItem% < 2 THEN
  1150.                 tmp$ = "You can wear it on your finger"
  1151.             ELSE
  1152.                 tmp$ = "You can wear it on your neck"
  1153.             END IF
  1154.     END SELECT
  1155.     LOCATE 21, 40 - (LEN(tmp$) \ 2)
  1156.     PRINT tmp$;
  1157.  
  1158.     tmp$ = "" ' kill me after testing!!!!!!!
  1159.     IF specialOfItem$ <> "" THEN
  1160.         IF NOT INSTR(specialOfItem$, "u") THEN ' adds to strenght
  1161.             tmp$ = "+" + RIGHT$(specialOfItem$, 1) + " to "
  1162.             IF INSTR(specialOfItem$, "s") THEN ' adds to strenght
  1163.                 tmp$ = tmp$ + "strenght"
  1164.             ELSEIF INSTR(specialOfItem$, "a") THEN ' adds to agility
  1165.                 tmp$ = tmp$ + "agility"
  1166.             ELSEIF INSTR(specialOfItem$, "p") THEN ' adds to power
  1167.                 tmp$ = tmp$ + "power"
  1168.             ELSEIF INSTR(specialOfItem$, "v") THEN ' adds to vigor
  1169.                 tmp$ = tmp$ + "vigor"
  1170.             ELSEIF INSTR(specialOfItem$, "d") THEN ' adds to defense
  1171.                 tmp$ = tmp$ + "defense"
  1172.             ELSEIF INSTR(specialOfItem$, "t") THEN ' adds to defense
  1173.                 tmp$ = ""
  1174.             END IF
  1175.         ELSE
  1176.             tmp$ = ""
  1177.         END IF
  1178.     ELSE
  1179.         tmp$ = ""
  1180.     END IF
  1181.  
  1182.     LOCATE 22, 40 - (LEN(tmp$) \ 2)
  1183.     PRINT tmp$;
  1184.  
  1185. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1186. SUB equipOurHero () ' remove test items
  1187.     SELECT CASE Hero.class
  1188.         CASE "Barbarian" ' you get an axe, a shield, a potion and 100$
  1189.             createItemInPocket 5, 0, 1, 2, "" ' axe
  1190.             createItemInPocket 14, 0, 1, 4, "" ' shield
  1191.             createItemInPocket 1, 0, 1, 21, "" ' potion
  1192.             createItemInPocket 16, 0, 100, 22, "" ' 100 coins
  1193.  
  1194.  
  1195.  
  1196.  
  1197.             '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°TESTING
  1198.             createItemInPocket 12, 2, 1, 7, "a2" '  armor
  1199.             createItemInPocket 13, 3, 1, 8, "v3" '  helm
  1200.             createItemInPocket 7, 0, 1, 9, "" ' bow
  1201.             createItemInPocket 2, 3, 1, 10, "" ' map
  1202.             createItemInPocket 17, 0, 1, 11, "p2" ' ring
  1203.             createItemInPocket 10, 0, 50, 12, "" ' 50 arrows
  1204.             createItemInPocket 17, 2, 1, 13, "d2" ' SAID for test!!!!!!!!!!
  1205.             '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  1206.  
  1207.         CASE "Clerig" 'you get a sword, a shield, a potion and 100$
  1208.             createItemInPocket 4, 0, 1, 2, "" '     sword
  1209.             createItemInPocket 14, 0, 1, 4, "" '    shield
  1210.             createItemInPocket 16, 0, 100, 22, "" ' 100 coins
  1211.             createItemInPocket 1, 0, 1, 21, "" '    potion
  1212.         CASE "Assasin" ' you get a bow, 50 arrows, a potion and 100$
  1213.             createItemInPocket 7, 0, 1, 2, "" '     bow
  1214.             createItemInPocket 10, 0, 50, 4, "" '   50 arrows
  1215.             createItemInPocket 16, 0, 100, 22, "" ' 100 coins
  1216.             createItemInPocket 1, 0, 1, 21, "" '    potion
  1217.         CASE "Wizard" ' you get a wand, a book, a potion and 100$
  1218.             createItemInPocket 15, 0, 1, 2, "" '    wand
  1219.             createItemInPocket 16, 0, 100, 22, "" ' 100 coins
  1220.             createItemInPocket 1, 0, 1, 21, "" '    potion
  1221.             createItemInPocket 3, 0, 1, 20, "t0" '  book
  1222.     END SELECT
  1223. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1224.  
  1225. FUNCTION calculateHeroActualStrength% () '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û HERO Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  1226.     DIM i%
  1227.     DIM tmp%
  1228.     tmp% = 0
  1229.     FOR i% = 0 TO 6
  1230.         IF Pocket(i%).special <> "" AND INSTR(Pocket(i%).special, "s") THEN
  1231.             tmp% = tmp% + VAL(RIGHT$(Pocket(i%).special, 1))
  1232.         END IF
  1233.     NEXT i%
  1234.     calculateHeroActualStrength% = Hero.strength + tmp%
  1235. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1236. FUNCTION calculateHeroActualAgility% ()
  1237.     DIM i%
  1238.     DIM tmp%
  1239.     tmp% = 0
  1240.     FOR i% = 0 TO 6
  1241.         IF Pocket(i%).special <> "" AND INSTR(Pocket(i%).special, "a") THEN
  1242.             tmp% = tmp% + VAL(RIGHT$(Pocket(i%).special, 1))
  1243.         END IF
  1244.     NEXT i%
  1245.     calculateHeroActualAgility% = Hero.agility + tmp%
  1246. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1247. FUNCTION calculateHeroActualPower% ()
  1248.     DIM i%
  1249.     DIM tmp%
  1250.     tmp% = 0
  1251.     FOR i% = 0 TO 6
  1252.         IF Pocket(i%).special <> "" AND INSTR(Pocket(i%).special, "p") THEN
  1253.             tmp% = tmp% + VAL(RIGHT$(Pocket(i%).special, 1))
  1254.         END IF
  1255.     NEXT i%
  1256.     calculateHeroActualPower% = Hero.power + tmp%
  1257. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1258. FUNCTION calculateHeroActualVigor% ()
  1259.     DIM i%
  1260.     DIM tmp%
  1261.     tmp% = 0
  1262.     FOR i% = 0 TO 6
  1263.         IF Pocket(i%).special <> "" AND INSTR(Pocket(i%).special, "v") THEN
  1264.             tmp% = tmp% + VAL(RIGHT$(Pocket(i%).special, 1))
  1265.         END IF
  1266.     NEXT i%
  1267.     calculateHeroActualVigor% = Hero.vigor + tmp%
  1268. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1269. FUNCTION calculateHeroChanceToHit% ()
  1270.     DIM i%
  1271.     DIM tmp%
  1272.     tmp% = 0
  1273.     FOR i% = 0 TO 6
  1274.         IF Pocket(i%).special <> "" AND INSTR(Pocket(i%).special, "c") THEN
  1275.             tmp% = tmp% + (VAL(RIGHT$(Pocket(i%).special, 1)) * 7)
  1276.         END IF
  1277.     NEXT i%
  1278.     calculateHeroChanceToHit% = INT(calculateHeroActualAgility * 1.25) + 20 + tmp%
  1279. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1280. FUNCTION calculateHeroDefense% ()
  1281.     DIM i%
  1282.     DIM tmp%
  1283.     tmp% = 0
  1284.     FOR i% = 0 TO 6
  1285.         tmp% = tmp% + calculateItemDefense%(Pocket(i%).kind, Pocket(i%).lvl, Pocket(i%).special)
  1286.     NEXT i%
  1287.     calculateHeroDefense% = tmp%
  1288. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1289. FUNCTION calculateHeroBaseDmg% () 'i should watch the case of no ammo, returning 0 IN PROCCES
  1290.     DIM i%
  1291.     DIM tmp%
  1292.     tmp% = 0
  1293.     IF NOT Pocket(2).kind = -1 THEN ' you need to have something in hand. Could better be pocket(2&4).ammount to be checked, for the ammo case
  1294.         FOR i% = 0 TO 6
  1295.             tmp% = tmp% + calculateItemBaseDmg%(Pocket(i%).kind, Pocket(i%).lvl, Pocket(i%).special)
  1296.         NEXT i%
  1297.     END IF
  1298.     calculateHeroBaseDmg% = tmp%
  1299. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1300. FUNCTION calculateHeroMaxDmg% () ' i should watch the case of no ammo, returning 0
  1301.     DIM i%
  1302.     DIM tmp%
  1303.     tmp% = 0
  1304.     IF NOT Pocket(2).kind = -1 THEN
  1305.         FOR i% = 0 TO 6
  1306.             tmp% = tmp% + calculateItemMaxDmg%(Pocket(i%).kind, Pocket(i%).lvl, Pocket(i%).special)
  1307.         NEXT i%
  1308.     END IF
  1309.     calculateHeroMaxDmg% = tmp%
  1310. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1311. FUNCTION calculateMaxLife% ()
  1312.     calculateMaxLife% = INT(calculateHeroActualVigor% * 2.75)
  1313. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1314. FUNCTION calculateMaxMana% ()
  1315.     calculateMaxMana% = INT(calculateHeroActualPower% * 3.25)
  1316. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1317. SUB drawHero ()
  1318.     IF Hero.lvl < 6 THEN
  1319.         SELECT CASE Hero.class
  1320.             CASE "Barbarian": Hero.image = HeroImg&(0)
  1321.             CASE "Clerig": Hero.image = HeroImg&(1)
  1322.             CASE "Assasin": Hero.image = HeroImg&(3)
  1323.             CASE "Wizard": Hero.image = HeroImg&(6)
  1324.         END SELECT
  1325.     ELSE
  1326.         SELECT CASE Hero.class
  1327.             CASE "Barbarian": Hero.image = HeroImg&(2)
  1328.             CASE "Clerig": Hero.image = HeroImg&(5)
  1329.             CASE "Assasin": Hero.image = HeroImg&(4)
  1330.             CASE "Wizard": Hero.image = HeroImg&(7)
  1331.         END SELECT
  1332.     END IF
  1333.     _PUTIMAGE (Hero.x, Hero.y), Hero.image
  1334. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1335.  
  1336.  
  1337. SUB drawEnemies () '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û ENEMIES Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  1338.     FOR i% = 0 TO UBOUND(Enemy)
  1339.         IF Enemy(i%).map = actualMapWorking% THEN
  1340.             _PUTIMAGE (Enemy(i%).x, Enemy(i%).y), EnemyImg&(Enemy(i%).lvl)
  1341.         END IF
  1342.     NEXT i%
  1343. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1344. FUNCTION calculateEnemyBaseDmg% (lvl%) ' INCOMPLETE
  1345.     calculateEnemyBaseDmg% = (lvl% + 1)
  1346. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1347. FUNCTION calculateEnemyScore% (lvl%) ' UNDONE
  1348. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1349.  
  1350. SUB loadEnemiesInitialVariables () ' <---- I SHOULD RANDOM CREATE THEM AND THEIR ARRAY SHOULD ONLY BE FOR THE ONES ON actualMapWorking%  , the rest should be on file .txt
  1351.     Enemy(0).map = 0
  1352.     Enemy(0).x = 8 * 32
  1353.     Enemy(0).y = 2 * 32 + 32
  1354.     Enemy(0).lvl = 0
  1355.     Enemy(0).life = 8
  1356.  
  1357.     Enemy(1).map = 0
  1358.     Enemy(1).x = 5 * 32
  1359.     Enemy(1).y = 2 * 32 + 32
  1360.     Enemy(1).lvl = 0
  1361.     Enemy(1).life = 8
  1362.  
  1363.     Enemy(2).map = 1
  1364.     Enemy(2).x = 7 * 32
  1365.     Enemy(2).y = 8 * 32 + 32
  1366.     Enemy(2).lvl = 0
  1367.     Enemy(2).life = 8
  1368.  
  1369. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1370.  
  1371. FUNCTION nameAnEnemy$ (lvl%)
  1372.     SELECT CASE lvl%
  1373.         CASE 0: nameAnEnemy$ = "rat"
  1374.         CASE 1: nameAnEnemy$ = "spiders"
  1375.         CASE 2: nameAnEnemy$ = "lizard"
  1376.         CASE 3: nameAnEnemy$ = "tarantula"
  1377.         CASE 4: nameAnEnemy$ = "frog"
  1378.         CASE 5: nameAnEnemy$ = "beatle"
  1379.         CASE 6: nameAnEnemy$ = "bug"
  1380.         CASE 7: nameAnEnemy$ = "dragon"
  1381.         CASE 8: nameAnEnemy$ = "living mushrooms"
  1382.         CASE 9: nameAnEnemy$ = "rabbit"
  1383.         CASE 10: nameAnEnemy$ = "small bat"
  1384.         CASE 11: nameAnEnemy$ = "big bat"
  1385.         CASE 12: nameAnEnemy$ = "snake"
  1386.         CASE 13: nameAnEnemy$ = "wolf"
  1387.         CASE 14: nameAnEnemy$ = "jabali"
  1388.         CASE 15: nameAnEnemy$ = "bear"
  1389.         CASE 16: nameAnEnemy$ = "stuffs"
  1390.         CASE 17: nameAnEnemy$ = "big stuff"
  1391.         CASE 18: nameAnEnemy$ = "scorpion"
  1392.         CASE 19: nameAnEnemy$ = "octopus"
  1393.         CASE 20: nameAnEnemy$ = "vampire"
  1394.         CASE 21: nameAnEnemy$ = "mummy"
  1395.         CASE 22: nameAnEnemy$ = "ghost"
  1396.         CASE 23: nameAnEnemy$ = "hidra"
  1397.         CASE 24: nameAnEnemy$ = "goblin"
  1398.         CASE 25: nameAnEnemy$ = "zombie"
  1399.         CASE 26: nameAnEnemy$ = "skeleton"
  1400.         CASE 27: nameAnEnemy$ = "orc"
  1401.         CASE 28: nameAnEnemy$ = "ciclope"
  1402.         CASE 29: nameAnEnemy$ = "baron of hell"
  1403.         CASE 30: nameAnEnemy$ = "stone golem"
  1404.         CASE 31: nameAnEnemy$ = "Lord of the Dark"
  1405.     END SELECT
  1406. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1407. SUB enemiesTurns () ' INCOMPLETE
  1408.     DIM lastInfortaionOfWhatHappened$
  1409.     lastInfortaionOfWhatHappened$ = ""
  1410.     FOR i% = 0 TO UBOUND(Enemy)
  1411.         IF Enemy(i%).map = actualMapWorking% THEN
  1412.             DO
  1413.                 _LIMIT 60
  1414.                 CLS
  1415.                 drawMyFantasy
  1416.                 getMouseData
  1417.  
  1418.                 IF clockForFantasy% > 0 THEN
  1419.                     clockForFantasy% = clockForFantasy% - 1
  1420.                 ELSE
  1421.                     clockForFantasy% = 120
  1422.                     enemyAI i%
  1423.                     '!!!!!! <-------------------------------------------------i should also place here the SUB for the enemy throwing attacks
  1424.                     'SOUND 440, 1
  1425.                 END IF
  1426.                 doWithFinger
  1427.                 _DISPLAY
  1428.             LOOP UNTIL clockForFantasy% = 120
  1429.         END IF
  1430.         IF i% = UBOUND(Enemy) THEN gameTurn% = -1
  1431.     NEXT i%
  1432. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1433. SUB enemyAI (enemyFromArray%) '<------------- I must build the AI for enemies' cosider particular cases later
  1434.  
  1435.  
  1436. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1437. FUNCTION enemySearchHero% (i%)
  1438.     IF Enemy(indexFromArray%).x <> Hero.x THEN
  1439.         IF Enemy(i%).x > Hero.x THEN Enemy(i%).x = Enemy(i%).x - 32
  1440.         IF Enemy(i%).x < Hero.x THEN Enemy(i%).x = Enemy(i%).x + 32
  1441.     END IF
  1442.  
  1443.     IF Enemy(indexFromArray%).y <> Hero.y THEN
  1444.  
  1445.     END IF
  1446.  
  1447.  
  1448.  
  1449. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1450.  
  1451. SUB drawMechs () '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û WORLD & MECHS Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  1452.     _PUTIMAGE (Mechs(0).x, Mechs(0).y), UtileryImg&(5) ' PROVISORY
  1453.  
  1454. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1455.  
  1456. SUB drawMap () ' <-Have to hard code the maps... if i could came up with a random generator... geez
  1457.  
  1458.     DIM tmp%
  1459.  
  1460.     IF lastMapWorking% <> actualMapWorking% THEN '                  check if map has changed
  1461.         IF _FILEEXISTS(".\worlds4.txt") THEN '                       if map has changed we need to read again the maps file
  1462.             OPEN "worlds4.txt" FOR INPUT AS #4 '                     ok, file found, we get ready to go
  1463.             INPUT #4, tmp% '                                        we need to check the fist data to see if matchs the actualmapworking
  1464.             WHILE tmp% <> actualMapWorking% '                   ¿
  1465.                 FOR k% = 0 TO 279 '   ¿                         ³ keep checking untill
  1466.                     INPUT #4, tmp% '  Â³ waste the unneeded data ³ we found the map
  1467.                 NEXT k% '             ¾                         ³ we are in
  1468.                 INPUT #4, tmp% ' check again the first number   ³
  1469.             WEND '                                              Â¾
  1470.             FOR j% = 0 TO 13 '                   ¿
  1471.                 FOR i% = 0 TO 19 '               ³ when found
  1472.                     INPUT #4, tmp% '             ³ load the data
  1473.                     WorldTiles%%(i%, j%) = tmp% ' ³
  1474.                 NEXT i% '                        Â³
  1475.             NEXT j% '                            Â¾
  1476.             CLOSE #4 '                            Â¿ and leave
  1477.             lastMapWorking% = actualMapWorking% ' ¾
  1478.         ELSE '
  1479.             fatalError "worlds4.txt"
  1480.         END IF '
  1481.     END IF ' end of map check
  1482.  
  1483.     FOR j% = 0 TO 13 '                                                          Â¿
  1484.         FOR i% = 0 TO 19 '                                                      Â³
  1485.             _PUTIMAGE (i% * 32, j% * 32 + 32), WorldImg&(WorldTiles%%(i%, j%)) ' ³ actual drawing
  1486.         NEXT i% '                                                               ³
  1487.     NEXT j% '                                                                   ¾
  1488.  
  1489. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1490. SUB loadMechsInitialVariables () ' PROVISORY, load them from a CSV as maps later
  1491.  
  1492.     Mechs(0).x = 128
  1493.     Mechs(0).y = 128
  1494.     Mechs(0).kind = 0
  1495.     Mechs(0).map = 0
  1496.     Mechs(0).state = 0
  1497.  
  1498. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1499. SUB getMouseData () ''°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û PLAYER INPUTS Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  1500.  
  1501.     DO WHILE _MOUSEINPUT: LOOP '               ¿
  1502.     Finger.x = _MOUSEX '                       ³ get
  1503.     Finger.y = _MOUSEY '                       ³ mouse
  1504.     Finger.tmpClickL = _MOUSEBUTTON(1) '       ³ info
  1505.     Finger.tmpClickR = _MOUSEBUTTON(2) '       Ù
  1506.  
  1507.     IF Finger.tmpClickL AND NOT Finger.oldClickL THEN '¿
  1508.         Finger.clickL = TRUE '                            Â³ DEBOUNCE
  1509.     ELSE '                                             ³ LEFT
  1510.         Finger.clickL = FALSE '                            Â³ CLICK
  1511.     END IF '                                           ³
  1512.     Finger.oldClickL = Finger.tmpClickL '              Ã™
  1513.  
  1514.     IF Finger.tmpClickR AND NOT Finger.oldClickR THEN '¿
  1515.         Finger.clickR = TRUE '                            Â³ DEBOUNCE
  1516.     ELSE '                                             ³ RIGHT
  1517.         Finger.clickR = FALSE '                            Â³ CLICK
  1518.     END IF '                                           ³
  1519.     Finger.oldClickR = Finger.tmpClickR '              Ã™
  1520.  
  1521.     inHand.x = Finger.x
  1522.     inHand.y = Finger.y
  1523.  
  1524. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1525. SUB playerInputs ()
  1526.     getMouseData
  1527.     keyboardInputs
  1528. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1529.  
  1530. SUB keyboardInputs () ' <-------------------------------------------------------No more keyboard inputs of any kind? Think in playability
  1531.  
  1532.     DIM keyPress$
  1533.  
  1534.     'only in game and if it's players turn
  1535.     'hold CTRL for throw an attack (long distance) YOU NEED TO HAVE A THROW WEAPON ON Pocket(2)!!!! AND AMMO IN Pocket(4)!!!! else should draw the cross, and if i can display "No ammo"... great. Also have to check the case of BOMBS & THROWS
  1536.     'hold SHIFT for launching same spell as before, if no spell "?" sign and HUDpromt, if no mana then cross and HUDpromt too
  1537.     'hold ALT to force a movement over an item instead of picking..... or maybe for the Rest One TURN ?
  1538.     'SPACEBAR could accelerate the action... maybe
  1539.     'P key could pause with SLEEP and HUDpromt "PAUSED Press any key to continue"
  1540.     'TAB for map
  1541.     '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  1542.     '° what's the best way for motion? ° numpad? QWEASDZXC? some way with
  1543.     '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  1544.     'F1 for help
  1545.     'F2 for new game
  1546.     'F3 for save game
  1547.     'F4 for load game
  1548.     'F5 for pause
  1549.     'number 1 for POCKET, 2 for SPELL, 3 for STATS
  1550.  
  1551.     'if TAB pressed and MAP is on pocket then SHOW MAP, press again and takes you back to the game
  1552.  
  1553.     keyPress$ = INKEY$
  1554.     IF keyPress$ <> "" THEN
  1555.  
  1556.         IF ASC(keyPress$) = 27 THEN
  1557.             SELECT CASE actualMenuWorking%
  1558.                 CASE 0
  1559.                     actualMenuWorking% = -4
  1560.  
  1561.                 CASE -1, -2, -3, -6, -7, -10: actualMenuWorking% = 0
  1562.                 CASE -4, -9
  1563.                     IF actualMapWorking% > -1 THEN
  1564.                         actualMenuWorking% = 0
  1565.                     ELSE
  1566.                         actualMenuWorking% = -4
  1567.                     END IF
  1568.             END SELECT
  1569.  
  1570.         END IF
  1571.  
  1572.     END IF
  1573. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1574. SUB closeWindowButton (x%, y%) '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û GENERAL PROGRAM Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  1575.     _PUTIMAGE (x%, y%), BonusImg&(0)
  1576.     IF fingerIsOnSurface%(x%, y%, 16, 16) AND inHand.lvl = -1 THEN
  1577.         printHUDpromt "Back to game"
  1578.         IF Finger.clickL THEN
  1579.             SELECT CASE actualMenuWorking%
  1580.                 CASE -1, -2, -3, -6, -7, -10: actualMenuWorking% = 0
  1581.                 CASE -4, -9
  1582.                     IF actualMapWorking% > -1 THEN
  1583.                         actualMenuWorking% = 0
  1584.                     ELSE
  1585.                         actualMenuWorking% = -4
  1586.                     END IF
  1587.             END SELECT
  1588.         END IF
  1589.     END IF
  1590. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1591. SUB drawHUD ()
  1592.  
  1593.     DIM lifeAsPercent%
  1594.     DIM manaAsPercent%
  1595.     DIM xpAsPercent%
  1596.  
  1597.     LINE (0, 0)-(639, 31), GREEN4, BF 'background line/box ¿
  1598.     LINE (0, 15)-(639, 15), GREEN1 '                       ³
  1599.     LOCATE 1, 17: PRINT CHR$(179); '¿                      Â³  BACK
  1600.     LOCATE 1, 34: PRINT CHR$(179); '³ separation           ³
  1601.     LOCATE 1, 55: PRINT CHR$(179); 'Ù lines                Ã™
  1602.  
  1603.     _PUTIMAGE (8, 0), BonusImg&(1) ' big heart image                      Â¿
  1604.     lifeAsPercent% = CINT((Hero.life * 100) / calculateMaxLife%) '        Â³
  1605.     drawFourHeartAsPercentage 32, 3, lifeAsPercent% '                     ³ HEALTH
  1606.     LOCATE 1, 10 ' written values on screen                               ³
  1607.     PRINT _TRIM$(STR$(Hero.life)); "/"; _TRIM$(STR$(calculateMaxLife%)); 'Ù
  1608.  
  1609.     _PUTIMAGE (144, 0), BonusImg&(6) ' big star image                     ¿
  1610.     manaAsPercent% = CINT((Hero.mana * 100) / calculateMaxMana%) '        Â³
  1611.     barShowingPercentage 160, 4, manaAsPercent% '                         ³  MANA
  1612.     LOCATE 1, 27 '                                                        Â³
  1613.     PRINT _TRIM$(STR$(Hero.mana)); "/"; _TRIM$(STR$(calculateMaxMana%)); 'Ù
  1614.  
  1615.     _PUTIMAGE (280, 0), FingerImg&(5) ' little flag image                                        Â¿
  1616.     xpAsPercent% = CINT(((Hero.xp - Hero.prevNextXp) * 100) / (Hero.nextXp - Hero.prevNextXp)) ' ³
  1617.     barShowingPercentage 296, 4, xpAsPercent% '                                                  Â³  EXPERIENCE
  1618.     LOCATE 1, 44 '                                                                               ³
  1619.     PRINT _TRIM$(STR$(Hero.xp)); "/"; _TRIM$(STR$(Hero.nextXp)); '                               Ù
  1620.  
  1621.     IF inHand.lvl = -1 AND gameTurn% = -1 THEN ' no items in hand, and it has to be your turn
  1622.         IF fingerIsOnSurface%(440, 0, 48, 16) THEN '                        Â¿
  1623.             printHUDpromt "Look at you inventory" '                         ³
  1624.             COLOR GREEN4, GREEN1 '                                          Â³
  1625.             IF Finger.clickL THEN actualMenuWorking% = -1 '                 ³
  1626.         ELSE '                                                              Â³ POCKET
  1627.             COLOR GREEN1, GREEN4 '                                          Â³
  1628.         END IF '                                                            Â³
  1629.         LOCATE 1, 56 '                                                      Â³
  1630.         PRINT "POCKET"; '                                                   Ù
  1631.  
  1632.         IF fingerIsOnSurface%(496, 0, 48, 16) THEN '                        Â¿
  1633.             printHUDpromt "Select a spell to perform" '                     ³
  1634.             COLOR GREEN4, GREEN1 '                                          Â³
  1635.             IF Finger.clickL THEN actualMenuWorking% = -2 '                 ³
  1636.         ELSE '                                                              Â³ SPELLS
  1637.             COLOR GREEN1, GREEN4 '                                          Â³
  1638.         END IF '                                                            Â³
  1639.         LOCATE 1, 63 '                                                      Â³
  1640.         PRINT "SPELLS"; '                                                   Ù
  1641.  
  1642.         IF fingerIsOnSurface%(552, 0, 40, 16) THEN '                        Â¿
  1643.             printHUDpromt "Character statistics" '                          Â³
  1644.             COLOR GREEN4, GREEN1 '                                          Â³
  1645.             IF Finger.clickL THEN actualMenuWorking% = -3 '                 ³
  1646.         ELSE '                                                              Â³ STATS
  1647.             COLOR GREEN1, GREEN4 '                                          Â³
  1648.         END IF '                                                            Â³
  1649.         LOCATE 1, 70 '                                                      Â³
  1650.         PRINT "STATS"; '                                                    Ã™
  1651.  
  1652.         IF fingerIsOnSurface%(600, 0, 32, 16) THEN '                        Â¿
  1653.             printHUDpromt "Game main menu" '                                Â³
  1654.             COLOR GREEN4, GREEN1 '                                          Â³
  1655.             IF Finger.clickL THEN actualMenuWorking% = -4 '                 ³
  1656.         ELSE '                                                              Â³ MENU
  1657.             COLOR GREEN1, GREEN4 '                                          Â³
  1658.         END IF '                                                            Â³
  1659.         LOCATE 1, 76 '                                                      Â³
  1660.         PRINT "MENU"; '                                                     Ù
  1661.     ELSE '                                 ¿
  1662.         COLOR GREEN1, GREEN4 '             ³ not players turn or
  1663.         LOCATE 1, 56 '                     ³ he's grabbing something,
  1664.         PRINT "POCKET SPELLS STATS MENU"; '³ decive him
  1665.     END IF '                               ¾
  1666.     LINE (0, 15)-(639, 15), GREEN1 ' divisory line
  1667.  
  1668.     IF Hero.attributePoints > 0 THEN lvlUpHUDButton 600, 17
  1669.  
  1670.     COLOR GREEN1, GREEN4 ' leave normal printing color before leaving, so we don't conflictuate with other stuff
  1671.  
  1672. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1673.  
  1674. SUB TESTER () ' <KILL ME AFTER TESTINGS>
  1675.     COLOR GREEN1, GREEN4
  1676.     LOCATE 27, 1
  1677.     PRINT (Finger.y \ 16) + 1; ","; (Finger.x \ 8) + 1
  1678.     LOCATE 28, 1
  1679.     PRINT "x="; Finger.x;
  1680.     LOCATE 29, 1
  1681.     PRINT "y="; Finger.y;
  1682.     PSET (Finger.x, Finger.y), _RGB32(255, 0, 0) '
  1683. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1684. SUB lvlUpHUDButton (x%, y%)
  1685.     _PUTIMAGE (x%, y%), LvlImg&(0)
  1686.     _PUTIMAGE (x% + 16, y%), DirArrowImg&(4)
  1687.     IF fingerIsOnSurface%(x%, y%, 32, 16) AND inHand.lvl = -1 THEN
  1688.         printHUDpromt "Increase your attributes"
  1689.         IF Finger.clickL THEN actualMenuWorking% = -3
  1690.     END IF
  1691. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1692. SUB showHistory (momentOfHistory%) 'dude, use your fantasy
  1693.     SELECT CASE momentOfHistory%
  1694.         CASE 0
  1695.             CLS , GREEN4
  1696.  
  1697.             LOCATE 2, 2
  1698.             COLOR GREEN1, GREEN4
  1699.             PRINT "This warrior history start here."
  1700.             _DISPLAY
  1701.             SLEEP
  1702.     END SELECT
  1703. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1704.  
  1705. SUB loadImages ()
  1706.  
  1707.     DIM MainImage& '¿ locals
  1708.     DIM i% '        Ã™
  1709.  
  1710.     IF _FILEEXISTS(".\fantasy1.png") THEN ' check if tileset is there                         CAN I CALL IT "fantasy1.fts"?   XD
  1711.  
  1712.         MainImage& = _LOADIMAGE(".\fantasy1.png", 32) ' load fantasy tileset in 32bit mode
  1713.  
  1714.         FOR i% = 0 TO 7
  1715.             LightImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                 ¿ light
  1716.             _PUTIMAGE (0, 0), MainImage&, LightImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31) '          Ã™
  1717.             WorldImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                 ¿
  1718.             _PUTIMAGE (0, 0), MainImage&, WorldImg&(i%), (i% * 32, 32)-(i% * 32 + 31, 63) '         ³ tiles for
  1719.             WorldImg&(i% + 8) = _NEWIMAGE(32, 32, 32) '                                             ³ the world
  1720.             _PUTIMAGE (0, 0), MainImage&, WorldImg&(i% + 8), (i% * 32, 64)-(i% * 32 + 31, 95) '     ³
  1721.             WorldImg&(i% + 16) = _NEWIMAGE(32, 32, 32) '                                            Â³
  1722.             _PUTIMAGE (0, 0), MainImage&, WorldImg&(i% + 16), (i% * 32, 96)-(i% * 32 + 31, 127) '   Ù
  1723.             PotionImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                Â¿ potions
  1724.             _PUTIMAGE (0, 0), MainImage&, PotionImg&(i%), (i% * 32, 160)-(i% * 32 + 31, 191) '      Ã™
  1725.             SwordImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                 ¿ swords
  1726.             _PUTIMAGE (0, 0), MainImage&, SwordImg&(i%), (i% * 32, 224)-(i% * 32 + 31, 255) '       Ù
  1727.             AxeImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                   ¿ axes
  1728.             _PUTIMAGE (0, 0), MainImage&, AxeImg&(i%), (i% * 32, 256)-(i% * 32 + 31, 287) '         Ù
  1729.             ArmorImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                 ¿ armors
  1730.             _PUTIMAGE (0, 0), MainImage&, ArmorImg&(i%), (i% * 32, 352)-(i% * 32 + 31, 383) '       Ù
  1731.             HelmImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                  Â¿ helms
  1732.             _PUTIMAGE (0, 0), MainImage&, HelmImg&(i%), (i% * 32, 384)-(i% * 32 + 31, 415) '        Ã™
  1733.             ShieldImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                Â¿ shields
  1734.             _PUTIMAGE (0, 0), MainImage&, ShieldImg&(i%), (i% * 32, 416)-(i% * 32 + 31, 447) '      Ã™
  1735.             WandImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                  Â¿ wands
  1736.             _PUTIMAGE (0, 0), MainImage&, WandImg&(i%), (i% * 32, 448)-(i% * 32 + 31, 479) '        Ã™
  1737.             HeroImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                  Â¿ heros
  1738.             _PUTIMAGE (0, 0), MainImage&, HeroImg&(i%), (i% * 32, 576)-(i% * 32 + 31, 607) '        Ã™
  1739.             EnemyImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                 ¿
  1740.             _PUTIMAGE (0, 0), MainImage&, EnemyImg&(i%), (i% * 32, 608)-(i% * 32 + 31, 639) '       ³
  1741.             EnemyImg&(i% + 8) = _NEWIMAGE(32, 32, 32) '                                             ³ enemies
  1742.             _PUTIMAGE (0, 0), MainImage&, EnemyImg&(i% + 8), (i% * 32, 640)-(i% * 32 + 31, 671) '   ³
  1743.             EnemyImg&(i% + 16) = _NEWIMAGE(32, 32, 32) '                                            Â³
  1744.             _PUTIMAGE (0, 0), MainImage&, EnemyImg&(i% + 16), (i% * 32, 672)-(i% * 32 + 31, 703) '  Â³
  1745.             EnemyImg&(i% + 24) = _NEWIMAGE(32, 32, 32) '                                            Â³
  1746.             _PUTIMAGE (0, 0), MainImage&, EnemyImg&(i% + 24), (i% * 32, 704)-(i% * 32 + 31, 735) '  Ã™
  1747.         NEXT i%
  1748.  
  1749.         FOR i% = 0 TO 10
  1750.             LvlImg&(i%) = _NEWIMAGE(16, 16, 32) '                                                   ¿ character
  1751.             _PUTIMAGE (0, 0), MainImage&, LvlImg&(i%), (i% * 16, 768)-(i% * 16 + 15, 783) '         Ù level
  1752.         NEXT i%
  1753.  
  1754.         FOR i% = 0 TO 2
  1755.             ThrowImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                 ¿ trhowable
  1756.             _PUTIMAGE (0, 0), MainImage&, ThrowImg&(i%), (i% * 32, 288)-(i% * 32 + 31, 319) '       Ù weapons
  1757.             BombImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                  Â¿ bombs
  1758.             _PUTIMAGE (0, 0), MainImage&, BombImg&(i%), (i% * 32, 320)-(i% * 32 + 31, 351) '        Ã™
  1759.             ArrowImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                 ¿ arrows
  1760.             _PUTIMAGE (0, 0), MainImage&, ArrowImg&(i%), (i% * 32 + 96, 320)-(i% * 32 + 127, 351) ' Ù (as weapon)
  1761.             FingerImg&(i%) = _NEWIMAGE(16, 16, 32) '                                                Â¿
  1762.             _PUTIMAGE (0, 0), MainImage&, FingerImg&(i%), (i% * 16, 736)-(i% * 16 + 15, 751) '      Â³ mouse
  1763.             FingerImg&(i% + 3) = _NEWIMAGE(16, 16, 32) '                                            Â³ pointers
  1764.             _PUTIMAGE (0, 0), MainImage&, FingerImg&(i% + 3), (i% * 16, 752)-(i% * 16 + 15, 767) '   Ù
  1765.         NEXT i%
  1766.  
  1767.         FOR i% = 0 TO 5
  1768.             KeysImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                Â¿ keys
  1769.             _PUTIMAGE (0, 0), MainImage&, KeysImg&(i%), (i% * 32 + 64, 128)-(i% * 32 + 95, 159) ' Ù
  1770.             UtileryImg&(i%) = _NEWIMAGE(32, 32, 32) '                                             ¿ utilery
  1771.             _PUTIMAGE (0, 0), MainImage&, UtileryImg&(i%), (i% * 32, 512)-(i% * 32 + 31, 543) '   Ù
  1772.             SpellImg&(i%) = _NEWIMAGE(32, 32, 32) '                                               ¿ spells
  1773.             _PUTIMAGE (0, 0), MainImage&, SpellImg&(i%), (i% * 32, 544)-(i% * 32 + 31, 575) '     Ù
  1774.             LifeImg&(i%) = _NEWIMAGE(8, 8, 32) '                                                  Â¿ hearts
  1775.             _PUTIMAGE (0, 0), MainImage&, LifeImg&(i%), (i% * 8, 784)-(i% * 8 + 7, 791) '         Ù
  1776.         NEXT i%
  1777.  
  1778.         FOR i% = 0 TO 12
  1779.             BonusImg&(i%) = _NEWIMAGE(16, 16, 32) '                                                Â¿ bonus
  1780.             _PUTIMAGE (0, 0), MainImage&, BonusImg&(i%), (i% * 16 + 48, 736)-(i% * 16 + 63, 751) ' Ù
  1781.             DirArrowImg&(i%) = _NEWIMAGE(16, 16, 32) '                                                Â¿ direction
  1782.             _PUTIMAGE (0, 0), MainImage&, DirArrowImg&(i%), (i% * 16 + 48, 752)-(i% * 16 + 63, 767) ' Ù arrows
  1783.         NEXT i%
  1784.  
  1785.         FOR i% = 0 TO 6
  1786.             ManaImg&(i%) = _NEWIMAGE(8, 8, 32) '                                          Â¿ mana bar
  1787.             _PUTIMAGE (0, 0), MainImage&, ManaImg&(i%), (i% * 8, 792)-(i% * 8 + 7, 799) ' Ù
  1788.         NEXT i%
  1789.  
  1790.         FOR i% = 0 TO 4
  1791.             BowImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                 ¿ bows &
  1792.             _PUTIMAGE (0, 0), MainImage&, BowImg&(i%), (i% * 32 + 96, 288)-(i% * 32 + 127, 319) ' Ù crossbows
  1793.         NEXT i%
  1794.  
  1795.         FOR i% = 0 TO 3
  1796.             PaperImg&(i%) = _NEWIMAGE(32, 32, 32) '                                           ¿ papers, map
  1797.             _PUTIMAGE (0, 0), MainImage&, PaperImg&(i%), (i% * 32, 192)-(i% * 32 + 31, 223) ' Ù & scrolls
  1798.             BookImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                  Â¿ books
  1799.             _PUTIMAGE (0, 0), MainImage&, BookImg&(i%), (i% * 32 + 128, 192)-(i% * 32 + 159, 223) ' Ù
  1800.             MoneyImg&(i%) = _NEWIMAGE(32, 32, 32) '                                           ¿ coins, gem
  1801.             _PUTIMAGE (0, 0), MainImage&, MoneyImg&(i%), (i% * 32, 480)-(i% * 32 + 31, 511) ' Ù & jewel
  1802.             JewelImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                  Â¿ rings &
  1803.             _PUTIMAGE (0, 0), MainImage&, JewelImg&(i%), (i% * 32 + 128, 480)-(i% * 32 + 159, 511) ' Ù neckless
  1804.         NEXT i%
  1805.  
  1806.         FOR i% = 0 TO 1
  1807.             ChestImg&(i%) = _NEWIMAGE(32, 32, 32) '                                           ¿ open &
  1808.             _PUTIMAGE (0, 0), MainImage&, ChestImg&(i%), (i% * 32, 128)-(i% * 32 + 31, 159) ' Ù closed chest
  1809.             SpearImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                  Â¿ spears
  1810.             _PUTIMAGE (0, 0), MainImage&, SpearImg&(i%), (i% * 32 + 192, 320)-(i% * 32 + 223, 351) ' Ù
  1811.             WonderImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                  Â¿ weird
  1812.             _PUTIMAGE (0, 0), MainImage&, WonderImg&(i%), (i% * 32 + 192, 512)-(i% * 32 + 223, 543) ' Ù things
  1813.             BannerImg&(i%) = _NEWIMAGE(32, 32, 32) '                                                  Â¿ banner
  1814.             _PUTIMAGE (0, 0), MainImage&, BannerImg&(i%), (i% * 32 + 192, 544)-(i% * 32 + 223, 575) ' Ù & sign
  1815.         NEXT i%
  1816.  
  1817.         _FREEIMAGE MainImage& ' clear tileset from memory
  1818.  
  1819.         BlankImg& = _NEWIMAGE(32, 32, 32)
  1820.  
  1821.     ELSE ' in case the file fantasy1.png is missing
  1822.  
  1823.         PRINT "ERROR: file "; CHR$(34); "fantasy1.png"; CHR$(34); " not found" '¿
  1824.         SLEEP ' wait for keystroke                                              Â³ ERROR CASE
  1825.         SYSTEM ' leave the program                                              Ã™
  1826.  
  1827.     END IF
  1828.  
  1829.  
  1830. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1831. SUB unloadImages ()
  1832.  
  1833.     DIM i% ' LOCAL
  1834.  
  1835.     FOR i% = 0 TO 31
  1836.         _FREEIMAGE EnemyImg&(i%)
  1837.     NEXT i%
  1838.     FOR i% = 0 TO 23
  1839.         _FREEIMAGE WorldImg&(i%)
  1840.     NEXT i%
  1841.     FOR i% = 0 TO 12
  1842.         _FREEIMAGE BonusImg&(i%): _FREEIMAGE DirArrowImg&(i%)
  1843.     NEXT i%
  1844.     FOR i% = 0 TO 10
  1845.         _FREEIMAGE LvlImg&(i%)
  1846.     NEXT i%
  1847.     FOR i% = 0 TO 7
  1848.         _FREEIMAGE LightImg&(i%): _FREEIMAGE PotionImg&(i%): _FREEIMAGE SwordImg&(i%): _FREEIMAGE AxeImg&(i%): _FREEIMAGE ArmorImg&(i%): _FREEIMAGE HelmImg&(i%): _FREEIMAGE ShieldImg&(i%): _FREEIMAGE WandImg&(i%): _FREEIMAGE HeroImg&(i%)
  1849.     NEXT i%
  1850.     FOR i% = 0 TO 6
  1851.         _FREEIMAGE ManaImg&(i%)
  1852.     NEXT i%
  1853.     FOR i% = 0 TO 5
  1854.         _FREEIMAGE FingerImg&(i%): _FREEIMAGE KeysImg&(i%): _FREEIMAGE UtileryImg&(i%): _FREEIMAGE SpellImg&(i%): _FREEIMAGE LifeImg&(i%)
  1855.     NEXT i%
  1856.     FOR i% = 0 TO 4
  1857.         _FREEIMAGE BowImg&(i%)
  1858.     NEXT i%
  1859.     FOR i% = 0 TO 3
  1860.         _FREEIMAGE PaperImg&(i%): _FREEIMAGE BookImg&(i%): _FREEIMAGE MoneyImg&(i%): _FREEIMAGE JewelImg&(i%)
  1861.     NEXT i%
  1862.     FOR i% = 0 TO 2
  1863.         _FREEIMAGE ThrowImg&(i%): _FREEIMAGE BombImg&(i%): _FREEIMAGE ArrowImg&(i%)
  1864.     NEXT i%
  1865.     FOR i% = 0 TO 1
  1866.         _FREEIMAGE ChestImg&(i%): _FREEIMAGE SpearImg&(i%): _FREEIMAGE WonderImg&(i%): _FREEIMAGE BannerImg&(i%)
  1867.     NEXT i%
  1868.     _FREEIMAGE BlankImg&
  1869.  
  1870. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1871. SUB loadProgramInitialVariables ()
  1872.  
  1873.     DIM i%
  1874.  
  1875.     actualMenuWorking% = -4 ' leading to the Opening Menu
  1876.     actualMapWorking% = -1 ' with no map yet
  1877.     gameTurn% = -1 ' the player's turn, monsters are from they direct array
  1878.     clockForFantasy% = 120 ' clock is loaded
  1879.     lastMapWorking% = actualMapWorking% 'for drawMap check
  1880.  
  1881.     'initialize mouse position
  1882.     Finger.x = 319
  1883.     Finger.y = 239
  1884.  
  1885.     ' EQUIPPED positions
  1886.     Pocket(0).x = 516: Pocket(0).y = 136 ' head
  1887.     Pocket(1).x = 556: Pocket(1).y = 147 ' neck
  1888.     Pocket(2).x = 472: Pocket(2).y = 188 ' right hand
  1889.     Pocket(3).x = 516: Pocket(3).y = 188 ' torso
  1890.     Pocket(4).x = 560: Pocket(4).y = 188 ' right hand
  1891.     Pocket(5).x = 481: Pocket(5).y = 234 'right finger
  1892.     Pocket(6).x = 550: Pocket(6).y = 234 'left finger
  1893.  
  1894.     '252,136 POCKET positions
  1895.     FOR i% = 7 TO 10
  1896.         Pocket(i%).x = 252 + (i% - 7) * 34
  1897.         Pocket(i%).y = 136
  1898.         Pocket(i% + 4).x = 252 + (i% - 7) * 34
  1899.         Pocket(i% + 4).y = 136 + 34
  1900.         Pocket(i% + 8).x = 252 + (i% - 7) * 34
  1901.         Pocket(i% + 8).y = 136 + 68
  1902.         Pocket(i% + 12).x = 252 + (i% - 7) * 34
  1903.         Pocket(i% + 12).y = 136 + 102
  1904.     NEXT i%
  1905.  
  1906.     'let's also set some variables of the hand
  1907.     inHand.x = Finger.x
  1908.     inHand.y = Finger.y
  1909.     cleanYourHand
  1910.  
  1911.     FOR i% = 0 TO 22 '        Â¿
  1912.         Pocket(i%).map = -1 ' ³ during all game .map for
  1913.     NEXT i% '                 ³ pocket and inHand is always -1
  1914.     inHand.map = -1 '         ¾
  1915.  
  1916. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1917. SUB drawItemSlots (begX, begY)
  1918.     LINE (begX, begY)-(begX + 32, begY + 32), GREEN1, B
  1919.     LINE (begX + 1, begY + 1)-(begX + 31, begY + 31), GREEN2, BF
  1920. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1921. SUB drawFourHeartAsPercentage (x%, y%, percent%)
  1922.     IF percent% > 99 THEN '                    Â¿
  1923.         _PUTIMAGE (x%, y%), LifeImg&(0) '      Â³ full
  1924.         _PUTIMAGE (x% + 8, y%), LifeImg&(0) '  Â³ health
  1925.         _PUTIMAGE (x% + 16, y%), LifeImg&(0) ' ³
  1926.         _PUTIMAGE (x% + 24, y%), LifeImg&(0) ' Ù
  1927.     ELSEIF percent% > 74 THEN '                                  Â¿
  1928.         _PUTIMAGE (x%, y%), LifeImg&(0) '                        Â³
  1929.         _PUTIMAGE (x% + 8, y%), LifeImg&(0) '                    Â³
  1930.         _PUTIMAGE (x% + 16, y%), LifeImg&(0) '                   ³ 99 to 75 %
  1931.         SELECT CASE percent% '                                   ³ health
  1932.             CASE 95 TO 99: _PUTIMAGE (x% + 24, y%), LifeImg&(1) '³
  1933.             CASE 90 TO 94: _PUTIMAGE (x% + 24, y%), LifeImg&(2) '³
  1934.             CASE 85 TO 89: _PUTIMAGE (x% + 24, y%), LifeImg&(3) '³
  1935.             CASE 80 TO 84: _PUTIMAGE (x% + 24, y%), LifeImg&(4) '³
  1936.             CASE 75 TO 79: _PUTIMAGE (x% + 24, y%), LifeImg&(5) '³
  1937.         END SELECT '                                             Ù
  1938.     ELSEIF percent% > 49 THEN '                                  Â¿
  1939.         _PUTIMAGE (x%, y%), LifeImg&(0) '                        Â³
  1940.         _PUTIMAGE (x% + 8, y%), LifeImg&(0) '                    Â³
  1941.         _PUTIMAGE (x% + 24, y%), LifeImg&(5) '                   ³
  1942.         SELECT CASE percent% '                                   ³ 74 to 50 %
  1943.             CASE 70 TO 74: _PUTIMAGE (x% + 16, y%), LifeImg&(1) '³ health
  1944.             CASE 65 TO 69: _PUTIMAGE (x% + 16, y%), LifeImg&(2) '³
  1945.             CASE 60 TO 64: _PUTIMAGE (x% + 16, y%), LifeImg&(3) '³
  1946.             CASE 55 TO 59: _PUTIMAGE (x% + 16, y%), LifeImg&(4) '³
  1947.             CASE 50 TO 54: _PUTIMAGE (x% + 16, y%), LifeImg&(5) '³
  1948.         END SELECT '                                             Ù
  1949.     ELSEIF percent% > 24 THEN '                                  Â¿
  1950.         _PUTIMAGE (x%, y%), LifeImg&(0) '                        Â³
  1951.         _PUTIMAGE (x% + 16, y%), LifeImg&(5) '                   ³
  1952.         _PUTIMAGE (x% + 24, y%), LifeImg&(5) '                   ³
  1953.         SELECT CASE percent% '                                   ³ 49 to 25 %
  1954.             CASE 45 TO 49: _PUTIMAGE (x% + 8, y%), LifeImg&(1) ' ³ health
  1955.             CASE 40 TO 44: _PUTIMAGE (x% + 8, y%), LifeImg&(2) ' ³
  1956.             CASE 35 TO 39: _PUTIMAGE (x% + 8, y%), LifeImg&(3) ' ³
  1957.             CASE 30 TO 34: _PUTIMAGE (x% + 8, y%), LifeImg&(4) ' ³
  1958.             CASE 25 TO 29: _PUTIMAGE (x% + 8, y%), LifeImg&(5) ' ³
  1959.         END SELECT '                                             Ù
  1960.     ELSE '                                                       ¿
  1961.         _PUTIMAGE (x% + 8, y%), LifeImg&(5) '                    Â³
  1962.         _PUTIMAGE (x% + 16, y%), LifeImg&(5) '                   ³
  1963.         _PUTIMAGE (x% + 24, y%), LifeImg&(5) '                   ³
  1964.         SELECT CASE percent% '                                   ³ 25 to 0 %
  1965.             CASE 20 TO 24: _PUTIMAGE (x%, y%), LifeImg&(1) '     ³ health
  1966.             CASE 15 TO 19: _PUTIMAGE (x%, y%), LifeImg&(2) '     ³
  1967.             CASE 10 TO 14: _PUTIMAGE (x%, y%), LifeImg&(3) '     ³
  1968.             CASE 5 TO 9: _PUTIMAGE (x%, y%), LifeImg&(4) '       ³
  1969.             CASE 0 TO 4: _PUTIMAGE (x%, y%), LifeImg&(5) '       ³
  1970.         END SELECT '                                             ³
  1971.     END IF '                                                     Ù
  1972.  
  1973. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1974. SUB printHUDpromt (whatDoIPrint$)
  1975.     IF actualMapWorking% <> -1 THEN
  1976.         LOCATE 2, 1 ' promt line position
  1977.         COLOR GREEN1, GREEN4 'always normal color for writing
  1978.         PRINT whatDoIPrint$;
  1979.     END IF
  1980. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1981. SUB barShowingPercentage (x%, y%, percent%)
  1982.  
  1983.     _PUTIMAGE (x%, y%), ManaImg&(0) ' opening bar
  1984.     _PUTIMAGE (x% + 40, y%), ManaImg&(6) ' closing bar
  1985.     '
  1986.     IF percent% > 99 THEN '                   ¿
  1987.         _PUTIMAGE (x% + 8, y%), ManaImg&(1) ' ³ 100%
  1988.         _PUTIMAGE (x% + 16, y%), ManaImg&(1) '³
  1989.         _PUTIMAGE (x% + 24, y%), ManaImg&(1) '³
  1990.         _PUTIMAGE (x% + 32, y%), ManaImg&(1) 'Ù
  1991.     ELSEIF percent% > 74 THEN '                                  Â¿
  1992.         _PUTIMAGE (x% + 8, y%), ManaImg&(1) '                    Â³
  1993.         _PUTIMAGE (x% + 16, y%), ManaImg&(1) '                   ³
  1994.         _PUTIMAGE (x% + 24, y%), ManaImg&(1) '                   ³
  1995.         SELECT CASE percent% '                                   ³ 99 to 75 %
  1996.             CASE 95 TO 99: _PUTIMAGE (x% + 32, y%), ManaImg&(1) '³
  1997.             CASE 90 TO 94: _PUTIMAGE (x% + 32, y%), ManaImg&(2) '³
  1998.             CASE 85 TO 89: _PUTIMAGE (x% + 32, y%), ManaImg&(3) '³
  1999.             CASE 80 TO 84: _PUTIMAGE (x% + 32, y%), ManaImg&(4) '³
  2000.             CASE 75 TO 79: _PUTIMAGE (x% + 32, y%), ManaImg&(5) '³
  2001.         END SELECT '                                             Ù
  2002.     ELSEIF percent% > 49 THEN '                                  Â¿
  2003.         _PUTIMAGE (x% + 8, y%), ManaImg&(1) '                    Â³
  2004.         _PUTIMAGE (x% + 16, y%), ManaImg&(1) '                   ³
  2005.         _PUTIMAGE (x% + 32, y%), ManaImg&(5) '                   ³ 74 to 50 %
  2006.         SELECT CASE percent% '                                   ³
  2007.             CASE 70 TO 74: _PUTIMAGE (x% + 24, y%), ManaImg&(1) '³
  2008.             CASE 65 TO 69: _PUTIMAGE (x% + 24, y%), ManaImg&(2) '³
  2009.             CASE 60 TO 64: _PUTIMAGE (x% + 24, y%), ManaImg&(3) '³
  2010.             CASE 55 TO 59: _PUTIMAGE (x% + 24, y%), ManaImg&(4) '³
  2011.             CASE 50 TO 54: _PUTIMAGE (x% + 24, y%), ManaImg&(5) '³
  2012.         END SELECT '                                             Ù
  2013.     ELSEIF percent% > 24 THEN '                                  Â¿
  2014.         _PUTIMAGE (x% + 8, y%), ManaImg&(1) '                    Â³
  2015.         _PUTIMAGE (x% + 24, y%), ManaImg&(5) '                   ³
  2016.         _PUTIMAGE (x% + 32, y%), ManaImg&(5) '                   ³
  2017.         SELECT CASE percent% '                                   ³ 49 to 25 %
  2018.             CASE 45 TO 49: _PUTIMAGE (x% + 16, y%), ManaImg&(1) '³
  2019.             CASE 40 TO 44: _PUTIMAGE (x% + 16, y%), ManaImg&(2) '³
  2020.             CASE 35 TO 39: _PUTIMAGE (x% + 16, y%), ManaImg&(3) '³
  2021.             CASE 30 TO 34: _PUTIMAGE (x% + 16, y%), ManaImg&(4) '³
  2022.             CASE 25 TO 29: _PUTIMAGE (x% + 16, y%), ManaImg&(5) '³
  2023.         END SELECT '                                             Ù
  2024.     ELSE '                                                       ¿
  2025.         _PUTIMAGE (x% + 16, y%), ManaImg&(5) '                   ³
  2026.         _PUTIMAGE (x% + 24, y%), ManaImg&(5) '                   ³
  2027.         _PUTIMAGE (x% + 32, y%), ManaImg&(5) '                   ³
  2028.         SELECT CASE percent% '                                   ³
  2029.             CASE 20 TO 24: _PUTIMAGE (x% + 8, y%), ManaImg&(1) ' ³ 25 to 0 %
  2030.             CASE 15 TO 19: _PUTIMAGE (x% + 8, y%), ManaImg&(2) ' ³
  2031.             CASE 10 TO 14: _PUTIMAGE (x% + 8, y%), ManaImg&(3) ' ³
  2032.             CASE 5 TO 9: _PUTIMAGE (x% + 8, y%), ManaImg&(4) '   ³
  2033.             CASE 0 TO 4: _PUTIMAGE (x% + 8, y%), ManaImg&(5) '   ³
  2034.         END SELECT '                                             ³
  2035.     END IF '                                                     Ù
  2036.  
  2037. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2038. SUB drawMenuBack (strX, strY, endX, endY)
  2039.     LINE (strX - 3, strY - 3)-(endX + 3, endY + 3), GREEN1, B
  2040.     LINE (strX - 2, strY - 2)-(endX + 2, endY + 2), GREEN2, B
  2041.     LINE (strX - 1, strY - 1)-(endX + 1, endY + 1), GREEN3, B
  2042.     LINE (strX, strY)-(endX, endY), GREEN4, BF
  2043. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2044. SUB fatalError (fileNotFound$)
  2045.     CLS , GREEN4
  2046.     LOCATE 2, 2
  2047.     COLOR GREEN1, GREEN4
  2048.     PRINT "Fatal error: file " + fileNotFound$ + " not found"
  2049.     SLEEP
  2050.     unloadImages
  2051.     SYSTEM
  2052. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2053. SUB drawMyFantasy ()
  2054.     drawMap
  2055.     'drawPortals
  2056.     'drawItemsOnGround
  2057.     drawMechs
  2058.     drawHero
  2059.     drawEnemies
  2060.     drawHUD
  2061. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2062. FUNCTION fingerIsOnSurface% (begX%, begY%, imagePixelsX%, imagePixelsY%)
  2063.     IF ((Finger.x >= begX% AND Finger.x <= begX% + (imagePixelsX% - 1)) AND (Finger.y >= begY% AND Finger.y <= begY% + (imagePixelsY% - 1))) THEN
  2064.         fingerIsOnSurface% = TRUE
  2065.     ELSE
  2066.         fingerIsOnSurface% = FALSE
  2067.     END IF
  2068. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2069.  
  2070.  
  2071. SUB doWithFinger () '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û ACTION PERFORMING Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  2072.  
  2073.     DIM sector%
  2074.     DIM priority%
  2075.  
  2076.     SELECT CASE actualMenuWorking%
  2077.         CASE 0
  2078.             IF gameTurn% = -1 THEN ' if it's the player turn
  2079.  
  2080.                 IF Finger.y > 31 THEN ' if Finger is in on the gameboard
  2081.                     sector% = checkFingerSector% ' lets get the playable sector where the Finger is
  2082.                     priority% = checkPriorityAtSector%(sector%)
  2083.                 END IF
  2084.                 '
  2085.                 SELECT CASE priority% '
  2086.                     '
  2087.                     CASE 0 ' there's nothing important (out of playable area)
  2088.                         _PUTIMAGE (Finger.x - 1, Finger.y - 1), FingerImg&(0) ' normal finger
  2089.  
  2090.  
  2091.                     CASE 1 ' there's an enemy
  2092.                         _PUTIMAGE (Finger.x - 1, Finger.y - 1), BonusImg&(3), , (16, 0)-(0, 16) ' attack mouse
  2093.                         printHUDpromt "Attack enemy"
  2094.                     CASE 2 'checkForMechs
  2095.  
  2096.                     CASE 3 'checkForItems
  2097.  
  2098.                     CASE 4 'checkForWorld
  2099.                         allowedMotions sector%
  2100.  
  2101.  
  2102.                 END SELECT
  2103.  
  2104.             ELSE ' CPU turn
  2105.                 _PUTIMAGE (Finger.x - 1, Finger.y - 1), BonusImg&(7) ' sand clock
  2106.             END IF
  2107.         CASE -1 'in pocket
  2108.             itemManipulation
  2109.             IF inHand.lvl = -1 THEN
  2110.                 _PUTIMAGE (Finger.x - 1, Finger.y - 1), FingerImg&(0) ' normal finger
  2111.             ELSE
  2112.                 _PUTIMAGE (Finger.x - 8, Finger.y - 8), BonusImg&(2) ' grabbing hand
  2113.             END IF
  2114.         CASE ELSE
  2115.             _PUTIMAGE (Finger.x - 1, Finger.y - 1), FingerImg&(0) ' on a menu
  2116.     END SELECT
  2117.  
  2118. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2119. FUNCTION checkPriorityAtSector% (where%)
  2120.  
  2121.     DIM i%
  2122.  
  2123.     IF where% = 0 THEN '
  2124.         checkPriorityAtSector% = 0 '   Out of playable area
  2125.         EXIT FUNCTION '
  2126.     END IF '
  2127.  
  2128.     '1rst priority: ° ENEMIES °- - - - - - - - - - - - - - - - - - - - -
  2129.     FOR i% = 0 TO UBOUND(Enemy)
  2130.         IF Enemy(i%).map = actualMapWorking% THEN
  2131.             SELECT CASE where%
  2132.                 CASE 1
  2133.                     IF Enemy(i%).x = Hero.x - 32 AND Enemy(i%).y = Hero.y + 32 THEN
  2134.                         checkPriorityAtSector% = 1: EXIT FUNCTION
  2135.                     END IF
  2136.                 CASE 2
  2137.                     IF Enemy(i%).x = Hero.x AND Enemy(i%).y = Hero.y + 32 THEN
  2138.                         checkPriorityAtSector% = 1: EXIT FUNCTION
  2139.                     END IF
  2140.                 CASE 3
  2141.                     IF Enemy(i%).x = Hero.x + 32 AND Enemy(i%).y = Hero.y + 32 THEN
  2142.                         checkPriorityAtSector% = 1: EXIT FUNCTION
  2143.                     END IF
  2144.                 CASE 4
  2145.                     IF Enemy(i%).x = Hero.x - 32 AND Enemy(i%).y = Hero.y THEN
  2146.                         checkPriorityAtSector% = 1: EXIT FUNCTION
  2147.                     END IF
  2148.                 CASE 6
  2149.                     IF Enemy(i%).x = Hero.x + 32 AND Enemy(i%).y = Hero.y THEN
  2150.                         checkPriorityAtSector% = 1: EXIT FUNCTION
  2151.                     END IF
  2152.                 CASE 7
  2153.                     IF Enemy(i%).x = Hero.x - 32 AND Enemy(i%).y = Hero.y - 32 THEN
  2154.                         checkPriorityAtSector% = 1: EXIT FUNCTION
  2155.                     END IF
  2156.                 CASE 8
  2157.                     IF Enemy(i%).x = Hero.x AND Enemy(i%).y = Hero.y - 32 THEN
  2158.                         checkPriorityAtSector% = 1: EXIT FUNCTION
  2159.                     END IF
  2160.                 CASE 9
  2161.                     IF Enemy(i%).x = Hero.x + 32 AND Enemy(i%).y = Hero.y - 32 THEN
  2162.                         checkPriorityAtSector% = 1: EXIT FUNCTION
  2163.                     END IF
  2164.             END SELECT
  2165.         END IF
  2166.     NEXT i%
  2167.  
  2168.     '2nd priority: ° MECHS °- - - - - - - - - - - - - - - - - - - - - - - - - - -
  2169.     'I should create some Mechs first, shouldn't i? XD
  2170.  
  2171.     '3rd priority : ° ITEMS °- - - - - - - - - - - - - - - - - - - - - - - - - - -
  2172.     FOR i% = 0 TO UBOUND(Items)
  2173.         IF Items(i%).map = actualMapWorking% THEN
  2174.             'checkPriorityAtSector% = 3: EXIT FUNCTION
  2175.         END IF
  2176.     NEXT i%
  2177.  
  2178.     '4rth priority: ° WORLD °- - - - - - - - - - - - - - - - - - - - - - - -
  2179.     checkPriorityAtSector% = 4
  2180.  
  2181. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2182. FUNCTION checkFingerSector% ()
  2183.  
  2184.     IF fingerIsOnSurface%(Hero.x - 32, Hero.y + 32, 32, 32) THEN '     sector 1
  2185.         checkFingerSector% = 1
  2186.     ELSEIF fingerIsOnSurface%(Hero.x, Hero.y + 32, 32, 32) THEN '      sector 2
  2187.         checkFingerSector% = 2
  2188.     ELSEIF fingerIsOnSurface%(Hero.x + 32, Hero.y + 32, 32, 32) THEN ' sector 3
  2189.         checkFingerSector% = 3
  2190.     ELSEIF fingerIsOnSurface%(Hero.x - 32, Hero.y, 32, 32) THEN '      sector 4
  2191.         checkFingerSector% = 4
  2192.     ELSEIF fingerIsOnSurface%(Hero.x, Hero.y, 32, 32) THEN '           sector 5
  2193.         checkFingerSector% = 5
  2194.     ELSEIF fingerIsOnSurface%(Hero.x + 32, Hero.y, 32, 32) THEN '      sector 6
  2195.         checkFingerSector% = 6
  2196.     ELSEIF fingerIsOnSurface%(Hero.x - 32, Hero.y - 32, 32, 32) THEN ' sector 7
  2197.         checkFingerSector% = 7
  2198.     ELSEIF fingerIsOnSurface%(Hero.x, Hero.y - 32, 32, 32) THEN '      sector 8
  2199.         checkFingerSector% = 8
  2200.     ELSEIF fingerIsOnSurface%(Hero.x + 32, Hero.y - 32, 32, 32) THEN ' sector 9
  2201.         checkFingerSector% = 9
  2202.     ELSE '                     nothing to do, further away from playable sectors
  2203.         checkFingerSector% = 0
  2204.     END IF
  2205.  
  2206. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2207. SUB allowedMotions (where%)
  2208.  
  2209.     SELECT CASE where%
  2210.         CASE 1
  2211.             printHUDpromt "Move down & left" '                        Â¿
  2212.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(9) ' ³
  2213.             IF Finger.clickL THEN '                                   ³
  2214.                 Hero.y = Hero.y + 32 '                                Â³
  2215.                 Hero.x = Hero.x - 32 '
  2216.                 gameTurn% = 0
  2217.             END IF '                                                  Â¾
  2218.         CASE 2
  2219.             printHUDpromt "Move down" '                                Â¿
  2220.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(10) ' ³
  2221.             IF Finger.clickL THEN '                                    Â³
  2222.                 Hero.y = Hero.y + 32 '
  2223.                 gameTurn% = 0
  2224.             END IF '                                                   ¾
  2225.         CASE 3
  2226.             printHUDpromt "Move down & right" '                       ¿
  2227.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(2) ' ³
  2228.             IF Finger.clickL THEN '                                   ³
  2229.                 Hero.y = Hero.y + 32 '                                Â³
  2230.                 Hero.x = Hero.x + 32 '
  2231.                 gameTurn% = 0
  2232.             END IF '                                                  Â¾
  2233.         CASE 4
  2234.             printHUDpromt "Move left" '                               ¿
  2235.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(7) ' ³
  2236.             IF Finger.clickL THEN '                                   ³
  2237.                 Hero.x = Hero.x - 32 '
  2238.                 gameTurn% = 0
  2239.             END IF '                                                  Â¾
  2240.         CASE 5
  2241.             printHUDpromt "Rest one turn" '                         ¿
  2242.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), FingerImg&(4) ' ¾
  2243.  
  2244.             '!!!!!!!!!!!!!!!!!!!!
  2245.             IF Finger.clickL THEN '                                   ³
  2246.                 gameTurn% = 0
  2247.             END IF '                                                  Â¾
  2248.             '!!!!!!!!!!!!!!!!!!!!
  2249.  
  2250.  
  2251.         CASE 6
  2252.             printHUDpromt "Move right" '                              Â¿
  2253.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(1) ' ³
  2254.             IF Finger.clickL THEN '                                   ³
  2255.                 Hero.x = Hero.x + 32 '
  2256.                 gameTurn% = 0
  2257.             END IF '                                                  Â¾
  2258.         CASE 7
  2259.             printHUDpromt "Move up & left" '                          Â¿
  2260.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(8) ' ³
  2261.             IF Finger.clickL THEN '                                   ³
  2262.                 Hero.y = Hero.y - 32 '                                Â³
  2263.                 Hero.x = Hero.x - 32 '
  2264.                 gameTurn% = 0
  2265.             END IF '                                                  Â¾
  2266.         CASE 8
  2267.             printHUDpromt "Move up" '                                 ¿
  2268.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(4) ' ³
  2269.             IF Finger.clickL THEN '                                   ³
  2270.                 Hero.y = Hero.y - 32 '
  2271.                 gameTurn% = 0
  2272.             END IF '                                                  Â¾
  2273.         CASE 9
  2274.             printHUDpromt "Move up & right" '                         ¿
  2275.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(3) ' ³
  2276.             IF Finger.clickL THEN '                                   ³
  2277.                 Hero.y = Hero.y - 32 '                                Â³
  2278.                 Hero.x = Hero.x + 32 '
  2279.                 gameTurn% = 0
  2280.             END IF '                                                  Â¾
  2281.         CASE 0
  2282.             _PUTIMAGE (Finger.x - 1, Finger.y - 1), FingerImg&(0) ' normal finger
  2283.     END SELECT
  2284.  
  2285.  
  2286. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2287.  
  2288. SUB readyToGo () ' STILL HAVE TO WORK ON to show the image of GO in the mouse
  2289.     DO
  2290.         _LIMIT 60
  2291.         CLS
  2292.         printHUDpromt "Your turn, " + Hero.id
  2293.         IF clockForFantasy% > 0 THEN
  2294.             clockForFantasy% = clockForFantasy% - 1
  2295.         ELSE
  2296.             clockForFantasy% = 120
  2297.         END IF
  2298.  
  2299.         _DISPLAY
  2300.     LOOP
  2301. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2302.  
  2303.  


Title: Re: Fantasy
Post by: Juan Tamarit on June 15, 2021, 12:03:27 am
Question that came up to my mind: do i need to have all these images loaded in variable arrays? Or is there a better an more efficient way to do this? I tried using a function where i loaded a main image, assign what i needed to a tmp&() array, coded the series of decision to choose wich of the indexes i wanted, assign that handle to the function, _freeing the file and exit the function... i didn't worked. Guess that _FREEIMAGE the handle and leaving the function leaves the function without nothing, right?
Title: Re: Fantasy
Post by: bplus on June 15, 2021, 08:12:11 am
Question that came up to my mind: do i need to have all these images loaded in variable arrays? Or is there a better an more efficient way to do this? I tried using a function where i loaded a main image, assign what i needed to a tmp&() array, coded the series of decision to choose wich of the indexes i wanted, assign that handle to the function, _freeing the file and exit the function... i didn't worked. Guess that _FREEIMAGE the handle and leaving the function leaves the function without nothing, right?

Not clear what you are asking.

Quote
do i need to have all these images loaded in variable arrays?
Do you mean saving the loaded image handles in an array? Yes, specially a Shared array if you have many that are associated with each other.

On the other hand working from a sheet of images you might use functions to _PUTIMAGE sections from that sheet, so just one handle for whole sheet Shared with those Function(s) that get particular parts of sheet.

Actually probably would use Subs not functions with _PutImage for showing sections of sheet image.
Title: Re: Fantasy
Post by: Juan Tamarit on June 15, 2021, 05:27:55 pm
Ok. Thank for replying, dear bro b+. Very interesting idea of FUNC or SUBS for using only the main sheet, i kind of loaded it in diferent pieces and then _freeit, from there on i just work with the pieces. By the way ¿Is this more memory consuming or is the same? Is the same, right?

Im reorganizing this program a bit. I felt like the general program was a disorder, too much focused on the menus, forcing me to get into another loop for working with the enemies, etc... Im gonna try to fit everything in a single loop and take the focus out of the menus a bit. Hard maintance work i guess. Also modding the aspect of things a bit. I'll come back when i have it more organized and nice.

I still open to comments, opinions, critics, everything

Cheers
Title: Re: Fantasy
Post by: Juan Tamarit on June 18, 2021, 12:57:20 pm
Question: if i have dimensioned a global variable dinamic array (REDIM SHARED) in general program, can i REDIM _PRESERVE in a SUB or FUNCTION, or should i REDIM SHARED _PRESERVE? O i can't REDIM it in a SUB/FUNC?
Title: Re: Fantasy
Post by: FellippeHeitor on June 18, 2021, 01:42:32 pm
If an array has been REDIM SHARED in the main module, you can REDIM _PRESERVE in a sub/function, but you must remember to specify the data type again (AS whatever type, or by using the type suffix).
Title: Re: Fantasy
Post by: Juan Tamarit on June 23, 2021, 05:06:03 pm
Hello there again. Sorry for my ignorance, but in the next SUB:

Code: QB64: [Select]
  1. SUB drawWorld () ' <-  if i could came up with a random generator... geez
  2.  
  3.     DIM i%
  4.     DIM j%
  5.     DIM tmp%%
  6.     DIM orgFile&
  7.     DIM destFile&
  8.     DIM tmpWorlds&
  9.  
  10.     IF NOT _FILEEXISTS("tmpWorlds.txt") THEN '              if this file dosn't exists means that we started a new game. We must create the first map of the game, wich is a pre-arranged map of the Town
  11.         CHDIR ".\.." '                                      so we move back to data
  12.         CHDIR ".\worlds" '                                  and into the pre-worlds folder
  13.         'we are @ Fantasy\data\wolrds\
  14.         orgFile& = FREEFILE '                               we need two filehandles: one for origin file,
  15.         destFile& = FREEFILE '                              and another for destination file
  16.         OPEN "town.txt" FOR INPUT AS #orgFile& '            we will extract info from this file
  17.         OPEN "tmp.txt" FOR OUTPUT AS #destFile& '           and place it into this one
  18.         WHILE NOT EOF(orgFile&) '                           we make sure we read the full file
  19.             INPUT #orgFile&, tmp%% '    Â¿ <---------------- DATA TRANSFER
  20.             PRINT #destFile&, tmp%% '   ¾
  21.         WEND '                                              done with that thing
  22.         CLOSE #orgFile& '  Â¿ <----------------------------- close files
  23.         CLOSE #destFile& ' ¾
  24.         CHDIR ".\.." '                                      move back to data
  25.         'we are @ Fantasy\data\
  26.         NAME ".\worlds\tmp.txt" AS ".\tmp\tmpWorlds.txt" '  now we extract the file from worlds folder and put it on tmp folder with the right name
  27.         CHDIR ".\tmp" '                                     into tmp folder again, map ready for use
  28.         'we are @ Fantasy\data\tmp\
  29.     END IF
  30.  
  31.     IF lastMapWorking%% <> actualMapWorking%% THEN '        if map has changed we need to actualize the WolrdTiles%% array
  32.         tmpWorlds& = FREEFILE '                             get a handle
  33.         OPEN "tmpWorlds.txt" FOR INPUT AS #tmpWorlds& '     we will extract data from this file
  34.         INPUT #tmpWorlds&, tmp%% '                          we check the first number of the file
  35.         WHILE tmp%% <> actualMapWorking%% '                 if it isn't the number of the level we need to know
  36.             FOR i% = 0 TO 279 '            Â¿
  37.                 INPUT #tmpWorlds&, tmp%% ' ³ <------------ walk over the info of this map (which is not what we need to know, but we skip that data)
  38.             NEXT i% '                      Â¾
  39.             INPUT #tmpWorlds&, tmp%% '                      and get the next number for evaluate again (that should be the number of next map)
  40.         WEND '                                              keep doing this untill the right map number has been found
  41.         FOR j% = 0 TO 13 '                    Â¿
  42.             FOR i% = 0 TO 19 '                Â³
  43.                 INPUT #tmpWorlds&, tmp%% '    Â³ <---------- then extract the data we need
  44.                 WorldTiles%%(i%, j%) = tmp%% '³             and load it into WorldTiles%% array !
  45.             NEXT i% '                         ³
  46.         NEXT j% '                             ¾
  47.         CLOSE #tmpWorlds& '                                 close the file
  48.         lastMapWorking%% = actualMapWorking%% '             and actualize map situation, so no need for reload until the map changes
  49.     END IF
  50.  
  51.     FOR j% = 0 TO 13 '                                                          Â¿
  52.         FOR i% = 0 TO 19 '                                                      Â³
  53.             _PUTIMAGE (i% * 32, j% * 32 + 32), WorldImg&(WorldTiles%%(i%, j%)) '³ actual drawing
  54.         NEXT i% '                                                               ³
  55.     NEXT j% '                                                                   ¾
  56.  

I'm having an error that stands "file already open", particularly in line "OPEN "tmp.txt" FOR OUTPUT AS #destFile&". Does this means that QB64 can't have 2 files simoultaneously open? Or i'm making a mistake in the coding? Again, sorry by my newbiesness, but i can't understand what is wrong whit this

Cheers to all bros in forum. Still waiting for comments on the idea of the program!
Title: Re: Fantasy
Post by: Juan Tamarit on June 23, 2021, 05:28:26 pm
By the way, this is the version im actuly working on. Also attached the folder structure and assets as they work now:

Code: QB64: [Select]
  1. 'we are @ Fantasy\
  2. '----------------------------------------------------------------------------------------------------------Û    SETUP    Ã›--------------------------------------------------------------------------------------------------------------
  3. SCREEN _NEWIMAGE(640, 480, 32) ' enter in graphics mode 640x480 32 bith color depth
  4. _FULLSCREEN ' fullscreen mode, make it shine
  5. _MOUSEHIDE ' dont show OS cursor, we will use our own
  6. 'x = 20 cells
  7. 'y = 15 cells(14 in fact for gameplay, the upper one holds the HUD)
  8.  
  9. '----------------------------------------------------------------------------------------------------------Û VARAIABLES Û--------------------------------------------------------------------------------------------------------------
  10. 'Û PROGRAM GLOBALS Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  11. CONST FALSE = 0: CONST TRUE = NOT FALSE ' ying-yang
  12. DIM SHARED menuMain AS _BIT
  13. DIM SHARED menuPocket AS _BIT
  14. DIM SHARED menuSpells AS _BIT
  15. DIM SHARED menuStats AS _BIT
  16. DIM SHARED menuHelp AS _BIT
  17. DIM SHARED menuMap AS _BIT
  18. DIM SHARED playerTurn AS _BIT
  19. DIM SHARED HUDpromt$
  20.  
  21. 'im gonna use this?
  22. DIM SHARED drawFingerAs AS _BYTE
  23. DIM SHARED clockForFantasy AS _BYTE
  24. DIM SHARED historyTimeline AS _BYTE
  25. 'Û COLORS Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  26. CONST GREEN1 = _RGB32(215, 232, 148) ' lighter ¿
  27. CONST GREEN2 = _RGB32(174, 196, 64) '          Â³ colors
  28. CONST GREEN3 = _RGB32(82, 127, 57) '           ³
  29. CONST GREEN4 = _RGB32(32, 70, 49) ' darker     Ù
  30.  
  31. 'Û IMAGES Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  32. DIM SHARED ArmorImg&(7): DIM SHARED ArrowImg&(2): DIM SHARED AxeImg&(7): DIM SHARED BarImg&(6): DIM SHARED BijouImg&(3): DIM SHARED BoltImg&(1): DIM SHARED BombImg&(2): DIM SHARED BookImg&(3): DIM SHARED BowImg&(2)
  33. DIM SHARED ChestImg&(1): DIM SHARED CrossbowImg&(1): DIM SHARED DirArrowImg&(12): DIM SHARED EnemyImg&(31): DIM SHARED FingerImg&(8): DIM SHARED GndItemsImg&(17): DIM SHARED HeartImg&(5): DIM SHARED HelmImg&(7)
  34. DIM SHARED HeroImg&(7): DIM SHARED HUDImg&(3): DIM SHARED KeyImg&(5): DIM SHARED LightImg&(7): DIM SHARED LvlImg&(10): DIM SHARED MoneyImg&(3): DIM SHARED PaperImg&(1): DIM SHARED PortalImg&(7): DIM SHARED PotionImg&(7)
  35. DIM SHARED ShieldImg&(7): DIM SHARED SpellImg&(5): DIM SHARED SwordImg&(7): DIM SHARED ThrowImg&(2): DIM SHARED WandImg&(7): DIM SHARED WorldImg&(23)
  36. DIM SHARED BlankImg&
  37.  
  38. 'Û MECHS Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  39. TYPE MECHANICAL
  40.     x AS INTEGER ' mouse x position
  41.     y AS INTEGER ' mouse y position
  42.     kind AS _BYTE
  43.     map AS _BYTE
  44.     state AS _BYTE
  45. REDIM SHARED Mechs(0) AS MECHANICAL
  46.  
  47. 'Û POINTER/MOUSE Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  48. TYPE POINTER '
  49.     x AS INTEGER ' mouse x position
  50.     y AS INTEGER ' mouse y position
  51.     image AS LONG ' mouse aspect
  52.     clickL AS _BYTE ' left click
  53.     clickR AS _BYTE ' right click
  54.     tmpClickL AS _BYTE '¿
  55.     tmpClickR AS _BYTE '³ debouncing
  56.     oldClickL AS _BYTE '³ stuff
  57.     oldClickR AS _BYTE 'Ù
  58. DIM SHARED Finger AS POINTER ' create the mouse
  59.  
  60. 'Û HERO Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  61. TYPE USER '
  62.     x AS INTEGER ' x position
  63.     y AS INTEGER ' y position
  64.     id AS STRING ' player name
  65.     class AS _BYTE ' 0=Barbarian, 1=Clerig, 2=Assasin or 3=Wizard
  66.     lvl AS _BYTE ' current character level
  67.     strength AS _BYTE '¿
  68.     agility AS _BYTE ' ³ basic
  69.     power AS _BYTE '   ³ skills
  70.     vigor AS _BYTE '   Ù
  71.     life AS INTEGER ' actual life ammount
  72.     mana AS INTEGER ' actual life ammount
  73.     xp AS INTEGER ' actual experience level
  74.     nextXp AS INTEGER ' the next target for lvlUp
  75.     prevNextXp AS INTEGER '
  76.     attributePoints AS INTEGER
  77. DIM SHARED Hero AS USER ' create the hero
  78.  
  79. 'Û ITEMS Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  80. TYPE OBJECT
  81.     x AS INTEGER
  82.     y AS INTEGER
  83.     kind AS _BYTE
  84.     lvl AS _BYTE ' level of the object
  85.     ammount AS INTEGER ' can be simply 1 or more
  86.     special AS STRING '<--------------------------¿
  87.     map AS _BYTE 'MAP number OR -1 for POCKET     ³
  88. END TYPE '                                        Â³
  89. ' ITEMS SPECIAL VARIABLE:-------------------------¾
  90. 's=adds strength; a=adds agility; p=adds power; v=adds vigor;¿ CAN BE
  91. 'd=adds defense; b=adds to base damage;m=adds to max damage; ³ FROM 1              eg:a1,v3,d2,etc...
  92. 'c=adds to chance TO HIT%,will be multiplied by 7;           ¾ TO 3
  93.  
  94. 't= teaches some spell, for books (0 to 5) ;
  95. 'r= cast a spell, for wands and scrolls (0 to 5);
  96.  
  97. 'u=unidentified (has no number?)
  98.  
  99. DIM SHARED Pocket(22) AS OBJECT
  100. DIM SHARED inHand AS OBJECT
  101. REDIM SHARED Items(0) AS OBJECT
  102.  
  103. 'Û WORLD Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  104. DIM SHARED WorldTiles%%(19, 13)
  105. DIM SHARED actualMapWorking%%
  106. DIM SHARED lastMapWorking%%
  107.  
  108. 'Û ENEMIES Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  109. TYPE PROGRAMMER '
  110.     x AS INTEGER ' x position
  111.     y AS INTEGER ' y position
  112.     map AS _BYTE ' in wich map enemy is
  113.     lvl AS _BYTE ' enemies level goes from 0 to 31, same as the image array
  114.     life AS INTEGER 'enemy remaining life
  115.  
  116. REDIM SHARED Enemy(3) AS PROGRAMMER ' create enemies
  117.  
  118. 'Û SPELLS Û- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  119. DIM SHARED SpellsIknow%%(5) ' array contains the level that the player knows from each one of the spells 0 to 5. Never will be greater than 10
  120. DIM SHARED turnsRemainingSpell%%(5) ' array contains how many more turns the spell will be ON,when reaches 0 spell is OFF
  121. DIM SHARED lastSpellSelected%%(1) ' array contain: 0=the number of the last spell use; 1= the level of the last spell used
  122.  
  123. '----------------------------------------------------------------------------------------------------------Û PRE-PROGRAM Û--------------------------------------------------------------------------------------------------------------
  124. checkForAssets
  125. loadImages
  126. _ICON SpellImg&(0)
  127. _TITLE "Fantasy"
  128. loadProgramInitialVariables
  129. MKDIR "tmp"
  130. CHDIR ".\tmp" 'we are @ Fantasy\tmp\
  131. '----------------------------------------------------------------------------------------------------------Û   PROGRAM   Û--------------------------------------------------------------------------------------------------------------
  132.     _LIMIT 60
  133.     CLS , GREEN3
  134.  
  135.     HUDpromt$ = "" '       ¿ reinitialize this variables
  136.     drawFingerAs%% = 1 '   ¾
  137.  
  138.     'What happened to the MUSIC????? XD
  139.  
  140.     getMouseData
  141.     thingsYouCanDoWithFinger
  142.     keyboardInputs
  143.  
  144.     IF Hero.life > calculateMaxLife% THEN Hero.life = calculateMaxLife%
  145.     IF Hero.mana > calculateMaxMana% THEN Hero.mana = calculateMaxMana%
  146.     actualizeMoneyAspect
  147.  
  148.     IF actualMapWorking%% > -1 THEN drawMyFantasy
  149.     IF menuStats` = TRUE THEN showTheStats
  150.     IF menuPocket` = TRUE THEN lookInPocket
  151.     IF menuSpells = TRUE THEN selectSomeSpell
  152.     IF menuMain` = TRUE THEN mainMenu
  153.     IF actualMapWorking%% > -1 THEN drawHUD
  154.     printHUDpromt HUDpromt$
  155.     drawFinger
  156.     TESTER
  157.     _DISPLAY
  158. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  159. SUB thingsYouCanDoWithFinger () '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û ACTION PERFORMING Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  160.     DIM tmp%
  161.  
  162.     IF playerTurn` = TRUE THEN
  163.         drawFingerAs%% = 1
  164.         IF menuPocket` = TRUE THEN
  165.             itemManipulation ' if you are looking at pocket you are allowed to manipulate items there
  166.             IF NOT inHand.lvl = -1 THEN drawFingerAs%% = 3 ' if lvl of inhand isn't -1 means you are holding something
  167.         END IF
  168.         IF menuMain` = FALSE AND menuPocket` = FALSE AND menuSpells` = FALSE AND menuStats` = FALSE THEN
  169.             tmp% = checkFingerSector%
  170.  
  171.  
  172.  
  173.  
  174.  
  175.         END IF
  176.     ELSE
  177.         drawFingerAs%% = 6
  178.     END IF
  179.  
  180. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  181. FUNCTION checkFingerSector% ()
  182.  
  183.     IF fingerIsOnSurface%(Hero.x - 32, Hero.y + 32, 32, 32) THEN '     sector 1
  184.         checkFingerSector% = 1
  185.     ELSEIF fingerIsOnSurface%(Hero.x, Hero.y + 32, 32, 32) THEN '      sector 2
  186.         checkFingerSector% = 2
  187.     ELSEIF fingerIsOnSurface%(Hero.x + 32, Hero.y + 32, 32, 32) THEN ' sector 3
  188.         checkFingerSector% = 3
  189.     ELSEIF fingerIsOnSurface%(Hero.x - 32, Hero.y, 32, 32) THEN '      sector 4
  190.         checkFingerSector% = 4
  191.     ELSEIF fingerIsOnSurface%(Hero.x, Hero.y, 32, 32) THEN '           sector 5
  192.         checkFingerSector% = 5
  193.     ELSEIF fingerIsOnSurface%(Hero.x + 32, Hero.y, 32, 32) THEN '      sector 6
  194.         checkFingerSector% = 6
  195.     ELSEIF fingerIsOnSurface%(Hero.x - 32, Hero.y - 32, 32, 32) THEN ' sector 7
  196.         checkFingerSector% = 7
  197.     ELSEIF fingerIsOnSurface%(Hero.x, Hero.y - 32, 32, 32) THEN '      sector 8
  198.         checkFingerSector% = 8
  199.     ELSEIF fingerIsOnSurface%(Hero.x + 32, Hero.y - 32, 32, 32) THEN ' sector 9
  200.         checkFingerSector% = 9
  201.     ELSE '                     nothing to do, further away from playable sectors
  202.         checkFingerSector% = 0
  203.     END IF
  204.  
  205. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  206. FUNCTION checkEnemyPresenceInSector% (sect%, orgX%, orgY%)
  207.     FOR i% = 1 TO UBOUND(Enemy)
  208.         IF Enemy(i%).map = actualMapWorking%% THEN
  209.             SELECT CASE sect%
  210.                 CASE 1: IF Enemy(i%).x = orgX% - 32 AND Enemy(i%).y = orgY% + 32 THEN checkEnemyPresenceInSector% = TRUE: EXIT FUNCTION
  211.                 CASE 2: IF Enemy(i%).x = orgX% AND Enemy(i%).y = orgY% + 32 THEN checkEnemyPresenceInSector% = TRUE: EXIT FUNCTION
  212.                 CASE 3: IF Enemy(i%).x = orgX% + 32 AND Enemy(i%).y = orgY% + 32 THEN checkEnemyPresenceInSector% = TRUE: EXIT FUNCTION
  213.                 CASE 4: IF Enemy(i%).x = orgX% - 32 AND Enemy(i%).y = orgY% THEN checkEnemyPresenceInSector% = TRUE: EXIT FUNCTION
  214.                 CASE 6: IF Enemy(i%).x = orgX% + 32 AND Enemy(i%).y = orgY% THEN checkEnemyPresenceInSector% = TRUE: EXIT FUNCTION
  215.                 CASE 7: IF Enemy(i%).x = orgX% - 32 AND Enemy(i%).y = orgY% - 32 THEN checkEnemyPresenceInSector% = TRUE: EXIT FUNCTION
  216.                 CASE 8: IF Enemy(i%).x = orgX% AND Enemy(i%).y = orgY% - 32 THEN checkEnemyPresenceInSector% = TRUE: EXIT FUNCTION
  217.                 CASE 9: IF Enemy(i%).x = orgX% + 32 AND Enemy(i%).y = orgY% - 32 THEN checkEnemyPresenceInSector% = TRUE: EXIT FUNCTION
  218.             END SELECT
  219.         END IF
  220.     NEXT i%
  221.     checkEnemyPresenceInSector% = FALSE
  222. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  223. FUNCTION checkItemPresenceInSector% (sect%, orgX%, orgY%)
  224.     FOR i% = 1 TO UBOUND(Items)
  225.         IF Items(i%).map = actualMapWorking%% THEN
  226.             SELECT CASE sect%
  227.                 CASE 1: IF Items(i%).x = orgX% - 32 AND Items(i%).y = orgY% + 32 THEN checkItemPresenceInSector% = TRUE: EXIT FUNCTION
  228.                 CASE 2: IF Items(i%).x = orgX% AND Items(i%).y = orgY% + 32 THEN checkItemPresenceInSector% = TRUE: EXIT FUNCTION
  229.                 CASE 3: IF Items(i%).x = orgX% + 32 AND Items(i%).y = orgY% + 32 THEN checkItemPresenceInSector% = TRUE: EXIT FUNCTION
  230.                 CASE 4: IF Items(i%).x = orgX% - 32 AND Items(i%).y = orgY% THEN checkItemPresenceInSector% = TRUE: EXIT FUNCTION
  231.                 CASE 5: IF Items(i%).x = orgX% AND Items(i%).y = orgY% THEN checkItemPresenceInSector% = TRUE: EXIT FUNCTION
  232.                 CASE 6: IF Items(i%).x = orgX% + 32 AND Items(i%).y = orgY% THEN checkItemPresenceInSector% = TRUE: EXIT FUNCTION
  233.                 CASE 7: IF Items(i%).x = orgX% - 32 AND Items(i%).y = orgY% - 32 THEN checkItemPresenceInSector% = TRUE: EXIT FUNCTION
  234.                 CASE 8: IF Items(i%).x = orgX% AND Items(i%).y = orgY% - 32 THEN checkItemPresenceInSector% = TRUE: EXIT FUNCTION
  235.                 CASE 9: IF Items(i%).x = orgX% + 32 AND Items(i%).y = orgY% - 32 THEN checkItemPresenceInSector% = TRUE: EXIT FUNCTION
  236.             END SELECT
  237.         END IF
  238.     NEXT i%
  239.     checkItemPresenceInSector% = FALSE
  240. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  241. FUNCTION checkWorldAtSector% (sect%, orgX%, orgY%)
  242.     SELECT CASE sect%
  243.         CASE 1:
  244.         CASE 2:
  245.         CASE 3:
  246.         CASE 4:
  247.         CASE 5:
  248.         CASE 6:
  249.         CASE 7:
  250.         CASE 8:
  251.         CASE 9:
  252.     END SELECT
  253. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  254. FUNCTION checkMechPresenceInSector% (sect%, orgX%, orgY%)
  255. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  256. SUB drawFinger
  257.     SELECT CASE drawFingerAs%%
  258.         CASE 0: _PUTIMAGE (Finger.x - 8, Finger.y - 8), FingerImg&(0) 'cross
  259.         CASE 1: _PUTIMAGE (Finger.x - 1, Finger.y - 1), FingerImg&(1) 'finger
  260.         CASE 2: _PUTIMAGE (Finger.x - 1, Finger.y - 1), FingerImg&(2) 'attack sword
  261.         CASE 3: _PUTIMAGE (Finger.x - 1, Finger.y - 1), FingerImg&(3) 'grabbing hand
  262.         CASE 4: _PUTIMAGE (Finger.x - 8, Finger.y - 8), FingerImg&(4) 'wait clock
  263.         CASE 5: _PUTIMAGE (Finger.x - 1, Finger.y - 1), FingerImg&(5) 'GO
  264.         CASE 6: _PUTIMAGE (Finger.x - 1, Finger.y - 1), FingerImg&(6) 'sand clock
  265.         CASE 7: _PUTIMAGE (Finger.x - 1, Finger.y - 1), FingerImg&(7) '?
  266.         CASE 8: _PUTIMAGE (Finger.x - 1, Finger.y - 1), FingerImg&(8) '!
  267.         CASE 11:
  268.         CASE 12:
  269.     END SELECT
  270. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  271. SUB allowedMotions (where%)
  272.  
  273.     SELECT CASE where%
  274.         CASE 1
  275.             printHUDpromt "Move down & left" '                        Â¿
  276.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(9) ' ³
  277.             IF Finger.clickL THEN '                                   ³
  278.                 Hero.y = Hero.y + 32 '                                Â³
  279.                 Hero.x = Hero.x - 32 '
  280.                 gameTurn% = 0
  281.             END IF '                                                  Â¾
  282.         CASE 2
  283.             printHUDpromt "Move down" '                                Â¿
  284.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(10) ' ³
  285.             IF Finger.clickL THEN '                                    Â³
  286.                 Hero.y = Hero.y + 32 '
  287.                 gameTurn% = 0
  288.             END IF '                                                   ¾
  289.         CASE 3
  290.             printHUDpromt "Move down & right" '                       ¿
  291.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(2) ' ³
  292.             IF Finger.clickL THEN '                                   ³
  293.                 Hero.y = Hero.y + 32 '                                Â³
  294.                 Hero.x = Hero.x + 32 '
  295.                 gameTurn% = 0
  296.             END IF '                                                  Â¾
  297.         CASE 4
  298.             printHUDpromt "Move left" '                               ¿
  299.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(7) ' ³
  300.             IF Finger.clickL THEN '                                   ³
  301.                 Hero.x = Hero.x - 32 '
  302.                 gameTurn% = 0
  303.             END IF '                                                  Â¾
  304.         CASE 5
  305.             printHUDpromt "Rest one turn" '                         ¿
  306.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), FingerImg&(4) ' ¾
  307.  
  308.             '!!!!!!!!!!!!!!!!!!!!
  309.             IF Finger.clickL THEN '                                   ³
  310.                 gameTurn% = 0
  311.             END IF '                                                  Â¾
  312.             '!!!!!!!!!!!!!!!!!!!!
  313.  
  314.  
  315.         CASE 6
  316.             printHUDpromt "Move right" '                              Â¿
  317.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(1) ' ³
  318.             IF Finger.clickL THEN '                                   ³
  319.                 Hero.x = Hero.x + 32 '
  320.                 gameTurn% = 0
  321.             END IF '                                                  Â¾
  322.         CASE 7
  323.             printHUDpromt "Move up & left" '                          Â¿
  324.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(8) ' ³
  325.             IF Finger.clickL THEN '                                   ³
  326.                 Hero.y = Hero.y - 32 '                                Â³
  327.                 Hero.x = Hero.x - 32 '
  328.                 gameTurn% = 0
  329.             END IF '                                                  Â¾
  330.         CASE 8
  331.             printHUDpromt "Move up" '                                 ¿
  332.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(4) ' ³
  333.             IF Finger.clickL THEN '                                   ³
  334.                 Hero.y = Hero.y - 32 '
  335.                 gameTurn% = 0
  336.             END IF '                                                  Â¾
  337.         CASE 9
  338.             printHUDpromt "Move up & right" '                         ¿
  339.             _PUTIMAGE (Finger.x - 8, Finger.y - 8), DirArrowImg&(3) ' ³
  340.             IF Finger.clickL THEN '                                   ³
  341.                 Hero.y = Hero.y - 32 '                                Â³
  342.                 Hero.x = Hero.x + 32 '
  343.                 gameTurn% = 0
  344.             END IF '                                                  Â¾
  345.         CASE 0
  346.             _PUTIMAGE (Finger.x - 1, Finger.y - 1), FingerImg&(0) ' normal finger
  347.     END SELECT
  348.  
  349.  
  350. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  351.  
  352. SUB mainMenu () '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û MENUS Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  353.     ' TO DO: allow acces to SAVE GAME & LOAD GAME
  354.  
  355.     drawMenuBack 240, 99, 391, 306
  356.  
  357.     LOCATE 8, 37 '          Â¿
  358.     PRINT "FANTASY"; '      Â¾  TITLE
  359.  
  360.     _PUTIMAGE (259, 103), SpellImg&(0) '¿ demoniac
  361.     _PUTIMAGE (340, 103), SpellImg&(0) 'Ù stars
  362.  
  363.     IF actualMapWorking%% > -1 THEN '                 are we already playing?
  364.         _PUTIMAGE (369, 108), HUDImg&(3) '            then this menu has to show this image
  365.         IF fingerIsOnSurface%(369, 108, 16, 16) THEN '
  366.             HUDpromt$ = "Back to game"
  367.             IF Finger.clickL THEN menuMain` = FALSE
  368.         END IF
  369.     END IF
  370.  
  371.     LOCATE 10, 36
  372.     IF fingerIsOnSurface%(280, 144, 72, 16) THEN
  373.         COLOR GREEN4, GREEN1
  374.         IF Finger.clickL THEN
  375.             COLOR GREEN1, GREEN4 ' so no wrong printing in newGame
  376.             menuMain` = FALSE
  377.             menuPocket = FALSE
  378.             menuSpells` = FALSE
  379.             menuStats` = FALSE
  380.             newGame
  381.         END IF
  382.     ELSE
  383.         COLOR GREEN1, GREEN4
  384.     END IF
  385.     PRINT "New  game";
  386.  
  387.     LOCATE 12, 36
  388.     IF fingerIsOnSurface%(280, 176, 72, 16) THEN
  389.         COLOR GREEN4, GREEN1
  390.         IF Finger.clickL THEN loadGame
  391.     ELSE
  392.         COLOR GREEN1, GREEN4
  393.     END IF
  394.     PRINT "Load game";
  395.  
  396.     LOCATE 14, 36
  397.     IF actualMapWorking%% > -1 THEN ' we only allowed to save if we are playing
  398.         IF fingerIsOnSurface%(280, 208, 72, 16) THEN
  399.             COLOR GREEN4, GREEN1
  400.             'IF Finger.clickL THEN actualMenuWorking% = -7 '<----------------WRONG! assign a variable for this
  401.         ELSE
  402.             COLOR GREEN1, GREEN4
  403.         END IF
  404.     ELSE
  405.         COLOR GREEN3, GREEN4 ' if NOT in game
  406.     END IF
  407.     PRINT "Save Game";
  408.  
  409.     LOCATE 16, 38
  410.     IF fingerIsOnSurface%(296, 240, 32, 16) THEN
  411.         COLOR GREEN4, GREEN1
  412.         IF Finger.clickL THEN
  413.             menuMain` = FALSE
  414.             menuHelp` = TRUE
  415.         END IF
  416.     ELSE
  417.         COLOR GREEN1, GREEN4
  418.     END IF
  419.     PRINT "Help";
  420.  
  421.     LOCATE 18, 38
  422.     IF fingerIsOnSurface%(296, 272, 32, 16) THEN
  423.         COLOR GREEN4, GREEN1
  424.         IF Finger.clickL THEN
  425.             exitProgram
  426.         END IF
  427.     ELSE
  428.         COLOR GREEN1, GREEN4
  429.     END IF
  430.     PRINT "Exit";
  431.  
  432.     IF actualMapWorking%% > -1 THEN
  433.         IF fingerIsOnSurface%(280, 144, 72, 16) THEN HUDpromt$ = "Start a new game"
  434.         IF fingerIsOnSurface%(280, 176, 72, 16) THEN HUDpromt$ = "Load a saved game"
  435.         IF fingerIsOnSurface%(280, 208, 72, 16) THEN HUDpromt$ = "Save current game"
  436.         IF fingerIsOnSurface%(296, 240, 32, 16) THEN HUDpromt$ = "Learn how to play"
  437.         IF fingerIsOnSurface%(296, 272, 32, 16) THEN HUDpromt$ = "Close and leave"
  438.     END IF
  439.  
  440.     COLOR GREEN1, GREEN4 ' don't conlictuate with other stuff
  441.  
  442. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  443. SUB exitProgram ()
  444.     unloadImages
  445.     CHDIR ".\.." 'to data
  446.     RMDIR "tmp"
  447.     SYSTEM
  448. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  449. SUB newGame () '!!!!!!! set me to 0 after testing
  450.  
  451.     DIM i%
  452.  
  453.     actualMapWorking%% = -1 'leave actual game
  454.     Hero.lvl = 1 ' start with a fresh character
  455.     Hero.class = -1
  456.     Hero.id = ""
  457.     Hero.xp = 0 '              Â¿
  458.     Hero.nextXp = 100 '        Â³ with no xp
  459.     Hero.prevNextXp = 0 '      Â³
  460.     Hero.attributePoints = 2 ' ¾<------!!!!!!! set me to 0 after testing
  461.     FOR i% = 0 TO 5
  462.         SpellsIknow%%(i%) = 1 ' you don't know any spells 'CHANGE ME TO 0 AFTER TESTING
  463.     NEXT i%
  464.     chooseClass '¿ don't switch
  465.     enterName '  Ã™ the order!
  466.     'Û LOAD CHARACTER INITIAL VARIABLES Û
  467.     SELECT CASE Hero.class 'according to class
  468.         CASE 0 'Barbarian       ¿
  469.             Hero.strength = 20 '³
  470.             Hero.agility = 10 ' ³ BARBARIAN
  471.             Hero.power = 5 '    Â³ SKILLS
  472.             Hero.vigor = 15 '   Ù
  473.         CASE 1 ' Clerig         ¿
  474.             Hero.strength = 15 '³
  475.             Hero.agility = 5 '  Â³ CLERIG
  476.             Hero.power = 10 '   ³ SKILLS
  477.             Hero.vigor = 20 '   Ù
  478.         CASE 2 'Assasin         ¿
  479.             Hero.strength = 10 '³
  480.             Hero.agility = 20 ' ³ ASSASIN
  481.             Hero.power = 5 '    Â³ SKILLS
  482.             Hero.vigor = 15 '   Ù
  483.         CASE 3 'Wizard          Â¿
  484.             Hero.strength = 5 ' ³
  485.             Hero.agility = 10 ' ³ WIZARD
  486.             Hero.power = 20 '   ³ SKILLS
  487.             Hero.vigor = 15 '   ³
  488.     END SELECT '                Ã™
  489.  
  490.     Hero.life = calculateMaxLife%
  491.     Hero.mana = calculateMaxMana%
  492.  
  493.     FOR i% = 0 TO 22
  494.         cleanOnePocketSlot i% ' clearPocket
  495.     NEXT i%
  496.  
  497.     equipOurHero
  498.     loadEnemiesInitialVariables
  499.     loadMechsInitialVariables
  500.     'showHistory 0
  501.  
  502.     actualMapWorking%% = 0 ' ¿ we start
  503.     Hero.x = 32 '            Â³ at this
  504.     Hero.y = 64 '            Ã™ place
  505.  
  506. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  507. SUB loadGame () 'INCOMPLETE
  508.  
  509.     DIM leaving%
  510.     DIM keyPress$
  511.     DIM i%
  512.     DIM heroName$
  513.     DIM inputNumber%
  514.     DIM inputNumber2%
  515.     DIM tmpString$
  516.     DIM slot&(2)
  517.  
  518.     leaving% = 0
  519.     CHDIR ".\.." 'to data
  520.     CHDIR ".\saved" 'into saved
  521.     DO
  522.         _LIMIT 60
  523.         CLS , GREEN3
  524.         getMouseData
  525.  
  526.         drawMenuBack 240, 99, 391, 306
  527.         COLOR GREEN1, GREEN4 '¿
  528.         LOCATE 8, 36 '        Â³ TITLE
  529.         PRINT "LOAD  GAME"; ' Ù
  530.  
  531.         keyPress$ = INKEY$ '
  532.         IF keyPress$ <> "" THEN '
  533.             IF ASC(keyPress$) = 27 THEN leaving% = 1 '
  534.         END IF '
  535.  
  536.         FOR i% = 0 TO 2 '
  537.             drawItemSlots 252, 142 + (i% * 48) '
  538.             slot&(i%) = FREEFILE
  539.             COLOR GREEN1, GREEN4
  540.             LOCATE 10 + (i% * 3), 37
  541.             tmpString$ = ".\save" + _TRIM$(STR$(i% + 1))
  542.             IF _DIREXISTS(tmpString$) THEN
  543.                 CHDIR tmpString$
  544.                 tmpString$ = "s" + _TRIM$(STR$(i% + 1)) + "Game.txt"
  545.                 OPEN tmpString$ FOR INPUT AS #slot&(i%)
  546.                 INPUT #slot&(i%), heroName$
  547.                 INPUT #slot&(i%), inputNumber%
  548.                 INPUT #slot&(i%), inputNumber2%
  549.                 CLOSE #slot&(i%)
  550.                 CHDIR ".\.."
  551.                 tmpString$ = calculateNameOfHeroClass$(inputNumber%) '
  552.                 tmpString$ = tmpString$ + "(" + _TRIM$(STR$(inputNumber2%)) + ")" '
  553.                 IF fingerIsOnSurface%(252, 142 + (i% * 48), 123, 32) THEN '
  554.                     COLOR GREEN4, GREEN1 '
  555.                     'IF Finger.clickL THEN acceptedLoadGame(1): EXIT DO? or EXIT SUB?
  556.                 END IF '
  557.                 PRINT heroName$ '
  558.                 LOCATE 11 + (i% * 3), 37 '
  559.                 PRINT tmpString$ '
  560.                 _PUTIMAGE (252, 142 + (i% * 48)), calculateHeroImg&(inputNumber%, inputNumber2%) '
  561.             ELSE
  562.                 PRINT "Empty slot" '
  563.             END IF
  564.         NEXT i% '
  565.  
  566.         _PUTIMAGE (Finger.x, Finger.y), FingerImg&(1)
  567.         _DISPLAY
  568.     LOOP UNTIL leaving% = 1
  569.     CHDIR ".\.." ' back to data
  570.     CHDIR ".\tmp" 'and then to tmp
  571. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  572. SUB saveGame () 'INCOMPLETE
  573.     drawMenuBack 247, 99, 391, 274
  574.     LOCATE 8, 36 '    Â¿ TITLE
  575.     PRINT "SAVE  GAME"; ' Ù
  576. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  577. SUB helpMenu () ' INCOMPLETE
  578.     LOCATE 1, 1
  579.     PRINT "How to play"
  580.  
  581. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  582. SUB chooseClass ()
  583.     DIM i% ' ¿ LOCALS
  584.     DIM ii% 'Ù
  585.     DO
  586.         _LIMIT 60
  587.         getMouseData
  588.         CLS , GREEN3 'all screen clear on green3
  589.         drawMenuBack 240, 99, 398, 280
  590.         LOCATE 8, 35 '                                               ¿ TITLE
  591.         PRINT "CHOOSE CLASS"; ' Barbarian, Clerig, Assasin or Wizard Ù
  592.         FOR i% = 0 TO 3: drawItemSlots 252 + i% * 34, 139: NEXT i% ' slots for hero images
  593.         _PUTIMAGE (252, 139), HeroImg&(0) ' Barbarian ¿
  594.         _PUTIMAGE (286, 139), HeroImg&(2) ' Clerig    Â³ characters
  595.         _PUTIMAGE (320, 139), HeroImg&(4) ' Assasin   ³ images
  596.         _PUTIMAGE (354, 139), HeroImg&(6) ' Wizard    Ã™
  597.         LOCATE 14, 33: PRINT "Strength"; '¿ static
  598.         LOCATE 15, 34: PRINT "Agility"; ' ³ ATRIBUTTE
  599.         LOCATE 16, 36: PRINT "Power"; '   ³ WORDS
  600.         LOCATE 17, 36: PRINT "Vigor"; '   Ù
  601.         FOR i% = 0 TO 3 '                                             ¿
  602.             _PUTIMAGE (327, i% * 16 + 212), BarImg&(0) ' open         ³
  603.             _PUTIMAGE (367, i% * 16 + 212), BarImg&(6) ' close        Â³ static
  604.             FOR ii% = 0 TO 3 '                                        Â³ BARS
  605.                 _PUTIMAGE (ii% * 8 + 335, i% * 16 + 212), BarImg&(5) '³
  606.             NEXT ii% '                                                Â³
  607.         NEXT i% '                                                     Ù
  608.         IF fingerIsOnSurface%(252, 139, 32, 32) THEN '    Â¿
  609.             LOCATE 13, 37 '                               ³
  610.             PRINT "Barbarian"; '                          Â³
  611.             barShowingPercentage 327, 212, 100 'STRENGTH  Â³
  612.             barShowingPercentage 327, 228, 50 'AGILITY    Â³ BARBARIAN
  613.             barShowingPercentage 327, 244, 25 'POWER      Â³
  614.             barShowingPercentage 327, 260, 75 ' VIGOR     ³
  615.             IF Finger.clickL THEN Hero.class = 0 '        Â¾
  616.         ELSEIF fingerIsOnSurface%(286, 139, 32, 32) THEN '¿
  617.             LOCATE 13, 38 '                               ³
  618.             PRINT "Clerig"; '                             ³
  619.             barShowingPercentage 327, 212, 75 'STRENGTH   ³
  620.             barShowingPercentage 327, 228, 25 'AGILITY    Â³ CLERIG
  621.             barShowingPercentage 327, 244, 50 'POWER      Â³
  622.             barShowingPercentage 327, 260, 100 ' VIGOR    Â³
  623.             IF Finger.clickL THEN Hero.class = 1 '        Â¾
  624.         ELSEIF fingerIsOnSurface%(320, 139, 32, 32) THEN '¿
  625.             LOCATE 13, 38 '                               ³
  626.             PRINT "Assasin"; '                            Â³
  627.             barShowingPercentage 327, 212, 50 'STRENGTH   ³
  628.             barShowingPercentage 327, 228, 100 'AGILITY   ³ ASSASIN
  629.             barShowingPercentage 327, 244, 25 'POWER      Â³
  630.             barShowingPercentage 327, 260, 75 ' VIGOR     ³
  631.             IF Finger.clickL THEN Hero.class = 2 '        Â¾
  632.         ELSEIF fingerIsOnSurface%(354, 139, 32, 32) THEN '¿
  633.             LOCATE 13, 38 '                               ³
  634.             PRINT "Wizard"; '                             ³
  635.             barShowingPercentage 327, 212, 25 'STRENGTH   ³
  636.             barShowingPercentage 327, 228, 50 'AGILITY    Â³ WIZARD
  637.             barShowingPercentage 327, 244, 100 'POWER     ³
  638.             barShowingPercentage 327, 260, 75 ' VIGOR     ³
  639.             IF Finger.clickL THEN Hero.class = 3 '        Â³
  640.         END IF '                                          Â¾
  641.         _PUTIMAGE (Finger.x - 1, Finger.y - 1), FingerImg&(1) ' show finger
  642.         _DISPLAY
  643.     LOOP UNTIL Hero.class <> -1 ' leave when we have a class
  644. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - -
  645. SUB enterName () '
  646.     DIM playerChoosingName$ '¿
  647.     DIM suffixForName$ '     ³
  648.     DIM key$ '               ³ LOCALS
  649.     DIM i% '                 ³
  650.     DIM ii% '                Ã™
  651.     Hero.id = "" '             ¿ get ready for recive
  652.     playerChoosingName$ = "" ' Ù something
  653.     suffixForName$ = "the "
  654.     SELECT CASE Hero.class ' Hero.class in words                Â¿
  655.         CASE 0: suffixForName$ = suffixForName$ + "Barbarian" ' ³
  656.         CASE 1: suffixForName$ = suffixForName$ + "Clerig" '    Â³
  657.         CASE 2: suffixForName$ = suffixForName$ + "Assasin" '   ³ we already have
  658.         CASE 3: suffixForName$ = suffixForName$ + "Wizard" '    Â³ an rpg class ;)
  659.     END SELECT '                                                Â³
  660.     ii% = 40 - (LEN(suffixForName$) \ 2) ' center it            Ã™
  661.     DO
  662.         _LIMIT 60
  663.         getMouseData
  664.         CLS , GREEN3 'all screen clear on green3
  665.         drawMenuBack 240, 99, 398, 274
  666.         LOCATE 8, 34 '              Â¿ TITLE
  667.         PRINT "ENTER YOUR NAME"; '  Ã™
  668.         drawItemSlots 303, 139 ' slot for hero image
  669.         SELECT CASE Hero.class ' images of possible hero chosen
  670.             CASE 0: _PUTIMAGE (303, 139), HeroImg&(0)
  671.             CASE 1: _PUTIMAGE (303, 139), HeroImg&(2)
  672.             CASE 2: _PUTIMAGE (303, 139), HeroImg&(4)
  673.             CASE 3: _PUTIMAGE (303, 139), HeroImg&(6)
  674.         END SELECT '
  675.         LOCATE 12, 32 '               ¿ print
  676.         PRINT "This story begins"; '  Â³ text pre
  677.         LOCATE 13, 32 '               ³ name
  678.         PRINT "with a hero called"; ' Ù
  679.         key$ = INKEY$ ' get the key                                                                                                                     ¿
  680.         IF key$ <> "" THEN '                                                                                                                            Â³
  681.             ' write                                                                                                                                     ³
  682.             IF LEN(playerChoosingName$) < 11 THEN '                                                                                                     ³ keyboard
  683.                 IF ((ASC(key$) > 96 AND ASC(key$) < 123)) THEN playerChoosingName$ = playerChoosingName$ + key$ '                                       ³ inputs
  684.             END IF '                                                                                                                                    Â³ for this
  685.             IF LEN(playerChoosingName$) > 0 THEN ' if the name has at least one character                                                               ³ particular
  686.                 IF LEN(playerChoosingName$) = 1 THEN playerChoosingName$ = UCASE$(playerChoosingName$) 'capitalize the first one                        Â³
  687.                 IF ASC(key$) = 8 THEN playerChoosingName$ = LEFT$(playerChoosingName$, LEN(playerChoosingName$) - 1) ' if backspace erease one letter   ³ menu
  688.                 IF ASC(key$) = 13 THEN Hero.id = playerChoosingName$ ' confirm name                                                                     ³
  689.             END IF '                                                                                                                                    Â³
  690.         END IF '                                                                                                                                        Ã™
  691.         i% = 40 - (LEN(playerChoosingName$) \ 2) '¿ print the name
  692.         LOCATE 14, i% '                           ³ the player is
  693.         PRINT playerChoosingName$; "_"; '         Ù actually writing
  694.         LOCATE 15, ii% '       ¿ print
  695.         PRINT suffixForName$; 'Ù "the " + Hero.class as words
  696.         _PUTIMAGE (287, 245), FingerImg&(5) ' GO ¿ print
  697.         _PUTIMAGE (335, 245), FingerImg&(0) ' X  Ã™ "buttons"
  698.         IF Finger.clickL THEN ' when u click                                                Â¿
  699.             IF LEN(playerChoosingName$) > 0 THEN ' and some name has been written           ³
  700.                 ' if finger position ok, then confirm name                                  Â³ mouse click
  701.                 IF fingerIsOnSurface%(287, 245, 16, 16) THEN Hero.id = playerChoosingName$ '³ inputs in
  702.             END IF '                                                                        Â³ this particular
  703.             ' if u click on the cross erease the pre-name                                   ³ menu
  704.             IF fingerIsOnSurface(335, 245, 16, 16) THEN playerChoosingName$ = "" '          Â³
  705.         END IF '                                                                            Ã™
  706.         _PUTIMAGE (Finger.x - 1, Finger.y - 1), FingerImg&(1) ' show finger
  707.         _DISPLAY
  708.     LOOP UNTIL Hero.id <> "" ' leave here when we have a name
  709. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  710. SUB lookInPocket () 'what about in case of commerce or chest, bag, bones, etc....????
  711.  
  712.     drawMenuBack 320, 32, 639, 383 ' POCKET & EQUIPED
  713.     drawMenuBack 0, 384, 639, 479 ' ITEM INFO
  714.  
  715.     LOCATE 5, 48 '
  716.     PRINT "POCKET"; '
  717.     LOCATE 5, 67 '
  718.     PRINT "EQUIPPED"; '
  719.  
  720.     _PUTIMAGE (328, 40), HUDImg&(3)
  721.     IF fingerIsOnSurface%(328, 40, 16, 16) AND inHand.lvl = -1 THEN
  722.         HUDpromt$ = "Back to game"
  723.         IF Finger.clickL THEN menuPocket` = FALSE
  724.     END IF
  725.  
  726.     FOR i% = 0 TO 22
  727.         drawItemSlots Pocket(i%).x, Pocket(i%).y ' POCKET & EQUIPPED slots draw
  728.     NEXT i%
  729.  
  730.     LINE (480, 64)-(480, 351), GREEN1 ' divisory line
  731.  
  732.     FOR i% = 0 TO 22
  733.         IF fingerIsOnSurface(Pocket(i%).x, Pocket(i%).y, 32, 32) THEN itemInformation i% ' if mouse over an item inform
  734.     NEXT i%
  735.  
  736.  
  737.     drawItemsInPocket
  738. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  739. SUB selectSomeSpell () ' INCOMPLETE
  740.  
  741.     DIM i%, j%, x%, y%
  742.  
  743.     drawMenuBack 320, 32, 639, 383
  744.     drawMenuBack 0, 384, 639, 479 ' spell info board
  745.     LOCATE 5, 58: PRINT "SPELLS";
  746.     x% = 409
  747.     y% = 120
  748.     FOR i% = 0 TO 1
  749.         FOR j% = 0 TO 2
  750.             drawItemSlots x% + (j% * 54), y% + (i% * 54)
  751.         NEXT j%
  752.     NEXT i%
  753.     IF SpellsIknow%%(0) > 0 THEN _PUTIMAGE (409, 120), SpellImg&(0)
  754.     IF SpellsIknow%%(1) > 0 THEN _PUTIMAGE (463, 120), SpellImg&(1)
  755.     IF SpellsIknow%%(2) > 0 THEN _PUTIMAGE (517, 120), SpellImg&(2)
  756.     IF SpellsIknow%%(3) > 0 THEN _PUTIMAGE (409, 174), SpellImg&(3)
  757.     IF SpellsIknow%%(4) > 0 THEN _PUTIMAGE (463, 174), SpellImg&(4)
  758.     IF SpellsIknow%%(5) > 0 THEN _PUTIMAGE (517, 174), SpellImg&(5)
  759.  
  760.  
  761.     LOCATE 17, 59: PRINT "WAND";
  762.     drawItemSlots 447, 286
  763.     LOCATE 19, 62: PRINT "CHARGES";
  764.     LOCATE 20, 62
  765.     IF Pocket(2).kind = 15 THEN
  766.         IF INSTR(Pocket(2).special, "0") THEN
  767.             _PUTIMAGE (447, 286), SpellImg&(0)
  768.         ELSEIF INSTR(Pocket(2).special, "1") THEN
  769.             _PUTIMAGE (447, 286), SpellImg&(1)
  770.         ELSEIF INSTR(Pocket(2).special, "2") THEN
  771.             _PUTIMAGE (447, 286), SpellImg&(2)
  772.         ELSEIF INSTR(Pocket(2).special, "3") THEN
  773.             _PUTIMAGE (447, 286), SpellImg&(3)
  774.         ELSEIF INSTR(Pocket(2).special, "4") THEN
  775.             _PUTIMAGE (447, 286), SpellImg&(4)
  776.         ELSEIF INSTR(Pocket(2).special, "5") THEN
  777.             _PUTIMAGE (447, 286), SpellImg&(5)
  778.         END IF
  779.         PRINT _TRIM$(STR$(Pocket(2).ammount - 1)) + "/" + _TRIM$(STR$(calculateWandMaxCharges%(Pocket(2).lvl)))
  780.     ELSE
  781.         PRINT "-/-"
  782.     END IF
  783.  
  784.     _PUTIMAGE (328, 40), HUDImg&(3)
  785.     IF fingerIsOnSurface%(328, 40, 16, 16) AND inHand.lvl = -1 AND NOT menuMain` THEN
  786.         HUDpromt$ = "Back to game"
  787.         IF Finger.clickL THEN menuSpells` = FALSE
  788.     END IF
  789.  
  790. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  791. FUNCTION calculateNameOfHeroClass$ (heroClass%)
  792.     SELECT CASE heroClass%
  793.         CASE 0: calculateNameOfHeroClass$ = "Barbarian"
  794.         CASE 1: calculateNameOfHeroClass$ = "Clerig"
  795.         CASE 2: calculateNameOfHeroClass$ = "Assasin"
  796.         CASE 3: calculateNameOfHeroClass$ = "Wizard"
  797.     END SELECT
  798. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  799. SUB showTheStats () ' STILL HAVE TO: !!!ARROW FOR UPGRADING CAN'T APPEAR IF WE REACHED TOP OF SKILL FOR CLASS!!!!
  800.  
  801.     drawMenuBack 0, 32, 319, 383 '
  802.     'drawMenuBack 0, 384, 639, 479 ' ITEM
  803.     LOCATE 5, 18 '  Â¿ TITLE
  804.     PRINT "STATS"; 'Ù
  805.  
  806.     _PUTIMAGE (297, 40), HUDImg&(3)
  807.     IF fingerIsOnSurface%(297, 40, 16, 16) AND inHand.lvl = -1 THEN
  808.         HUDpromt$ = "Back to game"
  809.         IF Finger.clickL THEN menuStats` = FALSE
  810.     END IF
  811.  
  812.     drawItemSlots 64, 96: _PUTIMAGE (64, 96), calculateHeroImg&(Hero.class, Hero.lvl)
  813.     drawItemSlots 144, 96: _PUTIMAGE (144, 104), LvlImg&(0): _PUTIMAGE (160, 104), LvlImg&(Hero.lvl)
  814.  
  815.     LOCATE 7, 28: PRINT Hero.id;
  816.     LOCATE 8, 28: PRINT calculateNameOfHeroClass$(Hero.class)
  817.  
  818.  
  819.     LOCATE 10, 19: PRINT "BASE NOW";
  820.  
  821.     'BASE
  822.     LOCATE 11, 12: PRINT "STRENGTH"; Hero.strength;
  823.     LOCATE 12, 13: PRINT "AGILITY"; Hero.agility;
  824.     LOCATE 13, 15: PRINT "POWER"; Hero.power;
  825.     LOCATE 14, 15: PRINT "VIGOR"; Hero.vigor;
  826.  
  827.     LOCATE 17, 6: PRINT "DAMAGE " + _TRIM$(STR$(calculateHeroBaseDmg%)) + " - " + _TRIM$(STR$(calculateHeroMaxDmg%));
  828.     LOCATE 17, 25: PRINT "TO HIT %"; calculateHeroChanceToHit%;
  829.     LOCATE 19, 17: PRINT "DEFENSE"; calculateHeroDefense%;
  830.     LOCATE 22, 14: PRINT "POINTS TO ADD"; Hero.attributePoints;
  831.  
  832.     IF Hero.attributePoints > 0 THEN ' if you have points
  833.  
  834.         _PUTIMAGE (184, 160), DirArrowImg&(4) ' strength         ¿
  835.         IF fingerIsOnSurface%(184, 160, 16, 16) THEN '           ³
  836.             printHUDpromt "Increase your strength" '             ³
  837.             IF Finger.clickL THEN '                              Â³
  838.                 Hero.strength = Hero.strength + 1 '              Â³
  839.                 Hero.attributePoints = Hero.attributePoints - 1 '³
  840.             END IF '                                             ³
  841.         END IF '                                                 ³
  842.         _PUTIMAGE (184, 176), DirArrowImg&(4) ' agility          Â³
  843.         IF fingerIsOnSurface%(184, 176, 16, 16) THEN '           ³
  844.             printHUDpromt "Increase your agility" '              Â³
  845.             IF Finger.clickL THEN '                              Â³
  846.                 Hero.agility = Hero.agility + 1 '                Â³ ARROWS
  847.                 Hero.attributePoints = Hero.attributePoints - 1 '³ FOR
  848.             END IF '                                             ³ UPGRADING  <---------------Need to make functions for checking topStrength, topPower, etc... calculateHeroTopVigor
  849.         END IF '                                                 ³ SKILLS
  850.         _PUTIMAGE (184, 192), DirArrowImg&(4) ' power            Â³
  851.         IF fingerIsOnSurface%(184, 192, 16, 16) THEN '           ³
  852.             printHUDpromt "Increase your power" '                Â³
  853.             IF Finger.clickL THEN '                              Â³
  854.                 Hero.power = Hero.power + 1 '                    Â³
  855.                 Hero.attributePoints = Hero.attributePoints - 1 '³
  856.             END IF '                                             ³
  857.         END IF '                                                 ³
  858.         _PUTIMAGE (184, 208), DirArrowImg&(4) ' vigor            Â³
  859.         IF fingerIsOnSurface%(184, 208, 16, 16) THEN '           ³
  860.             printHUDpromt "Increase your vigor" '                Â³
  861.             IF Finger.clickL THEN '                              Â³
  862.                 Hero.vigor = Hero.vigor + 1 '                    Â³
  863.                 Hero.attributePoints = Hero.attributePoints - 1 '³
  864.             END IF '                                             ³
  865.         END IF '                                                 ¾
  866.     ELSE
  867.         'NOW
  868.         LOCATE 11, 23: PRINT calculateHeroActualStrength%;
  869.         LOCATE 12, 23: PRINT calculateHeroActualAgility%;
  870.         LOCATE 13, 23: PRINT calculateHeroActualPower%;
  871.         LOCATE 14, 23: PRINT calculateHeroActualVigor%;
  872.     END IF
  873.     LINE (179, 146)-(179, 219), GREEN1 ' separation line between BASE & NOW
  874.  
  875. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  876.  
  877. SUB lookAtMap () ' INCOMPLETE
  878.     drawMenuBack 16, 48, 624, 464
  879.     LOCATE 4, 38
  880.     PRINT "MAP"
  881.     'closeWindowButton 608, 52
  882. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  883.  
  884. SUB cleanYourHand () '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û ITEMS Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  885.     inHand.kind = -1
  886.     inHand.lvl = -1
  887.     inHand.ammount = 0
  888.     inHand.special = ""
  889. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  890. FUNCTION lookForSpaceInPocket% ()
  891.     DIM i%
  892.     FOR i% = 7 TO 22
  893.         IF Pocket(i%).kind = -1 THEN lookForSpaceInPocket% = i%: EXIT FUNCTION
  894.     NEXT i%
  895.     lookForSpaceInPocket% = FALSE
  896. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  897. SUB clearPocket ()
  898.     FOR i% = 0 TO 22
  899.         Pocket(i%).kind = -1
  900.         Pocket(i%).lvl = -1
  901.         Pocket(i%).ammount = 0
  902.         Pocket(i%).special = ""
  903.     NEXT i%
  904. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  905. SUB createItemInPocket (kind%, lvl%, ammount%, slot%, special$)
  906.     Pocket(slot%).kind = kind%
  907.     Pocket(slot%).lvl = lvl%
  908.     Pocket(slot%).ammount = ammount%
  909.     Pocket(slot%).special = special$
  910. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  911. SUB cleanOnePocketSlot (indexOfSlot%)
  912.     Pocket(indexOfSlot%).kind = -1
  913.     Pocket(indexOfSlot%).lvl = -1
  914.     Pocket(indexOfSlot%).ammount = 0
  915.     Pocket(indexOfSlot%).special = ""
  916. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  917. SUB drawItemsOnGround ()
  918.     FOR i% = 0 TO UBOUND(Items)
  919.         IF Items(i%).map = actualmapworking% THEN
  920.             _PUTIMAGE (Items(i%).x + 8, Items(i%).y + 8), calculateItemOnGroundImage&(Items(i%).kind)
  921.         END IF
  922.     NEXT i%
  923. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  924. SUB drawItemsInPocket ()
  925.     FOR i% = 0 TO 22
  926.         _PUTIMAGE (Pocket(i%).x, Pocket(i%).y), calculateItemImage&(Pocket(i%).kind, Pocket(i%).lvl)
  927.     NEXT i%
  928.     _PUTIMAGE (inHand.x - 16, inHand.y - 16), calculateItemImage&(inHand.kind, inHand.lvl)
  929. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  930. FUNCTION calculateItemOnGroundImage& (k%)
  931.     calculateItemOnGroundImage& = GndItemsImg&(k%)
  932. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  933. FUNCTION calculateItemImage& (kind%, lvl%) 'TO DO:case 18= history or special related items
  934.     SELECT CASE kind%
  935.         CASE -1: calculateItemImage& = BlankImg&
  936.         CASE 0: calculateItemImage& = KeyImg&(lvl%)
  937.         CASE 1: calculateItemImage& = PotionImg&(lvl%)
  938.         CASE 2: calculateItemImage& = PaperImg&(lvl%)
  939.         CASE 3: calculateItemImage& = BookImg&(lvl%)
  940.         CASE 4: calculateItemImage& = SwordImg&(lvl%)
  941.         CASE 5: calculateItemImage& = AxeImg&(lvl%)
  942.         CASE 6: calculateItemImage& = ThrowImg&(lvl%)
  943.         CASE 7: calculateItemImage& = BowImg&(lvl%)
  944.         CASE 8: calculateItemImage& = CrossbowImg&(lvl%)
  945.         CASE 9: calculateItemImage& = BombImg&(lvl%)
  946.         CASE 10: calculateItemImage& = ArrowImg&(lvl%)
  947.         CASE 11: calculateItemImage& = BoltImg&(lvl%)
  948.         CASE 12: calculateItemImage& = ArmorImg&(lvl%)
  949.         CASE 13: calculateItemImage& = HelmImg&(lvl%)
  950.         CASE 14: calculateItemImage& = ShieldImg&(lvl%)
  951.         CASE 15: calculateItemImage& = WandImg&(lvl%)
  952.         CASE 16: calculateItemImage& = MoneyImg&(lvl%)
  953.         CASE 17: calculateItemImage& = BijouImg&(lvl%)
  954.             'CASE 18: calculateItemImage& = WonderImg&(lvl%)
  955.     END SELECT
  956. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.
  957. SUB actualizeMoneyAspect ()
  958.     FOR i% = 7 TO 22 '
  959.         IF Pocket(i%).kind = 16 AND Pocket(i%).lvl < 2 THEN '
  960.             IF Pocket(i%).ammount > 249 THEN '
  961.                 Pocket(i%).lvl = 1 '
  962.             ELSE '
  963.                 Pocket(i%).lvl = 0 '
  964.             END IF '
  965.         END IF '
  966.     NEXT i% '
  967.     IF inHand.kind = 16 AND inHand.lvl < 2 THEN '
  968.         IF inHand.ammount > 249 THEN '
  969.             inHand.lvl = 1 '
  970.         ELSE '
  971.             inHand.lvl = 0 '
  972.         END IF '
  973.     END IF '
  974. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  975. FUNCTION calculateWandMaxCharges% (lvl%)
  976.     calculateWandMaxCharges% = 20 + (lvl% * 5)
  977. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  978. FUNCTION calculateItemDefense% (kind%, lvl%, special$) 'TO DO:balance the game
  979.     DIM tmp%
  980.     tmp% = 0
  981.     SELECT CASE kind%
  982.         CASE 12: tmp% = 3 + 3 * lvl% ' ARMORS
  983.         CASE 13: tmp% = 1 + 1 * lvl% ' HELMS
  984.         CASE 14: tmp% = 2 + 2 * lvl% ' SHIELDS
  985.     END SELECT
  986.     IF special$ <> "" THEN
  987.         IF INSTR(special$, "d") THEN
  988.             tmp% = tmp% + VAL(RIGHT$(special$, 1))
  989.         END IF
  990.     END IF
  991.     calculateItemDefense% = tmp%
  992. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  993. FUNCTION calculateItemBaseDmg% (kind%, lvl%, special$) 'TO DO:balance the game
  994.     DIM tmp%
  995.     tmp% = 0
  996.     SELECT CASE kind%
  997.         CASE 4: tmp% = (lvl% + 1) * 2 '     SWORDS
  998.         CASE 5: tmp% = (lvl% + 1) * 3 '     AXES
  999.         CASE 6: tmp% = (lvl% + 1) '         THROWS
  1000.         CASE 7: tmp% = (lvl% + 1) * 2 '     BOWS
  1001.         CASE 8: tmp% = (lvl% + 1) * 3 '     CROSSBOWS
  1002.         CASE 9: tmp% = (lvl% + 1) * 15 '    BOMBS
  1003.         CASE 10: tmp% = (lvl% + 1) * 2 '    ARROWS
  1004.         CASE 11: tmp% = (lvl% + 1) * 3 '    BOLTS
  1005.         CASE 15: tmp% = (lvl% + 1) '        WANDS
  1006.     END SELECT
  1007.     IF special$ <> "" THEN
  1008.         IF INSTR(special$, "b") THEN
  1009.             tmp% = tmp% + VAL(RIGHT$(special$, 1))
  1010.         END IF
  1011.     END IF
  1012.     calculateItemBaseDmg% = tmp%
  1013. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1014. FUNCTION calculateItemMaxDmg% (kind%, lvl%, special$) 'TO DO: balance the game
  1015.     DIM k%
  1016.     DIM l%
  1017.     DIM s$
  1018.     DIM tmp%
  1019.     k% = kind%
  1020.     l% = lvl%
  1021.     s$ = special$
  1022.     SELECT CASE kind%
  1023.         CASE 4: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 3 '              SWORDS
  1024.         CASE 5: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 4 '              AXES
  1025.         CASE 6: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 1 '              THROWS
  1026.         CASE 7: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 2 '              BOWS
  1027.         CASE 8: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 3 '              CROSSBOWS
  1028.         CASE 9: tmp% = calculateItemBaseDmg%(k%, l%, s$) + (l% + 1) * 5 '   BOMBS
  1029.         CASE 10: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 1 '             ARROWS
  1030.         CASE 11: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 2 '             BOLTS
  1031.         CASE 15: tmp% = calculateItemBaseDmg%(k%, l%, s$) + 1 '             WANDS
  1032.     END SELECT
  1033.     IF s$ <> "" THEN
  1034.         IF INSTR(s$, "m") THEN
  1035.             tmp% = tmp% + VAL(RIGHT$(s$, 1))
  1036.         END IF
  1037.     END IF
  1038.     calculateItemMaxDmg% = tmp%
  1039. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1040. FUNCTION nameAnItem$ (kind%, lvl%, special$) 'TO DO:case 18=history related items, scroll names?
  1041.  
  1042.     DIM tmp$
  1043.  
  1044.     SELECT CASE kind%
  1045.         CASE -1 ' nothing
  1046.             tmp$ = ""
  1047.         CASE 0 '  KEYS
  1048.             SELECT CASE lvl%
  1049.                 CASE 0: tmp$ = "Tiny"
  1050.                 CASE 1: tmp$ = "Elegant"
  1051.                 CASE 2: tmp$ = "Rare"
  1052.                 CASE 3: tmp$ = "Heavy"
  1053.                 CASE 4: tmp$ = "Criptyc"
  1054.                 CASE 5: tmp$ = "Twisted"
  1055.             END SELECT
  1056.             tmp$ = tmp$ + " key"
  1057.         CASE 1 '  POTIONS
  1058.             SELECT CASE lvl% '
  1059.                 CASE 0: tmp$ = "Minor"
  1060.                 CASE 1: tmp$ = "Light"
  1061.                 CASE 2: tmp$ = "Small"
  1062.                 CASE 3: tmp$ = "Medium"
  1063.                 CASE 4: nameAnItem$ = "Potion": EXIT FUNCTION
  1064.                 CASE 5: tmp$ = "Large"
  1065.                 CASE 6: tmp$ = "Big"
  1066.                 CASE 7: tmp$ = "Full"
  1067.             END SELECT
  1068.             tmp$ = tmp$ + " potion"
  1069.         CASE 2 '  PAPERS
  1070.             SELECT CASE lvl%
  1071.                 CASE 0: tmp$ = "Scroll"
  1072.                 CASE 1: tmp$ = "Map"
  1073.             END SELECT
  1074.         CASE 3 '  BOOKS
  1075.             SELECT CASE lvl%
  1076.                 CASE 0: tmp$ = "Ancient book"
  1077.                 CASE 1: tmp$ = "Old book"
  1078.                 CASE 2: tmp$ = "Tome"
  1079.                 CASE 3: tmp$ = "Enciclopedy"
  1080.             END SELECT
  1081.         CASE 4 '  SWORDS
  1082.             SELECT CASE lvl%
  1083.                 CASE 0: tmp$ = "Small"
  1084.                 CASE 1: tmp$ = "Curve"
  1085.                 CASE 2: tmp$ = "Templed"
  1086.                 CASE 3: tmp$ = "Medium"
  1087.                 CASE 4: nameAnItem$ = "Sabre" + itemSpecialSuffix$(special$): EXIT FUNCTION
  1088.                 CASE 5: tmp$ = "Sharpened"
  1089.                 CASE 6: tmp$ = "Celestial"
  1090.                 CASE 7: tmp$ = "Demoniac"
  1091.             END SELECT
  1092.             tmp$ = tmp$ + " sword"
  1093.         CASE 5 '  AXES
  1094.             SELECT CASE lvl%
  1095.                 CASE 0: tmp$ = "Bushcraft"
  1096.                 CASE 1: tmp$ = "Small"
  1097.                 CASE 2: nameAnItem$ = "Bardiche" + itemSpecialSuffix$(special$): EXIT FUNCTION
  1098.                 CASE 3: tmp$ = "Medium"
  1099.                 CASE 4: tmp$ = "Double"
  1100.                 CASE 5: tmp$ = "Sharp double"
  1101.                 CASE 6: tmp$ = "War"
  1102.                 CASE 7: tmp$ = "Demoniac"
  1103.             END SELECT
  1104.             tmp$ = tmp$ + " axe"
  1105.         CASE 6 '  THROWS
  1106.             SELECT CASE lvl%
  1107.                 CASE 0: tmp$ = "Light"
  1108.                 CASE 1: tmp$ = "Heavy"
  1109.                 CASE 2: nameAnItem$ = "Throwin knives": EXIT FUNCTION
  1110.             END SELECT
  1111.             tmp$ = tmp$ + " shurikens"
  1112.         CASE 7 '  BOWS
  1113.             SELECT CASE lvl%
  1114.                 CASE 0: tmp$ = "Hunter"
  1115.                 CASE 1: tmp$ = "Composite"
  1116.                 CASE 2: tmp$ = "War"
  1117.             END SELECT
  1118.             tmp$ = tmp$ + " bow"
  1119.         CASE 8 '  CROSSBOWS
  1120.             SELECT CASE lvl%
  1121.                 CASE 0: tmp$ = "Light"
  1122.                 CASE 1: tmp$ = "Heavy"
  1123.             END SELECT
  1124.             tmp$ = tmp$ + " crossbow"
  1125.         CASE 9 '  BOMBS
  1126.             SELECT CASE lvl%
  1127.                 CASE 0: tmp$ = "Small"
  1128.                 CASE 1: tmp$ = "Medium"
  1129.                 CASE 2: tmp$ = "Large"
  1130.             END SELECT
  1131.             tmp$ = tmp$ + " bombs"
  1132.         CASE 10 ' ARROWS
  1133.             SELECT CASE lvl%
  1134.                 CASE 0: tmp$ = "Light"
  1135.                 CASE 1: tmp$ = "Sharp"
  1136.                 CASE 2: tmp$ = "Heavy"
  1137.             END SELECT
  1138.             tmp$ = tmp$ + " arrows"
  1139.         CASE 11 ' BOLTS
  1140.             SELECT CASE lvl%
  1141.                 CASE 0: tmp$ = "Light"
  1142.                 CASE 1: tmp$ = "Heavy"
  1143.             END SELECT
  1144.             tmp$ = tmp$ + " bolts"
  1145.         CASE 12 ' ARMORS
  1146.             SELECT CASE lvl%
  1147.                 CASE 0: nameAnItem$ = "Leather vest" + itemSpecialSuffix$(special$): EXIT FUNCTION
  1148.                 CASE 1: nameAnItem$ = "Leather armor" + itemSpecialSuffix$(special$): EXIT FUNCTION
  1149.                 CASE 2: nameAnItem$ = "Ring mail" + itemSpecialSuffix$(special$): EXIT FUNCTION
  1150.                 CASE 3: tmp$ = "Small"
  1151.                 CASE 4: tmp$ = "Medium"
  1152.                 CASE 5: tmp$ = "Heavy"
  1153.                 CASE 6: tmp$ = "War"
  1154.                 CASE 7: tmp$ = "Full"
  1155.             END SELECT
  1156.             tmp$ = tmp$ + " plate"
  1157.         CASE 13 ' HELMS
  1158.             SELECT CASE lvl%
  1159.                 CASE 0: tmp$ = "Small"
  1160.                 CASE 1: tmp$ = "Medium"
  1161.                 CASE 2: tmp$ = "Full"
  1162.                 CASE 3: nameAnItem$ = "Half helm" + itemSpecialSuffix$(special$): EXIT FUNCTION
  1163.                 CASE 4: nameAnItem$ = "Full helm" + itemSpecialSuffix$(special$): EXIT FUNCTION
  1164.                 CASE 5: nameAnItem$ = "Small Helmet" + itemSpecialSuffix$(special$): EXIT FUNCTION
  1165.                 CASE 6: nameAnItem$ = "Great healmet" + itemSpecialSuffix$(special$): EXIT FUNCTION
  1166.                 CASE 7: nameAnItem$ = "Hellking Crown" + itemSpecialSuffix$(special$): EXIT FUNCTION
  1167.             END SELECT
  1168.             tmp$ = tmp$ + " cap"
  1169.         CASE 14 ' SHIELDS
  1170.             SELECT CASE lvl%
  1171.                 CASE 0: tmp$ = "Small"
  1172.                 CASE 1: tmp$ = "Medium"
  1173.                 CASE 2: tmp$ = "Large"
  1174.                 CASE 3: tmp$ = "Great"
  1175.                 CASE 4: tmp$ = "Bronze"
  1176.                 CASE 5: tmp$ = "Iron"
  1177.                 CASE 6: tmp$ = "Steel"
  1178.                 CASE 7: tmp$ = "War"
  1179.             END SELECT
  1180.             tmp$ = tmp$ + " shield"
  1181.         CASE 15 ' WANDS
  1182.             SELECT CASE lvl%
  1183.                 CASE 0: tmp$ = "Apprentice"
  1184.                 CASE 1: tmp$ = "Initiate"
  1185.                 CASE 2: tmp$ = "Learner"
  1186.                 CASE 3: tmp$ = "Academic"
  1187.                 CASE 4: tmp$ = "Sacred"
  1188.                 CASE 5: tmp$ = "Dark"
  1189.                 CASE 6: tmp$ = "Egiptian"
  1190.                 CASE 7: tmp$ = "Voodoo"
  1191.             END SELECT
  1192.             tmp$ = tmp$ + " wand"
  1193.         CASE 16 ' MONEY
  1194.             SELECT CASE lvl%
  1195.                 CASE 0: tmp$ = "Coins"
  1196.                 CASE 1: tmp$ = "Many coins"
  1197.                 CASE 2: tmp$ = "Crude gemstones"
  1198.                 CASE 3: tmp$ = "Gemstone"
  1199.             END SELECT
  1200.         CASE 17 ' BIJOUTERY
  1201.             SELECT CASE lvl%
  1202.                 CASE 0: tmp$ = "Circlet"
  1203.                 CASE 1: tmp$ = "Ring"
  1204.                 CASE 2: tmp$ = "Said"
  1205.                 CASE 3: tmp$ = "Necklace"
  1206.             END SELECT
  1207.             'CASE 18 '
  1208.             '    SELECT CASE lvl%
  1209.             '        CASE 0: tmp$ = "Dyran crystals"
  1210.             '        CASE 1: tmp$ = "The Orb"
  1211.             '    END SELECT
  1212.     END SELECT
  1213.     nameAnItem$ = tmp$ + itemSpecialSuffix$(special$)
  1214. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1215. FUNCTION itemSpecialSuffix$ (s$)
  1216.  
  1217.     DIM tmp$
  1218.  
  1219.     IF s$ <> "" THEN
  1220.         IF INSTR(s$, "s") THEN ' adds to STR
  1221.             SELECT CASE VAL(RIGHT$(s$, 1))
  1222.                 CASE 1: tmp$ = "might"
  1223.                 CASE 2: tmp$ = "warriors"
  1224.                 CASE 3: tmp$ = "titans"
  1225.             END SELECT
  1226.         ELSEIF INSTR(s$, "a") THEN ' adds to AGI
  1227.             SELECT CASE VAL(RIGHT$(s$, 1))
  1228.                 CASE 1: tmp$ = "reflex"
  1229.                 CASE 2: tmp$ = "swiftness"
  1230.                 CASE 3: tmp$ = "martiality"
  1231.             END SELECT
  1232.         ELSEIF INSTR(s$, "p") THEN ' adds to PWR
  1233.             SELECT CASE VAL(RIGHT$(s$, 1))
  1234.                 CASE 1: tmp$ = "ilusionism"
  1235.                 CASE 2: tmp$ = "invocation"
  1236.                 CASE 3: tmp$ = "necromancy"
  1237.             END SELECT
  1238.         ELSEIF INSTR(s$, "v") THEN ' adds to VIG
  1239.             SELECT CASE VAL(RIGHT$(s$, 1))
  1240.                 CASE 1: tmp$ = "youthness"
  1241.                 CASE 2: tmp$ = "longevity"
  1242.                 CASE 3: tmp$ = "eternity"
  1243.             END SELECT
  1244.         ELSEIF INSTR(s$, "d") THEN ' adds to DEF
  1245.             SELECT CASE VAL(RIGHT$(s$, 1))
  1246.                 CASE 1: tmp$ = "protection"
  1247.                 CASE 2: tmp$ = "guardian"
  1248.                 CASE 3: tmp$ = "angels"
  1249.             END SELECT
  1250.         ELSEIF INSTR(s$, "m") THEN ' adds to MAX DMG
  1251.             SELECT CASE VAL(RIGHT$(s$, 1))
  1252.                 CASE 1: tmp$ = "fatality"
  1253.                 CASE 2: tmp$ = "brutality"
  1254.                 CASE 3: tmp$ = "animality"
  1255.             END SELECT
  1256.         ELSEIF INSTR(s$, "b") THEN ' adds to BASE DMG
  1257.             SELECT CASE VAL(RIGHT$(s$, 1))
  1258.                 CASE 1: tmp$ = "craftmanship"
  1259.                 CASE 2: tmp$ = "technicism"
  1260.                 CASE 3: tmp$ = "engineering"
  1261.             END SELECT
  1262.         ELSEIF INSTR(s$, "c") THEN ' adds to TO HIT%
  1263.             SELECT CASE VAL(RIGHT$(s$, 1))
  1264.                 CASE 1: tmp$ = "aiming"
  1265.                 CASE 2: tmp$ = "exactitud"
  1266.                 CASE 3: tmp$ = "precision"
  1267.             END SELECT
  1268.         ELSEIF INSTR(s$, "t") OR INSTR(s$, "r") THEN ' teaches or can cast some spell
  1269.             SELECT CASE VAL(RIGHT$(s$, 1))
  1270.                 CASE 0: tmp$ = "firebolt"
  1271.                 CASE 1: tmp$ = "blessing"
  1272.                 CASE 2: tmp$ = "infravision"
  1273.                 CASE 3: tmp$ = "teleport"
  1274.                 CASE 4: tmp$ = "healing"
  1275.                 CASE 5: tmp$ = "mana shield"
  1276.             END SELECT
  1277.         ELSEIF INSTR(s$, "u") THEN ' unidentified
  1278.             itemSpecialSuffix$ = " (Unidentified)": EXIT FUNCTION
  1279.         END IF
  1280.         itemSpecialSuffix$ = " of " + tmp$
  1281.     ELSE
  1282.         itemSpecialSuffix$ = ""
  1283.     END IF
  1284.  
  1285. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1286. SUB fromPocketToHand (slotIndex%)
  1287.     inHand.kind = Pocket(slotIndex%).kind
  1288.     inHand.lvl = Pocket(slotIndex%).lvl
  1289.     inHand.ammount = Pocket(slotIndex%).ammount
  1290.     inHand.special = Pocket(slotIndex%).special
  1291.     cleanOnePocketSlot slotIndex%
  1292. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1293. SUB fromHandToPocket (slotIndex%)
  1294.     Pocket(slotIndex%).kind = inHand.kind
  1295.     Pocket(slotIndex%).lvl = inHand.lvl
  1296.     Pocket(slotIndex%).ammount = inHand.ammount
  1297.     Pocket(slotIndex%).special = inHand.special
  1298.     cleanYourHand
  1299. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1300. SUB dropItemToGround ()
  1301.     REDIM _PRESERVE Items(UBOUND(items) + 1) AS OBJECT ' increase the Items array index by one
  1302.     Items(UBOUND(Items)).x = Hero.x '
  1303.     Items(UBOUND(Items)).y = Hero.y '
  1304.     Items(UBOUND(Items)).kind = inHand.kind '
  1305.     Items(UBOUND(Items)).lvl = inHand.lvl '
  1306.     Items(UBOUND(Items)).ammount = inHand.ammount '
  1307.     Items(UBOUND(Items)).special = inHand.special '
  1308.     Items(UBOUND(Items)).map = actualMapWorking%% '
  1309.     cleanYourHand
  1310. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1311. SUB pickItemFromGround (indexOfItem%)
  1312.     IF lookForSpaceInPocket% THEN '                                                 if theres place in your pocket
  1313.         IF indexOfItem% = UBOUND(Items) THEN '                                      and that item is the last one of the array
  1314.             Pocket(lookForSpaceInPocket%).kind = Items(idexOfItem%).kind '      Â¿
  1315.             Pocket(lookForSpaceInPocket%).lvl = Items(idexOfItem%).lvl '        Â³   Transfer the data of the item to
  1316.             Pocket(lookForSpaceInPocket%).ammount = Items(idexOfItem%).ammount '³   the free place on Pocket
  1317.             Pocket(lookForSpaceInPocket%).special = Items(idexOfItem%).special '¾
  1318.             REDIM _PRESERVE Items(UBOUND(Items) - 1) AS OBJECT '                    and reduce the array by one (destroying the last one)
  1319.         ELSE ' but if the item is not the last one of the array
  1320.             Pocket(lookForSpaceInPocket%).kind = Items(idexOfItem%).kind '      Â¿
  1321.             Pocket(lookForSpaceInPocket%).lvl = Items(idexOfItem%).lvl '        Â³   Transfer the data of the item to
  1322.             Pocket(lookForSpaceInPocket%).ammount = Items(idexOfItem%).ammount '³   the free place on Pocket
  1323.             Pocket(lookForSpaceInPocket%).special = Items(idexOfItem%).special '¾
  1324.             Items(indexOfItem%).x = Items(UBOUND(Items)).x '                    Â¿
  1325.             Items(indexOfItem%).y = Items(UBOUND(Items)).y '                    Â³
  1326.             Items(indexOfItem%).kind = Items(UBOUND(Items)).kind '              Â³   copy all the data of the last item
  1327.             Items(indexOfItem%).lvl = Items(UBOUND(Items)).lvl '                Â³   in the array to this index of the array,
  1328.             Items(indexOfItem%).ammount = Items(UBOUND(Items)).ammount '        Â³   overwriting the item we just picked
  1329.             Items(indexOfItem%).special = Items(UBOUND(Items)).special '        Â³
  1330.             Items(indexOfItem%).map = Items(UBOUND(Items)).map '                Â¾
  1331.             REDIM _PRESERVE Items(UBOUND(Items) - 1) AS OBJECT '                    now we can eliminate the last item of the array (it has been copied to the picked item index)
  1332.         END IF
  1333.     ELSE '                                                                          if you have no room in pocket
  1334.         HUDpromt$ = "You have no room on your pocket" '                             you should be aware of it
  1335.     END IF
  1336. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1337. SUB itemManipulation () 'TO DO: reading scrolls
  1338.     DIM i%
  1339.     DIM special$
  1340.     DIM specialNum%
  1341.  
  1342.     FOR i% = 7 TO 22 ' INVENTORY
  1343.         IF fingerIsOnSurface%(Pocket(i%).x, Pocket(i%).y, 32, 32) THEN
  1344.             IF NOT itemRequirementsMet%(i%) THEN HUDpromt$ = "Requirements don't met"
  1345.             IF Finger.clickL AND (Pocket(i%).lvl <> -1 AND inHand.lvl = -1) THEN 'grabbing an item from a slot
  1346.                 fromPocketToHand i%
  1347.             ELSEIF Finger.clickL AND (Pocket(i%).lvl = -1 AND inHand.lvl <> -1) THEN 'droping an item into an empty slot
  1348.                 fromHandToPocket i%
  1349.             ELSEIF Finger.clickL AND inHand.lvl <> -1 AND Pocket(i%).kind = inHand.kind THEN 'trying to add multiple instances of the same thing
  1350.                 checkForAddingAmmounts i%
  1351.             END IF
  1352.             IF Finger.clickR THEN ' if RIGHT click
  1353.                 SELECT CASE Pocket(i%).kind
  1354.                     CASE 1 ' potions
  1355.                         SOUND 440, 1
  1356.                         Hero.life = Hero.life + (Pocket(i%).lvl + 1) * 5 ' increase helth ¿ DRINKING A POTION
  1357.                         cleanOnePocketSlot i% '                      and destroy the item ¾
  1358.                     CASE 2 ' papers
  1359.                         IF Pocket(i%).lvl = 1 THEN '¿
  1360.                             menuPocket` = FALSE '   ³ READING THE MAP
  1361.                             menuSpells` = FALSE '   ³
  1362.                             menuStats` = FALSE '    Â³
  1363.                             menuMap` = TRUE '       ¾
  1364.                         ELSEIF Pocket(i%).lvl = 0 THEN '¿
  1365.                             '                           ³ TO DO: reading a scroll
  1366.                         END IF '                        Â¾
  1367.  
  1368.                     CASE 3 'books
  1369.                         IF itemRequirementsMet%(i%) THEN
  1370.                             specialNum% = VAL(RIGHT$(Pocket(i%).special, 1)) 'convert the second digit of special into a value and the CASE SELECT it for adding 1 to the corrresponding spell, if is't less than 10
  1371.                             SELECT CASE specialNum%
  1372.                                 CASE 0: IF SpellsIknow%%(0) < 10 THEN SpellsIknow%%(0) = spellsiknow%% + 1
  1373.                                 CASE 1: IF SpellsIknow%%(1) < 10 THEN SpellsIknow%%(1) = spellsiknow%% + 1
  1374.                                 CASE 2: IF SpellsIknow%%(2) < 10 THEN SpellsIknow%%(2) = spellsiknow%% + 1
  1375.                                 CASE 3: IF SpellsIknow%%(3) < 10 THEN SpellsIknow%%(3) = spellsiknow%% + 1
  1376.                                 CASE 4: IF SpellsIknow%%(4) < 10 THEN SpellsIknow%%(4) = spellsiknow%% + 1
  1377.                                 CASE 5: IF SpellsIknow%%(5) < 10 THEN SpellsIknow%%(5) = spellsiknow%% + 1
  1378.                             END SELECT
  1379.                             cleanOnePocketSlot i% '                         and destroy the item
  1380.                         ELSE '                                              if requirements aren't met or spell is lvl 10 already
  1381.                             SOUND 220, 1 '                                  play "booooooo" sound
  1382.                         END IF
  1383.                 END SELECT
  1384.             END IF
  1385.         END IF
  1386.     NEXT i%
  1387.  
  1388.     FOR i% = 0 TO 6 ' EQUIPPED
  1389.         IF fingerIsOnSurface%(Pocket(i%).x, Pocket(i%).y, 32, 32) THEN
  1390.             IF Finger.clickL AND (Pocket(i%).lvl <> -1 AND inHand.lvl = -1) THEN
  1391.                 fromPocketToHand i% ' if LEFT click grab an item from a slot. No big deal on this
  1392.             ELSEIF Finger.clickL AND inHand.lvl <> -1 AND Pocket(i%).kind = inHand.kind AND Pocket(i%).lvl = inHand.lvl THEN 'trying to add multiple instances of the same thing
  1393.                 checkForAddingAmmounts i%
  1394.             ELSEIF Pocket(i%).lvl = -1 AND inHand.lvl <> -1 THEN 'droping an item into a slot needs to check and inform some things
  1395.                 IF itemFitsEquipmentSlot%(i%) THEN
  1396.                     IF itemRequirementsMet%(0) THEN
  1397.                         IF Finger.clickL THEN fromHandToPocket i%
  1398.                     ELSE
  1399.                         HUDpromt$ = "Requirements not met"
  1400.                     END IF
  1401.                 END IF
  1402.             END IF
  1403.         END IF
  1404.     NEXT i%
  1405.     IF Finger.clickL AND inHand.kind <> -1 AND fingerIsOnSurface%(0, 32, 319, 384) THEN dropItemToGround
  1406. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1407. SUB checkForAddingAmmounts (indexOfSlot%) ' in a single slot you can fir: 500 coins; 100 throws; 75 arrows, 50 bolts or 6 bombs
  1408.     DIM tmp1%
  1409.     IF Pocket(indexOfSlot%).lvl = inHand.lvl THEN
  1410.         SELECT CASE inHand.kind
  1411.             CASE 6 '                                                                                    throws
  1412.                 IF inHand.ammount + Pocket(indexOfSlot%).ammount > 100 THEN
  1413.                     tmp1% = 100 - Pocket(indexOfSlot%).ammount
  1414.                     Pocket(indexOfSlot%).ammount = Pocket(indexOfSlot%).ammount + tmp1%
  1415.                     inHand.ammount = inHand.ammount - tmp1%
  1416.                 ELSE
  1417.                     Pocket(indexOfSlot%).ammount = Pocket(indexOfSlot%).ammount + inHand.ammount
  1418.                     cleanYourHand
  1419.                 END IF
  1420.             CASE 9 '                                                                                    bombs
  1421.                 IF inHand.ammount + Pocket(indexOfSlot%).ammount > 6 THEN
  1422.                     tmp1% = 6 - Pocket(indexOfSlot%).ammount
  1423.                     Pocket(indexOfSlot%).ammount = Pocket(indexOfSlot%).ammount + tmp1%
  1424.                     inHand.ammount = inHand.ammount - tmp1%
  1425.                 ELSE
  1426.                     Pocket(indexOfSlot%).ammount = Pocket(indexOfSlot%).ammount + inHand.ammount
  1427.                     cleanYourHand
  1428.                 END IF
  1429.             CASE 10 '                                                                                   arrows
  1430.                 IF inHand.ammount + Pocket(indexOfSlot%).ammount > 75 THEN
  1431.                     tmp1% = 75 - Pocket(indexOfSlot%).ammount
  1432.                     Pocket(indexOfSlot%).ammount = Pocket(indexOfSlot%).ammount + tmp1%
  1433.                     inHand.ammount = inHand.ammount - tmp1%
  1434.                 ELSE
  1435.                     Pocket(indexOfSlot%).ammount = Pocket(indexOfSlot%).ammount + inHand.ammount
  1436.                     cleanYourHand
  1437.                 END IF
  1438.             CASE 11 '                                                                                   bolts
  1439.                 IF inHand.ammount + Pocket(indexOfSlot%).ammount > 50 THEN
  1440.                     tmp1% = 50 - Pocket(indexOfSlot%).ammount
  1441.                     Pocket(indexOfSlot%).ammount = Pocket(indexOfSlot%).ammount + tmp1%
  1442.                     inHand.ammount = inHand.ammount - tmp1%
  1443.                 ELSE
  1444.                     Pocket(indexOfSlot%).ammount = Pocket(indexOfSlot%).ammount + inHand.ammount
  1445.                     cleanYourHand
  1446.                 END IF
  1447.         END SELECT
  1448.     END IF
  1449.     IF inHand.kind = 16 AND inHand.lvl < 2 AND Pocket(indexOfSlot%).lvl < 2 THEN '                      money
  1450.         IF inHand.ammount + Pocket(indexOfSlot%).ammount > 500 THEN
  1451.             tmp1% = 500 - Pocket(indexOfSlot%).ammount
  1452.             Pocket(indexOfSlot%).ammount = Pocket(indexOfSlot%).ammount + tmp1%
  1453.             inHand.ammount = inHand.ammount - tmp1%
  1454.         ELSE
  1455.             Pocket(indexOfSlot%).ammount = Pocket(indexOfSlot%).ammount + inHand.ammount
  1456.             cleanYourHand
  1457.         END IF
  1458.     END IF
  1459. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1460. FUNCTION itemRequirementsMet% (P%)
  1461.     IF P% > 0 THEN '  0= HAND, other number=index of POCKET
  1462.         IF calculateHeroActualStrength% >= calculateItemReqStrength%(Pocket(P%).kind, Pocket(P%).lvl) _
  1463.         AND calculateHeroActualAgility% >= calculateItemReqAgility%(Pocket(P%).kind, Pocket(P%).lvl) _
  1464.         AND calculateHeroActualPower% >= calculateItemReqPower%(Pocket(P%).kind, Pocket(P%).lvl, Pocket(P%).special) THEN
  1465.             itemRequirementsMet% = TRUE: EXIT FUNCTION
  1466.         END IF
  1467.     ELSE
  1468.         IF calculateHeroActualStrength% >= calculateItemReqStrength%(inHand.kind, inHand.lvl) _
  1469.         AND calculateHeroActualAgility% >= calculateItemReqAgility%(inHand.kind, inHand.lvl) _
  1470.         AND calculateHeroActualPower% >= calculateItemReqPower%(inHand.kind, inHand.lvl, inHand.special) THEN
  1471.             itemRequirementsMet% = TRUE: EXIT FUNCTION
  1472.         END IF
  1473.     END IF
  1474.     itemRequirementsMet% = FALSE
  1475. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1476. FUNCTION calculateItemReqStrength% (k%, l%)
  1477.     SELECT CASE k%
  1478.         CASE 4: IF l% > 0 THEN calculateItemReqStrength% = 15 + l% * 2: EXIT FUNCTION ' swords
  1479.         CASE 5: IF l% > 0 THEN calculateItemReqStrength% = 15 + l% * 3: EXIT FUNCTION ' axes
  1480.         CASE 7: calculateItemReqStrength% = 10 + l% * 2: EXIT FUNCTION '                bows
  1481.         CASE 8: calculateItemReqStrength% = 10 + l% * 3: EXIT FUNCTION '                crossbows
  1482.         CASE 12: IF l% > 0 THEN calculateItemReqStrength% = 5 + l% * 4: EXIT FUNCTION ' armors
  1483.         CASE 13: IF l% > 0 THEN calculateItemReqStrength% = 5 + l% * 2: EXIT FUNCTION ' helms
  1484.         CASE 14: IF l% > 0 THEN calculateItemReqStrength% = 5 + l% * 3: EXIT FUNCTION ' shields
  1485.     END SELECT
  1486.     calculateItemReqStrength% = 0
  1487. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1488. FUNCTION calculateItemReqAgility% (k%, l%)
  1489.     SELECT CASE k%
  1490.         CASE 5: IF l% > 0 THEN calculateItemReqAgility% = 10 + l% * 2: EXIT FUNCTION '  axes
  1491.         CASE 6: IF l% > 0 THEN calculateItemReqAgility% = 15 + l% * 3: EXIT FUNCTION '  throws
  1492.         CASE 7: calculateItemReqAgility% = 20 + l% * 4: EXIT FUNCTION '                 bows
  1493.         CASE 8: calculateItemReqAgility% = 20 + l% * 8: EXIT FUNCTION '                 crossbows
  1494.         CASE 12: IF l% > 0 THEN calculateItemReqAgility% = 5 + l% * 2: EXIT FUNCTION '  armors
  1495.         CASE 13: IF l% > 0 THEN calculateItemReqAgility% = 5 + l%: EXIT FUNCTION '      helms
  1496.         CASE 14: IF l% > 0 THEN calculateItemReqAgility% = 5 + l% * 3: EXIT FUNCTION '  shields
  1497.     END SELECT
  1498.     calculateItemReqAgility% = 0
  1499. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1500. FUNCTION calculateItemReqPower% (k%, l%, s$)
  1501.     SELECT CASE k%
  1502.         CASE 2 ' scrolls only, lvl0
  1503.             IF l% = 0 THEN
  1504.                 IF INSTR(s$, "0") THEN
  1505.                     calculateItemReqPower% = 17: EXIT FUNCTION
  1506.                 ELSEIF INSTR(s$, "1") THEN
  1507.                     calculateItemReqPower% = 25: EXIT FUNCTION
  1508.                 ELSEIF INSTR(s$, "2") THEN
  1509.                     calculateItemReqPower% = 32: EXIT FUNCTION
  1510.                 ELSEIF INSTR(s$, "3") THEN
  1511.                     calculateItemReqPower% = 40: EXIT FUNCTION
  1512.                 ELSEIF INSTR(s$, "4") THEN
  1513.                     calculateItemReqPower% = 50: EXIT FUNCTION
  1514.                 ELSEIF INSTR(s$, "5") THEN
  1515.                     calculateItemReqPower% = 60: EXIT FUNCTION
  1516.                 END IF
  1517.             END IF
  1518.         CASE 3 ' books, need to check spellsIkonw
  1519.             IF INSTR(s$, "0") THEN
  1520.                 calculateItemReqPower% = SpellsIknow%%(0) * 4 + 17: EXIT FUNCTION
  1521.             ELSEIF INSTR(s$, "1") THEN
  1522.                 calculateItemReqPower% = SpellsIknow%%(1) * 4 + 17: EXIT FUNCTION
  1523.             ELSEIF INSTR(s$, "2") THEN
  1524.                 calculateItemReqPower% = SpellsIknow%%(2) * 4 + 17: EXIT FUNCTION
  1525.             ELSEIF INSTR(s$, "3") THEN
  1526.                 calculateItemReqPower% = SpellsIknow%%(3) * 4 + 17: EXIT FUNCTION
  1527.             ELSEIF INSTR(s$, "4") THEN
  1528.                 calculateItemReqPower% = SpellsIknow%%(4) * 4 + 17: EXIT FUNCTION
  1529.             ELSEIF INSTR(s$, "5") THEN
  1530.                 calculateItemReqPower% = SpellsIknow%%(5) * 4 + 17: EXIT FUNCTION
  1531.             END IF
  1532.         CASE 15: calculateItemReqPower% = 17 + ((l% + 1) * 3): EXIT FUNCTION ' WANDS
  1533.     END SELECT
  1534.     calculateItemReqPower% = 0
  1535. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1536. FUNCTION itemFitsEquipmentSlot% (indexOfSlot%)
  1537.     SELECT CASE indexOfSlot% ' we are checking where you wanna put the item
  1538.         CASE 0 ' head
  1539.             IF inHand.kind = 13 THEN itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION ' if you holding a helm
  1540.         CASE 1 ' neck
  1541.             IF inHand.kind = 17 AND inHand.lvl >= 2 THEN itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION
  1542.         CASE 2 ' right hand
  1543.             SELECT CASE inHand.kind
  1544.                 CASE 4, 5, 6, 9, 15: itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION 'if in hand you have: swords,axes,throws,bombs or wands
  1545.                 CASE 7, 8 ' if a bow or crossbow in hand
  1546.                     IF Pocket(4).kind <> -1 THEN '& left hand is occupied
  1547.                         HUDpromt$ = "Left hand is occupied"
  1548.                     ELSE
  1549.                         itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION
  1550.                     END IF
  1551.             END SELECT
  1552.         CASE 3 ' torso
  1553.             IF inHand.kind = 12 THEN itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION ' if you holding an armor
  1554.         CASE 4 ' left hand
  1555.             SELECT CASE inHand.kind
  1556.                 CASE 14 ' if you have a shield in hand
  1557.                     IF (Pocket(2).kind = 7 OR Pocket(2).kind = 8) THEN ' &  on right hand you have a two handed weapon
  1558.                         HUDpromt$ = "Can't use it with a two handed weapon"
  1559.                     ELSE
  1560.                         itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION
  1561.                     END IF
  1562.                 CASE 10 'and you have arrows in hand
  1563.                     IF Pocket(2).kind = 7 THEN '  & a bow equiped
  1564.                         itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION
  1565.                     ELSE
  1566.                         HUDpromt$ = "You need to equip a bow"
  1567.                     END IF
  1568.                 CASE 11 ' if you have bolts in hand
  1569.                     IF Pocket(2).kind = 8 THEN ' and a crossbow equiped
  1570.                         itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION
  1571.                     ELSE
  1572.                         HUDpromt$ = "You need to equip a crossbow"
  1573.                     END IF
  1574.             END SELECT
  1575.         CASE 5, 6 ' fingers
  1576.             IF inHand.kind = 17 AND inHand.lvl <= 1 THEN itemFitsEquipmentSlot% = TRUE: EXIT FUNCTION
  1577.     END SELECT
  1578.  
  1579.     itemFitsEquipmentSlot% = FALSE
  1580.  
  1581. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1582. SUB itemInformation (whichOfTheSlots%) ' TO DO: show requirements of items, organize how the info is seen acording to kind of item, add info for r special variable on items
  1583.     ' i can use lines 26, 27, 28, 29
  1584.     DIM kindOfItem%
  1585.     DIM lvlOfItem%
  1586.     DIM specialOfItem$
  1587.     DIM tmp$
  1588.  
  1589.     kindOfItem% = Pocket(whichOfTheSlots%).kind
  1590.     lvlOfItem% = Pocket(whichOfTheSlots%).lvl
  1591.     specialOfItem$ = Pocket(whichOfTheSlots%).special
  1592.  
  1593.     '1rst LINE = NAME OF ITEM OR BODY SLOT
  1594.     IF whichOfTheSlots% < 7 AND kindOfItem% = -1 THEN
  1595.         SELECT CASE whichOfTheSlots%
  1596.             CASE 0: tmp$ = "Head"
  1597.             CASE 1: tmp$ = "Neck"
  1598.             CASE 2: tmp$ = "Right hand"
  1599.             CASE 3: tmp$ = "Torso"
  1600.             CASE 4: tmp$ = "Left hand"
  1601.             CASE 5: tmp$ = "Right finger"
  1602.             CASE 6: tmp$ = "Left finger"
  1603.         END SELECT
  1604.     ELSE
  1605.         tmp$ = nameAnItem$(kindOfItem%, lvlOfItem%, specialOfItem$)
  1606.     END IF
  1607.     LOCATE 26, 40 - (LEN(tmp$) \ 2)
  1608.     PRINT tmp$;
  1609.  
  1610.     '2nd LINE
  1611.     tmp$ = "" ' kill me after testing!!!!!!!
  1612.     SELECT CASE kindOfItem%
  1613.         CASE 0: tmp$ = "Opens some door" 'keys
  1614.         CASE 1: tmp$ = "Heals" + STR$((lvlOfItem% + 1) * 5) + " points" ' potions
  1615.         CASE 2: tmp$ = "Right click for read" ' papers
  1616.         CASE 3: tmp$ = "Learn about this spell" 'books
  1617.         CASE 4, 5, 7, 8, 15: tmp$ = "Damage: " + _TRIM$(STR$(calculateItemBaseDmg%(kindOfItem%, lvlOfItem%, specialOfItem$))) + " - " + _TRIM$(STR$(calculateItemMaxDmg%(kindOfItem%, lvlOfItem%, specialOfItem$))) ' weapons
  1618.         CASE 6, 9, 10, 11: tmp$ = "Damage: " + _TRIM$(STR$(calculateItemBaseDmg%(kindOfItem%, lvlOfItem%, specialOfItem$))) + " - " + _TRIM$(STR$(calculateItemMaxDmg%(kindOfItem%, lvlOfItem%, specialOfItem$))) 'ammunitions + throws
  1619.         CASE 12, 13, 14: tmp$ = "Defense:" + STR$(calculateItemDefense%(kindOfItem%, lvlOfItem%, specialOfItem$)) ' armors, helms & shields
  1620.         CASE 16: tmp$ = "Ammount:" + STR$(Pocket(whichOfTheSlots%).ammount) ' money
  1621.         CASE 17 ' jewlery
  1622.             IF lvlOfItem% < 2 THEN
  1623.                 tmp$ = "You can wear it on your finger"
  1624.             ELSE
  1625.                 tmp$ = "You can wear it on your neck"
  1626.             END IF
  1627.     END SELECT
  1628.     LOCATE 27, 40 - (LEN(tmp$) \ 2)
  1629.     PRINT tmp$;
  1630.  
  1631.     '3rd LINE
  1632.     tmp$ = "" ' kill me after testing!!!!!!!
  1633.     IF specialOfItem$ <> "" THEN
  1634.         IF NOT INSTR(specialOfItem$, "u") THEN ' it¿'s unidentified
  1635.             tmp$ = "+" + RIGHT$(specialOfItem$, 1) + " to "
  1636.             IF INSTR(specialOfItem$, "s") THEN ' adds to strenght
  1637.                 tmp$ = tmp$ + "strenght"
  1638.             ELSEIF INSTR(specialOfItem$, "a") THEN ' adds to agility
  1639.                 tmp$ = tmp$ + "agility"
  1640.             ELSEIF INSTR(specialOfItem$, "p") THEN ' adds to power
  1641.                 tmp$ = tmp$ + "power"
  1642.             ELSEIF INSTR(specialOfItem$, "v") THEN ' adds to vigor
  1643.                 tmp$ = tmp$ + "vigor"
  1644.             ELSEIF INSTR(specialOfItem$, "d") THEN ' adds to defense
  1645.                 tmp$ = tmp$ + "defense"
  1646.             ELSEIF INSTR(specialOfItem$, "t") THEN ' it teaches some spell
  1647.                 tmp$ = ""
  1648.             END IF
  1649.         ELSE
  1650.             tmp$ = ""
  1651.         END IF
  1652.     ELSE
  1653.         SELECT CASE kindOfItem%
  1654.             CASE 1: tmp$ = "Right click for drink" ' potions
  1655.             CASE 3: tmp$ = "Right click for read" ' books
  1656.             CASE 6, 9, 10, 11: tmp$ = "Ammount:" + STR$(Pocket(whichOfTheSlots%).ammount) ' ammo
  1657.         END SELECT
  1658.     END IF
  1659.     LOCATE 28, 40 - (LEN(tmp$) \ 2)
  1660.     PRINT tmp$;
  1661.  
  1662. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1663. SUB equipOurHero () ' remove test items
  1664.     SELECT CASE Hero.class
  1665.         CASE 0 ' "Barbarian" ' you get an axe, a shield, a potion and 100$
  1666.             createItemInPocket 5, 0, 1, 2, "" ' axe
  1667.             createItemInPocket 14, 0, 1, 4, "" ' shield
  1668.  
  1669.  
  1670.             '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°TESTING
  1671.             createItemInPocket 12, 2, 1, 7, "a2" '  armor
  1672.             createItemInPocket 13, 3, 1, 8, "v3" '  helm
  1673.             createItemInPocket 7, 0, 1, 9, "" ' bow
  1674.             createItemInPocket 2, 1, 1, 10, "" ' map
  1675.             createItemInPocket 17, 0, 1, 11, "p2" ' ring
  1676.             createItemInPocket 10, 0, 50, 12, "" ' 50 arrows
  1677.             createItemInPocket 17, 2, 1, 13, "d2" ' SAID for test!!!!!!!!!!
  1678.             createItemInPocket 16, 0, 100, 14, "" ' 100 coins
  1679.             createItemInPocket 16, 0, 100, 15, "" ' 100 coins
  1680.             createItemInPocket 16, 0, 100, 16, "" ' 100 coins
  1681.             createItemInPocket 10, 0, 50, 17, "" ' 50 arrows
  1682.             createItemInPocket 16, 0, 123, 18, "" ' 100 coins
  1683.             '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  1684.  
  1685.  
  1686.         CASE 1 ' "Clerig" 'you get a sword, a shield, a potion and 100$
  1687.             createItemInPocket 4, 0, 1, 2, "" '     sword
  1688.             createItemInPocket 14, 0, 1, 4, "" '    shield
  1689.         CASE 2 ' "Assasin" ' you get a bow, 50 arrows, a potion and 100$
  1690.             createItemInPocket 7, 0, 1, 2, "" '     bow
  1691.             createItemInPocket 10, 0, 50, 4, "" '   50 arrows
  1692.  
  1693.             '°°°°°°°°°°°°°°°
  1694.             createItemInPocket 10, 0, 50, 17, "" ' 50 arrows
  1695.             createItemInPocket 16, 3, 1, 18, "" ' gem
  1696.             createItemInPocket 11, 0, 27, 19, "" '  bolts
  1697.             createItemInPocket 11, 0, 43, 20, "" '  bolts
  1698.             createItemInPocket 9, 0, 4, 8, "" '  bombs
  1699.             createItemInPocket 9, 0, 4, 7, "" '  bombs
  1700.             '°°°°°°°°°°
  1701.  
  1702.         CASE 3 '"Wizard" ' you get a wand, a book, a potion and 100$
  1703.             createItemInPocket 15, 0, 21, 2, "r0" '    wand
  1704.             createItemInPocket 3, 0, 1, 20, "t0" '  book
  1705.     END SELECT
  1706.     createItemInPocket 1, 0, 1, 21, "" ' potion
  1707.     createItemInPocket 16, 0, 100, 22, "" ' 100 coins
  1708.  
  1709. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1710. FUNCTION calculateHeroActualAgility% () '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û HERO Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  1711.     DIM i%
  1712.     DIM tmp%
  1713.     tmp% = 0
  1714.     FOR i% = 0 TO 6
  1715.         IF Pocket(i%).special <> "" AND INSTR(Pocket(i%).special, "a") THEN
  1716.             tmp% = tmp% + VAL(RIGHT$(Pocket(i%).special, 1))
  1717.         END IF
  1718.     NEXT i%
  1719.     calculateHeroActualAgility% = Hero.agility + tmp%
  1720. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1721. FUNCTION calculateHeroActualStrength% ()
  1722.     DIM i%
  1723.     DIM tmp%
  1724.     tmp% = 0
  1725.     FOR i% = 0 TO 6
  1726.         IF Pocket(i%).special <> "" AND INSTR(Pocket(i%).special, "s") THEN
  1727.             tmp% = tmp% + VAL(RIGHT$(Pocket(i%).special, 1))
  1728.         END IF
  1729.     NEXT i%
  1730.     calculateHeroActualStrength% = Hero.strength + tmp%
  1731. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1732. FUNCTION calculateHeroActualPower% ()
  1733.     DIM i%
  1734.     DIM tmp%
  1735.     tmp% = 0
  1736.     FOR i% = 0 TO 6
  1737.         IF Pocket(i%).special <> "" AND INSTR(Pocket(i%).special, "p") THEN
  1738.             tmp% = tmp% + VAL(RIGHT$(Pocket(i%).special, 1))
  1739.         END IF
  1740.     NEXT i%
  1741.     calculateHeroActualPower% = Hero.power + tmp%
  1742. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1743. FUNCTION calculateHeroActualVigor% ()
  1744.     DIM i%
  1745.     DIM tmp%
  1746.     tmp% = 0
  1747.     FOR i% = 0 TO 6
  1748.         IF Pocket(i%).special <> "" AND INSTR(Pocket(i%).special, "v") THEN
  1749.             tmp% = tmp% + VAL(RIGHT$(Pocket(i%).special, 1))
  1750.         END IF
  1751.     NEXT i%
  1752.     calculateHeroActualVigor% = Hero.vigor + tmp%
  1753. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1754. FUNCTION calculateHeroChanceToHit% ()
  1755.     DIM i%
  1756.     DIM tmp%
  1757.     tmp% = 0
  1758.     FOR i% = 0 TO 6
  1759.         IF Pocket(i%).special <> "" AND INSTR(Pocket(i%).special, "c") THEN
  1760.             tmp% = tmp% + (VAL(RIGHT$(Pocket(i%).special, 1)) * 7)
  1761.         END IF
  1762.     NEXT i%
  1763.     calculateHeroChanceToHit% = INT(calculateHeroActualAgility * 1.15) + 20 + tmp%
  1764. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1765. FUNCTION calculateHeroDefense% ()
  1766.     DIM i%
  1767.     DIM tmp%
  1768.     tmp% = 0
  1769.     FOR i% = 0 TO 6
  1770.         tmp% = tmp% + calculateItemDefense%(Pocket(i%).kind, Pocket(i%).lvl, Pocket(i%).special)
  1771.     NEXT i%
  1772.     calculateHeroDefense% = tmp%
  1773. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1774. FUNCTION calculateHeroBaseDmg% () 'i should watch the case of no ammo, returning 0 IN PROCCES. Also should be affected by Strength, except if throw
  1775.     DIM i%
  1776.     DIM tmp%
  1777.     tmp% = 0
  1778.     IF Pocket(2).kind = -1 THEN ' if empty right hand
  1779.         calculateHeroBaseDmg% = tmp%: EXIT FUNCTION
  1780.     ELSE
  1781.         IF Pocket(2).kind = 7 AND Pocket(4).kind <> 10 THEN ' if in right hand a bow and in left hand something different than arrows
  1782.             calculateHeroBaseDmg% = 0: EXIT FUNCTION
  1783.         ELSEIF Pocket(2).kind = 8 AND Pocket(4).kind <> 11 THEN ' if in right hand a crossbow and in left hand something different than bolts
  1784.             calculateHeroBaseDmg% = 0: EXIT FUNCTION
  1785.         ELSE
  1786.             FOR i% = 0 TO 6
  1787.                 tmp% = tmp% + calculateItemBaseDmg%(Pocket(i%).kind, Pocket(i%).lvl, Pocket(i%).special)
  1788.             NEXT i%
  1789.             calculateHeroBaseDmg% = tmp%
  1790.         END IF
  1791.     END IF
  1792. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1793. FUNCTION calculateHeroMaxDmg% () ' i should watch the case of no ammo, returning 0. Also should be affected by Strength, except if throw
  1794.     DIM i%
  1795.     DIM tmp%
  1796.     tmp% = 0
  1797.     IF Pocket(2).kind = -1 THEN ' if empty right hand
  1798.         calculateHeroMaxDmg% = tmp% + 1: EXIT FUNCTION
  1799.     ELSE
  1800.         IF Pocket(2).kind = 7 AND Pocket(4).kind <> 10 THEN ' if in right hand a bow and in left hand something different than arrows
  1801.             calculateHeroMaxDmg% = 0: EXIT FUNCTION
  1802.         ELSEIF Pocket(2).kind = 8 AND Pocket(4).kind <> 11 THEN ' if in right hand a crossbow and in left hand something different than bolts
  1803.             calculateHeroMaxDmg% = 0: EXIT FUNCTION
  1804.         ELSE
  1805.             FOR i% = 0 TO 6
  1806.                 tmp% = tmp% + calculateItemMaxDmg%(Pocket(i%).kind, Pocket(i%).lvl, Pocket(i%).special)
  1807.             NEXT i%
  1808.             calculateHeroMaxDmg% = tmp%
  1809.         END IF
  1810.     END IF
  1811. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1812. FUNCTION calculateMaxLife% ()
  1813.     calculateMaxLife% = INT(calculateHeroActualVigor% * 2.75)
  1814. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1815. FUNCTION calculateMaxMana% ()
  1816.     calculateMaxMana% = INT(calculateHeroActualPower% * 3.25)
  1817. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1818. SUB drawHero ()
  1819.     _PUTIMAGE (Hero.x, Hero.y), calculateHeroImg&(Hero.class, Hero.lvl)
  1820. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1821. FUNCTION calculateHeroImg& (classOfHero%, lvlOfHero%)
  1822.     IF lvlOfHero% <= 5 THEN
  1823.         SELECT CASE classOfHero%
  1824.             CASE 0: calculateHeroImg& = HeroImg&(0)
  1825.             CASE 1: calculateHeroImg& = HeroImg&(2)
  1826.             CASE 2: calculateHeroImg& = HeroImg&(4)
  1827.             CASE 3: calculateHeroImg& = HeroImg&(6)
  1828.         END SELECT
  1829.     ELSE
  1830.         SELECT CASE classOfHero%
  1831.             CASE 0: calculateHeroImg& = HeroImg&(1)
  1832.             CASE 1: calculateHeroImg& = HeroImg&(3)
  1833.             CASE 2: calculateHeroImg& = HeroImg&(5)
  1834.             CASE 3: calculateHeroImg& = HeroImg&(7)
  1835.         END SELECT
  1836.     END IF
  1837. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1838.  
  1839.  
  1840. SUB drawEnemies () '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û ENEMIES Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  1841.     FOR i% = 0 TO UBOUND(Enemy)
  1842.         IF Enemy(i%).map = actualMapWorking%% THEN
  1843.             _PUTIMAGE (Enemy(i%).x, Enemy(i%).y), EnemyImg&(Enemy(i%).lvl)
  1844.         END IF
  1845.     NEXT i%
  1846. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1847. FUNCTION calculateEnemyBaseDmg% (lvl%) ' INCOMPLETE
  1848.     calculateEnemyBaseDmg% = (lvl% + 1) * 5
  1849. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1850. FUNCTION calculateEnemyScore% (lvl%) ' UNDONE
  1851. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1852.  
  1853. SUB loadEnemiesInitialVariables () ' <---- I SHOULD RANDOM CREATE THEM AND THEIR ARRAY SHOULD ONLY BE FOR THE ONES ON actualMapWorking%  , the rest should be on file .txt
  1854.     Enemy(3).map = 0
  1855.     Enemy(3).x = 8 * 32
  1856.     Enemy(3).y = 2 * 32 + 32
  1857.     Enemy(3).lvl = 0
  1858.     Enemy(3).life = 8
  1859.  
  1860.     Enemy(1).map = 0
  1861.     Enemy(1).x = 5 * 32
  1862.     Enemy(1).y = 2 * 32 + 32
  1863.     Enemy(1).lvl = 0
  1864.     Enemy(1).life = 8
  1865.  
  1866.     Enemy(2).map = 1
  1867.     Enemy(2).x = 7 * 32
  1868.     Enemy(2).y = 8 * 32 + 32
  1869.     Enemy(2).lvl = 0
  1870.     Enemy(2).life = 8
  1871.  
  1872. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1873.  
  1874. FUNCTION nameAnEnemy$ (lvl%)
  1875.     SELECT CASE lvl%
  1876.         CASE 0: nameAnEnemy$ = "rat"
  1877.         CASE 1: nameAnEnemy$ = "spiders"
  1878.         CASE 2: nameAnEnemy$ = "lizard"
  1879.         CASE 3: nameAnEnemy$ = "tarantula"
  1880.         CASE 4: nameAnEnemy$ = "frog"
  1881.         CASE 5: nameAnEnemy$ = "beatle"
  1882.         CASE 6: nameAnEnemy$ = "bug"
  1883.         CASE 7: nameAnEnemy$ = "dragon"
  1884.         CASE 8: nameAnEnemy$ = "living mushrooms"
  1885.         CASE 9: nameAnEnemy$ = "rabbit"
  1886.         CASE 10: nameAnEnemy$ = "small bat"
  1887.         CASE 11: nameAnEnemy$ = "big bat"
  1888.         CASE 12: nameAnEnemy$ = "snake"
  1889.         CASE 13: nameAnEnemy$ = "wolf"
  1890.         CASE 14: nameAnEnemy$ = "jabali"
  1891.         CASE 15: nameAnEnemy$ = "bear"
  1892.         CASE 16: nameAnEnemy$ = "stuffs"
  1893.         CASE 17: nameAnEnemy$ = "big stuff"
  1894.         CASE 18: nameAnEnemy$ = "scorpion"
  1895.         CASE 19: nameAnEnemy$ = "octopus"
  1896.         CASE 20: nameAnEnemy$ = "vampire"
  1897.         CASE 21: nameAnEnemy$ = "mummy"
  1898.         CASE 22: nameAnEnemy$ = "ghost"
  1899.         CASE 23: nameAnEnemy$ = "hidra"
  1900.         CASE 24: nameAnEnemy$ = "goblin"
  1901.         CASE 25: nameAnEnemy$ = "zombie"
  1902.         CASE 26: nameAnEnemy$ = "skeleton"
  1903.         CASE 27: nameAnEnemy$ = "orc"
  1904.         CASE 28: nameAnEnemy$ = "ciclope"
  1905.         CASE 29: nameAnEnemy$ = "baron of hell"
  1906.         CASE 30: nameAnEnemy$ = "stone golem"
  1907.         CASE 31: nameAnEnemy$ = "Lord of the Dark"
  1908.     END SELECT
  1909. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1910. SUB enemyAI (enemyFromArray%) '<------------- I must build the AI for enemies' cosider particular cases later
  1911.  
  1912.  
  1913. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1914. FUNCTION enemySearchHero% (i%)
  1915.     IF Enemy(indexFromArray%).x <> Hero.x THEN
  1916.         IF Enemy(i%).x > Hero.x THEN Enemy(i%).x = Enemy(i%).x - 32
  1917.         IF Enemy(i%).x < Hero.x THEN Enemy(i%).x = Enemy(i%).x + 32
  1918.     END IF
  1919.  
  1920.     IF Enemy(indexFromArray%).y <> Hero.y THEN
  1921.  
  1922.     END IF
  1923.  
  1924.  
  1925.  
  1926. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1927.  
  1928. SUB drawMechs () '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û WORLD & MECHS Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  1929.     _PUTIMAGE (Mechs(0).x, Mechs(0).y), UtileryImg&(5) ' PROVISORY
  1930.  
  1931. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1932. SUB drawWorld () ' <-  if i could came up with a random generator... geez
  1933.  
  1934.     DIM i%
  1935.     DIM j%
  1936.     DIM tmp%%
  1937.     DIM orgFile&
  1938.     DIM destFile&
  1939.     DIM tmpWorlds&
  1940.  
  1941.     IF NOT _FILEEXISTS("tmpWorlds.txt") THEN '              if this file dosn't exists means that we started a new game. We must create the first map of the game, wich is a pre-arranged map of the Town
  1942.         CHDIR ".\.." '                                      we are @ Fantasy\data\
  1943.         CHDIR ".\worlds" '                                  we are @ Fantasy\data\wolrds\
  1944.         orgFile& = FREEFILE '                               we need two filehandles: one for origin file,
  1945.         destFile& = FREEFILE '                              and another for destination file
  1946.         OPEN "town.txt" FOR INPUT AS #orgFile& '            we will extract info from this file
  1947.         OPEN "tmp.txt" FOR OUTPUT AS #destFile& '           and place it into this one
  1948.         WHILE NOT EOF(orgFile&) '                           we make sure we read the full file
  1949.             INPUT #orgFile&, tmp%% '    Â¿ <---------------- DATA TRANSFER
  1950.             PRINT #destFile&, tmp%% '   ¾
  1951.         WEND '                                              done with that thing
  1952.         CLOSE #orgFile& '  Â¿ <----------------------------- close files
  1953.         CLOSE #destFile& ' ¾
  1954.         CHDIR ".\.." '                                      we are @ Fantasy\data\
  1955.         NAME ".\worlds\tmp.txt" AS ".\tmp\tmpWorlds.txt" '  now we extract the file from worlds folder and put it on tmp folder with the right name
  1956.         CHDIR ".\tmp" '                                     we are @ Fantasy\data\tmp\
  1957.     END IF
  1958.  
  1959.     IF lastMapWorking%% <> actualMapWorking%% THEN '        if map has changed we need to actualize the WolrdTiles%% array
  1960.         tmpWorlds& = FREEFILE '                             get a handle
  1961.         OPEN "tmpWorlds.txt" FOR INPUT AS #tmpWorlds& '     we will extract data from this file
  1962.         INPUT #tmpWorlds&, tmp%% '                          we check the first number of the file
  1963.         WHILE tmp%% <> actualMapWorking%% '                 if it isn't the number of the level we need to know
  1964.             FOR i% = 0 TO 279 '            Â¿
  1965.                 INPUT #tmpWorlds&, tmp%% ' ³ <------------ walk over the info of this map (which is not what we need to know, but we skip that data)
  1966.             NEXT i% '                      Â¾
  1967.             INPUT #tmpWorlds&, tmp%% '                      and get the next number for evaluate again (that should be the number of next map)
  1968.         WEND '                                              keep doing this untill the right map number has been found
  1969.         FOR j% = 0 TO 13 '                    Â¿
  1970.             FOR i% = 0 TO 19 '                Â³
  1971.                 INPUT #tmpWorlds&, tmp%% '    Â³ <---------- then extract the data we need
  1972.                 WorldTiles%%(i%, j%) = tmp%% '³             and load it into WorldTiles%% array !
  1973.             NEXT i% '                         ³
  1974.         NEXT j% '                             ¾
  1975.         CLOSE #tmpWorlds& '                                 close the file
  1976.         lastMapWorking%% = actualMapWorking%% '             and actualize map situation, so no need for reload until the map changes
  1977.     END IF
  1978.  
  1979.     FOR j% = 0 TO 13 '                                                          Â¿
  1980.         FOR i% = 0 TO 19 '                                                      Â³
  1981.             _PUTIMAGE (i% * 32, j% * 32 + 32), WorldImg&(WorldTiles%%(i%, j%)) '³ actual drawing
  1982.         NEXT i% '                                                               ³
  1983.     NEXT j% '                                                                   ¾
  1984.  
  1985. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1986. SUB loadMechsInitialVariables () ' PROVISORY, load them from a CSV as maps later
  1987.  
  1988.     Mechs(0).x = 128
  1989.     Mechs(0).y = 128
  1990.     Mechs(0).kind = 0
  1991.     Mechs(0).map = 0
  1992.     Mechs(0).state = 0
  1993.  
  1994. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1995. SUB getMouseData () ''°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û PLAYER INPUTS Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  1996.  
  1997.     DO WHILE _MOUSEINPUT: LOOP '               ¿
  1998.     Finger.x = _MOUSEX '                       ³ get
  1999.     Finger.y = _MOUSEY '                       ³ mouse
  2000.     Finger.tmpClickL = _MOUSEBUTTON(1) '       ³ info
  2001.     Finger.tmpClickR = _MOUSEBUTTON(2) '       Ù
  2002.  
  2003.     IF Finger.tmpClickL AND NOT Finger.oldClickL THEN '¿
  2004.         Finger.clickL = TRUE '                            Â³ DEBOUNCE
  2005.     ELSE '                                             ³ LEFT
  2006.         Finger.clickL = FALSE '                            Â³ CLICK
  2007.     END IF '                                           ³
  2008.     Finger.oldClickL = Finger.tmpClickL '              Ã™
  2009.  
  2010.     IF Finger.tmpClickR AND NOT Finger.oldClickR THEN '¿
  2011.         Finger.clickR = TRUE '                            Â³ DEBOUNCE
  2012.     ELSE '                                             ³ RIGHT
  2013.         Finger.clickR = FALSE '                            Â³ CLICK
  2014.     END IF '                                           ³
  2015.     Finger.oldClickR = Finger.tmpClickR '              Ã™
  2016.  
  2017.     inHand.x = Finger.x
  2018.     inHand.y = Finger.y
  2019.  
  2020. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2021. SUB playerInputs ()
  2022.     getMouseData
  2023.     keyboardInputs
  2024. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2025.  
  2026. SUB keyboardInputs () ' <-------------------------------------------------------No more keyboard inputs of any kind? Think in playability
  2027.  
  2028.     DIM keyPress$
  2029.     DIM mapOnPocket%
  2030.     DIM i%
  2031.  
  2032.     'hold CTRL for throw an attack (long distance) YOU NEED TO HAVE A THROW WEAPON ON Pocket(2)!!!! AND AMMO IN Pocket(4)!!!! else should draw the cross, and if i can display "No ammo"... great. Also have to check the case of BOMBS & THROWS
  2033.     'hold SHIFT for launching same spell as before, if no spell "?" sign and HUDpromt, if no mana then cross and HUDpromt too
  2034.     'hold ALT to force a movement over an item instead of picking..... or maybe for the Rest One TURN ?
  2035.     'SPACEBAR could accelerate the action... maybe
  2036.  
  2037.     '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  2038.     '° what's the best way for motion? ° numpad? QWEASDZXC? some way with
  2039.     '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  2040.     'F1 for help
  2041.     'F2 for new game
  2042.     'F3 for save game
  2043.     'F4 for load game
  2044.  
  2045.  
  2046.     keyPress$ = INKEY$
  2047.     IF keyPress$ <> "" AND playerTurn` = TRUE THEN
  2048.  
  2049.         IF ASC(keyPress$) = 27 THEN '                             ¿
  2050.             IF menuMain` = TRUE THEN '                            Â³
  2051.                 menuMain` = FALSE '                               ³
  2052.             ELSEIF menuPocket` OR menuStats` OR menuSpells` THEN '³
  2053.                 menuPocket` = FALSE '                             ³ ESC key
  2054.                 menuStats` = FALSE '                              Â³
  2055.                 menuSpells` = FALSE '                             ³
  2056.             ELSEIF menuMain` = FALSE THEN '                       ³
  2057.                 menuMain` = TRUE '                                Â³
  2058.             END IF '                                              Â³
  2059.         END IF '                                                  Â¾
  2060.  
  2061.         IF menuMain` = FALSE THEN
  2062.  
  2063.             IF keyPress$ = "1" THEN '           ¿
  2064.                 IF menuPocket` = FALSE THEN '   ³
  2065.                     menuSpells` = FALSE '       ³
  2066.                     menuPocket` = TRUE '        Â³
  2067.                 ELSEIF menuPocket` = TRUE THEN '³ number 1
  2068.                     menuPocket` = FALSE '       ³
  2069.                 END IF '                        Â³
  2070.             END IF '                            Â¾
  2071.  
  2072.             IF keyPress$ = "2" THEN '           ¿
  2073.                 IF menuSpells` = FALSE THEN '   ³
  2074.                     menuPocket` = FALSE '       ³
  2075.                     menuSpells` = TRUE '        Â³
  2076.                 ELSEIF menuSpells` = TRUE THEN '³ number 2
  2077.                     menuSpells` = FALSE '       ³
  2078.                 END IF '                        Â³
  2079.             END IF '                            Â¾
  2080.  
  2081.             IF keyPress$ = "3" THEN '           ¿
  2082.                 IF menuStats` = FALSE THEN '    Â³
  2083.                     menuStats` = TRUE '         ³
  2084.                 ELSEIF menuStats` = TRUE THEN ' ³ number 3
  2085.                     menuStats` = FALSE '        Â³
  2086.                 END IF '                        Â³
  2087.             END IF '                            Â¾
  2088.  
  2089.             FOR i% = 7 TO 22 '                                      Â¿
  2090.                 IF Pocket(i%).kind = 2 AND Pocket(i%).lvl = 1 THEN '³
  2091.                     mapOnPocket% = TRUE '                           ³
  2092.                 ELSE '                                              Â³check if map is on inventory
  2093.                     mapOnPocket% = FALSE '                          Â³
  2094.                 END IF '                                            Â³
  2095.             NEXT i% '                                               ¾
  2096.  
  2097.             IF ASC(keyPress$) = 9 AND mapOnPocket% = TRUE THEN '¿
  2098.                 IF menuMap` = FALSE THEN '                      Â³
  2099.                     menuPocket` = FALSE '                       ³
  2100.                     menuSpells` = FALSE '                       ³ TAB for map
  2101.                     menuStats` = FALSE '                        Â³
  2102.                     menuMap` = TRUE '                           ³
  2103.                 ELSEIF menmumap` = TRUE THEN '                  Â³
  2104.                     menuMap` = FALSE '                          Â³
  2105.                 END IF '                                        Â³
  2106.             END IF '                                            Â¾
  2107.  
  2108.         END IF
  2109.  
  2110.     END IF
  2111. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2112. '°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û GENERAL PROGRAM Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
  2113.  
  2114. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2115. SUB drawHUD ()
  2116.  
  2117.     DIM lifeAsPercent%
  2118.     DIM manaAsPercent%
  2119.     DIM xpAsPercent%
  2120.  
  2121.     LINE (0, 0)-(639, 31), GREEN4, BF 'background line/box ¿
  2122.     LINE (0, 15)-(639, 15), GREEN1 '                       ³
  2123.     LOCATE 1, 17: PRINT CHR$(179); '¿                      Â³  BACK
  2124.     LOCATE 1, 34: PRINT CHR$(179); '³ separation           ³
  2125.     LOCATE 1, 55: PRINT CHR$(179); 'Ù lines                Ã™
  2126.  
  2127.     _PUTIMAGE (8, 0), HUDImg&(0) ' big heart image                        Â¿
  2128.     lifeAsPercent% = CINT((Hero.life * 100) / calculateMaxLife%) '        Â³
  2129.     drawFourHeartAsPercentage 32, 3, lifeAsPercent% '                     ³ HEALTH
  2130.     LOCATE 1, 10 ' written values on screen                               ³
  2131.     PRINT _TRIM$(STR$(Hero.life)); "/"; _TRIM$(STR$(calculateMaxLife%)); 'Ù
  2132.  
  2133.     _PUTIMAGE (144, 0), HUDImg&(1) ' big star image                       ¿
  2134.     manaAsPercent% = CINT((Hero.mana * 100) / calculateMaxMana%) '        Â³
  2135.     barShowingPercentage 160, 4, manaAsPercent% '                         ³  MANA
  2136.     LOCATE 1, 27 '                                                        Â³
  2137.     PRINT _TRIM$(STR$(Hero.mana)); "/"; _TRIM$(STR$(calculateMaxMana%)); 'Ù
  2138.  
  2139.     _PUTIMAGE (280, 0), HUDImg&(2) ' little flag image                                           ¿
  2140.     xpAsPercent% = CINT(((Hero.xp - Hero.prevNextXp) * 100) / (Hero.nextXp - Hero.prevNextXp)) ' ³
  2141.     barShowingPercentage 296, 4, xpAsPercent% '                                                  Â³  EXPERIENCE
  2142.     LOCATE 1, 44 '                                                                               ³
  2143.     PRINT _TRIM$(STR$(Hero.xp)); "/"; _TRIM$(STR$(Hero.nextXp)); '                               Ù
  2144.  
  2145.     IF inHand.lvl = -1 AND playerTurn` = TRUE AND menuMain` = FALSE THEN ' no items in hand, and it has to be your turn. Also can't work if Main Menu open
  2146.         IF fingerIsOnSurface%(440, 0, 48, 16) THEN '
  2147.             HUDpromt$ = "Look at you inventory" '
  2148.             COLOR GREEN4, GREEN1 '
  2149.             IF menuPocket` = FALSE THEN
  2150.                 IF Finger.clickL THEN
  2151.                     menuSpells` = FALSE
  2152.                     menuPocket` = TRUE
  2153.                 END IF
  2154.             ELSE
  2155.                 IF Finger.clickL THEN menuPocket` = FALSE
  2156.             END IF
  2157.         ELSE '
  2158.             COLOR GREEN1, GREEN4 '
  2159.         END IF '
  2160.         LOCATE 1, 56 '
  2161.         PRINT "POCKET"; '
  2162.  
  2163.         IF fingerIsOnSurface%(496, 0, 48, 16) THEN '
  2164.             HUDpromt$ = "Select a spell to perform" '
  2165.             COLOR GREEN4, GREEN1 '
  2166.             IF menuSpells` = FALSE THEN
  2167.                 IF Finger.clickL THEN
  2168.                     menuPocket` = FALSE
  2169.                     menuSpells` = TRUE
  2170.                 END IF
  2171.             ELSE
  2172.                 IF Finger.clickL THEN menuSpells` = FALSE
  2173.             END IF
  2174.         ELSE '
  2175.             COLOR GREEN1, GREEN4 '
  2176.         END IF '
  2177.         LOCATE 1, 63 '
  2178.         PRINT "SPELLS"; '
  2179.  
  2180.         IF fingerIsOnSurface%(552, 0, 40, 16) THEN '
  2181.             HUDpromt$ = "Character statistics" '
  2182.             COLOR GREEN4, GREEN1 '
  2183.             IF menuStats` = FALSE THEN
  2184.                 IF Finger.clickL THEN menuStats` = TRUE
  2185.             ELSE
  2186.                 IF Finger.clickL THEN menuStats` = FALSE
  2187.             END IF
  2188.         ELSE '
  2189.             COLOR GREEN1, GREEN4 '
  2190.         END IF '
  2191.         LOCATE 1, 70 '
  2192.         PRINT "STATS"; '
  2193.  
  2194.         IF fingerIsOnSurface%(600, 0, 32, 16) THEN '
  2195.             HUDpromt$ = "Game main menu" '
  2196.             COLOR GREEN4, GREEN1 '
  2197.             IF Finger.clickL THEN menuMain` = TRUE
  2198.         ELSE '
  2199.             COLOR GREEN1, GREEN4 '
  2200.         END IF '
  2201.         LOCATE 1, 76 '
  2202.         PRINT "MENU"; '
  2203.     ELSE '                                 ¿
  2204.         COLOR GREEN1, GREEN4 '             ³ not players turn or
  2205.         LOCATE 1, 56 '                     ³ he's grabbing something,
  2206.         PRINT "POCKET SPELLS STATS MENU"; '³ decive him
  2207.     END IF '                               ¾
  2208.     LINE (0, 15)-(639, 15), GREEN1 ' divisory line between upper half and lower half of HUD
  2209.  
  2210.     IF Hero.attributePoints > 0 THEN lvlUpHUDButton 600, 17
  2211.  
  2212.     COLOR GREEN1, GREEN4 ' leave normal printing color before leaving, so we don't conflictuate with other stuff
  2213.  
  2214.  
  2215. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2216. SUB printHUDpromt (whatDoIPrint$)
  2217.     LOCATE 2, 1 '               promt line position
  2218.     COLOR GREEN1, GREEN4 '      always normal color for writing
  2219.     PRINT whatDoIPrint$;
  2220. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2221. SUB lvlUpHUDButton (x%, y%)
  2222.     _PUTIMAGE (x%, y%), LvlImg&(0) '                                                    draw Lvl image
  2223.     _PUTIMAGE (x% + 16, y%), DirArrowImg&(4) '                                          draw DirArrow upside
  2224.     IF fingerIsOnSurface%(x%, y%, 32, 16) AND inHand.lvl = -1 AND NOT menuMain` THEN '  if the mouse is over this images, no items held on hand and not main menu open
  2225.         HUDpromt$ = "Increase your attributes" '                                        inform user
  2226.         IF Finger.clickL THEN menuStats` = TRUE '                                       and if you click in it, then open the stats menu
  2227.     END IF
  2228. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2229.  
  2230. SUB showHistory (momentOfHistory%) 'dude, use your fantasy
  2231.     COLOR GREEN1, GREEN4
  2232.     CLS , GREEN4
  2233.     SELECT CASE momentOfHistory%
  2234.         CASE 0
  2235.             drawItemSlots 16, 24
  2236.             _PUTIMAGE (16, 24), calculateHeroImg&(Hero.class, Hero.lvl)
  2237.             PRINTslowly 2, 8, Hero.id + "'s history starts here:"
  2238.             PRINTslowly 3, 8, "During the year 634 a.k. the crisis of the water increased and the"
  2239.             PRINTslowly 4, 8, "habitants of Natrium were in the need to find new places to extract"
  2240.             PRINTslowly 5, 2, "the precius liquid, and bring it to the city to overome the problem."
  2241.             PRINTslowly 6, 2, "Our hero was one of these scouts, who reached a land called:"
  2242.             PRINTslowly 8, 36, "FANTASYLAND"
  2243.             PRINTslowly 10, 2, "a strange place indeed, poorly explored by the habitants of Natrium."
  2244.             PRINTslowly 11, 2, "And something strange is happening there: after renting a room in the"
  2245.             PRINTslowly 12, 2, "town central plaza, and in his first night trying to sleep there"
  2246.             PRINTslowly 13, 2, Hero.id + " heard some very strange noises. And as a good scout"
  2247.             PRINTslowly 14, 2, "he went to investigate..."
  2248.             SLEEP
  2249.             CLS , GREEN4
  2250.             PRINTslowly 14, 20, "What he found was disturbing..."
  2251.             SLEEP
  2252.     END SELECT
  2253. ' this history sucks XD
  2254. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2255. SUB loadProgramInitialVariables ()
  2256.     DIM x%
  2257.     DIM y%
  2258.     DIM i%
  2259.  
  2260.     actualMapWorking%% = -1 '               with no map yet
  2261.     lastMapWorking%% = actualMapWorking%% ' for drawMap check
  2262.     menuMain` = TRUE '                      program starts leading to the main menu
  2263.     playerTurn` = TRUE '                    Of course, the player starts
  2264.     menuPocket` = FALSE '¿
  2265.     menuSpells` = FALSE '³ <---------------  all menus at start must be closed
  2266.     menuStats` = FALSE ' ¾
  2267.  
  2268.     'initialize mouse variables
  2269.     Finger.x = 319
  2270.     Finger.y = 239
  2271.     Finger.image = FingerImg&(0)
  2272.  
  2273.     ' EQUIPPED positions
  2274.     Pocket(0).x = 542: Pocket(0).y = 136 '  head
  2275.     Pocket(1).x = 582: Pocket(1).y = 147 '  neck
  2276.     Pocket(2).x = 498: Pocket(2).y = 191 '  right hand
  2277.     Pocket(3).x = 542: Pocket(3).y = 191 '  torso
  2278.     Pocket(4).x = 586: Pocket(4).y = 191 '  right hand
  2279.     Pocket(5).x = 514: Pocket(5).y = 244 '  right finger
  2280.     Pocket(6).x = 569: Pocket(6).y = 244 '  left finger
  2281.  
  2282.  
  2283.     ' POCKET positions
  2284.     x% = 332
  2285.     y% = 136
  2286.     FOR i% = 7 TO 10
  2287.         Pocket(i%).x = x% + (i% - 7) * 36
  2288.         Pocket(i%).y = y%
  2289.         Pocket(i% + 4).x = x% + (i% - 7) * 36
  2290.         Pocket(i% + 4).y = y% + 36
  2291.         Pocket(i% + 8).x = x% + (i% - 7) * 36
  2292.         Pocket(i% + 8).y = y% + 72
  2293.         Pocket(i% + 12).x = x% + (i% - 7) * 36
  2294.         Pocket(i% + 12).y = y% + 108
  2295.     NEXT i%
  2296.  
  2297.     'let's also set some variables of the hand
  2298.     inHand.x = Finger.x
  2299.     inHand.y = Finger.y
  2300.     cleanYourHand
  2301.  
  2302.     FOR i% = 0 TO 22 '        Â¿
  2303.         Pocket(i%).map = -1 ' ³ during all game .map for
  2304.     NEXT i% '                 ³ pocket and inHand is always -1
  2305.     inHand.map = -1 '         ¾
  2306.  
  2307. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2308. SUB drawFourHeartAsPercentage (x%, y%, percent%)
  2309.     IF percent% > 99 THEN '                     ¿
  2310.         _PUTIMAGE (x%, y%), HeartImg&(0) '      Â³ full
  2311.         _PUTIMAGE (x% + 8, y%), HeartImg&(0) '  Â³ health
  2312.         _PUTIMAGE (x% + 16, y%), HeartImg&(0) ' ³
  2313.         _PUTIMAGE (x% + 24, y%), HeartImg&(0) ' Ù
  2314.     ELSEIF percent% > 74 THEN '                                   ¿
  2315.         _PUTIMAGE (x%, y%), HeartImg&(0) '                        Â³
  2316.         _PUTIMAGE (x% + 8, y%), HeartImg&(0) '                    Â³
  2317.         _PUTIMAGE (x% + 16, y%), HeartImg&(0) '                   ³ 99 to 75 %
  2318.         SELECT CASE percent% '                                    Â³ health
  2319.             CASE 95 TO 99: _PUTIMAGE (x% + 24, y%), HeartImg&(1) '³
  2320.             CASE 90 TO 94: _PUTIMAGE (x% + 24, y%), HeartImg&(2) '³
  2321.             CASE 85 TO 89: _PUTIMAGE (x% + 24, y%), HeartImg&(3) '³
  2322.             CASE 80 TO 84: _PUTIMAGE (x% + 24, y%), HeartImg&(4) '³
  2323.             CASE 75 TO 79: _PUTIMAGE (x% + 24, y%), HeartImg&(5) '³
  2324.         END SELECT '                                              Ã™
  2325.     ELSEIF percent% > 49 THEN '                                   ¿
  2326.         _PUTIMAGE (x%, y%), HeartImg&(0) '                        Â³
  2327.         _PUTIMAGE (x% + 8, y%), HeartImg&(0) '                    Â³
  2328.         _PUTIMAGE (x% + 24, y%), HeartImg&(5) '                   ³
  2329.         SELECT CASE percent% '                                    Â³ 74 to 50 %
  2330.             CASE 70 TO 74: _PUTIMAGE (x% + 16, y%), HeartImg&(1) '³ health
  2331.             CASE 65 TO 69: _PUTIMAGE (x% + 16, y%), HeartImg&(2) '³
  2332.             CASE 60 TO 64: _PUTIMAGE (x% + 16, y%), HeartImg&(3) '³
  2333.             CASE 55 TO 59: _PUTIMAGE (x% + 16, y%), HeartImg&(4) '³
  2334.             CASE 50 TO 54: _PUTIMAGE (x% + 16, y%), HeartImg&(5) '³
  2335.         END SELECT '                                              Ã™
  2336.     ELSEIF percent% > 24 THEN '                                   ¿
  2337.         _PUTIMAGE (x%, y%), HeartImg&(0) '                        Â³
  2338.         _PUTIMAGE (x% + 16, y%), HeartImg&(5) '                   ³
  2339.         _PUTIMAGE (x% + 24, y%), HeartImg&(5) '                   ³
  2340.         SELECT CASE percent% '                                    Â³ 49 to 25 %
  2341.             CASE 45 TO 49: _PUTIMAGE (x% + 8, y%), HeartImg&(1) ' ³ health
  2342.             CASE 40 TO 44: _PUTIMAGE (x% + 8, y%), HeartImg&(2) ' ³
  2343.             CASE 35 TO 39: _PUTIMAGE (x% + 8, y%), HeartImg&(3) ' ³
  2344.             CASE 30 TO 34: _PUTIMAGE (x% + 8, y%), HeartImg&(4) ' ³
  2345.             CASE 25 TO 29: _PUTIMAGE (x% + 8, y%), HeartImg&(5) ' ³
  2346.         END SELECT '                                              Ã™
  2347.     ELSE '                                                        Â¿
  2348.         _PUTIMAGE (x% + 8, y%), HeartImg&(5) '                    Â³
  2349.         _PUTIMAGE (x% + 16, y%), HeartImg&(5) '                   ³
  2350.         _PUTIMAGE (x% + 24, y%), HeartImg&(5) '                   ³
  2351.         SELECT CASE percent% '                                    Â³ 25 to 0 %
  2352.             CASE 20 TO 24: _PUTIMAGE (x%, y%), HeartImg&(1) '     ³ health
  2353.             CASE 15 TO 19: _PUTIMAGE (x%, y%), HeartImg&(2) '     ³
  2354.             CASE 10 TO 14: _PUTIMAGE (x%, y%), HeartImg&(3) '     ³
  2355.             CASE 5 TO 9: _PUTIMAGE (x%, y%), HeartImg&(4) '       ³
  2356.             CASE 0 TO 4: _PUTIMAGE (x%, y%), HeartImg&(5) '       ³
  2357.         END SELECT '                                              Â³
  2358.     END IF '                                                      Ã™
  2359.  
  2360. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2361. SUB barShowingPercentage (x%, y%, percent%)
  2362.  
  2363.     _PUTIMAGE (x%, y%), BarImg&(0) ' opening bar
  2364.     _PUTIMAGE (x% + 40, y%), BarImg&(6) ' closing bar
  2365.     '
  2366.     IF percent% > 99 THEN '                  Â¿
  2367.         _PUTIMAGE (x% + 8, y%), BarImg&(1) ' ³ 100%
  2368.         _PUTIMAGE (x% + 16, y%), BarImg&(1) '³
  2369.         _PUTIMAGE (x% + 24, y%), BarImg&(1) '³
  2370.         _PUTIMAGE (x% + 32, y%), BarImg&(1) 'Ù
  2371.     ELSEIF percent% > 74 THEN '                                 ¿
  2372.         _PUTIMAGE (x% + 8, y%), BarImg&(1) '                    Â³
  2373.         _PUTIMAGE (x% + 16, y%), BarImg&(1) '                   ³
  2374.         _PUTIMAGE (x% + 24, y%), BarImg&(1) '                   ³
  2375.         SELECT CASE percent% '                                  Â³ 99 to 75 %
  2376.             CASE 95 TO 99: _PUTIMAGE (x% + 32, y%), BarImg&(1) '³
  2377.             CASE 90 TO 94: _PUTIMAGE (x% + 32, y%), BarImg&(2) '³
  2378.             CASE 85 TO 89: _PUTIMAGE (x% + 32, y%), BarImg&(3) '³
  2379.             CASE 80 TO 84: _PUTIMAGE (x% + 32, y%), BarImg&(4) '³
  2380.             CASE 75 TO 79: _PUTIMAGE (x% + 32, y%), BarImg&(5) '³
  2381.         END SELECT '                                            Ã™
  2382.     ELSEIF percent% > 49 THEN '                                 ¿
  2383.         _PUTIMAGE (x% + 8, y%), BarImg&(1) '                    Â³
  2384.         _PUTIMAGE (x% + 16, y%), BarImg&(1) '                   ³
  2385.         _PUTIMAGE (x% + 32, y%), BarImg&(5) '                   ³ 74 to 50 %
  2386.         SELECT CASE percent% '                                  Â³
  2387.             CASE 70 TO 74: _PUTIMAGE (x% + 24, y%), BarImg&(1) '³
  2388.             CASE 65 TO 69: _PUTIMAGE (x% + 24, y%), BarImg&(2) '³
  2389.             CASE 60 TO 64: _PUTIMAGE (x% + 24, y%), BarImg&(3) '³
  2390.             CASE 55 TO 59: _PUTIMAGE (x% + 24, y%), BarImg&(4) '³
  2391.             CASE 50 TO 54: _PUTIMAGE (x% + 24, y%), BarImg&(5) '³
  2392.         END SELECT '                                            Ã™
  2393.     ELSEIF percent% > 24 THEN '                                 ¿
  2394.         _PUTIMAGE (x% + 8, y%), BarImg&(1) '                    Â³
  2395.         _PUTIMAGE (x% + 24, y%), BarImg&(5) '                   ³
  2396.         _PUTIMAGE (x% + 32, y%), BarImg&(5) '                   ³
  2397.         SELECT CASE percent% '                                  Â³ 49 to 25 %
  2398.             CASE 45 TO 49: _PUTIMAGE (x% + 16, y%), BarImg&(1) '³
  2399.             CASE 40 TO 44: _PUTIMAGE (x% + 16, y%), BarImg&(2) '³
  2400.             CASE 35 TO 39: _PUTIMAGE (x% + 16, y%), BarImg&(3) '³
  2401.             CASE 30 TO 34: _PUTIMAGE (x% + 16, y%), BarImg&(4) '³
  2402.             CASE 25 TO 29: _PUTIMAGE (x% + 16, y%), BarImg&(5) '³
  2403.         END SELECT '                                            Ã™
  2404.     ELSE '                                                      Â¿
  2405.         _PUTIMAGE (x% + 16, y%), BarImg&(5) '                   ³
  2406.         _PUTIMAGE (x% + 24, y%), BarImg&(5) '                   ³
  2407.         _PUTIMAGE (x% + 32, y%), BarImg&(5) '                   ³
  2408.         SELECT CASE percent% '                                  Â³
  2409.             CASE 20 TO 24: _PUTIMAGE (x% + 8, y%), BarImg&(1) ' ³ 25 to 0 %
  2410.             CASE 15 TO 19: _PUTIMAGE (x% + 8, y%), BarImg&(2) ' ³
  2411.             CASE 10 TO 14: _PUTIMAGE (x% + 8, y%), BarImg&(3) ' ³
  2412.             CASE 5 TO 9: _PUTIMAGE (x% + 8, y%), BarImg&(4) '   ³
  2413.             CASE 0 TO 4: _PUTIMAGE (x% + 8, y%), BarImg&(5) '   ³
  2414.         END SELECT '                                            Â³
  2415.     END IF '                                                    Ã™
  2416.  
  2417. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2418. SUB drawMenuBack (strX%, strY%, endX%, endY%)
  2419.     LINE (strX%, strY%)-(endX%, endY%), GREEN4, B
  2420.     LINE (strX% + 1, strY% + 1)-(endX% - 1, endY% - 1), GREEN3, B
  2421.     LINE (strX% + 2, strY% + 2)-(endX% - 2, endY% - 2), GREEN2, B
  2422.     LINE (strX% + 3, strY% + 3)-(endX% - 3, endY% - 3), GREEN1, B
  2423.     LINE (strX% + 4, strY% + 4)-(endX% - 4, endY% - 4), GREEN2, B
  2424.     LINE (strX% + 5, strY% + 5)-(endX% - 5, endY% - 5), GREEN3, B
  2425.     LINE (strX% + 6, strY% + 6)-(endX% - 6, endY% - 6), GREEN4, BF
  2426. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2427. SUB drawItemSlots (begX, begY)
  2428.     LINE (begX, begY)-(begX + 32, begY + 32), GREEN1, B
  2429.     LINE (begX + 1, begY + 1)-(begX + 31, begY + 31), GREEN2, BF
  2430. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2431. FUNCTION fingerIsOnSurface% (begX%, begY%, imagePixelsX%, imagePixelsY%)
  2432.     IF ((Finger.x >= begX% AND Finger.x <= begX% + (imagePixelsX% - 1)) AND (Finger.y >= begY% AND Finger.y <= begY% + (imagePixelsY% - 1))) THEN
  2433.         fingerIsOnSurface% = TRUE
  2434.     ELSE
  2435.         fingerIsOnSurface% = FALSE
  2436.     END IF
  2437. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2438. SUB PRINTslowly (originY%, originX%, message$)
  2439.     DIM i%
  2440.     i% = 0 '                                                Ã„¿
  2441.     DO '                                                     ³
  2442.         _DELAY .05 '                                         ³
  2443.         i% = i% + 1 '                                        Â³ print message$
  2444.         buildingMessage$ = LEFT$(message$, i%) + CHR$(219) ' ³ character by character
  2445.         LOCATE originY%, originX% '                          Â³ and erease the cursor
  2446.         PRINT buildingMessage$; '                            Â³
  2447.     LOOP UNTIL LEN(buildingMessage$) = LEN(message$) + 1 '  Ã„Ù
  2448.     LOCATE CSRLIN, originX% + LEN(message$): PRINT " "; ' erease cursor
  2449. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2450. SUB drawMyFantasy ()
  2451.     drawWorld
  2452.     'drawPortals
  2453.     drawItemsOnGround
  2454.     'drawMechs
  2455.     drawHero
  2456.     drawEnemies
  2457.     'drawFlyingObjectOrExplosion
  2458. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2459. SUB TESTER () ' <KILL ME AFTER TESTINGS>
  2460.     COLOR GREEN1, GREEN4
  2461.     LOCATE 27, 1
  2462.     PRINT (Finger.y \ 16) + 1; ","; (Finger.x \ 8) + 1
  2463.     LOCATE 28, 1
  2464.     PRINT "x="; Finger.x;
  2465.     LOCATE 29, 1
  2466.     PRINT "y="; Finger.y;
  2467.     PSET (Finger.x, Finger.y), _RGB32(255, 0, 0) '
  2468. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2469. SUB checkForAssets ()
  2470.     IF NOT _DIREXISTS(".\data") THEN fatalError "data folder"
  2471.     CHDIR ".\data" 'we are @ Fantasy\data\
  2472.     IF NOT _DIREXISTS(".\images") THEN fatalError "images folder"
  2473.     IF NOT _DIREXISTS(".\sounds") THEN fatalError "sounds folder"
  2474.     IF NOT _DIREXISTS(".\worlds") THEN fatalError "worlds folder"
  2475.     IF NOT _DIREXISTS(".\saved") THEN fatalError "saved folder"
  2476.     'if no more directories for check then check the images
  2477.     CHDIR ".\images" 'we are @ Fantasy\data\images\
  2478.     IF NOT _FILEEXISTS(".\armor.png") THEN fatalError "armor.png"
  2479.     IF NOT _FILEEXISTS(".\arrow.png") THEN fatalError "arrow.png"
  2480.     IF NOT _FILEEXISTS(".\axe.png") THEN fatalError "axe.png"
  2481.     IF NOT _FILEEXISTS(".\bar.png") THEN fatalError "bar.png"
  2482.     IF NOT _FILEEXISTS(".\bijou.png") THEN fatalError "bijou.png"
  2483.     IF NOT _FILEEXISTS(".\bolt.png") THEN fatalError "bolt.png"
  2484.     IF NOT _FILEEXISTS(".\bomb.png") THEN fatalError "bomb.png"
  2485.     IF NOT _FILEEXISTS(".\book.png") THEN fatalError "book.png"
  2486.     IF NOT _FILEEXISTS(".\bow.png") THEN fatalError "bow.png"
  2487.     IF NOT _FILEEXISTS(".\chest.png") THEN fatalError "chest.png"
  2488.     IF NOT _FILEEXISTS(".\crossbow.png") THEN fatalError "crossbow.png"
  2489.     IF NOT _FILEEXISTS(".\dirArrow.png") THEN fatalError "dirArrow.png"
  2490.     IF NOT _FILEEXISTS(".\enemy.png") THEN fatalError "enemy.png"
  2491.     IF NOT _FILEEXISTS(".\finger.png") THEN fatalError "finger.png"
  2492.     IF NOT _FILEEXISTS(".\gndItems.png") THEN fatalError "gndItems.png"
  2493.     IF NOT _FILEEXISTS(".\heart.png") THEN fatalError "heart.png"
  2494.     IF NOT _FILEEXISTS(".\helm.png") THEN fatalError "helm.png"
  2495.     IF NOT _FILEEXISTS(".\hero.png") THEN fatalError "hero.png"
  2496.     IF NOT _FILEEXISTS(".\hud.png") THEN fatalError "hud.png"
  2497.     IF NOT _FILEEXISTS(".\key.png") THEN fatalError "key.png"
  2498.     IF NOT _FILEEXISTS(".\light.png") THEN fatalError "light.png"
  2499.     IF NOT _FILEEXISTS(".\lvl.png") THEN fatalError "lvl.png"
  2500.     IF NOT _FILEEXISTS(".\money.png") THEN fatalError "money.png"
  2501.     IF NOT _FILEEXISTS(".\paper.png") THEN fatalError "paper.png"
  2502.     IF NOT _FILEEXISTS(".\portal.png") THEN fatalError "portal.png"
  2503.     IF NOT _FILEEXISTS(".\potion.png") THEN fatalError "potion.png"
  2504.     IF NOT _FILEEXISTS(".\shield.png") THEN fatalError "shield.png"
  2505.     IF NOT _FILEEXISTS(".\spell.png") THEN fatalError "spell.png"
  2506.     IF NOT _FILEEXISTS(".\sword.png") THEN fatalError "sword.png"
  2507.     IF NOT _FILEEXISTS(".\throw.png") THEN fatalError "throw.png"
  2508.     IF NOT _FILEEXISTS(".\wand.png") THEN fatalError "wand.png"
  2509.     IF NOT _FILEEXISTS(".\world.png") THEN fatalError "world.png"
  2510.     CHDIR ".\.." 'we are @ Fantasy\data\
  2511.  
  2512. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2513. SUB fatalError (thingNotFound$)
  2514.     CLS , GREEN4
  2515.     LOCATE 2, 2
  2516.     COLOR GREEN1, GREEN4
  2517.     PRINT "Fatal error: " + thingNotFound$ + " not found"
  2518.     SLEEP
  2519.     SYSTEM
  2520. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2521. SUB loadImages ()
  2522.     DIM tmpImg&
  2523.     DIM i%
  2524.     CHDIR ".\images"
  2525.     'we are @ Fantasy\data\images\
  2526.     tmpImg& = _LOADIMAGE(".\armor.png", 32): FOR i% = 0 TO 7: ArmorImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, ArmorImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2527.     tmpImg& = _LOADIMAGE(".\arrow.png", 32): FOR i% = 0 TO 2: ArrowImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, ArrowImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2528.     tmpImg& = _LOADIMAGE(".\axe.png", 32): FOR i% = 0 TO 7: AxeImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, AxeImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2529.     tmpImg& = _LOADIMAGE(".\bar.png", 32): FOR i% = 0 TO 6: BarImg&(i%) = _NEWIMAGE(8, 8, 32): _PUTIMAGE (0, 0), tmpImg&, BarImg&(i%), (i% * 8, 0)-(i% * 8 + 7, 7): NEXT i%: _FREEIMAGE tmpImg&
  2530.     tmpImg& = _LOADIMAGE(".\bijou.png", 32): FOR i% = 0 TO 3: BijouImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, BijouImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2531.     tmpImg& = _LOADIMAGE(".\bolt.png", 32): FOR i% = 0 TO 1: BoltImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, BoltImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2532.     tmpImg& = _LOADIMAGE(".\bomb.png", 32): FOR i% = 0 TO 2: BombImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, BombImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2533.     tmpImg& = _LOADIMAGE(".\book.png", 32): FOR i% = 0 TO 3: BookImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, BookImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2534.     tmpImg& = _LOADIMAGE(".\bow.png", 32): FOR i% = 0 TO 2: BowImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, BowImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2535.     tmpImg& = _LOADIMAGE(".\chest.png", 32): FOR i% = 0 TO 1: ChestImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, ChestImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2536.     tmpImg& = _LOADIMAGE(".\crossbow.png", 32): FOR i% = 0 TO 1: CrossbowImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, CrossbowImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2537.     tmpImg& = _LOADIMAGE(".\dirArrow.png", 32): FOR i% = 0 TO 12: DirArrowImg&(i%) = _NEWIMAGE(16, 16, 32): _PUTIMAGE (0, 0), tmpImg&, DirArrowImg&(i%), (i% * 16, 0)-(i% * 16 + 15, 15): NEXT i%: _FREEIMAGE tmpImg&
  2538.     tmpImg& = _LOADIMAGE(".\enemy.png", 32)
  2539.     FOR i% = 0 TO 7
  2540.         EnemyImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, EnemyImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31)
  2541.         EnemyImg&(i% + 8) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, EnemyImg&(i% + 8), (i% * 32, 32)-(i% * 32 + 31, 63)
  2542.         EnemyImg&(i% + 16) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, EnemyImg&(i% + 16), (i% * 32, 64)-(i% * 32 + 31, 95)
  2543.         EnemyImg&(i% + 24) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, EnemyImg&(i% + 24), (i% * 32, 96)-(i% * 32 + 31, 127)
  2544.     NEXT i%: _FREEIMAGE tmpImg&
  2545.     tmpImg& = _LOADIMAGE(".\finger.png", 32): FOR i% = 0 TO 8: FingerImg&(i%) = _NEWIMAGE(16, 16, 32): _PUTIMAGE (0, 0), tmpImg&, FingerImg&(i%), (i% * 16, 0)-(i% * 16 + 15, 15): NEXT i%: _FREEIMAGE tmpImg&
  2546.     tmpImg& = _LOADIMAGE(".\gndItems.png", 32): FOR i% = 0 TO 17: GndItemsImg&(i%) = _NEWIMAGE(16, 16, 32): _PUTIMAGE (0, 0), tmpImg&, GndItemsImg&(i%), (i% * 16, 0)-(i% * 16 + 15, 15): NEXT i%: _FREEIMAGE tmpImg&
  2547.     tmpImg& = _LOADIMAGE(".\heart.png", 32): FOR i% = 0 TO 5: HeartImg&(i%) = _NEWIMAGE(8, 8, 32): _PUTIMAGE (0, 0), tmpImg&, HeartImg&(i%), (i% * 8, 0)-(i% * 8 + 7, 7): NEXT i%: _FREEIMAGE tmpImg&
  2548.     tmpImg& = _LOADIMAGE(".\helm.png", 32): FOR i% = 0 TO 7: HelmImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, HelmImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2549.     tmpImg& = _LOADIMAGE(".\hero.png", 32): FOR i% = 0 TO 7: HeroImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, HeroImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2550.     tmpImg& = _LOADIMAGE(".\hud.png", 32): FOR i% = 0 TO 3: HUDImg&(i%) = _NEWIMAGE(16, 16, 32): _PUTIMAGE (0, 0), tmpImg&, HUDImg&(i%), (i% * 16, 0)-(i% * 16 + 15, 15): NEXT i%: _FREEIMAGE tmpImg&
  2551.     tmpImg& = _LOADIMAGE(".\key.png", 32): FOR i% = 0 TO 5: KeyImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, KeyImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2552.     tmpImg& = _LOADIMAGE(".\light.png", 32): FOR i% = 0 TO 7: LightImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, LightImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2553.     tmpImg& = _LOADIMAGE(".\lvl.png", 32): FOR i% = 0 TO 10: LvlImg&(i%) = _NEWIMAGE(16, 16, 32): _PUTIMAGE (0, 0), tmpImg&, LvlImg&(i%), (i% * 16, 0)-(i% * 16 + 15, 15): NEXT i%: _FREEIMAGE tmpImg&
  2554.     tmpImg& = _LOADIMAGE(".\money.png", 32): FOR i% = 0 TO 3: MoneyImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, MoneyImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2555.     tmpImg& = _LOADIMAGE(".\paper.png", 32): FOR i% = 0 TO 1: PaperImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, PaperImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2556.     tmpImg& = _LOADIMAGE(".\portal.png", 32): FOR i% = 0 TO 7: PortalImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, PortalImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2557.     tmpImg& = _LOADIMAGE(".\potion.png", 32): FOR i% = 0 TO 7: PotionImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, PotionImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2558.     tmpImg& = _LOADIMAGE(".\shield.png", 32): FOR i% = 0 TO 7: ShieldImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, ShieldImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2559.     tmpImg& = _LOADIMAGE(".\spell.png", 32): FOR i% = 0 TO 5: SpellImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, SpellImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2560.     tmpImg& = _LOADIMAGE(".\sword.png", 32): FOR i% = 0 TO 7: SwordImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, SwordImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2561.     tmpImg& = _LOADIMAGE(".\throw.png", 32): FOR i% = 0 TO 2: ThrowImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, ThrowImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2562.     tmpImg& = _LOADIMAGE(".\wand.png", 32): FOR i% = 0 TO 7: WandImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, WandImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31): NEXT i%: _FREEIMAGE tmpImg&
  2563.     tmpImg& = _LOADIMAGE(".\world.png", 32)
  2564.     FOR i% = 0 TO 7
  2565.         WorldImg&(i%) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, WorldImg&(i%), (i% * 32, 0)-(i% * 32 + 31, 31)
  2566.         WorldImg&(i% + 8) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, WorldImg&(i% + 8), (i% * 32, 32)-(i% * 32 + 31, 63)
  2567.         WorldImg&(i% + 16) = _NEWIMAGE(32, 32, 32): _PUTIMAGE (0, 0), tmpImg&, WorldImg&(i% + 16), (i% * 32, 64)-(i% * 32 + 31, 95)
  2568.     NEXT i%: _FREEIMAGE tmpImg&
  2569.     BlankImg& = _NEWIMAGE(1, 1, 32)
  2570.     CHDIR ".\.." ' back to data
  2571.     'we are @ Fantasy\data\
  2572. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2573. SUB unloadImages ()
  2574.     DIM i%
  2575.     FOR i% = 0 TO 7: _FREEIMAGE ArmorImg&(i%): NEXT i%
  2576.     FOR i% = 0 TO 2: _FREEIMAGE ArrowImg&(i%): NEXT i%
  2577.     FOR i% = 0 TO 7: _FREEIMAGE AxeImg&(i%): NEXT i%
  2578.     FOR i% = 0 TO 6: _FREEIMAGE BarImg&(i%): NEXT i%
  2579.     FOR i% = 0 TO 3: _FREEIMAGE BijouImg&(i%): NEXT i%
  2580.     FOR i% = 0 TO 1: _FREEIMAGE BoltImg&(i%): NEXT i%
  2581.     FOR i% = 0 TO 2: _FREEIMAGE BombImg&(i%): NEXT i%
  2582.     FOR i% = 0 TO 3: _FREEIMAGE BookImg&(i%): NEXT i%
  2583.     FOR i% = 0 TO 2: _FREEIMAGE BowImg&(i%): NEXT i%
  2584.     FOR i% = 0 TO 1: _FREEIMAGE ChestImg&(i%): NEXT i%
  2585.     FOR i% = 0 TO 1: _FREEIMAGE CrossbowImg&(i%): NEXT i%
  2586.     FOR i% = 0 TO 12: _FREEIMAGE DirArrowImg&(i%): NEXT i%
  2587.     FOR i% = 0 TO 31: _FREEIMAGE EnemyImg&(i%): NEXT i%
  2588.     FOR i% = 0 TO 8: _FREEIMAGE FingerImg&(i%): NEXT i%
  2589.     FOR i% = 0 TO 17: _FREEIMAGE GndItemsImg&(i%): NEXT i%
  2590.     FOR i% = 0 TO 5: _FREEIMAGE HeartImg&(i%): NEXT i%
  2591.     FOR i% = 0 TO 7: _FREEIMAGE HelmImg&(i%): NEXT i%
  2592.     FOR i% = 0 TO 7: _FREEIMAGE HeroImg&(i%): NEXT i%
  2593.     FOR i% = 0 TO 3: _FREEIMAGE HUDImg&(i%): NEXT i%
  2594.     FOR i% = 0 TO 5: _FREEIMAGE KeyImg&(i%): NEXT i%
  2595.     FOR i% = 0 TO 7: _FREEIMAGE LightImg&(i%): NEXT i%
  2596.     FOR i% = 0 TO 10: _FREEIMAGE LvlImg&(i%): NEXT i%
  2597.     FOR i% = 0 TO 3: _FREEIMAGE MoneyImg&(i%): NEXT i%
  2598.     FOR i% = 0 TO 1: _FREEIMAGE PaperImg&(i%): NEXT i%
  2599.     FOR i% = 0 TO 7: _FREEIMAGE PortalImg&(i%): NEXT i%
  2600.     FOR i% = 0 TO 7: _FREEIMAGE PotionImg&(i%): NEXT i%
  2601.     FOR i% = 0 TO 7: _FREEIMAGE ShieldImg&(i%): NEXT i%
  2602.     FOR i% = 0 TO 5: _FREEIMAGE SpellImg&(i%): NEXT i%
  2603.     FOR i% = 0 TO 7: _FREEIMAGE SwordImg&(i%): NEXT i%
  2604.     FOR i% = 0 TO 2: _FREEIMAGE ThrowImg&(i%): NEXT i%
  2605.     FOR i% = 0 TO 7: _FREEIMAGE WandImg&(i%): NEXT i%
  2606.     FOR i% = 0 TO 23: _FREEIMAGE WorldImg&(i%): NEXT i%
  2607.     _FREEIMAGE BlankImg&
  2608. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2609.  
Title: Re: Fantasy
Post by: NOVARSEG on June 24, 2021, 10:55:49 pm

Hi Juan Tamarit

This is just a guess because I have not tested the code

Quote
  • orgFile& = FREEFILE 'we need two filehandles: one for origin file,
            destFile& = FREEFILE '       and another for destination file
            OPEN "town.txt" FOR INPUT AS #orgFile& '    e will extract info from this file
            OPEN "tmp.txt" FOR OUTPUT AS #destFile& '
[/size]


orgFile& = FREEFILE 'we need two filehandles: one for origin file,
       
OPEN "town.txt" FOR INPUT AS #orgFile& '    e will extract info from this file
       
destFile& = FREEFILE '       and another for destination file

OPEN "tmp.txt" FOR OUTPUT AS #destFile& '


Title: Re: Fantasy
Post by: FellippeHeitor on June 24, 2021, 11:01:01 pm
NOVARSEG is correct. The FREEFILE function won't return a new handle unless the previous one it output is actually used to open a file.
Title: Re: Fantasy
Post by: NOVARSEG on June 24, 2021, 11:15:37 pm
The clue was here

Quote
I'm having an error that stands "file already open", particularly in line "OPEN "tmp.txt" FOR OUTPUT AS #destFile&".



Title: Re: Fantasy
Post by: Juan Tamarit on June 25, 2021, 12:57:00 am
Thank you guys. I solved it. Just a +1 after the second FREEFILE. But i understand what you say: until i don't use the handle for opening the file it won't give me a new one, right? That's why this +1 trick works, isn't it? Ok, i'll switch the order for fitting. Thanks again
Title: Re: Fantasy
Post by: Cobalt on June 25, 2021, 11:12:35 pm
very NES Zelda-esk looking.
Question that came up to my mind: do i need to have all these images loaded in variable arrays? Or is there a better an more efficient way to do this? I tried using a function where i loaded a main image, assign what i needed to a tmp&() array, coded the series of decision to choose wich of the indexes i wanted, assign that handle to the function, _freeing the file and exit the function... i didn't worked. Guess that _FREEIMAGE the handle and leaving the function leaves the function without nothing, right?

as with the Bman  I'm not totally sure what your getting at, unless of course you are old skool GETing and PUTing the sprites with an array?!
Title: Re: Fantasy
Post by: Juan Tamarit on June 27, 2021, 04:51:31 am
Yo dear bro Cobalt. Yes, i'm using an array of longs to place the images. I was asking if there was real need for doing so. b+ mentioned that yes, it was necessary, but also a function could be done with a unique tileset. But for the moment the various arrays for each kind of image makes the code more redable.

Thanks again to all you people for the help and support, even in the most silly questions.

Now, i have new doubts and problems. I'll try to be as much clear as i can: theres an UDT (User Data Type) array called Items, with and index length of just 1, index 0, and its global (SHARED on main module). When the SUB dropItemToGround happens the idea was to increase this array size by one and _PRESERVE, getting a UBOUND(Items) of 1, and then variables of the item that was holded by the hand (inHand is a variable used to manipulate items on the inventory) should suposed to be copied to this new array index. That seems to be working just fine, the item once it's on the ground outputs the rigth data (name, etc.)...

BUT, and here's the trouble, the SUB pickItemFromGround was suposed to do exactly the oposite, transfer the "item on the ground" data to a free slot in the inventory (determined by the FUNCTION lookForSpaceInPocket%, that retrieves the slot number if there's any, or 0 if not). After that the array should be reduced by one (there is some checking for case of last item in the array, but nothing very differrent from other case).
Code: QB64: [Select]
  1. SUB dropItemToGround ()
  2.     REDIM _PRESERVE Items(UBOUND(Items) + 1) AS OBJECT 'Increase the Items array index by one
  3.     Items(UBOUND(Items)).x = Hero.x '¿                  Item will be dropped
  4.     Items(UBOUND(Items)).y = Hero.y '¾                  at players feet
  5.     Items(UBOUND(Items)).kind = inHand.kind '      Â¿
  6.     Items(UBOUND(Items)).lvl = inHand.lvl '        Â³    We place in this new index
  7.     Items(UBOUND(Items)).ammount = inHand.ammount '³    all the data
  8.     Items(UBOUND(Items)).special = inHand.special '³    relataed to the item
  9.     Items(UBOUND(Items)).map = actualMapWorking%% '¾
  10.     cleanYourHand '                                     And clean all the variables from the "hand"
  11. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  12. SUB pickItemFromGround (indexOfItem%)
  13.     IF lookForSpaceInPocket% THEN '                                                 if theres place in your pocket
  14.         IF indexOfItem% = UBOUND(Items) THEN '                                      and that item is the last one of the array
  15.             Pocket(lookForSpaceInPocket%).kind = Items(idexOfItem%).kind '      Â¿
  16.             Pocket(lookForSpaceInPocket%).lvl = Items(idexOfItem%).lvl '        Â³   Transfer the data of the item to
  17.             Pocket(lookForSpaceInPocket%).ammount = Items(idexOfItem%).ammount '³   the free place on Pocket
  18.             Pocket(lookForSpaceInPocket%).special = Items(idexOfItem%).special '¾
  19.             REDIM _PRESERVE Items(UBOUND(Items) - 1) AS OBJECT '                    and reduce the array by one (destroying the last one)
  20.         ELSE ' but if the item is not the last one of the array
  21.             Pocket(lookForSpaceInPocket%).kind = Items(idexOfItem%).kind '      Â¿
  22.             Pocket(lookForSpaceInPocket%).lvl = Items(idexOfItem%).lvl '        Â³   Transfer the data of the item to
  23.             Pocket(lookForSpaceInPocket%).ammount = Items(idexOfItem%).ammount '³   the free place on Pocket
  24.             Pocket(lookForSpaceInPocket%).special = Items(idexOfItem%).special '¾
  25.             Items(indexOfItem%).x = Items(UBOUND(Items)).x '                    Â¿
  26.             Items(indexOfItem%).y = Items(UBOUND(Items)).y '                    Â³
  27.             Items(indexOfItem%).kind = Items(UBOUND(Items)).kind '              Â³   copy all the data of the last item
  28.             Items(indexOfItem%).lvl = Items(UBOUND(Items)).lvl '                Â³   in the array to this index of the array,
  29.             Items(indexOfItem%).ammount = Items(UBOUND(Items)).ammount '        Â³   overwriting the item we just picked
  30.             Items(indexOfItem%).special = Items(UBOUND(Items)).special '        Â³
  31.             Items(indexOfItem%).map = Items(UBOUND(Items)).map '                Â¾
  32.             REDIM _PRESERVE Items(UBOUND(Items) - 1) AS OBJECT '                    now we can eliminate the last item of the array (it has been copied to the picked item index)
  33.         END IF
  34.     ELSE '                                                                          if you have no room in pocket
  35.         HUDpromt$ = "You have no room on your pocket" '                             you should be aware of it
  36.     END IF
Running the program the item can be dropped to ground and picked up, but when you wan't to see it's image the function that is suposed to calculate such image brings an error "Subscript out of range", and it confuses completly wich image should be shown, as if the item variables were not copied back to the inventory.

What can be possibly wrong here? This sounded like perfect sense to me when i wrote it... what do you guys think? Is the problem clear or more specifications are required?

Cheers bros.
Title: Re: Fantasy
Post by: Juan Tamarit on July 02, 2021, 03:47:59 am
Hello again. Well, i found the issue: the FUNCTION lookForSpaceInPocket% uses the variable .kind of the Items array, so i was wrong by changing it first to the inventory, has to be the last data trasfered. This avois collapse, but now the item identity is changing and by some reason Pocket().kind and Pocket().lvl are both equal to 0. I will have to find why the data is not being transfered.  Wish me luck on that.

I also added motion to the character based on the WorldTiles%%(), checked the different diection from ehre the character can approach the new position and display arrow accordingly.

I was thinking that maybe the items should work as a stack, since im stacking them when i drop them to the ground, but i don't know how to implement a structure of First In-Last Out.

I also changed the asset wolrd.png to better suit the code and future tile draws that i fell there are missing for more possible ambients (very Mendeleiev style).

I will mention any other advances i'll make. For the moment i have to fix these thing.

Cheers bros, and thanks anyway for the help.

Title: Re: Fantasy
Post by: Juan Tamarit on July 02, 2021, 04:10:07 am
WOW! Just found the problem! =) wrong spelling of a variable name and solved. Wroted "idexOfItem%" instead of "indexOfItem%". Sometimes i scare myself. So items can be dropped an picked from the ground, no problems. I'll keep up if theres any more news. Cheeeeers!
Title: Re: Fantasy
Post by: Juan Tamarit on July 19, 2021, 10:19:30 pm
Hello nice people from the QB64 forum! Me again with a new doubt i can't figure, but i have a guess. In the following pice of code:

Code: QB64: [Select]
  1. DIM tmp$
  2.  
  3.     CLS
  4.     tmp$ = ""
  5.     IF _KEYDOWN(19200) AND _KEYDOWN(20480) THEN
  6.         tmp$ = "Down & left"
  7.     ELSEIF _KEYDOWN(19712) AND _KEYDOWN(20480) THEN
  8.         tmp$ = "Down & right"
  9.     ELSEIF _KEYDOWN(19200) AND _KEYDOWN(18432) THEN
  10.         tmp$ = "Up & left"
  11.     ELSEIF _KEYDOWN(19712) AND _KEYDOWN(18432) THEN
  12.         tmp$ = "Up & right"
  13.     ELSEIF _KEYDOWN(20480) THEN
  14.         tmp$ = "Down"
  15.     ELSEIF _KEYDOWN(19200) THEN
  16.         tmp$ = "Left"
  17.     ELSEIF _KEYDOWN(19712) THEN
  18.         tmp$ = "Right"
  19.     ELSEIF _KEYDOWN(18432) THEN
  20.         tmp$ = "Up"
  21.     END IF
  22.     IF _KEYDOWN(32) THEN tmp$ = tmp$ + " Spacebar"
  23.     PRINT tmp$;
  24.     _DISPLAY
  25.     _LIMIT 60

I can never get the phrase "Down & left Spacebar" OR "Down & right Spacebar" OR "Up & left Spacebar" OR "Up & right Spacebar"

My guessing: _KEYDOWN() can't read more that two keys at the same time... otherwise i can't figure what is happening. I'll wait for your opinions, suggestions, critics, press rolls or whatever.

On the other hand and good news: the project still advancing at good peace. There's already a commerce system for the items, recharging wands and identifying unidientified objects (of course, lol). A crude system of motion, interaction with some chests and stuff and we can combat with monsters with a ridiculous AI, but functional. I'll promise that ' will upload it as soon as have the "basic engine" working (i started to feel a bit wrong to bother you people with every single advance i make, even if it is very significative or surpraising to me). The game is ABSOLUTLY unbalanced, and i'm working hard on the commenting, so can be as much clear possible to everyone trying to read it.

By the way, i just downloaded the QB64 version 1.5, it's neat! Thanks again to the developers for creating this powerful and beatiful tool, and allowing people to download it. I really feel that with this compiler you can build ANYTHING. Be sure: you will be in the credits of the project, lol.

Ok, so i'll wait for your replies. Thanks before hand and cheers to all.
Title: Re: Fantasy
Post by: bplus on July 20, 2021, 07:52:56 am
Confirm spacebar not always showing up. For me, down left spacebar does show but not down right spacebar.

Have you tried _KEYHIT or combos of _KEYDOWN and _KEYHIT?

@SMcNeill has worked up alternate key system(s) fixes try searching?

Title: Re: Fantasy
Post by: Juan Tamarit on July 21, 2021, 12:56:16 am
Dear bro bPlus, thanks for your reply. I have tried these different methods. Excuse me if they aren't very smart, but they matches their author:

Code: QB64: [Select]
  1. 'Problem with combination of arrows, Ctrl, Shift, Alt and the Spacebar
  2.  
  3. CONST FALSE = 0: CONST TRUE = NOT FALSE
  4. '° CASE 0 °- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5.  
  6. DIM SHARED tmp$
  7.  
  8. DIM SHARED Spacebar%
  9. DIM SHARED Ctrl%
  10. DIM SHARED Shift%
  11. DIM SHARED Alt%
  12.  
  13.  
  14. DIM SHARED left%
  15. DIM SHARED right%
  16. DIM SHARED down%
  17.  
  18. 'FUNNY: in all cases "Up & right" seems to work okay with any other key, what's wrong with the others?
  19.  
  20.     CLS
  21.     key$ = ""
  22.     tmp$ = ""
  23.     Spacebar% = FALSE
  24.     Ctrl% = FALSE
  25.     Shift% = FALSE
  26.     Alt% = FALSE
  27.  
  28.     registerArrows
  29.  
  30.  
  31.  
  32.     'CHANGE MY NUMBER to see different methods
  33.     method5
  34.  
  35.     IF Spacebar% THEN
  36.         tmp$ = tmp$ + " + Spacebar"
  37.     ELSEIF Ctrl% THEN
  38.         tmp$ = tmp$ + " + Ctrl"
  39.     ELSEIF Shift% THEN
  40.         tmp$ = tmp$ + " + Shift"
  41.     ELSEIF Alt% THEN
  42.         tmp$ = tmp$ + " + Alt"
  43.     END IF
  44.  
  45.     PRINT tmp$;
  46.     _DISPLAY
  47.     _LIMIT 60
  48. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  49. SUB method5 () 'using _KEYHIT, using the long to decide what's TRUE
  50.  
  51.     DIM keyhitLong&
  52.  
  53.     keyhitLong& = _KEYHIT
  54.  
  55.     IF keyhitLong& = 32 THEN Spacebar% = TRUE
  56.     IF keyhitLong& = 100306 THEN Ctrl% = TRUE
  57.     IF keyhitLong& = 100304 THEN Shift% = TRUE
  58.     IF keyhitLong& = 100308 THEN Alt% = TRUE
  59.  
  60.     'Same result as method2, but with some flickering and  not continuous
  61.  
  62. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  63. SUB method4 () 'using _KEYDOWN directly as the variable%, but with _KEYCLEAR before
  64.  
  65.     _KEYCLEAR ' MAYBE CLEARING THE BUFFER BEFORE?
  66.  
  67.     Spacebar% = _KEYDOWN(32)
  68.     Ctrl% = _KEYDOWN(100306)
  69.     Shift% = _KEYDOWN(100304)
  70.     Alt% = _KEYDOWN(100308)
  71.  
  72.     'Combinations that didn't worked in this case:
  73.     '   "Left & down + Spacebar"
  74.     '   "Left & up + Alt"
  75.     '   "Left & up + Spacebar"
  76.     '   "Right & down + Spacebar"
  77.  
  78.     'Same result as method2, _KEYCLEAR seem to clear the buffer readed by INKEY$, but _KEYDOWN() takes directly from keyboiard hardware?
  79. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  80. SUB method3 () 'using _KEYDOWN directly as the variable%
  81.  
  82.     Spacebar% = _KEYDOWN(32)
  83.     Ctrl% = _KEYDOWN(100306)
  84.     Shift% = _KEYDOWN(100304)
  85.     Alt% = _KEYDOWN(100308)
  86.  
  87.     'Combinations that didn't worked in this case:
  88.     '   "Left & down + Spacebar"
  89.     '   "Left & up + Alt"
  90.     '   "Left & up + Spacebar"
  91.     '   "Right & down + Spacebar"
  92.  
  93.     'Same result as method2
  94. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  95. SUB method2 () 'using _KEYDOWN to change variables%
  96.  
  97.     IF _KEYDOWN(32) THEN Spacebar% = TRUE
  98.     IF _KEYDOWN(100306) THEN Ctrl% = TRUE
  99.     IF _KEYDOWN(100304) THEN Shift% = TRUE
  100.     IF _KEYDOWN(100308) THEN Alt% = TRUE
  101.  
  102.     'Combinations that didn't worked in this case:
  103.     '   "Left & down + Spacebar"
  104.     '   "Left & up + Alt"
  105.     '   "Left & up + Spacebar"
  106.     '   "Right & down + Spacebar"
  107.  
  108. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  109. SUB method1 () ' using INKEY$ to see the spacebar
  110.  
  111.     key$ = INKEY$
  112.     IF key$ <> "" THEN
  113.         IF key$ = CHR$(32) THEN
  114.             Spacebar% = TRUE
  115.         END IF
  116.     END IF
  117.  
  118.     'Combinations that didn't worked in this case:
  119.     '   "Up & left + Spacebar"
  120.     '   "Down & left + Spacebar"
  121.     '   "Down & right + Spacebar"
  122.  
  123. '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  124. SUB registerArrows ()
  125.  
  126.     IF _KEYDOWN(19200) THEN ' left
  127.     left% = TRUE: ELSE: left% = FALSE: END IF
  128.     IF _KEYDOWN(19712) THEN ' right
  129.     right% = TRUE: ELSE: right% = FALSE: END IF
  130.     IF _KEYDOWN(18432) THEN ' up
  131.     up% = TRUE: ELSE: up% = FALSE: END IF
  132.     IF _KEYDOWN(20480) THEN ' down
  133.     down% = TRUE: ELSE: down% = FALSE: END IF
  134.     IF left% AND up% THEN
  135.         tmp$ = "Left & Up"
  136.     ELSEIF left% AND down% THEN: tmp$ = "Left & Down"
  137.     ELSEIF right% AND up% THEN: tmp$ = "Right & Up"
  138.     ELSEIF right% AND down% THEN: tmp$ = "Right & Down"
  139.     ELSEIF left% THEN: tmp$ = "Left"
  140.     ELSEIF right% THEN: tmp$ = "Right"
  141.     ELSEIF up% THEN: tmp$ = "Up"
  142.     ELSEIF down% THEN: tmp$ = "Down": END IF
  143.     '_KEYCLEAR ' this didn't changed anything

I wasn't aware about the McNeil post, i will check them and come back if i find anything related to this. Thanks again.