package net.scapeemulator.game.model.player.skills.farming; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import net.scapeemulator.game.model.definition.ObjectDefinitions; import net.scapeemulator.game.model.player.Player; import net.scapeemulator.game.model.player.skills.farming.patch.AllotmentPatch; import net.scapeemulator.game.model.player.skills.farming.patch.IFarmPatch; import net.scapeemulator.game.model.player.skills.farming.plant.WeedsPlant; public class PlayerFarms { private static final int GROWTH_TICK_TIME = 20; private final Player player; private final Map<IFarmPatch, PatchState> patches; private int growthTick; public PlayerFarms(Player player) { this.player = player; this.patches = new HashMap<>(); for (AllotmentPatch allotment : AllotmentPatch.values()) { patches.put(allotment, new PatchState()); } } public PatchState getPatchState(IFarmPatch patch) { return patches.get(patch); } public void tick() { if (++growthTick >= GROWTH_TICK_TIME) { growthTick = 0; growthTick(); } } private void growthTick() { for (Entry<IFarmPatch, PatchState> entry : patches.entrySet()) { IFarmPatch patch = entry.getKey(); PatchState patchState = entry.getValue(); if (Farming.cycleActive(patchState.getPlant().getCycle())) { grow(patch); } } } private void grow(IFarmPatch patch) { PatchState state = patches.get(patch); switch (state.getPlantState()) { case GROWING: if (state.getPlant() instanceof WeedsPlant) { state.setPlant(((WeedsPlant) state.getPlant()).next(true)); sendUpdates(patch); return; } state.upStage(); // TODO if not protected by farmer/flowers if (!state.isProtected()) { double diseaseChance = state.getCompostType().getDiseaseChance(); if (Math.random() < diseaseChance) { // TODO alert if farming/nature necklace used state.setPlantState(PlantState.DISEASED); } } sendUpdates(patch); break; case DISEASED: // should this be guaranteed instead of a chance? if (Math.random() < 0.5) { state.setPlantState(PlantState.DEAD); sendUpdates(patch); } break; case WATERED: state.setPlantState(PlantState.GROWING); state.upStage(); sendUpdates(patch); break; default: return; } } public void sendUpdates(IFarmPatch patch) { // TODO save PatchState state = patches.get(patch); int varbitId = ObjectDefinitions.forId(patch.getObjectId()).getVarbitId(); if (varbitId < 0) { return; } int value = state.getPlant().getVarbit(state.getStage(), state.getPlantState()); if (player.getStateSet().getBitState(varbitId) != value) { player.getStateSet().setBitState(varbitId, value); } } private void water(IFarmPatch patch) { PatchState state = patches.get(patch); switch (state.getPlantState()) { case DEAD: player.sendMessage("That plant is dead, you should dig it up with a spade."); return; case DISEASED: player.sendMessage("That plant is diseased, you should find something to cure it with."); return; case WATERED: player.sendMessage("That plant is already watered. You should let it grow some more before watering it again."); return; case GROWN: player.sendMessage("That plant is already fully grown, you should harvest it."); return; case GROWING: // TODO animation, use water from watering can player.sendMessage("You water the plant."); player.playAnimation(Farming.WATERING_ANIM); // state.plantState = PlantState.WATERED; sendUpdates(patch); break; } } }