package com.cardshifter.ai;
import net.zomis.aiscores.FScorer;
import net.zomis.aiscores.ScoreConfigFactory;
import net.zomis.aiscores.scorers.PredicateScorer;
import net.zomis.aiscores.scorers.Scorers;
import net.zomis.aiscores.scorers.SimpleScorer;
import net.zomis.cardshifter.ecs.config.ConfigComponent;
import com.cardshifter.api.config.DeckConfig;
import net.zomis.cardshifter.ecs.usage.CyborgChroniclesGame;
import com.cardshifter.ai.phrancis.AttackAnalyze;
import com.cardshifter.modapi.actions.ECSAction;
import com.cardshifter.modapi.base.Entity;
public class AIs {
private static FScorer<Entity, ECSAction> playActionScorer = new PredicateScorer<>(action -> action.getName().equals(CyborgChroniclesGame.PLAY_ACTION));
public static ScoreConfigFactory<Entity, ECSAction> loser() {
ScoreConfigFactory<Entity, ECSAction> config = new ScoreConfigFactory<>();
config.withScorer(new PredicateScorer<>(action -> action.getName().equals(CyborgChroniclesGame.END_TURN_ACTION)));
return config;
}
public static ScoreConfigFactory<Entity, ECSAction> idiot() {
return new ScoreConfigFactory<>();
}
public static ScoreConfigFactory<Entity, ECSAction> medium() {
ScoreConfigFactory<Entity, ECSAction> config = new ScoreConfigFactory<>();
config.withScorer(new PredicateScorer<>(action -> action.getName().equals(CyborgChroniclesGame.USE_ACTION)), -10);
config.withScorer(new PredicateScorer<>(action -> action.getName().equals(CyborgChroniclesGame.PLAY_ACTION)), 10);
config.withScorer(new PredicateScorer<>(action -> action.getName().equals(CyborgChroniclesGame.ENCHANT_ACTION)), -10); // this AI does not enchant
config.withScorer(new SimpleScorer<Entity, ECSAction>(AttackAnalyze::scrapScore));
config.withScorer(new SimpleScorer<Entity, ECSAction>(AttackAnalyze::attackScore));
return config;
}
public static ScoreConfigFactory<Entity, ECSAction> fighter() {
ScoreConfigFactory<Entity, ECSAction> config = new ScoreConfigFactory<>();
config.withScorer(Scorers.multiplication(playActionScorer, new SimpleScorer<Entity, ECSAction>(AttackAnalyze::health)), 10);
config.withScorer(Scorers.multiplication(playActionScorer, new SimpleScorer<Entity, ECSAction>(AttackAnalyze::attack)), 2);
config.withScorer(new PredicateScorer<>(action -> action.getName().equals(CyborgChroniclesGame.USE_ACTION)), -10);
config.withScorer(new PredicateScorer<>(action -> action.getName().equals(CyborgChroniclesGame.SCRAP_ACTION)), -1);
config.withScorer(Scorers.multiplication(new SimpleScorer<Entity, ECSAction>(AttackAnalyze::scrapNeeded),
new SimpleScorer<Entity, ECSAction>(AttackAnalyze::scrapIfCanGetKilled)));
// config.withScorer(new SimpleScorer<>(AttackAnalyze::scrapScore));
config.withScorer(new SimpleScorer<Entity, ECSAction>(AttackAnalyze::attackScore));
config.withScorer(new SimpleScorer<Entity, ECSAction>(AttackAnalyze::enchantScore));
return config;
}
public static void mediumDeck(Entity entity, ConfigComponent config) {
DeckConfig deck = config.getConfig(DeckConfig.class);
createDeckFullWith(deck, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); // All B0Ts
}
private static void createDeckFullWith(DeckConfig deck, int... ids) {
if (deck == null) {
return;
}
for (int id : ids) {
if (deck.total() >= deck.getMaxSize()) {
return;
}
deck.setChosen(id, deck.getMaxFor(id));
}
}
public static void fighterDeck(Entity entity, ConfigComponent config) {
DeckConfig deck = config.getConfig(DeckConfig.class);
createDeckFullWith(deck, 4, 7, 8, 12, 16, 18, 24, 26, 27);
deckAdd(deck, 9, 9, 19);
}
private static void deckAdd(DeckConfig deck, int... ids) {
if (deck == null) {
return;
}
for (int id : ids) {
if (deck.total() >= deck.getMaxSize()) {
return;
}
deck.add(id);
}
}
}