Skip to content

Commit

Permalink
add map projections
Browse files Browse the repository at this point in the history
  • Loading branch information
Nemrav committed Dec 22, 2024
1 parent 1852a5f commit ae1bb16
Show file tree
Hide file tree
Showing 10 changed files with 537 additions and 9 deletions.
11 changes: 11 additions & 0 deletions extension/doc_classes/MapItemSingleton.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@
<description>
</description>
</method>
<method name="get_projections" qualifiers="const">
<return type="Dictionary[]" />
<description>
</description>
</method>
<method name="get_province_positions" qualifiers="const">
<return type="PackedVector2Array" />
<description>
Expand All @@ -42,5 +47,11 @@
<description>
</description>
</method>
<method name="get_unit_position_by_province_index" qualifiers="const">
<return type="Vector2" />
<param index="0" name="index" type="int" />
<description>
</description>
</method>
</methods>
</class>
78 changes: 75 additions & 3 deletions extension/src/openvic-extension/singletons/MapItemSingleton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,17 @@
#include "godot_cpp/variant/packed_int32_array.hpp"
#include "godot_cpp/variant/packed_vector2_array.hpp"
#include "godot_cpp/variant/typed_array.hpp"
#include "godot_cpp/variant/utility_functions.hpp"
#include "godot_cpp/variant/vector2.hpp"
#include "openvic-extension/singletons/GameSingleton.hpp"
#include "openvic-extension/utility/ClassBindings.hpp"
#include "openvic-extension/utility/Utilities.hpp"
#include "openvic-simulation/DefinitionManager.hpp"
#include "openvic-simulation/country/CountryDefinition.hpp"
#include "openvic-simulation/country/CountryInstance.hpp"
#include "openvic-simulation/DefinitionManager.hpp"
#include "openvic-simulation/interface/GFXObject.hpp"
#include "openvic-simulation/map/ProvinceDefinition.hpp"
#include "openvic-simulation/map/ProvinceInstance.hpp"
#include "openvic-simulation/map/State.hpp"
#include "openvic-simulation/types/Vector.hpp"

using namespace godot;
using namespace OpenVic;
Expand All @@ -29,6 +27,8 @@ void MapItemSingleton::_bind_methods() {
OV_BIND_METHOD(MapItemSingleton::get_crime_icons);
OV_BIND_METHOD(MapItemSingleton::get_rgo_icons);
OV_BIND_METHOD(MapItemSingleton::get_national_focus_icons);
OV_BIND_METHOD(MapItemSingleton::get_projections);
OV_BIND_METHOD(MapItemSingleton::get_unit_position_by_province_index,{"index"});
}

