Programming: Things We Should Take For Granted

Since an anniversary is coming up, and I’ve accumulated a nice chunk of experience in the years since I started learning how to program—I’ve been reflecting on what languages have thought me, about getting stuff done. This is also, obviously a rant.

That’s the cardinal rule. I don’t give a shit if it has more fan boys than Apple, or if it’s the most brilliant idea since they blamed the invention of fire on Prometheus. It has to be useful for getting stuff done!

Here’s some nick nacks that you should expect from programming languages since the 1970s, oh how little we have moved forward…







Serious Scoping

The ability to define modular scopes. In most cases this simply has to do with managing namespaces, either via built in language constructs (C++, PHP5.3, C#) or the natural order of modules in general (C, Java, Python), but really it’s trivial. It kind of has to do with building out of the whole ‘scope’ concept in general.  In other wards, we could say that a namespace is a kind of scope. Looking at the Wikipedia page, it seems someone agrees with that notion. Using this lingual functionality, you essentially have object oriented programming at your disposal: sans the the ‘tors hidden behind the curtain. Some languages even thrown those in, making OOP a real snap. While the inheritance model is popular and the less well known prototyping model is interesting, they are not required for achieving the core aims of object oriented programming; at least not the ones touted ;).

Anonymous Executable Code Blocks

Basically anonymous functions. This means we can write higher order functions, in other words functions can take and return functions. We can even do part of this in C through the use of function pointers (and C++ also has function objects, which are nicer if more verbose). But we can’t define those functions on the fly, right there and then, making things harder. C++ and Java will at long fucking last be gaining a solution to this, if we live long enough to see it happen. Most languages worth learning have made doing all this pretty easy.

Abuse of Lexical Scoping

This usually means lexical closures, which in tern makes the aforementioned anonymous functions a prerequisite for happiness in normal cases. They could also cook up something different but equivalent to that for a change, but alas don’t count on that! So the anon’ func’ thing is where it’s at for now. If the language lacks closures, it’s obviously a fucking moron, or it had better be old. C at least has that excuse. What about you Java? The road to 7 is a sick joke.  Anyway as I was saying, if you have both serious scoping and a way to define executable blocks without a name, you ought to be able to treat it just like anything else that has a value. Here’s an example in pseudo code:

var x = function {
  var y = 0
  return function { y = y+1; return y }
}

test1 = x()
test2 = x()

do { test1(); test2() } for 0 to 5

You can expect either of two things to happen here:

  1. Every function returned by x will increment the instance of y stored in x.
  2. Every function returned by x will get it’s own private copy of y.

The latter is the norm. I rather think the former is better, if you also provide means of doing the latter, syntactically; this makes the closing over of data more explicit. In terms of how it would look, think about the static and new keywords in many staticly typed OO languages and copy constructors, then you’ll get some sort of idea. I blame my point of view on this on spending to much time with Python. Ditto for my thoughts on memory allocation, courtesy of C.

While we’re at it, if the vaguely EcmaScript like pseudo code above was a real language: you should expect that function x {} and test1(), test()2 for … to be sugar for the relevant snippets out of the above, or else you ought to break out the tar and feathers! I wrote them as I did to make it painfully obvious what’s happening to people still struggling at var x = function {}. Kudios if you figured out why I wrote do { } for instead of for {}. If you’re laughing after reading this, after reading the above paragraph, yippe :-). If you’re now scrolling back up, then sorry.

Just shuddup & build it!

Which is so sorely missed in most compiled languages. There should be no need to define the relationship between modules or how to build it, it should be inferable from the source code. So should the type of most things, if the Lisp, SML, C#, and C++0x people are anyone to listen to. Building a cross platform C or C++ app is a bitch. Java is gay. Most dynamic languages are fine, so long as you keep everything in that language and have no C/C++ extensions to build. The closest that is possible to this “Just shuddup & build it” concept in most main stream languages, depends on dedicated build infrastructures built on top of make tools (FreeBSD, Go, etc) or IDEs. Either case is a crock of shit until it comes as part of the language, not a language implementation or a home brewed system. Build tools like CMake and SCons can kiss my ass. It’s basically a no win situation. JVM/CLI-languages seem to take a stab at things but still fail flat; Go manages better.

