|
@@ -0,0 +1,340 @@
|
|
|
|
+#include <cmath>
|
|
|
|
+#include "Player.hpp"
|
|
|
|
+#include "Log.hpp"
|
|
|
|
+#include "Animation.hpp"
|
|
|
|
+#include "Asset.hpp"
|
|
|
|
+#include "Alermath.hpp"
|
|
|
|
+#include "Renderer.hpp"
|
|
|
|
+#include "Spectre.hpp"
|
|
|
|
+
|
|
|
|
+Player::Player():
|
|
|
|
+m_collider("data/map2.json"),
|
|
|
|
+m_voice(),
|
|
|
|
+m_ms(85.f * TOOFAST) {
|
|
|
|
+ setPosition(45 * 32.f, 32 * 32.f);
|
|
|
|
+ Renderer::attach(sf::Vector2f(getPosition().x, getPosition().y + 500.f));
|
|
|
|
+ setOrigin(16.f, 24.f);
|
|
|
|
+ addAnimation("data/nem2-idle.png", 0, "idle", true, 32, 32);
|
|
|
|
+ addAnimation("data/nem2-move.png", 300, "run", true, 32, 32);
|
|
|
|
+ setAnimation("idle");
|
|
|
|
+ setAnimationSpeed(1.f);
|
|
|
|
+ setDir(2);
|
|
|
|
+ animate();
|
|
|
|
+
|
|
|
|
+ Asset::sound("data/nem/aaa1.wav");
|
|
|
|
+
|
|
|
|
+ Spectre::setPlayer(this);
|
|
|
|
+ Renderer::registerDrawable(this, 100, Renderer::Mode::FG, "Player");
|
|
|
|
+ Renderer::registerDrawable(&m_notnem, 101, Renderer::Mode::FG, "Monn");
|
|
|
|
+ Renderer::registerDrawable(&m_end, 101, Renderer::Mode::FG, "Endthing");
|
|
|
|
+ Renderer::follow(this);
|
|
|
|
+ sf::Color not_nem_color(32, 32, 32);
|
|
|
|
+ m_voice.addLine("data/introscene.ogg", 3.f);
|
|
|
|
+ m_voice.addSubtitle(3.f, 2.f, "This is a nightmare!");
|
|
|
|
+ m_voice.addSubtitle(0.f, 3.f, "How long until I wake up?");
|
|
|
|
+ m_voice.addSubtitle(1.f, 1.f, "Well, you are...", not_nem_color);
|
|
|
|
+ m_voice.addSubtitle(0.f, 1.f, "...*stuck*.", not_nem_color);
|
|
|
|
+ m_voice.addSubtitle(0.f, 0.5f, "Eh?");
|
|
|
|
+ m_voice.addSubtitle(1.f, 4.f, "The Creator wrote an infinite while loop.", not_nem_color);
|
|
|
|
+ m_voice.addSubtitle(0.f, 2.f, "And you'll have to \"break;\" it.", not_nem_color);
|
|
|
|
+ m_voice.addSubtitle(0.f, 1.f, "Where is it?!");
|
|
|
|
+ m_voice.addSubtitle(0.f, 4.f, "Somewhere to the south. I can't go with you.", not_nem_color);
|
|
|
|
+ m_voice.addSubtitle(3.f, 0.7f, "FUCK!");
|
|
|
|
+ m_voice.addSubtitle(0.4f, 4.f, "Just follow the road and you'll be fine.", not_nem_color);
|
|
|
|
+
|
|
|
|
+ m_notnem.addAnimation("data/notnem.png", 500, "idle", true, 96, 96);
|
|
|
|
+ m_notnem.setAnimation("idle");
|
|
|
|
+ m_notnem.setPosition(getPosition().x + 32.f, getPosition().y - 96.f);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ m_end.setPosition(110 * 32.f, 105 * 32.f);
|
|
|
|
+
|
|
|
|
+ m_intro_clock.restart();
|
|
|
|
+
|
|
|
|
+ m_brown.setLoop(false);
|
|
|
|
+ m_brown.setBuffer(Asset::sound("data/brownshort.wav"));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+Player::~Player() {
|
|
|
|
+ Spectre::setPlayer(nullptr);
|
|
|
|
+ Renderer::deregisterDrawable(&m_end);
|
|
|
|
+ Renderer::follow(nullptr);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Player::update(float dt) {
|
|
|
|
+ m_voice.update(dt);
|
|
|
|
+
|
|
|
|
+ //if (m_intro_clock.getElapsedTime().asSeconds() < 0.f) {
|
|
|
|
+ if (m_intro_clock.getElapsedTime().asSeconds() < 30.f) {//0.f) {//30.f) {
|
|
|
|
+ setDir(2);
|
|
|
|
+ float t = m_intro_clock.getElapsedTime().asSeconds();
|
|
|
|
+ // 20-23.5
|
|
|
|
+ // 23-26.5
|
|
|
|
+ if ((t > 23.f && t < 24.f) || (t > 24.7f && t < 25.3f) || (t > 25.6f && t < 25.8f) || (t > 25.9f && t < 26.f)) {
|
|
|
|
+ setDir(0);
|
|
|
|
+ }
|
|
|
|
+ setAnimation("idle", true);
|
|
|
|
+ m_notnem.animate();
|
|
|
|
+ animate();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (rand() % 4 == 0) {
|
|
|
|
+ m_end.toggle(0, true, 6);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ m_end.toggle(0, false, 6);
|
|
|
|
+ }
|
|
|
|
+ if (rand() % 6 == 0) {
|
|
|
|
+ m_end.toggle(1, true, 16);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ m_end.toggle(1, false, 16);
|
|
|
|
+ }
|
|
|
|
+ if (rand() % 9 == 0) {
|
|
|
|
+ m_end.toggle(2, true, 32);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ m_end.toggle(2, false, 32);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ static bool trig_west = false;
|
|
|
|
+ if (!trig_west && Collider::isWithin({ 29, 61, 47, 72 }, getPosition())) {
|
|
|
|
+ trig_west = true;
|
|
|
|
+ m_voice.addLine("data/nem/of_a_person_to_die.ogg", 2.f);
|
|
|
|
+ m_voice.addSubtitle(2.f, 3.f, "Do I reaaally have to go west?");
|
|
|
|
+ Spectre::setMaxChaos(0.4f);
|
|
|
|
+ Renderer::deregisterDrawable(&m_notnem);
|
|
|
|
+ }
|
|
|
|
+ if (!trig_west) {
|
|
|
|
+ m_notnem.animate();
|
|
|
|
+ }
|
|
|
|
+ static bool trig_west2 = false;
|
|
|
|
+ if (!trig_west2 && Collider::isWithin({ 24, 69, 30, 75 }, getPosition())) {
|
|
|
|
+ trig_west2 = true;
|
|
|
|
+ m_voice.addLine("data/nem/whack.ogg", 1.f);
|
|
|
|
+ m_voice.addSubtitle(1.f, 2.f, "Oh fuck, where do I go now?");
|
|
|
|
+ m_voice.addSubtitle(3.5f, 3.f, "jUsT fOLLoW tHe RoAd aND yOu'Ll bE FinE");
|
|
|
|
+ Spectre::addChaos(0.1f);
|
|
|
|
+ }
|
|
|
|
+ static bool trig_back = false;
|
|
|
|
+ if (trig_west && !trig_back && Collider::isWithin({ 39, 26, 54, 42 }, getPosition())) {
|
|
|
|
+ trig_back = true;
|
|
|
|
+ m_voice.addLine("data/nem/fuck_this_theme_in_particular.ogg", 3.f);
|
|
|
|
+ m_voice.addSubtitle(3.f, 5.f, "I guess the world changes when you are not looking.");
|
|
|
|
+ }
|
|
|
|
+ static bool trig_code = false;
|
|
|
|
+ if (!trig_code && Collider::isWithin({ 95, 97, 125, 112 }, getPosition())) {
|
|
|
|
+ trig_code = true;
|
|
|
|
+ m_voice.addLine("data/nem/codeinjection.ogg", 0.f);
|
|
|
|
+ m_voice.addSubtitle(0.f, 3.f, "Coming in with the CODE INJECTION.");
|
|
|
|
+ }
|
|
|
|
+ static bool trig_trees = false;
|
|
|
|
+ if (!trig_trees && Collider::isWithin({ 50, 90, 115, 125 }, getPosition())) {
|
|
|
|
+ trig_trees = true;
|
|
|
|
+ m_voice.addLine("data/nem/trees.ogg", 0.f);
|
|
|
|
+ m_voice.addSubtitle(0.f, 3.f, "What's with these trees?");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ static float halfsec_clock = 0.f;
|
|
|
|
+ static sf::Vector2f halfsec_pos;
|
|
|
|
+ static int halfsec_count = 6;
|
|
|
|
+
|
|
|
|
+ halfsec_clock += dt;
|
|
|
|
+ if (halfsec_clock > 0.5f * halfsec_count) {
|
|
|
|
+ halfsec_pos = getPosition();
|
|
|
|
+ halfsec_clock = 0.f;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ static bool trig_warp[5] = { false, false, false, false, false };
|
|
|
|
+ sf::IntRect range[] = {
|
|
|
|
+ {103, 102, 117, 108}, // 110 105
|
|
|
|
+ {103, 102, 117, 108}, // 110 105
|
|
|
|
+ {245, 162, 255, 168},
|
|
|
|
+ {103, 102, 117, 108},
|
|
|
|
+ {72, 188, 78, 192}
|
|
|
|
+ };
|
|
|
|
+ sf::Vector2i dest[] = {
|
|
|
|
+ {32, 165},
|
|
|
|
+ {176, 151},
|
|
|
|
+ {26, 72},
|
|
|
|
+ {26, 72},
|
|
|
|
+ {320, 32}
|
|
|
|
+ };
|
|
|
|
+ sf::Vector2i target[] = {
|
|
|
|
+ {},
|
|
|
|
+ {250, 165},
|
|
|
|
+ {110, 105},
|
|
|
|
+ {75, 190},
|
|
|
|
+ {320, 135}
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ if (trig_warp[0] && m_ms < 150.f) {
|
|
|
|
+ m_ms += dt * 20.f;
|
|
|
|
+ if (m_ms > 150.f) {
|
|
|
|
+ m_ms = 150.f;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (std::size_t i = 0; i < 5; ++i) {
|
|
|
|
+ if (trig_warp[i]) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (m_cheat || Collider::isWithin(range[i], getPosition())) {
|
|
|
|
+ if (i == 4 && halfsec_count > 0) {
|
|
|
|
+ halfsec_count--;
|
|
|
|
+ setPosition(halfsec_pos);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ m_cheat = false;
|
|
|
|
+ trig_warp[i] = true;
|
|
|
|
+ int x = 32; int y = 165;
|
|
|
|
+ setPosition(dest[i].x * 32.f, dest[i].y * 32.f);
|
|
|
|
+ Renderer::attach({ dest[i].x * 32.f, dest[i].y * 32.f });
|
|
|
|
+ Spectre::setMinChaos((i + 1) * 0.2f);
|
|
|
|
+ if (i == 4) {
|
|
|
|
+ Spectre::setMinChaos(0.f);
|
|
|
|
+ Renderer::setReadyToDie();
|
|
|
|
+ }
|
|
|
|
+ Spectre::setMaxChaos((i + 3) * 0.2f);
|
|
|
|
+ if (target[i].x != 0) {
|
|
|
|
+ m_end.setPosition(target[i].x * 32.f, target[i].y * 32.f);
|
|
|
|
+ }
|
|
|
|
+ m_voice.addLine("data/nem/warp" + std::to_string(i) + ".ogg", 0.f);
|
|
|
|
+ switch (i) {
|
|
|
|
+ case 0: m_voice.addSubtitle(0.f, 0.5f, "Eh?"); break;
|
|
|
|
+ case 1: m_voice.addSubtitle(0.f, 1.f, "?!?!?!!?!?!?!"); break;
|
|
|
|
+ case 2: m_voice.addSubtitle(0.f, 1.f, "Why here?"); break;
|
|
|
|
+ case 3: m_voice.addSubtitle(0.f, 1.5f, "Is this a loop within a loop?"); break;
|
|
|
|
+ case 4: m_voice.addSubtitle(0.f, 2.5f, "Oh, you've got to be kidding me."); break;
|
|
|
|
+ }
|
|
|
|
+ m_brown.play();
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (trig_warp[4]) {
|
|
|
|
+ Spectre::setChaos(1.f - math::non_negative((m_end.getPosition().y - getPosition().y) / (m_end.getPosition().y - 32.f * 32)));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //Log(DEBUG, getPosition().x - m_end.getPosition().x, " ", getPosition().y - m_end.getPosition().y, " ", math::dist(getPosition(), m_end.getPosition()));
|
|
|
|
+ if (std::fabs(getPosition().x - m_end.getPosition().x) < 128.f && std::fabs(getPosition().y - m_end.getPosition().y) < 45.f) {
|
|
|
|
+ if (trig_warp[4]) {
|
|
|
|
+ Renderer::follow(&m_end);
|
|
|
|
+ Renderer::deregisterDrawable(this);
|
|
|
|
+ Renderer::goWhack();
|
|
|
|
+ m_voice.clear();
|
|
|
|
+ m_voice.addLine("data/nem/aaa5.wav", 0.f);
|
|
|
|
+ m_voice.addLine("data/nem/aaa4.wav", 3.3f);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ static int consistent_dir = 2;
|
|
|
|
+
|
|
|
|
+ bool up = false, down = false, left = false, right = false;
|
|
|
|
+ int hor = 0, ver = 0;
|
|
|
|
+
|
|
|
|
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)
|
|
|
|
+ || sf::Keyboard::isKeyPressed(sf::Keyboard::Up)
|
|
|
|
+ || (sf::Joystick::isConnected(0) && sf::Joystick::getAxisPosition(0, sf::Joystick::Axis::PovY) > 50.f)) {
|
|
|
|
+ up = true;
|
|
|
|
+ }
|
|
|
|
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)
|
|
|
|
+ || sf::Keyboard::isKeyPressed(sf::Keyboard::Down)
|
|
|
|
+ || (sf::Joystick::isConnected(0) && sf::Joystick::getAxisPosition(0, sf::Joystick::Axis::PovY) < -50.f)) {
|
|
|
|
+ down = true;
|
|
|
|
+ }
|
|
|
|
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)
|
|
|
|
+ || sf::Keyboard::isKeyPressed(sf::Keyboard::Left)
|
|
|
|
+ || (sf::Joystick::isConnected(0) && sf::Joystick::getAxisPosition(0, sf::Joystick::Axis::PovX) < -50.f)) {
|
|
|
|
+ left = true;
|
|
|
|
+ }
|
|
|
|
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)
|
|
|
|
+ || sf::Keyboard::isKeyPressed(sf::Keyboard::Right)
|
|
|
|
+ || (sf::Joystick::isConnected(0) && sf::Joystick::getAxisPosition(0, sf::Joystick::Axis::PovX) > 50.f)) {
|
|
|
|
+ right = true;
|
|
|
|
+ }
|
|
|
|
+ if (consistent_dir == 1 && (!up && !down) || (up && down)) {
|
|
|
|
+ consistent_dir = 0;
|
|
|
|
+ }
|
|
|
|
+ if (consistent_dir == 2 && (!left && !right) || (left && right)) {
|
|
|
|
+ consistent_dir = 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (up && !down) {
|
|
|
|
+ if (!consistent_dir) {
|
|
|
|
+ consistent_dir = 1;
|
|
|
|
+ }
|
|
|
|
+ if (consistent_dir == 1) {
|
|
|
|
+ setDir(1);
|
|
|
|
+ }
|
|
|
|
+ ver = -1;
|
|
|
|
+ }
|
|
|
|
+ if (down && !up) {
|
|
|
|
+ if (!consistent_dir) {
|
|
|
|
+ consistent_dir = 1;
|
|
|
|
+ }
|
|
|
|
+ if (consistent_dir == 1) {
|
|
|
|
+ setDir(0);
|
|
|
|
+ }
|
|
|
|
+ ver = 1;
|
|
|
|
+ }
|
|
|
|
+ if (left && !right) {
|
|
|
|
+ if (!consistent_dir) {
|
|
|
|
+ consistent_dir = 2;
|
|
|
|
+ }
|
|
|
|
+ if (consistent_dir == 2) {
|
|
|
|
+ setDir(3);
|
|
|
|
+ }
|
|
|
|
+ hor = -1;
|
|
|
|
+ }
|
|
|
|
+ if (right && !left) {
|
|
|
|
+ if (!consistent_dir) {
|
|
|
|
+ consistent_dir = 2;
|
|
|
|
+ }
|
|
|
|
+ if (consistent_dir == 2) {
|
|
|
|
+ setDir(2);
|
|
|
|
+ }
|
|
|
|
+ hor = 1;
|
|
|
|
+ }
|
|
|
|
+ static float noclock = 0.f;
|
|
|
|
+ static float noclockclock = 0.f;
|
|
|
|
+ float dx = hor * (m_ms + Spectre::getChaos() * 150.f) * dt / (ver ? 1.4142f : 1.f);
|
|
|
|
+ float dy = ver * (m_ms + Spectre::getChaos() * 150.f) * dt / (hor ? 1.4142f : 1.f);
|
|
|
|
+ if (!m_collider.check(getPosition(), dx, 0)) {
|
|
|
|
+ move(dx, 0);
|
|
|
|
+ }
|
|
|
|
+ else if(m_collider.check(getPosition(), dx, 0) == 2) {
|
|
|
|
+ noclock += dt;
|
|
|
|
+ }
|
|
|
|
+ if (!m_collider.check(getPosition(), 0, dy)) {
|
|
|
|
+ move(0, dy);
|
|
|
|
+ }
|
|
|
|
+ else if(m_collider.check(getPosition(), 0, dy) == 2) {
|
|
|
|
+ noclock += dt; // yes, double speed if both x and y
|
|
|
|
+ }
|
|
|
|
+ noclockclock += dt;
|
|
|
|
+ if (noclock > 3.f && noclockclock > 10.f) {
|
|
|
|
+ noclock = 0.f;
|
|
|
|
+ noclockclock = 0.f;
|
|
|
|
+ int i = rand() % 3;
|
|
|
|
+ m_voice.addLine("data/nem/no" + std::to_string(i + 1) + ".wav", 0.f, true);
|
|
|
|
+ if (i != 2) {
|
|
|
|
+ m_voice.addSubtitle(0.f, 2.f, "I really don't wanna go there.");
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ m_voice.addSubtitle(0.f, 4.f, "I sense something awful in that part of the forest.");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (dx != 0.f || dy != 0.f) {
|
|
|
|
+ setAnimation("run");
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ setAnimation("idle");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ animate();
|
|
|
|
+}
|