package com.cardshifter.modapi.resources; import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.stream.Stream; import com.cardshifter.modapi.base.Component; import com.cardshifter.modapi.base.CopyableComponent; import com.cardshifter.modapi.base.Entity; public class ECSResourceMap extends Component implements CopyableComponent { private final Map<ECSResource, ECSResourceData> map = new HashMap<>(); private ECSResourceMap() { } public ECSResourceMap set(ECSResource res, int value) { ECSResourceData data = getResource(res); data.set(value); return this; } public Optional<ECSResourceData> get(ECSResource res) { return Optional.ofNullable(map.get(res)); } public ECSResourceData getResource(ECSResource res) { map.computeIfAbsent(res, r -> new ECSResourceData(getEntity(), r)); return map.get(res); } public static ECSResourceMap createFor(Entity entity) { ECSResourceMap res = new ECSResourceMap(); entity.addComponent(res); return res; } public static ECSResourceMap createOrGetFor(Entity entity) { ECSResourceMap res = entity.getComponent(ECSResourceMap.class); if (res == null) { res = new ECSResourceMap(); entity.addComponent(res); } return res; } @Override public String toString() { return map.toString(); } public Stream<ECSResourceData> getResources() { return map.values().stream(); } @Override public Component copy(Entity copyTo) { ECSResourceMap copy = new ECSResourceMap(); for (ECSResourceData data : map.values()) { ECSResourceData copyData = data.copy(copyTo); copy.map.put(data.getResource(), copyData); } return copy; } }