Advertisement

Revolutionary: Exploring New Depths

Every Tuesday, Mike Sylvester brings you REVOLUTIONARY, a look at the wide world of Wii possibilities.

Going by the company's success of late, neophytes might assume that Nintendo was always looked at as the redemptive innovator of the games industry. But some time around the midpoint of the Super Nintendo's life cycle, the popular sentiment started turning to "a trend isn't cool until Nintendo bucks it." Nintendo fans were two generations behind in getting an optical drive. We played grayscaled, unlit Gameboys for years while our friends dumped battery after battery into their Lynx's, Turbo Express Portables, Neo Geo Pocket Colors, and Game Gears. Even today, we're still ravening for Nintendo-flavored online gaming.

Nintendo's first 3D console didn't come out until a year after Sony's, and 18 months after Sega's, so while my SNES delivered 2D nirvana in Donkey Kong Country, Super Castlevania 4, and Super Mario All-Stars, I was getting my 3D fix elsewhere.

Oftentimes, gamers who've been immersed in this hobby of ours for many years fondly reminisce about events in gaming history that left a lasting impression on our lives. Sometimes (just sometimes) those moments aren't Nintendo-related. In the mid-90's the SNES was manifesting breathtaking 2D fantasies, but falling short on producing the 3D wonders that were sweeping through arcades. They'd made some strides with the Super FX chip, but the untextured, low-res, low-polygon graphics of Starfox weren't in the class of games like Virtua Fighter 2 or Daytona USA.

Meanwhile, the PC platform was using powerful hardware configurations to expand into the 3rd dimension, giving birth to new genres. Doom was blowing our minds with its immersive atmosphere, constructed around pseudo-3D graphics. When I heard about a game that was more 3D than Doom, naturally, I scoffed. But seeing was believing, and playing it left me even more convinced. Doom had you walking, turning, and strafing on a 2-dimensional plane, but Descent gave you the freedom to move sideways, and slantways, and longways, and backways, and squareways, and ... you get the picture.

The Doom series was overall more popular than the Descent series, although content-wise, Descent was easier to market to masses. Instead of "gibbing" demons in pentagram-textured corridors, you were blasting rampant robots into shrapnel. Descent was ported to the Playstation, and for a while, there were rumors of a N64 version in the works, but it never came to be. We did, however, get a reasonable substitute in Forsaken.

The Descent series ultimately ended as a trilogy. The first 2 games ran in DOS, with the second being built around an upgraded version of the original engine. They can be played today on legacy-unfriendly PCs (in all their original, low-res, unfiltered glory) using DOSBox. For a slightly more up to date appearance, you can use D2X-XL to apply effects like smoke, transparency, and texture filtering, and run the games without having to fuss over command prompts. D2X-XL is designed for Descent 2, but it allows you to import maps from the first Descent and play the campaign through Descent 2. Descent 3 came some years after the first 2, on an entirely new engine which took advantage of Direct3D, OpenGL, and 3Dfx's GLide APIs for tremendously improved graphics. It was later patched to include support for the then-new bump mapping technique, EMBM. Out of the box it had relatively sophisticated AI driving lively robots that had a surprising amount of personality. You may wind up in a double-team situation where a Thiefbot sneaks up from behind to pull a bump and lift, while another ornery bot air-gallops in to rock'em sock your block off.

For many, the greatest test of the Wii's controllers is as a replacement for traditional game controllers is a standard first person shooter, a la Halo. If you search the usual spots or even look at actual Wii games you'll see that that genre's being amply covered by developers and scripters. But there are few games being developed that give us the 6 degrees of freedom of Descent, despite the Wii controller being a natural fit for the genre. You can really get a sense of connection with the ship when tilting the Remote up, down, left, and right and getting the same response on screen.

Key.Ctrl = Wiimote.B //Fire primary weapon
Key.Space = Wiimote.A //Fire secondary weapon
Key.Tab = Wiimote.Home //Automap
Key.F2 = Wiimote.One //Options
Key.Escape = Wiimote.Two //Quit
Key.Alt = Nunchuk.Cbutton //Slide
H = Wiimote.Up //Headlight
R = Wiimote.Down //Rear view

The next part will enable the behind-the-ship 3rd person camera mode in Descent 3 with a flick of the Nunchuk. To go into the 3rd person view, the game needs the words "bye bye monkey" to be typed out. So we'll write a sequence for this, with delays between keypresses, to make sure each press registers, and we'll use G-force detection on the Z-axis to trigger it.

If Nunchuk.GZ < -1.0
B = True
B = False
wait 10ms
Y = True
Y = False
wait 10ms
E = True
E = False
wait 10ms
B = True
B = False
wait 10ms
Y = True
Y = False
wait 10ms
E = True
E = False
wait 10ms
M = True
M = False
wait 10ms
O = True
O = False
wait 10ms
N = True
N = False
wait 10ms
K = True
K = False
wait 10ms
E = True
E = False
wait 10ms
Y = True
Y = False
wait 10ms
EndIf

