Friday 6 November 2015

Designing the Automated Office 1984

I took some photos out of an old book, Designing the Automated Office (by Pulgram and Stonis). Mostly it's the usual early 1980s normative design guideline book with scientific-looking diagrams and measures, but it also has nostalgic photographs of cute terminals and overtly neat environments. Published in 1984, the material reeks more of late 1970s stuff, not very visionary or with the latest trends. Unix, CP/M and Xenix are the only OS mentioned, it's as if personal computer revolution had not happened at all.

Sorry for the poor quality, these are simply mobile snaps. Maybe improved later...

A company that worked on computers would probably be an early-adopter...
Not a huge expert on offices, but I've worked in some and been involved with it as a topic. Office space trends are obviously always in transition, but what's particular about this era is that the layout of the office still remains fairly traditional, yet is invaded by computer terminals and equipment. Soon after, developments in computer applications among other shifts started to erode the traditional office space layout, too.

Old CAD workstations prove that Apple didn't invent GUI. Design-metaphor ought to have become the generic GUI metaphor, and not the desktop! 
It seems to have been terminals all the way. Most of the stuff has probably been thrown into the bin since, and is not that noteworthy. The outer designs are fascinating, though, as there seems to have been broader ideas about what a computer terminal in an office ought to have looked like, before it all settled into grey rectangular boxes in the 1980s.

Another cute, if repetitive, semi sci-fi environment.
When discussing future offices, a lot of expectations are put on voice recognition (as still is) and "smart walls" with text recognition (we are still waiting). In 1984, it may not have been hard to predict that video projection would become commonplace, but they sort of missed the mark on what would be reasonable complementary technologies. I've yet to see any really sensible smart wall product for office. Possibly this is because although smart walls are feasible now, the settings in which they were envisaged for are not really there anymore.

I'm wondering if that's a microwave oven or some kind of information superhighway.

Prior to computers the office kinda was the "computer", so as computers matured the office as an environment started to become a bit redundant. There's some indication of this in the book, as portable computers and gadgets are discussed. These are a bit naive in hindsight, but what else they could have imagined?
Typing "please come in", the text would handily appear outside the door, where the client was waiting...

Saturday 17 October 2015

A little something about Finnish computer magazine scene

MikroBITTI, the Finnish general computer magazine published from 1984 and discontinued in early 2015, has now fused with another magazine, born again with the original logo and a promise to focus on computer technology. Published monthly, the new mag concentrates on reviews and commentary of computing products, spiced with more speculative futurist articles, tutorials and opinion pieces. This is very much in line with the original magazine which inherited the review-orientation from the long-running Tekniikan Maailma ("The World of Technics").

MikroBITTI and Skrolli head-to-head. WHICH ONE WILL WIN
This is not the only new paper-based computer magazine that uses the 1980s recipe to attract new old customers. Skrolli, published from since 2013, 4 times a year, instead focuses on non-commercial, hacker, DIY, development, programming and demoscene cultures and rarely if ever includes consumer reviews. Skrolli was the first to tap into this new niche of catering for the, let's say, 40-somethings who grew up with Commodore 64, Amiga and early PCs.

It's a bit too early to compare the two magazines, as there's only one issue of the new MikroBITTI. Based on that I have to say the reborn MikroBITTI succeeds in re-orienting the magazine to a better direction, but it remains to be seen if it can be as interesting experiment as Skrolli. The reviews are surely extensive and include many devices that might otherwise be missed, now that there's an abundance of technical computer gadgets for different markets. I'm just wondering if there will be any product category left to review for the next issue! As a quarterly, Skrolli perhaps has to rely less on immediate topicality, striving towards more "deep" content on current themes.

It is arguable the new MikroBITTI has followed the example of Skrolli, but I have to say at the moment the two publications are quite different. The nostalgic logo and the graphic design were attractive enough for me to buy MikroBITTI, and I suppose many people felt the same way. The journalism, although maybe more evenly professional than in Skrolli, is also a bit generic and conventional. Although Skrolli in contrast has a more generic graphic layout, the inclusion of "amateur" images, drawings, photographs and an unapologetic use of crude screenshots helps give a friendly DIY-tone to the magazine.

Example of the stylish graphic design in the insides of the born-again MikroBITTI
Why paper now?

It's interesting that there would now be a market for paper magazines. In the UK, the number of magazines has been constantly dwindling, and only some very niche "retro" oriented publications could enter the market. Even this is already a fairly old phenomenon. Skrolli and the new MikroBITTI are not at least decidedly retro- or games-oriented. It's more like if someone in the UK thought that Your Spectrum (ca. 1984) had a great concept and ought to be seriously (and not only as a nostalgic one-off) re-wired for today's audiences.

Especially one has to wonder how some of the most techno-enthusiastic people would now clamor for an old-fashioned paper publication, even if they may have been one of the first to move away from them. (Consider disk magazines, 1990s BBS scene, internet etc.) One reason may be that there is a whole generation of computer users who grew up with magazines like BITTI and Printti, even if they may have abandoned them later. These people long lamented the lack of good computer journalism, which the 2000s magazines allegedly failed to deliver. Or I'll take that back - the old journalism wasn't that good necessarily - it's just that there was a specific mixture of elements that sort of disappeared from the market as internet began to make it unnecessary.

