/* * Aphelion * Copyright (c) 2014 Joris van der Wel * * This file is part of Aphelion * * Aphelion is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, version 3 of the License. * * Aphelion 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 Affero General Public License * along with Aphelion. If not, see <http://www.gnu.org/licenses/>. * * In addition, the following supplemental terms apply, based on section 7 of * the GNU Affero General Public License (version 3): * a) Preservation of all legal notices and author attributions * b) Prohibition of misrepresentation of the origin of this material, and * modified versions are required to be marked in reasonable ways as * different from the original version * * Linking this library statically or dynamically with other modules is making a * combined work based on this library. Thus, the terms and conditions of the * GNU Affero General Public License cover the whole combination. * * As a special exception, the copyright holders of this library give you * permission to link this library with independent modules to produce an * executable, regardless of the license terms of these independent modules, * and to copy and distribute the resulting executable under terms of your * choice, provided that you also meet, for each linked independent module, * the terms and conditions of the license of that module. An independent * module is a module which is not derived from or based on this library. */ package aphelion.shared.physics.config; import aphelion.shared.gameconfig.*; import aphelion.shared.physics.WEAPON_SLOT; import aphelion.shared.physics.entities.Actor; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; /** * * @author Joris */ public final class ActorConfig { private static final Logger log = Logger.getLogger("aphelion.shared.physics"); public final Actor actor; public final ConfigSelection selection; public GCInteger radius; public GCInteger bounceFriction; public GCInteger bounceOtherAxisFriction; public GCInteger rotationSpeed; public GCInteger rotationPoints; public GCInteger speed; public GCInteger thrust; public GCInteger boostSpeed; public GCInteger boostThrust; public GCInteger boostEnergy; public GCInteger maxEnergy; public GCInteger recharge; public GCInteger spawnX; public GCInteger spawnY; public GCInteger spawnRadius; public GCInteger respawnDelay; public GCString smoothingAlgorithm; public GCInteger smoothingLookAheadTicks; public GCInteger smoothingStepRatio; public GCInteger smoothingDistanceLimit; public GCBoolean smoothingProjectileCollisions; public WeaponSlotConfig[] weaponSlots = new WeaponSlotConfig[WEAPON_SLOT.values().length]; // Note: at the moment old weapon definitions that no longer exist are not removed public Map<String, WeaponConfig> weapons = new HashMap<>(); public ActorConfig(Actor actor) { this.actor = actor; this.selection = actor.state.config.newSelection(); this.radius = selection.getInteger("ship-radius"); this.bounceFriction = selection.getInteger("ship-bounce-friction"); this.bounceOtherAxisFriction = selection.getInteger("ship-bounce-friction-other-axis"); this.rotationSpeed = selection.getInteger("ship-rotation-speed"); this.rotationPoints = selection.getInteger("ship-rotation-points"); this.speed = selection.getInteger("ship-speed"); this.thrust = selection.getInteger("ship-thrust"); this.boostSpeed = selection.getInteger("ship-boost-speed"); this.boostThrust = selection.getInteger("ship-boost-thrust"); this.boostEnergy = selection.getInteger("ship-boost-energy"); this.maxEnergy = selection.getInteger("ship-energy"); this.recharge = selection.getInteger("ship-recharge"); this.spawnX = selection.getInteger("ship-spawn-x"); this.spawnY = selection.getInteger("ship-spawn-y"); this.spawnRadius = selection.getInteger("ship-spawn-radius"); this.respawnDelay = selection.getInteger("ship-respawn-delay"); this.smoothingAlgorithm = selection.getString("smoothing-algorithm"); this.smoothingLookAheadTicks = selection.getInteger("smoothing-look-ahead-ticks"); this.smoothingStepRatio = selection.getInteger("smoothing-step-ratio"); this.smoothingDistanceLimit = selection.getInteger("smoothing-distance-limit"); this.smoothingProjectileCollisions = selection.getBoolean("smoothing-projectile-collisions"); for (int slotId = 0; slotId < weaponSlots.length; ++slotId) { weaponSlots[slotId] = new WeaponSlotConfig(WEAPON_SLOT.byId(slotId)); } } public WeaponConfig getWeaponConfig(String key) { WeaponConfig config = weapons.get(key); if (config == null) { config = new WeaponConfig(actor, key); weapons.put(key, config); } return config; } public final class WeaponSlotConfig implements WrappedValueAbstract.ChangeListener { public final WEAPON_SLOT slot; public GCString weaponKey; public WeaponConfig config; public WeaponSlotConfig(WEAPON_SLOT slot) { this.slot = slot; weaponKey = selection.getString(slot.settingName); weaponKey.addWeakChangeListener(this); config = getWeaponConfig(weaponKey.get()); } @Override public void gameConfigValueChanged(WrappedValueAbstract val) { assert val == weaponKey; config = getWeaponConfig(weaponKey.get()); } public boolean isValidWeapon() { return this.config != null; } } }