Added initial game logic service

This commit is contained in:
2025-06-24 14:10:27 -04:00
parent 4c91fe3557
commit f75782885b
30 changed files with 1366 additions and 43 deletions

View File

@@ -0,0 +1,85 @@
pub mod components;
mod entity_factory;
mod id_manager;
mod loader;
mod random;
mod game_logic_service;
mod game_service;
use dotenv::dotenv;
use std::env;
use hecs::World;
use tracing::{debug, error, info};
use utils::service_discovery::{get_kube_service_endpoints_by_dns, get_service_endpoints_by_dns};
use utils::{health_check, logging};
use loader::load_zone_for_map;
use crate::components::position::Position;
use crate::entity_factory::EntityFactory;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
dotenv().ok();
let app_name = env!("CARGO_PKG_NAME");
logging::setup_logging(app_name, &["game_logic_service", "health_check"]);
let map_id = env::var("MAP_ID").unwrap_or_else(|_| "20".to_string()).parse::<u32>()?;
let file_path = "/opt/data/zone_data.json";
// // Set the gRPC server address
let addr = env::var("LISTEN_ADDR").unwrap_or_else(|_| "0.0.0.0".to_string());
let port = env::var("SERVICE_PORT").unwrap_or_else(|_| "50056".to_string());
let db_url = format!(
"http://{}",
get_kube_service_endpoints_by_dns("database-service", "tcp", "database-service")
.await?
.get(0)
.unwrap()
);
let chat_service = format!(
"http://{}",
get_kube_service_endpoints_by_dns("chat-service", "tcp", "chat-service")
.await?
.get(0)
.unwrap()
);
let game_logic_task = tokio::spawn(async move {
let mut loading = true;
let mut world = World::new();
let mut factory = EntityFactory::new(&mut world);
loop {
// Load the map
if loading {
match load_zone_for_map(file_path, map_id) {
Ok(Some(zone)) => {
info!("Zone with Map Id {} found:", map_id);
factory.load_map(zone);
loading = false;
}
Ok(None) => {
error!("No zone found for Map Id {}", map_id);
std::thread::sleep(std::time::Duration::from_secs(1));
}
Err(e) => {
error!("Error loading zone: {}", e);
std::thread::sleep(std::time::Duration::from_secs(1));
}
}
}
// Update the world
if !loading {
factory.run();
}
std::thread::sleep(std::time::Duration::from_millis(1000/30));
}
});
// Register service with Consul
// health_check::start_health_check(addr.as_str()).await?;
utils::signal_handler::wait_for_signal().await;
Ok(())
}