From The Editor's Desk

Written by Pete

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!

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.

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.

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."

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.)

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 :

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

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.

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.

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.

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?

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!

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 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.

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

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.

'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

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:

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.

I was naive - I had no idea how crappy my programs were, and I thought I was the greatest
programmer in the world.

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.

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.

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 UnknownTunnel 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 score5.2/10

Get Tunnel Striker

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:

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

Conclusion

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!

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.

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:

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:

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):

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.

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:

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':

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.

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.

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.

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:

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.

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.

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.

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.

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.

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.

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.

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.

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.)

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.

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

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.

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:

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.

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:

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.

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.

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.

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.

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.

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.