├── .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 |
--------------------------------------------------------------------------------