The Pop User’s Guide

Last updated May 21, 2002.

About the Pop Program

Updates Per Second

Overview

The Pop Display

The Games

Keyboard and Mouse Controls

Player Motion Controls

Player Shooting Controls

Standard View Controls

View Controls Using Ride the Player

A Hardware Windows Bug in the Arrowkey Controls

Spacewar

Getting Started

Spacewar Details

More About Shooting

Other Things to try in Spacewar

PickNPop

Getting Started with PickNPop

Tips on PickNPop

Airhockey

3D Defender

Ballworld

Dambuilder

Worms

2DStub

3DStub

The Cursor Tools

Shoot Cursor (Crosshairs Icon)

Pick Cursor (Arrow Icon)

Drag Cursor (Hand Icon)

Pin Cursor (Pin Icon)

Zap Cursor (Lightning Bolt Icon)

Replicate Cursor (Equals Sign Icon)

The Menu Controls

File Popup

View Popup

Game Popup

Player Popup

Window Popup

Help Popup

The Toolbar Controls

The Status Bar

Using The Menu and Toolbar Controls

File Menu Controls

View Menu Controls

Game Menu Controls

Player Menu Controls

Window Menu Controls

Help Menu Controls

The Motion Smoothness Dialog

Accelerator Keys

Contact Information

## About the Pop Program

The Pop program was built using the Pop framework classes for Rudy Rucker’s textbook Software Engineering and Computer Games. Full source and executable for the Pop framework are available from the book Web site www.rudyrucker.com/computergames

Normally developers build only one game at a time with the Pop Framework, but the Pop program includes nine games. Only four of these games are in a finished, playable state with a clear goal: Spacewar, PickNPop, Airhockey, and 3D Defender. The others serve only to demonstrate features of the Pop framework and to provide stubs for easy extension.

Since the Pop program is designed to let developers explore possibilities for their own games, there are more control options than one would want to have in a finished game.

## Updates Per Second

When you first run the Pop program, you will see the startup game Spacewar, which resembles an Asteroids game. Look at the Updates per second figure in the Status Bar at the bottom of the Pop window. The number is a rolling average, so it takes a few seconds for the number to respond to changes, and the value will sometimes dance between two or three nearby numbers. The highest rate the Pop framework allows is the speed of your graphics card’s updates per second, if you are at or near this rate the message will say “(Near Max)”. If you are in a mode where the program is running slower than the real time that it simulates, the message will say “(Slower than Real Time)”. Except in the “(Slower than Real Time)” case, one second of simulated game time equals one second of real world time.

On most recent machines you should expect to see an Updates per second ranging from about 40 to whatever your graphics card’s refresh rate is. Commonly used refresh rates are 60, 75, and 85. (For general ergonomic reasons, you should set your graphics card’s refresh rate as high as is possible for the currently used resolution.) If you see a number below 15, your system is running the Pop program too slowly for effective play. You should remedy this before continuing, or use a different machine. Normally the cause of a low updates per second rate is an old or a low-quality graphics card.

Here are some steps you can try to improve your updates per second.

The updates per second is dependent on the number of pixels in the Pop window, so if you run your display at a very high resolution, large Pop windows will run slow. You can gain speed at any time by resizing the Pop window to make it smaller.

The updates per second is dependent on the number of critters in the game you are running. If you used the controls to create a very large number of critters, you can expect the speed to be slow, particularly if you also give the critters complicated sprites that are slow to draw.

Also note that there are both Release and Debug builds of the Pop program. A Release build always runs faster than a Debug build, sometimes even twice as fast, though this varies with the machine and with the nature of the game you are running. For better speed make sure you’re running a Release build; you can tell which is which from the names of the executables.

Both the 2D and 3D graphics modes of Pop will often run faster if your monitor is set to use something like 64,000 colors rather than “Millions of Colors” or True Color. To change the number of colors your display uses, right-click on your desktop, choose Properties from the floating popup menu, and then go to the Display Properties | Settings page. In this dialog you can also adjust your graphics card’s refresh rate. (Note, however, that certain kinds of cards only support hardware OpenGl acceleration if you do set the number of colors to 24 Bit, 32 Bit or True Color.)

The Pop program has a View menu that allows you to run the games in the 2D Windows Graphics mode or in a 3D OpenGL mode. Different games default to different graphics, but all of the games except 3DStub and 3D Defender work in either 2D or 3D view mode. On most systems the Windows Graphics mode is faster, but systems with certain types of 3D graphics acceleration may in fact run the 3D OpenGL mode faster.

If your games consistently run too slow when in the View | 3D OpenGL Graphics mode, look into getting OpenGL hardware acceleration to work for your graphics card. Although most desktop machines have cards that support OpenGL hardware acceleration, the OpenGL drivers are often not put in place by the default install. You may need to download a driver from your graphics card manufacturer. The Web site www.opengl.org/developers/faqs/technical/mswindows.htm has further information about OpenGL hardware acceleration. Note, however, that some systems, including most laptops, have graphics cards that will not support OpenGL hardware acceleration.

## Overview

### The Pop Display

Pop shows a border box with objects inside that that begin moving after the Enter key is pressed. The program’s appearance and behavior are independent of the size of the window and, within certain limits, the speed of your processor.

Pop is a “multiple document interface” program, and it is possible to open up several Pop games or views of the games at once, with all the games and views running at once.

The way to open an additional view of a game session already open is to use Window | Additional View of Current Game. Opening an additional view of a game can be useful, as you can look at the game from two different viewpoints in the different views.

The way to open a window on a different game is to use the File | New Game Window control. There is in fact little point in opening more than one game at once, but we have this feature for the sake of completeness.

In practice, running multiple game windows makes the update speed quite low. The program limits you to opening at most four windows at once.

When the main Pop window is not the focus window on the Windows desktop, the animation of all the games and views is paused.

The moving objects in a Pop game are called critters. Each critter has an associated sprite, which is what you see. In some games you have the option of changing the kinds of sprites that are attached to the critters, so as to experiment with different design possibilities.

By default, the critters are always oriented with their principal axes matching their current motion directions.

Except in the PickNPop game, there is always a distinguished critter called the player; this is usually represented as a small red triangle with line indicating a gun, and with a circle around the triangle. If the player is dead or damaged, the filling of the triangle temporarily disappears. (Note that in Airhockey and in Worms the player has a different appearance.)

