/***********************************************************
* K O U L E S *
*----------------------------------------------------------*
* C1995 JAHUSOFT *
* Jan Hubicka *
* Dukelskych bojovniku 1944 *
* 390 03 Tabor *
* Czech Republic *
* Phone: 0041-361-32613 *
* eMail: hubicka@limax.paru.cas.cz *
*----------------------------------------------------------*
* Copyright(c)1995,1996 by Jan Hubicka.See README for *
* licence details. *
*----------------------------------------------------------*
* gameplan.c scores,levels...... *
***********************************************************/
/* Changes for OS/2 Warp with Dive. *
* Copyright(c)1996 by Thomas A. K. Kjaer *
***********************************************************/
#include "koules.h"
#include "server.h"
#define HOLELEVEL 5
#define BBALLLEVEL (nrockets==1?12:10)
#define EHOLELEVEL 20
#define SPRINGLEVEL 30
#define THIEFLEVEL 40
#define FINDERLEVEL 50
#define TTOOLLEVEL 60
#define INSPECTORLEVEL 70
#define BBBALLLEVEL 90
#define LUNATICLEVEL 80
static int level = 0;
static int gtime;
static int nos;
static int ktime = 0;
static int kmode = 0;
static int secondpart;
void
gameplan_init ()
{
#ifdef DEBUG
level = 98;
#else
level = lastlevel;
#endif
}
void
effect (int so)
{
char s[20];
if (gamemode == GAME)
{
if (!so)
Effect (S_START, 0);
else
Effect (S_END, 0);
}
if (gameplan == COOPERATIVE)
{
#ifdef SOUND
#endif
gamemode = MENU;
#ifndef DEBUG
if (!so && level == 0)
#endif
intro_intro ();
#ifndef DEBUG
if (!so && level == HOLELEVEL + 1)
#endif
hole_intro ();
#ifndef DEBUG
if (!so && level == INSPECTORLEVEL)
#endif
inspector_intro ();
#ifndef DEBUG
if (!so && level == BBALLLEVEL + 1)
#endif
bball_intro ();
#ifndef DEBUG
if (!so && level == BBBALLLEVEL)
#endif
bbball_intro ();
#ifndef DEBUG
if (!so && level == EHOLELEVEL)
#endif
maghole_intro ();
#ifndef DEBUG
if (!so && level == SPRINGLEVEL + 1)
#endif
spring_intro ();
#ifndef DEBUG
if (!so && level == THIEFLEVEL)
#endif
thief_intro ();
#ifndef DEBUG
if (!so && level == FINDERLEVEL)
#endif
finder_intro ();
#ifndef DEBUG
if (!so && level == TTOOLLEVEL)
#endif
ttool_intro ();
#ifndef DEBUG
if (!so && level == LUNATICLEVEL)
#endif
lunatic_intro ();
if (!so && level == 99)
outro1 ();
}
gamemode = GAME;
SetScreen (backscreen);
ClearScreen ();
tbreak = 1;
if (gameplan == COOPERATIVE)
sprintf (s, "SECTOR %i", level + 1);
else
sprintf (s, "GET READY");
#ifdef XSUPPORT
DrawWhiteMaskedText (MAPWIDTH / 2 - 32, MAPHEIGHT / 2 - 4, s);
#else
DrawText (MAPWIDTH / 2 - 32, MAPHEIGHT / 2 - 4, s);
#endif
CopyToScreen (backscreen);
fadein ();
#ifdef XSUPPORT
XFlush (dp);
#endif
#ifdef OS2DIVE
forceBlitting ();
#endif
fflush (stdout);
usleep (1000000);
}
/*
* level creation routines
*/
static void
init_objects1 ()
{
int i, nholes;
dosprings = 0;
lastlevel = level;
if (maxlevel < level)
maxlevel = level;
save_rc ();
if (gamemode != GAME)
{
nobjects = 0;
return;
}
switch (gameplan)
{
case DEATHMATCH:
dosprings = 1; /* enable spring in death match */
randsprings = 40;
if (nrockets != 1)
{
nobjects = nrockets * 3 * GAMEWIDTH / 640 * GAMEHEIGHT / 460 + 3;
for (i = 0; i < nobjects; i++)
object[i].live = 0;
for (i = 0; i < nobjects; i++)
{
object[i].live = 1;
object[i].lineto = -1;
object[i].live1 = 1;
object[i].thief = 0;
object[i].time = (i < nrockets ? 99 : 0);
object[i].fx = 0;
object[i].fy = 0;
object[i].rotation = 0;
object[i].type = (i < nrockets ? ROCKET : BALL);
if (!find_possition (&object[i].x, &object[i].y, radius (object[i].type)))
return;
object[i].M = M (object[i].type);
object[i].radius = radius (object[i].type);
object[i].accel = ROCKET_SPEED;
object[i].letter = ' ';
secondpart = 0;
}
nholes = nrockets / 3 + 1;
for (i = 0; i < nholes; i++)
creator (HOLE);
creator (INSPECTOR);
creator (EHOLE);
}
else
{
nobjects = 2;
for (i = 0; i < nobjects; i++)
object[i].live = 0;
for (i = 0; i < nobjects; i++)
{
object[i].live = 1;
object[i].lineto = -1;
if (i != 0)
object[i].lineto = 0;
object[i].live1 = 1;
object[i].thief = 0;
object[i].time = (i < nrockets ? 99 : 0);
object[i].fx = 0;
object[i].fy = 0;
object[i].rotation = 0;
object[i].type = (i < nrockets ? ROCKET : LUNATIC);
if (!find_possition (&object[i].x, &object[i].y, radius (object[i].type)))
return;
object[i].M = M (object[i].type);
object[i].radius = radius (object[i].type);
object[i].accel = ROCKET_SPEED;
object[i].letter = ' ';
secondpart = 0;
}
}
break;
case COOPERATIVE:
if (level != 99)
{
int nbballs;
if (level > SPRINGLEVEL)
dosprings = 1;
randsprings = 40 - level / 3;
nobjects = 3 + sqrt (level) * ((nrockets + 1) / 2) + 2 * nrockets;
nobjects = (float) nobjects *(GAMEWIDTH / 640 * GAMEHEIGHT / 460 + 2) / 3;
if (nobjects > 30)
nobjects = 30;
for (i = 0; i < nobjects; i++)
object[i].live = 0;
nbballs = nrockets + level / BBBALLLEVEL;
gtime = 100 + 1000 / (level + 1);
for (i = 0; i < nobjects; i++)
{
object[i].live = (i < nrockets ? 5 : 1);
object[i].live1 = (i < nrockets ? 5 : 1);
object[i].lineto = -1;
object[i].thief = 0;
object[i].time = (i < nrockets ? 100 : 0);
object[i].fx = 0;
object[i].fy = 0;
object[i].rotation = 0;
object[i].type = (i < nrockets ? ROCKET : (i < nbballs ? BBALL : BALL));
object[i].M = M (object[i].type);
if (i < nrockets)
{
if (level < 5)
object[i].M *= 1.0 + (5.0 - level) / 15.0;
if (level < 25)
object[i].M *= 1.0 + (level) / 120.0;
}
object[i].radius = radius (object[i].type);
object[i].accel = ROCKET_SPEED;
if (!find_possition (&object[i].x, &object[i].y, radius (object[i].type)))
return;
object[i].letter = ' ';
}
}
else
{
nobjects = nrockets + 10;
for (i = 0; i < nobjects; i++)
object[i].live = 0;
object[nrockets].type = APPLE;
object[nrockets].M = APPLEM;
object[nrockets].lineto = -1;
object[nrockets].thief = 0;
object[nrockets].radius = APPLE_RADIUS;
object[nrockets].live = (i < nrockets ? 5 : 1);
object[nrockets].fx = 0;
object[nrockets].fy = 0;
object[nrockets].x = GAMEWIDTH / 2;
object[nrockets].y = GAMEHEIGHT / 2;
for (i = 0; i < nrockets; i++)
{
object[i].live = 5;
object[i].live1 = 5;
object[i].time = 100;
object[i].thief = 0;
object[i].lineto = -1;
object[i].fx = 0;
object[i].fy = 0;
object[i].rotation = 0;
object[i].type = ROCKET;
object[i].accel = ROCKET_SPEED;
object[i].M = M (object[i].type);
object[i].radius = radius (object[i].type);
object[i].letter = ' ';
object[i].x = GAMEWIDTH / 2 + sin (i * RAD (360) / nrockets) * GAMEHEIGHT / 3;
object[i].x = GAMEHEIGHT / 2 + cos (i * RAD (360) / nrockets) * GAMEHEIGHT / 3;
}
for (i = nrockets + 1; i < nobjects; i++)
{
object[i].live = 1;
object[i].live1 = 1;
object[i].lineto = -1;
object[i].time = 0;
object[i].thief = 0;
object[i].fx = 0;
object[i].fy = 0;
object[i].rotation = 0;
object[i].type = BALL;
object[i].accel = BALL_SPEED;
object[i].M = M (object[i].type);
object[i].radius = radius (object[i].type);
object[i].letter = ' ';
if (!find_possition (&object[i].x, &object[i].y, radius (object[i].type)))
return;
}
}
}
ktime = 0;
}
void
init_objects ()
{
switch (difficulty)
{
case 0:
ROCKET_SPEED = 0.8;
BALL_SPEED = 1.2;
BBALL_SPEED = 1.2;
SLOWDOWN = 0.9;
GUMM = 20;
BALLM = 3;
LBALLM = 3;
BBALLM = 8;
APPLEM = 40;
ROCKETM = 2;
break;
case 1:
ROCKET_SPEED = 1.0;
BALL_SPEED = 1.2;
BBALL_SPEED = 1.2;
SLOWDOWN = 0.9;
GUMM = 20;
BALLM = 3;
LBALLM = 3;
BBALLM = 8;
APPLEM = 40;
ROCKETM = 4;
break;
case 2:
ROCKET_SPEED = 1.2;
BALL_SPEED = 1.2;
BBALL_SPEED = 1.2;
SLOWDOWN = 0.8;
GUMM = 20;
APPLEM = 34;
BALLM = 3;
LBALLM = 3;
BBALLM = 8;
ROCKETM = 4;
break;
case 3:
ROCKET_SPEED = 2.0;
BALL_SPEED = 1.2;
BBALL_SPEED = 1.2;
SLOWDOWN = 0.8;
GUMM = 20;
BALLM = 3;
LBALLM = 3;
APPLEM = 24;
BBALLM = 8;
ROCKETM = 5;
break;
case 4:
ROCKET_SPEED = 2.0;
BALL_SPEED = 1.2;
BBALL_SPEED = 1.2;
SLOWDOWN = 0.8;
GUMM = 15;
BALLM = 3;
LBALLM = 3;
APPLEM = 24;
BBALLM = 8;
ROCKETM = 7;
}
#ifdef NETSUPPORT
if (!server)
#endif
clearpoints ();
#ifdef NETSUPPORT
if (!client)
#endif
init_objects1 ();
if (!server)
effect (nos);
#ifdef NETSUPPORT
else
{
if (server)
SEffect (lastlevel, nos);
}
#endif
}
int
allow_finder ()
{
if (level > FINDERLEVEL || gameplan == DEATHMATCH)
return 1;
return 0;
}
int
create_letter ()
{
int tirage, chance, letter;
int i;
if (gameplan == COOPERATIVE)
{
i = rand () % 4;
if (i < 3)
return (i);
if (level > THIEFLEVEL && rand () % 400 < level - THIEFLEVEL + 40)
return (3);
if (level > TTOOLLEVEL && rand () % 600 < level - TTOOLLEVEL + 40)
return (5);
if (level > FINDERLEVEL && gtime < 0 && rand () % 700 < level - FINDERLEVEL + 40)
return (4);
return (0);
}
chance = rand () % 100;
if (chance < 80)
{ /* create letter : = 1 rand / 2 */
tirage = rand () % 100;
if (tirage < 30)
letter = 1;
else if (tirage < 60)
letter = 2;
else if (tirage < 70)
letter = 5;
else if (tirage < 80)
letter = 3;
else
letter = 4;
return (letter);
}
else
return (0);
}
void
update_game ()
{
int i;
if (gamemode == GAME)
{
if (ktime)
{
ktime--;
if (ktime == 0)
switch (kmode)
{
case 1:
init_objects ();
break;
case 2:
lastlevel = 0;
level = 1, gamemode = MENU;
#ifdef NETSUPPORT
if (server)
Outro ();
else
#endif
outro2 ();
break;
case 3:
if (a_balls || a_bballs || a_inspectors || a_lunatics)
break;
for (i = 0; i < nrockets; i++)
if (object[i].type == ROCKET && object[i].live)
object[i].score += object[i].live * 20;
level++, init_objects ();
break;
case 4:
for (i = 0; i < nrockets; i++)
if (object[i].type == ROCKET)
object[i].score -= 100;
nos = 1;
init_objects ();
nos = 0;
break;
}
}
else
switch (gameplan)
{
case DEATHMATCH:
if (nrockets == 1)
{
if (!(rand () % 60))
creator (HOLE);
if (a_rockets == 0)
{
ktime = 50;
kmode = 1;
object[0].score -= 100;
}
if (a_lunatics == 0)
{
ktime = 50;
kmode = 1;
object[0].score += 100;
}
break;
}
if (a_balls == 0)
secondpart = 1;
if (a_lunatics < nrockets && !(rand () % 150))
creator (LUNATIC);
if (secondpart)
{
if (!(rand () % 100))
creator (BBALL);
if (!(rand () % 60))
creator (HOLE);
if (!(rand () % 400))
creator (BBALL);
if (!(rand () % 400))
creator (INSPECTOR);
if (!(rand () % 600))
creator (EHOLE);
}
if (a_rockets <= 1)
{
ktime = 50;
kmode = 1;
}
break;
case COOPERATIVE:
if (level == 99)
{
if (!a_apples)
ktime = 50, kmode = 2;
if (a_balls < 15)
if (!(rand () % 40))
creator (BALL);
/*if (a_lunatics < 3)
if (!(rand () % 90))
creator (LUNATIC); */
if (a_bballs < 3)
if (!(rand () % 3000))
creator (BBALL);
}
else
{
gtime--;
if (a_balls == 0 && a_bballs == 0 && a_inspectors == 0 && a_lunatics == 0)
{
ktime = 50, kmode = 3;
}
if (a_balls < 4 * level && gtime < 0)
if (!(rand () % ((nrockets == 1 ? 200 : 150) + (110 - level))))
creator (BALL);
if (a_lunatics < (level - LUNATICLEVEL) && a_lunatics < 3 && gtime < 0)
if (!(rand () % ((nrockets == 1 ? 800 : 450) + (110 - level))))
creator (LUNATIC);
if (a_holes < 4 * (level - HOLELEVEL) && gtime < 0)
if (!(rand () % (412 + 512 / level)))
creator (HOLE);
if (a_bballs < 4 * (level - BBALLLEVEL) && gtime < 0)
if (!(rand () % ((nrockets == 1 ? 700 : 500) + 1 * (110 - level) / 3 + 2024 / level)))
creator (BBALL);
if (a_inspectors < level / (INSPECTORLEVEL) && gtime < 0)
if (!(rand () % (1500 + 10 * (110 - level))))
creator (INSPECTOR);
if (a_eholes < level / EHOLELEVEL + 1 && gtime < 0 && level >= EHOLELEVEL)
if (!(rand () % (500 + 1000 / level)))
creator (EHOLE);
}
if (a_rockets == 0)
{
ktime = 50;
kmode = 4;
}
}
}
else
{
if (a_balls < 5 && !(rand () % (50)))
creator (BALL);
if (a_lunatics < 5 && !(rand () % (50)))
creator (LUNATIC);
if (a_bballs < 4 && !(rand () % (200)))
creator (BBALL);
}
}