# QB Express

### Issue #22 ~ June 7, 2007

"A magazine by the QB community, for the QB community!"

### In This Issue

Contributors

- Pete Berg (Editor)
- Imortis Inglorian (Co-Editor)
- MystikShadows
- Paul Holmlund (kiyotewolf)
- Lachie Dazdarian
- Jonathan Wallace
- Rattrapmax6
- Eclipzer
- Nathan Kessler (Nathan1993)
- Deleter
- Z!re
- Scolizer
- tunginobi
- RedCrab

- Regular Columns
  - From The Editor's Desk
  - Letters
  - Express Poll
  - News Briefs
  - Comics - QB Horse Humor, 0 1, Stickblob, Qmunity
  - Final Word
- Articles & Editorials
  - Review of Lynn's Legacy developed by Josiah Tobin and cha0s, 2006 - Lachie Dazdarian
  - Kill the Killing? - Deleter
  - A serious article debating the pros and cons of FreeBASIC - Z!re
  - Random Musings - Scolizer
  - Searching For The Unknown
    Tunnel Striker ver.1.5 by INT Software, 1998 - Lachie Dazdarian
  - Join The Good Fight: The Anti-”Holy War” Movement - Imortis Inglorian
- Tutorials
  - How To Use EMS In The QBasic Enviroment Without Bugs - Paul Holmlund (kiyotewolf)
  - Chain-like Animation Tutorial - Lachie Dazdarian
  - Simple Ciphering for Securing Systems: Part I - Imortis Inglorian
  - NES Style Graphics and SCREEN 13 - Paul Holmlund (kiyotewolf)
  - Using The Screen 13 Palette - Paul Holmlund (kiyotewolf)
  - Writing Perfect Code - Jonathan Wallace
  - FB & OpenGL Part #1: Using OpenGL in FreeBasic and Drawing Stuff 3D style. - Rattrapmax6
  - Sub Pixel Rendering - Eclipzer
  - FreeBASIC and Scite in Ubuntu - Nathan Kessler (Nathan1993)

## From The Editor's Desk

### Written by Pete

QB Express is...alive?

Yes, we're back! It's been nearly a year since the last issue, and I'm sure most of you expected that QB Express was done for. I don't blame you. Heck, I thought QB Express might be done for.

But if there's one thing I can't stand, it's letting a good thing die. That has happened far too much in the QB community. And QB Express is too good a thing for me to let it die like that.

I've been sitting on this issue since last August, and I had planned for it to come out by the end of September at the latest. Then, all of a sudden, the busiest year of my life started up -- I moved across the country, started my senior year of college, began producing four different TV shows, got a girlfriend, got involved with a ton of clubs, trips, jobs...and Pete's QB Site fell by the wayside. (When you're already working 18 hour days and pulling three all-nighters a week, it's tough to spend your free time on anything beyond eating and sleeping.)

It wasn't until a few months ago, when I was approached by Imortis Inglorian (aka Luther Ramsey) that I began thinking about QB Express again. He offered to take the job of editor off my hands and compile this issue from all the miscellanous submissions I had received. I provided him with the template, and he single-handedly compiled and formatted this entire issue -- and started working on a plan to continue the magazine in my absense. This issue might have never come into being without Imortis' help.

Now Imortis, along with the help of MystikShadows, will be helping me to return QB Express to its former glory. We're going to try to restore QB Express to its former once-a-month publication schedule and help breathe some much-needed life into this ailing Qmunity.

This issue is a transition between the old QB Express and the new QB Express. We're working to come up with a new system for QB Express to get made every month where the workload doesn't fall on one or two people, but instead the magazine is managed by a staff. It's the divide-and-conquer approach. We're looking for regular writers, reporters, editors and columnists who we can count on to write and edit QB Express by our deadline every month. If you're interested in helping out, you should email us at QBExpress@gmail.com and we'll talk.

Next month, a new era of QB Express will begin. And we hope you will be part of it.

### Submit To QB Express

This magazine can't exist without people SUBMITTING articles, editorials, tutorials, reviews, news and feedback. This is not just a solo effort by me... it's a group effort by people throughout the QB community. If you have anything to submit, or have time to write something, DO IT!

If you want to write about something, but can't think of a topic, or need inspiration, check out the "Official QB Express Article Requests" thread! There have been quite a few articles requested -- and even if none of them strikes your fancy, we can help you come up with something that you would like to write about. If you're interested in getting your own monthly column or just want to write an article or two, by all means, do it! Anything that is submitted will be included!

I also want feedback and letters to the editor regarding this magazine. I want suggestions and critiques. What do you like? What don't you like? What could be done better? Let me know!

All submissions and feedback can be sent to qbexpress@gmail.com. You can also PM me on the Pete's QB Site or QBasic News message forums. If QB Express is going to continue to be so good, YOU need to contribute!

-Pete And Imortis Inglorian

## Letters

> These letters all date back to July, August and September 2006, following QB Express #21. As you can tell, many of them are very outdated. Usually I would take the take the time to write responses to every letter, but I feel like at this point it's a little late to write back. Still worth a look, though!

> -Pete

### Letter From Lachie Dazdarian

It's me again with a letter for QB Express. Since the next date I'm online (that's the 14th of September and the day I'm emailing this) is the day when I'm accepting a topic for my diploma thesis, I decided to whip up another letter as I probably won't have an opportunity to write something that takes more than 20 minutes in the next month and a half. As I see issue #22 is still not out today so you will hopefully include this letter in it. That is if you have time. I've sent you so many things after the summer.

Recently I discovered I didn't send you a letter I wrote months ago(before issue #21) so I'll brush off some things mentioned there.

The letter was mostly motivated by your reaction on Paul Martos' letter regarding his bad experience in the FB forums. I was mostly harsh toward you for condoling RTFM behavior and describing it as "diversity of opinion". But since I wrote this so long ago I calmed down. I'll try not to care. If some people persist in acting like assholes, I wish them good luck with that. I only hope that this sort of people and those who tolerate their retard behaviour will realize one day that the atmosphere they create is destructive and negative as much as the complete opposite, for example, nazi-admins who don't allow forum users to say "Damn!".

Among other things I complimented Rattrapmax6 for starting printing text in his Horse Humor comic, which I big step forward.

I commented the results of "the best QBasic game developer of all time" poll as fishy and difficult to understand. Especially 16 people valuing J.B.'s Sonic Xtreme demo builds over all the Na_th_an's, Master Creating's or Darkness Ethereal's work. I guess he has a lot of friends. Then again, 10 people who voted in division 3 think my work is better than syn9's, Piptol's and Jocke's. Flattering, but hard to understand. And Oren Bartal getting no votes?!?! You people are crazy. I can only say once more that I don't like the concept of this poll. Originally I wanted to keep the poll much smaller(9-10 suggestions) filled with the obvious QB legends(where I really don't belong) with bunch of other people only being mentioned as the notable figures in the QBasic game design history. I just hope we won't blush the day when the final results arrive.

I also nominated Vector X 2006 and Kingdoms for Qlympics FB ports category. I guess it's too late now. Pity but no biggie.

QB Express #21 was another big and impressive issue. One wonders how much you and those who contribute will be able to keep it up. Let's hope this will last as long as Oprah. :P

Just recently I was going through the old issues of QB Express only to discover the beautiful articles in it all over again. Like Deleter’s "Game Apathy: Another Symptom Analyzed". I would blow it up and make wall-papers of it if I could. :P And I was embarrassed to discover I missed Na_th_an's second chapter of "Coding a Parallax Scrolling Platformer". Heh. I should have paid more attention but then again, I downloaded issue #12 and issue #13 together last year after my usual summer of absence and with exams ahead of me.

Back to issue #21.

First of all, thanks for reserving so much space for Vector X 2006 in the news brief and putting LONG in the gallery section. I hope people won't be too annoyed with LONG since for issue #22 I sent you news on the FB port and again few screenshots. Oh, well.

It's nice too see the ambitious 3D projects from syn9 and Xerol being developed but on a way they also make me sad since I know I won't be able to play them on my PC. OpenGL hates my video card for some reason. MystikShadows did suggest me reverting to Windows 98 in order to get my PC running stuff smoother. I DO have Windows ME but it doesn't seem to have a proper setup file. The college-mate who gave me the CD said it doesn't matter. All I need to do is to boot my PC with this CD. Still, now is very inconvenient time for me to do such tedious(and probably dangerous in the sense of data loss) tasks so I'll leave that for the future. On the other hand, one dreams of owning a better PC in the future.

I'm glad SJ Zero is back with two articles. I wonder how his Tolko mission went. Seeing one title of his article I was ready to send him an email entitled "Stop selling your 24 hours HEATHEN propaganda!" only to accept his arguments after reading the article. At least partially. I agree that such short projects can motivate people to continue in a more ambitious manner, but I also believe that restricting your attempts only to some 24 hours compos should not be the only way. I certainly agree with this:

"We have the technology. All we need now is the will."

Relsoft's "We are the Normal and the Bounce Equation" is a blessing from the sky. Man, I waited for such tutorial for years. This would definitely save Ball Blazing Fantasy from such poor ball to wall and ball to ball collision. Now the possible FB port of BBF makes much more sense. But above all, I can finally put a pinball game on my "possible projects" list, without fear I will have to dig through the net to find the appropriate routines. I love you.

Thanks to MystikShadows for writing that article about network programming using Winsock. Not EXACTLY what I'm looking for but anything that brings me closer to using such libraries is much appreciated. What I would really like to see is some sort of simple network PONG game that uses Winsock, to show us dummies how Winsock can be used in games on a simplest example.

What else...thank you for the tip on Lithum's "They Came... We shot them down!". Really fun game. And very well designed. I kinda envy them on hitting the gameplay value so good. Lucky(or talented) sods. Still, I would like to see graphics being improved. I hate seeing a great gameplay ruined with lack of ambition in other aspects.

Ah yes, I will attach my review of Lynn's Legacy with this email. I fear it will become a victim of "Lynn's Legacy reviews inflation" but I don't want to to trash it.

And that would be it. Sorry for not commenting more articles. I just don't have time to deal with many things right now.

Hopefully I'll finish by diploma thesis successfully and embark into the great unknown... real life(adopt me, please! :P).

Best Wishes, Lachie D. :)

### Letter from ASCII-World

Hi all.

We have heard and read, in the past times, alot of rumors and assumptions about our website, ASCII-World.com We just wanna clear these things here quickly, since what we have heard came from irc, IM, email and forums alike. Mostly these things are pure misundestandings. But since we don't wanna make this too long, we'll just quickly answer some things that are in air about our site.

1. ASCII-World is QBASIC/GW-BASIC/DOS website.
No, we are not. We are a website dedicated to the art of text and ASCII programming. Programming language or platform are not important, any language is welcomed here.

2. ASCII-World is antiFreeBASIC website.
Certainly not. Half of all codes posted on forum are made for FB. Most of articles and tutorials are made for FB.

3. ASCII-World is FreeBASIC website.
No, we are not. Most of our codes and articles handles FB (and probably more in the future too), but that's because contributors and members are mostly FB users at this point.

4. ASCII-World created to keep QB and DOS alive.
Yes and no. QB and DOS act's big part on life of ASCII programs so you can say one of our "missions" is to play with DOS. Alltho, we like to do it, so hard to say it's our mission. It's more like an interest and hobby or even love. call it what you want.

5. ASCII-World is safesite for those who plays with ASCII since they dont have skills to do 3D.
No. We are not retarted, pervers or lame because we like to do ASCII/text programs. We just dont see anything interesting to program 3D scenerys or games.

Consider a man, who spends his time and efforts on an old Buick, back in the 50's. Is he retarted? Naturally, new cars gives way better drive, but feeling ain't same. All cant see or feel it, but someones do. So dont judge us, or then you have to judge every one who likes for something "old".

6. ASCII-World is for those who hates latest 3D OS's and hopes return of days of MS-DOS.
No, no and no. Advance is always good. After all, with out it, we would not have internet and all these other great things we have today. But we just don't feel the need to have latest 3D desktop's or graphic drivers. We can use older ones and we do actually like to use keyboard.

7. ASCII-World is anti-M$ site.
No, no and no. Personally, lurah think M$ sucks, but it's not ASCII-World website's purpose. If you disagree about M$ with lurah, then hop on our forums and say so.

ASCII-World is created and owned by Stephane Richard and Kristian Virtanen. Two man, who just loved ASCII games, tools and applications, by coincidence happened to meet on internet and after a while of conversing, decided to create a website that would present something they both missed on internet.

For now, website is created and hosted by Stephane Richard. The domain name is owned by Kristian Virtanen and some "modernized" parts of site are made by him. But as long as these two names are behind ASCII-World.com, guidelines of this website will remain, no matter which one owns, hosts or codes something new.

Sincerely, Stephane Richards and Kristian Virtanen

aka, MystikShadows and lurah

### Letter From Imortis Inglorian

I've been meaning to write a letter to the editor, for a while now. I want to let you know that QBE is highly addictive, as well as writing articles for it. I have you to blame for this disgusting habit. I hope your happy...

No really, I have come to very much enjoy reading, and writing for the QBE. Enough so that I have decided to do a multi-part series on Cryptography. I happen to have a good bit of knowledge on the subject so I decided to share it with the QBE and all those who read it.

Also, if you ever need any help with QBE, drop me a line. I'd love to help out.

Signed,

Imortis Inglorian

### Letter From Jay Schmit

Thank you so much for this site. My 10 y/o son started walking through Ted Felix's Tutorial for Kids this weekend, and he can't get enough. He had read an ancient book called It's BASIC, published in 1982, the same year I was learning BASIC as a 10th grader. When I showed him the tutorial, he worked all Sunday long, tweeking the programs taught in the first 20 chapters. Plus, my husband and I are having a blast goofing around with it, too. It's like finding an old friend!

Thanks again for all you hard work here. I'm sure we'll be visiting often.

Jay Schmit

### Letter From lurah

Hi Pete

Well, you and all contributors did it once again. Great issue, full of articles and news with great quality.

I have followed closely post's and threads about how QBE is dying. But after last issue, we can say that case is closed and it's nothing else except damn good thing.

Summer is soon over, and it most likely means that Qmunity (yes, i wana use that word now and for long in future) get's back to computers from holiday trips. It also means (well, usually lol) that something new and fancy comes up.

PCopy! is one of them this far, but since i dont wana talk about it long way here and now, i just mention that it's even better to know that actually third "competitor", FreebasicNews is on it's way. This only proves that FB, QB and BASIC languages in generally are in good health and their userbases are activated and motivated. There is plenty of room for all three of us, and if fourth one wants to join, i say welcome.

Also, thru this issue of QBE, i wana say thanks to buddys behind FreeBASIC Insight website. That site just kicks ass (sorry my bad word, but it really does). All articles this far published on that site, has been extremely great ones. I have enjoyed every single one of them, and for now, i do check that site daily, just to see is there something new came up. Even readers responses for those articles has been well-mannered and comfortables to read. I really do hope spirit of that site stays as it's now.

This can sound a boost-up of one article there, but i wana make an reference to hartnell's latest (this far) article, The Noob’s Robot Slave and How To Re-activate it. That article together with this topic started by hartnell, points in a good way for peoples, that programming dont have to be so damn serious all the time. There is no need to create anything new or amazing every time IDE opens. Peoples can and should program something totally useless just for fun time to time. I challenge every forum to put up something like this.

Anyway, it's nearly 3am here so better go to bed. Thanks to you Pete and all contributors for giving this great magazine for us.

lurah.

p.s Game Dev section on FB forums was great idea. *thumbs up*

### Letter From Eric Cowles aka 1000101

Mennonite wrote in QBE #21,

> "i put this idea forward at a time when people are jumping out of line to disapprove of this or that... sometimes someone goes too, too far in attempting to destroy another person. actually, seph comes to mind, but there's no telling who i am referring to. you may think i am referring to pete, who felt compelled to trash seph personaly for whatever reason in qbe #20. i am of the impression (perhaps mistaken, to be sure!) that seph did nothing of any sort to pete... that pete only decided to trash seph as a bandwagon sort of thing- but perhaps seph, as i once did, managed to rub pete the wrong way in an email- i dont know. i could also be talking about z!re, in her inability to wish seph and his new family the best, only to take yet another opportunity to say he's essentially unfit to exist. i could be talking about that."

I feel that he unfairly accuses Z!re of being the purpotrator behind suggesting that seph shouldn't be running around bragging about procreating. I do recall that it was myself that posted first my disaproval of people with no firm grasp of reality and/or potential mential issues to work out of having kids. Not to mention the big thing of being just so young.

Now, on the flip side of that, I did congradulate Nekrophidius aka NecrosIhsan aka LostSock aka [fill in the blanks] and Rhiannon on having thier first daughter. But there is a world of difference between seph and Nek. Nek is older, more responsable (from everything I've garnered over the years of the two), more mentally stable (Nek has his moments, but then we all do. Seph, on the other hand rarely *doesn't* have his moments).

In any event, what I'm getting at is that he accused Z!re of flaming seph for this when I was the one who started it. He should at least get his facts straight before submitting a letter to you and your e-zine (gawd I hate the use of "e-" this and "i-" that) so that he doesn't look like more of a ripe turd then he already is. Further, from my stand point, and I'm sure the stand point of other more established members of the qmunity, his comments and thoughts on the subject and other subjects don't amount to a hill of beans as he lacks any credentials.

Z!re has been working for over a year on FV, cha0s has been working for over a year on LL, I've been working for over a year on GSG, many others have thier own projects but are equally respected but less vocal such as syn9. We and others all have been around for a long time and have done quite a few smaller things to earn our positions in the qmunity. Nek is one of the most respected members because of what he's done and his no-bs attitude. Z!re is gaining similar respect for much of the same reasons, however, she is a bit more brutish then Nek at times ;P cha0s, of all the people I respect in the qmunity, I have little negative to say about him. In fact, I can not think of a single instance where he didn't follow the old rule of, "if you can't think of something nice, don't say anything at all." I'm not saying that he hasn't bashed anyone, just that I can't think of a time.

To wrap this up, this is directed more at Mennonite and those others who don't get the whole "ranking" within this virtual community, it works like this: You start with nothing. Your opinions are worth that until you show you are a helpful and/or contributing member of the community. If you act like a childish n00b then you will be treated like a childish n00b. This is why seph is still nothing in the community. It's people who run the websites that allow us to congregate, people who produce useful programs to use, libraried to implement, provide helpful advice and solutions and/or games for us to play such as Nek (WOS), v1ctor (µGL, FBC), Blitz (µGL), cha0s (LL, lots of help on the forums), Z!re (FV), lillo (FL, FL2, Wetspot, lots more), Jorden (qbasicnews.com) and many more for what they have done and provided over the years. There is no leaders or rulers, only people that are respected and afforded thier eccentricities due to what they have accomplished and done.

Eric Cowles aka 1000101

### Letter From MystikShadows

What a pleasant surprise it was that evening when suddenly (unexpectadly I might add) I saw a post on ASCII-World saying "QB Express #21 is now available". Not sure if I'm the only that noticed that but typically, in my time zone, it usually comes out in the morning, or early afternoon, #21 the first night time edition ;-). Unexpected, and definitaly something I was glad to see popup when I hit refresh, on last time "as a last minute refresh" of my forum making sure I had the lastest posts and there it was.