You normally move the player by using the arrow keys, and you shoot the gun by pressing the spacebar. See the Keyboard and Mouse Controls section for more about the keyboard controls.

Some of the Pop games allows you to select different kinds of cursors, with the available cursors depending on the game. The cursors can act as tools that do things to the critters when you left-click. In particular if the Shoot, or crosshairs, cursor is active, you can shoot by left-clicking the mouse.

If you prefer not to use the mouse button, or if you have a tracking device whose “left-click” does not trigger the Pop program, you can press the Z key on your keyboard in place of left-clicking the mouse.

### The Games

The Pop program implements nine different games: Spacewar, PickNPop, Airhockey, Ballworld, Dambuilder, Worms, 2DStub, 3DStub, and 3D Defender. The start-up game is the Spacewar game. Spacewar, PickNPop, Airhockey, and 3D Defender are finished games. The others serve as starting points for games to program with the Pop framework, or as demos of features of the framework.

All of the games except for 3DStub and 3D Defender are essentially 2D. That is, in each of the games besides 3DStub and 3D Defender, the critters are limited to move in fixed planes.

All of the games will take on a 3D appearance if you select View | 3D OpenGL Graphics. Critters that would be drawn as flat shapes are given a thickness for the 3D graphics mode.

## Keyboard and Mouse Controls

There are five main kinds of keyboard controls.

First, there are controls to move the player critter, that is, to change its position, velocity, or orientation.

Second, you can often make the player shoot.

Third, there are controls to change the view location, that is, to move the world relative to your view window.

Fourth, you can reduce or increase the zoom or magnification of the “lens” through which you view the world.

Fifth, when using 3D graphics, there are controls to change the view direction in which you look at the game.

To summarize let’s use the phrase “direction keys” to include the arrow keys, the PgUp/PgDn keys and the Home/End keys.

These Controls Affect This

Direction keys Player Critter’s Motion.

Spacebar key Player Shooting.

Ctrl + direction keys View Location.

Ins/Del keys View Zoom.

Ctrl + Shift + direction keys View Direction (3D Only).

Now for some details.

### Player Motion Controls

The player controls include 2D and 3D controls. The 3D player controls apply only in the three-dimensional game worlds of 3DStub and 3D Defender.

In using the player controls, remember to think of the direction the player’s sprite points as “forward.”

The rotations caused by the directional keys speed up if you hold these keys down longer than a fifth of a second. For delicate directional adjustments, just tap on the keys.

Something that complicates the situation is that the user has the option of using the Player menu to change which kind of controls the player uses. The player can use Arrow Key Controls, Scooter Controls, Car Controls, Spaceship Controls, Hopper Controls or Mouse Controls. At present the Hopper Controls selection is only enabled for the Ballworld game.

In describing the controls below, we first specify what the controls do in a 2D world, and then we describe the additional things the controls do in a 3D world.

Arrow Key Controls

2D: Up/Down arrows move the player up/down along the Y axis. Left/Right move the player left/right along the X axis.

3D: PgUp/PgDn moves the player forward/backward along the Z axis (which by default points out of the computer screen).

2D & 3D. The Arrow Keys Controls are like classic Pac-Man. The player moves left, right, up, or down with the arrows, and points in these directions. If someone bumps into the player it will sometimes rotate a little. But normally the player is always aligned with the most recent direction of motion. This makes it hard to shoot in arbitrary directions.

A useful trick in a two dimensional world is to use the Arrow Key Controls with the Shoot Cursor. The Shoot Cursor will aim the player and shoot in the direction where you left-click. Using the Shoot Cursor makes up for the fact that the Arrow Key Controls always align the critter along the principal axes of the game world. This trick works to a lesser extent in a 3D world, as here the mouse click will always select points in the current plane of the player, and will not produce pitch or roll.

Scooter Controls

2D: Up/Down arrows move the player forward/backward. Motion halts as soon as the key is released. Note that reverse motion is possible with the Down arrow. Left/Right yaws the player left or right.

3D: PgUp/PgDn pitch the player’s tip up or down. Home/End rolls the player counterclockwise/clockwise around its direction of motion.

Car Controls

2D: Up arrow accelerates the player forward up to a maximum speed. Player cruises along at the same speed until you slow it down. The Down arrow acts as a brake that can slow the player’s speed down to zero. There is no “reverse gear.” The Left/Right arrows yaw the player left or right, instantly changing its direction of motion.

3D: PgUp/PgDn pitch the player’s tip up or down. Home/End rolls theplayer counterclockwise/clockwise around its direction of motion.

2D & 3D. You can think of Car Controls as Scooter Controls plus momentum. In Car Controls motion, you use Up/Down like accelerator/brake and use Left/Right, PgUp/PgDn, Home/End like a steering wheel.

Spaceship Controls

2D Only: With Spaceship Controls, the player’s sprite doesn’t have to point in the same direction as the player’s motion. The Up key accelerates the player in the direction which the sprite is pointing. The Down key gives the player a reverse acceleration, in the direction opposite to which it’s pointing. If held down long enough, the Down key can make the player begin moving in reverse. The Left/Right keys rotate the player to the left and right.

Hopper Controls

2D: The Hopper Controls move the player left and right with the Left and Right arrow keys. The Up arrow key hops the player up into the air, but continuing to depress the Up key will not produce a continued hopping effect. You need to tap the Up key repeatedly if you want to add a hop to a hop.

3D: PgUp/PgDn moves the player forward/backward along the Z axis (which by default points out of the computer screen).

Mouse Controls

2D: The player effectively becomes the mouse cursor and moves freely with the mouse. If you move the mouse outside of the game world, the current cursor icon reappears and the player “waits” at the edge of the game world. The Left/Right arrow keys can also rotate the player.

3D: In a 3D world such as 3DStub, the mouse moves the player within the current plane of the player’s sprite. You can use the PgUp/PgDn keys to pitch the player’s attitude up or down, and the Home/End keys to roll the player counterclockwise/clockwise.

2D & 3D. When moving the player with the Mouse Controls, the player’s velocity matches the current velocity of the mouse motions. This means you can use the Mouse Controls to hit things with the player as if the player were a paddle. This feature is important for the Airhockey game.

Note that when the Player | Mouse Controls is being used, the Cursor Tools are disabled.

### Player Shooting Controls

2D & 3D: The spacebar lets the player critter shoot bullets in the direction which the player sprite is pointing. For realism, any forward component of the player’s own motion in the shooting direction is added to the bullet motion. In 3D, the Pop framework orients the bullets to have the same pitch, roll, and yaw as the shooter. Bullets are shot as long as the spacebar is held down.