We don't have enough buttons on our controllers to assign one for each of the 10 weapons, or each of the 10 Guidebot commands. So what we need to do is find a way to cycle from the 1 key to the 0 key by pressing a single button, and cycle in reverse by pressing another. It doesn't sound too hard, since we've done automated cycling for the "KITT" LED scrolling in Alien Hominid, and to reset the mouse pointer in De Blob. Here we're just going to be manually incrementing and decrementing by pressing a button. The trouble is, when we change the value of the number, it won't simply press the corresponding key.

//Cycle weapons and Guidebot commands
If pressed(Wiimote.Plus or Wiimote.Right)
var.Num = var.Num + 1
ElseIf pressed(Wiimote.Minus or Wiimote.Left)
var.Num = var.Num - 1
Else
var.Num = 0
EndIf

//Cycle GuideBot commands
Key.Shift + var.Num = Wiimote.Minus
Key.Shift + var.Num = Wiimote.Plus
If Wiimote.Plus or Wiimote.Minus
press(key.Shift)
Else
release(key.Shift)
EndIf

//Start cycle with first weapon or Guidebot command selected
If !var.init
var.Gbot = 1
var.Weapon = 1
var.init = True
EndIf

If Pressed(Wiimote.Left)
If var.Weapon <= 1
var.Weapon = 10
Else
var.Weapon--
//"--" is used to decrement by 1
EndIf
var.CycleWeapon = True
ElseIf Pressed(Wiimote.Right)
If var.Weapon >= 10
var.Weapon = 1
Else
var.Weapon++
//"++" is used to increment by 1
EndIf
var.CycleWeapon = True
EndIf

If Pressed(Wiimote.Minus)
If var.Gbot <= 1
var.Gbot = 10
Else
var.Gbot--
EndIf
var.CycleGbot = True
ElseIf Pressed(Wiimote.Plus)
If var.Gbot >= 11
var.Gbot = 1
Else
var.Gbot++
EndIf
var.CycleGbot = True
EndIf

The Guidebot commands are input the same way as the weapon selection, with the addition of holding the Shift key. We used separate variables for the Guidebot input and the weapon selection, so that they can be changed independently. You don't want to be cycling through to your Vulcan Cannon and wind up sending your Guidebot to extinguish a fire.

As I said, the variables alone do nothing. We need to have the script press the corresponding keys for the value of the variable. Credit goes to R.Legault of the Wiili.org forums for sharing this method of cycling through typed numbers.

If var.CycleWeapon
If var.Weapon = 1
Press(One)
Wait 25ms
Release(One)
ElseIf var.Weapon = 2
Press(Two)
Wait 25ms
Release(Two)
ElseIf var.Weapon = 3
Press(Three)
Wait 25ms
Release(Three)
ElseIf var.Weapon = 4
Press(Four)
Wait 25ms
Release(Four)
ElseIf var.Weapon = 5
Press(Five)
Wait 25ms
Release(Five)
ElseIf var.Weapon = 6
Press(Six)
Wait 25ms
Release(Six)
ElseIf var.Weapon = 7
Press(Seven)
Wait 25ms
Release(Seven)
ElseIf var.Weapon = 8
Press(Eight)
Wait 25ms
Release(Eight)
ElseIf var.Weapon = 9
Press(Nine)
Wait 25ms
Release(Nine)
Else
Press(Zero)
Wait 25ms
Release(Zero)
EndIf
var.CycleWeapon = False
EndIf

If var.CycleGbot
If var.Gbot = 1
Press(Key.F4)
Wait 25ms
Release(Key.F4)
ElseIf var.Gbot = 2
Press(One)
Wait 25ms
Release(One)
ElseIf var.Gbot = 3
Press(Two)
Wait 25ms
Release(Two)
ElseIf var.Gbot = 4
Press(Three)
Wait 25ms
Release(Three)
ElseIf var.Gbot = 5
Press(Four)
Wait 25ms
Release(Four)
ElseIf var.Gbot = 6
Press(Five)
Wait 25ms
Release(Five)
ElseIf var.Gbot = 7
Press(Six)
Wait 25ms
Release(Six)
ElseIf var.Gbot = 8
Press(Seven)
Wait 25ms
Release(Seven)
ElseIf var.Gbot = 9
Press(Eight)
Wait 25ms
Release(Eight)
ElseIf var.Gbot = 10
Press(Nine)
Wait 25ms
Release(Nine)
Else
Press(Zero)
Wait 25ms
Release(Zero)
EndIf
var.CycleGbot = False
EndIf


To wrap this up, we need to get the Nunchuk's joystick and the Remote's accelerometer working to move and steer the ship. We're only using keyboard inputs, to maintain compatibility across the 3 games, so we need to translate the analog inputs of the joystick and accelerometer into a sequence of key presses that feels smooth. A simple way to do this is using a Pulse Density Modulation algorithm. So far, I've never used the PDM in a script, and I'm not using it this time, either. The method I'll be showing you in this script is what I've used for Panzer Dragoon, Rez, and even Resident Evil 4. It makes for huge blocks of repetitive code, but it also keeps you from having to adjust the maprange for different hardware (not all Wiimotes, Nunchuks, or joysticks are constructed exactly alike). I also like being able to change the amount of variance from one region to the next, instead of making the output variable directly proportionate to the input. As is, the PDM module is fairly inflexible, but you may find applications where it's suitable.

