# =========================================================
# PORTAL CYBERPUNK ULTRA
# =========================================================

import math
import time
import random
import shutil

# =========================================================
# TERMINAL SIZE
# =========================================================

WIDTH, HEIGHT = shutil.get_terminal_size()

HEIGHT -= 2

# =========================================================
# ANSI COLORS
# =========================================================

RESET = "\033[0m"

CORES = [

    "\033[91m",  # vermelho
    "\033[92m",  # verde
    "\033[93m",  # amarelo
    "\033[94m",  # azul
    "\033[95m",  # roxo
    "\033[96m",  # cyan
    "\033[97m",  # branco

]

# =========================================================
# CLEAR
# =========================================================

def clear():
    print("\033[H\033[J", end="")

# =========================================================
# PORTAL
# =========================================================

a = 0

while True:

    clear()

    for y in range(

        -HEIGHT//2,

        HEIGHT//2

    ):

        linha = ""

        for x in range(

            -WIDTH//2,

            WIDTH//2

        ):

            # =====================================
            # DISTANCIA
            # =====================================

            d = math.sqrt(

                x*x + y*y

            )

            # =====================================
            # ONDAS
            # =====================================

            v = math.sin(

                d * 0.33

                - a

            )

            # =====================================
            # EFEITOS
            # =====================================

            if v > 0.92:

                linha += (

                    random.choice(CORES)

                    +

                    "@"

                    +

                    RESET

                )

            elif v > 0.75:

                linha += (

                    random.choice(CORES)

                    +

                    "#"

                    +

                    RESET

                )

            elif v > 0.45:

                linha += (

                    random.choice(CORES)

                    +

                    "*"

                    +

                    RESET

                )

            elif v > 0.15:

                linha += (

                    random.choice(CORES)

                    +

                    "."

                    +

                    RESET

                )

            else:

                linha += " "

        print(linha)

    # =========================================
    # VELOCIDADE
    # =========================================

    a += 0.18

    time.sleep(0.025)