Dependency management also complicates things, because building your dependencies and using them becomes part of building your project. Most dynamic languages have gown some method of doing this, compiled ones are still acting like it’s the 70s. For what it’s worth, Google’s goinstall is the least painful solution I’ve encountered. Ruby’s gems would come in second place if it wasn’t for Microsoft Windows and C/C++ issues cropping in here and there. Python eggs and Perl modules are related.

Here’s an example of brain damage:

using Foo;

class X {
  public test() {
    var x = new Foo.Bar();
    // do something to x
  }
}

Which should be enough to tell the compiler how to use Foo. Not just that you can type new Bar() instead of new Foo.Bar(), should you wish to do so. Compiling the above would look something like:

dot-net> csc -r:Foo.dll /r:SomeDependencyOfFoo.dll
mono$ mcs -r:Foo.dll -r:SomeDependencyOfFoo.dll

Which is a lazy crock of shit excuse for not getting creative with C#’s syntax (See also the /r:alias=file syntax in Microsoft’s compiler documentation for an interesting idea). The only thing that a using statement lacks for being able to tell the compiler, is what file is being referenced, i.e. where to find the Foo namespace at run time. Some languages like Java (and many .NET developers seem to agree) impose a convention about organising namespaces and file systems. It’s one way, but I don’t care for it.

What is so fucking hard about this:

using "Foo-2.1" as Foo;

in order to say that Foo is found in Foo-2.1.dll instead of Foo.dll. If that sounds like weird syntax, just look closer at P/Invoke, how Java does packages, and Pythons import as syntax.

So obviously we can use the languages syntax to provide whatever linking info should be needed at compile time; figuring out where to find the needed files at compile and run time is left as an exercise for the reader (and easily thunk about if you know a few language implementations).

In short, beyond exporting an environment variable saying where extra to look for dependencies at compile/runtime, we should not have to be arsed about any of that bull shit. If you’re smart, you will have noted most of what I just talked about has to do with the compiling and linking against dependencies, not building them. Good point. If we’re talking about building things without a hassle, we also have to talk about building dependencies.

Well guess what folks, if you can build a program without having to bitch fuck about with linking to your libraries, you shouldn’t have to worry about building them either. That’s the sense behind the above. What’s so hard about issuing multiple commands (one per dependency and then again for your program) or doing it recursively. Simple. But no, just about every programming language has to suck at this. Some language implementations (Visual C++) make a respectable crack at it, so long as you rely on their system. Being outside the language standards, such things can suck my rebel dick before I’ll consider them in this context.

Let’s take a fairly typical language as an example. C# and Java for starters, and to the lesser extent of C and C++ as far as their standards allow, we can infer a few things by looking at source code. Simply put if the main method required for a program is not there, obviously the bundle of files refer to a library or libraries. If it is there, you’re building a program. Bingo, we have a weener! Now if we’re making life easier, you might ask about a case where the code is laid out in the file system in a way that makes that all harder to figure out. Well guess what, that means you laid it out wrong, or you shouldn’t be caring about the static versus dynamic linking stuff. D’uh.

Run down of the Main Stream

Just about every language has had serious scoping built in from day one, or has grown it over the years, like FORTRAN and COBOL. Some languages get a bit better at it, C# for example is very good at it. C++ and Python get the job done but are a bit faulty, since you can circumvent the scoping in certain cases; although I reckon that’s possible in any language that can compile down to a lingual level below such scoping concepts. Some might also wonder why I had listed PHP 5.3 earlier when talking about “Serious scoping”, well 5.3 basically fixes the main faults PHP had, the only problem is in common practice PHP is more often written like an unstructured BASIC. Die idiots Die. Languages like Java and Ruby basically run it fairly typical. By contrast Perl mostly puts it in your hands by abusing lexical scope. I love Perl.

In terms of anonymous functions, Perl, Lisp, and SML are excellent at it and modern C# manages quite nicely (if you don’t mind the type system). Where as C, C++, and Java are just fucking retards on this subject. Python and Ruby also make things someone icky: functions are not first class objects in Ruby, so you have to deal with Proc to have much fun; like wise Pythons lambda’s are limited, so you usually have to result to Pascalesque scope abuse to manage something useful, in the way of nesting things in the scope. Lisp is queen here, Perl and JavaScript are also very sexy beasts when getting into anonymous functions.

In terms of lexical closures across languages, I’ll just leave it to the text books.

