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); } } }
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); }
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; }
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; }
bool driver_system::release_car_ownership(const entity_handle driver) { return change_car_ownership(driver, driver.get_cosmos()[entity_id()], true); }
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); }