Jump to content
IGNORED

The Legend of Beryl Reichardt


Opry99er

Recommended Posts

This is a test to see if I can still attach pictures here.

 

I am trying to download all 50,000,000,000 pictures I've uploaded to Photobucket over the years so I can cancel my account... All the pictures in this thread over the last 10 years are being held hostage and can't be viewed... I refuse to pay whatever ridiculous amount they're asking just so people can see my pictures.  Had I known they were going to change their identity from what the original intent of the service was, I wouldn't have used them for so many years.  Anyway, if all goes well, I will start re-uploading the relevant pictures to the thread here so there is some visual context to the information in the posts.

BerylBattle1.jpg

  • Like 6
Link to comment
Share on other sites

  • 2 years later...
  • 1 year later...
On 5/22/2022 at 9:20 AM, jrhodes said:

I didn't feel like reading through 42 pages of this thread, so forgive me for that.

I have a TI .dsk file (attached below) named TODBER.dsk which appears to be a TOD quest.

@Opry99er Is this TOD quest considered finished, or is this just a work-in-progress that you ditched in favor of a stand-alone rpg?

TODBER.DSK 180 kB · 26 downloads

Hey jrhodes.  :)  This was the original idea for the game... a TOD adventure with my customized sprites and story.  But it was not what I wanted.  The scaling in that particular game is terrible... fighting high level monsters on level 1, etc... I ended up just scrapping it and shooting for a standalone game... And here we are 13 years later, with no standalone game and a grossly neglected ToD adventure.  :lol:

  • Like 5
Link to comment
Share on other sites

4 hours ago, OLD CS1 said:

I hear it is getting a rebrand as "Beryl Reichardt Forever."  ::runs and hides::

I think I'll make it a crossover.  "Beryl Reichardt and the Neverending Story."  The southern oracle is 10,000 miles away.  And so is the release date of this game.

  • Like 1
  • Haha 1
Link to comment
Share on other sites

4 hours ago, Hakogame 箱亀 said:

I've been peeking in every once in a while over the last decade to see if any progress has happened with this game. I hope you continue with development at some point, but I do understand how life happens and interests shift over time.

Thanks for keeping up with it!  Sorry for the lack of development... as Realms of Antiquity has blown my mind beyond belief, I am seeing less and less of a need for Beryl Reichardt to be completed... but they are very different projects, so there may be some value in picking this up again.  :) Appreciate you!

  • Like 4
Link to comment
Share on other sites

19 hours ago, Opry99er said:

Thanks for keeping up with it!  Sorry for the lack of development... as Realms of Antiquity has blown my mind beyond belief, I am seeing less and less of a need for Beryl Reichardt to be completed... but they are very different projects, so there may be some value in picking this up again.  :) Appreciate you!

There is always need for different takes on similar projects--just like most of us on this forum are different takes on the concept of sanity.  :)  I'm so far out in the ozone that I have to lunge just to capture the random single molecules in my immediate vicinity to continue breathing. . .

 

Beryl must live! :) :) :)

  • Like 2
Link to comment
Share on other sites

Hmm... If there's any interest, I'll make a video stream showing all the progress (very little) I've made in the last 5 years on this project.  You can now save a game, load a game, go through the entire first world quest (without enemies, of course) and exit the first world--heading to the second.  I won't be disappointed if there's little-to-no interest.  :lol:  Vaporware is frustrating and dumb.  :) 

  • Like 2
Link to comment
Share on other sites

On 9/12/2023 at 5:45 PM, Opry99er said:

I won't be disappointed if there's little-to-no interest.  :lol:  Vaporware is frustrating and dumb.  :) 

It's not vaporware unless you promise "releasing soon!"

 

I'd love to see work in progress: graphics, animation, scenery. You can do a walkthrough narrative. 

  • Like 2
Link to comment
Share on other sites

On 9/8/2023 at 9:30 PM, Opry99er said:

The southern oracle is 10,000 miles away.  And so is the release date of this game.

You need a luck dragon, or a fire mare, to cover such distances.

 

 

Edited by OLD CS1
Did not have my clip handy...
  • Like 2
Link to comment
Share on other sites

1 hour ago, FarmerPotato said:

It's not vaporware unless you promise "releasing soon!"

 

I'd love to see work in progress: graphics, animation, scenery. You can do a walkthrough narrative. 

Thanks for that.  :) Yeah, I don't think I've ever put a release date on this game.  But it'll be somewhere between 2024 and 3024.  

 

There are some really cool updates I've made... I played through this game a little bit yesterday to reacquaint myself with the quest.  It's funny how much I had forgotten.  But it works... you can play through the whole world, start to finish... obtaining necessary quest items to enter blocked areas, etc.  The menu is probably my favorite part of this game so far.  It sounds like such a simple and frivolous thing to be proud of, but it turned out exactly as I had hoped, and I found myself neglecting the quest and just healing my party members and checking their status, etc.  :lol:

 

Saturday I'll do a walkthrough stream and post it both to this thread and to the live stream thread.  I need to go into the basement and find my big box of Beryl stuff.  I have a big thick folder with the novella, maps, old code, SPRITE definitions, etc.  I even have the original dot matrix printout from the Asgard TOD editor campaign I made in 2008 or 2009.  :lol:

 

Thanks for the interest, friend.  If I can find that big Beryl folder, I'll do a stream Saturday.  I'd love to show all that stuff if I can find it.

  • Like 3
Link to comment
Share on other sites

So I haven't posted my most updated code here in probably a decade.  :lol:  I figure it's a good place to put it, as having it just stashed on a hard drive somewhere, etc isn't good for anyone.  Going to try to use spoiler tags... don't know if I remember how.

 

[spoiler]

 

REM Beryl Reichardt TIdBiT transfer workstation:
REM 3/18/15
 
 
 
          // first  thing to do is call the link up to load the map data into memory
 
InitLoad-MapData: 
     CALL LDAT
 
 