As far as being able to shout “Just shuddup & build it!”, they all suck!!! Most of the build related stuff is not iron clad defined by the C99/C++03 standards documents, and you are a fucking moron if you expect the entire world to use any given tool X to build their C/C++ software o/. That rules out things like Visual Studio (vcbuild/msbuild), Make, and all the wide world of build tools you can think of. The most common dynamic languages in the main stream are better. In order of least to most suckyness Perl, Ruby, and Python make the process less painful; my reason for rating them thus is because of extension modules. PHP and Java, I’m not even going to rate. They provide tools to help you build and distribute your extension modules and your native modules. The only gripes come from the principal language implementations being implemented in C. For pure modules (E.g. no C extensions), they are excellent! The least painful language that I’ve gotten to use, has been Go – which has the best thing since CPAN. Which is still harder than it should be o/.

The question I wonder, is if it took until like the 2000s to get closures going strong after the serious scoping stuff took off by the late 1960s/early 1970s; will I have to survive until the 2030s-2050s to be able to bask in the wake of just being able to build stuff in peace? Most likely old friend C will still be there, but other languages should reach main stream in another 30+ years… not just the ones we have now. That, or we could go back to lisp…. hehehe.

Thoughts of ‘home’

Now this old article from Joel Spolsky makes me think of what it’s like to be here, *and* trying to get work done. Managing computer work flow is simple, at best, just tell everyone to go to hell or sign off the IM. After so many years of being on the Internet, I can usually juggle multiple tabs without any real loss to getting stuff done. Having to get up and respond to an interrupt, and usually being interrupted twice more on the way back to my console on the other hand, is something that occurs so frequently I’ve almost a spider sense about it…

If I had a penny for every time I’ve been shafted that way, for lack of being able to escape to a private bunker, I would have enough cash to pay off the national debt!

Experience shows me one fact: I am most productive when I’m camped in front of a laptop, all is quiet in the world, NO interrupts, no morons to wait on hand and foot, nada, not even a music stream. Oh, that and realising the clocks changed from PM to AM, and I’m still coding smoothly xD.

Son of a bitch !!!

I just finished a little personal training time… MP Peaks, I snuck past the terrorists, killing only about 3 of them on the whole map. All the while while having XFire doing video capture, so I can analyze it later, moved on to later trainings and guess what?

No recorded files for any of the rounds played, combined with Xfire In Game (XIG) chat not working anymore in RvS, becoming more buggy in SWAT 4: TSS, and Xfire is getting to be next to useless these days.

[switching to mental log]

My first session was perfect…. I spawned, checked my weapon, made a quick scan of the safe house at insert. Then moved up the hill line, checking the hill line cautiously for snipers… matching my profile against the terrain to avoid sky lining my body -> tangos can see through trees, and shoot through them without having to worry about bullet proof snow >_>. Dropped on my belly prone and crawled up, noting the positions of 4-5 sentries on the opposite side of the bridge, crawled around using the parked car for cover. Checked out the other snow bank, it was a clear trip through that sector; except for a lone tango crouched in the snow, watching my approach vector. Positioned myself to recce the site lines of more distant threats… only one that might notice. Plugged the tango with a controlled pair to the neck, since I would’ve had to stand up (and risk being scene by him) in order to go for a centre mass or head shot, or choose to shoot his legs out… Not good in RvS, usually results in runners who are only limped once they stop moving lol.

Crawled forward and dropped into the ditch, when I noticed another sentry moving to investigate… I let him get close to the body, and plugged him, a quick look & see for any other threats, clear. So I moved up, keeping prone to avoid exposing myself along my 12 o’clock, and noting sentry positions along the way. All was going smooth, until I came to the crest of a small hill, and noticed a group of four sentries. One staring out towards the bridge, and three by a tree near a hill. No one looking at me, but one decided to walk a patrol, so I had to take cover pronto.

I watched the enemies patrol carefully to anticipate his movements, but kept out of sight. Once he settled into position, I switched back to advancing, noting the positions of sentries by the cottage next to my escape point. Luckyly there was just one in a position to see me; plus 1 or 2 on the hill where the patrol man was. So I slide down into a narrow part to avoid being seen, if that creep started patrolling my way! One final obstacle, a lone tango guarding the escape point – a quick double tap centre mass and head, tango down

