package com.nyrds.pixeldungeon.effects.emitters;

import com.watabou.noosa.Game;
import com.watabou.noosa.particles.Emitter;
import com.watabou.noosa.particles.PixelParticle;
import com.watabou.pixeldungeon.Dungeon;
import com.watabou.pixeldungeon.DungeonTilemap;
import com.watabou.pixeldungeon.scenes.GameScene;
import com.watabou.utils.ColorMath;
import com.watabou.utils.PointF;
import com.watabou.utils.Random;

public class WaterSink extends Emitter {

    private int pos;
    private float rippleDelay = 0;

    private static final Factory factory = new Factory() {

        @Override
        public void emit(Emitter emitter, int index, float x, float y) {
            WaterParticle p = (WaterParticle) emitter.recycle(WaterParticle.class);
            p.reset(x, y);
        }
    };

    public WaterSink(int pos) {
        super();

        this.pos = pos;

        PointF p = DungeonTilemap.tileCenterToWorld(pos);
        pos(p.x - 2, p.y + 1, 4, 0);

        pour(factory, 0.05f);
    }

    @Override
    public void update() {
        if (setVisible(Dungeon.visible[pos])) {

            super.update();

            if ((rippleDelay -= Game.elapsed) <= 0) {
                GameScene.ripple(pos + Dungeon.level.getWidth()).y -= DungeonTilemap.SIZE / 2;
                rippleDelay = Random.Float(0.2f, 0.3f);
            }
        }
    }

    public static final class WaterParticle extends PixelParticle {

        public WaterParticle() {
            super();

            acc.y = 50;
            am = 0.5f;

            color(ColorMath.random(0xb6ccc2, 0x3b6653));
            size(2);
        }

        public void reset(float x, float y) {
            revive();

            this.x = x;
            this.y = y;

            speed.set(Random.Float(-2, +2), 0);

            left = lifespan = 0.5f;
        }
    }
}