com.dongbat.invasion.registry.EnemyRegistry.java Source code

Java tutorial

Introduction

Here is the source code for com.dongbat.invasion.registry.EnemyRegistry.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dongbat.invasion.registry;

import com.artemis.Entity;
import com.artemis.managers.GroupManager;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.MassData;
import com.badlogic.gdx.utils.ObjectMap;
import com.dongbat.invasion.ability.AbilityInfo;
import com.dongbat.invasion.component.Ability;
import com.dongbat.invasion.component.Ads;
import com.dongbat.invasion.component.Buff;
import com.dongbat.invasion.component.Collision;
import com.dongbat.invasion.component.Delay;
import com.dongbat.invasion.component.DisplayPosition;
import com.dongbat.invasion.component.Enemy;
import com.dongbat.invasion.component.EnemyMovement;
import com.dongbat.invasion.component.Physics;
import com.dongbat.invasion.component.Health;
import com.dongbat.invasion.component.Spine;
import com.dongbat.invasion.enemy.EnemyInfo;
import com.dongbat.invasion.enemy.EnemyType;
import com.dongbat.invasion.util.Constants;
import com.dongbat.invasion.util.ECSUtil;
import com.dongbat.invasion.util.PhysicsUtil;

/**
 *
 * @author password
 */
public class EnemyRegistry {

    private static final ObjectMap<String, EnemyInfo> enemyRegistry = new ObjectMap<String, EnemyInfo>();

    public static void load() {
        FileHandle internal = Gdx.files.internal("./enemy");
        for (FileHandle file : internal.list()) {
            if (file.isDirectory()) {
                continue;
            }
            String content = file.readString();
            EnemyInfo enemyInfo = getEnemyInfo(content);
            if (enemyInfo != null) {
                enemyRegistry.put(file.nameWithoutExtension(), enemyInfo);
            }
        }
    }

    public static EnemyInfo get(String name) {
        return enemyRegistry.get(name);
    }

    public static Entity createEnemy(String enemyType) {
        return createEnemy(enemyType, null);
    }

    public static Entity createEnemy(String enemyType, Float positionX) {
        EnemyInfo enemyInfo = get(enemyType);

        EnemyType enemyTypeAI = createEnemyType(enemyInfo);
        Enemy enemyComponent = new Enemy();
        enemyComponent.setType(enemyTypeAI);
        enemyComponent.setAirUnit(enemyInfo.isAirUnit());
        enemyComponent.setBoss(enemyInfo.isBoss());
        enemyComponent.setInfinitePickup(enemyInfo.isInfinitePickup());
        enemyComponent.setCanPickAds(enemyInfo.canPickAds());
        enemyComponent.setAdsPickingDelay(enemyInfo.getAdsPickingDelay());
        enemyComponent.setTributeDelay(enemyInfo.getTributeDelay());
        enemyComponent.setBounty(enemyInfo.getBounty());

        Vector2 position;
        if (enemyInfo.isAirUnit()) {
            position = new Vector2(Constants.ENEMY.AIR_START_X, Constants.ENEMY.AIR_START_Y);
        } else {
            float startY = Constants.PHYSICS.GROUND_Y + enemyInfo.getRadius();
            position = new Vector2(Constants.ENEMY.GROUND_START_X, startY);
        }
        if (positionX != null) {
            position.x = positionX;
        }
        Body body = PhysicsUtil.createBody(position, enemyInfo.getRadius());
        body.setGravityScale(0);
        MassData massData = new MassData();
        massData.mass = 1;
        body.setMassData(massData);

        Physics physicsComponent = new Physics();
        physicsComponent.setBody(body);
        physicsComponent.setMaxSpeed(enemyInfo.getMaxSpeed());
        physicsComponent.setRadius(enemyInfo.getRadius());

        Health healthComponent = new Health(enemyInfo.getMaxHealth(), enemyInfo.getMaxHealth());

        Collision collision = new Collision();

        Buff buffComponent = new Buff();

        Delay delayComponent = new Delay();

        Ability abilityComponent = new Ability();
        String abilities = enemyInfo.getAbilities();
        if (abilities != null && !abilities.isEmpty()) {
            String[] names = enemyInfo.getAbilities().split(",");
            for (String name : names) {
                AbilityInfo ability = AbilityRegistry.getAbility(name);
                abilityComponent.addAbility(name, ability);
            }
        }

        EnemyMovement movementComponent = new EnemyMovement();
        DisplayPosition displayPosition = new DisplayPosition(position);
        Ads ads = new Ads();
        ads.setOffline(true);
        ads.setPosition(new Vector2(Constants.ADS.DEFAULT_OFFSET_X, Constants.ADS.DEFAULT_OFFSET_Y));

        Spine spineComponent = new Spine(enemyInfo.getSpineName());

        Entity enemy = ECSUtil.getWorld().createEntity().edit().add(enemyComponent).add(physicsComponent)
                .add(healthComponent).add(collision).add(buffComponent).add(abilityComponent).add(movementComponent)
                .add(ads).add(displayPosition).add(spineComponent).add(delayComponent).getEntity();

        physicsComponent.getBody().setUserData(enemy);

        // Add enemy to a group
        ECSUtil.getWorld().getManager(GroupManager.class).add(enemy, Constants.ENEMY.GROUP_NAME);

        return enemy;
    }

    private static EnemyType createEnemyType(EnemyInfo enemyInfo) {
        return (EnemyType) ReflectionUtil.createObject(enemyInfo.getClassName(), enemyInfo.getData());
    }

    private static EnemyInfo getEnemyInfo(String info) {
        return (EnemyInfo) ReflectionUtil.parseData(EnemyInfo.class, info);
    }
}