So there might be a market but what do they want? The cliché "audiences want well-curated content" is somewhat valid, but there's no reason why it would not work on the internet too. Yet I suppose over-abundance of daily-updated information and the effort that goes in searching the web can reduce attractiveness of specialist websites. Tired of constant feeds, audiences might want to return to the occasional bundle of information and entertainment. It is nice to browse magazines that have made choices for the reader and don't appear too often. The paper magazines may also better function as kind of banners under which the readers can show allegiance and support to a culture of computing they wish to foster.

What for?

The home computer technology has long become separated into two directions: On one hand, the earlier "pure computer" hardware, and on the other hand, all the commercial gadgets that achieve specific tasks (facebooking, messaging, camera, calendar etc). The computers in the first case are not "for" anything. Skrolli embraces this fully. Skrolli is more about the "cultures" of technology, digging the areas that commercial computer journalism and academia don't quite cover. I fondly remember the Issue 3/2014 which featured articles on Forth, Emacs, soundtrackers, fixing old pinball machines, Amiga... All simply because this is interesting now and by itself, and not just as a historical overview. An inspiring mess.

MikroBITTI seems to believe in the usefulness of the computing technology in every day life. The reviews in BITTI are a powerful means to collect at-a-glance overviews of latest computer technology that reside in the periphery of your interest, whereas Skrolli at it's best is able to probe into a rich thematic variety that inspires the reader even when the topics are not directly relevant to me. Both are fun to browse.

In any case, the paper magazine trend may turn out to be a fad only related to a particular generation of Finnish computer enthusiasts, feeding on nostalgia of something disappeared. Nerds-turned-busy dads may want their nostalgia/news arrive at their doorstep rather than spend active time to find it. Yet this generation may also prove to be a loyal customer, if the magazines can continue to deliver interesting content.

Edit: The second issue of MikroBITTI just arrived. It has roughly 50% of reviews, spearheaded by a meticulous wifi-router comparison. The appeasing of "retro" fans has ceased, no more posing with an MSX or talk about Amigas. The cover seems to have reverted a bit towards the consumer-style magazine, promising mobile phone reviews and the wifi-router article. The general interest articles are pretty nice, one about the anatomy of silicon chips, and another about the history of Finnish on-line discussion cultures. There's also a little piece about Habitat. I'd say we're still heading a pretty good direction, a bit worried the reviews take so much space.

Pathetic trolling! Everyone knows Atari ST was better.

Wednesday 30 September 2015

The Recreated ZX Spectrum


Just a quick note on the Recreated ZX Spectrum retro Bluetooth/USB keyboard.

Appearance

The designers have done a good job making the Recreated look almost exactly like a real Spectrum. Even the rubber feet and faux-heatsink holes are in a correct position. Obviously the backside is different from the original, because it's not a computer and does not have Spectrum connectors.

The inevitable comparison
On the surface, there are very minor differences. The Sinclair ZX Spectrum logo is embossed a bit taller and the angle for the elevated back is a bit different. I have to appreciate they did not add any "recreated" or other new logos on the device. Maybe, just maybe, the metal panel bends ever so slightly due to the way it has been connected.

Having said that, it really looks like a Speccy. To me the surface matting, paint glossiness, key graphics - all are ok. It would be unfair to nitpick on the differences.


But how does it feel? It's not as heavy as the original, but the perfectionist might correct this by inserting some weights inside. (The case is held together by screws). The keyboard feels quite as it should, maybe the touch is just a tiny bit lighter. Am I imagining the keys have more tendency to bend at an angle when you press them? Acoustically, the key presses sound a bit sharper and have more "echo" to them.

The keyboard is pretty much as atrocious as the original, which is a compliment here. It remains to be seen how much I can get used to it. I tried to type some of this blog post with the Recreated, but gave up after a paragraph.

Functionality

The Recreated is mainly intended to work with the Elite Systems' Spectrum app on the iOS appstore. My interest is in getting it to work with a PC, so I've not even tried the app.

A lot of effort has gone into enabling the keyboard to work on iOS devices both as a keyboard and a gamepad (not only for the Spectrum app) and as a normal PC-keyboard. However this means that at least currently it won't work directly in emulators as a 100% Spectrum-equivalent keyboard. For example, getting the " character does not result from pressing Symbol Shift+P, as it is mapped to shift+2. Perhaps if emulator makers accommodate, the Recreated will be a slightly better deal in this respect.

I was worried the keyboard might not work without batteries, but the included USB cable is sufficient, and I prefer this to wireless. Obviously the Bluetooth is the way to go with mobile devices.

One unexpected thing was the "unlocking" procedure, which you have to do to get the device to work properly as a keyboard. This is easily done online at the Elite systems website or through the app, but still to me this felt a bit of an added rigmarole. Fortunately the device appears to remember the setting.

Sorry about the weird angle but I was not going to dismantle it more for the time being.
Looking inside, there's a lot of free space. The battery holder means the case is not that easy to mod into a real Spectrum case, but it might be within the realms of possibility. Note though the keyboard membrane cables are different and come out from different places. Interestingly the designers have preserved the 5/8 (5/10 really) division and possibly the original membrane matrix. The usual RWAP replacement membranes probably cannot be used here.

