Загрузка данных


import random

W, H = 800, 600
px = W // 2
py = H - 70
sc = 0
lv = 5
b = []      
as_ = []    
bf = []     
ws = 1      
g = 0       
sh = False  
st = 0      
et = 0      

def setup():
    size(W, H)
    noStroke()
    f = createFont("Segoe UI", 16, True) 
    textFont(f)

def draw_gemini_logo(x, y, sz):
    pushMatrix()
    translate(x, y)
    fill(138, 180, 248)
    beginShape()
    vertex(0, -sz)
    quadraticVertex(0, 0, sz, 0)
    quadraticVertex(0, 0, 0, sz)
    quadraticVertex(0, 0, -sz, 0)
    quadraticVertex(0, 0, 0, -sz)
    endShape(CLOSE)
    
    fill(210, 227, 252)
    beginShape()
    vertex(sz * 0.4, -sz * 0.4)
    quadraticVertex(sz * 0.4, -sz * 0.1, sz * 0.7, -sz * 0.1)
    quadraticVertex(sz * 0.4, -sz * 0.1, sz * 0.4, sz * 0.2)
    quadraticVertex(sz * 0.4, -sz * 0.1, sz * 0.1, -sz * 0.1)
    quadraticVertex(sz * 0.4, -sz * 0.1, sz * 0.4, -sz * 0.4)
    endShape(CLOSE)
    popMatrix()

