예제 #1
0
void WallProjectile::Tick(World & world){
	Uint8 life = 20;
	if(state_i == 1){
		EmitSound(world, world.resources.soundbank["!laserel.wav"], 64);
	}
	if(state_i < 7){
		res_index = state_i;
	}
	if(state_i >= 7){
		if(state_i > 12 + life){
			world.MarkDestroyObject(id);
			res_index = 12;
			return;
		}
		if(state_i >= 12 + life - 5){
			res_index = state_i - life;
		}else{
			res_index = 7;
		}
	}
	if(state_i >= 7){
		Object * object = 0;
		Platform * platform = 0;
		if(TestCollision(*this, world, &platform, &object)){
			Overlay * overlay = (Overlay *)world.CreateObject(ObjectTypes::OVERLAY);
			if(overlay){
				overlay->res_bank = 222;
				overlay->x = x;
				overlay->y = y;
				if(platform){
					if(rand() % 2 == 0){
						overlay->EmitSound(world, world.resources.soundbank["strike03.wav"], 96);
					}else{
						overlay->EmitSound(world, world.resources.soundbank["strike04.wav"], 96);
					}
				}
			}
			float xn = 0, yn = 0;
			if(platform){
				platform->GetNormal(x, y, &xn, &yn);
			}
			for(int i = 0; i < 8; i++){
				Shrapnel * shrapnel = (Shrapnel *)world.CreateObject(ObjectTypes::SHRAPNEL);
				if(shrapnel){
					shrapnel->x = x;
					shrapnel->y = y;
					shrapnel->xv = (rand() % 9) - 4;
					shrapnel->yv = (rand() % 9) - 8;
					shrapnel->xv = (xn * abs(shrapnel->xv)) + (rand() % 9) - 4;
					shrapnel->yv = (yn * abs(shrapnel->yv)) + (rand() % 9) - 8;
				}
			}
			world.MarkDestroyObject(id);
		}
	}
	state_i++;
}
예제 #2
0
bool Civilian::CheckTractVictim(World & world){
	if(!tractteamid){
		return false;
	}
	std::vector<Uint8> types;
	types.push_back(ObjectTypes::PLAYER);
	int x1, y1, x2, y2;
	GetAABB(world.resources, &x1, &y1, &x2, &y2);
	std::vector<Object *> objects = world.TestAABB(x1, y1, x2, y2, types);
	for(std::vector<Object *>::iterator it = objects.begin(); it != objects.end(); it++){
		Player * player = static_cast<Player *>(*it);
		if(player->teamid != tractteamid){
			draw = false;
			for(int i = 0; i < 6; i++){
				BodyPart * bodypart = (BodyPart *)world.CreateObject(ObjectTypes::BODYPART);
				if(bodypart){
					bodypart->suitcolor = suitcolor;
					bodypart->x = x;
					bodypart->y = y - 50;
					bodypart->type = i;
					if(i == 0){
						bodypart->xv = 0;
						bodypart->yv = -20;
					}
				}
			}
			state = DYINGEXPLODE;
			EmitSound(world, world.resources.soundbank["seekexp1.wav"], 128);
			Object tractprojectile(ObjectTypes::PLASMAPROJECTILE);
			tractprojectile.healthdamage = 80;
			tractprojectile.shielddamage = 80;
			tractprojectile.ownerid = id;
			player->HandleHit(world, 50, 50, tractprojectile);
			Sint8 xvs[] = {-14, 14, -10, 10, -10, 10};
			Sint8 yvs[] = {-25, -25, -10, -10, -5, -5};
			for(int i = 0; i < 6; i++){
				PlasmaProjectile * plasmaprojectile = (PlasmaProjectile *)world.CreateObject(ObjectTypes::PLASMAPROJECTILE);
				if(plasmaprojectile){
					plasmaprojectile->large = false;
					plasmaprojectile->x = x;
					plasmaprojectile->y = y - 40;
					plasmaprojectile->ownerid = id;
					plasmaprojectile->xv = xvs[i];
					plasmaprojectile->yv = yvs[i];
				}
			}
			return true;
		}
	}
	return false;
}
예제 #3
0
void Civilian::HandleHit(World & world, Uint8 x, Uint8 y, Object & projectile){
	Hittable::HandleHit(*this, world, x, y, projectile);
	if(projectile.healthdamage == 0){
		return;
	}
	if(state == DYINGFORWARD || state == DYINGBACKWARD || state == DEAD || state == DYINGEXPLODE){
		return;
	}
	float xpcnt = -((x - 50) / 50.0) * (mirrored ? -1 : 1);
	if(x < 50){
		state = DYINGFORWARD;
	}else{
		state = DYINGBACKWARD;
	}
	if((xpcnt < 0 && xv < 0) || (xpcnt > 0 && xv > 0)){
		xv = abs(xv) * xpcnt;
	}else{
		xv = speed * xpcnt;
	}
	switch(projectile.type){
		case ObjectTypes::BLASTERPROJECTILE:
		case ObjectTypes::LASERPROJECTILE:{
			if(rand() % 2 == 0){
				EmitSound(world, world.resources.soundbank["strike03.wav"], 96);
			}else{
				EmitSound(world, world.resources.soundbank["strike04.wav"], 96);
			}
		}break;
		case ObjectTypes::ROCKETPROJECTILE:{
			state = DYINGEXPLODE;
			draw = false;
			for(int i = 0; i < 6; i++){
				BodyPart * bodypart = (BodyPart *)world.CreateObject(ObjectTypes::BODYPART);
				if(bodypart){
					bodypart->suitcolor = suitcolor;
					bodypart->x = Civilian::x;
					bodypart->y = Civilian::y - 50;
					bodypart->type = i;
					bodypart->xv += (abs(xv) * 2) * xpcnt;
					if(i == 0){
						bodypart->xv = 0;
						bodypart->yv = -20;
					}
				}
			}
		}break;
	}
	Object * owner = world.GetObjectFromId(projectile.ownerid);
	if(owner && owner->type == ObjectTypes::PLAYER){
		Player * player = static_cast<Player *>(owner);
		Peer * peer = player->GetPeer(world);
		if(peer){
			peer->stats.civilianskilled++;
		}
	}
	state_i = 0;
}
예제 #4
0
void FlamerProjectile::Tick(World & world){
	for(int i = 0; i < plumecount; i++){
		if(!plumeids[i]){
			Plume * plume = (Plume *)world.CreateObject(ObjectTypes::PLUME);
			if(plume){
				plume->type = 4;
				plume->xv = (rand() % 17) - 8 + (xv * 8);
				plume->yv = (rand() % 17) - 8 + (yv * 8);
				plume->SetPosition(x + (xv * (i * 1)), y + (yv * (i * 1)));
				plumeids[i] = plume->id;
				plume->state_i = i;
				
			}
		}
	}
	Object * object = 0;
	Platform * platform = 0;
	if(TestCollision(*this, world, &platform, &object)){
		float xn = 0, yn = 0;
		if(platform){
			platform->GetNormal(x, y, &xn, &yn);
			for(int i = 0; i < plumecount; i++){
				Plume * plume = (Plume *)world.GetObjectFromId(plumeids[i]);
				if(plume){
					plume->xv /= 3;
					plume->yv /= 3;
					//world->MarkDestroyObject(plumeids[i]);
				}
			}
		}
		//world->MarkDestroyObject(id);
	}
	res_index = state_i;
	if(state_i >= 14){
		world.MarkDestroyObject(id);
	}
	state_i++;
}
예제 #5
0
void RocketProjectile::Tick(World & world){
	if(yv < 0 && xv == 0){ // up
		res_index = 4;
	}
	if(yv < 0 && xv > 0){ // up right
		res_index = 3;
		mirrored = false;
	}
	if(yv == 0 && xv > 0){ // right
		res_index = 0;
		mirrored = false;
	}
	if(yv > 0 && xv > 0){ // down right
		res_index = 1;
		mirrored = false;
	}
	if(yv > 0 && xv == 0){ // down
		res_index = 2;
	}
	if(yv > 0 && xv < 0){ // down left
		res_index = 1;
		mirrored = true;
	}
	if(yv == 0 && xv < 0){ // left
		res_index = 0;
		mirrored = true;
	}
	if(yv < 0 && xv < 0){ // up left
		res_index = 3;
		mirrored = true;
	}
	if(state_i == 100){
		oldxv = xv;
		oldyv = yv;
		xv = ceil(float(xv) * 0.3);
		yv = ceil(float(yv) * 0.3);
		soundchannel = EmitSound(world, world.resources.soundbank["rocket4.wav"], 128);
		state_i = 11;
		res_bank = 87;
	}
	if(state_i == 0){
		oldxv = xv;
		oldyv = yv;
		xv = ceil(float(xv) * 0.2);
		yv = ceil(float(yv) * 0.2);
		soundchannel = EmitSound(world, world.resources.soundbank["rocket9.wav"], 128);
	}
	if(state_i == 3){
		res_bank = 87;
	}
	if(state_i == 11){
		if(xv > 0){
			xv++;
		}else{
			xv--;
		}
		if(yv > 0){
			yv++;
		}else{
			yv--;
		}
		if(abs(xv) > abs(oldxv)){
			xv = oldxv;
		}
		if(abs(yv) > abs(oldyv)){
			yv = oldyv;
		}
		Platform * platform = 0;
		Object * object = 0;
		Sint16 oldx = x;
		Sint16 oldy = y;
		if(TestCollision(*this, world, &platform, &object)){
			float xn = 0, yn = 0;
			if(platform){
				platform->GetNormal(x, y, &xn, &yn);
			}
			int numplumes = 6;
			float anglen = (rand() % 100) / float(100);
			for(int i = 0; i < numplumes; i++){
				Plume * plume = (Plume *)world.CreateObject(ObjectTypes::PLUME);
				if(plume){
					plume->type = 4;
					/*plume->xv = (rand() % 17) - 8;
					plume->yv = (rand() % 17) - 8;
					plume->xv = (xn * abs(plume->xv)) + (rand() % 33) - 16;
					plume->yv = (yn * abs(plume->yv)) + (rand() % 33) - 16;*/
					float angle = (i / float(numplumes)) * (2 * 3.14);
					angle += anglen;
					plume->xv = (sin(angle)) * 15;
					plume->yv = (cos(angle)) * 15;
					if(xn || yn){
						plume->xv = (xn * abs(plume->xv)) + (rand() % 17) - 8;
						plume->yv = (yn * abs(plume->yv)) + (rand() % 17) - 8;
					}
					plume->SetPosition(x, y);
					
					Plume * plume2 = (Plume *)world.CreateObject(ObjectTypes::PLUME);
					if(plume2){
						plume2->type = 4;
						plume2->xv = plume->xv + (rand() % 7) - 3;
						plume2->yv = plume->yv + (rand() % 7) - 3;
						plume2->SetPosition(x, y);
					}
				}
			}
			std::vector<Uint8> types;
			types.push_back(ObjectTypes::PLAYER);
			types.push_back(ObjectTypes::GUARD);
			types.push_back(ObjectTypes::ROBOT);
			types.push_back(ObjectTypes::CIVILIAN);
			types.push_back(ObjectTypes::FIXEDCANNON);
			types.push_back(ObjectTypes::WALLDEFENSE);
			types.push_back(ObjectTypes::TECHSTATION);
			Object * owner = world.GetObjectFromId(ownerid);
			Uint16 teamid = 0;
			bool issecurity = false;
			if(owner){
				switch(owner->type){
					case ObjectTypes::PLAYER:{
						Player * player = static_cast<Player *>(owner);
						Team * team = player->GetTeam(world);
						if(team){
							teamid = team->id;
						}
					}break;
					case ObjectTypes::ROBOT:{
						Robot * robot = static_cast<Robot *>(owner);
						teamid = robot->virusplanter;
						issecurity = world.IsSecurity(*robot);
					}break;
					case ObjectTypes::GUARD:{
						issecurity = true;
					}break;
				}
			}
			std::vector<Object *> objects = world.TestAABB(x - 30, y - 30, x + 30, y + 30, types, ownerid, teamid);
			for(std::vector<Object *>::iterator it = objects.begin(); it != objects.end(); it++){
				if(!object || (object && (*it)->id != object->id)){
					if(!issecurity || (issecurity && !world.IsSecurity(*(*it)))){ // prevents robots/rocket guards from doing slash damage to other security
						Object damageprojectile(ObjectTypes::ROCKETPROJECTILE);
						damageprojectile.healthdamage = healthdamage;
						damageprojectile.shielddamage = shielddamage;
						damageprojectile.ownerid = ownerid;
						(*it)->HandleHit(world, 50, 50, damageprojectile);
					}
				}
			}
			xv = 0;
			yv = 0;
			res_bank = 0xFF;
			if(soundchannel){
				Audio::GetInstance().Stop(soundchannel, 100);
			}
			EmitSound(world, world.resources.soundbank["seekexp1.wav"], 128);
		}
		for(int i = 0; i < 2; i++){
			int xv2 = (signed(oldx) - x) * (1.25 * i);
			int yv2 = (signed(oldy) - y) * (1.25 * i);
			Plume * plume = (Plume *)world.CreateObject(ObjectTypes::PLUME);
			if(plume){
				plume->type = 3;
				plume->xv = rand() % 7 - 3;
				plume->yv = rand() % 7 - 3;
				plume->SetPosition(x + xv2, y + yv2);
			}
		}
	}
	if(state_i < 11 || (state_i >= 11 && xv == 0 && yv == 0)){
		state_i++;
	}
	if(state_i >= 25){
		world.MarkDestroyObject(id);
	}else{
		Player * localplayer = world.GetPeerPlayer(world.localpeerid);
		if(localplayer && ownerid == localplayer->id){
			//if(!world.systemcameraactive[0]){
				world.SetSystemCamera(0, id, 0, 20);
			//}
		}
	}
}
예제 #6
0
void Detonator::Tick(World & world){
	// 182:0-3 det/camera
	if(state_i == 0){
		EmitSound(world, world.resources.soundbank["shield2.wav"], 96);
	}
	res_index = (state_i / 4) % 4;
	if(state_i == 4 * 4){
		state_i = 0;
	}
	if(state_i > 4 * 4){
		if(state_i >= (4 * 4) + 6){
			if(state_i == (4 * 4) + 6){
				// explode
				if(iscamera){
					draw = false;
					EmitSound(world, world.resources.soundbank["q_expl02.wav"], 64);
					for(int i = 0; i < 8; i++){
						Plume * plume = (Plume *)world.CreateObject(ObjectTypes::PLUME);
						if(plume){
							plume->type = 5;
							plume->SetPosition(x + (rand() % 33) - 16, y + (rand() % 33) - 16);
						}
					}
				}else{
					EmitSound(world, world.resources.soundbank["seekexp1.wav"], 128);
					Sint8 xvs[] = {-14, 14, -10, 10, -10, 10};
					Sint8 yvs[] = {-25, -25, 0, 0, 5, 5};
					Sint8 ys[] = {0, 0, 0, 0, 0, 0, 0, 0};
					for(int i = 0; i < 6; i++){
						PlasmaProjectile * plasmaprojectile = (PlasmaProjectile *)world.CreateObject(ObjectTypes::PLASMAPROJECTILE);
						if(plasmaprojectile){
							plasmaprojectile->large = false;
							plasmaprojectile->x = x;
							plasmaprojectile->y = y + ys[i];
							plasmaprojectile->ownerid = ownerid;
							plasmaprojectile->xv = xvs[i];
							plasmaprojectile->yv = yvs[i];
						}
					}
				}
			}
			if(state_i == (4 * 4) + 8){
				if(!iscamera){
					// explode
					Sint8 xvs[] = {-14, 0, 14, -5, 0, 5};
					Sint8 yvs[] = {-5, -10, -5, 5, 5, 5};
					Sint8 ys[] = {0, 0, 0, 0, 0, 0};
					for(int i = 0; i < 6; i++){
						PlasmaProjectile * plasmaprojectile = (PlasmaProjectile *)world.CreateObject(ObjectTypes::PLASMAPROJECTILE);
						if(plasmaprojectile){
							plasmaprojectile->large = true;
							plasmaprojectile->x = x;
							plasmaprojectile->y = y + ys[i];
							plasmaprojectile->ownerid = ownerid;
							plasmaprojectile->xv = xvs[i];
							plasmaprojectile->yv = yvs[i];
						}
					}
				}
			}
			draw = false;
			if(state_i >= (4 * 4) + 50){
				world.MarkDestroyObject(id);
			}
		}else{
			int velocity = (((4 * 4) - (state_i)) * 2) + 20;
			if(velocity < 0){
				velocity = 0;
			}
			y -= velocity;
		}
	}
	state_i++;
}