Screeps #HO | MMO para programadores en JavaScript

EnderFX

#240

Memory.colony.sources = {};
for(var n in sources) {
    Memory.colony.sources[n] = {
    	id : 'sin minero'
    };
}

Explicación:

spoiler
1 respuesta
AikonCWD

#241 Que lo hagas tan fácil da mucha rabia xD

1 respuesta
EnderFX

#242 imagínate picar 43h semanales durante dos años de eso, muy poco de HTML y bastante de CSS.

Por cierto, para probar esas cosillas el F12 de Chrome con datos sencillos sobre la marcha ayuda mucho.

1 respuesta
AikonCWD

#243 He modificado un poco tu código, ahora ya sale como quiero:

    var minas = Game.rooms[MyRoom].find(FIND_SOURCES);
    Memory.colony = {}
    Memory.colony.sources = {}
    var i = 0;
    for(var n in minas) {
        Memory.colony.sources['supply' + i] = {
            id : minas[n].id,
            minero : false
        };
        i++;
    }

Cuando ves un ejemplo se vuelve fácil. Pero cuando no tienes ni idea como yo, vas dando palos de ciego y es desesperante xD.

2 respuestas
EnderFX

#244 Ahí es donde viene muy bien tirar de la consola del Chrome/FF para poder parar la ejecución en cualquier punto del programa y ver el valor que hay en las variables y cómo van a funcionar los bucles, ya que el editor web del screeps en ese sentido está un poco verde.

AikonCWD

En JS, hay que hacer algo para que el resultado de Math.random() sea realmente random? Me da que siempre da la misma secuencia xD. En VB por ejemplo hay que invocar el método Randomize si quieres que la función rnd devuelva valores con un seed realmente aleatorio. En JS ocurre igual? Como se haría?

AikonCWD

doblepost:

Bueno, lo dejo por hoy, ha sido un día productivo para mi colonia. Me he centrado en mejorar la eficiencia de los creeps durante los primeros minutos de vida en una nueva room. Como ya expliqué, he designado un rol llamado miner que se desplaza a un source no ocupado y extrae energía sin descanso. Dicho miner no se mueve de su sitio.

Luego la colonia spawnea un nuevo creep con rol miner.helper. Se lanza un algoritmo muy eficaz para calcular la ruta más corta entre el miner y el Spawn, de ésta forma trazamos la construcción de una carretera para aligerar el movimiento. Nuestro miner.helper se moverá entre el Spawn y su miner por la carretera trazada.

Cada source tiene un miner y cada miner tiene un helper. Si uno de ellos muere, la memoria se libera para que el miner tenga un nuevo helper (o viceversa!)

El resultado lo podéis ver en la foto:

Los creeps negros son los miners y justo detrás están los helpers recogiendo la energia y transportándola (por la carretera) hasta el Spawn. He dejado atrás el otro algoritmo que construía demasiadas carreteras sin sentido, ahora es muy eficiente y barato :)


Mañana intentaré meterme más con la IA. Me gustaría poder crear un rol nuevo del tipo arquitecto que sea capaz de localizar el mejor sitio para construir un contenedor o una extensión. De momento no se ni como empezar xD.

2 1 respuesta
Postmortem

A mi me muere que JS sea de tipado débil Y_Y

edit: acabo de ver que todos mis chiquitines han muerto debido a lo idiotas que les dejé

tendré que seguir profundizando

1 respuesta
n3krO

#247 Puedo preguntar que algoritmo tiene y su complejidad?

Lo digo porque he pensado usar el algoritmo A* para calcular los paths al crear el spawn ya que este algoritmo tiene en cuenta el coste real (pasar por la zona verde cuesta 5 veces mas que pasar por una zona normal).

Ademas el algoritmo A* tiene una complejidad lineal si eliges bien los costes.

#248 A mi me mata el lenguaje en si. Es que me cuesta muchisimo trabajar en alto nivel porque me gusta controlar bien lo que estoy haciendo.

Deigaz

#244 Yo estaba intentando hacer algo parecido, pero estaba guardando los datos en un objeto en vez de en memory xdd. El mio te almacena las posiciones trabajables abyacentes a un recurso, no se si sirve realmente o teneis soluciones mejores pero ahí lo dejo.

spoiler
g4sb0

Me he creado un rol para reparar, pero no consigo hacer que reparen mis walls, es decir, se tendría que hacer con:

creep.repair(wallToRepair);

no?? pero no consigo filtrar para encontrar mis muros :S

¿Alguna ayuda?

1 respuesta
Amazon

#251 en el tutorial, parte 5, se explica eso, no recuerdo el código exacto, pero sí recuerdo que los muros no son tuyos, sino neutrales

1 respuesta
g4sb0

#252 Exacto, por eso lo estoy filtrando por FIND_STRUCTURES y no por FIND_MY_STRUCTURES.

Fuck :( xdd

1 respuesta
Amazon

#253 pásate a la branch tutorial5, ahí verás cómo lo hace para reparar la torre, supongo que para reparar un creep es igual

B

Lo compraria si no fuera por el pay2win que se han marcado con la subscripcion de CPU

1 respuesta
Amazon

#255 loggea con steam en la web, no he probado si puedes online, pero al menos en offline sí, y se guarda el progreso

voignar

Os presento mi colonia online

1 1 respuesta
Yandros09

#257 Joder, como mola.

Lolth

Buenas, vengo a por un poco de ayuda tengo una función que la llamo cuando un creep está al lado del spawn o container y esta función lo que debería hacer es transferir energia a un creep. Os pongo lo que tengo aquí.

utils.js

var utils = {
    run: function fillCreep(creep) {
        var source = creep.room.find(FIND_STRUCTURES, {
            filter: (structure) => {
                return (structure.structureType == STRUCTURE_SPAWN ||
                    structure.structureType == STRUCTURE_CONTAINER) && structure.energy >= (structure.energyCapacity/2);
            }
        });
        source[0].transfer(creep);
    }
};

la función la llamo desde aquí:

role.upgrader.js

            if(creep.pos.getRangeTo(path) == 1 && creep.carry.energy < creep.carryCapacity){
                creep.say('Filling');
                utils.run(creep);
            };

Añado que empiezo hoy con el JS, hasta la fecha solo he tocado java y algo de c#

1 respuesta
n3krO

#259 Mi no entender....

run: funcion fillCreep(creep)

O es run, o es fillCreep, no?

xdddd

Por cierto, seria:

run: function(creep)

1 respuesta
Lolth

#260 Vale, lo que intento hacer es crear una funcion con un nombre es decir como pondria en Java

void Fillcreep(creep){
Codigo
}

y llamarla desde otra "Clase" con utils.Fillcreep(asd),

1 respuesta
n3krO

#261 Pues:

fillCreep: function(creep) {

Es que como JS no esta tipado se han tenido que inventar otro modo de crear funciones que no sea "void" o el tipo que devuelve.

Porque puedes devolver en algunos caminos y en otros no, y puedes devolver del tipo que quieras...

1 respuesta
Lolth

#262 Gracias! ahora ya tengo algo con que empezar, tengo lo siguiente.

  1. Los harvesters minan y lo tiran al suelo
  2. Los haulers hacen viajes
  3. Los upgraders recojen del spawn o containers y mejoran

es poca cosa pero pinta bien xd

1 respuesta
n3krO

#263 Yo tendria 1 upgrader fijo y los demas los pondria de repair, y si no tienen nada que reparar, pues de upgrader.

Y tambien le puedes poner construir en esa cadena.

Para elegir las carreteras (y para mover los creeps) yo utilizaria A*

Aqui teneis uno implementado en JavaScript:

http://www.briangrinstead.com/blog/astar-search-algorithm-in-javascript

Obviamente lo tendreis que cambiar para que el coste dependa de si vas a una carretera, zona normal o zona lenta.

Yo calcularia la zona del spawn como el punto con camino minimo hasta las fuentes y hasta el room controller, despues lanzaria ordenes de construir carreteras en esos caminos minimos (si las haces de 2 o 3 de grosor mejor, lo digo porque cuando empiezas a tener muchos creeps ellos tendran que salirse de ese camino fijado).

Yo es que tengo mas o menos ideas para hacer las cosas, pero como JS me esta dando mucho cancer pues como que no me entran muchas ganas de ponerme a picar codigo :|

Lo que veo es que la mayoria de la gente construye cosas manualmente y tal, y mi objetivo es que la colonia funcione desde 0 sin problemas ningunos.

Primero que aproveche una room al tope desde 0 (y que ponga paredes/torres para defenderla de NPCs).

iRoN-G

Que pasada de juego.

Esta mañana me atacó un creep del jugador del mapa de al lado aunque aún me quedaban 12 días de Novice area, ¿No es esto una protección?

He reconstruido en otro mapa y de momento llevo esto

1 1 respuesta
gbpepe

#265 Construyes a mano?

1 respuesta
iRoN-G

#266

1 respuesta
gbpepe

#267 Es que estoy pegandome a ver como hago que construyan solos xd

1 respuesta
AikonCWD

#268 Yo también estoy con eso ahora mismo. Por el momento he conseguido que las acrreteras se construyan solas, los containers al lado del controller y 8 extensiones. El resto... pues ni idea xD

Lolth

Buenas!
una duda mas por aquí.

tengo lo siguiente:

var creeps = room.find(FIND_MY_CREEPS);
        for(var cid in creeps) {
            if (creeps[cid].memory == 'harvester') {
                console.log('test');
                if(!Memory.creeps[cid].workJournal){
                    Memory.creeps[creeps[cid].name].workJournal = [];

Tengo un creep con el rol de harvester y el código no llega a la linea de


console.log('test');
1 respuesta