Screeps #HO | MMO para programadores en JavaScript

AikonCWD

Os presento el primer juego Multiplayer Masivo Online (MMO) para programadores. Se trata de un juego de estrategia muy completo, donde deberás hacerte cargo de las unidades (creeps), recolección de energía y minerales, control de territorio, economía, industria, transporte, logística y por supuesto milicia (ataque y defensa).

Screeps - MMO para programadores

La principal diferencia de éste peculiar MMO es que no puedes controlar directamente a tus unidades, no puedes interactuar con el ratón, tampoco puedes enviar ordenes a tus creeps... todo lo que quieras hacer lo tendrás que programar en JavaScript! Un video aclarará muchas cosas:

Poder programar directamente tu colonia ofrece muchas ventajas. Se trata de un MMO que requiere poco tiempo delante del juego, ya que tus creeps seguirán trabajando incluso con el ordenador apagado. Simplemente tendrás que dedicar tu esfuerzo en programar correctamente a tus creeps para luego dejar que tu colonia evolucione sola. Un buen jugador/programador de screeps solo necesitará echar un vistazo rápido al juego cada 1 o 2 días.

Información

El mapa del mundo es universal para todo los jugadores, se ha dividido el mapa en habitaciones (rooms). Inicialmente tu colonia será desplegada en una room, coexistiendo con rooms adyacentes (y sus jugadores). Durante las primeras 8 horas se despliega una defensa para evitar ser invadido, deberás recolectar energía y levantar tus defensas si quieres que tu colonia prospere. Empezarás ubicando un Spawn con energía suficiente para generar un creep.

El creep por si solo no hará nada, ni recolectará energía ni se moverá. Para ello tendrás que abrir la consola y empezar a programar, un sencillo ejemplo:

if(creep.carry.energy < creep.carryCapacity) {
	var sources = creep.room.find(FIND_SOURCES);
	if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) creep.moveTo(sources[0]);
} else {
	var targets = creep.room.find(FIND_STRUCTURES, {
		filter: (structure) => {
			return	(structure.structureType == STRUCTURE_SPAWN) &&
					(structure.energy < structure.energyCapacity);
		}
	});
	if(targets.length > 0) {
		if(creep.transfer(targets[0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) creep.moveTo(targets[0]);
	}
}

Sencillo, verdad? :) Hablemos un poco de nuestros creeps. A diferencia de un juego de estrategia estándar, aquí no tenemos diferentes tipos de unidades (trabajadores, soldados, civiles, etc...), en screeps solo tenemos una única unidad para hacer cualquier trabajo. Cada creep podrá ser generado con un número limitado de "partes", cada "parte" servirá para una acción, ejemplo:

Aquí vemos 4 unidades creep con partes diferentes:

  • El primero tiene 2 partes de trabajo y 2 de movimiento (trabajador, minero, etc...)
  • El segundo tiene 1 parte de trabajo, 2 de ataque y 1 de movimiento (un luchador)
  • El tercero tiene 3 partes de médico, 3 de movimiento y una de escudo (médico)
  • El cuarto tiene 5 partes de ataque a distancia, 1 de ataque melee y 2 de movimiento (arquero)

Éstos son solo 4 ejemplos, nuestra estrategia nos dirá cuantas partes dedicamos a cada trabajo para hacer nuestra colonia más eficiente. Los creeps crecen y mueren, alrededor de 1500 ticks en el juego. Así que es recomendable programar algún bucle que vaya comprobando cuantos creeps tenemos y genere nuevos cuando alguno muerda de viejo. Os dejo el listado de partes disponibles y su significado:

Para crear un creep nuevo, podemos usar una instrucción similar a la siguiente:

var newName = Game.spawns.Spawn1.createCreep([WORK,WORK,CARRY,MOVE], undefined, {role: 'miner'});
console.log('Ha nacido un nuevo creep! ' + newName);

En la instrucción de generar un creep indicaremos la cantidad y tipo de partes, así podremos designar un trabajador o un guardián.

Podría dedicar horas describiendo cada parte del juego, pero parte de la magia de screeps es meterse a leer su wiki y su API guide. Ahí encontraréis toda la información necesaria del juego y la descripción de cada objeto para poder programar

Como instalar y jugar a screeps

Web oficial www.screeps.com. Screeps ha sido lanzado a Steam. Antes de comprar el juego os recomiendo crear una cuenta gratuita para probarlo en un simulador. A partir de aquí podéis adquirir una subscripción de CPU y empezar a jugar online o realizar la compra en Steam. La gracia de Steam es que adquieres una subscripción de 10 CPU para siempre y 30 CPU durante 30 días:

Jugar online y dejar que tu colonia trabaje requiere tiempo de CPU sobre los servidores remotos, ese desgaste tiene un coste. Para poder jugar a screeps online necesitarás disponer de CPU en el servidor remoto, por eso es recomendable comprar en Steam el juego y tener siempre 10 CPU para tu colonia. El juego puede ser programado directamente en tu navegador web, podrás jugarlo desde cualquier PC sin instalar ni descargar nada. También es posible diseñar los scripts en tu IDE favorito, incluso lincar tu cuenta en GitHub y hacer commits directamente, tu colonia comprobará cualquier cambio y aplicará el nuevo script a la colonia!

El juego dispone de una demo/tutorial muy completo (recomendable hacer el tutorial). Gratis y sin necesidad de registrarse [AQUI]. Se te enseñará lo básico, como crear un creep y escribir tu primer código que permitirá moverlo y hacerlo auto suficiente.

A quien le llame la atención el juego, aviso que se requieren nociones de programación. Si no sabes programar en ningún lenguaje, screeps no es tu juego. No es necesario que seas un gurú de JavaScript (yo no lo soy!), si conoces y sabes programar en cualquier otro lenguaje similar (C#, Java, .Net, Python, etc...) no tendrás ningún problema en adaptarte al juego. Aquí el mejor jugador será el que mejor programe, así de simple! Lo bueno de screeps es que se trata de un juego evolutivo... Crea una colonia nueva y programa lo básico, luego deja a tus creeps moverse e interactuar, si finalmente mueres, coge el mismo código y mejora aquella parte que te ha fallado.

Imagina que en una de tus partidas, tu colonia ha terminado exterminada... quizás sería bueno revisar tu módulo de defensa y añadir más recursos o mejorar tus condiciones para atacar o defenderte antes... Si te quedas sin recursos en mitad de una partida sería bueno invertir tiempo en programar un sistema de control de energía más eficiente o mejorar los tiempos de desplazamiento utilizando carreteras. Tus creeps podrían detectar si se desplazan por un mismo camino y designar ahí la construcción de una carretera, no? Pues a programar!!

Si estás muy perdido siempre puedes mirar los scripts de otros jugadores para tomar ideas, GitHub está lleno de scripts útiles!

Despedida

De momento me paro aquí, es una tontería que escriba un manual de screeps en el foro cuando tienes una documentación perfecta con su API guide disponible en la web oficial. Recordad, cread una cuenta gratuita y jugar en el simulador/tutorial. Completa los 5 tutoriales y tendrás suficiente información para decidir adentrarte en el mundo de screeps o mandar el juego al baúl... sinceramente éste juego no está pensado para casuals ni para gamers... solo un verdadero programador podrá soportarlo!

22
AikonCWD

Para facilitar un poco vuestro inicio e introducción a screeps, posteo 4 módulos básicos que os permitirán iniciar una colonia auto-gestionable. No incluye ningún sistema de defensa o ataque, pero os ayudará a mantener una población mínima de creeps y designar 3 tareas diferentes. Dejo el módulo principal main.js y el resto en spoiler:

main.js

var roleHarvester	= require('role.harvester');
var roleUpgrader	= require('role.upgrader');
var roleBuilder		= require('role.builder');

module.exports.loop = function () {

    for(var name in Memory.creeps) {
        if(!Game.creeps[name]) delete Memory.creeps[name];
    }

    var harvesters = _.filter(Game.creeps, (creep) => creep.memory.role == 'harvester');
    if(harvesters.length < 5) var newName = Game.spawns.Spawn1.createCreep([WORK,WORK,CARRY,MOVE], undefined, {role: 'harvester'});

    var upgraders = _.filter(Game.creeps, (creep) => creep.memory.role == 'upgrader');
    if(upgraders.length < 5) var newName = Game.spawns.Spawn1.createCreep([WORK,WORK,CARRY,MOVE], undefined, {role: 'upgrader'});

    var builders = _.filter(Game.creeps, (creep) => creep.memory.role == 'builder');
    if(builders.length < 1) var newName = Game.spawns.Spawn1.createCreep([WORK,WORK,CARRY,MOVE], undefined, {role: 'builder'});

    for(var name in Game.creeps) {
        var creep = Game.creeps[name];
        if(creep.memory.role == 'harvester') {
            roleHarvester.run(creep);
        }
        if(creep.memory.role == 'upgrader') {
            roleUpgrader.run(creep);
        }
        if(creep.memory.role == 'builder') {
            roleBuilder.run(creep);
        }
    }
}
spoiler
2
MaTrIx

un poco hardcore el juego xD

7
Lolerpopler

me lo apunto para mirarlo más a fondo mañana, es una buena excusa para no dejar aparcado js. Aunque me duele pagar 15, por lo menos sin haber investigado un poco más sus posibilidades

1 respuesta
babri

me acabo de hacer una paja solo con este juego... es lo que necesitaba joder

nerkaid

Buen curro, me has dejado sin verano canalla jajaja

Na, habrá que probarlo, pero en JS estoy pez pez.

1 respuesta
AikonCWD

#4 Lee bien el hilo. No tienes que pagar nada... Entra en la web, abajo tienes un link a un simulador. Gratis, fácil, directo y sin registro. Podrás hacer el tutorial y probar el juego... si te convence y crees que eres capaz de programar algo lo suficientemente grande (y estable) como para ponerlo online y desatendido... adquiere CPU y a jugar online!

Aviso que para dominar correctamente el juego tendrás que empaparte mucho su API guide y saber programar con cabeza y eficiencia!

#6 Yo, salvo 4 mierdas que he modificado en el curro, jamás he tocado JS. Simplemente necesitas saber programar (bucles, condiciones, arrays, estructuras, listas, ...) el lenguaje y su sintaxis no será un impedimento. Te lo aseguro.

2 respuestas
xeven

Yo en JS ando tmb algo pez y me vendra bien para recordarlo pero me parece un poco caro por 15€.

El tema de las CPU no he terminado de entenderlo, ¿que diferencia hay entre tener 10 o 40? He leido el tema por encima y quizas me he saltado algo.

#7 Entre el TIS-100 y este estas a full con juegos relacionados a programacion jaajja

1 respuesta
AikonCWD

#8 Para jugar online y dejar que tu colonia "juegue" por si sola (incluso con tu PC apagado) se necesita tiempo de CPU para ejecutar tu código en el servidor remoto. Cada tick en el juego ejecuta un loop completo de tu código (y el código de todos los usuarios online). Cada instrucción que quieras ejecutar en un mismo tick consume una cantidad fija de CPU, por ejemplo:

La instrucción creep.attack() tiene un coste fijo de 0.2 CPU. Si en un mismo bucle/tik llamas a la función creep.attack() 5 veces, habrás consumido 1 CPU. Eso significa que tu código consume 1 CPU desde el inicio hasta el fin. Imaginemos que tienes un código más completo, la totalidad de sus instrucciones no podrás superar el máximo de CPU contratadas.

El juego tiene 2 formatos, el simulador y la versión online. Para jugar en el simulador, el tiempo de CPU es infinito (pues los scripts se ejecutan en tu PC). Cuando jugamos online estaremos dejando el código ejecutándose en el servidor remoto y eso tiene un coste. Por eso repito; probad el simulador (no hay límite y puedes acelerar o pausar el juego), no podrás dejar tu colonia jugando "sola" en el simulador, pero puedes guardarte el código javascript y jugar al día siguiente. Si ves que te gusta el juego y crees que podrás meterle horas, compra la versión de Steam que viene con 10 CPU (eso da para una colonia bien maja, mi actual colonia consume un maximo de 3 CPU y tengo como 40 creeps haciendo cosas xD).

Ésta web explica muy bien como funciona la CPU. Además puedes programar y añadir alertas para autogestionar tu código en función de la CPU que estás utilizando, así no paralizarás tu colonia si crece de forma desorbitada.

1 1 respuesta
xeven

#9 Muchas gracias por la información, es que lo habia leido y no lo habia entendido. Pues mañana le dare un intento q asi mejoro en JS q siempre viene bien

Saiko9

le echaré un ojo y lo mas seguro que lo pille, JS se me daba bastante bien :P

Fyn4r

La idea me parece que merece una oportunidad pero ¿javascript? Ni con un palo

1 1 respuesta
B

molaria mas en python :(

Saiko9

#12 Creo que no hay mejor lenguaje sinceramente xD, es el mas divertido.

Bashpan

uff me atrae muchísimo, pero el tema de uso de CPUs y que tiene pinta de ser un picacódigos, probare el trial.

g4sb0

Pillado, idea muy curiosa :D gogo comunidad mediavida :b

Saiko9

Estaba a punto de comprarlo pero he visto que hay mierdas de pago royo subscripcion, creo que tiene q ver con lo de la CPU...

Alguien me hace un rpv del sistema de pago? por muy original q sea paso de comprar determinados juegos con microtransacciones.

edit: bueno por lo visto lo que he visto es que funciona como los mmos de toda la vida, método del que estoy TOTALMENTE a favor de pago pero quizás no en un juego como este xD, el singleplayer será gratis siempre y el juego viene con 30 dias gratis por lo visto (o que no puedes jugar full al menos una vez pasen sin pasar por caja).

Tanto renta el juego? me choca bastante este modelo de pago tan antiguo en un juego que al fin y al cabo parece que esta muy bien pero vamos, tampoco es un wow en sus tiempos.

1 respuesta
g4sb0

#1 qué nick de player tienes para buscarte y ponerme al lado? =)

1 respuesta
Frave

El juego me parece divertido y tal, sobretodo porque siempre he querido aprender javascript y con esto podría aprender la sintaxis, pero joder mensualidades en seriooo...pagar 15€ por algo que voy a mirar cada dos días si eso, no se no me mata quizás pruebe la versión gratis y cambie de opinión pero lo dudo.

AikonCWD

#17 Lee en #9
#18 Siempre podrás buscarme en cualquier juego/comunidad por mi nick: AikonCWD
Empecé a jugar ayer, mis colonias no duran ni 24h y aún estoy montando mi repo en GitHub para compartir mis scripts, todo eso sumado a que no controlo JavaScript... risas aseguradas xD

1 respuesta
Saiko9

#20 sí si, si lo he leido mas o menos.

Mi duda no es respecto al sistema de CPU es mas si el juego esta bien hecho, tiene contenido e infinitas horas de diversión... ese royo para ver si worthea. De momento con que sea un true sandbox (pocos hay) me conformo.

De todas maneras aunque ahora estoy liado le estoy echando un ojo al tuto y me mola lo que veo.

ArcSTAR

Se os va de las manos

RaWnNnNn

A favoritos, así practico un poco de js este verano. Mola mucho.

bazoo
7 1 respuesta
AikonCWD

#24 Hay gente muy hardcore por reddit, ese ha hecho un reloj en javascript usando creeps, que puto amo xD.

btw, acabo de leer una función interesante en la API: creep.say('message'); permite hacer que un creep hable. Lo acabo de probar y es cojonudo!:

if(creep.carry.energy < creep.carryCapacity) {
    var sources = creep.room.find(FIND_SOURCES);
    creep.say('Trabajando');
    if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
        creep.say('De camino');
        creep.moveTo(sources[0]);
    }
}

Resultado:

No me negaréis que el juego es una pasada xD. Las posibilidades son máximas!

1 respuesta
t3r3r3

Me he puesto cachondo, será por fin este el primero juego que me llene, mañana con tiempo lo miro.

MartiONE

Me apunto al hype train!

Ardi

#25 Molaria poder hacer un servidor en raspberry ya que eres el experto pero la idea del juego es cojonuda simplemente para aprender es muy decente he tenido dos asignaturas de progamacion una en C# y otra en java esta ultima nos toco picar codigo durante el ultimo mes de cuatri a ver si me acuerdo de algo xD

VirtualEvan

Pfff, no tengo ni warra de javascript, pero mañana dedico mi tiempo de estudiar a probar la demo y seguramente me lo pille, aunque me iré de vacaciones.

De lo de la CPU leí lo de arriba pero tengo un par de preguntas.

Cuánto dan, porque según lo que dicen te quedas en 10 de CPU una vez se termine el período

spoiler

Y lo otro es, puedo activarlo cuando yo quiera, o se me activa justo al comprar el juego, porque como dije antes me iré de bacaciones y estaría bien que pudiera activarlo cuando volviera en vez de ahora al comprarlo

2 respuestas
Saiko9

#29 Podeis jugar "free" desde el navegador sin problema, si no se sabe programar aviso de que es gilipolez comprarlo, juegalo desde el navegador y aprende JS a la vez!

Ya me he hecho todo el tutorial a la velocidad de la luz xD, lo mas seguro que lo compre mañana para apoyar a los devs y jugar con IDE y en su ejecutable.

De momento lo peor que le veo es que es un EA, no se como estará de contenido (aunque sea programar xD) a priori tampoco me parece que haya tantas cosas aunque las posibilidades sean infinitas, he estado leyendo que el engine sera open y que se escuchara a la comunidad con opción a participar.

Así que bueno, JS esta actualmente de moda y se paga bastante, veo a mas de un viciao top 10 del juego trabajando para Google ya xD. El juego solo le veo futuro si meten muchas features y lo hacen sandbox de verdad, rollo Minecraft y que en tu sala puedas hacer literalmente cualquier cosa.