//Pitch ship up
If Nunchuk.Zbutton or Nunchuk.Cbutton //While holding the Z or C button on the Nunchuk, Wiimote motions are detected. Release the buttons to stop moving.
If Wiimote.GZ < -0.12
If Wiimote.SmoothPitch < 5
Up = True
Wait .5ms
Up = False
EndIf
ElseIf Wiimote.GZ < -0.6
If Wiimote.SmoothPitch < 5
Up = True
Wait 5ms
Up = False
EndIf
ElseIf Wiimote.GZ < 0
If Wiimote.SmoothPitch < 5
Up = True
Wait 10ms
Up = False
EndIf
ElseIf Wiimote.GZ < 0.11
If Wiimote.SmoothPitch < 5
Up = True
Wait 20ms
Up = False
EndIf
EndIf

//Pitch ship down
If Wiimote.RawForceZ > 12
If Wiimote.SmoothPitch > 6
Down = True
Wait .5ms
Down = False
debug = "4"
EndIf
ElseIf Wiimote.RawForceZ > 9
If Wiimote.SmoothPitch > 6
Down = True
Wait 5ms
Down = False
debug = "3"
EndIf
ElseIf Wiimote.RawForceZ > 6
If Wiimote.SmoothPitch > 6
Down = True
Wait 10ms
Down = False
debug = "2"
EndIf
ElseIf Wiimote.RawForceZ > 2
If Wiimote.SmoothPitch > 6
Down = True
Wait 20ms
Down = False
debug = "1"
EndIf
EndIf

//Bank ship left
If Wiimote.GX > 0.5
If Wiimote.SmoothRoll < -1
Wiimote.LEDs = 7
Left = True
Wait .5ms
Left = False
EndIf
ElseIf Wiimote.GX > 0.3
If Wiimote.SmoothRoll < -1
Wiimote.LEDs = 3
Left = True
Wait 5ms
Left = False
EndIf
ElseIf Wiimote.GX > 0.08
If Wiimote.SmoothRoll < -1
Wiimote.LEDs = 1
Left = True
Wait 15ms
Left = False
EndIf

//Bank ship right
ElseIf Wiimote.GX < -0.5
If Wiimote.SmoothRoll > 1
Wiimote.LEDs = 14
Right = True
Wait .5ms
Right = False
EndIf
ElseIf Wiimote.GX < -0.3
If Wiimote.SmoothRoll > 1
Wiimote.LEDs = 12
Right = True
Wait 5ms
Right = False
EndIf
ElseIf Wiimote.GX < -0.08
If Wiimote.SmoothRoll > 1
Wiimote.LEDs = 8
Right = True
Wait 15ms
Right = False
EndIf
Else
Wiimote.LEDs = 0
EndIf
EndIf

We threw in that bit of LED code as a visual indicator of how fast we're turning. The more you turn the Remote left or right, the faster you'll go, with 3 levels of speed.

If Wiimote.HasNunchuk
//Move forward
If Nunchuk.JoyY > 0.55
Z = True
Wait 35ms
Z = False
ElseIf Nunchuk.JoyY > 0.35 and < 0.55
Z = True
Wait 20ms
Z = False
ElseIf Nunchuk.JoyY > 0.15 and < 0.35
Z = True
Wait 1ms
Z = False
//Move backward
ElseIf Nunchuk.JoyY < -0.55
A = True
Wait 35ms
A = False
ElseIf Nunchuk.JoyY < -0.35 and > -0.55
A = True
Wait 20ms
A = False
ElseIf Nunchuk.JoyY < -0.15 and > -0.35
A = True
Wait 1ms
A = False
EndIf
//Slide left
If Nunchuk.JoyX < -0.55
NumPad1 = True
Wait 35ms
NumPad1 = False
ElseIf Nunchuk.JoyX < -0.35 and > -0.55
NumPad1= True
Wait 20ms
NumPad1 = False
ElseIf Nunchuk.JoyX < -0.15 and > -0.35
NumPad1= True
Wait 1ms
NumPad1 = False
//Slide right
ElseIf Nunchuk.JoyX > 0.55
NumPad3= True
Wait 35ms
NumPad3 = False
ElseIf Nunchuk.JoyX > 0.35 and < 0.55
NumPad3= True
Wait 20ms
NumPad3 = False
ElseIf Nunchuk.JoyX > 0.15 and < 0.35
NumPad3= True
Wait 1ms
NumPad3 = False
EndIf
EndIf


3 games played with the same script!

Sadly, the 6 degrees of freedom shooter genre is mostly dead, fan mods notwithstanding. Perhaps it was the difficulty of navigating with so much freedom, or the upchuck-inducing side effects of having your world turned upside-down. Games like Descent are perfect for today's game controllers, whether they're the kind with dual analog sticks, or they have accelerometers. With any luck, they'll make a comeback soon.

Which genres that have gone the way of the dodo would you like to see given the GlovePIE treatment or brought back as official Wii releases? Voice your wishes in the comments.