PlayerStartup:
 
          // Give player a "place to start"
          // MX and MY are which map in the world are going to be drawn.  In this case, it's 1,1
          // PX&PY are the players' X location and Y location on the screen
          // SPX and SPY are the location of the SPRITE corresponding to the character position
 
 
     SPX=(PX-1)*8+1 :: SPY=(PY-1)*8+17
 
          // These are repeated strings.  Currently there are only three, but there may be more to come
 
     EX$="PRESS ENTER TO EXIT"
     BS$="BROADSWORD"
     EXU$="^^^^^^^^^^^^^^^^^^^"
 
     
          // These are Individual statistics for Beryl, Skylar, Reptoslicer, and Markus.  
          // They are now in arrays... For each array, the order is 1) Beryl, 2) Repto, 3) Markus, 4) Skylar
          // HP is the array for health.  HP(1,1) is the max health of Beryl.  HP(1,2) is the current health of Beryl
          // The same goes for MP.  NDIS is name display... Starting position and length for each player
          // ATK,DEFN,MATK,MDEF are used in battle.  ARM$,WEP$,STAT$,and CL$ are string variables for armor, weapons, 
          // status, and class.  MN is "magic number" or "the number of magics the player can cast"
          
          
          //*****CURRENTLY "FINDING AND REPLACING" ALL OLD VARIABLES WITH NEW ARRAY INFO
          //*****SO FAR COMPLETE:  HP (all), MP (all), XP(all), LEV (all), CL$, NDIS **NEEDS TO BE LOOKED AT
          //*****ARM$ (all), WEP$ (all), STAT$ (all), MN, CN$ **NEEDS TO BE LOOKED AT
          
          
LoadPlayers:
     DIM HP(4,2),MP(4,2),XP(4),LEV(4),CL$(4),NDIS(4,2),ATK(4),DEFN(4),MATK(4),MDEF(4)
     DIM ARM$(4),WEP$(4),STAT$(4),MN(4),CN$(4),STAT(4)
     
     
     //////////////////////////////////////////
     //this is where the user will select the//
     //game file and it will load based on   //
     //the selection by the player... need to//
     //implement this ASAP!!!!!!!!!!!!!!!!!! //
     //////////////////////////////////////////
     
     PullSlot:
         OPEN #2: "DSK1.TMPLOD",VARIABLE
         INPUT #2:SLOT
         CLOSE #2
     
     CheckSlot:
 
          ON SLOT GOTO GSL1,GSL2,GSL3   
     
            GameSaveLoad:
     
                 GSL1: 
                     OPEN #1:"DSK1.GSL1",VARIABLE
                     GOTO GameSaveLoad2
                 GSL2: 
                     OPEN #1:"DSK1.GSL2",VARIABLE
                     GOTO GameSaveLoad2
                 GSL3:
                     OPEN #1:"DSK1.GSL3",VARIABLE
                     GOTO GameSaveLoad2
     
GameSaveLoad2:
 
     FOR X=1 TO 4
     FOR Y=1 TO 2
     INPUT #1:HP(X,Y),MP(X,Y),NDIS(X,Y)
     NEXT Y
     NEXT X
     FOR X=1 TO 4
     INPUT #1:XP(X),LEV(X),CL$(X),ATK(X),DEFN(X),MATK(X),MDEF(X),ARM$(X),WEP$(X),STAT$(X),MN(X),CN$(X),STAT(X)
     NEXT X
     INPUT #1:GLD,HPO,MPO,ELI,SCR,QSTAT,MX,MY,PX,PY
     CLOSE #1
 
 
 
 
Setscreen:
 
          // set up screen and border for exploration routines
 
     CALL CLEAR
     CALL SCREEN(2) !black screen
     SPX=(PX-1)*8+1 :: SPY=(PY-1)*8+17
     
          //Draw Exploration Screen//
          
DrawScreen:
 
     CALL HCHAR(9,1,101,32):: CALL HCHAR(24,1,101,32):: CALL VCHAR(9,1,97,16):: CALL VCHAR(9,32,97,16) !border around viewport
     CALL HCHAR(9,1,98):: CALL HCHAR(9,32,100):: CALL HCHAR(24,1,99):: CALL HCHAR(24,32,96) !corners
     CALL CHAR(42,"193DD9FFD91924C3"):: CALL COLOR(2,11,2) !CHAR(42) is the little character representation so far... may change soon
     GOSUB TopInfo
 
     
     
     
     //TO DEBUG!!!!  Need to STOP the player character from showing up on the opposite side of screen
     //After a scroll.
                //****BEGIN GAME LOOP****//
