77
88// temp for testing
99#include < spaced/game/weapons/gun_beam.hpp>
10- #include < spaced/game/weapons/gun_kinetic.hpp>
1110
1211namespace spaced {
1312using bave::im_text;
@@ -19,11 +18,7 @@ using bave::RoundedQuad;
1918using bave::Seconds;
2019using bave::Shader;
2120
22- Player::Player (Services const & services, std::unique_ptr<IController> controller) : m_services(&services), m_controller(std::move(controller)) {
23- setup_ship ();
24-
25- debug_switch_weapon ();
26- }
21+ Player::Player (Services const & services, std::unique_ptr<IController> controller) : m_services(&services), m_controller(std::move(controller)) { setup_ship (); }
2722
2823void Player::on_focus (bave::FocusChange const & /* focus_changed*/ ) { m_controller->untap (); }
2924
@@ -35,32 +30,17 @@ void Player::tick(std::span<NotNull<IDamageable*> const> targets, Seconds const
3530 auto const y_position = m_controller->tick (dt);
3631 set_y (y_position);
3732
38- auto const muzzle_position = get_muzzle_position ();
39- if (m_controller->is_firing () && m_debug.shots_remaining > 0 ) {
40- if (auto round = m_weapon->fire (muzzle_position)) {
41- m_weapon_rounds.push_back (std::move (round));
42- --m_debug.shots_remaining ;
43- }
44- }
45-
46- auto const round_state = IWeaponRound::State{.targets = targets, .muzzle_position = muzzle_position};
47- for (auto const & round : m_weapon_rounds) { round->tick (round_state, dt); }
48- std::erase_if (m_weapon_rounds, [](auto const & charge) { return charge->is_destroyed (); });
49-
50- m_weapon->tick (dt);
33+ auto const round_state = IWeaponRound::State{.targets = targets, .muzzle_position = get_muzzle_position ()};
34+ m_arsenal.tick (round_state, m_controller->is_firing (), dt);
5135
5236 m_exhaust.set_position (get_exhaust_position ());
53-
5437 m_exhaust.tick (dt);
55-
56- if (m_debug.shots_remaining <= 0 ) { debug_switch_weapon (); }
5738}
5839
5940void Player::draw (Shader& shader) const {
6041 m_exhaust.draw (shader);
6142 ship.draw (shader);
62-
63- for (auto const & round : m_weapon_rounds) { round->draw (shader); }
43+ m_arsenal.draw (shader);
6444}
6545
6646void Player::setup (WorldSpec::Player const & spec) {
@@ -83,15 +63,28 @@ void Player::set_controller(std::unique_ptr<IController> controller) {
8363 m_controller = std::move (controller);
8464}
8565
66+ void Player::setup_ship () {
67+ auto const & layout = m_services->get <ILayout>();
68+ ship.transform .position .x = layout.get_player_x ();
69+ auto rounded_quad = RoundedQuad{};
70+ rounded_quad.size = layout.get_player_size ();
71+ rounded_quad.corner_radius = 20 .0f ;
72+ ship.set_shape (rounded_quad);
73+ }
74+
8675void Player::do_inspect () {
8776 if constexpr (bave::imgui_v) {
8877 if (ImGui::TreeNodeEx (" Controller" , ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_DefaultOpen)) {
8978 m_controller->inspect ();
9079 ImGui::TreePop ();
9180 }
9281 if (ImGui::TreeNodeEx (" Weapon" , ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_DefaultOpen)) {
93- m_weapon->inspect ();
94- im_text (" shots remaining: {}" , m_debug.shots_remaining );
82+ if (ImGui::Button (" Switch to Beam" )) {
83+ auto beam = std::make_unique<GunBeam>(*m_services);
84+ beam->rounds = 2 ;
85+ m_arsenal.set_special (std::move (beam));
86+ }
87+ m_arsenal.get_weapon ().inspect ();
9588 ImGui::TreePop ();
9689 }
9790 if (ImGui::TreeNodeEx (" Status" , ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_DefaultOpen)) {
@@ -100,26 +93,4 @@ void Player::do_inspect() {
10093 }
10194 }
10295}
103-
104- void Player::setup_ship () {
105- auto const & layout = m_services->get <ILayout>();
106- ship.transform .position .x = layout.get_player_x ();
107- auto rounded_quad = RoundedQuad{};
108- rounded_quad.size = layout.get_player_size ();
109- rounded_quad.corner_radius = 20 .0f ;
110- ship.set_shape (rounded_quad);
111- }
112-
113- void Player::debug_switch_weapon () {
114- if (m_weapon && !m_weapon->is_idle ()) { return ; }
115-
116- if (dynamic_cast <GunKinetic const *>(m_weapon.get ()) != nullptr ) {
117- m_weapon = std::make_unique<GunBeam>(*m_services);
118- m_debug.shots_remaining = 2 ;
119- return ;
120- }
121-
122- m_weapon = std::make_unique<GunKinetic>(*m_services);
123- m_debug.shots_remaining = 10 ;
124- }
12596} // namespace spaced
0 commit comments