In the case where the Shoot Cursor is selected, the left mouse button or the Z key will also shoot. In addition, the left-click or Z key will aim the player in the direction of the current mouse position before shooting. Using the Shoot Cursor you can fire at targets simply by left-clicking or Z-keying on them.

The Z key option has two purposes. First, it can be more ergonomic to use the Z key in place of the left mouse button. Second, you may need the Z key option if you have reassigned the meanings of the buttons on your tracking device, as in this case the Pop program may not recognize your current “left button”.

A useful player control combination in a two dimensional world is to use the Arrow Key Controls with the Shoot Cursor. Using the Shoot Cursor makes up for the fact that the Arrow Key Controls always align the critter along the principal axes of the game world. The Shoot Cursor allows you to aim and shoot in any direction you like.

### Standard View Controls

The view controls include 2D and 3D controls, where the 3D controls apply if you are using 3D graphics such as View | 3D OpenGL Graphics. Unlike the player-controlling keys, the view key controls are not sensitive to how long the keys have been held down.

View Location Controls

2D or 3D: Ctrl + Up/Down arrow keys move the world up/down. Up slides the world up, Down slides it down. Ctrl + Left/Right arrow keys move the world left/right. Left slides it left, Right slides it right.

3D Only: PgUp/PgDn move the world closer/further, that is, PgUp/PgDn move the viewpoint forward/backwards.

##### View Direction

3D Only: Ctrl + Shift + Left/Right yaws the world left/right. Ctrl + Shift + Up/Down pitches the world up/down. As with the View Location controls, Ctrl + Shift + Left swings the world to the left, Ctrl + Shift + Right swings the world to the right, and so on.

Ctrl + Shift + Home/End rolls the world counterclockwise/clockwise.

##### View Zoom Control

2D and 3D: Ins/Del magnify or shrink the image. The zoom controls change the field of view without changing the view position. You can think of them as smoothly transforming from a telephoto to a wide-angle lens. There are limits to how far in and out you can zoom.

To restore to a normal zoom, use View|Reset Viewpoint or the Ctrl+R shortcut.

### View Controls Using Ride the Player

You can only choose the Ride the Player option in the 3D OpenGL View.

3D Only: When the View | Ride the Player option is selected, the viewpoint and view direction are controlled by the motions of the player critter. The viewpoint is perched upon a “saddle” a bit behind and above the player, and the view direction is set to look out ahead of the player. When the View | Ride the Player option is in effect, the Ctrl + Up/Down keys affect the height above the player which the viewer rides.

When you Ride the Player, the View Direction controls have no effect. Instead, you change the view direction by turning the player. The Ins and Del keys still affect the zoom of the view.

### A Hardware Windows Bug in the Arrowkey Controls

Unfortunately the combination of the standard Windows keyboard and Windows operating system has a serious bug that we can’t seem to work around. This occurs when you use the Spacebar along with the small group of four arrow keys that sets between the alphabetical keys and the rectangular block of numerical keys. We refer to the group of arrow keys arranged like this near the bottom edge of the keyboard:
Up

Left Down Right

You cannot get this Left key, the Spacebar and any other of these arrow keys to work at the same time. Barring a fix from Microsoft, the only way around this at present is to use the arrow keys on the digital key pad to the right side of your keyboard, making sure that the Num Lock is off, so that these keys act like arrow keys.

## Spacewar

### Getting Started

You’re in control of a little red triangle ship. Your goal? Avoid being bumped by asteroids and shoot the asteroids into pieces. When enemy UFOs appear, avoid being shot by their bullets and try to shoot them. In other words, shoot everything in sight before you get shot! Use the spacebar or left mouse clicks to shoot at the other creatures. (If you dislike shooting games, skip Spacewar and try PickNPop, Airhockey, Ballworld, 3DStub, or Dambuilder.)

The asteroids and UFOs in the Spacewar game have a primitive kind of intelligence. They run away from the bullets that the player shoots. And when they’re not running away from bullets, the asteroids tend to move towards the player. Some users have described the Spacewar asteroids as “cowardly and sneaky.”

You are only allowed to have 8 of your bullets active at one time. When you try and shoot more than 8 bullets, your oldest bullet is removed. This means that if you keep the space bar down so as to be continuously shooting, you will see something that looks like a short stick of bullets coming out of your player. What’s happening is that the furthest (oldest) bullet keeps being replaced by the next bullet that you’re shooting out. In order to have your bullets travel some distance and hit the further away asteroids, you need to release the space bar and give the bullets a chance to travel. Once a bullet is traveling, it will live for three seconds. A bullet will also die if hits an asteroid, a UFO, an enemy bullet, or the edges of the game world. Once a few of your bullets die off, you can shoot some more bullets.

Your player incurs damage if it is touched by one of the asteroids or by one of the enemy bullets; “damage” means that the player’s health is reduced by one point. If the player’s health reaches 0, the game is over. The current health value is printed in the status bar below the game window.

Use your arrow keys to run away from enemy bullets and missiles. At startup, your controls are in the Spaceship Controls mode; this means that the left and right arrows rotate the player’s icon and shooting direction, while the up and down arrow add forward or reverse thrust in the direction that the player’s icon is currently pointing. If you’ve never played an Asteroids-type game you will initially find these controls hard to use. The idea is that the player is supposed to be drifting in empty space and that you are steering it with blasts from its rocket. If you’re not comfortable with the Spaceship Controls, you can use the Player menu to select a different control mode; Scooter Controls are particularly easy to use.

Shooting the asteroids, UFOs, enemy bullets, and enemy missiles increases your score. Note that you don’t get a score reward for splitting an asteroid or UFO in two, you only get the score when you actually eliminate one. The current score value is printed in the status bar below the game window. Increasing your score by a certain amount brings on a new attack by a UFO.

When you kill all the asteroids and UFOs, a new wave of asteroids appears, and the maximum speed of the asteroids and UFOs is increased. Eventually they overwhelm the player and use up all of the health points.

When your player loses all of its health points, the region of your window outside the game world goes from gray to black. A message dialog appears. Click in the dialog or press ENTER to restart the game. If you would prefer to play a different game, use the Game menu.

The status bar below the game window displays the player’s score, the player’s health, the total number of non-bullet critters on the screen (including the player critter), and the number of updates per second that your machine is currently doing for the animation.

