├── .gitattributes ├── .gitignore ├── CHANGELOG.md ├── LICENSE.md ├── PORT.md ├── README.md ├── TRANSLATIONS.md ├── assets ├── branding │ ├── p1x_logo.png │ ├── tof_logo.png │ ├── tof_logo_big.png │ └── tof_logo_enchanced.png ├── buildings │ ├── buildings_special.png │ ├── fall │ │ ├── buildings_big.png │ │ └── buildings_small.png │ ├── fences.png │ ├── flags_spritesheet.png │ ├── military.png │ ├── particle_smoke.png │ ├── summer │ │ ├── buildings_big.png │ │ └── buildings_small.png │ └── winter │ │ ├── buildings_big.png │ │ └── buildings_small.png ├── campaigns │ ├── fall.png │ ├── summer.png │ └── winter.png ├── czlowiekimadlo.crt ├── explosions.png ├── fonts │ └── ttf │ │ ├── courier.ttf │ │ └── japan.ttf ├── gamepad.png ├── gui │ ├── buttons │ │ ├── analog_size2_0.png │ │ ├── analog_size2_1.png │ │ ├── analog_size2_2.png │ │ ├── analog_size2_2b.png │ │ ├── analog_size2_3.png │ │ ├── analog_size2_4.png │ │ ├── analog_size3_0.png │ │ ├── analog_size3_1.png │ │ ├── analog_size3_2.png │ │ ├── analog_size3_2b.png │ │ ├── analog_size3_3.png │ │ ├── analog_size3_4.png │ │ ├── analog_size3_5.png │ │ ├── analog_size3_6.png │ │ ├── analog_size3_7.png │ │ ├── gamepad-buttons.png │ │ ├── lcd_70_0.png │ │ ├── lcd_70_1.png │ │ └── lcd_70_2.png │ ├── checkbox │ │ ├── checkbox_off.png │ │ └── checkbox_on.png │ ├── dialogs │ │ ├── big_icons.png │ │ ├── gui_spritesheet.png │ │ ├── icons.png │ │ ├── menu9@2x.png │ │ ├── menu9_blue@2x.png │ │ ├── menu9_dark@2x.png │ │ ├── menu9_red@2x.png │ │ └── progress.png │ ├── extras │ │ ├── black-box.png │ │ ├── corner.png │ │ └── vigette.png │ ├── selectors_spritesheet.png │ └── workshop │ │ ├── building_blocks.png │ │ └── icons.png ├── icons │ ├── icon1024.png │ ├── icon128.png │ ├── icon16.png │ ├── icon24.png │ ├── icon256.png │ ├── icon32.png │ ├── icon48.png │ ├── icon512.png │ ├── osx.icns │ └── win.ico ├── overscan1920.jpg ├── sounds │ ├── fx │ │ ├── button.wav │ │ ├── end_turn.wav │ │ ├── explosion.wav │ │ ├── hurt.wav │ │ ├── menu.wav │ │ ├── move.wav │ │ ├── no_attack.wav │ │ ├── no_moves.wav │ │ ├── not_dead.wav │ │ ├── pickup_box.wav │ │ ├── powerup.wav │ │ ├── select.wav │ │ ├── spawn.wav │ │ └── units │ │ │ ├── 01.soldier │ │ │ ├── soldier_attack.wav │ │ │ ├── soldier_damage.wav │ │ │ ├── soldier_die.wav │ │ │ ├── soldier_move.wav │ │ │ └── soldier_spawn.wav │ │ │ ├── 02.tank │ │ │ ├── tank_attack.wav │ │ │ ├── tank_damage.wav │ │ │ ├── tank_die.wav │ │ │ ├── tank_move.wav │ │ │ ├── tank_spawn.wav │ │ │ └── tank_spawn.wav.reapeaks │ │ │ ├── 03.helicopter │ │ │ ├── helicopter_attack.wav │ │ │ ├── helicopter_damage.wav │ │ │ ├── helicopter_die.wav │ │ │ ├── helicopter_move.wav │ │ │ └── helicopter_spawn.wav │ │ │ └── 11.buildings │ │ │ ├── occupy_building.wav │ │ │ └── passive_building_ap.wav │ └── soundtrack │ │ ├── intro.ogg │ │ ├── map_soundtrack_1.ogg │ │ ├── map_soundtrack_2.ogg │ │ └── menu_soundtrack.ogg ├── splash_screen.png ├── terrain │ ├── action_tiles.png │ ├── clouds.png │ ├── destruction.png │ ├── fall │ │ ├── ground.png │ │ ├── terrain_movable.png │ │ └── terrain_non-movable.png │ ├── summer │ │ ├── ground.png │ │ ├── terrain_movable.png │ │ └── terrain_non-movable.png │ ├── terrain.png │ ├── underground.png │ ├── waves.png │ └── winter │ │ ├── ground.png │ │ ├── terrain_movable.png │ │ └── terrain_non-movable.png └── units │ ├── avatars_spritesheet.png │ ├── blueprint_units.png │ ├── civilians_spritesheet.png │ ├── health_bar.png │ ├── icon_shield.png │ └── units_spritesheet.png ├── bin ├── android_debug ├── android_logcat ├── compact.py └── export ├── buildConfig ├── build_android.cfg ├── build_linux32.cfg ├── build_linux64.cfg ├── build_osx.cfg ├── build_windows.cfg ├── engine_android.cfg ├── engine_desktop.cfg ├── engine_linux32.cfg ├── engine_osx.cfg ├── export_android.cfg.dist ├── export_desktop.cfg └── export_linux32.cfg ├── buildings ├── airport.xscn ├── barrack.xscn ├── bunker_blue.xscn ├── bunker_red.xscn ├── factory.xscn ├── fence.xscn └── tower.xscn ├── engine.cfg ├── game.xscn ├── gui ├── button_normal.tres ├── button_normal_theme.tres ├── button_small.tres ├── button_small_theme.tres ├── checkbox_theme.tres ├── corners.xscn ├── default_theme.tres ├── flag.xscn ├── font_12.tres ├── font_14.tres ├── font_16.tres ├── font_22.tres ├── font_32.tres ├── gamepad.tscn ├── health_bar.xscn ├── hud │ ├── ap_gain.gd │ ├── build_card.gd │ ├── building_panel.gd │ ├── building_panel.tscn │ ├── cinematic_camera.xscn │ ├── current_team.tscn │ ├── end_turn.tscn │ ├── hud_panel.xscn │ ├── info_panel.gd │ ├── map_picker.gd │ ├── skirmish_maps_block.xscn │ ├── skirmish_maps_panel.xscn │ ├── skirmish_maps_selected_map.xscn │ ├── skirmish_setup_panel.gd │ ├── turn_info.tscn │ ├── unit_panel.gd │ ├── unit_panel.tscn │ └── zoom_panel.tscn ├── hud_default.tscn ├── hud_pandora.tscn ├── hud_pc.tscn ├── hud_tv.tscn ├── icon_shield.xscn ├── ingame_avatar.tscn ├── ingame_message.tscn ├── loading.xscn ├── menu.tscn ├── menu_buttons_test.tscn ├── menu_campaign.xscn ├── menu_maps.xscn ├── menu_settings.tscn ├── message.tscn ├── movement.xscn ├── online │ └── online_match_box.tscn ├── online_menu.tscn ├── panel_gray.tres ├── popups │ ├── big_message.tscn │ ├── confirm.tscn │ ├── message.tscn │ ├── prompt.tscn │ └── prompt_mobile.tscn ├── selector.xscn ├── settings │ ├── menu_settings.tscn │ ├── option_one_button.tscn │ ├── option_switch.tscn │ └── option_two_buttons.tscn ├── small_gray_theme.tres ├── small_red_theme.tres ├── stats.xscn ├── vigette.tscn └── workshop │ ├── block.xscn │ ├── building_blocks.xscn │ ├── file_panel.xscn │ ├── navigation_panel.xscn │ ├── toolbox.xscn │ └── workshop.xscn ├── icon.png.flags ├── intro.xscn ├── logs └── .gitkeep ├── maps ├── action_tiles_tileset.xml ├── blueprint_terrain_tileset.xml ├── blueprint_units_tileset.xml ├── campaign.gd ├── campaign │ ├── administration_recapture.gd │ ├── administration_recapture_scripts.gd │ ├── administration_riot.gd │ ├── administration_riot_scripts.gd │ ├── airplane.gd │ ├── airplane_scripts.gd │ ├── airport_part_1.gd │ ├── airport_part_1_scripts.gd │ ├── airport_part_2.gd │ ├── airport_part_2_scripts.gd │ ├── airport_part_3.gd │ ├── airport_part_3_scripts.gd │ ├── base_assault.gd │ ├── base_assault_scripts.gd │ ├── base_defence.gd │ ├── base_defence_scripts.gd │ ├── convoy.gd │ ├── convoy_scripts.gd │ ├── crash_site.gd │ ├── crash_site_scripts.gd │ ├── eastern_city.gd │ ├── eastern_city_scripts.gd │ ├── field_command.gd │ ├── field_command_scripts.gd │ ├── maidan.gd │ ├── maidan_scripts.gd │ ├── peninsula.gd │ └── peninsula_scripts.gd ├── custom │ ├── crossroad.gd │ ├── developer_map.gd │ ├── gameplay_examples.gd │ ├── hearth_of_wild.gd │ ├── king_of_the_hill.gd │ ├── split.gd │ ├── territorial.gd │ ├── tof_dm1.gd │ ├── zuo1.gd │ ├── zuo2.gd │ ├── zuo3.gd │ ├── zuo4.gd │ └── zuo5.gd ├── fog_of_war.xml ├── map_sample.xscn ├── menu_map_background.gd ├── tilesets │ ├── fall_tileset.xml │ ├── summer_tileset.xml │ └── winter_tileset.xml ├── underground_tileset.xml ├── waypoint.tscn └── workshop.xscn ├── particle ├── explosion.gd ├── explosion.xscn ├── explosion_big.xscn ├── hit_points.xscn └── smoke.xscn ├── scripts ├── abstract_field.gd ├── abstract_map.gd ├── action_map.gd ├── ai │ ├── a_star.gd │ ├── actions │ │ ├── brains │ │ │ ├── airport_brain.gd │ │ │ ├── barracks_brain.gd │ │ │ ├── base_brain.gd │ │ │ ├── building_brain.gd │ │ │ ├── factory_brain.gd │ │ │ ├── heli_brain.gd │ │ │ ├── hq_brain.gd │ │ │ ├── soldier_brain.gd │ │ │ ├── tank_brain.gd │ │ │ ├── tower_brain.gd │ │ │ └── unit_brain.gd │ │ ├── collector.gd │ │ ├── egzekutor.gd │ │ ├── hands │ │ │ ├── base_hand.gd │ │ │ ├── move_hand.gd │ │ │ └── spawn_hand.gd │ │ └── types │ │ │ ├── attack_action.gd │ │ │ ├── base_action.gd │ │ │ ├── capture_action.gd │ │ │ ├── move_action.gd │ │ │ └── spawn_unit_action.gd │ ├── ai.gd │ └── perform.gd ├── bag_aware.gd ├── battle_controller.gd ├── battle_stats.gd ├── button_visual_hack.gd ├── camera.gd ├── controllers │ ├── action_controller.gd │ ├── action_status.gd │ ├── background_map_controller.gd │ ├── campaign_menu_controller.gd │ ├── controllers.gd │ ├── hud_panel_controller.gd │ ├── multiplayer_menu_controller.gd │ ├── online │ │ ├── free_panel.gd │ │ ├── multiplayer_box.gd │ │ └── used_panel.gd │ ├── online_menu_controller.gd │ ├── workshop_gui_controller.gd │ └── workshop_menu_controller.gd ├── cursor.gd ├── demo_mode.gd ├── demo_timer.gd ├── destroyed_tile.gd ├── flag.gd ├── fog_controller.gd ├── game_conditions.gd ├── game_logic.gd ├── gamepad_input.gd ├── hud_controller.gd ├── intro.gd ├── language.gd ├── map_controller.gd ├── maps │ ├── map_list.gd │ └── map_tiles.gd ├── match_state.gd ├── menu_back.gd ├── menu_controller.gd ├── message.gd ├── migrations │ ├── abstract_version.gd │ ├── migrations.gd │ ├── version20150730.gd │ ├── version20160506.gd │ └── version20160512.gd ├── movement_controller.gd ├── object_factory.gd ├── objects │ ├── building.gd │ ├── units │ │ ├── helicopter.gd │ │ ├── randomizing_animation_for_civilians.gd │ │ ├── soldier.gd │ │ ├── tank.gd │ │ └── unit.gd │ └── waypoints │ │ ├── waypoint.gd │ │ └── waypoint_factory.gd ├── online │ ├── maps.gd │ ├── multiplayer.gd │ ├── player.gd │ ├── request.gd │ └── request_async.gd ├── pandora_input.gd ├── player_move.gd ├── popups │ ├── big_message.gd │ ├── confirm.gd │ ├── gamepad_info.gd │ ├── message.gd │ └── prompt.gd ├── processing.gd ├── processing_wrapper.gd ├── saving.gd ├── selector.gd ├── services │ ├── dependency_container.gd │ ├── file_handler.gd │ ├── helpers.gd │ ├── hud_dead_zone.gd │ ├── logger.gd │ ├── map_file_handler.gd │ ├── positions.gd │ ├── resolution.gd │ ├── script_player.gd │ ├── tileset_handler.gd │ ├── tips.gd │ └── workshop_dead_zone.gd ├── sound_controller.gd ├── storyteller │ ├── actions │ │ ├── abstract_action.gd │ │ ├── attack.gd │ │ ├── camera.gd │ │ ├── claim.gd │ │ ├── despawn.gd │ │ ├── die.gd │ │ ├── lock_hud.gd │ │ ├── message.gd │ │ ├── move.gd │ │ ├── sleep.gd │ │ ├── spawn.gd │ │ ├── terrain_add.gd │ │ ├── terrain_damage.gd │ │ ├── terrain_remove.gd │ │ ├── trigger.gd │ │ ├── unlock_hud.gd │ │ └── win.gd │ ├── storyteller.gd │ ├── triggers.gd │ └── triggers │ │ ├── abstract_trigger.gd │ │ ├── assasination.gd │ │ ├── deploy.gd │ │ ├── domination.gd │ │ ├── move.gd │ │ ├── turn.gd │ │ └── turn_end.gd ├── terrain.gd ├── terrain_movable.gd ├── timers.gd ├── translate_me.gd ├── unit_switcher.gd ├── wave_controller.gd ├── workshop │ ├── blueprint.gd │ ├── building_blocks_panel.gd │ ├── file_panel.gd │ ├── navigation_panel.gd │ └── toolbox_panel.gd └── workshop_controller.gd ├── terrain ├── city │ ├── fall │ │ ├── city_big_1.xscn │ │ ├── city_big_2.xscn │ │ ├── city_big_3.xscn │ │ ├── city_big_4.xscn │ │ ├── city_small_1.xscn │ │ ├── city_small_2.xscn │ │ ├── city_small_3.xscn │ │ ├── city_small_4.xscn │ │ ├── city_small_5.xscn │ │ ├── city_small_6.xscn │ │ ├── city_statue.xscn │ │ └── city_tile.xscn │ ├── summer │ │ ├── city_big_1.xscn │ │ ├── city_big_2.xscn │ │ ├── city_big_3.xscn │ │ ├── city_big_4.xscn │ │ ├── city_small_1.xscn │ │ ├── city_small_2.xscn │ │ ├── city_small_3.xscn │ │ ├── city_small_4.xscn │ │ ├── city_small_5.xscn │ │ ├── city_small_6.xscn │ │ ├── city_statue.xscn │ │ └── city_tile.xscn │ └── winter │ │ ├── city_big_1.xscn │ │ ├── city_big_2.xscn │ │ ├── city_big_3.xscn │ │ ├── city_big_4.xscn │ │ ├── city_small_1.xscn │ │ ├── city_small_2.xscn │ │ ├── city_small_3.xscn │ │ ├── city_small_4.xscn │ │ ├── city_small_5.xscn │ │ ├── city_small_6.xscn │ │ ├── city_statue.xscn │ │ └── city_tile.xscn ├── destroyed_tile.xscn ├── tilesets │ ├── fall_movable.xscn │ ├── fall_non_movable.xscn │ ├── summer_movable.xscn │ ├── summer_non_movable.xscn │ ├── winter_movable.xscn │ └── winter_non_movable.xscn ├── underground.xscn └── wave.xscn ├── tilesets ├── action_tiles_edit.xscn ├── blueprint_terrain.xscn ├── blueprint_units_edit.xscn ├── fog_of_war_edit.xscn ├── tileset_edit.xscn └── underground_tiles_edit.xscn ├── translations ├── _imported │ ├── campaign.de.xl │ ├── campaign.en.xl │ ├── campaign.es.xl │ ├── campaign.fr.xl │ ├── campaign.ja.xl │ ├── campaign.pl.xl │ ├── campaign.ru.xl │ ├── translations.de.xl │ ├── translations.en.xl │ ├── translations.es.xl │ ├── translations.fr.xl │ ├── translations.ja.xl │ ├── translations.pl.xl │ └── translations.ru.xl ├── campaigns │ ├── campaign.csv │ ├── campaign_de.csv │ ├── campaign_en.csv │ ├── campaign_es.csv │ ├── campaign_fr.csv │ ├── campaign_ja.csv │ ├── campaign_pl.csv │ └── campaign_ru.csv ├── languages.gd ├── translations.csv ├── translations_de.csv ├── translations_en.csv ├── translations_es.csv ├── translations_fr.csv ├── translations_ja.csv ├── translations_pl.csv └── translations_ru.csv └── units ├── civilians ├── old_woman.tscn ├── protest_guy.tscn ├── protest_guy2.tscn ├── refugee.tscn └── refugee2.tscn ├── civilians_test_scene.tscn ├── helicopter_blue.xscn ├── helicopter_red.xscn ├── soldier_blue.tscn ├── soldier_blue.xscn ├── soldier_red.xscn ├── tank_blue.xscn ├── tank_red.xscn └── unit_template.tscn /.gitattributes: -------------------------------------------------------------------------------- 1 | *.gd linguist-language=GDScript 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.sublime-* 2 | .idea 3 | Tanks-of-Freedom.iml 4 | .fscache 5 | 6 | .fscache 7 | 8 | export.cfg 9 | *.tmp 10 | *.keystore 11 | *export_android.cfg 12 | logs/log.txt 13 | animation_frames.xml -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # The MIT License (MIT) 2 | This license applies both to the code, and to all graphical assets within this repository. 3 | 4 | Copyright (c) 2015 P1X 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in 14 | all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | THE SOFTWARE. 23 | 24 | 25 | ## Fonts 26 | A Free font Courier Prime used in this project can be found here: 27 | http://www.quoteunquoteapps.com/courierprime/ 28 | This font is licensed under OFL license. 29 | 30 | NotoSans font used in this project has been sourced from this repository: 31 | [https://github.com/nowri/sample-noto](https://github.com/nowri/sample-noto) 32 | It is licensed under [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0.html) 33 | 34 | ## Music & SFX License 35 | Original copyrights of all audio assets belong to QmYaan (Grand Beats) http://www.grandbeats.com/ 36 | 37 | All sfx and music assets in this repository are licensed under Creative Commons Attribution-ShareAlike 4.0 license (CC BY-SA 4.0). 38 | 39 | [Full text of the license provided by Creative Commons](http://creativecommons.org/licenses/by-sa/4.0/legalcode) -------------------------------------------------------------------------------- /assets/branding/p1x_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/branding/p1x_logo.png -------------------------------------------------------------------------------- /assets/branding/tof_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/branding/tof_logo.png -------------------------------------------------------------------------------- /assets/branding/tof_logo_big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/branding/tof_logo_big.png -------------------------------------------------------------------------------- /assets/branding/tof_logo_enchanced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/branding/tof_logo_enchanced.png -------------------------------------------------------------------------------- /assets/buildings/buildings_special.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/buildings/buildings_special.png -------------------------------------------------------------------------------- /assets/buildings/fall/buildings_big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/buildings/fall/buildings_big.png -------------------------------------------------------------------------------- /assets/buildings/fall/buildings_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/buildings/fall/buildings_small.png -------------------------------------------------------------------------------- /assets/buildings/fences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/buildings/fences.png -------------------------------------------------------------------------------- /assets/buildings/flags_spritesheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/buildings/flags_spritesheet.png -------------------------------------------------------------------------------- /assets/buildings/military.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/buildings/military.png -------------------------------------------------------------------------------- /assets/buildings/particle_smoke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/buildings/particle_smoke.png -------------------------------------------------------------------------------- /assets/buildings/summer/buildings_big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/buildings/summer/buildings_big.png -------------------------------------------------------------------------------- /assets/buildings/summer/buildings_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/buildings/summer/buildings_small.png -------------------------------------------------------------------------------- /assets/buildings/winter/buildings_big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/buildings/winter/buildings_big.png -------------------------------------------------------------------------------- /assets/buildings/winter/buildings_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/buildings/winter/buildings_small.png -------------------------------------------------------------------------------- /assets/campaigns/fall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/campaigns/fall.png -------------------------------------------------------------------------------- /assets/campaigns/summer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/campaigns/summer.png -------------------------------------------------------------------------------- /assets/campaigns/winter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/campaigns/winter.png -------------------------------------------------------------------------------- /assets/czlowiekimadlo.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw 3 | TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh 4 | cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 5 | WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu 6 | ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY 7 | MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc 8 | h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ 9 | 0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U 10 | A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW 11 | T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH 12 | B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC 13 | B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv 14 | KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn 15 | OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn 16 | jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw 17 | qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI 18 | rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV 19 | HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq 20 | hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL 21 | ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ 22 | 3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK 23 | NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 24 | ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur 25 | TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC 26 | jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc 27 | oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq 28 | 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA 29 | mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d 30 | emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= 31 | -----END CERTIFICATE----- 32 | -------------------------------------------------------------------------------- /assets/explosions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/explosions.png -------------------------------------------------------------------------------- /assets/fonts/ttf/courier.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/fonts/ttf/courier.ttf -------------------------------------------------------------------------------- /assets/fonts/ttf/japan.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/fonts/ttf/japan.ttf -------------------------------------------------------------------------------- /assets/gamepad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gamepad.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size2_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size2_0.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size2_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size2_1.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size2_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size2_2.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size2_2b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size2_2b.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size2_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size2_3.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size2_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size2_4.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size3_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size3_0.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size3_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size3_1.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size3_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size3_2.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size3_2b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size3_2b.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size3_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size3_3.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size3_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size3_4.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size3_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size3_5.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size3_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size3_6.png -------------------------------------------------------------------------------- /assets/gui/buttons/analog_size3_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/analog_size3_7.png -------------------------------------------------------------------------------- /assets/gui/buttons/gamepad-buttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/gamepad-buttons.png -------------------------------------------------------------------------------- /assets/gui/buttons/lcd_70_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/lcd_70_0.png -------------------------------------------------------------------------------- /assets/gui/buttons/lcd_70_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/lcd_70_1.png -------------------------------------------------------------------------------- /assets/gui/buttons/lcd_70_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/buttons/lcd_70_2.png -------------------------------------------------------------------------------- /assets/gui/checkbox/checkbox_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/checkbox/checkbox_off.png -------------------------------------------------------------------------------- /assets/gui/checkbox/checkbox_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/checkbox/checkbox_on.png -------------------------------------------------------------------------------- /assets/gui/dialogs/big_icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/dialogs/big_icons.png -------------------------------------------------------------------------------- /assets/gui/dialogs/gui_spritesheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/dialogs/gui_spritesheet.png -------------------------------------------------------------------------------- /assets/gui/dialogs/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/dialogs/icons.png -------------------------------------------------------------------------------- /assets/gui/dialogs/menu9@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/dialogs/menu9@2x.png -------------------------------------------------------------------------------- /assets/gui/dialogs/menu9_blue@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/dialogs/menu9_blue@2x.png -------------------------------------------------------------------------------- /assets/gui/dialogs/menu9_dark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/dialogs/menu9_dark@2x.png -------------------------------------------------------------------------------- /assets/gui/dialogs/menu9_red@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/dialogs/menu9_red@2x.png -------------------------------------------------------------------------------- /assets/gui/dialogs/progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/dialogs/progress.png -------------------------------------------------------------------------------- /assets/gui/extras/black-box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/extras/black-box.png -------------------------------------------------------------------------------- /assets/gui/extras/corner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/extras/corner.png -------------------------------------------------------------------------------- /assets/gui/extras/vigette.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/extras/vigette.png -------------------------------------------------------------------------------- /assets/gui/selectors_spritesheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/selectors_spritesheet.png -------------------------------------------------------------------------------- /assets/gui/workshop/building_blocks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/workshop/building_blocks.png -------------------------------------------------------------------------------- /assets/gui/workshop/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/gui/workshop/icons.png -------------------------------------------------------------------------------- /assets/icons/icon1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/icons/icon1024.png -------------------------------------------------------------------------------- /assets/icons/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/icons/icon128.png -------------------------------------------------------------------------------- /assets/icons/icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/icons/icon16.png -------------------------------------------------------------------------------- /assets/icons/icon24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/icons/icon24.png -------------------------------------------------------------------------------- /assets/icons/icon256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/icons/icon256.png -------------------------------------------------------------------------------- /assets/icons/icon32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/icons/icon32.png -------------------------------------------------------------------------------- /assets/icons/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/icons/icon48.png -------------------------------------------------------------------------------- /assets/icons/icon512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/icons/icon512.png -------------------------------------------------------------------------------- /assets/icons/osx.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/icons/osx.icns -------------------------------------------------------------------------------- /assets/icons/win.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/icons/win.ico -------------------------------------------------------------------------------- /assets/overscan1920.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/overscan1920.jpg -------------------------------------------------------------------------------- /assets/sounds/fx/button.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/button.wav -------------------------------------------------------------------------------- /assets/sounds/fx/end_turn.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/end_turn.wav -------------------------------------------------------------------------------- /assets/sounds/fx/explosion.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/explosion.wav -------------------------------------------------------------------------------- /assets/sounds/fx/hurt.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/hurt.wav -------------------------------------------------------------------------------- /assets/sounds/fx/menu.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/menu.wav -------------------------------------------------------------------------------- /assets/sounds/fx/move.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/move.wav -------------------------------------------------------------------------------- /assets/sounds/fx/no_attack.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/no_attack.wav -------------------------------------------------------------------------------- /assets/sounds/fx/no_moves.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/no_moves.wav -------------------------------------------------------------------------------- /assets/sounds/fx/not_dead.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/not_dead.wav -------------------------------------------------------------------------------- /assets/sounds/fx/pickup_box.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/pickup_box.wav -------------------------------------------------------------------------------- /assets/sounds/fx/powerup.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/powerup.wav -------------------------------------------------------------------------------- /assets/sounds/fx/select.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/select.wav -------------------------------------------------------------------------------- /assets/sounds/fx/spawn.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/spawn.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/01.soldier/soldier_attack.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/01.soldier/soldier_attack.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/01.soldier/soldier_damage.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/01.soldier/soldier_damage.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/01.soldier/soldier_die.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/01.soldier/soldier_die.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/01.soldier/soldier_move.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/01.soldier/soldier_move.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/01.soldier/soldier_spawn.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/01.soldier/soldier_spawn.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/02.tank/tank_attack.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/02.tank/tank_attack.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/02.tank/tank_damage.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/02.tank/tank_damage.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/02.tank/tank_die.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/02.tank/tank_die.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/02.tank/tank_move.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/02.tank/tank_move.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/02.tank/tank_spawn.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/02.tank/tank_spawn.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/02.tank/tank_spawn.wav.reapeaks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/02.tank/tank_spawn.wav.reapeaks -------------------------------------------------------------------------------- /assets/sounds/fx/units/03.helicopter/helicopter_attack.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/03.helicopter/helicopter_attack.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/03.helicopter/helicopter_damage.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/03.helicopter/helicopter_damage.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/03.helicopter/helicopter_die.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/03.helicopter/helicopter_die.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/03.helicopter/helicopter_move.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/03.helicopter/helicopter_move.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/03.helicopter/helicopter_spawn.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/03.helicopter/helicopter_spawn.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/11.buildings/occupy_building.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/11.buildings/occupy_building.wav -------------------------------------------------------------------------------- /assets/sounds/fx/units/11.buildings/passive_building_ap.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/fx/units/11.buildings/passive_building_ap.wav -------------------------------------------------------------------------------- /assets/sounds/soundtrack/intro.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/soundtrack/intro.ogg -------------------------------------------------------------------------------- /assets/sounds/soundtrack/map_soundtrack_1.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/soundtrack/map_soundtrack_1.ogg -------------------------------------------------------------------------------- /assets/sounds/soundtrack/map_soundtrack_2.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/soundtrack/map_soundtrack_2.ogg -------------------------------------------------------------------------------- /assets/sounds/soundtrack/menu_soundtrack.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/sounds/soundtrack/menu_soundtrack.ogg -------------------------------------------------------------------------------- /assets/splash_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/splash_screen.png -------------------------------------------------------------------------------- /assets/terrain/action_tiles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/action_tiles.png -------------------------------------------------------------------------------- /assets/terrain/clouds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/clouds.png -------------------------------------------------------------------------------- /assets/terrain/destruction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/destruction.png -------------------------------------------------------------------------------- /assets/terrain/fall/ground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/fall/ground.png -------------------------------------------------------------------------------- /assets/terrain/fall/terrain_movable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/fall/terrain_movable.png -------------------------------------------------------------------------------- /assets/terrain/fall/terrain_non-movable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/fall/terrain_non-movable.png -------------------------------------------------------------------------------- /assets/terrain/summer/ground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/summer/ground.png -------------------------------------------------------------------------------- /assets/terrain/summer/terrain_movable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/summer/terrain_movable.png -------------------------------------------------------------------------------- /assets/terrain/summer/terrain_non-movable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/summer/terrain_non-movable.png -------------------------------------------------------------------------------- /assets/terrain/terrain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/terrain.png -------------------------------------------------------------------------------- /assets/terrain/underground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/underground.png -------------------------------------------------------------------------------- /assets/terrain/waves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/waves.png -------------------------------------------------------------------------------- /assets/terrain/winter/ground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/winter/ground.png -------------------------------------------------------------------------------- /assets/terrain/winter/terrain_movable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/winter/terrain_movable.png -------------------------------------------------------------------------------- /assets/terrain/winter/terrain_non-movable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/terrain/winter/terrain_non-movable.png -------------------------------------------------------------------------------- /assets/units/avatars_spritesheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/units/avatars_spritesheet.png -------------------------------------------------------------------------------- /assets/units/blueprint_units.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/units/blueprint_units.png -------------------------------------------------------------------------------- /assets/units/civilians_spritesheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/units/civilians_spritesheet.png -------------------------------------------------------------------------------- /assets/units/health_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/units/health_bar.png -------------------------------------------------------------------------------- /assets/units/icon_shield.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/units/icon_shield.png -------------------------------------------------------------------------------- /assets/units/units_spritesheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/assets/units/units_spritesheet.png -------------------------------------------------------------------------------- /bin/android_debug: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | bin/export build android /tmp ToF debug 4 | 5 | adb install -r /tmp/tof-build/ToF_debug_android64.apk 6 | 7 | if [ "$1" == "logcat" ] 8 | then 9 | ./bin/android_logcat 10 | fi -------------------------------------------------------------------------------- /bin/android_logcat: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | adb logcat | grep 'ToF.DEBUG:' -------------------------------------------------------------------------------- /buildConfig/build_android.cfg: -------------------------------------------------------------------------------- 1 | subdir: tof-build 2 | godot_target: Android 3 | engine_file: android 4 | export_file: android 5 | file_extension: android64.apk 6 | extra_params: -------------------------------------------------------------------------------- /buildConfig/build_linux32.cfg: -------------------------------------------------------------------------------- 1 | subdir: tof-build 2 | godot_target: Linux X11 3 | engine_file: linux32 4 | export_file: linux32 5 | file_extension: linux32.bin 6 | extra_params: 7 | -------------------------------------------------------------------------------- /buildConfig/build_linux64.cfg: -------------------------------------------------------------------------------- 1 | subdir: tof-build 2 | godot_target: Linux X11 3 | engine_file: desktop 4 | export_file: desktop 5 | file_extension: linux64.bin 6 | extra_params: -------------------------------------------------------------------------------- /buildConfig/build_osx.cfg: -------------------------------------------------------------------------------- 1 | subdir: tof-build 2 | godot_target: Mac OSX 3 | engine_file: osx 4 | export_file: desktop 5 | file_extension: osx64.zip 6 | extra_params: -------------------------------------------------------------------------------- /buildConfig/build_windows.cfg: -------------------------------------------------------------------------------- 1 | subdir: tof-build 2 | godot_target: Windows Desktop 3 | engine_file: desktop 4 | export_file: desktop 5 | file_extension: win64.exe 6 | extra_params: -------------------------------------------------------------------------------- /buildConfig/engine_android.cfg: -------------------------------------------------------------------------------- 1 | [application] 2 | 3 | name="Tanks of Freedom" 4 | main_scene="res://game.xscn" 5 | disable_stdout=false 6 | use_shared_user_dir=true 7 | icon="res://assets/icons/icon128.png" 8 | target_fps=30 9 | boot_bg_color=#ff000000 10 | boot_splash="res://assets/splash_screen.png" 11 | 12 | [audio] 13 | 14 | use_chorus_reverb=false 15 | stream_volume_scale=0.5 16 | fx_volume_scale=0.2 17 | 18 | [debug] 19 | 20 | print_fps=false 21 | print_metrics=false 22 | 23 | [display] 24 | 25 | width=960 26 | height=540 27 | resizable=false 28 | fullscreen=false 29 | stretch_mode="viewport" 30 | stretch_aspect="keep" 31 | orientation="sensor_landscape" 32 | 33 | [image_loader] 34 | 35 | filter=false 36 | gen_mipmaps=false 37 | 38 | [locale] 39 | 40 | translations=["res://translations/_imported/translations.en.xl", "res://translations/_imported/translations.fr.xl", "res://translations/_imported/translations.pl.xl", "res://translations/_imported/translations.de.xl", "res://translations/_imported/translations.ja.xl", "res://translations/_imported/translations.ru.xl", "res://translations/_imported/translations.es.xl", "res://translations/_imported/campaign.en.xl", "res://translations/_imported/campaign.fr.xl", "res://translations/_imported/campaign.pl.xl", "res://translations/_imported/campaign.de.xl", "res://translations/_imported/campaign.ja.xl", "res://translations/_imported/campaign.ru.xl", "res://translations/_imported/campaign.es.xl"] 41 | 42 | [rasterizer] 43 | 44 | trilinear_mipmap_filter=false 45 | anisotropic_filter_level=1.0 46 | use_pixel_snap=true 47 | 48 | [render] 49 | 50 | thread_model=2 51 | mipmap_policy=0 52 | shadows_enabled=false 53 | default_clear_color=#ff005784 54 | room_cull_enabled=false 55 | light_discard_enabled=true 56 | 57 | [ssl] 58 | 59 | certificates="res://assets/czlowiekimadlo.crt" 60 | 61 | [tof] 62 | 63 | ENV="prod" 64 | default_zoom=0.5 65 | selector_offset=0 66 | resolution_override=false 67 | enable_save_load=true 68 | enable_workshop=true 69 | online=true 70 | api_location="https://api.tof.p1x.in" 71 | api_port=443 72 | api_use_ssl=true 73 | map_upload_win=true 74 | pandora_input=false 75 | hud_layout="default" 76 | hud_allow_overscan=false 77 | mobile_prompt=true 78 | debug_mode=false 79 | ai_logger=false 80 | release_yuri=true 81 | -------------------------------------------------------------------------------- /buildConfig/engine_desktop.cfg: -------------------------------------------------------------------------------- 1 | [application] 2 | 3 | name="Tanks of Freedom" 4 | main_scene="res://game.xscn" 5 | disable_stdout=false 6 | use_shared_user_dir=true 7 | icon="res://assets/icons/icon512.png" 8 | target_fps=60 9 | boot_bg_color=#ff000000 10 | boot_splash="res://assets/splash_screen.png" 11 | 12 | [audio] 13 | 14 | use_chorus_reverb=false 15 | stream_volume_scale=0.5 16 | fx_volume_scale=0.2 17 | 18 | [debug] 19 | 20 | print_fps=false 21 | print_metrics=false 22 | 23 | [display] 24 | 25 | width=1280 26 | height=720 27 | resizable=true 28 | fullscreen=false 29 | stretch_mode="disabled" 30 | stretch_aspect="keep" 31 | orientation="landscape" 32 | 33 | [image_loader] 34 | 35 | filter=false 36 | gen_mipmaps=false 37 | 38 | [locale] 39 | 40 | translations=["res://translations/_imported/translations.en.xl", "res://translations/_imported/translations.fr.xl", "res://translations/_imported/translations.pl.xl", "res://translations/_imported/translations.de.xl", "res://translations/_imported/translations.ja.xl", "res://translations/_imported/translations.ru.xl", "res://translations/_imported/translations.es.xl", "res://translations/_imported/campaign.en.xl", "res://translations/_imported/campaign.fr.xl", "res://translations/_imported/campaign.pl.xl", "res://translations/_imported/campaign.de.xl", "res://translations/_imported/campaign.ja.xl", "res://translations/_imported/campaign.ru.xl", "res://translations/_imported/campaign.es.xl"] 41 | 42 | [rasterizer] 43 | 44 | trilinear_mipmap_filter=false 45 | anisotropic_filter_level=1.0 46 | use_pixel_snap=true 47 | 48 | [render] 49 | 50 | thread_model=2 51 | mipmap_policy=0 52 | shadows_enabled=false 53 | default_clear_color=#ff005784 54 | room_cull_enabled=false 55 | light_discard_enabled=true 56 | 57 | [ssl] 58 | 59 | certificates="res://assets/czlowiekimadlo.crt" 60 | 61 | [tof] 62 | 63 | ENV="prod" 64 | default_zoom=0.5 65 | selector_offset=0 66 | resolution_override=true 67 | enable_save_load=true 68 | enable_workshop=true 69 | online=true 70 | api_location="https://api.tof.p1x.in" 71 | api_port=443 72 | api_use_ssl=true 73 | map_upload_win = true 74 | pandora_input = false 75 | hud_layout = "default" 76 | hud_allow_overscan = true 77 | mobile_prompt=false 78 | debug_mode=false 79 | ai_logger=false 80 | release_yuri=true 81 | -------------------------------------------------------------------------------- /buildConfig/engine_linux32.cfg: -------------------------------------------------------------------------------- 1 | [application] 2 | 3 | name="Tanks of Freedom" 4 | main_scene="res://game.xscn" 5 | disable_stdout=false 6 | use_shared_user_dir=true 7 | icon="res://assets/icons/icon128.png" 8 | target_fps=60 9 | boot_bg_color=#ff000000 10 | boot_splash="res://assets/splash_screen.png" 11 | 12 | [audio] 13 | 14 | use_chorus_reverb=false 15 | stream_volume_scale=0.5 16 | fx_volume_scale=0.2 17 | 18 | [debug] 19 | 20 | print_fps=false 21 | print_metrics=false 22 | 23 | [display] 24 | 25 | stretch_mode="disabled" 26 | resizable=true 27 | stretch_aspect="keep" 28 | width=1280 29 | height=720 30 | fullscreen=false 31 | orientation="landscape" 32 | 33 | [image_loader] 34 | 35 | filter=false 36 | gen_mipmaps=false 37 | 38 | [locale] 39 | 40 | translations=["res://translations/_imported/translations.en.xl", "res://translations/_imported/translations.fr.xl", "res://translations/_imported/translations.pl.xl", "res://translations/_imported/translations.de.xl", "res://translations/_imported/translations.ja.xl", "res://translations/_imported/translations.ru.xl", "res://translations/_imported/translations.es.xl", "res://translations/_imported/campaign.en.xl", "res://translations/_imported/campaign.fr.xl", "res://translations/_imported/campaign.pl.xl", "res://translations/_imported/campaign.de.xl", "res://translations/_imported/campaign.ja.xl", "res://translations/_imported/campaign.ru.xl", "res://translations/_imported/campaign.es.xl"] 41 | 42 | [rasterizer] 43 | 44 | trilinear_mipmap_filter=false 45 | anisotropic_filter_level=1.0 46 | use_pixel_snap=true 47 | 48 | [render] 49 | 50 | room_cull_enabled=false 51 | thread_model=2 52 | mipmap_policy=0 53 | shadows_enabled=false 54 | default_clear_color=#ff005784 55 | light_discard_enabled=true 56 | 57 | [ssl] 58 | 59 | certificates="res://assets/czlowiekimadlo.crt" 60 | 61 | [tof] 62 | 63 | ENV="prod" 64 | default_zoom=0.5 65 | selector_offset=0 66 | resolution_override=true 67 | enable_save_load=true 68 | enable_workshop=true 69 | online=true 70 | api_location="https://api.tof.p1x.in" 71 | api_port=443 72 | api_use_ssl=true 73 | map_upload_win = true 74 | pandora_input = false 75 | hud_layout = "default" 76 | hud_allow_overscan = true 77 | mobile_prompt=false 78 | debug_mode=false 79 | ai_logger=false 80 | release_yuri=true 81 | -------------------------------------------------------------------------------- /buildConfig/engine_osx.cfg: -------------------------------------------------------------------------------- 1 | [application] 2 | 3 | name="Tanks of Freedom" 4 | main_scene="res://game.xscn" 5 | disable_stdout=false 6 | use_shared_user_dir=true 7 | icon="res://assets/icons/icon512.png" 8 | target_fps=60 9 | boot_bg_color=#ff000000 10 | boot_splash="res://assets/splash_screen.png" 11 | 12 | [audio] 13 | 14 | use_chorus_reverb=false 15 | stream_volume_scale=0.5 16 | fx_volume_scale=0.2 17 | 18 | [debug] 19 | 20 | print_fps=false 21 | print_metrics=false 22 | 23 | [display] 24 | 25 | width=1280 26 | height=800 27 | resizable=true 28 | fullscreen=false 29 | stretch_mode="disabled" 30 | stretch_aspect="keep" 31 | orientation="landscape" 32 | 33 | [image_loader] 34 | 35 | filter=false 36 | gen_mipmaps=false 37 | 38 | [locale] 39 | 40 | translations=["res://translations/_imported/translations.en.xl", "res://translations/_imported/translations.fr.xl", "res://translations/_imported/translations.pl.xl", "res://translations/_imported/translations.de.xl", "res://translations/_imported/translations.ja.xl", "res://translations/_imported/translations.ru.xl", "res://translations/_imported/translations.es.xl", "res://translations/_imported/campaign.en.xl", "res://translations/_imported/campaign.fr.xl", "res://translations/_imported/campaign.pl.xl", "res://translations/_imported/campaign.de.xl", "res://translations/_imported/campaign.ja.xl", "res://translations/_imported/campaign.ru.xl", "res://translations/_imported/campaign.es.xl"] 41 | 42 | [rasterizer] 43 | 44 | trilinear_mipmap_filter=false 45 | anisotropic_filter_level=1.0 46 | use_pixel_snap=true 47 | 48 | [render] 49 | 50 | thread_model=2 51 | mipmap_policy=0 52 | shadows_enabled=false 53 | default_clear_color=#ff005784 54 | room_cull_enabled=false 55 | light_discard_enabled=true 56 | 57 | [ssl] 58 | 59 | certificates="res://assets/czlowiekimadlo.crt" 60 | 61 | [tof] 62 | 63 | ENV="prod" 64 | default_zoom=0.5 65 | selector_offset=0 66 | resolution_override=true 67 | enable_save_load=true 68 | enable_workshop=true 69 | online=true 70 | api_location="https://api.tof.p1x.in" 71 | api_port=443 72 | api_use_ssl=true 73 | map_upload_win = true 74 | pandora_input = false 75 | hud_layout = "default" 76 | hud_allow_overscan = true 77 | mobile_prompt=false 78 | debug_mode=false 79 | ai_logger=false 80 | release_yuri=true 81 | -------------------------------------------------------------------------------- /buildConfig/export_desktop.cfg: -------------------------------------------------------------------------------- 1 | [convert_images] 2 | 3 | action="none" 4 | compress_quality=0.7 5 | formats="png" 6 | shrink=1.0 7 | 8 | [convert_scenes] 9 | 10 | convert_text_scenes=true 11 | 12 | [export_filter] 13 | 14 | filter="*.crt" 15 | filter_exclude="" 16 | type="resources" 17 | 18 | [platform:HTML5] 19 | 20 | browser/enable_run=false 21 | custom_package/debug="" 22 | custom_package/release="" 23 | debug/debugging_enabled=false 24 | options/memory_size=3 25 | 26 | [platform:Linux X11] 27 | 28 | binary/64_bits=true 29 | custom_binary/debug="" 30 | custom_binary/release="" 31 | debug/debugging_enabled=false 32 | resources/pack_mode=0 33 | 34 | [platform:Mac OSX] 35 | 36 | application/64_bits=true 37 | application/copyright="" 38 | application/icon="" 39 | application/identifier="com.godot.macgame" 40 | application/info="Turn Based Strategy" 41 | application/name="" 42 | application/short_version="1.0" 43 | application/signature="godotmacgame" 44 | application/version="1.0" 45 | custom_package/debug="" 46 | custom_package/release="" 47 | debug/debugging_enabled=false 48 | display/high_res=false 49 | 50 | [platform:Windows Desktop] 51 | 52 | binary/64_bits=true 53 | custom_binary/debug="" 54 | custom_binary/release="" 55 | debug/debugging_enabled=false 56 | resources/pack_mode=0 57 | 58 | [script] 59 | 60 | action="compile" 61 | encrypt_key="" 62 | -------------------------------------------------------------------------------- /buildConfig/export_linux32.cfg: -------------------------------------------------------------------------------- 1 | [convert_images] 2 | 3 | action="none" 4 | compress_quality=0.7 5 | formats="png" 6 | shrink=1.0 7 | 8 | [convert_scenes] 9 | 10 | convert_text_scenes=true 11 | 12 | [export_filter] 13 | 14 | filter="*.crt" 15 | filter_exclude="" 16 | type="resources" 17 | 18 | [platform:Linux X11] 19 | 20 | binary/64_bits=false 21 | custom_binary/debug="" 22 | custom_binary/release="" 23 | debug/debugging_enabled=false 24 | resources/pack_mode=0 25 | 26 | [script] 27 | 28 | action="compile" 29 | encrypt_key="" 30 | 31 | -------------------------------------------------------------------------------- /buildings/bunker_blue.xscn: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | "conn_count" 9 | 0 10 | "conns" 11 | 12 | "editable_instances" 13 | 14 | 15 | "names" 16 | 17 | "bunker_blue" 18 | "texture" 19 | "region" 20 | "region_rect" 21 | "script/script" 22 | "__meta__" 23 | "position_on_map" 24 | "type" 25 | "player" 26 | "bonus_ap" 27 | "can_spawn" 28 | "spawn_point_position" 29 | "Sprite" 30 | "flag" 31 | "transform/pos" 32 | "color" 33 | "flag2" 34 | 35 | "node_count" 36 | 3 37 | "node_paths" 38 | 39 | 40 | "nodes" 41 | -1, -1, 12, 0, -1, 11, 1, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 6, 9, 7, 10, 1, 11, 8, 0, 0, 0, 2147483647, 13, 9, 2, 14, 10, 15, 6, 0, 0, 0, 2147483647, 16, 9, 2, 14, 11, 15, 6, 0 42 | "variants" 43 | 44 | 45 | True 46 | 64, 192, 64, 64 47 | 48 | 49 | "__editor_plugin_screen__" 50 | "2D" 51 | 52 | 0, 0 53 | 0 54 | 20 55 | 0, 1 56 | 57 | -27.1981, 1.2048 58 | 19.8132, 2.1054 59 | 60 | "version" 61 | 2 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /buildings/bunker_red.xscn: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | "conn_count" 9 | 0 10 | "conns" 11 | 12 | "editable_instances" 13 | 14 | 15 | "names" 16 | 17 | "bunker_red" 18 | "texture" 19 | "region" 20 | "region_rect" 21 | "script/script" 22 | "__meta__" 23 | "position_on_map" 24 | "type" 25 | "player" 26 | "bonus_ap" 27 | "can_spawn" 28 | "spawn_point_position" 29 | "Sprite" 30 | "flag" 31 | "transform/pos" 32 | "color" 33 | "flag2" 34 | 35 | "node_count" 36 | 3 37 | "node_paths" 38 | 39 | 40 | "nodes" 41 | -1, -1, 12, 0, -1, 11, 1, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9, 8, 10, 1, 11, 9, 0, 0, 0, 2147483647, 13, 10, 2, 14, 11, 15, 7, 0, 0, 0, 2147483647, 16, 10, 2, 14, 12, 15, 7, 0 42 | "variants" 43 | 44 | 45 | True 46 | 128, 192, 64, 64 47 | 48 | 49 | "__editor_plugin_screen__" 50 | "2D" 51 | 52 | 0, 0 53 | 0 54 | 1 55 | 20 56 | 0, 1 57 | 58 | 19.1193, 6.42752 59 | -26.2889, 6.42752 60 | 61 | "version" 62 | 2 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /buildings/fence.xscn: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | "conn_count" 8 | 0 9 | "conns" 10 | 11 | "editable_instances" 12 | 13 | 14 | "names" 15 | 16 | "fence" 17 | "texture" 18 | "vframes" 19 | "hframes" 20 | "script/script" 21 | "__meta__" 22 | "destructable" 23 | "smoke_particles" 24 | "smoke_lifetime" 25 | "unique_type_id" 26 | "Sprite" 27 | 28 | "node_count" 29 | 1 30 | "node_paths" 31 | 32 | 33 | "nodes" 34 | -1, -1, 10, 0, -1, 10, 1, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 0, 6, 7, 7, 8, 8, 9, 9, 0 35 | "variants" 36 | 37 | 38 | 3 39 | 4 40 | 41 | 42 | "__editor_plugin_screen__" 43 | "2D" 44 | 45 | False 46 | True 47 | 16 48 | 1 49 | 14 50 | 51 | "version" 52 | 2 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /buildings/tower.xscn: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | "conn_count" 9 | 0 10 | "conns" 11 | 12 | "editable_instances" 13 | 14 | 15 | "names" 16 | 17 | "tower" 18 | "texture" 19 | "region" 20 | "region_rect" 21 | "script/script" 22 | "__meta__" 23 | "position_on_map" 24 | "type" 25 | "player" 26 | "bonus_ap" 27 | "can_spawn" 28 | "spawn_point_position" 29 | "Sprite" 30 | "flag" 31 | "transform/pos" 32 | 33 | "node_count" 34 | 2 35 | "node_paths" 36 | 37 | 38 | "nodes" 39 | -1, -1, 12, 0, -1, 11, 1, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 8, 7, 9, 8, 10, 9, 11, 10, 0, 0, 0, 2147483647, 13, 11, 1, 14, 12, 0 40 | "variants" 41 | 42 | 43 | True 44 | 0, 256, 64, 64 45 | 46 | 47 | "__editor_plugin_screen__" 48 | "2D" 49 | 50 | 0, 0 51 | 4 52 | -1 53 | 15 54 | False 55 | 0, 1 56 | 57 | -11.8801, 0.0384655 58 | 59 | "version" 60 | 2 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /engine.cfg: -------------------------------------------------------------------------------- 1 | [application] 2 | 3 | name="Tanks of Freedom" 4 | main_scene="res://game.xscn" 5 | disable_stdout=false 6 | use_shared_user_dir=true 7 | icon="res://assets/icons/icon128.png" 8 | target_fps=60 9 | boot_bg_color=#ff000000 10 | boot_splash="res://assets/splash_screen.png" 11 | 12 | [audio] 13 | 14 | output_latency=100 15 | use_chorus_reverb=false 16 | stream_volume_scale=0.5 17 | fx_volume_scale=0.2 18 | 19 | [debug] 20 | 21 | print_fps=false 22 | print_metrics=false 23 | 24 | [display] 25 | 26 | width=1280 27 | height=720 28 | stretch_mode="disabled" 29 | resizable=true 30 | stretch_aspect="keep" 31 | fullscreen=false 32 | orientation="landscape" 33 | 34 | [image_loader] 35 | 36 | filter=false 37 | gen_mipmaps=false 38 | 39 | [input] 40 | 41 | gamepad_build=[key(Home)] 42 | gamepad_end=[key(PageUp)] 43 | gamepad_next=[key(Control)] 44 | gamepad_prev=[key(Shift)] 45 | 46 | [locale] 47 | 48 | translations=["res://translations/_imported/translations.en.xl", "res://translations/_imported/translations.fr.xl", "res://translations/_imported/translations.pl.xl", "res://translations/_imported/translations.de.xl", "res://translations/_imported/translations.ja.xl", "res://translations/_imported/translations.ru.xl", "res://translations/_imported/translations.es.xl", "res://translations/_imported/campaign.en.xl", "res://translations/_imported/campaign.fr.xl", "res://translations/_imported/campaign.pl.xl", "res://translations/_imported/campaign.de.xl", "res://translations/_imported/campaign.ja.xl", "res://translations/_imported/campaign.ru.xl", "res://translations/_imported/campaign.es.xl"] 49 | 50 | [rasterizer] 51 | 52 | trilinear_mipmap_filter=false 53 | anisotropic_filter_level=1.0 54 | use_pixel_snap=true 55 | 56 | [render] 57 | 58 | room_cull_enabled=false 59 | thread_model=2 60 | mipmap_policy=0 61 | shadows_enabled=false 62 | default_clear_color=#ff005784 63 | light_discard_enabled=true 64 | 65 | [ssl] 66 | 67 | certificates="res://assets/czlowiekimadlo.crt" 68 | 69 | [tof] 70 | 71 | release_yuri=true 72 | ai_logger=true 73 | api_port=443 74 | api_location="api.tof.p1x.in" 75 | api_use_ssl=true 76 | resolution_override=true 77 | pandora_input=false 78 | hud_layout="default" 79 | enable_workshop=true 80 | enable_save_load=true 81 | default_zoom=0.5 82 | selector_offset=0 83 | online=true 84 | map_upload_win=false 85 | hud_allow_overscan=true 86 | mobile_prompt=false 87 | debug_mode=true 88 | -------------------------------------------------------------------------------- /gui/checkbox_theme.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Theme" load_steps=3 format=1] 2 | 3 | [ext_resource path="res://assets/gui/checkbox/checkbox_off.png" type="Texture" id=1] 4 | [ext_resource path="res://assets/gui/checkbox/checkbox_on.png" type="Texture" id=2] 5 | 6 | [resource] 7 | 8 | CheckButton/colors/font_color = Color( 0.878431, 0.878431, 0.878431, 1 ) 9 | CheckButton/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) 10 | CheckButton/colors/font_color_hover = Color( 0.941176, 0.941176, 0.941176, 1 ) 11 | CheckButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) 12 | CheckButton/constants/check_vadjust = 0 13 | CheckButton/constants/hseparation = 4 14 | CheckButton/fonts/font = null 15 | CheckButton/icons/off = ExtResource( 1 ) 16 | CheckButton/icons/on = ExtResource( 2 ) 17 | CheckButton/styles/disabled = null 18 | CheckButton/styles/focus = null 19 | CheckButton/styles/hover = null 20 | CheckButton/styles/normal = null 21 | CheckButton/styles/pressed = null 22 | 23 | -------------------------------------------------------------------------------- /gui/default_theme.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Theme" load_steps=4 format=1] 2 | 3 | [ext_resource path="res://assets/fonts/ttf/japan.ttf" type="DynamicFontData" id=1] 4 | [ext_resource path="res://assets/fonts/ttf/courier.ttf" type="DynamicFontData" id=2] 5 | 6 | [sub_resource type="DynamicFont" id=1] 7 | 8 | font/size = 16 9 | font/use_mipmaps = false 10 | font/use_filter = false 11 | font/font = ExtResource( 2 ) 12 | fallback/0 = ExtResource( 1 ) 13 | 14 | [resource] 15 | 16 | Label/colors/font_color = Color( 1, 1, 1, 1 ) 17 | Label/colors/font_color_shadow = Color( 0, 0, 0, 0 ) 18 | Label/constants/line_spacing = 3 19 | Label/constants/shadow_as_outline = 0 20 | Label/constants/shadow_offset_x = 0 21 | Label/constants/shadow_offset_y = 0 22 | Label/fonts/font = SubResource( 1 ) 23 | 24 | -------------------------------------------------------------------------------- /gui/font_12.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Theme" load_steps=4 format=1] 2 | 3 | [ext_resource path="res://assets/fonts/ttf/japan.ttf" type="DynamicFontData" id=1] 4 | [ext_resource path="res://assets/fonts/ttf/courier.ttf" type="DynamicFontData" id=2] 5 | 6 | [sub_resource type="DynamicFont" id=1] 7 | 8 | font/size = 12 9 | font/use_mipmaps = false 10 | font/use_filter = false 11 | font/font = ExtResource( 2 ) 12 | fallback/0 = ExtResource( 1 ) 13 | 14 | [resource] 15 | 16 | Label/colors/font_color = Color( 1, 1, 1, 1 ) 17 | Label/colors/font_color_shadow = Color( 0, 0, 0, 0 ) 18 | Label/constants/line_spacing = 3 19 | Label/constants/shadow_as_outline = 0 20 | Label/constants/shadow_offset_x = 1 21 | Label/constants/shadow_offset_y = 1 22 | Label/fonts/font = SubResource( 1 ) 23 | 24 | -------------------------------------------------------------------------------- /gui/font_14.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Theme" load_steps=4 format=1] 2 | 3 | [ext_resource path="res://assets/fonts/ttf/japan.ttf" type="DynamicFontData" id=1] 4 | [ext_resource path="res://assets/fonts/ttf/courier.ttf" type="DynamicFontData" id=2] 5 | 6 | [sub_resource type="DynamicFont" id=1] 7 | 8 | font/size = 14 9 | font/use_mipmaps = false 10 | font/use_filter = false 11 | font/font = ExtResource( 2 ) 12 | fallback/0 = ExtResource( 1 ) 13 | 14 | [resource] 15 | 16 | Label/colors/font_color = Color( 1, 1, 1, 1 ) 17 | Label/colors/font_color_shadow = Color( 0, 0, 0, 0 ) 18 | Label/constants/line_spacing = 0 19 | Label/constants/shadow_as_outline = 0 20 | Label/constants/shadow_offset_x = 1 21 | Label/constants/shadow_offset_y = 1 22 | Label/fonts/font = SubResource( 1 ) 23 | 24 | -------------------------------------------------------------------------------- /gui/font_16.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Theme" load_steps=4 format=1] 2 | 3 | [ext_resource path="res://assets/fonts/ttf/japan.ttf" type="DynamicFontData" id=1] 4 | [ext_resource path="res://assets/fonts/ttf/courier.ttf" type="DynamicFontData" id=2] 5 | 6 | [sub_resource type="DynamicFont" id=1] 7 | 8 | font/size = 16 9 | font/use_mipmaps = false 10 | font/use_filter = false 11 | font/font = ExtResource( 2 ) 12 | fallback/0 = ExtResource( 1 ) 13 | 14 | [resource] 15 | 16 | Label/colors/font_color = Color( 1, 1, 1, 1 ) 17 | Label/colors/font_color_shadow = Color( 0, 0, 0, 0 ) 18 | Label/constants/line_spacing = 0 19 | Label/constants/shadow_as_outline = 0 20 | Label/constants/shadow_offset_x = 1 21 | Label/constants/shadow_offset_y = 1 22 | Label/fonts/font = SubResource( 1 ) 23 | 24 | -------------------------------------------------------------------------------- /gui/font_22.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Theme" load_steps=4 format=1] 2 | 3 | [ext_resource path="res://assets/fonts/ttf/japan.ttf" type="DynamicFontData" id=1] 4 | [ext_resource path="res://assets/fonts/ttf/courier.ttf" type="DynamicFontData" id=2] 5 | 6 | [sub_resource type="DynamicFont" id=1] 7 | 8 | font/size = 22 9 | font/use_mipmaps = false 10 | font/use_filter = false 11 | font/font = ExtResource( 2 ) 12 | fallback/0 = ExtResource( 1 ) 13 | 14 | [resource] 15 | 16 | Label/colors/font_color = Color( 1, 1, 1, 1 ) 17 | Label/colors/font_color_shadow = Color( 0, 0, 0, 0 ) 18 | Label/constants/line_spacing = 3 19 | Label/constants/shadow_as_outline = 0 20 | Label/constants/shadow_offset_x = 1 21 | Label/constants/shadow_offset_y = 1 22 | Label/fonts/font = SubResource( 1 ) 23 | 24 | -------------------------------------------------------------------------------- /gui/font_32.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Theme" load_steps=4 format=1] 2 | 3 | [ext_resource path="res://assets/fonts/ttf/japan.ttf" type="DynamicFontData" id=1] 4 | [ext_resource path="res://assets/fonts/ttf/courier.ttf" type="DynamicFontData" id=2] 5 | 6 | [sub_resource type="DynamicFont" id=1] 7 | 8 | font/size = 32 9 | font/use_mipmaps = false 10 | font/use_filter = false 11 | font/font = ExtResource( 2 ) 12 | fallback/0 = ExtResource( 1 ) 13 | 14 | [resource] 15 | 16 | Label/colors/font_color = Color( 1, 1, 1, 1 ) 17 | Label/colors/font_color_shadow = Color( 0, 0, 0, 0 ) 18 | Label/constants/line_spacing = 3 19 | Label/constants/shadow_as_outline = 0 20 | Label/constants/shadow_offset_x = 1 21 | Label/constants/shadow_offset_y = 1 22 | Label/fonts/font = SubResource( 1 ) 23 | 24 | -------------------------------------------------------------------------------- /gui/hud/ap_gain.gd: -------------------------------------------------------------------------------- 1 | 2 | var bag 3 | 4 | func _init_bag(bag): 5 | self.bag = bag 6 | 7 | func update(): 8 | self.bag.controllers.hud_panel_controller.info_panel.set_ap_gain(self.__calculate_gain()) 9 | 10 | func __calculate_gain(): 11 | var total_ap_gain = 0 12 | var current_player = self.bag.controllers.action_controller.current_player 13 | 14 | #TODO WrmZ - investigate this (refreshing buildings - this should be done once) 15 | self.bag.positions.refresh_buildings() 16 | var buildings = self.bag.positions.get_player_buildings(current_player) 17 | for pos in buildings: 18 | total_ap_gain = total_ap_gain + buildings[pos].bonus_ap 19 | 20 | return total_ap_gain -------------------------------------------------------------------------------- /gui/hud/building_panel.gd: -------------------------------------------------------------------------------- 1 | var building_panel 2 | 3 | var building_panel_units_dock 4 | var building_panel_units_dock_button 5 | 6 | var build_card_template = preload("res://gui/hud/build_card.gd") 7 | var build_card 8 | 9 | var building = null 10 | var name_label 11 | 12 | func bind(hud_panel): 13 | self.building_panel = hud_panel.get_node('building_panel') 14 | self.name_label = self.building_panel.get_node('building_name') 15 | self.build_card = self.build_card_template.new() 16 | self.build_card.bind(self.building_panel) 17 | 18 | func bind_building(building_object, player_ap): 19 | var unit_spawned = building_object.spawn_unit(building_object.player) 20 | self.building = building_object 21 | self.name_label.set_text(tr('LABEL_BUILDING_' + building_object.get_building_name())) 22 | self.build_card.fill_card(unit_spawned, building.get_required_ap(), player_ap, building.spawn_field) 23 | unit_spawned.call_deferred("free") 24 | 25 | func bind_spawn_unit(controller, method_name): 26 | self.build_card.bind_spawn_unit(controller, method_name) 27 | 28 | func unbind_building(): 29 | self.building = null 30 | 31 | func show(): 32 | self.building_panel.show() 33 | 34 | func hide(): 35 | self.building_panel.hide() -------------------------------------------------------------------------------- /gui/hud/current_team.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=1] 2 | 3 | [ext_resource path="res://assets/gui/dialogs/menu9_red@2x.png" type="Texture" id=1] 4 | [ext_resource path="res://scripts/translate_me.gd" type="Script" id=2] 5 | [ext_resource path="res://gui/flag.xscn" type="PackedScene" id=3] 6 | 7 | [node name="current_team" type="Patch9Frame"] 8 | 9 | anchor/right = 1 10 | anchor/bottom = 1 11 | rect/min_size = Vector2( 176, 40 ) 12 | focus/ignore_mouse = true 13 | focus/stop_mouse = true 14 | size_flags/horizontal = 2 15 | size_flags/vertical = 2 16 | margin/left = -92.0 17 | margin/top = -20.0 18 | margin/right = 1196.0 19 | margin/bottom = 700.0 20 | texture = ExtResource( 1 ) 21 | patch_margin/left = 24 22 | patch_margin/top = 12 23 | patch_margin/right = 24 24 | patch_margin/bottom = 12 25 | 26 | [node name="team_turn" type="Label" parent="."] 27 | 28 | focus/ignore_mouse = true 29 | focus/stop_mouse = true 30 | size_flags/horizontal = 2 31 | size_flags/vertical = 0 32 | margin/left = 9.0 33 | margin/top = 11.0 34 | margin/right = 140.0 35 | margin/bottom = 25.0 36 | text = "CURRENT TEAM" 37 | align = 2 38 | valign = 2 39 | percent_visible = 1.0 40 | lines_skipped = 0 41 | max_lines_visible = -1 42 | script/script = ExtResource( 2 ) 43 | trans_key = "LABEL_CURRENT_TEAM" 44 | 45 | [node name="flag" parent="." instance=ExtResource( 3 )] 46 | 47 | transform/pos = Vector2( 152, 9 ) 48 | transform/scale = Vector2( 2, 2 ) 49 | color = 0 50 | 51 | 52 | -------------------------------------------------------------------------------- /gui/hud/unit_panel.gd: -------------------------------------------------------------------------------- 1 | 2 | var unit_panel 3 | 4 | var unit_panel_extras 5 | var unit_panel_extras_button 6 | var unit_panel_name 7 | var unit_panel_attack 8 | var unit_panel_health 9 | var unit_panel_action1 10 | var unit_panel_action2 11 | var unit_panel_ap 12 | var unit_attacks_left 13 | 14 | var unit = null 15 | 16 | var background_extra_unit 17 | 18 | func bind(hud_panel): 19 | self.unit_panel = hud_panel.get_node('unit_panel') 20 | 21 | #self.unit_panel_extras = self.unit_panel.get_node('extras') 22 | #self.unit_panel_extras_button = self.unit_panel.get_node('extras_button') 23 | #self.unit_panel_name = self.unit_panel.get_node('name') 24 | self.unit_panel_attack = self.unit_panel.get_node('attack') 25 | self.unit_panel_health = self.unit_panel.get_node('health') 26 | self.unit_panel_ap = self.unit_panel.get_node('ap') 27 | self.unit_attacks_left = self.unit_panel.get_node('attacks_left') 28 | #self.background_extra_unit = hud_panel.get_node('background/unit_extra_panel') 29 | 30 | #self.unit_panel_extras_button.connect('pressed', self, 'toggle_skills') 31 | 32 | func bind_unit(unit_object): 33 | self.hide_skills() 34 | 35 | self.unit = unit_object 36 | self.update_hud() 37 | 38 | func update_hud(): 39 | if self.unit == null: 40 | return 41 | self.set_attack(self.unit.attack) 42 | self.set_health(self.unit.life, self.unit.max_life) 43 | self.set_ap(self.unit.ap, self.unit.max_ap) 44 | self.set_attacks(self.unit.attacks_number) 45 | 46 | func unbind_unit(): 47 | self.hide_skills() 48 | self.unit = null 49 | 50 | func show(): 51 | self.unit_panel.show() 52 | 53 | func hide(): 54 | self.unit_panel.hide() 55 | 56 | func set_attack(value): 57 | self.unit_panel_attack.set_text(str(value)) 58 | 59 | func set_attacks(value): 60 | self.unit_attacks_left.set_text(str(value) + 'x') 61 | 62 | func set_health(value, max_value): 63 | self.unit_panel_health.set_text(str(value) + '/' + str(max_value)) 64 | 65 | func set_ap(value, max_value): 66 | self.unit_panel_ap.set_text(str(value) + '/' + str(max_value)) 67 | 68 | func toggle_skills(): 69 | #if self.unit_panel_extras.is_hidden(): 70 | # self.show_skills() 71 | #else: 72 | # self.hide_skills() 73 | return 74 | 75 | func show_skills(): 76 | #self.unit_panel_extras.show() 77 | #self.background_extra_unit.show() 78 | return 79 | 80 | func hide_skills(): 81 | #self.unit_panel_extras.hide() 82 | #self.background_extra_unit.hide() 83 | return -------------------------------------------------------------------------------- /gui/hud_pc.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=1] 2 | 3 | [ext_resource path="res://gui/hud_default.tscn" type="PackedScene" id=1] 4 | 5 | [node name="GUI" instance=ExtResource( 1 )] 6 | 7 | 8 | -------------------------------------------------------------------------------- /gui/hud_tv.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=1] 2 | 3 | [ext_resource path="res://gui/hud_pc.tscn" type="PackedScene" id=1] 4 | 5 | [node name="GUI" instance=ExtResource( 1 )] 6 | 7 | [node name="top_left_panel" parent="."] 8 | 9 | margin/left = 160.0 10 | margin/top = 100.0 11 | margin/right = 160.0 12 | 13 | [node name="top_center" parent="."] 14 | 15 | margin/top = 60.0 16 | 17 | [node name="center" parent="top_center"] 18 | 19 | margin/top = 0.0 20 | margin/bottom = 0.0 21 | 22 | [node name="top_right_panel" parent="."] 23 | 24 | margin/left = 160.0 25 | margin/top = 100.0 26 | margin/right = 160.0 27 | margin/bottom = 100.0 28 | 29 | [node name="bottom_left" parent="."] 30 | 31 | margin/left = 160.0 32 | margin/top = 80.0 33 | margin/right = 160.0 34 | margin/bottom = 80.0 35 | 36 | [node name="bottom_center" parent="."] 37 | 38 | editor/display_folded = true 39 | margin/top = 80.0 40 | margin/bottom = 80.0 41 | 42 | [node name="bottom_right" parent="."] 43 | 44 | margin/left = 160.0 45 | margin/top = 80.0 46 | margin/right = 160.0 47 | margin/bottom = 80.0 48 | 49 | 50 | -------------------------------------------------------------------------------- /gui/ingame_avatar.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=1] 2 | 3 | [ext_resource path="res://assets/units/avatars_spritesheet.png" type="Texture" id=1] 4 | [ext_resource path="res://gui/panel_gray.tres" type="Theme" id=2] 5 | 6 | [node name="avatar" type="Control"] 7 | 8 | focus/ignore_mouse = false 9 | focus/stop_mouse = true 10 | size_flags/horizontal = 2 11 | size_flags/vertical = 2 12 | margin/left = 0.0 13 | margin/top = 0.0 14 | margin/right = 0.0 15 | margin/bottom = 0.0 16 | 17 | [node name="sprite" type="Sprite" parent="."] 18 | 19 | transform/pos = Vector2( 0, -12 ) 20 | transform/scale = Vector2( 8, 8 ) 21 | texture = ExtResource( 1 ) 22 | vframes = 4 23 | hframes = 6 24 | 25 | [node name="Panel" type="Panel" parent="."] 26 | 27 | anchor/right = 1 28 | anchor/bottom = 1 29 | rect/min_size = Vector2( 248, 32 ) 30 | focus/ignore_mouse = false 31 | focus/stop_mouse = true 32 | size_flags/horizontal = 2 33 | size_flags/vertical = 2 34 | theme/theme = ExtResource( 2 ) 35 | margin/left = -124.0 36 | margin/top = 20.0 37 | margin/right = -124.0 38 | margin/bottom = -52.0 39 | 40 | [node name="name" type="Label" parent="."] 41 | 42 | anchor/right = 1 43 | anchor/bottom = 1 44 | rect/min_size = Vector2( 200, 0 ) 45 | focus/ignore_mouse = false 46 | focus/stop_mouse = false 47 | size_flags/horizontal = 2 48 | size_flags/vertical = 2 49 | margin/left = -100.0 50 | margin/top = 30.0 51 | margin/right = -100.0 52 | margin/bottom = -44.0 53 | text = "SAMPLE NAME" 54 | align = 1 55 | uppercase = true 56 | percent_visible = 1.0 57 | lines_skipped = 0 58 | max_lines_visible = -1 59 | 60 | 61 | -------------------------------------------------------------------------------- /gui/panel_gray.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Theme" load_steps=3 format=1] 2 | 3 | [ext_resource path="res://assets/gui/dialogs/menu9_dark@2x.png" type="Texture" id=1] 4 | 5 | [sub_resource type="StyleBoxTexture" id=1] 6 | 7 | content_margin/left = -1.0 8 | content_margin/right = -1.0 9 | content_margin/top = -1.0 10 | content_margin/bottom = -1.0 11 | texture = ExtResource( 1 ) 12 | margin/left = 24.0 13 | margin/right = 24.0 14 | margin/top = 24.0 15 | margin/bottom = 24.0 16 | expand_margin/left = 0.0 17 | expand_margin/right = 0.0 18 | expand_margin/top = 0.0 19 | expand_margin/bottom = 0.0 20 | draw_center = true 21 | 22 | [resource] 23 | 24 | Panel/styles/panel = SubResource( 1 ) 25 | Panel/styles/panelf = null 26 | Panel/styles/panelnc = null 27 | 28 | -------------------------------------------------------------------------------- /gui/popups/prompt_mobile.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=1] 2 | 3 | [ext_resource path="res://gui/popups/prompt.tscn" type="PackedScene" id=1] 4 | 5 | [node name="message" instance=ExtResource( 1 )] 6 | 7 | margin/top = -128.0 8 | margin/bottom = -88.0 9 | 10 | [node name="Patch9Frame" parent="."] 11 | 12 | margin/left = 300.0 13 | margin/right = -268.0 14 | margin/bottom = -44.0 15 | 16 | [node name="cancel" parent="."] 17 | 18 | margin/left = -272.0 19 | margin/top = 8.0 20 | margin/right = -128.0 21 | margin/bottom = 56.0 22 | 23 | [node name="confirm" parent="."] 24 | 25 | margin/left = 136.0 26 | margin/top = 8.0 27 | margin/right = 280.0 28 | margin/bottom = 56.0 29 | 30 | [node name="title" parent="."] 31 | 32 | margin/left = -264.0 33 | margin/right = 272.0 34 | 35 | [node name="message" parent="."] 36 | 37 | margin/left = -264.0 38 | margin/right = 272.0 39 | 40 | [node name="input" parent="."] 41 | 42 | focus_neighbour/top = NodePath("../cancel") 43 | focus_neighbour/bottom = NodePath("../confirm") 44 | margin/left = -110.0 45 | margin/top = 18.0 46 | margin/right = 120.0 47 | margin/bottom = 44.0 48 | 49 | 50 | -------------------------------------------------------------------------------- /gui/settings/option_one_button.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=1] 2 | 3 | [ext_resource path="res://scripts/translate_me.gd" type="Script" id=1] 4 | [ext_resource path="res://gui/button_small_theme.tres" type="Theme" id=2] 5 | 6 | [node name="box1" type="Control"] 7 | 8 | rect/min_size = Vector2( 190, 80 ) 9 | focus/ignore_mouse = false 10 | focus/stop_mouse = true 11 | size_flags/horizontal = 2 12 | size_flags/vertical = 2 13 | margin/left = 0.0 14 | margin/top = 0.0 15 | margin/right = 180.0 16 | margin/bottom = 80.0 17 | 18 | [node name="title" type="Label" parent="."] 19 | 20 | anchor/right = 1 21 | rect/min_size = Vector2( 0, 32 ) 22 | focus/ignore_mouse = true 23 | focus/stop_mouse = true 24 | size_flags/horizontal = 2 25 | size_flags/vertical = 0 26 | margin/left = 0.0 27 | margin/top = 0.0 28 | margin/right = 0.0 29 | margin/bottom = 32.0 30 | text = "SET TRANS KEY" 31 | align = 1 32 | valign = 1 33 | autowrap = true 34 | uppercase = true 35 | percent_visible = 1.0 36 | lines_skipped = 0 37 | max_lines_visible = -1 38 | script/script = ExtResource( 1 ) 39 | trans_key = "LABEL_DEFAULT" 40 | 41 | [node name="buttons" type="CenterContainer" parent="."] 42 | 43 | anchor/top = 1 44 | anchor/right = 1 45 | anchor/bottom = 1 46 | rect/min_size = Vector2( 0, 32 ) 47 | focus/ignore_mouse = false 48 | focus/stop_mouse = true 49 | size_flags/horizontal = 2 50 | size_flags/vertical = 2 51 | margin/left = 0.0 52 | margin/top = 48.0 53 | margin/right = 4.0 54 | margin/bottom = 0.0 55 | use_top_left = false 56 | 57 | [node name="center" type="Container" parent="buttons"] 58 | 59 | focus/ignore_mouse = false 60 | focus/stop_mouse = true 61 | size_flags/horizontal = 2 62 | size_flags/vertical = 2 63 | margin/left = 93.0 64 | margin/top = 24.0 65 | margin/right = 93.0 66 | margin/bottom = 24.0 67 | 68 | [node name="first" type="Button" parent="buttons/center"] 69 | 70 | rect/min_size = Vector2( 90, 48 ) 71 | focus/ignore_mouse = false 72 | focus/stop_mouse = true 73 | size_flags/horizontal = 2 74 | size_flags/vertical = 2 75 | theme/theme = ExtResource( 2 ) 76 | margin/left = -45.0 77 | margin/top = -24.0 78 | margin/right = 45.0 79 | margin/bottom = 24.0 80 | toggle_mode = false 81 | enabled_focus_mode = 2 82 | shortcut = null 83 | text = "SET KEY" 84 | flat = false 85 | script/script = ExtResource( 1 ) 86 | trans_key = "LABEL_DEFAULT" 87 | 88 | 89 | -------------------------------------------------------------------------------- /gui/settings/option_switch.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=1] 2 | 3 | [ext_resource path="res://scripts/translate_me.gd" type="Script" id=1] 4 | [ext_resource path="res://gui/checkbox_theme.tres" type="Theme" id=2] 5 | 6 | [node name="box1" type="Control"] 7 | 8 | rect/min_size = Vector2( 190, 80 ) 9 | focus/ignore_mouse = false 10 | focus/stop_mouse = true 11 | size_flags/horizontal = 2 12 | size_flags/vertical = 2 13 | margin/left = 0.0 14 | margin/top = 0.0 15 | margin/right = 180.0 16 | margin/bottom = 80.0 17 | 18 | [node name="title" type="Label" parent="."] 19 | 20 | anchor/right = 1 21 | rect/min_size = Vector2( 0, 32 ) 22 | focus/ignore_mouse = true 23 | focus/stop_mouse = true 24 | size_flags/horizontal = 2 25 | size_flags/vertical = 0 26 | margin/left = 0.0 27 | margin/top = 0.0 28 | margin/right = 0.0 29 | margin/bottom = 32.0 30 | text = "SET TRANS KEY" 31 | align = 1 32 | valign = 1 33 | autowrap = true 34 | uppercase = true 35 | percent_visible = 1.0 36 | lines_skipped = 0 37 | max_lines_visible = -1 38 | script/script = ExtResource( 1 ) 39 | trans_key = "LABEL_DEFAULT" 40 | 41 | [node name="switch" type="CenterContainer" parent="."] 42 | 43 | anchor/top = 1 44 | anchor/right = 1 45 | anchor/bottom = 1 46 | rect/min_size = Vector2( 0, 32 ) 47 | focus/ignore_mouse = false 48 | focus/stop_mouse = true 49 | size_flags/horizontal = 2 50 | size_flags/vertical = 2 51 | margin/left = 0.0 52 | margin/top = 48.0 53 | margin/right = 4.0 54 | margin/bottom = 0.0 55 | use_top_left = false 56 | 57 | [node name="center" type="Container" parent="switch"] 58 | 59 | focus/ignore_mouse = false 60 | focus/stop_mouse = true 61 | size_flags/horizontal = 2 62 | size_flags/vertical = 2 63 | margin/left = 93.0 64 | margin/top = 24.0 65 | margin/right = 93.0 66 | margin/bottom = 24.0 67 | 68 | [node name="CheckButton" type="CheckButton" parent="switch/center"] 69 | 70 | focus/ignore_mouse = false 71 | focus/stop_mouse = true 72 | size_flags/horizontal = 2 73 | size_flags/vertical = 2 74 | theme/theme = ExtResource( 2 ) 75 | margin/left = -37.0 76 | margin/top = -15.0 77 | margin/right = 39.0 78 | margin/bottom = 7.0 79 | toggle_mode = true 80 | enabled_focus_mode = 2 81 | shortcut = null 82 | flat = false 83 | align = 0 84 | 85 | 86 | -------------------------------------------------------------------------------- /gui/settings/option_two_buttons.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=1] 2 | 3 | [ext_resource path="res://gui/settings/option_one_button.tscn" type="PackedScene" id=1] 4 | [ext_resource path="res://gui/button_small_theme.tres" type="Theme" id=2] 5 | [ext_resource path="res://scripts/translate_me.gd" type="Script" id=3] 6 | 7 | [node name="box1" instance=ExtResource( 1 )] 8 | 9 | [node name="first" parent="buttons/center"] 10 | 11 | margin/left = -93.0 12 | margin/right = -3.0 13 | 14 | [node name="second" type="Button" parent="buttons/center"] 15 | 16 | rect/min_size = Vector2( 90, 48 ) 17 | focus/ignore_mouse = false 18 | focus/stop_mouse = true 19 | size_flags/horizontal = 2 20 | size_flags/vertical = 2 21 | theme/theme = ExtResource( 2 ) 22 | margin/left = 3.0 23 | margin/top = -24.0 24 | margin/right = 93.0 25 | margin/bottom = 24.0 26 | toggle_mode = false 27 | enabled_focus_mode = 2 28 | shortcut = null 29 | text = "SET KEY" 30 | flat = false 31 | script/script = ExtResource( 3 ) 32 | trans_key = "LABEL_DEFAULT" 33 | 34 | 35 | -------------------------------------------------------------------------------- /gui/small_gray_theme.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Theme" load_steps=4 format=1] 2 | 3 | [ext_resource path="res://assets/fonts/ttf/japan.ttf" type="DynamicFontData" id=1] 4 | [ext_resource path="res://assets/fonts/ttf/courier.ttf" type="DynamicFontData" id=2] 5 | 6 | [sub_resource type="DynamicFont" id=1] 7 | 8 | font/size = 14 9 | font/use_mipmaps = false 10 | font/use_filter = false 11 | font/font = ExtResource( 2 ) 12 | fallback/0 = ExtResource( 1 ) 13 | 14 | [resource] 15 | 16 | Label/colors/font_color = Color( 0.615686, 0.615686, 0.615686, 1 ) 17 | Label/colors/font_color_shadow = Color( 0, 0, 0, 0 ) 18 | Label/constants/line_spacing = 0 19 | Label/constants/shadow_as_outline = 0 20 | Label/constants/shadow_offset_x = 1 21 | Label/constants/shadow_offset_y = 1 22 | Label/fonts/font = SubResource( 1 ) 23 | 24 | -------------------------------------------------------------------------------- /gui/small_red_theme.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Theme" load_steps=2 format=1] 2 | 3 | [ext_resource path="res://gui/font_14.tres" type="DynamicFont" id=1] 4 | 5 | [resource] 6 | 7 | Label/colors/font_color = Color( 0.745098, 0.14902, 0.2, 1 ) 8 | Label/colors/font_color_shadow = Color( 0, 0, 0, 0 ) 9 | Label/constants/line_spacing = 3 10 | Label/constants/shadow_as_outline = 0 11 | Label/constants/shadow_offset_x = 1 12 | Label/constants/shadow_offset_y = 1 13 | Label/fonts/font = ExtResource( 1 ) 14 | 15 | -------------------------------------------------------------------------------- /gui/vigette.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=1] 2 | 3 | [ext_resource path="res://assets/gui/extras/vigette.png" type="Texture" id=1] 4 | 5 | [node name="vigette" type="CenterContainer"] 6 | 7 | anchor/right = 1 8 | anchor/bottom = 1 9 | focus/ignore_mouse = false 10 | focus/stop_mouse = true 11 | size_flags/horizontal = 2 12 | size_flags/vertical = 2 13 | margin/left = 0.0 14 | margin/top = 0.0 15 | margin/right = 0.0 16 | margin/bottom = 0.0 17 | use_top_left = false 18 | __meta__ = { 19 | "_edit_lock_": true 20 | } 21 | 22 | [node name="center" type="Control" parent="."] 23 | 24 | focus/ignore_mouse = false 25 | focus/stop_mouse = true 26 | size_flags/horizontal = 2 27 | size_flags/vertical = 2 28 | margin/left = 640.0 29 | margin/top = 360.0 30 | margin/right = 640.0 31 | margin/bottom = 360.0 32 | 33 | [node name="sprite" type="Sprite" parent="center"] 34 | 35 | visibility/opacity = 0.6 36 | transform/scale = Vector2( 5, 5 ) 37 | texture = ExtResource( 1 ) 38 | __meta__ = { 39 | "_edit_lock_": true 40 | } 41 | 42 | 43 | -------------------------------------------------------------------------------- /icon.png.flags: -------------------------------------------------------------------------------- 1 | gen_mipmaps=true 2 | -------------------------------------------------------------------------------- /logs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/logs/.gitkeep -------------------------------------------------------------------------------- /maps/waypoint.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=1] 2 | 3 | [ext_resource path="res://scripts/objects/waypoints/waypoint.gd" type="Script" id=1] 4 | 5 | [node name="waypoint" type="Control"] 6 | 7 | focus/ignore_mouse = false 8 | focus/stop_mouse = true 9 | size_flags/horizontal = 2 10 | size_flags/vertical = 2 11 | margin/left = 0.0 12 | margin/top = 0.0 13 | margin/right = 40.0 14 | margin/bottom = 40.0 15 | script/script = ExtResource( 1 ) 16 | position_on_map = Vector2( 0, 0 ) 17 | 18 | 19 | -------------------------------------------------------------------------------- /particle/explosion.gd: -------------------------------------------------------------------------------- 1 | 2 | var unit 3 | 4 | func _die(): 5 | unit.clear_explosion() 6 | 7 | func clear_points(): 8 | unit.clear_floating_damage() 9 | 10 | func show_ap_icon(): 11 | get_node('AP').show() -------------------------------------------------------------------------------- /scripts/abstract_map.gd: -------------------------------------------------------------------------------- 1 | 2 | var size = Vector2(0, 0) 3 | var fields = [[null]] 4 | var map 5 | var tilemap 6 | var field_template = preload('abstract_field.gd') 7 | 8 | var MAX_MAP_SIZE = 40 9 | const MAP_MAX_X = 40 10 | const MAP_MAX_Y = 40 11 | 12 | func reset(): 13 | self.size = Vector2(0, 0) 14 | self.fields = [[null]] 15 | 16 | func init_map(map_node): 17 | self.map = map_node 18 | self.tilemap = self.map.get_node("terrain") 19 | 20 | func get_fields(): 21 | return fields 22 | 23 | # TODO extending should be done in diferent wa 24 | func get_field(position): 25 | if position.x < 0 || position.y < 0: 26 | return self.create_out_of_bounds_field() 27 | 28 | if fields[0][0] == null: 29 | fields[0][0] = self.create_field(Vector2(0, 0)) 30 | 31 | if (position.x > size.x || position.y > size.y): 32 | self.extend(position) 33 | return fields[position.y][position.x] 34 | 35 | func extend(position): 36 | var row 37 | var field 38 | #extend existing rows 39 | for i in range(size.y + 1): 40 | row = fields[i] 41 | for j in range(position.x - size.x): 42 | row.insert(size.x + j + 1, self.create_field(Vector2(size.x + j + 1, i))) 43 | 44 | #add new rows 45 | var width = position.x 46 | if size.x > width: 47 | width = size.x 48 | 49 | for i in range(position.y - size.y): 50 | row = [] 51 | for j in range(width + 1): 52 | row.insert(j, self.create_field(Vector2(j, size.y + i + 1))) 53 | fields.insert(size.y + i + 1, row) 54 | 55 | if position.x > size.x: 56 | size.x = position.x 57 | if position.y > size.y: 58 | size.y = position.y 59 | 60 | func create_field(position): 61 | var field = field_template.new() 62 | field.position = position 63 | field.terrain_type = tilemap.get_cell(position.x, position.y) 64 | field.abstract_map = self 65 | return field 66 | 67 | func is_spawning_point(position): 68 | return tilemap.get_cell(position.x, position.y) == 13 69 | 70 | 71 | func create_out_of_bounds_field(): 72 | var field = self.create_field(Vector2(-1, -1)) 73 | 74 | return field 75 | 76 | -------------------------------------------------------------------------------- /scripts/action_map.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var map 4 | var action_layer 5 | var red_tiles = [] 6 | 7 | func init_map(map_node): 8 | self.map = map_node 9 | self.action_layer = self.map.get_node("terrain/actions") 10 | 11 | func reset(): 12 | self.action_layer.clear() 13 | 14 | func find_movement_tiles(source_field, move_range): 15 | var tiles = {} 16 | var processing_queue = [{ 'field': source_field, 'depth': 0 }] 17 | var index = 0 18 | var visited_tiles = {} 19 | var depth 20 | var field 21 | var abstract_map = self.bag.abstract_map 22 | visited_tiles[source_field.position] = true 23 | 24 | if move_range == 0: 25 | return {} 26 | 27 | while processing_queue.size() > index: 28 | field = processing_queue[index].field 29 | depth = processing_queue[index].depth 30 | 31 | if depth > 0: 32 | tiles[field.position] = depth 33 | 34 | if depth < move_range: 35 | for neighbour in field.get_neighbours(): 36 | if neighbour.is_passable() and not visited_tiles.has(neighbour.position): 37 | if self.bag.fog_controller.is_fogged(neighbour.position): 38 | continue 39 | processing_queue.push_back({ 'field': neighbour, 'depth': depth + 1 }) 40 | visited_tiles[neighbour.position] = true 41 | index += 1 42 | 43 | return tiles 44 | 45 | func add_movement_indicator(tile, tile_type): 46 | self.action_layer.set_cell(tile.x, tile.y, tile_type) 47 | 48 | func mark_movement_tiles(source, tiles, first_action_range, current_player): 49 | var tile_type 50 | var field 51 | var distance 52 | var abstract_map = self.bag.abstract_map 53 | var player_ap = self.bag.controllers.action_controller.player_ap[current_player] 54 | 55 | for tile in tiles: 56 | if self.bag.fog_controller.is_fogged(tile): 57 | continue 58 | field = abstract_map.get_field(tile) 59 | distance = tiles[tile] 60 | tile_type = 1 61 | 62 | for neighbour in field.get_neighbours(): 63 | if neighbour.is_empty(): 64 | continue 65 | 66 | if self.bag.fog_controller.is_fogged(neighbour.position): 67 | continue 68 | 69 | if neighbour.has_attackable_enemy(source.object) || neighbour.has_capturable_building(source.object): 70 | tile_type = 3 71 | break 72 | 73 | if distance > first_action_range: 74 | tile_type = 2 75 | 76 | if distance == player_ap && player_ap <= first_action_range: 77 | tile_type = 1 78 | 79 | self.add_movement_indicator(tile, tile_type) 80 | -------------------------------------------------------------------------------- /scripts/ai/actions/brains/airport_brain.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/brains/building_brain.gd" 2 | 3 | func _initialize(): 4 | ._initialize() 5 | self.base_spawn_score = 120 6 | self.in_danger_score = 60 7 | self.unit_amount_penalty = 80 8 | 9 | 10 | func _apply_amount_penalty(units): 11 | var counts = self._count_units(units) 12 | 13 | if int(counts["tank"] / 3) < counts["heli"]: 14 | return true 15 | 16 | return false 17 | -------------------------------------------------------------------------------- /scripts/ai/actions/brains/barracks_brain.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/brains/building_brain.gd" 2 | 3 | 4 | func _apply_amount_penalty(units): 5 | var counts = self._count_units(units) 6 | 7 | if counts["soldier"] > 10: 8 | return true 9 | 10 | return false 11 | -------------------------------------------------------------------------------- /scripts/ai/actions/brains/base_brain.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var actions_templates = {} 4 | 5 | func get_actions(entity): 6 | return [] 7 | -------------------------------------------------------------------------------- /scripts/ai/actions/brains/building_brain.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/brains/base_brain.gd" 2 | 3 | 4 | var close_threshold = 4 5 | 6 | var base_spawn_score = 100 7 | var in_danger_score = 100 8 | 9 | var unit_amount_penalty = 50 10 | 11 | var global_spawn_limit = 20 12 | 13 | 14 | func _initialize(): 15 | self.actions_templates['spawn'] = preload("res://scripts/ai/actions/types/spawn_unit_action.gd") 16 | 17 | 18 | func get_actions(entity, enemies = {}, units = {}): 19 | var spawn_field = self.bag.abstract_map.get_field(entity.spawn_point) 20 | if spawn_field.object != null: 21 | return [] 22 | 23 | var available_action_points = self.bag.controllers.action_controller.player_ap[entity.player] 24 | if entity.get_required_ap() > available_action_points: 25 | return [] 26 | 27 | var spawn_limit = min(self.bag.ai.pathfinder.passable_field_count / 7, self.global_spawn_limit) 28 | if units.size() >= spawn_limit: 29 | return [] 30 | 31 | 32 | var spawn_action = self.actions_templates["spawn"].new(entity) 33 | var score = self.base_spawn_score 34 | var distance 35 | 36 | for position in enemies: 37 | if enemies[position].type_name != "soldier": 38 | continue 39 | 40 | distance = self.bag.ai.pathfinder.get_distance(entity.position_on_map, position) 41 | if distance <= self.close_threshold: 42 | score = score + self.in_danger_score 43 | break 44 | 45 | if self._apply_amount_penalty(units): 46 | score = score - self.unit_amount_penalty 47 | 48 | spawn_action.set_score(score) 49 | 50 | return [spawn_action] 51 | 52 | 53 | func _apply_amount_penalty(units): 54 | return false 55 | 56 | func _count_units(units): 57 | var counts = { 58 | "soldier" : 0, 59 | "tank" : 0, 60 | "heli" : 0 61 | } 62 | 63 | for key in units: 64 | counts[units[key].type_name] += 1 65 | 66 | return counts 67 | -------------------------------------------------------------------------------- /scripts/ai/actions/brains/factory_brain.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/brains/building_brain.gd" 2 | 3 | func _initialize(): 4 | ._initialize() 5 | self.base_spawn_score = 110 6 | 7 | 8 | func _apply_amount_penalty(units): 9 | var counts = self._count_units(units) 10 | 11 | if counts["tank"] > int(counts["soldier"] * 1.5): 12 | return true 13 | 14 | return false 15 | -------------------------------------------------------------------------------- /scripts/ai/actions/brains/heli_brain.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/brains/unit_brain.gd" 2 | 3 | func _initialize(): 4 | ._initialize() 5 | self.aggression_range = 16 6 | -------------------------------------------------------------------------------- /scripts/ai/actions/brains/hq_brain.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/brains/building_brain.gd" 2 | 3 | func _initialize(): 4 | ._initialize() 5 | self.base_spawn_score = 50 6 | self.in_danger_score = 140 7 | self.unit_amount_penalty = 50 8 | 9 | 10 | func _apply_amount_penalty(units): 11 | var counts = self._count_units(units) 12 | 13 | if counts["soldier"] > 5: 14 | return true 15 | 16 | return false 17 | -------------------------------------------------------------------------------- /scripts/ai/actions/brains/soldier_brain.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/brains/unit_brain.gd" 2 | -------------------------------------------------------------------------------- /scripts/ai/actions/brains/tank_brain.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/brains/unit_brain.gd" 2 | 3 | func _initialize(): 4 | ._initialize() 5 | self.aggression_range = 16 6 | -------------------------------------------------------------------------------- /scripts/ai/actions/brains/tower_brain.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/brains/building_brain.gd" 2 | 3 | func get_actions(entity, enemies = {}, units = {}): 4 | return [] -------------------------------------------------------------------------------- /scripts/ai/actions/egzekutor.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var hands = { 4 | "spawn" : preload("res://scripts/ai/actions/hands/spawn_hand.gd").new(), 5 | "move" : preload("res://scripts/ai/actions/hands/move_hand.gd").new(), 6 | } 7 | 8 | 9 | func _initialize(): 10 | for hand_name in self.hands: 11 | self.hands[hand_name]._init_bag(self.bag) 12 | 13 | 14 | func execute(action): 15 | var hand = self._get_hand(action) 16 | hand.execute(action) 17 | action.proceed() 18 | 19 | 20 | func _get_hand(action): 21 | for hand_name in self.hands: 22 | if action extends self.hands[hand_name].handled_action: 23 | return self.hands[hand_name] 24 | -------------------------------------------------------------------------------- /scripts/ai/actions/hands/base_hand.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var handled_action 4 | 5 | func execute(action): 6 | return 7 | -------------------------------------------------------------------------------- /scripts/ai/actions/hands/move_hand.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/hands/base_hand.gd" 2 | 3 | func _initialize(): 4 | self.handled_action = preload("res://scripts/ai/actions/types/move_action.gd") 5 | 6 | func execute(action): 7 | if action.path.size() < 2: 8 | return 9 | 10 | var field = self.bag.abstract_map.get_field(action.path[1]) 11 | if field.object != null && field.object.player == self.bag.controllers.action_controller.current_player: 12 | action.invalid = true 13 | return 14 | 15 | self.bag.controllers.action_controller.set_active_field(action.entity.position_on_map) 16 | self.bag.controllers.action_controller.handle_action(action.path[1]) 17 | -------------------------------------------------------------------------------- /scripts/ai/actions/hands/spawn_hand.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/hands/base_hand.gd" 2 | 3 | func _initialize(): 4 | self.handled_action = preload("res://scripts/ai/actions/types/spawn_unit_action.gd") 5 | 6 | func execute(action): 7 | self.bag.controllers.action_controller.set_active_field(action.entity.position_on_map) 8 | self.bag.controllers.action_controller.spawn_unit_from_active_building() 9 | -------------------------------------------------------------------------------- /scripts/ai/actions/types/attack_action.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/types/move_action.gd" 2 | 3 | var target 4 | 5 | func _init(unit, path, target).(unit, path): 6 | self.score_cap = 400 7 | self.target = target 8 | -------------------------------------------------------------------------------- /scripts/ai/actions/types/base_action.gd: -------------------------------------------------------------------------------- 1 | 2 | var entity 3 | 4 | var score_cap = 0 5 | 6 | var score = 0 7 | 8 | var invalid = false 9 | 10 | func _init(entity): 11 | self.entity = entity 12 | 13 | func set_score(score): 14 | if self.score_cap > 0 and self.score_cap < score: 15 | self.score = self.score_cap 16 | else: 17 | if score > 0: 18 | self.score = score 19 | 20 | func can_continue(): 21 | return false 22 | 23 | func proceed(): 24 | return 25 | -------------------------------------------------------------------------------- /scripts/ai/actions/types/capture_action.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/types/move_action.gd" 2 | 3 | var target 4 | 5 | func _init(unit, path, target).(unit, path): 6 | self.score_cap = 1000 7 | self.target = target 8 | -------------------------------------------------------------------------------- /scripts/ai/actions/types/move_action.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/types/base_action.gd" 2 | 3 | var path 4 | 5 | func _init(unit, path).(unit): 6 | self.path = path 7 | 8 | func proceed(): 9 | .proceed() 10 | self.path.pop_front() 11 | 12 | func can_continue(): 13 | if self.invalid: 14 | return false 15 | 16 | if self.path.size() == 1: 17 | return false 18 | 19 | if self.entity.ap == 0: 20 | return false 21 | 22 | if self.entity.ap == 1 and self.path.size() > 2: 23 | return false 24 | 25 | return true 26 | -------------------------------------------------------------------------------- /scripts/ai/actions/types/spawn_unit_action.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/ai/actions/types/base_action.gd" 2 | 3 | 4 | func _init(building).(building): 5 | self.score_cap = 300 6 | -------------------------------------------------------------------------------- /scripts/ai/ai.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | # copied a_star implementation to fix some issues 4 | var pathfinder = preload("res://scripts/ai/a_star.gd").new() 5 | 6 | # actions collector for AI 7 | var collector = preload("res://scripts/ai/actions/collector.gd").new() 8 | 9 | # executor for current action 10 | var executor = preload("res://scripts/ai/actions/egzekutor.gd").new() 11 | 12 | 13 | # stored action with multiple steps to be executed 14 | var current_action = null 15 | 16 | 17 | # initialize stuf as needed 18 | func _initialize(): 19 | self.pathfinder._init_bag(self.bag) 20 | self.collector._init_bag(self.bag) 21 | self.executor._init_bag(self.bag) 22 | 23 | 24 | # wrapper method to be compatible with previous AI 25 | # 26 | # @return bool - returns whether AI was able to perform an action 27 | func start_do_ai(current_player, player_ap): 28 | return self._perform_ai_tick(current_player) 29 | 30 | # reset AI to initial state 31 | func reset(): 32 | self.current_action = null 33 | 34 | 35 | # method for performin a single tick of AI 36 | # tick consists of optional action gathering and action execution 37 | func _perform_ai_tick(current_player): 38 | if self.current_action == null: 39 | self._prepare_current_action(current_player) 40 | 41 | return self._execute_best_action() 42 | 43 | 44 | # gathers available actions and picks the best one to become current action 45 | func _prepare_current_action(current_player): 46 | var available_actions = self.collector.get_available_actions(current_player) 47 | 48 | if available_actions.size() > 0: 49 | self.current_action = self._get_best_action(available_actions) 50 | 51 | # method for selecting best action from a collection 52 | func _get_best_action(available_actions): 53 | available_actions.sort_custom(self, "_value_first_sort_comparator") 54 | 55 | return available_actions[0] 56 | 57 | # action value comparator for sort 58 | func _value_first_sort_comparator(a, b): 59 | if b != null and a.score > b.score: 60 | return true 61 | return false 62 | 63 | 64 | # executes currently selected action 65 | # 66 | # @return bool - returns whether AI was able to perform an action 67 | func _execute_best_action(): 68 | if self.current_action == null: 69 | return false 70 | 71 | self.executor.execute(self.current_action) 72 | 73 | if not self.current_action.can_continue(): 74 | self.current_action = null 75 | 76 | return true -------------------------------------------------------------------------------- /scripts/ai/perform.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var running = false 4 | var pause = false 5 | 6 | var ai_speeds = [ 7 | [0.5, 2], 8 | [0.3, 1.5], 9 | [0.15, 1], 10 | [0.08, 0.5], 11 | [0.05, 0.01] 12 | ] 13 | 14 | var interval 15 | var skip_interval 16 | 17 | func _initialize(): 18 | self.update_ai_speed() 19 | 20 | func do_ai_stuff(): 21 | if !self.running: 22 | return 23 | 24 | if self.bag.controllers.action_controller.game_ended and self.bag.match_state.is_multiplayer: 25 | self.stop_ai_timer() 26 | return 27 | 28 | if self.bag.root.is_paused || self.bag.camera.panning || self.pause || self.bag.controllers.action_controller.exploding: 29 | self.__execute_with_interval(self.skip_interval) 30 | return 31 | 32 | if self.bag.controllers.action_controller.perform_ai_stuff() != true: 33 | self.bag.controllers.action_controller.end_turn() 34 | return 35 | 36 | self.__execute_with_interval(self.interval) 37 | 38 | func start_ai_timer(): 39 | self.running = true 40 | self.pause = false 41 | self.__execute_with_interval(self.interval) 42 | 43 | func stop_ai_timer(): 44 | self.running = false 45 | 46 | func __execute_with_interval(interval): 47 | self.bag.timers.set_timeout(interval, self, "do_ai_stuff") 48 | 49 | func update_ai_speed(): 50 | self.__set_ai_speed(self.bag.root.settings['ai_speed']) 51 | 52 | func __set_ai_speed(speed): 53 | var intervals = self.ai_speeds[speed] 54 | self.interval = intervals[0] 55 | self.skip_interval = intervals[1] -------------------------------------------------------------------------------- /scripts/bag_aware.gd: -------------------------------------------------------------------------------- 1 | var bag = null 2 | 3 | func _init_bag(bag): 4 | self.bag = bag 5 | self._initialize() 6 | 7 | func _initialize(): 8 | #do nothing -------------------------------------------------------------------------------- /scripts/battle_controller.gd: -------------------------------------------------------------------------------- 1 | var defender_stats 2 | var attacker_stats 3 | 4 | func resolve_fight(attacker, defender): 5 | attacker_stats = attacker.get_stats() 6 | defender_stats = defender.get_stats() 7 | 8 | defender_stats.life = defender_stats.life - attacker_stats.attack 9 | defender.set_stats(defender_stats) 10 | defender.show_floating_damage(attacker_stats.attack) 11 | 12 | attacker_stats.ap = attacker_stats.ap - attacker_stats.attack_ap 13 | attacker_stats.attacks_number = attacker_stats.attacks_number - 1 14 | attacker.set_stats(attacker_stats) 15 | 16 | #handle 17 | if (defender_stats.life <= 0): 18 | attacker.score_kill() 19 | return true 20 | else: 21 | return false 22 | 23 | func resolve_defend(attacker, defender): 24 | attacker_stats = attacker.get_stats() 25 | defender_stats = defender.get_stats() 26 | 27 | attacker_stats.life = attacker_stats.life - defender_stats.attack 28 | attacker.set_stats(attacker_stats) 29 | attacker.show_floating_damage(defender_stats.attack) 30 | 31 | defender_stats.ap = 0 32 | defender.set_stats(defender_stats) 33 | 34 | #handle 35 | if (attacker_stats.life <= 0): 36 | defender.score_kill() 37 | return true 38 | else: 39 | return false 40 | 41 | func can_attack(attacker, defender): 42 | return attacker.can_attack_unit_type(defender) && attacker.can_attack() 43 | 44 | func can_defend(defender, attacker): 45 | return defender.can_attack_unit_type(attacker) && defender.can_defend() 46 | -------------------------------------------------------------------------------- /scripts/battle_stats.gd: -------------------------------------------------------------------------------- 1 | const DOMINATION = "domination" 2 | const MOVES = "moves" 3 | const TOTAL_TIME = "total_time" 4 | const KILLS = "kills" 5 | const TIME = "time" 6 | const SPAWNS = "spawns" 7 | const SCORE = "score" 8 | const TIME_FORMATED = "time_formated" 9 | 10 | var stats = null 11 | 12 | var start_time 13 | 14 | func _init(): 15 | self.reset() 16 | 17 | func add_domination(player, value): 18 | self.__increment(self.DOMINATION, player, value) 19 | 20 | func add_spawn(player): 21 | self.__increment(self.SPAWNS, player) 22 | 23 | func add_kills(player): 24 | self.__increment(self.KILLS, player) 25 | 26 | func add_moves(player): 27 | self.__increment(self.MOVES, player) 28 | 29 | func start_counting_time(): 30 | start_time = OS.get_unix_time() 31 | 32 | func set_counting_time(player): 33 | var time_now = OS.get_unix_time() 34 | 35 | self.__increment(self.TIME, player, time_now - start_time) 36 | start_time = time_now 37 | 38 | func get_stats(): 39 | self.__calculate_score() 40 | 41 | self.stats[self.TOTAL_TIME] = __time_format(self.stats[self.TIME][0] + self.stats[self.TIME][1]) 42 | self.stats[self.TIME_FORMATED] = [__time_format(self.stats[self.TIME][0]), __time_format(self.stats[self.TIME][1])] 43 | 44 | return self.stats 45 | 46 | func apply(values): 47 | for param in values: 48 | self.stats[param] = values[param] 49 | return self 50 | 51 | func reset(): 52 | self.stats = { 53 | self.DOMINATION : [0, 0], 54 | self.MOVES : [0, 0], 55 | self.KILLS : [0, 0], 56 | self.TIME : [0, 0], 57 | self.SPAWNS : [0, 0], 58 | self.SCORE : [0, 0], 59 | self.TOTAL_TIME : 1, 60 | self.TIME_FORMATED : ['0:00', '0:00'], 61 | } 62 | 63 | func __calculate_score(): 64 | self.stats[self.SCORE][0] = (self.stats[self.DOMINATION][0] * 3 + self.stats[self.KILLS][0] * 2 + self.stats[self.MOVES][0] + self.stats[self.SPAWNS][0]) * 10 65 | self.stats[self.SCORE][1] = (self.stats[self.DOMINATION][1] * 3 + self.stats[self.KILLS][1] * 2 + self.stats[self.MOVES][1] + self.stats[self.SPAWNS][1]) * 10 66 | 67 | func __time_format(value): 68 | var m = floor(value / 60) 69 | var s = value - m * 60 70 | 71 | return self.__fill(str(m))+ ':' + self.__fill(str(s)) 72 | 73 | func __fill(value): 74 | if value.length() < 2: 75 | value = '0'+value 76 | 77 | return value 78 | 79 | func __increment(stat, player, value = 1): 80 | self.stats[stat][player] = self.stats[stat][player] + value 81 | 82 | -------------------------------------------------------------------------------- /scripts/button_visual_hack.gd: -------------------------------------------------------------------------------- 1 | extends TextureButton 2 | 3 | export var offset_x = 0 4 | export var offset_y = 3 5 | 6 | var label 7 | var start_position 8 | 9 | func press_label(): 10 | label.set_pos(start_position + Vector2(offset_x,offset_y)) 11 | 12 | func release_label(): 13 | label.set_pos(start_position) 14 | 15 | func _ready(): 16 | label = get_node("Label") 17 | start_position = label.get_pos() 18 | self.connect("pressed", self, "press_label") 19 | self.connect("released", self, "release_label") 20 | pass 21 | -------------------------------------------------------------------------------- /scripts/controllers/action_status.gd: -------------------------------------------------------------------------------- 1 | var list = [] 2 | 3 | const NONE = 0 4 | const GAME_ENDED = 1 5 | const CLEAR_ACTIVE_FIELD = 2 6 | const HAS_TERRAIN = 3 7 | const ACTIVATE_FIELD = 4 8 | const MOVE_UNIT = 5 9 | const NO_MOVES = 6 10 | const BATTLE = 7 11 | const CAPTURE = 8 12 | const CAPTURE_AND_WIN = 9 13 | const UNEXPECTED = 10 14 | const CANNOT_DO = 11 15 | 16 | func add(code, status, msg): 17 | self.list.insert(code, {'status': status, "msg": msg}) 18 | 19 | func _init(): 20 | self.add(self.NONE, 0, "-") 21 | self.add(self.GAME_ENDED, 0, "game ends") 22 | self.add(self.CLEAR_ACTIVE_FIELD, 0, "clear active field") 23 | self.add(self.HAS_TERRAIN, 0, "has terrain") 24 | self.add(self.ACTIVATE_FIELD, 0, "activate field") 25 | self.add(self.MOVE_UNIT, 1, "move unit") 26 | self.add(self.NO_MOVES, 0, "no moves") 27 | self.add(self.BATTLE, 1, "battle") 28 | self.add(self.CAPTURE, 1, "capture building") 29 | self.add(self.CAPTURE_AND_WIN, 1, "capture hq") 30 | self.add(self.UNEXPECTED, 0, "unexpected") 31 | self.add(self.CANNOT_DO, 0, "cannot do action") 32 | -------------------------------------------------------------------------------- /scripts/controllers/background_map_controller.gd: -------------------------------------------------------------------------------- 1 | var background_map 2 | var root 3 | 4 | func init_root(root_node): 5 | self.root = root_node 6 | 7 | func load_background_map(): 8 | self.background_map = self.root.map_template.instance() 9 | self.background_map._init_bag(self.root.bag) 10 | self.background_map.is_dead = true 11 | self.background_map.switch_to_tileset(self.root.main_tileset) 12 | self.background_map.fill_map_from_data_array(self.root.bag.menu_background_map.map_data) 13 | self.background_map.show_blueprint = false 14 | self.background_map.get_node('fog_of_war').hide() 15 | self.root.scale_root.add_child(self.background_map) 16 | self.__flush_group("units") 17 | self.__flush_group("buildings") 18 | self.__flush_group("terrain") 19 | self.update_background_scale() 20 | 21 | func show_background_map(): 22 | if self.background_map != null: 23 | self.background_map.show() 24 | 25 | func hide_background_map(): 26 | if self.background_map != null: 27 | self.background_map.hide() 28 | 29 | func update_background_scale(): 30 | if self.background_map != null: 31 | self.background_map.scale = self.root.scale_root.get_scale() 32 | if not self.root.is_map_loaded: 33 | self.root.camera.set_pos(Vector2(-200, 500)) 34 | 35 | func __flush_group(name): 36 | var collection = self.root.get_tree().get_nodes_in_group(name) 37 | for entity in collection: 38 | entity.remove_from_group(name) -------------------------------------------------------------------------------- /scripts/controllers/controllers.gd: -------------------------------------------------------------------------------- 1 | var action_controller = preload("res://scripts/controllers/action_controller.gd").new() 2 | var menu_controller = preload('res://gui/menu.tscn').instance() 3 | var campaign_menu_controller = preload("res://scripts/controllers/campaign_menu_controller.gd").new() 4 | var hud_panel_controller = preload("res://scripts/controllers/hud_panel_controller.gd").new() 5 | var workshop_gui_controller = null #preload("res://scripts/controllers/workshop_gui_controller.gd").new() 6 | var online_menu_controller = preload("res://scripts/controllers/online_menu_controller.gd").new() 7 | var workshop_menu_controller = preload("res://scripts/controllers/workshop_menu_controller.gd").new() 8 | var background_map_controller = preload("res://scripts/controllers/background_map_controller.gd").new() -------------------------------------------------------------------------------- /scripts/controllers/hud_panel_controller.gd: -------------------------------------------------------------------------------- 1 | 2 | var root 3 | var hud_panel = preload("res://gui/hud/hud_panel.xscn").instance() 4 | var end_turn_panel_scene = preload("res://gui/hud/end_turn.tscn").instance() 5 | var info_panel_scene = preload("res://gui/hud/turn_info.tscn").instance() 6 | var zoom_panel_scene = preload("res://gui/hud/zoom_panel.tscn").instance() 7 | 8 | var default_panel = null 9 | var unit_panel = preload("res://gui/hud/unit_panel.gd").new() 10 | var building_panel = preload("res://gui/hud/building_panel.gd").new() 11 | var info_panel = preload("res://gui/hud/info_panel.gd").new() 12 | 13 | 14 | func init_root(root_node): 15 | root = root_node 16 | self.default_panel = self.hud_panel.get_node('default_panel') 17 | self.unit_panel.bind(self.hud_panel) 18 | self.building_panel.bind(self.hud_panel) 19 | 20 | self.info_panel._init_bag(root_node.bag) 21 | self.info_panel.bind(self.end_turn_panel_scene, self.info_panel_scene, self.zoom_panel_scene) 22 | 23 | func bind_panels(card_anchor, end_anchor, info_anchor, zoom_anchor): 24 | card_anchor.add_child(self.hud_panel) 25 | end_anchor.add_child(self.end_turn_panel_scene) 26 | info_anchor.add_child(self.info_panel_scene) 27 | zoom_anchor.add_child(self.zoom_panel_scene) 28 | 29 | func unbind_panels(card_anchor, end_anchor, info_anchor, zoom_anchor): 30 | card_anchor.remove_child(self.hud_panel) 31 | end_anchor.remove_child(self.end_turn_panel_scene) 32 | info_anchor.remove_child(self.info_panel_scene) 33 | zoom_anchor.remove_child(self.zoom_panel_scene) 34 | 35 | func show_default_panel(): 36 | default_panel.show() 37 | 38 | func hide_default_panel(): 39 | default_panel.hide() 40 | 41 | func show_building_panel(building, player_ap): 42 | self.hide_default_panel() 43 | self.building_panel.bind_building(building, player_ap) 44 | self.building_panel.show() 45 | 46 | func hide_building_panel(): 47 | self.building_panel.hide() 48 | self.building_panel.unbind_building() 49 | self.show_default_panel() 50 | 51 | func show_unit_panel(unit): 52 | self.hide_default_panel() 53 | self.unit_panel.bind_unit(unit) 54 | self.unit_panel.show() 55 | 56 | func hide_unit_panel(): 57 | self.unit_panel.hide() 58 | self.unit_panel.unbind_unit() 59 | self.show_default_panel() 60 | 61 | func hide_panel(): 62 | self.hud_panel.hide() 63 | self.info_panel_scene.hide() 64 | self.end_turn_panel_scene.hide() 65 | 66 | func show_panel(): 67 | self.hud_panel.show() 68 | self.info_panel_scene.show() 69 | self.end_turn_panel_scene.show() 70 | 71 | func clear_panels(): 72 | self.hide_unit_panel() 73 | self.hide_building_panel() 74 | 75 | func reset(): 76 | self.info_panel.reset() 77 | self.clear_panels() -------------------------------------------------------------------------------- /scripts/controllers/online/multiplayer_box.gd: -------------------------------------------------------------------------------- 1 | 2 | var bag 3 | var match_box 4 | 5 | var match_panel = preload("res://scripts/controllers/online/used_panel.gd").new() 6 | var fill_panel = preload("res://scripts/controllers/online/free_panel.gd").new() 7 | 8 | func _init(bag, match_box): 9 | self.bag = bag 10 | self.match_box = match_box 11 | 12 | self.bind() 13 | 14 | func bind(): 15 | self.match_panel._init_bag(self.bag, self.match_box.get_node('used')) 16 | self.fill_panel._init_bag(self.bag, self.match_box.get_node('free')) 17 | 18 | func show_match(): 19 | self.match_panel.show() 20 | self.fill_panel.hide() 21 | 22 | func show_fill(): 23 | self.match_panel.hide() 24 | self.fill_panel.show() 25 | 26 | func hide(): 27 | self.match_panel.hide() 28 | self.fill_panel.hide() 29 | 30 | func bind_match_data(data): 31 | self.match_panel.bind_match_data(data) 32 | self.show_match() 33 | -------------------------------------------------------------------------------- /scripts/controllers/workshop_gui_controller.gd: -------------------------------------------------------------------------------- 1 | var root 2 | var workshop 3 | 4 | var blueprint = preload("res://scripts/workshop/blueprint.gd").new() 5 | 6 | var toolbox_panel = preload("res://scripts/workshop/toolbox_panel.gd").new() 7 | var building_blocks_panel = preload("res://scripts/workshop/building_blocks_panel.gd").new() 8 | var message_popup 9 | var file_panel = preload("res://scripts/workshop/file_panel.gd").new() 10 | var navigation_panel = preload("res://scripts/workshop/navigation_panel.gd").new() 11 | 12 | func init_root(root_node): 13 | self.root = root_node 14 | self.workshop = self.root.bag.workshop 15 | self.root.add_child(self.root.bag.workshop) 16 | self.blueprint.init_root(root_node) 17 | self.toolbox_panel.init_root(root_node) 18 | self.building_blocks_panel.init_root(root_node) 19 | self.file_panel.init_root(root_node) 20 | self.navigation_panel.init_root(root_node) 21 | self.bind_workshop() 22 | self.workshop.hide() 23 | 24 | func bind_workshop(): 25 | self.blueprint.bind_panel(self.workshop.get_node("blueprint")) 26 | self.toolbox_panel.bind_panel(self.workshop.get_node("toolbox_panel")) 27 | self.building_blocks_panel.bind_panel(self.workshop.get_node("building_blocks_panel")) 28 | self.file_panel.bind_panel(self.workshop.get_node("file_card")) 29 | self.navigation_panel.bind_panel(self.workshop.get_node("navigation_panel/center/navigation_panel")) 30 | self.message_popup = self.workshop.hud_message 31 | 32 | func show_toolbox_panel(): 33 | self.toolbox_panel.show() 34 | self.workshop.painting_allowed = false 35 | 36 | func hide_toolbox_panel(): 37 | self.toolbox_panel.hide() 38 | self.workshop.painting_allowed = true 39 | 40 | func toggle_toolbox_panel(): 41 | if self.toolbox_panel.toolbox_panel.is_visible(): 42 | self.hide_toolbox_panel() 43 | else: 44 | self.show_toolbox_panel() 45 | 46 | func show_block_panel(): 47 | self.building_blocks_panel.show() 48 | 49 | func hide_block_panel(): 50 | self.building_blocks_panel.hide() 51 | 52 | func toggle_block_blocks(): 53 | if self.building_blocks_panel.building_block_panel.is_visible(): 54 | self.hide_block_panel() 55 | else: 56 | self.show_block_panel() 57 | -------------------------------------------------------------------------------- /scripts/controllers/workshop_menu_controller.gd: -------------------------------------------------------------------------------- 1 | var workshop 2 | var root 3 | var bag 4 | var menu_controller 5 | var background_map_controller 6 | var workshop_enabled = false 7 | 8 | func init_root(root_node): 9 | self.root = root_node 10 | self.bag = self.root.bag 11 | self.workshop = self.bag.workshop 12 | self.menu_controller = self.bag.controllers.menu_controller 13 | self.workshop_enabled = Globals.get('tof/enable_workshop') 14 | self.background_map_controller = self.bag.controllers.background_map_controller 15 | 16 | func enter_workshop(): 17 | if self.workshop_enabled: 18 | self.root.unload_map() 19 | self.bag.match_state.reset() 20 | self.workshop.is_working = true 21 | self.workshop.is_suspended = false 22 | self.show_workshop() 23 | 24 | func show_workshop(): 25 | if self.workshop_enabled: 26 | self.menu_controller.hide() 27 | self.root.hide_menu() 28 | self.workshop.show() 29 | self.workshop.units.raise() 30 | self.background_map_controller.hide_background_map() 31 | self.workshop.camera.make_current() 32 | self.bag.controllers.workshop_gui_controller.navigation_panel.block_button.grab_focus() 33 | 34 | func hide_workshop(): 35 | if self.workshop_enabled: 36 | self.workshop.hide() 37 | self.workshop.camera.clear_current() 38 | self.bag.camera.camera.make_current() 39 | self.menu_controller.show() 40 | if not self.root.is_map_loaded: 41 | self.background_map_controller.show_background_map() 42 | self.menu_controller.workshop_button.grab_focus() 43 | 44 | func suspend_workshop(): 45 | if self.workshop_enabled: 46 | self.workshop.hide() 47 | self.workshop.is_working = false 48 | self.workshop.is_suspended = true 49 | 50 | func resume_map(): 51 | if self.bag.saving == null: 52 | return 53 | self.bag.saving.load_state() 54 | self.root.toggle_menu() 55 | self.menu_controller.hide_maps_menu() 56 | __show_workshop() 57 | 58 | func __show_workshop(): 59 | if self.workshop_enabled: 60 | workshop.hide() 61 | workshop.is_working = false 62 | workshop.is_suspended = true -------------------------------------------------------------------------------- /scripts/cursor.gd: -------------------------------------------------------------------------------- 1 | extends Sprite 2 | 3 | func _input(event): 4 | if(event.type == InputEvent.MOUSE_BUTTON): 5 | if (event.button_index == BUTTON_LEFT): 6 | if event.pressed: 7 | self.set_frame(1) 8 | else: 9 | self.set_frame(0) 10 | if (event.type == InputEvent.MOUSE_MOTION): 11 | self.set_pos(Vector2(event.x, event.y)) 12 | 13 | func _ready(): 14 | set_process_input(true) 15 | pass 16 | 17 | 18 | -------------------------------------------------------------------------------- /scripts/demo_mode.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var root 4 | var demo_timer 5 | 6 | func _initialize(): 7 | self.root = self.bag.root 8 | self.demo_timer = self.root.get_node('DemoTimer') 9 | self.demo_timer.inject_root(self.root) 10 | 11 | func start_demo_mode(delay=true): 12 | if delay: 13 | self.demo_timer.reset() 14 | else: 15 | self.demo_timer.reset(self.demo_timer.NO_DELAY) 16 | self.demo_timer.start() 17 | 18 | func start_map(): 19 | self.root.settings['turns_cap'] = 50 20 | self.root.settings['cpu_0'] = true 21 | self.root.settings['cpu_1'] = true 22 | self.root.load_map('workshop', self.get_random_map(), false, false, self, "post_start_map") 23 | 24 | func post_start_map(): 25 | if !self.root.menu.is_hidden(): 26 | self.root.toggle_menu() 27 | self.root.lock_for_demo() 28 | 29 | func get_random_map(): 30 | randomize() 31 | var map_num = randi() % self.bag.map_list.maps.size() 32 | var keys = self.bag.map_list.maps.keys() 33 | return keys[map_num] -------------------------------------------------------------------------------- /scripts/demo_timer.gd: -------------------------------------------------------------------------------- 1 | extends Timer 2 | 3 | var timeout = 0 4 | const INTERVAL = 15 5 | const STATS_INTERVAL = 3 6 | var root 7 | 8 | var state = null 9 | 10 | const INTRO = 1 11 | const STATS = 2 12 | const NO_DELAY = 3 13 | 14 | func _process(delta): 15 | timeout += delta 16 | if timeout > self.__get_interval(): 17 | self.stop() 18 | 19 | if state == INTRO: 20 | if self.root.is_intro: 21 | self.root.load_menu() 22 | self.reset(STATS) 23 | else: 24 | self.reset(INTRO) 25 | self.root.bag.demo_mode.start_map() 26 | 27 | func inject_root(root_obj): 28 | root = root_obj 29 | 30 | func reset(state = INTRO): 31 | timeout = 0 32 | self.state = state 33 | 34 | func __get_interval(): 35 | if state == INTRO: 36 | return INTERVAL 37 | elif state == NO_DELAY: 38 | return 0 39 | else: 40 | return STATS_INTERVAL 41 | 42 | -------------------------------------------------------------------------------- /scripts/destroyed_tile.gd: -------------------------------------------------------------------------------- 1 | extends Sprite 2 | 3 | export var damaged = false 4 | var max_frames 5 | 6 | func check_destruction(): 7 | if damaged: 8 | self.set_frame(randi() % max_frames) 9 | else: 10 | self.set_frame(0) 11 | 12 | func set_damage(): 13 | damaged = true 14 | 15 | func _ready(): 16 | randomize() 17 | max_frames = self.get_vframes() * self.get_hframes() 18 | check_destruction() 19 | pass 20 | 21 | 22 | -------------------------------------------------------------------------------- /scripts/flag.gd: -------------------------------------------------------------------------------- 1 | extends Sprite 2 | 3 | var anim 4 | var animation_total_duration 5 | export var color = 2 6 | 7 | func change_flag(color_code): 8 | if color_code == 0: 9 | anim.play("blue") 10 | elif color_code == 1: 11 | anim.play("red") 12 | else: 13 | anim.play("white") 14 | anim.seek(randf() * animation_total_duration,true) 15 | 16 | func _ready(): 17 | anim = self.get_node("anim") 18 | animation_total_duration = anim.get_current_animation_length() 19 | change_flag(color) 20 | pass 21 | -------------------------------------------------------------------------------- /scripts/game_conditions.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var action_controller 4 | 5 | func _initialize(): 6 | self.action_controller = self.bag.controllers.action_controller 7 | 8 | func check_turn_cap(): 9 | if self.bag.root.settings['turns_cap'] > 0: 10 | if self.action_controller.turn >= self.bag.root.settings['turns_cap']: 11 | self.action_controller.end_game(-1) 12 | 13 | func check_win_conditions(field): 14 | if field.object.type == 0: 15 | self.action_controller.end_game(self.action_controller.current_player) 16 | return 1 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /scripts/intro.gd: -------------------------------------------------------------------------------- 1 | 2 | extends Control 3 | 4 | # zuo istnieje 5 | var root 6 | var anim 7 | var demo_timer 8 | var audio 9 | 10 | func _input(event): 11 | if ( event.type == InputEvent.KEY and event.pressed ) or (event.type == InputEvent.MOUSE_BUTTON and event.pressed) or (event.type == InputEvent.JOYSTICK_BUTTON and event.pressed): 12 | self.root.bag.demo_mode.demo_timer.stop() 13 | self.root.unlock_for_demo() 14 | self.root.bag.timers.set_timeout(0.1, self.root, "load_menu") 15 | 16 | if event.type == InputEvent.JOYSTICK_BUTTON: 17 | self.root.bag.gamepad.mark_gamepad(event) 18 | 19 | func init_root(root): 20 | self.root = root 21 | 22 | func _ready(): 23 | anim = self.get_node("anim") 24 | audio = self.get_node('audio') 25 | if self.root != null && self.root.settings['music_enabled']: 26 | audio.play() 27 | set_process_input(true) 28 | pass 29 | 30 | func _on_idle_timer_timeout(): 31 | anim.play("idle") 32 | self.root.bag.demo_mode.start_demo_mode() 33 | pass # replace with function body 34 | -------------------------------------------------------------------------------- /scripts/maps/map_tiles.gd: -------------------------------------------------------------------------------- 1 | 2 | const TERRAIN_PLAIN = 0 3 | const TERRAIN_FOREST = 1 4 | const TERRAIN_MOUNTAINS = 2 5 | const TERRAIN_RIVER = 3 6 | const TERRAIN_CITY = 4 7 | const TERRAIN_CITY_DESTROYED = 33 8 | const TERRAIN_ROAD = 5 9 | const TERRAIN_DIRT_ROAD = 6 10 | const TERRAIN_DIRT = 7 11 | const TERRAIN_BRIDGE = 8 12 | const TERRAIN_FENCE = 9 13 | const TERRAIN_STATUE = 10 14 | 15 | const TERRAIN_HQ_BLUE = 11 16 | const TERRAIN_HQ_RED = 12 17 | 18 | const TERRAIN_BARRACKS_FREE = 13 19 | const TERRAIN_FACTORY_FREE = 14 20 | const TERRAIN_AIRPORT_FREE = 15 21 | const TERRAIN_TOWER_FREE = 16 22 | 23 | const TERRAIN_SPAWN = 17 24 | 25 | const TERRAIN_BARRACKS_RED = 19 26 | const TERRAIN_FACTORY_RED = 20 27 | const TERRAIN_AIRPORT_RED = 21 28 | const TERRAIN_TOWER_RED = 22 29 | 30 | const TERRAIN_BARRACKS_BLUE = 23 31 | const TERRAIN_FACTORY_BLUE = 24 32 | const TERRAIN_AIRPORT_BLUE = 25 33 | const TERRAIN_TOWER_BLUE = 26 34 | 35 | const UNIT_INFANTRY_BLUE = 27 36 | const UNIT_TANK_BLUE = 28 37 | const UNIT_HELICOPTER_BLUE = 29 38 | 39 | const UNIT_INFANTRY_RED = 30 40 | const UNIT_TANK_RED = 31 41 | const UNIT_HELICOPTER_RED = 32 42 | 43 | const TERRAIN_CONCRETE = 34 44 | const UNIT_CIVILIAN = 35 45 | 46 | const ICON_EREASE = 18 47 | 48 | const CITY_SMALL_1 = 0 49 | const CITY_SMALL_2 = 1 50 | const CITY_SMALL_3 = 2 51 | const CITY_SMALL_4 = 3 52 | const CITY_SMALL_5 = 4 53 | const CITY_SMALL_6 = 5 54 | 55 | const CITY_BIG_1 = 6 56 | const CITY_BIG_2 = 7 57 | const CITY_BIG_3 = 8 58 | const CITY_BIG_4 = 9 59 | 60 | const CITY_STATUE = 10 61 | const CITY_FENCE = 11 62 | const COUNTRY_FOREST_MOUNTAIN = 12 63 | const CITY_FENCE = 14 -------------------------------------------------------------------------------- /scripts/message.gd: -------------------------------------------------------------------------------- 1 | 2 | extends Control 3 | 4 | var line 5 | var hud_title 6 | var hud_message 7 | var hud_button_close 8 | var hud_button_text 9 | var active = false 10 | var flag 11 | 12 | func show_message(title, message, footer, button, flag = 2): 13 | self.active = true 14 | self.hud_title.set_text(title) 15 | self.hud_message.set_text(message) 16 | self.hud_button_text.set_text(button) 17 | self.set_flag(flag) 18 | self.raise() 19 | 20 | func close_message(): 21 | self.active = false 22 | #self.hide() 23 | 24 | func is_visible(): 25 | return self.active 26 | 27 | func set_flag(color_code): 28 | self.flag.change_flag(color_code); 29 | 30 | func _ready(): 31 | self.hud_title = self.get_node("title") 32 | self.hud_message = self.get_node("message") 33 | self.hud_button_close = self.get_node("button") 34 | self.hud_button_text = self.hud_button_close.get_node("Label") 35 | self.flag = self.get_node("flag") 36 | self.hud_button_close.connect("pressed",self,"close_message") 37 | -------------------------------------------------------------------------------- /scripts/migrations/abstract_version.gd: -------------------------------------------------------------------------------- 1 | 2 | var version = 0 3 | var bag 4 | 5 | func _init(bag): 6 | self.bag = bag 7 | 8 | func migrate(): 9 | return -------------------------------------------------------------------------------- /scripts/migrations/migrations.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var current_version = 0 4 | var migrations 5 | var file_handler = File.new() 6 | var version_file_path = "user://version.tof" 7 | 8 | func _initialize(): 9 | self.migrations = [ 10 | preload("res://scripts/migrations/version20150730.gd").new(self.bag), 11 | preload("res://scripts/migrations/version20160506.gd").new(self.bag), 12 | preload("res://scripts/migrations/version20160512.gd").new(self.bag) 13 | ] 14 | self.load_version() 15 | self.run_migrations() 16 | self.save_version() 17 | 18 | func load_version(): 19 | if not self.file_handler.file_exists(self.version_file_path): 20 | self.set_latest_migration() 21 | self.save_version(); 22 | 23 | self.file_handler.open(self.version_file_path, File.READ) 24 | self.current_version = self.file_handler.get_var() 25 | self.file_handler.close() 26 | 27 | func save_version(): 28 | self.file_handler.open(self.version_file_path, File.WRITE) 29 | self.file_handler.store_var(self.current_version) 30 | self.file_handler.close() 31 | 32 | func run_migrations(): 33 | for migration in self.migrations: 34 | if migration.version > self.current_version: 35 | migration.migrate() 36 | self.current_version = migration.version 37 | 38 | func set_latest_migration(): 39 | for migration in self.migrations: 40 | if migration.version > self.current_version: 41 | self.current_version = migration.version 42 | -------------------------------------------------------------------------------- /scripts/migrations/version20150730.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/migrations/abstract_version.gd" 2 | 3 | var file_handler = File.new() 4 | var list_file_path = "user://maps_list.tof" 5 | 6 | func _init(bag).(bag): 7 | self.version = 20150730 8 | 9 | var mapping = [ 10 | [1, 0], 11 | [2, 1], 12 | [3, 2], 13 | [17, 3], 14 | [4, 4], 15 | [14, 5], 16 | [15, 6], 17 | [18, 8], 18 | [12, 9], 19 | [5, 10], 20 | [6, 11], 21 | [7, 12], 22 | [8, 13], 23 | [9, 14], 24 | [10, 15], 25 | [11, 16], 26 | [13, 17], 27 | ] 28 | 29 | func migrate(): 30 | for map in self.bag.map_list.maps: 31 | self.update_map(map) 32 | self.update_map('restore_map') 33 | 34 | func update_map(name): 35 | var map_data 36 | if not self.file_handler.file_exists("user://" + name + ".tof"): 37 | return 38 | 39 | self.file_handler.open("user://" + name + ".tof", File.READ) 40 | map_data = self.file_handler.get_var() 41 | self.file_handler.close() 42 | map_data = self.update_data_array(map_data) 43 | self.file_handler.open("user://" + name + ".map", File.WRITE) 44 | self.file_handler.store_var(map_data) 45 | self.file_handler.close() 46 | 47 | func update_data_array(data): 48 | var temp_data = [] 49 | var new_cell 50 | for cell in data: 51 | for map in self.mapping: 52 | if map[0] == cell.terrain: 53 | new_cell = map[1] 54 | temp_data.append({ 55 | x=cell.x, 56 | y=cell.y, 57 | terrain=new_cell, 58 | unit=cell.unit 59 | }) 60 | return temp_data 61 | -------------------------------------------------------------------------------- /scripts/migrations/version20160506.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/migrations/abstract_version.gd" 2 | 3 | var file_handler = File.new() 4 | var list_file_path = "user://maps_list.tof" 5 | var maps_list 6 | 7 | func _init(bag).(bag): 8 | self.version = 20160506 9 | 10 | func migrate(): 11 | var keys 12 | 13 | self.maps_list = self.load_map_list() 14 | keys = self.maps_list.keys() 15 | for map in keys: 16 | self.update_map(map) 17 | self.save_map_list() 18 | 19 | func load_map_list(): 20 | return self.bag.file_handler.read(self.list_file_path) 21 | 22 | func save_map_list(): 23 | self.bag.file_handler.write(self.list_file_path, self.maps_list) 24 | 25 | func update_map(name): 26 | self.maps_list[name] = { 27 | 'name' : name, 28 | 'completed' : false 29 | } 30 | -------------------------------------------------------------------------------- /scripts/migrations/version20160512.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/migrations/abstract_version.gd" 2 | 3 | var file_handler = File.new() 4 | var list_file_path = "user://maps_list.tof" 5 | 6 | func _init(bag).(bag): 7 | self.version = 20160512 8 | 9 | func migrate(): 10 | self.file_handler.open(self.list_file_path, File.READ) 11 | var map_list = self.file_handler.get_var() 12 | self.file_handler.close() 13 | for map in map_list: 14 | self.update_map(map) 15 | self.update_map('restore_map') 16 | 17 | func update_map(name): 18 | var map_data 19 | if not self.file_handler.file_exists("user://" + name + ".map"): 20 | return 21 | 22 | self.file_handler.open("user://" + name + ".map", File.READ) 23 | map_data = self.file_handler.get_var() 24 | self.file_handler.close() 25 | map_data = self.update_data_array(map_data) 26 | self.file_handler.open("user://" + name + ".map", File.WRITE) 27 | self.file_handler.store_var(map_data) 28 | self.file_handler.close() 29 | 30 | func update_data_array(data): 31 | return { 32 | 'tiles' : data 33 | } 34 | -------------------------------------------------------------------------------- /scripts/movement_controller.gd: -------------------------------------------------------------------------------- 1 | var tile_types = StringArray([ 2 | 'plain','plain','plain','plain','plain','plain','plain','plain', 3 | 'plain','plain','plain','plain','plain','road','road','road', 4 | 'road','river','road', 5 | 'road','road','road','road','road','road','road','road', 6 | 'road','road','road','road','road','road','road','road', 7 | 'road','road','road','road','road','road','road','road', 8 | 'road','road','road','road', 9 | 'river','river','river','river','river','river','river','river' 10 | ]) 11 | 12 | const DEFAULT_COST = 1 13 | 14 | func move_object(from, to, action_cost=DEFAULT_COST): 15 | 16 | if self.has_enough_ap(from, action_cost): 17 | from.object.update_ap(from.object.ap - action_cost) 18 | 19 | to.object = from.object 20 | from.object = null 21 | to.object.set_pos_map(to.position) 22 | return true 23 | else: 24 | return false 25 | 26 | func has_enough_ap(from, cost): 27 | if from.object.ap >= cost: 28 | return true 29 | else: 30 | return false 31 | 32 | func can_move(from, to): 33 | if from.object.ap >= self.DEFAULT_COST: 34 | return true 35 | else: 36 | return false -------------------------------------------------------------------------------- /scripts/object_factory.gd: -------------------------------------------------------------------------------- 1 | 2 | var red_tank_template = preload('res://units/tank_red.xscn') 3 | var blue_tank_template = preload('res://units/tank_blue.xscn') 4 | var red_soldier_template = preload('res://units/soldier_red.xscn') 5 | var blue_soldier_template = preload('res://units/soldier_blue.xscn') 6 | var red_helicopter_template = preload('res://units/helicopter_red.xscn') 7 | var blue_helicopter_template = preload('res://units/helicopter_blue.xscn') 8 | 9 | var player_blue = 0 10 | var player_red = 1 11 | 12 | func build_unit(type, player): 13 | if type == 0: 14 | return self.build_soldier(player) 15 | if type == 1: 16 | return self.build_tank(player) 17 | if type == 2: 18 | return self.build_helicopter(player) 19 | return null 20 | 21 | func build_tank(player): 22 | if (player == player_blue): 23 | return blue_tank_template.instance() 24 | if (player == player_red): 25 | return red_tank_template.instance() 26 | 27 | func build_soldier(player): 28 | if (player == player_blue): 29 | return blue_soldier_template.instance() 30 | if (player == player_red): 31 | return red_soldier_template.instance() 32 | 33 | func build_helicopter(player): 34 | if (player == player_blue): 35 | return blue_helicopter_template.instance() 36 | if (player == player_red): 37 | return red_helicopter_template.instance() 38 | -------------------------------------------------------------------------------- /scripts/objects/units/helicopter.gd: -------------------------------------------------------------------------------- 1 | extends "unit.gd" 2 | 3 | func _init(): 4 | type = 2 5 | type_name = 'heli' 6 | type_name_label = 'LABEL_WORKSHOP_HELI' 7 | 8 | life = 10 9 | max_life = 10 10 | attack = 8 11 | max_ap = 8 12 | limited_ap = 6 13 | attack_ap = 1 14 | max_attacks_number = 1 15 | ap = 8 16 | attacks_number = 1 17 | visibility = 5 18 | 19 | func can_capture_building(building): 20 | return false 21 | 22 | -------------------------------------------------------------------------------- /scripts/objects/units/randomizing_animation_for_civilians.gd: -------------------------------------------------------------------------------- 1 | func _ready(): 2 | randomize() 3 | get_node("anim").seek(randf()) 4 | if randf() < 0.5: 5 | self.set_flip_h(true) 6 | 7 | get_node("anim").set_speed(rand_range(0.5, 1.5)) -------------------------------------------------------------------------------- /scripts/objects/units/soldier.gd: -------------------------------------------------------------------------------- 1 | extends "unit.gd" 2 | 3 | func _init(): 4 | type = 0 5 | type_name = 'soldier' 6 | type_name_label = 'LABEL_WORKSHOP_INFANTRY' 7 | 8 | life = 10 9 | max_life = 10 10 | attack = 5 11 | max_ap = 4 12 | limited_ap = 3 13 | attack_ap = 1 14 | max_attacks_number = 1 15 | ap = 4 16 | attacks_number = 1 17 | visibility = 3 18 | 19 | func can_capture_building(building): 20 | if building.player == player: 21 | return false 22 | 23 | return true; 24 | 25 | -------------------------------------------------------------------------------- /scripts/objects/units/tank.gd: -------------------------------------------------------------------------------- 1 | extends "unit.gd" 2 | 3 | func _init(): 4 | type = 1 5 | type_name = 'tank' 6 | type_name_label = 'LABEL_WORKSHOP_TANK' 7 | 8 | life = 15 9 | max_life = 15 10 | attack = 10 11 | max_ap = 6 12 | limited_ap = 4 13 | attack_ap = 1 14 | max_attacks_number = 1 15 | ap = 6 16 | attacks_number = 1 17 | visibility = 4 18 | 19 | func can_capture_building(building): 20 | return false 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /scripts/objects/waypoints/waypoint.gd: -------------------------------------------------------------------------------- 1 | extends Sprite 2 | 3 | export var position_on_map = Vector2(0,0) 4 | var group = 'waypoint' 5 | var type = 10 6 | var subtype = null 7 | var for_unit_type = [0, 1, 2] 8 | var for_player = [0, 1] 9 | var is_active = true 10 | var point_of_interest = null # building or smth 11 | 12 | const TYPE_LEVEL_1 = 1 13 | const TYPE_LEVEL_2 = 2 14 | const TYPE_LEVEL_3 = 3 15 | const TYPE_BULDING_AREA = 10 16 | const TYPE_SPAWN_POINT = 11 17 | 18 | func _init(pos, subtype=self.TYPE_LEVEL_1): 19 | self.position_on_map = pos 20 | self.subtype = subtype 21 | 22 | func get_pos_map(): 23 | return position_on_map 24 | 25 | func applicable_for_player(player): 26 | for value in self.for_player: 27 | if value == player: 28 | return true 29 | return false 30 | 31 | func applicable_for_unit_type(unit_type): 32 | for value in self.for_unit_type: 33 | if value == unit_type: 34 | return true 35 | return false 36 | 37 | func update_status(): #TODO needs better name 38 | if self.point_of_interest != null: 39 | if self.point_of_interest.player == -1: 40 | self.for_player = [0, 1] 41 | else: 42 | self.for_player = [(self.point_of_interest.player +1 ) % 2] 43 | 44 | self.for_unit_type = [0, 1, 2] 45 | 46 | func mark_blocked(): 47 | self.for_unit_type = [0] 48 | 49 | func get_value(): 50 | return self.subtype # TODO needs refactor 51 | 52 | func _ready(): 53 | add_to_group("waypoint") 54 | -------------------------------------------------------------------------------- /scripts/objects/waypoints/waypoint_factory.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var waypoint = preload('waypoint.gd') 4 | 5 | func create(position, subtype=waypoint.TYPE_LEVEL_1): 6 | return self.waypoint.new(position, subtype) 7 | 8 | func create_for_building(building, all_neighbours=true): 9 | var spawn_point = building.spawn_point 10 | var building_owner = building.player 11 | 12 | var nearby_tiles = self.bag.positions.get_nearby_tiles(building.position_on_map, 1) 13 | var waypoints = [] 14 | var waypoint_obj 15 | 16 | for tile in nearby_tiles: 17 | var field = self.bag.abstract_map.get_field(tile) 18 | if field.is_passable(): 19 | if tile == spawn_point: 20 | waypoint_obj = self.waypoint.new(tile, self.waypoint.TYPE_SPAWN_POINT) 21 | elif(all_neighbours): 22 | waypoint_obj = self.waypoint.new(tile, self.waypoint.TYPE_BULDING_AREA) 23 | 24 | field.waypoint = waypoint_obj 25 | 26 | waypoint_obj.point_of_interest = building 27 | waypoint_obj.update_status() 28 | 29 | waypoints.append(waypoint_obj) 30 | self.bag.abstract_map.tilemap.get_node("back").add_child(waypoint_obj) 31 | 32 | return waypoints 33 | 34 | func prepare_for_map(): 35 | for building in self.bag.positions.buildings: 36 | self.create_for_building(building) 37 | 38 | func update_waypoints(): 39 | for waypoint in self.bag.positions.waypoints.values(): 40 | waypoint.update_status() 41 | 42 | func mark_building_as_blocked(building): 43 | var nearby_tiles = self.bag.positions.get_nearby_tiles(building.position_on_map, 1) 44 | for tile in nearby_tiles: 45 | var field = self.bag.abstract_map.get_field(tile) 46 | if field.has_waypoint(): 47 | field.waypoint.mark_blocked() 48 | 49 | 50 | -------------------------------------------------------------------------------- /scripts/online/player.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var player_id = null 4 | var player_pin = null 5 | 6 | var REGISTER_URL = "/players" 7 | 8 | func _initialize(): 9 | self.player_id = self.bag.root.settings['online_player_id'] 10 | self.player_pin = self.bag.root.settings['online_player_pin'] 11 | 12 | func request_player_id(): 13 | if not self.bag.online_request.enabled or self.player_id != null: 14 | return 15 | 16 | var response = self.bag.online_request.post(self.bag.online_request.api_location, self.REGISTER_URL) 17 | 18 | if response['status'] != 'ok': 19 | return 20 | 21 | self.player_id = response['data']['id'] 22 | self.player_pin = response['data']['pin'] 23 | self.bag.root.settings['online_player_id'] = self.player_id 24 | self.bag.root.settings['online_player_pin'] = self.player_pin 25 | self.bag.root.write_settings_to_file() 26 | 27 | func request_player_id_async(): 28 | if not self.bag.online_request.enabled or self.player_id != null: 29 | return 30 | 31 | var callbacks = { 32 | "handle_200" : "_request_player_id_response", 33 | "handle_error" : "_request_player_id_response" 34 | } 35 | self.bag.online_request_async.post(self.bag.online_request.api_location, self.REGISTER_URL, "", self, callbacks) 36 | 37 | func _request_player_id_response(response): 38 | if response['status'] == 'ok': 39 | self.player_id = response['data']['id'] 40 | self.player_pin = response['data']['pin'] 41 | self.bag.root.settings['online_player_id'] = self.player_id 42 | self.bag.root.settings['online_player_pin'] = self.player_pin 43 | self.bag.root.write_settings_to_file() 44 | 45 | self.bag.controllers.online_menu_controller.online_register_done() 46 | 47 | func get_player_id(): 48 | if not self.bag.online_request.enabled: 49 | return null 50 | 51 | return self.player_id 52 | 53 | func get_basic_auth_json(): 54 | return { 55 | 'player_id' : self.player_id, 56 | 'player_pin' : self.player_pin 57 | } 58 | -------------------------------------------------------------------------------- /scripts/pandora_input.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var accumulated_time = 0 4 | 5 | var painting = false 6 | var erasing = false 7 | 8 | func handle_input(event): 9 | self.handle_button(event) 10 | 11 | func handle_button(event): 12 | if self.bag.workshop.is_working: 13 | if Input.is_action_pressed('gamepad_build'): 14 | if event.pressed: 15 | self.bag.root.sound_controller.play('menu') 16 | self.bag.workshop.paint(self.bag.workshop.selector_position) 17 | self.painting = event.pressed 18 | if Input.is_action_pressed('gamepad_end'): 19 | if event.pressed: 20 | self.bag.root.sound_controller.play('menu') 21 | self.bag.workshop.paint(self.bag.workshop.selector_position, 'terrain', -1) 22 | self.erasing = event.pressed 23 | else: 24 | if Input.is_action_pressed('gamepad_end') and event.pressed and not self.bag.root.hud_controller.hud_message_card_visible: 25 | self.bag.root.sound_controller.play('menu') 26 | self.bag.root.action_controller.end_turn() 27 | if Input.is_action_pressed('gamepad_build') and event.pressed: 28 | self.bag.root.sound_controller.play('menu') 29 | self.bag.root.action_controller.spawn_unit_from_active_building() 30 | if Input.is_action_pressed('gamepad_prev') and event.pressed: 31 | self.bag.root.action_controller.switch_unit(self.bag.unit_switcher.BACK) 32 | if Input.is_action_pressed('gamepad_next') and event.pressed: 33 | self.bag.root.action_controller.switch_unit(self.bag.unit_switcher.NEXT) -------------------------------------------------------------------------------- /scripts/player_move.gd: -------------------------------------------------------------------------------- 1 | 2 | extends Sprite 3 | 4 | var position = self.get_pos() 5 | var move_vector = Vector2(32,16) 6 | 7 | func _input(event): 8 | if (Input.is_action_pressed('player1_up')): 9 | position -= Vector2(move_vector.x/2,move_vector.y/2) 10 | 11 | if (Input.is_action_pressed('player1_down')): 12 | position += Vector2(move_vector.x/2,move_vector.y/2) 13 | 14 | if (Input.is_action_pressed('player1_left')): 15 | position += Vector2(-move_vector.x/2,move_vector.y/2) 16 | 17 | if (Input.is_action_pressed('player1_right')): 18 | position += Vector2(move_vector.x/2,-move_vector.y/2) 19 | 20 | self.set_pos(position) 21 | 22 | #print ( 'selector pos: ',self.get_parent().get_parent().world_to_map(position) ) 23 | #print(get_path()) 24 | 25 | func _ready(): 26 | #set_process_input(true) 27 | pass 28 | 29 | 30 | -------------------------------------------------------------------------------- /scripts/popups/big_message.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var popup = preload("res://gui/popups/big_message.tscn").instance() 4 | 5 | var hud_title 6 | var hud_message 7 | var confirm_button 8 | 9 | 10 | var bound_object 11 | var bound_method 12 | 13 | var current_container 14 | 15 | func _initialize(): 16 | self.bind_hud() 17 | self.connect_buttons() 18 | 19 | func _confirm_button_pressed(): 20 | self.bag.root.sound_controller.play('menu') 21 | self.call_bound_object() 22 | 23 | func bind_hud(): 24 | self.hud_title = self.popup.get_node("controls/title") 25 | self.hud_message = self.popup.get_node("controls/message") 26 | self.confirm_button = self.popup.get_node("controls/buttons/back") 27 | 28 | 29 | func attach_panel(container_node): 30 | if self.current_container != null: 31 | self.detach_panel() 32 | self.current_container = container_node 33 | self.current_container.add_child(self.popup) 34 | 35 | func detach_panel(): 36 | if self.current_container != null: 37 | self.current_container.remove_child(self.popup) 38 | self.current_container = null 39 | self.disconnect() 40 | self.show_button() 41 | 42 | func connect_buttons(): 43 | self.confirm_button.connect("pressed", self, "_confirm_button_pressed") 44 | 45 | func disconnect(): 46 | self.bound_object = null 47 | self.bound_method = null 48 | 49 | func fill_labels(title, messages, confirm): 50 | var combined_message = "" 51 | 52 | for message in messages: 53 | combined_message = combined_message + message + "\n\n"; 54 | 55 | self.hud_message.set_text(combined_message) 56 | 57 | self.hud_title.set_text(title) 58 | 59 | func connect(bound_object, bound_method): 60 | self.bound_object = bound_object 61 | self.bound_method = bound_method 62 | 63 | func call_bound_object(): 64 | if self.bound_object != null: 65 | self.bound_object.call(self.bound_method) 66 | 67 | func show_button(): 68 | self.confirm_button.show() 69 | func hide_button(): 70 | self.confirm_button.hide() 71 | -------------------------------------------------------------------------------- /scripts/popups/confirm.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var popup = preload("res://gui/popups/confirm.tscn").instance() 4 | 5 | var hud_title 6 | var hud_message 7 | var confirm_button 8 | var confirm_button_label 9 | var cancel_button 10 | var cancel_button_label 11 | 12 | var bound_object 13 | var bound_method 14 | 15 | var current_container 16 | 17 | func _initialize(): 18 | self.bind_hud() 19 | self.connect_buttons() 20 | 21 | func _confirm_button_pressed(): 22 | self.bag.root.sound_controller.play('menu') 23 | self.call_bound_object(true) 24 | 25 | func _cancel_button_pressed(): 26 | self.bag.root.sound_controller.play('menu') 27 | self.call_bound_object(false) 28 | 29 | func bind_hud(): 30 | self.hud_title = self.popup.get_node("title") 31 | self.hud_message = self.popup.get_node("message") 32 | self.confirm_button = self.popup.get_node("confirm") 33 | self.confirm_button_label = self.confirm_button.get_node("Label") 34 | self.cancel_button = self.popup.get_node("cancel") 35 | self.cancel_button_label = self.cancel_button.get_node("Label") 36 | 37 | func attach_panel(container_node): 38 | if self.current_container != null: 39 | self.detach_panel() 40 | self.current_container = container_node 41 | self.current_container.add_child(self.popup) 42 | 43 | func detach_panel(): 44 | if self.current_container != null: 45 | self.current_container.remove_child(self.popup) 46 | self.current_container = null 47 | self.disconnect() 48 | 49 | func connect_buttons(): 50 | self.confirm_button.connect("pressed", self, "_confirm_button_pressed") 51 | self.cancel_button.connect("pressed", self, "_cancel_button_pressed") 52 | 53 | func disconnect(): 54 | self.bound_object = null 55 | self.bound_method = null 56 | 57 | func fill_labels(title, message, confirm, cancel): 58 | self.hud_title.set_text(title) 59 | self.hud_message.set_text(message) 60 | self.confirm_button_label.set_text(confirm) 61 | self.cancel_button_label.set_text(cancel) 62 | 63 | func connect(bound_object, bound_method): 64 | self.bound_object = bound_object 65 | self.bound_method = bound_method 66 | 67 | func call_bound_object(confirmation): 68 | if self.bound_object != null: 69 | self.bound_object.call(self.bound_method, confirmation) 70 | -------------------------------------------------------------------------------- /scripts/popups/gamepad_info.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var popup = preload("res://gui/gamepad.tscn").instance() 4 | 5 | var close_button 6 | 7 | func _initialize(): 8 | self.bind() 9 | 10 | func bind(): 11 | self.close_button = self.popup.get_node('center/close') 12 | self.close_button.connect('pressed', self, '_close_button_pressed') 13 | 14 | func _close_button_pressed(): 15 | self.bag.root.sound_controller.play('menu') 16 | self.hide() 17 | 18 | func show(): 19 | self.bag.root.menu.add_child(popup) 20 | self.bag.root.menu.hide_control_nodes() 21 | self.bag.timers.set_timeout(0.1, self.close_button, "grab_focus") 22 | 23 | func hide(): 24 | self.bag.root.menu.remove_child(popup) 25 | self.bag.root.menu.show_control_nodes() 26 | if self.bag.root.menu.get_settings_visibility(): 27 | self.bag.timers.set_timeout(0.1, self.bag.root.menu.settings_nav_pad, "grab_focus") 28 | else: 29 | self.bag.timers.set_timeout(0.1, self.bag.root.menu.campaign_button, "grab_focus") 30 | -------------------------------------------------------------------------------- /scripts/popups/message.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var popup = preload("res://gui/popups/message.tscn").instance() 4 | 5 | var hud_title 6 | var hud_message 7 | var hud_important 8 | var confirm_button 9 | var confirm_button_label 10 | 11 | var bound_object 12 | var bound_method 13 | 14 | var current_container 15 | 16 | func _initialize(): 17 | self.bind_hud() 18 | self.connect_buttons() 19 | self.fill_important("") 20 | 21 | func _confirm_button_pressed(): 22 | self.bag.root.sound_controller.play('menu') 23 | self.call_bound_object() 24 | 25 | func bind_hud(): 26 | self.hud_title = self.popup.get_node("title") 27 | self.hud_message = self.popup.get_node("message") 28 | self.hud_important = self.popup.get_node("important") 29 | self.confirm_button = self.popup.get_node("confirm") 30 | self.confirm_button_label = self.confirm_button.get_node("Label") 31 | 32 | func attach_panel(container_node): 33 | if self.current_container != null: 34 | self.detach_panel() 35 | self.current_container = container_node 36 | self.current_container.add_child(self.popup) 37 | 38 | func detach_panel(): 39 | if self.current_container != null: 40 | self.current_container.remove_child(self.popup) 41 | self.current_container = null 42 | self.disconnect() 43 | self.show_button() 44 | self.fill_important("") 45 | 46 | func connect_buttons(): 47 | self.confirm_button.connect("pressed", self, "_confirm_button_pressed") 48 | 49 | func disconnect(): 50 | self.bound_object = null 51 | self.bound_method = null 52 | 53 | func fill_labels(title, message, confirm): 54 | self.hud_title.set_text(title) 55 | self.hud_message.set_text(message) 56 | self.confirm_button_label.set_text(confirm) 57 | 58 | func fill_important(text): 59 | self.hud_important.set_text(text) 60 | 61 | func connect(bound_object, bound_method): 62 | self.bound_object = bound_object 63 | self.bound_method = bound_method 64 | 65 | func call_bound_object(): 66 | if self.bound_object != null: 67 | self.bound_object.call(self.bound_method) 68 | 69 | func show_button(): 70 | self.confirm_button.show() 71 | func hide_button(): 72 | self.confirm_button.hide() 73 | -------------------------------------------------------------------------------- /scripts/processing.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var wrapper_template = preload("res://scripts/processing_wrapper.gd") 4 | 5 | var ready = false 6 | 7 | var objects = {} 8 | 9 | func _initialize(): 10 | self.ready = true 11 | 12 | func register(object): 13 | var wrapper = self.wrapper_template.new(self, object) 14 | self.objects[object.get_instance_ID()] = wrapper 15 | self.bag.root.add_child(wrapper) 16 | 17 | func remove(object): 18 | var wrapper = self.objects[object.get_instance_ID()] 19 | wrapper.kill() 20 | self.bag.root.remove_child(wrapper) 21 | self.objects.erase(wrapper) 22 | 23 | func reset(): 24 | for object in self.objects.values(): 25 | self.remove(object) 26 | -------------------------------------------------------------------------------- /scripts/processing_wrapper.gd: -------------------------------------------------------------------------------- 1 | 2 | extends Control 3 | 4 | var processing 5 | 6 | var handler 7 | var working = true 8 | 9 | func _init(processing, handler): 10 | self.processing = processing 11 | self.handler = handler 12 | self.set_fixed_process(true) 13 | 14 | func kill(): 15 | self.working = false 16 | self.processing = null 17 | self.handler = null 18 | self.queue_free() 19 | 20 | func _fixed_process(delta): 21 | if not self.working || not self.processing.ready: 22 | return 23 | 24 | self.handler.process(delta) 25 | -------------------------------------------------------------------------------- /scripts/selector.gd: -------------------------------------------------------------------------------- 1 | extends Sprite 2 | 3 | var anim 4 | var current_cost = 0 5 | 6 | var root 7 | var action_controller = null 8 | var movement_controller = null 9 | 10 | func init(root_node): 11 | self.root = root_node 12 | self.action_controller = self.root.action_controller 13 | self.movement_controller = self.root.bag.movement_controller 14 | 15 | func reset(): 16 | action_controller = null 17 | movement_controller = null 18 | 19 | func set_player(player): 20 | if player == 0: 21 | anim.play("blue") 22 | if player == 1: 23 | anim.play("red") 24 | 25 | func set_neutral(): 26 | anim.play("neutral") 27 | 28 | func calculate_cost(): 29 | current_cost = 0 30 | 31 | if action_controller == null || movement_controller == null: 32 | return # not initiated 33 | 34 | var active_field = action_controller.active_field 35 | var marked_field = root.bag.abstract_map.get_field(action_controller.root_node.selector_position) 36 | 37 | if action_controller.player_ap[action_controller.current_player] < 1: 38 | return # no ap left 39 | 40 | if active_field == null || active_field.object == null || !active_field.has_unit(): 41 | return # empty active field 42 | if marked_field == null || marked_field.is_empty(): 43 | return # tile is not part of the map 44 | 45 | var unit = active_field.object 46 | var target = marked_field.object 47 | 48 | if target != null: 49 | if target.group == 'terrain': 50 | return # impassible terrain 51 | if target.player == unit.player: 52 | return # own building 53 | 54 | if target.group == 'unit' && unit.can_attack(): 55 | current_cost = unit.attack_ap 56 | if target.group == 'building': 57 | current_cost = movement_controller.DEFAULT_COST 58 | else: 59 | current_cost = movement_controller.DEFAULT_COST 60 | 61 | 62 | func _ready(): 63 | anim = self.get_node("anim") 64 | anim.play("neutral") 65 | pass 66 | 67 | 68 | -------------------------------------------------------------------------------- /scripts/services/file_handler.gd: -------------------------------------------------------------------------------- 1 | var file = File.new() 2 | 3 | func read(path): 4 | self.__create_file_if_no_exists(path) 5 | file.open(path, File.READ) 6 | var data = file.get_var() 7 | file.close() 8 | 9 | return data 10 | 11 | func write(path, data): 12 | file.open(path, File.WRITE) 13 | file.store_var(data) 14 | file.close() 15 | 16 | func __create_file_if_no_exists(path): 17 | if !file.file_exists(path): 18 | self.write(path, {'is_ok' : 1}) 19 | return false 20 | 21 | return true 22 | 23 | func file_exists(path): 24 | return self.file.file_exists(path) -------------------------------------------------------------------------------- /scripts/services/helpers.gd: -------------------------------------------------------------------------------- 1 | func array_diff(array_one, array_two): 2 | var values = [] 3 | for val in array_one: 4 | if array_two.find(val) == -1: 5 | values.append(val) 6 | 7 | return values 8 | 9 | func comp_days(date1, date2): 10 | return self.comp_dates(date1, date2, ['month', 'day']) 11 | 12 | func comp_dates(date1, date2, params=['year', 'month', 'day']): 13 | var result = 0 14 | 15 | for param in params: 16 | result = comp(date1[param], date2[param]) 17 | if result != 0: 18 | return result 19 | 20 | func comp(a, b): 21 | return clamp(a - b , -1, 1) 22 | 23 | func array_last_element(array): 24 | var size = array.size() 25 | if size == 0: 26 | return null 27 | 28 | return array[size - 1] 29 | 30 | func is_adjacent(start, end): 31 | var diff_x = abs(start.x - end.x) 32 | var diff_y = abs(start.y - end.y) 33 | 34 | return (diff_x + diff_y) == 1 35 | -------------------------------------------------------------------------------- /scripts/services/logger.gd: -------------------------------------------------------------------------------- 1 | const PATH = 'res://logs/log.txt' 2 | 3 | var file = File.new() 4 | 5 | func _init(): 6 | self.__create_file_if_no_exists() 7 | 8 | func store(data): 9 | file.open(self.PATH, File.READ_WRITE) 10 | file.seek_end(0) 11 | var date = OS.get_datetime() 12 | var date_str = "[%02d-%02d-%02d %02d:%02d:%02d] " % [date['day'], date['month'], date['year'], date['hour'], date['minute'], date['second']] 13 | file.store_line(date_str + data) 14 | file.close() 15 | 16 | func file_exists(path): 17 | return self.file.file_exists(path) 18 | 19 | func __create_file_if_no_exists(): 20 | if !file.file_exists(self.PATH): 21 | file.open(self.PATH, File.WRITE) 22 | file.close() -------------------------------------------------------------------------------- /scripts/services/map_file_handler.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/services/file_handler.gd" 2 | 3 | var data = {} 4 | 5 | const DEFAULT_THEME = 'summer' 6 | 7 | func __get_file_path(file_name, is_remote): 8 | if is_remote: 9 | return "user://" + file_name + ".remote" 10 | else: 11 | return "user://" + file_name + ".map" 12 | 13 | func load_data_from_file(file_name, is_remote=false): 14 | var file_path = self.__get_file_path(file_name, is_remote) 15 | 16 | if self.file.file_exists(file_path): 17 | self.file.open(file_path, File.READ) 18 | self.data = file.get_var() 19 | print('ToF: map ' + file_path + ' loaded from file') 20 | file.close() 21 | return true 22 | else: 23 | print('ToF: map file ' + file_path + ' not exists!') 24 | return false 25 | 26 | func write_as_plain_file(path, data): 27 | file.open(path, File.WRITE) 28 | file.store_line("var map_data = [") 29 | var cell_line 30 | var cell 31 | for cell in data['tiles']: 32 | cell_line = "'x': " + str(cell.x) + ", " 33 | cell_line += "'y': " + str(cell.y) + ", " 34 | cell_line += "'terrain': " + str(cell.terrain) + ", " 35 | cell_line += "'unit': " + str(cell.unit) 36 | file.store_line(" {" + cell_line + "},") 37 | file.store_line("]") 38 | file.close() 39 | 40 | func get_theme(): 41 | if self.data.has('theme') && self.data['theme'] != null: 42 | return self.data['theme'] 43 | 44 | return self.DEFAULT_THEME 45 | 46 | func get_tiles(): 47 | return self.data['tiles'] 48 | 49 | -------------------------------------------------------------------------------- /scripts/services/script_player.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | func execute(): 4 | print('executing script') 5 | self.click(Vector2(14,20), 0.5) 6 | self.click(Vector2(13,20), 0.5) 7 | self.move_camera(Vector2(1,1), 2) 8 | 9 | 10 | func click(position, delay): 11 | self.bag.timers.set_timeout(delay, self, "__click", [position]) 12 | 13 | func move_camera(position, delay): 14 | self.bag.timers.set_timeout(delay, self, "__move_camera", [position]) 15 | 16 | func __click(args): 17 | self.bag.controllers.action_controller.handle_action(args[0]) 18 | 19 | func __move_camera(args): 20 | self.bag.controllers.action_controller.move_camera_to_point(args[0]) -------------------------------------------------------------------------------- /scripts/services/tips.gd: -------------------------------------------------------------------------------- 1 | const TIP_PREFIX = 'TIP_' 2 | const TIP_COUNT = 13 3 | 4 | var tip_counter 5 | 6 | func _init(): 7 | self.tip_counter = int(1) 8 | 9 | func next_tip(): 10 | self.tip_counter = self.tip_counter % self.TIP_COUNT + 1 11 | return tr(self.TIP_PREFIX + str(self.tip_counter)) 12 | 13 | func header(): 14 | return tr(self.TIP_PREFIX + 'HEADER') 15 | -------------------------------------------------------------------------------- /scripts/services/workshop_dead_zone.gd: -------------------------------------------------------------------------------- 1 | 2 | var root 3 | var ready = false 4 | var screen_size 5 | 6 | var file_panel_size = Vector2(640, 230) 7 | var file_panel_top_offset = 108 8 | var bottom_panel_size = Vector2(640, 70) 9 | var pick_button_size = Vector2(135, 130) 10 | var pick_button_offset = 240 11 | 12 | func init_root(root_node): 13 | self.root = root_node 14 | self.screen_size = Vector2(1280, 720) 15 | self.ready = true 16 | 17 | 18 | func is_dead_zone(x, y): 19 | if not self.ready: 20 | return false 21 | 22 | if self.check_if_in_zone(x, y, self.root.bag.controllers.workshop_gui_controller.file_panel.position.y - self.file_panel_top_offset, self.file_panel_size): 23 | return true 24 | 25 | if self.check_if_in_zone(x, y, self.screen_size.y - self.bottom_panel_size.y, self.bottom_panel_size): 26 | return true 27 | 28 | if self.check_if_in_zone(x, y, self.screen_size.y - self.pick_button_size.y, self.pick_button_size, self.pick_button_offset): 29 | return true 30 | 31 | if self.root.bag.controllers.workshop_gui_controller.toolbox_panel.toolbox_panel.is_visible(): 32 | return true 33 | 34 | if self.root.bag.controllers.workshop_gui_controller.building_blocks_panel.building_block_panel.is_visible(): 35 | return true 36 | 37 | if self.root.bag.controllers.workshop_gui_controller.file_panel.is_map_picker_visible(): 38 | return true 39 | 40 | if self.root.bag.controllers.workshop_gui_controller.file_panel.is_game_setup_visible(): 41 | return true 42 | 43 | return false 44 | 45 | 46 | func check_if_in_zone(x, y, top_offset, box, side_offset=null): 47 | var middle = self.screen_size.x / 2; 48 | var left_edge = middle - box.x / 2; 49 | var right_edge = middle + box.x / 2; 50 | if side_offset != null: 51 | left_edge = left_edge + side_offset 52 | right_edge = right_edge + side_offset 53 | var top_edge = top_offset 54 | var bottom_edge = top_offset + box.y 55 | if x > left_edge && x < right_edge && y > top_edge && y < bottom_edge: 56 | return true 57 | return false 58 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/abstract_action.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | func perform(action_details): 4 | return 5 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/attack.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | func perform(action_details): 4 | var attacker_field = self.bag.abstract_map.get_field(action_details['who']) 5 | var victim_field = self.bag.abstract_map.get_field(action_details['whom']) 6 | 7 | victim_field.object.show_explosion() 8 | 9 | self.bag.root.sound_controller.play_unit_sound(attacker_field.object, 'attack') 10 | self.bag.root.sound_controller.play_unit_sound(victim_field.object, 'damage') 11 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/camera.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | func perform(action_details): 4 | if action_details.has('speed'): 5 | self.bag.camera.camera_speed = action_details['speed'] 6 | else: 7 | self.bag.camera.update_camera_speed() 8 | if action_details.has('zoom'): 9 | self.bag.camera.set_zoom_value(action_details['zoom']) 10 | self.bag.camera.move_to_map(action_details['where'], true) 11 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/claim.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | func perform(action_details): 4 | var source_field = self.bag.abstract_map.get_field(action_details['what']) 5 | source_field.object.claim(action_details['side'], 0) 6 | self.bag.root.sound_controller.play('occupy_building') 7 | 8 | self.bag.positions.refresh_buildings() -------------------------------------------------------------------------------- /scripts/storyteller/actions/despawn.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | func perform(action_details): 4 | var field = self.bag.abstract_map.get_field(action_details['who']) 5 | 6 | if field.object == null: 7 | return 8 | 9 | field.object.queue_free() 10 | field.object = null 11 | 12 | self.bag.positions.refresh_units() 13 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/die.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | func perform(action_details): 4 | var field = self.bag.abstract_map.get_field(action_details['who']) 5 | 6 | if field.object == null: 7 | return 8 | 9 | field.object.die_after_explosion(null) 10 | self.bag.root.sound_controller.play_unit_sound(field.object, 'die') 11 | field.object = null 12 | self.bag.root.action_controller.collateral_damage(action_details['who']) 13 | 14 | self.bag.positions.refresh_units() 15 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/lock_hud.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | func perform(action_details): 4 | if not self.bag.root.is_locked_for_cpu: 5 | self.save_camera_zoom() 6 | self.bag.root.is_locked_for_cpu = true 7 | self.bag.root.hud_controller.lock_hud() 8 | self.bag.root.hud_controller.hud_panel_anchor_top_right.hide() 9 | self.bag.root.hud.get_node("top_center").hide() 10 | self.bag.root.hud_controller.show_cinematic_camera() 11 | self.bag.root.selector.hide() 12 | self.bag.root.hud_controller.cinematic_camera.get_node("bottom/progress").hide() 13 | self.bag.perform.pause = true 14 | self.bag.fog_controller.toggle_fog() 15 | 16 | func save_camera_zoom(): 17 | self.bag.storyteller.camera_zoom_level = self.bag.root.settings['camera_zoom'] 18 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/message.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | 4 | var avatar_portraits = { 5 | 'soldier_blue' : 0, 6 | 'soldier_red' : 1, 7 | 'officer_blue' : 2, 8 | 'officer_red' : 3, 9 | 'tank_blue' : 4, 10 | 'tank_red' : 5, 11 | 'heli_blue' : 6, 12 | 'heli_red' : 7, 13 | 'civilian' : 8 14 | } 15 | 16 | 17 | func perform(action_details): 18 | var message = tr(action_details['text']) 19 | var avatar_frame = self.avatar_portraits[action_details['portrait']] 20 | var name = tr(action_details['name']) 21 | var left_side = true 22 | if action_details['side'] == 'right': 23 | left_side = false 24 | 25 | self.bag.storyteller.pause = true 26 | 27 | self.bag.root.hud_controller.show_story_message(left_side, message, avatar_frame, name, self, 'unpause') 28 | self.bag.root.sound_controller.play('menu') 29 | 30 | 31 | func unpause(): 32 | self.bag.storyteller.pause = false 33 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/move.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | func perform(action_details): 4 | var source_field = self.bag.abstract_map.get_field(action_details['who']) 5 | var destination_field = self.bag.abstract_map.get_field(action_details['where']) 6 | source_field.object.set_pos_map(action_details['where']) 7 | destination_field.object = source_field.object 8 | source_field.object = null 9 | self.bag.root.sound_controller.play_unit_sound(destination_field.object, 'move') 10 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/sleep.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | func perform(action_details): 4 | self.bag.storyteller.pause = true 5 | self.bag.timers.set_timeout(action_details['time'], self, 'remove_sleep') 6 | 7 | func remove_sleep(): 8 | self.bag.storyteller.pause = false 9 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/spawn.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | var object_factory = preload('res://scripts/object_factory.gd').new() 4 | 5 | func perform(action_details): 6 | var spawn_type 7 | var player 8 | var unit_type = action_details['unit'] 9 | var side = action_details['side'] 10 | 11 | var unit 12 | var field = self.bag.abstract_map.get_field(action_details['where']) 13 | 14 | if field.object != null: 15 | return 16 | 17 | if unit_type == 'soldier': 18 | spawn_type = 0 19 | elif unit_type == 'tank': 20 | spawn_type = 1 21 | elif unit_type == 'heli': 22 | spawn_type = 2 23 | 24 | if side == 'blue': 25 | player = 0 26 | elif side == 'red': 27 | player = 1 28 | 29 | unit = object_factory.build_unit(spawn_type, player) 30 | 31 | field.object = unit 32 | self.bag.controllers.action_controller.ysort.add_child(unit) 33 | self.bag.root.sound_controller.play_unit_sound(unit, self.bag.root.sound_controller.SOUND_SPAWN) 34 | unit.set_pos_map(field.position) 35 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/terrain_add.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | 4 | 5 | func perform(action_details): 6 | var current_map = self.bag.root.current_map 7 | var type = action_details['type'] 8 | var position = action_details['where'] 9 | var frame = null 10 | 11 | if action_details.has('frame'): 12 | frame = action_details['frame'] 13 | 14 | if type == 'forest': 15 | self.add_forest(position, frame) 16 | elif type == 'city_small': 17 | self.add_city_small(position, frame) 18 | elif type == 'city_big': 19 | self.add_city_big(position, frame) 20 | elif type == 'mountain': 21 | self.add_mountain(position, frame) 22 | elif type == 'wall': 23 | self.add_fence(position, frame) 24 | 25 | self.bag.root.sound_controller.play('spawn') 26 | 27 | 28 | 29 | func add_forest(position, frame = null): 30 | self._add_non_movable(position, frame, randi()%10) 31 | 32 | func add_city_small(position, frame = null): 33 | self._add_city_block(self.bag.root.current_map.map_city_small, position, frame) 34 | 35 | func add_city_big(position, frame = null): 36 | self._add_city_block(self.bag.root.current_map.map_city_big, position, frame) 37 | 38 | func add_mountain(position, frame = null): 39 | self._add_non_movable(position, frame, 11 + (randi()%2)) 40 | 41 | func add_fence(position, frame = null): 42 | var temp = self.bag.root.current_map.map_buildings[6].instance() 43 | self.bag.root.current_map.attach_object(position, temp) 44 | if frame != null: 45 | temp.set_frame(frame) 46 | self.bag.abstract_map.get_field(position).object = temp 47 | 48 | 49 | 50 | func _add_non_movable(position, frame, random_frame): 51 | var temp = self.bag.root.current_map.map_non_movable.instance() 52 | if frame == null: 53 | temp.set_frame(random_frame) 54 | else: 55 | temp.set_frame(frame) 56 | 57 | self.bag.root.current_map.attach_object(position, temp) 58 | self.bag.abstract_map.get_field(position).object = temp 59 | 60 | func _add_city_block(templates, position, frame): 61 | var temp 62 | 63 | if frame == null: 64 | temp = templates[randi() % templates.size()].instance() 65 | else: 66 | temp = templates[frame].instance() 67 | 68 | self.bag.root.current_map.attach_object(position, temp) 69 | self.bag.abstract_map.get_field(position).object = temp 70 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/terrain_damage.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | func perform(action_details): 4 | var position = action_details['where'] 5 | var field = self.bag.abstract_map.get_field(position) 6 | 7 | var object = field.object 8 | if object != null: 9 | self.bag.root.sound_controller.play('explosion') 10 | object.set_damage() 11 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/terrain_remove.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | func perform(action_details): 4 | var position = action_details['where'] 5 | var boom = action_details['explosion'] 6 | var field = self.bag.abstract_map.get_field(position) 7 | 8 | var object = field.object 9 | 10 | field.object = null 11 | if object != null: 12 | if boom: 13 | object.show_explosion() 14 | self.bag.root.sound_controller.play('explosion') 15 | self.bag.timers.set_timeout(0.5, self, 'remove_object', [object]) 16 | else: 17 | self.remove_object([object]) 18 | 19 | 20 | 21 | func remove_object(object): 22 | object[0].queue_free() 23 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/trigger.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | func perform(action_details): 4 | var trigger_name = action_details['name'] 5 | var is_suspended = action_details['suspended'] 6 | 7 | self.bag.storyteller.action_triggers.suspend(trigger_name, is_suspended) 8 | -------------------------------------------------------------------------------- /scripts/storyteller/actions/unlock_hud.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | func perform(action_details): 4 | if not self.bag.controllers.action_controller.is_cpu_player: 5 | self.bag.root.is_locked_for_cpu = false 6 | self.bag.root.hud_controller.unlock_hud() 7 | self.bag.root.hud_controller.hud_panel_anchor_top_right.show() 8 | self.bag.root.hud.get_node("top_center").show() 9 | self.bag.root.hud_controller.cinematic_camera.get_node("bottom/progress").show() 10 | self.bag.root.hud_controller.hide_cinematic_camera() 11 | self.bag.root.selector.show() 12 | self.restore_camera_zoom() 13 | self.bag.perform.pause = false 14 | self.bag.fog_controller.toggle_fog() 15 | 16 | func restore_camera_zoom(): 17 | self.bag.camera.camera_zoom_level_pos = self.bag.storyteller.camera_zoom_level 18 | self.bag.camera.apply_default_camera() -------------------------------------------------------------------------------- /scripts/storyteller/actions/win.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/actions/abstract_action.gd" 2 | 3 | func perform(action_details): 4 | self.bag.root.action_controller.end_game(action_details['player']) 5 | -------------------------------------------------------------------------------- /scripts/storyteller/triggers.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var action_triggers = { 4 | 'turn' : preload("res://scripts/storyteller/triggers/turn.gd").new(), 5 | 'turn_end' : preload("res://scripts/storyteller/triggers/turn_end.gd").new(), 6 | 'move' : preload("res://scripts/storyteller/triggers/move.gd").new(), 7 | 'deploy' : preload("res://scripts/storyteller/triggers/deploy.gd").new(), 8 | 'domination' : preload("res://scripts/storyteller/triggers/domination.gd").new(), 9 | 'assasination' : preload("res://scripts/storyteller/triggers/assasination.gd").new(), 10 | } 11 | 12 | 13 | var current_triggers = {} 14 | 15 | var triggered_triggers = {} 16 | 17 | 18 | func _initialize(): 19 | self.init_triggers() 20 | 21 | func init_triggers(): 22 | for trigger_name in self.action_triggers: 23 | self.action_triggers[trigger_name]._init_bag(self.bag) 24 | 25 | func reset(): 26 | self.current_triggers = {} 27 | self.triggered_triggers = {} 28 | 29 | 30 | func load_map_triggers(map_data): 31 | self.reset() 32 | self.current_triggers = map_data['triggers'] 33 | 34 | func mark_actors(): 35 | var trigger 36 | var trigger_definition 37 | 38 | for trigger_name in self.current_triggers: 39 | trigger_definition = self.current_triggers[trigger_name] 40 | trigger = self.action_triggers[trigger_definition['type']] 41 | 42 | trigger.mark_actors(trigger_definition) 43 | 44 | 45 | func feed_story_event(story_event): 46 | var trigger 47 | var trigger_definition 48 | for trigger_name in self.current_triggers: 49 | trigger_definition = self.current_triggers[trigger_name] 50 | trigger = self.action_triggers[trigger_definition['type']] 51 | if trigger_definition.has('suspended') and trigger_definition['suspended']: 52 | continue 53 | 54 | if trigger.uses(story_event['type']) and trigger.is_triggered(trigger_definition, story_event): 55 | if trigger_definition.has('one_off') and trigger_definition['one_off'] and self.triggered_triggers.has(trigger_name): 56 | continue 57 | self.bag.storyteller.tell_a_story(trigger_definition['story']) 58 | self.triggered_triggers[trigger_name] = trigger_name 59 | break 60 | 61 | func suspend(trigger_name, is_suspended=true): 62 | self.current_triggers[trigger_name]['suspended'] = is_suspended 63 | -------------------------------------------------------------------------------- /scripts/storyteller/triggers/abstract_trigger.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var trigger_types_used = {} 4 | 5 | func uses(event_type): 6 | return self.trigger_types_used.has(event_type) 7 | 8 | func is_triggered(trigger_details, story_event): 9 | return 10 | 11 | func mark_actors(trigger_details): 12 | return 13 | 14 | func _mark_actor(position, mark): 15 | var field 16 | 17 | field = self.bag.abstract_map.get_field(position) 18 | field.object.story_markers[mark] = mark 19 | -------------------------------------------------------------------------------- /scripts/storyteller/triggers/assasination.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/triggers/abstract_trigger.gd" 2 | 3 | func _initialize(): 4 | self.trigger_types_used['die'] = true 5 | 6 | func mark_actors(trigger_details): 7 | var vip 8 | 9 | vip = trigger_details['details']['vip'] 10 | self._mark_actor(vip, self._create_vip_mark(vip)) 11 | 12 | 13 | func is_triggered(trigger_details, story_event): 14 | var mark 15 | var victim = story_event['details']['victim'] 16 | 17 | mark = self._create_vip_mark(trigger_details['details']['vip']) 18 | 19 | if victim.has(mark): 20 | return true 21 | 22 | return false 23 | 24 | func _create_vip_mark(vip): 25 | return "vip_" + str(vip.x) + "_" + str(vip.y) 26 | -------------------------------------------------------------------------------- /scripts/storyteller/triggers/deploy.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/triggers/abstract_trigger.gd" 2 | 3 | func _initialize(): 4 | self.trigger_types_used['deploy'] = true 5 | self.trigger_types_used['die'] = true 6 | 7 | func is_triggered(trigger_details, story_event): 8 | var player = trigger_details['details']['player'] 9 | var unit_type = null 10 | var exact = false 11 | var amount = trigger_details['details']['amount'] 12 | var count = 0 13 | 14 | if trigger_details['details'].has('type'): 15 | unit_type = trigger_details['details']['type'] 16 | if trigger_details['details'].has('exact'): 17 | exact = trigger_details['details']['exact'] 18 | 19 | var units = self.bag.positions.get_player_units(player) 20 | var field 21 | 22 | for unit_position in units: 23 | if unit_type == null: 24 | count = count + 1 25 | else: 26 | field = self.bag.abstract_map.get_field(unit_position) 27 | if field.object == null: 28 | continue 29 | if field.object.type_name == unit_type: 30 | count = count + 1 31 | 32 | if exact: 33 | if count == amount: 34 | return true 35 | else: 36 | if count >= amount: 37 | return true 38 | 39 | return false -------------------------------------------------------------------------------- /scripts/storyteller/triggers/domination.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/triggers/abstract_trigger.gd" 2 | 3 | func _initialize(): 4 | self.trigger_types_used['claim'] = true 5 | 6 | func is_triggered(trigger_details, story_event): 7 | var player = trigger_details['details']['player'] 8 | var list = trigger_details['details']['list'] 9 | var amount = trigger_details['details']['amount'] 10 | var field 11 | var count = 0 12 | 13 | for position in list: 14 | field = self.bag.abstract_map.get_field(position) 15 | if field.object.player == player: 16 | count = count + 1 17 | 18 | if count >= amount: 19 | return true 20 | 21 | return false -------------------------------------------------------------------------------- /scripts/storyteller/triggers/move.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/triggers/abstract_trigger.gd" 2 | 3 | func _initialize(): 4 | self.trigger_types_used['move'] = true 5 | 6 | func mark_actors(trigger_details): 7 | var vip 8 | 9 | if trigger_details['details'].has('vip'): 10 | vip = trigger_details['details']['vip'] 11 | self._mark_actor(vip, self._create_vip_mark(vip)) 12 | 13 | 14 | func is_triggered(trigger_details, story_event): 15 | var mark 16 | var has_vip = false 17 | var has_player = false 18 | var who = story_event['details']['who'] 19 | 20 | if trigger_details['details'].has('vip'): 21 | has_vip = true 22 | mark = self._create_vip_mark(trigger_details['details']['vip']) 23 | 24 | if trigger_details['details'].has('player'): 25 | has_player = true 26 | 27 | for field in trigger_details['details']['fields']: 28 | if field == story_event['details']['where']: 29 | if has_vip: 30 | if who.story_markers.has(mark): 31 | return true 32 | elif has_player: 33 | if trigger_details['details']['player'] == who.player: 34 | return true 35 | elif not (has_player or has_vip): 36 | return true 37 | 38 | return false 39 | 40 | func _create_vip_mark(vip): 41 | return "vip_" + str(vip.x) + "_" + str(vip.y) 42 | -------------------------------------------------------------------------------- /scripts/storyteller/triggers/turn.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/triggers/abstract_trigger.gd" 2 | 3 | func _initialize(): 4 | self.trigger_types_used['turn'] = true 5 | 6 | func is_triggered(trigger_details, story_event): 7 | return trigger_details['details']['turn'] == story_event['details']['turn'] 8 | -------------------------------------------------------------------------------- /scripts/storyteller/triggers/turn_end.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/storyteller/triggers/abstract_trigger.gd" 2 | 3 | func _initialize(): 4 | self.trigger_types_used['turn_end'] = true 5 | 6 | func is_triggered(trigger_details, story_event): 7 | return trigger_details['details']['turn'] == story_event['details']['turn'] 8 | -------------------------------------------------------------------------------- /scripts/terrain_movable.gd: -------------------------------------------------------------------------------- 1 | 2 | extends Sprite 3 | 4 | var sprite_list = [8,10,11,12,13,14,15] 5 | var r 6 | 7 | func _ready(): 8 | r = randi() % sprite_list.size() 9 | self.set_frame(sprite_list[r]) 10 | pass 11 | 12 | 13 | -------------------------------------------------------------------------------- /scripts/timers.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | func set_timeout(timeout, object, method, args=[]): 4 | var timer = Timer.new() 5 | timer.set_wait_time(timeout) 6 | timer.set_one_shot(true) 7 | timer.connect("timeout", self, "execute_timeout", [object, method, args, timer]) 8 | self.bag.root.add_child(timer) 9 | timer.start() 10 | 11 | func execute_timeout(object, method, args, timer): 12 | self.bag.root.remove_child(timer) 13 | timer.call_deferred("free") 14 | if args.size() > 0: 15 | object.call(method, args) 16 | else: 17 | object.call(method) 18 | 19 | 20 | -------------------------------------------------------------------------------- /scripts/translate_me.gd: -------------------------------------------------------------------------------- 1 | export var trans_key = 'LABEL_DEFAULT' 2 | 3 | func _ready(): 4 | add_to_group("translate_me") 5 | refresh_label() 6 | pass 7 | 8 | func refresh_label(): 9 | self.set_text(tr(self.trans_key)) 10 | 11 | func set_trans_key(new_key): 12 | self.trans_key = new_key 13 | refresh_label() 14 | -------------------------------------------------------------------------------- /scripts/unit_switcher.gd: -------------------------------------------------------------------------------- 1 | extends "res://scripts/bag_aware.gd" 2 | 3 | var root_node 4 | var shown_units = [] 5 | var unit_list = [] 6 | var last_direction = null 7 | var counter = 0 8 | 9 | const NEXT = 0; 10 | const BACK = 1; 11 | 12 | func _initialize(): 13 | self.root_node = self.bag.root 14 | 15 | func switch_unit(player, active_field, direction=self.NEXT): 16 | self.bag.positions.refresh_units() 17 | var units = self.bag.positions.get_player_units(player) 18 | 19 | self.__create_unit_list(units) 20 | 21 | if active_field == null: 22 | self.counter = 0 23 | return self.unit_list[self.counter] 24 | 25 | var pos = self.__get_unit_position(direction) 26 | if (pos == active_field.object.get_pos_map()) : 27 | pos = self.__get_unit_position(direction) 28 | 29 | return pos 30 | 31 | func __get_unit_position(direction): 32 | if direction == self.NEXT: 33 | self.counter = self.counter + 1 34 | else: 35 | self.counter = self.counter - 1 36 | 37 | self.counter = self.counter % unit_list.size() 38 | 39 | # TODO repair for modulo 40 | if (self.counter < 0): 41 | self.counter = self.unit_list.size() - abs(self.counter) 42 | 43 | return self.unit_list[self.counter] 44 | 45 | func __create_unit_list(units): 46 | self.unit_list.clear() 47 | for unit_pos in units.keys(): 48 | self.unit_list.append(unit_pos) 49 | -------------------------------------------------------------------------------- /scripts/wave_controller.gd: -------------------------------------------------------------------------------- 1 | extends Sprite 2 | 3 | var animation 4 | var wave_pos 5 | var root 6 | var angle_line 7 | var animation_length 8 | 9 | func _ready(): 10 | root = get_node("/root/game") 11 | animation = self.get_node('anim') 12 | angle_line = int(self.get_pos().x) 13 | if root.current_map_terrain != null: 14 | angle_line = root.current_map_terrain.world_to_map(self.get_pos()) 15 | angle_line = int(angle_line.y) 16 | #wave_pos = (1+ sin(angle_line) ) * ( animation.get_current_animation_length() * 0.5) 17 | animation_length = int(animation.get_current_animation_length()) 18 | wave_pos = angle_line % animation_length 19 | animation.play('wave_' + str(randi()%3) ) 20 | animation.seek(wave_pos,true) 21 | -------------------------------------------------------------------------------- /scripts/workshop/blueprint.gd: -------------------------------------------------------------------------------- 1 | 2 | var root 3 | var workshop_gui_controller 4 | var blueprint 5 | 6 | func init_root(root_node): 7 | self.root = root_node 8 | self.workshop_gui_controller = self.root.bag.controllers.workshop_gui_controller 9 | 10 | func bind_panel(bluepring_node): 11 | self.blueprint = bluepring_node 12 | -------------------------------------------------------------------------------- /scripts/workshop/navigation_panel.gd: -------------------------------------------------------------------------------- 1 | 2 | var root 3 | var workshop_gui_controller 4 | var workshop 5 | var navigation_panel 6 | 7 | var undo_button 8 | var drag_button 9 | var menu_button 10 | var toolbox_button 11 | var block_button 12 | var block_button_label 13 | 14 | func init_root(root_node): 15 | self.root = root_node 16 | self.workshop_gui_controller = self.root.bag.controllers.workshop_gui_controller 17 | self.workshop = self.root.bag.workshop 18 | 19 | func bind_panel(navigation_panel_node): 20 | self.navigation_panel = navigation_panel_node 21 | self.menu_button = self.navigation_panel.get_node("controls/menu_button") 22 | self.undo_button = self.navigation_panel.get_node("controls/undo_button") 23 | self.drag_button = self.navigation_panel.get_node("controls/map_move_button") 24 | self.toolbox_button = self.navigation_panel.get_node("controls/toolbox_button") 25 | self.block_button = self.navigation_panel.get_node("controls/building_blocks_button") 26 | self.block_button_label = self.block_button.get_node("Label") 27 | 28 | self.menu_button.connect("pressed", self, "menu_button_pressed") 29 | self.undo_button.connect("pressed", self, "undo_button_pressed") 30 | self.drag_button.connect("pressed", self, "drag_button_pressed") 31 | self.toolbox_button.connect("pressed", self, "toolbox_button_pressed") 32 | self.block_button.connect("pressed", self, "block_button_pressed") 33 | 34 | func menu_button_pressed(): 35 | self.root.sound_controller.play('menu') 36 | self.workshop.toggle_menu() 37 | self.root.menu.workshop_button.grab_focus() 38 | 39 | func undo_button_pressed(): 40 | self.root.sound_controller.play('menu') 41 | self.workshop.undo_last_action() 42 | 43 | func drag_button_pressed(): 44 | self.root.sound_controller.play('menu') 45 | self.mark_drag_button() 46 | self.workshop.movement_mode = true 47 | self.set_block_label(tr("LABEL_WORKSHOP_MOVE_MAP")) 48 | 49 | func reset_buttons(): 50 | return 51 | 52 | func mark_drag_button(): 53 | self.reset_buttons() 54 | 55 | func mark_block_button(): 56 | self.reset_buttons() 57 | 58 | func toolbox_button_pressed(): 59 | self.root.sound_controller.play('menu') 60 | self.workshop_gui_controller.toggle_toolbox_panel() 61 | 62 | func block_button_pressed(): 63 | self.root.sound_controller.play('menu') 64 | self.workshop_gui_controller.toggle_block_blocks() 65 | 66 | func reset_block_label(): 67 | self.set_block_label(tr("LABEL_WORKSHOP_BUILD_TERRAIN")) 68 | 69 | func set_block_label(label): 70 | self.block_button_label.set_text(label) 71 | -------------------------------------------------------------------------------- /terrain/tilesets/fall_movable.xscn: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | "conn_count" 7 | 0 8 | "conns" 9 | 10 | "editable_instances" 11 | 12 | 13 | "names" 14 | 15 | "terrain_movable" 16 | "transform/pos" 17 | "texture" 18 | "vframes" 19 | "hframes" 20 | "frame" 21 | "__meta__" 22 | "Sprite" 23 | 24 | "node_count" 25 | 1 26 | "node_paths" 27 | 28 | 29 | "nodes" 30 | -1, -1, 7, 0, -1, 6, 1, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 0 31 | "variants" 32 | 33 | 0, 0.397209 34 | 35 | 3 36 | 8 37 | 1 38 | 39 | "__editor_plugin_screen__" 40 | "2D" 41 | 42 | 43 | "version" 44 | 2 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /terrain/tilesets/winter_movable.xscn: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | "conn_count" 7 | 0 8 | "conns" 9 | 10 | "editable_instances" 11 | 12 | 13 | "names" 14 | 15 | "terrain_movable" 16 | "transform/pos" 17 | "texture" 18 | "vframes" 19 | "hframes" 20 | "frame" 21 | "__meta__" 22 | "Sprite" 23 | 24 | "node_count" 25 | 1 26 | "node_paths" 27 | 28 | 29 | "nodes" 30 | -1, -1, 7, 0, -1, 6, 1, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 0 31 | "variants" 32 | 33 | 0, 0.397209 34 | 35 | 3 36 | 8 37 | 1 38 | 39 | "__editor_plugin_screen__" 40 | "2D" 41 | 42 | 43 | "version" 44 | 2 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /translations/_imported/campaign.de.xl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/translations/_imported/campaign.de.xl -------------------------------------------------------------------------------- /translations/_imported/campaign.en.xl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/translations/_imported/campaign.en.xl -------------------------------------------------------------------------------- /translations/_imported/campaign.es.xl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/translations/_imported/campaign.es.xl -------------------------------------------------------------------------------- /translations/_imported/campaign.fr.xl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/translations/_imported/campaign.fr.xl -------------------------------------------------------------------------------- /translations/_imported/campaign.ja.xl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/translations/_imported/campaign.ja.xl -------------------------------------------------------------------------------- /translations/_imported/campaign.pl.xl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/translations/_imported/campaign.pl.xl -------------------------------------------------------------------------------- /translations/_imported/campaign.ru.xl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/translations/_imported/campaign.ru.xl -------------------------------------------------------------------------------- /translations/_imported/translations.de.xl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/translations/_imported/translations.de.xl -------------------------------------------------------------------------------- /translations/_imported/translations.en.xl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/translations/_imported/translations.en.xl -------------------------------------------------------------------------------- /translations/_imported/translations.es.xl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/translations/_imported/translations.es.xl -------------------------------------------------------------------------------- /translations/_imported/translations.fr.xl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/translations/_imported/translations.fr.xl -------------------------------------------------------------------------------- /translations/_imported/translations.ja.xl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/translations/_imported/translations.ja.xl -------------------------------------------------------------------------------- /translations/_imported/translations.pl.xl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/translations/_imported/translations.pl.xl -------------------------------------------------------------------------------- /translations/_imported/translations.ru.xl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/w84death/Tanks-of-Freedom/b1cad8b6999227971d4001d7646846bac7d7ffdc/translations/_imported/translations.ru.xl -------------------------------------------------------------------------------- /translations/languages.gd: -------------------------------------------------------------------------------- 1 | # only confirmed and finished translations here - they will be use on build 2 | var available = ['en', 'de', 'es', 'fr', 'ja', 'pl', 'ru'] 3 | 4 | # languages available locally - ADD OWN LANG HERE 5 | var in_develop = [] 6 | -------------------------------------------------------------------------------- /units/civilians/old_woman.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=1] 2 | 3 | [ext_resource path="res://units/unit_template.tscn" type="PackedScene" id=1] 4 | [ext_resource path="res://assets/units/civilians_spritesheet.png" type="Texture" id=2] 5 | [ext_resource path="res://scripts/objects/units/randomizing_animation_for_civilians.gd" type="Script" id=3] 6 | 7 | [sub_resource type="Animation" id=1] 8 | 9 | resource/name = "movee" 10 | length = 1.0 11 | loop = true 12 | step = 0.1 13 | tracks/0/type = "value" 14 | tracks/0/path = NodePath(".:frame") 15 | tracks/0/interp = 1 16 | tracks/0/imported = false 17 | tracks/0/keys = { "times":FloatArray( 0, 0.3, 0.6 ), "transitions":FloatArray( 1, 1, 1 ), "update":1, "values":[ 6, 7, 8 ] } 18 | 19 | [node name="civilian_old_woman" instance=ExtResource( 1 )] 20 | 21 | texture = ExtResource( 2 ) 22 | frame = 8 23 | script/script = ExtResource( 3 ) 24 | 25 | [node name="anim" parent="."] 26 | 27 | anims/movee = SubResource( 1 ) 28 | autoplay = "movee" 29 | 30 | [node name="health" parent="."] 31 | 32 | visibility/visible = false 33 | 34 | [node name="shield" parent="."] 35 | 36 | visibility/visible = false 37 | 38 | [node name="KinematicBody2D" type="KinematicBody2D" parent="."] 39 | 40 | transform/pos = Vector2( 0.852638, 5.10784 ) 41 | transform/scale = Vector2( 0.152972, 0.060096 ) 42 | input/pickable = false 43 | collision/layers = 1 44 | collision/mask = 1 45 | collision/margin = 0.08 46 | 47 | 48 | -------------------------------------------------------------------------------- /units/civilians/protest_guy.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=1] 2 | 3 | [ext_resource path="res://units/unit_template.tscn" type="PackedScene" id=1] 4 | [ext_resource path="res://assets/units/civilians_spritesheet.png" type="Texture" id=2] 5 | [ext_resource path="res://scripts/objects/units/randomizing_animation_for_civilians.gd" type="Script" id=3] 6 | 7 | [sub_resource type="Animation" id=1] 8 | 9 | resource/name = "move-me" 10 | length = 1.0 11 | loop = true 12 | step = 0.1 13 | tracks/0/type = "value" 14 | tracks/0/path = NodePath(".:frame") 15 | tracks/0/interp = 1 16 | tracks/0/imported = false 17 | tracks/0/keys = { "times":FloatArray( 0, 0.3, 0.7 ), "transitions":FloatArray( 1, 1, 1 ), "update":1, "values":[ 3, 4, 5 ] } 18 | 19 | [node name="civilian_protest_guy" instance=ExtResource( 1 )] 20 | 21 | texture = ExtResource( 2 ) 22 | frame = 4 23 | script/script = ExtResource( 3 ) 24 | 25 | [node name="anim" parent="."] 26 | 27 | anims/move-me = SubResource( 1 ) 28 | autoplay = "move-me" 29 | 30 | [node name="health" parent="."] 31 | 32 | visibility/visible = false 33 | 34 | [node name="shield" parent="."] 35 | 36 | visibility/visible = false 37 | 38 | 39 | -------------------------------------------------------------------------------- /units/civilians/protest_guy2.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=1] 2 | 3 | [ext_resource path="res://units/unit_template.tscn" type="PackedScene" id=1] 4 | [ext_resource path="res://assets/units/civilians_spritesheet.png" type="Texture" id=2] 5 | [ext_resource path="res://scripts/objects/units/randomizing_animation_for_civilians.gd" type="Script" id=3] 6 | 7 | [sub_resource type="Animation" id=1] 8 | 9 | resource/name = "bounnce" 10 | length = 1.0 11 | loop = true 12 | step = 0.1 13 | tracks/0/type = "value" 14 | tracks/0/path = NodePath(".:frame") 15 | tracks/0/interp = 1 16 | tracks/0/imported = false 17 | tracks/0/keys = { "times":FloatArray( 0, 0.4, 0.7 ), "transitions":FloatArray( 1, 1, 1 ), "update":1, "values":[ 9, 10, 11 ] } 18 | 19 | [node name="civilian_protest_guy2" instance=ExtResource( 1 )] 20 | 21 | texture = ExtResource( 2 ) 22 | frame = 9 23 | script/script = ExtResource( 3 ) 24 | 25 | [node name="anim" parent="."] 26 | 27 | anims/bounnce = SubResource( 1 ) 28 | autoplay = "bounnce" 29 | 30 | [node name="health" parent="."] 31 | 32 | visibility/visible = false 33 | 34 | [node name="shield" parent="."] 35 | 36 | visibility/visible = false 37 | 38 | 39 | -------------------------------------------------------------------------------- /units/civilians/refugee.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=1] 2 | 3 | [ext_resource path="res://units/unit_template.tscn" type="PackedScene" id=1] 4 | [ext_resource path="res://assets/units/civilians_spritesheet.png" type="Texture" id=2] 5 | [ext_resource path="res://scripts/objects/units/randomizing_animation_for_civilians.gd" type="Script" id=3] 6 | 7 | [sub_resource type="Animation" id=1] 8 | 9 | resource/name = "move-me2" 10 | length = 1.0 11 | loop = true 12 | step = 0.1 13 | tracks/0/type = "value" 14 | tracks/0/path = NodePath(".:frame") 15 | tracks/0/interp = 1 16 | tracks/0/imported = false 17 | tracks/0/keys = { "times":FloatArray( 0, 0.3, 0.7 ), "transitions":FloatArray( 1, 1, 1 ), "update":1, "values":[ 0, 1, 2 ] } 18 | 19 | [node name="civilian_refugee" instance=ExtResource( 1 )] 20 | 21 | texture = ExtResource( 2 ) 22 | frame = 2 23 | script/script = ExtResource( 3 ) 24 | 25 | [node name="anim" parent="."] 26 | 27 | anims/move-me2 = SubResource( 1 ) 28 | next/move-me2 = "" 29 | autoplay = "move-me2" 30 | 31 | [node name="health" parent="."] 32 | 33 | visibility/visible = false 34 | 35 | [node name="shield" parent="."] 36 | 37 | visibility/visible = false 38 | 39 | 40 | -------------------------------------------------------------------------------- /units/civilians/refugee2.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=1] 2 | 3 | [ext_resource path="res://units/unit_template.tscn" type="PackedScene" id=1] 4 | [ext_resource path="res://assets/units/civilians_spritesheet.png" type="Texture" id=2] 5 | [ext_resource path="res://scripts/objects/units/randomizing_animation_for_civilians.gd" type="Script" id=3] 6 | 7 | [sub_resource type="Animation" id=1] 8 | 9 | resource/name = "mofe" 10 | length = 1.0 11 | loop = true 12 | step = 0.1 13 | tracks/0/type = "value" 14 | tracks/0/path = NodePath(".:frame") 15 | tracks/0/interp = 1 16 | tracks/0/imported = false 17 | tracks/0/keys = { "times":FloatArray( 0, 0.4, 0.7 ), "transitions":FloatArray( 1, 1, 1 ), "update":1, "values":[ 12, 13, 14 ] } 18 | 19 | [node name="civilian_refugee2" instance=ExtResource( 1 )] 20 | 21 | texture = ExtResource( 2 ) 22 | frame = 13 23 | script/script = ExtResource( 3 ) 24 | 25 | [node name="anim" parent="."] 26 | 27 | anims/mofe = SubResource( 1 ) 28 | autoplay = "mofe" 29 | 30 | [node name="health" parent="."] 31 | 32 | visibility/visible = false 33 | 34 | [node name="shield" parent="."] 35 | 36 | visibility/visible = false 37 | 38 | 39 | -------------------------------------------------------------------------------- /units/soldier_blue.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=1] 2 | 3 | [ext_resource path="res://units/unit_template.tscn" type="PackedScene" id=1] 4 | 5 | [node name="soldier_blue" instance=ExtResource( 1 )] 6 | 7 | 8 | --------------------------------------------------------------------------------