egordorichev/LastTry

View on GitHub
core/src/org/egordorichev/lasttry/world/spawn/components/SpawnRateComponent.java

Summary

Maintainability
A
0 mins
Test Coverage
package org.egordorichev.lasttry.world.spawn.components;

import org.egordorichev.lasttry.world.environment.Event;

import java.util.ArrayList;

public class SpawnRateComponent {
    private enum SpawnRateMultiplier{
        LESS_THAN_40(0.05f), LESS_THAN_60(0.025f), DEFAULT(0.0125f);

        private float multiplier;

        SpawnRateMultiplier(float multiplier) {
            this.multiplier = multiplier;
        }

        public float getMultiplier() {
            return this.multiplier;
        }
    }

    public static float calculateSpawnRate(int spawnRate, int spawnWeightOfCurrentlyActiveMonsters, float maxSpawns) {
        //Get active events
        //ArrayList<Event> activeEvents = LastTry.environment.getCurrentEvents();

        //TODO Implement spawn rate rules based on events
        spawnRate = calcSpawnRateBasedOnEvents(null, spawnRate);
        spawnRate = calcSpawnRateBasedOnItems(spawnRate);
        spawnRate = calcSpawnRateBasedOnTime(spawnRate);

        float spawnRateFinal = calculateSpawnRateUsingMultiplier(spawnRate, spawnWeightOfCurrentlyActiveMonsters, maxSpawns);

        return spawnRateFinal;
    }


    private static float calculateSpawnRateUsingMultiplier(int spawnRate, int spawnWeightOfCurrentlyActiveEnemies, float maxSpawns) {

        // Spawn rate refers to 1 in 'Spawn Rate' chance of a monster spawning.
        float percentChanceSpawnRate = 1/(float)spawnRate;

        float percentageOfSpawnRateAndActiveMonsters;

        if (spawnWeightOfCurrentlyActiveEnemies == 0) {
            percentageOfSpawnRateAndActiveMonsters = 1;
        } else {
            percentageOfSpawnRateAndActiveMonsters = (spawnWeightOfCurrentlyActiveEnemies / maxSpawns) * 100;
        }

        float spawnRateFloat = applyMultiplierToSpawnRate(percentChanceSpawnRate, percentageOfSpawnRateAndActiveMonsters);

        return spawnRateFloat;
    }

    private static int calcSpawnRateBasedOnEvents(ArrayList<Event> activeEvents, int spawnRate) {
        //TODO Implement spawn info in events
        return spawnRate;
    }

    private static int calcSpawnRateBasedOnTime(int spawnRate) {
        //TODO Implement spawn info based on day
        return spawnRate;
    }

    private static int calcSpawnRateBasedOnItems(int spawnRate) {
        //TODO Implement spawn rate altering based on items in environment
        return spawnRate;
    }

    public static float applyMultiplierToSpawnRate(float spawnRate, float percentageOfSpawnRateAndActiveMonsters) {
        if (percentageOfSpawnRateAndActiveMonsters < 40) {
            spawnRate = spawnRate * SpawnRateMultiplier.LESS_THAN_40.getMultiplier();
        } else if (percentageOfSpawnRateAndActiveMonsters < 60) {
            spawnRate = spawnRate * SpawnRateMultiplier.LESS_THAN_60.getMultiplier();
        } else{
            spawnRate = spawnRate * SpawnRateMultiplier.DEFAULT.getMultiplier();
        }

        return spawnRate;
    }

}