### Spacewar Details

The critters collide with each other and rebound. The critters collide as if they were disks with a mass proportional to their size. If two critters have an irregular shape this means that they will sometimes appear to collide before they visually touch each other.

When an object hits the edge of the game world it may either bounce, wrap around to the opposite edge, or die. At startup, the asteroids and the player wrap, the enemy UFOs bounce, the bullets die at the edge of the game world, and the enemy missiles bounce. You can force the asteroids to bounce off the edges by selecting Game | Bounce instead of Game | Wrap. This makes them a bit easier to shoot because then they can’t run away as well. Note that the UFOs and blue enemy missiles will bounce off the game edges even if you have selected Game | Wrap, and that your bullets and the green enemy missiles or bullets will always die when they hit the game edges.

The starting number of asteroids is 8. When you shoot a larger Asteroid, it will split in two as long as the resulting number of asteroids is not too large. At some point, if there are too many asteroids on the screen, shooting a large asteroid will shrink it to a small asteroid the first time you shoot it, without splitting. Shooting a smaller asteroid will always kill it.

To make the game a little trickier, when the player shoots a bullet, the velocity of the bullet is the vector sum of your own velocity plus the bullet’s muzzle velocity.

To observe this feature, you can do as follows. Use Player | Shield to make the player invulnerable, press the Up arrow to get the player moving rapidly, use the Left arrow to rotate the player to point at right angles to the direction of motion, and then press the spacebar to shoot bullets. You’ll notice that the bullets emerge and move off at an angle. Though this is physically correct, some users find it confusing.

The UFOs don’t obey this “bullet velocity = shooter velocity + muzzle velocity” rule; the game lets them ignore the physics so as to make it easier for them to reliably shoot right at the player. To sum up, a UFO’s bullet goes exactly in the direction its gun is pointing, but the player’s bullets go in a direction that’s a sum of the gun direction and the player’s motion. (If you really, really dislike this feature, get the Pop source, make the player critter shoot like a UFO critter, and rebuild the game!)

There are two kinds of UFOs, regular and smart. The smart UFOs can move twice as fast as the regular UFOs, which makes them harder to shoot. The regular UFOs split in two the first time you shoot them, no matter how many asteroids are present. The smart UFOs don’t split. The regular UFOs have polypolygon sprites and shoot green bullets at you. The green bullets are aimed at you, but they can be deflected by asteroids. They will die if they hit the edge of the game world. The smart UFOs have a sprite that’s a picture of a flying saucer; these guys shoot blue guided missiles at you. The missiles will follow you as you move, and they will bounce off the asteroids and off the edges of the game world.

Use the spacebar to shoot the bullets and missiles before they hit you, or use your arrow keys to move out of the way of these bullets. Note that the UFOs never wrap around the edges of the game world; the best hope of hitting one is to first drive it into a corner.

Your score value for killing various creatures is the following. You don’t get any points when you first shoot an Asteroid or a UFO and split it in two, you only get the score when you shoot the smaller pieces and remove them from the screen.

Asteroid 4

UFO 6

Green Enemy Bullet 4

Blue Enemy Missile 8

Your player’s health is improved by one point for every additional 100 score points you accumulate.

Every time you accumulate a certain number of additional points, a new UFO will appear, provided that no UFO is currently present.

### More About Shooting

As mentioned earlier in this help file, the spacebar causes the player to shoot bullets in the direction which the player sprite is pointing. Bullets are shot as long as the spacebar is held down.

In the case where the Shoot Cursor is selected, the left mouse button or the Z key will also shoot. In addition, the left-click or Z key will aim the player in the direction of the current mouse position before shooting. Using the Shoot Cursor you can fire at targets simply by left-clicking or Z keying on them.

If your player (or an armed enemy) happens to be too near the edge of the world, it will not be able to shoot bullets, as any bullet near the edge gets removed.

Using the Player menu you can choose between Deadly Bullets, which split or destroy the asteroids and UFOs, and Rubber Bullets, which merely push them around. In a battle game like Spacewar, rubber bullets are of no use. They’re here so that developers can consider using the feature in a nonviolent game.

Rubber bullets are destroyed when the screen is reseeded or you select Game | Start or Restart Game. But, as with deadly bullets, if you shoot a steady stream of rubber bullets, the older ones are repeatedly replaced by the newer ones. And if you have switched from rubber bullets to deadly bullets, the newly fired deadly bullets will replace the old rubber bullets.

If a deadly bullet and rubber bullet collide, they both survive.

### Other Things to try in Spacewar

Try using the Player | Shield to make the player invulnerable so you don’t have to keep restarting the game.

With the Shield mode on, use the Game | Large Critter Count selection to bring a large number of asteroids onto the screen. Use the arrow keys to move the player around among them. Select Player | Rubber Bullets and shoot rubber bullets into the crowd. The way the rubber bullets work their way along is a model of particle diffusion. Try this both with Game | Wrap and with Game | Bounce. Use Game | Medium to get back to a reasonable number of sprites.

You can turn a background bitmap on or off from the View menu. And you can use Game | Wrap or Game | Bounce turn a wrapping feature on and off for the player, the asteroids, and the rubber bullets. (The UFOs will always bounce and the deadly bullets will always die at the game world edge.)

Try turning Game | Wrap on, using the Player menu to set Shield and Rubber Bullets, and now use the rubber bullets to get all the critters moving in one direction. Then turn around and shoot rubber bullets till they move the other way. Turn off the View | Background Bitmap and use View | Wireframe to see the motions more clearly.

Set Player | Auto Play and sit back and watch the shapes zoom around.

Use Window | Additional View of Current Game to open a second view. Shoot some bullets. Notice how the action in the game is reflected in the second view.

## PickNPop

### Getting Started with PickNPop

You’ve gotten a package in the mail! You set it down and open it; it’s full of white disks and a few colored disks. We call the white disks “packing Peanuts” and we call the colored disks “Jewels.” Your goals are to pop the Peanuts and to move the Jewels out of the yellow packing box and into the pink target box. When a Jewel is fully inside the target box it changes its appearance. If you don’t drag it fully inside, it will fly back out.

In this game, the cursor tool can take the form of a Pin or a Hand. You can change cursor tools with the toolbar buttons, the mouse wheel, or with the accelerator keys 3 and 4.

You can click and drag the critters with the Hand (also called the Drag Cursor). If you click on a critter with the Pin Cursor, you kill it. Note that you have to click once for each kill action.

