diff --git a/common/agent.py b/common/agent.py index 6c62714..32c1b83 100644 --- a/common/agent.py +++ b/common/agent.py @@ -84,7 +84,7 @@ class AgentType(MyEnum): CommandPost = 22 # 指挥部 class ModuleType(MyEnum): - HANGER = 0 + HANGAR = 0 SUPPLY = 1 TRANSPORT = 2 @@ -267,7 +267,7 @@ class Agent: if module.module_type == ModuleType.SUPPLY: self._has_supply = True self.supply = module - elif module.module_type == ModuleType.HANGER: + elif module.module_type == ModuleType.HANGAR: self._parked_agents = module.parked_agents elif module.module_type == ModuleType.TRANSPORT: self._parked_agents = module.parked_agents @@ -312,15 +312,16 @@ class Agent: "team_id": self.team_id, "faction_id": self.faction_id, "move_type": self.move_type.name, - # "info_level": self.info_level, - # "stealth_level": self.stealth_level, + "info_level": self.info_level, + "stealth_level": self.stealth_level, "defense": self.defense, "max_endurance": self.max_endurance, "max_fuel": self.max_fuel, "switchable_weapons": [weapon.to_dict() for weapon in self.switchable_weapons], "modules": [module.to_dict() for module in self.modules], + "is_key": self.is_key, # 以下为可变属性 - "pos": list(self.pos), + "pos": {"q": self.pos[0], "r": self.pos[1]}, "endurance": self.endurance, "fuel": self.fuel, "mobility": self.mobility, @@ -505,9 +506,9 @@ class Module(ABC): "available_types": [agent_type.name for agent_type in self.available_types] } -class Hanger(Module): +class Hangar(Module): def __init__(self, available_types: List[AgentType] = None, capacity: int = 6): - super().__init__(module_type=ModuleType.HANGER, + super().__init__(module_type=ModuleType.HANGAR, add_endurance=4, add_ammo=-1, add_fuel=-1, @@ -538,5 +539,4 @@ class Transport(Module): self.parked_agents = [] def reset(self): - self.parked_agents = [] - + self.parked_agents = [] \ No newline at end of file diff --git a/common/utils.py b/common/utils.py index 41864ea..fc6a1ab 100644 --- a/common/utils.py +++ b/common/utils.py @@ -1,8 +1,9 @@ import heapq -from .agent import Agent, Weapon, Action, TileNode, Module, Supply, Hanger, Transport +from .agent import Agent, Weapon, Action, TileNode, Module, Supply, Hangar, Transport from .agent import MoveType, TerrainType, ActionType, AgentType, ModuleType from typing import Tuple, List, Dict, Union import numpy as np +import json # Define the cost matrix for agent types and terrain types cost_matrix = [ @@ -273,8 +274,8 @@ def dict_to_module(module_dict: dict) -> Module: available_types = [AgentType.from_input(agent_type) for agent_type in module_dict.get("available_types", [])] \ if module_dict.get("available_types", []) is not None else [] capacity = module_dict.get("capacity", 0) - if module_type == ModuleType.HANGER: - return Hanger(available_types=available_types, capacity=capacity) + if module_type == ModuleType.HANGAR: + return Hangar(available_types=available_types, capacity=capacity) elif module_type == ModuleType.SUPPLY: return Supply(available_types=available_types, capacity=capacity) elif module_type == ModuleType.TRANSPORT: @@ -298,4 +299,70 @@ def dict_to_agent(agent_dict: dict) -> Agent: mobility=agent_dict["mobility"], switchable_weapons=[dict_to_weapon(weapon_dict) for weapon_dict in agent_dict.get("switchable_weapons", [])], modules=[dict_to_module(module_dict) for module_dict in agent_dict.get("modules", [])] if agent_dict.get("modules", []) is not None else [] - ) \ No newline at end of file + ) + + +def json_to_markdown(json_data): + # 解析JSON数据 + if isinstance(json_data, str): + json_data = json.loads(json_data) + + # 递归转换字典 + def dict_to_markdown(d, indent=0): + markdown = "" + for key, value in d.items(): + markdown += " " * indent + f"- {key}: " + if isinstance(value, dict): + markdown += "\n" + dict_to_markdown(value, indent + 1) + elif isinstance(value, list): + markdown += "\n" + list_to_markdown(value, indent + 1) + else: + markdown += f"{value}\n" + return markdown + + # 递归转换列表 + def list_to_markdown(lst, indent=0): + markdown = "" + for item in lst: + if isinstance(item, dict): + markdown += dict_to_markdown(item, indent) + elif isinstance(item, list): + markdown += list_to_markdown(item, indent) + else: + markdown += " " * indent + f"- {item}\n" + return markdown + + # 判断是否是字典或列表 + if isinstance(json_data, dict): + return dict_to_markdown(json_data) + elif isinstance(json_data, list): + return list_to_markdown(json_data) + else: + return str(json_data) + + +def increase_markdown_indent(markdown_str, levels=1, use_tabs=False): + # 根据需要使用空格或制表符来增加缩进 + indent = "\t" * levels if use_tabs else " " * levels + + # 将每一行加上缩进 + lines = markdown_str.split("\n") + indented_lines = [indent + line for line in lines] + + # 返回增加层级后的Markdown字符串 + return "\n".join(indented_lines) + + +def agent_list_to_markdown(agent_list): + result = "" + for agent in agent_list: + result += f"### Agent {agent.agent_id}\n" + result += json_to_markdown(agent.to_dict()) + "\n" + return result + +def battlefield_list_to_markdown(battlefield_list): + result = "" + for battlefield in battlefield_list: + result += f"### Battlefield {battlefield['sectorName']}\n" + result += json_to_markdown(battlefield) + "\n" + return result \ No newline at end of file diff --git a/yes_cmdr_env.py b/yes_cmdr_env.py index 249bbec..ae71475 100644 --- a/yes_cmdr_env.py +++ b/yes_cmdr_env.py @@ -213,6 +213,22 @@ class YesCmdrEnv(gym.Env): return agent raise ValueError(f"Invalid agent id: {agent_id}") + def get_agents(self, agent_ids: List[str]) -> List[Agent]: + agents = [] + for agent_id in agent_ids: + agent = self.get_agent(agent_id) + # if not agent.alive: + # raise ValueError(f"Agent {agent_id} is not alive") + agents.append(agent) + return agents + + def get_agents_dict(self, agent_ids: List[str]) -> Dict[str, dict]: + agents_dict = {} + for agent_id in agent_ids: + agent = self.get_agent(agent_id) + agents_dict[agent_id] = agent.to_dict() + return agents_dict + def get_node(self, pos: Tuple[int, int]) -> TileNode: if pos not in self.map.nodes: raise ValueError(f"Invalid position: {pos}") @@ -1286,6 +1302,16 @@ class YesCmdrEnv(gym.Env): return obs, reward, terminated, truncated, info + def format_agents(self, agent_ids = None): + if agent_ids is None: + agent_ids = self.current_agents_dict.keys() + return json_to_markdown(self.get_agents_dict(agent_ids)) - + def format_battlefeild(self, battlefield_info): + dict_info = {} + dict_info["battlefield_name"] = battlefield_info["sectorName"] + dict_info["my_agents"] = self.get_agents_dict(battlefield_info["myUnitsID"]) + dict_info["ally_agents"] = self.get_agents_dict(battlefield_info["allyUnitsID"]) + dict_info["enemy_agents"] = self.get_agents_dict(battlefield_info["hostileUnitsID"]) + return json_to_markdown(dict_info) \ No newline at end of file