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.
This commit is contained in:
2026-09-15 14:48:34 +02:00
commit c49899a2fd
310 changed files with 15158 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
root = true
[*]
charset = utf-8
+2
View File
@@ -0,0 +1,2 @@
# Normalize EOL for all files that Git considers text files.
* text=auto eol=lf
+11
View File
@@ -0,0 +1,11 @@
# Godot 4+ specific ignores
.godot/
/android/
# Build artifacts
/exportsw/
/result
/result-*
# Nix / direnv
/.direnv/
+38
View File
@@ -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.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

+40
View File
@@ -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
+23
View File
@@ -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)
+1
View File
@@ -0,0 +1 @@
uid://c8lu7oofc64y
+20
View File
@@ -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")])
+20
View File
@@ -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")])
+19
View File
@@ -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")])
+20
View File
@@ -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")])
+20
View File
@@ -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")])
+26
View File
@@ -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")])
+9
View File
@@ -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")
+9
View File
@@ -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")
+10
View File
@@ -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()
+1
View File
@@ -0,0 +1 @@
uid://cor2vawqxhptw
+14
View File
@@ -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()
+1
View File
@@ -0,0 +1 @@
uid://bbrofteu1a30o
+13
View File
@@ -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"
+13
View File
@@ -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"
+13
View File
@@ -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"
+13
View File
@@ -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"
+13
View File
@@ -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"
+13
View File
@@ -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"
+13
View File
@@ -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"
+13
View File
@@ -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"
+13
View File
@@ -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"
+7
View File
@@ -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
+69
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
uid://bm2pvegtcvgww
+38
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
uid://c5vv2vs1ugcv
+21
View File
@@ -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")])
+26
View File
@@ -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")])
+21
View File
@@ -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")])
+6
View File
@@ -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")
+104
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
uid://dxn6ig8hfgep1
+74
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
uid://c0u6ish14ncb2
+19
View File
@@ -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
+1
View File
@@ -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")])
+19
View File
@@ -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")])
+25
View File
@@ -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")])
+23
View File
@@ -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")])
+26
View File
@@ -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")])
+58
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
uid://bdx56cwdgtj2l
+14
View File
@@ -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"
+11
View File
@@ -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"
+49
View File
@@ -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
Generated
+27
View File
@@ -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
}
+30
View File
@@ -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;
};
}
+91
View File
@@ -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.
Binary file not shown.
Binary file not shown.
+36
View File
@@ -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={}
Binary file not shown.
+36
View File
@@ -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={}
Binary file not shown.
Binary file not shown.
@@ -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={}
Binary file not shown.

After

Width:  |  Height:  |  Size: 753 B

+40
View File
@@ -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
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

+40
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

+40
View File
@@ -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
Binary file not shown.

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
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

+40
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

+40
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

+40
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 649 B

+40
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

+40
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

+40
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

+40
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

+40
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

+40
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

+40
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 775 B

+40
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

+40
View File
@@ -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

Some files were not shown because too many files have changed in this diff Show More