To get the maximum score, you must pop all the Peanuts and drag all the Jewels into the target area. A perfect game gives you a score of 1000 at the game end. You can save a bit of strain on your hand and forearm by using the Z key in place of the left mouse button when dragging.

The game lasts only forty-five seconds. It ends when forty-five seconds are over, or when all the Peanuts are popped and all the Jewels are popped or in the target box. At game’s end, the white background changes to black.

To make the maximum possible score be exactly 1000, a correction term may be added on at the end.

### Tips on PickNPop

If the game update rate is too slow, make sure to use View | 2D Windows Graphics rather than View | 3D OpenGL Graphics. PickNPop is essentially a 2D game, even though the program enhances the visual interest by spacing the critters along the Z axis in the 3D OpenGL Graphics mode.

If you are running the game in 3D, and you don’t have a fast graphics card, it may be that PickNPop will be running at a rate slower than real time. A note in the status bar will alert you to this. In this case, the forty-five seconds the program measures will in fact be longer than forty-fivereal-world seconds.

You can go to the View menu and select Wireframe view in place of the Solid view so that you can see what lies under a given critter. Use Window | Additional View of Current Game to open a second window and then using View | Wireframe to change the second view to a Wireframe view.

Note that a left-click affects a critter if the click point is inside a visible part of the critter. You can’t click on a critter if it is completely beneath other critters. A click only affects one critter at a time.

Left dragging the cursor means moving it while the left button or the Z key is held down. The Pop program allows you to use the Z key in place of the left mouse button when using cursor tools.

When you click a critter with the Drag Cursor tool, the critter is visually moved to lie above the other critters. This is not the case in 3D OpenGL Graphics.

If your mouse has a wheel, you can switch between the Pin and the Dragger by turning your mouse wheel in either direction.

## Airhockey

This is based on the familiar airhockey game in which you and a “robot” opponent try and knock a sliding puck into each other’s goals. Your opponent has the face of Professor Rucker, your player is shaped like a disk with a triangle tail.

Try and knock the puck into your opponent’s goal, and to prevent the puck from being knocked into your goal. Each time the puck goes into your home goal, the robot gets a score point. Each time the puck goes into the robot’s goal, you get a point.

The status bar shows your and the robot player’s scores.

The game is set up so that you and the robot opponent each have to stay on your own side of the center line.

The game ends when either you or the robot opponent reaches a score of seven points.

You may enjoy using the Player | Scooter Controls instead of the default Player | Mouse Controls.

This game also looks very nice if you select View | 3D OpenGL Graphics, although on some machines it will then run too slow to be fun to play.

Your chances of getting the puck past the robot are better when you bank the puck off one of the side walls.

## 3D Defender

This is a nice 3D game, a little like Space Invaders.

You are riding the player, which appears as a circle on the screen like a gun sight.

You can move the player left/right, up/down and, to a limited extent, forward and backwards.

Falling towards you are polygonal slabs. Shooting the slabs adds to your score.

If the slabs get past you and hit the back of the world, you lose a health point. In order to give the player a little more of a chance, whenever the player has lost a health point, the player is immune to damage for the next half second or so. This means that if two slabs get past you at once, the first one will damage your player’s health by hitting the back wall, but you will be immune to damage when the second slab hits --- meaning that you’ll only get one health point damage for the two closely-spaced slabs.

When you shoot a slab it releases a shower of coins that bounce along the floor. If you can maneuver your player to collide with a coin, it increases your health.

Try using View | Ride the Player to toggle off the default behavior of riding the player. This gives you a different view of the world.

## Ballworld

This is a sidescroller game. Your player starts at the left end of the world. Your goal is to use the arrow keys to move your player to the right end of the screen and jump into a hoop you’ll find there.

There are balls bouncing along the bottom of the world from right to left. When you collide with a ball, the effect on you depends on your height relative to the ball. If the player’s low edge is higher than the ball’s center, the player gets a score point. But if the player’s position is lower than this, the player loses a health point. In either case the ball is destroyed.

The player here uses the Hopper Controls. The idea is to hop over the balls and maybe land on top of them. The Hopper Controls moves the player left and right with the Left and Right arrow keys. The Up arrow key hops the player up into the air, but continuing to depress the Up key will not produce a continued hopping effect. You need to tap the Up key repeatedly if you want to add a hop to a hop.

Every time a ball is destroyed a new one is added to the world to the right of the player.

At the right end there is a hoop that gives you extra score when you jump into it. After you jump into the hoop, the player is moved back to the left end of the world.

In the Ballworld game, the View | Keep Player in View is turned on at the game start. This means that when your player moves off an edge of the visible area, the window will automatically scroll to keep the player in view. To keep the Ballworld game from looking wobbly, the player tracking doesn’t move the view up and down, it only moves the view left and right. If you were to zoom in a lot with View | Keep Player in View is turned on, this means the player might be able to move out of sight above or below your view.

The game becomes trivial if you use the Mouse Controls. If you use the Mouse Controls or the Arrow or Scooter Control, the player is not subject to friction or gravity. Really the game only makes sense with the Hopper Controls, the other options are simply there so you can explore possibilities.

This game looks pretty nice in View | 3D OpenGL Graphics.

Ballworld is not a polished game. It’s here for programmers to use as a starting point for a classic sidescroller-style game.

## Dambuilder

This is a design for a game that has never quite been finished. The idea is to use the default Drag Cursor to drag the dam walls around. Try and make the falling flow of the polygons as slow as you can without actually stopping the flow. You can use the Replicate Cursor (the Equals sign) to make extra walls, and you can use the Pin Cursor to remove them. Note that you can flip through different cursor types by using the mouse wheel. To work as a game, Dambuilder would need a clear goal and a mechanism for having advances and setbacks.

Most programmers instead use Dambuilder for a starting point for an adventure game. Typically they turn the gravity off, and arrange the walls in a more maze-like pattern. The player can then be hunting certain food or power-up critters, and avoiding certain rival critters.

We don’t attach any gravity to the Player in Dambuilder, so you can use Car control without any confusion.

Dambuilder has an interesting appearance if you use View | 3D OpenGL Graphics. In order to have good speed, you should use View | Solid Background or View | No Background to turn off the background bitmap, which tends to be expensive in 3D. While in this mode, drive around the world, looking things over. You are riding the player. Try using Ctrl + Up/Down to alter your point of view. Even though this is essentially a 2D game, the program enhances the visual interest by making the walls higher than the critters in the 3D mode. While still in 3D mode, Use View | Ride the Player to turn off Ride the Player so you can see the whole world from above. Now try zooming in on the world with Ins, and select View | Keep Player in View so the player is always visible.

