QB    ON   ACID   
                               [smalogo.gif]
                                      
                               November 1999
                                      
        Welcome one and all to the first issue of QB ON ACID. Thank
      The_Specialist for our deprav...er, unique name. We are putting
    EVERYTHING on this page for this month, so enjoy the download time.
   Actually, there's not many images here so...err, I'll stop rambling on
                                    now!
     _________________________________________________________________
                                      
                               FIRST ARTICLE:
                                      
                              OBJECT SYSTEMS!
                                      
    If you are new to RPG's this article is not about how to make a tile
     engine so close this damned browser right now. Yeah, you heard me,
             this isn't for new people, so close this now. Yup.
                                      
   The hardest thing that RPG makers face nowadays is the object system.
    The object system is everything from a soda can to the guy who sells
     magazines behind the counter in the dirty book store (yeah, we all
   know you put one in your game, don't be shy ;)). Anyways, I see awful
    examples of such an object system every day of my life. I see NPC's
     that just sit there...and don't do anything. I see NPC's that are
    incapable of nothing more than a random movement and message. I see
    objects that are limited to their original script. I see many things
   that are horrible and should be eliminated from each and every engine
                              on this planet.
                                      
       The first thing that a person should do if they want to make a
   complete RPG is make a complete and totally functional object system.
      A functional and complete object system will allow NPC's to walk
   through doors, activate scripts, be controlled, hold items, talk, and
   drop items. Instead of having one character and other "npcs" which are
      controlled through some other routine, we should put all of the
   objects and the character on the same exact level. Here's an example.
                                      
   (Psuedo code, do not copy into your program or it will screw up )
   
SUB UpdateNPCS

FOR uNF=1 to ActiveNPCS

SELECT CASE uNF
CASE CurrentlyControlledCharacter

        MoveNPC uNF, Keyboardismovinghorizontal, Keyboardismovingvertical
CASE ELSE
        SELECT CASE ObjectData(uNF)
                CASE RandomlyMoves
                        MoveNPC uNF, RandomPlaceX, RandomPlaceY
                CASE IsMovingToAPoint
                        MoveNPC uNF, ObjectPointToMoveTo(uNf,0), ObjectPointToM
oveTo(uNF,1)
                CASE IsStandingStill
                        AnimateNPC uNF
        END SELECT

END SELECT

NEXT

END SUB


SUB MoveNPC Number,MoveToX,MoveToY

Test=Map(MoveToX,MoveToY)

select CASE TEST

        case Walkable
                ObjectLocation(Number,0)=MoveToX:ObjectLocation(number,1)=MoveT
oY
        case IsAScriptTile
                ActivateScript
        
END SELECT

END SUB

   (End of psuedo code)
   
      With this example (you REALLY need to change it to suit your own
     coding style) you can EASILY make moving npcs and npcs that can do
      everything from activate scripts to whatever. And, to control a
       different object, just change the CurrentlyControlledCharacter
   variable. This allows a person to update over 200 npcs in a VERY short
   time, causing a very professional look to your object system. Also, in
   the SELECT CASE ObjectData(unf) you can make it so that objectdata(5)
   (NPC #5) is a value of 3. Let's say that an NPC with the attribute of
   3 goes after the player and tries to attack him. All you have to do is
    add in code under there and it's nice, neat, and organized and will
     work very quickly without sacrificing code speed. Now you can have
     differently behaving NPCs in your engine, which will impress your
                                players =].
                                      
    Not so hard, eh? I bet you didn't think that a totally efficient and
   active object system would be so short. Now that you have this out of
     the way, you can add things like an items list for each NPC (watch
    your RAM usage!!). Then, you could possibly trade and sell items to
                                 every NPC.
                                      
                                By QbProgger
                                      
                                Back 2 Top 
     _________________________________________________________________
                                      
                              SECOND ARTICLE:
                                      
                                USING ZSVGA
                                      
                                INTRODUCTION
                                      
     Zephyr's SVGA Lib is a full-featured lib for QuickBasic with great
    SVGA functions. Though it has good capabilities, it isn't well used
   much by QB programmers. Sure it's slow and buggy at times, however the
   lib has potential. Through a series of articles I'll be explaining how
   to use various functions of ZSVGA. In this first article, I'll explain
    how to install and use the basic functions of this lib. You can pick
                              up this lib at:
                                      
            http://neozones.quickbasic.com/basfiles/svgaqb25.zip
                                      
                       GETTING ZSVGA IN YOUR PROGRAMS
                                      
   First off, the ZSVGA lib doesn't come in a Quick Library form, so you
    have to compile in manually. To compile to a QLB file simply enter:
                                      
LINK /QU SVGAQB.LIB, SVGAQB.QLB, NUL, BQLB45.LIB

       Then, to start the QB IDE using the library, type QB /L SVGAQB
                                      
    To use ZSVGA in your programs you must use a specific header. At the
                      top of all ZSVGA programs enter:
                                      
DEFINT A-Z
'$INCLUDE: 'SVGABC.BI'

    There ya go, your now ready to use ZSVGA functions in your programs.
                                      
                           START USING SVGA MODES
                                      
       ZSVGA requires a 386+ CPU, so you may want to use the WHICHCPU
    function to check for a 386 or higher. I'm not going to bother going
   into that since I doubt you'd try to run your prog on less than a 386.
   =] Now, before you can use any SVGA functions you must first call the
     WHICHVGA function. This will detect and ready your video card. For
                                  example:
                                      
