I quote from your homepage: "You can even write to us and tell us how much we suck, we don't mind because the truth is what we're here for."
Are you saying that if I say you suck, I'm telling the truth!?
That's what it means.
Also from r.c. volgers
To improve your mag, do this...
- Add a table of contents to the top, and add internal hyperlinks.
- Write titles in another color
- Stop writing that "article #4" stuff above every article
We're going to do the first and second idea in the next issue, but we've done the third suggestion in this issue. Thanks for the advice!
Being a (of course :) huge fan of QB on Acid, I've read it (prolly more than once) and couldn't help but notice the rather plain logo (with all due respect). The real problem is that it's square, and is kinda a space wasting shape for a web page. Either way, I made you a new logo if you'd like to use it. It's *totally* okay of course if you dont like it/want it/want to use it, but just in case you wanted an idea for a new one, here it is. This didnt take long so it's no sweat off my back if you dont likee. :) Also, it takes the whole "acid" thing into account, and includes a somewhat Daily-Show-inspired slogan. Just tossing around ideas.
It comes with two files-- BigLogo.gif and SmaLogo.gif
The smaller of the two would be best for the page, the bigger is just basically a better, more detailed view. Do whatever you want with it.
Hope you like it!
We did, and so we used it! Thanks for the new logo LordQB!
From Big B of BX software
I just read the first article and liked it. Just go on and someday it might become big :-)
Some comment on the "gallery". You guys posted a pic of Kaldaran...the one with rain effect. Below it said: "This pic is unique, It is very rare to have games in QB with weather-effects, it's raining!". I agree... and it's very well done, but my game also used rain and lightning and day-night changes. :-) Anyway, I made a very early demo, download at http://stu<a%20href=/ and tell me what you think of it. Although Kaldaran's rain-effects are better, mine are good too!
Big B (BX software)
We attempted to download the file, with no success. If anyone out there has this file, please let us know. Thanks!
From Bill McDonald
Hey, ive just read your qbmag and its pretty good, but the main problem with it is the layout. everything looks the same and is unorganized and boring...
We're working on it, but thanks for the input.
hey, i was looking round the qb board and nek pointed out "qb on acid". After ages of seeing "coming the end of october" when it's fricking November, i looked at this. it's a really good mag, and although it could do with a bit of formatting (like QB:TM) I'll be checking back...it'll probably stop Razormag coming out :)
Believe it or not, QBOA was originally designed because of Razor's no-show, not to mention zkman's bailing on his mag. It's more than that now of course, and we'll keep getting bigger and bigger...mwuahah nothing can stop us now! err....look out for that freight train! =)
SUB ShowMap (MapX, MapY) MapSizeX=(127)*16 'Define these in some other SUB, these are here for notation MapSizeY=(127)*16 'This is for a 127 by 127 map (128x128 if you add in the 0) 'MapX and MapY are the exact pixel locations to update from. They center the image onto that 'pixel which is defined in MapX, MapY. So if you want to update at Map(1,1), MapX would be 16 'and MapY would be 16. ShowMapx = MapX - 160 'These 2 lines here center the camera. ShowMapy = MapY - 96 IF ShowMapx < 0 THEN ShowMapx = 0 'If the camera is off the map in the negative area, recenter IF ShowMapy < 0 THEN ShowMapy = 0 'it at 0,0 IF ShowMapx > (MapSizeX-160) then ShowMapX=(MapSizeX-160) 'if the camera is too far, clip it at 'the max point IF ShowMapy > (MapSizeY-96) then ShowMapY=(MapSizeY-96) PixelMapX = ShowMapx \ 16 'Does an integer divide converting the number to its t*t 'form PixelMapOffsetX = ShowMapx AND 15 'These lines here tell the routine where to start PixelMapy = ShowMapy \ 16 'plotting. PixelMapOffsetY = ShowMapy AND 15 PositionX = -PixelMapOffsetX PositionY = -PixelMapOffsetY IF PositionX < 0 THEN MaxX = 20 ELSE MaxX = 19 'If the sprites are clipped, we must put extra IF PositionY < 0 THEN MaxY = 13 ELSE MaxY = 12 'sprites in order to place the map without 'holes in the top/bottom/sides FOR LoopMapy = 0 TO MaxY FOR LoopMapx = 0 TO MaxX til=map(PixelMapX+LoopMapX,PixelMapY+LoopMapY) IF anim(til).frames > 1 THEN til = til + ((frames# \ anim(til).delay) MOD (anim(til).frames)) 'This above line here does tile animation for you. It infinitely loops (with a variable frame 'delay) any number of tiles you want. So, Tile 4 has a frame count of 4 with a delay of 3. 'Every 3rd frame, we show the next tile in the loop. When the animation gets to the last frame, 'it uses MOD to go back to the beginning. Tile animation done VERY quickly with only 1 line. putSprite PositionX, PositionY, Tiles(130*til), Solid 'This PutSprite routine must be a clipped put routine. Whether or not it is pure QB or not is 'up to you, but an ASM routine would work better. 130 is the amount of bytes for a 16*16 tile. 'This way you don't have to do 100 stupid Select Cases in your main loop which is VERY slow. PositionX = PositionX + 16 NEXT PositionX = -PixelMapOffsetX PositionY = PositionY + 16 NEXT LoopMapy frames#=frames#+1 'Add 1 to the amount of frames we have shown (useful in counting fps) 'and needed for the tile animation routine above. END SUB(end of code)
Since I am about to totally retire from the QB scene, 4 years of QB is about enough for me, I thought I should pass this knowledge on to the who ever wants to follow my footsteps. This is "secret" information that I've gathered through trial and error, disassembly and a little bit of common sense. But first allow me:
I assume you use MASM, the commercial version, not the free one, and you know your way around rarely used meta commands. And I assume that you have all basic info on parameter passing etc.
Some of these functions doesnt necessarily work in a .QLB, some may require linking while compiling. I assume you know how to do that.
Note: I have found this to work in quick libraries!
First, declare the global (DGROUP) segment that QB uses. This is common to use in all functions to use that retrieves this info. Without it the linker wouldnt know what you are talking about.
CODE SEGMENT WORD PUBLIC USE16 'CODE' CODE ENDS _BSS SEGMENT WORD PUBLIC USE16 'DATA' _BSS ENDS _DATA SEGMENT WORD PUBLIC USE16 'DATA' _DATA ENDS DGROUP GROUP _BSS EXTRN b$seg:WORD ; Tell linker we want to use this variable. PUBLIC MyRoutine ; Tell linker here is our routine CODE SEGMENT MyRoutine: mov ax, b$seg retf CODE ENDS END
Now declare in a basic file
DECLARE FUNCTION MyRoutine AS INTEGER DEF SEG = &HA000 a% = MyRoutine PRINT HEX$(a%)
a% should now be &HA000. It worked for me!
* Warning * This does not work in a Quick library!
[ same as above ] EXTRN b$ScreenMode:BYTE ; Current screen mode (0,..,13) EXTRN b$HorzRes:WORD ; Horizontal resolution (320,..,640) EXTRN b$VertRes:WORD ; Vertical resolution (200,..,480) EXTRN b$CharColor:BYTE ; Character color EXTRN b$BFColors:WORD ; Character colors e.x: ; AH = Background, AL = Foreground EXTRN b$ForeColor:BYTE ; Character foreground color EXTRN b$BackColor:BYTE ; Character background color
b$CharColor is a "special" case compared to the others above. The highnibble is the background color, the lownibble is foreground. The funny thing is, b$BackColor has the background color too, but no extra twiddling is necessary, and b$ForeColor has the foreground color. The use of b$CharColor is primarily assembly usage, as it requires shifting etc. To convert Foreground, Background colors to b$CharColor do this:
Or in assembly terms:
mov al, Background shl al, 4 xor al, Foreground
This article is copyrighted by Sten Daniel
You may not publish or copy this without my expressed written permission!
|This column is going to be different then any other that I've written,
I'm going to take this opportunity to state a few things that have been
ticking me off. A few weeks ago, I E-Mailed the person who runs "QBasic:
The Magazine", Zkman. I made a simple request which was to do a preview of
Kids of Karendow, his response, and I quote, "I dun think I'll be able to
do a preview of your game, as I usually only do that for projects that
qb:tm readers have a lot of interest in or that have had a demo already
out. I'll add ya to the Visionaries Exchange though." I responded to this
by asking, "Who decides what the QB:tm readers are interested in?" and
this is what he said, "Well, pretty much me, the ppl that email me with a
request for more info on somethin, and the other writers for the mag.
Mostly I only cover games in the Upcoming Games section except for "big"
games, y'know, like DA2." Take note that he said "Pretty much me" as in he
decides what the public is interested in.
I asked him if he had ever played Kids of Karendow and he responded by saying, "yeah, I did a while ago, it didn't look that bad. But, like I said before, I *rarely* do full previews, y'know? Like, I've turned down offers for full previews of games like Of Hell and Magic 2, Peanut Patrol 2, Sypharage, and a few other not-too-shabby themselves games. I'll include some info in upcoming games, though."
Now this message had some redeeming qualities, however, he himself said he only reviews "big" name games. The question I have for him is why? Why not give the "little guys" a fair chance too? Does he think that the "big" games are the only ones the reader's are interested in? I doubt that, I believe it's more what he's interested in then anything else. Whatever makes his little magazine more popular, in his own opinion, is what is be put in it. Notice that the tutorials, in his magazine, are only put in by those who have a big name in the QB community, the perfect example is the tutorials that DarkDread wrote for his magazine. I have nothing against DarkDread, infact he is an idol of mine. Never the less, DarkDread is a big name in the QB community and I believe this proves my point.
'Mostly I only cover games in the Upcoming Games section except for "big" games, y'know, like DA2...I've turned down offers for full previews of games like Of Hell and Magic 2, Peanut Patrol 2, Sypharage, and a few other not-too-shabby themselves games.'Zkman
I'd like your thoughts, you can e-mail me at firstname.lastname@example.org or you can even send me a message in ICQ my # is 44492217. Thanks for reading.
By Big Nose of Phat Kids
Many people have wondered how to link other languages into Quickbasic. Some think it is not possible but to my knowledge C, Fortran, and of course ASM of been succesfully intergrated with QB code. To do this you need to compile this code into a library.
To demonstrate how we are going to make a mini library that does two things:
1. Sets the Screen Mode to Mode 0013h (Screen 13)
2. Sets the Screen Mode back to 003h (Screen 0)
Here is the ASM source code to this library:
.MODEL LARGE, BASIC .386 .DATA .CODE PUBLIC InitVGA InitVGA PROC MOV AX, 0013h ; Put 0013h into AX INT 10h ; Call Interrupt 10 InitVGA ENDP PUBLIC InitText InitText PROC MOV AX, 0003h ; Put 0003h into AX INT 10h ; Call Interrupt 10 InitText ENDP END
I am not going in depth on how exactly the above code works but I may in my next article. So assuming you cut that code out and compiled it using MASM or TASM into .obj code we can go on.
Now that we have our object code we need to convert it into a library. So we run our handy Lib utility that comes with Quickbasic 4.5 .
C:\qb45>lib Microsoft (R) Library Manager Version 3.14 Copyright (C) Microsoft Corp 1983-1988. All rights reserved. Library name:Mylib Library does not exist. Create? (y/n) y Operations:Lib.obj List file:nul
And then we need to link it into a QuickLibrary so we can use it from QB's IDE.
C:\qb45>link /q /st:300 Mylib.lib Microsoft (R) Overlay Linker Versio Copyright (C) Microsoft Corp 1983-19 Run File [MYLIB.QLB]: List File [NUL.MAP]: Libraries [.LIB]: bqlb45.lib qb.lib
And there we have it. A working Quickbasic library. But we have one final set to do before we can use the library.
Open up QB with your library loaded (QB /L Mylib) and type these lines in:
Declare Sub InitVGA () Declare Sub InitText ()
Save the file as Mylib.bi and create a new file. In this file type:
'$Dynamic '$include: 'mylib.bi'
and voila! You can now use the functions in your library. Note that you do not have to put your declarations in the bi file if your library is small like this one but I recommend doing it this way to keep your code easily readable.
How many games have you downloaded in the last two or so years, written in QB, that do not feature background music? For me, it's about 85%. And I download a lot of games made in QB, since I believe that just because it's QB doesn't give you an excuse to slack off on game development. Apparently these clowns believe it does give them an excuse to slack off, and therefore they do. Is it laziness? Lack of resources? Predetermined views of limitation? Or are they just not educated? It can be one or all of the four.
Many moons ago, there was a game called "TheGame". Quite simple. It was an RPG, filled with nice graphics. No real game to it, but it looked nice. A little slow, but it looked nice. However, it only looked nice...it had no music and nothing but nice graphics. I had it on my harddrive maybe twenty minutes. Now, around the same time, a game known as Blackness appeared. It had nice graphics. No real game to it, it was just as new as "TheGame" was. However, it had excellent music. I still own this game.
Let's look at why music is needed in a game. And feel free to disagree to your heart's content, since ignorance is truly bliss, but the truth speaks louder than the music that pumps out of the world's best games.
|Music speaks directly to the soul.
Nothing is more powerful than a good piece of music. No matter how limited the technology. Watch a movie, for example. When a scene has a particularly emotional part, whether it be intensity, anger, sadness, or despair, listen closely...the music you hear is designed to instill the emotion you feel. Try turning the volume off. Does the feeling go away? Does it become less powerful? Of course it does. Why? Because suddenly, your emotions are not receiving extra manipulation. The same goes for video games. Take Doom for example, one of my personal favourite games. Without the music, it just seems ordinary. Add the music, and the intensity rises. A fast piece will often give the sense of urgency or importance. A slow piece will often give a feeling of suspense or sadness. Those soundtracks are developed to do that.
|Music is the most rememberable part of a game.|
How many people remember the music for the first level of Super Mario Bros.? How about the boss soundtrack from Sonic The Hedgehog? Or even the title music for Druid II on the old Commodore 64? Those who have played these games remember these songs well...even if they've forgotten the games themselves. This is a direct result of the music having such a strong influence on the whole product. Even if the technology is not up-to-par, we can still remember the artistic "beeps" that poured out of the old NES for example.
Good sound effects also help.
This is also a major factor, although not quite as high on the scale, it's still important. If you've played Doom, you know that when you heard the bad guys' growl, you instantly looked around, and if you saw him, you'd cut him down in a hail of bullets. That's power. Whereas music has the power to set the mood, proper sound effects can take control of your actions and bend them to their own will. Had those sounds not been in the game, you might not have seen the monsters. They might have walked right past you, or snuck up behind you and handed your rearend to you. However, since the sounds were there, it made you more reactive, and therefore more "controlled by the sound".
QB can do these things.
I never want to hear how QB is too limited to achieve such glorious results. There are several good products out there to enhance QB's sound capabilities. My personal favourite choice is Bells Whistles and Sound Boards, also known as BWSB. BWSB is a music library that plays MOD derivatives, and can handle sound effects as well. We use it in every production, since it is quite a superior product. There is also QMidi, a nice SBMIDI API package, which allows you to make use of MIDI files. HSC is an FM-based system, its sound quality is not as good as that of BWSB or a hadrware-driven QMidi setup, but is better than no sound at all. Ruckus is a good alternative to the overhead of BWSB. Even DirectQB and Future.Library come with built-in sound routines that can serve as an excellent basis for writing a music and sound effects system. Plus, with all the resources available on the internet about sound, there is simply no excuse for the silence anymore.
In conclusion, it should be noted that this is one of the many areas that QB has always been considered "limited". However, I'm not about accepting limits...I'm about smashing limits, and me and many like me have been doing so successfully for many years now. It's time for the rest of them to step forward and do the same.
*ahem* Welcome to Issue 2 of the ZSVGA Article. Last issue, I explained how to get the ZSVGA Lib into your QB program and how to use basic graphical functions. This issue I'll explain how to use page flipping and other functions of ZSVGA.
It can draw strings on the screen using one simple function, DrwString. The syntax of the function works like this:
DrwString (MODE%, FCOLOR%, BCOLOR%, STRING$, X%, Y%)
Here is an example how to use this command using an ol' classic string:
NULL = WHICHVGA NULL = Res640 DrwString 1, 31, 0, "HELLO WORLD!", 0, 0) DrwString 1, 31, 0, "Press any key to end...", 0, 12) WHILE INKEY$ = "": WEND NULL = ResText
Yes, you guessed it. ZSVGA has mouse functions. The first function that I will explain is WHICHMOUSE. The function will return 0 if no Microsoft compatible mouse is available. Otherwise, it will return the number of buttons on your mouse. This function must be called before using any of the other mouse functions. Here is an example of how the function should be used:
IF WHICHMOUSE = 0 THEN PRINT "No mouse available. Aborting...": END
Now, two more functions are required to get the mouse onto the screen and working. First we must set the desired screen mode. Then call MOUSEENTER and MOUSESHOW. It is required that you run MOUSEENTER as it starts up all the mouse functions. For example:
NULL = RES640 MOUSEENTER MOUSESHOW
That should get the mouse up onto the screen. Now, you can get the current status of the mouse using one function. It is called MOUSESTATUS. The syntax goes like this:
MOUSESTATUS (X%, Y%, MOUSEBUTS%)
Here is an example on how to use the function:
DO MouseStaus X%, Y%, MOUSEBUTS% DrwString 1, 31, 0, "X:" + STR$(X%) + "Y:" + STR$(Y%) + "Mouse Buttons:" + STR%(MOUSEBUTS%), 0, 0 LOOP
CLEARING THE SCREEN
To clear the screen use the function FILLPAGE. The syntax is like this:
What is page flipping? Well, it's basically an alternative to using graphic buffering. Don't know what the heck I'm talking about? Well, if you tried to create an animation by putting a frame, clearing the screen, putting the next frame, and so on. This would be very flickerly even with vertical synch. The solution is to use page flipping or double buffering. However, in SVGA, double buffering can be slow and suck up lotsa a memory. Two bad things at once, not good! Anyway, page flipping mainly works like this:
- Set Active Page 0 - Clear the page, if needed - Put the graphics - Display Page 0 - Set Active Page 1 - Clear the page, if needed - Put the graphics - Display Page 1 - And repeat...
Now...There are two functions for using page flipping. They are: PAGEACTIVE AND PAGEDISPLAY. Here is the syntax of both:
PAGEACTIVE (PageNum%) PAGEDISPLAY (X%, Y%, PageNum%)
Now, PageNum% is obviously the page in the video memory you want. X% and Y% are the coordinate to place at top, left of the display, not really something to worry about just use 0 for both. Now, Here is an example on how to use page flipping, a star field to be exact. =]
DEFINT A-Z 'Default types are integers '$INCLUDE: 'SVGABC.BI' TYPE StarType 'Define our Star type X AS INTEGER 'X location of star Y AS INTEGER 'Y location of star Speed AS INTEGER 'Speed of star scrolling, for paralax scroll Colour AS INTEGER 'Color of the star END TYPE DIM Star(1 TO 250) AS StarType 'Define the memory for 250 stars IF WHICHVGA = 0 THEN PRINT "SVGA card not detected!": END IF RES640 = 0 THEN PRINT "640x480x256 mode is not available!": END RANDOMIZE TIMER 'Seed the random number generator FOR i = 1 TO 250 'Generate our stars Star(i).x = INT(RND * 639) + 1 Star(i).y = INT(RND * 478) + 1 Star(i).Speed = INT(RND * 4) + 1 Star(i).Colour = INT(30 - 26)*RND + 26) NEXT i DO 'Begin our loop NULL = PAGEACTIVE(PageFlip) 'Set our active page FillPage 0 'Clear the page FOR i = 1 TO 250 'Put and check all stars Star(i).Y = Star(i).Y + Star(i).Speed DrwPoint 1, Star(i).Colour, Star(i).X, Star(i).Y IF Star(i).Y > 639 THEN 'If star goes off screen, create a new one! Star(i).Y = 0 Star(i).x = INT(RND * 639) + 1 Star(i).Speed = INT(RND * 4) + 1 Star(i).Colour = INT(30 - 26)*RND + 26) END IF NEXT i NULL = PAGEDISPLAY(0, 0, PageFlip) 'Display our page PageFlip = PageFlip + 1 'Change the current page IF PageFlip > 1 THEN PageFlip = 0 LOOP 'End our loop
That's it for this ZSVGA Article. Next issue, I'll explain even more graphic functions and get into XMS memory. CYA! =]
Here's some ways to annoy me:
You can usually find me on IRC in #quickbasic, on Efnet. I use the nick DigitlDud.
By Digital Dude
The graphical content is very nice. From the nicely drawn castle walls to the detailed trees, this is good stuff. It doesn't touch the artwork in Syraphage, but one can tell that it was probably inspired by that game. The character sprite is very cool and well-drawn, and if you don't move him for awhile, he gets mad and throws his arms up and down. Saw it once and laughed out of my chair. Pretty nice textboxes too.
The music is very good. Although the current alpha contains only two pieces of music so far, it is good music and fits the game well. Some of it suffers from clicking, but this will probably be fixed for the real thing. All in all, so far a nice soundtrack.
This doesn't have T*P scrolling as many RPGs have, it moves pixel by pixel in a free fashion. This is extremely rare, and very welcomed to a kind of game like this. It would do well with 8-way movement, and maybe he'll implement it, but even if he doesn't, the movement system shows promise.
This is probably on purpose...I assume it's meant to introduce battles at a later time, but as you're walking around in certain areas, the screen becomes flooded with coloured lines...then disappears! It reappears shortly afterwards, but boy is it annoying...
|All in all, this is the start of what could become an impressive RPG. Right now it doesn't really have much to it; he did add a lot of areas to explore, but that doesn't make a full game. Although being told you cannot open a treasure chest because "That treasure belongs to someone!" is bloody hilarious =)|
Game by Digital Paradox Software
Review by Nekrophidius
Would you like your game reviewed here? Just email us!
He was speaking of the nature of the graphical demo with which he would have used in the coding war against Robert Lee. Although that's not what it sounded like to us!
TONS of example code in all languages, a great source of information.
Follow the latest news on the QBRPG scene. Almost 100 RPGs available for download, all done in QB.
THE ALL BASIC CODE
If it's BASIC, they got it. Thousands of downloads for all kinds of BASIC.
Thanks for reading, and prepare for the next issue, out December 8th!