## Worms

The player has an animated sprite that cycles through a series of colors. There are other critters with face icons and “worms” made up of worm segments, which are polygon-shaped critters that tag after each other as if playing follow the leader.

If the player touches a worm segment, it reduces the player’s health by 1.

The player’s bullets are small polypolygons. When a player bullet hits one of the worm segments, the number of sides in the worm segment’s polygon decreases, down to a minimum of three, after which the segment disappears, effectively splitting the worm in two.

The face critters shoot out “food” bubbles at a right angle to the direction towards the player, and the food bubbles avoid the player. The player gains score points by running into the bubbles, effectively eating them. The value of the food bubble goes up with the square of its size. The bigger the bubble the better. The bigger the face, the bigger the food bubbles it shoots out.

When a player bullet hits one of the faces, the face will grow, up to a certain size upon which it pops and disappears. So you should shoot each face until its just short of popping and then eat its bubbles.

Meanwhile, whenever a worm segment bumps a face, it makes it smaller, so you need to try and keep the faces away from the worms. This is tricky, as the faces run away from you.

You can use the Game | Large Critter Count to make longer worms.

## 2DStub

The 2DStub is close to being a game, though its primarily meant to be a piece of code for the developer to improve.

In the 2DStub game, besides the player, there are two kinds of critters: Rivals and Props. The Rivals have bitmap sprites, and the Props have polygonal sprites.

The Rivals shoot bullets at the player. They run away from the player bullets so fast that your only hope of killing them is to chase them down.

Chasing them down is made harder by the fact that they wrap around the world, but your player doesn’t.

The Props run away from the bullets of the Rivals and from the player bullets. If the player runs over a Prop, the player’s health is improved by one point. The Props are like health-packs.

Unlike the Spacewar game, the player needs to move around a lot to do well in 2DStub. Trying to sit in the middle of the screen and shoot is a losing strategy, as the Rivals are so evasive and since the Props need to be chased down.

The player’s default controller is the Scooter Controls.

The game world is larger than a single screen, and we start with a zoomed-in view.

## 3DStub

This is not a game at all, simply a little demo to show some possibilities. You can look at the view in this game, trying out the various viewpoint and view direction controls, looking at the appearance and running speed you get with different kinds of sprites, flying the player around, and testing out the Ride the Player option.

With the Ride the Player on, try using Home to roll your player and shoot rubber bullets while you are rolling.

The world is equipped with some non-critter furniture objects. The critters do not interact with these shapes. It’s sort of interesting to fly the viewpoint to the inside of the teapot and look around.

## The Cursor Tools

The cursor on a Pop framework view takes on a different appearance according to which cursor tool is active for that view. Left clicking on a critter has an effect that depends on the currently active cursor tool. Do note that not all of the games have all of the cursor tools enabled. If a cursor tool isn’t enabled, it’s corresponding toolbar button will be grayed out.

Note that if you have currently selected the Player | Mouse Controls, you can’t use any cursor tools, as the cursor is busy controlling your player.

If your mouse has a wheel, you can switch among the active cursor tools by turning your mouse wheel in either direction. Otherwise you can select a cursor tool with the toolbar buttons, with View menu selections, or with accelerator keys.

For purposes of detecting a click, critters are treated as circles. That is, a cursor tool affects a critter if the click lies within a circle around the center of the critter’s sprite with a radius equal to the outermost point of the sprite.

Whenever you click on a critter it becomes the “focus critter”. All views of a game have the same focus critter. The focus critter is drawn with a circle around it, and its motion across the screen is paused. The size of the focus critter circle is slightly larger (10%) than the size which the critter is regarded as having. Sometimes you’ll barely notice the circle, but for the wall critters in the Dambuilder game, the focus circle will look surprisingly large.

There does not necessarily have to be a focus critter. If you click on an unoccupied part of the game world, then there will be no focus critter, and all the critters for that game will move about freely.

The Pop framework allows you to use the Z key in place of the left mouse button when using cursor tools.

In 3D worlds, the cursor tool click is thought of as acting on the line that runs from the viewpoint to the cursor. This means that clicking on a critter will affect it, just as in the 2D case.

### Shoot Cursor (Crosshairs Icon)

Clicking with this cursor aims the player in the direction of the click and makes the player fire a bullet. You can use the “Z” key instead of the left-click. In 3D, the default is to pick the aiming point to lie in the same plane as the player, that is, it is the point where your line of sight to the cursor cuts the player’s plane. However, in 3D if you are using the View | Ride Player, the aiming point is picked to be the spot on the far wall in the direction you are looking in, that is, it is the point where your line of sight to the cursor cuts a vertical wall parallel to the screen.

### Pick Cursor (Arrow Icon)

The Pick cursor is a default cursor that has no effect on the games.

### Drag Cursor (Hand Icon)

The Drag Cursor is used to drag critters to new locations on the game world.

In a 3D game world such as 3DStub, you can drag a critter only in the plane of its body.

In 2D or in 3D, if you drag a critter against a boundary such as a wall or the edge of the world, the critter will slide along the boundary, using whatever component of the drag motion lies parallel to the surface of the obstacle.

In the 2D Windows Graphics view, when you click a critter with the Drag Cursor tool, the critter is visually moved to lie above the other critters. In 3D OpenGL Graphics, the critter’s relative depth location is not changed like this by the Drag Cursor.

### Pin Cursor (Pin Icon)

The Pin Cursor kills a critter when you click on it. If you kill off some of your critters and restart the game (for instance by pressing Enter) the same number of critters are created as the current count. You need to make a separate left-click for each kill action, that is, dragging the Pin Cursor has no additional effect.

### Zap Cursor (Lightning Bolt Icon)

The Zap Cursor mutates the critter that you click on. It can be used on the player as well as on the other critters.

The active Hot Spot of the Zap Cursor is the upper left tip of the lightning bolt icon.

To “mutate” a critter means to change its size, and possibly the appearance of its sprite.

### Replicate Cursor (Equals Sign Icon)

This makes an exact copy of the clicked critter at a location near to the clicked critter. You are not allowed to replicate the player critter. Note that if you go wild and replicate dozens and dozens of critters, your updates per second will drop down, eventually making the game run too slow.