Stood up to a crouch and moved closer to the cottage for cover, then quickly to the escape point (green smoke). Victory!! Game over, when finally a tango comes around the far corner of the cottage and see’s me standing there, so I abused the bug in the game, scoped on in full auto and emptied my mag into him lol. The game has a bug, that when the round is ending, you can scope on and hold fire at the same time, and discharge your weapon without doing any damage (tangos can fire free, since they rarely use scopes lol).

It was a perfect exercise to limber up my stealth skills, but unfortunately no video to analyze my game play, and try to find ways to improve :. When we heard about viacom acquiring xfire, me and a few friends started joking about how long it would take for XFire to go down hill, but it has been faster then we expected haha.

The moral of the story?

XFire is a piece of shit

WWWeb nightmare from hell pages

I’ve just been through a waking semi-nightmare.

With the ISP change, my mothers had to deal with updating e-mail address across a number of accounts. It’s been weeks and the scheduling as finally sorted out for me to help deal with the various mailing lists and accounts from companies (adverts, news, sales papers, blah blah). All the time with me muttering how easy it should be for anyone to change such things, well guess what? I was blood wrong !!!!

Half of the mailing lists had to be unsubscribed and resubscribed, if there was a way to update it, the only practical means of doing so would be to e-mail the mailer program a ‘help’ message and see if it responds. Fluttering across the messages and the associated websites (where findable or Googlable) ranged from useless, to down right worthless. Some where actually pretty good, like the anti-virus data, figures they would make it simple ^_^. While others, it was just pitiful…. Hell on one — belonging to a fairly well known company in it’s category in fact. When submitting the form information, it through up an unhanded null pointer exception popup. Complete with a fucking stack trace and some paths data, for crying out fucking loud…. Showing any Joe blow submitting form data on the website, a bleeding stack trace!!!!

I’ve gone across numerics websites, ranging from looking nice to rather bloated. Aside from a bit of masturbation with JavaScript, the pages source code was the only decent thing about many of the websites I saw… Overall website usability was totally awful, like trying to back a tracker-trailer out of an outhouse without harming anything.

I know it takes a lot of work to make an attractive website, but geeze. How about actually making it a website worth visiting while ya at it fellas?

Opinions on tactical FPS

Rants, Rambles, and Raves… On Tactical FPS games

From a person who has been gaming since he was in diapers, using a Nintendo, and all the way into the future.

More realistic ballistics:

In old times, weapons were little more then you hit target, you do damage. And each hit from a given weapon doing so much damage, like 10% of life bar per bullet from SMG, 20% from rifle, Which is a piece of crap to start with, even by modern standards. More modern implementations might take into account mass, velocity, and hit modifiers.

Objects are generally boiled down to objects that can be penetrated and objects that can’t. In Raven Shield they take it a step even worse, an object that can be penetrated is usually limited to a destructible one. I.e. a bullet may penetrate a pawn (rainbow, tango, hostage), a window, or a door. But it won’t go through a carboard box, a cereal box, or wood fence, because these are all “solid bullet proof objects”.

When a bullet hits something, the mass of the bullet and the velocity it hit at should be taken into account along with the type of material hit and the density of it and the bullet. For example compare trying to penetrate a strong tungsten alloy and a tin can, which takes more punch?

SWAT4 essentially operates on the concept that if an object may be penetrated, the bullet has M mass moving at V velocity used to calculate it’s momentum. While the object being hit requires a certain amount of momentum to penetrate; if I looked deep enough into the games SDK, I wouldn’t be surprised if “momentum” was just a synonym for velocity to the developers… When the momentum is exceeded, the the damage caused by the bullet on it’s way through is modified by a modifier range or factor of how much damage it can still do.

What should really happen, in my opinion?

There should be several types of impact material, e.g. liquid, wood, concrete, metal, plastic. The idea is pretty simple, let’s say you take a gun and fire into a pool of water. For an object to occupy a space within that water, it has to displace the same volume of water out of it’s way, to move through it, it has to keep displacing water out of the way. Shooting through block of wood that is as thick as the water (e.g. same volume of) works about the same way, but the density is different, taking more force to displace the wood out of the bullets way in order to ‘penetrate’ the wood.

