Hey Guys!

This is a simple, mario-like platformer without complex math, only a simple gravity, collectable coin blocks and moveable blocks. Have Fun!

Code:
#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);
	}
}



Visit my site: www.masterq32.de