Floupix ping-pong is copylefted under the GNU General Public License by the S.S.M.T.F.

Floupix is a Slime-Volleyball-like with many bonuses, options, playable up to 12 human or automatic players.

Each player is a floupix and can jump and bump the ball to make it touch the other players' ground, using various bonuses with different colors and effects.

Get Floupix ping pong as a a bin/cue (complete game ready to burn; 60 Mo); an iso (the same without audio cd tracks; 1,4 Mo).

**for NTSC 60 Hz version**, please get this iso. Use the PAL bin/cue and replace the sl.iso with it.

You can get the source code (4 Mo)

**Note:**mp3 audio files are not included in the source archive. Download the bincue archive to get it.

left / right | move your floupix left and right |

A | single jump (and fly) depending on the control mode |

left / right quickly | single jump (and fly) depending on the control mode |

Z | move your floupix back to your camp |

B | use the bonus over your head |

C | ask for new bonuses depending on bonus distribution mode |

L | toggles pause |

**Note : **When someone pauses the game, you can join by pressing **A**.

Scoring is easy in *one net, two teams* mode : when the ball touches the ground of a team, the other team scores one point.

In *two nets, three teams* mode, when the ball touches the ground of a team, this team loses one point and ther other two teams score one point.

**Note : **You will probably notice that in *two nets, three teams* mode, the two losing teams should band together against the third team to lower its score.

KingKong | the ball bounces on the ground | |

Nosferatu | the ball does not collide with players | |

LongDrink | creates a fake ball | |

Chomplet | freezes the ball | |

Liste des fuckings | makes the ball invisible | |

Throter | make the net full heighted (invisible wall) | |

Kansas | makes the player race towards the ground | |

Proat | gives an upward impulsion to the ball | |

Jumbo Jim | disables boucing on the top of the screen |

The game options menu is straightforward. Use **Up** or **Down** keys to select an option; **A** to change its value; **B** to validate and exit.

**Bonus Distribution** is one of *none*,*straight*,*smooth*,*boumtou*,*chainsaw*, and *ok corral*. It determines the distribution frequency of incoming bonuses, the number of bonuses for each distribution as well as the maximum number of bonuses one floupix can simultaneoulsy get.

**Note : ** in ok corral mode, you can press **C** to get more bonuses.

The selected **bonus collection** (i.e. set of bonus that are to be used during the game and probablity for each bonus to appear) is shown under the option menu when "bonus collection" is selected, as represented on the screenshot.

The **controls** choice between different that are to be used during the game is made among the followings :

Standard | Left+Right buttons to jump and fly |

Floupix Con | A button to jump and fly |

Combo | Left+Right or A button to jump and fly |

Slime | Left+Right or A button to jump |

You will probably notice some strange collisions effects between the balls and the players. It's not a bug: you should consider it to be a modelisation of the quantic behaviour of floupixes viewed as particles.

If you persist in seeing these behaviours as bugs, please correct these lines :

```
void compute_boucing_ball_speed(BALL* b, PLAYER* p){
// is fact, there is no collision...
if (b->pos[Y]>(p->pos[Y]-PLAYER_SPR_CENTER_OFFSET))
return;
FIXED dist1,dist2;
dist1 = (p->last_pos[Y] - PLAYER_SPR_CENTER_OFFSET) - b->last_pos[Y];
dist2 = (p->pos[Y] - PLAYER_SPR_CENTER_OFFSET) - b->pos[Y];
if (dist1 < dist2){ // the boucing surf. is flat
FIXED sy = b->speed[Y];
b->speed[Y] = slSquartFX(slMulFX(sy,sy));
} else { // else, it is curved ...
FIXED x_p,y_p,x_b,y_b; // ball & player position
FIXED dx, dy;
FIXED d,d_2; // distancy & distancy^2
FIXED vx, vy; // ball speed
FIXED vxdx,vxdy,vydx,vydy,dx_d2,dy_d2; // various terms ...
vx = b->speed[X];
vy = b->speed[Y];
x_b=b->pos[X];
y_b=b->pos[Y];
x_p=p->pos[X];
y_p=p->pos[Y];
dx = x_p - x_b;
dy = (y_p - y_b);
d_2 = slMulFX(dx,dx) + slMulFX(dy,dy);
d = slSquartFX(d_2);
// boucing direction & speed
vxdx = slMulFX(vx,dx);
vxdy = slMulFX(vx,dy);
vydx = slMulFX(vy,dx);
vydy = slMulFX(vy,dy);
dx_d2 = slDivFX(d_2,dx);
dy_d2 = slDivFX(d_2,dy);
b->speed[X] = slMulFX(dx_d2,vxdx-vydy) - slMulFX(dy_d2,vxdy+vydx);
b->speed[Y] = - slMulFX(dy_d2,vydy-vxdx) + slMulFX(dx_d2,vxdy+vydx);
// correct ball position (push ball to the surface)
FIXED cos_a,sin_a;
FIXED real_pradius = BALL_SPR_RADIUS+PLAYER_SPR_RADIUS+toFIXED(1.0);
cos_a = slDivFX(d,dx);
sin_a = slDivFX(d,dy);
b->pos[X] = x_p - slMulFX(real_pradius, cos_a);
b->pos[Y] = y_p - slMulFX(real_pradius, sin_a);
}
// ball speed modification according the player's (in all kind of coll)
int i;
for (i=0;i<2;i++){
if ((slMulFX(b->speed[i],p->speed[i])
```speed[i] += p->speed[i];
} else { //b and p speeds sign are the same
FIXED vp2,vb2;
vp2 = slMulFX(p->speed[i],p->speed[i]);
vb2 = slMulFX(b->speed[i],b->speed[i]);
if (vb2speed[i] += p->speed[i];
}
}
}
}

Thanks, and have a nice floupix.