egordorichev/LastTry

View on GitHub
core/src/org/egordorichev/lasttry/item/liquids/LiquidManagerImpl.java

Summary

Maintainability
B
6 hrs
Test Coverage
package org.egordorichev.lasttry.item.liquids;

import com.badlogic.gdx.graphics.g2d.TextureRegion;
import org.egordorichev.lasttry.Globals;
import org.egordorichev.lasttry.graphics.Assets;
import org.egordorichev.lasttry.graphics.Graphics;
import org.egordorichev.lasttry.item.block.Block;
import org.egordorichev.lasttry.item.block.helpers.BlockHelper;

public class LiquidManagerImpl implements LiquidManager {
    /**
     * Liquids textures
     */
    public TextureRegion[][][] textures;

    public void load() {
        textures = new TextureRegion[4][][];
        textures[0] = Assets.getTexture("lt_water").split(Block.SIZE, Block.SIZE);
        textures[1] = Assets.getTexture("lt_lava").split(Block.SIZE, Block.SIZE);
        textures[2] = Assets.getTexture("lt_honey").split(Block.SIZE, Block.SIZE);
        textures[3] = Assets.getTexture("lt_acid").split(Block.SIZE, Block.SIZE);
    }

    public void renderLiquid(int x, int y) {
        byte hp = Globals.getWorld().blocks.getHP(x, y);
        byte liquidLevel = BlockHelper.empty.getLiquidLevel(hp);

        if (liquidLevel > 0) {
            float light = Globals.getWorld().light.get(x, y);
            byte type = BlockHelper.empty.getLiquidType(hp);

            Graphics.batch.setColor(light, light, light, 1f);
            Graphics.batch.draw(textures[type][0][liquidLevel - 1], x * Block.SIZE, y * Block.SIZE);

            Block bottom = Globals.getWorld().blocks.get(x, y - 1);

            if (bottom == null) {
                byte bottomHp = Globals.getWorld().blocks.getHP(x, y - 1);
                byte bottomLiquidLevel = BlockHelper.empty.getLiquidLevel(bottomHp);

                if (bottomLiquidLevel < 15) { // FIXME: fit 16 somewhere?
                    liquidLevel -= 1;
                    hp = BlockHelper.empty.setLiquidLevel(hp, liquidLevel);
                    Globals.getWorld().blocks.setHP(hp, x, y);
                    bottomLiquidLevel += 1;
                    bottomHp = BlockHelper.empty.setLiquidLevel(bottomHp, bottomLiquidLevel);
                    Globals.getWorld().blocks.setHP(bottomHp, x, y - 1);
                    return;
                }
            }

            Block left = Globals.getWorld().blocks.get(x - 1, y);
            Block right = Globals.getWorld().blocks.get(x + 1, y);

            byte leftHp = Globals.getWorld().blocks.getHP(x - 1, y);
            byte leftLiquidLevel = BlockHelper.empty.getLiquidLevel(leftHp);
            byte rightHp = Globals.getWorld().blocks.getHP(x + 1, y);
            byte rightLiquidLevel = BlockHelper.empty.getLiquidLevel(rightHp);

            boolean toLeft = left == null && leftLiquidLevel < liquidLevel;
            boolean toRight = right == null && rightLiquidLevel < liquidLevel;

            if (toLeft && toRight) {
                toLeft = Math.random() > 0.5;
                toRight = !toLeft;
            }

            if (left == null && toLeft) {
                if (leftLiquidLevel < 15) { // FIXME: fit 16 somewhere?
                    liquidLevel -= 1;
                    hp = BlockHelper.empty.setLiquidLevel(hp, liquidLevel);
                    Globals.getWorld().blocks.setHP(hp, x, y);
                    leftLiquidLevel += 1;
                    leftHp = BlockHelper.empty.setLiquidLevel(leftHp, leftLiquidLevel);
                    Globals.getWorld().blocks.setHP(leftHp, x - 1, y);
                }
            }

            if (right == null && toRight) {
                if (rightLiquidLevel < 15) { // FIXME: fit 16 somewhere?
                    liquidLevel -= 1;

                    if (liquidLevel < 0) {
                        liquidLevel = 0;
                    }

                    hp = BlockHelper.empty.setLiquidLevel(hp, liquidLevel);
                    Globals.getWorld().blocks.setHP(hp, x, y);
                    rightLiquidLevel += 1;
                    rightHp = BlockHelper.empty.setLiquidLevel(rightHp, rightLiquidLevel);
                    Globals.getWorld().blocks.setHP(rightHp, x + 1, y);
                }
            }
        }
    }
}