I'd like to set the record straight about mennonite here. I'm sure some of you (ok, maybe the majority of the readers) are wondering why I'm doing anything with mennonite (maybe some in no so civilized word usage ;-) ). For one thing, I'm very well aware of what's been happening this past couple of months, i've read menn's posts just like you all have, so I'm not doing this out of ignorance. In fact, as I posted on FB.NET, I'm doing this maybe with more knowledge about mennonite than most have. Of course, I can't undo menn's posts, the internet doesn't have a CTRL-Z. Nonetheless, since QB Express #15 (I say this because I know everyone remembers QB Express #15 series of mennonite emails) I've emailed menn, he explained the whole thing, with links to prove his points back then and well, with all that much more info, in a way, you can say it all adds up to the infamouse "how do I do that in QB? Simple, use FB instead!" ordeal that's been happening. But through these emails, menn gave me some good details about how he sees FB or any BASIC dialects. And well, me and him (although we use very different approaches to sharing our visions ;-) seem to see things the same way. I can't control menn of course (there's laws against that hehe) he can choose to express his vision, thoughts and concerns the way he wants, but the base of things remain is that we do share the same vision (or very damn similar on alot of points) of how we see a BASIC dialect. But all this is not about what we want FB to be, I'm not that egotistical to want to just throw my vision in the air and expect it to superseed anyone else's vision including the creator of FB himself, I'd never expect that and OF COURSE, nothing I've done was ever for that reason either. We all have the choice to think, believe and decide what can happen, and I've made mine. Besides, menn hasn't done anything per se to me to make me change my decision. :-).

I would like to explain my point of view as well as all my comments I've been making for the past couple months. Obviously, they haven't been taken the right way so here, I'll clear that up (or atleats try to). I've said before, that My vision of BASIC is based on the 8 founding principles of BASIC, and yes, that was true then and still is today. One thing I do want to clear out though, when I start sharing my vision of what BASIC should be (in that article I did for example) or when I post on the different forums. I do it for a reason that is far beyond my own scope and needs of a BASIC. Let me explain. The only thing I've ever officially asked for from FB was PCOPY in text mode. It was my only request back then and still is today (although I've been confirmed that it won't ever get added). The rest of my comments about FB isn't about what I want FB to be. Every single suggestion I've made aside of PCOPY were for the good of the FB project itself (but not with the hopes that FB will change to fit my recommendations though, that's the part people get wrong). Some of you who thing FB is perfect have all the reason to think so. Because for you, the move from QB to FB has been systematic and gradual, aside PCOPY, FB is very usable in my case too and I do use it (i'm even porting my IDE project to FreeBASIC because thanks to chaOs and Some help from DrV I now have something I can use in lieu of PCOPY that gets the job done (thanks to both of you for that, I'm very grateful for it).

Right now there's about 20 developers or so actively contributing to the FB sourcecode base (the compiler, library ports, IDE, all contributing to shaping FB into what it is today and what it will be tomorrow. I'm sure that just in those 20 or so developers there's already some discrepencies, some internal discussions that are made on different parts of the language. Vic said that those that contribute determine the faith of the project, that's great, I have to agree with that. Nothing can be done to change that, so I am using a different approach in my comments and suggestions I make. One thing no one can deny is that FB is growing in features and in number of users (forum memberships are a good proof of that, 1200 and some members and growing). I don't think even VIC can deny that one of the reasons FB exists is because he wants people to use it. I'm sure he's very happy when he sees new projects being made and created and and new users joining the forum and getting interested in FB (right Vic? ;-) thought so hehe). So here's my point. for this I'll stick strictly to commercial BASIC compilers users, but as we all know, there are many users from other freely available BASIC compilers too. Ok, 10s of millions of VB 6 users, that's alot no? I say VB 6 users, because a whole many VB 6 users just don't want to make the move to VB.NET (With, in some cases, commercially viable reasons) for example, some with very large projects they did in VB 6 just can't be ported to VB.NET without a very considerable effort. Others just don't like the .NET mentality as it was originally expressed back then and with today's new and a bit different vision of .net, it seems making the move to VB.net just doesn't represent the best alternative solution. Anyways, these VB 6 users know where VB 6 is heading for. So yes, I can bet that alot of these users are looking at FB today and I'm sure more will too in the future. Same thing for PowerBASIC users (we know what PB users are saying about FB, and we know they are wrong in what they are saying too). My comments and suggestions are all based on what these VB, PB, maybe some GFA Basic users, looking at FB right now, might be wondering about. I've used all these languages (and other BASIC dialects as well over the years) I'm in a good position to see, clearly, the differences in philosophy of these languages, and can compare them as they were and as they are, to FB. I guess I'm testing the FB forum as to how it would react to either critics (made from VB, PB and whatever BASIC) against FB, but it doesn't stop at critics either, I know for a fact that that there has already been questions asked on the forum. Questions like "In VB you can do this, can FB do that too?" some of these questions could have been answered in a more openminded fashion.

Now, If VIC's goal is for FB to become the most popular OpenSource BASIC to ever surface the earth (which FB can definitaly become and even is fast becoming) then he should expect to see alot of these VB versus FB questions, critics, ideas and suggestions, because users of these other commercial BASIC languages (including of course, Free ones, like Envelop BASIC (now phoenix), RapidQ, BCX, XBasic and XBLite and others) are probably all very interested in what FB can do, and to me, I don't think that answers remenescent of "hey, if you don't like this, use whatever you're using now" will get very far. Some of these suggestions I've made myself, but others of these posts have been made by new users (not me or menn). At the very least, these discrepencies should be noted down (even if in a personal file somewhere) and attacked one by one to see if there's any FB can please more users, maybe they are on a hidden file, if that's the case, great, I mean it really all depends on what VIC sees in FB, but I think he wants people to use it. OF course, the first batch of people that might want to use it are users of other BASICs don't you all think? We all know how VB works, sure it's for windows only, but no one can deny of how spoiled VB 6 users are hehe. Again, I'm not saying FB should change to look like VB or PB or whatever other language, what I am saying though, is that Forum Members should definitaly expect alot more of these differences, comparisons, critics, ideas and suggestions that come from users of other basics. I want PCOPY in text mode, it's ok if I don't get PCOPY as an intrinsic FB function, chaOs created something though that gave me that functionality. I think this is a perfect example of what should happen. atleast it shows that there is concern for users used to working a certain way because of their other BASIC related backgrounds. Some things might not be possible, but a negative (almost flaming like) reply to that still wouldn't be the answer. This isn't a complain, it's an observation, if you look through the FB.NET forum you can see such examples of these negative replies. I want FB to succeed like every one else does, and this type of reply doesn't help (and no, I don't mean the replies to menn, like I said, other users have gotten these replies to what seemed to be very legitimate questions or suggestions. 20 or so develpers defining what could potentially be a couple million of potential users, well you do the ratio and tell me a good reason why there shouldn't be some differences in vision hehe. 20 against a few millions hehe.

So again, to be clear, I'm not asking FB to change to become the next VB or the next PB or whatever, I'm just doing these selective suggestions because I know users of other basic are looking into FB, and I think that if my suggestions (among others) were atleast looked at, or even better, taken care of in some way (like chaOs did for my PCOPY suggestion) FB would look even better to the eyes of other BASIC users even if the answer has no choice but being no, that feature doesn't exist and it won't be implemented. Phew, I hope I've cleared that up good. And I hope everyone realizes that I do all this for the good of FB and no other reason.

A quick correction if I may, in my last letter I seemed to indicate that I supported the use of meaningful code in my comment on Moneo's "fallacy of meaningful code" article. I don't and I wanted to clear that out, I support the article itself which means that I don't support meaningful code, if that makes things any clearer hehe.

And now for the rest of the letter, if veins didn't appear in your eyes yet ;-). Ok, a word about PCOPY! I hope, like you do, that it livens things up and creates more activities and life than there already is in the QMunity. But since there's more than FB at stake in PCOPY! (with an exclamation mark if you please hehe) I also hope it can stir things up in those other language users as well. Basically, with a little luck, maybe the whole BASIC internet world will be shaken up, but we'll start at the beginning and see how things go :-). For those of you who are wondering, PCOPY! is on the verge of coming out, my guess is it will be out before you get to read this paragraph. We're making every effort to make sure the first issue does come out as soon as we possibly can dish it out.

Well, the newsbrief section is still as lively and full as ever. People are busy being busy doing things with FB or for FB and man, it's always great when we can see that develop itself in every newsbrief section of every QB Express. I'm not sure if all of you have read RDC's book in the making yet about FreeBASIC, but you should. RDC is a gifted writer, there's just no two ways about that. So if you didn't yet, go read it, you'll see how important his book has the potential to be. Brilliant work. It's fun to see all the new engines come out too, Wallace's Inspiration is really something. What I like about that, YAGL, and the other libraries is that they offer different alternatives, different philosophy which gives users choices in which library reflects best their way of working. And well the rest of the newsbrief is allways exciting to see.

Qlympics 2006 the name really says it all. I think it's by far the biggest best initiative ever undertaken By the QMunity, About the QMunity and of course for the QMunity. I've been following all the voting, the polls, been making sure I voted on the polls on your website and of course I already filled out my QLympics voting ballot. This is one thing I can't wait to follow in QB Express #22 and get all the final results at the end of all this. Definitaly got me curious to say the least and of course, I'll be following this closely :-).

SJ Zero's "How to Design and Program a Game in 24 Hours" is impressive. It defines a very well structured frame of mind and really seems very structured and feasible after reading this to make a game in this frame of time. When I first read the title, I said "hmmm, ok!" But after reading it, I can officially say I stand corrected. There's alot of good comon sense in that article, and I think alot of people should read it and learn from it :-). I almost skipped over his "Polemic For the Future of FB" article because at first glance (and with my french background, I thoguht polemic was some math based principle hehe) but I'm glad I didn't, short but motivational is all I have to say to that article. Great work there too. Let's not forget his "Computer Controller Design" article too. Sure we've seen code like this before, but now, we can all give it meaning and historical background to why things are the way they are. Quite an interesting read, I've enjoyed it quite a whole lot.

rdc's "The Next (R)evolution in Computing" shares a very unique vision on things. I really like the human centered computing versus the machine centered computing. When you look at everything happening around the computing world, it seems that his vision might even be closer to our present than we think. On my side, I've always been seeing one thing. STill today, computers are used to do things we humans don't want to do, in the IT world, it's even more true than it's been. But in general, we really haven't begun to create with a computer, we've only been replacing what already existed (automating processes and the likes). Who knows, maybe RDC's vision is exactly what we should concentrate on to shape the 2nd half of the computer era, hence also, really start "creating". His "Single-Dimension Dynamic Arrays in Types" article is no less impressive. I mean, who here doesn't wish this could be done, and now, they can see that it can. Sure it takes pointers to do it, but look at rdc's code in there, it really doesn't seem to be too complicated to use at all considering the power it offers. Another great one from the disfunctional one himself :-).

I'll be the first to say that I just about never heard of Digg It. I say just about because I do remember some articles friends sent me that came from there, but I never paid attention to what Digg It actually was. Thanks a whole bunch for this presentation of what it really was. It's in my favs now hehe. Like you said, it's really a geek's pot of gold at the end of the CRT Rainbow ;-). THere's a heck of a lot of read all over the place there. So I'll be busy for atleast a little while ;-).

As for the comics, well, they were all good. I see rattrap went back to computer drawing his horse and of course, the text is definitaly clearer to read now ;-). 0 and 1 comics really speak for themselves hehe. And tunginobi's humor is really growing on me. always a fun distraction from the rest of the magazine, awesome.

To me, the name "Kristopher Windshor" is a new name, I don't believe I've heard of him since about a month ago when menn posted a post on my forum about his iOS GUI project. Since I've seen the iOS project however, didn't take too long to see that Kristopher is no newbie to nothing. his "i-TECH Tutorial: Using Circles as Objects in Games" is just one example of the things that he knows and can, as you can see, explain with great detail and clarity. I'm looking forward to alot more articles from Kristopher, hoping he has the time to write more. Absolutely great read if I do say so myself.

Good ole Moneo is at it again, his "Generating Random Integers" gives a great explanation, details of how things work and why things should be done the way he describes them in this article. You know, sometimes you read something that makes so much sense, you just can't seem to find anything wrong with it, accept it, and live the rest of your life with this new and well founded knowledge in your head. Well folks, this is one of those pieces of knowledge. Brilliant work Moneo.

"Ecliptorial: Volume I - Floor Mapping Tutorial" When you read the first part of this title, did you, like me, think Eclipzer was starting the writings of his own bible (and colt)? hehe. You know, there's something to be said about someone, anyone, that has a specific knowledge, a popular knowledge and shares that knowledge with those who want to learn. How many of the readers wanted to know a good floormapping technique? I won't count all the hands that are up. I gotta say, so far, Eclipzer's article have been among the most interesting ones for me. And I am so looking forward to what he'll be writing on next. Almost so, as I'm awaiting for na_th_an's eith part of his tutorials on IF games, and whatever else he might want to write about (get the hint na_th_an? huh huh? hehehe). So Eclipzer, keep on writing, I can garantee that you have atleast one interested reader and I'm sure many others too.

Finally some new reading material from Relsoft, his "We are the Normal and the Bounce Equation" explains something I've seen asked, in many forums, for a while now. I think alot of people will be happy to see this material, for one thing, it's Relsoft, his reputation definitaly precedes him, so you know it's good. Not to mention, that I can already see where and how these formulas can be used in 3D games too. Can't wait to see what comes out of his head next ;-). Keep on keepin on Rel.

