Un alimentador por lazo
Paso a paso: un bot que encuentra una presa, la ata con un lazo, le chupa la energía por el lazo, la suelta cuando se seca y se reproduce con la ganancia.
En Un bot que busca comida le robás la energía a los vegetales a disparos, y en Un vegetal criaste esas algas que fabrican energía de la luz. Este tutorial construye al tercero en discordia: un bot que no caza ni fotosintetiza, sino que ata su comida con un lazo y se la chupa. Cada paso le agrega genes al ADN y te dice qué deberías ver.
Un lazo en vez de un disparo
Cazar a disparos (Un bot que dispara) es correr detrás de la comida. Con un lazo (Lazos y multicelulares) te atás una vez y el lazo trabaja solo: fija a la presa (es un resorte: no se va a ningún lado mientras comés) y la vacía (por el lazo le transferís energía cada ciclo, directo de su reserva a la tuya — Lazos y multicelulares).
El precio: de cada 100 que le sacás, te quedás con 70 como energía, casi 3 como cuerpo y 1 como desecho. Rinde menos que un buen disparo; la compensación es que la orden pasa todos los ciclos, gratis y sin puntería.
Paso 1 · La presa
Necesitás algo con energía que no se defienda. Sembrá en Observar → Sembrar el alga que armaste en Un vegetal marcada como Vegetal (hace fotosíntesis), o unas cuantas copias de un blanco quieto como el de Un bot que dispara:
' Blanco de practica: no hace nada
cond
start
stopAl blanco lo vamos a ver morir de a poquito; el alga, con el sol de fondo, dura más. Para las mediciones de este tutorial usamos el blanco quieto, un campo de 1200×900 y bots de 3000 de energía.
Paso 2 · Encontrarla y acercarse
El lazo solo alcanza al bot que estás viendo, y de cerca: el motor no ata a más de unos 480 de borde a borde, y menos si los bots son chicos. Así que primero está la caza de siempre: girar buscando, apuntar, acercarse. Con dos genes alcanza, porque el ojo con foco ya te describe al que mejor tenés enfrente: su posición en .refxpos y .refypos, su energía en .refnrg y su especie en .refeye (Visión).
' Manos libres y lo de enfrente no se come: virar al azar y avanzar
cond
*.tiepres 5 !=
*.refnrg 100 <
*.refeye *.myeye =
or
start
314 rnd .aimdx store
10 .up store
stop
' Manos libres y presa a la vista: apuntarle y acercarse
cond
*.tiepres 5 !=
*.refnrg 100 >
*.refeye *.myeye !=
start
*.refxpos *.refypos angle .setaim store
10 .up store
stopTres decisiones nuevas en esas condiciones:
.refnrgpor encima de 100 es «esto tiene energía y está vivo»: los cadáveres, que muestran su energía real, 0, quedan fuera del menú..refeyedistinto de.myeyees la prueba de especie de Un bot que reconoce a su especie: no le corre a los tuyos..tiepresdistinto de 5 es «no estoy comiendo»: el 5 es el puerto con el que vamos a llamar al lazo del paso siguiente, y esta marca impide que el bot ate dos presas a la vez.
El primer gen usa or: vira si lo que ve no se come o es pariente, y avanza siempre, empujando lo que estorbe.
Qué deberías ver: el bot pivota y camina al azar hasta que la presa entra al abanico de los ojos; ahí clava el rumbo con .setaim y va derecho. En nuestra corrida la tenía enfocada al ciclo 2 y la tocaba al 11.
Paso 3 · Atarla
' Presa cerca y enfrente: atarla con el puerto 5
cond
*.tiepres 5 !=
*.refnrg 100 >
*.refeye *.myeye !=
*.eye5 50 >
start
5 .tie store
stopUn .eye5 de 50 son unas 200 unidades de borde a borde: al cruzar esa línea, el bot escribe 5 en .tie y al final de la fase de acciones el motor lo ata al bot que está viendo. El 5 es el puerto: el nombre con el que vos vas a elegir ese lazo; la presa lo va a llamar 1, por su orden de llegada (Lazos y multicelulares). La orden se borra siempre, salga o no, y cada intento cobra el costo de atar (Atar): 0 en las simulaciones de fábrica, 2 en la liga F1.
La presa todavía puede zafar: su baba desvía el intento (.slime — con más de 92 no hay lazo posible) y cada intento, salga o no, le gasta 20 (Defensas).
Qué deberías ver: en la app, una línea fina entre los dos, azulada mientras el lazo está blando. En la memoria del inspector (El inspector): el alimentador con .numties en 1 y .tiepres en 5; la presa, con .tiepres en 1.
Paso 4 · Chuparle la energía
' Presa atada que no es de los mios: leerla y chuparle energia
cond
*.tiepres 5 =
*.trefeye *.myeye !=
start
5 .readtie store
5 .tienum store
-1 .tieloc store
-1000 .tieval store
stopCuatro órdenes: .readtie apunta los sentidos del lazo (las celdas tref*) al puerto 5; .tienum elige el lazo 5 para todo lo demás; .tieloc en −1 dice «transferir energía» y .tieval negativo, «sacar». Podés sacar hasta 3000 por ciclo; pedimos 1000, y el motor te lo recorta a lo que le quede a la presa.
La transferencia ocurre en la fase de movimiento de ese mismo ciclo, y al siguiente ya estás comiendo. Lo que medimos contra el blanco quieto:
| Ciclo | Presa | Alimentador (energía / cuerpo / desecho) |
|---|---|---|
| 12 | 3000 (atada) | 3000 / 1000 / 0 |
| 13 | 2000 | 3700 / 1029 / 10 |
| 14 | 1000 | 4400 / 1058 / 20 |
| 15 | 0: cadáver | 5100 / 1087 / 30 |
Cada ciclo la presa pierde 1000 y vos ganás 700 de energía, 29 de cuerpo y 10 de desecho (.waste): el 30 % restante se pierde en el camino. La condición con .trefeye es la misma prueba de especie, ahora mirando al atado en vez de al visto.
Paso 5 · El resorte: fijar la presa
Atar a la carrera tiene su física. El lazo nace con el largo que había al formarse y tolera 20 unidades de diferencia sin hacer nada: fuera de esa zona muerta es un resorte que tira de los dos. Como llegás empujando, el largo queda corto, la presa queda casi pegada y el par sigue deslizando junto unas 200 unidades antes de asentarse — arrastrar funciona igual al revés, cadáver incluido. Eso sí: un vegetal cargado de cloroplastos es muchísimo más masivo que un bot de puro cuerpo (Física).
A los 19 ciclos el lazo se endurece: en la app la línea se vuelve ocre y más gruesa, y los dos bots pasan a ser multicelulares (.multi vale 1 en los dos). Para entonces podés mandarle geometría: .fixlen fija el largo y .fixang el ángulo, y la presa pasa a colgarte de un brazo corto, frente a la nariz.
' Lazo endurecido: llevarla pegada y al frente
cond
*.multi 1 =
*.tiepres 5 =
start
100 .fixlen store
0 .fixang store
stopEn nuestra corrida, desde el endurecimiento, .tielen bajó de a poco hasta unos 40 de borde a borde y .tieang fue acercándose a 0: la presa quedó a un palmo, muerta adelante. Con una presa chica el banquete dura menos que esos 19 ciclos, así que el gen recién luce con las presas gordas. Ser multicelular con tu propia comida tiene efectos laterales —los costos se dividen y tus disparos pegan más (Lazos y multicelulares)— y es, exactamente, el mecanismo que Un multibot usa para bien.
Paso 6 · Soltar cuando se seca
La presa seca no desaparece: queda como cadáver y sigue atada, y un bot que no suelta vive arrastrando su despensa vacía. El gen que falta:
' La presa se seco: soltarla
cond
*.tiepres 5 =
*.trefbody 0 >
*.trefnrg 100 <
start
5 .deltie store
stop.trefnrg es la energía del atado, leída por el lazo con un ciclo de atraso. Con menos de 100 no queda nada que chupar: .deltie corta el lazo 5 y el bot queda libre. La condición con .trefbody evita un falso positivo: en el primer ciclo del lazo las celdas tref* todavía están vacías, y sin ese control el bot cortaría la presa recién atada.
Qué deberías ver: un ciclo después de que la presa llega a 0, los dos quedan con .numties en 0 y el alimentador vira a buscar otra. No vuelve a atar al cadáver: la prueba de .refnrg del paso 2 ya lo deja fuera del menú.
El bot completo
Falta lo de siempre: cuando la energía sobra, hijos. El gen pide un 30 % con .repro a partir de 6000, y solo con las manos libres: el parto necesita lugar libre delante, y mientras comés tenés la presa tapando ese lugar. Este es el bot entero, tal como lo corrimos:
' Un alimentador por lazo
' Busca presa, la ata con el puerto 5, le chupa la energia,
' la suelta cuando se seca y, con la ganancia, tiene hijos.
' Manos libres y lo de enfrente no se come (o es de los mios):
' virar al azar y avanzar
cond
*.tiepres 5 !=
*.refnrg 100 <
*.refeye *.myeye =
or
start
314 rnd .aimdx store
10 .up store
stop
' Manos libres y presa a la vista: apuntarle y acercarse
cond
*.tiepres 5 !=
*.refnrg 100 >
*.refeye *.myeye !=
start
*.refxpos *.refypos angle .setaim store
10 .up store
stop
' Presa cerca y enfrente: atarla con el puerto 5
cond
*.tiepres 5 !=
*.refnrg 100 >
*.refeye *.myeye !=
*.eye5 50 >
start
5 .tie store
stop
' Presa atada que no es de los mios: leerla y chuparle energia
cond
*.tiepres 5 =
*.trefeye *.myeye !=
start
5 .readtie store
5 .tienum store
-1 .tieloc store
-1000 .tieval store
stop
' Lazo endurecido: llevarla pegada y al frente
cond
*.multi 1 =
*.tiepres 5 =
start
100 .fixlen store
0 .fixang store
stop
' La presa se seco: soltarla
cond
*.tiepres 5 =
*.trefbody 0 >
*.trefnrg 100 <
start
5 .deltie store
stop
' Energia de sobra y manos libres: un hijo
cond
*.nrg 6000 >
*.tiepres 5 !=
start
30 .repro store
stopContra dos blancos quietos, en un campo de 1200×900: vació al primero en diez ciclos (quedó en 5100), tardó unos setenta más en dar con el segundo, lo vació igual, y al ciclo 90 nació el primer hijo — el padre quedó en 5037, el hijo arrancó con 2157 y el mismo ADN. Después los dos vagaron sin encontrar nada: el campo estaba limpio.
En el Bestiario hay alimentadores por lazo de verdad. El Hybrid of a tiefeeder and Alga Chloroplastus es este bot con menos nudos: se ata con .tie a quien no es de su especie, le saca 1000 por ciclo con .tieloc en −1 y corta el lazo si el atado resulta pariente. Lo corrimos contra un blanco quieto: lo vació en unos diez ciclos, pero siguió arrastrando el cadáver. Soltar la presa seca es la mejora que le pusimos nosotros.
Qué probar después
- Presas gordas. Contra un vegetal que fotosintetiza mientras comés, subí la extracción: el tope es 3000 por ciclo, no 1000. Y probá soltar antes de que se seque del todo: el umbral está en el gen del paso 6.
- Comerte los cadáveres. El −1 solo saca energía; con
.tielocen −6 le sacás cuerpo, y el cuerpo del cadáver atado es la sobremesa. En una corrida larga contra un campo lleno de algas, nuestro bot terminó enterrado entre los cadáveres de sus propias presas: son muros — y de fábrica ni se pudren, porque la Descomposición por ciclo viene en 0. Vaciarlos con el −6 es la cura. - Que no te lo roben. Otro alimentador puede atarse a tu presa, o a vos. La baba es la defensa específica: con más de 92 nadie te puede atar, y cada intento fallido le cuesta 20. La toxina castiga al que chupa. Y como
.deltiecorta desde cualquier extremo, un gen que corte los lazos que no pediste te limpia de parásitos — ojo: cortaría también el lazo de nacimiento con tu hijo (Lazos y multicelulares, Defensas). - Paralizar la presa. Por el lazo también viaja veneno:
.tielocen −3 la deja quieta con tu.strvenom, para que no se arrastre con vos a ningún lado (.tieloc). - El mismo mecanismo, para bien. Todo lo que acá usaste para vaciar a otro, un multibot lo usa para alimentar a los suyos:
.tievalpositivo le pasa energía a tu compañero, y.sharenrgla reparte parejo. Seguí con Un multibot y, para las tácticas de torneo, Multibots.