#include <acknex.h>
#include <default.c>
#include <keys.c>
#define MOVE_FLAGS (USE_BOX|IGNORE_PASSABLE|IGNORE_PASSENTS)
var score = 0;
action block()
{
my.flags |= LIGHT;
my.red = 0; my.green = 32; my.blue = 0;
}
action coin()
{
my.flags |= (PASSABLE | LIGHT);
my.red = 255; my.green = 255; my.blue = 0;
my.ambient = 100;
my.scale_x = 0.1;
vec_scale(my.scale_x, 0.7);
var sz = my.z;
var vz = 20;
var z = 0;
while(my.z >= sz)
{
wait(1);
my.z += vz * time_step;
vz -= 5 * time_step;
my.pan += 35 * time_step;
}
ent_remove(me);
}
action physblock()
{
my.flags |= LIGHT;
my.red = 0; my.green = 0; my.blue = 32;
var vel_z = 0;
while(1)
{
vel_z -= 3 * time_step;
if(vel_z != 0 && c_move(me, nullvector, vector(0, 0, vel_z * time_step), MOVE_FLAGS) == 0)
{
vel_z = 0;
}
if(my.skill2 != 0)
{
var vel_x = 5 * sign(my.x - player.x) * time_step;
c_move(me, nullvector, vector(vel_x, 0, 0), MOVE_FLAGS);
}
my.skill2 = 0;
wait(1);
}
}
action coinblock()
{
my.flags |= LIGHT;
// my.material = mtl_unlit;
my.red = 255; my.green = 255; my.blue = 0;
my.skill3 = 1;
while(my.skill3 > 0)
{
while(my.skill1 == 0)
{
wait(1);
}
score += 1;
my.skill1 = 0;
my.skill3 -= 1;
ent_create(SPHERE_MDL, my.x, coin);
}
my.red = 0;
my.green = 0;
my.blue = 0;
//ent_remove(me);
}
action player_control()
{
my.flags |= (LIGHT | UNLIT);
var vel_x = 0;
var vel_z = 0;
var ground = 0;
var wall = 0;
var ceiling = 0;
while(1)
{
vel_z -= 3 * time_step;
vel_x += (1 + 4 * wall) * (key_cur - key_cul) * time_step;
vel_x *= 0.9;
if((ground || wall) && key_hit("space"))
{
vel_z = 12;
}
if(vel_z != 0 && c_move(me, nullvector, vector(0, 0, vel_z * time_step), MOVE_FLAGS) == 0)
{
if(vel_z > 0)
ceiling = 1;
else
ground = 1;
if(abs(normal.x) > 0.5)
{
ground = 0;
ceiling = 0;
}
vel_z = 0;
}
else
{
ground = 0;
ceiling = 0;
}
if(vel_x != 0 && c_move(me, nullvector, vector(vel_x, 0, 0), MOVE_FLAGS) == 0)
{
vel_x = 0;
wall = 1;
}
else
{
wall = 0;
}
if(c_trace(my.x, vector(my.x, my.y, my.z + 12 * sign(vel_z)), USE_POLYGON | IGNORE_PASSABLE | IGNORE_PASSENTS) != 0)
{
if(you)
{
you.skill1 = 1;
}
}
if(c_trace(my.x, vector(my.x + 12 * sign(vel_x), my.y, my.z), USE_POLYGON | IGNORE_PASSABLE | IGNORE_PASSENTS) != 0)
{
if(you)
{
you.skill2 = 1;
}
}
wait(1);
}
}
function spawnphys()
{
ent_create(CUBE_MDL, vector(192, 0, 48), physblock);
}
function main()
{
fps_max = 60;
d3d_antialias = 9;
level_load(NULL);
var x, y;
for(x = 0; x < 16; x++)
{
ent_create(CUBE_MDL, vector(16*x, 0, 0), block);
if(x==0 || x==3 || x==4)
{
ent_create(CUBE_MDL, vector(16*x, 0, 16), block);
}
if(x==3)
{
ent_create(CUBE_MDL, vector(16*x, 0, 32), block);
}
}
ent_create(CUBE_MDL, vector(128, 0, 48), coinblock);
you = ent_create(CUBE_MDL, vector(128+16, 0, 48), coinblock);
you.skill3 = 10;
on_e = spawnphys;
spawnphys();
player = ent_create(SPHERE_MDL, vector(64, 0, 32), player_control);
camera.pan = 90;
proc_mode = PROC_LATE;
while(1)
{
camera.x = player.x;
camera.y = player.y - 256;
camera.z = player.z;
DEBUG_VAR(score, screen_size.y - 32);
wait(1);
}
}