Addendum: I checked if the plastic pieces are interchangeable with old Spectrum case parts. I found the Recreated bottom and old Spectrum top fit together somewhat ok, but not the other way round. The changes required could be minimal, though. This, of course, without the PCB inside. 

So, the situation is fairly good for projects that combine the Recreated keyboard with an old computer. 

An old PCB does not fit well inside the Recreated bottom, even if the battery holders were removed. There's a specific groove for the PCB in the real Spectrum case which does not exist in the Recreated. 
The red arrow points to the lacking PCB groove.
An Arduino fits inside without any changes, using low or bent cables for the I/O pins. A Raspberry Pi could just about fit there, if the battery holder is removed and care is taken in positioning the board.

All in all

If someone has decided to limit their Speccy-activities and game playing on a mobile device, the app+Recreated might be good combo. Text adventures and complex games are really crying for a keyboard anyway.

For a more involved retro hobbyist like me, it's harder to pinpoint a really good use. I have my real Speccies, and emulators do not greatly benefit from this keyboard because of the key mapping. It could have been nice for a bit of BASIC programming. It's kind of fun for games, though. I would like to connect it to my ZX Evolution, but it's a no-go because the Evo uses PS/2 keyboards.

A Kempston/Atari joystick connector would have added more value to this, but admittedly it's a bit hard to see how it could work in a simple way. Cursor emulation?

The ZX Spectrum Recreated might be expensive, I maybe paid more for this than on any single retro computer I've bought (but then I'm a cheapskate) but I suppose that's not a major issue. It's not much more expensive than many specialist keyboards, although I'll have to repeat a ZX Spectrum keyboard, recreated or not, doesn't really work as a good PC keyboard replacement.

I'm positive about the product in the sense that this might mean more real ZX Spectrums in the future, now that there is a precedent for manufacturing the required physical parts. Time will tell...

More info:
http://sinclair.recreatedzxspectrum.com/


Friday 11 September 2015

Line-Line intersection test

I once did some programming that required mathematical line-line intersections, and it's really something that can't always be easily found ready-made. The mathematical formulae and "theory" are readily available, but are not easily converted to practical situations.

Below I have a Processing sketch that includes the function intersection which compares two lines. Copy/paste the text below into a processing sketch window and go. Everything else outside the function is just to facilitate the demo sketch. Moving the mouse pointer around moves the other line, whereas the other line moves randomly.

It's based on a very old program so it might not be up to scratch. My previous work also returned the intersection coordinate (what I was really after), so this is clearly a simpler case.

There's always the problem that two parallel lines, even if they overlap visibly, coordinate-wise they may not intersect mathematically. For example, lines 0,0-100,0 and 50,0-150,0 do not intersect. The program below does not solve this case. I've supposed that making multiple intersection tests with suitably "jiggled" coordinates might fix this problem for some practical purposes.


Not intersecting!

Intersecting!


float [] xp=new float[8];
float [] yp=new float[8];
float [] xv=new float[8];
float [] yv=new float[8];

boolean intersection(float X1,float Y1,float X2,float Y2,float X3,float Y3,float X4,float Y4)
{

//Tests intersection between lines x1,y1-x2,y2 and x3,y3-x4,y4
//Not sure where the original formulas are from.

//The function has the practical problem that parallel lines do not intersect.
//This may be circumvented by "jiggling" the line coordinates just a bit and making two intersection tests, not implemented here

//My original function returned the intersection coordinate, this is a simplification

 float ua,ub,denom,numer;

//not sure if the following are needed really

 if(X3>X2&&X4>X2&&X3>X1&&X4>X1){return false;}
 if(X3<X2&&X4<X2&&X3<X1&&X4<X1){return false;}
 if(Y3>Y2&&Y4>Y2&&Y3>Y1&&Y4>Y1){return false;}
 if(Y3<Y2&&Y4<Y2&&Y3<Y1&&Y4<Y1){return false;}

// the proper calculations

 numer=((X4-X3)*(Y1-Y3)-(Y4-Y3)*(X1-X3));
 denom=((Y4-Y3)*(X2-X1)-(X4-X3)*(Y2-Y1));

 if(denom==0){return false;}

 ua=(numer/denom);
 numer=((X2-X1)*(Y1-Y3)-(Y2-Y1)*(X1-X3));
 ub=(numer/denom);

 if(ua==0&&ub==0){return true;}
 if(ub>0&&ub<=1&&ua>0&&ua<=1){return true;}

 return false;
}

void draw_lines(float xa1,float ya1,float xa2,float ya2,float xb1,float yb1,float xb2,float yb2)
{

  if(intersection(xa1,ya1,xa2,ya2,xb1,yb1,xb2,yb2)==true){
    stroke(255,0,0);line(xa1,ya1,xa2,ya2);line(xb1,yb1,xb2,yb2); 
  }else
  {
    stroke(0,255,0);line(xa1,ya1,xa2,ya2);line(xb1,yb1,xb2,yb2);
  }
}

void setup()
{
  size(512,512);
  strokeWeight(2);
  xp[0]=16;yp[0]=16;xp[1]=64;yp[1]=64;
  xv[0]=2;yv[0]=1;
  xv[1]=-3;yv[1]=-1;
  xp[2]=width/2;yp[2]=height/2;xp[3]=width/2;yp[3]=height/2;
}

