com.tnf.ptm.handler.files.HullConfigManager.java Source code

Java tutorial

Introduction

Here is the source code for com.tnf.ptm.handler.files.HullConfigManager.java

Source

/*
 * Copyright 2017 TheNightForum
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.tnf.ptm.handler.files;

import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.JsonValue;
import com.tnf.ptm.common.PtmMath;
import com.tnf.ptm.entities.item.Engine;
import com.tnf.ptm.entities.ship.Teleport;
import com.tnf.ptm.assets.Assets;
import com.tnf.ptm.assets.json.Json;
import com.tnf.ptm.handler.AbilityCommonConfigs;
import com.tnf.ptm.entities.item.ItemManager;
import com.tnf.ptm.entities.ship.AbilityConfig;
import com.tnf.ptm.entities.ship.EmWave;
import com.tnf.ptm.entities.ship.KnockBack;
import com.tnf.ptm.entities.ship.SloMo;
import com.tnf.ptm.entities.ship.UnShield;
import com.tnf.ptm.entities.ship.hulls.GunSlot;
import com.tnf.ptm.entities.ship.hulls.HullConfig;
import org.terasology.assets.ResourceUrn;

import java.util.HashMap;
import java.util.Map;

public final class HullConfigManager {
    private final ItemManager itemManager;
    private final AbilityCommonConfigs abilityCommonConfigs;
    private final Map<ResourceUrn, HullConfig> nameToConfigMap;
    private final Map<HullConfig, ResourceUrn> configToNameMap;

    public HullConfigManager(ItemManager itemManager, AbilityCommonConfigs abilityCommonConfigs) {
        this.itemManager = itemManager;
        this.abilityCommonConfigs = abilityCommonConfigs;

        nameToConfigMap = new HashMap<>();
        configToNameMap = new HashMap<>();
    }

    private static Vector2 readVector2(JsonValue jsonValue, String name, Vector2 defaultValue) {
        String string = jsonValue.getString(name, null);
        return (string == null) ? defaultValue : PtmMath.readV2(string);
    }

    private static Engine.Config readEngineConfig(String engineName, ItemManager itemManager) {
        if (engineName == null)
            return null;

        return itemManager.getEngineConfig(new ResourceUrn(engineName));
    }

    private static void validateEngineConfig(HullConfig.Data hull) {
        if (hull.engineConfig != null) {
            // Stations can't have engines, and the engine size must match the hull size
            if (hull.type == HullConfig.Type.STATION
                    || hull.engineConfig.big != (hull.type == HullConfig.Type.BIG)) {
                throw new AssertionError("Incompatible engine in hull " + hull.displayName);
            }
        }
    }

    public HullConfig getConfig(ResourceUrn shipName) {
        HullConfig hullConfig = nameToConfigMap.get(shipName);

        if (hullConfig == null) {
            hullConfig = read(shipName);

            nameToConfigMap.put(shipName, hullConfig);
            configToNameMap.put(hullConfig, shipName);
        }

        return hullConfig;
    }

    public String getName(HullConfig hull) {
        ResourceUrn result = configToNameMap.get(hull);
        return (result == null) ? "" : result.toString();
    }

    private HullConfig read(ResourceUrn shipName) {
        final HullConfig.Data configData = new HullConfig.Data();

        configData.internalName = shipName.toString();

        Json json = Assets.getJson(shipName);

        readProperties(json.getJsonValue(), configData);

        configData.tex = Assets.getAtlasRegion(shipName);
        configData.icon = Assets.getAtlasRegion(new ResourceUrn(shipName + "Icon"));

        validateEngineConfig(configData);

        // TODO: Ensure that this does not cause any problems
        json.dispose();

        return new HullConfig(configData);
    }

    private void parseGunSlotList(JsonValue containerNode, HullConfig.Data configData) {
        Vector2 builderOrigin = new Vector2(configData.shipBuilderOrigin);

        for (JsonValue gunSlotNode : containerNode) {
            Vector2 position = readVector2(gunSlotNode, "position", null);
            position.sub(builderOrigin).scl(configData.size);

            boolean isUnderneathHull = gunSlotNode.getBoolean("isUnderneathHull", false);
            boolean allowsRotation = gunSlotNode.getBoolean("allowsRotation", true);

            configData.gunSlots.add(new GunSlot(position, isUnderneathHull, allowsRotation));
        }
    }

    private void readProperties(JsonValue rootNode, HullConfig.Data configData) {
        configData.size = rootNode.getFloat("size");
        configData.approxRadius = 0.4f * configData.size;
        configData.maxLife = rootNode.getInt("maxLife");

        configData.e1Pos = readVector2(rootNode, "e1Pos", new Vector2());
        configData.e2Pos = readVector2(rootNode, "e2Pos", new Vector2());

        configData.lightSrcPoss = PtmMath.readV2List(rootNode, "lightSrcPoss");
        configData.hasBase = rootNode.getBoolean("hasBase", false);
        configData.forceBeaconPoss = PtmMath.readV2List(rootNode, "forceBeaconPoss");
        configData.doorPoss = PtmMath.readV2List(rootNode, "doorPoss");
        configData.type = HullConfig.Type.forName(rootNode.getString("type"));
        configData.durability = (configData.type == HullConfig.Type.BIG) ? 3 : .25f;
        configData.engineConfig = readEngineConfig(rootNode.getString("engine", null), itemManager);
        configData.ability = loadAbility(rootNode, itemManager, abilityCommonConfigs);

        configData.displayName = rootNode.getString("displayName", "---");
        configData.price = rootNode.getInt("price", 0);
        configData.hirePrice = rootNode.getFloat("hirePrice", 0);

        Vector2 tmpV = new Vector2(rootNode.get("rigidBody").get("origin").getFloat("x"),
                1 - rootNode.get("rigidBody").get("origin").getFloat("y"));
        configData.shipBuilderOrigin.set(tmpV);

        process(configData);

        parseGunSlotList(rootNode.get("gunSlots"), configData);
    }

    private AbilityConfig loadAbility(JsonValue hullNode, ItemManager manager, AbilityCommonConfigs commonConfigs) {
        JsonValue abNode = hullNode.get("ability");
        if (abNode == null) {
            return null;
        }
        String type = abNode.getString("type");
        if ("sloMo".equals(type)) {
            return SloMo.Config.load(abNode, manager, commonConfigs.sloMo);
        }
        if ("teleport".equals(type)) {
            return Teleport.Config.load(abNode, manager, commonConfigs.teleport);
        }
        if ("knockBack".equals(type)) {
            return KnockBack.Config.load(abNode, manager, commonConfigs.knockBack);
        }
        if ("emWave".equals(type)) {
            return EmWave.Config.load(abNode, manager, commonConfigs.emWave);
        }
        if ("unShield".equals(type)) {
            return UnShield.Config.load(abNode, manager, commonConfigs.unShield);
        }
        return null;
    }

    // Seems to offsets all positions by the shipbuilder origin
    // Todo: Find out what this function does and provide a better name.
    private void process(HullConfig.Data configData) {
        Vector2 builderOrigin = new Vector2(configData.shipBuilderOrigin);

        configData.origin.set(builderOrigin).scl(configData.size);

        configData.e1Pos.sub(builderOrigin).scl(configData.size);

        configData.e2Pos.sub(builderOrigin).scl(configData.size);

        for (Vector2 position : configData.lightSrcPoss) {
            position.sub(builderOrigin).scl(configData.size);
        }

        for (Vector2 position : configData.forceBeaconPoss) {
            position.sub(builderOrigin).scl(configData.size);
        }

        for (Vector2 position : configData.doorPoss) {
            position.sub(builderOrigin).scl(configData.size);
        }
    }
}