## The Menu Controls

Here are the names of all the Pop menu controls and the toolbar controls that are visible when a game is open. The menu controls which have a corresponding toolbar button have an asterisk after them.

### File Popup

Start or Restart Game

New Game Window * Open... *, Close, Save...*, Save As...

Recent File

Mute *

Pause *, Motion Smoothness...

Exit

### View Popup

3D OpenGL Graphics*, 2D Windows Graphics*

Reset Viewpoint

Keep Player in View, Ride the Player

No Background, Solid Background, Bitmap Background

Solid Objects, Wireframe Objects

Shoot Cursor *, Pick Cursor *, Drag Cursor *, Pin Cursor *, Zap Cursor *, Replicate Cursor *

Toolbar, Status Bar

### Game Popup

Wrap, Bounce

Spacewar, PickNPop, Airhockey, Ballworld, Dambuilder, Worms, 2DStub, 3DStub, 3D Defender

Small Critter Count, Medium Critter Count, Large Critter Count, Huge Critter Count

Mixed Sprites *, Bitmaps *, Asteroids *, Bubbles *, Simple Polygons *, Fancy Polygons *, Polypolygons *

### Player Popup

Shield

Arrow Key Controls, Scooter Controls, Car Controls, Spaceship Controls, Hopper Controls, Mouse Controls

Deadly Bullets, Rubber Bullets

Auto Play

### Window Popup

Additional View of Current Game, Cascade, Tile, Arrange Icons, Split

Autotile, Autofocus

### Help Popup

About The Pop Framework..., Your System’s OpenGL Graphics Support, Pop Program User’s Guide

## The Toolbar Controls

Each toolbar button has the same effect as selecting the corresponding menu control. From left to right, the buttons of the Pop toolbar correspond to these menu selections:

New Game Window, Open..., Save...,

Mute, Pause

Pick Cursor, Shoot Cursor, Drag Cursor, Pin Cursor, Replicate Cursor, Zap Cursor

Mixed Sprites, Bitmaps, Simple Polygons, Asteroids, Bubbles, Fancy Polygons, Polypolygons

2D Windows Graphics, 3D OpenGL Graphics

## The Status Bar

The standard status bar displays the player’s score, the player’s health, the total number of non-bullet critters in the game (including the player critter if one is present), and the number of updates per second that your machine is currently doing for the animation.

For some games such as Airhockey, the player health information is not useful, as in those games the player’s health is always the same.

As mentioned in the Updates Per Second section, the updates per second number is a rolling average over a period of time, so it will take awhile for this number to stabilize when you do some change to the current game --- such as changing the number or the types of the critters. The program is designed not to demand more than 100 updates per second, so you will never see an update number higher than 99 or 100.

As discussed in the Motion Smoothness Dialog section, the program is geared to match the size of the critters’ simulation time steps so that the critters take the same time to cross the game world irregardless of how fast your computer runs.

When you open a menu, the Status Bar shows a tip about the currently highlighted menu selection.

## Using The Menu and Toolbar Controls

### File Menu Controls

File | Start or Restart Game starts the animation of the game. If the game has already been run once, this control re-initializes the game and resets the player.

The File | New Game Window control creates a default Spacewar game.

The Open..., Save and Save As... opens or saves all of the currently active Pop game, critter, and sprite information. The Pop framework does not save or reload the particular View menu settings such as viewpoint, view direction, using solid or wireframe sprites, using a background bitmap, etc.

A somewhat annoying feature of the Pop framework is that you can’t open a given file if a file of the same name is already open. So if you have saved a file as test.p20 and then leave it open and let it run for awhile and then try to reopen it to get the old state back, nothing will happen. You need to close the current run of the game and then do a fresh open to get the saved test.p20 version back.

When you load a saved game, the game waits for you to press Enter to make it start running.

Mute toggles the sounds of the games on and off.

Pause toggles the motion of the critters on and off.

The Motion Smoothness... selection opens the Motion Smoothness Dialog. The dialog is documented below.

### View Menu Controls

The 3D OpenGL Graphics and 2D Windows Graphics options select between a visually interesting, slower-running 3D view and a crisp, flat, rapidly running 2D view.

Reset Viewpoint moves the viewpoint and view direction back to a standard location. It also sets the zoom back to the standard size. This is useful if you’ve gotten lost and can no longer see any of the game world.

Keep Player in View toggles an option whereby the view will adjust itself so that the player always shows. This is useful in a large world or in a zoomed-in view where the player can easily slide off the edge of the screen. When this option is in effect you cannot set the viewpoint and view direction so as to look away from the player.

Ride the Player attaches the viewpoint to a “bracket” a bit behind and above the player, and the view direction is set to look out ahead of the player. When this option is in effect, the Ctrl + Up/Down keys affect the height above the player which the viewer rides, and the View Direction controls have no effect. Instead, you change the view direction by turning the player.

The No Background, Solid Background, and Use Bitmap Background controls let you have a neutral wireframe background, a solid rectangle of color for the background, or a rectangular bitmap for the background. The background resizes itself along with the window and adjusts itself to match the view.

In 3D worlds, the background is viewed as one face of the world box.

The Solid Objects and Wireframe Objects selections toggle between a normal view of the sprites and a wireframe view. In wireframe mode, the polygons are drawn with no filling, and the bitmaps are drawn as rectangular bounding boxes surrounded by circles sized to match the sprite radius.

Depending on the game, you can select among some of these five different cursor tools: Pick, Shoot, Drag, Pin, Zap and Replicate. See the Cursor Tools section for more information about the actions of these tools.

### Game Menu Controls

The Wrap control causes the critters to wrap around the border box from left to right and top to bottom as they move. Note that the wrapped sprites are clipped by the border box. Note also that when a sprite moves off an edge or corner, it is simultaneously drawn as coming in from the other side or sides.

The Bounce control makes the critters bounce off the edges of the game world. Wrap and Bounce are mutually exclusive.

The Spacewar, PickNPop, Airhockey, Ballworld, Dambuilder, Worms, 2DStub, 3DStub, and 3D Defender selections switch the Game mode. Note that making one of these selections may also affect the current cursor, the background, the available cursor tools, and other settings.

Small, Medium, Large, and Huge Critter Count set the number of critters to, respectively, 4, 8, 25, and 80. You can further tune the number of critters by killing off unwanted critters. Note that if you have a Huge number of critters, your program will run slowly. Check the updates per second in the status bar.