void mousePressed()
{
  xp[2]=mouseX;yp[2]=mouseY;
}

void draw()
{
  background(0,0,128);
  draw_lines(xp[0],yp[0],xp[1],yp[1],xp[2],yp[2],xp[3],yp[3]);
  for(int i=0;i<=7;i++){
   xp[i]=xp[i]+xv[i];
   yp[i]=yp[i]+yv[i];
   if(xp[i]>=width){xv[i]=-(1+random(2));}
   if(xp[i]<=0){xv[i]=1+random(2);}
   if(yp[i]>=height){yv[i]=-(1+random(2));}
   if(yp[i]<=0){yv[i]=1+random(2);}
  }

  xp[3]=mouseX;
  yp[3]=mouseY;
}

Wednesday 19 August 2015

ZX Spectrum isometric


The item in question.
This is a look at isometric adventure-type games on the ZX Spectrum, where the genre originated and mostly thrived. They were popular in the mid-eighties, especially in the UK. Spectrum game development in the UK was relatively insular, so I feel justified in tracing all the influences back to Knight Lore and some of its more important imitators.

Brace yourself! There's going to be a lot of samey-looking 1-bit monochromatic graphics!

1984: The Beginning

Knight Lore introduced the whole "Filmation" concept. The Congo Bongo-esque player character could move around rooms, behind and in front of objects and act on them physically. The environment was dynamic: objects could be pushed around by players and monsters alike.

Knight Lore. Push those tables to reach the objects. 
This gave an impression of all things being treated equal within the game world, something not often seen outside Boulder Dash. Objects pushed over the edge fall, monsters change their direction when encountering objects etc. Dropping an object over a monster would create an ad hoc moving platform that could be occupied by the player. These were unprecedented elements in an action game.

1985: Ultimate holds the ball

Notable: Alien 8, Fairlight, Nightshade
Others: Enigma Force, Cylu, Chimera

Ultimate's own Alien 8 did little to alter the Filmation scheme, using the same engine with a sci-fi backdrop. Some rooms had a remote control for another drone robot, suggestive of the multi-character games to come. Nightshade introduced scrolling, but this was at the expense of more complex character-world interaction.

Left: Enigma Force. Right: Nightshade with scrolling graphics, from Ultimate
I'm listing Enigma Force here, even if it is not really part of the genre. The developers, Denton Designs, would also go about creating isometric games. This sequel to Shadowfire utilized a more direct frontal perspective, but it also employs the kind of depth-sorted masked graphics seen in isometric games. It is notable for its multi-character gameplay, speech bubbles and icon driven interaction, elements that would also re-emerge in other titles.

Cylu and Chimera are small games where the perspective element is simplistic compared to Ultimate offerings.

Fairlight, and then some more Fairlight
The most important game here is Fairlight. It eschewed the cartoon-style graphics of Ultimate games in favor of a more "naturalistic" views, built out of lines and fill patterns. Admittedly, the rooms had often less content than in Knight Lore, and the sprites were smaller. It also introduced a heavy dose of "what the fuck I'm supposed to do" style of adventure gaming, which depending on player tastes were either an improvement over Knight Lore or not.

1986: Floodgates open

Notable: The Great Escape, Batman, Fairlight 2, Movie
Others: Strike Force Cobra, Sweevo's World, Pyracurse, Gunfright, Rasputin, Nosferatu, Pentagram, Molecule Man

1986 saw a spate of isometric games released on the Spectrum. The developers had not only Knight Lore to look up to, but also Fairlight and Nightshade. Ultimate's own Pentagram seems poorly conceived in comparison to what was on offer. Gunfright, built on Nightshade's scrolling routines, at least offered an original wild west scenario. The 128k-only Fairlight 2 expanded on the first game, but offered little new. At least the forest environment showed that the rooms need not be made of rigid blocks.

The Great Escape
The Great Escape by Denton Designs was a different type of game altogether. The prisoner suffered a daily routine, which the player was encouraged to break at suitable moments in order to win the game. The Great Escape is an imaginative blend of adventure components with action elements in a clockwork world. The scrolling portions are more impressive than in Nightshade, though again the sprites are a bit tiny.

Left: Swift scrolling in Pyracurse. Right: Strike Force Cobra with some clever coloring.
Developers experimented with adding multiple characters to games, as in Pyracurse and Strike Force Cobra. SFC characters could crouch, jump and somersault, kick doors in, shoot machine gun in various directions and throw grenades. Sadly the environment was not that accommodating, as there was not that much to shoot or blow up. Certain puzzles could only be solved by co-operation of two characters. There was a hilariously detailed character selection screen, which as far as I can tell made absolutely no difference in the game.

Batman by Jon Ritman and Bernie Drummond, released by Ocean.
Building on the basic Ultimate formula, Jon Ritman and Bernie Drummond added graphical detail and little nuances to create Batman. Shifting the balance from jumping-oriented tasks to a variety of puzzles, Batman could offer a more honestly straightforward and at the same time more diverse game experience than other imitators. Batman needed to collect various items before he could even jump or carry items, and this modification structured and varied the game somewhat.

