// Copyright (c) 2022-2023 the Dviglo project // Copyright (c) 2008-2023 the Urho3D project // License: MIT /* Простой запуск игры - одиночная игра. При запуске с параметром "-nobgm" фоновая музыка будет отключена. С параметром "-server" игра запустится в режиме сервера. Сервер удобно запускать в виде консольного приложения, используя параметры "-server -headless". С параметром "-address 127.0.0.1" игра запустится в режиме клиента и подключится к серверу, запущенному на этом же компьютере. Также игра поддерживает геймпады и сенсорные экраны. Параметр "-touch" позволяет сэмулировать тачскрин на ПК. Друг другу игроки урон не наносят. */ #include #include "foot_steps.h" #include "light_flash.h" #include "ninja.h" #include "player.h" #include "potion.h" #include "snow_crate.h" #include "snowball.h" #include "utilities/network.h" #include "utilities/spawn.h" namespace Urho3D { static constexpr float MOUSE_SENSITIVITY = 0.125f; static constexpr float TOUCH_SENSITIVITY = 2.0f; static constexpr float JOY_SENSITIVITY = 0.5f; static constexpr float JOY_MOVE_DEAD_ZONE = 0.333f; static constexpr float JOY_LOOK_DEAD_ZONE = 0.05f; static constexpr float CAMERA_MIN_DIST = 0.25f; static constexpr float CAMERA_MAX_DIST = 5.0f; static constexpr float CAMERA_SAFETY_DIST = 0.3f; static constexpr i32 INITIAL_MAX_ENEMIES = 5; static constexpr i32 FINAL_MAX_ENEMIES = 25; static constexpr i32 MAX_POWERUPS = 5; static constexpr i32 INCREMENT_EACH = 10; static constexpr i32 PLAYER_HEALTH = 20; static constexpr float ENEMY_SPAWN_RATE = 1.0f; static constexpr float POWERUP_SPAWN_RATE = 15.0f; static constexpr float SPAWN_AREA_SIZE = 5.0f; class App : public Application { URHO3D_OBJECT(App, Application); private: SharedPtr gameScene; SharedPtr gameCameraNode; Camera* gameCamera = nullptr; SharedPtr musicNode; SoundSource* musicSource = nullptr; SharedPtr scoreText; SharedPtr hiscoreText; SharedPtr messageText; SharedPtr healthBar; SharedPtr sight; Controls playerControls; Controls prevPlayerControls; bool singlePlayer = true; bool gameOn = false; bool drawDebug = false; bool drawOctreeDebug = false; i32 maxEnemies = 0; i32 incrementCounter = 0; float enemySpawnTimer = 0.f; float powerupSpawnTimer = 0.f; NodeId clientNodeID = 0; i32 clientScore = 0; i32 screenJoystickID = -1; i32 screenJoystickSettingsID = -1; bool touchEnabled = false; Vector players; Vector hiscores; public: App(Context* context) : Application(context) { Ninja::RegisterObject(context); FootSteps::RegisterObject(context); GameObject::RegisterObject(context); LightFlash::RegisterObject(context); Potion::RegisterObject(context); SnowCrate::RegisterObject(context); Snowball::RegisterObject(context); } void Setup() override { // Modify engine startup parameters engineParameters_[EP_WINDOW_TITLE] = "Ninja Snow Wars Native"; engineParameters_[EP_LOG_NAME] = GetSubsystem()->GetAppPreferencesDir("urho3d", "logs") + "80_ninja_snow_wars_native.log"; //engineParameters_[EP_FULL_SCREEN] = false; } void Start() override { if (GetSubsystem()->IsHeadless()) OpenConsoleWindow(); ParseNetworkArguments(); if (runServer || runClient) singlePlayer = false; InitAudio(); InitConsole(); InitScene(); InitNetworking(); CreateCamera(); CreateOverlays(); SubscribeToEvent(gameScene, E_SCENEUPDATE, URHO3D_HANDLER(App, HandleUpdate)); PhysicsWorld* physicsWorld = gameScene->GetComponent(); if (physicsWorld) SubscribeToEvent(physicsWorld, E_PHYSICSPRESTEP, URHO3D_HANDLER(App, HandleFixedUpdate)); SubscribeToEvent(gameScene, E_SCENEPOSTUPDATE, URHO3D_HANDLER(App, HandlePostUpdate)); SubscribeToEvent(E_POSTRENDERUPDATE, URHO3D_HANDLER(App, HandlePostRenderUpdate)); SubscribeToEvent(E_KEYDOWN, URHO3D_HANDLER(App, HandleKeyDown)); SubscribeToEvent("Points", URHO3D_HANDLER(App, HandlePoints)); SubscribeToEvent("Kill", URHO3D_HANDLER(App, HandleKill)); SubscribeToEvent(E_SCREENMODE, URHO3D_HANDLER(App, HandleScreenMode)); if (singlePlayer) { StartGame(nullptr); GetSubsystem()->SetPauseMinimized(true); } } void InitAudio() { if (GetSubsystem()->IsHeadless()) return; Audio* audio = GetSubsystem