📄 koules.cpp
字号:
if(show_player>nrockets)
{
show_player=0;
show_playerdata=FALSE;
}
else
show_playerdata=TRUE;
while(IsPressed (SCANCODE_TAB))
UpdateInput();
}
for (i = 0; i < nrockets; i++)
{
if (i == mouseplayer)
continue;
if (object[i].type != ROCKET)
continue;
if (rotation[i])
{
char s = 0;
if (IsPressing (keys[i][1]))
s = 1;
if (IsPressing (keys[i][2]))
s |= 2;
if (IsPressing (keys[i][0]))
s |= 4;
controls[i].type = C_RKEYBOARD;
controls[i].mask = s;
}
else
{
int s = 0;
if (IsPressing(keys[i][2]) && IsPressing(keys[i][0]))
s = 1;
else if (IsPressing(keys[i][3]) && IsPressing(keys[i][0]))
s = 2;
else if (IsPressing(keys[i][1]) && IsPressing(keys[i][3]))
s = 3;
else if (IsPressing(keys[i][1]) && IsPressing(keys[i][2]))
s = 4;
else if (IsPressing(keys[i][2]))
s = 5;
else if (IsPressing(keys[i][3]))
s = 6;
else if (IsPressing(keys[i][0]))
s = 7;
else if (IsPressing(keys[i][1]))
s = 8;
controls[i].type = C_KEYBOARD;
controls[i].mask = s;
}
}
break;
}
}
#define MIN(a,b) ((a)>(b)?(b):(a))
/*
* Make creations happen as coalescing circular cloud. Do this by
* creating random points within circle defined from center of screen, and
* giving them velocity towards desired final point.
*/
void creators_points (int radius, int x1, int y1, int color1)
{
int z, x, y, x2, y2;
double r;
int time = 50;
int midX, midY, r2,r1;
midX = GAMEWIDTH / 2;
midY = GAMEHEIGHT / 2;
r2 = r1 = MIN(midX, midY);
r2 *= r2;
z =(int)( radius * radius * M_PI / DIV / DIV);
while (z--) {
do {
x = rand() % GAMEWIDTH;
y = rand() % GAMEHEIGHT;
} while (((x-midX)*(x-midX) + (y-midY)*(y-midY)) > r2);
r=sqrt((double)((x-midX)*(x-midX) + (y-midY)*(y-midY)));
r=(r*radius/r1)/r*0.9;
x2=x1+(int)((x-midX)*r);
y2=y1+(int)((y-midY)*r);
addpoint(x * 256, y * 256,
(x2 - x) * 256 / (time),
(y2 - y) * 256 / (time),
color1 + (rand() % (DIV == 1 ? 16 : 32)),
time);
}
}
void creator (CONST int type)
{
int i;
int color1 = color (type, 0, 0);
for (i = nrockets; i < nobjects && (object[i].live ||
object[i].type == CREATOR);
i++);
if (i >= MAXOBJECT)
return;
if (!find_possition (&object[i].x, &object[i].y, radius (type)))
return;
if (i >= nobjects)
nobjects = i + 1;
object[i].live = 0;
object[i].live1 = 1;
object[i].lineto = -1;
object[i].ctype = type;
object[i].fx = 0.0;
object[i].fy = 0.0;
object[i].time = 50;
object[i].rotation = 0;
object[i].type = CREATOR;
object[i].M = M (type);
object[i].radius = radius (type);
object[i].accel = ROCKET_SPEED;
object[i].letter = ' ';
creators_points ((int)(object[i].radius),(int)( object[i].x),(int)( object[i].y), color1);
Effect (S_CREATOR1);
}
void creator_rocket (CONST int i)
{
int type = ROCKET;
int color1 = color (ROCKET, i, 0);
if (!find_possition (&object[i].x, &object[i].y, radius (type)))
return;
if (sound)
object[i].live1 = object[i].live;
object[i].live = 0;
object[i].thief = 0;
object[i].ctype = type;
object[i].lineto = -1;
object[i].fx = 0.0;
object[i].fy = 0.0;
object[i].time = 50;
object[i].rotation = 0;
object[i].type = CREATOR;
object[i].M = ROCKETM;
object[i].radius = ROCKET_RADIUS;
object[i].accel = ROCKET_SPEED;
object[i].letter = ' ';
creators_points (ROCKET_RADIUS, (int)(object[i].x), (int)(object[i].y), color1);
}
static void update_forces ()
{
int i;
int r;
double d;
double xp, yp;
int frocket = 0;
for (i = 0; i < nobjects; i++)
{
if (object[i].live)
{
if (object[i].lineto != -1)
{
if (!object[object[i].lineto].live)
object[i].lineto = -1;
else if (object[i].lineto == i)
object[i].lineto = -1;
else
{
int force;
xp = object[i].x - object[object[i].lineto].x;
yp = object[i].y - object[object[i].lineto].y;
force =(int)( sqrt (xp * xp + yp * yp));
if (force >= 2 * SPRINGSIZE || gameplan == COOPERATIVE)
{
force = force - SPRINGSIZE;
if (force < 0)
force *= 3;
force = force / SPRINGSTRENGTH;
normalize (&xp, &yp, force * BALL_SPEED / object[i].M);
object[i].fx -= xp;
object[i].fy -= yp;
normalize (&xp, &yp, force * BALL_SPEED / object[object[i].lineto].M);
object[object[i].lineto].fx += xp;
object[object[i].lineto].fy += yp;
}
}
}
if (object[i].type == ROCKET && object[i].time)
object[i].time--;
if (object[i].type == ROCKET && !object[i].time)
{
d = 640 * 640;
frocket = -1;
for (r = 0; r < nobjects; r++)
{
if (object[r].live && !object[r].time && object[r].type == EHOLE)
{
int distance;
double gravity;
xp = object[r].x - object[i].x;
yp = object[r].y - object[i].y;
distance =(int)( sqrt (xp * xp + yp * yp));
gravity = BALL_SPEED * (gameplan == COOPERATIVE ? 200 : 50) / distance;
if (gravity > BALL_SPEED * 4 / 5)
gravity = BALL_SPEED * 4 / 5;
normalize (&xp, &yp, gravity);
object[i].fx += xp;
object[i].fy += yp;
}
}
}
if (object[i].type == BALL || object[i].type == LBALL || object[i].type == BBALL || object[i].type == LUNATIC)
{
frocket = -1;
d = 640 * 640;
for (r = 0; r < nrockets; r++)
{
if (object[r].live && !object[r].time)
{
xp = object[r].x - object[i].x;
yp = object[r].y - object[i].y;
if (xp * xp + yp * yp < d)
d = xp * xp + yp * yp, frocket = r;
}
}
if (frocket != -1)
xp = object[frocket].x - object[i].x,
yp = object[frocket].y - object[i].y;
else
xp = GAMEWIDTH / 2 - object[i].x,
yp = GAMEHEIGHT / 2 - object[i].y;
if (object[i].type == LUNATIC && !(rand () % 4))
{
xp = rand ();
yp = rand () + 1;
}
switch (object[i].type)
{
case BBALL:
normalize (&xp, &yp, BBALL_SPEED);
break;
case BALL:
case LUNATIC:
case LBALL:
normalize (&xp, &yp, BALL_SPEED);
break;
}
object[i].fx += xp;
object[i].fy += yp;
}
object[i].fx *= SLOWDOWN,
object[i].fy *= SLOWDOWN;
}
}
}
static void colisions ()
{
int i, y;
int colize = 0;
static int ctime = 0;
double xp, yp, gummfactor;
for (i = 0; i < nobjects; i++)
if (object[i].live)
for (y = i + 1; y < nobjects; y++)
if (object[y].live)
{
xp = object[y].x - object[i].x;
yp = object[y].y - object[i].y;
if (xp * xp + yp * yp < (object[y].radius + object[i].radius) *
(object[y].radius + object[i].radius))
{
colize = 1;
if (object[i].type == HOLE || object[i].type == EHOLE)
{
if (object[y].type != APPLE)
destroy (y);
if (object[i].type == EHOLE)
destroy (i);
continue;
}
if (object[y].type == HOLE || object[y].type == EHOLE)
{
if (object[i].type != APPLE)
destroy (i);
if (object[y].type == EHOLE)
destroy (y);
continue;
}
if (object[i].type == ROCKET)
{
if (object[y].thief == 1 && object[i].thief == 1)
{
double tmp;
tmp = object[i].M;
object[i].M = object[y].M;
object[y].M = tmp;
object[i].thief = 0;
object[y].thief = 0;
}
if (object[y].type == BBALL && object[i].thief == 1)
{
object[i].M += object[y].M - M (BALL);
object[i].thief = 0;
object[y].M = M (BALL);
}
else if (object[y].type == ROCKET && object[i].thief == 1)
{
object[i].M += object[y].M - M (ROCKET);
object[i].accel += object[y].accel - ROCKET_SPEED;
object[i].thief = 0;
object[y].M = M (object[i].type);
object[y].accel = ROCKET_SPEED - A_ADD;
}
if (object[i].type == ROCKET && object[y].thief == 1)
{
object[y].M += object[i].M - M (ROCKET);
object[y].accel += object[i].accel - ROCKET_SPEED;
object[y].thief = 0;
object[i].M = M (object[y].type);
object[i].accel = ROCKET_SPEED - A_ADD;
}
if (gameplan == COOPERATIVE)
object[i].score++;
if (object[y].letter == L_ACCEL)
object[i].accel += A_ADD,
object[i].score += 10;
if (object[y].letter == L_GUMM)
object[i].M += M_ADD,
object[i].score += 10;
if (object[y].letter == L_THIEF)
object[i].M = M (object[i].type),
object[i].accel = ROCKET_SPEED - A_ADD,
object[i].score -= 30;
if (object[y].letter == L_FINDER)
{
object[i].accel += A_ADD * (rand () % 5);
object[i].M += M_ADD * (rand () % 10);
object[i].score += 30;
}
if (object[y].letter == L_TTOOL)
{
object[i].thief = 1;
object[i].score += 30;
}
object[y].letter = ' ';
if (object[y].type == LBALL)
object[y].type = BALL;
if (object[y].type == BALL && dosprings && !(rand () % randsprings))
object[y].lineto = i;
if (gameplan == DEATHMATCH && object[y].type == ROCKET && dosprings && !(rand () % (2 * randsprings)))
object[y].lineto = i;
}
if (object[y].type == LUNATIC)
{
gummfactor = -ROCKETM / LUNATICM;
}
else if (object[i].type == LUNATIC)
{
gummfactor = -LUNATICM / ROCKETM;
}
else
gummfactor = object[i].M / object[y].M;
normalize (&xp, &yp, gummfactor * GUMM);
object[y].fx += xp;
object[y].fy += yp;
normalize (&xp, &yp, 1 / gummfactor * GUMM);
object[i].fx -= xp;
object[i].fy -= yp;
if (object[i].type == ROCKET && object[i].time)
object[i].fx = 0,
object[i].fy = 0;
if (object[y].type == ROCKET && object[y].time)
object[y].fx = 0,
object[y].fy = 0;
if (object[y].type == INSPECTOR && object[i].type == ROCKET)
{
object[y].fx = 0,
object[y].fy = 0;
object[i].fx *= -2,
object[i].fy *= -2;
}
}
}
if (colize && !ctime)
{
Effect (S_COLIZE);
ctime = 4;
}
if (ctime)
ctime--;
}
void gameloop(void)
{
UpdateInput();
process_keys ();
sprocess_keys ();
update_values ();
update_game ();
update_forces ();
colisions ();
move_objects ();
check_limit ();
draw_objects (1);
}
void USleep(DWORD millsec)
{
DWORD t,t1;
t1=t=timeGetTime();
while((t1-t)<millsec)
{
t1=timeGetTime();
UpdateInput();
if(Pressed())
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -