DarwinBotsManual
Abrir la app EnglishEN

Multibots

Por qué conviene ser varios: qué pagan y qué ganan los organismos del Bestiario, con tres recetas de campeonato diseccionadas.

En Un multibot armaste un organismo de cero: los hijos se atan al padre, la despensa se reparte, la cabeza empuja y el cuerpo se deja llevar. Acá damos un paso más y leemos los que ya salieron campeones: el Bestiario guarda unos 80 bots con «MB» en el nombre, y en ellos los lazos dejan de ser un truco y pasan a ser un modo de vida. El mecanismo completo está en Lazos y multicelulares; el tutorial enseña a construirlo; esta página enseña a leer un organismo ajeno como se lee el juego de un rival.

La apuesta

Ser varios cuesta. Cada intento de atar cobra el costo de atar (Atar), y hasta el lazo de nacimiento se lo cobra al padre en cada parto. Repartir tampoco es gratis: hay que pedirlo cada ciclo, quien pide paga el 1 % de lo que se mueve y en un ciclo no viaja más energía que tu propio cuerpo (Lazos y multicelulares). Y un organismo camina más lento que un bot suelto: arrastra células que empujan cada una hacia su propio frente.

Qué compra todo eso:

Caterpillar: el acordeón

El Caterpillar de Peter vive en parejas: una cabeza y un cuerpo unidos por un solo lazo rígido (.stifftie al máximo). No empuja con .up: camina como una oruga de juguete, plegándose y estirándose.

La cabeza es el reloj. Cada célula calcula la fase con la edad de la cabeza —el cuerpo la siente por el lazo con .trefage, la cabeza la conoce con su .robage— y alterna cada siete ciclos: en una mitad, el cuerpo se clava y el lazo se estira al máximo, con la cabeza suelta; en la otra, la cabeza se clava, el lazo se acorta a 1 y el cuerpo se arrastra hasta ella.

def time 100
def head 101
def move 102
def maxlengh 972

' cuerpo: fase alta del reloj, me clavo y ordeno estirar el lazo
cond
 *.move 1 !=
 *.head 0 =
 *.trefage *.time mod *.time 2 div >
start
 *.maxlengh .fixlen store
 1 .fixpos store
stop

' cuerpo: fase baja, me suelto y acordeon: el lazo a 1
cond
 *.move 1 !=
 *.head 0 =
 *.trefage *.time mod *.time 2 div <
start
 1 .fixlen store
 0 .fixpos store
stop

El reparto tiene un candado. Cada Caterpillar vivo incrementa un contador público cada ciclo (.tout1), así que la edad que siento en el otro tiene que casar con el contador que me llega (.tin1): si el atado es un cadáver —que ya no incrementa— o un extraño, no comparte nada.

def stiftie 973

' solo reparto si el atado es un Caterpillar vivo
cond
 *.numties 1 =
 *.trefage *.tin1 =
start
 .tienum inc
 *.stiftie .stifftie store
 50 .sharenrg store
 50 .shareshell store
 50 .shareslime store
 100 .sharewaste store
 *.tiepres .readtie store
stop

Cuando caza, apunta con .setaim y elige el disparo según la defensa de la víctima: cuerpo (-6) contra las que confían en la toxina, energía (-1) contra las que confían en el caparazón (Disparos). Y trae un gen de despegue: con más de 5000 de energía y 2000 de cuerpo, corta el lazo con .deltie; cada mitad queda sola, y una célula sola pare una cabeza nueva. En nuestras corridas sin comida nunca llegó a tanto, pero en un mundo que da de comer es su manera de multiplicarse.

Un detalle para robarle: guarda su configuración —el largo máximo, la rigidez— en las celdas de memoria genética instantánea, así cada cría nace con los mismos valores sin escribirlos de nuevo (Memoria libre y epigenética).

Tribolis: el gusano con oficios

El Tribolis de Bacillus es un gusano con jerarquía. Cada célula se declara en una celda: 1 cabeza, 2 tramo, 3 cola. Todas nacen cabeza; la que queda sin lazos se degrada a cola y pare; y la cabeza que junta energía de sobra se degrada a tramo y pare una cabeza nueva, así el gusano crece del frente. Acá está diseccionado en su versión 1.0 (Tribolisv1.0_F2MB_Bacillus_51008.txt); el del tutorial Un multibot es la 0.1 (Tribolis_0.1_MB_Bacillus_-21008.txt), un esbozo anterior del mismo diseño.

def type 999
def head 1
def middle 2
def tail 3

' naci: me ato al padre, publico la firma y me declaro cabeza
cond
 *.robage 0 =
start
 2 .tie store
 654 .out1 store
 .head .type store
 654 .tout1 store
stop

