/* * Copyright (C) 2016 MegaMek team * * This file is part of MekHQ. * * MekHQ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * MekHQ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see <http://www.gnu.org/licenses/>. */ package mekhq.campaign.mod.am; import java.util.Map.Entry; import java.util.NavigableMap; import java.util.TreeMap; import java.util.function.Function; import java.util.function.IntUnaryOperator; import mekhq.Utilities; import mekhq.campaign.personnel.BodyLocation; /** * Home to static methods returning a random hit location given a random integer value generator * and a function to check if a given {@link BodyLocation} is valid. */ public class HitLocationGen { // Roll tables private static NavigableMap<Integer, BodyLocation> GENERIC_RANDOM_HIT_TABLE = new TreeMap<>(); static { GENERIC_RANDOM_HIT_TABLE.put(10, BodyLocation.HEAD); GENERIC_RANDOM_HIT_TABLE.put(30, BodyLocation.CHEST); GENERIC_RANDOM_HIT_TABLE.put(40, BodyLocation.ABDOMEN); GENERIC_RANDOM_HIT_TABLE.put(43, BodyLocation.LEFT_HAND); GENERIC_RANDOM_HIT_TABLE.put(55, BodyLocation.LEFT_ARM); GENERIC_RANDOM_HIT_TABLE.put(58, BodyLocation.RIGHT_HAND); GENERIC_RANDOM_HIT_TABLE.put(70, BodyLocation.RIGHT_ARM); GENERIC_RANDOM_HIT_TABLE.put(76, BodyLocation.LEFT_FOOT); GENERIC_RANDOM_HIT_TABLE.put(100, BodyLocation.LEFT_LEG); GENERIC_RANDOM_HIT_TABLE.put(106, BodyLocation.RIGHT_FOOT); GENERIC_RANDOM_HIT_TABLE.put(130, BodyLocation.RIGHT_LEG); GENERIC_RANDOM_HIT_TABLE.put(133, BodyLocation.RIGHT_HAND); GENERIC_RANDOM_HIT_TABLE.put(145, BodyLocation.RIGHT_ARM); GENERIC_RANDOM_HIT_TABLE.put(148, BodyLocation.LEFT_HAND); GENERIC_RANDOM_HIT_TABLE.put(160, BodyLocation.LEFT_ARM); GENERIC_RANDOM_HIT_TABLE.put(170, BodyLocation.ABDOMEN); GENERIC_RANDOM_HIT_TABLE.put(190, BodyLocation.CHEST); GENERIC_RANDOM_HIT_TABLE.put(200, BodyLocation.HEAD); } private static NavigableMap<Integer, BodyLocation> MECH_RANDOM_HIT_TABLE = new TreeMap<>(); static { MECH_RANDOM_HIT_TABLE.put(25, BodyLocation.HEAD); MECH_RANDOM_HIT_TABLE.put(41, BodyLocation.CHEST); MECH_RANDOM_HIT_TABLE.put(48, BodyLocation.ABDOMEN); MECH_RANDOM_HIT_TABLE.put(61, BodyLocation.LEFT_ARM); MECH_RANDOM_HIT_TABLE.put(74, BodyLocation.RIGHT_ARM); MECH_RANDOM_HIT_TABLE.put(79, BodyLocation.LEFT_FOOT); MECH_RANDOM_HIT_TABLE.put(100, BodyLocation.LEFT_LEG); MECH_RANDOM_HIT_TABLE.put(105, BodyLocation.RIGHT_FOOT); MECH_RANDOM_HIT_TABLE.put(126, BodyLocation.RIGHT_LEG); MECH_RANDOM_HIT_TABLE.put(131, BodyLocation.RIGHT_HAND); MECH_RANDOM_HIT_TABLE.put(139, BodyLocation.RIGHT_ARM); MECH_RANDOM_HIT_TABLE.put(144, BodyLocation.LEFT_HAND); MECH_RANDOM_HIT_TABLE.put(152, BodyLocation.LEFT_ARM); MECH_RANDOM_HIT_TABLE.put(159, BodyLocation.ABDOMEN); MECH_RANDOM_HIT_TABLE.put(176, BodyLocation.CHEST); MECH_RANDOM_HIT_TABLE.put(200, BodyLocation.HEAD); } private static BodyLocation queryRandomTable(NavigableMap<Integer, BodyLocation> table, IntUnaryOperator rnd, Function<BodyLocation, Boolean> validCheck) { validCheck = Utilities.nonNull(validCheck, (loc) -> true); Entry<Integer, BodyLocation> entry = null; do { entry = table.ceilingEntry(rnd.applyAsInt(table.lastKey().intValue()) + 1); } while((null == entry) || !validCheck.apply(entry.getValue())); return entry.getValue(); } public static BodyLocation generic(IntUnaryOperator rnd, Function<BodyLocation, Boolean> validCheck) { return queryRandomTable(GENERIC_RANDOM_HIT_TABLE, rnd, validCheck); } public static BodyLocation mechAndAsf(IntUnaryOperator rnd, Function<BodyLocation, Boolean> validCheck) { return queryRandomTable(MECH_RANDOM_HIT_TABLE, rnd, validCheck); } }