О проекте
Новости
Скины
Документация
Софт
Соревнование
Утилиты
Форум

    Основные принципы.

      Сражение происходит на большом клетчатом поле(1000х1000). Робот занимает одну клетку и видит, двигается и строит в одном из четырех направлений (вверх, вниз, влево, вправо).

Объекты на поле могут быть следующих типов:

В начале игры на поле помещается по одному роботу от каждой команды (подтип- commander) в клетку с относительными координатами(30,30) для каждой команды и направленные вверх. Поле в начале игры делит на 2 части стена, точнее граница карты outofmap. Обе команды в начале игры разделены этой стеной. Стена дает возможность командам некоторое время спокойно развиваться. Стена неуничтожима и автоматически изчезает на 5000 такте игры. Командир сооружает простейшие электростанции и фабрики для производства роботов базового технического уровня.

Фабрики и роботы управляются скриптом, разработанным Вами для колонии. Объекты каждого типа могут быть нескольких подтипов, которые различаются по своему уровню и полезным свойствам. Каждый объект находится на некотором техническом уровне и для каждого объекта определен технический уровень, которым должен обладать желающий построить этот объект.

В Robot Tactics каждая команда может создавать произвольное кол-во видов роботов, каждый из которых обладает своим оборудованием и управляющим скриптом. Все конструкторы (при наличии строительного оборудования) могут строить стационарные объекты и фабрики. Роботов могут строить исключительно фабрики (lab). При строительстве энергия объекта плавно увеличивается, пока не достигнет максимума. Энергия любого объекта каждый такт восстанавливается на небольшое значение до достижения максимума. Это позволяет бесплатно (и не задумываясь над этим) чинить поврежденные объекты. Естественно направленный ремонт при помощи конструкторов или фабрик на порядок эффективнее.

Экономика игры состоит из двух компонентов- ресурсов поддержки (электростанций) и металла.

Металл- постоянный ресурс, его количество на карте не меняется на протяжении игры. Его количество при этом таково, что ограничивает суммарную популяцию (до 400 роботов) у обеих команд. Металл содержится во всех сооружениях, больше всего его в роботах и электростанциях, так что при умелой игре одна команда может захватить почти весь металл на карте в свои руки, тогда эта команда сможет построить армию, сильно привосходящую армию противника. При уничтожении любого объекта его металл, а так же тот, который он вез на себе, оказывается на карте доступным для сбора. Собрать металл может любой юнит, но только конструкторы и электростанции могут отправить его в виртуальное хранилище, из которого он может быть доступен любому конструктору для строительства. Поэтому нападение следует хорошо планировать, в противном случае весь металл ваших роботов достанется противнику. Изначально весь металл содержится в виртуальных хранилищах команд(по 15000 единиц) и не содержится на карте (только в командирах). После проигрыша одной из команд металл из ее виртуальной копилки переходит к победителю.

Ресурс поддержки- электростанции- необходим для постройки юнитов. Каждая электростанция в зависимости от технического уровня поднимает лимит на количество юнитов для команды. Поэтому для создания большой армии потребуется построить множество электростанций, которые нажлежит хорошо охранять. Изначально командир может поддерживать 7 юнитов.

Информация о внешнем мире построена таким образом, что для конанды нет никакой разницы, на какой половине поля она играет. На самом деле команда даже не может это выяснить. Система координат заменяется, номер собственной команды всегда 0, а намер команды противника- 1.

Роботы видят на 50 клеток. Если ничего не видно- видимым объектом считается пустая клетка на границе видимости. Стреляют на 10 клеток, которые ракета пролетает за 2 такта. Ракеты могут сталкиваться. Ракеты невидимы.

Оборудование.

Каждый робот выполняет специальные действия в определенном направлении при помощи оборудования, каждая единица которого может быть установлена на любой из 4 сторон робота. На данный момент есть три типа:

У фабрики (lab) автоматичеки устанавливаются assembler со всех сторон. Фабрика занимает 8 клеток. На девятой строится робот (или что-то другое, но тогда это тупиковая ситуация; она однако может быть использована для быстрого сооружения fusion_reactor и т.д.)