Left: Rasputin, Right: Nosferatu
Rasputin is a depressingly difficult jump-and-avoid game that makes use of the Enigma Force-style frontal perspective. Despite some impressive graphics, the game does not seem that well thought out. Sweevo's World did away with jumping altogether. The game is still quite three-dimensional, as lifts can be employed to move the character up- and downwards. The rooms are often self-contained puzzles that require careful object placement. Nosferatu is an uninspiring vampire hunt in a pretty static world.

Movie from Imagine.
Movie brought stylish graphics and an original storyline about 1930s gangsters. Graphic user interface, pistol shooting, melee fights, typed speech bubbles, free-roaming characters, thrown object "physics", Movie seemed massive back at the time. Yet the icon controls made the gameplay an excruciating experience. To throw a punch you had to enter the icon mode, select the fist icon and press fire. Ditto for firing the pistol. No key shortcuts either.

It seems 1986 brought a lot of sophistication to isometric games. However, ZX Spectrum games were often faux-complex, with sprawling empty maps and unnecessary objects to throw the player off the scent. One buzzword was "icon-driven", despite the fact most of the games would have worked better without. Isometric perspectives and graphic interfaces made good screenshots in magazines, but the games themselves could be surprisingly sparse.

1987: The genre starts to age

Notable: Head Over Heels
Others: 3D Game Maker, Bubbler, Martianoids, Hydrofool, Greyfell, Get Dexter

1987 saw both the pinnacle and the nadir of the isometric phenomenon. On the one hand we have the much-lauded Head over Heels, a game which took the best elements of Batman, scaled and revised into a tight puzzle-oriented game. On the other hand we have 3D Game Maker, an editor for creating formulaic, often substandard isometric games, which I will not name here.

Head over Heels
Head Over Heels combined a couple of good ideas that had been floating around. Isometric games were usually notorious for their sprawling maps, and the bit of episodic structuring HOH gave was very welcome. Sweevo's World had already introduced kind of multiple selectable "worlds", but these were simply different starting points that did not really compartmentalize the game.

Strike Force Cobra and others had shown that multiple character cooperation could add new types of puzzles. HOH showed restraint in having only two characters with genuinely distinct abilities. Thus, Head Over Heels tempered many past elements into a more balanced whole.

Left: Bubbler Right: Martianoids
Bubbler and Martianoids are not strictly isometric adventures, but should be noted as they were published by Ultimate. Bubbler is more of an arcade game (Like Marble Madness or Spindizzy) with fast scrolling and puzzle elements whereas Martianoids clearly follows Alien 8 with the standard Ultimate graphical flair. It plays on a flat landscape, though.

Hydrofool. Note that we are underwater now, playing that Gollum-esque character. A bit of a gimmick, really.
Hydrofool was a sequel to Sweevo's World. Even though the rooms are underwater, the character could mostly swim in a defined flat "plane", which sort of makes me suspect it's Sweevo's World all over with just overhauled graphics.

1988: The last significant isometric Spectrum games

Notable: Inside Outing, Where Time Stood Still, La Abadia Del Crimen (The Abbey of Crime)
Others: Phantom Club, Super Hero, Last Ninja 2

1988 saw only very few inspired isometric games. The super-hero themed Phantom Club is worth mentioning mostly because it was authored by the same people as Movie. Despite good running-and-somersaulting animation and improved technical routines, the result is not as inspiring as Movie. Last Ninja 2 was converted from the C64, skipping the first part altogether.

Left: Detailed scenery in Inside Outing. Pretty much everything can be moved. Right: Phantom Club boasted some bold color choices.
Inside Outing is another conversion from Amstrad. The game has a thankfully simple goal of retrieving a bunch of diamonds inside a crazy mansion. Rather than go for a huge amount of empty rooms, the spaces have an unprecedented amount of objects which all interact.

The screen update is still fairly fast, boasting some sophisticated isometric routines. It looks better on Amstrad/C64 - with colourful graphics - finally showing that the Spectrum might not necessarily be the only platform for the genre.


Left: La Abadia Del Crimen. Right: Where Time Stood Still
Where Time Stood Still is a kind of successor to the The Great Escape, and although aficionados would be satisfied, one could say it was mostly same old. Much like in Denton Design's earlier effort, Enigma Force, there are four player characters crash-landed into a hostile environment. Icon control, speech bubbles, food/fatigue levels, arcade action and whatnot. Although a technical tour de force for the 128k Spectrum, the game is surprisingly devoid of content.

From Spain, the Umberto Eco-inspired La Abadia Del Crimen is also an adventure game, again more comparable with The Great Escape than any other game, what with the daily routine in an isolated environment. I have not looked much into it though, but the Spanish-speaking speccy world holds it in high regard. For the English speakers, there is an unofficial translation, The Abbey of Crime.



It's all a matter of perspective

After all the imitators and seeming improvements, it is striking that Knight Lore/Alien 8 actually did most with the "new" perspective. These games had functional jumping, avoiding and route-planning based on three dimensions rather than two. The puzzles required object placement and retrieval, again thought out in 3D. Newer games could modify these elements, but would not deviate from the basic formula. And if they did deviate, it usually resulted in making the perspective less meaningful, reducing it into a visual gimmick.