def draw():
    global px, sc, lv, as_, b, bf, ws, g, sh, st, et
    
    if g == 0:
        background(15, 20, 40)
        
        fill(0, 230, 180)
        textSize(32)
        textAlign(CENTER)
        text(u"КОСМИЧЕСКИЙ СИМУЛЯТОР", W // 2, 60)
        
        textSize(18)
        fill(255)
        text(u"НАЖМИТЕ ПРОБЕЛ ДЛЯ СТАРТА", W // 2, 110)
        
        textAlign(LEFT)
        textSize(16)
        fill(200, 200, 255)
        text(u"СПИСОК БАФОВ И ШАНСЫ ВЫПАДЕНИЯ:", 100, 160)
        
        fill(255, 200, 0)
        triangle(120, 205, 110, 225, 130, 225)
        fill(255)
        text(u"Апгрейд оружия (Шанс: 12%) - Добавляет лазеры", 160, 220)
        
        fill(0, 255, 100)
        rect(115, 255, 10, 26, 3)
        rect(107, 263, 26, 10, 3)
        fill(255)
        text(u"Ремкомплект (Шанс: 10%) - Восстанавливает 1 жизнь", 160, 275)
        
        fill(0, 150, 255)
        arc(120, 325, 24, 24, 0, PI + QUARTER_PI, CHORD)
        fill(255)
        text(u"Энергетический щит (Шанс: 8%) - Блокирует 1 удар", 160, 330)
        
        fill(200, 100, 255)
        circle(120, 385, 22)
        fill(15, 20, 40)
        circle(120, 385, 16)
        fill(200, 100, 255)
        rect(119, 377, 2, 9)
        rect(119, 384, 6, 2)
        fill(255)
        text(u"Временная петля (Шанс: 5%) - Замедляет метеориты", 160, 385)
        
        fill(255, 70, 70)
        circle(120, 440, 20)
        fill(255, 200, 0)
        rect(118, 426, 4, 6)
        fill(255, 100, 0)
        circle(120, 422, 6)
        fill(255)
        text(u"Космическая бомба (Шанс: 5%) - Уничтожает всё", 160, 440)
        
        fill(150, 150, 150)
        textAlign(CENTER)
        text(u"УПРАВЛЕНИЕ: СТРЕЛКИ - ДВИЖЕНИЕ / ПРОБЕЛ - ОГОНЬ", W // 2, 530)
        
        draw_gemini_logo(W - 40, 40, 15)
        
    elif g == 1:
        background(11, 16, 38)
        
        et = (millis() - st) // 1000
        
        fill(255, 255, 255, 100)
        for _ in range(3):
            circle(random.randint(0, W), random.randint(0, H), random.randint(1, 3))
        
        textAlign(LEFT)
        fill(0, 230, 180)
        textSize(16)
        text(u"СЧЕТ: " + str(sc), 20, 30)
        
        fill(255, 255, 0)
        text(u"ВРЕМЯ: " + str(et) + u" сек", 140, 30)
        
        if sh:
            fill(0, 150, 255)
            text(u"ЩИТ: АКТИВЕН", 290, 30)
            
        fill(255, 65, 100)
        text(u"ЖИЗНИ: " + str(lv), W - 160, 30)
        
        if frameCount % 6 < 3:
            fill(255, 120, 0)
            triangle(px - 10, py + 40, px + 10, py + 40, px, py + 55)
            fill(255, 230, 0)
            triangle(px - 5, py + 40, px + 5, py + 40, px, py + 48)

        if sh:
            fill(0, 150, 255, 60)
            circle(px, py + 20, 75)
            stroke(0, 150, 255)
            strokeWeight(2)
            noFill()
            circle(px, py + 20, 70)
            noStroke()

        fill(0, 180, 255)
        triangle(px - 25, py + 40, px, py + 15, px, py + 40)
        triangle(px + 25, py + 40, px, py + 15, px, py + 40)
        fill(0, 240, 255)
        triangle(px, py, px - 12, py + 35, px + 12, py + 35)
        fill(255, 255, 255, 200)
        ellipse(px, py + 20, 8, 15)
        
        if keyPressed:
            if keyCode == LEFT and px > 30: px -= 6
            if keyCode == RIGHT and px < W - 30: px += 6
            
        fill(255, 40, 100)
        for bl in b[:]:
            bl[1] -= 12  
            rect(bl[0] - 2, bl[1], 4, 15, 2)
            if bl[1] < 0:
                b.remove(bl)

        sc_c = 0.04 + (et * 0.002)
        if random.random() < sc_c: 
            sz = random.randint(30, 55)
            as_.append([random.randint(30, W - 30), -40, random.randint(3, 6), sz])

        for a in as_[:]:
            a[1] += a[2]  
            
            fill(90, 60, 70)
            circle(a[0], a[1], a[3])
            fill(120, 80, 90)
            circle(a[0] - 2, a[1] - 2, a[3] - 4)
            fill(255, 90, 0, 150)
            circle(a[0] + a[3]//5, a[1] - a[3]//5, a[3]//4)
            
            for bl in b[:]:
                if dist(bl[0], bl[1], a[0], a[1]) < a[3] / 2:
                    a[3] -= 15  
                    if bl in b: b.remove(bl)
                    if a[3] <= 15:  
                        sc += 1
                        
                        rn = random.random()
                        if rn < 0.12:
                            bf.append([a[0], a[1], 1]) 
                        elif rn < 0.22:
                            bf.append([a[0], a[1], 2]) 
                        elif rn < 0.30:
                            bf.append([a[0], a[1], 3]) 
                        elif rn < 0.35:
                            bf.append([a[0], a[1], 4]) 
                        elif rn < 0.40:
                            bf.append([a[0], a[1], 5]) 
                            
                        if a in as_: as_.remove(a)
                    break
                    
            if a in as_ and dist(px, py + 20, a[0], a[1]) < (a[3] / 2 + 20):
                if sh:
                    sh = False  
                else:
                    lv -= 1     
                as_.remove(a)
                
            elif a in as_ and a[1] > H + 50:
                as_.remove(a)
                
        for f in bf[:]:
            f[1] += 3  
            
            if f[2] == 1:
                fill(255, 200, 0)
                circle(f[0], f[1], 24)
                fill(30)
                triangle(f[0], f[1] - 8, f[0] - 7, f[1] + 6, f[0] + 7, f[1] + 6)
            elif f[2] == 2:
                fill(0, 255, 100)
                circle(f[0], f[1], 24)
                fill(30)
                rect(f[0] - 3, f[1] - 8, 6, 16, 2)
                rect(f[0] - 8, f[1] - 3, 16, 6, 2)
            elif f[2] == 3:
                fill(0, 150, 255)
                circle(f[0], f[1], 24)
                fill(30)
                arc(f[0], f[1], 14, 14, 0, PI + QUARTER_PI, CHORD)
            elif f[2] == 4:
                fill(200, 100, 255)
                circle(f[0], f[1], 24)
                fill(30)
                circle(f[0], f[1], 14)
                fill(200, 100, 255)
                rect(f[0] - 1, f[1] - 5, 2, 6)
                rect(f[0] - 1, f[1] - 1, 5, 2)
            elif f[2] == 5:
                fill(255, 70, 70)
                circle(f[0], f[1], 24)
                fill(30)
                circle(f[0], f[1], 12)
                fill(255, 200, 0)
                rect(f[0] - 1, f[1] - 10, 2, 5)
                
            if dist(px, py + 20, f[0], f[1]) < 28:
                if f[2] == 1:
                    ws = min(3, ws + 1) 
                elif f[2] == 2:
                    lv = min(5, lv + 1) 
                elif f[2] == 3:
                    sh = True           
                elif f[2] == 4:
                    for ast in as_:     
                        ast[2] = max(1, ast[2] // 2)
                elif f[2] == 5:
                    as_ = []            
                bf.remove(f)
            elif f[1] > H + 20:
                bf.remove(f)
                
        if lv <= 0:
            g = 2

        draw_gemini_logo(W - 40, 25, 15)

    elif g == 2:
        background(40, 15, 15)
        textAlign(CENTER)
        
        fill(255, 50, 50)
        textSize(36)
        text(u"ИГРА ОКОНЧЕНА", W // 2, H // 2 - 20)
        
        fill(255)
        textSize(18)
        text(u"ФИНАЛЬНЫЙ СЧЕТ: " + str(sc), W // 2, H // 2 + 20)
        text(u"ВРЕМЯ В ПОЛЕТЕ: " + str(et) + u" сек", W // 2, H // 2 + 50)
        text(u"НАЖМИТЕ ENTER ДЛЯ ВОЗВРАТА В МЕНЮ", W // 2, H // 2 + 90)

        draw_gemini_logo(W - 40, 40, 15)

def keyPressed():
    global b, ws, g, sc, lv, as_, bf, px, sh, st
    if g == 0:
        if key == ' ':
            g = 1
            st = millis()
    elif g == 1:
        if key == ' ':
            if ws == 1:
                b.append([px, py])
            elif ws == 2:
                b.append([px - 10, py + 10])
                b.append([px + 10, py + 10])
            elif ws == 3:
                b.append([px, py])
                b.append([px - 15, py + 15])
                b.append([px + 15, py + 15])
    elif g == 2:
        if key == ENTER:
            sc = 0
            lv = 5
            ws = 1
            sh = False
            as_ = []
            b = []
            bf = []
            px = W // 2
            g = 0