Военные юниты не могут иметь assembler ровно как конструкторы не могут быть оснащены gun. Это подчеркивает разделение обязанностей. Командир считается конструктором.

Структура программы.

Язык описания роботов написан в стиле С. Программа начинается указанием имени автора и колонии. Например,

name MyFirstColony;// это имя колонии (не более 15 символов)
author RoboTact;// это Ваше имя (не более 15 символов)

Далее следует описание глобальных(global) и общих(common) переменных:

var global
{
   long gVar;
   array gArr;
}

{
   long сVar;
   array сArr;
}

   Доступны переменные двух типов - это long, знаковое целое 32 бита, и array-динамический массив, т.е. вы можете без предупреждения обращаться к любому его элементу, размер массива при этом будет по необходимости увеличиваться.
   Эти переменные доступны всем роботам и используются в основном для записи информации об игровой позиции и системы оповещения. При этом глобальные переменные существуют в единственном экземпляре для всей колонии, а экземпляр общих содержится в каждом роботе.

   Далее по порядку следуют блоки кода разных типов роботов. Один из них обязательно commander. Остальные-нет:

code base_robot
{
   type commander;
   ...
}
code builder
{
   type constructor;
   ...
}

Персональные (personal) переменные могут быть разными для каждого типа роботов. Экземпляр персональных переменных так же имеется у каждого робота в колонии. Общие переменные(common)- это персональные переменные, только они заранее одинаково определяются для всех без исключения типов роботов. Персональные переменные описываются в блоке робота подобно глобальным:

var personal
{
   long var1;
   long var2;
   array arr1;

   При конфликте имен предпочтение отдается локальным переменным, затем персональным и глобальным. Предопределенные common-переменные - константы, используются для информации и передачи параметров.

Локальные переменные можно объявлять в любом месте программы. Они удобны тем, что объявляются по мере надобности и их область видимости ограничена внешним скобочным выражением. При этом кстати если области видимости не пересекаются, то в памяти эти переменные занимают одну и ту же ячейку. Например,

code test_robot
{
   ...
   if(arg1)
   {
      // здесь temp еще не видна
      long temp;
      ...// работа с temp
   }
   else
   {
     // здесь temp уже не видна.
     long temp1;// эта переменная займет в памяти место temp
     ...// работа с temp1
   }
   // здесь не видны ни temp ни temp1.
  
}

   Оборудование определяется перед кодом скрипта:

equipment
{
   front scaner;             // спереди - сканер
   left gun;                     // слева - ракетница
   right assembler;      // справа - сборщик
   back scaner;            // сзади - сканер

   Далее следует сам код.

 Написание кода.

  Точка входа программы, управляющей роботом- функция main(). Она должны быть объявлена в коде любого робота. При этом написание кода вне функций не допускается.

В скрипте робота вы можете использовать базовые языковые средства, как то метки и условные переходы:

code test
{
   void main(){
loop:
    step;
    if(m_x>0) goto loop;
    right;
    goto loop;
  }

В большинстве случаев для тех же целей лучше подходят конструкции if( ){ }else{ } и for(;;){ } :

code test
{
 var personal{long i;}
 void main(){
   for(;;)
   {
      for(i=0;i<10;i++)step;
      if(m_x>100) right;
         else left;
      if(i!=10)step;
    }
  }
}

   Так же для удобства написания кода и возможности создания обработчиков вы можете использовать функции. Общий вид объявления функции как в С. Может возвращать значение и иметь до 31 параметра (если надо больше- пишите). Пока единственный доступный тип- long.

long test_step()
{
   step;
   return ret_step;
}

void test_right(long side)
{
   long i;
   for(i=0;i<side;i++) right;
}

Вызвать функцию можно, просто указав ее имя:  test(); 
Допускается вложенный вызов. Досрочный выход из текущей функции осуществляется командой return; Если функция возвращает значение, ее можно использовать в произвольных выражениях, в т.ч. в параметре if. Например, допустимы следующие выражения: arg1+=test(arg2+10); если конечно функция test определена как long test(long a);

Написание выражений.

    В качестве параметров  операторов if и for, а так же в основном коде можно использовать произвольные выражения. Значение, принятое в качестве параметра условного выражения, считается истиной, если оно не равно нулю, и ложью в противном случае. Логические операторы возвращают значение 1, если выражение истинно, иначе 0 . В настоящий момент доступны следующие операторы (перечислены в порядке уменьшения приоритета при группировке):

Оператор

Комментарий

Пример

()

Вызов функции. funct(1,var2)

--

Декремент. a-- эквивалентно a=a-1

++

Инкремент. a++ эквивалентно a=a+1

-

Унарный минус.

-a

!

Логическое отрицание.

!a- истинно, если a ложно и наоборот.

/

Целочисленное деление. Если второй аргумент равен нулю, первый не изменяется.

a=8/3. a примет значение 2.

*

Целочисленное умножение.

a*b

%

Остаток от деления.

a%b

-

Целочисленное вычитание.

a-b

+

Целочисленное сложение.

a+b

!=

Неравенство.

a!=b

==

Равенство.

a==b

<

Меньше.

a<b

>

Больше.

a>b

<=

Меньше или равно.

a<=b

>=

Больше или равно.

a>=b

||

Логическое ИЛИ.

a||b

&&

Логическое И

a&&b

=

Присвоить значение.

a=b

/=

Разделить и присвоить.

a/=b эквивалентно a=a/b

*=

Умножить и присвоить.

a*=b эквивалентно a=a*b

%=

Взять остаток от деления и присвоить.

a%=b эквивалентноa=a%b

-=

Вычесть и присвоить.

a-=b эквивалентно a=a-b

+=

Прибавить и присвоить.

a+=b эквивалентно a=a+b

Для указания любого другого порядка вычислений применяется оператор круглая скобка (), группирующий операнды. Как и в С не выделяется отдельного логического типа данных. Вы можете спокойно писать выражения типа a=b!=c, что будет воспринято как a=(b!=c) и a будет присвоено значение 1, если b!=c и 0 в противном случае. Также нет никаких ограничений на оператор присвоения. Ничто не мешает написать, скажем, так: a=b=c=d=1 или if((a=b+c)>=3) step;

 Комментарии.

Комментарии так же из С. Строчный // комментарий
 
исключает из компиляции ту часть строки, которая стоит не левее его, и /*многострочный
  коментарий*/
, позволяющий исключить из компиляции большие куски текста.

 Обмен информацией.

Для организации эффективной обороны и нападения роботы должны обмениваться информацией. Для этого в игре существует два механизма: через глобальные переменные и напрямую. С глобальными переменными все ясно: один (или несколько) роботов меняют глобальные переменные, а остальные наблюдают их значения и делают выводы. Напрямую информацию можно передавать двумя способами: посредством отправки сообщения или изменяя common переменные другого робота. Доступ осуществляется по уникальному идентификатору (m_robid для самого робота). Это фактически номер робота в порядке создания. У базового робота идентификатор равен нулю. Робот получает эти характеристики, просто посмотрев на другого робота. При этом независимо от командной принадлежности заполняется поле v_robid - идентификатор увиденного робота.

Изменить или получить common переменную другого робота можно двумя функциями: setcomm(id,dest,value) и getcomm(id,src,var), где dest и src- common- переменные робота с идентификатором id, а value и var- соответственно источник и приемник значения.

Сообщения посылаются роботу при помощи функции postevent(id,MSG_ID), где MSG_ID- идентификатор сообщения. В каждом коде можно поставить обработчик на любое объявленное сообщение. Для этого в блоке кода необходимо создать функцию - обработчик, а в начале программы зарегистрировать сообщение и сопоставить ему обработчик:

sethandler(TM_TEST,onTest);  // регистрируем сообщение TM_TEST
                             // и сопостовляет ему функцию onTest()
code test
{
  void onTest()  // это объявление обработчика
  {
     step;
  }
}
code test2
{
  void main(){
   postevent(v_robid,TM_TEST); // посылаем увиденному роботу
                                               // сообщение TM_TEST.
  }
}

 Вам не следует подставлять вместо идентификатора сообщения константу в явном виде. Система сама сопоставит идентификатору уникальную константу и произведет замену по тексту.

 Стандартные события.

   Сейчас определены только четыре пары обработчик- событие. Это:

Эти события создаются при соответствующих обстоятельствах. Если вы знаете, о чем еще нужно уведомлять робота - пишите.

При вызовах функций onHit и onDie заполняется поле m_hitside, указывающее на стороны роботы, в которую попала ракета. Из функции onHit() можно быстро отреагировать на атаку, из onDie() разве что написать завещание...

onTick() вызывается каждый такт.

onCreate() вызывается при создании робота. Эта функция выполняется первой (если она объявлена).

Все обработчики вызываются так, словно их вызвали из текущего места в скрипте, то есть основной скрипт не продолжит выполняться, если обработчик не завершится. А квота машинного времени одна на весь такт, так что если в onTick() вы будете вызывать функцию step; то основной скрипт ВООБЩЕ НИКОГДА не будет выполняться.

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

Библиотеки функций.

   Для выполнения одинаковых действий разными роботами предусмотрены библиотечные роботы. Это чисто логическая единица, так что строить их не надо. Для того, чтобы сделать робота библиотекой, достаточно назвать его library:

code library
{
   ...
}

Функции, определенные в этом коде, доступны всем роботам колонии. Код не может иметь персональные переменные и не может обращаться к персональным переменным других роботов. Всю необходимую информацию можно передавать через глобальные и общие (common) переменные, а так же в параметрах функций.

Наследование скриптов.

   Возможна ситуация, когда группа роботов выполняет сходные действия и может быть описана одним и тем же скриптом с небольшими изменениями в зависимости от типа робота. Например, скрипты всех боевых роботов могут быть одинаковыми вне зависимости от их типа. Для упрощения кода в этой ситуации введена возможность наследования скрипта. Для указания, что данный тип роботов наследует скрипт другого робота (например с именем parent), в код наследующего робота необходимо вставить инструкцию:
script parent; // parent- имя робота, скрипт которого наследуется
Для различения скриптом типа текущего робота введены переменные m_name - имя текущего робота (указанное в заголовке code ...), m_type - полный тип текущего робота и m_10power - удесятеренная мощность робота. Если в наследующем роботе не указать оборудование, оно будет унаследовано, а если указать- нет.

Пример:
code child
{
   type rush;
   script parent;
}

code parent
{
   type warrior;
   void main()
   {
     if(m_name==child) {...}
     else {...}
     ...
   }
}

 Информация о внешнем мире.

Систематизируем те источники информации о внешнем мире (в том числе о себе), которые предоставлены роботу.
   1. Собственное положение в пространстве.
Роботу передаются его абсолютные координаты(m_x и m_y), направление(m_direct).
   2. Личные данные.
Команда, к которой принадлежит робот- всегда равна 0. Собственный идентификатор(m_robid).
Собственный уровень энергии(m_e). 
Количество перевозимого металла(m_carriedmetal).
   3. Информация о колонии.
Общее количество металла, которым обладает колония(m_metal).
Количество металла в виртуальном хранилище(m_freemetal).
Количество поддерживаемых электростанциями мест(m_support).
Количество свободных мест(m_freesupport).
   3. Информация о видимом объекте.
Тип объекта(v_objtype). Это может быть:
  -wall(стена),
  -robot(робот),
  -lab(фабрика),
  -outofmap(граница мира),
  -metal(металл).
Полный тип объекта(v_type). Возможные значения приведены в таблице ниже по тексту.

Для видимых роботов (далее фабрики входят в это понятие) и стен известна команда(v_comm), уровень энергии(v_e). Для роботов известен тип оборудования на видимой стороне(v_equip)-может принимать значения nothing, scan, gun и factory. Так же для любого робота известен его идентификатор(v_robid).

При строительстве вы указываете полный тип объекта(b_type), затем во время строительсва получаете значение в переменную ret_create. Это может быть error(по каким-либо обстоятельствам строительство прервано), success(объект построен и обладает максимальным кол-вом жизней), или processed(строительство прошло успешно, но объект еще не достроен). Если в b_type передать значение repair, то робот будет чинить объект, расположенный с соответствующей стороны. В ret_create все возвращается по тем же принципам.

Следует обметить, что, чиня фабрику, производящую объект и имеющую полную энергию, вы на самом деле чините этот объект. Так как фабрика имеет достаточно большой периметр, то один объект может строиться одновременно 13(с учетом фабрики) юнитами. Так что при наличии большого кол-ва юнитов скорость строительства можно заметно увеличить. А для ускорения производства любого объекта вовсе не обязательно уметь его создавать.

 Типы объектов.

Полный тип Тип Комментарий L0 L T M H +H E +E P
commander robot мощный строитель 3 0 1 100

1

7

25 0.05

1

constructor

robot

строитель

1

1

560

50

1

0

10 0.01

0.3

adv_constructor

robot

улучшенный строитель

2

2

1000

75

1

0

15 0.01

0.6

warrior

robot

воин

1

1

230

30

1

0

15 0.02

0.4

shield

robot

бронированный робот; может использоваться для обороны базы

2

2

600

50

1

0

40 0.04

0.5

rush

robot

атакующий робот

2

2

700

45

1

0

20 0.02

1

base_lab

lab

фабрика

0

1

600

100

4

0

20 0.01

0.3

adv_lab

lab

улучшенная фабрика

1

2

1600

150

4

0

35 0.01

0.6

fragile_wall wall непрочная защитная стена 0 0 50 1 0 0 50 0.05 0

light_wall

wall

легкая защитная стена

1

1

150

3

0

0

150 0.07

0

fortification_wall

wall

крепкая защитная стена

2

2

300

6

0

0

300 0.1

0

solar_collector wall поддерживающий ресурс 0 0 100 100 0 1 5 0.001 0
geothermal_powerplant wall улучшенный поддерживающий ресурс 1 1 1400 250 0 4 15 0.002 0
fusion_reactor wall лучший поддерживающий ресурс 2 2 5500 400 0 8 50 0.003 0

empty

empty

пустая клетка

 

 

 

 

 

 

 

 

 

L0- уровень, необходимый строителю чтобы создать объект;
L-уровень объекта;
T-время, необходимое commander на постройку объекта (без дефицита ресурсов). Если объект строят несколько строителей, надо сложить их мощности(P) и на это число разделить T, чтобы найти необходимое время;
M- стоимость объекта (металл). Изымается из хранилища единовременно при начале строительства;
H- столько единиц поддержки требует объект;
+H- столько единиц поддержки добавляет данный объект;
E-максималная энергия робота;
+E-скорость самовосстановления объекта. Именно на столько энергия будет повышаться каждый такт в случае повреждения. Восстанавливаются как роботы, так и стационарные объекты.
P-мощность. Учитывается при строительстве указанным выше способом. Для военных роботов это размер повреждения, которое способен нанести снаряд, выпущенный таким роботом. Если снаряд попадает в объект, энергия которого меньше мощности снаряда, то снаряд летит дальше, потеряв мощность, равную энергии того объекта. Это делает невозможной защиту при помощи того, что каждый такт возобновляется строительство объекта под ударом (естественно, с однотактовым приростом энергии). Металл для снаряда эквивалентен пустой клетке, то есть никак на него не влияет.

 Апгрейд объектов.

   Объекты более низкого технического уровня могут быть улучшены до объектов того же назначения, но более высокого технического уровня без разрушения первых. Для этого необходимо чтобы строитель достаточного технического уровня выполнил команду строительства с параметром b_type, равным типу объекта более высокого технического уровня чем тот, к которому эта команда применяется. При этом старый объект заменится новым с таким уровнем энергии, какой был бы получен после затраты того количества времени, которое было затрачено на строительство старого объекта. Например, при апгрейде fragile_wall до fortification_wall у fortigication_wall окажется 50 единиц энергии. При этом объект, полученный в результате апгрейда, будет НЕДОСТРОЕННЫМ, то есть если не продолжить строительство до накопления полного уровня энергии, получнный объект начнет разрушаться. В настоящее время определены следующие цепочки объектов для апгрейда:

fragile_wall - light_wall - fortification_wall
solar_collector - geothermal_powerplant - fusion_reactor

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

Отладка.

   На данный момент весь отладочный инструментарий состоит из двух команд- say и stop. Команда say выводит сообщение в окне информации робота. Например, команда say "test"; выведет сообщение "test" в указанном окне. Команда stop останавливает выполнение программы в конце текущего такта, экран центрируется на роботе, вызвавшем команду и в окне информации размещается информация о нем, в том числе последнее сообщение. Чтобы остановить выполнение немедленно, следует после команды stop указать команду next(пропуск хода). Может быть удобно комбинировать эти команды, вызывая сначала команду say, а затем stop. Команда stop не переводится в псевдокод при компиляции в бинарный формат, так что ее можно не исключать из программы при отсылке на сайт. Более того, при выполнении текстового файла команда stop компилируется только при включеном режимет отладки, в противном случае она игнорируется. При этом режим отладки может распространяться только на первую команду, указанную в файле config.txt. Для включения режима отладки в конец файла config.txt приписываются символы ;d . Например: col1.txt;col2.txt;d включает режим отладки для колонии col1.txt.

Так же для отладки существует возможность вывода значения переменной или выражения. Все данные так же отображаются в окне информации. В режиме отладки работает команда d_say, определяющая имя выводимой переменной. Сама переменная должна быть записана в d_value. Текст команды d_say не будет отображаться без режима отладки и не компилируется в бинарный файл. Значение d_value выводится в окне информации только после определения строки в d_say. Команда полностью аналогична команде say.

Лимит логики.

   Во время выполнения скрипта робота считается количество операций, выполненых с начала такта. Команды step, backstep, act n, right, left, next, load и unload прерывают выполнение робота. Если количество операций за такт для робота превышает лимит ЛИЧНОЙ логики, выполнение робота так же прерывается. По умолчанию лимит личной логики 40000 команд, однако он доступен в переменной m_maxlog и может быть уменьшен. Если общее количество логических команд уже выполненных за текущий такт роботов превышает 40000, остальные роботы просто не выполняются, так что следует быть осторожнее. После выполнения всех роботов в колонии определено общее количество логических команд (ЛОГИКА). Так же для каждой колонии определен (ШТРАФ), по умолчанию равный 0. Каждый такт к значению ШТРАФ прибавляется (ЛОГИКА-20000), и если ШТРАФ станет меньше 0, то ШТРАФ обнуляется. Если ШТРАФ превысит 20000, то ШТРАФ уменьшается на 20000, а следующий такт ВСЯ КОЛОНИЯ БЕЗДЕЙСТВУЕТ. Для контроля за количеством логических операций введена переменная m_curlog, равная (ЛОГИКА+ШТРАФ-20000). Соответственно если m_curlog меньше 0, то еще есть что расходовать, но если m_curlog больше нуля, то необходимо временно приостановить выполнение сложных алгоритмов, в противном случае скоро колония остановится. При строительстве это может играть очень большую роль. Кроме того, все же старайтесь по возможности оптимальнее писать колонии, даже если они и укладываются в лимит логики.

 Основные команды.

Команда

Значение

backstep; шаг назад

step;

шаг вперед

right;

поворот направо

left;

поворот налево

unload; выгрузить металл в виртуальное хранилище. Так как доступ туда есть только у конструкторов, то работает только если вплотную к боевому роботу, выполняющему эту команду, стоит строитель или фабрика. Использовать команду имеет смысл только воинам, так как весь собранный конструкторами металл поступает в хранилище автоматически.
load; собрать металл у стоящих вплотную воинов и отправить его в копилку. Может применяться только конструкторами и фабриками (последние собирают металл только из активной клетки - той, на которой они строят).

next;

пропустить ход.

die;

самоуничтожиться. При этом в нормальном порядке будет создано сообщение TM_DIE. 

stop;

остановить выполнение программы и выделить робота, вызвавшего эту команду. Работает только в режиме отладки. Подробнее смотрите раздел "Отладка". 

say "string";
d_say "string";

передать сообщение "string".  Вместо string можно указать любую строку. Сообщение видно во время выполнения при выделении робота (см. пояснение в разделе софт). Чтобы убрать сообщение, необходимо передать пустую строку:
say "";
Стоит отметить, что с точки зрения машинного времени команда очень быстрая. Поэтому ее можно спокойно употреблять не только как отладочную, но и в окончательной версии.

Команда d_say, в отличие от say, применяется только для отладки. Подробнее смотрите раздел "Отладка".

Убедительная просьба не учить роботов ругаться.

var1=arr[var2];

извлечение значения из массива

arr[var1]=var2;

установка значения массива. 
Cледует отметить, что вместо переменных в индексе вы можете также использовать константы в пределах типа long(32 бита со знаком).

goto lbl;

безусловный переход

if(logical) goto lbl;
if(logical)
{
   operator1;...
}
else
{
   operator2;...
}

условный переход. Под logical понимается любое арифметическое выражение, которое считается ложным, если равно 0 и истинным в противном случае.
Блок с else необязателен.

lbl:

метка

act n; 
в частности :
  act front;
  act right;
  act back;
  act left;

функция оборудования. n обозначает сторону робота, где оно установленно:
front-спереди,
right-справа,
back-сзади и
left-слева.
Напимер, если справа у робота ракетница, то команда act right; произведет выстрел правой пушкой.

rand var;

записать в var случайное число от 0 до 999

getcomm(id,src,dest);
setcomm(id,dest,src);
postevent(id,EVENT_ID);

обмен информацией с роботом, имеющим идентификатор id. 

for(a;b;c){F}

Выполнять последователность инструкций F пока верно условие b. Перед началом цикла выполнить инструкцию а. После каждого прохода цикла выполнять инструкцию с. Инструкция continue в теле цикла вызывает немедленный переход к следующему циклу, инструкция break прерывает цикл.

Предопределенные переменные.

Переменная

Назначение

d_value

Значение для просмотра в окне информации. Подробнее смотрите раздел "Отладка".

v_distance

при сканировании: расстояние до видимого объекта(v_distance>=1)

v_objtype

тип видимого объекта:
   nothing(empty)-на 50 клеток ничего нет
   wall-стена
   robot-робот
   lab-фабрика
   metal-металл
   outofmap-граница арены

v_type

полный тип видимого объекта. Возможные значения перечислены в таблице
Типы объектов .

v_comm

номер команды, которой принадлежит
увиденный объект(применимо к роботам и стенам, ракеты международные :)

v_e

энергия видимого объекта. Для металла- кол-во металла.

v_equip

тип оборудования робота на видимой стороне -может принимать значения nothing, scan, gun и factory.

v_x, v_y

абсолютные координаты увиденного объекта.

m_x, m_y

абсолютные координаты робота.

m_direct

направление "головы" робота. Система абсолютных для первой команды координат такова:
 
Для второй комманды система координат повернута на 180гр. Это делает одинаковыми в смысле наличия той или иной координаты обе половины поля для соответственных команад.

m_vicroty равна 1, если другая команда уничтожена. Иначе 0.

m_time

текущий такт (то значение, которое отображается сверху во время выполнения)

m_e

энергия робота
m_curlog ЛОГИКА+ШТРАФ-20000. Подробнее смотрите раздел Лимит логики.
m_maxlog Лимит количества логических операций для данного робота. Может быть уменьшен для экономии общей логики при проведении сложных расчетов, продолжающихся более такта.

b_type

полный тип создаваемого стационарного объекта или имя создаваемого робота или repair если объект не создается а чинится.

b_percent

во время строительства: состояние работы в процентах.

ret_step

результат выполнения команды step.
Если success, то все нормално,
если error, то сдвинуться не удалось

ret_access

результат выполнения команд postevent, setcomm и getcomm. Если success, то данные доставлены/получены успешно, если error, значит произошла ошибка, например неверный идентификатор или робот был уничтожен. 

b_robid,m_robid,v_robid

идентификаторы соответственно строящегося робота, текущего и видимого(в т.ч. вражеского). Используются для обмена common- переменными и отправки сообщений.

ret_create

ошибка команды act n оборудования assembler.
Если success, то объест создан и имеет полную энергию,
если error, то по каким-либо обстоятелством строительство не состоялось,
если processed, то все прошло благополучно просто энергия еще не полная. Кол-во энергии строющегося объекта сообщается в процентах в поле b_percent.

Кстати, в случае любой ошибки робот теряет 1 ход.

любые отзывы и предложения направляйте на robotact@mail.ru или на форум

Hosted by uCoz