You know, my motivational comments on all these (and all those i've done in the past) are really easy to do when the material is so good. Look at them, they really speak for themselves, I just take what they say and "pretend" i said it myself so good they are hehe. Everyone should really patt himself on the back for all the wonderful material we can read in QB Express every single month. Thanks to all of you guys, you sure are making my motivational (cheerleading) very VERY easy to do. And Pete, you're in there too man, with your gift of taking everything that's submitted to you and putting it all together spectacularily well every month really makes QB Express worth the read that much more. I mean, come on, 9 tutorials, 6 great articles, the comics, the newsbrief, the letters, it's alot of stuff, how many reader here would take the time to read all this material every month on any other subjects and if it wasn't presented so brilliantly? Patt yourself on the back Pete cause if you don't, I'll go do it for you, and you don't want that, it could hurt...hehe.

MystikShadows

Stephane Richard

Have a letter for the editor? Send all your rants, raves, ideas, comments and questions to qbexpress@gmail.com.

## Express Poll

Every issue, QB Express holds a poll to see what QBers are thinking. The poll is located on the front page of Pete's QBasic Site, so that's where you go to vote. Make sure your voice is heard!

### Greatest QB developer of all time (Round 4)?

Developer | Votes | Percent | Graph
BINARYmagic | 24 | 19.5% |
BjM Software | 0 | 0% |
Danny Gump | 16 | 13% |
Jason Gould / The_Brain | 4 | 3.3% |
JAWS V Soft | 24 | 19.5% |
Mike Snyder | 2 | 10.6% |
Nekrophidius | 13 | 8% |
PHAT Kids | 18 | 14.6% |
SV Reanimator | 11 | 8.9% |
TMB | 11 | 8.9% |
123 Total Votes

> Looks like a tie between BINARYmagic and JAWS V Soft. Good work, guys!
> Tune in next issue for the last semi-final round of the Best QB Developer ever competition!

## News Briefs

News from all around the QB community, about the latest games, site updates, program releases and more!

> NOTE: This news is very out-of-date, some of it dating back to the Summer of 2006, some of it from spring of 2007. It's still interesting, though!
> Thanks to Imortis Inglorian for compiling and writing most of these.

### QB Site News

The QBasic Games Directory Now Open

  The QBasic Games Directory, by Dean Janjic, is now officially open! It's been open for testing for some time now, but it wasn't absolutely functional.

  There is no fixed date for the arrival of actual downloads. Please be patient, as we have 442 actual entires in the system and uploading .zips for each of them will take a while. In the meantime, check out the thoughtfully-written descriptions and screenshots! There's catagories and filters to help you find what you're looking for also.

  Again, Dean Janjic designed this entirely in PHP and MYSQL. This was his pet project, and I'm just glad I got the chance to host it. :)

Code Something Useless?!?

  Lurah (Almost undoubtedly inspired by Hartnell's kickass article on the Noob's Robot Slave) has created what I'll Call A "Code Something Useless" forum, Dedicated entirely to F-U-N with code.

  Lurah says:

  "This section is meaned for useless/fun or other codes that are created with laugh in thoughts."

Freebasic Report Launched!

  For all the FB fans in the house, there is a new freebasic related news website/zine online at: http://report.freebasic.info/

  For information about the site, please visit: http://report.freebasic.info/keep_us_alive.php

  Please come check us out. we hope to see your contributions in the near future.

  To quote Eclipzer:

  > The FreeBASIC Report is a user-content driven online magazine for the FreeBASIC community. Simply put, we now have a means to quickly and easily showcase our contributions to the FB Community. Whatever your forte, be it games, demos, tutorials, comics, rants, or articles, FBR supports it.

  > The beautiful thing about FBR is that the whole process is automated. You submit your content, and it takes care of the rest. Unlike previous zines, there's no waiting and wondering for issues to release. So long as there are people contributing to the mag, it will continue to grow.

  > Finally, FBR's focus is on community and as such supports a host of features, such as user icons, link icons, download links and reference links to promote this. FBR is also included in the FB Top 50. Essentially, if you're looking to promote your FB related knowledge, product or project, FBR will play a huge role in quickly realizing that aim.

Hee Hee... .tut...

  hartnell has started a great new project. I'll let his post speak for itself.

  > My project wound up landing on my website as a separate wiki. It currently has 64 pages, 7 tutorials, and 2 members. (I'll update this from time to time.)

  > http://fb.gamedesignnovice.com/w/FreeBASIC_Game

  > You can see how active it is at any time by going here :

  > http://fb.gamedesignnovice.com/w/Special:Recentchanges

  > In the very near future, there will be three separate projects going (FreeBASIC, Brutus2D and Basic4GL) to implement .tut. Having them tied together allows these three projects to look at what the other projects have done when they need help or just for general inspiration in wording.

  > I also moved it because I couldn't stand the wikispaces wiki software. I'm a mediawiki kind of guy.

  > Everything has been moved except the variable tutorial, which isn't for me to do. Voodoo should do that if thats what he wants. If I moved it, it would be very rude.

  > If you like what's done so far, here's how you can help :

  > 1. The FB Game wiki is using the old GDN logo. If you can design a 135x135 logo for it, it would be greatly appreciated.

  > 2. If you have news or want people to know about a project you are working on, you can post it on the current events page.

  >    http://fb.gamedesignnovice.com/w/Current_events>

  > 3. If you want to become a regular member and have more spare time than the average person, our Things to Do page is here : http://fb.gamedesignnovice.com/w/Things_to_Do

  > 4. Finally, even .tut is a work in progress. If notice something that should be a tutorial or a concept that needs to be explained in .tut, please add them to the .tut pages. You don't need permission.

  >    http://www.gamedesignnovice.com/wiki/Dot_tut

  > If you can't think of something, feel free to ask a question about something you'd like to know.

  > -hartnell

  > P.S. Still have a BOOMSTICK!

### Project News

New QBasic Game! Bounce 3: On the Town

  Bounce 3 features new graphics including lightning, spotlights, a camera shake effect, and moving helecopters in a great side-scrolling game!

  The compiled version and source code can be downloaded here, along with instructions:

  http://geocities.com/tzmne/projects/bounce3/index.html

  Enjoy! {:-D

Baskid BASIC Interperter

  Hi friend, Im creating a Basic interpreter called Baskid Im using Free Basic as progrgamming tool if you want to put Baskid on you web page I will like to much :) I need a lot of feed back :) the link is http://www.esnips.com/web/vinianssBusinessFiles thx in advance

EMS Magic 1.0 Released

  Now you can enjoy all those QB classics you couldn't run before in Windows XP, due to EMS problems: Wetspot 2, Shell Shock, Ultimate Super Stack, FoX, and more! Over 70 games and demos have been tested as fully working.

  Grab it here: http://emsmagic.phatcode.net/

  (Easy-as-cake Windows installer available.)

  Also works for running other DOS programs requiring EMS in Windows XP, including Impulse Tracker and Quattro Pro.

Wallace software Releases Pre-release Alpha of Dove GUI

  I have coded enough of my new GUI Dove to post a demo of it. It runs real executable programs written in FreeBasic so it is one of the fastest, if not the fastest GUI every written in QB/FB. Comes with 2 demo programs (plus a screensaver and primative error handler.) Source code for all 4 programs are included.

  www.freewebs.com/wallacesoftware/doveos.htm - download is at the bottom, below the screenshots.

  Let me know what you think of the GUI and the screenshots.

Marvelous Twilight released!

  Download:Windows version

  Our own entry to the Shmup-Dev Autofire Shooter Compo.

  A 2 player manic-shooter in the likes of Strikers 1945, Dodon Patchi and a cute-em-up from the likes of Parodius and Harmful Park.

AFLIB2 Remixed!

  Hello to you all, and I got some good news and bad news.

  The bad news first: due to the changing times and advanced functionalities of the newer version of FreeBASIC (including current v0.17b CVS releases), AFlib2 will NO LONGER be supporting 8-bit color depth at all. :( !

  And now, this brings us to some damn good news: AFlib2 will now have FULL SUPPORT for 15-, 16-, 24-, and 32-bit color depths, and so will the SNES-based Mode-7 effects, definitely!!! (^-^)v !!

  Hence, this newest version that I am working on will be called AFlib2 Remixed... the proud new successor here in which many of the effects and stuff that you loved from the original 256-color AFlib2 will be making a comeback into the hi-color/truecolor graphics modes, including some all new ones also!! ;)

  Just hang on tight... ladies and gentlemen, it is gonna be a great ride!!! d=^-^=b

FBIDE Dead

  VonGodric announced that he was disscontinuing the FBIDE project, but that he was going to replace it with something better. Here is the post:

  > Hey everyone,

  > first of all about FBIde -it's dead. I lost the sources and what is on cvs is very old and frankly a peace of crap. I have started anew with writing a new codebase for editor, but rather then do blindly I'd like to start a discussion what should an IDE for freebasic be like and what not.

  > Besides most of my problems that I announced a while ago have been solved and now I am inspired yet again to work on it.

  > I am willing to lead the project and do most of the job -but I'd like some support with testing, graphics (for icons and etc), ideas and writing and designing the code.

  > So please people tell me and offer advice and criticism -what you'd like to see or have in next FBIde. And anyone who would be willing to help with the project?

  The thread can be seen here.

New IDE for FreeBASIC made in FreeBASIC

  KetilO has released a new IDE closely based on his RadASM. It has a large number of features and the ability to make your own plugins for it. KetilO also updates it very regularly, based on Bug Reports and user requests. You can download it from here. If you want to report bugs or ask for features, you can post here.

Try Before You Buy FreeBASIC

  sir-mud has made a page where you can type in and compile FreeBASIC Code. It will then give you an exe download. It can be found here.

### Other News

PCopy 10,20,30 Released

  ASCII-World has release 3 issues of their PCOPY! magazinesince the last QBE! Gotta love that motivation!

  You can come here to download and view the issues.

Former QB Community Member sentenced to Federal PMITA Prison

  Former member of the QB Community, Jeremy Hammond, who went by Xec96 during his tenure here, has been sentenced to federal prison for illegally accessing the Web site of a conservative political activist group and downloading the credit-card numbers of thousands of its members. Many of you may remember Xec for hosting Vplanet, writing Shellshock, the vertical shooter, and Quelda, the Zelda Clone. Here is the full story.

  Quote:

  > A Chicago man was sentenced to 2 years in prison Thursday for illegally accessing the Web site of a conservative political activist group and downloading the credit-card numbers of thousands of its members.

  > Jeremy Hammond plotted to use the credit cards to make donations to humanitarian and charity groups opposed by the Protest Warrior Web site into which he hacked, but he changed his mind, according to court records.

  > According to his lawyer, Hammond has extreme left-wing political views. He admitted to the FBI that he was a member of hackthissite.org, which identifies itself as "an online movement of hackers, activists and anarchists," the court records show.

  > After Hammond's father had noted his son was 19 at the time and used poor judgment, U.S. District Judge James B. Zagel picked up on the point, but used more blunt terms.

  > "You were an idiot when you did it," the judge said. "At the perspective of my age, all 19-year-olds are idiots."

  > Prosecutors had sought up to the maximum 5-year prison term and said they wanted Hammond, now 21, immediately jailed for violating bail by failing two recent drug tests and being arrested on disorderly conduct charges.

  > But Zagel said that was too harsh a sentence in this case and allowed Hammond to surrender to prison on Jan. 3.

  > Hammond was "more interested in countering speech he found wrong rather than picking the pockets" of political rivals, the judge said.

  > In addition to imposing the 2-year prison term, Zagel ordered Hammond to pay about $5,250 in fines and restitution and barred him from participating with hackthissite.org or similar Internet groups for three years after his release from prison.

  > "The threat of what you did is damaging to democratic discourse, your side's as well," Zagel told Hammond.

  > Hammond's father, Jack, contended his son's hacking was an immature act of revenge for a similar attack on hackthissite.org's Web site.

  > Though he faulted his son's judgment, the elder Hammond said his son's "basic inner moral code is good."

  > But Assistant U.S. Atty. Brandon Fox said this wasn't the first time Hammond had illegally hacked. He wrote pro-drug messages on the anti-drug DARE Web site, hacked into a former employer's computer system and was expelled from college for hacking, Fox said.

  > Fox urged a stiff prison term to punish Hammond for his disrespect for both the law and the opposing political opinions of others.

  > In court papers, Hammond's lawyer, Matthew McQuaid, had compared his client's computer skills to "a comic book character's `superpower.'"

  > In court Thursday, McQuaid contended Hammond was too emotionally immature to "harness" his political opinions.

  > According to the court records, Hammond gained access to the credit-card information of about 5,000 people who had bought items or donated online on Protest Warrior's Web site.

  > An acquaintance of Hammond's who tipped off authorities to Hammond's involvement was upset because Hammond allegedly had let an associate take the fall for a previous hacking, the records show.

  > In comments to the judge, Hammond, who pleaded guilty in September, said his motivation wasn't thievery but rather "political rivalry."

  > ----------

  > mo'connor@tribune.com

FreeBASIC Daily Builds Made Available

  DrV, ikkejw and 1000101 have set up automated scripts to compile FreeBASIC from the CVS daily. They have made them available to everybody. Below are the links to the FreeBASIC.net forum where you can get information and download links on each of the Platforms.

  DOS Provided by DrV

  http://www.freebasic.net/forum/viewtopic.php?t=6437

  Linux Provided by ikkejw

  http://www.freebasic.net/forum/viewtopic.php?t=6438

  Windows Provided by 1000101

  http://www.freebasic.net/forum/viewtopic.php?t=6439

## Review of Lynn's Legacy developed by Josiah Tobin and cha0s, 2006

### Written by Lachie Dazdarian
(September, 2006)

### Introduction

I apologize if you already read several reviews of this game. Being a beta tester of Lynn's Legacy, loving the chapter one demo so much and the fact this is convincingly the best FreeBASIC game so far are plenty enough reasons for me to feel obligated to review the game. I think I would compile this review even if I didn't have anyone to show it to, simply for the sake of recording all the conflicting thoughts I have on the game.

This review was written while playing Lynn's Legacy version 1.1, downloaded from sourceforge.net. If any of the bugs/features I mentioned were fixed/improved in a later version, I was not aware of them while writing the review.

I contemplated a lot about the most fitting review format for Lynn's Legacy. After finishing the game this sort of review, sans categories, seemed the most suitable. I think you'll realize very soon why.

### The Review

The release date of Lynn's Legacy came as a surprise too me, since the final version arrived very soon after the chapter one private demo(3 dungeons). I knew that the demo was only a portion of already completed work, but I got the impression that they still had a lot of work ahead of them. Also, the summer was on the doorstep so the time seemed perfect for improving the full product and fixing possible flaws, as much as it takes. Extensive beta testing of the full game probably should have happen, taking the size of the game into consideration. I recommend this to everyone. If you have completed a huge project, beta test the full version once more. The flaws of Lynn's Legacy illustrate why this is necessary very clearly.

I was also surprised to read(more skim-through) a notable amount of negative critics in the FreeBASIC.net forum regarding Lynn's Legacy. I was ready to give those people piece of my mind in this review, still under the positive effect of the beta demo, only to realize later I partially agree with them. I cannot know how much since I didn't take the trouble to save the mentioned forum posts and burn them on a CD(I'm writing this offline).

After finishing the beta demo I was quite eager to play the final product. The 3 dungeons demo was such a sweet and enjoyable ride. Perhaps too good. Deep inside I felt it would be very difficult to maintain the quality and fun gameplay from the first third of the game. Still, I hoped the game wouldn't lose much of its initial shine and momentum.

We all know how the game starts. Lynn is flying over a sea on a Wyvern Ray, escorting a mysterious package to the mainland. After the package explodes, Lynn appears unconscious inside a forest, on an unknown location, with some of memory lost. There is nothing I can complain on the very intro. Everything works fine until the part when Lynn enters a small town and encounters a group of people gathered around a strange portal. I just didn't like this scene. Lynn's confrontation with the town mayor felt forced and staged, but I guess the designers simply were fixed to start the plot like this. To make Lynn a ball-busting type of character and the mayor a loser. Anyway, the story picks up quite fast and redeems for the awkward start. At least for those people who find the scene preceding the first dimension awkward.

Perhaps I should say that Lynn's Legacy plays like any other Zelda-style game, featuring real-time battles but no real RPG experience growth system. It's mainly an action game.

I'm still not sure how to construct the review but I think I'll break it into two parts. In the first part I'll be describing my experience of playing the entire game, because I think that's the best way to convey my impressions about it. Second part will have the more common, category-based structure.

The first three worlds behind the portals(let's call them dungeons) are small masterpieces. They all work perfectly, providing enough challenging enemies, well thought-out maps and intelligently designed bosses. Each dungeon features wonderfully drawn tiles and enemy sprites and introduces new type of enemies, requiring from you to learn and change your fighting tactic. The ice feature in Geldius(dungeon 2), for example, is a brilliant idea. That was the toughest dungeon to beat.

Up to this part I felt everything was going great but kept wondering if the game can actually go any higher in providing excellent gameplay. Is there any room for a better experience or I got the best of the game already? In other words, will the rest of the game live up to its great start? I was sad to discover that the answer is...no.

The first sign that not everything is going to be a-ok was the moment when I visited the tailor and was able to buy all the suits but one(which can't be bought at that point anyway). I had over 500 gold coins after dungeon 3. I'm not sure if the designers imagined for the game to develop like this. So for the first 3 dungeons I only had the default suit, while after dungeon 3 I suddenly have 4 extra suits. From this moment in the game I could run faster using the cat suit or heal myself using the regeneration suit. I don't know if other two suits have special properties. Maybe the leather suit makes you swing faster. I wore it all the time though I couldn't make out if that is the case. Also, I almost never used the cat suit so I'm a bit confused with people commenting how it makes playing the game much more enjoyable. Anyway, at that point you feel the game is unbalanced. The moment you buy suits you are momentarily much more "powerful". Maybe the designers predicted that people would spend more money on buying extra health points from the "salesman" and not having enough to buy all the suits right away. Again, I'm mentioning this moment in the game only as a sign to me that the game will decline in quality and not necessarily as a bad thing itself. After finishing the first 3 dungeons another part of the main world becomes accessible - the desert. It's quite large and a nice place to explore.

The 4th dungeon/dimension mainly disappointed me in being too easy. Yes, the story backed up the non-aggressive behavior of one part of the enemies in the diaries scattered around the dungeon, left by the previous explorers of it. Still, this doesn't change the fact that the dungeon was way too easy to beat. The dungeon boss is designed satisfactory, but I felt he could have used more attack powers/modes. Definitely easier to kill than the previous 3 bosses, but at least to kill him I had to run around employing, that well known but always fun, hit and run strategy. A note that I was killed only once in this dungeon and pretty much on surprise.

The 5th dungeon, called Nerme, is somewhat more difficult but still not enough. I never felt cornered. All I had to do was to be careful. Definitely less difficult than dungeons 2 and 3. So you can guess already that the progression of difficulty after dungeon 3 simply disappears. Also, quite few enemies were recycled from the main world and placed inside Nerme. The map design of Nerme is good, with I note that I started to notice a certain lack of inspiration. You see, the Nerme map design relies too much on the concept of going far to a certain location to get some key, then getting back to a door which now you can open, just to repeat a similar procedure in another part of the dungeon. The Nerme boss fully displays the obvious loss of inspiration, going from its dubious graphical design too unimaginative and unchallenging attack pattern. The easiest boss to kill yet. After the 5th dungeon I was able to explore another part of the main world, which is quite well drawn and designed. In it I found a material necessary for the tailor to create the last, missing suit. Since the tailor's house was way in the other part of the main world I decided to skip returning to the tailor and proceeded to the next dungeon, only to discover later that this was the last chance for me to visit the tailor. After I finished the game I did use an old save game position(I was smart enough to zip the save games every now and then) and acquired the last suit. I did make me swing faster but since I finished the rest of the game without it and without much hassle, the trip back to the tailor is obviously not worth the trouble.

The 6th dungeon, called Divius, while featuring new enemies with new attack patters, does not deliver in challenge and difficulty. It is quite large, I'm not sure but maybe the largest of all. It features several tilesets but not nearly well designed as the tilesets in the first 3 dungeons. It disappoints again with few poor enemy designs, notably a small mosquito looking bug which fires a huge circle of fireballs, quite unsuitable feature for such a small creature. Divius boss is also poor, being completely static(it the first phase) and attacking you only when you attack it, which makes it almost non-lethal, having in mind you have the healing suit. Its second phase features a moving creature, but it can be killed in 4-5 seconds, if you attack it in the right moment. Again, it's not very lethal since you can freely use the the healing suit suit while keeping yourself on a safe distance. I was killed only once by the mosquitos in this dungeon.

I remember the designers describing the last two dungeons in QB Express #17 as "somewhat ambitious final section" so I was expecting for the game to finally redeem itself for the fall of quality after dungeon 3. The last part of the game does feature a lot of dialogues and story twists but fails again in the most important element - gameplay. Boring and mostly not very threating enemies, more or less poorly designed. The boss in the 6th dungeon did kill me several times. I even started to fear I didn't buy enough health points to be able to beat it(I had 15 health points at that point). I was dreaded for a while with the thought I will have to play dungeon 6 and 7 again. Still, after few tries I killed it and was left with one health point. The second phase of this boss is terribly designed and very tedious(not challenging) to kill. I should say that after finishing the game, I went into killing few bosses again just to get the story a bit better. While doing this I figured out a better tactic to kill the first phase of the boss in the 7th dungeon/dimension. It's simple. Approach him, face him, stand still and swing. And that's it! This time I had some 6 health points left. That's plain ridiculous. Another reason why the full version of Lynn's Legacy had to be beta tested.

The last dungeon is quite short and one could say messy. Again, the story conveniently backs this up. The final battle is, I'm sad I have to use this word, pathetic and in a way symbolizes the entire decline of the game's quality from its great starts to such disappointing finale. I'm not happy I have to render the last portion of the game like this since it's obvious that Josiah and cha0s invested a lot of effort in that very section. But effort alone doesn't count much.

Now I'm ending the most negative part of the review. I just implore Josiah and cha0s to stick through it. Anyway, if they skipped to the final score then they could have seen I didn't hold this decline of quality too much against them. Actually, I sympathize with them. This thing happens to best. I don't how many of you remember/know about Shadow of the Beast 2(1,2,3), a beautiful adventure/action game from Amiga platform. It features brilliant art and graphical design. A classic. But its last portion is quite poor while the very ending appalling. Horrible, I would say. Most likely done in 15 minutes. And we are talking here about a classic and professional game designers who were paid for their work. That's just one example. So I understand.

Nevertheless, I had to diagnose these flaws clearly as I eventually want to give an objective conclusion. I hope Josiah and cha0s are not too irritated with my observations. Being a game designer I know how this feels. You are aware of the game flaws but somehow hope people won't make too much notice of them and will concentrate only on the good things and the huge effort put in the entire product, which is the case with Lynn's Legacy. Once you realize this didn't happen(and it rarely happens) you are annoyed at best and blame people for not respecting hard work.

The graphics are excellent and there is no doubt about it. Some parts of it, namely the animation of characters, are close to being great, in the lack of a better word. I wish I had a thesaurus. :P As the game progresses the very graphics don't really lose in quality, as it is the case with the design of tiles and sprites. Josiah is obviously a talented and skilled artist but is he an equally good graphical designer(at this point) remains a question. Again, I think the size of the game is here the biggest problem. I believe he fell into a trap of sizing the game without thinking if he can fill it with enough varied and thought-out content. I suspect the design team was fixed on having 8 dungeons and didn't want to compromise on that. Perhaps it doesn't seem logical, but I think Lynn's Legacy would feel much more even and complete if one or two dungeons were discarded during production. One more thing on the topic of graphics. Since I'm already talking about graphical design(more or less) I should mention I didn't like the look of the health salesman and his name. I mean, Salesman?!? If you would ask me I would take some townsmen character, put a pointy hat on him and refer to him as to a wizard or a magician. I mean, what's a health salesman?

The music is very nice. I was never annoyed with it and few tracks, strangely the less "rich" ones, create a quite powerful atmosphere. The environmental sounds incorporated into some music tracks are a full hit. I guess the only negative comment I can think of is - I wish each dungeon featured its own track. A pathetic comment, I know.

The sound effects are truly excellent. I especially liked the Lynn's attack and hurt sound. For some reason I didn't hear her speaking in the game, though I noticed these sounds in the package. If I ever endeavor into making an ambitious project I might ask Josiah and/or cha0s for tips on creating proper sound effects. Just browsing through the net for sounds similar to those you want is obviously not enough, as everyone who played my games can testify(ugh).

The story is very good, but not impressive. I'm sure Josiah and cha0s didn't aim that high. It's relatively original and well written(developed). I remember reading someone comparing it with Matrix but I highly disagree with that comparison. There is really only one small element connecting these two stories and that's it. I mean, when I think of the zillion brain-dead simplified stories from other QB RPGs these kind of remarks seem tendentious. The strongest feature of the story is its carefully constructed development throughout the game. I did personally felt that the story was slightly stretched and over-told, but these are just trifle remarks. How they say it, I'm grasping for straws. The truth is that not many people tried to construct such a long and developing story in a QBasic game and it will probably take some time before someone attempts a similar thing in FreeBASIC. So, respect! :P

The very gameplay is excellent, which I pretty much stated while describing the experience of playing the first 3 dungeons. This is, in part, a result of cha0s' excellent(and fast) engine. Wonderful code and far beyond my capabilities. I'm discovering a new respect for him. My honest admiration cha0s. Second is the fact Josiah can draw all the frames of a character in order to enable proper multi-frame swing animations. The lack of this killed certain games by certain someone(cough-cough). Third element that makes the gameplay is the design of enemies which functions perfectly for a while. It's obvious that the gameplay is not equally excellent throughout the game, but that is only the result of poor and under-tested enemy designs in the later dungeons. Nothing I disliked in the very engine and game mechanics. Some people complained on the collision. While there is no reason to be anal about it, the mock-angled view(in the sense that it's not a top-down view) tends to confuse and makes it hard for the player to decide when to swing when an enemy is attacking from down. I could never get to hit that small black monster with a fork(I don't know how you call it in English) in Evernight before it would hit me, if it was attacking me from down. Technically the collision is perfect, but can visually fool the player. Anyway, I didn't mind this much, but since some people complained on the collision I wanted to express my thoughts on it.

Oh yes, there are few bugs I noticed. Few came as a shock since they didn't appear in the chapter one demo. These include Lynn not being animated while she pushes a rock and ghost-type of characters(cloak wearing) not being animated when tracking Lynn. Also, when you give an object to a certain character in the game(like the Nerme Idol) it does not disappear from the items switch icons. I tried to ignore these bugs with hopes they will be fixed in a future version.

Most reviews include replay value section so I guess I should say something on that. As with most of the games I reviewed, I really don't feel like playing this game over and over. And I'm sure such long games don't need to accomplish that. Since the story is complex you will probably want to beat few bosses once more, just to re-read few parts it. Due the size of the game it's definitely worth being played after few years, for the sake of nostalgia.

The game took some 8-9 hours to complete, in two sessions, with a note that I was playing it quite franticly in order to leave myself enough time to write a proper review. I don't value play time as something terribly important, but Lynn's Legacy sure deserves compliments on this. The thing is, the game almost never robs your time by forcing you to repeat certain tasks over and over or perform some unnecessarily long missions(with the exception of few long key hunts). This is the case, for example, with leveling-up in Mattress Warrior and many other QBasic RPGs(I dare to say it's the case with most of them). Lynn's Legacy doesn't do that.

Apparently, this game ended up being thrown into the RPG genre which is quite wrong. Lynn's Legacy is a pure action game with some adventure elements, or better yet, exploration elements. Where people see RPG elements in this game escapes me. Perhaps in the fact that Lynn can buy extra health points. But that's all. No other features that characterize Lynn(like stamina, dexterity, defense points, etc.) or any experience points. I doubt people will listen to me and Lynn's Legacy will most likely belong in the RPG category to majority.

So to conclude. Excellent game but not great. A huge accomplishment to respect and admire. The best FreeBASIC game yet. It will definitely be a classic in our community. Did it had a chance to become a freeware classic? We can only speculate. Josiah and cha0s had a great game in their hands, but somehow it slipped them. Lynn's Legacy failed to deliver what it promised. I hope Josiah and cha0s learned something from the development of Lynn's Legacy. Mainly, not to over-size a game if they don't have a ready content(conceptually worked-out) to fill it in. Accepting the constructive negative critics as valid is one of the steps to grow as a game designer and release an even better project one day.

If I would have to summarize all of my thoughts into one sentence I would say - I really liked the game but did not love it.

### The Verdict

> Graphics: 88 %
> Sound: 90 %
> Gameplay: 78 %
> Total score: 85.33 %

Download Lynn's Legacy here.

## Kill the Killing?

### Written By Deleter

### Killing in Games

Killing in games. Can it stop? Should it stop? Yes and no. As games are usually an attempt to recreate the universe, albeit sometimes with large or small changes, they should probably then do as it does. Which would be, sure, you can kill. Of course, in life, the object is not to kill things. So then, maybe we should discard that reality and throw out killing altogether?

From a neutral point of view, that type of game would be no worse than a game bent on killing. From a popular point of view, that game doesn’t stand a chance. A game with killing not based on killing would really be the perfect game. There is only one problem. There are no perfect gamers. And as of such, there cannot really be a total agreement on a level of killing, at least not anytime soon. Change, which is libel to come regardless of how resolute either or any side is, comes at its own pace in its own stride.

But still, lets not get metaphysical here, isn’t there another reason why killing is so rampant in games today? Is it really just because its fun, and no killing isn’t? I think not. Personally, I think killing is a much, much easier design decision than any other. When bloke #00F1A comes onscreen, if all the player needs to do is kill him, why, he doesn’t even need a name! Just an AI subroutine, a 3d model, and a gun in his hands, and the game designers are set.

That’s not to say programmers are lazy or anything. In fact, if they had a clear idea of what they were going for, there wouldn’t be much stopping them. The problem is game designers, in fact just about everyone, doesn’t know what that goal really is. The minute you give Mr. 00F1A a name, an identity, you’ve just entered a much, much deeper realm of design and intricacy. This is because you can’t just stop there, a single entity in fact would be nothing, if it didn’t not have other entity around it which to derive itself from. A cat solitarily could just as easily be a mouse, a couch, or a planet. It’s not the individual entities that have identities because they cannot support it. Rather, it’s the mouse and the house and the dog and the owner and the food dish and the kitty litter that make a cat what it is.

The problem is, what I am driving at here is still as blunt as a basketball when we really need a needle. Killing games don’t need identity, because it is just a bunch of ends. Ends are exactly what you get when you isolate identites, because again, they derive their very existence from the things around them. When everything is a separate piece, it all ends. So going from a killing game, to a “normal” one, you have to make a very difficult transition. It’s an impossible balancing act with a bunch of top heavy dominoes.

In fact, that’s an awesome way of looking at it. One person, is a very top heavy domino. Without an intricate world at his fingertips, he falls over. His identity cannot support itself and thus he devolves into something more pathetic. This is something that many people have seen in games, even in the best of those that don’t choose to kill everything. An NPC who runs over the same pathetic lines, in the same pathetic town, in front of the same pathetic house for hours and hours. Your guide repeats the same useless help while you sit frustrated at the unsolved puzzle. The butcher, who does not change a bit after you kill his son for the hell of it. The king who is still the same pain in the ass jackass even after you saved the princess and slayed the dragon.

You’ve run into these and you know it. Sure, RPG’s don’t necessarily aim to be anything special, but they still run into these problems more than other games. Most likely this is because they aren’t always totally about killing. So maybe then, making a game without killing at its center, is about playing dominoes. Perhaps start with smaller, less top-heavy dominoes. That is, don’t make a world that goes with a complex social structure. That doesn’t mean make modern day with a bunch of hermits, it means make a structure that is naturally simple. Such things as packs and tiny communities fit this bill. The other advantage of these notably smaller units is that they will be easier to set up, just like setting up a smaller amount of dominoes. The last thing you can do is to make your system simple. Sure, even with small, bottom-heavy dominos you could still set up two figure eights with several tri layer bridges, but if you just wanted to make a self supporting structure, you wouldn’t.

Likewise, your game system ought to be simple. With a human society, this translates almost directly to a simple social system. Have a handful of jobs or functions, then write out the rules governing interactions. Once this is done, write out the rules of how each individual unit will act on its own. Give it some basic needs, and set up rules to determine when it will be self-satisfying, or when it will depend on the structure and interaction rules that you have set up. Such a system, with much design, tweaking and work, could be made self-reliant. Also, with the proper placement of a player, could be a gold mine for an open RPG. It could also provide an interesting dynamic for a sim. Of course, with a slightly larger system, it could also provide fair ground for a shoot-em-up, and would probably provide some interesting dynamics, though it could get boring once all the NPC’s are wiped out.

What I suggest is of course nothing but my speculation on what is necessarily to get PC games off of killing.

-First, you must realize that killing should not be forbidden, it just shouldn’t be given the spotlight.

-Second, just taking killing out of its place does not make a good game, in fact it makes a crappy one.

-Third, the game must be designed to be self-supporting, which is probably the hardest part. Balancing all the elements and providing the necessary identity for the entities is a challenge, even at a very simple level.

-Fourth, this is a rant and as of such is worth only its words; if it were a technical document you could no doubt ask for much more. Since it is nothing more than a collection of my ideas and thoughts on the subject, it aspires to be no such document, but instead more of a broadcast of what I hope contain at least a fragment of coherent thought for you, and not just a waste of time. As of such, I hope you enjoyed it, even if you didn’t get anything useful on it.

If you have anything thoughts on the subject, you can find me on the freebasic.net forum, or at deleter8 {at} gmail {dot} com if for some reason you are allergic to forums ;).

## A serious article debating the pros and cons of FreeBASIC

### written By Z!re

Hi and welcome to my article, let me start of by saying FUCK YOU.

Yup, thats right, a big FUCK YOU. Now, here's where you stop reading if you're an uptight idiot who is offended by random crap he/she finds on the internet.

You are stupid, all of you. This includes me ofcourse.

One thing that really pisses me off, is jewish spoiled brats who refuse to admit they're jews. Even when they themselves state they are jews.

If anyone, other than themselves, state the obvious fact that they are jews, they blow up.

My many years of studying this, leads me to the conclusion that they are just fucking retards. That, and they probably feel sad to have their dicks cut to shreds just because some made up action figure says it's cool.

There's another thing that really pisses me off, action figures. They're so stupid.

'Thou shall not kill' What The Fuck!? What kind of an action figure is that? I'd buy the 'Kill the kids with the RPG launcher' action figure anyday!

Although, maybe the first action figure is being sarcastic? I mean, many of the retards who spend $99.99 on him go around killing people, they always have, ever since production was started sometime around 500AD. And the manuals! Have you guys read those things? Insane, thousands of pages of contradictions and bullshit. There's even a comitte who decides what bullsh*t goes and bullshit doesent. Give me the proper manual already! Does the arm attach to the neck or what!?

Know what? Nevermind, I'll just go ask the retarded jewboys.

Retarded jewboys, usually found hanging in groups with the n00btards and fanbois. To be avoided at all costs.

One time, my mother told me not to make fun of other people.

So I roundhouse kicked her in the throat, "shut the fuck up bitch!"

If all the jewbous, n00btards and fanbois got together, they'd be strong, they could even challenge like, one or two of the somewhat smart people in a game of chess. Well, maybe not chess, but atleast tic-tac-toe! Ofcourse the jewboys, n00btards and fanbois are too fucking stupid to even form coherent sentences.

Meet Chandler.

Chandler is anormal teenage boy, he has a happy home, and a loving family.

But Chandler has a terrible illness. What is it you might ask? Cancer? No.

Chandler suffer from the horrible AOL infection. The effects range from such humble manifestations as writing 2 instead of to. But it doesent end there, fullblown cases of AOL have show a tendency to frown upon common sense and logical reasoning. Something which severly hinder their progress in life.

Many AOL disseased people still flip burgers and clean greasy pots at the high age of 38. Though, most never make it to that age, they die young caused by mercy killings fom the somewhat intellectuals.

Then we have the physics experts, so what if two trains travel at the speed of light, noone gives a shit anyways.

Lets break down the theory:

Two trains, we assume passenger trains that allow observers, traveling towards each other

Two rails, we assume we dont want the trains to collide, would they even collide at the speed of light? Who knows, I dont, and I dont even give a d*mn!

A shitload of people who wanna see a blur pass by their window as the trains pass each other

Fact:

Two cars passing each other do not travel at A+B speed, they travel at A or B speed. Assuming car A and car B

Conclusion:

Put in oven for 15-20 minutes. Serve hot with a hint of pepper.

Please, dont applaud me. I cant stand it.

Whats wrong with people today? Stand up, grow a spine. If something is crap, dont say it's awesome!

What? You think the world is filled with nice people who will hire you, just because you 'showed some effort'?

If you cant fucking do the job, get the fuck out of my office!

And no, I dont want to see your 'hello, world!' program! I swear, you show it one more time and I'll rip your fucking skull out, through your a$$!

Stay tuned for the next article, where I will debate, among other things, Shakespear and drug addicted retards

> [Cop-out]
> The opinions expressed in this article in no way represent those of QBExpress.
> [/Cop-out]

> -Imortis Inglorian

## Random Musings

### Written By Scolizer

I (like almost all of you) have come a long way since the QBasic days. I know many different languages, from different paradigms (procedural, functional, logic, and OOP versions of all three), and in different contexts (console, GUI, web, database).

This morning, I was lying in bed, being nostalgic, and I realized: I've never had as much fun programming as I did when I was programming in QBasic.

Why is this? I mean, compared to the languages I know today, QBasic sucks - one global namespace, extremely difficient libraries, no higher order functions, very limited custom types (no OOP, e.g.), no uniform input/output mechanism, and no macros.

So why was QBasic still so much fun? Here are a few of my guesses:

1. I did it for fun - making games, solving puzzles. Nobody was paying me to do it, I wasn't trying to change the world the open source, and I didn't have to do some teacher's crappy assignments. It was just for me and the other teenagers who would gawk at the cool things we could do.
2. I was naive - I had no idea how crappy my programs were, and I thought I was the greatest programmer in the world.
3. I knew the whole language - QBasic is small. Every other language has so many libraries attached with it that 50% of my time is spent browsing the manual. Granted, those large libraries make me more productive, but doing the plumbing myself is actually kind of fun sometimes.
4. Great IDE - I still haven't found an IDE as awesome as the QBasic one. The QBasic IDE was still better than Visual Studio, Eclipse, IDLE, RHINE, and Emacs of today. What made it awesome?

- Full screen editor - QBasic immersed you in it's own world. I did most of my QBasic development in pure DOS, and that's the way I liked it. No other processes running; just me and the language.
- Context sensitive help - just press F1 and you've got syntax, semantics, and examples right there. The F1's of today either don't exist, are not integrated (involves much resizing of windows), are difficient in documentation ("but how do I USE the function?"), or take a minute to load (e.g. Visual Studio)
- Stepwise debugging - F8 to step, F9 to set/reset a breakpoint. And stepping was FAST.
- Rapid navigation - F2 to see all your subs/functions, F6 to switch windows (especially useful in help mode), F4 to switch between run mode and edit mode, F5 to run. And all of the shortcut keys worked INSTANTANEOUSLY. No garbage collection, memory swapping, waiting for compilation, or cruddy window managers to slow you down.
- Immediate mode - want to run some code RIGHT NOW? Just do it in the Immediate window.

5. Community - (e.g. you guys!). Granted, there's a community for just about every language out there, but QBasic is the only one I know of that teaches you how to do antialiasing, do X86 assembly, make your own font editor, roll your own 3D graphics, write a simple musical melody, reverse engineer an EXE file, and handle multiple palettes.

When did I become such an idealist - searching for a language that gives me power instead of a language that gives me fun?

What do you guys think? Have you found a language today that makes programming as fun as it used to be? (Are you still looking, or have you given up?)

## Searching For The Unknown
Tunnel Striker ver.1.5 by INT Software, 1998

### Written by Lachie Dazdarian(July, 2006)

### Introduction

Yes, I'm back with another article. Since I'm practically done with my exams(wee!) and will be online few days after starting this article, I thought it wouldn't be bad to whip something up before my summer exile, which will probably last till the very end of August.

As you already see, I'm bringing you another issue of "Searching For The Unknown" column, featuring a 3D target shooting game entitled Tunnel Striker. I must admit that even after so long time since the last issue of the column I'm not sure if this game is right for it or if any other on my list would do too. I simply fail to find another game for which I'm sure it can result in an interesting and average sized article.

Nevertheless, the cake is already bitten(I'm making this up :P) so let's hope I can make the article worthwhile my trouble and your attention.

### The Review

By simply being a finished 3D QBasic game, Tunnel Striker is already interesting enough. Of course, there are quite few superior 3D QBasic games to Tunnel Striker but let's not ask too much here.

The gameplay of Tunnel Striker is rather simple. Each level is a rectangle tunnel through which you fly forward. I can only assume it's in some flying craft but that's nowhere specified. The goal of each level is to hit a set number of targets with a set amount of ammo(number of shots). The game is mouse controlled and you steer the craft by moving the target mark. This is kind of awkward since steering and aiming is connected, but I guess that's how the designer imagined it. A really nice thing is that you can't slam into the tunnel walls.

As you fly forward cyan targets shaped like sticks pass by, together with the red obstacles you need to avoid. Aiming is very tricky since every movement of the target mark causes the movement of the craft. The safest method to make a hit is to wait for targets placed in the corners while being in the very same position, since the tunnel walls stop the sideway movements of the craft. This can take a lot of time so you will most likely be tempted to hit the targets on other positions. That, however, usually ends up with nothing but it's a nice way to spend time until a target placed in a corner arrives. A smart feature in targeting is the fact that the target mark lights up when it's on a target. That helps a lot. Each time you shoot you need to wait for some 2 seconds for the weapon to reload. This prevents you to make double or triple shots in case the first or the second was really close to hit.

The game features 10 levels and already on the 5th or 6th level you are given just enough ammo to hit the required number of targets and no more, which is really challenging.

The simplicity of the gameplay has its positive aspects but also causes few undesired effects. In other words, the game is quite addictive and fun but also repetitive and sometimes frustrating. In the execution of the gameplay I would only like to complain on the fact that the game doesn't end when the remaining number of targets to hit exceeds the remaining ammo. You need to shoot out the remaining ammo for the game to end or just press ESC.

You can already see that the graphics are nothing spectacular. Simple vector-based graphics featuring single color surfaces. I don't have much complaints on this very fact but I would have liked if the game colors(of walls, targets and obstacles) changed with levels. It's something that could have been easily done so I assume the designer didn't think of it.

The graphical design also could have been better. It looks incoherent and unpolished while many places in the game(like the level starting message) look like last minute work done in a hurry. And the usage of the PRINT statement is a big minus. Still, a cool thing one the main menu are the 3D effects featuring rotating options or the entire main menu disappearing into the screen when you exit the game. The designer obviously knows his 3D.

Tunnel Striker allows you to play the game in two graphical modes. They are referred to as "full screen" and "non-full screen" mode but that's not a really good way to describe them. The full screen mode basically means playing without a "cockpit" drawn on the edges of the screen. The non-full screen mode features this cockpit but it's really ugly(third screenshot in this article) and I don't recommend playing with it. Luckily, the default mode is full screen.

While talking about the game graphics and design I almost forgot the feature I liked the most in Tunnel Striker - music. The game features several tracks for different parts of it(main menu, level starting, level track) but the most memorable is the level(in-game) track, which is the same for all the levels. It's really brilliant but I'm not sure if it's original. If it is, great work, if it is not, excellent pick. It has that specific "computer game sound", creates an atmosphere of suspension and also has a sort of mystic travel/whatever feel. Well, just hear if for yourself. The game also includes Sound Blaster sound effects which are ok. No complaints there.

Like I said before, the game is relatively addictive and fun to play but not really on a long run. Well, not in my case. The game kept me hooked on the screen for some 3-4 hours, first time I played it. I managed to reach 6th or 7th level. I forgot. But on the second try, which was done for the purpose of this article, the game lost that initial lure and I just didn't have enough will to play it more than to 4th level.

Despite all the complaints, I highly recommend this game to everyone. I think most of you will like it for an hour or two. For collectors interested in the history of 3D game design in QBasic this is, of course, a must have.

The game package comes with the source code so Tunnel Striker is also suitable for a FB port. I'm personally not very motivated since I just ported Vector X, but perhaps some of you might be. The game has space for improvements, mostly in graphical design but also few in gameplay too(like adding a game mode with time limited levels or something).

> Final score
> 5.2/10

### Get Tunnel Striker

To download Tunnel Striker click here: tunnelstriker.zip (360 KB)

A note: You will probably need VDMSound to hear the music. Also, if you run the game without VDMSound, the sound effects might give you problems(slowdown the game) so you will probably have to disable them. The game is compiled and works fine on my PC with Windows XP installed(if we forget the sound problems).

Wow! This was short, hope nobody minds(stop rolling with your eyes SJ!). I will definitely do one or more articles/reviews during the summer. Many things on my todo list, one of which includes porting LONG to FB.

Until next time, stay among the living(or I will kill you). :P

## Join The Good Fight: The Anti-”Holy War” Movement

### Imortis Inglorian

### Say What Now?

This is another rant article. I want to express my thoughts on a topic that affects us all. It is one that is seen as an annoyance, but has a much more detrimental effect than can be seen short term. Not everyone sees it as a problem, and some even enjoy and thrive with it. For those who haven't guessed yet, I'm talking about the all mighty Flame War. But not just any flame wars, these are special. These are ones I like to call “Holy Wars”. These are flame wars that take on an almost religious intensity. I will once again break this down into categories like the article I did in Issue #20.

### Category #1: The “You Don't Think Like I Do So You Are Wrong” Category

This little “Holy War” pops up in many different forms and guises. Many of you may remember the numerous battles waged over the use of GOTO. Or perhaps the skirmishes over topics like Windows vs. Linux? Open Source Software vs. Commercial Software? [Blank1]BASIC vs. [Blank2]BASIC? Programming Language A vs. Programming Language B etc... More often than not these are started because someone states an opinion that someone else does not agree with. That someone else will respond by telling their own opinion and the original someone will take it as a personal attack. And thus the grenades begin flying.

The issue here is that people have always been inherently trigger happy. They just can't wait to “defend” themselves. Before you break out the riot shields make sure there is a need for them, because there are always weapons behind them, held at the ready. Don't get me wrong, I'm all for a little bit of butt kicking in the right situation, but it is never ALWAYS the answer. It always amazes and saddens me to see people at each other's throats over such small and trivial things.

The biggest problem here is that arguing will never convince someone to change. The more you fight against someone, the more that person will be convinced of their original opinion. It's a loosing battle from all sides. If the person really is wrong, they loose because they are still wrong, and you loose because you have wasted your own precious time and effort.

Another problem with this type of argument, is that it will reappear again and again throughout history and on into the future. This is the way I see it: Beating a dead horse is a waist of time, effort, and beating implements.

### Category #2: The “You Must Be Some Kind Of Idiot” Category

This one comes in when someone makes a statement or asks a question that shows a lack of information on their part. Many times such a statement or question is followed almost instantly by a response like this:

“RTFM, stupid.” (For those who don't know RTFM = “read the frickin' manual”)

It's true that the “Manual” may be on public display for all to see. It's true that the forum may contain numerous references to this same thing. However what you see as on display may be similar to what Arthur Dent said in Douglas Adams book, “The Hitchhicker's Guide to the Galaxy”:

“On display? I had to go down to the basement... All the lights were out and it was in a bathroom stall with a sign on the door that said 'Beware of Jaguar'!”

This is hopefully a exaggeration, but I think my point is made. (Also I don't believe that is the actual quote, but close enough.) Many people are not as web/tech/computer savvy as the rest of us. They might not know what to do. To mangle an old saying:

“If you teach a man to fish, he will feed himself for a lifetime. If you tell him, 'Go learn how to fish and to STFU!', you will probably never see him again.”

Is it that hard to repeat yourself? You could even keep a list of forum topics that come up frequently in a text document so that when the question comes up, all you have to to is copy and paste a link to it. If someone KNOWS what they should do, but doesn't do it anyway, then you can yell at them. That's where you should use the beating implements. Not on the dead horse...

### Category #3: The “I Don't Like You So I Will Be Harsh To You Because I Can” Category

This often happens when a person has made an annoyance of themselves in the past. I can understand being quick to judge someone based on their past behavior, but it is possible for a person to change their ways. It is best to treat this person how you would like to be treated. And for that to happen, you have to be truly honest with yourself about how you want to be treated. I'm sure many people will look at that statement and say, “I hope someone would do that to me so I would change.”

This one can come out of the blue at any moment and bring up any and all mistakes you have ever made, just like an ex-girlfriend. Ever done something stupid? I know I have. I'd like to think that I have atoned for them, but I'm sure at some point in my life, this category will rear it's ugly head and hit me with the photos from the New Year's party right between my eyes. No one is immune.

### Category #4: The “I Like To Start Arguments” Category

As strange as it sounds, there are people who enjoy stirring up fights. These people will say things that they know will start a brawl, just to see the aftermath. These people are often easy to spot, and thus, easy to avoid. Just don't “feed the trolls” and your in the clear.

### In Conclusion:

All of these thing can be avoided if you put in a little effort. If you would like advice on how to put in this effort, may I suggest “How To Win Friends and Influence People” by Dale Carnegie. It's an excellent read for anyone, really. Try to be a bit less confrontational. Your freedom of speech is not being infringed upon by way of tact. I promise. If you are too blunt, you will drive away people who could one day become a major contributer to our community.

All I ask is that people try to stop polluting our forums and lives with pointless battles. There are a million other ways to spend your time and energy. I will not try to force anyone to join my cause because that would be doing exactly what I frown upon. Instead, I ask that people consider what they are doing and what I have said. So please, join the Anti-Holy War Campaign today, and help make tomorrow better for everyone.

## Comics

### By Redcrab, Rattrapmax6, tunginobi, and Z!re

RedCrab sent a new 0 1 comic, Rattrapmax6 sent in a new QB Horse Humor, tunginobi sent in several more Stickblob comics, and Z!re has several Qmunity comics! Enjoy!

## How To Use EMS In The QBasic Enviroment Without Bugs

### Written By Paul Holmlund (kiyotewolf)

My name is Paul Holmlund. My nickname is Kiyote Wolf, and in the future I will probably mention my name as that alone.

My knowledge I wish to spread to the Qmunity is this:

### HOW TO USE EMS IN THE QBASIC ENVIRONMENT WITHOUT BUGS

Tip 1:
Have you seen your program try to access pages of EMS memory only to find that the pointer has been lost in the middle of running and your program sits and malfunctions?

Tip 2:
Have you draw multiple graphics pages in EMS and find them only to be delivered to the screen as garbage or other undesirable gibberish?

Tip 3:
Have you had a sound load into EMS and find that it is scratchy and garbled making it unusable?

### Answer!

Put the pointer redirect command, memory move and pointer retrevial commands into DEF FN?????........:END DEF blocks!! I have tried and tried to use EMS for a long time, and tearing my hair out as to why my commands add up to missing data. If you make the pointer that changes the 16K pointer for EMS memory block chunks, grab 16/64K bytes and drop it into a CONVENTIONAL MEM. array, or refresh the screen from a direct EMS to VidMem PageCopy routine as a part of the MAIN BODY of the program this way! You can try to put all of these commands into a SUB or FUNCTION, and as I have found out, QBasic must reset the EMS pointer each time it drops out it's stack and processes SUB/FUNC routines. Basically, what I am trying to say, you can put the EMS change routines into SUB's and FUNC's, but trying to recursively access these subroutines from another SUB or FUNC leads to a loss of the pointer. If you call all of these SUB/FUNC's needed to change or modify EMS from the MAIN BODY in a DEF FN

>     () Start EMS Support - Reserve EMS Space
>     // Define DEF FNxx routine calling EMS Sub's/Func's
>     // Define SUB that calls the DEF FNxx routine
>     [] Call the SUB to do complex routine (which calls DEF FNxx calling EMS SUB)
>     [] Continue until done
>     () End

^______ This comes from PLC/Flowchart design coding, which I picked up for abbreviated code flowcharting. It seems to help me develop rapidly.

### Conclusion

I hope this helps a LOT of people!!!!

BTW, my site is http://www.freewebs.com/kiyotewolf/

I have a guest book and am planning on making pixel scrollers and some side scrollers soon.

For those of you that programmed the C=64 and remember the wedge in 6502 Asm, I have found a way to develop the wedge for QBasic programmers, that can operate VERY fast in the background without requiring a TIMER:WHILE/WEND or other time halting operation. It's kinda neat!

Drop me a line if you wanna hear my ideas or chit chat!

kiyotewolf@yahoo.com

.:Ciao! .:Kiyote Wolf

## Chain-like Animation Tutorial

### Written by Lachie Dazdarian(August, 2006)

### Introduction

This tutorial is basically a showcase of my attempts to create a chain-like animation. In my usual style, it will be written on a dummy-level. I hope you won't be annoyed with that.

About what kind of animation am I talking about? It's a style of animation like on this screenshot(the dragon):

This kind of animation also appears in The Griffon Legend, and Josiah Tobin referred to it, in his review of The Griffon Legend, as bio-animation, though I failed to find it under that name on the net. My google skills are appalling.

So allow me to call this chain-like animation, since it really functions like a chain. Another valid descriptions could be string-like animation too, because these kinds of animations are often more similar to a string connecting beads than to a chain.

### The Stuff

Let's just say we want to create a snake consisted of [insert number] blobs and be able to move it around the screen. The blobs should be a part of one chain/string and move in that manner.

Before all, we should decide how we want to declare our chain(s). My idea is to declare an array defined with two elements, first representing the chain number and second every specific ring(piece, blob, bead, whatever) of that chain.

Like this:

>     const numofchains = 10
>     const numofrings = 50

>     DIM SHARED MyChain(numofchains, numofrings) AS MyChainType

numofchains will represent the maximum possible number of chains that can be simultaneously active and you don't have to declare it like a constant. numofrings will represent the maximum number of rings(pieces) each chain can feature. Again, you don't have to declare it like a constant. I could have done it like this too:

>     DIM SHARED MyChain(10, 50) AS MyChainType

But declaring these numbers as constants allows us more flexibility, in case we want to connect them with certain FOR loops and be able to change our game/program parameters faster. With a chain declared on this way we must have in mind that managing a chain piece MyChain(10, 51), MyChain (11, 20) or any other out of bounds will result in shit hitting the fan. If you want your game to feature chains consisted of 100+ pieces simply change the numofrings constant accordingly.

Before 'DIM SHARED MyChain(numofchains, numofrings) AS MyChainType' we need to define the "MyChainType" user defined type. This is how I constructed it:

>     TYPE MyChainType
>     X AS SINGLE
>     Y AS SINGLE
>     OldX AS SINGLE
>     OldY AS SINGLE
>     Sprite AS INTEGER
>     Mode AS INTEGER
>     Exists AS INTEGER
>     Length AS INTEGER
>     PullDistance AS INTEGER
>     EndDistance AS INTEGER
>     Fixed AS INTEGER
>     Speed AS SINGLE
>     END TYPE

Some of these variables don't make much sense now but will become later. X and Y speak for themselves, Sprite will represent the sprite that makes the piece/ring, Exists if a chain piece is active or not, PullDistance will define the distance on which one piece starts to pull another, EndDistance the distance on which one peace will prevent the other to move any further in case one of the pieces is fixed(a chain with a ball hanging on the wall). Speed will define the speed of movement in pixels of every chain piece.

Before all let's set our graphic mode:

>     SCREENRES 640, 480, 8, 2, 0
>     SCREENSET 1, 0
>     SETMOUSE 0,0,0

After than we should set the number of chains and rings per chain in our specific program:

>     set_num_of_chains = 1
>     set_num_of_rings = 25

Make these variables as shared. I decided to have one chain consisted of 25 pieces/blobs. Like I already said, it will represent a snake.

Before working with the chain we need to initiate proper values of every piece in the chain:

>     FOR initchain = 1 TO set_num_of_chains
>     FOR initring = 1 TO set_num_of_rings
>     MyChain(initchain, initring).Exists = TRUE
>     MyChain(initchain, initring).Sprite = 1
>     IF initring = set_num_of_rings THEN MyChain(initchain, initring).Sprite = 2
>     MyChain(initchain, initring).PullDistance = 12
>     MyChain(initchain, initring).EndDistance = 14
>     MyChain(initchain, initring).Speed = 2
>     MyChain(initchain, initring).X = 320
>     MyChain(initchain, initring).Y = 20 + initring * 7
>     NEXT initring
>     NEXT initchain

This initiates a chain on the horizontal center of the screen with every new chain piece being 7 pixels more close to the bottom of the screen(MyChain(initchain, initring).Y = 20 + initring * 7). Note the pixel "distance" variables I picked. And note how the last chain piece is of different look(sprite variable) since it will represent the snake's head.

My loops usually look like how it follows so I'll use the same in this program:

>     DO

>     screenset workpage, workpage xor 1

>     CLS

>     MyChainLayer

>     workpage xor = 1

>     do
>     loop until timer& - st >= (1/fpslimit)
>     st = timer&

>     SLEEP 1

>     LOOP UNTIL MULTIKEY(SC_ESCAPE)

Be sure to declare fpslimit as a constant with:

>     const fpslimit = 80

Where fpslimit will define the speed of our program in frames per second.

Also, you should declare workpage and st like this:

>     DIM SHARED workpage
>     DIM SHARED st AS DOUBLE

Don't forget to declare the usual TRUE/FALSE constants too:

>     const FALSE = 0
>     const TRUE = 1

MyChainLayer is a subroutine we need to declare with:

>     DECLARE SUB MyChainLayer ()

This sub will include all the code that connects the chain pieces into a chain.

After the main loop the code goes:

>     SUB MyChainLayer ()

>     ' Loop through our chains and chain pieces of
>     ' every chain.
>     FOR countchain = 1 TO set_num_of_chains
>     FOR countring = 1 TO set_num_of_rings

>     ' Store the chain piece position before moving it.
>     MyChain(countchain, countring).OldX = MyChain(countchain, countring).X
>     MyChain(countchain, countring).OldY = MyChain(countchain, countring).Y

>     ' If not moving the last chain piece(IF countring + 1 <= set_num_of_rings)
>     ' and if the current piece is not fixed move it!
>     IF countring + 1 <= set_num_of_rings AND MyChain(countchain, countring).Fixed = FALSE THEN
>     ' If the next chain piece(countring+1) is more than PullDistance pixels left from
>     ' the current chain piece(countring), move the current chain piece toward left.
>     IF MyChain(countchain, countring).X-MyChain(countchain, countring+1).X > MyChain(countchain, countring).PullDistance THEN
>     MyChain(countchain, countring).X = MyChain(countchain, countring).X-MyChain(countchain, countring).Speed
>     ' Align the current piece with the next piece it follows, if it's higher
>     ' or lower from this piece. This part is tweaked in the sense of
>     ' alignment speed and requires tweaking with speed changes.
>     IF MyChain(countchain, countring).Y  >  MyChain(countchain, countring+1).Y THEN MyChain(countchain, countring).Y = MyChain(countchain, countring).Y-ABS(MyChain(countchain, countring).Y-MyChain(countchain, countring+1).Y)*0.08*MyChain(countchain, countring).Speed
>     IF MyChain(countchain, countring).Y  <  MyChain(countchain, countring+1).Y THEN MyChain(countchain, countring).Y = MyChain(countchain, countring).Y+ABS(MyChain(countchain, countring).Y-MyChain(countchain, countring+1).Y)*0.08*MyChain(countchain, countring).Speed
>     END IF
>     ' If the next chain piece is more than PullDistance pixels right from
>     ' the current chain piece, move the current chain piece toward right.
>     IF MyChain(countchain, countring).X-MyChain(countchain, countring+1).X < -MyChain(countchain, countring).PullDistance THEN
>     MyChain(countchain, countring).X = MyChain(countchain, countring).X+MyChain(countchain, countring).Speed
>     IF MyChain(countchain, countring).Y > MyChain(countchain, countring+1).Y THEN MyChain(countchain, countring).Y = MyChain(countchain, countring).Y-ABS(MyChain(countchain, countring).Y-MyChain(countchain, countring+1).Y)*0.08*MyChain(countchain, countring).Speed
>     IF MyChain(countchain, countring).Y < MyChain(countchain, countring+1).Y THEN MyChain(countchain, countring).Y = MyChain(countchain, countring).Y+ABS(MyChain(countchain, countring).Y-MyChain(countchain, countring+1).Y)*0.08*MyChain(countchain, countring).Speed
>     END IF
>     ' If the next chain piece is more than PullDistance pixels up from
>     ' the current chain piece, move the current chain piece toward up.
>     IF MyChain(countchain, countring).Y-MyChain(countchain, countring+1).Y > MyChain(countchain, countring).PullDistance THEN
>     MyChain(countchain, countring).Y = MyChain(countchain, countring).Y-MyChain(countchain, countring).Speed
>     ' Align the current piece with the next piece it follows, if it's left
>     ' or right from this piece. This part is tweaked in the sense of
>     ' "alignment speed" and requires tweaking with speed changes.
>     IF MyChain(countchain, countring).X > MyChain(countchain, countring+1).X THEN MyChain(countchain, countring).X = MyChain(countchain, countring).X-ABS(MyChain(countchain, countring).X-MyChain(countchain, countring+1).X)*0.08*MyChain(countchain, countring).Speed
>     IF MyChain(countchain, countring).X < MyChain(countchain, countring+1).X THEN MyChain(countchain, countring).X = MyChain(countchain, countring).X+ABS(MyChain(countchain, countring).X-MyChain(countchain, countring+1).X)*0.08*MyChain(countchain, countring).Speed
>     END IF
>     ' If the next chain piece is more than PullDistance pixels down from
>     ' the current chain piece, move the current chain piece toward down.
>     IF MyChain(countchain, countring).Y-MyChain(countchain, countring+1).Y < -MyChain(countchain, countring).PullDistance THEN
>     MyChain(countchain, countring).Y = MyChain(countchain, countring).Y+MyChain(countchain, countring).Speed
>     IF MyChain(countchain, countring).X > MyChain(countchain, countring+1).X THEN MyChain(countchain, countring).X = MyChain(countchain, countring).X-ABS(MyChain(countchain, countring).X-MyChain(countchain, countring+1).X)*0.08*MyChain(countchain, countring).Speed
>     IF MyChain(countchain, countring).X < MyChain(countchain, countring+1).X THEN MyChain(countchain, countring).X = MyChain(countchain, countring).X+ABS(MyChain(countchain, countring).X-MyChain(countchain, countring+1).X)*0.08*MyChain(countchain, countring).Speed
>     END IF
>     END IF

>     ' If a chain piece exists draw it!
>     ' According to the piece sprite draw a specific kind
>     ' of blob. In a proper game CIRCLE statements should
>     ' be replaced with PUT and memory buffers holding the
>     ' blob sprites should be connected with
>     ' MyChain(countchain, countring).Sprite.
>     ' Sprite = 1 ' green blob
>     ' Sprite = 2 ' red blob(snake's head)
>     IF MyChain(countchain, countring).Exists = TRUE THEN
>     IF MyChain(countchain, countring).Sprite = 1 THEN
>     CIRCLE (MyChain(countchain, countring).X, MyChain(countchain, countring).Y), 15, 2, , , , F
>     CIRCLE (MyChain(countchain, countring).X, MyChain(countchain, countring).Y), 15, 118
>     LINE (MyChain(countchain, countring).X-5,MyChain(countchain, countring).Y-5)-(MyChain(countchain, countring).X-4,MyChain(countchain, countring).Y-6), 47
>     END IF
>     IF MyChain(countchain, countring).Sprite = 2 THEN
>     CIRCLE (MyChain(countchain, countring).X, MyChain(countchain, countring).Y), 15, 40, , , , F
>     CIRCLE (MyChain(countchain, countring).X, MyChain(countchain, countring).Y), 15, 4
>     LINE (MyChain(countchain, countring).X-5,MyChain(countchain, countring).Y-5)-(MyChain(countchain, countring).X-4,MyChain(countchain, countring).Y-6), 43
>     END IF
>     END IF

>     NEXT countring
>     NEXT countchain

>     END SUB

The code mostly speaks for itself. The only thing that might confuse you is the alignment of pieces as the current piece follows the next one. If you would REM these alignment lines you would get crap. I'll try to explain the alignment speed like this. Imagine the snake moving left or right while the pieces are aligned vertically. In this specific case, the alignment speed represents the speed of pieces aligning with one another horizontally, since the snake's head is moving horizontally. I devised this type of formula(vertical alignment):

>     IF MyChain(countchain, countring).Y > MyChain(countchain, countring+1).Y THEN MyChain(countchain, countring).Y = MyChain(countchain, countring).Y-ABS(MyChain(countchain, countring).Y-MyChain(countchain, countring+1).Y)*0.08*MyChain(countchain, countring).Speed

As you see the very speed of alignment is in:

>     ABS(MyChain(countchain, countring).Y-MyChain(countchain, countring+1).Y)*0.08*MyChain(countchain, countring).Speed

And depends on the absolute distance of two blobs vertically and the global speed of blobs. It's all multiplied with 0.08, with different numbers giving different results. Let's call that number the alignment factor. Lower numbers make the snake too stiff while with higher numbers the curves the snake makes are too sharp. Try it yourself. Also, the lower the global speed is, the effect is better. So higher FPS values are advisable since then you can use lower pixel speeds.

The entire code so far: codever1.txt

Compile this and you'll get a snake on the screen. Yay! But this is no good to us if we can't move the head or connect it with some movement algorithm. So just add this code in the main loop after 'MyChainLayer' sub call:

>     IF MULTIKEY(SC_RIGHT) THEN MyChain(1, set_num_of_rings).X = MyChain(1, set_num_of_rings).X + MyChain(1, set_num_of_rings).Speed
>     IF MULTIKEY(SC_LEFT) THEN MyChain(1, set_num_of_rings).X = MyChain(1, set_num_of_rings).X - MyChain(1, set_num_of_rings).Speed
>     IF MULTIKEY(SC_DOWN) THEN MyChain(1, set_num_of_rings).Y = MyChain(1, set_num_of_rings).Y + MyChain(1, set_num_of_rings).Speed
>     IF MULTIKEY(SC_UP) THEN MyChain(1, set_num_of_rings).Y = MyChain(1, set_num_of_rings).Y - MyChain(1, set_num_of_rings).Speed

>     IF ABS(MyChain(1, set_num_of_rings).X-MyChain(1, set_num_of_rings-1).X) > MyChain(1, set_num_of_rings).EndDistance THEN MyChain(1, set_num_of_rings).X = MyChain(1, set_num_of_rings).OldX
>     IF ABS(MyChain(1, set_num_of_rings).Y-MyChain(1, set_num_of_rings-1).Y) > MyChain(1, set_num_of_rings).EndDistance THEN MyChain(1, set_num_of_rings).Y = MyChain(1, set_num_of_rings).OldY

This moves the last chain piece in chain 1 according to pressed arrow key. The last two lines prevent the head to move any further if you make one chain piece fixed, which we'll do later.

Compile the code again and move the snake. You should get results like this:

Change the number of rings if you like, or the distance between them. This is the experiement I did with PullDistance of 22 and alingment factor of 0.04.

Now, what if one chain piece, preferably the first one, is fixed/constrained to a, let's say, body of a monster. The next changes allow us to use our chain-like animation code for that very kind of situations.

At the end of chain initiation just put:

>     MyChain(1, 1).Fixed = TRUE

This flags that the chain 1, ring 1 is fixed. Only two extra lines are needed and put them inside MyChainLayer, before 'IF MyChain(countchain, countring).Exists = TRUE THEN':

>     IF countring > 1 AND ABS(MyChain(countchain, countring).X-MyChain(countchain, countring-1).X) > MyChain(countchain, countring).EndDistance THEN MyChain(countchain, countring).X = MyChain(countchain, countring).OldX
>     IF countring > 1 AND ABS(MyChain(countchain, countring).Y-MyChain(countchain, countring-1).Y) > MyChain(countchain, countring).EndDistance THEN MyChain(countchain, countring).Y = MyChain(countchain, countring).OldY

They restore the position of a chain piece if it goes more than EndDistance from a chain piece preceding it, which goes all the way to the root(number 1) chain-piece. I recommend you to REM these lines if you are not going to use fixed chain pieces.

The altered code: codever2.txt

Compile it, pull the snake down as much as possible and them move left/right. This should result in a desired effect, the one you would like to have in a game. Check the next screenshot(it's rotated by 90°).

Don't be afraid to experiment with the distance variables and the alignment factor to suit your needs.

I must admit that the code related to fixed chain pieces is far from satisfactory, but here ends the scope of my method. I also tried to create an example program with metal balls hanging from the ceiling and swinging using this code, but I couldn't get them behave on a desirable way. I could mock it up but that wouldn't be this method.
Download the final version of the code(the alignment factor is a variable!) with a compiled executable: chain_like_anim.zip

Hopefully, some of you will find this code insightful when working on a project featuring chain-line animations.

If you construct something better and more versatile please share it with the community. I know this can be done much better.
Cheers!
~ Lachie Dazdarian (lachie13@yahoo.com)

## Simple Ciphering for Securing Systems
Part I

### Written By Imortis Inglorian

### What do you want, now?

Well, I finally discovered an area where I might be of some real use to the community. When I was but a small boy, I had a fascination with ciphers, secret codes, and the like. I built up quite a knowledge base, and only used it a few times. (I won a few bets with it by breaking a few “uncrackable” codes.) Anyway, Not many days ago, I was at a friends place looking at their bookshelf. On it was a book of “Whodunit” puzzles, many of which included cryptograms of one form or another. I quickly dispatched of the cryptograms, even though the other puzzles got the best of me. It was then that I felt a renewed vigor in the cryptography interest of mine. I soon realized that it has major potential as a security measure in programs of many types.

### And I should care why?

To be honest, I'm not sure how many people will be able to use this information. However, I have the knowledge practically burning a hole in my brain, trying to be of use, so I figured I would pass it on to the good folks who read this magazine.

Cryptography is fairly complex, so I decided to break it up into several parts. Each part will cover a single system. I will describe how to make a cipher of this type, and then show you how to break a cipher of this type. I do this to show you where the security faults lie in each system, so that you can modify the system to your own needs and make it more secure.

Well, enough Jibber Jabber! On to the article!

### What is a cipher?

Well, good old Danny Webster defines a cipher as a “method of secret writing”. How is this useful to a programmer? Good question. You can use it to conceal save data in your game, or perhaps to hide string information in your complied .exe. There are many other uses, but I'm going to leave it up to the reader to figure them out. (Read as: “I couldn't think of anything else...”)

### Cipher # 1: Substitution

A substitution cipher is one where in there is a constant change of characters. The classic example is the code where each letter is replaced by a number between 1 and 26. Like so:

>     A=1
>     B=2
>     C=3
>     ...
>     Z=26

Very simple and predictable. However the substitution can be of any type. You can use letters, numbers, symbols, and anything else you can think of. You could even use sound, and encode your information as a wave file. The most important thing is that whatever you use to represent `A` will always represent `A`.

NOTE: You can also include numbers and punctuation in you list of encoded things, but for simplicity I will leave those out of this lesson.

You can replace the letters any way you want, so long as you don't try to use a replacement letter/number/symbol twice. You could replace the letters `ABCD` with `CODE` and that would be valid. You could not, however, replace `ABCD` with `FREE` because the repeating E would make the cipher rather useless. You can even randomly replace the letters, using no real pattern at all. Here is a simple example of a complete cipher.

>     A=C		H=B		O=J		V=U
>     B=R		I=D		P=K		W=V
>     C=Y		J=E		Q=L		X=W
>     D=P		K=F		R=M		Y=Z
>     E=T		L=G		S=N		Z=X
>     F=O		M=H		T=Q
>     G=A		N=I		U=S

Simple, I know, but effective in most cases. Many people will never think to try to crack it, many people have no idea where to start. To them encoded data looks something like this:

>     MCIPJH TIYJPTP PCQC

Incomprehensible. If you take the time to decode it using the above key you will see that it is just some random encoded data. However, without the key, decoding such a simple cipher can be a daunting task. But fear not! I shall show you time honored methods of breaking this type of cypher and even show you a small program to help speed up the process.

### Breaking Cipher #1

The first thing many people would try is inserting random letters in different places until they found a combination that was no longer jumbled. This can take an extremely long time, and that would be boring. Luckily there is an easier way. Still not quick, but easier.

First of all, lets get an example of a code that the key is not known for. Like this one:

>     	f zlrit ifhe ql qcbkh qce bsbtbjx dlo qcfp bzbot fj grpq
>     	cbmmx ql ue ceoe miebpe tlkq iebve xeq fq aeqp tboh fk
>     	ceoe slje ubsh bkt f moljfpe qcfkap zfii ue tfddeoekq f
>     	zfii ue allt bkt ze sbk jbhe pjloep

Okay, for the sake of this tutorial, we will assume that the original text was in english, because that happens to be the only language I am comfortable with. What we will do is use a letter frequency list to discover the content of the above statements.

In english, there are letters that appear more often than others. By using the statistical data as to which ones appear most often we can figure out what the message above says. Here is that data.

>     1.E
>     2.T, A, O, I, N, S, H, R
>     3.D, L
>     4.C, U, M, W, F, G, Y, P, B
>     5.V, K, J, X, Q, Z

The list runs from most frequent to least, and letters on the same line almost tied. Now, first lets see how often the letters appear in this our sample code.

>     A=3		H=5		O=8		V=1
>     B=15		I=8		P=8		W=0
>     C=7		J=6		Q=12		X=3
>     D=3		K=8		R=2		Y=0
>     E=22		L=10		S=4		Z=5
>     F=13		M=4		T=9
>     G=1		N=0		U=4

Alright so it looks like the letter `E` shows up 22 time which m eans `E` probably stands for `E`. Lame, I know, but it looks to be true. The next one is `B` with 15 appearances. That means it's one of the letters in our second row. We'll start with `T` since it is the first letter in the second row. Lets see what our message looks like with capital letters where we have replaced some.

>     f zlrit ifhE ql qcTkh qcE TsTtTjx dlo qcfp TzTot fj grpq cTmmx ql uE cEoE
>     miETpE tlkq iETvE xEq fq aEqp tToh fk cEoE sljE uTsh Tkt f moljfpE qcfkap z
>     fii uE tfddEoEkq f zfii uE allt Tkt zE sTk jThE pjloEp

Let's look at the seventh word in that list. `TsTtTjx`. There are now words that I know of in the english language that have that particular placement of `T`'s so we will try the next letter in the group, which is `A`.

>     f zlrit ifhE ql qcAkh qcE AsAtAjx dlo qcfp AzAot fj grpq cAmmx ql uE cEoE
>     miEApE tlkq iEAvE xEq fq aEqp tAoh fk cEoE sljE uAsh Akt f moljfpE qcfkap
>     zfii uE tfddEoEkq f zfii uE allt Akt zE sAk jAhE pjloEp

That looks a little better. `F` is in there 15 times, so we'll check it next. If you notice, the very first word is just the letter `F` by itself. There are only two one letter words in english so it's either `I` or `A`. We've already used `A` so it must be `I`.

>     I zlrit iIhE ql qcAkh qcE AsAtAjx dlo qcIp AzAot Ij grpq cAmmx ql uE cEoE
>     miEApE tlkq iEAvE xEq Iq aEqp tAoh Ik cEoE sljE uAsh Akt I moljIpE qcIkap
>     zIii uE tIddEoEkq I zIii uE allt Akt zE sAk jAhE pjloEp

The next most common letter was `Q`. After some trial and error, (read: replacing the `Q` with various letters), it looks like `T` is the most obvious replacement.

>     I zlrit iIhE Tl TcAkh TcE AsAtAjx dlo TcIp AzAot Ij grpT cAmmx Tl uE cEoE
>     miEApE tlkT iEAvE xET IT aETp tAoh Ik cEoE sljE uAsh Akt I moljIpE TcIkap
>     zIii uE tIddEoEkT I zIii uE allt Akt zE sAk jAhE pjloEp

Now we have enough to start fiddling with it on a non statistical basis. The sixth word is `TcE`. Now, it's a darn good chance that the `C` is `H` making the word `THE`. So lets replaced `C` with `H`.

>     I zlrit iIhE Tl THAkh THE AsAtAjx dlo THIp AzAot Ij grpT HAmmx Tl uE HEoE
>     miEApE tlkT iEAvE xET IT aETp tAoh Ik HEoE sljE uAsh Akt I moljIpE THIkap
>     zIii uE tIddEoEkT I zIii uE allt Akt zE sAk jAhE pjloEp

Now look at the sixteenth word. `HEoE`. It's also a good chance that `O` is `R`. So let's replace that.

>     I zlrit iIhE Tl THAkh THE AsAtAjx dlR THIp AzARt Ij grpT HAmmx Tl uE HERE
>     miEApE tlkT iEAvE xET IT aETp tARh Ik HERE sljE uAsh Akt I mRljIpE THIkap
>     zIii uE tIddEREkT I zIii uE allt Akt zE sAk jAhE pjlREp

The ninth word is `THIp`. The `P` is probably `S`, so I'll replace that too. Also `L` shows up in `Tl` a lot, so it's probably `O`. I'll replace that too.

>     I zOrit iIhE TO THAkh THE AsAtAjx dOR THIS AzARt Ij grST HAmmx TO uE HERE
>     miEASE tOkT iEAvE xET IT aETS tARh Ik HERE sOjE uAsh Akt I mROjISE THIkaS
>     zIii uE tIddEREkT I zIii uE aOOt Akt zE sAk jAhE SjORES

Looking good so far. Now look at words 14-16. We almost have a phrase. `TO uE HERE`. The only letter that `U` could be to make this make sense is the letter `B`. Also `II` is repeated several times. There are only a couple of letters that repeat that often: `S` and `L`. since we have already found `S` it must be `L`. Replacing those we have this.

>     I zOrLt LIhE TO THAkh THE AsAtAjx dOR THIS AzARt Ij grST HAmmx TO BE HERE
>     mLEASE tOkT LEAvE xET IT aETS tARh Ik HERE sOjE BAsh Akt I mROjISE THIkaS
>     zILL BE tIddEREkT I zILL BE aOOt Akt zE sAk jAhE SjORES

Word three is `LIhE`. `H` is probably `K`. Word 17 in `mLEASE`. `M` is probably `P`. Let's replace those as well.

>     I zOrLt LIKE TO THAkK THE AsAtAjx dOR THIS AzARt Ij grST HAPPx TO BE HERE
>     PLEASE tOkT LEAvE xET IT aETS tARK Ik HERE sOjE BAsK Akt I PROjISE THIkaS
>     zILL BE tIddEREkT I zILL BE aOOt Akt zE sAk jAKE SjORES

Word five is `THAkK`. `K` must be `N`. And word 8 is `dOR`. `D` should be `F`. And `Z` shows up in `zILL`. Chances are good that it is `W`. Replace, Replace, Replace.

>     I WOrLt LIKE TO THANK THE AsAtAjx FOR THIS AWARt Ij grST HAPPx TO BE HERE
>     PLEASE tONT LEAvE xET IT aETS tARK IN HERE sOjE BAsK ANt I PROjISE THINaS
>     WILL BE tIFFERENT I WILL BE aOOt ANt WE sAN jAKE SjORES

Word ten is `AWARt`. There is only one word that fits this pattern, and that is award. So `T` must be `D`. Word thirteen, `HAPPx`, must be `HAPPY`. So `X` is `Y`.

>     I WOrLD LIKE TO THANK THE AsADAjY FOR THIS AWARD Ij grST HAPPY TO BE HERE
>     PLEASE DONT LEAvE YET IT aETS DARK IN HERE sOjE BAsK AND I PROjISE THINaS
>     WILL BE DIFFERENT I WILL BE aOOD AND WE sAN jAKE SjORES

It's looking better every time. Now let's look at the last line. There is the word `aOOD`. That could only be food or good, and since we already have `F` it must be `G`. Also two words over we have `sAN`. `S` probably stands for `C` then.

>     I WOrLD LIKE TO THANK THE ACADAjY FOR THIS AWARD Ij grST HAPPY TO BE HERE
>     PLEASE DONT LEAvE YET IT GETS DARK IN HERE COjE BACK AND I PROjISE THINGS
>     WILL BE DIFFERENT I WILL BE GOOD AND WE CAN jAKE SjORES

Now look at word seven, `ACADAjY`. This one might cause you to rack your brain for a second. What could that be? Are we wrong up to this point? No, we're still right on. Now you have to look at what we have finished. Which reads like this: “I ___ LIKE TO THANK THE ____...” In this light, what else could it be but Acadamy! A bad spelling of Academy. Yes, you have to take into account bad spelling too. So `J` must be `M`.

>     I WOrLD LIKE TO THANK THE ACADAMY FOR THIS AWARD IM grST HAPPY TO BE HERE
>     PLEASE DONT LEAvE YET IT GETS DARK IN HERE COME BACK AND I PROMISE THINGS
>     WILL BE DIFFERENT I WILL BE GOOD AND WE CAN MAKE SMORES

Now a couple of things stick out. First is word two. `WOrLD` is kinda funky, but must be `would`. So `R` is `U`. Also look at word 18. `LEAvE`? What could `V` possible stand for? Once again, look at what we have finished around it and you will find that it now must stand for itself, just like `E` did.

>     I WOULD LIKE TO THANK THE ACADAMY FOR THIS AWARD IM gUST HAPPY TO BE HERE
>     PLEASE DONT LEAVE YET IT GETS DARK IN HERE COME BACK AND I PROMISE THINGS
>     WILL BE DIFFERENT I WILL BE GOOD AND WE CAN MAKE SMORES

That leaves us with only one word left that doesn't fit and that is `gUST`. `G` must be `J` to fit the context. Replace it and you have finished the problem.

>     I WOULD LIKE TO THANK THE ACADAMY FOR THIS AWARD IM JUST HAPPY TO BE HERE
>     PLEASE DONT LEAVE YET IT GETS DARK IN HERE COME BACK AND I PROMISE THINGS
>     WILL BE DIFFERENT I WILL BE GOOD AND WE CAN MAKE SMORES

From this we can determine the key, save the three letters that were not used, and if we had another sample of something encoded in this way we could get it down perfectly.

>     A=B		H=C		O=L		V=V
>     B=U		I=F		P=M		W=?
>     C=S		J=G		Q=N		X=Y
>     D=T		K=H		R=O		Y=?
>     E=E		L=I		S=P		Z=X
>     F=D		M=J		T=Q
>     G=A		N=?		U=R

Of course, looking at the pattern, you could probably figure out what the missing letters are anyway. Congratulations!

### Sure it was easy for you. You had the key.

No I didn't. I used a program I had a friend write and compile to encrypt a message of his choice, and save the output to a text file. I had no more knowledge of what would come out than you did. If you want the program, it is included in the zip file called cipher1.zip and the exe is called crypt.exe

### Hey! What about the program?

What? Oh, right. I almost forgot. This is a program that will count the letters for you and output the findings to a text file.

>     dim ptext as string
>     dim letters as integer
>     open "encrypted.txt" for input as #1
>     open "letters.txt" for output as #2
>     input #1, ptext
>     for i = 97 to 122
>          for j = 1 to len(ptext)
>               if lcase(mid(ptext,j,1)) = chr(i) then letters +=1
>          next j
>          print #2, chr(i)+"="+str(letters)
>          print chr(i)+"="+str(letters)
>          letters = 0
>     next i
>     close #1
>     Close #2
>     sleep

### So now what?

Well, I will come back for a few more of these and show some more advanced techniques, as well as other cipher types to make you're software more secure than Fort Knox... Well maybe not THAT secure... Until then, happy code making and breaking. If you have any requests, comments, sneers, or jeers... Keep'em to yourself! Just kidding. Email me at ImortisInglorian@gmail.com.

## NES Style Graphics and SCREEN 13

### Written By Paul Holmlund (kiyotewolf)

Got a neat tip for those of you that like NES style graphics and SCREEN 13 (mode 19h bios).

I remember an article about the NES Famicom system that emulators were running on IBM PC hardware (AT?) with a card that supported the NES code. My guess is that the IBM supplied the graphics for the emulator, so it got me thinking about the special palette and effects that a regular NES game uses.

If you look at a NES game, there are generally:

- ABOUT 7 COLORS FOR FOREGROUND/GOODGUYS/BADGUYS...ETC
- ABOUT 7 COLORS FOR ITEMS/OBJECTS/PLATFORMS.......ETC
- ABOUT (7/16) COLORS FOR BACKGROUNDS.....(OK..MAYBE FEWER..)

Anyway,... you see these numbers of colors along the border of the 16x16 sides of a 256 color palette matrix.

### (What the heck did he say????)

If you make the 256 colors into a 16x16 matrix, (visually)

>     0,0............15,0
>     .       X
>     .
>     .
>     .
>     . Y
>     .
>     0,15         15,15

you must focus on the upper edge (0-15) and

>     (0-15)
>        X

the left edge (0-15)*16

>     (0-15)*16
>         Y

and those make your NES colors. If you take and copy colors vertically

>     0,0  1,0
>         x
>         x
>         x
>         x
>        1,15

you will get colors that XOR mask with the colors on the left side which only show up on the screen as the color running down top to bottom.

If you draw something with color 1 using PUT ... XOR over something colored with the colors filling the left side the object that has colors using 1 (and the others along the top with colors dropped down like that) will appear to be dominant over the image using colors of the left edge.

### More english please...

If you draw something with colors off the top edge only, you can XOR the image over something with colors from the left edge only and safely XOR it off again.

The trick is to make the areas where the colors blend only result in one color. If you were to take the colors on the left and move them horizontally across the palette you would get the same effect but the priority would be reversed.

If you mix both these, having the first 7 columns go down, matching the colors from the top line, and have the second 7 colors be matches of the left colors going horizontal, you can have 7 colors that match the next 7 colors but there is an invisible boundary that can be exploited.

You can do a simple 16x16 where there is only one type of priority, one set of colors over the other, but the only way to make things disappear is to drop them behind other objects. You can't make the sprite appear over certain objects.

In the 7x7x16 style, with half vertical, half horizontal, you get 7 colors that the left side (sprites) appear over and the other half where the sprites disappear behind the background.

This SERIOUSLY limits colors, I know, but careful planning, and changing palettes on the fly to make new areas by their change in color is easy for the thoughtful programmer.

I have come up with a novel use for the 7x7x16 mode, To make 16/8 bit characters that appear in an APPLE ][E universe.

In the apple world there are few colors, just enough to fill the 7 color limit.

black white purple green orange blue and (sometimes yellow)

yellow only comes from serious hacking...(from Might and Magic tm.)

I plan to release a compiled game that features a character lost in an 8-bit world getting back to the 16 bit one. If they die they become APPLE colored before croaking.

Neat huh?

This code requires a little hands on to understand, so if you would like a sample of this code in action please feel free to email me and I will send you a sample code snippet.

kiyotewolf@yahoo.com

aka Paul Holmlund

Well, I'm off to study for my finals at the Qmmunity College!

Ciao!

## Using The Screen 13 Palette

### Written By Paul Holmlund (kiyotewolf)

What's the use of making graphics that only uses 16 colors? Over a background of 16 or 7 colors?

Aren't you interested in 24 bit graphics? or at lease 256 full color palette graphics?

Well, yes, but then you find yourself either going one of two routes.

- ASSMEBLY LANGUAGE
- MODE X/ OR A COMPLETELY NEW OS FOR CODING--SUCH AS FREEBASIC

Since I have been doing QB for so long, it's going to take me a LONG time to get up to speed in FB.

PLUS!! If you think about it, in those 24hr contests, what wouldn't be better than complete priority enabled sprites, using STANDARD PUT commands, and turn it out in much less time. PLUS, it will be stylized in the mode of a retro style game.

### Meaning,...

If you use graphics drawn with colors set up like this, you can update the screen quickly, remove sprites effortlessly, and make doors open and close easily.

If you draw the objects on the screen with the top first 7 colors, these objects can have a higher priority over the sprites (drawn with the left hand colors).

If you draw the background with the second 7 on the top you can have the priority behind the sprites.

When you draw the sprites, you make the colors of the sprites only have colors using these colors represented in hex values.

>     &H00 &H10 &h20 &h30 &h40 &h50 &h60 &h70 &h80 &h90 &hA0
>     &hB0 &hC0 &hD0 &hE0 &hF0

Use these colors for the objects

>     &h00 &H01 &h02 &h03 &h04 &h05 &h06 &h07

Use these for the background

>     &h08 &h09 &h0A &h0B &h0C &h0D &h0E &h0F

As you might notice, the colors for both edges leave a "0" in the space where they would mesh together during a PUT...XOR operation. Meaning, these colors would go over one another, and could be removed, by simple XOR and reXOR operations. PLUS! You can clear the entire screen of one type or the other by washing the screen with solid blocks of &H0F or &HF0 to erase only either the sprites, or the objects/background.

Even better! You can check between objects and background by a simple bit test off the POINT command below your character. If you check for the 4th bit, &B1000, you can tell the differce between objects and backgrounds, which can be put into your gravity (is still working) or object (reaction method) code to either fall, or act on an object.

Yes, it's going backwards, but how many hours have you played NES? I have many logged in my book, and some of those old games are so stylized that they are just COOL!

Summary, you can use the SCREEN 13 palette as a easy, versatile tool to create retro theme/stylized games that have great built in interaction capability, sprite priority over/under objects and backgrounds, and the ability to make these games with half the effort of a full color game. Plus, ASM is not required!

I plan to make an army of games that exploit this hat trick, and put as much effort into them as a regular NES game. I am going to make editors available that dither palettes into EGA SCREEN 12 so you can import multiple palettes in at once and concentrate them into one, design levels for tile/pixel scrollers, and more.....

Thanks for your time, to the entire Qmmunity!

Ciao!

Kiyote Wolf

## Writing Perfect Code

### Written By Jonathan Wallace

Writing perfect code sounds impossible, but it’s not. I often use this technique to streamline my programs. Now the name of the technique is a little misleading. Just because my code is perfect doesn’t mean that it does what I want. Getting runtime errors happens all the time with what I would consider “perfect code.” Let me first explain what I mean by perfect code.

Perfect code is only achieved in assembly or with an optimizing compiler (FreeBasic is not.) I’m going to be showing tiny programs that FreeBasic will probably compile perfectly, but in larger more complicated ones it May not. Perfect code is code that uses the minimal number of CPU cycles that is possible for a specific algorithm. Lets take a simple expression: c = (a - b) + (c - d). There is a minimum number of CPU cycles here. You have to load 4 values (8 cycles), store c (2 cycles) and do three computations (3 cycles.)

Lets write some FreeBasic:

>     A = 1
>     B = 2
>     C = 3
>     D = 4
>     C = (a - b) + (c - d)

Okay, here is a simplification of the asm that fbc will make:

>     ;initialize variables
>     Mov [a], 0
>     Mov [b], 0
>     Mov [c], 0
>     Mov [d], 0
>     ;set values
>     Mov [a], 1
>     Mov [b], 2
>     Mov [c], 3
>     Mov [d], 4
>     ;start calculating
>     Mov eax, [a]
>     Sub eax, [b]
>     Add eax, [c]
>     Sub eax, [d]
>     ;store c
>     Mov [c], eax

Each mov instruction takes 2 cycles and each math statement takes one. 20 + 3 = 23 cycles! That’s 10 more cycles than the theoretical limit.

This code is actually very good for a high level compiler. (Keep in mind this is a simplification of the assembly, I omitted dword ptr [ebp - x] to keep it simple. It is very good, but I could make it faster. The registers do calculations much faster than the RAM. If you need to have a, b, c, and d for later calculations its alright to use the RAM, but if they are simply temporary values then you don’t need to. This assembly will run faster.

>     ;initialize values to registers
>     Mov eax, 1
>     Mov ebx, 2
>     Mov ecx, 3
>     ;start calculating
>     Sub eax, ebx
>     Add eax, acx
>     Mov ebx, 4
>     Sub eax, ebx
>     ;store c
>     Mov [c], eax

By moving some of the code around and loading the values directly into the registers, instead of allocating temporary values for them and then assigning them I have now gotten that 13 cycles. This code will in turn run almost twice as fast as the code above, and I am guaranteed that no one will ever right faster or shorter code. You have no a,b, and d variables, but c has been stored in the RAM.

Now that little speed boost might seem insignificant, and it is. But say you are writing a 3d engine and a calculation like that is in the main loop. Over the course of a few minutes that code might execute a billion times. Most programmers don’t ever deal with fine tuning like this, because compilers do produce really good code (some of them,) and the tiny speed ups don’t make enough of a difference that it’s not worth the time to do this, (after all time is money.) Most super-optimizing is done by the super-computer people, game coders, or OS writers. Personally, I’m a perfectionist. Anything that comes out of Wallace Software that seems unusually fast probably has gone through assembly manipulations like this. It makes the code faster and smaller.

## FB & OpenGL Part #1

### Using OpenGL in FreeBasic and Drawing Stuff 3D style.

### Written By Rattrapmax6

### Introduction! (The boring part)

Here I am, writing a tutorial for Pete's magazine, or e-zine if you must. Well, out of all the things I could think of to cover, I thought, why not make an OpenGL tutorial using just FreeBasic. I'm not the best OpenGL coder in the world, there are some here light years better than me, but I do know how to get it going, and a few neat tricks I picked up myself. So here we go, tutorial #1, how to make OpenGL work in FreeBasic (No SDL!!).

### What we need! (Boring Part 2!)

One: this is a given, you need the FreeBasic compiler, I'm using version 0.16b. Two: it helps if you know how to work most of FreeBasic's statements, and know what they do. Three: The OpenGL library. Your graphics card should have this by default.

### Cranking up OpenGL! (Now where did I set the keys?)

Before OpenGL will work, we need a window. FreeBasic comes in handy by allowing it's window to be used with OpenGL's commands, normally you'd have to use SDL, or Windows' API, etc.. I use the command SCREENRES when ever I make a window, it's faster than remembering modes. We also need to set up OpenGL so it knows what we want it to do

>     OPTION EXPLICIT
>     '$include: 'gl\gl.bi'
>     '$include: 'gl\glu.bi'
>     '$include: 'fbgfx.bi'

>     SCREENRES 800, 600, 32, , GFX_OPENGL

>     glViewPort 0, 0, 800, 600

>     glMatrixMode GL_PROJECTION
>     glLoadIdentity
>     gluPerspective 60, 800/600, 1, 1000
>     glMatrixMode GL_MODELVIEW
>     glLoadIdentity

>     glClearDepth 1.0
>     glDepthFunc GL_LEQUAL
>     glEnable GL_DEPTH_TEST

>     glShadeModel GL_SMOOTH
>     glHint GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST

>     glClearColor 0, 0, 0, 1

Now, there you have the code to make an OpenGL screen, and to set up OpenGL. Lets go over what I have here. At the top, I have OPTION EXPICIT: This tells the compiler that all variables must be declared before it can compile. This helps a lot to track variables, and find forgotten DIMs, or misspelled variable names.

After we set the compiler option, we then include the OpenGL headers. These are: gl\gl.bi and gl\glu.bi. These enable the commands to be used in FreeBasic that call to the library. We'll also need the FBGFX library for screen modes, and later key commands (fbgfx.bi).

Next we have the SCREENRES statement. You probably already know how this works, but for those that use SCREEN, it goes something like this:

>     SCREENRES Screen_X, Screen_Y, Colour_Depth, Pages, Mode

Here, I've set the screen to 800x600 (just a res I like, you can use what ever you like however, or which ever is better performance.), Colour depth is set to 32 bit for true colour, pages is left empty (FB sets up pages automatically in OpenGL Mode), and the mode is set to GFX_OPENGL to tell FB we want to make the window use OpenGL. You can use: GFX_OPENGL OR GFX_FULLSCREEN for fullscreen mode.

Next in line, we have glViewPort. This works something like the SCREENRES, normally to tell OpenGL what size the window is. It can also be used to copy the screen to a texture, for screen blurring (something I might share with you in a later tutorial). The syntax follows like: The first two parameters determine the lower left hand corner, and the last two tell OpenGL where the Upper right hand corner is. You probably got lost there, you see, in OpenGL, the main screen is upside down. X still works across left to right, but Y starts at the bottom and goes up. This knowledge will come in handy later, so keep note of that.

Going on, the next line we have in our initiation is: glMatrixMode. Here you can switch the matrix to modify textures, model-view, or the projection matrix. For this line, we are switching to the Projection matrix to modify how are camera scene will be rendered.

Inside the projection matrix's code block, I have the new line: glLoadIdentity. This command clears the current matrix and replaces it with the identity matrix (Sort of like clearing the screen to black, red, etc., this will become are cleared matrix base basically).

The next command will set the rendering scene. gluPerspective has four parameters, FOV (Field of Vision), Aspect ratio, Z_near (Where stuff goes behind the camera), and Z_Far (Where stuff vanishes into the distance). To brake these down: FOV is the maximum view angle. The average human has a FOV of 180 degrees, but uses only about 30-80 degrees of vision for central or focused vision (If you took drivers-ed, they probably told you all of this.). Here I used 60, but it can be adjusted to what ever fits the scene, whether you want a wide shot, or a narrowed in focus. Next up is the aspect ratio. This is set to the ratio of Screen: Width/Hight, is this case 800/600 . After that, we set the Z_Near, where the objects cut as they go behind the camera. I normally always use 1, I've tried lower positive values before, but they always make the screen choppy. And last but not least, Z_Far, this sets how far into the screen objects can be set, I normal start off with 1000 gl-units, I like that much room to play around in. Keep in mind, a huge Z_Far slows performance if there is loads of objects, so look out for this when trying to keep a good FPS in games/demos/etc.

After we've set up the scene, we now switch the matrix back to Model View (so we can draw, locate, rotate, etc., the scene and objects in the scene). We also clear the matrix again, so we start off on a clean slate for more initiations (Yes, we need to boss around OpenGL a lil more before it knows what we want it to do.)

Here we have glClearDepth, glDepthFunc, and glEnable GL_DEPTH_TEST. These three lines tell OpenGL we want it to sort the screen depth, and how it sorts it. glClearDepth is normal set to 1, and glDepthFunc set to GL_LEQUAL. This will tell OpenGL to sort the screen front to back (From closest to furthest object). Any incoming Z value Less than or equal to 1 is drawn. You can also set it to sort back to front, this normally looks really weird, though it's probably great for odd effects (glClearDepth 0: glDepthFunc GL_GEQUAL) . Not to forget either, there are several different settings that can be used here, but for now, I will only cover the one I've coded. glEnable (Option) switches things on and off inside OpenGL. Here we use it to flip on GL_DEPTH_TEST, to test the depth with the values we set.

Next up! We have glShadeModel. Here we can either OpenGL to shade smoothly (GL_SMOOTH), or shade the scene with flat colours (GL_FLAT). Smooth allows for multiple vertex colours (Colour settings for each point on a poly), and as the model is filled in, the colours gradient into each other. Flat on the other hand, will only allow one colour per poly.

After that, we have another render option. glHint. glHint can give OpenGL hints on how things need to be rendered. Here, we will use it to tell OpenGL that we want the colours and textures draw at the best quality it can manage! Options: GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST. You can also use GL_FASTEST, or GL_DONT_CARE, which normal use a lesser quality to render faster.

And finally! I bet you never thought you'd see the light of day with all these initiation commands, but here it is, the last one we need for a simple OpenGL screen. glClearColor, this one tells OpenGL what colour the base screen should be when the screen is cleared. Values are: R, G, B, and Alpha. 1 being the highest, 0 being the lowest. Here, I have it set to: (0,0,0,1) for a black background, but you can use a range of colours: (1, 0, 0, 1)-red, (0,1,0,1)-green, (0.5,0.5,0.5, 1)-grey, and so on.

One last thing before the above code can run, we need to make a loop in FreeBasic, and call the FLIP command. FLIP, in OpenGL mode, flips the hardware page to show the contents on the back buffer. If we don't call this, OpenGL will most likely lock up FreeBasic's window.

>     DO
>     	glClear (GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT)

>     	FLIP
>     LOOP UNTIL INKEY <>  ""

Now, with that added to the end, our code should run. You may also notice the new command. This command is like CLS in FreeBasic, except it clears 3D space and not just the screen. I've called it to clear the colour buffer (GL_COLOR_BUFFER_BIT) and clear the depth buffer (GL_DEPTH_BUFFER_BIT). You may have also noticed the use of the OR operator. This is a clever little space saver, another option to it would be to call the commands one at a time:

>     glClear (GL_COLOR_BUFFER_BIT)
>     glClear (GL_DEPTH_BUFFER_BIT)

For my tutorials, I'll be using that OR. Saves space, and I'm all for that!

### Drawing stuff (3D Style!!)

Now the fun stuff! Just like with FreeBasic, you have commands that allow you to draw. Simple enough, the only catch is you have a 3rd Dimension, (Hence 3D, but you probably already know that ;) ).... So where you have LINE(X, Y)-(X2, Y2) in FB's 2D stuff, in OpenGL you'll have to make use of Z also, (Unless you use OpenGL in 2D mode).

Drawing stuff in OpenGL might look rather weird at first, but it has good reason to be like it is. Basically, comparing it to FB, you just draw loads of PSET points, and switch the render options to connect the dots in different styles. OpenGL can draw pixels, lines, poly-lines, triangles, and quads, just by swapping modes. Example:

>     glBegin GL_LINES
>     	glVertex3f (X1, Y1, Z1)
>     	glVertex3f (X2,Y2, Z2)
>     glEnd

glBegin starts a code block in which 3D vertexes (points in 3D space) are rendered by the set flag option. Here we have GL_LINES which makes groups of two points make one line. You can have as many points as you want in a block as long as they follow the proper grouping for the draw option.

Modes for glBegin:

Modes | Description
GL_POINTS | Draws points for each vertex
GL_LINES | Draws lines for each group of two vertexes
GL_LINE_LOOP | Draws a poly-line connecting each vertex with a line. (Minimum of two vertexes needed.)
GL_TRIAGLES | Draws triangles for each group of three vertexes
GL_TRIANGLE_FAN | Draws triangles connected to each other. (Three vertexes to set the first triangle, two vertex additions to the last to add triangles.)
GL_QUADS | Draws quads for each set of four vertexes.

Once you have this block of code to draw OpenGL vertexes, you need to place the points to be rendered. glVertex3f (X, Y, Z) sets a vertex for OpenGL to render. The parameters X, Y, and Z work like this: Just like on your normal 2D stuff, X is for Left and Right, and Y is for Up and Down. The only difference, is X and Y start at what's called an origin, making 0,0 = the centre of the screen. Positive values of X move it's position to the right, and negative values to the left. As for Y, positive is up, negative is down.

glEnd caps off the drawing block, nothing really special here, just remember to use this once you are done drawing in that one block of code.

Now, here is a example showing off all the drawing commands, and how they are used:

>     DO
>     	glClear (GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT)
>         glLoadIdentity

>         glPushMatrix
>             'Move the origin ten GLuints back, five left
>             glTranslatef (-5, 0, -10)

>             glBegin GL_POINTS
>                 glVertex3f(-1, 1, 0)
>                 glVertex3f(1, 1, 0)
>                 glVertex3f(1, -1, 0)
>                 glVertex3f(-1, -1, 0)
>             glEnd
>         glPopMatrix

>         glPushMatrix
>             'Move the origin ten GLuints back
>             glTranslatef (0, 0, -10)

>             glBegin GL_LINES
>                 glVertex3f(-1, 1, 0)
>                 glVertex3f(1, 1, 0)
>                 glVertex3f(1, -1, 0)
>                 glVertex3f(-1, -1, 0)
>             glEnd
>         glPopMatrix

>         glPushMatrix
>             'Move the origin ten GLuints back, four up, five over
>             glTranslatef (5, 4, -10)

>             glBegin GL_LINE_LOOP
>                 glVertex3f(-1, 1, 0)
>                 glVertex3f(1, 1, 0)
>                 glVertex3f(1, -1, 0)
>                 glVertex3f(-1, -1, 0)
>             glEnd
>         glPopMatrix

>         glPushMatrix
>             'Move the origin ten GLuints back, four up
>             glTranslatef (0, 4, -10)

>             glBegin GL_TRIANGLES
>                 glVertex3f(-1, 1, 0)
>                 glVertex3f(1, 1, 0)
>                 glVertex3f(1, -1, 0)
>             glEnd
>         glPopMatrix

>         glPushMatrix
>             'Move the origin ten GLuints back, four down
>             glTranslatef (0, -4, -10)

>             glBegin GL_TRIANGLE_FAN
>                 glVertex3f(-1, 1, 0)
>                 glVertex3f(1, 1, 0)
>                 glVertex3f(1, -1, 0)
>                 glVertex3f(-1, -1, 0)
>             glEnd
>         glPopMatrix

>         glPushMatrix
>             'Move the origin ten GLuints back, five right
>             glTranslatef (5, 0, -10)

>             glBegin GL_QUADS
>                 glVertex3f(-1, 1, 0)
>                 glVertex3f(1, 1, 0)
>                 glVertex3f(1, -1, 0)
>                 glVertex3f(-1, -1, 0)
>             glEnd
>         glPopMatrix

>     	FLIP
>     LOOP UNTIL INKEY <> ""

Here you see several new commands, let me explain what they do. First up is glPushMatrix and glPopMatrix. This has an mathematical explanation, but it's not one I'm familiar with, I can however tell you basically what it does, and what the outcome of that is. Basically, as the name implies, it pushes the current matrix stack down one and allows us to modify a copy of the top most matrix. This comes in handy here because of the use of glTranslatef (explained later), which moves the origin. One the same stack, the first translate moves the origin to a new location, and any translate call after that moves away from the new matrix. In some cases this is useful, but others it's not (like here). Pushing the stack down one allows us to move the origin for the scene or object to be rendered, and popping (glPopMatrix) it resets the origin (and/or other values depending) for the next object we wish to draw. Push and Pop primarily allows modifying in OpenGL's 32 available matrix stacks. For this example we'll just use the top stack, and the one under it.

The next new on is, glTranslatef(X, Y, Z) moves the origin. By default the origin is located where the camera is located. Thus, anything drawn is right up on top of the camera, making it hard to view. Any Z value from -1 to -Z_far is in front of the camera, and any Z value greater than -1 is behind the camera. X and Y work just the same as glVertex's X and Y, only difference is they move the origin, instead of work off the origin. =) .. Here you see I have it 10 places in front of the camera, and in different X, Y locations so my different objects don't jumble up.

Note, I added a glLoadIdentity under the glClear command, this is to reset the matrix each loop, so be are drawing and modifying on a clean slate every time. And that should do it for my last example, feel free to modify the parameter values and see what do, and how they affect what's being drawn, rendered, etc.

### Final word (Notes and whatnot)

Not being a pro at OpenGL, or the complete science of 3D, do note any mistakes, missing details, or information that doesn't add up. To err is human, so.... =)

## Sub Pixel Rendering

### written by Eclipzer

### What's A Sub Pixel?

A sub-pixel is a pixel that can be defined using decimal coordinates and rendered accordingly. The implications of this are visually quite dramatic. With the ability to be rendered at decimal intervals, sub-pixels can be positioned exactly where you want them instead of at a pixel approximation. This rendering improves the visual quality of images.

sine wave sampled at 0.5 pixel increments
left: pixel rendering
right: sub-pixel rendering

This wave is generated by sampling a sine wave at 0.5 pixel increments. The left side of the wave is rendered using pixels, where as the right side uses sub-pixels. The sub-pixels are able to more closely approximate the curve, producing a smoother looking image, because they take into account the fractional portion of the samples. Pixels on the other hand, force the samples to whole number values, creating a loss of information (the fractional portion of the sample). This loss of information is visually evident in the wave on the left, where "jaggies" are consistently displayed throughout the length of the wave.

### Losing Information

Let's use an example sample function to demonstrate, numerically, this loss of information.

      ysample = 50 sin(x°) 'sample function

      x       = 95.5°
      ysample = 50 sin(95.5°) = 49.7698099184 'sampled value (high precision)

      ysub-pixel = 49.76981
      ytruncate  = 49
      yround     = 50

      Psub-pixel(95.5, 49.76981)
      Ptruncate (95, 49)
      Pround    (100, 50)

Since physical pixels only exist as integer values, our x,y coordinates must be integer values. This is normally achieved through truncation or rounding. In either case we end up losing information (0.5 from our x-value and 0.76981 from our y-value). With sub-pixels, we keep the fractional information intact and use it to construct a more accurate image.

### Conceptual Rendering Method

To render a sub-pixel we actually 'map' it to four physical pixels. By determining how much area the sub-pixel covers in each of these pixels, we can calculate how intense the color of the sub-pixel is for each pixel.

sub-pixel displayed on a pixel grid | sub-pixel "mapped" to four physical pixels
| pixel representation of a sub-pixel

### Pixel Color Equation

Using the above method, we can deduce that the equation used to determine the color of each pixel of a sub-pixel is:

      Color = Area x Intensity

    or

      Colorpixel = Areasub-pixel x Colorsub-pixel

Let's explore why this equation makes sense. If the area is one then the sub-pixel lies fully within this pixel and the pixel color would be the same as that of the sub-pixel.

      Cpixel = Asub-pixel x Csub-pixel = 1 x Csub-pixel = Csub-pixel

      Cpixel = Csub-pixel

If the area is zero then the sub-pixel lies completely outside this pixel the pixel color would be zero.

      Cpixel = Asub-pixel x Csub-pixel = 0 x Csub-pixel = 0

      Cpixel = 0

### Computing Pixel Areas

We tend to think of pixels as points, which is why we describe them using a single coordinate. With sub-pixels we see that our pixel is better thought of as a square possessing dimension (length, height and area). For this reason, we need to create more points from our original data. In essence, we must interpret our original data in terms of four coordinates describing a sub-pixel square instead of a single coordinate describing a pixel point.

sub-pixel corner coordinates

    Sub-Pixel Coordinate Definitions:
      x1          'left edge (original x-coordinate)
      y1          'top edge (original y-coordinate)
      x2 = x1 + 1 'right edge
      y2 = y1 + 1 'bottom edge

    Sub-Pixel Corner Coordinates:
      p1(x1, y1) 'top-left
      p2(x2, y1) 'top-right
      p3(x1, y2) 'bottom-left
      p4(x2, y2) 'bottom-right

We must also consider the lines that divide the sub-pixel into the four areas we need to calculate.

sub-pixel divided by lines x=x0 and y=y0

    Sub-Pixel Division Lines:

      x0 = truncate(x2) 'remove precision of x-coordinate (decimal portion)
      y0 = truncate(y2) 'remove precision of y-coordinate (decimal portion)

With our sub-pixel definitions now in place, we can begin to calculate areas used to determine our four pixel colors.

sub-pixel divided into four seperate areas

    Area = Length x Height = (x2 - x1)(y2 - y1) 'general area equation

      A1 = (x0-x1)(y0-y1)    A2 = (x2-x0)(y0-y1)
      A3 = (x0-x1)(y2-y0)    A4 = (x2-x0)(y2-y0)

    Define Common Quantities:

      ax1 = x0-x1    ax2 = x2-x0
      ay1 = y0-y1    ay2 = y2-y0

    Simplify By Substitution:

      A1 = (ax1)(ay1)    A2 = (ax2)(ay1)
      A3 = (ax1)(ay2)    A4 = (ax2)(ay2)

### Computing Pixel Color From Area

Once we've calculated our areas we can use them to determine our four pixel colors. Because the color on a computer screen is quantified using three different color components (RGB) we must first break our color into these components and then apply our pixel color equation to each one. These new components are then used to construct each of our four pixel colors.

    Compute Pixel (Pn) RGB Components (CPn = An x Csub-pixel) where n=1,2,3,4:

      CPn = (RPn,GPn,BPn) 'pixel (Pn) color composed of RGB values

      RPn = An x Rsub-pixel
      GPn = An x Gsub-pixel
      BPn = An x Bsub-pixel

### What About The Background Color?

The last thing we need to consider is background color. Currently, if our sub-pixel lies completely outside one of our four pixels, then that pixel's color is zero. This normally indicates the color black. But what if our background isn't black, or our sub-pixel is simply being rendered over another image altogether? To handle this situation, we just need to blend our background color with our sub-pixel color. We do this with the standard alpha blending equation, where our calculated area acts as our alpha value.

      Color = Alpha x (Color1 - Color2) + Color2

    or

      Coloralpha = Alpha x (Colorsub-pixel - Colorbackground) + Colorbackground

      RPn = An x (Rsub-pixel - Rbackground) + Rbackground
      GPn = An x (Gsub-pixel - Gbackground) + Gbackground
      BPn = An x (Bsub-pixel - Bbackground) + Bbackground

sub-pixel rendered over green background

### Putting It All Together

    Psuedo-Code (Note: the "!" symbol refers to a single-precision variable):

      Draw_SubPixel (x!,y!,c)

      ' Define sub-pixel attributes
        x = truncate(x!):  x0 = x+1:  x1! = x!:  x2! = x1!+1
        y = truncate(y!):  y0 = y+1:  y1! = y!:  y2! = y1!+1

      ' Determine area lengths
        ax1! = x0 - x1!:  ax2! = x2! - x0
        ay1! = y0 - y1!:  ay2! = y2! - y0

      ' Calculate areas
        a1! = ax1!*ay1!:  a2! = ax2!*ay1!
        a3! = ax1!*ay2!:  a4! = ax2!*ay2!

      ' Determine 4 background colors
        bkg1 = pixel_color(x  , y)
        bkg2 = pixel_color(x+1, y)
        bkg3 = pixel_color(x  , y+1)
        bkg4 = pixel_color(x+1, y+1)

      ' Determine RBG components of background colors
        r1 = r_component(bkg1)
        r2 = r_component(bkg2)
        r3 = r_component(bkg3)
        r4 = r_component(bkg4)

        g1 = g_component(bkg1)
        g2 = r_component(bkg2)
        g3 = r_component(bkg3)
        g4 = r_component(bkg4)

        b1 = b_component(bkg1)
        b2 = r_component(bkg2)
        b3 = r_component(bkg3)
        b4 = r_component(bkg4)

      ' Determine RGB components of sub-pixel color
        r0 = r_component(c)
        g0 = g_component(c)
        b0 = b_component(c)

      ' Calculate  RGB components of sub-pixel's 4 pixels
        c1 = color(a1!*(r0 - r1) + r1, a1!*(g0 - g1) + g1, a1!*(b0 - b1) + b1)
        c2 = color(a2!*(r0 - r2) + r2, a2!*(g0 - g2) + g2, a2!*(b0 - b2) + b2)
        c3 = color(a3!*(r0 - r3) + r3, a3!*(g0 - g3) + g3, a3!*(b0 - b3) + b3)
        c4 = color(a4!*(r0 - r4) + r4, a4!*(g0 - g4) + g4, a4!*(b0 - b4) + b4)

      ' Draw 4 pixels
        draw_pixel x  , y  , c1
        draw_pixel x+1, y  , c2
        draw_pixel x  , y+1, c3
        draw_pixel x+1, y+1, c4

--Eclipzer

Copyright (c) Quinton Roberts 2006.

## FreeBASIC and Scite in Ubuntu

### Written by Nathan Kessler (Nathan1993)

It was going to happen eventually. FreeBASIC is great, and Linux is free. FreeBASIC is free and, Linux is great. To me, it seems they go together like peas and carrots. However, Linux packages (programs) have dependencies (other programs they rely on). This tutorial will help you set up FreeBASIC with all the needed dependencies and install Scite (a program source-code editor) with FreeBASIC syntax highlighting.

Before we begin, I would like to thank Lurah. His thread at freebasic.net inspired this tutorial. Also, Fausti deserves a huge hand of applause for teaching us how to get FreeBASIC syntax highlighting in Scite. I did not have any idea how to do this, so give Fausti a huge thanks for the info. I would also like to address that we are going make good use of the power of the terminal in this tutorial, and if you are afraid of it, don't be. It isn't hard at all. If you can start gedit and manage to edit any file in your /etc folder, you can use the terminal.

That being said, let's get FreeBASIC installed. Point firefox to www.freebasic.net and navigate to the downloads section at the top of the page. Download the Linux version. If you are unsure as to which Linux version to download, always download the stable version. This version has less bugs, and is more stable as the name implies. Save this to your desktop.

Before we enter a terminal, I want to make sure you understand what ~ is. It's Linux's way of automatically pointing to your home directory. For me, ~ is /home/nathan. Your desktop is at ~/Desktop. ~ will be used a good amount during this tutorial, so make good use of it. Now open Places > Home. Drag the FreeBASIC archive you downloaded to your home. In your terminal, type

>     cd ~
>     tar -xvf (Freebasic archive name)

You should have a folder named FreeBASIC. Type

>     cd ~/FreeBASIC

and you are now in this directory. To install it, type

>     sudo ./install.sh -i

Type your password when prompted, and you can now run fbc from anywhere you are in Linux. It doesn't actually install anything, it makes what is called a link. Whenever this link is accessed, it automatically links itself to ~/FreeBASIC/fbc. I, for one, think this is a great feature in the FreeBASIC Linux install script.

You now have all you need to run FreeBASIC, but you can't compile anything. It doesn't have any of it's dependencies installed! Fortunately for you, I have done the dirty work. Running this one command will install all the FreeBASIC dependencies, Allegro, SDL, and Scite.

>     sudo apt-get install build-essential libc6-dev  ncurses-dev libx11-dev libxext-dev libxpm-dev libxrandr-dev libxrender-dev  libgpm-dev liballegro-dev libsdl1.2-dev scite

Copy and paste that command into your terminal, answer yes, and sit back while Apt works it's magic. You can now open Scite, compile programs, every thing you want, but with no IDE. The rest of this tutorial is about configuring Scite for use in FreeBASIC. Although you cannot compile from Scite, I have found it is more productive to compile from the command line. You can view the raw error messages, you don't have to compile with X11 support, and you have more control over the options.

Now let's open up a terminal and open Scite by typing sudo scite. We need to run Scite as root because we are going to be editing the configuration files. When you run it to edit FreeBASIC source code, you should always go to Applications > Programming > SciTE Text Editor.

Go to Options > Global Options File. Now, go to View > Line Numbers. In the version I am using (1.67), it will work if you use the line numbers, but in the future they can and will remove and add lines. In other words, the line numbers are not guaranteed to be one-hundred percent accurate.

1. Find line #259, where it says "open.filter=\"
2. After "open.filter=\" (line 260) type "$(filter.freebasic)\"
3. Find line #414, where is says "menu.language=\"
4. Remove the "#" before line 415, where it says "#FreeBasic|bas||\"
5. Find line #489, where it says "#import freebasic"
6. Uncomment it (remove the leading "#")
7. SAVE.

Now, Close Scite. Reopen with "sudo scite" in a terminal.

1. Go to Options > Edit Properties > Open freebasic.properties
2. Find where is says "# keywords must be all lowercase" (at the top).
3. Before that line, put the following lines.

>     Command.compile.*.bas=fbc $(FileNameExt)
>     Command.build.*.bas=fbc $(FileNameExt)
>     Command.go.*.bas=$(FileDir)/$(FileName)
>     Command.go.needs.*.bas=fbc $(FileDir)/$(FileName)

4. Save and close. Open from Applications > Programming > SciTE Text Editor.

Kudos. You now have a working FreeBASIC installation, complete with X11 support, Allegro, and SDL. You even have syntax highlighting in Scite. Now whip out a terminal, make a ~/code directory, and give me some awsome programs developed on a free, open source platform with free utilities, and a free language.

Am I really that cheap?

## Final Word

It's great to be back!

Like I said before, QB Express is too good a thing to let die. If all goes well, this will be one of countless more issues. But if it's going to happen, we're going to need a lot of help. We're hoping that you would like to join the QB Express staff and be part of the magazine's rebirth. To join the revolution, just email QBExpress@gmail.com and tell us you want to help out.

The deadline for QB Express #23 submissions is: July 15th.

As always, we need tutorials, articles/editorials, reviews, news briefs, and anything else you feel like writing. You can email all of your submissions to: QBExpress@gmail.com.

Thanks for reading! Until next time...END.

-Pete

Copyright © Pete Berg and contributors, 2007. All rights reserved.
This design is based loosely on St.ndard Bea.er by Altherac.