Skip to content

Commit 80c1cf6

Browse files
committed
cp
1 parent b935bc4 commit 80c1cf6

33 files changed

+209
-554
lines changed

packages/cogames/src/cogames/cli/mission.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,6 @@ def describe_mission(mission_name: str, game_config: MettaGridConfig, mission_cf
533533

534534
# Display agent configuration
535535
console.print("\n[bold]Agent Configuration:[/bold]")
536-
console.print(f" • Default resource limit: {game_config.game.agent.default_resource_limit}")
537-
if game_config.game.agent.resource_limits:
538-
console.print(f" • Resource limits: {game_config.game.agent.resource_limits}")
536+
console.print(f" • Default resource limit: {game_config.game.agent.inventory.default_limit}")
537+
if game_config.game.agent.inventory.limits:
538+
console.print(f" • Resource limits: {game_config.game.agent.inventory.limits}")

packages/cogames/src/cogames/cogs_vs_clips/evals/diagnostic_evals.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -165,24 +165,24 @@ def _post(cfg: MettaGridConfig) -> None:
165165
def _apply_inventory_seed(self, cfg: MettaGridConfig) -> None:
166166
if not self.inventory_seed:
167167
return
168-
seed = dict(cfg.game.agent.initial_inventory)
168+
seed = dict(cfg.game.agent.inventory.initial)
169169
seed.update(self.inventory_seed)
170-
cfg.game.agent.initial_inventory = seed
170+
cfg.game.agent.inventory.initial = seed
171171

172172
def _apply_communal_chest(self, cfg: MettaGridConfig) -> None:
173173
if self.communal_chest_hearts is None:
174174
return
175175
chest = cfg.game.objects.get("communal_chest")
176176
if isinstance(chest, ChestConfig):
177-
chest.initial_inventory = self.communal_chest_hearts
177+
chest.inventory.initial = self.communal_chest_hearts
178178

179179
def _apply_resource_chests(self, cfg: MettaGridConfig) -> None:
180180
if not self.resource_chest_stock:
181181
return
182182
for resource, amount in self.resource_chest_stock.items():
183183
chest_cfg = cfg.game.objects.get(f"chest_{resource}")
184184
if isinstance(chest_cfg, ChestConfig):
185-
chest_cfg.initial_inventory = amount
185+
chest_cfg.inventory.initial = amount
186186

187187
def _apply_extractor_settings(self, cfg: MettaGridConfig) -> None:
188188
for resource in RESOURCE_NAMES:
@@ -249,9 +249,9 @@ def _apply_heart_reward_cap(self, cfg: MettaGridConfig) -> None:
249249
if not isinstance(obj, ChestConfig):
250250
continue
251251
# Find existing heart limit or create new one
252-
heart_limit = obj.resource_limits.get("heart", ResourceLimitsConfig(limit=1, resources=["heart"]))
252+
heart_limit = obj.inventory.limits.get("heart", ResourceLimitsConfig(limit=1, resources=["heart"]))
253253
heart_limit.limit = 1
254-
obj.resource_limits["heart"] = heart_limit
254+
obj.inventory.limits["heart"] = heart_limit
255255

256256
def _ensure_minimal_heart_recipe(self, assembler: AssemblerConfig) -> None:
257257
minimal_inputs = {
@@ -444,7 +444,7 @@ def configure_env(self, cfg: MettaGridConfig) -> None:
444444
assembler.protocols = updated_protocols
445445

446446
agent_cfg = cfg.game.agent
447-
inventory = dict(agent_cfg.initial_inventory)
447+
inventory = dict(agent_cfg.inventory.initial)
448448
for res in resources:
449449
inventory.pop(res, None)
450450

@@ -459,7 +459,7 @@ def configure_env(self, cfg: MettaGridConfig) -> None:
459459
else:
460460
inventory.pop("decoder", None)
461461

462-
agent_cfg.initial_inventory = inventory
462+
agent_cfg.inventory.initial = inventory
463463

464464

465465
class DiagnosticUnclipCraft(_UnclipBase):
@@ -495,9 +495,9 @@ class DiagnosticChargeUp(_DiagnosticMissionBase):
495495
def configure_env(self, cfg: MettaGridConfig) -> None:
496496
# Set starting energy to 30 and no regen
497497
agent = cfg.game.agent
498-
agent.initial_inventory = dict(agent.initial_inventory)
499-
agent.initial_inventory["energy"] = 60
500-
agent.inventory_regen_amounts = {"default": {"energy": 0}}
498+
agent.inventory.initial = dict(agent.inventory.initial)
499+
agent.inventory.initial["energy"] = 60
500+
agent.inventory.regen_amounts = {"energy": 0}
501501

502502

503503
class DiagnosticAgile(_DiagnosticMissionBase):
@@ -540,10 +540,10 @@ class DiagnosticRadial(_DiagnosticMissionBase):
540540

541541
def configure_env(self, cfg: MettaGridConfig) -> None:
542542
agent = cfg.game.agent
543-
inventory = dict(agent.initial_inventory)
543+
inventory = dict(agent.inventory.initial)
544544
inventory["energy"] = 255
545-
agent.initial_inventory = inventory
546-
agent.inventory_regen_amounts = {"default": {"energy": 255}}
545+
agent.inventory.initial = inventory
546+
agent.inventory.regen_amounts = {"energy": 255}
547547

548548

549549
# ----------------------------------------------------------------------
@@ -600,9 +600,9 @@ class DiagnosticChargeUpHard(_DiagnosticMissionBase):
600600
def configure_env(self, cfg: MettaGridConfig) -> None:
601601
# Set starting energy to 30 and no regen
602602
agent = cfg.game.agent
603-
agent.initial_inventory = dict(agent.initial_inventory)
604-
agent.initial_inventory["energy"] = 60
605-
agent.inventory_regen_amounts = {"default": {"energy": 0}}
603+
agent.inventory.initial = dict(agent.inventory.initial)
604+
agent.inventory.initial["energy"] = 60
605+
agent.inventory.regen_amounts = {"energy": 0}
606606

607607

608608
class DiagnosticMemoryHard(_DiagnosticMissionBase):
@@ -689,10 +689,10 @@ class DiagnosticRadialHard(_DiagnosticMissionBase):
689689

690690
def configure_env(self, cfg: MettaGridConfig) -> None:
691691
agent = cfg.game.agent
692-
inventory = dict(agent.initial_inventory)
692+
inventory = dict(agent.inventory.initial)
693693
inventory["energy"] = 255
694-
agent.initial_inventory = inventory
695-
agent.inventory_regen_amounts = {"default": {"energy": 255}}
694+
agent.inventory.initial = inventory
695+
agent.inventory.regen_amounts = {"energy": 255}
696696

697697

698698
DIAGNOSTIC_EVALS: list[type[_DiagnosticMissionBase]] = [

packages/cogames/src/cogames/cogs_vs_clips/mission.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
ClipperConfig,
2727
GameConfig,
2828
GlobalObsConfig,
29+
InventoryConfig,
2930
MettaGridConfig,
3031
MoveActionConfig,
3132
NoopActionConfig,
@@ -180,25 +181,24 @@ def make_env(self) -> MettaGridConfig:
180181
),
181182
),
182183
agent=AgentConfig(
183-
resource_limits={
184-
"heart": ResourceLimitsConfig(limit=self.heart_capacity, resources=["heart"]),
185-
"energy": ResourceLimitsConfig(limit=self.energy_capacity, resources=["energy"]),
186-
"cargo": ResourceLimitsConfig(
187-
limit=self.cargo_capacity, resources=["carbon", "oxygen", "germanium", "silicon"]
188-
),
189-
"gear": ResourceLimitsConfig(
190-
limit=self.gear_capacity, resources=["scrambler", "modulator", "decoder", "resonator"]
191-
),
192-
},
184+
inventory=InventoryConfig(
185+
limits={
186+
"heart": ResourceLimitsConfig(limit=self.heart_capacity, resources=["heart"]),
187+
"energy": ResourceLimitsConfig(limit=self.energy_capacity, resources=["energy"]),
188+
"cargo": ResourceLimitsConfig(
189+
limit=self.cargo_capacity, resources=["carbon", "oxygen", "germanium", "silicon"]
190+
),
191+
"gear": ResourceLimitsConfig(
192+
limit=self.gear_capacity, resources=["scrambler", "modulator", "decoder", "resonator"]
193+
),
194+
},
195+
initial={"energy": self.energy_capacity},
196+
regen_amounts={"energy": self.energy_regen_amount},
197+
),
193198
rewards=AgentRewards(
194199
stats={"chest.heart.amount": 1 / num_cogs},
195200
),
196-
initial_inventory={
197-
"energy": self.energy_capacity,
198-
},
199201
vibe_transfers={"charger": {"energy": 20}},
200-
inventory_regen_amounts={"default": {"energy": self.energy_regen_amount}},
201-
diversity_tracked_resources=["energy", "carbon", "oxygen", "germanium", "silicon", "heart"],
202202
),
203203
inventory_regen_interval=self.inventory_regen_interval,
204204
clipper=ClipperConfig(

packages/cogames/src/cogames/cogs_vs_clips/stations.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@
22

33
from mettagrid.base_config import Config
44
from mettagrid.config import vibes
5-
from mettagrid.config.mettagrid_config import AssemblerConfig, ChestConfig, GridObjectConfig, ProtocolConfig, WallConfig
5+
from mettagrid.config.mettagrid_config import (
6+
AssemblerConfig,
7+
ChestConfig,
8+
GridObjectConfig,
9+
InventoryConfig,
10+
ProtocolConfig,
11+
WallConfig,
12+
)
613

714
resources = [
815
"energy",
@@ -190,7 +197,7 @@ def station_cfg(self) -> ChestConfig:
190197
"silicon_a": {"silicon": -25},
191198
"silicon_b": {"silicon": 25},
192199
},
193-
initial_inventory=self.initial_inventory,
200+
inventory=InventoryConfig(initial=self.initial_inventory),
194201
)
195202

196203

packages/cogames/src/cogames/cogs_vs_clips/variants.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -337,24 +337,24 @@ def modify_env(self, mission, env) -> None:
337337

338338
if hearts > 0:
339339
agent_cfg = env.game.agent
340-
agent_cfg.initial_inventory = dict(agent_cfg.initial_inventory)
340+
agent_cfg.inventory.initial = dict(agent_cfg.inventory.initial)
341341

342342
def _limit_for(resource: str) -> int:
343-
return agent_cfg.get_limit_for_resource(resource)
343+
return agent_cfg.inventory.get_limit(resource)
344344

345345
for resource_name, per_heart_value in per_heart.items():
346-
current = int(agent_cfg.initial_inventory.get(resource_name, 0))
346+
current = int(agent_cfg.inventory.initial.get(resource_name, 0))
347347
target = current + per_heart_value * hearts
348348
cap = _limit_for(resource_name)
349-
agent_cfg.initial_inventory[resource_name] = min(cap, target)
349+
agent_cfg.inventory.initial[resource_name] = min(cap, target)
350350

351351
if self.heart_capacity is not None:
352352
agent_cfg = env.game.agent
353-
hearts_limit = agent_cfg.resource_limits.get("heart")
353+
hearts_limit = agent_cfg.inventory.limits.get("heart")
354354
if hearts_limit is None:
355355
hearts_limit = ResourceLimitsConfig(limit=self.heart_capacity, resources=["heart"])
356356
hearts_limit.limit = max(int(hearts_limit.limit), int(self.heart_capacity))
357-
agent_cfg.resource_limits["heart"] = hearts_limit
357+
agent_cfg.inventory.limits["heart"] = hearts_limit
358358

359359

360360
class ChestHeartTuneVariant(MissionVariant):
@@ -377,10 +377,10 @@ def modify_env(self, mission, env) -> None:
377377
chest_cfg = env.game.objects["chest"]
378378
if not isinstance(chest_cfg, ChestConfig):
379379
raise TypeError("Expected 'chest' to be ChestConfig")
380-
start = dict(chest_cfg.initial_inventory)
380+
start = dict(chest_cfg.inventory.initial)
381381
for k, v in per_heart.items():
382382
start[k] = start.get(k, 0) + v * hearts
383-
chest_cfg.initial_inventory = start
383+
chest_cfg.inventory.initial = start
384384

385385

386386
class ExtractorHeartTuneVariant(MissionVariant):

packages/cogames/tests/test_cogs_vs_clips.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ def test_inventory_heart_tune_caps_initial_inventory_to_limits():
5454
env = mission.make_env()
5555
agent = env.game.agent
5656

57-
# Find energy limit from resource_limits list
58-
energy_limit = agent.get_limit_for_resource("energy")
59-
assert agent.initial_inventory["energy"] == energy_limit
57+
# Find energy limit from inventory.limits
58+
energy_limit = agent.inventory.get_limit("energy")
59+
assert agent.inventory.initial["energy"] == energy_limit
6060

6161

6262
def _station_configs(mission: Mission) -> list[CvCStationConfig]:

packages/cogames/tests/test_cvc_assembler_hearts.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@
3535
def _make_simulation() -> Simulation:
3636
cfg = MettaGridConfig.EmptyRoom(num_agents=4, with_walls=True)
3737
cfg.game.resource_names = RESOURCES
38-
cfg.game.agent.default_resource_limit = 255
39-
cfg.game.agent.resource_limits = {name: ResourceLimitsConfig(limit=255, resources=[name]) for name in RESOURCES}
40-
cfg.game.agent.initial_inventory = {name: 0 for name in RESOURCES}
38+
cfg.game.agent.inventory.default_limit = 255
39+
cfg.game.agent.inventory.limits = {name: ResourceLimitsConfig(limit=255, resources=[name]) for name in RESOURCES}
40+
cfg.game.agent.inventory.initial = {name: 0 for name in RESOURCES}
4141

4242
cfg.game.actions.noop.enabled = True
4343
cfg.game.actions.move.enabled = True

packages/mettagrid/cpp/bindings/mettagrid_c.cpp

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -537,19 +537,12 @@ void MettaGrid::_step() {
537537
}
538538
}
539539