When the 16-bit computers hit big time, the isometric genre was seen as decidedly 8-bit and was not tried that often on the bigger computers, just as the whole British style arcade adventure died a quiet death. Sure, many games utilized the perspective but were not part of this action adventure genre. When polygon graphics became feasible, games like Tomb Raider and Super Mario 64 could offer similar thrills without locking to a particular perspective. Perhaps something of the DNA of the isometric lives in the modern 3D action game.

Genre stupidity:

-Four way controls in an apparently free 3D environment? Urgh!
-Randomly moving enemies. Holy hell, the games are difficult enough as they are.
-Huge slowdown. When the going gets tough, it gets tough on the framerate.
-Faux complexity. Empty rooms, clunky interfaces, non-functional objects, sterile characters.

Genre greatness:

+A sense of mystery and exploration based on visibility and "locked out" game areas
+Fun experimentation with the physical object behavior and the game world
+Clever and satisfying puzzles enabled by the isometric object engine

Friday 7 August 2015

Sinclair and the 'Sunrise' Technology


The book Sinclair and the 'sunrise' technology from 1986 is an account of Sinclair's rise and fall in the micromarkets in the 1980s. The book is written sufficiently late to include every noteworthy Sinclair project, yet early enough to be truly contemporary. (The Cambridge Z88 came later, for example.)

It is an interesting document of the struggle to acquire the money, know-how and resources that enabled the eventual production of the Sinclair home micros. I was surprised how small Sinclair's companies actually were. Clive arose from mail order analog radio equipment and amplifier business, DIY geek stuff basically. The book maintains that professional advertising and Clive's calculated presence helped nurture an image of a vastly more competent and large-scale operation than it really was.

The text is sufficiently well researched, although sometimes it seems only a few key interviewees supply the most crucial characterizations. What seemed less professional is the way the authors appear to constantly take small swipes at Sinclair. The authors are intent on showing the machines were not a result of Clive Sinclair's direct involvement, yet at the same time point out that the bad details in them (e.g. membrane keyboards) were a result of Clive's single-mindedness. This is already somewhat contradictory. Many of the products' shortcomings relate to the design insights that made the products possible in the first place.

There seems to be slight misrepresentation about the relation of design briefs, the broader conditions and constraints that inform the outcome and the "actual designing" of the technical work. This does not mean that Clive designed or invented the products - yet outcomes are a result of a broader landscape within with the engineering and industrial design choices were made. Clive's personality and business goals, for good or for worse, were instrumental in setting the engineering and design targets.

Funnily, Clive is lambasted pretty much for what Steve Jobs has been lauded for: being a shrewd, vocal and single-minded in following his visions. The difference is that from the viewpoint of big business, Steve Jobs succeeded and Clive Sinclair failed. However, as the book lays it out, it was never really Clive's fate to succeed in a big business way.

When belittling Clive's achievements, it can be asked what would have happened if Clive Sinclair had not arrived at the scene at all. Reading between the lines, the authors think it might have been better for the industry. Clive and the Sinclair brand filled a void at the time: The UK "wanted to believe" there was a new field in which the nation could excel and compete. To the authors this was largely an illusion and Sinclair's worst crime was to undermine UK investors' trust in an emerging field.

At the broadest the book is a critique of Thatcherism, using Sinclair's failure as an example of misguided policy of supporting small companies as a cure to a dwindling economy and unemployment. In fact, seeing Sinclair's career as an instrument of Thatcher's policies is the most troubling outcome of the book to this politically naive reader/speccy fanboy. However, this may also be a bias in the book. Clive's relatively small-scale dabbling in technology might also be seen as a-political.

The Sinclair products, despite their failures were quite indicative of the gadget life the 2000s would eventually become: mobile screens (the flat-screen TV), laptops (tiny computers) and electric transports/scooters (C5). However, as the landscape and infrastructure for such products did not exist, the Sinclair inventions remained rather isolated and superficial demos of what might be. Nevertheless, there still remains a certain prophetic aura about them. It's not that any one of them is particularly novel, but taken together they give an impression of some un-realized Sinclairlandia that never came to be.

As the book suggests, Amstrad is probably the real success story of British computers, but here I must also say that Amstrad is somewhat boring. Who cares about Alan Sugar? Many of the computer legends were quite unmemorable characters. I'm not saying the spectacled red-head was a great role model or a hip character. Yet he and his products brought a kind of color to the otherwise drab field. Thus, "print the legend", I say.

(Thanks to Markku for the book. Here are his views in Finnish.)

Ian Adamson and Richard Kennedy, Sinclair and the 'Sunrise' Technology. The Deconstruction of the Myth. Penguin Books.

Sunday 26 July 2015

Invaders with Processing


Something I did on a boring Sunday afternoon. It's amazing how quickly these things can be done nowadays, as the programming can be extremely lazy. (Cough) I followed a "if it works don't look back" style of programming so obviously it could be a lot shorter and more efficient. I wanted to relax anyway.

I have no idea if it will work smoothly on different computers. The video shows roughly how it plays on my Linux Mint/Mate with 3GHz and a Radeon EAH5750 display adapter. Different Java implementations may result in different sync.

Install Processing, Copy/paste the following onto the sketch and off you go. The arrow keys control the ship. Up arrow is fire. Q resets the game anytime.

