package com.projectsacrifice.game; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** Allocation-free critical-state comparison after a level has been configured. */ final class AccessibilityStateCache { private List signalIds = Collections.emptyList(); private GameLanguage language; private int activeSignals = Integer.MIN_VALUE; private int openDoors = Integer.MIN_VALUE; private int totalDoors = Integer.MIN_VALUE; private boolean playerAlive; private String statusText; void configureSignals(List sourceIds) { ArrayList unique = new ArrayList<>(); for (String signalId : sourceIds) { if (!unique.contains(signalId)) unique.add(signalId); } signalIds = Collections.unmodifiableList(unique); language = null; activeSignals = Integer.MIN_VALUE; openDoors = Integer.MIN_VALUE; totalDoors = Integer.MIN_VALUE; statusText = null; } List signalIds() { return signalIds; } boolean update(GameStrings strings, int updatedActiveSignals, int updatedOpenDoors, int updatedTotalDoors, boolean updatedPlayerAlive) { GameLanguage updatedLanguage = strings.language(); if (statusText != null && language == updatedLanguage && activeSignals == updatedActiveSignals && openDoors == updatedOpenDoors && totalDoors == updatedTotalDoors && playerAlive == updatedPlayerAlive) { return false; } language = updatedLanguage; activeSignals = updatedActiveSignals; openDoors = updatedOpenDoors; totalDoors = updatedTotalDoors; playerAlive = updatedPlayerAlive; statusText = AccessibilityStatus.describe(strings, activeSignals, signalIds.size(), openDoors, totalDoors, playerAlive); return true; } String statusText() { return statusText; } }