IF WHICHVGA THEN
 PRINT "SVGA Video Card Detected!"
ELSE
 PRINT "SVGA Video Card Not Detected!": END
END IF

                Now let's get into hi res modes! Yippee! =]
                                      
    For most of these articles I will be using 640x480 modes, you should
   have at least 1 meg of video ram which can be checked via WHICHMEM. To
                       enter a video mode simply use:
                                      
IF Res640 = 0 THEN PRINT "Could not enter 640x480 mode!": END

                               PUTTING PIXELS
                                      
     Now you should be in 640x480 256 colors mode! Yay! Now let's begin
             taking advantage of this mode by plotting pixels.
                                      
    To plot a single pixel you can simply use the DrwPoint function. The
                           syntax goes like this:
                                      
DrwPoint (Mode%, Color%, X%, Y%)

                               Simple, eh? =]
                                      
    You may wonder what Mode% is. Well, it's nothing but the pixel write
    mode. You don't really have to worry about it at this point (Pardon
     the pun), just set it to 1 for now. =] In case your interested the
                      pixel write modes go like this:
                                      
1 = SET
2 = XOR
3 = OR
4 = AND

           Now, let's plot da pixels! Here is some example code:
                                      
RANDOMIZE TIMER 'Seed the random number generator
FOR i = 1 TO 250 'Begin our FOR loop
x = INT(RND * 639) + 1 'Randomize the x axis position
y = INT(RND * 479) + 1 'Randomize the y axis position
c = INT(RND * 255) + 1 'Randomize the pixel color
DrwPoint 1, c, x, y 'Plot the pixel!
NEXT i 'End our loop

                               PUTTING LINES
                                      
     That should plot some wonderful pixels on the screen. Yummy =] Now
     let's elevate the next level, into...LINES! To plot lines onto the
    video page simply use the DrwLine function (Duh =p). Its syntax goes
                                 like this:
                                      
DrwLine (Mode%, Color%, X1%, Y1%, X2%, Y2%)

    Like, the point function this is pretty much self-explanatory. Like
      the DrwPoint function, set Mode% to 1 for now. Here's some more
                               example code:
                                      
RANDOMIZE TIMER 'Seed the random number generator
FOR i = 1 TO 100 'Begin our FOR loop
x1 = INT(RND * 639) + 1 '\
y1 = INT(RND * 479) + 1 '|Randomize all the points!
x2 = INT(RND * 639) + 1 '|
y2 = INT(RND * 479) + 1 '/
c = INT(RND * 255) + 1 'Randomize the color
DrwLine 1, c, x1, y1, x2, y2
NEXT i 'End our loop

                                  CLOSING
                                      
    When you're finished with SVGA be sure to use ResText before ending
                          your program. Like this:
                                      