TopGameLoop:
 
          // This is the very top of the game loop.
 
     CALL SETMAP(MX,MY)
     CALL SPRITE(#1,42,16,SPX,SPY)
 
            MidGameLoop:
 
                      // midpoint for returns from bottom of loop
                      // displays the character on screen based on player position
 
                 SPX=(PX-1)*8+1 :: SPY=(PY-1)*8+17
 
                 CALL LOCATE(#1,SPX,SPY)
 
 
 
                    MidgameLoop-Keyscan:
 
                         GOSUB Keyscan
 
                               //upon keypress, up down, left, right checking for tiles in the direction selected
                               //must be a tile below (lower than)CHR$(104)  to allow motion
                               //must add 2 to each column to compensate for the DISPLAY/GCHAR offset
 
          
     
          
               IF K=69 THEN CALL GCHAR(PX-1,PY+2,Q):: IF Q>105 THEN GOTO MidgameLoop-Keyscan ELSE PX=PX-1 :: GOTO CheckBoundary
               IF K=83 THEN CALL GCHAR(PX,PY+1,Q):: IF Q>105 THEN GOTO MidgameLoop-Keyscan ELSE PY=PY-1 :: GOTO CheckBoundary
               IF K=68 THEN CALL GCHAR(PX,PY+3,Q):: IF Q>105 THEN GOTO MidgameLoop-Keyscan ELSE PY=PY+1 :: GOTO CheckBoundary
               IF K=88 THEN CALL GCHAR(PX+1,PY+2,Q):: IF Q>105 THEN GOTO MidgameLoop-Keyscan ELSE PX=PX+1 :: GOTO CheckBoundary
 
                          //If M is pressed, goto menu block, if space bar, goto examine block
 
               IF K=32 THEN GOSUB Examine
               IF K=77 THEN GOTO MainMenu
               GOTO MidgameLoop-Keyscan
 
 
                  CheckBoundary:
 
                             // this determines the boundaries onscreen and sets the map to be drawn by assembly routine
                             // PX, PY are the current player's position on the screen
                             // MX, MY are the designations for which map will be drawn
          
          
                             //Need to debug this... the player character can clearly be 
                             //seen off the margins before a new map is drawn
 
 
                          IF PX<11 THEN PX=22 :: MY=MY-1 :: GOTO CheckMap
                          IF PX>22 THEN PX=11 :: MY=MY+1 :: GOTO CheckMap
                          IF PY<1 THEN PY=28 :: MX=MX-1 :: GOTO CheckMap
                          IF PY>28 THEN PY=1 :: MX=MX+1 :: GOTO CheckMap
                          GOTO MidGameLoop
 
 
                             CheckMap:
 
                                 IF MX<1 THEN MX=1 ELSE IF MX>2 THEN MX=2
                                 IF MY<1 THEN MY=1 ELSE IF MY>6 THEN MY=6
                                 CALL DELSPRITE(ALL)
                                 SPX=(PX-1)*8+1 :: SPY=(PY-1)*8+17 // copied this from midgameloop to try to squash scroll bug
                                 GOTO TopGameLoop
 
 
          //END GAME LOOP!!!!!!!!!!!!//
          
          //***SUBROUTINES BELOW***//
          
          
 
 
          //BEGIN EXAMINE LOOP//
Examine:
 
     DISPLAY AT(1,1):" ":" ":" ":" ":" ":" ":" ":" "
     DISPLAY AT(1,1):"WHICH DIRECTION?";
     
     ExamineKeyscan:
 
          GOSUB Keyscan
          IF K=69 THEN CALL GCHAR(PX-1,PY+2,Q):: GOSUB ExamineCheck :: RETURN
          IF K=83 THEN CALL GCHAR(PX,PY+1,Q):: GOSUB ExamineCheck :: RETURN
          IF K=68 THEN CALL GCHAR(PX,PY+3,Q):: GOSUB ExamineCheck :: RETURN
          IF K=88 THEN CALL GCHAR(PX+1,PY+2,Q):: GOSUB ExamineCheck :: RETURN
          GOTO ExamineKeyscan
 
               ExamineCheck:
                         //This is the "YES" or "correct tile, IS an item" bit
                     IF Q=111 THEN GOSUB CaveExam
                     IF Q=113 THEN GOSUB CrossExam
                     IF Q=115 THEN GOSUB BroadExam
                     IF Q=118 THEN GOSUB KeyExam
                     IF Q=119 THEN GOSUB ChestExam
                     IF Q=120 THEN GOSUB ObeliskExam
                     IF Q=121 THEN GOSUB ObeliskExam
                        //This is the "NO" or "incorrect tile, is not an item" bit
                     DISPLAY AT(1,1):" " :: GOSUB TopInfo :: RETURN
 
 
CaveExam:
 
     IF MY=2 THEN GOSUB CaveWinds
     IF MY>2 THEN GOSUB CaveShelter
 
     
     
          CaveWinds:
              IF GTIN<1 THEN DISPLAY AT(1,1):"WEAR THEE NOT A GILDED":"RING UPON THY BROW?"; :: GOSUB Keyscan :: RETURN
              CALL CLEAR :: CALL DELSPRITE(ALL) :: GOSUB CallDrag :: CALL MAGNIFY(3)
              CALL SPRITE(#1,132,9,161,60,#2,136,3,161,96,#3,124,5,161,132,#4,128,14,161,168)
              CALL SPRITE(#5,140,16,28,114)
              DISPLAY AT(7,1):"CAVE OF THE WINDS";
              DISPLAY AT(9,1):"THE PARTY HAS OBTAINED";:"THE SCROLL OF THE ANCIENTS";
              DISPLAY AT(11,1):"AND HELD COUNCIL WITH";:"ANIFAX THE WHITE DRAGON..."
              SCRANC=1 :: QSTAT=2 :: GOSUB ReturnString
                   WindsKeyscan:
                        GOSUB Keyscan
                        IF K=13 THEN CALL CLEAR :: CALL DELSPRITE(ALL) :: CALL MAGNIFY(1) :: GOTO DrawScreen
                        GOTO WindsKeyscan
                        RETURN
              
          CaveShelter:
              CALL CLEAR :: CALL DELSPRITE(ALL) :: GOSUB CallKeeper :: CALL MAGNIFY(3)
              CALL SPRITE(#1,132,9,161,60,#2,136,3,161,96,#3,124,5,161,132,#4,128,14,161,168)
              DISPLAY AT(4,1):"    HIDDEN CAVE SHELTER";:" ":"1) SEEK COUNCIL";:"2) BARTER";
              DISPLAY AT(8,1):"3) SAVE GAME";
              GOSUB ReturnString
                   ShelterKeyscan:
                        GOSUB Keyscan
                        IF K=13 THEN CALL CLEAR :: CALL DELSPRITE(ALL) :: CALL MAGNIFY(1) :: GOTO DrawScreen
                        ON K-48 GOSUB Council,Barter,SaveGame
                        GOTO CaveShelter
                        RETURN
                        
                        Council:
                            CALL CLEAR :: CALL SPRITE(#5,140,16,28,114)
                            IF QSTAT=0 THEN COUNCIL=0 :: GOTO DiskPrint
                            COUNCIL=QSTAT*10+QSTAT
 
                                
                            DiskPrint:
                                OPEN #1:"DSK1.FTX",RELATIVE,INTERNAL
                                FOR TXLOC=7 TO 17
                                INPUT #1,REC COUNCIL:TX$
                                DISPLAY AT(TXLOC,1):TX$
                                COUNCIL=COUNCIL+1
                                NEXT TXLOC
                                CLOSE #1
                            CouncilEnd:
                                    GOSUB Keyscan
                                    IF K=13 THEN GOTO CaveShelter
                                    GOTO CouncilEnd
                                    
                                    
                        Barter:
                            CALL CLEAR :: DISPLAY AT(7,:"BARTER"
                            DISPLAY AT(8,:"^^^^^^"
                            GOSUB ReturnString
                                BarterKeyscan:
                                    GOSUB Keyscan
                                    IF K=13 THEN GOTO CaveShelter
                                    GOTO BarterKeyscan
                                    RETURN
                        
                        SaveGame:
                            CALL CLEAR
                                    GOSUB SaveGame2
 
                                    RETURN
                        
                        
                        
                        
                        
                        
                        
                        
                        
 
 
CrossExam:
     IF MX=1 THEN GOSUB GraveKings :: RETURN
     IF MX=2 THEN GOSUB ExitWorld :: RETURN
     
          GraveKings:
              IF SCRANC<1 THEN DISPLAY AT(1,1):"AN OLD GRAVE..." :: GOSUB Keyscan :: RETURN
              CALL CLEAR :: CALL DELSPRITE(ALL)
              SCRPAS=1 :: HOK=1
              DISPLAY AT(4,1):"GRAVE OF THE KINGS...";:"THE PARTY HAS OBTAINED";:"THE SCROLL OF PASSAGE";
              DISPLAY AT(8,1):"AND HELD COUNCIL WITH";:"BERYL REICHARDT I";
              DISPLAY AT(11,1):"BERYL HAS ALSO BEEN GIVEN";:"THE HALBERD OF KINGS"; :: QSTAT=3
              GOSUB ReturnString
                   GraveKeyscan:
                        GOSUB Keyscan
                        IF K=13 THEN CALL CLEAR :: GOTO DrawScreen
                        GOTO GraveKeyscan
                        RETURN
                        
          ExitWorld:
               IF WRINGS<1 THEN DISPLAY AT(1,1):"A MOUNTAIN PASS--":"BLOCKED BY EVIL..."; :: GOSUB Keyscan :: RETURN
               CALL CLEAR :: CALL DELSPRITE(ALL)
               DISPLAY AT(4,1):"YOU HAVE DONE WELL, BERYL";:"BY DEFEATING THE SOUL REAVER";
               DISPLAY AT(6,1):"AND RECOVERING THE RINGS";:"OF WOOLDRIDGE...";
               DISPLAY AT(11,1):"THE DEMO IS OVER...";:"PRESS FCTN-4 TO QUIT..."
                    EndDemo:
                         GOTO EndDemo
                         RETURN
               
 
 
              
                     
                     
                     
     
BroadExam:
     IF BIT=1 THEN DISPLAY AT(1,1):"AN IMPRESSION OF A SWORD":"ON THE GROUND..." :: GOSUB Keyscan :: RETURN
     DISPLAY AT(1,1):"YOU FOUND A BROADSWORD":"ADD TO INVENTORY(Y/N)";
          MidBroadKeyscan:
               GOSUB Keyscan
               IF K=89 THEN BIT=1 :: BIN=1 :: DISPLAY AT(1,1):" ":" " :: RETURN
               IF K=78 THEN DISPLAY AT(1,1):" ":" " :: RETURN
               GOTO MidBroadKeyscan
               RETURN
     
     
     
KeyExam:
     IF KIT=1 THEN DISPLAY AT(1,1):"AN IMPRESSION OF A KEY":"ON THE GROUND..."; :: GOSUB Keyscan :: RETURN
     DISPLAY AT(1,1):"YOU FOUND A KEY":"ADD TO INVENTORY(Y/N)";
          MidKeyKeyscan:
               GOSUB Keyscan
               IF K=89 THEN KIT=1 :: KIN=1 :: CSTAT=2 :: DISPLAY AT(1,1):" ":" " :: RETURN
               IF K=78 THEN DISPLAY AT(1,1):" ":" " :: RETURN
               GOTO MidKeyKeyscan
     
ChestExam:
     IF CSTAT<2 THEN DISPLAY AT(1,1):"DO YOU NEED A KEY":"TO OPEN A CHEST?"; :: GOSUB Keyscan :: RETURN
     IF CSTAT=2 THEN DISPLAY AT(1,1):"CHEST HAS BEEN UNLOCKED!!"; :: CSTAT=3 :: GOSUB Keyscan :: RETURN
     IF CSTAT=3 THEN DISPLAY AT(1,1):"YOU HAVE FOUND":"THE GOLDEN TIARA!!"; :: CSTAT=4 :: GOSUB TiaraGet :: RETURN
     IF CSTAT=4 THEN DISPLAY AT(1,1):"YOU HAVE FOUND 100 GOLD!!"; :: CSTAT=5 :: GOSUB Keyscan :: RETURN
     IF CSTAT=5 THEN DISPLAY AT(1,1):"THE CHEST IS EMPTY..."; :: GOSUB Keyscan :: RETURN
     
     
ObeliskExam:
     IF SCRPAS<1 THEN DISPLAY AT(1,1):"THE PASSAGE IS BLOCKED...";:"SEEK THEE A SCROLL..." :: GOSUB Keyscan :: RETURN
     DISPLAY AT(1,1):"THE OBELISK IS OPEN...";:"DO YOU WISH TO ENTER? (Y/N)";
          ObeliskKeyscan:
               GOSUB Keyscan
               IF K=89 THEN GOSUB ObeliskEnter
               IF K=78 THEN DISPLAY AT(1,1):" ":" " :: RETURN
               GOTO ObeliskKeyscan
               
                    ObeliskEnter:
                         CALL CLEAR :: CALL DELSPRITE(ALL) :: CALL MAGNIFY(3)
                         CALL SPRITE(#1,132,9,161,60,#2,136,3,161,96,#3,124,5,161,132,#4,128,14,161,168)
                         
                         DISPLAY AT(4,1):"HERE THE PARTY BATTLES";:"THE SOUL REAVER FOR THE";
                         DISPLAY AT(6,1):"RINGS OF WOOLDRIDGE":" ":" ":"PARTY HAS OBTAINED THE":"RINGS OF WOOLDRIDGE"
                         WRINGS=1 :: QSTAT=4 :: GOSUB ReturnString
                              ObeliskEnterKeyscan:
                                   GOSUB Keyscan
                                   IF K=13 THEN CALL CLEAR :: CALL DELSPRITE(ALL) :: CALL MAGNIFY(1) :: GOTO DrawScreen
                                   GOTO ObeliskEnterKeyscan
                                   RETURN
                                   
 
TiaraGet:
     GTIN=1 :: QSTAT=1 :: GOSUB Keyscan :: RETURN
 
     
     
     
          ////////////////////
          //BEGIN MENU BLOCK//
          ////////////////////      
          
          
MainMenu:          
REM  MENU
     CALL CLEAR :: CALL SCREEN(2):: CALL DELSPRITE(ALL)
     CALL HCHAR(5,1,101,32):: CALL HCHAR(22,1,101,32):: CALL VCHAR(5,1,97,17):: CALL VCHAR(5,32,97,17)
     CALL HCHAR(5,1,98):: CALL HCHAR(5,32,100):: CALL HCHAR(22,1,99):: CALL HCHAR(22,32,96)
     
 
     MainMenu-MiddleReturn:
 
          GOSUB ClearMenu :: GOSUB ReturnString
          DISPLAY AT(1,14):"MENU";:: DISPLAY AT(2,14):"^^^^"
          DISPLAY AT(8,1):"1) ITEMS":"2) ARMOR":"3) WEAPONS":"4) SPELLS":"5) STATUS";
     
     
     MidMenu-Keyscan:
 
          GOSUB Keyscan
          IF K=13 THEN CALL CLEAR :: GOTO DrawScreen !**BUG FIXED HERE** Case-sensitive labels
          IF K>54 THEN GOTO MidMenu-Keyscan ELSE IF K<49 THEN GOTO MidMenu-Keyscan
          ON K-48 GOTO ItemMenu,ArmorMenu,WeaponsMenu,SpellsMenu,StatusMenu
 
     
     
     
 
          //BEGIN Item Menu//  ***NEED TO CONVERT THIS TO ELIMINATE "ACTIVExxx SUBS, USING NEW ARRAYS"
 
ItemMenu:
 
     REM ITEM MENU
     GOSUB ClearMenu
     DISPLAY AT(1,12):"ITEMS";:: DISPLAY AT(2,12):"^^^^^" :: GOSUB ReturnString
     DISPLAY AT(8,1):"USE ON WHICH CHARACTER?";:"1) BERYL";:"2) REPTOSLICER";:"3) MARKUS";:"4) SKYLAR";
 
     MidItem-Keyscan:
 
          GOSUB Keyscan
          IF K=13 THEN GOTO MainMenu-MiddleReturn 
          IF K>52 THEN GOTO MidItem-Keyscan ELSE IF K<49 THEN GOTO MidItem-Keyscan
          P=K-48 :: GOSUB ItemMenu2
          GOTO ItemMenu
 
 
//***MAY NEED TO DEBUG HERE (ITEM MENU)...  MAJOR RESTRUCTURE JUST COMPLETED (5/4/15)
 
     REM **THIS IS THE MEAT OF THE ITEM MENU CODE**
 
ItemMenu2:
     //Must get the NDIS variable set put in place here//
     GOSUB ClearMenu :: DISPLAY AT(1,NDIS(P,1)):CN$(P);:: CALL HCHAR(2,(NDIS(P,1))+2,94,NDIS(P,2))
     GOSUB ReturnString
     
ItemDisplay:
 
     DISPLAY AT(8,1):"1) POTION";HPO;:"2) ETHER";MPO;:"3) ELIXIR";ELI;
     DISPLAY AT(3,1):"HP:";HP(P,2);"/";HP(P,1);:: DISPLAY AT(3,16):"MP:";MP(P,2);"/";MP(P,1);
     
     MidItem2-Keyscan:
          GOSUB Keyscan
          IF K=13 THEN RETURN
          IF K>51 THEN GOTO MidItem2-Keyscan ELSE IF K<49 THEN GOTO MidItem2-Keyscan
          ON K-48 GOSUB HealthPotion,MagicPotion,Elixir
          RETURN
 
 
          //Use HealthPotion//
 
HealthPotion:
 
     IF HPO<1 THEN CALL SOUND(30,440,1):: HPO=0 :: GOTO ItemDisplay
     HPO=HPO-1 :: HP(P,2)=HP(P,2)+10 :: IF HP(P,2)>HP(P,1) THEN HP(P,2)=HP(P,1)
     GOSUB Flash
     GOTO ItemDisplay  //used to be a "RETURN" here... changed to GOTO to facilitate multicasts
     RETURN
 
          //Use MagicPotion//
          
MagicPotion:
 
     IF MPO<1 THEN CALL SOUND(30,440,1):: MPO=0 :: GOTO ItemDisplay
     MPO=MPO-1 :: MP(P,2)=MP(P,2)+10 :: IF MP(P,2)>MP(P,1) THEN MP(P,2)=MP(P,1)
     GOSUB Flash
     GOTO ItemDisplay  //used to be a "RETURN" here... changed to GOTO to facilitate multicasts
     RETURN
 
          //Use Elixir//
          
Elixir:
 
     IF ELI<1 THEN CALL SOUND(30,440,1):: ELI=0 :: GOTO ItemDisplay
     ELI=ELI-1 :: HP(P,2)=HP(P,2)+5 :: IF HP(P,2)>HP(P,1) THEN HP(P,2)=HP(P,1)
     MP(P,2)=MP(P,2)+5 :: IF MP(P,2)>MP(P,1) THEN MP(P,2)=MP(P,1)
     GOSUB Flash
     GOTO ItemDisplay  //used to be a "RETURN" here... changed to GOTO to facilitate multicasts
     RETURN
 
          //END Item Menu//
 
 
////////////////////////////////////////////////
//   ARMOR AND WEAPONS MENUS NOT YET COMPLETE //
////////////////////////////////////////////////
          //BEGIN Armor Menu//
          
ArmorMenu:
     
     REM ARMOR MENU
     GOSUB ClearMenu :: DISPLAY AT(1,12):"ARMOR";:: DISPLAY AT(2,12):"^^^^^" :: GOSUB ReturnString
     
          MidArmor-Keyscan:
 
               GOSUB Keyscan
               IF K=13 THEN GOTO MainMenu-MiddleReturn ELSE GOTO MidArmor-Keyscan
               GOSUB ClearMenu
 
          //END Armor Menu//
 
     
     
          //BEGIN Weapons Menu//
WeaponsMenu:     
     
     REM WEAPONS MENU
     GOSUB ClearMenu :: DISPLAY AT(1,11):"WEAPONS";:: DISPLAY AT(2,11):"^^^^^^^" :: GOSUB ReturnString
 
          MidWeapons-Keyscan:
 
               GOSUB Keyscan
               IF K=13 THEN GOTO MainMenu-MiddleReturn ELSE GOTO MidWeapons-Keyscan
               GOSUB ClearMenu
     
     
          //END Weapons Menu//
          
          
          
          
          //BEGIN Spells Menu//
     
     ////////////////////////////////////////////////////////////////////////////////////////////////////
     //SpellsMenu... this is a BIG one....  Need to have the ability to select WHO WILL CAST the magic///
     //WHO WILL RECEIVE the magic, then display HP and MHP of receiver, MP and MMP of caster           //
     //then animate the spell, display stat changes on both, then return to top of SpellsMenu.         //
     ////////////////////////////////////////////////////////////////////////////////////////////////////
 
     
          
     
     
SpellsMenu:
 
     REM SPELLS MENU
     GOSUB ClearMenu
     DISPLAY AT(1,12):"SPELLS";:: DISPLAY AT(2,12):"^^^^^^" :: GOSUB ReturnString
     DISPLAY AT(8,1):"WHO WILL CAST?";:"1) BERYL";:"2) REPTOSLICER";:"3) MARKUS";:"4) SKYLAR";
     
     
    
     MidSpells-Keyscan:
 
          GOSUB Keyscan
          IF K=13 THEN GOTO MainMenu-MiddleReturn 
          IF K>52 THEN GOTO MidSpells-Keyscan ELSE IF K<49 THEN GOTO MidSpells-Keyscan
          C=K-48 :: GOSUB SpellsMenu2
GOTO SpellsMenu
 
 
 
SpellsMenu2:
 
     
     
          //Display Caster's info at the top of the screen//
          
          
     GOSUB ClearMenu :: DISPLAY AT(1,NDIS(C,1)):CN$(C);:: CALL HCHAR(2,NDIS(C,1)+2,94,NDIS(C,2))
     DISPLAY AT(3,1):"HP:";HP(C,2);"/";HP(C,1);:: DISPLAY AT(3,16):"MP:";MP(C,2);"/";MP(C,1);
     GOSUB ReturnString
     IF MN(C)=0 THEN DISPLAY AT(17,1):"THIS MEMBER CANNOT CAST" :: GOSUB Keyscan :: GOTO SpellsMenu
     DISPLAY AT(8,1):"CAST ON WHICH PARTY MEMBER?";:"1) BERYL";:"2) REPTOSLICER";:"3) MARKUS";:"4) SKYLAR";
     
     
MidSpells-Keyscan2:
 
     GOSUB Keyscan
     IF K=13 THEN GOTO SpellsMenu 
     IF K>52 THEN GOTO MidSpells-Keyscan2 ELSE IF K<49 THEN GOTO MidSpells-Keyscan2
     R=K-48 :: GOSUB SpellsMenu3
     GOTO SpellsMenu
 
 
SpellsMenu3:
 
     //this part loads the "RP" temporary variable set (receiver) with the info from the "A" temporary variable set (active)
 
 
     GOSUB ClearBox
           //Display Receiver's Name and stats INSIDE the box/
           
     DISPLAY AT(8,NDIS(R,1)):CN$(R);:: CALL HCHAR(9,NDIS(R,1)+2,94,NDIS(R,2))
     DISPLAY AT(10,1):"HP:";HP(R,2);"/";HP(R,1);:: DISPLAY AT(10,16):"MP:";MP(R,2);"/";MP(R,1);
     DISPLAY AT(12,1):"CAST WHICH SPELL?"
 
FinalCast:
     DISPLAY AT(15,1):" "
     RESTORE SpellTypes
     FOR I=16 TO MN(C)+15
     READ TX$
     DISPLAY AT(I,1):TX$;
     NEXT I
    FinalCastKeyscan: 
          GOSUB Keyscan
          IF K=13 THEN RETURN
          IF K>MN(C)+48 THEN GOTO FinalCastKeyscan ELSE IF K<49 THEN GOTO FinalCastKeyscan
          ON K-48 GOSUB HealSpell,CureSpell,LifeSpell
          GOTO FinalCast
     
     
 
          //////////////////////////////////////////////////////////////////////
          //**Need to add status flag for "Healthy" "Poisoned" and "Fallen"   //
          //**As of now, Cure and Life do not do all that they WILL do once   //
          //**this is implemented fully.  Cure will heal "Poisoned" and change//
          //**status flag to "Healthy," Life will change status from "Fallen" //
          //**To "Healthy" and will allow "Heal" magic to raise HP.           //
          //////////////////////////////////////////////////////////////////////
          
          
HealSpell: 
     IF MP(C,2)<10 THEN GOSUB ClearBox :: DISPLAY AT(15,1):"NOT ENOUGH MP"; :: GOSUB Keyscan :: GOTO SpellsMenu
     IF HP(R,2)<1 THEN GOSUB ClearBox :: DISPLAY AT(15,1):"MEMBER IS FALLEN"; :: GOSUB Keyscan :: RETURN
     ///WEIRD BUG HERE.... CLASSIC99 KICKS OUT SYNTAX ERROR IN THE FOLLOWING LINE... TI SEEMS TO ERASE THE SPACE AFTER
     ///
     MP(C,2)=MP(C,2)-10 :: HP(R,2)=HP(R,2)+10 :: IF HP(R,2)>HP(R,1) THEN HP(R,2)=HP(R,1)
     GOSUB SpellResult
     RETURN
     
          //This will also change the status flag to "Healthy" once that part is complete
CureSpell:
     IF MP(C,2)<15 THEN GOSUB ClearBox :: DISPLAY AT(15,1):"NOT ENOUGH MP"; :: GOSUB Keyscan :: GOTO SpellsMenu
     MP(C,2)=MP(C,2)-15 :: STAT(R)=1 :: STAT$(R)="HEALTHY"
     GOSUB SpellResult
     RETURN
 
          //Still Need to add status flag for "Healthy" "Poisoned" and "Fallen"
LifeSpell:
     IF MP(C,2)<20 THEN GOSUB ClearBox :: DISPLAY AT(15,1):"NOT ENOUGH MP"; :: GOSUB Keyscan :: GOTO SpellsMenu
     MP(C,2)=MP(C,2)-20 :: IF HP(R,2)<1 THEN HP(R,2)=1 :: STAT(R)=1 :: STAT$(R)="HEALTHY :: "GOTO LifeSpellEnd
     HP(R,2)=HP(R,1)
     
LifeSpellEnd:
 
     GOSUB SpellResult
     RETURN
     
     
 
SpellResult:
 
///**bug**//////
////////////////
//when casting//
//on ones self//
//RP is not   //
//updated when//
//spell is cast/
////////////////
////**bug**/////
 
 
     DISPLAY AT(3,1):" "
     DISPLAY AT(3,1):"HP:";HP(C,2);"/";HP(C,1);:: DISPLAY AT(3,16):"MP:";MP(C,2);"/";MP(C,1);
     DISPLAY AT(8,1):" ":" ":" "
     DISPLAY AT(8,NDIS(R,1)):CN$(R);:: CALL HCHAR(9,NDIS(R,1)+2,94,NDIS(R,2))
     DISPLAY AT(10,1):"HP:";HP(R,2);"/";HP(R,1);:: DISPLAY AT(10,16):"MP:";MP(R,2);"/";MP(R,1);
     GOSUB Flash
     CALL SOUND(50,330,1) :: CALL SOUND(50,494,1) :: CALL SOUND(100,1319,0,494,10,330,10)
 
     RETURN
     
          ///////////////////
          //END Spells Menu//
          ///////////////////
          
          
          
 
StatusMenu:
 
     CALL DELSPRITE(ALL)
     GOSUB ClearMenu :: DISPLAY AT(1,12):"STATUS";:: DISPLAY AT(2,12):"^^^^^^" :: GOSUB ReturnString
 
     DISPLAY AT(8,1):"WHICH CHARACTER?";:"1) BERYL";:"2) REPTOSLICER";:"3) MARKUS";:"4) SKYLAR";
     CALL MAGNIFY(1)
 
     
     MidStatus-Keyscan:
 
          GOSUB Keyscan
          IF K=13 THEN GOTO MainMenu-MiddleReturn 
          IF K>52 THEN GOTO MidStatus-Keyscan ELSE IF K<49 THEN GOTO MidStatus-Keyscan
          GOSUB ClearBox
          P=K-48  :: ON P GOSUB StatusBeryl,StatusRepto,StatusMarkus,StatusSkylar
          GOTO StatusMenu
     
     
     ///////////////////////////////////////////////////////////////////////////////////
     //In the Statusxxx section, the program displays the character's name, underlines//
     //it, draws the character's likeness onscreen with a SPRITE, then branches to    //
     //StatusDisplay, where the character's data will be displayed onscreen as well   //
     ///////////////////////////////////////////////////////////////////////////////////    
     
     
StatusBeryl:
     DISPLAY AT(7,7):"BERYL REICHARDT";:: DISPLAY AT(8,7):"^^^^^^^^^^^^^^^"
     CALL MAGNIFY(3) :: CALL SPRITE(#1,132,9,120,200)
     GOSUB StatusDisplay
     RETURN
     
StatusRepto:
     DISPLAY AT(7,9):"REPTOSLICER";:: DISPLAY AT(8,9):"^^^^^^^^^^^"
     CALL MAGNIFY(3) :: CALL SPRITE(#1,136,3,120,200) 
     GOSUB StatusDisplay
     RETURN
     
StatusMarkus:
     DISPLAY AT(7,5):"MARKUS THE VALIANT";:: DISPLAY AT(8,5):"^^^^^^^^^^^^^^^^^^"
     CALL MAGNIFY(3) :: CALL SPRITE(#1,124,5,120,200)
     GOSUB StatusDisplay
     RETURN
     
StatusSkylar:
     DISPLAY AT(7,7):"SKYLAR TWILIGHT";:: DISPLAY AT(8,7):"^^^^^^^^^^^^^^^"
     CALL MAGNIFY(3) :: CALL SPRITE(#1,128,14,120,200)
     GOSUB StatusDisplay
     RETURN
     
 
     //***STILL WORKING ON THIS, NEXT IMPLEMENT WEP$ FOR EACH CHARACTER FOR DISPLAY,
 
     
StatusDisplay:
     NXLV=(50-XP(P))
     DISPLAY AT(9,2):"CLASS:"&CL$(P); :: DISPLAY AT(9,19):"LEVEL:"&STR$(LEV(P));
     DISPLAY AT(11,2):"HP:"&STR$(HP(P,2))&"/"&STR$(HP(P,1)); :: DISPLAY AT(11,19):"MP:"&STR$(MP(P,2))&"/"&STR$(MP(P,1));
     DISPLAY AT(14,2):"STATUS:"&STAT$(P) :: DISPLAY AT(14,19):"EXP:"&STR$(XP(P))
     DISPLAY AT(16,2):"ARMOR:"&ARM$(P) :: DISPLAY AT(18,2):"WEAPON:"&WEP$(P)
     DISPLAY AT(20,6):"NEXT LEVEL:"&STR$(NXLV);" EXP"
     MidStatus-Keyscan2:
          GOSUB Keyscan
          IF K=13 THEN GOTO StatusMenu ELSE GOTO MidStatus-Keyscan2
RETURN
 
     
     
//BELOW//     
//SaveGame2 needs to allow for a "select slot" feature and the "OPEN" statement to 
//reflect the choice of the user.  Playdata2 will change based on the user's selection}
          
          
          
SaveGame2:
 
     GOSUB ClearBox
     DISPLAY AT(10,4):"SAVE TO WHICH SLOT?":"          (1-3)"
     
KeySaveCheck:
     CALL KEY(0,K,S):: IF S=0 THEN GOTO KeySaveCheck:
     IF K<49 THEN GOTO KeySaveCheck ELSE IF K>51 THEN GOTO KeySaveCheck
     SLOT=K-48 :: CALL CLEAR :: DISPLAY AT(10,11):"SAVING..."; :: ON SLOT GOTO SAV1,SAV2,SAV3
 
SAV1:     
     OPEN #1:"DSK1.GSL1",VARIABLE :: GOTO FinSave
SAV2:
     OPEN #1:"DSK1.GSL2",VARIABLE :: GOTO FinSave
SAV3:
     OPEN #1:"DSK1.GSL3",VARIABLE :: GOTO FinSave 
     
FinSave:     
     FOR X=1 TO 4
     FOR Y=1 TO 2
     PRINT #1:HP(X,Y):MP(X,Y):NDIS(X,Y)
     NEXT Y
     NEXT X
     FOR X=1 TO 4
     PRINT #1:XP(X):LEV(X):CL$(X):ATK(X):DEFN(X):MATK(X):MDEF(X):ARM$(X):WEP$(X):STAT$(X):MN(X):CN$(X):STAT(X)
     NEXT X
     PRINT #1:GLD:HPO:MPO:ELI:SCR:QSTAT:MX:MY:PX:PY
     CLOSE #1
     GOSUB ClearBox
     DISPLAY AT(10,:"SAVE COMPLETE..."
     GOSUB ReturnString
     GOSUB Keyscan
     RETURN
     
          
        
ClearMenu:
 
     REM     CLEAR MENU INFO
     DISPLAY AT(1,1):" ":" ":" " :: DISPLAY AT(23,1):" ":" "
     
ClearBox:
     DISPLAY AT(7,1):" ":" ":" ":" ":" ":" ":" ":" ":" ":" ":" ":" ":" ":" "
     RETURN
     
     
 
 
          //ReturnString//
          
ReturnString:
 
     REM MENU RETURN GAME STRING
     DISPLAY AT(23,5):EX$;:: DISPLAY AT(24,5):EXU$;
     RETURN
     
     
     
     TopInfo: 
 
          //this displays all necessary information at the top of the screen during gameplay
 
 
     DISPLAY AT(1,9):"FORESTIA"
     DISPLAY AT(2,1):"BERYL":"HP:";HP(1,2):"MP:";MP(1,2) :: DISPLAY AT(2,9):"^^^^^^^^";
     DISPLAY AT(2,18):"REPTOSLICER" :: DISPLAY AT(3,18):"HP:";HP(2,2) :: DISPLAY AT(4,18):"MP:";MP(2,2)
     DISPLAY AT(6,1):"SKYLAR":"HP:";HP(4,2):"MP:";MP(4,2)
     DISPLAY AT(6,18):"MARKUS" :: DISPLAY AT(7,18):"HP:";HP(3,2) :: DISPLAY AT(8,18):"MP:";MP(3,2)
     RETURN
 
 
 
Keyscan:
 
     CALL KEY(0,K,S):: IF S=0 THEN Keyscan
     RETURN
     
     
Flash:
     CALL SCREEN(16):: FOR I=1 TO 20 :: NEXT I :: CALL SCREEN(2) :: RETURN
     
 
     
CallDrag:
     CALL CHAR(140,"72E9B5DCBE46BF7F7C7F3F007FFFC07F4020B8EF787FC0C000F8FC2EDEFC01FE")
     RETURN
CallKeeper:
     CALL CHAR(140,"0707081030705046304D93A1783E7F42E0E010080C0E0A620CB2C9851E7CFE42")
     RETURN
 
     
     
     
Delay:
     FOR I=1 TO 800 :: NEXT I :: RETURN
     
     
SpellTypes:
 
DATA 1) HEAL (10 MP)
DATA 2) CURE (15 MP)
DATA 3) LIFE (20 MP) 
 
 
 
 
          //SUB LDAT//
     REM       **SUB TO CALL THE ASSEMBLY ROUTINE TO LOAD MAP INTO MEMORY**
     SUB LDAT
     CALL INIT
     CALL LOAD("DSK1.NEWFORO")
     SUBEND
 
          //SUB SETMAP//
     REM       **SUB TO DRAW THE MAP ONSCREEN**
     SUB SETMAP(MX,MY)
     X=MX :: Y=MY
     IF ADR<>0 THEN MidSetmap-Check
     CALL PEEK(16382,P,Q)
     ADR=P*256+Q+2
     CALL LOAD(ADR+6,0,0)
     
MidSetmap-Check:
     
     Y=Y-1 :: MAP=Y*2+X
     IF MAP<1 OR MAP>12 THEN SUBEXIT
     CALL LOAD(ADR,0,MAP)
     CALL LINK("DRAW")
     SUBEND
     
     
    
    
     
     
     
     
     //GAME END//

 

[/spoiler]

Edited by Opry99er
  • Like 2
Link to comment
Share on other sites

On 9/12/2023 at 6:45 PM, Opry99er said:

Hmm... If there's any interest, I'll make a video stream showing all the progress (very little) I've made in the last 5 years on this project.  You can now save a game, load a game, go through the entire first world quest (without enemies, of course) and exit the first world--heading to the second.  I won't be disappointed if there's little-to-no interest.  :lol:  Vaporware is frustrating and dumb.  :) 

Color me as interested.🙂

  • Like 1
Link to comment
Share on other sites

As I remember, you worked with Matthew180 to develop an assembly scrolling routine that kept the screen map and the scrolling routines all in low memory. For what it's worth, things have changed with the compiler, and you can now use assembly subs, so that custom screen scrolling sub is now a possibility.

  • Like 2
Link to comment
Share on other sites

44 minutes ago, senior_falcon said:

As I remember, you worked with Matthew180 to develop an assembly scrolling routine that kept the screen map and the scrolling routines all in low memory. For what it's worth, things have changed with the compiler, and you can now use assembly subs, so that custom screen scrolling sub is now a possibility.

Wow!  That's so cool!  I have gotten so far behind, Harry.  :lol:

 

I will absolutely look into it!  It would be so cool to be able to pick this project back up with the compiler in mind.  

 

That said, I have another project that I want to use the compiler for.  A very special one that I want to get done in the next few months.  I have started pulling together my old code and I may have some questions for you... but first, I'll download the most up to date version of the programmer's package and RTFM.

 

Appreciate you, friend.  

  • Like 3
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...