' celula sola con energia: me degrado a cola y fundo el gusano
cond
 *.numties 0 =
 *.nrg 2000 >
 *.eye5 40 <
start
 .tail .type store
 60 .repro store
stop

Cada oficio tiene sus genes. La cabeza empuja a fondo —en la corrida, .velup quedó clavado en 40, el tope de velocidad (Velocidad máxima)— y lleva el lazo a 628 con .fixang, el cuerpo colgando atrás. Los tramos empujan más despacio para no perder la cadena y tiran los desechos. Y la cola es la que maneja a la presa: no la mata, la gobierna.

def type 999
def tail 3

' cola: le escribo un 1 en su .fixpos y la presa queda clavada
cond
 *.type .tail =
 *.in1 *.out1 !=
 *.eye5 30 >
 *.reffixed 0 =
start
 .shootval inc
 .fixpos .shoot store
stop

' cola: si la presa esta paralizada, la hago girar
cond
 *.type .tail =
 *.in1 *.out1 !=
 *.memval 0 >
 *.eye5 30 >
start
 *.refxpos *.refypos angle 628 add .shootval store
 .setaim .shoot store
stop

El truco es el disparo de memoria: .shoot con un valor positivo escribe tu .shootval en esa celda del blanco (Disparos). La cola escribe en el .fixpos de la presa (queda clavada) y hasta en su .setaim (la gira media vuelta). Entre eso y su veneno, la presa llega mansa a la boca de la cabeza.

La defensa también es del organismo entero: cada célula publica por el lazo cuánto caparazón y toxina está manteniendo, y adopta el nivel del vecino si es mayor —si te disparan a una célula, todo el gusano se blinda.

Y si el gusano se rompe, no se pierde: cada pedazo sigue caminando y el que queda solo vuelve a fundar. En nuestras corridas, un gusano cortado dio dos organismos nuevos, cada uno con su cola y su cabeza.

Inchworm: la cabeza maneja a control remoto

El Inchworm de Purple Youko es el minimalista: una cabeza y una cola, nada más. Su gracia es cómo habla la cabeza con la cola. El paso dura diez ciclos, marcados por un contador: en uno, la cabeza se clava y le ordena a la cola que se suelte; en otro, se suelta ella y le escribe directamente «quedate quieta» en la celda del .fixpos de la cola, por el lazo. Después acorta el lazo a 120 (la cola se arrastra hasta la cabeza clavada) y lo estira a 360 (la cabeza sale empujada, con la cola de ancla).

def type 50
def counter 51
def fix 54

' cabeza, contador 1: me clavo yo y le ordeno soltarse a la cola
cond
 *.type 1 =
 *.counter 1 =
start
 1 .fixpos store
 1 .tienum store
 2 .tieval store
 .fix .tieloc store
stop

' cabeza, contador 6: me suelto yo y le escribo quedate quieta
cond
 *.type 1 =
 *.counter 6 =
start
 0 .fixpos store
 1 .tienum store
 1 .tieval store
 .fixpos .tieloc store
stop

Fijate en la diferencia entre las dos órdenes. La primera escribe en una celda de datos de la cola (su fix), y la cola reacciona con genes propios. La segunda va directa: escribirle en su .fixpos es escribirle una orden, y el motor la ejecuta en su turno. La escritura viaja en la fase de fuerzas y choques, así que la orden de hoy se obedece mañana (Lazos y multicelulares). Medido: el .fixpos de la cola cambia exactamente cuando el contador de la cabeza lo manda.

Es lentito —en la corrida, apenas un par de unidades por ciclo— pero no se desarma nunca: cada paso clava primero a una de las dos, así que el organismo nunca queda suelto.

Un consejo de diseño

De estas corridas me quedaría con dos formas de sincronizar una marcha. Si la coreografía es periódica, no mandes órdenes: compartí un reloj. El Caterpillar no le ordena nada al cuerpo: las dos células leen la edad de la cabeza —una por el lazo, otra de memoria propia— y cada una deduce su paso; no hay mensaje que se pueda perder. Y si la orden es puntual, no la publiques y esperes: escribila en la memoria del otro con .tienum, .tieloc y .tieval, como el Inchworm con su .fixpos remoto. Publicar en .tout8 y que el otro lea .tin8 necesita que el otro tenga el gen que escucha; la escritura directa, no.

Los oportunistas

No todos los «MB» viven en organismos. El W6 de Peterb —un genoma enorme lleno de tácticas— se ata cuando le conviene y se corta cuando no: publica por los lazos dónde vio al enemigo y arma cadenas según cuánta población haya. En nuestras corridas nunca pasó de parejas pasajeras: lazo, un rato de .multi 1 y a otra cosa. El organismo, para él, es una táctica más, no una identidad. Sembralo denso y ralo y vas a ver la diferencia.

Qué probar después