Null = ResText

        That's it for this article of ZSVGA. It's short, due to time
    constraints, but the next one should be bigger. In the next article
   I'll explain more graphic functions including using page flipping for
   smooth animation. Until then, be sure to explore SVGABC25.TXT to learn
                   about other functions. Signing off...
                                      
                               CONTACTING ME
                                      
                       Here's some ways to annoy me:
                                      
   ICQ: 18050607
   Email: DigitalDude@BizzareCreations.com
   IM: BBTMG512
   You can usually find me on IRC in #quickbasic, on Efnet. I use the
   nick DigitlDud.
   
                              By Digital Dude
                                      
                                Back 2 Top 
     _________________________________________________________________
                                      
                               THIRD ARTICLE:
                                      
                           THE GREAT LIBRARY WAR
                                      
   Okay people, this has got to be the most hilarious argument since the
     argument about how good DarkAges I was. The question should not be
     about if libraries are good or not, it should be about how does a
                        library help the programmer.
                                      
    You will hear time and time again how libraries encourage laziness,
    they're not "real" programming because you're using somebody else's
    code, so on and so forth. From the other side of the argument comes
     the people who claim that the use of libraries have made them much
       better programmers. Let's look at both sides of the argument.
                                      
   Let's be honest: if you use a library, that is code you didn't write.
   Accept it. However, you also did not write the code behind SCREEN 13,
    PRINT, and the legions of other QB commands that exist. There are a
   ton of arguments from there..."Libraries are not true QB code because
     they didn't come with QB", "You gotta write yer own code!", and my
      personal favorite "Libraries in QB are written by amateurs, real
     programmers use pro libs". Don't make me laugh people. These same
    people will write a Windows-based program, or a DOS program in C++.
   How many libraries do each of these require? Have any of these people
      actually looked into what really goes into a Windows program for
   example? How many DLLs and components from things like DirectX go into
      these applications? "But, those are professional libraries!" Who
    cares, it's CODE YOU DIDN'T WRITE! I don't care if they were written
     by Bill Gates himself, it is still code you didn't write...yet not
     only do you use it, but you shun QB coders who use libraries like
       Dash. Does the word "hypocrisy" ring a bell at this point? QB
   libraries have, without a fraction of a doubt, raised the standards of
       QB programs over the last two years, and this will continue to
                                  persist.
                                      
     Now...on the other hand, we have legions upon legions of "newbies"
    entering the QB world, each with no experience and no common sense.
   They see a library advertised on a webboard or website and think "Wow!
    All my troubles are already fixed!!". These kids don't even know how
     to use PRINT yet, and they can rattle off every known function in
    DirectQB for example. These people anger me more than the hypocrites
   who oppose libraries. I get so many emails and ICQ messages from these
   people, begging for help because they can't figure out why the newest
     library function doesn't work, when all it usually is is that they
   forgot a simple little thing they needed to do in QB code to solve it.
     For example, it usually helps to set the screen mode before using
   GSsprite. This is a concept these people don't understand. They figure
   "Hey! The library is supposed to do that kind of work for me!! I don't
   understand!". Hence the reason libraries are dangerous to the newbie.
    They have not yet grasped the functionality of the language and yet
     they try to wield such power. And in almost every case, this will
       backfire on them, driving home even further the arguments that
                             libraries are bad.
                                      
    The key point to this is this: Libraries are a powerful tool that in
    the right hands, can have great use, but in the wrong hands, can be
    painfully destructive. These arguments will persist, and there will
    never be a victor. Period. So, whichever side you're on, you're just
                   going to have to deal with that truth.
                                      
                              By Nekrophidius
                                      
                                Back 2 Top 
     _________________________________________________________________
                                      
                                GAME REVIEW:
                                      
                                HACKMAN III
                                      
                          Hack-Man III Screenshot
    Do you miss the old Pac-Man games? Do you wish there would be a sort
   of a "resurrection"? Well, look no further, here he is! Hack-Man is a
    very unique series of Pac-Man spinoffs, with 3 being the most recent
      (and best). Here's a rundown on all it has to offer the player:
                                      
   -Interesting graphics
   -Challenging gameplay
   -Good sounds
   -High replay value
   
                            What is it missing?
                                      
   -Background music
   -Better character control
   -More useful options (like, turning off the sound!)
   
    Hack-Man 3 overall is a very good game, from a player's perspective.
   From a programmer's perspective, there is room for improvement, mainly
      in the speed department. I have seen a review of this game on a
     website, and all throughout the review the guy made references to
   Wetspot II, why I don't have any idea, but he obviously had a certain
                   person stuck waaay too far up his @$$.
                                      
    The skinny: Download this game if you enjoy a "rebirth" of sorts, or
    are looking for something to kill some time with. It is fun to play,
           and that's what we play games for in the first place.
                                      
         You can pick up the Hack-Man series at WidomDude's Domain
                                      
                           Review by Nekrophidius
                                      
                                Back 2 Top 
     _________________________________________________________________
                                      
                                THE GALLERY:
                                      
                                  KALDERAN
                                      
   Submitted by DigitalDude. This is a picture of the inside of a castle
    it appears. For those who don't know, Kalderan is an SVGA RPG being
   written by a team of members known collectively as Bizzare Creations.
                            Kalderan screenshot
                                      
        This pic is unique, It is very rare to have games in QB with
                       weather-effects, it's raining!
                           Kalderan screenshot 2
                                      
                                Back 2 Top 
     _________________________________________________________________
                                      
                            QUOTE OF THE MONTH:
                                      
                                    TEJ
                                      
         Said on EfNet channel #quickbasic on November 10th, 1999:
   "Look, I am not, under any circumstance, goin to write my own rotation
                                    sub"
                                      
   Basically what this person is saying is that they would rather rely on
   the work of others, rather than their own. They would do well working
                               for Microsoft.
                                      
                                Back 2 Top 
     _________________________________________________________________
                                      
                   SHORTEST REVIEW IN THE HISTORY OF QB:
                                      
                         XLATB'S REVIEW OF CODEVIEW
                                      
                                And I quote:
                                      
                             it_sucks_my_wang!
                                      
                                Back 2 Top 
     _________________________________________________________________
                                      
                            RECOMMENDED VIEWING:
                                      
                             RECOMMENDED SITES
                                      
                                 WOTSIT.ORG
                           File formats and more.
                                      
                            PROGRAMMER'S HEAVEN
   TONS of example code in all languages, a great source of information.
                                      
                              QUICKBASIC RPGS
    Follow the latest news on the QBRPG scene. Almost 100 RPGs available
                       for download, all done in QB.
                                      
                        THE ALL BASIC CODE ARCHIVES
    If it's BASIC, they got it. Thousands of downloads for all kinds of
                                   BASIC.
                                      
                                Back 2 Top 
     _________________________________________________________________
                                      
                             NEAT CODE EXAMPLE:
                                      
                               PASCO'S GRASS
                                      
    This is an interesting animated grass routine written in about 1K of
                               pure QB code.
                                      
