← index
JavaScript.Projects/source/apps/WebAssembly_Ports/MasterKong2D/wasm_port/hero.cpp
Source: JavaScript.Projects/source/apps/WebAssembly_Ports/MasterKong2D/wasm_port/hero.cpp
// the hero object

// written by *jared bruni*

// www.lostsidedead.com


// open source,  open mind ++


#include "thehead.h"




void Hero::ondraw()
{
	int hx;
	int hy;
	level.GetPointFromPos(hero_pos,hx,hy);
	// on drawing

	if(hdir == true)
	{
		herog[cur_hero].DisplayGraphic(hx,hy);
	}
	else
	{
		herogl[cur_hero].DisplayGraphic(hx,hy);
	}
}

void Hero::hlogic()
{
	if(ijump == true)
	{
		// check and see wazup

		bool check1;
		check1 = level.blocks[hero_pos-1].solid;
		bool check2;
		check2 = level.blocks[hero_pos+24-1].solid;
		
		if(check1 == true || check2 == true)
		{
			goto iover;
		}
		
		hero_pos--;
		jcount++;
		if(jcount > 6)
		{
iover:
		jcount = 0;
		ijump = false;
		cur_hero = 4;
		// falldown

		ifall = true;
		}
	}
	
	procblock();
}

// proccess blocks, see if hes standing on one, and move him down

void Hero::procblock()
{
	if(ijump == false)
	{
		if( level.blocks[hero_pos+4].solid  == false)
		{
			if( level.blocks[hero_pos+24+4].solid == true)
			{ 
				goto elsex;
			}
			
			hero_pos++;
		}
		else
		{
elsex:
		if(ifall == true)
		{
			ifall = false;
			cur_hero = 0; // we have landed

		}
		}
		
	}
}

void Hero::onlogic()
{
	
	if(ifire == true)
	{
		procfire();
		return;
	}
	
	hlogic();

	// synchonized logic, based on 'speed' of the hero

	speedc++;
	
	if(speedc > speed)
	{
		speedc = 0;
		// first check for keys then joystick

		
		if(mxhwnd.KeyCheck(DIK_LEFT))
		{
			moveleft();
		}
		
		if(mxhwnd.KeyCheck(DIK_RIGHT))
		{
			moveright();
		}
		
		if(mxhwnd.KeyCheck(DIK_A))
		{
			jump();
		}

		if(mxhwnd.KeyCheck(DIK_S))
		{
			fire();
		}
		
		/*if(player.joystick == true)
		{
			MasterJoyStick* stick = getstick();
			if(stick->JoyLeft())
			{
				moveleft();
			}
			if(stick->JoyRight())
			{
				moveright();
			}
			int b;
			b = stick->JoyButtonDown();
			switch(b)
			{
			case 0:
				jump();
				break;
			case 1:
				fire();
				break;
			}
		}*/
	}
	
	
}


void Hero::setpos(bool hdirx,int hero_posx)
{
	hdir = hdirx;
	hero_pos = hero_posx;
}


void Hero::fire()
{
	// FIRE FIRE FIRE

	// FIRE & FIRE & FIRE & FIRE++

	if(ifire == false && ifall == false && ijump == false)
	{
		ifire = true;
		firepos = 0;
	}
}

void Hero::procfire()
{
	switch(firepos)
	{
	case 0:
		cur_hero = 5;
		break;
	case 1:
		cur_hero = 6;
		break;
	case 2:
		cur_hero = 7;
		break;
	case 3:
		cur_hero = 8;
		break;
	case 4:
		cur_hero = 9; 
		break;
	case 5:// release bullet

		int bpos;
		bpos = hero_pos;
		if(hdir == true)
		{
			bpos += 24 + 24 + 2;
		}
		else
		{
			bpos -= 24 - 24 - 2;
		}
		hparticle.releaseparticle(bpos,hdir, BULLET);
		soundhandle.Play(FIRE);
		break;
	case 6:
		cur_hero = 8;
		break;
	case 7:
		cur_hero = 7;
		break;
	case 8:
		cur_hero = 6;
		break;
	case 9:
		cur_hero = 5;
		break;
	case 10:
		cur_hero = 0;
		break;
	}

	firepos++;

	if(firepos > 10)
	{
		cur_hero = 0;
		firepos = 0;
		ifire = false;
	}

}

void Hero::jump()
{
	if(ijump == false && ifall == false)
	{
		
		jcount = 0;
		ijump = true;
		cur_hero = 4;
		
	}
	
}


void Hero::movedown()
{
	
	
}

void Hero::moveup()
{
	
	
}

void Hero::moveleft()
{ 
	if(hero_pos - 24 > 0)
	{
		
		bool check1 = level.blocks[hero_pos-24].solid;
		bool check2 = level.blocks[hero_pos-23].solid;
		bool check3 = level.blocks[hero_pos-22].solid;
		bool check4 = level.blocks[hero_pos-21].solid;
		
		if(check1 == false && check2 == false && check3 == false && check4 == false)
		{
			
			hero_pos -= 24;
			cur_hero = getnextwalk();
			hdir = false;
			
		} else
		{
			goto returnx;
		}
		
	}
	else
	{
returnx:
	hdir = false;
	cur_hero = 0;
	}
}

void Hero::moveright()
{
	if(hero_pos + 24 < LEVEL_SIZE - 24)
	{
		
		bool check1;
		check1 = level.blocks[hero_pos + 27].solid;
		bool check2;
		check2 = level.blocks[hero_pos + 27 + 24].solid;
		bool check3;
		check3 = level.blocks[hero_pos + 27 + 23].solid;
		bool check4;
		check4 = level.blocks[hero_pos + 27 + 22].solid;
		
		if(check1 == false && check2 == false && check3 == false && check4 == false)
		{
			
			hero_pos += 24;
			cur_hero = getnextwalk();
			hdir = true;
			
		}
		else
		{
			goto returnx;
		}
		
	}
	else
	{
returnx:
	
	hdir = true;
	cur_hero = 0;
	}
}

// get the next walk image

int Hero::getnextwalk()
{
	if( ijump == false && ifall == false)
	{
		
		
		switch(cur_hero)
		{
		case 0:
			return 1;
			break;
		case 1:
			return 2;
			break;
		case 2:
			return 3;
			break;
		case 3:
			return 0;
			break;
			
		}
		
	}
	else
	{
		return 4;
	}
	return 0;
}

// keypress and key release


void Hero::keypress(unsigned int wParam)
{
	
}

void Hero::keyrelease(unsigned int wParam)
{
	if(ijump == false)
	{
		
		cur_hero = 0;
		
	}
}

void Hero::die()
{
	player.lives--;
	if(player.lives < 0 )
	{
		// game over

		thegameover(false);

	}
	else
	{
		cur_hero = 0;
		hdir = true;
		hero_pos = start_pos;
	}
}

/*************************************************************************** lostsidedead.com */