Initial commit
Server-authoritative Godot 4.6 strategy game. Includes the headless WebSocket game server, the browser client, and Nix packaging (server and web-export derivations plus a NixOS module) for deployment.
@@ -0,0 +1,4 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
# Normalize EOL for all files that Git considers text files.
|
||||||
|
* text=auto eol=lf
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# Godot 4+ specific ignores
|
||||||
|
.godot/
|
||||||
|
/android/
|
||||||
|
|
||||||
|
# Build artifacts
|
||||||
|
/exportsw/
|
||||||
|
/result
|
||||||
|
/result-*
|
||||||
|
|
||||||
|
# Nix / direnv
|
||||||
|
/.direnv/
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
# AGENTS.md
|
||||||
|
|
||||||
|
Godot 4.6 GDScript strategy game, early-stage (most gameplay is stubbed).
|
||||||
|
|
||||||
|
## Commands
|
||||||
|
|
||||||
|
- Validate / reimport after edits: `godot --headless --path . --import`
|
||||||
|
- Run the test suite: `godot --headless --path . res://tests/test_runner.tscn` (prints a summary and exits non-zero on failure)
|
||||||
|
- Parse-check a single script: `godot --headless --path . --check-only --script res://scenes/units/unit.gd`
|
||||||
|
- Run a scene directly: `godot --path . res://scenes/ui/menu_screen.tscn`
|
||||||
|
- Profile the headless server (prints a report every N seconds): `godot --headless --path . res://scenes/server_main.tscn -- --server --profile-interval 5`. A client's `--profile-interval` is forwarded to the server it spawns, and F3 on the client prints/clears its own report. F4 prints the `PerformanceMonitor` report (FPS-dive diagnostics plus the recent action log) without clearing it; the HUD also prints one automatically when the frame rate dives.
|
||||||
|
- There is no linter, formatter, or CI. Do not invent commands beyond the ones listed here.
|
||||||
|
- `godot --path .` with no scene fails: `project.godot` sets no `application/run/main_scene`. Pass a scene path or set the main scene in the editor.
|
||||||
|
- `--check-only` does not load autoloads, so scripts referencing `GameClock`, `GameConfig` or `Network` report false "Identifier not found" errors. Prefer `--import` plus the test suite for real validation.
|
||||||
|
|
||||||
|
## Gotchas
|
||||||
|
|
||||||
|
- Renderer is `gl_compatibility` (not Forward+) and 3D uses Jolt Physics. GL Compatibility omits Forward+ only features.
|
||||||
|
- `.uid` files are Godot-maintained; keep them paired with their scripts, never hand-edit or delete. `.godot/` is generated and gitignored.
|
||||||
|
- Indent `.gd` files with tabs (Godot default). `.editorconfig` only enforces UTF-8.
|
||||||
|
- `scenes/world_map.tscn` uses `TileMapLayer` (scene format=4), not the deprecated `TileMap`.
|
||||||
|
- Multiplayer uses `WebSocketMultiplayerPeer` (HTTP), not ENet/UDP, so the browser client can reach the same server. The dedicated server listens on `--port` (default 27015) and binds to `--bind` (default `127.0.0.1`, i.e. reverse-proxy only); the client defaults to the page's own origin on the web and `ws://127.0.0.1:27015/ws` on desktop. Join accepts a bare hostname or a full `ws(s)://`/`http(s)://` URL.
|
||||||
|
- Export templates must match the engine: use `godot_4_6` with `godot_4_6-export-templates-bin` from nixpkgs.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
- Game logic is server-authoritative. `scripts/server/game_state.gd` (`GameState`) is a scene-free model that owns the world, units, cities, territory, economy, training and visibility. `scripts/server/game_server.gd` (`GameServer`) is the root of the headless server (`scenes/server_main.tscn`); it owns a `GameState`, validates orders and broadcasts snapshots. `Network` (autoload) carries orders up and snapshots down. `scenes/world_map.gd` is a view only: it rebuilds terrain from the shared seed, renders snapshots and sends orders (falling back to a local `GameState` when run standalone).
|
||||||
|
- Movement is continuous: the server calls `GameState.advance_movement(delta / GameClock.SECONDS_PER_HOUR)` every frame and `tick_hour()` on each hour for training/visibility/economy; `advance_hour()` bundles both for tests and offline play. The client extrapolates each unit along its snapshot path (see `world_map.gd:_apply_unit_position`) so motion stays smooth between hourly snapshots, and predicts move orders locally (`_predict_path`, mirroring `GameState.find_path`) so a click feels instant before the server confirms it.
|
||||||
|
- Data-driven resources: `class_name` scripts in `data/*.gd` (`CivDescription`, `ProtoUnit`) define schemas; concrete instances are `.tres` under `data/civilisations/` and `data/units/`. Add content as new `.tres` files, not hardcoded values.
|
||||||
|
- Scenes are grouped by area: `scenes/`, `scenes/ui/`, `scenes/units/`. Reusable scenes attach a `class_name` script (e.g. `Unit`).
|
||||||
|
- Reusable logic lives in `class_name` scripts under `scripts/classes/` (`MapGenerator`, `MapTopology`, `HexPathfinder`, `TextFormat`); keep new algorithms there so they stay testable without a running scene.
|
||||||
|
- `scenes/map_overlay.gd` (`MapOverlay`) is the shared base for the tile overlays `Territory` and `FogOfWar`; put layer/topology/geometry plumbing there, not in the subclasses.
|
||||||
|
- Tests live in `tests/` as `*_test.gd` files extending the `TestCase` base in `tests/framework/`. `tests/test_runner.gd` (run via `tests/test_runner.tscn`) discovers and runs them. Add a new `tests/<topic>_test.gd` for each new pure or `class_name` behaviour.
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
- `flake.nix` exposes `packages.<system>.server` and `.web`, plus `nixosModules.default`. `nix/module.nix` runs the server as a `services.battle-for-tismo` systemd unit and serves the web client through nginx, proxying `/ws` to the local server. The web client connects to the page's own origin.
|
||||||
|
- Build locally with `nix build .#server` and `nix build .#web`; both use `godot_4_6` and its matching export templates from the flake's pinned nixpkgs.
|
||||||
|
After Width: | Height: | Size: 14 KiB |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://b2hdr4csim04w"
|
||||||
|
path="res://.godot/imported/aero-panel.png-a23a24f80c773b86dddbfa145cb68b13.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://aero-panel.png"
|
||||||
|
dest_files=["res://.godot/imported/aero-panel.png-a23a24f80c773b86dddbfa145cb68b13.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
class_name BuildingEffect
|
||||||
|
|
||||||
|
extends Resource
|
||||||
|
|
||||||
|
## One stat a building improves, and how it scales with the building's level.
|
||||||
|
## A building may carry several of these. The value contributed at a given
|
||||||
|
## level is base_value * level^exponent: exponent 1.0 is linear, below 1.0 is
|
||||||
|
## sublinear (diminishing returns), above 1.0 is superlinear.
|
||||||
|
|
||||||
|
## The stat this effect feeds. See the EFFECT_* constants on ProtoBuilding.
|
||||||
|
@export var stat : String = ""
|
||||||
|
|
||||||
|
## Value contributed at level 1.
|
||||||
|
@export var base_value : float = 0.0
|
||||||
|
|
||||||
|
## Level exponent. 1.0 = linear, 0.5 = square-root (sublinear).
|
||||||
|
@export_range(0.0, 2.0) var exponent : float = 1.0
|
||||||
|
|
||||||
|
|
||||||
|
func value_at(level: int) -> float:
|
||||||
|
if level <= 0:
|
||||||
|
return 0.0
|
||||||
|
return base_value * pow(float(level), exponent)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://c8lu7oofc64y
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
[gd_resource type="Resource" script_class="ProtoBuilding" format=3 uid="uid://djatijtfq1pgd"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://c0u6ish14ncb2" path="res://data/proto_building.gd" id="1_pb"]
|
||||||
|
[ext_resource type="Script" uid="uid://c8lu7oofc64y" path="res://data/building_effect.gd" id="2_be"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_bank_income"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "budget_income"
|
||||||
|
base_value = 0.05
|
||||||
|
exponent = 0.7
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_pb")
|
||||||
|
name = "Bank"
|
||||||
|
description = "Channels private wealth into the state coffers. Raises budget income."
|
||||||
|
cost_gdp_fraction = 0.02
|
||||||
|
cost_alpha = 1.7
|
||||||
|
upkeep_gdp_fraction = 4e-05
|
||||||
|
upkeep_alpha = 1.6
|
||||||
|
effects = Array[ExtResource("2_be")]([SubResource("Effect_bank_income")])
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
[gd_resource type="Resource" script_class="ProtoBuilding" format=3 uid="uid://d35v8a2dbpn6g"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://c0u6ish14ncb2" path="res://data/proto_building.gd" id="1_pb"]
|
||||||
|
[ext_resource type="Script" uid="uid://c8lu7oofc64y" path="res://data/building_effect.gd" id="2_be"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_cinema_culture"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "culture"
|
||||||
|
base_value = 3.0
|
||||||
|
exponent = 0.7
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_pb")
|
||||||
|
name = "Cinema studio"
|
||||||
|
description = "Mass media spreads the nation's culture at home and abroad."
|
||||||
|
cost_gdp_fraction = 0.03
|
||||||
|
cost_alpha = 1.75
|
||||||
|
upkeep_gdp_fraction = 0.0001
|
||||||
|
upkeep_alpha = 1.65
|
||||||
|
effects = Array[ExtResource("2_be")]([SubResource("Effect_cinema_culture")])
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
[gd_resource type="Resource" script_class="ProtoBuilding" format=3 uid="uid://cjlcklx5gpj1u"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://c0u6ish14ncb2" path="res://data/proto_building.gd" id="1_pb"]
|
||||||
|
[ext_resource type="Script" uid="uid://c8lu7oofc64y" path="res://data/building_effect.gd" id="2_be"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_market_gdp"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "gdp"
|
||||||
|
base_value = 0.04
|
||||||
|
exponent = 0.75
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_pb")
|
||||||
|
name = "Market"
|
||||||
|
description = "A hub of local trade. Raises national GDP, with diminishing returns."
|
||||||
|
cost_gdp_fraction = 0.01
|
||||||
|
cost_alpha = 1.6
|
||||||
|
upkeep_gdp_fraction = 3e-05
|
||||||
|
effects = Array[ExtResource("2_be")]([SubResource("Effect_market_gdp")])
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
[gd_resource type="Resource" script_class="ProtoBuilding" format=3 uid="uid://dxwffj357knng"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://c0u6ish14ncb2" path="res://data/proto_building.gd" id="1_pb"]
|
||||||
|
[ext_resource type="Script" uid="uid://c8lu7oofc64y" path="res://data/building_effect.gd" id="2_be"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_museum_culture"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "culture"
|
||||||
|
base_value = 1.5
|
||||||
|
exponent = 0.85
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_pb")
|
||||||
|
name = "Museum"
|
||||||
|
description = "Preserves national heritage, strengthening culture against foreign ideas."
|
||||||
|
cost_gdp_fraction = 0.02
|
||||||
|
cost_alpha = 1.6
|
||||||
|
upkeep_gdp_fraction = 5e-05
|
||||||
|
upkeep_alpha = 1.55
|
||||||
|
effects = Array[ExtResource("2_be")]([SubResource("Effect_museum_culture")])
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
[gd_resource type="Resource" script_class="ProtoBuilding" format=3 uid="uid://cnm334g5hdj2b"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://c0u6ish14ncb2" path="res://data/proto_building.gd" id="1_pb"]
|
||||||
|
[ext_resource type="Script" uid="uid://c8lu7oofc64y" path="res://data/building_effect.gd" id="2_be"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_lab_research"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "research"
|
||||||
|
base_value = 1.0
|
||||||
|
exponent = 0.9
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_pb")
|
||||||
|
name = "Research lab"
|
||||||
|
description = "Applies science to industry and government. Produces research points."
|
||||||
|
cost_gdp_fraction = 0.015
|
||||||
|
cost_alpha = 1.65
|
||||||
|
upkeep_gdp_fraction = 5e-05
|
||||||
|
upkeep_alpha = 1.55
|
||||||
|
effects = Array[ExtResource("2_be")]([SubResource("Effect_lab_research")])
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
[gd_resource type="Resource" script_class="ProtoBuilding" format=3 uid="uid://bc4wqs1rr5707"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://c0u6ish14ncb2" path="res://data/proto_building.gd" id="1_pb"]
|
||||||
|
[ext_resource type="Script" uid="uid://c8lu7oofc64y" path="res://data/building_effect.gd" id="2_be"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_university_research"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "research"
|
||||||
|
base_value = 2.0
|
||||||
|
exponent = 0.8
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_university_culture"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "culture"
|
||||||
|
base_value = 0.5
|
||||||
|
exponent = 0.7
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_pb")
|
||||||
|
name = "University"
|
||||||
|
description = "Higher education produces research and a little culture."
|
||||||
|
cost_gdp_fraction = 0.025
|
||||||
|
cost_alpha = 1.7
|
||||||
|
upkeep_gdp_fraction = 8e-05
|
||||||
|
upkeep_alpha = 1.6
|
||||||
|
effects = Array[ExtResource("2_be")]([SubResource("Effect_university_research"), SubResource("Effect_university_culture")])
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[gd_resource type="Resource" script_class="CityDescription" format=3]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://data/city_description.gd" id="1_city"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_city")
|
||||||
|
name = "London"
|
||||||
|
population = 9500000
|
||||||
|
improvements = PackedStringArray("Big Ben", "Tower Bridge", "Buckingham Palace")
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[gd_resource type="Resource" script_class="CityDescription" format=3]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://data/city_description.gd" id="1_city"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_city")
|
||||||
|
name = "Paris"
|
||||||
|
population = 11200000
|
||||||
|
improvements = PackedStringArray("Eiffel Tower", "Louvre", "Notre-Dame")
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
class_name CityDescription
|
||||||
|
|
||||||
|
extends Resource
|
||||||
|
|
||||||
|
## Authored data for a single city. Generated cities build one of these at
|
||||||
|
## runtime; named capitals are stored as .tres files under res://data/cities.
|
||||||
|
|
||||||
|
@export var name : String
|
||||||
|
@export var population : int = 0
|
||||||
|
@export var improvements : PackedStringArray = PackedStringArray()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://cor2vawqxhptw
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
class_name CivDescription
|
||||||
|
|
||||||
|
extends Resource
|
||||||
|
|
||||||
|
## Defines a playable civilisation. Instances live as .tres files under
|
||||||
|
## res://data/civilisations and are also the run-time identity of a nation:
|
||||||
|
## territory and units reference the resource directly when comparing owners.
|
||||||
|
|
||||||
|
@export var name : String
|
||||||
|
@export var primary_colour : Color
|
||||||
|
@export var accent_colour : Color
|
||||||
|
@export var flag : Texture2D
|
||||||
|
## Names used for the civilisation's non-capital cities, in founding order.
|
||||||
|
@export var city_names : PackedStringArray = PackedStringArray()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://bbrofteu1a30o
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[gd_resource type="Resource" script_class="CivDescription" format=3 uid="uid://xm08b8g1r773"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://bbrofteu1a30o" path="res://data/civ_description.gd" id="1_a63p8"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://io753v4cud2c" path="res://gfx/hud/flags/flag_britain.png" id="2_gb01"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_a63p8")
|
||||||
|
name = "Britain"
|
||||||
|
primary_colour = Color(0.6580932, 0.09319074, 0.09283676, 1)
|
||||||
|
accent_colour = Color(0.028559247, 0.13517213, 0.9999997, 1)
|
||||||
|
flag = ExtResource("2_gb01")
|
||||||
|
city_names = PackedStringArray("Birmingham", "Manchester", "Glasgow", "Liverpool", "Leeds", "Sheffield", "Edinburgh", "Bristol", "Cardiff")
|
||||||
|
metadata/_custom_type_script = "uid://bbrofteu1a30o"
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[gd_resource type="Resource" script_class="CivDescription" format=3 uid="uid://bnlivue5sumkl"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://bbrofteu1a30o" path="res://data/civ_description.gd" id="1_n7v6n"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://bsuer7fwcs6py" path="res://gfx/hud/flags/flag_france.png" id="2_fr01"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_n7v6n")
|
||||||
|
name = "France"
|
||||||
|
primary_colour = Color(0.050399996, 0.050399996, 0.36, 1)
|
||||||
|
accent_colour = Color(0.55, 0.54615, 0.5115, 1)
|
||||||
|
flag = ExtResource("2_fr01")
|
||||||
|
city_names = PackedStringArray("Lyon", "Marseille", "Toulouse", "Nice", "Nantes", "Montpellier", "Strasbourg", "Bordeaux", "Lille")
|
||||||
|
metadata/_custom_type_script = "uid://bbrofteu1a30o"
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[gd_resource type="Resource" script_class="CivDescription" format=3]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://bbrofteu1a30o" path="res://data/civ_description.gd" id="1_ga01"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://co0ufd01torfw" path="res://gfx/hud/flags/flag_galicia.png" id="2_ga01"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_ga01")
|
||||||
|
name = "Galicia"
|
||||||
|
primary_colour = Color(0, 0.427451, 0.678431, 1)
|
||||||
|
accent_colour = Color(1, 1, 1, 1)
|
||||||
|
flag = ExtResource("2_ga01")
|
||||||
|
city_names = PackedStringArray("Santiago de Compostela", "Vigo", "A Coruña", "Ourense", "Lugo", "Pontevedra", "Ferrol", "Vilagarcía de Arousa", "Ribeira", "Redondela")
|
||||||
|
metadata/_custom_type_script = "uid://bbrofteu1a30o"
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[gd_resource type="Resource" script_class="CivDescription" format=3]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://bbrofteu1a30o" path="res://data/civ_description.gd" id="1_de01"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://bga6kymgrsbra" path="res://gfx/hud/flags/flag_germany.png" id="2_de01"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_de01")
|
||||||
|
name = "Germany"
|
||||||
|
primary_colour = Color(0.08, 0.08, 0.08, 1)
|
||||||
|
accent_colour = Color(1, 0.807843, 0, 1)
|
||||||
|
flag = ExtResource("2_de01")
|
||||||
|
city_names = PackedStringArray("Berlin", "Hamburg", "Munich", "Cologne", "Frankfurt", "Stuttgart", "Düsseldorf", "Leipzig", "Dortmund", "Essen")
|
||||||
|
metadata/_custom_type_script = "uid://bbrofteu1a30o"
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[gd_resource type="Resource" script_class="CivDescription" format=3]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://bbrofteu1a30o" path="res://data/civ_description.gd" id="1_ir01"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://biyhusoa6fuq" path="res://gfx/hud/flags/flag_iran.png" id="2_ir01"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_ir01")
|
||||||
|
name = "Iran"
|
||||||
|
primary_colour = Color(0.094118, 0.65098, 0.270588, 1)
|
||||||
|
accent_colour = Color(0.941176, 0.109804, 0.129412, 1)
|
||||||
|
flag = ExtResource("2_ir01")
|
||||||
|
city_names = PackedStringArray("Tehran", "Mashhad", "Isfahan", "Karaj", "Shiraz", "Tabriz", "Qom", "Ahvaz", "Kermanshah", "Urmia")
|
||||||
|
metadata/_custom_type_script = "uid://bbrofteu1a30o"
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[gd_resource type="Resource" script_class="CivDescription" format=3]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://bbrofteu1a30o" path="res://data/civ_description.gd" id="1_pl01"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://d0dubcdyyciw6" path="res://gfx/hud/flags/flag_poland.png" id="2_pl01"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_pl01")
|
||||||
|
name = "Poland"
|
||||||
|
primary_colour = Color(0.65098, 0, 0.043137, 1)
|
||||||
|
accent_colour = Color(1, 1, 1, 1)
|
||||||
|
flag = ExtResource("2_pl01")
|
||||||
|
city_names = PackedStringArray("Warsaw", "Kraków", "Łódź", "Wrocław", "Poznań", "Gdańsk", "Szczecin", "Bydgoszcz", "Lublin", "Katowice")
|
||||||
|
metadata/_custom_type_script = "uid://bbrofteu1a30o"
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[gd_resource type="Resource" script_class="CivDescription" format=3 uid="uid://c8sloven1axv"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://bbrofteu1a30o" path="res://data/civ_description.gd" id="1_slv01"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://calm4e82evox7" path="res://gfx/hud/flags/flag_slovenia.png" id="2_slv01"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_slv01")
|
||||||
|
name = "Slovenia"
|
||||||
|
primary_colour = Color(0, 0.364706, 0.643137, 1)
|
||||||
|
accent_colour = Color(0.929412, 0.109804, 0.141176, 1)
|
||||||
|
flag = ExtResource("2_slv01")
|
||||||
|
city_names = PackedStringArray("Maribor", "Celje", "Kranj", "Koper", "Velenje", "Novo Mesto", "Ptuj", "Kamnik", "Jesenice")
|
||||||
|
metadata/_custom_type_script = "uid://bbrofteu1a30o"
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[gd_resource type="Resource" script_class="CivDescription" format=3]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://bbrofteu1a30o" path="res://data/civ_description.gd" id="1_ch01"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://chcpw711rmj15" path="res://gfx/hud/flags/flag_switzerland.png" id="2_ch01"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_ch01")
|
||||||
|
name = "Switzerland"
|
||||||
|
primary_colour = Color(0.854902, 0.160784, 0.109804, 1)
|
||||||
|
accent_colour = Color(1, 1, 1, 1)
|
||||||
|
flag = ExtResource("2_ch01")
|
||||||
|
city_names = PackedStringArray("Bern", "Zürich", "Geneva", "Basel", "Lausanne", "Lucerne", "Winterthur", "St. Gallen", "Lugano", "Biel")
|
||||||
|
metadata/_custom_type_script = "uid://bbrofteu1a30o"
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[gd_resource type="Resource" script_class="CivDescription" format=3]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://bbrofteu1a30o" path="res://data/civ_description.gd" id="1_ti01"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://coh6nios70sku" path="res://gfx/hud/flags/flag_ticino.png" id="2_ti01"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_ti01")
|
||||||
|
name = "Ticino"
|
||||||
|
primary_colour = Color(0.27451, 0.27451, 0.878431, 1)
|
||||||
|
accent_colour = Color(0.65098, 0, 0.043137, 1)
|
||||||
|
flag = ExtResource("2_ti01")
|
||||||
|
city_names = PackedStringArray("Bellinzona", "Lugano", "Locarno", "Mendrisio", "Chiasso", "Airolo", "Biasca", "Ascona", "Faido", "Giubiasco")
|
||||||
|
metadata/_custom_type_script = "uid://bbrofteu1a30o"
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[gd_resource type="Resource" script_class="EconomyConfig" format=3 uid="uid://rb6vrlut8rdm"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://bm2pvegtcvgww" path="res://data/economy_config.gd" id="1_econ"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_econ")
|
||||||
|
base_gdp_per_capita = 10000
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
class_name EconomyConfig
|
||||||
|
|
||||||
|
extends Resource
|
||||||
|
|
||||||
|
## Tunable economic figures. The live values live in res://data/economy.tres
|
||||||
|
## and can be edited from the Godot inspector without touching any script.
|
||||||
|
|
||||||
|
## GDP produced per person on an ordinary owned tile.
|
||||||
|
@export var base_gdp_per_capita : int = 10000
|
||||||
|
|
||||||
|
## Number of people on an ordinary fully-populated tile. Each terrain type
|
||||||
|
## scales this by its population_multiplier (1.0 = ordinary land).
|
||||||
|
@export var base_population : int = 100000
|
||||||
|
|
||||||
|
## Owned tiles with a city on them produce this multiple of the base GDP per
|
||||||
|
## capita.
|
||||||
|
@export var city_tile_gdp_multiplier : float = 2.0
|
||||||
|
|
||||||
|
## Owned tiles with a capital city on them produce this multiple of the base
|
||||||
|
## GDP per capita instead of city_tile_gdp_multiplier.
|
||||||
|
@export var capital_tile_gdp_multiplier : float = 2.5
|
||||||
|
|
||||||
|
## Owned tiles immediately around one of your cities get this GDP per capita
|
||||||
|
## bonus (0.3 means +30%).
|
||||||
|
@export_range(0.0, 10.0) var city_surrounding_gdp_bonus : float = 0.3
|
||||||
|
|
||||||
|
## How much GDP is worth one production point. A nation's production capacity
|
||||||
|
## (production points per game hour) is its GDP divided by this value, and a
|
||||||
|
## unit's cost is measured in production points.
|
||||||
|
@export var gdp_per_production_point : int = 100000000
|
||||||
|
|
||||||
|
## Fraction of a nation's GDP added to its state budget every game hour
|
||||||
|
## (0.001 means +0.1% of GDP per hour). The economy runs once per in-game day,
|
||||||
|
## so each tick applies this rate over the whole day.
|
||||||
|
@export_range(0.0, 1.0) var budget_gdp_rate : float = 0.001
|
||||||
|
|
||||||
|
## State budget every civilization starts the game with.
|
||||||
|
@export var starting_budget : int = 0
|
||||||
|
|
||||||
|
## Base annual population growth applied to every populated tile (0.005 means
|
||||||
|
## +0.5% per in-game year). The economy runs once per in-game day, so growth is
|
||||||
|
## applied in one-day steps rather than jumping once a year.
|
||||||
|
@export_range(0.0, 1.0) var base_population_growth_rate : float = 0.005
|
||||||
|
|
||||||
|
|
||||||
|
## Growth factor over a step of `hours` in-game hours. Pass hours_per_year and
|
||||||
|
## the length of the step to scale annual growth to that step.
|
||||||
|
func population_growth_factor(hours_per_year: float, hours: float = 1.0) -> float:
|
||||||
|
if base_population_growth_rate <= 0.0 or hours_per_year <= 0.0 or hours <= 0.0:
|
||||||
|
return 0.0
|
||||||
|
return pow(1.0 + base_population_growth_rate, hours / hours_per_year) - 1.0
|
||||||
|
|
||||||
|
|
||||||
|
func production_capacity(gdp: float) -> float:
|
||||||
|
if gdp_per_production_point <= 0:
|
||||||
|
return 0.0
|
||||||
|
return gdp / float(gdp_per_production_point)
|
||||||
|
|
||||||
|
|
||||||
|
func training_hours(gdp: float, cost: int) -> float:
|
||||||
|
var capacity := production_capacity(gdp)
|
||||||
|
if capacity <= 0.0:
|
||||||
|
return 0.0
|
||||||
|
return float(cost) / capacity
|
||||||
|
|
||||||
|
|
||||||
|
## Budget added over a step of `hours` in-game hours at the hourly rate.
|
||||||
|
func budget_income(gdp: float, hours: float = 1.0) -> float:
|
||||||
|
return gdp * budget_gdp_rate * hours
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://bm2pvegtcvgww
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
class_name Government
|
||||||
|
|
||||||
|
extends Resource
|
||||||
|
|
||||||
|
## A form of government a civilisation can adopt. Concrete instances live under
|
||||||
|
## res://data/governments and are edited in the inspector.
|
||||||
|
##
|
||||||
|
## Unlike buildings, a government has no levels: adopting one replaces the
|
||||||
|
## previous one and applies its effects in full. Switching costs budget, priced
|
||||||
|
## like a building from a flat base plus a fraction of the owner's GDP, so it
|
||||||
|
## stays meaningful as the economy grows.
|
||||||
|
|
||||||
|
@export var name : String
|
||||||
|
@export_multiline var description : String
|
||||||
|
|
||||||
|
## Flat part of the cost to adopt this government, in budget currency.
|
||||||
|
@export var base_cost : float = 0.0
|
||||||
|
## Fraction of the owner's GDP added to the adoption cost.
|
||||||
|
@export var cost_gdp_fraction : float = 0.0
|
||||||
|
|
||||||
|
## Bonuses this government grants while in power. Effects are evaluated at
|
||||||
|
## level 1, the only level a government has. See BuildingEffect for the stats.
|
||||||
|
@export var effects : Array[BuildingEffect] = []
|
||||||
|
|
||||||
|
|
||||||
|
## Budget cost to switch to this government at the given national GDP.
|
||||||
|
func change_cost(gdp: float) -> float:
|
||||||
|
return base_cost + cost_gdp_fraction * maxf(gdp, 0.0)
|
||||||
|
|
||||||
|
|
||||||
|
## Total contribution to `stat` from every effect this government carries. All
|
||||||
|
## effects are evaluated at level 1, the only level a government has.
|
||||||
|
func effect_value(stat: String) -> float:
|
||||||
|
var total := 0.0
|
||||||
|
for effect in effects:
|
||||||
|
if effect.stat == stat:
|
||||||
|
total += effect.value_at(1)
|
||||||
|
return total
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://c5vv2vs1ugcv
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Government" format=3 uid="uid://bpupdoy0qg5p"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://c5vv2vs1ugcv" path="res://data/government.gd" id="1_gov"]
|
||||||
|
[ext_resource type="Script" uid="uid://c8lu7oofc64y" path="res://data/building_effect.gd" id="2_be"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_monarchy_gdp"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "gdp"
|
||||||
|
base_value = 0.1
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_monarchy_culture"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "culture"
|
||||||
|
base_value = 1.0
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_gov")
|
||||||
|
name = "Monarchy"
|
||||||
|
description = "Rule by a hereditary sovereign. The crown favours commerce and tradition, lifting the economy and the nation's cultural output."
|
||||||
|
cost_gdp_fraction = 0.03
|
||||||
|
effects = Array[ExtResource("2_be")]([SubResource("Effect_monarchy_gdp"), SubResource("Effect_monarchy_culture")])
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Government" format=3 uid="uid://df6vqrc1yiepv"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://c5vv2vs1ugcv" path="res://data/government.gd" id="1_gov"]
|
||||||
|
[ext_resource type="Script" uid="uid://c8lu7oofc64y" path="res://data/building_effect.gd" id="2_be"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_republic_gdp"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "gdp"
|
||||||
|
base_value = 0.05
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_republic_income"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "budget_income"
|
||||||
|
base_value = 0.1
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_republic_research"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "research"
|
||||||
|
base_value = 1.0
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_gov")
|
||||||
|
name = "Republic"
|
||||||
|
description = "Rule by elected representatives. A balanced government that spreads its support across the economy, the treasury and the sciences."
|
||||||
|
cost_gdp_fraction = 0.02
|
||||||
|
effects = Array[ExtResource("2_be")]([SubResource("Effect_republic_gdp"), SubResource("Effect_republic_income"), SubResource("Effect_republic_research")])
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Government" format=3 uid="uid://ldjjnm1wgx20"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://c5vv2vs1ugcv" path="res://data/government.gd" id="1_gov"]
|
||||||
|
[ext_resource type="Script" uid="uid://c8lu7oofc64y" path="res://data/building_effect.gd" id="2_be"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_technocracy_research"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "research"
|
||||||
|
base_value = 3.0
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_technocracy_gdp"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "gdp"
|
||||||
|
base_value = 0.03
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_gov")
|
||||||
|
name = "Technocracy"
|
||||||
|
description = "Rule by technical experts. A single-minded drive for progress pours resources into research while economic growth takes second place."
|
||||||
|
cost_gdp_fraction = 0.04
|
||||||
|
effects = Array[ExtResource("2_be")]([SubResource("Effect_technocracy_research"), SubResource("Effect_technocracy_gdp")])
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
[gd_resource type="Resource" script_class="MapGenerationConfig" format=3 uid="uid://2gapygilj0of"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://dxn6ig8hfgep1" path="res://data/map_generation_config.gd" id="1_mapgen"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_mapgen")
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
class_name MapGenerationConfig
|
||||||
|
|
||||||
|
extends Resource
|
||||||
|
|
||||||
|
## Tunable parameters for the procedurally generated world map. The live
|
||||||
|
## values live in res://data/map_generation.tres and can be edited from the
|
||||||
|
## Godot inspector without touching any script.
|
||||||
|
|
||||||
|
## Map size in tiles. Tiles are generated around the origin, so a size of
|
||||||
|
## (27, 16) spans x = -13..13 and y = -8..7.
|
||||||
|
## A cylindrical map should use an even width so the wrapped rows line up.
|
||||||
|
@export var map_size : Vector2i = Vector2i(64, 40)
|
||||||
|
|
||||||
|
## How the map edges connect. FLAT is an open rectangle; CYLINDRICAL joins the
|
||||||
|
## east and west edges together so the world wraps around like the surface of
|
||||||
|
## a cylinder.
|
||||||
|
enum Topology { FLAT, CYLINDRICAL }
|
||||||
|
@export var topology : Topology = Topology.CYLINDRICAL
|
||||||
|
|
||||||
|
## Seed for the terrain noise. 0 uses a fresh random seed on every run.
|
||||||
|
@export var terrain_seed : int = 0
|
||||||
|
|
||||||
|
@export_group("Terrain")
|
||||||
|
## Noise value at or above which a tile becomes land.
|
||||||
|
@export_range(-1.0, 1.0) var sea_level : float = -0.2
|
||||||
|
|
||||||
|
## Push the map edges towards ocean so the playable land is an island.
|
||||||
|
@export var falloff_enabled : bool = true
|
||||||
|
## Normalised distance from the map centre where the falloff starts.
|
||||||
|
@export_range(0.0, 1.5) var falloff_start : float = 0.55
|
||||||
|
## How far the falloff lowers the noise at the map edges.
|
||||||
|
@export_range(0.0, 2.0) var falloff_strength : float = 0.6
|
||||||
|
|
||||||
|
## Distance from the equator, as a fraction of half the map height, beyond
|
||||||
|
## which every tile is replaced by the tileset's ice terrain. 0.9 freezes only
|
||||||
|
## the last few rows at each pole.
|
||||||
|
@export_range(0.0, 1.0) var ice_latitude : float = 0.9
|
||||||
|
|
||||||
|
@export_group("Noise")
|
||||||
|
@export var noise_type : FastNoiseLite.NoiseType = FastNoiseLite.TYPE_SIMPLEX_SMOOTH
|
||||||
|
@export_range(0.0001, 1.0, 0.0001) var frequency : float = 0.06
|
||||||
|
@export var fractal_type : FastNoiseLite.FractalType = FastNoiseLite.FRACTAL_FBM
|
||||||
|
@export_range(1, 8) var octaves : int = 4
|
||||||
|
@export_range(1.0, 4.0) var lacunarity : float = 2.0
|
||||||
|
@export_range(0.0, 1.0) var gain : float = 0.5
|
||||||
|
@export_range(0.0, 1.0) var fractal_weighted_strength : float = 0.0
|
||||||
|
@export var cellular_distance_function : FastNoiseLite.CellularDistanceFunction = FastNoiseLite.DISTANCE_EUCLIDEAN
|
||||||
|
@export var cellular_return_type : FastNoiseLite.CellularReturnType = FastNoiseLite.RETURN_DISTANCE
|
||||||
|
@export_range(0.0, 2.0) var cellular_jitter : float = 1.0
|
||||||
|
@export var domain_warp_enabled : bool = false
|
||||||
|
@export_range(0.0, 100.0) var domain_warp_amplitude : float = 30.0
|
||||||
|
@export_range(0.0, 1.0) var domain_warp_frequency : float = 0.05
|
||||||
|
@export var domain_warp_fractal_type : FastNoiseLite.DomainWarpFractalType = FastNoiseLite.DOMAIN_WARP_FRACTAL_PROGRESSIVE
|
||||||
|
|
||||||
|
@export_group("Capitals")
|
||||||
|
## Minimum number of tiles a capital is kept away from the map edge.
|
||||||
|
@export var capital_margin : int = 2
|
||||||
|
## Minimum distance (in tiles) between two capitals. If the land cannot
|
||||||
|
## satisfy this for every civilisation, the closest remaining sites are used.
|
||||||
|
@export_range(0.0, 64.0) var min_capital_distance : float = 8.0
|
||||||
|
## Capitals only spawn on land masses of at least this many tiles, so they
|
||||||
|
## never end up stranded on tiny islands. Falls back to the largest land mass
|
||||||
|
## when none reaches the threshold.
|
||||||
|
@export var min_capital_landmass : int = 40
|
||||||
|
|
||||||
|
@export_group("Cities")
|
||||||
|
## Number of cities each starting civilisation founds, including its capital.
|
||||||
|
@export var cities_per_civ : int = 10
|
||||||
|
## Minimum distance (in tiles) kept between the centres of any two cities.
|
||||||
|
@export var city_spacing : int = 8
|
||||||
|
|
||||||
|
@export_group("Tiles")
|
||||||
|
@export var tile_source_id : int = 5
|
||||||
|
@export var land_atlas_coords : Vector2i = Vector2i(3, 0)
|
||||||
|
@export var sea_atlas_coords : Vector2i = Vector2i(5, 0)
|
||||||
|
|
||||||
|
|
||||||
|
func is_cylindrical() -> bool:
|
||||||
|
return topology == Topology.CYLINDRICAL
|
||||||
|
|
||||||
|
|
||||||
|
func make_topology() -> MapTopology:
|
||||||
|
var topology_type := MapTopology.Type.CYLINDRICAL if is_cylindrical() else MapTopology.Type.FLAT
|
||||||
|
return MapTopology.new(map_size, topology_type)
|
||||||
|
|
||||||
|
|
||||||
|
func create_noise(seed_value: int) -> FastNoiseLite:
|
||||||
|
var noise := FastNoiseLite.new()
|
||||||
|
noise.seed = seed_value
|
||||||
|
noise.noise_type = noise_type
|
||||||
|
noise.frequency = frequency
|
||||||
|
noise.fractal_type = fractal_type
|
||||||
|
noise.fractal_octaves = octaves
|
||||||
|
noise.fractal_lacunarity = lacunarity
|
||||||
|
noise.fractal_gain = gain
|
||||||
|
noise.fractal_weighted_strength = fractal_weighted_strength
|
||||||
|
noise.cellular_distance_function = cellular_distance_function
|
||||||
|
noise.cellular_return_type = cellular_return_type
|
||||||
|
noise.cellular_jitter = cellular_jitter
|
||||||
|
noise.domain_warp_enabled = domain_warp_enabled
|
||||||
|
noise.domain_warp_amplitude = domain_warp_amplitude
|
||||||
|
noise.domain_warp_frequency = domain_warp_frequency
|
||||||
|
noise.domain_warp_fractal_type = domain_warp_fractal_type
|
||||||
|
return noise
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://dxn6ig8hfgep1
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
class_name ProtoBuilding
|
||||||
|
|
||||||
|
extends Resource
|
||||||
|
|
||||||
|
## Template for a city building. Concrete instances live under
|
||||||
|
## res://data/buildings and are edited in the inspector.
|
||||||
|
##
|
||||||
|
## Unlike Civilisation's one-off buildings, these can be levelled up and down.
|
||||||
|
## The build cost and the upkeep grow exponentially with the level (alpha^level)
|
||||||
|
## while the effects grow linearly or sublinear (see BuildingEffect), so pushing
|
||||||
|
## a building too high yields diminishing returns for an accelerating bill.
|
||||||
|
##
|
||||||
|
## The build cost is based on the owner's GDP: a flat base_cost plus a fraction
|
||||||
|
## of GDP, both multiplied by cost_alpha^level, so it stays meaningful as the
|
||||||
|
## economy grows.
|
||||||
|
|
||||||
|
## Effect stat keys consumed by GameState.
|
||||||
|
const EFFECT_GDP := "gdp"
|
||||||
|
const EFFECT_RESEARCH := "research"
|
||||||
|
const EFFECT_CULTURE := "culture"
|
||||||
|
const EFFECT_BUDGET_INCOME := "budget_income"
|
||||||
|
|
||||||
|
@export var name : String
|
||||||
|
@export_multiline var description : String
|
||||||
|
|
||||||
|
## Levels the building can reach; 0 means "not built".
|
||||||
|
@export var max_level : int = 10
|
||||||
|
|
||||||
|
## Flat part of the build cost, in budget currency.
|
||||||
|
@export var base_cost : float = 0.0
|
||||||
|
## Fraction of the owner's GDP added to the build cost.
|
||||||
|
@export var cost_gdp_fraction : float = 0.0
|
||||||
|
## Exponential cost growth per level (alpha in alpha^level).
|
||||||
|
@export_range(1.0, 5.0) var cost_alpha : float = 1.5
|
||||||
|
|
||||||
|
## Flat part of the hourly upkeep, in budget currency.
|
||||||
|
@export var base_upkeep : float = 0.0
|
||||||
|
## Fraction of the owner's GDP charged as hourly upkeep.
|
||||||
|
@export var upkeep_gdp_fraction : float = 0.0
|
||||||
|
## Exponential upkeep growth per level (alpha in alpha^level).
|
||||||
|
@export_range(1.0, 5.0) var upkeep_alpha : float = 1.5
|
||||||
|
|
||||||
|
## Fraction of the removed level's build cost refunded when downgrading.
|
||||||
|
@export_range(0.0, 1.0) var refund_fraction : float = 0.5
|
||||||
|
|
||||||
|
@export var effects : Array[BuildingEffect] = []
|
||||||
|
|
||||||
|
|
||||||
|
## Budget cost to raise the building from `level` to `level + 1`.
|
||||||
|
func build_cost(gdp: float, level: int) -> float:
|
||||||
|
return (base_cost + cost_gdp_fraction * maxf(gdp, 0.0)) * pow(cost_alpha, float(maxi(level, 0)))
|
||||||
|
|
||||||
|
|
||||||
|
## Budget refunded when lowering the building from `level` to `level - 1`.
|
||||||
|
func refund(gdp: float, level: int) -> float:
|
||||||
|
return build_cost(gdp, level - 1) * refund_fraction
|
||||||
|
|
||||||
|
|
||||||
|
## Budget upkeep per game hour while the building sits at `level`.
|
||||||
|
func upkeep(gdp: float, level: int) -> float:
|
||||||
|
if level <= 0:
|
||||||
|
return 0.0
|
||||||
|
var base := base_upkeep + upkeep_gdp_fraction * maxf(gdp, 0.0)
|
||||||
|
return base * pow(upkeep_alpha, float(level))
|
||||||
|
|
||||||
|
|
||||||
|
## Total contribution to `stat` at `level`, summed over every effect that feeds
|
||||||
|
## it. Returns 0.0 for an unknown stat or an unbuilt building.
|
||||||
|
func effect_value(stat: String, level: int) -> float:
|
||||||
|
var total := 0.0
|
||||||
|
for effect in effects:
|
||||||
|
if effect.stat == stat:
|
||||||
|
total += effect.value_at(level)
|
||||||
|
return total
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://c0u6ish14ncb2
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
class_name ProtoUnit
|
||||||
|
|
||||||
|
extends Resource
|
||||||
|
|
||||||
|
## Template for a unit type. Concrete instances live under res://data/units.
|
||||||
|
## Units spawned from the same template share these values but track their own
|
||||||
|
## current HP and position.
|
||||||
|
|
||||||
|
@export var name : String
|
||||||
|
@export var max_hp : int = 100
|
||||||
|
## Production points needed to train the unit.
|
||||||
|
@export var cost : int = 0
|
||||||
|
## Production points consumed per game hour while the unit exists.
|
||||||
|
@export var upkeep : int = 0
|
||||||
|
@export var moveable : bool = true
|
||||||
|
## Tiles travelled per game hour.
|
||||||
|
@export var speed : float = 0.5
|
||||||
|
@export var traversable_terrains : PackedStringArray = PackedStringArray()
|
||||||
|
@export var sprites : SpriteFrames
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://q2yr30ge5hl3
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Technology" format=3]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://data/technology.gd" id="1_tech"]
|
||||||
|
[ext_resource type="Script" path="res://data/building_effect.gd" id="2_be"]
|
||||||
|
[ext_resource type="Resource" path="res://data/technologies/scientific_method.tres" id="3_prev"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_automation_gdp"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "gdp"
|
||||||
|
base_value = 0.08
|
||||||
|
exponent = 1.0
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_tech")
|
||||||
|
name = "Industrial Automation"
|
||||||
|
description = "Robotics and control systems take over the factory floor, lifting national output."
|
||||||
|
cost = 60.0
|
||||||
|
prerequisites = Array[Technology]([ExtResource("3_prev")])
|
||||||
|
effects = Array[BuildingEffect]([SubResource("Effect_automation_gdp")])
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Technology" format=3]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://data/technology.gd" id="1_tech"]
|
||||||
|
[ext_resource type="Script" path="res://data/building_effect.gd" id="2_be"]
|
||||||
|
[ext_resource type="Resource" path="res://data/technologies/scientific_method.tres" id="3_prev"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_quantum_research"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "research"
|
||||||
|
base_value = 4.0
|
||||||
|
exponent = 1.0
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_tech")
|
||||||
|
name = "Quantum Computing"
|
||||||
|
description = "Machines that reason in superposition. A step change in the pace of discovery."
|
||||||
|
cost = 120.0
|
||||||
|
prerequisites = Array[Technology]([ExtResource("3_prev")])
|
||||||
|
effects = Array[BuildingEffect]([SubResource("Effect_quantum_research")])
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Technology" format=3]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://data/technology.gd" id="1_tech"]
|
||||||
|
[ext_resource type="Script" path="res://data/building_effect.gd" id="2_be"]
|
||||||
|
[ext_resource type="Resource" path="res://data/technologies/scientific_method.tres" id="3_prev"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_renewable_gdp"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "gdp"
|
||||||
|
base_value = 0.03
|
||||||
|
exponent = 1.0
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_renewable_income"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "budget_income"
|
||||||
|
base_value = 0.05
|
||||||
|
exponent = 1.0
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_tech")
|
||||||
|
name = "Renewable Energy"
|
||||||
|
description = "Clean generation cuts waste and strengthens the public finances."
|
||||||
|
cost = 80.0
|
||||||
|
prerequisites = Array[Technology]([ExtResource("3_prev")])
|
||||||
|
effects = Array[BuildingEffect]([SubResource("Effect_renewable_gdp"), SubResource("Effect_renewable_income")])
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Technology" format=3]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://data/technology.gd" id="1_tech"]
|
||||||
|
[ext_resource type="Script" path="res://data/building_effect.gd" id="2_be"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_method_research"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "research"
|
||||||
|
base_value = 1.0
|
||||||
|
exponent = 1.0
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_method_gdp"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "gdp"
|
||||||
|
base_value = 0.02
|
||||||
|
exponent = 1.0
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_tech")
|
||||||
|
name = "Scientific Method"
|
||||||
|
description = "A disciplined approach to experiment and evidence. Lays the groundwork for every later technology."
|
||||||
|
cost = 20.0
|
||||||
|
effects = Array[BuildingEffect]([SubResource("Effect_method_research"), SubResource("Effect_method_gdp")])
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Technology" format=3]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://data/technology.gd" id="1_tech"]
|
||||||
|
[ext_resource type="Script" path="res://data/building_effect.gd" id="2_be"]
|
||||||
|
[ext_resource type="Resource" path="res://data/technologies/industrial_automation.tres" id="3_prev_a"]
|
||||||
|
[ext_resource type="Resource" path="res://data/technologies/quantum_computing.tres" id="4_prev_b"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_space_culture"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "culture"
|
||||||
|
base_value = 3.0
|
||||||
|
exponent = 1.0
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Effect_space_gdp"]
|
||||||
|
script = ExtResource("2_be")
|
||||||
|
stat = "gdp"
|
||||||
|
base_value = 0.05
|
||||||
|
exponent = 1.0
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_tech")
|
||||||
|
name = "Space Program"
|
||||||
|
description = "Reaching orbit inspires the nation and spins off technology across the economy."
|
||||||
|
cost = 300.0
|
||||||
|
prerequisites = Array[Technology]([ExtResource("3_prev_a"), ExtResource("4_prev_b")])
|
||||||
|
effects = Array[BuildingEffect]([SubResource("Effect_space_culture"), SubResource("Effect_space_gdp")])
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
class_name Technology
|
||||||
|
|
||||||
|
extends Resource
|
||||||
|
|
||||||
|
## A technology a civilisation can unlock by spending accumulated research
|
||||||
|
## points. Concrete instances live under res://data/technologies and are edited
|
||||||
|
## in the inspector.
|
||||||
|
##
|
||||||
|
## Technologies form a tree through `prerequisites`: a technology can only be
|
||||||
|
## researched once every prerequisite is already known. A technology has no
|
||||||
|
## levels and applies its effects in full as soon as it is researched.
|
||||||
|
|
||||||
|
@export var name : String
|
||||||
|
@export_multiline var description : String
|
||||||
|
|
||||||
|
## Research points needed to unlock this technology.
|
||||||
|
@export var cost : float = 0.0
|
||||||
|
|
||||||
|
## Technologies that must be researched first. Compared by resource path, so
|
||||||
|
## resources loaded independently still match.
|
||||||
|
@export var prerequisites : Array[Technology] = []
|
||||||
|
|
||||||
|
## Bonuses this technology grants once researched. Effects are evaluated at
|
||||||
|
## level 1, the only level a technology has. See BuildingEffect for the stats.
|
||||||
|
@export var effects : Array[BuildingEffect] = []
|
||||||
|
|
||||||
|
|
||||||
|
## Total contribution to `stat` from every effect this technology carries.
|
||||||
|
func effect_value(stat: String) -> float:
|
||||||
|
var total := 0.0
|
||||||
|
for effect in effects:
|
||||||
|
if effect.stat == stat:
|
||||||
|
total += effect.value_at(1)
|
||||||
|
return total
|
||||||
|
|
||||||
|
|
||||||
|
## Position of this technology within a catalogue, matched by resource path
|
||||||
|
## first so independently loaded instances still resolve. Returns -1 when the
|
||||||
|
## technology is not in the catalogue.
|
||||||
|
func catalogue_index(catalogue: Array) -> int:
|
||||||
|
for i in catalogue.size():
|
||||||
|
var candidate: Variant = catalogue[i]
|
||||||
|
if candidate == self:
|
||||||
|
return i
|
||||||
|
if candidate is Technology and not resource_path.is_empty() \
|
||||||
|
and (candidate as Technology).resource_path == resource_path:
|
||||||
|
return i
|
||||||
|
return -1
|
||||||
|
|
||||||
|
|
||||||
|
## True when every prerequisite appears in `researched`, a set of catalogue
|
||||||
|
## indices. Always true when there are no prerequisites.
|
||||||
|
func prerequisites_met(catalogue: Array, researched: Dictionary) -> bool:
|
||||||
|
for prerequisite in prerequisites:
|
||||||
|
var index := prerequisite.catalogue_index(catalogue)
|
||||||
|
if index < 0 or not researched.has(index):
|
||||||
|
return false
|
||||||
|
return true
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://bdx56cwdgtj2l
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
[gd_resource type="Resource" script_class="ProtoUnit" format=3 uid="uid://b2l3y5q7vbixw"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://q2yr30ge5hl3" path="res://data/proto_unit.gd" id="1_f3bk2"]
|
||||||
|
[ext_resource type="SpriteFrames" uid="uid://cwm6lopvum8y3" path="res://gfx/sprites/modern_infantry_sprite_frames.tres" id="2_03dfi"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_f3bk2")
|
||||||
|
name = "Modern infantry"
|
||||||
|
max_hp = 500
|
||||||
|
cost = 500000
|
||||||
|
upkeep = 50000000
|
||||||
|
traversable_terrains = PackedStringArray("Land")
|
||||||
|
sprites = ExtResource("2_03dfi")
|
||||||
|
metadata/_custom_type_script = "uid://q2yr30ge5hl3"
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
[gd_resource type="Resource" script_class="ProtoUnit" format=3 uid="uid://c11ktkedjkxyk"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://q2yr30ge5hl3" path="res://data/proto_unit.gd" id="1_r1qvx"]
|
||||||
|
[ext_resource type="SpriteFrames" uid="uid://vpl03bqsaio2" path="res://gfx/sprites/worker_sprite_frames.tres" id="2_suh4m"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_r1qvx")
|
||||||
|
name = "Worker"
|
||||||
|
traversable_terrains = PackedStringArray("Land")
|
||||||
|
sprites = ExtResource("2_suh4m")
|
||||||
|
metadata/_custom_type_script = "uid://q2yr30ge5hl3"
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
[preset.0]
|
||||||
|
|
||||||
|
name="Web"
|
||||||
|
platform="Web"
|
||||||
|
runnable=true
|
||||||
|
dedicated_server=false
|
||||||
|
custom_features=""
|
||||||
|
export_filter="all_resources"
|
||||||
|
include_filter=""
|
||||||
|
exclude_filter=""
|
||||||
|
export_path="exportsw/Battle for 'Tismo.html"
|
||||||
|
patches=PackedStringArray()
|
||||||
|
patch_delta_encoding=false
|
||||||
|
patch_delta_compression_level_zstd=19
|
||||||
|
patch_delta_min_reduction=0.1
|
||||||
|
patch_delta_include_filters="*"
|
||||||
|
patch_delta_exclude_filters=""
|
||||||
|
encryption_include_filters=""
|
||||||
|
encryption_exclude_filters=""
|
||||||
|
seed=0
|
||||||
|
encrypt_pck=false
|
||||||
|
encrypt_directory=false
|
||||||
|
script_export_mode=2
|
||||||
|
|
||||||
|
[preset.0.options]
|
||||||
|
|
||||||
|
custom_template/debug=""
|
||||||
|
custom_template/release=""
|
||||||
|
variant/extensions_support=false
|
||||||
|
variant/thread_support=false
|
||||||
|
vram_texture_compression/for_desktop=true
|
||||||
|
vram_texture_compression/for_mobile=false
|
||||||
|
html/export_icon=true
|
||||||
|
html/custom_html_shell=""
|
||||||
|
html/head_include=""
|
||||||
|
html/canvas_resize_policy=2
|
||||||
|
html/focus_canvas_on_start=true
|
||||||
|
html/experimental_virtual_keyboard=false
|
||||||
|
progressive_web_app/enabled=false
|
||||||
|
progressive_web_app/ensure_cross_origin_isolation_headers=true
|
||||||
|
progressive_web_app/offline_page=""
|
||||||
|
progressive_web_app/display=1
|
||||||
|
progressive_web_app/orientation=0
|
||||||
|
progressive_web_app/icon_144x144=""
|
||||||
|
progressive_web_app/icon_180x180=""
|
||||||
|
progressive_web_app/icon_512x512=""
|
||||||
|
progressive_web_app/background_color=Color(0, 0, 0, 1)
|
||||||
|
threads/emscripten_pool_size=8
|
||||||
|
threads/godot_pool_size=4
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1789344334,
|
||||||
|
"narHash": "sha256-vdhpDJ3Lr24lkZ+fDCjmBRRtw9/vcSzkqGJOJyF5h2U=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "c3eea5b2156db11c7eeeada3dc737711255b253e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-26.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
description = "Battle for 'Tismo — dedicated server and web client";
|
||||||
|
|
||||||
|
# Must provide Godot 4.6 and matching export templates. nixos-26.05 does.
|
||||||
|
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05";
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{ self, nixpkgs }:
|
||||||
|
let
|
||||||
|
systems = [
|
||||||
|
"x86_64-linux"
|
||||||
|
"aarch64-linux"
|
||||||
|
];
|
||||||
|
in
|
||||||
|
{
|
||||||
|
packages = nixpkgs.lib.genAttrs systems (
|
||||||
|
system:
|
||||||
|
let
|
||||||
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
built = pkgs.callPackage ./nix/package.nix { };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
inherit (built) server web;
|
||||||
|
default = built.server;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
nixosModules.default = import ./nix/module.nix;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="font_data_dynamic"
|
||||||
|
type="FontFile"
|
||||||
|
uid="uid://dcuuinu88yl86"
|
||||||
|
path="res://.godot/imported/USSR STENCIL WEBFONT.ttf-00585b05d441d3a44d1aa09c746b87be.fontdata"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://fonts/USSR STENCIL WEBFONT.ttf"
|
||||||
|
dest_files=["res://.godot/imported/USSR STENCIL WEBFONT.ttf-00585b05d441d3a44d1aa09c746b87be.fontdata"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
Rendering=null
|
||||||
|
antialiasing=1
|
||||||
|
generate_mipmaps=false
|
||||||
|
disable_embedded_bitmaps=true
|
||||||
|
multichannel_signed_distance_field=false
|
||||||
|
msdf_pixel_range=8
|
||||||
|
msdf_size=48
|
||||||
|
allow_system_fallback=true
|
||||||
|
force_autohinter=false
|
||||||
|
modulate_color_glyphs=false
|
||||||
|
hinting=1
|
||||||
|
subpixel_positioning=4
|
||||||
|
keep_rounding_remainders=true
|
||||||
|
oversampling=0.0
|
||||||
|
Fallbacks=null
|
||||||
|
fallbacks=[]
|
||||||
|
Compress=null
|
||||||
|
compress=true
|
||||||
|
preload=[]
|
||||||
|
language_support={}
|
||||||
|
script_support={}
|
||||||
|
opentype_features={}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="font_data_dynamic"
|
||||||
|
type="FontFile"
|
||||||
|
uid="uid://bjpoddqqagwlx"
|
||||||
|
path="res://.godot/imported/USSR STENCIL.otf-63597cdc1b23ccebac932a3c70452844.fontdata"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://fonts/USSR STENCIL.otf"
|
||||||
|
dest_files=["res://.godot/imported/USSR STENCIL.otf-63597cdc1b23ccebac932a3c70452844.fontdata"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
Rendering=null
|
||||||
|
antialiasing=1
|
||||||
|
generate_mipmaps=false
|
||||||
|
disable_embedded_bitmaps=true
|
||||||
|
multichannel_signed_distance_field=false
|
||||||
|
msdf_pixel_range=8
|
||||||
|
msdf_size=48
|
||||||
|
allow_system_fallback=true
|
||||||
|
force_autohinter=false
|
||||||
|
modulate_color_glyphs=false
|
||||||
|
hinting=1
|
||||||
|
subpixel_positioning=4
|
||||||
|
keep_rounding_remainders=true
|
||||||
|
oversampling=0.0
|
||||||
|
Fallbacks=null
|
||||||
|
fallbacks=[]
|
||||||
|
Compress=null
|
||||||
|
compress=true
|
||||||
|
preload=[]
|
||||||
|
language_support={}
|
||||||
|
script_support={}
|
||||||
|
opentype_features={}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="font_data_dynamic"
|
||||||
|
type="FontFile"
|
||||||
|
uid="uid://c58ly4g14o802"
|
||||||
|
path="res://.godot/imported/TitanOne-Regular.ttf-9cdbf1e26e32de0beec39866072264ff.fontdata"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://fonts/titan_one/TitanOne-Regular.ttf"
|
||||||
|
dest_files=["res://.godot/imported/TitanOne-Regular.ttf-9cdbf1e26e32de0beec39866072264ff.fontdata"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
Rendering=null
|
||||||
|
antialiasing=1
|
||||||
|
generate_mipmaps=false
|
||||||
|
disable_embedded_bitmaps=true
|
||||||
|
multichannel_signed_distance_field=false
|
||||||
|
msdf_pixel_range=8
|
||||||
|
msdf_size=48
|
||||||
|
allow_system_fallback=true
|
||||||
|
force_autohinter=false
|
||||||
|
modulate_color_glyphs=false
|
||||||
|
hinting=1
|
||||||
|
subpixel_positioning=4
|
||||||
|
keep_rounding_remainders=true
|
||||||
|
oversampling=0.0
|
||||||
|
Fallbacks=null
|
||||||
|
fallbacks=[]
|
||||||
|
Compress=null
|
||||||
|
compress=true
|
||||||
|
preload=[]
|
||||||
|
language_support={}
|
||||||
|
script_support={}
|
||||||
|
opentype_features={}
|
||||||
|
After Width: | Height: | Size: 753 B |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://dwn3htawrebrs"
|
||||||
|
path="res://.godot/imported/hex-borders.png-fd13eb4a3e596c7f6971eccf0b95bfdb.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hex-borders.png"
|
||||||
|
dest_files=["res://.godot/imported/hex-borders.png-fd13eb4a3e596c7f6971eccf0b95bfdb.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://dy05p4taw2grt"
|
||||||
|
path="res://.godot/imported/coat_of_arms_mask.png-20bfc00212ab4df91abccadc870cd983.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/coat_of_arms_mask.png"
|
||||||
|
dest_files=["res://.godot/imported/coat_of_arms_mask.png-20bfc00212ab4df91abccadc870cd983.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://bqhfv0surkp5h"
|
||||||
|
path="res://.godot/imported/coat_of_arms_outline.png-ae9ce9a4a48544bb9677a2d9931ffe4b.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/coat_of_arms_outline.png"
|
||||||
|
dest_files=["res://.godot/imported/coat_of_arms_outline.png-ae9ce9a4a48544bb9677a2d9931ffe4b.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 5.7 KiB |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://bfaw5xu3t3sfl"
|
||||||
|
path="res://.godot/imported/coat_of_arms_texture.png-e7e5ebfcc69289d5abb72b781d38f7d7.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/flags/coat_of_arms_texture.png"
|
||||||
|
dest_files=["res://.godot/imported/coat_of_arms_texture.png-e7e5ebfcc69289d5abb72b781d38f7d7.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://io753v4cud2c"
|
||||||
|
path="res://.godot/imported/flag_britain.png-a71e25a81e0c9fb4940bd04658ca0737.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/flags/flag_britain.png"
|
||||||
|
dest_files=["res://.godot/imported/flag_britain.png-a71e25a81e0c9fb4940bd04658ca0737.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 406 B |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://bsuer7fwcs6py"
|
||||||
|
path="res://.godot/imported/flag_france.png-97c9d58634cc98f8b172afb7d0f7dafd.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/flags/flag_france.png"
|
||||||
|
dest_files=["res://.godot/imported/flag_france.png-97c9d58634cc98f8b172afb7d0f7dafd.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 5.4 KiB |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://co0ufd01torfw"
|
||||||
|
path="res://.godot/imported/flag_galicia.png-15ccf0de97f65db2565cc578f37d37f0.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/flags/flag_galicia.png"
|
||||||
|
dest_files=["res://.godot/imported/flag_galicia.png-15ccf0de97f65db2565cc578f37d37f0.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 649 B |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://bga6kymgrsbra"
|
||||||
|
path="res://.godot/imported/flag_germany.png-26b43d47962e77919d8682aa2c8f4b16.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/flags/flag_germany.png"
|
||||||
|
dest_files=["res://.godot/imported/flag_germany.png-26b43d47962e77919d8682aa2c8f4b16.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 6.3 KiB |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://biyhusoa6fuq"
|
||||||
|
path="res://.godot/imported/flag_iran.png-511de2e13debe7f7726a650592531c9e.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/flags/flag_iran.png"
|
||||||
|
dest_files=["res://.godot/imported/flag_iran.png-511de2e13debe7f7726a650592531c9e.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 591 B |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://d0dubcdyyciw6"
|
||||||
|
path="res://.godot/imported/flag_poland.png-5f8d8b58f6cca6e4d90c91bbe9e9ccb4.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/flags/flag_poland.png"
|
||||||
|
dest_files=["res://.godot/imported/flag_poland.png-5f8d8b58f6cca6e4d90c91bbe9e9ccb4.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 3.2 KiB |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://calm4e82evox7"
|
||||||
|
path="res://.godot/imported/flag_slovenia.png-db06ccb1a42d505aa8b61dd9d869b95d.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/flags/flag_slovenia.png"
|
||||||
|
dest_files=["res://.godot/imported/flag_slovenia.png-db06ccb1a42d505aa8b61dd9d869b95d.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 758 B |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://chcpw711rmj15"
|
||||||
|
path="res://.godot/imported/flag_switzerland.png-69e7e8a640ae6d434309dadb4549181f.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/flags/flag_switzerland.png"
|
||||||
|
dest_files=["res://.godot/imported/flag_switzerland.png-69e7e8a640ae6d434309dadb4549181f.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 594 B |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://coh6nios70sku"
|
||||||
|
path="res://.godot/imported/flag_ticino.png-b64b54ff2aab0a41a0c75851d80cb611.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/flags/flag_ticino.png"
|
||||||
|
dest_files=["res://.godot/imported/flag_ticino.png-b64b54ff2aab0a41a0c75851d80cb611.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://ddkiua2iikwb6"
|
||||||
|
path="res://.godot/imported/health_bar.png-14f15693797318c2af27326f454fb0cc.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/health_bar.png"
|
||||||
|
dest_files=["res://.godot/imported/health_bar.png-14f15693797318c2af27326f454fb0cc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 775 B |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://ccdtf7f2mmum6"
|
||||||
|
path="res://.godot/imported/health_bar_under.png-69f1e2f58da89a5ccacf5291030a16fe.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/health_bar_under.png"
|
||||||
|
dest_files=["res://.godot/imported/health_bar_under.png-69f1e2f58da89a5ccacf5291030a16fe.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
After Width: | Height: | Size: 2.8 KiB |
@@ -0,0 +1,40 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://bvq2ol6nhfhs8"
|
||||||
|
path="res://.godot/imported/hex-select-info.png-efcfd85c08c8e248468978dd63832cd1.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://gfx/hud/hex-select-info.png"
|
||||||
|
dest_files=["res://.godot/imported/hex-select-info.png-efcfd85c08c8e248468978dd63832cd1.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||