aboutsummaryrefslogtreecommitdiff
path: root/game
diff options
context:
space:
mode:
Diffstat (limited to 'game')
-rw-r--r--game/src/Game/Autoload/SoundManager.gd3
-rw-r--r--game/src/Game/GameSession/NationManagementScreen/BudgetMenu.gd2
-rw-r--r--game/src/Game/GameSession/NationManagementScreen/PopulationMenu.gd2
-rw-r--r--game/src/Game/GameSession/ProvinceIndexSampler.gdshaderinc2
-rw-r--r--game/src/Game/GameSession/ProvinceOverviewPanel.gd17
-rw-r--r--game/src/Game/GameSession/Tooltip.gd33
-rw-r--r--game/src/Game/GameSession/Topbar.gd2
-rw-r--r--game/src/Game/Model/XACLoader.gd15
-rw-r--r--game/src/Game/Model/XSMLoader.gd14
-rw-r--r--game/src/Game/MusicConductor/MusicConductor.gd18
-rw-r--r--game/src/Game/MusicConductor/MusicPlayer.gd2
11 files changed, 76 insertions, 34 deletions
diff --git a/game/src/Game/Autoload/SoundManager.gd b/game/src/Game/Autoload/SoundManager.gd
index 01562f8..520afb1 100644
--- a/game/src/Game/Autoload/SoundManager.gd
+++ b/game/src/Game/Autoload/SoundManager.gd
@@ -41,7 +41,7 @@ func play_effect_stream(sound : AudioStream, volume : float = 1.0) -> void:
func play_effect(sound : String) -> void:
play(sound, "SFX")
-
+
func play_effect_compat(sfx : String, fallback : AudioStream=null) -> void:
var sound:AudioStreamWAV = SoundSingleton.get_sound_stream(sfx)
var volume:float = SoundSingleton.get_sound_base_volume(sfx)
@@ -53,4 +53,3 @@ func play_effect_compat(sfx : String, fallback : AudioStream=null) -> void:
play_effect_stream(fallback)
else:
push_warning("Failed to find sound %s" % sfx)
-
diff --git a/game/src/Game/GameSession/NationManagementScreen/BudgetMenu.gd b/game/src/Game/GameSession/NationManagementScreen/BudgetMenu.gd
index 021c9f2..45e91d3 100644
--- a/game/src/Game/GameSession/NationManagementScreen/BudgetMenu.gd
+++ b/game/src/Game/GameSession/NationManagementScreen/BudgetMenu.gd
@@ -203,7 +203,7 @@ func _update_info() -> void:
if _active:
if _gold_label:
- _gold_label.text = "%s¤" % GUINode.float_to_string_dp(_incVal - (_incVal % 7), 1)
+ _gold_label.text = "%s¤" % GUINode.float_to_string_dp(_incVal - (_incVal % 7), 1)
if _total_inc_label:
_total_inc_label.text = "%s¤" % GUINode.float_to_string_dp_dynamic(_incVal)
diff --git a/game/src/Game/GameSession/NationManagementScreen/PopulationMenu.gd b/game/src/Game/GameSession/NationManagementScreen/PopulationMenu.gd
index eb57387..b55d227 100644
--- a/game/src/Game/GameSession/NationManagementScreen/PopulationMenu.gd
+++ b/game/src/Game/GameSession/NationManagementScreen/PopulationMenu.gd
@@ -160,7 +160,7 @@ func _generate_province_list_row(index : int, type : MenuSingleton.ProvinceListE
return OK
func _setup_province_list() -> void:
- if not _province_listbox:
+ if not _province_listbox:
_province_listbox = get_gui_listbox_from_nodepath(^"./country_pop/pop_province_list")
if not _province_listbox:
diff --git a/game/src/Game/GameSession/ProvinceIndexSampler.gdshaderinc b/game/src/Game/GameSession/ProvinceIndexSampler.gdshaderinc
index 1adcd95..acebdc6 100644
--- a/game/src/Game/GameSession/ProvinceIndexSampler.gdshaderinc
+++ b/game/src/Game/GameSession/ProvinceIndexSampler.gdshaderinc
@@ -13,7 +13,7 @@ uvec3 vec3_to_uvec3(vec3 v) {
// (u, v) -> (province index bottom byte, province index top byte, terrain index byte)
uvec3 read_uvec3(vec2 uv) {
uv *= province_shape_subdivisions;
- vec2 subdivision_coords = mod(floor(uv), province_shape_subdivisions);
+ vec2 subdivision_coords = mod(floor(uv), province_shape_subdivisions);
float idx = subdivision_coords.x + subdivision_coords.y * province_shape_subdivisions.x;
return vec3_to_uvec3(texture(province_shape_tex, vec3(uv, idx)).rgb);
}
diff --git a/game/src/Game/GameSession/ProvinceOverviewPanel.gd b/game/src/Game/GameSession/ProvinceOverviewPanel.gd
index 66fd463..a9f0ae2 100644
--- a/game/src/Game/GameSession/ProvinceOverviewPanel.gd
+++ b/game/src/Game/GameSession/ProvinceOverviewPanel.gd
@@ -240,6 +240,10 @@ func _update_info() -> void:
const _province_info_controller_key : StringName = &"controller"
const _province_info_rgo_name_key : StringName = &"rgo_name"
const _province_info_rgo_icon_key : StringName = &"rgo_icon"
+ const _province_info_rgo_total_employees_key : StringName = &"rgo_total_employees"
+ const _province_info_rgo_employment_percentage_key : StringName = &"rgo_employment_percentage"
+ const _province_info_rgo_output_quantity_yesterday_key : StringName = &"rgo_output_quantity_yesterday"
+ const _province_info_rgo_revenue_yesterday_key : StringName = &"rgo_revenue_yesterday"
const _province_info_crime_name_key : StringName = &"crime_name"
const _province_info_crime_icon_key : StringName = &"crime_icon"
const _province_info_total_population_key : StringName = &"total_population"
@@ -305,22 +309,19 @@ func _update_info() -> void:
_rgo_icon.set_icon_index(_province_info.get(_province_info_rgo_icon_key, -1) + 2)
if _rgo_produced_label:
- # TODO - replace name with amount produced
- _rgo_produced_label.text = _province_info.get(_province_info_rgo_name_key, _province_info_rgo_name_key + _missing_suffix)
+ _rgo_produced_label.text = GUINode.float_to_string_dp(_province_info.get(_province_info_rgo_output_quantity_yesterday_key, 0), 3)
if _rgo_income_label:
- # TODO - add £ sign and replace placeholder with actual value
- _rgo_income_label.text = "%s¤" % GUINode.float_to_string_dp(12.34567, 3)
+ _rgo_income_label.text = "%s¤" % GUINode.float_to_string_dp(_province_info.get(_province_info_rgo_revenue_yesterday_key, 0), 3)
if _rgo_employment_percentage_icon:
- pass
+ _rgo_employment_percentage_icon.set_icon_index(int(_province_info.get(_province_info_rgo_employment_percentage_key, 0) / 10) + 1)
if _rgo_employment_population_label:
- # TODO - replace placeholder with actual value
- _rgo_employment_population_label.text = GUINode.int_to_string_suffixed(_province_info.get(_province_info_total_population_key, 0) / 10)
+ _rgo_employment_population_label.text = GUINode.int_to_string_suffixed(_province_info.get(_province_info_rgo_total_employees_key, 0))
if _rgo_employment_percentage_label:
- pass
+ _rgo_employment_percentage_label.text = "%d%%" % _province_info.get(_province_info_rgo_employment_percentage_key, 0)
if _crime_name_label:
_crime_name_label.text = _province_info.get(_province_info_crime_name_key, "")
diff --git a/game/src/Game/GameSession/Tooltip.gd b/game/src/Game/GameSession/Tooltip.gd
index c110e2e..f079e4c 100644
--- a/game/src/Game/GameSession/Tooltip.gd
+++ b/game/src/Game/GameSession/Tooltip.gd
@@ -7,17 +7,48 @@ func _ready() -> void:
_tooltip_label = get_gui_label_from_nodepath(^"./ToolTip")
if _tooltip_label:
+ _update_tooltip_max_size()
_tooltip_label.set_auto_adjust_to_content_size(true)
MenuSingleton.update_tooltip.connect(update_tooltip)
hide()
+func _notification(what : int) -> void:
+ match what:
+ NOTIFICATION_RESIZED:
+ _update_tooltip_max_size()
+
+func _update_tooltip_max_size() -> void:
+ if _tooltip_label:
+ var max_size : Vector2 = _tooltip_label.get_base_max_size()
+ var window_size : Vector2 = get_size()
+ _tooltip_label.set_max_size(Vector2(min(max_size.x, window_size.x), window_size.y))
+
func update_tooltip(text : String, substitution_dict : Dictionary, position : Vector2) -> void:
- if text:
+ if text and _tooltip_label:
_tooltip_label.set_text(text)
_tooltip_label.set_substitution_dict(substitution_dict)
+ _tooltip_label.force_update_lines()
+
+ var adjusted_rect : Rect2 = _tooltip_label.get_adjusted_rect()
+
+ # Shift position so that the tooltip doesn't go past the bottom or right sides of the window
+ var bottom_right : Vector2 = position + adjusted_rect.position + adjusted_rect.size - get_size()
+ if bottom_right.x > 0:
+ position.x -= bottom_right.x
+ if bottom_right.y > 0:
+ position.y -= bottom_right.y
+
+ # Shift position so that the tooltip doesn't go past the top or left sides of the window
+ var top_left : Vector2 = position + adjusted_rect.position
+ if top_left.x < 0:
+ position.x -= top_left.x
+ if top_left.y < 0:
+ position.y -= top_left.y
+
_tooltip_label.set_position(position)
+
show()
else:
hide()
diff --git a/game/src/Game/GameSession/Topbar.gd b/game/src/Game/GameSession/Topbar.gd
index 2f1fdbf..aecdced 100644
--- a/game/src/Game/GameSession/Topbar.gd
+++ b/game/src/Game/GameSession/Topbar.gd
@@ -570,7 +570,7 @@ func _update_speed_controls() -> void:
var paused : bool = MenuSingleton.is_paused()
var speed : int = MenuSingleton.get_speed()
- # TODO - decide whether to disable these or not
+ # TODO - decide whether to disable these or not
# (they don't appear to get disabled in the base game)
#if _speed_up_button:
# _speed_up_button.disabled = not MenuSingleton.can_increase_speed()
diff --git a/game/src/Game/Model/XACLoader.gd b/game/src/Game/Model/XACLoader.gd
index b003296..c16d1cd 100644
--- a/game/src/Game/Model/XACLoader.gd
+++ b/game/src/Game/Model/XACLoader.gd
@@ -2,6 +2,7 @@ class_name XACLoader
static var unit_shader : ShaderMaterial = preload("res://src/Game/Model/unit_colours_mat.tres")
const MAX_UNIT_TEXTURES : int = 32 # max number of textures supported by the shader
+const EXTRA_CULL_MARGIN : int = 2 # extra margin to stop sub-meshes from being culled near the edges of screens
static var added_unit_textures_spec : PackedStringArray
static var added_unit_textures_diffuse : PackedStringArray
@@ -141,6 +142,13 @@ static func _load_xac_model(source_file : String, is_unit : bool) -> Node3D:
push_warning("Skipping unused mesh \"", mesh_chunk_name, "\" in model \"", node.name, "\"")
continue
+ # polySurface97 corresponds to the "arab_infantry_helmet", and needs to be removed often
+ # but only in cases where it isn't an attachment
+ const INVALID_IF_NOT_ONLY_MESH : PackedStringArray = ["polySurface97"]
+ if mesh_chunks.size() != 1 and mesh_chunk_name in INVALID_IF_NOT_ONLY_MESH:
+ push_warning("Skipping unused mesh \"", mesh_chunk_name, "\" in model \"", node.name, "\" because it was not the only mesh chunk in its file")
+ break
+
var mesh : ArrayMesh = null
var verts : PackedVector3Array
var normals : PackedVector3Array
@@ -164,6 +172,8 @@ static func _load_xac_model(source_file : String, is_unit : bool) -> Node3D:
_: # type 4 32bit colours and type 6 128bit colours aren't used
pass
+ #FIXME: find a better solution if possible
+ #pCube1 hardcoding is to fix the cruiser which doesn't properly mark its collision mesh
if chunk.bIsCollisionMesh or mesh_chunk_name == "pCube1":
var ar3d : Area3D = Area3D.new()
node.add_child(ar3d)
@@ -187,13 +197,16 @@ static func _load_xac_model(source_file : String, is_unit : bool) -> Node3D:
break
skinning_chunk_ind += 1
if skinning_chunk_ind >= len(skinningChunks):
- skinning_chunk_ind = 1
+ skinning_chunk_ind = 1
applyVertexWeights = false
var meshInstance : MeshInstance3D = MeshInstance3D.new()
node.add_child(meshInstance)
meshInstance.owner = node
+ #stop the culling of units near the tops of screens
+ meshInstance.extra_cull_margin = EXTRA_CULL_MARGIN
+
if mesh_chunk_name:
meshInstance.name = mesh_chunk_name
diff --git a/game/src/Game/Model/XSMLoader.gd b/game/src/Game/Model/XSMLoader.gd
index 332bbec..e1706ae 100644
--- a/game/src/Game/Model/XSMLoader.gd
+++ b/game/src/Game/Model/XSMLoader.gd
@@ -46,7 +46,8 @@ static func _load_xsm_animation(source_file : String) -> Animation:
0xC9: #Metadata
metadataChunk = readMetadataChunk(file)
0xCA: #Bone Animation
- boneAnimationChunks.push_back(readBoneAnimationChunk(file, metadataChunk.use_quat_16()))
+ # v1 is float32 quaternions, v2 is int16 quaternions
+ boneAnimationChunks.push_back(readBoneAnimationChunk(file, version == 2))
_:
push_error(">> INVALID XSM CHUNK TYPE %X" % type)
break
@@ -121,8 +122,8 @@ class MetadataChunk:
var unused : float
var fMaxAcceptableError : float
var fps : int # int32
- var exporterMajorVersion : int # byte
- var exporterMinorVersion : int # byte
+ var exporterMajorVersion : int # byte
+ var exporterMinorVersion : int # byte
var pad : int # 2x byte
var sourceApp : String
var origFileName : String
@@ -155,11 +156,8 @@ class MetadataChunk:
func debugPrint() -> void:
print("FileName: %s, sourceApp: %s, exportDate: %s, ExporterV:%d.%d" %
[origFileName, sourceApp, exportDate, exporterMajorVersion, exporterMinorVersion])
- print("MotionName: %s, fps: %d, MaxError: %s, Use 16-bit int Quaternions?:%s" %
- [motionName, fps, fMaxAcceptableError, use_quat_16()])
-
- func use_quat_16() -> bool:
- return pad == 0x0
+ print("MotionName: %s, fps: %d, MaxError: %s" %
+ [motionName, fps, fMaxAcceptableError])
static func readPosKey(file : FileAccess) -> PosKey:
return PosKey.new(FileAccessUtils.read_pos(file), file.get_float())
diff --git a/game/src/Game/MusicConductor/MusicConductor.gd b/game/src/Game/MusicConductor/MusicConductor.gd
index f7e3b2a..ade8fb4 100644
--- a/game/src/Game/MusicConductor/MusicConductor.gd
+++ b/game/src/Game/MusicConductor/MusicConductor.gd
@@ -34,7 +34,7 @@ func get_all_song_names() -> PackedStringArray:
for si : SongInfo in _available_songs:
songNames.append(si.song_name)
return songNames
-
+
func get_all_song_paths() -> PackedStringArray:
var songPaths : PackedStringArray = []
for si : SongInfo in _available_songs:
@@ -103,13 +103,13 @@ func setup_compat_song(file_name) -> void:
var metadata = MusicMetadata.new()
metadata.set_from_stream(stream)
var title = metadata.title
-
+
if title == "":
#use the file name without the extension if there's no metadata
title = file_name.split(".")[0]
song.init_stream(file_name,title,stream)
_available_songs.append(song)
-
+
func add_compat_songs() -> void:
for file_name : String in SoundSingleton.song_list:
setup_compat_song(file_name)
@@ -128,13 +128,13 @@ func add_ootb_music() -> void:
func generate_playlist() -> void:
var song_names = MusicConductor.get_all_song_paths()
var possible_indices = range(len(song_names)-1)
-
+
var title_index = song_names.find(SoundSingleton.title_theme)
possible_indices.remove_at(title_index)
-
+
var actual_playlist_len = min(preferred_playlist_len,len(possible_indices))
-
- #if the playlist size is too large or small, make it the same size as what we
+
+ #if the playlist size is too large or small, make it the same size as what we
#need to support
if len(playlist) != actual_playlist_len:
playlist.resize(actual_playlist_len)
@@ -143,14 +143,14 @@ func generate_playlist() -> void:
#The song we just played can be in the playlist, just not the first one
if last_played != -1:
possible_indices.remove_at(last_played)
-
+
#essentially shuffle-bag randomness, picking from a list of song indices
for i in range(actual_playlist_len):
var ind = randi_range(0,len(possible_indices)-1)
#add back the last song we just played as an option
if i==2:
possible_indices.append(last_played)
-
+
playlist[i] = possible_indices[ind]
possible_indices.remove_at(ind)
diff --git a/game/src/Game/MusicConductor/MusicPlayer.gd b/game/src/Game/MusicConductor/MusicPlayer.gd
index 17285dc..0db44ca 100644
--- a/game/src/Game/MusicConductor/MusicPlayer.gd
+++ b/game/src/Game/MusicConductor/MusicPlayer.gd
@@ -27,7 +27,7 @@ func _process(_delta : float) -> void:
_progress_slider.value = MusicConductor.get_current_song_progress_percentage()
func _update_play_pause_button(_arg1 : Variant = null, _arg2 : Variant = null) -> void:
- _play_pause_button.text = "◼" if MusicConductor.is_paused() else "▶"
+ _play_pause_button.text = "▶️" if MusicConductor.is_paused() else "❚❚"
func _on_play_pause_button_pressed() -> void:
MusicConductor.toggle_play_pause()