Although the critter count controls have no effect in the Airhockey game, they aren’t disabled for this game.

Mixed Sprites, Bitmaps, Asteroids, Bubbles, Simple Polygons, Fancy Polygons, and Polypolygons set the sprites to various kinds of shapes. All of the sprites align themselves with the critters’ motion, with the exception of the Bitmaps in the 2D Windows Graphics. There’s no easy way to rotate bitmaps in Windows graphics, but it is in fact possible to turn them in 3D OpenGL Graphics.

The sprite change controls are disabled for some of the games. In Dambuilder selecting a sprite change control doesn’t change the sprites of the walls.

The Mixed Sprites control selects a mixture of the following kinds of sprites.

The Bitmaps are a variety of bitmaps stored as resources in the program. The Bitmaps present are variously based on resource workshop drawings, on a computer-generated fractal graphic, and on a scanned photograph. The Bitmap sprites have transparent backgrounds like cursor icons.

The Asteroids are irregular and spiky. They are drawn filled, and they can have thick or thin edge lines.

The Bubbles are circles which may be drawn with rectangular highlights or with pie-slice highlights.

The Simple Polygons are filled triangles, squares and pentagons.

The Fancy Polygons are regular and star polygons, with the regular polygon having between 2 and 9 vertices, and the star polygons having between 5 and 14 vertices. (A polygon of 2 vertices is simply a line segment.) In addition, the Fancy Polygons have the possibility of having thick lines for their edges and the possibility of having dots, or small circles, at their vertices.

The Polypolygons are Fancy Polygons which have a copy of a tip polygon at each vertex. The tip polygons are Fancy Polygons as well. The tip polygons rotate in a symmetric synchronization with each other, but independently of the main polygon.

### Player Menu Controls

The Shield switch makes the player invulnerable; that is, in Shield mode the player is unaffected by collisions with Enemy critters. Even though the Shield control has no purpose in the games Airhockey, it may still be enabled for some of these games.

Arrow Keys, Scooter Controls, Car Controls, Spaceship Controls, Hopper Controls and Mouse Controls allow six different ways of having the player respond to the arrow keys. See the Spacewar section above for details about this.

The player can shoot two kinds of bullets: Deadly Bullets and Rubber Bullets. In a battle game like Spacewar, rubber bullets are of no use. But the rubber bullets might be useful in a world where you use them to herd critters around.

The Auto Play switch is mainly for use in doing demos or for testing the program. It makes the program behave as if you are holding down the up key, the left key, and the space bar, except that the player will be turning at the slower of the two possible turn speeds. The Auto Play is geared for use in the Spacewar program, but could be implemented for other games.

### Window Menu Controls

Additional View of Current Game and Split. These controls open up new views of the same game. You can have different View menu settings in the different views. When you resize a split window, the size of the left pane will stay fixed, and the size of the right pane will vary depending on the window’s size. If there is no room left for a right pane while preserving the size of the left pane, the right pane is eliminated.

Cascade and Tile. These are standard Windows controls. Cascade arranges the open windows like a stack of file cards. Tile arranges them like a grid of cells in a table.

Autotile. This feature automatically maximizes any single child window, and automatically tiles multiple child windows into the outer frame. When autotile is active, opening a new view or a new file will retile the window so that all the windows show. It’s a useful feature added to the Pop Framework that doesn’t happen to be standard for Windows programs. This is on by default.

Autofocus. When this feature is on, the focus will move to whatever window the cursor is over. Ordinarily one has to click on a window to select it, but Autofocus selects a window automatically. This is convenient if you are using the cursor tools in several different windows. If you have many windows open, this feature can be inconvenient, as the focus will change if you move your mouse up to the menu bar or toolbar to make a selection. This is another useful non-standard feature added to the Pop Framework, but as it can be confusing, it’s turned off by default.

### Help Menu Controls

The About The Pop Framework dialog displays some contact information. The Pop Program User’s Guide selection shows this document. Rather than being a multiple-topic help file, the Pop help file is a single long document suitable for printing.

## The Motion Smoothness Dialog

The Motion Smoothness Dialog. This dialog is opened from the File menu. This dialog has an informational Updates Per Second field and a Motion Smoothness field that you can edit. The Motion Smoothness index number changes how smoothly and slowly your critters seem to move. A high value of the Motion Smoothness is like running in slow motion, a low value is like running in fast forward.

The informational Updates Per Second field on the Motion Smoothness dialog shows the current number of game updates per second. This should be the same number that you see in your status bar. The Motion Smoothness dialog can’t change the updates per second; the only way to change the updates per second is to change the size of the game window or the settings of your system graphics.

The Motion Smoothness control has a number that you can set between 1 and 10. These are artificial index numbers that have nothing to do with the numerical value of the Updates per Second. Lower smoothness values produce faster, jerkier motion. Higher smoothness values produce smoother, slower motion.

The default Motion Smoothness value is 5. At the default Motion Smoothness of 5, the simulation time per processing step matches the actual real time that elapses between updates. The games based on the Pop framework are designed to function best with Motion Smoothness 5.

The reason for having a Motion Smoothness control at all is that if you have a slow machine, then there will be a long time step per update, which entails a longer simulation time step, which entails a greater distance step in each critter’s update. This will produce unpleasant, jerky-looking motion. Therefore, if you have a slow machine, it is advisable to select a higher Motion Smoothness index.

Another time you might want to increase the Motion Smoothness is if a game seems to run too fast for you.

If you have a fast machine and would like to see the critters acting very hyper, you can select a lower Motion Smoothness.

If you change the Motion Smoothness setting, this new setting stays in effect even if you use the Game menu to select a different game.

## Accelerator Keys

Start or Restart Game Enter

Open Game Param File Ctrl + O

Close Game Window Ctrl + F4

Save Game Param File Ctrl + S

New Game Window Ctrl + N

Mute Ctrl + M

Pause/Unpause Ctrl + P

Close Pop Program Alt + F4

Reset Viewpoint Ctrl + R

Shoot Cursor 1

Pick Cursor 2

Drag Cursor 3

Pin Cursor 4

Zap Cursor 5

Replicate Cursor 6

There are also a few standard Windows accelerator keys that aren’t listed here.

## Contact Information

The Pop program is shareware by Rudy Rucker, Copyright (C) 2002 all rights reserved. Contact rucker@rudyrucker.com for further information.