├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .travis.yml ├── CMakeLists.txt ├── Controller ├── abstract_controller.h ├── controller.cpp ├── controller.h ├── multiplayer_client.cpp ├── multiplayer_client.h ├── spawner.cpp └── spawner.h ├── GameObject ├── abstract_projectile.cpp ├── abstract_projectile.h ├── auric_field.cpp ├── auric_field.h ├── base.cpp ├── base.h ├── bomb_projectile.cpp ├── bomb_projectile.h ├── building.cpp ├── building.h ├── effect.cpp ├── effect.h ├── enemy.cpp ├── enemy.h ├── game_object.cpp ├── game_object.h ├── homing_projectile.cpp ├── homing_projectile.h ├── laser_projectile.cpp ├── laser_projectile.h ├── moving_object.cpp ├── moving_object.h ├── particle.cpp ├── particle.h ├── particle_handler.cpp └── particle_handler.h ├── Model ├── constants.h ├── coordinate.cpp ├── coordinate.h ├── enemy_group.h ├── model.cpp ├── model.h ├── music_player.cpp ├── music_player.h ├── road.cpp ├── road.h ├── size.cpp ├── size.h ├── sound_vector.cpp └── sound_vector.h ├── README.md ├── README.ru.md ├── Server ├── main.cpp ├── message.cpp ├── message.h ├── server.cpp ├── server.h └── server.pro ├── View ├── animation_player.cpp ├── animation_player.h ├── button_handler.cpp ├── button_handler.h ├── global_chat.cpp ├── global_chat.h ├── info_field.cpp ├── info_field.h ├── menu_button.cpp ├── menu_button.h ├── size_handler.cpp ├── size_handler.h ├── text_notification.cpp ├── text_notification.h ├── tower_menu.cpp ├── tower_menu.h ├── view.cpp └── view.h ├── android ├── AndroidManifest.xml ├── build.gradle ├── google-services.json ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── release_notes.txt └── res │ ├── mipmap-hdpi │ └── techvscats.png │ ├── mipmap-mdpi │ └── techvscats.png │ ├── mipmap-xhdpi │ └── techvscats.png │ ├── mipmap-xxhdpi │ └── techvscats.png │ ├── mipmap-xxxhdpi │ └── techvscats.png │ └── values │ └── libs.xml ├── database.qrc ├── images.qrc ├── main.cpp ├── music.qrc ├── resources ├── buttons_resources │ ├── accept.png │ ├── accept_h.png │ ├── bomb_button.png │ ├── bomb_button_h.png │ ├── dec_level_button.png │ ├── dec_level_button_active.png │ ├── decline.png │ ├── decline_h.png │ ├── default_tower_button.png │ ├── default_tower_button_h.png │ ├── double_speed_button.png │ ├── double_speed_button_active.png │ ├── empty_button.png │ ├── empty_button_h.png │ ├── inc_level_button.png │ ├── inc_level_button_active.png │ ├── language_button_eng.png │ ├── language_button_eng_active.png │ ├── language_button_rus — копия.png │ ├── language_button_rus.png │ ├── language_button_rus_active.png │ ├── laser_button.png │ ├── laser_button_h.png │ ├── next_level_button.png │ ├── next_level_button_active.png │ ├── non_toggle.png │ ├── non_toggle_active.png │ ├── normal_speed_button.png │ ├── normal_speed_button_active.png │ ├── online_button_offline.png │ ├── online_button_offline_active.png │ ├── online_button_online.png │ ├── online_button_online_active.png │ ├── open_chat.png │ ├── open_chat_active.png │ ├── pause_button.png │ ├── pause_button_active.png │ ├── second_upgrade_button.png │ ├── second_upgrade_button_h.png │ ├── send_button.png │ ├── send_button_active.png │ ├── sound_button_off.png │ ├── sound_button_off_active.png │ ├── sound_button_on.png │ ├── sound_button_on_active.png │ ├── support_button.png │ ├── support_button_h.png │ ├── toggle.png │ ├── toggle_active.png │ ├── upgrade_button.png │ ├── upgrade_button_h.png │ ├── zero_speed_button.png │ └── zero_speed_button_active.png ├── database │ ├── database.json │ ├── description_en_US.json │ ├── description_ru_RU.json │ ├── server_en_US.json │ ├── server_ru_RU.json │ └── titles.txt ├── fonts │ └── gui_font.ttf ├── images │ ├── backgrounds │ │ ├── cloud.png │ │ ├── logo.png │ │ ├── main_background_1.png │ │ ├── map_level_1_1.png │ │ ├── map_level_2_1.png │ │ ├── map_level_3_1.png │ │ ├── pause_menu_background_1.png │ │ ├── settings_background_1.png │ │ ├── texture_level_1.png │ │ ├── texture_level_2.png │ │ ├── texture_level_3.png │ │ └── titles_background_1.png │ ├── enemies │ │ ├── fridge_1.png │ │ ├── fridge_2.png │ │ ├── fridge_3.png │ │ ├── fridge_4.png │ │ ├── fridge_5.png │ │ ├── fridge_6.png │ │ ├── fridge_7.png │ │ ├── fridge_8.png │ │ ├── mouse_1.png │ │ ├── mouse_2.png │ │ ├── mouse_3.png │ │ ├── mouse_4.png │ │ ├── router_1.png │ │ ├── router_2.png │ │ ├── router_3.png │ │ ├── router_4.png │ │ ├── toster_1.png │ │ ├── toster_2.png │ │ ├── toster_3.png │ │ ├── toster_4.png │ │ ├── vaccleaner_1.png │ │ ├── vaccleaner_2.png │ │ ├── vaccleaner_3.png │ │ ├── vaccleaner_4.png │ │ ├── vaccleaner_5.png │ │ ├── vaccleaner_6.png │ │ ├── vaccleaner_7.png │ │ ├── washmachine_1.png │ │ ├── washmachine_2.png │ │ ├── washmachine_3.png │ │ ├── washmachine_4.png │ │ ├── washmachine_5.png │ │ ├── washmachine_6.png │ │ └── washmachine_7.png │ ├── error.png │ ├── icon.ico │ ├── icon.png │ ├── icons │ │ ├── fast_1.png │ │ ├── fast_attack_1.png │ │ ├── less_armor_1.png │ │ ├── less_damage_1.png │ │ ├── less_range_1.png │ │ ├── more_armor_1.png │ │ ├── more_damage_1.png │ │ ├── more_range_1.png │ │ ├── slow_1.png │ │ └── slow_attack_1.png │ ├── interface │ │ └── interface_1.png │ ├── particles │ │ ├── flash4_1.png │ │ ├── flash4_2.png │ │ ├── flash4_3.png │ │ ├── flash4_4.png │ │ ├── friework7_1.png │ │ ├── friework7_10.png │ │ ├── friework7_11.png │ │ ├── friework7_12.png │ │ ├── friework7_2.png │ │ ├── friework7_3.png │ │ ├── friework7_4.png │ │ ├── friework7_5.png │ │ ├── friework7_6.png │ │ ├── friework7_7.png │ │ ├── friework7_8.png │ │ ├── friework7_9.png │ │ ├── kaboom0_1.png │ │ ├── kaboom0_2.png │ │ ├── kaboom0_3.png │ │ ├── kaboom0_4.png │ │ ├── kaboom0_5.png │ │ ├── kaboom0_6.png │ │ ├── kaboom0_7.png │ │ ├── kaboom0_8.png │ │ ├── kaboom1_1.png │ │ ├── kaboom1_2.png │ │ ├── kaboom1_3.png │ │ ├── kaboom1_4.png │ │ ├── kaboom1_5.png │ │ ├── kaboom1_6.png │ │ ├── kaboom1_7.png │ │ ├── kaboom1_8.png │ │ ├── on_fire2_1.png │ │ ├── on_fire2_2.png │ │ ├── on_fire2_3.png │ │ ├── on_fire2_4.png │ │ ├── on_fire2_5.png │ │ ├── poof5_1.png │ │ ├── poof5_2.png │ │ ├── poof5_3.png │ │ ├── scar3_1.png │ │ ├── scar3_2.png │ │ ├── scar3_3.png │ │ ├── scar3_4.png │ │ ├── scar3_5.png │ │ ├── scar3_6.png │ │ ├── smoke6_1.png │ │ ├── smoke6_2.png │ │ ├── smoke6_3.png │ │ ├── smoke6_4.png │ │ ├── smoke6_5.png │ │ ├── smoke6_6.png │ │ ├── smoke6_7.png │ │ ├── smoke6_8.png │ │ └── smoke6_9.png │ ├── projectiles │ │ ├── bullet0_1.png │ │ ├── laser2_1.png │ │ ├── laser2_2.png │ │ ├── laser2_3.png │ │ ├── laser2_4.png │ │ ├── upfly1_1.png │ │ ├── upfly1_2.png │ │ ├── upfly1_3.png │ │ ├── upfly1_4.png │ │ ├── upfly1_5.png │ │ ├── upfly1_6.png │ │ ├── upfly1_7.png │ │ ├── upfly1_8.png │ │ └── upfly1_9.png │ └── towers │ │ ├── base_0_1.png │ │ ├── base_1.png │ │ ├── base_2.png │ │ ├── base_3.png │ │ ├── base_4.png │ │ ├── base_5.png │ │ ├── base_6.png │ │ ├── bomb_lv2_post_1.png │ │ ├── bomb_lv2_post_2.png │ │ ├── bomb_lv2_post_3.png │ │ ├── bomb_lv2_post_4.png │ │ ├── bomb_lv2_post_5.png │ │ ├── bomb_lv2_pre_1.png │ │ ├── bomb_lv2_pre_2.png │ │ ├── bomb_lv2_pre_3.png │ │ ├── bomb_lv2_pre_4.png │ │ ├── bomb_lv2_pre_5.png │ │ ├── bomb_lv2_reload_1.png │ │ ├── bomb_lv2_reload_2.png │ │ ├── bomb_lv2_reload_3.png │ │ ├── bomb_lv2_reload_4.png │ │ ├── bomb_lv2_reload_5.png │ │ ├── bomb_lv2_reload_6.png │ │ ├── bomb_lv2_reload_7.png │ │ ├── bomb_lv2_reload_8.png │ │ ├── bomb_lv3_post_1.png │ │ ├── bomb_lv3_post_2.png │ │ ├── bomb_lv3_post_3.png │ │ ├── bomb_lv3_post_4.png │ │ ├── bomb_lv3_post_5.png │ │ ├── bomb_lv3_pre_1.png │ │ ├── bomb_lv3_pre_2.png │ │ ├── bomb_lv3_pre_3.png │ │ ├── bomb_lv3_pre_4.png │ │ ├── bomb_lv3_pre_5.png │ │ ├── bomb_lv3_reload_1.png │ │ ├── bomb_lv3_reload_2.png │ │ ├── bomb_lv3_reload_3.png │ │ ├── bomb_lv3_reload_4.png │ │ ├── bomb_lv3_reload_5.png │ │ ├── bomb_lv3_reload_6.png │ │ ├── bomb_lv3_reload_7.png │ │ ├── bomb_lv3_reload_8.png │ │ ├── bomb_post_1.png │ │ ├── bomb_post_2.png │ │ ├── bomb_post_3.png │ │ ├── bomb_post_4.png │ │ ├── bomb_post_5.png │ │ ├── bomb_pre_1.png │ │ ├── bomb_pre_2.png │ │ ├── bomb_pre_3.png │ │ ├── bomb_pre_4.png │ │ ├── bomb_pre_5.png │ │ ├── bomb_reload_1.png │ │ ├── bomb_reload_2.png │ │ ├── bomb_reload_3.png │ │ ├── bomb_reload_4.png │ │ ├── bomb_reload_5.png │ │ ├── bomb_reload_6.png │ │ ├── bomb_reload_7.png │ │ ├── bomb_reload_8.png │ │ ├── default_tower_lv2_post_1.png │ │ ├── default_tower_lv2_post_2.png │ │ ├── default_tower_lv2_post_3.png │ │ ├── default_tower_lv2_post_4.png │ │ ├── default_tower_lv2_pre_1.png │ │ ├── default_tower_lv2_pre_2.png │ │ ├── default_tower_lv2_pre_3.png │ │ ├── default_tower_lv2_pre_4.png │ │ ├── default_tower_lv2_reload_1.png │ │ ├── default_tower_lv2_reload_2.png │ │ ├── default_tower_lv2_reload_3.png │ │ ├── default_tower_lv2_reload_4.png │ │ ├── default_tower_lv3_post_1.png │ │ ├── default_tower_lv3_post_2.png │ │ ├── default_tower_lv3_post_3.png │ │ ├── default_tower_lv3_post_4.png │ │ ├── default_tower_lv3_pre_1.png │ │ ├── default_tower_lv3_pre_2.png │ │ ├── default_tower_lv3_pre_3.png │ │ ├── default_tower_lv3_pre_4.png │ │ ├── default_tower_lv3_reload_1.png │ │ ├── default_tower_lv3_reload_2.png │ │ ├── default_tower_lv3_reload_3.png │ │ ├── default_tower_lv3_reload_4.png │ │ ├── default_tower_post_1.png │ │ ├── default_tower_post_2.png │ │ ├── default_tower_post_3.png │ │ ├── default_tower_post_4.png │ │ ├── default_tower_pre_1.png │ │ ├── default_tower_pre_2.png │ │ ├── default_tower_pre_3.png │ │ ├── default_tower_pre_4.png │ │ ├── default_tower_reload_1.png │ │ ├── default_tower_reload_2.png │ │ ├── default_tower_reload_3.png │ │ ├── default_tower_reload_4.png │ │ ├── empty_1.png │ │ ├── laser_lv2_post_1.png │ │ ├── laser_lv2_post_2.png │ │ ├── laser_lv2_post_3.png │ │ ├── laser_lv2_post_4.png │ │ ├── laser_lv2_pre_1.png │ │ ├── laser_lv2_pre_2.png │ │ ├── laser_lv2_pre_3.png │ │ ├── laser_lv2_pre_4.png │ │ ├── laser_lv2_reload_1.png │ │ ├── laser_lv2_reload_2.png │ │ ├── laser_lv2_reload_3.png │ │ ├── laser_lv2_reload_4.png │ │ ├── laser_lv2_reload_5.png │ │ ├── laser_lv2_reload_6.png │ │ ├── laser_lv2_reload_7.png │ │ ├── laser_lv3_post_1.png │ │ ├── laser_lv3_post_2.png │ │ ├── laser_lv3_post_3.png │ │ ├── laser_lv3_post_4.png │ │ ├── laser_lv3_pre_1.png │ │ ├── laser_lv3_pre_2.png │ │ ├── laser_lv3_pre_3.png │ │ ├── laser_lv3_pre_4.png │ │ ├── laser_lv3_reload_1.png │ │ ├── laser_lv3_reload_2.png │ │ ├── laser_lv3_reload_3.png │ │ ├── laser_lv3_reload_4.png │ │ ├── laser_lv3_reload_5.png │ │ ├── laser_lv3_reload_6.png │ │ ├── laser_lv3_reload_7.png │ │ ├── laser_post_1.png │ │ ├── laser_post_2.png │ │ ├── laser_post_3.png │ │ ├── laser_post_4.png │ │ ├── laser_pre_1.png │ │ ├── laser_pre_2.png │ │ ├── laser_pre_3.png │ │ ├── laser_pre_4.png │ │ ├── laser_reload_1.png │ │ ├── laser_reload_2.png │ │ ├── laser_reload_3.png │ │ ├── laser_reload_4.png │ │ ├── laser_reload_5.png │ │ ├── laser_reload_6.png │ │ ├── laser_reload_7.png │ │ ├── support_lv2_reload_1.png │ │ ├── support_lv2_reload_2.png │ │ ├── support_lv2_reload_3.png │ │ ├── support_lv2_reload_4.png │ │ ├── support_lv2_reload_5.png │ │ ├── support_lv2_reload_6.png │ │ ├── support_lv2_reload_7.png │ │ ├── support_lv2_reload_8.png │ │ ├── support_lv3_reload_1.png │ │ ├── support_lv3_reload_2.png │ │ ├── support_lv3_reload_3.png │ │ ├── support_lv3_reload_4.png │ │ ├── support_lv3_reload_5.png │ │ ├── support_lv3_reload_6.png │ │ ├── support_lv3_reload_7.png │ │ ├── support_lv3_reload_8.png │ │ ├── support_reload_1.png │ │ ├── support_reload_2.png │ │ ├── support_reload_3.png │ │ ├── support_reload_4.png │ │ ├── support_reload_5.png │ │ ├── support_reload_6.png │ │ ├── support_reload_7.png │ │ └── support_reload_8.png ├── levels │ ├── level_1.json │ ├── level_2.json │ └── level_3.json ├── sounds │ ├── button_click.mp3 │ ├── epic_boss.mp3 │ ├── game_over_sound.mp3 │ ├── game_sound.mp3 │ ├── game_won_sound.mp3 │ ├── menu_sound.mp3 │ ├── new_wave_sound.mp3 │ ├── not_enough_money_sound.mp3 │ ├── particle_sound_0.mp3 │ ├── particle_sound_1.mp3 │ ├── particle_sound_2.mp3 │ ├── particle_sound_3.mp3 │ ├── particle_sound_4.mp3 │ ├── particle_sound_5.mp3 │ ├── particle_sound_6.mp3 │ ├── particle_sound_7.mp3 │ ├── sale_sound.mp3 │ └── titles_sound.mp3 └── translations │ ├── translation_en_US.qm │ ├── translation_en_US.ts │ ├── translation_ru_RU.qm │ └── translation_ru_RU.ts └── techvscats.pro /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | check: 7 | runs-on: ubuntu-20.04 8 | 9 | steps: 10 | - uses: actions/checkout@v2 11 | 12 | - name: Update packages list 13 | run: sudo apt update 14 | 15 | - name: Install packages 16 | run: sudo apt install cppcheck python3-pip -y 17 | 18 | - name: Install cpplint 19 | run: pip3 install cpplint 20 | 21 | - name: Run cppcheck (unused functions) 22 | working-directory: ${{runner.workspace}}/${{github.event.repository.name}} 23 | shell: bash 24 | run: cppcheck --enable=unusedFunction --language=c++ $(find -name "*.h" -o -name "*.cpp") 25 | continue-on-error: true 26 | 27 | - name: Run cppcheck (warnings and preformance issues) 28 | working-directory: ${{runner.workspace}}/${{github.event.repository.name}} 29 | shell: bash 30 | run: cppcheck --enable=warning,performance --language=c++ $(find -name "*.h" -o -name "*.cpp") 31 | continue-on-error: true 32 | 33 | - name: Run cpplint 34 | working-directory: ${{runner.workspace}}/${{github.event.repository.name}} 35 | shell: bash 36 | run: $HOME/.local/bin/cpplint --filter=-legal/copyright,-build/include_subdir,-build/c++11,-build/include_order $(find -name "*.h" -o -name "*.cpp") 37 | 38 | build: 39 | runs-on: ubuntu-20.04 40 | 41 | steps: 42 | - uses: actions/checkout@v2 43 | 44 | - name: Add PPA 45 | run: sudo add-apt-repository ppa:beineri/opt-qt-5.15.2-focal -y 46 | 47 | - name: Update packages list 48 | run: sudo apt update 49 | 50 | - name: Install packages 51 | run: sudo apt install libglu1-mesa-dev libgl1-mesa-dev qt515base qt515multimedia qt515websockets -y 52 | 53 | - name: Configure QMake 54 | run: sudo /opt/qt515/bin/qt515-env.sh 55 | 56 | - name: Create Makefile 57 | working-directory: ${{runner.workspace}}/${{github.event.repository.name}} 58 | run: cmake -DCMAKE_PREFIX_PATH=/opt/qt515/lib/cmake -DCMAKE_BUILD_TYPE=Release ./CMakeLists.txt || /opt/qt515/bin/qmake -makefile 59 | 60 | - name: Build 61 | working-directory: ${{runner.workspace}}/${{github.event.repository.name}} 62 | run: make 63 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build-techvscats/ 2 | .idea/ 3 | cmake-build-debug/ 4 | cmake-build-release/ 5 | cpplint.py 6 | techvscats.pro.user* 7 | Server/server.pro.user* 8 | Server/server.pro.autosave 9 | build-server-Desktop_Qt_5_13_0_MinGW_32_bit-Debug/ 10 | build-server-Desktop_Qt_5_13_0_MinGW_32_bit-Release/ 11 | /android/android_release.keystore 12 | /android/keystore.properties 13 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | os: linux 2 | dist: bionic 3 | language: cpp 4 | compiler: gcc 5 | sudo: required 6 | 7 | before_install: 8 | - sudo add-apt-repository ppa:beineri/opt-qt-5.14.1-bionic -y 9 | - sudo apt update 10 | - sudo apt install libglu1-mesa-dev libgl1-mesa-dev qt514base qt514websockets qt514multimedia python-pip cppcheck -y 11 | - pip install cpplint 12 | 13 | install: 14 | - source /opt/qt5*/bin/qt5*-env.sh 15 | - /opt/qt5*/bin/qmake PREFIX=/usr || cmake CMakeLists.txt 16 | 17 | script: 18 | - make 19 | - rm ./qrc_* || true 20 | - rm ./moc* || true 21 | - rm ./ui* || true 22 | - rm -rf ./CMakeFiles ./box2d ./src/box2d || true 23 | - cppcheck --enable=unusedFunction --language=c++ $(find -name "*.h" -o -name "*.cpp") 24 | - cppcheck --enable=warning,performance --language=c++ $(find -name "*.h" -o -name "*.cpp") 25 | - cpplint --filter=-legal/copyright,-build/include_subdir,-build/c++11,-build/include_order $(find -name "*.h" -o -name "*.cpp") 26 | 27 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.10) 2 | project(techvscats) 3 | 4 | set(CMAKE_CXX_STANDARD 17) 5 | 6 | set(CMAKE_AUTOMOC ON) # Enable Qt MOC compiler 7 | set(CMAKE_AUTORCC ON) # Enable Qt resources compiler 8 | set(CMAKE_AUTOUIC ON) # Enable Qt UI compiler 9 | 10 | # You can set CMake prefix path here or pass it to CMake executable. 11 | #set(CMAKE_PREFIX_PATH "~/Qt/5.15.2/gcc_64/lib/cmake") 12 | #set(CMAKE_PREFIX_PATH "C:/Qt/5.15.2/mingw81_64/lib/cmake") 13 | 14 | if (NOT CMAKE_PREFIX_PATH) 15 | message(WARNING "CMAKE_PREFIX_PATH is not defined, you may need to set it " 16 | "(-DCMAKE_PREFIX_PATH=\"path/to/Qt/lib/cmake\")") 17 | endif () 18 | 19 | set(QT_VERSION 5) 20 | set(REQUIRED_LIBS Core Widgets Multimedia WebSockets) 21 | set(REQUIRED_LIBS_QUALIFIED Qt5::Core Qt5::Widgets Qt5::Multimedia Qt5::WebSockets) 22 | find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED) 23 | 24 | set(CMAKE_INCLUDE_CURRENT_DIR ON) 25 | set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-Wall -Wextra -O3") 26 | 27 | set(SOURCES 28 | main.cpp 29 | Controller/controller.cpp 30 | Controller/multiplayer_client.cpp 31 | Controller/spawner.cpp 32 | GameObject/abstract_projectile.cpp 33 | GameObject/homing_projectile.cpp 34 | GameObject/auric_field.cpp 35 | GameObject/base.cpp 36 | GameObject/bomb_projectile.cpp 37 | GameObject/building.cpp 38 | GameObject/effect.cpp 39 | GameObject/enemy.cpp 40 | GameObject/game_object.cpp 41 | GameObject/laser_projectile.cpp 42 | GameObject/moving_object.cpp 43 | GameObject/particle_handler.cpp 44 | GameObject/particle.cpp 45 | Model/coordinate.cpp 46 | Model/model.cpp 47 | Model/music_player.cpp 48 | Model/road.cpp 49 | Model/size.cpp 50 | Server/message.cpp 51 | Model/sound_vector.cpp 52 | database.qrc music.qrc images.qrc 53 | View/animation_player.cpp 54 | View/animation_player.cpp 55 | View/button_handler.cpp 56 | View/info_field.cpp 57 | View/menu_button.cpp 58 | View/size_handler.cpp 59 | View/text_notification.cpp 60 | View/tower_menu.cpp 61 | View/view.cpp 62 | View/global_chat.cpp) 63 | 64 | qt5_add_big_resources(RESOURCES database.qrc music.qrc images.qrc) 65 | add_executable(${PROJECT_NAME} ${SOURCES} ${RESOURCES}) 66 | target_link_libraries(${PROJECT_NAME} ${REQUIRED_LIBS_QUALIFIED}) 67 | 68 | add_executable(server 69 | Server/main.cpp 70 | Server/message.cpp 71 | Server/server.cpp) 72 | target_link_libraries(server Qt5::Core Qt5::WebSockets) 73 | -------------------------------------------------------------------------------- /Controller/abstract_controller.h: -------------------------------------------------------------------------------- 1 | #ifndef CONTROLLER_ABSTRACT_CONTROLLER_H_ 2 | #define CONTROLLER_ABSTRACT_CONTROLLER_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | #include 9 | 10 | #include "GameObject/abstract_projectile.h" 11 | #include "GameObject/base.h" 12 | #include "GameObject/building.h" 13 | #include "GameObject/enemy.h" 14 | #include "GameObject/particle.h" 15 | #include "View/text_notification.h" 16 | #include "Model/music_player.h" 17 | #include "multiplayer_client.h" 18 | 19 | enum class GameStatus { 20 | kWin = 0, 21 | kLose = 1, 22 | kPlay = 2 23 | }; 24 | 25 | enum class Speed { 26 | kZeroSpeed, 27 | kNormalSpeed, 28 | kDoubleSpeed 29 | }; 30 | 31 | enum class WindowType { 32 | kMainMenu, 33 | kSettings, 34 | kTitles, 35 | kPauseMenu, 36 | kGame, 37 | }; 38 | 39 | // AbstractController is needed to avoid the problem with looping include 40 | // All public methods of controller should also be written here 41 | class AbstractController { 42 | public: 43 | virtual ~AbstractController() = default; 44 | 45 | virtual void SecondConstructorPart() = 0; 46 | 47 | virtual void StartGame(int level) = 0; 48 | virtual void Tick(int current_time) = 0; 49 | virtual void EndGame() = 0; 50 | virtual void SetSpeedCoefficient(Speed speed, 51 | bool notify_button_handler) = 0; 52 | virtual void SetBuilding(int index_in_buildings, int replacing_id) = 0; 53 | 54 | virtual void MouseEvent(Coordinate position, bool is_press) = 0; 55 | virtual void RescaleObjects(const SizeHandler& size_handler) = 0; 56 | 57 | virtual const Building& GetBuildingById(int instance_id) const = 0; 58 | virtual const std::list& GetParticles() const = 0; 59 | virtual const std::list>& GetEnemies() const = 0; 60 | virtual const std::list>& 61 | GetProjectiles() const = 0; 62 | virtual const std::vector>& 63 | GetBuildings() const = 0; 64 | virtual const std::list& GetTextNotifications() const = 0; 65 | virtual void ClearTextNotifications() = 0; 66 | 67 | virtual const Base& GetBase() const = 0; 68 | virtual int GetCurrentTime() const = 0; 69 | virtual GameStatus GetCurrentStatus() const = 0; 70 | 71 | virtual const AnimationPlayer& GetBackground(WindowType type) const = 0; 72 | 73 | virtual const QPixmap& GetEmptyZoneTexture(WindowType type) const = 0; 74 | virtual const AnimationPlayer& GetInterface() const = 0; 75 | 76 | virtual int GetCurrentRoundNumber() const = 0; 77 | virtual int GetRoundsCount() const = 0; 78 | virtual void SetGameVolume(int volume) = 0; 79 | virtual void ChangeChatStyle() = 0; 80 | 81 | virtual void CreateTitles() = 0; 82 | virtual void EndTitles() = 0; 83 | virtual void BeginNextLevel() = 0; 84 | 85 | virtual MusicPlayer* GetMusicPlayer() = 0; 86 | virtual MultiplayerClient* GetClient() = 0; 87 | 88 | virtual void PauseMusic() = 0; 89 | virtual void ResumeMusic() = 0; 90 | }; 91 | 92 | #endif // CONTROLLER_ABSTRACT_CONTROLLER_H_ 93 | -------------------------------------------------------------------------------- /Controller/multiplayer_client.h: -------------------------------------------------------------------------------- 1 | #ifndef CONTROLLER_MULTIPLAYER_CLIENT_H_ 2 | #define CONTROLLER_MULTIPLAYER_CLIENT_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | #include "Server/message.h" 17 | #include "Model/constants.h" 18 | 19 | // The multiplayer client is responsible for the connection between the game 20 | // and the server. 21 | class MultiplayerClient : public QObject { 22 | Q_OBJECT 23 | 24 | public: 25 | MultiplayerClient(); 26 | ~MultiplayerClient() override; 27 | 28 | void Tick(int delta_time); 29 | void LoadDatabase(); 30 | void Connect(); 31 | void Disconnect(); 32 | 33 | // Send 34 | void SendMessageToServer(const Message& message) const; 35 | void Register(const QString& nick_name); 36 | void EnterRoom(int level_id); 37 | void RoundCompleted(int base_current_health, int completed_game_process); 38 | void LeaveRoom(); 39 | 40 | // Receive 41 | bool IsReceivedMessageEmpty() const; 42 | const std::list& GetReceivedMessage() const; 43 | void ClearReceivedMessage(); 44 | 45 | bool IsRegistered() const; 46 | void ChangePermissionToStartRound(bool permission); 47 | bool IsOnline() const; 48 | bool HasPermissionToStartRound() const; 49 | 50 | void NewClientMessage(const QString& messages); 51 | void ProcessCommand(QString command); 52 | 53 | void CreateVisibleMessage(const Message& message); 54 | 55 | private slots: // NOLINT 56 | void OnConnect(); 57 | void OnMessageReceived(const QByteArray& array); 58 | void onClose(); 59 | 60 | private: 61 | QString nick_name_ = ""; 62 | QWebSocket* server_web_socket_{}; 63 | // const QString address_ = "ws://localhost:1234"; 64 | const QString address_ = "ws://49.12.75.135:1234"; 65 | const int kMaxMessageSize_ = 120; 66 | bool is_online_ = false; 67 | bool is_end_round_message_sent_ = true; 68 | bool has_permission_to_start_round_ = true; 69 | std::list received_message_; 70 | static std::mt19937 random_generator_; 71 | 72 | int wait_time_ = 0; 73 | int current_time_ = 0; 74 | bool is_trying_to_connect_ = false; 75 | const int kWaitTime_ = 3000; 76 | 77 | std::vector database_; 78 | 79 | private: 80 | QString AutoGenerateNickName() const; 81 | const QStringList first_name_ = {"Greedy", "Bloody", "Big", "Optimus"}; 82 | const QStringList surname_ = {"finger", "cup", "flex", "cringe", "sage"}; 83 | }; 84 | 85 | #endif // CONTROLLER_MULTIPLAYER_CLIENT_H_ 86 | -------------------------------------------------------------------------------- /Controller/spawner.cpp: -------------------------------------------------------------------------------- 1 | #include "spawner.h" 2 | 3 | Spawner::Spawner(const EnemyGroup& group_to_spawn) 4 | : group_to_spawn_(group_to_spawn) {} 5 | 6 | void Spawner::Tick(int current_time) { 7 | if (current_time < group_to_spawn_.time_of_next_spawn) { 8 | return; 9 | } 10 | unit_pending_ = true; 11 | group_to_spawn_.time_of_next_spawn += group_to_spawn_.spawn_period; 12 | group_to_spawn_.group_size--; 13 | if (group_to_spawn_.group_size == 0) { 14 | is_dead_ = true; 15 | } 16 | } 17 | 18 | int Spawner::PrepareNextEnemyId() { 19 | unit_pending_ = false; 20 | return group_to_spawn_.enemy_id; 21 | } 22 | 23 | int Spawner::GetRoad() const { 24 | return group_to_spawn_.road_to_spawn; 25 | } 26 | 27 | bool Spawner::IsReadyToSpawn() const { 28 | return unit_pending_; 29 | } 30 | 31 | bool Spawner::IsDead() const { 32 | return is_dead_; 33 | } 34 | -------------------------------------------------------------------------------- /Controller/spawner.h: -------------------------------------------------------------------------------- 1 | #ifndef CONTROLLER_SPAWNER_H_ 2 | #define CONTROLLER_SPAWNER_H_ 3 | 4 | #include 5 | 6 | #include "GameObject/enemy.h" 7 | #include "Model/enemy_group.h" 8 | #include "Model/road.h" 9 | 10 | // The Spawner is installed on the road, and creates enemies from wave. 11 | // It does not process or edit the Game data it received, working only with 12 | // time and Wave/Road, which are also available to the controller 13 | class Spawner { 14 | public: 15 | explicit Spawner(const EnemyGroup& wave); 16 | 17 | void Tick(int current_time); 18 | 19 | int PrepareNextEnemyId(); 20 | int GetRoad() const; 21 | bool IsReadyToSpawn() const; 22 | bool IsDead() const; 23 | 24 | private: 25 | bool unit_pending_ = false; 26 | bool is_dead_ = false; 27 | EnemyGroup group_to_spawn_; 28 | }; 29 | 30 | #endif // CONTROLLER_SPAWNER_H_ 31 | -------------------------------------------------------------------------------- /GameObject/abstract_projectile.cpp: -------------------------------------------------------------------------------- 1 | #include "abstract_projectile.h" 2 | 3 | AbstractProjectile::AbstractProjectile(Size size, double speed) 4 | : MovingObject(size, speed) {} 5 | 6 | AbstractProjectile::AbstractProjectile(const AbstractProjectile& other) : 7 | MovingObject(other.size_, other.speed_, other.position_) { 8 | SetAnimationPlayers(other.animation_players_); 9 | particle_handler_.SetParticlePacks(other.particle_handler_); 10 | } 11 | 12 | void AbstractProjectile::Move() { 13 | MoveToDestination(); 14 | if (position_ == destination_) { 15 | particle_handler_.PlayOwnerDeath(); 16 | is_end_reached_ = true; 17 | is_dead_ = true; 18 | } 19 | } 20 | 21 | void AbstractProjectile::SetParameters( 22 | const std::shared_ptr& aim, Coordinate position, 23 | double speed_coefficient, double damage) { 24 | aim_ = aim; 25 | position_ = position; 26 | speed_ = speed_ * speed_coefficient; 27 | damage_ = damage; 28 | if (aim != nullptr) { 29 | destination_ = aim->GetPosition(); 30 | } 31 | } 32 | 33 | double AbstractProjectile::GetDamage() const { 34 | return damage_; 35 | } 36 | 37 | bool AbstractProjectile::IsInAffectedArea(const Enemy& enemy) { 38 | return position_.GetVectorTo(enemy.GetPosition()).GetLength() 39 | <= constants::kEpsilon; 40 | } 41 | -------------------------------------------------------------------------------- /GameObject/abstract_projectile.h: -------------------------------------------------------------------------------- 1 | #ifndef GAMEOBJECT_ABSTRACT_PROJECTILE_H_ 2 | #define GAMEOBJECT_ABSTRACT_PROJECTILE_H_ 3 | 4 | #include 5 | #include 6 | 7 | #include "enemy.h" 8 | 9 | class AbstractProjectile : public MovingObject { 10 | public: 11 | AbstractProjectile(Size size, double speed); 12 | AbstractProjectile(const AbstractProjectile& other); 13 | ~AbstractProjectile() override = default; 14 | 15 | void Move() override; 16 | 17 | virtual void SetParameters(const std::shared_ptr& aim, 18 | Coordinate position, double speed_coefficient, 19 | double damage); 20 | 21 | double GetDamage() const; 22 | virtual bool IsInAffectedArea(const Enemy& enemy); 23 | 24 | protected: 25 | std::shared_ptr aim_ = {}; 26 | double damage_ = 0; 27 | }; 28 | 29 | #endif // GAMEOBJECT_ABSTRACT_PROJECTILE_H_ 30 | -------------------------------------------------------------------------------- /GameObject/auric_field.cpp: -------------------------------------------------------------------------------- 1 | #include "auric_field.h" 2 | 3 | AuricField::AuricField(double effect_radius, int effect_id) 4 | : effect_radius_(effect_radius), effect_id_(effect_id) {} 5 | 6 | void AuricField::Draw(QPainter* painter, const SizeHandler& size_handler, 7 | Coordinate position) const { 8 | if (!IsValid() && position == Coordinate(-1000, -1000)) { 9 | return; 10 | } 11 | painter->save(); 12 | 13 | if (position == Coordinate(-1000, -1000)) { 14 | position = *carrier_coordinate_; 15 | } 16 | 17 | painter->setPen(Qt::transparent); 18 | Coordinate point = size_handler.GameToWindowCoordinate(position); 19 | Size size = size_handler.GameToWindowSize( 20 | Size(effect_radius_, effect_radius_)); 21 | 22 | Coordinate gradient_center = 23 | size_handler.GameToWindowCoordinate(position); 24 | 25 | QRadialGradient gradient(gradient_center.x, 26 | gradient_center.y * 1 27 | / constants::kSemiMinorCoefficient, 28 | size.width); 29 | 30 | QColor color(Qt::blue); 31 | color.setAlpha(60); 32 | gradient.setColorAt(0, Qt::transparent); 33 | gradient.setColorAt(0.80, Qt::transparent); 34 | gradient.setColorAt(1, color); 35 | painter->setBrush(gradient); 36 | painter->scale(1, constants::kSemiMinorCoefficient); 37 | 38 | painter->drawEllipse(QPointF(point.x, 39 | point.y * 1 / constants::kSemiMinorCoefficient), 40 | size.width, 41 | size.height); 42 | painter->restore(); 43 | } 44 | 45 | void AuricField::SetCarrierCoordinate(Coordinate* carrier_coordinates) { 46 | carrier_coordinate_ = carrier_coordinates; 47 | } 48 | 49 | int AuricField::GetEffectId() const { 50 | return effect_id_; 51 | } 52 | 53 | bool AuricField::IsInRadius(const Coordinate& coordinate) const { 54 | return coordinate.IsInEllipse(*carrier_coordinate_, 55 | effect_radius_); 56 | } 57 | 58 | bool AuricField::IsValid() const { 59 | return effect_id_ != -1; 60 | } 61 | -------------------------------------------------------------------------------- /GameObject/auric_field.h: -------------------------------------------------------------------------------- 1 | #ifndef GAMEOBJECT_AURIC_FIELD_H_ 2 | #define GAMEOBJECT_AURIC_FIELD_H_ 3 | 4 | #include 5 | #include 6 | 7 | #include "Model/constants.h" 8 | #include "Model/coordinate.h" 9 | #include "View/size_handler.h" 10 | 11 | class AuricField { 12 | public: 13 | explicit AuricField(double effect_radius = -1, int effect_id = -1); 14 | 15 | void Draw(QPainter* painter, const SizeHandler& size_handler, 16 | Coordinate position = {-1000, -1000}) const; 17 | 18 | void SetCarrierCoordinate(Coordinate* carrier_coordinates); 19 | int GetEffectId() const; 20 | bool IsInRadius(const Coordinate& coordinate) const; 21 | bool IsValid() const; 22 | 23 | private: 24 | double effect_radius_; 25 | int effect_id_; 26 | Coordinate* carrier_coordinate_ = nullptr; 27 | }; 28 | 29 | #endif // GAMEOBJECT_AURIC_FIELD_H_ 30 | -------------------------------------------------------------------------------- /GameObject/base.h: -------------------------------------------------------------------------------- 1 | #ifndef GAMEOBJECT_BASE_H_ 2 | #define GAMEOBJECT_BASE_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include 11 | #include "game_object.h" 12 | 13 | class Base : public GameObject { 14 | public: 15 | Base(int gold, Size size, Coordinate position, double max_health); 16 | ~Base() override = default; 17 | 18 | void Tick(int current_time) override; 19 | void Draw(QPainter* painter, const SizeHandler& size_handler) const override; 20 | void DrawUI(QPainter* painter, const SizeHandler& size_handler) const; 21 | void DecreaseHealth(double damage); 22 | void SetImmortal(); 23 | 24 | int GetGold() const; 25 | double GetCurrentHealth() const; 26 | Coordinate GetGoldPosition() const; 27 | Size GetGoldSize() const; 28 | 29 | void AddGoldAmount(int gold_amount); 30 | void SubtractGoldAmount(int gold_amount); 31 | 32 | bool IsDead() const; 33 | 34 | private: 35 | int gold_; 36 | double max_health_; 37 | double current_health_; 38 | 39 | bool is_dead_ = false; 40 | bool is_immortal_ = false; 41 | 42 | const Coordinate kHealthPosition = Coordinate(1748, 811); 43 | const Size kHealthSize = Size(167, 167); 44 | const Coordinate kGoldPosition = Coordinate(1581, 1002); 45 | const Size kGoldSize = Size(164, 57); 46 | const double kHealthFlameTheshold = 0.8; 47 | const int kFlameSpawnSpeed = 3000; 48 | 49 | static std::mt19937 random_generator_; 50 | }; 51 | 52 | #endif // GAMEOBJECT_BASE_H_ 53 | -------------------------------------------------------------------------------- /GameObject/bomb_projectile.cpp: -------------------------------------------------------------------------------- 1 | #include "bomb_projectile.h" 2 | 3 | BombProjectile::BombProjectile(Size size, double speed, double effect_radius, 4 | double up_force) 5 | : AbstractProjectile(size, speed), 6 | effect_radius_(effect_radius), 7 | up_force_(up_force), 8 | start_position_({0, 0}) {} 9 | 10 | BombProjectile::BombProjectile(const BombProjectile& other) 11 | : AbstractProjectile(other), effect_radius_(other.effect_radius_), 12 | up_force_(other.up_force_), start_position_(position_) { 13 | } 14 | 15 | void BombProjectile::Tick(int current_time) { 16 | UpdateTime(current_time); 17 | double percent = (position_.x - destination_.x) / 18 | (start_position_.x - destination_.x); 19 | additional_draw_height_ += up_force_ * (1 - 2 * percent) * 20 | delta_time_ / constants::kTimeScale; 21 | Move(); 22 | animation_players_[0].Tick(delta_time_); 23 | } 24 | 25 | void BombProjectile::Draw(QPainter* painter, const SizeHandler& handler) const { 26 | painter->save(); 27 | 28 | Coordinate bomb_position = position_; 29 | bomb_position.y += additional_draw_height_; 30 | Coordinate point = handler.GameToWindowCoordinate( 31 | bomb_position - size_ / 2); 32 | painter->drawPixmap(point.x, point.y, 33 | animation_players_[0].GetCurrentFrame()); 34 | 35 | painter->restore(); 36 | } 37 | 38 | void BombProjectile::SetParameters(const std::shared_ptr& aim, 39 | Coordinate position, 40 | double speed_coefficient, double damage) { 41 | start_position_ = position; 42 | AbstractProjectile::SetParameters(aim, position, speed_coefficient, damage); 43 | destination_ = aim_->GetPredictPosition(); 44 | } 45 | 46 | bool BombProjectile::IsInAffectedArea(const Enemy& enemy) { 47 | return position_.IsInEllipse(enemy.GetPosition(), effect_radius_); 48 | } 49 | -------------------------------------------------------------------------------- /GameObject/bomb_projectile.h: -------------------------------------------------------------------------------- 1 | #ifndef GAMEOBJECT_BOMB_PROJECTILE_H_ 2 | #define GAMEOBJECT_BOMB_PROJECTILE_H_ 3 | 4 | #include 5 | 6 | #include "abstract_projectile.h" 7 | 8 | class BombProjectile : public AbstractProjectile { 9 | public: 10 | explicit BombProjectile(Size size, double speed, double effect_radius, 11 | double up_force); 12 | BombProjectile(const BombProjectile& other); 13 | ~BombProjectile() override = default; 14 | 15 | 16 | void Tick(int current_time) override; 17 | void Draw(QPainter* painter, const SizeHandler& handler) const override; 18 | 19 | void SetParameters(const std::shared_ptr& aim, Coordinate position, 20 | double speed_coefficient, double damage) override; 21 | bool IsInAffectedArea(const Enemy& enemy) override; 22 | 23 | private: 24 | double effect_radius_; 25 | double up_force_; 26 | Coordinate start_position_; 27 | double additional_draw_height_ = 0; 28 | }; 29 | 30 | #endif // GAMEOBJECT_BOMB_PROJECTILE_H_ 31 | -------------------------------------------------------------------------------- /GameObject/building.h: -------------------------------------------------------------------------------- 1 | #ifndef GAMEOBJECT_BUILDING_H_ 2 | #define GAMEOBJECT_BUILDING_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include "abstract_projectile.h" 11 | #include "auric_field.h" 12 | #include "effect.h" 13 | #include "enemy.h" 14 | 15 | enum class Action { 16 | kWait = 0, 17 | kBeforeFire = 1, 18 | kAfterFire = 2 19 | }; 20 | 21 | class Building : public GameObject { 22 | public: 23 | explicit Building(int id, int settle_cost, const AuricField& aura, 24 | Size size = {150, 150}); 25 | Building(const Building& other); 26 | ~Building() override = default; 27 | 28 | void Tick(int current_time) override; 29 | void UpdateAim(const std::list>& enemies); 30 | void Draw(QPainter* painter, const SizeHandler& size_handler) const override; 31 | 32 | void SetProjectile(int projectile_id, double attack_damage, int attack_range, 33 | int max_aims, Size shooting_anchor); 34 | void SetReadyToCreateProjectileToFalse(); 35 | void SetTotalCost(int total_cost); 36 | void SetInfo(const QString& header, const QString& description); 37 | 38 | int GetId() const; 39 | int GetAttackRange() const; 40 | int GetProjectileId() const; 41 | double GetDamage() const; 42 | int GetCost() const; 43 | int GetTotalCost() const; 44 | 45 | const QString& GetHeader() const; 46 | const QString& GetDescription() const; 47 | uint32_t GetMaxAims() const; 48 | double GetProjectileSpeedCoefficient() const; 49 | Effect* GetAppliedEffect(); 50 | const AuricField& GetAuricField() const; 51 | const std::list>& GetAims() const; 52 | Size GetShootingAnchor() const; 53 | 54 | bool IsInside(Coordinate point) const; 55 | bool IsReadyToCreateProjectiles() const; 56 | bool IsInAttackRange(Coordinate coordinate) const; 57 | 58 | int GetReloadTime() const; 59 | 60 | const Effect& GetEffect() const; 61 | 62 | private: 63 | AuricField auric_field_; 64 | Effect applied_effect_ = Effect(EffectTarget::kBuilding); 65 | 66 | int id_ = 0; 67 | int cost_ = 0; 68 | int total_cost_ = 0; 69 | 70 | // action part 71 | Action action_ = Action::kWait; 72 | int wait_time_ = 0; 73 | 74 | int projectile_id_ = 0; 75 | int attack_range_ = 0; 76 | uint32_t max_aims_ = 0; 77 | double attack_damage_ = 0; 78 | Size shooting_anchor_ = {0, 0}; 79 | bool is_ready_to_create_projectiles_ = false; 80 | bool is_ready_to_shoot_ = false; 81 | std::list> aims_; 82 | 83 | QString header_; 84 | QString description_; 85 | }; 86 | 87 | #endif // GAMEOBJECT_BUILDING_H_ 88 | -------------------------------------------------------------------------------- /GameObject/effect.h: -------------------------------------------------------------------------------- 1 | #ifndef GAMEOBJECT_EFFECT_H_ 2 | #define GAMEOBJECT_EFFECT_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #include "Model/coordinate.h" 10 | #include "Model/size.h" 11 | #include "View/animation_player.h" 12 | #include "View/size_handler.h" 13 | 14 | enum class EffectTarget { 15 | kAny = 0, 16 | kEnemy = 1, 17 | kBuilding = 2 18 | }; 19 | 20 | enum class CoefficientType { 21 | kMoveSpeed, 22 | kArmor, 23 | kDamage, 24 | kAttackRate, 25 | kRange, 26 | }; 27 | 28 | struct EffectVisualization { 29 | AnimationPlayer reduced; 30 | AnimationPlayer increased; 31 | }; 32 | 33 | class Effect { 34 | public: 35 | explicit Effect(EffectTarget effect_type, 36 | double speed_coefficient = 1, 37 | double armor_coefficient = 1, 38 | double damage_coefficient = 1, 39 | double attack_rate_coefficient = 1, 40 | double range_coefficient = 1); 41 | 42 | void ResetEffect(); 43 | void DrawEffectsIcons(QPainter* painter, const SizeHandler& size_handler, 44 | Coordinate position, Size parent_size) const; 45 | 46 | static void SetEffectVisualizations( 47 | const std::vector& effect_visualization); 48 | static void Rescale(Size size); 49 | static Size GetSize(); 50 | 51 | EffectTarget GetEffectTarget() const; 52 | double GetMoveSpeedCoefficient() const; 53 | double GetArmorCoefficient() const; 54 | double GetDamageCoefficient() const; 55 | double GetAttackRateCoefficient() const; 56 | double GetRangeCoefficient() const; 57 | 58 | Effect& operator+=(const Effect& other); 59 | 60 | private: 61 | EffectTarget effect_target_; 62 | std::vector coefficients_; 63 | static std::vector effect_visualizations_; 64 | static const Size kSize; 65 | static const double kNearbyCoefficient; 66 | 67 | private: 68 | void DrawEffectIcon(QPainter* painter, Coordinate* point, Size size, 69 | CoefficientType coefficient_type) const; 70 | }; 71 | 72 | #endif // GAMEOBJECT_EFFECT_H_ 73 | -------------------------------------------------------------------------------- /GameObject/enemy.h: -------------------------------------------------------------------------------- 1 | #ifndef GAMEOBJECT_ENEMY_H_ 2 | #define GAMEOBJECT_ENEMY_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #include "auric_field.h" 10 | #include "effect.h" 11 | #include "moving_object.h" 12 | #include "Model/road.h" 13 | 14 | class Enemy : public MovingObject { 15 | public: 16 | Enemy(double speed, double damage, 17 | double armor, int reward, double max_health, Size size = {60, 60}, 18 | int priority = 1, AuricField auric_field = AuricField(-1, -1)); 19 | Enemy(const Enemy& other); 20 | ~Enemy() override = default; 21 | 22 | void Tick(int current_time) override; 23 | void Move() override; 24 | void Draw(QPainter* painter, const SizeHandler& size_handler) const override; 25 | void DrawHealthBar(QPainter* painter, const SizeHandler& size_handler) const; 26 | 27 | void SetRoad(const Road& road); 28 | void CopyPosition(const Enemy& instance, bool go_back = false); 29 | 30 | const AuricField& GetAuricField() const; 31 | Effect* GetAppliedEffect(); 32 | double GetDamage() const; 33 | int GetPriority() const; 34 | Coordinate GetPredictPosition(double predict_power = 1) const; 35 | void ReceiveDamage(double damage); 36 | int ComputeReward() const; 37 | 38 | // boss 39 | void SetBoss(bool is_boss); 40 | bool IsBoss() const; 41 | bool IsTimeToKill() const; 42 | 43 | void KillReload(); 44 | double GetKillRadius() const; 45 | 46 | private: 47 | double damage_; 48 | double armor_; 49 | int reward_; 50 | double max_health_; 51 | double current_health_; 52 | 53 | // if priority_ is zero, towers will shoot the enemy out of turn. 54 | // the greater the priority, the lesser amount of attention the enemy gets. 55 | // for now priority is in [0; 4]. 56 | int priority_; 57 | 58 | AuricField auric_field_; 59 | Effect applied_effect_ = Effect(EffectTarget::kEnemy); 60 | std::shared_ptr road_ = nullptr; 61 | int node_number_ = 0; 62 | 63 | static std::mt19937 random_generator_; 64 | 65 | const int kMoveShift = 20; 66 | Size health_bar_shift_ = {18, 24}; 67 | Size health_bar_size_ = {36, 5}; 68 | 69 | // boss 70 | bool is_boss_ = false; 71 | const double tower_kill_radius_ = 300; 72 | const int kill_reload_ = 16500; 73 | int wait_to_kill_ = kill_reload_ / 2; 74 | 75 | private: 76 | void ShiftCoordinate(Coordinate* coordinate); 77 | }; 78 | 79 | #endif // GAMEOBJECT_ENEMY_H_ 80 | -------------------------------------------------------------------------------- /GameObject/game_object.cpp: -------------------------------------------------------------------------------- 1 | #include "game_object.h" 2 | 3 | #include 4 | 5 | GameObject::GameObject(Size size, Coordinate position) 6 | : size_(size), position_(position), 7 | particle_handler_(size_, position_, delta_time_) { 8 | } 9 | 10 | void GameObject::UpdateTime(int current_time) { 11 | if (object_last_time_ != 0) { 12 | delta_time_ = current_time - object_last_time_; 13 | object_life_time_ += delta_time_; 14 | } 15 | object_last_time_ = current_time; 16 | } 17 | 18 | void GameObject::SetPosition(Coordinate position) { 19 | position_ = position; 20 | } 21 | 22 | void GameObject::SetAnimationPlayers( 23 | std::vector animation_players) { 24 | animation_players_ = std::move(animation_players); 25 | action_timings_.clear(); 26 | for (const auto& animation_player : animation_players_) { 27 | action_timings_.push_back(animation_player.GetAnimationDuration()); 28 | } 29 | } 30 | 31 | void GameObject::Rescale(Size to_size) { 32 | for (auto& player : animation_players_) { 33 | player.Rescale(to_size); 34 | } 35 | } 36 | 37 | Coordinate GameObject::GetPosition() const { 38 | return position_; 39 | } 40 | 41 | ParticleHandler* GameObject::GetParticleHandler() { 42 | return &particle_handler_; 43 | } 44 | 45 | Size GameObject::GetSize() const { 46 | return size_; 47 | } 48 | 49 | void GameObject::SetSize(Size size) { 50 | size_ = size; 51 | } 52 | -------------------------------------------------------------------------------- /GameObject/game_object.h: -------------------------------------------------------------------------------- 1 | #ifndef GAMEOBJECT_GAME_OBJECT_H_ 2 | #define GAMEOBJECT_GAME_OBJECT_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #include "particle_handler.h" 10 | #include "Model/coordinate.h" 11 | #include "Model/size.h" 12 | #include "View/size_handler.h" 13 | #include "View/animation_player.h" 14 | 15 | class GameObject { 16 | public: 17 | explicit GameObject(Size size, Coordinate position = {0, 0}); 18 | virtual ~GameObject() = default; 19 | 20 | virtual void Tick(int current_time) = 0; 21 | void UpdateTime(int current_time); 22 | virtual void Draw(QPainter* painter, 23 | const SizeHandler& size_handler) const = 0; 24 | 25 | void SetAnimationPlayers(std::vector animation_players); 26 | void Rescale(Size to_size); 27 | 28 | void SetPosition(Coordinate position); 29 | Coordinate GetPosition() const; 30 | ParticleHandler* GetParticleHandler(); 31 | Size GetSize() const; 32 | void SetSize(Size size); 33 | 34 | protected: 35 | std::vector animation_players_; 36 | std::vector action_timings_; 37 | Size size_; 38 | Coordinate position_; 39 | ParticleHandler particle_handler_; 40 | int object_life_time_ = 0; 41 | int delta_time_ = 0; 42 | 43 | private: 44 | int object_last_time_ = 0; 45 | }; 46 | 47 | #endif // GAMEOBJECT_GAME_OBJECT_H_ 48 | -------------------------------------------------------------------------------- /GameObject/homing_projectile.cpp: -------------------------------------------------------------------------------- 1 | #include "homing_projectile.h" 2 | 3 | HomingProjectile::HomingProjectile(Size size, double speed) 4 | : AbstractProjectile(size, speed) {} 5 | 6 | void HomingProjectile::Tick(int current_time) { 7 | UpdateTime(current_time); 8 | destination_ = aim_->GetPosition(); 9 | Move(); 10 | animation_players_[0].Tick(delta_time_); 11 | } 12 | 13 | void HomingProjectile::Draw(QPainter* painter, 14 | const SizeHandler& handler) const { 15 | painter->save(); 16 | Coordinate point = handler.GameToWindowCoordinate( 17 | position_ - size_ / 2); 18 | 19 | painter->drawPixmap(point.x, point.y, 20 | animation_players_[0].GetCurrentFrame()); 21 | 22 | painter->restore(); 23 | } 24 | -------------------------------------------------------------------------------- /GameObject/homing_projectile.h: -------------------------------------------------------------------------------- 1 | #ifndef GAMEOBJECT_HOMING_PROJECTILE_H_ 2 | #define GAMEOBJECT_HOMING_PROJECTILE_H_ 3 | 4 | #include "abstract_projectile.h" 5 | 6 | class HomingProjectile : public AbstractProjectile { 7 | public: 8 | HomingProjectile(Size size, double speed); 9 | HomingProjectile(const HomingProjectile& other) = default; 10 | ~HomingProjectile() override = default; 11 | 12 | void Tick(int current_time) override; 13 | void Draw(QPainter* painter, const SizeHandler& handler) const override; 14 | }; 15 | 16 | #endif // GAMEOBJECT_HOMING_PROJECTILE_H_ 17 | -------------------------------------------------------------------------------- /GameObject/laser_projectile.cpp: -------------------------------------------------------------------------------- 1 | #include "laser_projectile.h" 2 | 3 | LaserProjectile::LaserProjectile(Size size) 4 | : AbstractProjectile(size / 10, 0) {} 5 | 6 | void LaserProjectile::Tick(int current_time) { 7 | UpdateTime(current_time); 8 | animation_players_[0].Tick(delta_time_); 9 | if (object_life_time_ > action_timings_[0] || aim_->IsDead()) { 10 | position_ = aim_->GetPosition(); 11 | particle_handler_.PlayOwnerDeath(); 12 | is_end_reached_ = true; 13 | is_dead_ = true; 14 | } 15 | } 16 | 17 | void LaserProjectile::Draw(QPainter* painter, 18 | const SizeHandler& handler) const { 19 | painter->save(); 20 | Coordinate end_position = handler.GameToWindowCoordinate(aim_->GetPosition()); 21 | Coordinate start_position = handler.GameToWindowCoordinate(position_); 22 | Size size = handler.GameToWindowSize(size_); 23 | painter->setPen(QPen(QBrush(animation_players_[0].GetCurrentFrame()), 24 | size.width)); 25 | painter->drawLine(start_position.x, start_position.y, 26 | end_position.x, end_position.y); 27 | painter->restore(); 28 | } 29 | -------------------------------------------------------------------------------- /GameObject/laser_projectile.h: -------------------------------------------------------------------------------- 1 | #ifndef GAMEOBJECT_LASER_PROJECTILE_H_ 2 | #define GAMEOBJECT_LASER_PROJECTILE_H_ 3 | 4 | #include 5 | 6 | #include 7 | 8 | #include "abstract_projectile.h" 9 | 10 | class LaserProjectile : public AbstractProjectile { 11 | public: 12 | explicit LaserProjectile(Size size); 13 | LaserProjectile(const LaserProjectile& other) = default; 14 | ~LaserProjectile() override = default; 15 | 16 | void Tick(int current_time) override; 17 | void Draw(QPainter* painter, const SizeHandler& handler) const override; 18 | }; 19 | 20 | #endif // GAMEOBJECT_LASER_PROJECTILE_H_ 21 | -------------------------------------------------------------------------------- /GameObject/moving_object.cpp: -------------------------------------------------------------------------------- 1 | #include "moving_object.h" 2 | 3 | MovingObject::MovingObject(Size size, double speed, 4 | Coordinate position, Coordinate destination) 5 | : GameObject(size, position), 6 | speed_(speed), destination_(destination) {} 7 | 8 | bool MovingObject::IsEndReached() const { 9 | return is_end_reached_; 10 | } 11 | 12 | bool MovingObject::IsDead() const { 13 | return is_dead_; 14 | } 15 | 16 | void MovingObject::MoveToDestination() { 17 | Size move_direction = position_.GetVectorTo(destination_); 18 | 19 | if (move_direction.GetLength() > constants::kEpsilon) { 20 | move_direction /= move_direction.GetLength(); 21 | move_direction *= delta_time_ * speed_ / constants::kTimeScale; 22 | } 23 | auto first_vector = (position_ + move_direction).GetVectorTo(destination_); 24 | auto second_vector = position_.GetVectorTo(destination_); 25 | if (first_vector.width * second_vector.width <= constants::kEpsilon && 26 | first_vector.height * second_vector.height <= constants::kEpsilon) { 27 | position_ = destination_; 28 | } else { 29 | position_ += move_direction; 30 | } 31 | } 32 | 33 | void MovingObject::SetSpeed(double speed) { 34 | speed_ = speed; 35 | } 36 | double MovingObject::GetSpeed() const { 37 | return speed_; 38 | } 39 | -------------------------------------------------------------------------------- /GameObject/moving_object.h: -------------------------------------------------------------------------------- 1 | #ifndef GAMEOBJECT_MOVING_OBJECT_H_ 2 | #define GAMEOBJECT_MOVING_OBJECT_H_ 3 | 4 | #include "game_object.h" 5 | 6 | class MovingObject : public GameObject { 7 | public: 8 | MovingObject(Size size, double speed, Coordinate position = {0, 0}, 9 | Coordinate destination = {0, 0}); 10 | ~MovingObject() override = default; 11 | 12 | void MoveToDestination(); 13 | void SetSpeed(double speed); 14 | double GetSpeed() const; 15 | virtual void Move() = 0; 16 | virtual bool IsDead() const; 17 | bool IsEndReached() const; 18 | 19 | protected: 20 | double speed_; 21 | Coordinate destination_; 22 | bool is_end_reached_ = false; 23 | bool is_dead_ = false; 24 | double speed_coefficient_ = 1; 25 | }; 26 | 27 | #endif // GAMEOBJECT_MOVING_OBJECT_H_ 28 | -------------------------------------------------------------------------------- /GameObject/particle.cpp: -------------------------------------------------------------------------------- 1 | #include "particle.h" 2 | 3 | Particle::Particle(Size size, int repeat_number) 4 | : GameObject(size), repeat_number_(repeat_number) { 5 | } 6 | 7 | Particle::Particle(const Particle& other) 8 | : Particle(other.size_, other.repeat_number_) { 9 | SetAnimationPlayers(other.animation_players_); 10 | SetSoundId(other.sound_id_); 11 | } 12 | 13 | void Particle::Tick(int current_time) { 14 | UpdateTime(current_time); 15 | animation_players_[0].Tick(delta_time_); 16 | time_to_death_ -= delta_time_; 17 | if (time_to_death_ <= 0) { 18 | is_dead_ = true; 19 | } 20 | } 21 | 22 | void Particle::Draw(QPainter* painter, const SizeHandler& size_handler) const { 23 | painter->save(); 24 | 25 | Coordinate point = size_handler.GameToWindowCoordinate(position_ - size_ / 2); 26 | 27 | painter->translate(point.x, point.y); 28 | painter->drawPixmap(0, 0, animation_players_[0].GetCurrentFrame()); 29 | 30 | painter->restore(); 31 | } 32 | 33 | void Particle::SetIfEmpty(Size size, Coordinate position, 34 | int repeat_number) { 35 | if (size_ == Size(-1, -1)) { 36 | size_ = size; 37 | } 38 | position_ = position; 39 | if (repeat_number_ == -1) { 40 | repeat_number_ = repeat_number; 41 | } 42 | time_to_death_ = animation_players_[0].GetAnimationDuration() 43 | * repeat_number_ * kLifetimeOffset; 44 | } 45 | 46 | bool Particle::IsDead() const { 47 | return is_dead_; 48 | } 49 | 50 | void Particle::SetSoundId(int id) { 51 | sound_id_ = id; 52 | } 53 | 54 | int Particle::GetSoundId() const { 55 | return sound_id_; 56 | } 57 | -------------------------------------------------------------------------------- /GameObject/particle.h: -------------------------------------------------------------------------------- 1 | #ifndef GAMEOBJECT_PARTICLE_H_ 2 | #define GAMEOBJECT_PARTICLE_H_ 3 | 4 | #include "GameObject/moving_object.h" 5 | #include "View/animation_player.h" 6 | #include "View/size_handler.h" 7 | 8 | // The Particles themselves are drawn objects. 9 | class Particle : public GameObject { 10 | public: 11 | explicit Particle(Size size = {-1, -1}, int repeat_number = -1); 12 | Particle(const Particle& other); 13 | ~Particle() override = default; 14 | 15 | void Tick(int current_time) override; 16 | void SetSoundId(int id); 17 | int GetSoundId() const; 18 | void Draw(QPainter* painter, const SizeHandler& size_handler) const override; 19 | void SetIfEmpty(Size size, Coordinate position, int repeat_number); 20 | bool IsDead() const; 21 | 22 | private: 23 | bool is_dead_ = false; 24 | int time_to_death_ = 0; 25 | int repeat_number_ = 0; 26 | int sound_id_ = -1; 27 | 28 | // The lifetime of a Particle = the lifetime of the animation. 29 | // Due to the fact that the partial is removed not on the tick X but on X+1, 30 | // the animation between them has time to change from the last to the first 31 | // frame. And there is an instant glare. 32 | const double kLifetimeOffset = 0.95; 33 | }; 34 | 35 | #endif // GAMEOBJECT_PARTICLE_H_ 36 | -------------------------------------------------------------------------------- /GameObject/particle_handler.cpp: -------------------------------------------------------------------------------- 1 | #include "particle_handler.h" 2 | 3 | std::mt19937 ParticleHandler::random_generator_ = std::mt19937( 4 | std::chrono::system_clock::now().time_since_epoch().count()); 5 | 6 | ParticleHandler::ParticleHandler(const Size& owner_size, 7 | const Coordinate& owner_coordinates, 8 | const int& owner_delta_time) 9 | : owner_coordinates_(owner_coordinates), owner_size_(owner_size), 10 | owner_delta_time_(owner_delta_time) {} 11 | 12 | void ParticleHandler::Tick() { 13 | if (event_to_id_[static_cast(Event::kCreate)] != -1) { 14 | CreateParticleFromId(event_to_id_[static_cast(Event::kCreate)]); 15 | event_to_id_[static_cast(Event::kCreate)] = -1; 16 | } 17 | if (period_ <= 0) { 18 | return; 19 | } 20 | wait_time_ -= owner_delta_time_; 21 | if (wait_time_ <= 0) { 22 | wait_time_ += period_; 23 | Coordinate rand_coordinate = owner_coordinates_; 24 | rand_coordinate += 25 | Size(random_generator_() % (static_cast(owner_size_.width/1.5)) 26 | - owner_size_.width / 3, 27 | random_generator_() % (static_cast(owner_size_.height/1.5)) 28 | - owner_size_.height / 3); 29 | 30 | particle_queue.emplace_back(event_to_id_[static_cast(Event::kLive)], 31 | owner_size_, rand_coordinate); 32 | } 33 | } 34 | 35 | void ParticleHandler::SetEvents(const std::vector& event_to_id, 36 | int period) { 37 | event_to_id_ = event_to_id; 38 | period_ = period; 39 | wait_time_ = period; 40 | } 41 | 42 | void ParticleHandler::SetParticlePacks(const ParticleHandler& other) { 43 | SetEvents(other.event_to_id_, other.period_); 44 | } 45 | 46 | void ParticleHandler::PlayOwnerDeath() { 47 | if (event_to_id_[static_cast(Event::kDeath)] != -1) { 48 | CreateParticleFromId(event_to_id_[static_cast(Event::kDeath)]); 49 | } 50 | } 51 | 52 | void ParticleHandler::Clear() { 53 | particle_queue.clear(); 54 | } 55 | 56 | const std::list& 57 | ParticleHandler::GetParticlesQueue() const { 58 | return particle_queue; 59 | } 60 | 61 | bool ParticleHandler::IsReadyToCreateParticle() const { 62 | return !particle_queue.empty(); 63 | } 64 | 65 | void ParticleHandler::AddParticle(ParticleParameters particle) { 66 | particle_queue.push_back(particle); 67 | } 68 | 69 | void ParticleHandler::CreateParticleFromId(int id) { 70 | particle_queue.emplace_back(id, owner_size_, owner_coordinates_); 71 | } 72 | 73 | void ParticleHandler::SetPeriod(int period) { 74 | period_ = period; 75 | } 76 | -------------------------------------------------------------------------------- /GameObject/particle_handler.h: -------------------------------------------------------------------------------- 1 | #ifndef GAMEOBJECT_PARTICLE_HANDLER_H_ 2 | #define GAMEOBJECT_PARTICLE_HANDLER_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include "Model/coordinate.h" 11 | 12 | enum class Event { 13 | kCreate = 0, 14 | kDeath = 1, 15 | kLive = 2 16 | }; 17 | 18 | // To avoid multi include 19 | struct ParticleParameters { 20 | ParticleParameters( 21 | int particle_id, Size size, Coordinate position, 22 | int animation_times = 1, double speed = 0) : 23 | particle_id(particle_id), size(size), position(position), 24 | animation_times(animation_times), speed(speed) {} 25 | int particle_id; 26 | Size size; 27 | Coordinate position; 28 | int animation_times; 29 | double speed; 30 | }; 31 | 32 | // Particles are created when an object is created, when it dies, and 33 | // during its lifetime. 34 | class ParticleHandler { 35 | public: 36 | ParticleHandler(const Size& owner_size, 37 | const Coordinate& owner_coordinates, 38 | const int& owner_delta_time); 39 | 40 | void Tick(); 41 | void AddParticle(ParticleParameters particle); 42 | void SetEvents(const std::vector& event_to_id, int period); 43 | void SetParticlePacks(const ParticleHandler& other); 44 | void SetPeriod(int period); 45 | void PlayOwnerDeath(); 46 | void Clear(); 47 | 48 | const std::list& GetParticlesQueue() const; 49 | bool IsReadyToCreateParticle() const; 50 | 51 | private: 52 | void CreateParticleFromId(int id); 53 | const Coordinate& owner_coordinates_; 54 | const Size& owner_size_; 55 | const int& owner_delta_time_; 56 | 57 | std::list particle_queue; 58 | std::vector event_to_id_ = {-1, -1, -1}; 59 | 60 | int period_ = -1; 61 | int wait_time_ = 0; 62 | 63 | static std::mt19937 random_generator_; 64 | }; 65 | 66 | #endif // GAMEOBJECT_PARTICLE_HANDLER_H_ 67 | -------------------------------------------------------------------------------- /Model/constants.h: -------------------------------------------------------------------------------- 1 | #ifndef MODEL_CONSTANTS_H_ 2 | #define MODEL_CONSTANTS_H_ 3 | 4 | #include 5 | 6 | namespace constants { 7 | const double kEpsilon = 0.0001; 8 | 9 | const int kGameWidth = 1920; 10 | const int kGameHeight = 1080; 11 | 12 | const int kTimeBetweenTicks = 17; 13 | const int kTimeScale = 100; 14 | 15 | // Coefficient describes, how small SemiMinorAxe in compare between SemiMajorAxe 16 | const double kSemiMinorCoefficient = 0.8; 17 | const double kRefundCoefficient = 0.8; 18 | 19 | const double kFontSize = 32; 20 | const QString kCurrency = "$"; 21 | 22 | const int kApplicationRestartCode = 123456; 23 | 24 | const QString kCompanyName = "Giggling Penguin"; 25 | const QString kApplicationName = "Tech vs Cats"; 26 | } // namespace constants 27 | 28 | #endif // MODEL_CONSTANTS_H_ 29 | -------------------------------------------------------------------------------- /Model/coordinate.cpp: -------------------------------------------------------------------------------- 1 | #include "coordinate.h" 2 | 3 | Coordinate::Coordinate(double x, double y) noexcept 4 | : x(x), y(y) {} 5 | 6 | Size Coordinate::GetVectorTo(Coordinate right) const { 7 | return Size(right.x - x, right.y - y); 8 | } 9 | 10 | bool Coordinate::IsInEllipse(Coordinate center, double ellipse_radius) const { 11 | // Now, our aura have shape of ellipse. 12 | // Our focal distance - sqrt(a^2 - b^2) of effect radius. 13 | double foci_coefficient = std::sqrt( 14 | 1 - constants::kSemiMinorCoefficient * constants::kSemiMinorCoefficient); 15 | Coordinate first_foci(center.x + foci_coefficient * ellipse_radius, 16 | center.y); 17 | Coordinate second_foci(center.x - foci_coefficient * ellipse_radius, 18 | center.y); 19 | return GetVectorTo(first_foci).GetLength() + 20 | GetVectorTo(second_foci).GetLength() 21 | <= 2 * ellipse_radius + constants::kEpsilon; 22 | } 23 | 24 | Coordinate Coordinate::operator*(double right) const { 25 | return Coordinate(x * right, y * right); 26 | } 27 | 28 | Coordinate Coordinate::operator/(double right) const { 29 | return Coordinate(x / right, y / right); 30 | } 31 | 32 | Coordinate& Coordinate::operator*=(double right) { 33 | x *= right; 34 | y *= right; 35 | return *this; 36 | } 37 | 38 | Coordinate& Coordinate::operator/=(double right) { 39 | x /= right; 40 | y /= right; 41 | return *this; 42 | } 43 | 44 | Coordinate& Coordinate::operator+=(Size right) { 45 | *this = *this + right; 46 | return *this; 47 | } 48 | 49 | Coordinate Coordinate::operator+(Size right) const { 50 | return Coordinate(x + right.width, y + right.height); 51 | } 52 | 53 | Coordinate& Coordinate::operator-=(Size right) { 54 | *this = *this - right; 55 | return *this; 56 | } 57 | 58 | Coordinate Coordinate::operator-(Size right) const { 59 | return Coordinate(x - right.width, y - right.height); 60 | } 61 | 62 | bool Coordinate::operator==(Coordinate right) const { 63 | return (std::abs(x - right.x) < constants::kEpsilon) 64 | && (std::abs(y - right.y) < constants::kEpsilon); 65 | } 66 | -------------------------------------------------------------------------------- /Model/coordinate.h: -------------------------------------------------------------------------------- 1 | #ifndef MODEL_COORDINATE_H_ 2 | #define MODEL_COORDINATE_H_ 3 | 4 | #include 5 | #include "size.h" 6 | 7 | struct Coordinate { 8 | double x; 9 | double y; 10 | 11 | Coordinate() = default; 12 | Coordinate(double x, double y) noexcept; 13 | Size GetVectorTo(Coordinate right) const; 14 | bool IsInEllipse(Coordinate center, double ellipse_radius) const; 15 | 16 | Coordinate operator*(double right) const; 17 | Coordinate operator/(double right) const; 18 | Coordinate& operator*=(double right); 19 | Coordinate& operator/=(double right); 20 | 21 | Coordinate& operator+=(Size right); 22 | Coordinate operator+(Size right) const; 23 | Coordinate& operator-=(Size right); 24 | Coordinate operator-(Size right) const; 25 | 26 | bool operator==(Coordinate right) const; 27 | }; 28 | 29 | #endif // MODEL_COORDINATE_H_ 30 | -------------------------------------------------------------------------------- /Model/enemy_group.h: -------------------------------------------------------------------------------- 1 | #ifndef MODEL_ENEMY_GROUP_H_ 2 | #define MODEL_ENEMY_GROUP_H_ 3 | 4 | #include 5 | #include 6 | 7 | #include "GameObject/enemy.h" 8 | 9 | struct EnemyGroup { 10 | EnemyGroup(int spawn_period, int enemy_id, int time_of_next_spawn, 11 | int group_size, int road_to_spawn) 12 | : spawn_period(spawn_period), enemy_id(enemy_id), 13 | time_of_next_spawn(time_of_next_spawn), 14 | group_size(group_size), road_to_spawn(road_to_spawn) {} 15 | 16 | int spawn_period; 17 | int enemy_id; 18 | int time_of_next_spawn; 19 | int group_size; 20 | int road_to_spawn; 21 | }; 22 | 23 | #endif // MODEL_ENEMY_GROUP_H_ 24 | -------------------------------------------------------------------------------- /Model/music_player.h: -------------------------------------------------------------------------------- 1 | #ifndef MODEL_MUSIC_PLAYER_H_ 2 | #define MODEL_MUSIC_PLAYER_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include "GameObject/abstract_projectile.h" 12 | 13 | enum MainMusic { 14 | kMenuMusic, 15 | kGameMusic, 16 | kTitlesMusic, 17 | kEpicBossMusic 18 | }; 19 | 20 | class MusicPlayer { 21 | public: 22 | MusicPlayer(); 23 | ~MusicPlayer(); 24 | void SetVolume(int volume); 25 | 26 | void StartMenuMusic(); 27 | void StartGameMusic(); 28 | void StartTitlesMusic(); 29 | void StartEpicBossMusic(); 30 | void PlayButtonSound(); 31 | void PlayGameOverSound(); 32 | void PlayGameWonSound(); 33 | void PlayNewLevelSound(); 34 | void StopNewLevelSound(); 35 | void PlaySaleSound(); 36 | void PlayNotEnoughMoneySound(); 37 | 38 | void Pause(); 39 | void Resume(); 40 | 41 | private: 42 | void SetSound(QMediaPlayer* player, const QString& path); 43 | std::shared_ptr main_player_; 44 | std::shared_ptr main_playlist_; 45 | 46 | std::shared_ptr button_sound_; 47 | std::shared_ptr game_over_sound_; 48 | std::shared_ptr game_won_sound_; 49 | std::shared_ptr sale_sound_; 50 | std::shared_ptr not_enough_money_sound_; 51 | std::shared_ptr new_level_sound_; 52 | std::vector> playlists_; 53 | }; 54 | 55 | #endif // MODEL_MUSIC_PLAYER_H_ 56 | -------------------------------------------------------------------------------- /Model/road.cpp: -------------------------------------------------------------------------------- 1 | #include "road.h" 2 | 3 | #include 4 | 5 | Road::Road(std::vector nodes) : nodes_(std::move(nodes)) {} 6 | 7 | Coordinate Road::GetNode(int node_number) const { 8 | return nodes_[node_number]; 9 | } 10 | 11 | bool Road::IsEnd(int node_number) const { 12 | return node_number == static_cast(nodes_.size()); 13 | } 14 | -------------------------------------------------------------------------------- /Model/road.h: -------------------------------------------------------------------------------- 1 | #ifndef MODEL_ROAD_H_ 2 | #define MODEL_ROAD_H_ 3 | 4 | #include 5 | #include 6 | 7 | #include "coordinate.h" 8 | 9 | class Road { 10 | public: 11 | explicit Road(std::vector nodes); 12 | 13 | Coordinate GetNode(int node_number) const; 14 | bool IsEnd(int node_number) const; 15 | 16 | private: 17 | std::vector nodes_; 18 | }; 19 | 20 | #endif // MODEL_ROAD_H_ 21 | -------------------------------------------------------------------------------- /Model/size.cpp: -------------------------------------------------------------------------------- 1 | #include "size.h" 2 | 3 | Size::Size(double x, double y) noexcept: width(x), height(y) {} 4 | 5 | double Size::GetLength() const { 6 | return std::hypot(width, height); 7 | } 8 | 9 | Size& Size::Normalize() { 10 | *this /= GetLength(); 11 | return *this; 12 | } 13 | 14 | Size Size::operator*(double right) const { 15 | return Size(width * right, height * right); 16 | } 17 | 18 | Size Size::operator/(double right) const { 19 | return Size(width / right, height / right); 20 | } 21 | 22 | Size& Size::operator*=(double right) { 23 | *this = *this * right; 24 | return *this; 25 | } 26 | 27 | Size& Size::operator/=(double right) { 28 | *this = *this / right; 29 | return *this; 30 | } 31 | 32 | Size Size::operator+(Size right) const { 33 | return Size(width + right.width, height + right.height); 34 | } 35 | 36 | Size Size::operator-(Size right) const { 37 | return Size(width - right.width, height - right.height); 38 | } 39 | 40 | Size& Size::operator+=(Size right) { 41 | *this = *this + right; 42 | return *this; 43 | } 44 | 45 | Size& Size::operator-=(Size right) { 46 | *this = *this - right; 47 | return *this; 48 | } 49 | 50 | bool Size::operator==(Size right) const { 51 | return (width - right.width < constants::kEpsilon) 52 | && (height - right.height < constants::kEpsilon); 53 | } 54 | bool Size::operator!=(Size right) const { 55 | return !(*this == right); 56 | } 57 | -------------------------------------------------------------------------------- /Model/size.h: -------------------------------------------------------------------------------- 1 | #ifndef MODEL_SIZE_H_ 2 | #define MODEL_SIZE_H_ 3 | 4 | #include 5 | #include "constants.h" 6 | 7 | struct Size { 8 | double width; 9 | double height; 10 | 11 | Size() = default; 12 | Size(double x, double y) noexcept; 13 | 14 | double GetLength() const; 15 | Size& Normalize(); 16 | 17 | Size operator*(double right) const; 18 | Size operator/(double right) const; 19 | Size& operator*=(double right); 20 | Size& operator/=(double right); 21 | 22 | Size operator+(Size right) const; 23 | Size operator-(Size right) const; 24 | Size& operator+=(Size right); 25 | Size& operator-=(Size right); 26 | 27 | bool operator==(Size right) const; 28 | bool operator!=(Size right) const; 29 | }; 30 | 31 | #endif // MODEL_SIZE_H_ 32 | -------------------------------------------------------------------------------- /Model/sound_vector.cpp: -------------------------------------------------------------------------------- 1 | #include "sound_vector.h" 2 | 3 | SoundVector::SoundVector(const QString& path, int audio_roads_count) { 4 | for (int i = 0; i < audio_roads_count; i++) { 5 | auto media_player = std::make_shared(); 6 | sounds_.push_back(std::move(media_player)); 7 | auto playlist = std::make_shared(); 8 | playlist->addMedia(QUrl("qrc:resources/" + path)); 9 | playlist->setCurrentIndex(0); 10 | sounds_[i]->setPlaylist(playlist.get()); 11 | sounds_[i]->playlist()->setCurrentIndex(0); 12 | playlists_.push_back(std::move(playlist)); 13 | roads_count_++; 14 | } 15 | } 16 | 17 | void SoundVector::Play() { 18 | if (!roads_count_) { 19 | return; 20 | } 21 | sounds_[current_sound_++]->play(); 22 | current_sound_ %= roads_count_; 23 | } 24 | 25 | void SoundVector::Stop() { 26 | for (auto& sound : sounds_) { 27 | sound->stop(); 28 | } 29 | } 30 | 31 | void SoundVector::SetVolume(int volume) { 32 | for (auto& sound : sounds_) { 33 | sound->setVolume(volume); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Model/sound_vector.h: -------------------------------------------------------------------------------- 1 | #ifndef MODEL_SOUND_VECTOR_H_ 2 | #define MODEL_SOUND_VECTOR_H_ 3 | 4 | #include 5 | #include 6 | 7 | #include 8 | #include 9 | #include 10 | 11 | class SoundVector { 12 | public: 13 | explicit SoundVector(const QString& path, int audio_roads_count); 14 | void Play(); 15 | void Stop(); 16 | void SetVolume(int volume); 17 | 18 | private: 19 | int roads_count_ = 0; 20 | std::vector> sounds_; 21 | std::vector> playlists_; 22 | int current_sound_ = 0; 23 | }; 24 | 25 | #endif // MODEL_SOUND_VECTOR_H_ 26 | -------------------------------------------------------------------------------- /Server/main.cpp: -------------------------------------------------------------------------------- 1 | #include "server.h" 2 | 3 | #include 4 | 5 | int main(int argc, char* argv[]) { 6 | QCoreApplication a(argc, argv); 7 | 8 | int port = 1234; 9 | auto server = new Server(port); 10 | QObject::connect(server, &Server::closed, &a, &QCoreApplication::quit); 11 | 12 | return a.exec(); 13 | } 14 | -------------------------------------------------------------------------------- /Server/message.cpp: -------------------------------------------------------------------------------- 1 | #include "message.h" 2 | 3 | Message::Message(MessageType type, QStringList list) 4 | : message_type_(type), 5 | dialog_type_(VisibleType::kChat), 6 | command_type_(CommandType::kChatClear), 7 | arguments_(std::move(list)) { 8 | arguments_number_ = arguments_.size(); 9 | } 10 | 11 | QByteArray Message::CodeToBinary(const Message& message) { 12 | QJsonDocument json_document; 13 | QJsonObject json_object; 14 | json_object["type"] = static_cast(message.message_type_); 15 | json_object["arguments_number_"] = message.arguments_number_; 16 | for (int i = 0; i < message.arguments_number_; i++) { 17 | json_object["argument_" + QString::number(i)] = message.arguments_[i]; 18 | } 19 | json_document.setObject(json_object); 20 | return json_document.toBinaryData(); 21 | } 22 | 23 | Message& Message::SetVisibleMessage(const QString& message, VisibleType type, 24 | const QString& nick_name) { 25 | message_type_ = MessageType::kVisibleMessage; 26 | dialog_type_ = type; 27 | arguments_ = QStringList({""}); 28 | arguments_number_ = 1; 29 | if (!nick_name.isEmpty()) { 30 | arguments_[0] = "> " + nick_name + " : "; 31 | } 32 | arguments_[0] += message; 33 | return *this; 34 | } 35 | 36 | Message& Message::SetCommandMessage(const QString& message, 37 | CommandType type) { 38 | message_type_ = MessageType::kControllerCommand; 39 | command_type_ = type; 40 | arguments_ = QStringList({message}); 41 | arguments_number_ = 1; 42 | return *this; 43 | } 44 | 45 | Message& Message::DecodeFromBinary(const QByteArray& array) { 46 | QJsonDocument json_document = QJsonDocument::fromBinaryData(array); 47 | auto object = json_document.object(); 48 | message_type_ = static_cast(object["type"].toInt()); 49 | arguments_number_ = object["arguments_number_"].toInt(); 50 | for (int i = 0; i < arguments_number_; i++) { 51 | arguments_.push_back(object["argument_" + QString::number(i)].toString()); 52 | } 53 | return *this; 54 | } 55 | 56 | MessageType Message::GetType() const { 57 | return message_type_; 58 | } 59 | 60 | QString Message::GetArgument(int arg_num) const { 61 | if (arg_num >= arguments_number_) { 62 | return ""; 63 | } 64 | return arguments_[arg_num]; 65 | } 66 | 67 | const QStringList& Message::GetArguments() const { 68 | return arguments_; 69 | } 70 | 71 | CommandType Message::GetCommandType() const { 72 | return command_type_; 73 | } 74 | 75 | VisibleType Message::GetDialogType() const { 76 | return dialog_type_; 77 | } 78 | -------------------------------------------------------------------------------- /Server/message.h: -------------------------------------------------------------------------------- 1 | #ifndef SERVER_MESSAGE_H_ 2 | #define SERVER_MESSAGE_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include 11 | 12 | enum class VisibleType { 13 | kChat, 14 | kWarning 15 | }; 16 | 17 | struct VisibleMessage { 18 | QString message; 19 | VisibleType type; 20 | }; 21 | 22 | enum class CommandType { 23 | kGoldChange, 24 | kHealthGrow, 25 | kChatClear, 26 | kUnlock 27 | }; 28 | 29 | enum class MessageType { 30 | // To client 31 | kChatUpdate, 32 | kNickNameDead, // % nickname 33 | kNickNameJoinedTheRoom, // % nickname 34 | kNickNameFinishRoundWithHp, // % nickname % hp 35 | kNickNameLeft, // % nickname 36 | kNickNameWinWithHp, // % nickname % hp 37 | kRoomStartsIn, // % time 38 | kRoundStartsIn, // % time 39 | kStartRound, 40 | 41 | // To translate 42 | kConnect, 43 | kChatOffline, 44 | kGoldError, 45 | kDisconnect, 46 | kErrorCommand, 47 | kGameEnd, 48 | kNameNullMessage, 49 | kHintRegistration1, 50 | kHintRegistration2, 51 | kInfinityHealth, 52 | kMoreGold, 53 | kOk, 54 | kServerClosed, 55 | kYourNickNameIs, // %nick_name 56 | kYouCreatedRoom, 57 | kLeaveRoom, 58 | kToLongMessage, 59 | kServerIsUnavailable, 60 | kGoToRoom, // % room number 61 | kNoCheat, 62 | kHelpGold, 63 | kHelpImmortal, 64 | kHelpClear, 65 | kHelpUnlock, 66 | kYouTheBest, 67 | 68 | kLastTranslatable, // To get size of enum 69 | 70 | // To server 71 | kEnterRoom = 1000, // % lvl_id 72 | kGlobalChat = 1001, // % message 73 | kNewConnection = 1002, 74 | kRoundCompletedByPlayer = 1003, // % base_current_health % game_process 75 | 76 | kLastServer, 77 | 78 | // To controller 79 | kControllerCommand = 1004, 80 | kVisibleMessage = 1005, 81 | 82 | kLastController 83 | }; 84 | 85 | // The main class of data transfer between the server and the client. 86 | // The server and client communicate in the language of messages 87 | class Message { 88 | public: 89 | Message() = default; 90 | explicit Message(MessageType type, QStringList arguments = {}); 91 | 92 | static QByteArray CodeToBinary(const Message& message); 93 | Message& SetVisibleMessage(const QString& message, VisibleType type, 94 | const QString& nick_name = ""); 95 | Message& SetCommandMessage(const QString& message, 96 | CommandType type); 97 | Message& DecodeFromBinary(const QByteArray& array); 98 | MessageType GetType() const; 99 | QString GetArgument(int arg_num) const; 100 | const QStringList& GetArguments() const; 101 | CommandType GetCommandType() const; 102 | VisibleType GetDialogType() const; 103 | 104 | private: 105 | MessageType message_type_; 106 | VisibleType dialog_type_; 107 | CommandType command_type_; 108 | QStringList arguments_; 109 | int arguments_number_ = 0; 110 | }; 111 | 112 | #endif // SERVER_MESSAGE_H_ 113 | -------------------------------------------------------------------------------- /Server/server.pro: -------------------------------------------------------------------------------- 1 | QT += core websockets 2 | QT -= gui 3 | 4 | TARGET = echoserver 5 | CONFIG += console 6 | CONFIG -= app_bundle 7 | 8 | TEMPLATE = app 9 | 10 | SOURCES += \ 11 | server.cpp \ 12 | message.cpp \ 13 | main.cpp \ 14 | 15 | HEADERS += \ 16 | server.h \ 17 | message.h \ 18 | 19 | -------------------------------------------------------------------------------- /View/animation_player.cpp: -------------------------------------------------------------------------------- 1 | #include "animation_player.h" 2 | 3 | AnimationPlayer::AnimationPlayer( 4 | const std::shared_ptr>& frames, int animation_duration) 5 | : frames_(frames), frames_rescaled_(*frames) { 6 | time_between_frames_ = 1.0 * animation_duration / frames->size(); 7 | Reset(); 8 | } 9 | 10 | void AnimationPlayer::Tick(int delta_time) { 11 | wait_till_next_frame_ -= delta_time; 12 | if (wait_till_next_frame_ >= 0) { 13 | return; 14 | } 15 | current_frame_ = (current_frame_ + 1) % frames_->size(); 16 | wait_till_next_frame_ = time_between_frames_; 17 | } 18 | 19 | const QPixmap& AnimationPlayer::GetCurrentFrame() const { 20 | return frames_rescaled_[current_frame_]; 21 | } 22 | 23 | int AnimationPlayer::GetAnimationDuration() const { 24 | return frames_->size() * time_between_frames_; 25 | } 26 | 27 | void AnimationPlayer::Reset() { 28 | current_frame_ = 0; 29 | wait_till_next_frame_ = time_between_frames_; 30 | } 31 | 32 | void AnimationPlayer::Rescale(Size to_size) { 33 | if (frames_ == nullptr || frames_->empty()) { 34 | return; 35 | } 36 | if (std::abs(picture_size_.width - to_size.width) 37 | + std::abs(picture_size_.height - to_size.height) < 5) { 38 | return; 39 | } 40 | for (uint32_t i = 0; i < frames_->size(); i++) { 41 | frames_rescaled_[i] = 42 | (*frames_)[i].scaled(to_size.width + 1, to_size.height + 1, 43 | Qt::KeepAspectRatio); 44 | } 45 | picture_size_ = to_size; 46 | } 47 | -------------------------------------------------------------------------------- /View/animation_player.h: -------------------------------------------------------------------------------- 1 | #ifndef VIEW_ANIMATION_PLAYER_H_ 2 | #define VIEW_ANIMATION_PLAYER_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "Model/coordinate.h" 9 | #include "Model/constants.h" 10 | #include "Model/size.h" 11 | class AnimationPlayer { 12 | public: 13 | AnimationPlayer() = default; 14 | AnimationPlayer(const std::shared_ptr>& frames, 15 | int animation_duration = constants::kTimeScale); 16 | 17 | void Tick(int delta_time); 18 | void Reset(); 19 | const QPixmap& GetCurrentFrame() const; 20 | int GetAnimationDuration() const; 21 | void Rescale(Size to_size); 22 | 23 | private: 24 | Size picture_size_ = {0, 0}; 25 | uint current_frame_ = 0; 26 | int wait_till_next_frame_ = 0; 27 | int time_between_frames_ = 0; 28 | 29 | std::shared_ptr> frames_; 30 | std::vector frames_rescaled_ = 31 | {QPixmap("::resources/images/error.png")}; 32 | }; 33 | 34 | #endif // VIEW_ANIMATION_PLAYER_H_ 35 | -------------------------------------------------------------------------------- /View/global_chat.h: -------------------------------------------------------------------------------- 1 | #ifndef VIEW_GLOBAL_CHAT_H_ 2 | #define VIEW_GLOBAL_CHAT_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | #include 14 | 15 | #include "View/menu_button.h" 16 | #include "Model/coordinate.h" 17 | #include "size_handler.h" 18 | 19 | class GlobalChat { 20 | public: 21 | explicit GlobalChat(QMainWindow*); 22 | 23 | void RescaleChat(const SizeHandler& size_handler); 24 | void Tick(const SizeHandler&, int delta_time); 25 | void HideShow(); 26 | void ChangeStyle(); 27 | 28 | bool IsMessagesQueueEmpty() const; 29 | const QString& GetMessageToSend() const; 30 | void PopMessageQueue(); 31 | 32 | void Clear(); 33 | void ReceiveNewMessages(const QStringList& messages); 34 | 35 | void SetVisible(bool visible); 36 | 37 | private: 38 | bool using_game_style_ = true; 39 | 40 | bool is_brick_going_up_ = false; 41 | int how_high_brick_percent_ = 0; 42 | bool is_brick_going_right_ = false; 43 | int how_right_brick_percent_ = 0; 44 | 45 | QStringList text_browser_messages_; 46 | QStringList send_messages_; 47 | 48 | QTextBrowser* q_text_browser_; 49 | QLineEdit* q_line_edit_; 50 | MenuButton* send_button; 51 | MenuButton* brick_button; 52 | 53 | const int kMaxChatSize = 30; 54 | const int kFontId = 0; 55 | const int kCloseSpeed = 60; 56 | const Size kTextEditSize = {700, button_constants::kShortButtonSize.height}; 57 | 58 | #ifndef Q_OS_ANDROID 59 | const double kFontSize = 26; 60 | #else 61 | const double kFontSize = 38; 62 | #endif 63 | 64 | const Coordinate kBottomLeftPosition = {20, 1060}; 65 | 66 | void SendMessage(); 67 | }; 68 | 69 | #endif // VIEW_GLOBAL_CHAT_H_ 70 | -------------------------------------------------------------------------------- /View/info_field.h: -------------------------------------------------------------------------------- 1 | #ifndef VIEW_INFO_FIELD_H_ 2 | #define VIEW_INFO_FIELD_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #include "animation_player.h" 12 | #include "size_handler.h" 13 | #include "GameObject/building.h" 14 | #include "Model/constants.h" 15 | #include "Model/coordinate.h" 16 | #include "Model/size.h" 17 | 18 | class InfoField { 19 | public: 20 | void Draw(QPainter* painter, const SizeHandler& size_handler); 21 | void DrawCurrentTower(QPainter* painter, 22 | const SizeHandler& size_handler); 23 | void DrawPurchasableTower(QPainter* painter, 24 | const SizeHandler& size_handler, 25 | const QFontMetrics& metrics); 26 | void DrawStatistics(QPainter* painter, const SizeHandler& size_handler, 27 | double text_height); 28 | void DrawSellInfo(QPainter* painter, const SizeHandler& size_handler, 29 | double text_height); 30 | void DrawImage(QPainter* painter, const SizeHandler& size_handler, 31 | double field_size); 32 | 33 | void SetInfo(const Building& building, int total_cost, 34 | bool is_current_tower); 35 | void SetPosition(const Coordinate& position); 36 | Coordinate FixPosition(Size button_size); 37 | void SetVisible(bool is_hide); 38 | bool IsOnBottom() const; 39 | 40 | private: 41 | Coordinate position_; 42 | Coordinate true_position_; 43 | bool is_hidden_ = false; 44 | bool is_on_bottom_ = true; 45 | bool is_sell_info_ = false; 46 | 47 | QString header_; 48 | QString info_; 49 | int damage_ = 0; 50 | int aims_count_ = 0; 51 | int cost_ = 0; 52 | QString attack_speed_; 53 | 54 | bool is_current_tower_; 55 | bool has_image_ = false; 56 | Effect effect_ = Effect(EffectTarget::kBuilding); 57 | 58 | const double kMargin = 10; 59 | const Size kSize = {500, 500}; 60 | const Size kRelativeHeaderSize = {1, 0.2}; 61 | const Size kRelativeTextSize = {1, 0.5}; 62 | const Size kRelativeStatisticsSize = {1.0, 0.2 / 3}; 63 | const Size kImagePadSize = {150, 250}; 64 | }; 65 | 66 | #endif // VIEW_INFO_FIELD_H_ 67 | -------------------------------------------------------------------------------- /View/menu_button.h: -------------------------------------------------------------------------------- 1 | #ifndef VIEW_MENU_BUTTON_H_ 2 | #define VIEW_MENU_BUTTON_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | #include "size_handler.h" 15 | #include "Model/constants.h" 16 | 17 | namespace button_constants { 18 | const int kMenuBorderSize = 12; 19 | 20 | #ifndef Q_OS_ANDROID 21 | const Size kLongButtonSize = Size(640, 72); 22 | const Size kShortButtonSize = Size(72, 72); 23 | #else 24 | const Size kLongButtonSize = Size(640, 110); 25 | const Size kShortButtonSize = Size(110, 110); 26 | #endif 27 | 28 | const int kMenuFontSize = 36; 29 | 30 | #ifndef Q_OS_ANDROID 31 | const Coordinate kFirstButtonCoordinate = Coordinate(640, 360); 32 | #else 33 | const Coordinate kFirstButtonCoordinate = Coordinate(640, 240); 34 | #endif 35 | 36 | const int kShift = 20; 37 | } // namespace button_constants 38 | 39 | class MenuButton : public QPushButton { 40 | public: 41 | MenuButton(const QString& text, const Size& button_size, 42 | QMainWindow* main_window, int font_id); 43 | MenuButton(const Size& button_size, QMainWindow* main_window, 44 | const QString& main_icon_path, const QString& active_icon_path); 45 | 46 | ~MenuButton() override = default; 47 | 48 | void UpdateIcon(); 49 | void SetIsEnter(bool enter); 50 | void SetGeometry(Coordinate game_coordinate, SizeHandler size_handler); 51 | void SetSecondIconPath(const QString& main_icon_path, 52 | const QString& active_icon_path); 53 | Coordinate GetPosition() const; 54 | void EnableSecondIcon(bool is_second_icon_enabled); 55 | void ResetStyleSheet(); 56 | 57 | private: 58 | // changing hover color and back 59 | void enterEvent(QEvent*) override; 60 | void leaveEvent(QEvent*) override; 61 | 62 | private: 63 | Size button_size_{0, 0}; 64 | Coordinate position_{0, 0}; 65 | int border_size_ = 0; 66 | QIcon main_icon_1_; 67 | QIcon active_icon_1_; 68 | 69 | bool is_second_icon_enabled_ = false; 70 | bool have_entered_event_ = false; 71 | QIcon main_icon_2_; 72 | QIcon active_icon_2_; 73 | 74 | static std::mt19937 random_generator_; 75 | }; 76 | 77 | #endif // VIEW_MENU_BUTTON_H_ 78 | -------------------------------------------------------------------------------- /View/size_handler.cpp: -------------------------------------------------------------------------------- 1 | #include "size_handler.h" 2 | 3 | void SizeHandler::ChangeSystem(double window_width, double window_height) { 4 | scaling_coefficient_ = std::max(game_size_.width / window_width, 5 | game_size_.height / window_height); 6 | 7 | Size real_size = Size(game_size_.width / scaling_coefficient_, 8 | game_size_.height / scaling_coefficient_); 9 | 10 | origin_offset_.width = (window_width - real_size.width) / 2; 11 | origin_offset_.height = (window_height - real_size.height) / 2; 12 | } 13 | 14 | Coordinate SizeHandler::WindowToGameCoordinate( 15 | Coordinate window_coordinate) const { 16 | return (window_coordinate - origin_offset_) * scaling_coefficient_; 17 | } 18 | 19 | Coordinate SizeHandler::GameToWindowCoordinate( 20 | Coordinate game_coordinate) const { 21 | return (game_coordinate / scaling_coefficient_) + origin_offset_; 22 | } 23 | 24 | Size SizeHandler::GameToWindowSize(Size game_size) const { 25 | return game_size / scaling_coefficient_; 26 | } 27 | 28 | double SizeHandler::WindowToGameLength(double length) const { 29 | return length * scaling_coefficient_; 30 | } 31 | 32 | double SizeHandler::GameToWindowLength(double game_length) const { 33 | return game_length / scaling_coefficient_; 34 | } 35 | 36 | Size SizeHandler::GetGameSize() const { 37 | return game_size_; 38 | } 39 | -------------------------------------------------------------------------------- /View/size_handler.h: -------------------------------------------------------------------------------- 1 | #ifndef VIEW_SIZE_HANDLER_H_ 2 | #define VIEW_SIZE_HANDLER_H_ 3 | 4 | #include 5 | #include 6 | 7 | #include "Model/coordinate.h" 8 | #include "Model/size.h" 9 | #include "Model/constants.h" 10 | 11 | class SizeHandler { 12 | public: 13 | void ChangeSystem(double window_width, double window_height); 14 | 15 | Coordinate WindowToGameCoordinate(Coordinate window_coordinate) const; 16 | Coordinate GameToWindowCoordinate(Coordinate game_coordinate) const; 17 | Size GameToWindowSize(Size game_size) const; 18 | double WindowToGameLength(double game_length) const; 19 | double GameToWindowLength(double game_length) const; 20 | 21 | Size GetGameSize() const; 22 | 23 | private: 24 | Size origin_offset_ = {0, 0}; 25 | // The ratio of game coordinates to real 26 | double scaling_coefficient_ = 3; 27 | const Size game_size_ = {constants::kGameWidth, constants::kGameHeight}; 28 | }; 29 | 30 | #endif // VIEW_SIZE_HANDLER_H_ 31 | -------------------------------------------------------------------------------- /View/text_notification.cpp: -------------------------------------------------------------------------------- 1 | #include "text_notification.h" 2 | 3 | #include 4 | 5 | TextNotification::TextNotification(QString message, 6 | Coordinate start_position, QColor color, 7 | Size moving_vector, int life_time, 8 | double size_change_coefficient, bool fade, 9 | bool is_accelerated, bool center_align) 10 | : GameObject({0, 0}, start_position), message_(std::move(message)), 11 | force_vector_(moving_vector), color_(std::move(color)), 12 | life_time_(life_time), 13 | size_change_coefficient_(size_change_coefficient), is_fade_(fade), 14 | is_accelerated_(is_accelerated), center_align_(center_align) {} 15 | 16 | void TextNotification::Tick(int current_time) { 17 | UpdateTime(current_time); 18 | position_ += force_vector_ * delta_time_ / constants::kTimeScale; 19 | font_size_ *= size_change_coefficient_; 20 | font_size_ = std::min(font_size_, kMaxTextSize); 21 | if (is_accelerated_) { 22 | force_vector_ *= kSlowdownCoefficient; 23 | } 24 | life_time_ -= delta_time_; 25 | if (life_time_ < 0) { 26 | if (color_.alpha() == 0 || !is_fade_) { 27 | is_dead_ = true; 28 | } else { 29 | color_.setAlpha(color_.alpha() - fade_speed_); 30 | } 31 | } 32 | } 33 | 34 | void TextNotification::Draw(QPainter* painter, 35 | const SizeHandler& size_handler) const { 36 | painter->save(); 37 | 38 | painter->setPen(color_); 39 | auto font = painter->font(); 40 | font.setPixelSize(size_handler.GameToWindowLength(font_size_)); 41 | font.setFamily(QFontDatabase::applicationFontFamilies(kFontId).at(0)); 42 | painter->setFont(font); 43 | 44 | // Position, for camera span 45 | Coordinate point{}; 46 | if (center_align_) { 47 | point = size_handler.GameToWindowCoordinate( 48 | {position_.x - font_size_ * message_.size() * 0.35, 49 | position_.y + font_size_ / 4}); 50 | } else { 51 | point = size_handler.GameToWindowCoordinate({position_.x, position_.y}); 52 | } 53 | if (font_size_ <= kMaxTextSize + constants::kEpsilon) { 54 | painter->drawText(point.x, point.y, message_); 55 | } 56 | 57 | painter->restore(); 58 | } 59 | 60 | bool TextNotification::IsDead() const { 61 | return is_dead_; 62 | } 63 | 64 | void TextNotification::SetFontSize(int new_size) { 65 | font_size_ = new_size; 66 | } 67 | -------------------------------------------------------------------------------- /View/text_notification.h: -------------------------------------------------------------------------------- 1 | #ifndef VIEW_TEXT_NOTIFICATION_H_ 2 | #define VIEW_TEXT_NOTIFICATION_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include "GameObject/game_object.h" 11 | #include "size_handler.h" 12 | 13 | class TextNotification : public GameObject { 14 | public: 15 | TextNotification(QString message, Coordinate start_position, 16 | QColor color, Size moving_vector = Size(0, -50), 17 | int life_time = 1000, double size_change_coefficient = 1, 18 | bool fade = false, bool is_accelerated = true, 19 | bool center_align = true); 20 | ~TextNotification() override = default; 21 | 22 | void Tick(int current_time) override; 23 | void Draw(QPainter* painter, const SizeHandler& size_handler) const override; 24 | 25 | bool IsDead() const; 26 | 27 | void SetFontSize(int new_size); 28 | 29 | private: 30 | QString message_; 31 | Size force_vector_; 32 | QColor color_; 33 | int life_time_; 34 | int fade_speed_ = 3; 35 | double size_change_coefficient_; 36 | 37 | bool is_dead_ = false; 38 | double font_size_ = 18; 39 | bool is_fade_ = false; 40 | bool is_accelerated_ = true; 41 | bool center_align_ = true; 42 | 43 | const double kSlowdownCoefficient = 0.85; 44 | const double kMaxTextSize = 40000; 45 | const int kFontId = 0; 46 | }; 47 | 48 | #endif // VIEW_TEXT_NOTIFICATION_H_ 49 | -------------------------------------------------------------------------------- /View/tower_menu.h: -------------------------------------------------------------------------------- 1 | #ifndef VIEW_TOWER_MENU_H_ 2 | #define VIEW_TOWER_MENU_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #include 10 | 11 | #include "GameObject/building.h" 12 | #include "Model/coordinate.h" 13 | #include "View/info_field.h" 14 | #include "View/menu_button.h" 15 | 16 | struct ButtonImagePath { 17 | ButtonImagePath(QString frame_up_path, QString frames_down_path) 18 | : main_path(std::move(frame_up_path)), 19 | active_path(std::move(frames_down_path)) {} 20 | QString main_path; 21 | QString active_path; 22 | }; 23 | 24 | class TowerMenu { 25 | public: 26 | // Note: options are expected to be not empty 27 | explicit TowerMenu(QMainWindow*); 28 | 29 | void Recreate(Coordinate position, int owner_building_index, 30 | const std::vector& possible_buildings_id, 31 | int owner_id, const SizeHandler& size_handler, 32 | int total_cost); 33 | void Tick(const SizeHandler& size_handler); 34 | void SetIsWantToReplaceToFalse(); 35 | void RescaleButtons(const SizeHandler& size_handler); 36 | void DrawTowersAuraAndRange(QPainter* painter, 37 | const SizeHandler& size_handler, 38 | const Building& instance); 39 | void DrawInfoField(QPainter* painter, const SizeHandler& size_handler, 40 | const Building& instance); 41 | void Close(bool is_fast_disable); 42 | void Hide(bool is_hidden); 43 | int GetTownerIndex() const; 44 | int GetSellectedTowerId() const; 45 | bool IsEnable() const; 46 | bool IsWantToReplace() const; 47 | 48 | int GetChosenButtonId() const; 49 | 50 | private: 51 | int owner_id_ = 0; 52 | std::vector buttons_; 53 | std::vector possible_buildings_id_; 54 | Coordinate position_{}; 55 | int owner_building_index_ = -1; 56 | int active_button_index_ = -1; 57 | bool id_to_replace_ = false; 58 | bool slow_disable = false; 59 | bool is_hidden_ = true; 60 | int total_cost_ = 0; 61 | 62 | InfoField info_field_{}; 63 | 64 | double current_force_ = 0; 65 | 66 | #ifndef Q_OS_ANDROID 67 | const double kThrowForce = 18; 68 | #else 69 | const double kThrowForce = 24; 70 | #endif 71 | const double kSlowdownCoefficient = 0.86; 72 | const Size kSizeOfButton = button_constants::kShortButtonSize * 0.8; 73 | 74 | private: 75 | void Disable(); 76 | void ButtonTapped(int button_index); 77 | }; 78 | 79 | #endif // VIEW_TOWER_MENU_H_ 80 | -------------------------------------------------------------------------------- /android/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "1020921751525", 4 | "firebase_url": "https://techvscats.firebaseio.com", 5 | "project_id": "techvscats", 6 | "storage_bucket": "techvscats.appspot.com" 7 | }, 8 | "client": [ 9 | { 10 | "client_info": { 11 | "mobilesdk_app_id": "1:1020921751525:android:49d2cb9aaaeb42b546710c", 12 | "android_client_info": { 13 | "package_name": "com.giggling.penguin.techvscats" 14 | } 15 | }, 16 | "oauth_client": [ 17 | { 18 | "client_id": "1020921751525-h2clrhs3n37qa1c6kbcp589mkdaqkfmh.apps.googleusercontent.com", 19 | "client_type": 3 20 | } 21 | ], 22 | "api_key": [ 23 | { 24 | "current_key": "AIzaSyAqtUoJwzgdx98GdRYAuqeizkwgw8d4Gcc" 25 | } 26 | ], 27 | "services": { 28 | "appinvite_service": { 29 | "other_platform_oauth_client": [ 30 | { 31 | "client_id": "1020921751525-h2clrhs3n37qa1c6kbcp589mkdaqkfmh.apps.googleusercontent.com", 32 | "client_type": 3 33 | } 34 | ] 35 | } 36 | } 37 | } 38 | ], 39 | "configuration_version": "1" 40 | } -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx2048m 2 | org.gradle.caching=true 3 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /android/release_notes.txt: -------------------------------------------------------------------------------- 1 | Тестовая версия. 2 | -------------------------------------------------------------------------------- /android/res/mipmap-hdpi/techvscats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/android/res/mipmap-hdpi/techvscats.png -------------------------------------------------------------------------------- /android/res/mipmap-mdpi/techvscats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/android/res/mipmap-mdpi/techvscats.png -------------------------------------------------------------------------------- /android/res/mipmap-xhdpi/techvscats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/android/res/mipmap-xhdpi/techvscats.png -------------------------------------------------------------------------------- /android/res/mipmap-xxhdpi/techvscats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/android/res/mipmap-xxhdpi/techvscats.png -------------------------------------------------------------------------------- /android/res/mipmap-xxxhdpi/techvscats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/android/res/mipmap-xxxhdpi/techvscats.png -------------------------------------------------------------------------------- /android/res/values/libs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | https://download.qt.io/ministro/android/qt5/qt-5.14 5 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /database.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | resources/levels/level_1.json 4 | resources/levels/level_2.json 5 | resources/levels/level_3.json 6 | resources/database/database.json 7 | resources/fonts/gui_font.ttf 8 | 9 | resources/database/description_ru_RU.json 10 | resources/database/description_en_US.json 11 | resources/translations/translation_en_US.qm 12 | resources/translations/translation_ru_RU.qm 13 | 14 | resources/database/server_en_US.json 15 | resources/database/server_ru_RU.json 16 | 17 | resources/database/titles.txt 18 | 19 | 20 | -------------------------------------------------------------------------------- /music.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | resources/sounds/menu_sound.mp3 4 | resources/sounds/titles_sound.mp3 5 | resources/sounds/game_sound.mp3 6 | resources/sounds/game_over_sound.mp3 7 | resources/sounds/game_won_sound.mp3 8 | resources/sounds/epic_boss.mp3 9 | resources/sounds/button_click.mp3 10 | resources/sounds/sale_sound.mp3 11 | resources/sounds/not_enough_money_sound.mp3 12 | resources/sounds/new_wave_sound.mp3 13 | 14 | resources/sounds/particle_sound_0.mp3 15 | resources/sounds/particle_sound_1.mp3 16 | resources/sounds/particle_sound_2.mp3 17 | resources/sounds/particle_sound_3.mp3 18 | resources/sounds/particle_sound_4.mp3 19 | resources/sounds/particle_sound_5.mp3 20 | resources/sounds/particle_sound_6.mp3 21 | resources/sounds/particle_sound_7.mp3 22 | 23 | 24 | -------------------------------------------------------------------------------- /resources/buttons_resources/accept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/accept.png -------------------------------------------------------------------------------- /resources/buttons_resources/accept_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/accept_h.png -------------------------------------------------------------------------------- /resources/buttons_resources/bomb_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/bomb_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/bomb_button_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/bomb_button_h.png -------------------------------------------------------------------------------- /resources/buttons_resources/dec_level_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/dec_level_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/dec_level_button_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/dec_level_button_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/decline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/decline.png -------------------------------------------------------------------------------- /resources/buttons_resources/decline_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/decline_h.png -------------------------------------------------------------------------------- /resources/buttons_resources/default_tower_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/default_tower_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/default_tower_button_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/default_tower_button_h.png -------------------------------------------------------------------------------- /resources/buttons_resources/double_speed_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/double_speed_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/double_speed_button_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/double_speed_button_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/empty_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/empty_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/empty_button_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/empty_button_h.png -------------------------------------------------------------------------------- /resources/buttons_resources/inc_level_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/inc_level_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/inc_level_button_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/inc_level_button_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/language_button_eng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/language_button_eng.png -------------------------------------------------------------------------------- /resources/buttons_resources/language_button_eng_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/language_button_eng_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/language_button_rus — копия.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/language_button_rus — копия.png -------------------------------------------------------------------------------- /resources/buttons_resources/language_button_rus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/language_button_rus.png -------------------------------------------------------------------------------- /resources/buttons_resources/language_button_rus_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/language_button_rus_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/laser_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/laser_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/laser_button_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/laser_button_h.png -------------------------------------------------------------------------------- /resources/buttons_resources/next_level_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/next_level_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/next_level_button_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/next_level_button_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/non_toggle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/non_toggle.png -------------------------------------------------------------------------------- /resources/buttons_resources/non_toggle_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/non_toggle_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/normal_speed_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/normal_speed_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/normal_speed_button_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/normal_speed_button_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/online_button_offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/online_button_offline.png -------------------------------------------------------------------------------- /resources/buttons_resources/online_button_offline_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/online_button_offline_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/online_button_online.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/online_button_online.png -------------------------------------------------------------------------------- /resources/buttons_resources/online_button_online_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/online_button_online_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/open_chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/open_chat.png -------------------------------------------------------------------------------- /resources/buttons_resources/open_chat_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/open_chat_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/pause_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/pause_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/pause_button_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/pause_button_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/second_upgrade_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/second_upgrade_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/second_upgrade_button_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/second_upgrade_button_h.png -------------------------------------------------------------------------------- /resources/buttons_resources/send_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/send_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/send_button_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/send_button_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/sound_button_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/sound_button_off.png -------------------------------------------------------------------------------- /resources/buttons_resources/sound_button_off_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/sound_button_off_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/sound_button_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/sound_button_on.png -------------------------------------------------------------------------------- /resources/buttons_resources/sound_button_on_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/sound_button_on_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/support_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/support_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/support_button_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/support_button_h.png -------------------------------------------------------------------------------- /resources/buttons_resources/toggle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/toggle.png -------------------------------------------------------------------------------- /resources/buttons_resources/toggle_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/toggle_active.png -------------------------------------------------------------------------------- /resources/buttons_resources/upgrade_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/upgrade_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/upgrade_button_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/upgrade_button_h.png -------------------------------------------------------------------------------- /resources/buttons_resources/zero_speed_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/zero_speed_button.png -------------------------------------------------------------------------------- /resources/buttons_resources/zero_speed_button_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/buttons_resources/zero_speed_button_active.png -------------------------------------------------------------------------------- /resources/database/description_en_US.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "header": "Sell tower", 4 | "description": "Well, sell and sell. Why mumbling to?" 5 | }, 6 | { 7 | "header": "Fire tower T.1", 8 | "description": "Prototype of the shooting tower. When shooting, it produces a napalm clot that damages one target." 9 | }, 10 | { 11 | "header": "Bombuch Т.1", 12 | "description": "Scientists had a question \"What if they fire a projectile up rather than forward?\" The answer was this war machine. The answer was this machine of pure war." 13 | }, 14 | { 15 | "header": "Laser tower Т.1", 16 | "description": "Catkind has long been hypnotized with the so-called \"Laser pointer\". By increasing the power of this ray, we will bring the hell." 17 | }, 18 | { 19 | "header": "Support tower T.1", 20 | "description": "\"Some people think asking for help is a sign of weakness. That's just being stupid and stubborn. No matter how strong you are, allies make you stronger.\" © catptain Shepard\n Increase attack damage and attack speed" 21 | }, 22 | { 23 | "header": "Fire tower T.2", 24 | "description": "More fire! More destruction!" 25 | }, 26 | { 27 | "header": "Bombuch Т.2", 28 | "description": "Art is an EXPLOSION!" 29 | }, 30 | { 31 | "header": "Laser tower Т.2", 32 | "description": "The main thing is not lasers. The main thing is their number!" 33 | }, 34 | { 35 | "header": "Support tower T.2", 36 | "description": "Boxes are never too much. Especially SUCH kind of boxes. \n Increase attack damage and attack speed" 37 | }, 38 | { 39 | "header": "Fire tower T.3", 40 | "description": "Shoot, reload and shoot again. Make them regret the day they were born." 41 | }, 42 | { 43 | "header": "Bombuch Т.3", 44 | "description": "Once, two patrons fell into the barrel of a weapon. Can you guess what happened? Yes, the old tower exploded. But with the new one everything is fine now, right?" 45 | }, 46 | { 47 | "header": "Laser tower Т.3", 48 | "description": "Add some refractive lenses, repaint a couple of walls and look: a new way to take them apart!" 49 | }, 50 | { 51 | "header": "Support tower T.3", 52 | "description": "Send rays of goodness to everyone around us ;) \n Increase attack damage and attack speed" 53 | } 54 | ] 55 | -------------------------------------------------------------------------------- /resources/database/description_ru_RU.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "header": "Продажа башни", 4 | "description": "Ну продажа и продажа. Что бубнить то?" 5 | }, 6 | { 7 | "header": "Огневая башня T.1", 8 | "description": "Прототип стрелковой башни. При выстреле выпускает сгусток напалма, который при поражении наносит урон одиночной цели." 9 | }, 10 | { 11 | "header": "Бомбуч Т.1", 12 | "description": "Перед учеными возник вопрос. Что если запускать снаряд не вперед, а вверх? Ответом послужила эта громогласная машина войны." 13 | }, 14 | { 15 | "header": "Лазерная башня Т.1", 16 | "description": "Издавна наш вид был одурманен так называемой \"Лазерной указкой\". Усилив мощность этого луча в несколько раз, мы покажем нашим недругам ад." 17 | }, 18 | { 19 | "header": "Башня поддержки T.1", 20 | "description": "\"Кто-то думает, что просить о помощи значит проявить слабость. Это глупость и упрямство. Как бы ты ни был силён, союзники сделают тебя сильнее.\" © Котпитан Шепард \n Увеличивает урон и скорость атаки" 21 | }, 22 | { 23 | "header": "Огневая башня T.2", 24 | "description": "Больше огня, больше разрушений!" 25 | }, 26 | { 27 | "header": "Бомбуч Т.2", 28 | "description": "Искусство — это ВЗРЫВ!" 29 | }, 30 | { 31 | "header": "Лазерная башня Т.2", 32 | "description": "Главное — не лазеры. Главное — их количество!" 33 | }, 34 | { 35 | "header": "Башня поддержки T.2", 36 | "description": "Коробок много не бывает. Особенно ТАКИХ коробок.\n Увеличивает урон и скорость атаки" 37 | }, 38 | { 39 | "header": "Огневая башня T.3", 40 | "description": "Стреляй, перезарядись и выстрели снова. Заставь их пожалеть." 41 | }, 42 | { 43 | "header": "Бомбуч Т.3", 44 | "description": "Как-то раз в дуло засыпали два патрона. И что бы вы думали? Да, старая башня взорвалась. Но в новой-то все хорошо? Ведь так?" 45 | }, 46 | { 47 | "header": "Лазерная башня Т.3", 48 | "description": "Добавим немного преломляющих линз. Подкрасим пару стенок. И вот. Новый способ разложить их на гайки." 49 | }, 50 | { 51 | "header": "Башня поддержки T.3", 52 | "description": "Посылаем лучи добра всем вокруг себя ;)\n Увеличивает урон и скорость атаки" 53 | } 54 | ] 55 | -------------------------------------------------------------------------------- /resources/database/server_en_US.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "message": "%1", 4 | "type": 0 5 | }, 6 | { 7 | "message": "! %1 _DEAD_", 8 | "type": 0 9 | }, 10 | { 11 | "message": "! Player %1 joined the room.", 12 | "type": 0 13 | }, 14 | { 15 | "message": "! Player %1 finish the room with %2 HP.", 16 | "type": 0 17 | }, 18 | { 19 | "message": "< %1 left game... ", 20 | "type": 0 21 | }, 22 | { 23 | "message": "< %1 WIN THE GAME Wow! With %2 HP.", 24 | "type": 0 25 | }, 26 | { 27 | "message": "< Room starts in %1 seconds.", 28 | "type": 0 29 | }, 30 | { 31 | "message": "< Round starts in %1 seconds.", 32 | "type": 0 33 | }, 34 | { 35 | "message": "< Round starts!!", 36 | "type": 0 37 | }, 38 | { 39 | "message": "< Connected", 40 | "type": 0 41 | }, 42 | { 43 | "message": "! Your chat is offline", 44 | "type": 0 45 | }, 46 | { 47 | "message": "! gold error", 48 | "type": 0 49 | }, 50 | { 51 | "message": "< Disconnect", 52 | "type": 0 53 | }, 54 | { 55 | "message": "! command error", 56 | "type": 0 57 | }, 58 | { 59 | "message": "< Game End", 60 | "type": 0 61 | }, 62 | { 63 | "message": "! Your Name is null", 64 | "type": 0 65 | }, 66 | { 67 | "message": "< Enter /register .", 68 | "type": 0 69 | }, 70 | { 71 | "message": "< Or enter /autoregister", 72 | "type": 0 73 | }, 74 | { 75 | "message": "< ❤_INFINITY HEALTH_❤", 76 | "type": 0 77 | }, 78 | { 79 | "message": "< $$$ MOOOREE GOOLLDLDLDLD $$$", 80 | "type": 0 81 | }, 82 | { 83 | "message": "< Ok.", 84 | "type": 0 85 | }, 86 | { 87 | "message": "< Server closed", 88 | "type": 0 89 | }, 90 | { 91 | "message": "< Your nickname is : %1", 92 | "type": 0 93 | }, 94 | { 95 | "message": "! You created the room.", 96 | "type": 0 97 | }, 98 | { 99 | "message": "! You left the room.", 100 | "type": 0 101 | }, 102 | { 103 | "message": "! Message is too long.", 104 | "type": 0 105 | }, 106 | { 107 | "message": "SERVER IS UNAVAILABLE.", 108 | "type": 1 109 | }, 110 | { 111 | "message": "< Someone started the game at level %1!! Connect faster!", 112 | "type": 0 113 | }, 114 | { 115 | "message": "! Cheats don't work in multiplayer :(", 116 | "type": 0 117 | }, 118 | { 119 | "message": "< /gold N - add N gold to your balance", 120 | "type": 0 121 | }, 122 | { 123 | "message": "< /iddqd - immortality ", 124 | "type": 0 125 | }, 126 | { 127 | "message": "< /clear - clear chat ", 128 | "type": 0 129 | }, 130 | { 131 | "message": "< /unlock - to unlock levels ", 132 | "type": 0 133 | }, 134 | { 135 | "message": "< You are the smartest guy I've ever seen...", 136 | "type": 0 137 | } 138 | ] 139 | -------------------------------------------------------------------------------- /resources/database/server_ru_RU.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "message": "%1", 4 | "type": 0 5 | }, 6 | { 7 | "message": "! %1 _ПРОИГРАЛ_", 8 | "type": 0 9 | }, 10 | { 11 | "message": "! Игрок %1 присоединился.", 12 | "type": 0 13 | }, 14 | { 15 | "message": "! Игрок %1 завершил раунд с %2 HP.", 16 | "type": 0 17 | }, 18 | { 19 | "message": "< %1 покинул игру... ", 20 | "type": 0 21 | }, 22 | { 23 | "message": "< %1 ВЫЙГРАЛ! Вау! Всего с %2 HP.", 24 | "type": 0 25 | }, 26 | { 27 | "message": "< Стартует комната через ~%1 seconds.", 28 | "type": 0 29 | }, 30 | { 31 | "message": "< Стартует раунд через ~%1 seconds.", 32 | "type": 0 33 | }, 34 | { 35 | "message": "< РАУНД НАЧАЛСЯ!!!!", 36 | "type": 0 37 | }, 38 | { 39 | "message": "< Подключились", 40 | "type": 0 41 | }, 42 | { 43 | "message": "! Ваш чат в оффлайне", 44 | "type": 0 45 | }, 46 | { 47 | "message": "! денежная ошибка", 48 | "type": 0 49 | }, 50 | { 51 | "message": "< Отключились :)", 52 | "type": 0 53 | }, 54 | { 55 | "message": "! неверная команда", 56 | "type": 0 57 | }, 58 | { 59 | "message": "< Игра З А В Е Р Ш Е Н А ", 60 | "type": 0 61 | }, 62 | { 63 | "message": "! У вас пустое имя", 64 | "type": 0 65 | }, 66 | { 67 | "message": "< Введите /register <НикНейм>.", 68 | "type": 0 69 | }, 70 | { 71 | "message": "< Или введите /autoregister ", 72 | "type": 0 73 | }, 74 | { 75 | "message": "< ❤_Бессмертное состояние_❤", 76 | "type": 0 77 | }, 78 | { 79 | "message": "< $$$ БОЛЬШЕ ЗОЛОТА $$$", 80 | "type": 0 81 | }, 82 | { 83 | "message": "< Окей.", 84 | "type": 0 85 | }, 86 | { 87 | "message": "< Сервер закрылся.", 88 | "type": 0 89 | }, 90 | { 91 | "message": "< Ваше имя это : %1", 92 | "type": 0 93 | }, 94 | { 95 | "message": "! Вы создали комнату.", 96 | "type": 0 97 | }, 98 | { 99 | "message": "! Вы покинули комнату.", 100 | "type": 0 101 | }, 102 | { 103 | "message": "! Сообщение слишком длинное", 104 | "type": 0 105 | }, 106 | { 107 | "message": "Сервер недоступен.", 108 | "type": 1 109 | }, 110 | { 111 | "message": "< Кто-то начал игру на уровне %1! Быстрее подключайся.", 112 | "type": 0 113 | }, 114 | { 115 | "message": "! В мультиплеере читы не работают :(", 116 | "type": 0 117 | }, 118 | { 119 | "message": "< /gold N - добавляет N денег", 120 | "type": 0 121 | }, 122 | { 123 | "message": "< /iddqd - бессмертие", 124 | "type": 0 125 | }, 126 | { 127 | "message": "< /clear - отчистка чата", 128 | "type": 0 129 | }, 130 | { 131 | "message": "< /unlock - чтобы разблокировать уровни ", 132 | "type": 0 133 | }, 134 | { 135 | "message": "< Ух ты, какой же ты крутой. ", 136 | "type": 0 137 | } 138 | ] 139 | -------------------------------------------------------------------------------- /resources/database/titles.txt: -------------------------------------------------------------------------------- 1 | Giggling Penguin Team 2 | 3 | 4 | Программисты 5 | Кацуба Станислав 6 | Козулин Владислав 7 | Захарнева Мария 8 | Феденя Елизавета 9 | 10 | Геймдизайнеры 11 | Козулин Владислав 12 | Кацуба Станислав 13 | 14 | Главный художник 15 | Феденя Елизавета 16 | 17 | Музыкальный директор 18 | Захарнева Мария 19 | 20 | Специалисты по анимации 21 | Феденя Елизавета 22 | Козулин Владислав 23 | 24 | Художники игрового интерфейса 25 | Захарнева Мария 26 | Кацуба Станислав 27 | Козулин Владислав 28 | 29 | Руководитель тестирования 30 | Кацуба Станислав 31 | 32 | Главный специалист по движку 33 | Неверо Андрей 34 | 35 | Тестирование 36 | Неверо Андрей 37 | Тарайкович Алеся 38 | Феденя Елизавета 39 | Козулин Владислав 40 | Захарнева Мария 41 | 42 | Перевод (русский) 43 | Кацуба Станислав 44 | Тарайкович Алеся 45 | Феденя Елизавета 46 | 47 | Перевод (английский) 48 | Katsuba Stanislaw 49 | Taraikovich Alesya 50 | Fedenya Elizabeth 51 | 52 | Художник персонажей 53 | Феденя Елизавета 54 | 55 | Глава Андроид разработки 56 | и его подопечные 57 | Андрей Неверо 58 | Козулин Владислав 59 | Кацуба Станислав 60 | 61 | Разработчики интерфейса 62 | Захарнева Мария 63 | Кацуба Станислав 64 | Козулин Владислвв 65 | 66 | Убитый Мастер 67 | Козулин Владислав 68 | Захарнева Мария 69 | 70 | Левел-дизайнеры 71 | Кацуба Станислав 72 | Феденя Елизавета 73 | 74 | Команда ИИ 75 | Кацуба Станислав 76 | Феденя Елизавета 77 | Козулин Владислав 78 | 79 | Технические художники 80 | Захарнева Мария 81 | 82 | Прописывание Лора 83 | Феденя Елизавета 84 | Кацуба Станислав 85 | 86 | Сетевые Функции 87 | Козулин Владислав 88 | 89 | Ведущий токсик 90 | Кацуба Станислав 91 | 92 | Главный пацифист 93 | Мария Захарнева 94 | 95 | Козулин Владислав Дмитриевич 96 | Козулин Владислав 97 | 98 | Специалист по бубубу 99 | Феденя Елизавета 100 | 101 | а также 102 | 103 | Владелец сервера 104 | Коледа Егор 105 | 106 | Огромная благодарность 107 | нашим кураторам 108 | ❤ Неверо Андрей ❤ 109 | ❤ Тарайкович Алеся ❤ 110 | за помощь и поддержку 111 | 112 | 113 | 114 | 115 | кровью 116 | потом 117 | пятью выходами из беседы 118 | часами споров 119 | железными нервами 120 | был создан проект 121 | 122 | 123 | 124 | 125 | TECH VS CATS 126 | -------------------------------------------------------------------------------- /resources/fonts/gui_font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/fonts/gui_font.ttf -------------------------------------------------------------------------------- /resources/images/backgrounds/cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/backgrounds/cloud.png -------------------------------------------------------------------------------- /resources/images/backgrounds/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/backgrounds/logo.png -------------------------------------------------------------------------------- /resources/images/backgrounds/main_background_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/backgrounds/main_background_1.png -------------------------------------------------------------------------------- /resources/images/backgrounds/map_level_1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/backgrounds/map_level_1_1.png -------------------------------------------------------------------------------- /resources/images/backgrounds/map_level_2_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/backgrounds/map_level_2_1.png -------------------------------------------------------------------------------- /resources/images/backgrounds/map_level_3_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/backgrounds/map_level_3_1.png -------------------------------------------------------------------------------- /resources/images/backgrounds/pause_menu_background_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/backgrounds/pause_menu_background_1.png -------------------------------------------------------------------------------- /resources/images/backgrounds/settings_background_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/backgrounds/settings_background_1.png -------------------------------------------------------------------------------- /resources/images/backgrounds/texture_level_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/backgrounds/texture_level_1.png -------------------------------------------------------------------------------- /resources/images/backgrounds/texture_level_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/backgrounds/texture_level_2.png -------------------------------------------------------------------------------- /resources/images/backgrounds/texture_level_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/backgrounds/texture_level_3.png -------------------------------------------------------------------------------- /resources/images/backgrounds/titles_background_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/backgrounds/titles_background_1.png -------------------------------------------------------------------------------- /resources/images/enemies/fridge_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/fridge_1.png -------------------------------------------------------------------------------- /resources/images/enemies/fridge_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/fridge_2.png -------------------------------------------------------------------------------- /resources/images/enemies/fridge_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/fridge_3.png -------------------------------------------------------------------------------- /resources/images/enemies/fridge_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/fridge_4.png -------------------------------------------------------------------------------- /resources/images/enemies/fridge_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/fridge_5.png -------------------------------------------------------------------------------- /resources/images/enemies/fridge_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/fridge_6.png -------------------------------------------------------------------------------- /resources/images/enemies/fridge_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/fridge_7.png -------------------------------------------------------------------------------- /resources/images/enemies/fridge_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/fridge_8.png -------------------------------------------------------------------------------- /resources/images/enemies/mouse_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/mouse_1.png -------------------------------------------------------------------------------- /resources/images/enemies/mouse_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/mouse_2.png -------------------------------------------------------------------------------- /resources/images/enemies/mouse_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/mouse_3.png -------------------------------------------------------------------------------- /resources/images/enemies/mouse_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/mouse_4.png -------------------------------------------------------------------------------- /resources/images/enemies/router_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/router_1.png -------------------------------------------------------------------------------- /resources/images/enemies/router_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/router_2.png -------------------------------------------------------------------------------- /resources/images/enemies/router_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/router_3.png -------------------------------------------------------------------------------- /resources/images/enemies/router_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/router_4.png -------------------------------------------------------------------------------- /resources/images/enemies/toster_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/toster_1.png -------------------------------------------------------------------------------- /resources/images/enemies/toster_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/toster_2.png -------------------------------------------------------------------------------- /resources/images/enemies/toster_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/toster_3.png -------------------------------------------------------------------------------- /resources/images/enemies/toster_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/toster_4.png -------------------------------------------------------------------------------- /resources/images/enemies/vaccleaner_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/vaccleaner_1.png -------------------------------------------------------------------------------- /resources/images/enemies/vaccleaner_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/vaccleaner_2.png -------------------------------------------------------------------------------- /resources/images/enemies/vaccleaner_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/vaccleaner_3.png -------------------------------------------------------------------------------- /resources/images/enemies/vaccleaner_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/vaccleaner_4.png -------------------------------------------------------------------------------- /resources/images/enemies/vaccleaner_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/vaccleaner_5.png -------------------------------------------------------------------------------- /resources/images/enemies/vaccleaner_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/vaccleaner_6.png -------------------------------------------------------------------------------- /resources/images/enemies/vaccleaner_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/vaccleaner_7.png -------------------------------------------------------------------------------- /resources/images/enemies/washmachine_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/washmachine_1.png -------------------------------------------------------------------------------- /resources/images/enemies/washmachine_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/washmachine_2.png -------------------------------------------------------------------------------- /resources/images/enemies/washmachine_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/washmachine_3.png -------------------------------------------------------------------------------- /resources/images/enemies/washmachine_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/washmachine_4.png -------------------------------------------------------------------------------- /resources/images/enemies/washmachine_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/washmachine_5.png -------------------------------------------------------------------------------- /resources/images/enemies/washmachine_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/washmachine_6.png -------------------------------------------------------------------------------- /resources/images/enemies/washmachine_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/enemies/washmachine_7.png -------------------------------------------------------------------------------- /resources/images/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/error.png -------------------------------------------------------------------------------- /resources/images/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/icon.ico -------------------------------------------------------------------------------- /resources/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/icon.png -------------------------------------------------------------------------------- /resources/images/icons/fast_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/icons/fast_1.png -------------------------------------------------------------------------------- /resources/images/icons/fast_attack_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/icons/fast_attack_1.png -------------------------------------------------------------------------------- /resources/images/icons/less_armor_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/icons/less_armor_1.png -------------------------------------------------------------------------------- /resources/images/icons/less_damage_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/icons/less_damage_1.png -------------------------------------------------------------------------------- /resources/images/icons/less_range_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/icons/less_range_1.png -------------------------------------------------------------------------------- /resources/images/icons/more_armor_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/icons/more_armor_1.png -------------------------------------------------------------------------------- /resources/images/icons/more_damage_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/icons/more_damage_1.png -------------------------------------------------------------------------------- /resources/images/icons/more_range_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/icons/more_range_1.png -------------------------------------------------------------------------------- /resources/images/icons/slow_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/icons/slow_1.png -------------------------------------------------------------------------------- /resources/images/icons/slow_attack_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/icons/slow_attack_1.png -------------------------------------------------------------------------------- /resources/images/interface/interface_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/interface/interface_1.png -------------------------------------------------------------------------------- /resources/images/particles/flash4_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/flash4_1.png -------------------------------------------------------------------------------- /resources/images/particles/flash4_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/flash4_2.png -------------------------------------------------------------------------------- /resources/images/particles/flash4_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/flash4_3.png -------------------------------------------------------------------------------- /resources/images/particles/flash4_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/flash4_4.png -------------------------------------------------------------------------------- /resources/images/particles/friework7_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/friework7_1.png -------------------------------------------------------------------------------- /resources/images/particles/friework7_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/friework7_10.png -------------------------------------------------------------------------------- /resources/images/particles/friework7_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/friework7_11.png -------------------------------------------------------------------------------- /resources/images/particles/friework7_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/friework7_12.png -------------------------------------------------------------------------------- /resources/images/particles/friework7_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/friework7_2.png -------------------------------------------------------------------------------- /resources/images/particles/friework7_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/friework7_3.png -------------------------------------------------------------------------------- /resources/images/particles/friework7_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/friework7_4.png -------------------------------------------------------------------------------- /resources/images/particles/friework7_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/friework7_5.png -------------------------------------------------------------------------------- /resources/images/particles/friework7_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/friework7_6.png -------------------------------------------------------------------------------- /resources/images/particles/friework7_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/friework7_7.png -------------------------------------------------------------------------------- /resources/images/particles/friework7_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/friework7_8.png -------------------------------------------------------------------------------- /resources/images/particles/friework7_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/friework7_9.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom0_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom0_1.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom0_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom0_2.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom0_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom0_3.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom0_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom0_4.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom0_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom0_5.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom0_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom0_6.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom0_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom0_7.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom0_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom0_8.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom1_1.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom1_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom1_2.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom1_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom1_3.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom1_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom1_4.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom1_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom1_5.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom1_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom1_6.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom1_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom1_7.png -------------------------------------------------------------------------------- /resources/images/particles/kaboom1_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/kaboom1_8.png -------------------------------------------------------------------------------- /resources/images/particles/on_fire2_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/on_fire2_1.png -------------------------------------------------------------------------------- /resources/images/particles/on_fire2_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/on_fire2_2.png -------------------------------------------------------------------------------- /resources/images/particles/on_fire2_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/on_fire2_3.png -------------------------------------------------------------------------------- /resources/images/particles/on_fire2_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/on_fire2_4.png -------------------------------------------------------------------------------- /resources/images/particles/on_fire2_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/on_fire2_5.png -------------------------------------------------------------------------------- /resources/images/particles/poof5_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/poof5_1.png -------------------------------------------------------------------------------- /resources/images/particles/poof5_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/poof5_2.png -------------------------------------------------------------------------------- /resources/images/particles/poof5_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/poof5_3.png -------------------------------------------------------------------------------- /resources/images/particles/scar3_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/scar3_1.png -------------------------------------------------------------------------------- /resources/images/particles/scar3_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/scar3_2.png -------------------------------------------------------------------------------- /resources/images/particles/scar3_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/scar3_3.png -------------------------------------------------------------------------------- /resources/images/particles/scar3_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/scar3_4.png -------------------------------------------------------------------------------- /resources/images/particles/scar3_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/scar3_5.png -------------------------------------------------------------------------------- /resources/images/particles/scar3_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/scar3_6.png -------------------------------------------------------------------------------- /resources/images/particles/smoke6_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/smoke6_1.png -------------------------------------------------------------------------------- /resources/images/particles/smoke6_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/smoke6_2.png -------------------------------------------------------------------------------- /resources/images/particles/smoke6_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/smoke6_3.png -------------------------------------------------------------------------------- /resources/images/particles/smoke6_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/smoke6_4.png -------------------------------------------------------------------------------- /resources/images/particles/smoke6_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/smoke6_5.png -------------------------------------------------------------------------------- /resources/images/particles/smoke6_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/smoke6_6.png -------------------------------------------------------------------------------- /resources/images/particles/smoke6_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/smoke6_7.png -------------------------------------------------------------------------------- /resources/images/particles/smoke6_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/smoke6_8.png -------------------------------------------------------------------------------- /resources/images/particles/smoke6_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/particles/smoke6_9.png -------------------------------------------------------------------------------- /resources/images/projectiles/bullet0_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/projectiles/bullet0_1.png -------------------------------------------------------------------------------- /resources/images/projectiles/laser2_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/projectiles/laser2_1.png -------------------------------------------------------------------------------- /resources/images/projectiles/laser2_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/projectiles/laser2_2.png -------------------------------------------------------------------------------- /resources/images/projectiles/laser2_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/projectiles/laser2_3.png -------------------------------------------------------------------------------- /resources/images/projectiles/laser2_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/projectiles/laser2_4.png -------------------------------------------------------------------------------- /resources/images/projectiles/upfly1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/projectiles/upfly1_1.png -------------------------------------------------------------------------------- /resources/images/projectiles/upfly1_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/projectiles/upfly1_2.png -------------------------------------------------------------------------------- /resources/images/projectiles/upfly1_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/projectiles/upfly1_3.png -------------------------------------------------------------------------------- /resources/images/projectiles/upfly1_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/projectiles/upfly1_4.png -------------------------------------------------------------------------------- /resources/images/projectiles/upfly1_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/projectiles/upfly1_5.png -------------------------------------------------------------------------------- /resources/images/projectiles/upfly1_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/projectiles/upfly1_6.png -------------------------------------------------------------------------------- /resources/images/projectiles/upfly1_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/projectiles/upfly1_7.png -------------------------------------------------------------------------------- /resources/images/projectiles/upfly1_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/projectiles/upfly1_8.png -------------------------------------------------------------------------------- /resources/images/projectiles/upfly1_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/projectiles/upfly1_9.png -------------------------------------------------------------------------------- /resources/images/towers/base_0_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/base_0_1.png -------------------------------------------------------------------------------- /resources/images/towers/base_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/base_1.png -------------------------------------------------------------------------------- /resources/images/towers/base_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/base_2.png -------------------------------------------------------------------------------- /resources/images/towers/base_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/base_3.png -------------------------------------------------------------------------------- /resources/images/towers/base_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/base_4.png -------------------------------------------------------------------------------- /resources/images/towers/base_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/base_5.png -------------------------------------------------------------------------------- /resources/images/towers/base_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/base_6.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_post_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_post_1.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_post_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_post_2.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_post_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_post_3.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_post_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_post_4.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_post_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_post_5.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_pre_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_pre_1.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_pre_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_pre_2.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_pre_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_pre_3.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_pre_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_pre_4.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_pre_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_pre_5.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_reload_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_reload_1.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_reload_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_reload_2.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_reload_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_reload_3.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_reload_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_reload_4.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_reload_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_reload_5.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_reload_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_reload_6.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_reload_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_reload_7.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv2_reload_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv2_reload_8.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_post_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_post_1.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_post_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_post_2.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_post_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_post_3.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_post_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_post_4.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_post_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_post_5.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_pre_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_pre_1.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_pre_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_pre_2.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_pre_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_pre_3.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_pre_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_pre_4.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_pre_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_pre_5.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_reload_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_reload_1.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_reload_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_reload_2.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_reload_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_reload_3.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_reload_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_reload_4.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_reload_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_reload_5.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_reload_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_reload_6.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_reload_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_reload_7.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_lv3_reload_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_lv3_reload_8.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_post_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_post_1.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_post_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_post_2.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_post_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_post_3.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_post_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_post_4.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_post_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_post_5.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_pre_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_pre_1.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_pre_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_pre_2.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_pre_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_pre_3.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_pre_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_pre_4.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_pre_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_pre_5.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_reload_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_reload_1.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_reload_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_reload_2.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_reload_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_reload_3.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_reload_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_reload_4.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_reload_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_reload_5.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_reload_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_reload_6.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_reload_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_reload_7.png -------------------------------------------------------------------------------- /resources/images/towers/bomb_reload_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/bomb_reload_8.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv2_post_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv2_post_1.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv2_post_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv2_post_2.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv2_post_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv2_post_3.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv2_post_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv2_post_4.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv2_pre_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv2_pre_1.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv2_pre_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv2_pre_2.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv2_pre_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv2_pre_3.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv2_pre_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv2_pre_4.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv2_reload_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv2_reload_1.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv2_reload_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv2_reload_2.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv2_reload_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv2_reload_3.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv2_reload_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv2_reload_4.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv3_post_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv3_post_1.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv3_post_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv3_post_2.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv3_post_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv3_post_3.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv3_post_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv3_post_4.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv3_pre_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv3_pre_1.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv3_pre_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv3_pre_2.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv3_pre_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv3_pre_3.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv3_pre_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv3_pre_4.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv3_reload_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv3_reload_1.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv3_reload_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv3_reload_2.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv3_reload_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv3_reload_3.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_lv3_reload_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_lv3_reload_4.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_post_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_post_1.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_post_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_post_2.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_post_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_post_3.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_post_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_post_4.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_pre_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_pre_1.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_pre_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_pre_2.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_pre_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_pre_3.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_pre_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_pre_4.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_reload_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_reload_1.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_reload_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_reload_2.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_reload_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_reload_3.png -------------------------------------------------------------------------------- /resources/images/towers/default_tower_reload_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/default_tower_reload_4.png -------------------------------------------------------------------------------- /resources/images/towers/empty_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/empty_1.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_post_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_post_1.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_post_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_post_2.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_post_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_post_3.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_post_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_post_4.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_pre_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_pre_1.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_pre_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_pre_2.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_pre_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_pre_3.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_pre_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_pre_4.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_reload_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_reload_1.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_reload_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_reload_2.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_reload_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_reload_3.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_reload_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_reload_4.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_reload_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_reload_5.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_reload_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_reload_6.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv2_reload_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv2_reload_7.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_post_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_post_1.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_post_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_post_2.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_post_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_post_3.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_post_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_post_4.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_pre_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_pre_1.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_pre_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_pre_2.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_pre_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_pre_3.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_pre_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_pre_4.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_reload_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_reload_1.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_reload_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_reload_2.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_reload_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_reload_3.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_reload_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_reload_4.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_reload_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_reload_5.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_reload_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_reload_6.png -------------------------------------------------------------------------------- /resources/images/towers/laser_lv3_reload_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_lv3_reload_7.png -------------------------------------------------------------------------------- /resources/images/towers/laser_post_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_post_1.png -------------------------------------------------------------------------------- /resources/images/towers/laser_post_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_post_2.png -------------------------------------------------------------------------------- /resources/images/towers/laser_post_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_post_3.png -------------------------------------------------------------------------------- /resources/images/towers/laser_post_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_post_4.png -------------------------------------------------------------------------------- /resources/images/towers/laser_pre_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_pre_1.png -------------------------------------------------------------------------------- /resources/images/towers/laser_pre_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_pre_2.png -------------------------------------------------------------------------------- /resources/images/towers/laser_pre_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_pre_3.png -------------------------------------------------------------------------------- /resources/images/towers/laser_pre_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_pre_4.png -------------------------------------------------------------------------------- /resources/images/towers/laser_reload_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_reload_1.png -------------------------------------------------------------------------------- /resources/images/towers/laser_reload_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_reload_2.png -------------------------------------------------------------------------------- /resources/images/towers/laser_reload_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_reload_3.png -------------------------------------------------------------------------------- /resources/images/towers/laser_reload_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_reload_4.png -------------------------------------------------------------------------------- /resources/images/towers/laser_reload_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_reload_5.png -------------------------------------------------------------------------------- /resources/images/towers/laser_reload_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_reload_6.png -------------------------------------------------------------------------------- /resources/images/towers/laser_reload_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/laser_reload_7.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv2_reload_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv2_reload_1.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv2_reload_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv2_reload_2.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv2_reload_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv2_reload_3.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv2_reload_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv2_reload_4.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv2_reload_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv2_reload_5.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv2_reload_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv2_reload_6.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv2_reload_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv2_reload_7.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv2_reload_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv2_reload_8.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv3_reload_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv3_reload_1.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv3_reload_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv3_reload_2.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv3_reload_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv3_reload_3.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv3_reload_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv3_reload_4.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv3_reload_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv3_reload_5.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv3_reload_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv3_reload_6.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv3_reload_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv3_reload_7.png -------------------------------------------------------------------------------- /resources/images/towers/support_lv3_reload_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_lv3_reload_8.png -------------------------------------------------------------------------------- /resources/images/towers/support_reload_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_reload_1.png -------------------------------------------------------------------------------- /resources/images/towers/support_reload_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_reload_2.png -------------------------------------------------------------------------------- /resources/images/towers/support_reload_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_reload_3.png -------------------------------------------------------------------------------- /resources/images/towers/support_reload_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_reload_4.png -------------------------------------------------------------------------------- /resources/images/towers/support_reload_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_reload_5.png -------------------------------------------------------------------------------- /resources/images/towers/support_reload_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_reload_6.png -------------------------------------------------------------------------------- /resources/images/towers/support_reload_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_reload_7.png -------------------------------------------------------------------------------- /resources/images/towers/support_reload_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/images/towers/support_reload_8.png -------------------------------------------------------------------------------- /resources/sounds/button_click.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/button_click.mp3 -------------------------------------------------------------------------------- /resources/sounds/epic_boss.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/epic_boss.mp3 -------------------------------------------------------------------------------- /resources/sounds/game_over_sound.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/game_over_sound.mp3 -------------------------------------------------------------------------------- /resources/sounds/game_sound.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/game_sound.mp3 -------------------------------------------------------------------------------- /resources/sounds/game_won_sound.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/game_won_sound.mp3 -------------------------------------------------------------------------------- /resources/sounds/menu_sound.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/menu_sound.mp3 -------------------------------------------------------------------------------- /resources/sounds/new_wave_sound.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/new_wave_sound.mp3 -------------------------------------------------------------------------------- /resources/sounds/not_enough_money_sound.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/not_enough_money_sound.mp3 -------------------------------------------------------------------------------- /resources/sounds/particle_sound_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/particle_sound_0.mp3 -------------------------------------------------------------------------------- /resources/sounds/particle_sound_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/particle_sound_1.mp3 -------------------------------------------------------------------------------- /resources/sounds/particle_sound_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/particle_sound_2.mp3 -------------------------------------------------------------------------------- /resources/sounds/particle_sound_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/particle_sound_3.mp3 -------------------------------------------------------------------------------- /resources/sounds/particle_sound_4.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/particle_sound_4.mp3 -------------------------------------------------------------------------------- /resources/sounds/particle_sound_5.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/particle_sound_5.mp3 -------------------------------------------------------------------------------- /resources/sounds/particle_sound_6.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/particle_sound_6.mp3 -------------------------------------------------------------------------------- /resources/sounds/particle_sound_7.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/particle_sound_7.mp3 -------------------------------------------------------------------------------- /resources/sounds/sale_sound.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/sale_sound.mp3 -------------------------------------------------------------------------------- /resources/sounds/titles_sound.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/sounds/titles_sound.mp3 -------------------------------------------------------------------------------- /resources/translations/translation_en_US.qm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/translations/translation_en_US.qm -------------------------------------------------------------------------------- /resources/translations/translation_ru_RU.qm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PGSStas/techvscats/6e4c195620ccc15aa716120da1d33d21b267bc58/resources/translations/translation_ru_RU.qm --------------------------------------------------------------------------------