nabbla (nabbla1) wrote,
nabbla
nabbla1

Category:

Colobot - COLonizing with roBOTs

Сижу дома, болею, вот решил вспомнить детство и поиграть в компьютерную игрушку Colobot - сокращение от Colonizing with bots. Жанр игры определить довольно сложно.



С одной стороны, ты играешь за астронавта, которого в одиночку отправили на далекие планеты, чтобы он подготовил их к колонизации.

С другой, это - стратегия реального времени. Ведь астронавт не так уж одинок - ему выдали роботов, способных выполнять простые операции. С их помощью строишь базу на другой планете: электростанцию, фабрику переработки руды и по производству роботов.  Строишь этих самых роботов, они  таскают руду, батарейки, расстреливают местных гигантских муравьев и ос, что-то в этом роде.

Только есть одна изюминка: роботов можно программировать на языке, подозрительно напоминающем C++!

Сильно подробно рассказывать не буду, это надо играть. Так, немножко скриншотов с комментариями и программка.



Вот мы прилетели на Луну на своей забавной пузатой ракете. Справа - робот "хваталка", с собой - стратегический запас титана и батареек)


В первую очередь лезем в свой КПК, расположенный на левом запястье, ровно там, где у астронавтов была прицеплена тетрадь с инструкциями. Там изложено задание миссии и данные со спутника, в нем же подробное руководство по программированию.


Прилетев на Луну, можно найти место посадки "Аполлона" - там остался посадочный модуль (основная часть вместе с астронавтами, разумеется, с Луны взлетели), лунный ровер и флаг. Разработчики игры - чехи, и они большие молодцы - изобразили все довольно достоверно, ну, насколько позволяет графика. Игра 2001 года.


Миссия на Луне - учебная, дальше нас отправляют на другие планетные системы. Как именно отправляют - нигде не указывается, примем это как данность.


Планета Terra Nova - земного типа, с кислородом и растительностью. Слева - робот Subber, способный заезжать под воду, добывать всякие "пряники". Посередине - летающий стреляющий робот, убивать враждебные формы жизни) Большая градирня перерабатывает уран в "ядерные батарейки", которые запихиваются в роботов и очень долго служат. Не спрашивайте, как это работает.

А вот моя программа для Winged Shooter, для истребления гигантских инопланетных муравьев, пауков и червей. По-прежнему туповата, но на гладких ландшафтах работает хорошо. Можно запустить робота и заниматься своими делами)
[Spoiler (click to open)]

extern void object::KillAnt()
{
    object i;
    float alpha,dist,toptop;
    float temp_thres;
    int mode=0;
    while(true){
        if (mode==0){
            i=radar(AlienAnt);
            if (i==null) {
                message("No ants anymore, switching to spiders",DisplayInfo);
                mode=1;
            }
            
        }
        if (mode==1){
            i=radar(AlienSpider);
            if (i==null) {
                message("No spiders anymore, switching to worms",DisplayInfo);
                mode=2;
            }
        }
        if (mode==2){
            i=radar(AlienWorm);
            if (i==null) {
                message("No worms anymore, I need a little vacation",DisplayInfo);
                i=radar(PowerStation);
                goto(i.position);
             ;   wait(10);
                mode=0;
                continue;
            }
        }
        toptop=topo(position);    //уровень подстилающей поверхности
        if (toptop<0) toptop=0;     //все что ниже нуля - под водой, а мы не хотим под воду!
        
        dist=(distance(position,i.position)-30)/2;    //растояние до врага
        if (dist>3) temp_thres=0.4; else temp_thres=0.9; //мы далеко, если движки перегрелись,
        //надо посидеть, пока не охладятся.
        if (temperature<temp_thres) jet ((toptop+5-position.z)/3); //держим высоту
        else {
            while (topo(position)<0){    //на воду садиться не умеем, ищем сушу
                turn(-direction(i.position));
                move(1);
            }
            if (temp_thres==0.4) temp_thres=0; else temp_thres=0.7;
            while (temperature>temp_thres){    //остываем
                jet(-1);    
            }
        }
        
        alpha=direction(i.position);    //азимут на цель
        dist=(distance(position,i.position)-40)/2;    //расстояние до оптимальной позиции для стрельбы
        if (dist>1) dist=1;
        if (dist<-1) dist=-1;
        motor(dist*(cos(alpha)-sin(alpha)),dist*(cos(alpha)+sin(alpha)));//команда на двигатели
        if ((dist<1)&&(dist>-1)) {
            turn(direction(i.position));    //прицел по азимуту
            aim(asin(-(position.z-i.position.z)/distance(position,i.position))); //по углу места
            fire(0.1); //ОГОНЬ!
        }
        if (energyCell.energyLevel<0.3){
            i = radar(PowerStation); // look for station
            if (i==null) continue;
            goto(i.position);   // go to the power station
            
            while ( energyCell.energyLevel < 1 )
            {
                wait(1);            // wait until recharged
            }
        }
        if(shieldLevel<0.5){
            i=radar(RepairCenter);
            if (i==null) continue;
            goto(i.position);
            while(shieldLevel<1){
                wait(1);
            }
        }
    }
    
    
    
}


В общем, очень рекомендую) Скачать игру можно на рутрекере: http://rutracker.org/forum/viewtopic.php?t=74036
Subscribe

  • Ремонт лыжных мостиков

    Вернулся с сегодняшнего субботника. Очень продуктивно: отремонтировали все ТРИ мостика! Правда, для этого надо было разделиться, благо народу…

  • Гетто-байк

    В субботу во время Великой Октябрьской резни бензопилой умудрился петуха сломать в велосипеде. По счастью, уже на следующий день удалось купить…

  • А всё-таки есть польза от ковариаций

    Вчера опробовал "сценарий", когда варьируем дальность от 1 метра до 11 метров. Получилось, что грамотное усреднение - это взять с огромными весами…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 5 comments