For the sake of performance it would make sense to have several known (common) densities with known properties and tune accordingly. It would still fall short of accuracy with the real world but make it easier to apply ballistics to all objects within the game.

The biggest problem with ballistics in modern FPS games, they continue to use the “can penetrate” and “can’t penetrate” stupidly…

Proper damage models:

Shooting a the representation of a human in a tactical FPS should have similar effects to the real world. Most often, you get a set of hit boxes based on superficial anatomy. A head, a torso, arms, legs, etc. And if your lucky a modifier that adjusts damage done based on the hit box, e.g. head shots fatal, leg shots minor damage or something like that.

I think they should take it a step further and apply more things based on the hit boxes. For example, why not take a leg? Break it into 4 hit boxes, the foot, the crus, the knee, and the thigh. If the target gets hit in any of the leg hit boxes, they should die! Bleed to death or fall into shock awhile later maybe… but not die out right as in games. Getting hit in the crus or the thigh should effect ones ability to walk, getting hit in the knee or the foot should probably force the target to crawl instead of walk.

The torso should be split into h8it boxes based on internals, the “general torso”, the heart, lungs, maybe the kidneys, e.t.c. A human might be able to survive several shots to the chest but I would think a double tap to the heart would have more (quickly) lethal effects, even if not as much as going for a T-Shot, I would think it more likely to disable the enemy in the sense of more games, and kill the target more readily.

Compared to games like Raven Shield (last patch) where it doesn’t really matter where you shoot a tango, just hit them 2ce and they are as good as dead, pardoning latency and the FN Five-Seven. And SWAT4 where the only side effect is it pays to follow the Mozambique drill — just to do enough damage quickly to put the target down. While in real life, the idea is if the double tap to centre mass doesn’t stop the target, taking down their nervous system will put’em down for good.

Weapons Attachments and kit restrictions:

I think AAO:SF has the best in terms of realism but makes for a too oft abused configuration, M4 with aimpoint + suppressor + M203. Raven Shield limits you to one attachment but that sucks, especially since it makes weapons like the AUG, SA80, and G36K more powerful (built in scopes) — further pissing off people who know about the Tavor Assault Rifles!

I think the proper solution would be to allow 2 attachments for all primaries, such as an barrel and an receiver attachment. So using the M4A1 carbine as an example. One could have an M4 with a scope and a suppressor or with a M203 and scope but not a bipod and a suppressor or an M203 and a suppressor, e.t.c. That would at least keep it fair.

Load outs, I really think a merger of the “package” and “individual” item ideas would work. For example, so many slots, like something like this:

Player Kit:
— Primary Weapon = None | SMG | AR | SG | SR | LMG | LAW
——— Front Attachment: None | Suppressor | Grenade Launcher | Bipod
——— Rear Attachment: Default sights | CQB scope | Magnifying scope | Night scope | Laser aiming module
——— Ammunition: FMJ/Slug | JHP/Buckshot
— Secondary Weapon = None | Pistol | TASER | Special
——— Pistol Attachment: None | Suppressor | Laser aiming module | Tactical light
——— Ammunition: FMJ | JHP | Cartridge

— Specialist item = None | Binoculars | Radio | Laser designator | Night vision goggles | Spy gizmo | Gas mask

— Demolitions item 1 = None | Breaching shotgun | Door breaching charges | Plastic explosive | Satchel charge | LAW ammunition | Breaching hammer | Breaching bar

— Protective Gear = None | Light | Medium | Heavy

Where light = Level IIIA, medium = level III, heavy = level IV on the NIJ standards.

And allot like 3 or 4 slots for grenade “packages”, say 3 slots holding a “two pack” of grenades.

— Grenade slot 1 = None | 2 x Fragmentation | 2 x Flashbang | 2 x Smoke | 2 x CS Gas
— Grenade slot 2 = None | 2 x Fragmentation | 2 x Flashbang | 2 x Smoke | 2 x CS Gas
— Grenade slot 3 = None | 2 x Fragmentation | 2 x Flashbang | 2 x Smoke | 2 x CS Gas

Which in my opinion would be the most flexible and much faster then having to equip each slot individually.

Breaching methods:

Ballistic breaching with shotguns, any shutgun capable of destroying the door and frangible breaching shot as well — in effect making hinge and knob side breaching possible. Explosive breaching with any suitable explosive, as well as dedicated door breaching charges, using shaped charges to blast through doors and windows, etc. Mechanical breaching with bars, sledge hammers, and even fire axes that just happen to be sitting handy.