MapItemSingleton* MapItemSingleton::get_singleton() {
Expand Down Expand Up @@ -102,6 +102,67 @@ TypedArray<Dictionary> MapItemSingleton::get_billboards() const {
return ret;
}


GFX::Projection const* MapItemSingleton::get_projection(std::string_view name, bool error_on_fail) const {
GameSingleton const* game_singleton = GameSingleton::get_singleton();
ERR_FAIL_NULL_V(game_singleton, nullptr);

GFX::Projection const* projection =
game_singleton->get_definition_manager().get_ui_manager().get_cast_object_by_identifier<GFX::Projection>(name);

if (error_on_fail) {
ERR_FAIL_NULL_V_MSG(
projection, nullptr, vformat("Failed to find projection \"%s\"", Utilities::std_to_godot_string(name))
);
}

return projection;
}

bool MapItemSingleton::add_projection_dict(std::string_view name, TypedArray<Dictionary>& projection_dict_array) const {

static const StringName name_key = "name";
static const StringName texture_key = "texture";
static const StringName size_key = "size";
static const StringName spin_key = "spin";
static const StringName expanding_key = "expanding";
static const StringName duration_key = "duration";
static const StringName additative_key = "additative";

GFX::Projection const* projection = get_projection(name, false);

ERR_FAIL_NULL_V_MSG(projection, false, vformat("Failed to find projection \"%s\"", Utilities::std_to_godot_string(name)));

Dictionary dict;

dict[name_key] = Utilities::std_to_godot_string(projection->get_name());
dict[texture_key] = Utilities::std_to_godot_string(projection->get_texture_file());
dict[size_key] = projection->get_size().to_float();
dict[spin_key] = projection->get_spin().to_float();
dict[expanding_key] = projection->get_expanding().to_float();
dict[duration_key] = projection->get_duration().to_float();
dict[additative_key] = projection->get_additative();

projection_dict_array.push_back(dict);

return true;
}

TypedArray<Dictionary> MapItemSingleton::get_projections() const {
GameSingleton const* game_singleton = GameSingleton::get_singleton();
ERR_FAIL_NULL_V(game_singleton, {});

TypedArray<Dictionary> ret;

for (std::unique_ptr<GFX::Object> const& obj : game_singleton->get_definition_manager().get_ui_manager().get_objects()) {
if (obj->is_type<GFX::Projection>()) {
add_projection_dict(obj->get_name(), ret);
}
}

return ret;
}

// We assume GameSingleton isn't null when this is being called
static Vector2 get_billboard_pos(ProvinceDefinition const& province) {
return Utilities::to_godot_fvec2(province.get_city_position()) / GameSingleton::get_singleton()->get_map_dims();
Expand Down Expand Up @@ -260,3 +321,14 @@ PackedByteArray MapItemSingleton::get_national_focus_icons() const {

return icons;
}


Vector2 MapItemSingleton::get_unit_position_by_province_index(int32_t province_index) const {
GameSingleton const* game_singleton = GameSingleton::get_singleton();
ERR_FAIL_NULL_V(game_singleton, {});

return Utilities::to_godot_fvec2(
game_singleton->get_definition_manager().get_map_definition()
.get_province_definition_by_index(province_index)->get_unit_position()
) / GameSingleton::get_singleton()->get_map_dims();
}
10 changes: 8 additions & 2 deletions extension/src/openvic-extension/singletons/MapItemSingleton.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@
#include <openvic-simulation/interface/GFXObject.hpp>
#include <openvic-simulation/types/OrderedContainers.hpp>

//billboards, projections, and progress bar
//for now though, only billboards
//billboards, projections, and progress bar (no progress bar yet)

namespace OpenVic {
class MapItemSingleton : public godot::Object {
Expand All @@ -27,12 +26,19 @@ namespace OpenVic {
GFX::Billboard const* get_billboard(std::string_view name, bool error_on_fail = true) const;
bool add_billboard_dict(std::string_view name, godot::TypedArray<godot::Dictionary>& billboard_dict_array) const;
godot::TypedArray<godot::Dictionary> get_billboards() const;

GFX::Projection const* get_projection(std::string_view name, bool error_on_fail = true) const;
bool add_projection_dict(std::string_view name, godot::TypedArray<godot::Dictionary>& projection_dict_array) const;
godot::TypedArray<godot::Dictionary> get_projections() const;

godot::PackedVector2Array get_province_positions() const;
int32_t get_max_capital_count() const;
godot::PackedVector2Array get_capital_positions() const;

godot::PackedByteArray get_crime_icons() const;
godot::PackedByteArray get_rgo_icons() const;
godot::PackedByteArray get_national_focus_icons() const;

godot::Vector2 get_unit_position_by_province_index(int32_t province_index) const;
};
}
5 changes: 5 additions & 0 deletions game/project.godot
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,11 @@ menu_pause={
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
select_add={
"deadzone": 0.5,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}

[internationalization]

Expand Down
23 changes: 21 additions & 2 deletions game/src/Game/GameSession/MapView.gd
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ const _action_zoom_out : StringName = &"map_zoom_out"
const _action_drag : StringName = &"map_drag"
const _action_click : StringName = &"map_click"
const _action_right_click : StringName = &"map_right_click"
const _action_select_add : StringName = &"select_add"

@export var _camera : Camera3D

Expand Down Expand Up @@ -60,6 +61,11 @@ var _viewport_dims : Vector2 = Vector2(1, 1)

@export var _map_text : MapText

@export var validMoveMarkers : ValidMoveMarkers
@export var selectionMarkers : SelectionMarkers
var land_units_selected : Array = []
var naval_units_selected : Array = []

# ??? Strange Godot/GDExtension Bug ???
# Upon first opening a clone of this repo with the Godot Editor,
# if GameSingleton.get_province_index_image is called before MapMesh
Expand Down Expand Up @@ -201,6 +207,7 @@ func _input(event : InputEvent) -> void:
# * SS-31
# * SS-75
var _cardinal_movement_vector := Vector2.ZERO
var temp_id : int = 0
func _unhandled_input(event : InputEvent) -> void:
if event is InputEventMouseMotion:
_mouse_over_viewport = true
Expand All @@ -215,19 +222,31 @@ func _unhandled_input(event : InputEvent) -> void:
_action_south
) * _cardinal_move_speed

elif event.is_action_pressed(_action_select_add):
if _mouse_over_viewport:
if _map_mesh.is_valid_uv_coord(_mouse_pos_map):
GameSingleton.set_selected_province(GameSingleton.get_province_index_from_uv_coords(_mouse_pos_map))
var province_index : int = GameSingleton.get_province_index_from_uv_coords(_mouse_pos_map)
var unit_position : Vector2 = MapItemSingleton.get_unit_position_by_province_index(province_index)
selectionMarkers.add_selection_marker(temp_id,_map_to_world_coords(unit_position))
temp_id += 1

elif event.is_action_pressed(_action_click):
if _mouse_over_viewport:
# Check if the mouse is outside of bounds
if _map_mesh.is_valid_uv_coord(_mouse_pos_map):
GameSingleton.set_selected_province(GameSingleton.get_province_index_from_uv_coords(_mouse_pos_map))
selectionMarkers.clear_selection_markers()
else:
print("Clicked outside the map!")
elif event.is_action_pressed(_action_right_click):
if _mouse_over_viewport:
if _map_mesh.is_valid_uv_coord(_mouse_pos_map):
var province_index : int = GameSingleton.get_province_index_from_uv_coords(_mouse_pos_map)
var unit_position : Vector2 = MapItemSingleton.get_unit_position_by_province_index(province_index)
validMoveMarkers.add_move_marker(_map_to_world_coords(unit_position), randi_range(0,1))
# TODO - open diplomacy screen on province owner or viewed country if province has no owner
#Events.NationManagementScreens.open_nation_management_screen(NationManagement.Screen.DIPLOMACY)
GameSingleton.set_viewed_country_by_province_index(GameSingleton.get_province_index_from_uv_coords(_mouse_pos_map))
GameSingleton.set_viewed_country_by_province_index(province_index)
else:
print("Right-clicked outside the map!")
elif event.is_action_pressed(_action_drag):
Expand Down
56 changes: 54 additions & 2 deletions game/src/Game/GameSession/MapView.tscn
Original file line number Diff line number Diff line change
@@ -1,8 +1,37 @@
[gd_scene load_steps=8 format=3 uid="uid://dkehmdnuxih2r"]
[gd_scene load_steps=16 format=3 uid="uid://dkehmdnuxih2r"]

[ext_resource type="Script" path="res://src/Game/GameSession/MapView.gd" id="1_exccw"]
[ext_resource type="Shader" path="res://src/Game/GameSession/TerrainMap.gdshader" id="1_upocn"]
[ext_resource type="Script" path="res://src/Game/GameSession/MapText.gd" id="2_13bgq"]
[ext_resource type="Script" path="res://src/Game/GameSession/MarkerManager.gd" id="2_xnmdg"]
[ext_resource type="Script" path="res://src/Game/GameSession/SelectionMarkers.gd" id="3_fi78k"]
[ext_resource type="Shader" path="res://src/Game/GameSession/Projection.gdshader" id="4_2f4io"]
[ext_resource type="Script" path="res://src/Game/GameSession/ValidMoveMarkers.gd" id="5_h3t3v"]

[sub_resource type="ShaderMaterial" id="ShaderMaterial_blhuf"]
render_priority = 0
shader = ExtResource("4_2f4io")
shader_parameter/sizes = null
shader_parameter/spin = null
shader_parameter/expanding = null
shader_parameter/duration = null
shader_parameter/additative = null
shader_parameter/time = 0.0
shader_parameter/projections = null

[sub_resource type="QuadMesh" id="QuadMesh_72iss"]
material = SubResource("ShaderMaterial_blhuf")
orientation = 1

[sub_resource type="MultiMesh" id="MultiMesh_rytvv"]
transform_format = 1
use_custom_data = true
mesh = SubResource("QuadMesh_72iss")

[sub_resource type="MultiMesh" id="MultiMesh_cq0pk"]
transform_format = 1
use_custom_data = true
mesh = SubResource("QuadMesh_72iss")

[sub_resource type="ShaderMaterial" id="ShaderMaterial_tayeg"]
render_priority = 0
Expand All @@ -24,18 +53,39 @@ albedo_color = Color(0, 0, 0, 1)
material = SubResource("StandardMaterial3D_irk50")
size = Vector2(6, 2)

[node name="MapView" type="Node3D" node_paths=PackedStringArray("_camera", "_map_mesh_instance", "_map_background_instance", "_map_text")]
[node name="MapView" type="Node3D" node_paths=PackedStringArray("_camera", "_map_mesh_instance", "_map_background_instance", "_map_text", "validMoveMarkers", "selectionMarkers")]
editor_description = "SS-73"
script = ExtResource("1_exccw")
_camera = NodePath("MapCamera")
_map_mesh_instance = NodePath("MapMeshInstance")
_map_background_instance = NodePath("MapBackgroundInstance")
_map_text = NodePath("MapText")
validMoveMarkers = NodePath("ProjectionManager/ValidMoveMarkers")
selectionMarkers = NodePath("ProjectionManager/SelectionMarkers")

[node name="MapCamera" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0.25, 1.5, -2.75)
near = 0.01

[node name="ProjectionManager" type="Node3D" parent="." node_paths=PackedStringArray("selectionMarkers", "moveMarkers")]
script = ExtResource("2_xnmdg")
selectionMarkers = NodePath("SelectionMarkers")
moveMarkers = NodePath("ValidMoveMarkers")

[node name="SelectionMarkers" type="MultiMeshInstance3D" parent="ProjectionManager" node_paths=PackedStringArray("manager")]
cast_shadow = 0
gi_mode = 0
multimesh = SubResource("MultiMesh_rytvv")
script = ExtResource("3_fi78k")
manager = NodePath("..")

[node name="ValidMoveMarkers" type="MultiMeshInstance3D" parent="ProjectionManager" node_paths=PackedStringArray("manager")]
cast_shadow = 0
gi_mode = 0
multimesh = SubResource("MultiMesh_cq0pk")
script = ExtResource("5_h3t3v")
manager = NodePath("..")

[node name="MapText" type="Node3D" parent="." node_paths=PackedStringArray("_map_view")]
script = ExtResource("2_13bgq")
_map_view = NodePath("..")
Expand All @@ -56,4 +106,6 @@ light_energy = 1.5
light_bake_mode = 0
sky_mode = 1

[connection signal="detailed_view_changed" from="." to="ProjectionManager/SelectionMarkers" method="set_visible"]
[connection signal="detailed_view_changed" from="." to="ProjectionManager/ValidMoveMarkers" method="set_visible"]
[connection signal="detailed_view_changed" from="." to="MapText" method="set_visible"]
Loading

0 comments on commit ae1bb16

Please sign in to comment.