package com.spbsu.crawl.learning;
import com.spbsu.commons.util.Pair;
import com.spbsu.crawl.bl.Mob;
import com.spbsu.crawl.bl.crawlSystemView.SystemView;
import com.spbsu.crawl.bl.events.PlayerActionListener;
import com.spbsu.crawl.bl.helpers.CategoricalFeaturesMap;
import com.spbsu.crawl.learning.features.Feature;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class LearnDataBuilder implements PlayerActionListener {
private static final String STATUS_DICT_FILE = "status_keys.json";
private final CategoricalFeaturesMap catFeaturesMap;
private final List<Pair<State, Mob.Action>> session = new ArrayList<>();
private final List<FeaturesBuilder> builders = new ArrayList<>();
public LearnDataBuilder() throws IOException {
builders.add(new InventoryFeaturesBuilder());
File statusFeaturesJsonFile = new File(STATUS_DICT_FILE);
if (statusFeaturesJsonFile.isFile()) {
catFeaturesMap = CategoricalFeaturesMap.load(statusFeaturesJsonFile);
} else {
catFeaturesMap = new CategoricalFeaturesMap();
}
builders.add(new StatusFeaturesBuilder(catFeaturesMap));
builders.add(new HeroFeaturesBuilder());
}
@Override
public void action(final Mob.Action action) {
final List<Feature> features = builders.stream().flatMap(FeaturesBuilder::tickFeatures).collect(Collectors.toList());
session.add(Pair.create(new State(features), action));
}
public void attach(final SystemView view) {
builders.forEach(view::subscribe);
view.subscribe(this);
}
public List<Pair<State, Mob.Action>> session() {
return session;
}
public void endGame() {
catFeaturesMap.save(new File(STATUS_DICT_FILE));
}
}