The ability to break down doors, blow up walls, come crashing through windows, is just a requirement. You can’t have a tactical game unless you can conduct a full breach. Not having to use the “door” is also more realistic, why send everyone through one door… When we can sneak a team into the next room, frame charge through the damn wall. And employ snipers to pick off X-Rays through the windows — after coordinating kill zones ahead of time that is.

Vehicles:

One of the big problems with games is the “vehicle” selling point. In games like BF2 or Halo, they often become the gods of the battlefield, you have to use the vehicles to win.

By nature of things, vehicles make good transport and are very useful. But have to be controlled to avoid them becoming all powerful monsters of destruction in adversarial games. Having stuff like personal motorcycles and dune buggies or HMMWVs for transporting troops would be nice.

What I would like to see is AI controlled support vehicles that can be called in by team leaders using a “radio” item. So for example, a squad leader could call in an attack helicopter or a gun ship and have it circle in a radius overhead, attacking every enemy in sight.

To make that even sweeter, in some maps the enemy could have AAA and shoot the thing down !!!

That would open up so many possibilities, such as vaulting a few DPVs into the target area, send a group/groups to secure the objective, while the other members of the patrol set up a parameter, guards the cars for egress, and calls in a few helo’s for backup. The possibilities for hit and fade runs are infinite when that is combined with a map editor…

Game Types:

Round based Cooperative, following “mission” and various special coop types, e.g. search and destroy, recon, hostage rescue. Round based and respawn based team death matches in “objectiveless” team with the most points wins, capture the flag, and search and destroy games. Heck, you could probably convert coop levels over for use as player Vs. player missions by using some form of squad based spawn points for the defending team.

Mission Planning:

It’s imperative to be able to play the mission ahead of time and adjust in combat. Raven Shields F4 map sucks horribly but at least you can draw on it. A real planning map that can accommodative multiple floors would be perfect.

Team leaders need to be set, teams organized, mission objectives reviewed, and assault teams synchronized on their objectives.

Human Capabilities:

People can walk, run, crawl, roll, jump, e.t.c so why why not do like wise in game? One of the most annoying thing in Tactical FPS games is when you get killed in one of those, “I could have just … like in real life” moments. Walking should be quick but not to quick, watching a SWAT team on the moves a perfect example. Running should be quick and really jumble your aim around. The ability to crouch and crawl is a requirement IMHO, and on top of that. When going prone while running or dashing, one should go into a dive.

If your walking and drop to the ground, odds are you want to get on the deck eh? But if your running like a bat out of hell, odds are you might not want to stop where ya are and lay down!!! I think to avoid the bunny hopper problem, jumping should be limited to a very short height and while running, just enough to be useful, yet realistic for someone in ~15 plus kilograms of combat gear.

That would allow one to still move quick, jump quite short heights, and avoid the usual crap of not being able to jump at all, because nubs and pansies abuse it so often online.

One thing I would really like, is a special “physical” action button. One that changes what it does based on the situation, whne close to people, go for a rifle butt/pistol whip/CQC attack, when close to objects, try to push, throw, kick, or otherwise employ them. Such as kicking a chair across the room or flipping a table over — be versatile.

Team Organization:

It should be kept simple, AAO is a perfect example. Platoon leader, Squad/Section Leaders, Squad members. I think it’s useful to occasional have specialists but when it goes to the extent of say, BF2 or other class based configurations. I think you really loose all of the flexibility gained by having a tactical FPS modeled on anything beyond the general infantry…

Kit selection should define specialization options, not soldier “class”.

A perfect example, in RvS if we need more grenades, we bring more grenades, if we need a demolitions man, we bring demolitions! We don’t limit the demolitions man to a special class, we equip for the job. I think SWAT4’s split of grenades, breaching, and protective gear is the right style but the devs chose to divide it wrongly in terms of a Tactical FPS. But for simulation of Police SWAT environment, quite well since there are less, uhh… Fun toys to play with in most police departments >_>.

Graphics and Performance:

An Intel or AMD chip with performance comparable to a Pentium 4 in the 2.0-2.2 Ghz range, 768MB, and a 256MB Graphics card supporting OpenGL or DX9 decently would be an ideal minimal spec IMHO.

