diff options
Diffstat (limited to 'game/src')
-rw-r--r-- | game/src/Game/Autoload/SoundManager.gd | 3 | ||||
-rw-r--r-- | game/src/Game/GameSession/NationManagementScreen/BudgetMenu.gd | 2 | ||||
-rw-r--r-- | game/src/Game/GameSession/NationManagementScreen/PopulationMenu.gd | 2 | ||||
-rw-r--r-- | game/src/Game/GameSession/ProvinceIndexSampler.gdshaderinc | 2 | ||||
-rw-r--r-- | game/src/Game/GameSession/ProvinceOverviewPanel.gd | 17 | ||||
-rw-r--r-- | game/src/Game/GameSession/Tooltip.gd | 33 | ||||
-rw-r--r-- | game/src/Game/GameSession/Topbar.gd | 2 | ||||
-rw-r--r-- | game/src/Game/Model/XACLoader.gd | 15 | ||||
-rw-r--r-- | game/src/Game/Model/XSMLoader.gd | 14 | ||||
-rw-r--r-- | game/src/Game/MusicConductor/MusicConductor.gd | 18 | ||||
-rw-r--r-- | game/src/Game/MusicConductor/MusicPlayer.gd | 2 |
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() |