540-
// Handle per-agent inventory regeneration (global interval check, vibe-dependent amounts)
540+
// Handle per-agent inventory regeneration (global interval check)
541541
if (_inventory_regen_interval > 0 && current_step % _inventory_regen_interval == 0) {
542542
for (auto* agent : _agents) {
543543
if (!agent->inventory_regen_amounts.empty()) {
544-
// Look up regen amounts for agent's current vibe, fall back to "default" (vibe ID 0)
545-
auto vibe_it = agent->inventory_regen_amounts.find(agent->vibe);
546-
if (vibe_it == agent->inventory_regen_amounts.end()) {
547-
vibe_it = agent->inventory_regen_amounts.find(0); // "default" is vibe ID 0
548-
}
549-
if (vibe_it != agent->inventory_regen_amounts.end()) {
550-
for (const auto& [item, amount] : vibe_it->second) {
551-
agent->inventory.update(item, amount);
552-
}
544+
for (const auto& [item, amount] : agent->inventory_regen_amounts) {
545+
agent->inventory.update(item, amount);
553546
}
554547
}
555548
}

packages/mettagrid/cpp/include/mettagrid/actions/attack.hpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,8 @@ class Attack : public ActionHandler {
148148
snapshot.emplace_back(item, amount);
149149
}
150150

151-
// Transfer resources (excluding soul-bound resources)
151+
// Transfer resources
152152
for (const auto& [item, amount] : snapshot) {
153-
// Check if this resource is soul-bound for the target
154-
if (std::find(target.soul_bound_resources.begin(), target.soul_bound_resources.end(), item) !=
155-
target.soul_bound_resources.end()) {
156-
// Skip soul-bound resources
157-
continue;
158-
}
159-
160153
InventoryDelta stolen = actor.inventory.update(item, amount);
161154
target.inventory.update(item, -stolen);
162155

packages/mettagrid/cpp/include/mettagrid/core/types.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ using MaskType = bool;
5353
using SuccessType = bool;
5454

5555
using InventoryItem = uint8_t;
56-
using InventoryQuantity = uint8_t;
57-
using InventoryDelta = int16_t; // cover full range of allowed changes (+/-255)
56+
using InventoryQuantity = uint16_t;
57+
using InventoryDelta = int32_t; // cover full range of allowed changes (+/-65535)
5858

5959
using GridCoord = uint16_t; // this sets the maximum possible map width or height
6060
using GridObjectId = uint32_t; // this sets the maximum tracked objects

0 commit comments

Comments
 (0)