С помощью мутноскрипта воссоздал алгоритм генерации лабиринтов из пещер монстров:
CODE
@generate_lab;
local int,'i';
local int,'j';
loop_up i,1,m_w, //заливка стеной
loop_up j,1,m_h,
set_lev 0,i,j,[get_lev 0,i,j]|gf_wall;
loop_up i,0,m_w:2-1, //инициализация импровизированного массива
loop_up j,0,m_h:2-1,
local int,'n'+i+'_'+j,0;
global int,'count',0;
process_dig 0,target.x-1:2,target.y-1:2;
@process_dig int,int,int; //0,nX,nY - в ужатых координатах
if [v n"v1"_"v2"], break;
local int,'i';
local int,'k';
local int,'bx',v1+1*2;
local int,'by',v2+1*2;
mov n"v1"_"v2",1;
put_object bx,by;
loop_up i,0,3, {
mov k,[select_direction 0,v1,v2];
ifless k, break; //хе-хе, писать if k=-1 недопустимо
if k=0, {
put_object bx,by-1;
process_dig 0,v1,v2-1;
};
else if k=1, {
put_object bx+1,by;
process_dig 0,v1+1,v2;
};
else if k=2, {
put_object bx,by+1;
process_dig 0,v1,v2+1;
};
else if k=3, {
put_object bx-1,by;
process_dig 0,v1-1,v2;
};
};
@put_object int,int; //X,Y - удалить стену в координатах
set_lev 0,v0,v1,[get_lev 0,v0,v1]&(gf_wall)!;
@select_direction int,int,int; //без параметров,возвр.направление
local int,'i';
local int,'c',0;
local int,'lst0',1;
local int,'lst1',1;
local int,'lst2',1;
local int,'lst3',1;
mov v0,-1; //v1 и v2 должны остаться от process_dig
if v1=0, mov lst3,0; else if [v n"(v1-1)"_"v2"], mov lst3,0;
if v2=0, mov lst0,0; else if [v n"v1"_"(v2-1)"], mov lst0,0;
if m_w:2-1=v1, mov lst1,0; else if [v n"(v1+1)"_"v2"], mov lst1,0;
if m_h:2-1=v2, mov lst2,0; else if [v n"v1"_"(v2+1)"], mov lst2,0;
loop_up i,0,3,
if [v lst"i"], inc c;
mov c,[random c];
loop_up i,0,3,
if [v lst"i"], {
if c=0, {
mov v0,i;
break;
};
else dec c;
};
Результат работы:

Прорисовка градиента:
Код
@gradient_floor int,int,int,int,int,int,int; //уровень, R,G,B основного цвета, r,g,b другого цвета
local int,'i';
local int,'j';
local real,'k';
loop_up i,1,m_w,
loop_up j,1,m_h, {
mov k,[mod i-20]+[mod j-12]:29; //коэфф.интенсивности
set_lev v0,i,j,[get_lev v0,i,j]&255|(
v1+[round (v4-v1)*k]+(v2+[round (v5-v2)*k]<8)+(v3+[round (v6-v3)*k]<16)
<8); //обрезанный цвет смещаем на его место и пристыковываем
};
Результат работы: