package org.mafagafogigante.dungeon.world; import org.mafagafogigante.dungeon.entity.creatures.Observer; import java.io.Serializable; public class TimeVisibilityCriterion implements Serializable, VisibilityCriterion { private static final int HOURS_IN_DAY = 24; private final int begin; private final int duration; /** * Constructs a new TimeVisibilityCriterion that starts at begin and ends at end. * * @param begin the hour when it begins, nonnegative, smaller than the number of hours in the day * @param end the hour when it ends, nonnegative, smaller than the number of hours in the day, not equal to begin */ public TimeVisibilityCriterion(final int begin, final int end) { if (end >= HOURS_IN_DAY) { throw new IllegalArgumentException("end should be a valid hour"); } this.begin = begin; if (begin == end) { throw new IllegalArgumentException("begin should not be equal to end"); } else if (begin < end) { this.duration = end - begin; } else { this.duration = HOURS_IN_DAY + end - begin; } } @Override public boolean isMetBy(Observer observer) { final long hour = observer.getObserverLocation().getWorld().getWorldDate().getHour(); long delta = hour - begin; if (delta < 0) { delta += HOURS_IN_DAY; } return delta < duration; } }