package org.mafagafogigante.dungeon.entity.creatures; import static org.mafagafogigante.dungeon.date.DungeonTimeUnit.DAY; import static org.mafagafogigante.dungeon.date.DungeonTimeUnit.SECOND; import org.mafagafogigante.dungeon.entity.Integrity; import org.mafagafogigante.dungeon.entity.items.Item; import org.mafagafogigante.dungeon.entity.items.ItemPreset; import org.mafagafogigante.dungeon.entity.items.ItemPresetFactory; import org.mafagafogigante.dungeon.game.Id; import org.mafagafogigante.dungeon.game.NameFactory; import org.mafagafogigante.dungeon.util.Percentage; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * A factory of ItemPreset for corpses. */ public final class CorpseItemPresetFactory implements ItemPresetFactory { private static final int CORPSE_DAMAGE = 2; private static final int CORPSE_INTEGRITY_DECREMENT_ON_HIT = 5; private static final long CORPSE_PUTREFACTION_PERIOD = DAY.as(SECOND); private static final Percentage CORPSE_HIT_RATE = new Percentage(0.5); private final CreatureFactory creatureFactory; /** * Creates a CorpseItemPresetFactory from the specified CreatureFactory. */ public CorpseItemPresetFactory(CreatureFactory creatureFactory) { this.creatureFactory = creatureFactory; } /** * Given a Creature ID, this method returns the corresponding corpse's ID. */ public static Id makeCorpseIdFromCreatureId(Id id) { return new Id(id + "_CORPSE"); } /** * Makes all CorpsePresets that this CorpseItemPresetFactory should make. */ @Override public Collection<ItemPreset> getItemPresets() { List<ItemPreset> itemPresets = new ArrayList<>(); for (CreaturePreset creaturePreset : creatureFactory.getPresets()) { if (creaturePreset.hasTag(Creature.Tag.CORPSE)) { itemPresets.add(makeCorpsePreset(creaturePreset)); } } return itemPresets; } /** * Makes a corpse preset from a creature preset. */ private ItemPreset makeCorpsePreset(CreaturePreset preset) { if (!preset.hasTag(Creature.Tag.CORPSE)) { throw new IllegalArgumentException("preset does not have the CORPSE tag."); } ItemPreset corpse = new ItemPreset(); corpse.setId(makeCorpseIdFromCreatureId(preset.getId())); corpse.setType("CORPSE"); corpse.setName(NameFactory.newCorpseName(preset.getName())); corpse.setWeight(preset.getWeight()); corpse.setPutrefactionPeriod(CORPSE_PUTREFACTION_PERIOD); corpse.setIntegrity(makeCorpseIntegrity(preset)); corpse.setVisibility(preset.getVisibility()); corpse.setLuminosity(preset.getLuminosity()); corpse.setHitRate(CORPSE_HIT_RATE); corpse.setIntegrityDecrementOnHit(CORPSE_INTEGRITY_DECREMENT_ON_HIT); corpse.setDamage(CORPSE_DAMAGE); corpse.addTag(Item.Tag.WEAPON); corpse.addTag(Item.Tag.WEIGHT_PROPORTIONAL_TO_INTEGRITY); corpse.addTag(Item.Tag.DECOMPOSES); return corpse; } private Integrity makeCorpseIntegrity(@NotNull final CreaturePreset preset) { // The health of the preset over two rounded up. final int integrity = (int) Math.ceil(preset.getHealth() / 2.0); return new Integrity(integrity, integrity); } }