// Invaders game by Tero Heikkinen
// left/right arrows - Move
// up arrow - Fire
// q - restart game
// Made in one evening 26.7.2015

int MAXOBJECTS=100;
int []g_x=new int [MAXOBJECTS];
int []g_y=new int [MAXOBJECTS];
int []g_t=new int [MAXOBJECTS];
int []g_vx=new int [MAXOBJECTS];
int []g_vy=new int [MAXOBJECTS];
int []g_score=new int[10];
int g_pulse,g_level,g_aframe;
boolean g_joyr,g_joyl,g_joyf;

void setup()
{
  size(600,400);noSmooth();noStroke();fill(255,255,255);
  resetgame();
}

void create_wave()
{
  int diffi,xon,flip;
  float floi;
  g_level++;
  diffi=g_level;flip=0;
  if(diffi>10){diffi=10;}
  for(int j=0;j<=3;j++){
    for(int i=0;i<=7;i++){
      floi=0;
      if(g_level==4||g_level==8||g_level==16){
        floi=float(i);
      }
      xon=64*i;
      if(g_level==6||g_level==10||g_level==14||g_level==20){xon=64*i+flip*32;}
      addobject(xon,32+diffi*16+26*j+int(cos(floi)*16),1,0,2);  
      }
    flip++;if(flip>1){flip=0;}
  }
  int mzip=-2;
  if(random(100)<50){mzip=2;}
  //add motherships
  addobject(width*2,32,mzip,0,25); 
  addobject(width*4,32,mzip,0,25);
}

void resetgame()
{
  for(int i=0;i<=9;i++){g_score[i]=0;}
  clearobjects();g_level=0;
  addobject(width/2-16,height-32,0,0,1);
}

void graphic(int x,int y,String gfx)
{
  int xc,yc,xp,yp;
  xc=0;yc=0;
  for (int i=0;i<gfx.length();i++){
  if(gfx.charAt(i)=='1'){
    xp=x+xc*4;yp=y+yc*2;
    if(xp>=0&&xp<=width-4&&yp>=0&&yp<=height-2){
      pixels[xp+(yp)*width]=0xffffffff;
      pixels[xp+(yp)*width+1]=0xffffffff;
      pixels[xp+(yp)*width+2]=0xffffffff;
      pixels[xp+(yp)*width+3]=0xffffffff;
    }
  //rect(x+xc*4,y+yc*2,4,2);
  }
  xc++;
  if(gfx.charAt(i)==' '){xc=0;yc++;}
  }
}

void addobject(int x,int y,int vx,int vy,int t)
{
  int first;
  first=0;
  if(t!=1){first=1;}
  
  //alien bullet check fit
  if(t==4){ 
      for(int i=0;i<MAXOBJECTS;i++){
        if(g_t[i]==2){
          if(x>g_x[i]&&x<g_x[i]+24&&y>g_y[i]-4&&y<g_y[i]+16){
          return;
        }
      }
    }
  }
  
  // add an object
  for(int i=first;i<MAXOBJECTS;i++){
    if(g_t[i]==0){
      g_vx[i]=vx;g_vy[i]=vy;
      g_x[i]=x;g_y[i]=y;g_t[i]=t;return;
    }
  }
}

void clearobjects()
{
  for(int i=0;i<MAXOBJECTS;i++){
    g_t[i]=0;g_vx[i]=0;g_vy[i]=0;g_x[i]=0;g_y[i]=0;
  }
}

void command_fleet(int com)
{
  for(int i=0;i<MAXOBJECTS;i++){
    if(g_t[i]==2){
      if(com<5){
        g_vx[i]=com;
        g_x[i]=g_x[i]+com;
      }
      if(com==16&&g_t[0]==1){
        g_y[i]=g_y[i]+12;
      }
    }
  }
}

void addscore(int ss)
{
  int okay;
  okay=0;
  g_score[0]=g_score[0]+ss;
  while(okay==0){
    okay=1;
    for(int i=0;i<=9;i++){
      if(g_score[i]>9){g_score[i+1]++;g_score[i]=g_score[i]-10;okay=0;}
    }
  }
}