If you have a super gaming rig, you should get what you paid for within reason. If you only have a common gaming rig, you should at least be able to play the game smoothly with lower graphics. Games should look as *nice* as you can make them on your hardware but you shouldn’t need a $300 graphics card and double your RAM just to play.

Hell, a good make of GeForce 6800 is dirt cheap now and one of the best graphics cards of it’s generation.

Communication Functions:

Text chat, V-Commands, and Text Macros.

Text chat is the lowest common denominator of the internet, and most games require a keyboard and mouse to use properly ^_^. Pre recorded Voice Commands like that used in MOHAA, RvS, SWAT3, SWAT4, BF2, and such are great. The only problem is game developers almost never choose decent stuff and many gamers never bother to use them.

V-Commands should be a quick pop up menu and issued through keystroke OR mouse gesture and drop a HUD or on screen indicator that says WHO, WHAT, and WHERE. Like in SWAT4, you can see a marker of WHO issued the V-Command, you can hear the WHAT part, and when orders are given you can see the WHERE part marked on screen.

In game VoIP has always been a pile of shit, no matter what game that has implemented it, it has ALWAYS been shit. Striking a deal with the TeamSpeak or Ventrillo people for a dream-team setup that allows the game to auto-join certain servers/channels from in game or when just joining the a given team on the server.

I’ve always liked TeamSpeak because its channel commander feature offers a lot for serious team gaming.

The ability to record text macros in game, without having to use keybinds like in Unreal 2 games, I think is something every FPS should do. SWAT3 is one game that really got it right, text + sound bites. Although, being able to open your configuration data in a text editor and adjust things to taste is, like the hugest perk ever created.

User account and Points / Rewards system:

Having any kind of spend your life playing this game and racking up kill points, and we will reward you with unlocks. Is just a crock full of shit, it’s a marketing gimmick to make you play the game longer and an excuse to sell you expansion packs that add features that, often in my experience — should have been there in the first place. Or freely able to be made by a modding community.

Game Mods:

SWAT3 was perfect, download ZIP file, copy ZIP file to folder, flick the on/off switches for what mods you wanted to play. Launch game, and play. The mods you had on got used when hosting the game but when joining OTHER peoples games, WITHOUT RESTARTING. The game would load the required mods for joining other peoples games, as long as you had them installed.

That is the way it should be, having to restart the game to swap mods or worse, having to use a conversion utility (e.g. MW4:Mercs) are just piles of crap, unless of course. You want to appear to be a company that would rather lock people into buying expansion packs or sequles that your not obligated to make, rather then letting people extend what hopefully is a decent game, and make it better!

User Accounts and Anti-Cheat:

The games got to have some way of ID’ing users uniquely, PB generally does a decent enough job of it. While I don’t care much for PB, and in fact have never had much use for it as anti-cheat (aside from the spying part). It does do one good thing.

It helps enforce server policy.

Level Design:

Missions need multiple ways of completing it, unless the game is a “quickie” that you’ll play once and then chuck on a CD-Rack, which means there is no point in paying more then ~20 bucks for it.

Problems should be approachable from many different angles, there should be multiple paths available on most missions. Objective and enemy placement should be able to be randomized, one of the greatest things of early SWAT3 was that the missions placed some “mission” specifics in a normal set of spawn points, then placed other stuff in more random locations. No playing from memory, you know X, Y, and Z are choke points, you know hostages may be on Level 2, but only the machine knows what you will find in between ^_^.

HUD:

A customizable hud, the ability o change colors and whats on it works best.

The ability to have a small tactical map or SAI like element is ideal. Having helmet cameras and UAV feeds available and the ability to reorganize the HUD and toggle cams on/off based on position in the team — is even more fun 😉

Cross hairs should be used but be able to be disabled (I for one prefer no cross hairs on my HUD, unless I’ve got grenades). Iron sights and scopes should work on every weapon available but allow for proper shooting. In CQB, you don’t aim with the sights for every shot, learn how to use the weapon.

When it comes to ammo counts, I think the traditional rounds in the magazine counter is nice, although not really necessary once you get used to how the game tunes the rates of fire. What is important is knowing how much ammo you have left. I love how SWAT4 implements it, you know how many rounds are in your current magazine. You can see how many magazines you have on the HUD and how “relatively” full they are. Magazine based ammo tracking is much more accurate the the old NNN total rounds remaining ammo counter anyway.

