aboutsummaryrefslogtreecommitdiff
path: root/game/player
diff options
context:
space:
mode:
Diffstat (limited to 'game/player')
-rw-r--r--game/player/PlayerAudioScript.cpp62
-rw-r--r--game/player/PlayerAudioScript.h13
-rw-r--r--game/player/PlayerBulletPool.cpp11
-rw-r--r--game/player/PlayerBulletPool.h11
-rw-r--r--game/player/PlayerBulletScript.cpp41
-rw-r--r--game/player/PlayerBulletScript.h11
-rw-r--r--game/player/PlayerBulletSubScene.cpp52
-rw-r--r--game/player/PlayerBulletSubScene.h10
-rw-r--r--game/player/PlayerEndScript.cpp104
-rw-r--r--game/player/PlayerEndScript.h14
-rw-r--r--game/player/PlayerScript.cpp214
-rw-r--r--game/player/PlayerScript.h32
-rw-r--r--game/player/PlayerSubScene.cpp222
-rw-r--r--game/player/PlayerSubScene.h10
14 files changed, 807 insertions, 0 deletions
diff --git a/game/player/PlayerAudioScript.cpp b/game/player/PlayerAudioScript.cpp
new file mode 100644
index 0000000..6b5f630
--- /dev/null
+++ b/game/player/PlayerAudioScript.cpp
@@ -0,0 +1,62 @@
+#include "PlayerAudioScript.h"
+
+#include <crepe/api/Animator.h>
+#include <crepe/api/AudioSource.h>
+
+using namespace crepe;
+using namespace std;
+
+void PlayerAudioScript::fixed_update(crepe::duration_t dt) {
+ Animator & animator = this->get_components_by_name<Animator>("player").front();
+
+ if (animator.data.col == 0) {
+ if (animator.data.row != this->last_row) {
+ if (animator.data.row == 0) {
+ // right footstep
+ if (current_footstep == 0) {
+ AudioSource & audio
+ = this->get_components_by_name<AudioSource>("player_audio").at(0);
+ audio.play();
+ } else if (current_footstep == 1) {
+ AudioSource & audio
+ = this->get_components_by_name<AudioSource>("player_audio").at(2);
+ audio.play();
+ } else if (current_footstep == 2) {
+ AudioSource & audio
+ = this->get_components_by_name<AudioSource>("player_audio").at(4);
+ audio.play();
+ } else if (current_footstep == 3) {
+ AudioSource & audio
+ = this->get_components_by_name<AudioSource>("player_audio").at(6);
+ audio.play();
+ }
+ } else if (animator.data.row == 2) {
+ // left footstep
+ if (current_footstep == 0) {
+ AudioSource & audio
+ = this->get_components_by_name<AudioSource>("player_audio").at(1);
+ audio.play();
+ current_footstep = 1;
+ } else if (current_footstep == 1) {
+ AudioSource & audio
+ = this->get_components_by_name<AudioSource>("player_audio").at(3);
+ audio.play();
+ current_footstep = 2;
+ } else if (current_footstep == 2) {
+ AudioSource & audio
+ = this->get_components_by_name<AudioSource>("player_audio").at(5);
+ audio.play();
+ current_footstep = 3;
+ } else if (current_footstep == 3) {
+ AudioSource & audio
+ = this->get_components_by_name<AudioSource>("player_audio").at(7);
+ audio.play();
+ current_footstep = 0;
+ }
+ }
+ this->last_row = animator.data.row;
+ }
+ } else {
+ this->last_row = -1;
+ }
+}
diff --git a/game/player/PlayerAudioScript.h b/game/player/PlayerAudioScript.h
new file mode 100644
index 0000000..764cb20
--- /dev/null
+++ b/game/player/PlayerAudioScript.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include <crepe/api/Event.h>
+#include <crepe/api/Script.h>
+
+class PlayerAudioScript : public crepe::Script {
+public:
+ void fixed_update(crepe::duration_t dt);
+
+private:
+ int last_row = -1;
+ int current_footstep = 0;
+};
diff --git a/game/player/PlayerBulletPool.cpp b/game/player/PlayerBulletPool.cpp
new file mode 100644
index 0000000..5285ec8
--- /dev/null
+++ b/game/player/PlayerBulletPool.cpp
@@ -0,0 +1,11 @@
+#include "PlayerBulletPool.h"
+#include "PlayerBulletSubScene.h"
+using namespace std;
+
+void PlayerBulletPool::create_bullets(crepe::Scene & scn) {
+ PlayerBulletSubScene bullet;
+ int amount = 0;
+ while (amount < this->MAXIMUM_AMOUNT) {
+ amount = bullet.create(scn, amount);
+ }
+}
diff --git a/game/player/PlayerBulletPool.h b/game/player/PlayerBulletPool.h
new file mode 100644
index 0000000..9618d54
--- /dev/null
+++ b/game/player/PlayerBulletPool.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#include <crepe/api/Scene.h>
+
+class PlayerBulletPool {
+public:
+ void create_bullets(crepe::Scene & scn);
+
+private:
+ static constexpr int MAXIMUM_AMOUNT = 20;
+};
diff --git a/game/player/PlayerBulletScript.cpp b/game/player/PlayerBulletScript.cpp
new file mode 100644
index 0000000..a823375
--- /dev/null
+++ b/game/player/PlayerBulletScript.cpp
@@ -0,0 +1,41 @@
+
+#include <crepe/api/Camera.h>
+#include <crepe/api/Metadata.h>
+#include <crepe/api/Rigidbody.h>
+
+#include "PlayerBulletScript.h"
+
+using namespace crepe;
+using namespace std;
+void PlayerBulletScript::init() {
+ this->subscribe<CollisionEvent>([this](const CollisionEvent & e) -> bool {
+ return this->on_collide(e);
+ });
+}
+void PlayerBulletScript::fixed_update(crepe::duration_t dt) {
+ Transform & transform = this->get_component<Transform>();
+ Camera & camera = this->get_components_by_name<Camera>("camera").front();
+ Transform & cam_transform = this->get_components_by_name<Transform>("camera").front();
+ Rigidbody & bullet_body = this->get_component<Rigidbody>();
+ transform.rotation += bullet_body.data.angular_velocity * dt.count();
+ transform.position += bullet_body.data.linear_velocity * dt.count();
+ vec2 half_screen = camera.viewport_size / 2;
+ float despawn_location = cam_transform.position.x + half_screen.x + 50;
+ if (transform.position.x > despawn_location) {
+ this->despawn_bullet();
+ }
+}
+
+void PlayerBulletScript::despawn_bullet() {
+ Transform & transform = this->get_component<Transform>();
+ Rigidbody & bullet_body = this->get_component<Rigidbody>();
+ bullet_body.active = false;
+ BehaviorScript & bullet_script = this->get_component<BehaviorScript>();
+ bullet_script.active = false;
+ transform.position = {0, -850};
+}
+
+bool PlayerBulletScript::on_collide(const CollisionEvent & e) {
+ this->despawn_bullet();
+ return false;
+}
diff --git a/game/player/PlayerBulletScript.h b/game/player/PlayerBulletScript.h
new file mode 100644
index 0000000..0637790
--- /dev/null
+++ b/game/player/PlayerBulletScript.h
@@ -0,0 +1,11 @@
+#pragma once
+#include <crepe/api/BehaviorScript.h>
+#include <crepe/api/Script.h>
+
+class PlayerBulletScript : public crepe::Script {
+public:
+ void init() override;
+ void fixed_update(crepe::duration_t dt) override;
+ bool on_collide(const crepe::CollisionEvent & e);
+ void despawn_bullet();
+};
diff --git a/game/player/PlayerBulletSubScene.cpp b/game/player/PlayerBulletSubScene.cpp
new file mode 100644
index 0000000..82ce4a9
--- /dev/null
+++ b/game/player/PlayerBulletSubScene.cpp
@@ -0,0 +1,52 @@
+#include <string>
+
+#include "../Config.h"
+#include <crepe/api/AI.h>
+#include <crepe/api/Animator.h>
+#include <crepe/api/BehaviorScript.h>
+#include <crepe/api/BoxCollider.h>
+#include <crepe/api/CircleCollider.h>
+#include <crepe/api/GameObject.h>
+#include <crepe/api/Rigidbody.h>
+#include <crepe/api/Scene.h>
+#include <crepe/api/Sprite.h>
+
+#include "PlayerBulletScript.h"
+#include "PlayerBulletSubScene.h"
+#include "PlayerScript.h"
+using namespace crepe;
+using namespace std;
+int PlayerBulletSubScene::create(Scene & scn, int counter) {
+ string unique_name = "player_bullet_" + to_string(counter++);
+ GameObject player_bullet
+ = scn.new_object(unique_name.c_str(), "player_bullet", vec2 {0, -850}, 0, 1);
+
+ Rigidbody & player_bullet_body = player_bullet.add_component<Rigidbody>(Rigidbody::Data {
+ .gravity_scale = 0,
+ .body_type = Rigidbody::BodyType::KINEMATIC,
+ .linear_velocity = vec2 {450, 0},
+ .angular_velocity = 300,
+ .kinematic_collision = false,
+ .collision_layers = {COLL_LAY_ENEMY, COLL_LAY_ZAPPER},
+
+ .collision_layer = COLL_LAY_PLAYER_BULLET,
+
+ });
+ player_bullet_body.active = false;
+ BoxCollider & player_bullet_collider
+ = player_bullet.add_component<BoxCollider>(vec2(30, 30));
+
+ Asset player_bullet_asset {"asset/other_effects/crepe.png"};
+ Sprite & player_bullet_sprite = player_bullet.add_component<Sprite>(
+ player_bullet_asset,
+ Sprite::Data {
+ .flip = {true, false},
+ .sorting_in_layer = SORT_IN_LAY_OBSTACLES,
+ .order_in_layer = 1,
+ .size = vec2(30, 0),
+ }
+ );
+ player_bullet.add_component<BehaviorScript>().set_script<PlayerBulletScript>().active
+ = false;
+ return counter;
+}
diff --git a/game/player/PlayerBulletSubScene.h b/game/player/PlayerBulletSubScene.h
new file mode 100644
index 0000000..72eda62
--- /dev/null
+++ b/game/player/PlayerBulletSubScene.h
@@ -0,0 +1,10 @@
+#pragma once
+
+namespace crepe {
+class Scene;
+}
+
+class PlayerBulletSubScene {
+public:
+ int create(crepe::Scene & scn, int counter);
+};
diff --git a/game/player/PlayerEndScript.cpp b/game/player/PlayerEndScript.cpp
new file mode 100644
index 0000000..62fd350
--- /dev/null
+++ b/game/player/PlayerEndScript.cpp
@@ -0,0 +1,104 @@
+#include "PlayerEndScript.h"
+
+#include "../Config.h"
+#include "../Events.h"
+#include "manager/LoopTimerManager.h"
+
+#include <crepe/api/Animator.h>
+#include <crepe/api/BoxCollider.h>
+#include <crepe/api/CircleCollider.h>
+#include <crepe/api/Rigidbody.h>
+#include <crepe/types.h>
+
+using namespace crepe;
+using namespace std;
+
+void PlayerEndScript::init() {
+ Rigidbody & rb_player = this->get_components_by_name<Rigidbody>("player").front();
+ rb_player.data.elasticity_coefficient = 0.7;
+
+ subscribe<CollisionEvent>([this](const CollisionEvent & ev) -> bool {
+ return this->on_collision(ev);
+ });
+}
+
+bool PlayerEndScript::on_collision(const crepe::CollisionEvent & ev) {
+ if (ev.info.other.metadata.name == "floor") {
+ Transform & transform_player
+ = this->get_components_by_name<Transform>("player").front();
+ RefVector<Animator> anim_player = this->get_components_by_name<Animator>("player");
+ Rigidbody & rb_player = this->get_components_by_name<Rigidbody>("player").front();
+ Rigidbody & rb_camera = this->get_components_by_name<Rigidbody>("camera").front();
+
+ float dt = this->get_loop_timer().get_fixed_delta_time().count();
+
+ if (jump == 0) {
+ int random_number = rand() % 4;
+ for (Animator & anim : anim_player) {
+ anim.active = false;
+ anim.set_anim(6);
+ for (int i = 0; i < random_number; i++) {
+ anim.next_anim();
+ }
+ }
+ } else if (jump == 1) {
+ for (Animator & anim : anim_player) {
+ anim.next_anim();
+ }
+ }
+
+ if (jump == 0) {
+ rb_player.data.angular_velocity = 16000 * dt;
+ rb_player.data.angular_velocity_coefficient = 0.7;
+ jump++;
+ } else if (jump == 1) {
+ jump++;
+ } else if (jump == 2) {
+ RefVector<Rigidbody> rb_back_forest
+ = this->get_components_by_tag<Rigidbody>("forest_background");
+ for (Rigidbody & rb : rb_back_forest) {
+ rb.data.linear_velocity_coefficient = vec2(0.5, 0.5);
+ }
+
+ rb_player.data.angular_velocity = 0;
+ rb_player.data.elasticity_coefficient = 0;
+ if (rb_player.data.linear_velocity.x != 0) {
+ rb_player.data.linear_velocity = vec2(PLAYER_SPEED * dt, 0);
+ }
+ rb_player.data.linear_velocity_coefficient = vec2(0.5, 0.5);
+ rb_camera.data.linear_velocity_coefficient = vec2(0.5, 0.5);
+ for (Animator & anim : anim_player) {
+ anim.active = false;
+ anim.set_anim(7);
+ }
+ if (transform_player.rotation > 0 && transform_player.rotation < 90) {
+ // Do not call next_anim()
+ } else if (transform_player.rotation > 90 && transform_player.rotation < 180) {
+ for (Animator & anim : anim_player) {
+ anim.next_anim();
+ }
+ } else if (transform_player.rotation > 180 && transform_player.rotation < 270) {
+ for (Animator & anim : anim_player) {
+ anim.next_anim();
+ anim.next_anim();
+ }
+ } else {
+ for (Animator & anim : anim_player) {
+ anim.next_anim();
+ anim.next_anim();
+ anim.next_anim();
+ }
+ }
+ jump++;
+ }
+
+ if (rb_player.data.linear_velocity.x < 5 && jump == 3) {
+ this->trigger_event<EndGameEvent>();
+ jump++;
+ }
+
+ return false;
+ }
+
+ return false;
+}
diff --git a/game/player/PlayerEndScript.h b/game/player/PlayerEndScript.h
new file mode 100644
index 0000000..03ea8a9
--- /dev/null
+++ b/game/player/PlayerEndScript.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include <crepe/api/Script.h>
+
+class PlayerEndScript : public crepe::Script {
+public:
+ void init();
+
+private:
+ bool on_collision(const crepe::CollisionEvent & ev);
+
+private:
+ int jump = 0;
+};
diff --git a/game/player/PlayerScript.cpp b/game/player/PlayerScript.cpp
new file mode 100644
index 0000000..8cbe8dc
--- /dev/null
+++ b/game/player/PlayerScript.cpp
@@ -0,0 +1,214 @@
+#include "PlayerScript.h"
+
+#include "../Config.h"
+#include "../enemy/BattleScript.h"
+
+#include <crepe/api/Animator.h>
+#include <crepe/api/AudioSource.h>
+#include <crepe/api/BoxCollider.h>
+#include <crepe/api/ParticleEmitter.h>
+#include <crepe/api/Rigidbody.h>
+#include <crepe/api/Transform.h>
+#include <crepe/types.h>
+
+using namespace crepe;
+using namespace std;
+
+void PlayerScript::init() {
+ subscribe<CollisionEvent>([this](const CollisionEvent & ev) -> bool {
+ return this->on_collision(ev);
+ });
+ subscribe<KeyPressEvent>([this](const KeyPressEvent & ev) -> bool {
+ if (ev.repeat) return false;
+ return this->on_key_down(ev);
+ });
+ subscribe<KeyReleaseEvent>([this](const KeyReleaseEvent & ev) -> bool {
+ return this->on_key_up(ev);
+ });
+ this->last_fired = std::chrono::steady_clock::now();
+ this->body = get_component<Rigidbody>();
+}
+
+bool PlayerScript::on_key_down(const KeyPressEvent & ev) {
+ if (ev.key == Keycode::SPACE) {
+ const vec2 UP = {0, -1};
+ this->help_kick(UP);
+ }
+ return false;
+}
+
+bool PlayerScript::on_key_up(const KeyReleaseEvent & ev) {
+ if (ev.key == Keycode::SPACE) {
+ const vec2 DOWN = {0, 1};
+ this->help_kick(DOWN);
+ }
+ return false;
+}
+
+void PlayerScript::help_kick(const vec2 & direction) {
+ // softly "kick" the player (at start/end of flight)
+ vec2 & velocity = this->body->data.linear_velocity;
+ float kick_amount = std::min(
+ velocity.length() * PLAYER_HELP_KICK_SCALE, engine_gravity * PLAYER_HELP_KICK_MAX
+ );
+ velocity += direction * kick_amount;
+}
+
+bool PlayerScript::on_collision(const CollisionEvent & ev) {
+ BehaviorScript & play_scr = this->get_components_by_name<BehaviorScript>("player").front();
+ BehaviorScript & end_scr = this->get_components_by_name<BehaviorScript>("player").back();
+ RefVector<Animator> animators = this->get_components_by_name<Animator>("player");
+ RefVector<ParticleEmitter> emitters
+ = this->get_components_by_name<ParticleEmitter>("player");
+
+ if (ev.info.other.metadata.tag == "zapper") {
+ for (Animator & anim : animators) {
+ anim.active = true;
+ anim.set_anim(4);
+ anim.data.looping = true;
+ prev_anim = 0;
+ }
+ for (ParticleEmitter & emitter : emitters) {
+ emitter.data.emission_rate = 0;
+ }
+ play_scr.active = false;
+ end_scr.active = true;
+
+ AudioSource & audio = this->get_components_by_name<AudioSource>("player").at(0);
+ audio.play();
+
+ return false;
+ } else if (ev.info.other.metadata.tag == "laser") {
+ for (Animator & anim : animators) {
+ anim.active = true;
+ anim.set_anim(4);
+ anim.data.looping = true;
+ prev_anim = 0;
+ }
+ for (ParticleEmitter & emitter : emitters) {
+ emitter.data.emission_rate = 0;
+ }
+ play_scr.active = false;
+ end_scr.active = true;
+
+ AudioSource & audio = this->get_components_by_name<AudioSource>("player").at(1);
+ audio.play();
+
+ return false;
+ } else if (ev.info.other.metadata.tag == "missile"
+ || ev.info.other.metadata.tag == "enemy_bullet") {
+ for (Animator & anim : animators) {
+ anim.active = true;
+ anim.set_anim(5);
+ anim.data.looping = true;
+ prev_anim = 0;
+ }
+ for (ParticleEmitter & emitter : emitters) {
+ emitter.data.emission_rate = 0;
+ }
+ play_scr.active = false;
+ end_scr.active = true;
+
+ AudioSource & audio = this->get_components_by_name<AudioSource>("player").at(2);
+ audio.play();
+
+ return false;
+ }
+
+ return false;
+}
+
+void PlayerScript::fixed_update(crepe::duration_t dt) {
+ RefVector<Animator> animators = this->get_components_by_name<Animator>("player");
+ RefVector<ParticleEmitter> emitters
+ = this->get_components_by_name<ParticleEmitter>("player");
+ Transform & transform = this->get_components_by_name<Transform>("player").front();
+
+ for (ParticleEmitter & emitter : emitters) {
+ emitter.data.boundary.offset = vec2(0, -transform.position.y);
+ }
+
+ Rigidbody & rb = this->body;
+ if (this->get_key_state(Keycode::ENTER)) {
+
+ auto now = std::chrono::steady_clock::now();
+ std::chrono::duration<float> elapsed = now - last_fired;
+ if (elapsed > shot_delay) {
+ this->shoot(transform.position, 0);
+ last_fired = now;
+ }
+ }
+ if (this->get_key_state(Keycode::SPACE)) {
+ rb.add_force_linear(
+ vec2(0, -1) * (engine_gravity * PLAYER_GRAVITY_SCALE * dt.count())
+ );
+
+ if (prev_anim != 1) {
+ for (Animator & anim : animators) {
+ anim.active = true;
+ anim.set_anim(1);
+ anim.data.looping = true;
+ prev_anim = 1;
+ }
+ for (ParticleEmitter & emitter : emitters) {
+ emitter.data.emission_rate = 30;
+ }
+ }
+
+ AudioSource & audio = this->get_components_by_name<AudioSource>("player").at(
+ 3 + current_jetpack_sound
+ );
+ audio.play();
+ current_jetpack_sound++;
+ if (current_jetpack_sound > 7) {
+ current_jetpack_sound = 0;
+ }
+ } else if (transform.position.y == 200) {
+ Rigidbody & rb = this->body;
+ if (prev_anim != 0 && rb.data.linear_velocity.x != 0) {
+ for (Animator & anim : animators) {
+ anim.active = true;
+ anim.set_anim(0);
+ anim.data.looping = true;
+ prev_anim = 0;
+ }
+ for (ParticleEmitter & emitter : emitters) {
+ emitter.data.emission_rate = 0;
+ }
+ }
+ } else {
+ if (prev_anim != 2) {
+ for (Animator & anim : animators) {
+ anim.set_anim(2);
+ anim.data.looping = false;
+ prev_anim = 2;
+ }
+ for (ParticleEmitter & emitter : emitters) {
+ emitter.data.emission_rate = 0;
+ }
+ }
+ }
+}
+
+void PlayerScript::shoot(const vec2 & location, float angle) {
+ RefVector<Transform> bullet_transforms
+ = this->get_components_by_tag<Transform>("player_bullet");
+
+ for (Transform & bullet_pos : bullet_transforms) {
+ if (bullet_pos.position.x == 0 && bullet_pos.position.y == -850) {
+
+ bullet_pos.position = location;
+ bullet_pos.position.x += 20;
+ Rigidbody & bullet_body
+ = this->get_components_by_id<Rigidbody>(bullet_pos.game_object_id).front();
+ BoxCollider bullet_collider
+ = this->get_components_by_id<BoxCollider>(bullet_pos.game_object_id).front();
+ bullet_body.active = true;
+ BehaviorScript & bullet_script
+ = this->get_components_by_id<BehaviorScript>(bullet_pos.game_object_id)
+ .front();
+ bullet_script.active = true;
+ return;
+ }
+ }
+}
diff --git a/game/player/PlayerScript.h b/game/player/PlayerScript.h
new file mode 100644
index 0000000..6a7dedb
--- /dev/null
+++ b/game/player/PlayerScript.h
@@ -0,0 +1,32 @@
+#pragma once
+
+#include "util/OptionalRef.h"
+#include <chrono>
+#include <crepe/api/Config.h>
+#include <crepe/api/Event.h>
+#include <crepe/api/Script.h>
+
+class PlayerScript : public crepe::Script {
+public:
+ void init();
+ void fixed_update(crepe::duration_t dt);
+
+private:
+ bool on_collision(const crepe::CollisionEvent & ev);
+ bool on_key_down(const crepe::KeyPressEvent & ev);
+ bool on_key_up(const crepe::KeyReleaseEvent & ev);
+ // bool on_key_up(const crepe::KeyReleaseEvent& ev);
+ void shoot(const crepe::vec2 & location, float angle);
+ void help_kick(const crepe::vec2 & direction);
+
+private:
+ int prev_anim = 0;
+ std::chrono::time_point<std::chrono::steady_clock> last_fired;
+ std::chrono::time_point<std::chrono::steady_clock> last_switched;
+ std::chrono::duration<float> shot_delay = std::chrono::duration<float>(0.5);
+ std::chrono::duration<float> switch_delay = std::chrono::duration<float>(0.01);
+ int current_jetpack_sound = 0;
+
+ float & engine_gravity = crepe::Config::get_instance().physics.gravity;
+ crepe::OptionalRef<crepe::Rigidbody> body;
+};
diff --git a/game/player/PlayerSubScene.cpp b/game/player/PlayerSubScene.cpp
new file mode 100644
index 0000000..d0142e0
--- /dev/null
+++ b/game/player/PlayerSubScene.cpp
@@ -0,0 +1,222 @@
+#include "PlayerSubScene.h"
+#include "PlayerAudioScript.h"
+#include "PlayerEndScript.h"
+#include "PlayerScript.h"
+
+#include "../Config.h"
+#include "../coins/CoinScript.h"
+
+#include <crepe/ValueBroker.h>
+#include <crepe/api/Animator.h>
+#include <crepe/api/AudioSource.h>
+#include <crepe/api/BoxCollider.h>
+#include <crepe/api/CircleCollider.h>
+#include <crepe/api/GameObject.h>
+#include <crepe/api/ParticleEmitter.h>
+#include <crepe/api/Scene.h>
+#include <crepe/api/Script.h>
+#include <crepe/api/Sprite.h>
+#include <crepe/manager/SaveManager.h>
+#include <crepe/types.h>
+
+using namespace crepe;
+using namespace std;
+
+PlayerSubScene::PlayerSubScene(Scene & scn) {
+ GameObject player = scn.new_object("player", "player", vec2(-100, 200));
+
+ SaveManager & save = scn.get_save_manager();
+ ValueBroker<int> particle_type = save.get<int>(JETPACK_PARTICLES, 0);
+
+ string player_bullet_string;
+ string player_bullet_x2_string;
+ string player_shell_string;
+ if (particle_type.get() == 0) {
+ player_bullet_string = "asset/other_effects/effect_smgbullet.png";
+ player_bullet_x2_string = "asset/other_effects/effect_smgbullet_x2.png";
+ player_shell_string = "asset/other_effects/effect_rocketmgshell_TVOS.png";
+ } else {
+ player_bullet_string = "asset/background/aquarium/bubble.png";
+ player_bullet_x2_string = "asset/background/aquarium/bubble.png";
+ player_shell_string = "asset/background/aquarium/bubble.png";
+ }
+
+ Asset player_bullet {player_bullet_string};
+ Sprite & player_bullet_sprite = player.add_component<Sprite>(
+ player_bullet,
+ Sprite::Data {
+ .sorting_in_layer = SORT_IN_LAY_PLAYER,
+ .order_in_layer = 3,
+ .size = vec2(0, 6),
+ }
+ );
+ player.add_component<ParticleEmitter>(player_bullet_sprite, ParticleEmitter::Data{
+ .offset = vec2(-15, 15),
+ .emission_rate = 0,
+ .min_speed = 300,
+ .max_speed = 500,
+ .min_angle = 85,
+ .max_angle = 100,
+ .boundary = ParticleEmitter::Boundary {
+ .height = 400,
+ .reset_on_exit = true,
+ },
+ });
+ Asset player_bullet_x2 {player_bullet_x2_string};
+ Sprite & player_bullet_x2_sprite = player.add_component<Sprite>(
+ player_bullet_x2,
+ Sprite::Data {
+ .sorting_in_layer = SORT_IN_LAY_PLAYER,
+ .order_in_layer = 3,
+ .size = vec2(0, 12),
+ }
+ );
+ player.add_component<ParticleEmitter>(player_bullet_x2_sprite, ParticleEmitter::Data{
+ .offset = vec2(-15, 15),
+ .emission_rate = 0,
+ .min_speed = 300,
+ .max_speed = 500,
+ .min_angle = 85,
+ .max_angle = 100,
+ .boundary = ParticleEmitter::Boundary {
+ .height = 400,
+ .reset_on_exit = true,
+ },
+ });
+ Asset player_shell {player_shell_string};
+ Sprite & player_shell_sprite = player.add_component<Sprite>(
+ player_shell,
+ Sprite::Data {
+ .sorting_in_layer = SORT_IN_LAY_PLAYER,
+ .order_in_layer = 3,
+ .size = vec2(0, 12),
+ .angle_offset = 90,
+ }
+ );
+ player.add_component<ParticleEmitter>(player_shell_sprite, ParticleEmitter::Data{
+ .offset = vec2(-15, 15),
+ .emission_rate = 0,
+ .min_speed = 200,
+ .max_speed = 500,
+ .min_angle = 110,
+ .max_angle = 120,
+ .force_over_time = vec2(0, 1000),
+ .boundary = ParticleEmitter::Boundary {
+ .height = 400,
+ .reset_on_exit = true,
+ },
+ });
+
+ Asset player_body_asset {"asset/barry/defaultBody.png"};
+ Sprite & player_body_sprite = player.add_component<Sprite>(
+ player_body_asset,
+ Sprite::Data {
+ .sorting_in_layer = SORT_IN_LAY_PLAYER,
+ .order_in_layer = 0,
+ .size = vec2(0, 50),
+ }
+ );
+ player.add_component<Animator>(
+ player_body_sprite, ivec2(32, 32), uvec2(4, 8),
+ Animator::Data {
+ .fps = 5,
+ .looping = true,
+ }
+ );
+ player.add_component<BoxCollider>(vec2(50, 35));
+ Asset player_head_asset {"asset/barry/defaultHead.png"};
+ Sprite & player_head_sprite = player.add_component<Sprite>(
+ player_head_asset,
+ Sprite::Data {
+ .sorting_in_layer = SORT_IN_LAY_PLAYER,
+ .order_in_layer = 1,
+ .size = vec2(0, 50),
+ .position_offset = vec2(0, -20),
+ }
+ );
+ player.add_component<Animator>(
+ player_head_sprite, ivec2(32, 32), uvec2(4, 8),
+ Animator::Data {
+ .fps = 5,
+ .looping = true,
+ }
+ );
+ player.add_component<CircleCollider>(25, vec2(0, -20));
+ Asset player_jetpack_asset {"asset/barry/jetpackDefault.png"};
+ Sprite & player_jetpack_sprite = player.add_component<Sprite>(
+ player_jetpack_asset,
+ Sprite::Data {
+ .sorting_in_layer = SORT_IN_LAY_PLAYER,
+ .order_in_layer = 2,
+ .size = vec2(0, 60),
+ .position_offset = vec2(-20, 0),
+ }
+ );
+ player_jetpack_sprite.active = false;
+ player.add_component<Animator>(
+ player_jetpack_sprite, ivec2(32, 44), uvec2(4, 4),
+ Animator::Data {
+ .fps = 5,
+ .looping = true,
+ }
+ );
+ player.add_component<BoxCollider>(vec2(40, 50), vec2(-20, 0));
+ player.add_component<Rigidbody>(Rigidbody::Data {
+ .gravity_scale = 1.0,
+ .body_type = Rigidbody::BodyType::DYNAMIC,
+ .linear_velocity = vec2(PLAYER_SPEED * 0.02, 0),
+ .collision_layers
+ = {COLL_LAY_BOT_TOP, COLL_LAY_ZAPPER, COLL_LAY_LASER, COLL_LAY_MISSILE, COLL_LAY_BULLET
+ },
+ .collision_layer = COLL_LAY_PLAYER,
+ });
+
+ player.add_component<BehaviorScript>().set_script<PlayerScript>().active = false;
+ player.add_component<BehaviorScript>().set_script<CoinScript>();
+ player.add_component<BehaviorScript>().set_script<PlayerEndScript>().active = false;
+
+ player.add_component<AudioSource>(Asset("asset/sfx/dud_zapper_lp.ogg"));
+ player.add_component<AudioSource>(Asset("asset/sfx/dud_zapper_pop.ogg"));
+ player.add_component<AudioSource>(Asset("asset/sfx/dud_fire.ogg"));
+ player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_01.ogg")).volume
+ = 0.1;
+ player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_02.ogg")).volume
+ = 0.1;
+ player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_03.ogg")).volume
+ = 0.1;
+ player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_04.ogg")).volume
+ = 0.1;
+ player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_05.ogg")).volume
+ = 0.1;
+ player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_06.ogg")).volume
+ = 0.1;
+ player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_07.ogg")).volume
+ = 0.1;
+ player.add_component<AudioSource>(Asset("asset/sfx/jetpack_firecracker_lp_08.ogg")).volume
+ = 0.1;
+
+ GameObject player_audio = scn.new_object("player_audio", "player_audio", vec2(0, 0));
+ player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_left_1.ogg")).volume
+ = 3.0;
+ player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_right_1.ogg"))
+ .volume
+ = 3.0;
+ player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_left_2.ogg")).volume
+ = 3.0;
+ player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_right_2.ogg"))
+ .volume
+ = 3.0;
+ player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_left_3.ogg")).volume
+ = 3.0;
+ player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_right_3.ogg"))
+ .volume
+ = 3.0;
+ player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_left_4.ogg")).volume
+ = 3.0;
+ player_audio.add_component<AudioSource>(Asset("asset/sfx/barefoot_step_right_4.ogg"))
+ .volume
+ = 3.0;
+
+ player_audio.add_component<BehaviorScript>().set_script<PlayerAudioScript>().active
+ = false;
+}
diff --git a/game/player/PlayerSubScene.h b/game/player/PlayerSubScene.h
new file mode 100644
index 0000000..bf94c32
--- /dev/null
+++ b/game/player/PlayerSubScene.h
@@ -0,0 +1,10 @@
+#pragma once
+
+namespace crepe {
+class Scene;
+}
+
+class PlayerSubScene {
+public:
+ PlayerSubScene(crepe::Scene & scn);
+};