void drawobjects()
{
  int aliens,multip,order;
  loadPixels();
  aliens=0;multip=1;order=0;
  for(int i=0;i<MAXOBJECTS;i++){
    if(g_t[i]==2){aliens++;}
  }
  if(aliens==0){create_wave();}
  if(aliens<=9){multip=2;}
  if(aliens<=3){multip=3;}
  if(aliens==1){multip=4;}
  g_aframe=g_aframe+multip;
  if(g_aframe>31){g_aframe=g_aframe-32;}
  
  for(int i=0;i<MAXOBJECTS;i++){
    switch(g_t[i]){
    case 1:
      graphic(g_x[i],g_y[i],"00011000 00011000 01111110 00111100 11111111 11111111");
    break;
    case 2:
    if(g_aframe<=15){
      graphic(g_x[i],g_y[i],"00000000 11011011 00111100 11011011 11111111 00100100 01100110");
    }
    else
    {
      graphic(g_x[i],g_y[i],"10000001 01011010 00111100 11011011 11111111 01000010 11000011");
    }
       g_x[i]=g_x[i]+g_vx[i]*multip;
       g_y[i]=g_y[i]+g_vy[i]*multip; 
       if(g_y[i]>g_y[0]-16&&g_t[0]==1){g_t[0]=8;}
       if(g_x[i]>width-32){order=1;}
       if(g_x[i]<=0){order=2;}
      aliens++;
      int frate;
      frate=g_level*multip;
      if(frate>200){frate=200;}
      if(random(400)<frate){
        int zzoo;
        zzoo=2;
        if(g_level>=4){zzoo=4;}
        if(g_level>=8){zzoo=6;}
        addobject(g_x[i]+12,g_y[i]+24,0,zzoo,4);
      }
    break;
    case 3:
      graphic(g_x[i],g_y[i],"11 11");
      if(g_y[i]<0){g_t[i]=0;}
      for(int j=0;j<MAXOBJECTS;j++){
        if((g_t[j]==2||g_t[j]==25)&&g_x[i]>g_x[j]-8&&g_x[i]<g_x[j]+32&&g_y[i]>g_y[j]&&g_y[i]<g_y[j]+16){addscore(1*g_t[j]);g_t[j]=8;g_t[i]=0;}
      }
      g_x[i]=g_x[i]+g_vx[i];
      g_y[i]=g_y[i]+g_vy[i]; 
    break;
    case 4:
      graphic(g_x[i],g_y[i],"11 11 11");
      if(g_y[i]>height){g_t[i]=0;}
      int j=0;
      if(g_t[j]==1&&g_x[i]>g_x[j]-6&&g_x[i]<g_x[j]+30&&g_y[i]>g_y[j]&&g_y[i]<g_y[j]+16){g_t[j]=8;g_t[i]=0;}   
      g_x[i]=g_x[i]+g_vx[i];
      g_y[i]=g_y[i]+g_vy[i]; 
    break;
    case 8:
       graphic(g_x[i],g_y[i],"10010011 01010110 00111100 11000011 0111100 01101010 11001001");
       g_vy[i]++;if(g_vy[i]>3){g_vy[i]=0;g_t[i]=9;}
    break;
    case 9:
       graphic(g_x[i],g_y[i],"00000000 01010010 00000000 10000001 0000000 01001010 0000000");
       g_vy[i]++;if(g_vy[i]>3){g_vy[i]=0;g_t[i]=0;}
    break;
    case 25: //mothership
       graphic(g_x[i],g_y[i],"00111110 01010101 01111111 00100010 00011100");
       g_x[i]=g_x[i]+g_vx[i];
       g_y[i]=g_y[i]+g_vy[i]; 
       if(g_x[i]<-32){g_x[i]=width*6;}
       if(g_x[i]>width*6){g_x[i]=-32;}
    break;
    }
  }
  if(order==1){command_fleet(16);command_fleet(-1);}
  if(order==2){command_fleet(16);command_fleet(1);}
  if(g_t[0]==0){
    graphic(32,16,"00111100 01000010 01000010 01010010 01001010 00111100");
  }
  scoreboard();
  updatePixels();
}

void scoreboard()
{
  int s,x,y;
  x=96+4*32;y=16;
  s=1;
  for(int i=0;i<=4;i++){
  switch(g_score[i]){
    case 0:graphic(x,y,"00111100 01000010 01000010 01000010 01000010 00111100");break;
    case 1:graphic(x,y,"00001000 00011000 00101000 00001000 00001000 00111110");break;
    case 2:graphic(x,y,"00111100 01000010 00000010 00111110 01000000 01111110");break;
    case 3:graphic(x,y,"01111110 00000010 00011100 00000010 01000010 00111100");break;
    case 4:graphic(x,y,"00011100 00100100 01000100 01111110 00000100 00000100");break;
    case 5:graphic(x,y,"01111110 01000000 01111100 00000010 01000010 00111100");break;
    case 6:graphic(x,y,"00111100 01000000 01111110 01000010 01000010 00111100");break;
    case 7:graphic(x,y,"01111110 00000010 00011110 00000010 00000100 00001000");break;
    case 8:graphic(x,y,"00111100 01000010 00111100 01000010 01000010 00111100");break;
    case 9:graphic(x,y,"00111100 01000010 01111110 01000010 00000010 00111100");break;
    }
    x=x-32;
  }
}

void keyPressed()
{
  if(key=='q'){resetgame();}
  if(key==CODED){
    if(keyCode==RIGHT)g_joyr=true;
    if(keyCode==LEFT)g_joyl=true;
    if(keyCode==UP)g_joyf=true;
  }
}

void keyReleased()
{
  if(key==CODED){
    if(keyCode==RIGHT){g_joyr=false;}
    if(keyCode==LEFT){g_joyl=false;}
    if(keyCode==UP){g_joyf=false;}
  }
}

void draw()
{
  background(0,0,0);
  drawobjects();
  if(g_joyr){if(g_x[0]<width-36){g_x[0]=g_x[0]+4;}}
  if(g_joyl){if(g_x[0]>4){g_x[0]=g_x[0]-4;}}
  if(g_joyf&&g_pulse==0){g_pulse=10;if(g_t[0]==1){addobject(g_x[0]+12,g_y[0],0,-8,3);}}
  if(g_pulse>0){g_pulse--;}
}