I think moving some features that would really improve the value of a HUD, into a separate “PDA” screen would be useful. B ecause then one could really stretch things to realistic limits, targeting people like Robocop or a T-800 are a bit futher off for most troops in the 21st Century.

Note to self, don’t use GNU m4 on Win32

Bah, humbug !!!

the focal point of the entire operation is a suitable pre-processor.

The idea:

defined test substitution macros generated by front end for pre processor

template file that relies upon said macros

output to be generated from preprocessing the macros from in the template.

The problem?

Target platform: MicroShaft Windows NT 5.1 (XP)

At first I figured I would use the C Pre-Processor since MinGW is on the target box, along with several other development tools.

Then I remembered I have GNU utilities for Win32 installed on this machine. So I took a look and found that a port of GNU m4 v1.4 is installed. I learned enough of the m4 ‘macro’ language just for tasks like this but guess what!

m4.exe fails to expand all macros in the template file.

Being more then somewhat disappointed, I ssh’d into my OpenBSD machine and fed it through the m4 implementation it comes with (not GNU), and guess what?

That freaking works fine.

*unzips fly, pisses on m4.exe*

Odds are the 1.4.11 version of GNU m4 I have on FreeBSD installed from ports works, hell scripting OpenBSDs sed works for this task, let along custom perl !

So I’ve just used vim to quickly :%s/m4 defines/cpp defines and seem to have to use that in order to get it working. Nice, simple, and effective.

*grrrrr*

One mad Spider !

For the first time, the PC-BSD project has irk’d the wrong button on my panel. In what appears to be issues with commerical software being able to abide the same quality standards and “short-commings” of the PBI system that joe packager has to deal with. Pkg_add of the main program is now allowed in a PBI. So I guess if I wanted to make a PBI of Xine I could force pkg_add Xine and no one would care weather or not that pkg_add’d the xine lib(s) used in Kaffine and then deleted them when forcing a pkg_delete ! (Still in the hypo-theory field here). Still I find this un acceptible. Such a change should have been made all of 3 weeks after PBI’s started installing into /Programs instead of another area prefixed with My 🙂

In short they have had a lot of time to deside this but they do it now why ? To me it feels as if it’s because compiled Win4BSD can’t run that way or because with the PBI system as it is (now was) breaks it. Win4BSD does not look open source to me and I have no other problem with paying for such a program. If the program needs to be changed internally to run on PC-BSD as a PBI *They should do the Frigging work*. If it can’t just work right with the way a PBI installed program is supposed to because of the PBI system rather then the program. * PC-BSD is flibbing late about making changs to fix this ! *. In short I’m very annoyed that it looks as if a commercial project can make an Open Source Operating System bow down to cater to it in order to put their product on the offical PBI directory with a stamp of approval. It would seem Win4BSD Distribute the product only in binary form. The Win4BSD people all ready offer the Schweine of a PBI for download on their own mirror. Why should PC-BSD bend over backwards to get a pkg_add frontend PBI of a commerical product on offical mirrors. It makes no sense !!

PBI were ment to be easy to install/uninstall and not touch the system directly. Allowing oen to uss a pkg_add of say konversation but not adding qt/kde pkg’s via the PBI is one thing if done right. You also have to remove any lib’s from the pkg used in the PBI before using it e.t.c. to make sure which is another level of work on a PBI Developer. * a frigging nightmare for PBI testers as well if they ever forget to read the scripts before installing *. If you want a front end to pkg_add theres no reason to PBI it. Just use a KDialog ina install.sh file…

I’ve Contemplated removing all of my PBI installs (reinstall via ports) and demanding my XMMS, Megamek, and Blackbox+BBKeys+BBConf+BBPager+Docker PBIs removed from pbidir but what good would any of it do ? I’m only a PC-BSD user, a mighty annoyed one at that. I’m not the kind of person to “jump ship” when stung but this irks me. I’ve all ready tried to distance my self from PBI Development for my own issues but this is beyond issue. How to wage a war for principals slain by it’s founders? I’m not sure yet… Find a way I very well may. All I can say is I learned a very good phrase in German to day for what I have to say to them.

/* retracted */

This is not the last time my voice will speak.