DEFINT A-Z
TYPE grasspoint
   x AS INTEGER
   y AS INTEGER
   angle AS INTEGER
END TYPE

RANDOMIZE TIMER

ngrass = 1000

DIM SHARED grass(ngrass) AS grasspoint
DIM SHARED presin(360) AS INTEGER

FOR lp = 0 TO ngrass
   grass(lp).x = RND * 320
   grass(lp).y = RND * 200
   grass(lp).angle = (grass(lp).x MOD 360) + RND * 30 - ((200 - grass(lp).y) ^
.5) * 10
NEXT

FOR lp = 0 TO 360
   presin(lp) = SIN(lp * 3.14159 / 180) * 128
NEXT

SCREEN 7
PALETTE 0, 4
OUT &H3C8, 4
OUT &H3C9, 0
OUT &H3C9, 23
OUT &H3C9, 0

PALETTE 1, 1
OUT &H3C8, 1
OUT &H3C9, 0
OUT &H3C9, 16
OUT &H3C9, 0

DO

SCREEN 7, , d, (d + 2) MOD 4
CLS
d = (d + 1) MOD 4

FOR lp = 0 TO ngrass
   grass(lp).angle = (grass(lp).angle + 350) MOD 360
   LINE (grass(lp).x, grass(lp).y)-(grass(lp).x + ABS(presin(grass(lp).angle))
\ 60 + 1, grass(lp).y + 1 + ABS(presin(grass(lp).angle)) \ 60), 1
NEXT
FOR lp = 0 TO ngrass
   LINE (grass(lp).x, grass(lp).y)-(grass(lp).x + ABS(presin(grass(lp).angle))
\ 60, grass(lp).y - 2 + ABS(presin(grass(lp).angle)) \ 100), 2
NEXT

LOOP UNTIL INKEY$ <> ""

                                  By Pasco
                                      
                                Back 2 Top 
     _________________________________________________________________
                                      
                                  THE END
                                      
   So, there ya have it folks...the very first issue of QB ON ACID comes
    to a close. Feel free to send us email with your thoughts, comments,
   questions, suggestions, viruses, you name it. We print what we receive
              so feel free to give us a piece of your mind =)
                                      
   Thanks for reading, and prepare for the next issue, out November 24th!
                                      
                               Send us Email