Example #1
0
void drop_from_all_slots(const entity_handle c, logic_step& step) {
	const auto& container = c.get<components::container>();

	for (const auto& s : container.slots) {
		const auto items_uninvalidated = s.second.items_inside;

		for (const auto item : items_uninvalidated) {
			perform_transfer({ c.get_cosmos()[item], c.get_cosmos()[inventory_slot_id()] }, step);
		}
	}
}
Example #2
0
	bool gui_element::apply_hotbar_selection_setup(
		logic_step& step,
		const hotbar_selection_setup new_setup,
		const entity_handle element_entity
	) {
		const auto& element = element_entity.get<components::gui_element>();

		entity_id first_item;
		entity_id second_item;

		if (new_setup.primary_index != -1) {
			first_item = element.hotbar_buttons[static_cast<size_t>(new_setup.primary_index)].get_assigned_entity(element_entity);
		}

		if (new_setup.secondary_index != -1) {
			second_item = element.hotbar_buttons[static_cast<size_t>(new_setup.secondary_index)].get_assigned_entity(element_entity);
		}

		return element_entity.wield_in_hands(step, first_item, second_item);
	}
Example #3
0
melee_state melee_system::primary_action(const logic_step step, const double dt_d, const entity_handle target, components::melee& melee_component, components::damage& damage)
{
	const float dt = static_cast<float>(dt_d);

	damage.damage_upon_collision = true;

	if (melee_component.swing_current_time > melee_component.swings[int(melee_component.action_stage)].duration_ms) {
		switch (melee_component.action_stage)
		{
		case components::melee::stage::FIRST_STAGE:
			melee_component.action_stage = components::melee::stage::SECOND_STAGE;
			melee_component.swing_current_time = 0;
			break;
		case components::melee::stage::SECOND_STAGE:
			melee_component.action_stage = components::melee::stage::WINDOW_STAGE;
			melee_component.swing_current_time = 0;
			return melee_state::PRIMARY;
			break;
		case components::melee::stage::THIRD_STAGE:
			melee_component.action_stage = components::melee::stage::FOURTH_STAGE;
			melee_component.swing_current_time = 0;
			break;
		case components::melee::stage::FOURTH_STAGE:
			melee_component.action_stage = components::melee::stage::FIRST_STAGE;
			melee_component.swing_current_time = 0;
			return melee_state::ONCOOLDOWN;
			break;
		case components::melee::stage::WINDOW_STAGE:
			damage.damage_upon_collision = false;
			melee_component.window_current_time += dt;
			if (melee_component.window_current_time >= melee_component.window_time) {
				melee_component.action_stage = components::melee::stage::FIRST_STAGE;
				melee_component.window_current_time = 0;
				return melee_state::ONCOOLDOWN;
			}
			else if (melee_component.primary_move_flag && melee_component.window_current_time >= melee_component.swings[0].cooldown_ms) {
				melee_component.action_stage = components::melee::stage::THIRD_STAGE;
				return melee_state::PRIMARY;
			}
			else if (melee_component.secondary_move_flag && melee_component.window_current_time >= melee_component.swings[0].cooldown_ms) {
				melee_component.action_stage = components::melee::stage::FIRST_STAGE;
				return melee_state::SECONDARY;
			}
			else if (melee_component.tertiary_move_flag && melee_component.window_current_time >= melee_component.swings[0].cooldown_ms) {
				melee_component.action_stage = components::melee::stage::FIRST_STAGE;
				return melee_state::TERTIARY;
			}
			else {
				return melee_state::PRIMARY;
			}
			break;
		default:
			melee_component.swing_current_time = 0;
			melee_component.action_stage = components::melee::stage::FIRST_STAGE;
			return melee_state::ONCOOLDOWN;
		}
	}

	melee_component.swing_current_time += dt * melee_component.swings[int(melee_component.action_stage)].acceleration;

	messages::melee_swing_response response;

	auto& m = target.get<components::fixtures>();

	//auto new_definition = target.get<components::physics_definition>();

	//melee_animation animation;

	//animation.offset_pattern = melee_component.offset_positions[int(melee_component.action_stage)];
	//m.set_offset(colliders_offset_type::SPECIAL_MOVE_DISPLACEMENT, animation.calculate_intermediate_transform(melee_component.swing_current_time / melee_component.swings[int(melee_component.action_stage)].duration_ms));
	const auto player = target.get_owning_transfer_capability();
	damage.custom_impact_velocity = target.logic_transform().pos - player.logic_transform().pos;

	response.subject = target;
	response.origin_transform = target.logic_transform();
	step.transient.messages.post(response);

	//pos_response.new_definition = new_definition;
	//step.transient.messages.post(pos_response);

	return melee_state::PRIMARY;
}
Example #4
0
bool driver_system::change_car_ownership(const entity_handle driver_entity, const entity_handle car_entity, const bool lost_ownership) {
	auto& driver = driver_entity.get<components::driver>();
	auto& cosmos = driver_entity.get_cosmos();
	const auto& physics = cosmos.systems_temporary.get<physics_system>();

	auto* const maybe_rotation_copying = driver_entity.find<components::rotation_copying>();
	const bool has_physics = driver_entity.has<components::physics>();
	auto* const maybe_movement = driver_entity.find<components::movement>();
	auto& force_joint = driver_entity.get<components::force_joint>();

	if (!lost_ownership) {
		auto& car = car_entity.get<components::car>();

		if (cosmos[car.current_driver].alive())
			return false;

		driver.owned_vehicle = car_entity;
		car.current_driver = driver_entity;
		force_joint.chased_entity = car.left_wheel_trigger;
		driver_entity.get<components::processing>().enable_in(processing_subjects::WITH_FORCE_JOINT);

		if (maybe_movement) {
			maybe_movement->reset_movement_flags();
			maybe_movement->enable_braking_damping = false;
			maybe_movement->enable_animation = false;
		}

		if (maybe_rotation_copying && has_physics) {
			maybe_rotation_copying->stash();
			maybe_rotation_copying->target = car.left_wheel_trigger;
			maybe_rotation_copying->look_mode = components::rotation_copying::look_type::ROTATION;
		}

		if (has_physics) {
			auto& physics = driver_entity.get<components::physics>();
			physics.set_transform(car.left_wheel_trigger);
			physics.set_velocity(vec2(0, 0));
			resolve_density_of_associated_fixtures(driver_entity);
		}
	}
	else {
		auto& car = cosmos[driver.owned_vehicle].get<components::car>();

		driver.owned_vehicle.unset();
		car.current_driver.unset();
		driver_entity.get<components::processing>().disable_in(processing_subjects::WITH_FORCE_JOINT);

		if (maybe_movement) {
			maybe_movement->reset_movement_flags();
			maybe_movement->enable_braking_damping = true;
			maybe_movement->enable_animation = true;

			maybe_movement->moving_left = car.turning_left;
			maybe_movement->moving_right = car.turning_right;
			maybe_movement->moving_forward = car.accelerating;
			maybe_movement->moving_backward = car.decelerating;
		}
		
		car.reset_movement_flags();

		if (maybe_rotation_copying && has_physics) {
			maybe_rotation_copying->unstash();
		}

		if (has_physics) {
			resolve_density_of_associated_fixtures(driver_entity);
		}
	}

	// networking the message, since it was successful

	return true;
}
Example #5
0
bool driver_system::release_car_ownership(const entity_handle driver) {
	return change_car_ownership(driver, driver.get_cosmos()[entity_id()], true);
}
Example #6
0
	void wsad_character(const entity_handle e, const entity_handle crosshair_entity, const assets::animation_response_id torso_set) {
		auto& sprite = e += components::sprite();
		auto& render = e += components::render();
		auto& animation = e += components::animation();
		auto& animation_response = e += components::animation_response();
		auto& movement = e += components::movement();
		auto& rotation_copying = e += components::rotation_copying();
		auto& detector = e += components::trigger_query_detector();
		auto& driver = e += components::driver();
		auto& force_joint = e += components::force_joint();
		auto& sentience = e += components::sentience();
		e += components::position_copying(); // used when it is an astral body
		auto& particle_response = e += components::particle_effect_response { assets::particle_effect_response_id::CHARACTER_RESPONSE };
		
		{
			auto& sound_response = e += components::sound_response();
			sound_response.response = assets::sound_response_id::CHARACTER_RESPONSE;
		}
		
		auto& attitude = e += components::attitude();
		auto& processing = e += components::processing();
		e.set_flag(entity_flag::IS_PAST_CONTAGIOUS);

		attitude.parties = party_category::METROPOLIS_CITIZEN;
		attitude.hostile_parties = party_category::RESISTANCE_CITIZEN;

		particle_response.modifier.colorize = augs::red;
		particle_response.modifier.scale_lifetimes = 1.5f;

		sentience.aimpunch.offsets = {
				{ vec2().set_from_degrees(0) },
				{ vec2().set_from_degrees(6) },
				{ vec2().set_from_degrees(-6) },
				{ vec2().set_from_degrees(7) },
				{ vec2().set_from_degrees(-7) },
				{ vec2().set_from_degrees(-9) },
				{ vec2().set_from_degrees(11) },
				{ vec2().set_from_degrees(-12) },
				{ vec2().set_from_degrees(-4) },
				{ vec2().set_from_degrees(11) },
				{ vec2().set_from_degrees(23) },
				{ vec2().set_from_degrees(53) },
				{ vec2().set_from_degrees(10) },
				{ vec2().set_from_degrees(-30) },
				{ vec2().set_from_degrees(-60) },
				{ vec2().set_from_degrees(-70) },
				{ vec2().set_from_degrees(-80) },
				{ vec2().set_from_degrees(-20) },
				{ vec2().set_from_degrees(50) },
				{ vec2().set_from_degrees(80) },
				{ vec2().set_from_degrees(120) },
				{ vec2().set_from_degrees(60) },
				{ vec2().set_from_degrees(20) },
				{ vec2().set_from_degrees(40) },
				{ vec2().set_from_degrees(20) },
				{ vec2().set_from_degrees(-40) },
		};

		sentience.aimpunch.offsets = {
			{ vec2().set_from_degrees(1) },
			{ vec2().set_from_degrees(1) },
			{ vec2().set_from_degrees(2) },
			{ vec2().set_from_degrees(2) },
			{ vec2().set_from_degrees(3) },
			{ vec2().set_from_degrees(-1) },
			{ vec2().set_from_degrees(1) },
			{ vec2().set_from_degrees(-1) },
			{ vec2().set_from_degrees(-2) },
			{ vec2().set_from_degrees(-1) },
			{ vec2().set_from_degrees(-1) },
			{ vec2().set_from_degrees(-2) },
			{ vec2().set_from_degrees(-3) },
			{ vec2().set_from_degrees(-4) },
			{ vec2().set_from_degrees(-5) },
			{ vec2().set_from_degrees(-3) },
			{ vec2().set_from_degrees(-2) },
			{ vec2().set_from_degrees(-2) },
			{ vec2().set_from_degrees(-1) },
			{ vec2().set_from_degrees(1) },
			{ vec2().set_from_degrees(2) },
			{ vec2().set_from_degrees(3) },
			{ vec2().set_from_degrees(2) },
			{ vec2().set_from_degrees(3) },
			{ vec2().set_from_degrees(4) },
			{ vec2().set_from_degrees(5) },
		};

		sentience.aimpunch.repeat_last_n_offsets = 20;
		sentience.aimpunch.scale = 150.0;
		sentience.aimpunch.single_cooldown_duration_ms= 200.0;

		sentience.health.value = 100.0;
		sentience.health.maximum = 100.0;

		processing.disable_in(processing_subjects::WITH_FORCE_JOINT);

		detector.spam_trigger_requests_when_detection_intented = true;

		force_joint.force_towards_chased_entity = 92000.f;
		force_joint.distance_when_force_easing_starts = 10.f;
		force_joint.power_of_force_easing_multiplier = 2.f;

		driver.density_multiplier_while_driving = 0.02f;

		movement.standard_linear_damping = 20.f;
		// driver.linear_damping_while_driving = 4.f;

		e.map_sub_entity(sub_entity_name::CHARACTER_CROSSHAIR, crosshair_entity);
		
		animation_response.response = torso_set;

		sprite.set(assets::texture_id::TEST_PLAYER, rgba(255, 255, 255, 255));

		render.layer = render_layer::SMALL_DYNAMIC_BODY;

		rotation_copying.target = crosshair_entity;
		rotation_copying.look_mode = components::rotation_copying::look_type::POSITION;
		rotation_copying.colinearize_item_in_hand = true;

		wsad_character_setup_movement(e);
	}