diff --git a/game/dist/assets/env/env_umbrella/env_umbrellaBlue.json b/game/dist/assets/env/env_umbrella/env_umbrellaBlue.json new file mode 100644 index 00000000..d1f74289 --- /dev/null +++ b/game/dist/assets/env/env_umbrella/env_umbrellaBlue.json @@ -0,0 +1,35 @@ +{ + "name": "env_umbrellaBlue", + "bottom_texture": { + "file_path": "assets/env/env_umbrella/env_umbrellaPole.png" + }, + "top_texture": { + "file_path": "assets/env/env_umbrella/env_umbrellaBlue.png" + }, + "footprint":[ + { + "position": [ + -108, + -108 + ], + "size": [ + 216, + 216 + ] + } + ], + "visualization_radius": 256.0, + "physics_colliders": [ + { + "position": [ + -3, + -3 + ], + "size": [ + 6, + 6 + ] + } + ], + "temperature": 3.0 +} \ No newline at end of file diff --git a/game/dist/assets/env/env_umbrella/env_umbrellaBlueTowels.json b/game/dist/assets/env/env_umbrella/env_umbrellaBlueTowels.json new file mode 100644 index 00000000..a5b8634d --- /dev/null +++ b/game/dist/assets/env/env_umbrella/env_umbrellaBlueTowels.json @@ -0,0 +1,35 @@ +{ + "name": "env_umbrellaBlueTowels", + "bottom_texture": { + "file_path": "assets/env/env_umbrella/env_umbrellaTowels.png" + }, + "top_texture": { + "file_path": "assets/env/env_umbrella/env_umbrellaBlue.png" + }, + "footprint":[ + { + "position": [ + -108, + -108 + ], + "size": [ + 216, + 216 + ] + } + ], + "visualization_radius": 256.0, + "physics_colliders": [ + { + "position": [ + -3, + -3 + ], + "size": [ + 6, + 6 + ] + } + ], + "temperature": 3.0 +} \ No newline at end of file diff --git a/game/dist/map_gameMap.objects.json b/game/dist/map_gameMap.objects.json index 80a5a2b5..c288159d 100644 --- a/game/dist/map_gameMap.objects.json +++ b/game/dist/map_gameMap.objects.json @@ -1,11 +1,12 @@ [ { "type": "env", - "name": "env_testObject", + "name": "env_umbrella", + "variant": "Blue", "position": [ - 0, - 0 + 5, + 7 ], - "rotation_radians": 0.5 + "rotation_degrees": 90 } ] \ No newline at end of file diff --git a/game/game_logic/src/model/world_object.rs b/game/game_logic/src/model/world_object.rs index 1d1bb029..27fc88e5 100644 --- a/game/game_logic/src/model/world_object.rs +++ b/game/game_logic/src/model/world_object.rs @@ -58,10 +58,27 @@ pub struct WorldObjectRef { pub kind: String, /// Object name pub name: String, + /// Variant name + pub variant: Option, /// Object position (tile-space *not* pixel-space). 1,1 being up and to the right - pub position: na::Vector2, + position: na::Vector2, /// Object rotation, positive is clockwise - pub rotation_radians: f32, + pub rotation_degrees: f32, } - +impl WorldObjectRef { + pub fn into_key(&self) -> String { + format!( + "{}:{}:{}", + self.kind, + self.name, + self.variant.as_ref().unwrap_or(&"default".to_string()) + ) + } + pub fn get_world_space_position(&self)-> na::Vector2 { + self.position * 128.0 + } + pub fn get_tile_space_position(&self)-> na::Vector2 { + self.position + } +} diff --git a/game/game_logic/src/model/world_object_package.rs b/game/game_logic/src/model/world_object_package.rs index 153c2bd7..881be71c 100644 --- a/game/game_logic/src/model/world_object_package.rs +++ b/game/game_logic/src/model/world_object_package.rs @@ -54,12 +54,15 @@ impl WorldObjectPackage { let mut world_space_colliders: Vec = Vec::new(); for reference in &object_references { // If this is a new object, load it. - let object_key = format!("{}:{}", reference.kind, reference.name); + let object_key = reference.into_key(); if !object_definitions.contains_key(object_key.as_str()) { // Construct the file path from the data we know about the reference let path = format!( - "assets/{}/{}/{}.json", - reference.kind, reference.name, reference.name + "assets/{}/{}/{}{}.json", + reference.kind, + reference.name, + reference.name, + reference.variant.as_ref().unwrap_or(&String::new()) ); // Attempt to load the object definition @@ -100,7 +103,7 @@ impl WorldObjectPackage { // Keep track of all the colliders in the world for collider in &object_definition.physics_colliders { // Get the object's position - let object_position = reference.position; + let object_position = reference.get_world_space_position(); // Convert the collider's position to world space let world_space_collider = WorldSpaceObjectCollider { diff --git a/game/game_logic/src/rendering/utilities/map_render.rs b/game/game_logic/src/rendering/utilities/map_render.rs index b447c6b3..6452595e 100644 --- a/game/game_logic/src/rendering/utilities/map_render.rs +++ b/game/game_logic/src/rendering/utilities/map_render.rs @@ -2,7 +2,7 @@ use std::{collections::HashMap, path::PathBuf, sync::Arc}; use crate::{ asset_manager::{load_texture_from_internal_data, InternalData}, - model::{world_object_package::WorldObjectPackage, world_object::WorldSpaceObjectCollider}, + model::{world_object::WorldSpaceObjectCollider, world_object_package::WorldObjectPackage}, }; use nalgebra as na; use raylib::{ @@ -148,11 +148,11 @@ impl MapRenderer { // If there is an object here, let it override the output for obj_ref in &self.world_objects.object_references { - if obj_ref.position.x == tile_position.x as f32 - && obj_ref.position.y == tile_position.y as f32 + if obj_ref.get_world_space_position().x == tile_position.x as f32 + && obj_ref.get_world_space_position().y == tile_position.y as f32 { // Get access to the actual object definition - let object_key = format!("{}:{}", obj_ref.kind, obj_ref.name); + let object_key = obj_ref.into_key(); let obj_def = self .world_objects .object_definitions @@ -203,11 +203,11 @@ impl MapRenderer { // If there is an object here, let it override the output for obj_ref in &self.world_objects.object_references { - if obj_ref.position.x == tile_position.x as f32 - && obj_ref.position.y == tile_position.y as f32 + if obj_ref.get_world_space_position().x == tile_position.x as f32 + && obj_ref.get_world_space_position().y == tile_position.y as f32 { // Get access to the actual object definition - let object_key = format!("{}:{}", obj_ref.kind, obj_ref.name); + let object_key = obj_ref.into_key(); let obj_def = self .world_objects .object_definitions @@ -264,6 +264,10 @@ impl MapRenderer { Vector2::new(screen_width as f32, screen_height as f32), camera, ); + let player_position = na::Vector2::new( + player_position.x, + player_position.y * -1.0, + ); // Handle each layer from the bottom up for layer in self.map.layers() { @@ -319,12 +323,12 @@ impl MapRenderer { // Check if there is an object at this tile for obj_ref in &self.world_objects.object_references { - if obj_ref.position.x == sampler_x as f32 - && obj_ref.position.y == sampler_y as f32 + if obj_ref.get_tile_space_position().x == sampler_x as f32 + && obj_ref.get_tile_space_position().y == sampler_y as f32 { // Get access to the actual object definition - let object_key = - format!("{}:{}", obj_ref.kind, obj_ref.name); + let object_key = obj_ref.into_key(); + // debug!("Found object: {}", object_key); let obj_def = self .world_objects .object_definitions @@ -340,10 +344,10 @@ impl MapRenderer { .unwrap(); tex.render_automatic( draw_handle, - obj_ref.position - (tex.size() / 2.0), + obj_ref.get_world_space_position() - (tex.size() / 2.0), None, Some(tex.size() / 2.0), - Some(obj_ref.rotation_radians.to_degrees()), + Some(obj_ref.rotation_degrees), None, ); } else { @@ -352,7 +356,7 @@ impl MapRenderer { .bottom_static_textures .get_mut(&object_key) .unwrap(); - let p: Vector2 = obj_ref.position.into(); + let p: Vector2 = obj_ref.get_world_space_position().into(); let r1 = Rectangle { x: 0.0, y: 0.0, @@ -374,7 +378,7 @@ impl MapRenderer { tex.width as f32 / 2.0, tex.height as f32 / 2.0, ), - obj_ref.rotation_radians.to_degrees(), + obj_ref.rotation_degrees, Color::WHITE, ); } @@ -387,7 +391,7 @@ impl MapRenderer { obj_def.visualization_radius { let player_dist_to_object = - (obj_ref.position - player_position).norm(); + (obj_ref.get_world_space_position() - player_position).norm(); // debug!( // "Player dist to object: {}", // player_dist_to_object @@ -405,10 +409,10 @@ impl MapRenderer { .unwrap(); tex.render_automatic( draw_handle, - obj_ref.position - (tex.size() / 2.0), + obj_ref.get_world_space_position() - (tex.size() / 2.0), None, Some(tex.size() / 2.0), - Some(obj_ref.rotation_radians.to_degrees()), + Some(obj_ref.rotation_degrees), Some(tint), ); } else { @@ -417,7 +421,7 @@ impl MapRenderer { .top_static_textures .get_mut(&object_key) .unwrap(); - let p: Vector2 = obj_ref.position.into(); + let p: Vector2 = obj_ref.get_world_space_position().into(); let r1 = Rectangle { x: 0.0, y: 0.0, @@ -439,7 +443,7 @@ impl MapRenderer { tex.width as f32 / 2.0, tex.height as f32 / 2.0, ), - obj_ref.rotation_radians.to_degrees(), + obj_ref.rotation_degrees, tint, ); } @@ -500,7 +504,7 @@ impl MapRenderer { // } // // Get the object definition - // let object_key = format!("{}:{}", obj_ref.kind, obj_ref.name); + // let object_key = obj_ref.into_key(); // let obj_def = self // .world_objects // .object_definitions @@ -543,6 +547,4 @@ impl MapRenderer { // // If we got here, the player is not in a collision zone // player_velocity // } - - }