Bennu Game Development

Foros en Español => Proyectos => Topic started by: Windgate on May 17, 2009, 05:17:32 PM

Title: Spore 2D (Animalicos)
Post by: Windgate on May 17, 2009, 05:17:32 PM
El nombre "Spore" es ambicioso, pero creo que es el nombre más corto y representativo para el proyecto.

Un alumno de 15 años tuvo la idea de programar un sencillo ecosistema en Bennu, y este fin de semana he estado programando e investigando las formas de recrear aspectos como la reproducción, el movimiento, el crecimiento, el contagio de enfermedades, la necesidad de alimentarse con otras especies...

El resultado es este "juego" donde 8 especies compiten por coexistir en la pantalla del PC.

He realizado diferentes modificaciones en las CONST del juego para obtener cierto equilibrio, espero que lo probéis y que modifiquéis a vuestro antojo. Y sobre todo aportar sugerencias por locas que sean, ya hemos pensado en meter relaciones simbióticas, parasitarias, etc. en este mundo virtual en el que los "animalicos" forman incluso países xD

Descargar aquí (100% listo para Linux/Windows):

http://www.mediafire.com/?wlmfxjhzmt2

PD: Tal y como está Bennu quizá convenga separar los Proyectos en 2D y 3D...
Title: Re: Spore 2D (Animalicos)
Post by: Prg on May 17, 2009, 09:47:04 PM
 ??? ??? ???

¿cuál de todos es?
hola mundo no es  ;D  ;D  ;D (ya lo bajé...)

suena muy interesante, sobre todo para tomar ideas de ambientación  ;)
Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 17, 2009, 11:08:38 PM
Yo no encontre cual es...
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 18, 2009, 11:06:37 AM
lol, puse el link con la carpeta compartida entera, ya lo he rectificado:

http://www.mediafire.com/?wlmfxjhzmt2

Hay problemas de rendimiento cuando empiezan a ser miles de animalicos, creo que es por culpa de la función collision(), hago un uso muy intensivo de ella.

¿Hay implementada alguna alternativa a collision() que no consuma tanto? Por muy simple que sea seguro que me sirve, son simples cuadrados los que tienen que detectar la colisión.
Title: Re: Spore 2D (Animalicos)
Post by: Drumpi on May 18, 2009, 12:53:08 PM
Get_dist con todas las ids de procesos animales? get_xdist y get_ydist? restando coordenadas? Creo que esas opciones PODRÍAN ser más óptimas.
Title: Re: Spore 2D (Animalicos)
Post by: laghengar on May 18, 2009, 01:55:53 PM
Hola, no se si has puesto collision en todos los frames; te lo digo porque podrías alternar su uso (por ejemplo: poniendo collision cada 2 frames ya ahorras mucho consumo) y haciendo un équilibrio entre número de frames y la percepción visual que se obtiene de ello puedes ganar bastante rendimiento.
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 18, 2009, 09:22:38 PM
Drumpi, ¿Te refieres a hacer que cada animalico haga get_dis() para todos los procesos activos? Sigue siendo demasiada carga, ¿No? Me gustaría poder tener 2000 o más procesos funcionando a la vez, me causa dolor ver cómo el Warcraft III tiene a veces miles de modelos 3D funcionando por ahí y resolviendo colisiones de forma fluída mientras que mis cuadrados se ejecutan a trompicones.

Laghengar, parece bastante buena idea eso de limitar el uso de collision(), voy a hacer un par de pruebas y os kuento.
Title: Re: Spore 2D (Animalicos)
Post by: laghengar on May 18, 2009, 09:32:18 PM
Tendrás que hacerte un estudio de cuantos frames saltarte para que el collision trabaje adecuadamente, hay que evitar que al final se acaben traspasando  ;D. Yo esto ya lo he hecho muchas veces y siempre da bastante resultado, lo recomiendo encarecidamente.
Title: Re: Spore 2D (Animalicos)
Post by: darío on May 18, 2009, 09:50:38 PM
Hola,

Lo he probado y puesto que mi ordenador no es muy potente casi enseguida se me pone lento...

Respecto de las colisiones, si te da lo mismo que tus procesos sean círculos en lugar de cuadrados, quizá podrías comprobar la colisión simplemente viendo si la distancia entre dos procesos es menor que la suma de los radios. Es una comprobación sencilla así que supongo que será más rápido que collision.
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 18, 2009, 11:54:02 PM
Es buena idea Dario, pero si 1000 procesos tienen que hacer esa comprobación con los otros 1000 procesos tenemos 1000000 de comprobaciones para cada FRAME;

Quizá sería todo más eficiente si usase un tablero sobre el que se muevan los animalicos, las comprobaciones de colisión podrían ser directamente sobre el tablero, y así evitar que todos los procesos tengan que hacer comprobaciones sobre todos cada vez, les bastaría con echar un vistazo a su "celda" del tablero y ver lo que tienen alrededor.

¿Alguien sabe a groso modo cómo está implementada la función collision? ¿Hace comprobaciones sobre todos los procesos activos cada vez que se invoca? Es que veo que resiente la eficiencia muy mucho...
Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 19, 2009, 12:05:03 AM
yo se como esta la collision...
pero probe el esquema de usar dist y la verdad tarda mucho igual... por el tema de la cantidad de chequeos...
hay que intentar otro metodo, por otro lado, agregue a la version que hice, nuevas features como madurez_sexual, con lo que da una edad minima para poder reproducirse... y alguna que otra cosa mas...
luego pongo el codigo...
Title: Re: Spore 2D (Animalicos)
Post by: DCelso on May 19, 2009, 10:25:31 AM
Yo tengo un algoritmo implementado en c de colisión de cajas, suficiente para cuadrados y rectángulos, a ver si lo encuentro y lo adapto a Bennu, seguro que saca máximo rendimiento al colisionado, a mí me fue de perlas en los primeros juegos c que hice para 486.
Title: Re: Spore 2D (Animalicos)
Post by: Drumpi on May 19, 2009, 10:48:56 AM
Hombre, yo porponía la solución de get_dist con todos los procesos porque supongo que collision tambien hace la comprobación con todos los procesos, y una vez que detecta dos muy próximos hace la comprobación a nivel de pixel, algo que en tu caso no necesitas.
Quizás exista un método: teniendo la lista de procesos, crear una matriz triangular de distancias entre ellos, y asi se puedan comprobar colisiones de forma rápida por la distancia, o no se, que cuando un proceso se mueva sume o reste su movimiento a sus correspondientes casillas... no se, estoy divagando.
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 19, 2009, 11:39:34 AM
Drumpi, lo que dices de la matriz y lo que sugiero yo del tablero viene a ser más o menos lo mismo xD

Ok Splinter, muy buena idea la edad mínima de reproducción. También habría que hacer que el valor de hambre se heredase de padres a hijos, si no se hace así cuando se quedan sin comida se siguen reproduciendo y la especie nunca muere.

Y luego tengo que meter las tablas de quiénes se comen a quiénes, relaciones simbióticas, etc. Tienen que ser tablas (Arrays o matrices), eso de que cada especie se alimente exclusivamente de otra es demasiado simple, la tabla le daría más juego.

Y si hago algún escenario la idea es que haya tierra, mar y aire, y por tanto especies terrestres, anfibias, voladoras... Mucho por hacer. Espero tu código Splinter, con que cuelgues el .PRG modificado yo me ocupo de integrarlo.
Title: Re: Spore 2D (Animalicos)
Post by: splinter_work on May 19, 2009, 02:57:34 PM
Aca te pego el ultimo codigo que hice.

Como veras no es muy rapido el asunto, tengo que verificar si es por algo en la forma de recorer tal cantidad de procesos, o por la cantidad en si... no hice el calculo de cuantos procesos y cuantos chequeos realmente se hacen...
hay 128 maximo por especie...

fijate tambien que parte de lo que decis, lo hice, agregue algunos parametros como ser "eat" que indica el tipo de especie que uno puede comer...

te mando todo el paquetito de fuentes... limpios, en la carpeta bak puse los fuentes que no se usan actualmente.

otra cosa, en la carpeta "dll" tenes un archivo de 1.7mb que se llama mod_proc y es un archivo adobe, no se realmente que es, pero me parece que es basura.
Title: Re: Spore 2D (Animalicos)
Post by: splinter_work on May 19, 2009, 03:30:08 PM
son 1024 procesos... donde hacen 1,048,576 de chequeos unos contra otros... claro, creo que es un poco pesado...

algo se me va a ocurrir para estos casos... ahora no tengo tiempo, pero tengo una idea en la cabeza... a ver que sale...
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 19, 2009, 03:34:33 PM
Ese archivo que dices probablemente sea basura, ahora lo borro.

Sí, había calculado alrededor de 1M de operaciones por FRAME, una barbaridad y algunos usan collision() más de una vez por FRAME... Inviable.

Sorpréndeme con tu idea, habíamos hablado de usar una matriz/tablero que corresponda con la resolución de pantalla y almacene el/los IDs de proceso que actualmente se encuentran en ese pixel/celda en cuestión.

Sin duda más eficiente, cada proceso pasa de hacer NxN comprobaciones a hacer Nx9 comprobaciones. Y como generalmente N es estrictamente mucho mayor que 9, más no se puede pedir.
Title: Re: Spore 2D (Animalicos)
Post by: splinter_work on May 19, 2009, 05:39:34 PM
Basicamente pensaba en probar algo parecido a eso, donde cada objeto incremente un contador segun su tipo... o sea, x9... pero no necesariamente del tamaño de la pantalla, porque representaria que cada objeto tenga que actualizar direferentes celdas...
quizas dividiria la pantalla en X celdas que no son necesariamente los pixels... digamos dividirla por 8 o 16 (lo que nos daria la cantidad de celdas, por ejemplo, 640/8=80 celdas, podemos usar un valor inferior si queremos), y hacer las dimensiones de dicha matriz del resultado de esto... tomar como base de seteo al centro del grafico o punto de control 0 (o algun otro, que podramos definir como una suerte "boca").
Por otro lado, asignarle prioridad a los procesos en base a su orden en la cadena alimenticia... de esta forma estariamos ejecutando/seteando aquellos procesos que tienen un valor menor en dicha cadena...
La idea basica es incrementar contador segun posicion del objeto o nacimiento... decrementar contador en base a cuando se mueven o cuando son comidos... si el contador para el tipo de celda que corresponda a un animal de tipo posible elimento es mayor a cero, significa que puede ser comido.

Esa es basicamente la idea, si te animas a hacerlo bien... sino luego lo hago yo como experimento, a ver que sale.

Con esto se evita recorrer todos los procesos (1024 chequeos por cada proceso), y nos limitamos a trabajar recorrer solo 9 contadores (9 chequeos por cada proceso).

Deberia funcionar y deberia ser mucho mas rapido.
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 19, 2009, 06:17:53 PM
Es cierto, si el tablero fuese del tamaño de la pantalla deberían actualizar varias celdas, eso que dices de la "boca" de cada animalico es buena idea, por ahí es por donde habría que avanzar, lo que está claro es que hace falta un tablero.

Pero... He mirado tu código y tengo una duda demasiado TRASCENDENTAL. He visto cómo hacías uso de public, de forma que los procesos animalico pasan a tener una variable "local" que es el tipo, y a partir de su ID es posible acceder a ella...

Me recuerdan a las "sucias" variables local de Fénix, pero pensaba que Bennu ya no incorporaba ese tipo de cosas...

¿¿¿Es posible entonces que un proceso tenga variables "public" accesibles a través de su ID??? Estoy alucinando muchísimo :o :o :o

Quizá os suene noob pero pensad que provengo de Fénix habiendo pasado por DIV años antes... Eso de public me abre una abanico de posibilidades... Infinito...
Title: Re: Spore 2D (Animalicos)
Post by: splinter_work on May 19, 2009, 06:24:48 PM
public son variables locales, pero solo del/para ese tipo de proceso.
pueden ser accedidas por su id, pero la variable que contiene dicho id debe estar declarada como "tipo proceso" al cual queremos acceder, es como si un proceso se transformara en un "type".
para accederlas hay que tener el codigo del proceso escrito antes de su uso o declararlas como esta en el ejemplo.
No recuerdo que version, pero esto fue algo que incorpore en Fenix hace tiempo, creo que fue una de las primeras cosas que hice cuando me hice cargo de fenix, por no decir que fue la primera.
Saludos.
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 19, 2009, 06:28:51 PM
No fuí capaz de saber que existía en Fénix...

Necesito un tiempo para asimilarlo, en serio te lo digo.
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 19, 2009, 06:36:39 PM
Te doy un Karma porque no puedo darte un beso :-*
Title: Re: Spore 2D (Animalicos)
Post by: DCelso on May 19, 2009, 06:51:53 PM
 :o. Qué sería de mí sin los public :D.
Así un proceso se asemeja más a una clase y tal :D.
Title: Re: Spore 2D (Animalicos)
Post by: splinter_work on May 19, 2009, 06:54:43 PM
jejeje, te agradezco lo del beso, pero paso... mas con esa clase de besos que representa ese emoticon...
Title: Re: Spore 2D (Animalicos)
Post by: laghengar on May 19, 2009, 07:00:29 PM
Creo que hice algo de eso en una estrategia que empecé (que por supuesto lo trabajé poco). A ver si lo veo y lo cuelgo.

Necesité una matriz global, pero hay que pensar que la matriz sería
Title: Re: Spore 2D (Animalicos)
Post by: splinter_work on May 19, 2009, 07:26:53 PM
Cuidado que yo no dije de guardar ningun id... solo incrementar una celda segun el tipo...
Seria una matriz tridimencional... donde cada x,y tendria una z que corresponderia a la cantidad de animales/especies... cada una de estas z, totalizaria la cantidad de individuos de dicha especie que esten en dicha celda...
y lo demas es simple deduccion...
podriamos decir, celda/region.

edit: pongan los karma en mi otro usuario, no en este que es una especie de usuario temporal.

edit2: me olvide que si necesitare el id para el caso de matar a un proceso... pero bueno, vamos a pensar algo al respecto...
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 19, 2009, 08:07:41 PM
Matriz dinámica... Sólo una vez me hicieron programar una durante la carrera y todavía odio mucho a ese profesor >:(

El tamaño de una matriz de IDs no lo veo tan alarmante, ¿Cada ID ocupa lo que ocupan las variables locales y públicas de cada proceso, no?. Es más, es por donde estoy continuando con el proyecto.

Ahora mismo he combinado la versión de SplinterGU y la mía incorporando los public y consiguiendo que todos los animalicos sean el mismo proceso, así que Splinter no avances mucho o nos comeremos terreno de forma bastante improductiva...

Ya sé lo de tus 2 usuarios, pero semejante aporte que me has dado merecía un Karma para el temporal splinter_work. ¿Piensas fusionar a SplinterGU y splinter_work en uno sólo en el foro o algo así?
Title: Re: Spore 2D (Animalicos)
Post by: splinter_work on May 19, 2009, 09:03:54 PM
Este usuario es para no usar mi password en lugares "publicos".

Por otro lado, ya tengo el codigo cambiado con todas estas ideas, y creo que encontre un bug en el compilador... con respecto a las variables, pero no se si es un bug o si es problema del tamaño... ya lo vere e informare...

Saludos.
Title: Re: Spore 2D (Animalicos)
Post by: splinter_work on May 19, 2009, 09:12:08 PM
Increible, el esquema funciona a la perfeccion... a la primera compilacion... tarda mucho en compilar por el tema del tamaño de la matriz estatica... reduje los valores de la misma, y el compilador ahora va...
Vere de cambiarlo a una array dinamico, pero con la cantidad de dimensiones (4) me temo que se hara un poco complejo las operaciones de calculo para obtener el puntero a donde trabajar... o quizas no... bueno, todo es cuestion de probar...
Title: Re: Spore 2D (Animalicos)
Post by: DCelso on May 19, 2009, 09:19:39 PM
Sois unos monstruos, killo me quedo anonarado con lo que sabeis, no sé de qué diablos hablais pero suena a complejo que te cagas.
Title: Re: Spore 2D (Animalicos)
Post by: laghengar on May 19, 2009, 10:58:58 PM
Yo he añadido dos líneas a cada proceso de animalicos

LOOP
      vida--;
      alimento--;
      if(x%5==0)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      IF (num_animalicos[tipo]<max_animalicos[tipo])
      IF (collision(type verde) AND (alimento>hambre[tipo]/2))
         IF (rand(0,DADO_REPRODUCCION)<reproduccion[tipo])



IF (ID_colision=collision(type azul))
         signal(ID_colision,S_KILL);
         size=size+crecimiento[tipo];
         alimento++;
      END
      end<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      IF ((vida<=0) OR (enfermedad>contagio[tipo]) OR (alimento<0))
         BREAK;
      END
      FRAME;

//////////////////////////////////

Me va muy bien. Analicen los resultados... si quieren claro, un saludo.

Lo malo que tiene es que deforma el comportamiento, pero en rendimiento funciona muy bien.
Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 19, 2009, 11:16:31 PM
Quote from: DCelso on May 19, 2009, 09:19:39 PM
Sois unos monstruos, killo me quedo anonarado con lo que sabeis, no sé de qué diablos hablais pero suena a complejo que te cagas.

Yo imaginaba que era feo, pero no para tanto...
Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 19, 2009, 11:31:45 PM
Aca esta el sistema que comente... no me gusta el hecho de que demora mucho la compilacion si incrementamos la cantidad de celdas... pero bueno, vere cual es la causa...

La diferencia de velocidad es muy notable, y el efecto/comportamiento me encanta...

le quite el tema del tamaño, y tambien agregue cosas como cantidad maxima a comer por frame y otras cosas mas...

vamos a ver si lo podemos mejorar mas aun...

enjoy it...
Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 20, 2009, 12:01:31 AM
aca da una dispersion mejor de la fauna... y se mantiene bastante estable...
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 20, 2009, 01:09:14 AM
Arg, voy a echarle un vistazo Splinter, yo había metido ya un tablero con funciones para posicionar/eliminar animalicos de él, funciones para alimentarse de los posibles animalicos adyacentes e incluso la tabla que indica cuáles se alimentan de cuáles, se rellena aleatoriamente y a veces hay caníbales xDDD

Voy a ver qué cosa has hecho, nos estamos comiendo con las nuevas versiones, mañana subiré también la mía que ahora estoy que me duermo, debo llevar más de 12 horas frikeando con Bennu el día de hoy, tenía la tarde libre :o

Laghenghar, eso que pones sin duda multiplica el rendimiento x5 a costa de ligeras imprecisiones, pero la solución final es usar un tablero y prescindir de collision() para este tipo de videojuegos con "superpoblación" de procesos.

Lo dicho, demasiadas versiones para probar, me alegra que estén disfrutando de este ecosistema, en ocasiones me quedo embobado viendo cómo los animalicos se reproducen, comen y se contagian de cosas malas ;D
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 20, 2009, 01:21:57 AM
looooool

Impresionante la mejora de rendimiento SplinterGU, lástima que estamos programando algo muy parecido, sólamente que yo estoy separando las FUNCTION que hacen uso del tablero en un módulo llamado tablero.prg, mi matriz es de IDs (Menos dimensiones) y no he aplicado aún distinción entre adultos y pequeñuelos... En cualquier caso ambas cosas prometen.

Mañana sigo adelante con ello, hoy no me siento capaz de más, no nos separemos demasiado con este proyecto que al final van a salir varios juegos distintos xD
Title: Re: Spore 2D (Animalicos)
Post by: DCelso on May 20, 2009, 08:12:04 AM
¿En qué consiste el juego?¿En ver cómo se comen los unos a los otros? :D
Vaya rollo de juego más que juego es salvapantallas :D

Si se necesitara buscar pareja para la reproducción quizás se podría hacer que uno de ellos fuera el protagonista del juego y moverlo para evitar ser comido y buscar reproducirse :D.

No obstante está muy currado y su código es muy didáctico.
Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 20, 2009, 10:54:46 AM
Lo mio es experimental... y a modo didactico, mi idea es colaborar con diferentes tecnicas que puedan ser aplicadas a sus juegos...

El tema con el collision y con el get_id, no es realmente por las operaciones en si... sino por la cantidad de procesos... actualmente bennu cuando usan estas funciones pasandoles por parametro "tipo", recorren toda la lista de procesos (1 a 1), chequean si corresponden al tipo correcto y cuando lo encuentra hace la comprobacion... entonces el numero anterior de 1,048,576 debemos multiplicarlo al menos por 3 dando como resultado 3,145,728 chequeos sobre la lista de procesos en cada frame.

NOTA: El tipo de dato correspondiente a "mapa_mundo" puede/debe ser modificado en base al maximo numeros de individuos posibles por expecies... por eso en este caso use char.
Title: Re: Spore 2D (Animalicos)
Post by: laghengar on May 20, 2009, 11:13:45 AM
Te doy la razón windgate, lo que puse yo es una chapuza, me gusta mucho más lo que hace splinter, este tema me interesa yo me encontré con lo mismo.

Es posible que sea necesario crear una matriz global 8x8, que determine las influencias entre los distintos colores, así luego con un solo collision se podrían hacer las acciones de cada animalico.
Title: Re: Spore 2D (Animalicos)
Post by: splinter_work on May 20, 2009, 01:13:55 PM
Quote from: laghengar on May 20, 2009, 11:13:45 AM
Te doy la razón windgate, lo que puse yo es una chapuza, me gusta mucho más lo que hace splinter, este tema me interesa yo me encontré con lo mismo.

Es posible que sea necesario crear una matriz global 8x8, que determine las influencias entre los distintos colores, así luego con un solo collision se podrían hacer las acciones de cada animalico.

Armate un ejemplo del modelo de la matriz 8x8... a ver que tal sale...
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 20, 2009, 06:21:04 PM
La matriz 8x8 ya la tengo en mi versión y como ya dije, se rellena aleatoriamente, indicando quiénes pueden comerse, salen hasta caníbales a veces. Pero collision es IN-VI-A-BLE, se trata de NO usarlo, nunca, ¡Jamás! Al menos para este juego xD

Splinter, tengo problemas con las nuevas variables PUBLIC.

Si tengo una variable:

GLOBAL
   animalico prueba;    //Recordemos que prueba tiene los campos: tipo, edad y alimento

Cuando ejecuto una instrucción:

   prueba.tipo=0;        //Ponemos un 0 en el campo tipo de la variable prueba

Tengo un error de ejecución... En cambio si declaro la misma variable como PRIVATE de un proceso animalico no tengo ese problema...

La idea que tenía era una matriz global de tipo animalico, pero con una única variable ya me da problemas. Será que todavía no entiendo bien el uso de las public...
Title: Re: Spore 2D (Animalicos)
Post by: splinter_work on May 20, 2009, 06:29:02 PM
prueba tiene que contener previamente el id del proceso al que vas a acceder...

prueba = id;

por otro lado, creo que tipo 0 no es valido.

Probaste la version que puse yo?
Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 20, 2009, 11:26:16 PM
y entonces?
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 21, 2009, 12:37:43 AM
Probé tu versión, pero en tu versión no llegas a hacer uso de la variable de tipo animalico que declaras como PRIVATE en el proceso, por eso estaba con la duda de lo que se puede y lo que no se puede hacer.

Tu versión por supuesto es sublime y muy muy eficiente, pero eché de menos poder mandar signal a los procesos cuando alguien se come a alguien...

Por lo que me dices: Veo que si creo una matriz de tipo animalico, debo meter en ella IDs de proceso antes de poder consultar nada... Yo intentaba meter -1 en el tipo para indicar que todos los "huecos" de la matriz estaban libres al principio (En el comentario anterior había puesto un 0 para que se entendiera mejor el problema que tenía).

Simplemente al principio quería una matriz vacía, y a medida que los animalicos comprueban que hay "hueco" en ella van metiendo sus IDs... Lo veo viable, otra cosa es que Bennu lo permita...

En cualquier caso mañana seguiré haciendo pruebas, y gracias por todo Splinter, me estás ayudando mucho.
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 23, 2009, 01:10:55 PM
Bien, ya tengo lista la matriz de animalicos y ya comprendo la "magia" de declare y public. Ahora mismo prescindo ABSOLUTAMENTE del uso de la función collision()

El rendimiento ha mejorado notablemente, no obstante tengo que hacer mejoras diversas de eficiencia, ya que los chequeos sobre la matriz son realmente exhaustivos, puede haber hasya 64 animalicos en cada celda, y para comer/contagiarse/reproducirse cada animalico evalúa esos 64 animalicos.

La idea será que cuando comen/contagian/reproducen satisfactoriamente dejan de evaluar la matriz, espero un rendimiento de +50%...

También tengo que arreglar muchos accesos a father e incluso a father.father, que se hacen varias veces en la misma función e imagino que será mucho más eficiente almacenar el ID de father.father al principio y trabajar con el ID en lugar de con father.father...

Me leo y suena bastante paranoide... En cuanto tenga lista la versión la subo, con canibalismo incluído, y pronto introduciré simbiosis e incluso especies capaces de "convertir" un animalico a su especie.

Gracias SplinterGU, mil gracias por todo xD
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 23, 2009, 02:39:37 PM
Uf, he tenido problemas IN-CRE-I-BLES debido a un = que había puesto en un condicional en lugar de un == y hacía que 2 procesos al intentar reproducirse terminaban siempre teniendo el mismo tipo...

Y otro muy muy gordo al posicionar los hijos, que por un error matemático me tomaban la coordenada 0,0 y aparecían siempre en la esquina superior izquierda de la pantalla, no me estaba dando cuenta porque no los veía, incluso había errores en las estadísticas. Casi me vuelvo loco pero lo he conseguido estabilizar :D

He metido mejoras varias en el rendimiento pero sigue sin convencerme :-\... Todavía no lo subo por eso, aguarden!
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 23, 2009, 03:50:09 PM
Subo la versión 0.6 y 0.8 con mejoras diversas, las estadísticas muestran la matriz indicando qué especies se alimentan de cuáles y he mejorado el rendimiento todo lo que he podido.

DESCARGAR v0.6: http://www.mediafire.com/?jzjzno0qj1c (http://www.mediafire.com/?jzjzno0qj1c) (No equilibrado)

DESCARGAR v0.8: http://www.mediafire.com/?oxgrm2gijbx (http://www.mediafire.com/?oxgrm2gijbx) (Equilibrado!!!)

DESCARGAR v0.8b: http://www.mediafire.com/?thlnnggyuzy (http://www.mediafire.com/?thlnnggyuzy) (Integrado un scroll con desplazamiento y alguna mejora puntual!)

He modificado las estadísticas de cada especie de forma que más o menos tengan la misma probabilidad de sobrevivir, aunque normalmente suelen extinguirse unas cuantas y sobrevivir como mucho 3 ó 4 de las 8 especies iniciales, es un horror equilibrar el ecosistema, tiempo al tiempo. Rectifico, la 0.8 está jodidamente bien equilibrada, procedo a añadir un scroll scroll añadido en la 0.8b.

¿Sugerencias?


Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 25, 2009, 08:32:28 PM
tras hacer varios cambios en el manejo de las instancias... y tras 3 dias de debugear un bug en el core que no existia, (ya que se me caia tu codigo) me encontre con que el bug esta en tu ultima version, tu matriz de posicion no limpia el valor anterior cuando un objecto cambia de posicion... y eso produce que al tiempo cuando el id del proceso se reuse provoque una violacion de segmento... termino de probar y en un rato subo un fix a tu version...
Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 25, 2009, 08:39:39 PM
Fix


PROCESS animalico(x,y, tipo_inicial)
PRIVATE
int ID_mover;
BEGIN
tipo=tipo_inicial; //Adoptamos el tipo de animalico con el que nos han invocado
alimento=hambre[tipo]; //Obtenemos nuestro alimento inicial
vida=longevidad[tipo]; //Obtenemos nuestra vida inicial
file=fpgs[C_COLORES]; //Obtenemos el fichero de gráficos que nos corresponde
graph=tipo; //Obtenemos el número de gráfico que nos corresponde
size=TAMANO_INICIAL; //Obtenemos el tamaño inicial que nos corresponde
num_animalicos[tipo]++; //Incrementamos en 1 el número de individuos
ID_mover=mover(); //Invocamos al proceso que nos mueve por el mundo

LOOP
vida--; //Envejece y sufre los efectos del hambre
alimento--;

IF (interactuar()==-1) //Si no pueden posicionarse tras interactuar morimos por aplastamiento
BREAK;
END
IF ((vida<=0) OR (enfermedad>contagio[tipo]) OR (alimento<0)) //Muerte de los animalicos
BREAK;
END

FRAME;
desposicionar(id); //El animalico abandona su posición del tablero para tomar una nueva
END
ONEXIT
signal(ID_mover,S_KILL); // y de moverlos por el mundo
desposicionar(id); //Al morir se desposiciona siempre
num_animalicos[tipo]--; //Decrementa el número de animalicos de su especie
END





FUNCTION desposicionar(int pid)
//Elimina del tablero un proceso animalico poniendo un -1 en el hueco de la celda que le correspondería
PRIVATE
int i;
no_existe=TRUE;
BEGIN
x=pid.x/PROPORCION_HORIZONTAL_TABLERO; //Obtenemos la x que le correspondería en el tablero
y=pid.y/PROPORCION_VERTICAL_TABLERO; //Obtenemos la y que le correspondería en el tablero
FROM i=0 TO MAX_ANIMALICOS_CELDA-1; //Calculamos si el hueco que le corresponde en la celda
IF (tablero[x][y][i]==pid)
tablero[x][y][i]=-1;
no_existe=FALSE;
END
END
IF (no_existe) RETURN -1; //Si no se encuentra el animalico devolvemos error (-1)
ELSE RETURN i; END //En otro caso devolvemos el número de hueco en el que se encontraba
END



PROCESS mover()
PRIVATE
int avance_x=0, avance_y=0;
animalico yo;
BEGIN
yo=father;
LOOP
avance_x+=rand(-1,1);
avance_y+=rand(-1,1);
IF (avance_x<-velocidad[yo.tipo])
avance_x=-velocidad[yo.tipo];
ELSIF (avance_x>velocidad[yo.tipo])
avance_x=velocidad[yo.tipo];
END
IF (avance_y<-velocidad[yo.tipo])
avance_y=-velocidad[yo.tipo];
ELSIF (avance_y>velocidad[yo.tipo])
avance_y=velocidad[yo.tipo];
END

       desposicionar(father);

father.x+=avance_x;
father.y+=avance_y;
IF (father.x>RESOLUCION_X-1)
father.x=0;
END
IF (father.x<0)
father.x=RESOLUCION_X-1;
END
IF (father.y>RESOLUCION_Y-1)
father.y=0;
END
IF (father.y<0)
father.y=RESOLUCION_Y-1;
END
FRAME;
END
END


Creo que esos son todos los cambios necesarios...
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 25, 2009, 09:37:49 PM
Arg, siento haberte hecho trabajar para nada...  :-\

Pero... ¿Ese error te lo ha dado en Windows o en Linux, con cuál versión de animalicos? Créeme que llevo varios días haciendo cambios y cambios en Ubuntu y todavía no he tenido ningún crash desde la 0.6, en la que probablemente pasaba lo que tú dices, he corregido diversos errores desde entonces y he cambiado un poco el método para posicionar/desposicionar en el tablero...

Pongo la última versión, ahora son 16 especies, y de hecho pueden ser N especies con sólo modificar una CONST del juego. Incluso las estadísticas de pantalla se escriben ordenadamente según el número de especies, pongo una captura y el link de descarga del juego, (pendiente de actualizar con tu corrección):

(http://www.fileden.com/files/2008/3/2/1792511/Animalicos.0.9.png)

DESCARGAR v0.9: http://www.mediafire.com/?yeowyremiug (http://www.mediafire.com/?yeowyremiug)
[/size]

Si alguien vuelve a tener algún error de ejecución que me consulte please!!! Indicando sistema operativo.
Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 25, 2009, 09:49:13 PM
En linux me fallo, pero nada tiene que ver con el operativo... tiene que ver con el nuevo limite en la cantidad de instancias permitidas (65535 concurrentes), que permiten ahora hacer algunas optimizaciones... entonces sucede que cuando el contador de ids da la vuelta y el id que se asigno mucho tiempo atras se asigna a un nuevo tipo de proceso (diferente al anterior), al acceder a la variable tipo de un proceso que no es del tipo correcto, pero al estar su id en la matriz que no se limpio se accede, el valor de tipo da un valor fuera del rango de la matriz y provoca una violacion de segmento.

Ahora esto va teniendo pinta de juego... a ver....
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 25, 2009, 09:54:53 PM
Ahora mismo la matriz debería limpiarse correctamente poniendo un -1 en esa posición cada vez que un proceso muere o cambia a otra posición distinta... Como te digo, he hecho decenas y decenas de pruebas sin errores de ejecución y modificando parámetros de mil maneras distintas.

Esperemos una segunda opinión y si alguien más tiene problemas uso tu código Splinter.

Tengo preparado ya el mapa de durezas que indica el habitat en función de la posición en el mapa, para que las distintas especies tengan asociado un hábitat determinado y se vean bonificadas cuando se encuentren en él y cosas así.

Miles de cosas por hacer pero me está gustando la experiencia xD
Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 25, 2009, 10:09:05 PM
esta version tambien me da "violacion de segmento"...

la cosa es que en la version que estas usando los ids de procesos son entre 65536 y 4294967295, en la nueva version son entre 65536 y 131071... luego se reutilizan, y en la version que vos tenes (la del svn) el id de proceso si lleva al limite empieza a pisar los tipos de procesos y a los ids... supongo que si llega al limite, directamente revienta todo...
Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 25, 2009, 10:11:53 PM
demas esta decir, que al no limpiar, podemos interactuar contra procesos que ya no estan realmente en esa posicion.

EDIT:
otra cosa, el tipo de dato "bool" no existe.

EDIT2:
Efectivamente, se soluciona desposicionando al objeto antes de cambiar de posicion.
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 25, 2009, 11:25:43 PM
Increíble, quizás no he tenido problemas de ejecución en Ubuntu porque he realizado tantísimas pruebas que no las dejo demasiado tiempo en funcionamiento.

Un amigo desde Windows XP me ha dicho que le daba un erorr en librender.dll y yo he tenido ese mismo error en XP virtualizado desde Ubuntu, imagino que todo será parte del mismo problema.

Una lástima, procedo a introducir las modificaciones que has propuesto... Splinter, Splinter, Splinter, qué sería de mí sin tí... Estoy preparando las pantallas de presentación del juego y otras cosas reutilizando los .prg de mi viejo Just Fantasy (Tengo para audio, animación, instrucciones, manejo del mouse...).

Por supuesto estás incluído en los créditos de agradecimiento de la pantalla de presentación, junto con la URL de este foro, faltaría más.

EDIT:
El tipo bool no existe... Soy un mamón... Menos mal que me funcionaba... :o
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 25, 2009, 11:57:11 PM
He introducido tu modificación Splinter.

Sólo había un problema: Mi nueva versión 0.9 hacía que cada animalico interactuara con el entorno cada X frames (Indicados por una CONST), ahora he hecho que la interactuación sea para TODOS los frames y así hacer más sencillo incluir tu modificación. Pero el error de ejecución persiste en Windows...

Debo añadir que todavía no he tenido un problema de ejecución en Linux... Me ha dado tiempo de hacer un sandwich y degustarlo entero, y mis animalicos aquí siguen apareándose y comiéndose unos a otros...

Es muy tarde, mañana sigo haciendo pruebas, estoy demasiado enganchado a este juego... A pesar de que tengo mucho trabajo que hacer no puedo dejar de programarlo y programarlo :-\
Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 26, 2009, 12:08:19 AM
ah, por eso es que en mi version se extinguen muy rapido... voy a quitar eso de cada X frames, a ver que pasa...

saludos, buen trabajo...
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 26, 2009, 12:35:22 AM
Ya está, creo que lo tengo, tenía un problema porque ahora al usar posicionar() su father no era el animalico en sí, sino la función mover(). Lo he arreglado con un parámetro pid, como has hecho tú con la función desposicionar().

También he quitado eso de interactuar cada X frames, pero mañana volveré a ponerlo, interactuar() es la función que más recursos consume, y veo que es la que más resiente la ejecución, por eso es mejor no usarla en todos los frames sino cada cierto tiempo, además, tampoco tiene sentido que a cada frame el animalico intente reproducirse y comer... Es excesivo.

En cuanto al tablero, he realizado pruebas con tableros de distinta "resolución", y el tamaño del tablero no afecta al rendimiento, de hecho con tableros de 300Kb y tableros de 72Mb obtengo prácticamente el mismo rendimiento en fps.

Lo dicho, mañana sigo con ello, dejo una ejecución funcionando en XP, lleva 5 minutos funcionando sin problemas y espero que mañana por la mañana siga ahí.

Gracias de nuevo Splinter!!!
Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 26, 2009, 12:44:58 AM
saludos, de nada... un karma para ti...
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 26, 2009, 08:30:09 AM
Sigo teniendo el problema, en Windows XP el informe me dice:

AppName: bgdi.exe    AppVer: 1.0.0.1    ModName: librender.dll
ModVer: 0.0.0.0    Offset: 00002dde

En Linux no sé donde se encuentra el stderr o similar.

Al parecer el crash sucede cuando muchos procesos con la misma longevidad mueren al mismo tiempo transcurrida su vida...

He convertido muchos PROCESS en FUNCTIONs para evitar posibles problemas de que 2 procesos distintos (p. ej. interactuar) pudiesen mandar una señal de muerte al mismo proceso, pero no consigo nada.

También he evitado mandar señal de muerte a procesos a los que les queda 1 sólo punto de vida, ya que morirán al frame siguiente y quería evitar el mismo problema...

Pero sigo teniendo el mismo error.

Estoy desposicionando antes de mover y posicionando justo después, todo ello lo hace una FUNCTION por lo que es como si se encargase el propio proceso.

Voy a probar a asignar longevidades un poco más aleatorias a ver si sucede lo mismo, y si es así se trata de que se vuelven a asignar los mismos IDs como dijiste ayer Splinter... Una duda: ¿Antes de asignar un nuevo ID se comprueba que ese ID no exista ya? Me refiero a cuando se "terminan" los IDs disponibles y el contador da la vuelta.

EDIT: He realizado una comprobación, y cuando se "terminan" los IDs y vuelven a asignarse los mismos el juego continúa ejecutando sin problemas. También he comprobado que si las longevidades no son exactamente las mismas y, por tanto, no hay muertes masivas, la ejecución tarda más tiempo en hacer crash... No obstante sigue haciendo crash transcurrido un tiempo...
Title: Re: Spore 2D (Animalicos)
Post by: SplinterGU on May 26, 2009, 10:58:47 AM
en la version de windows, a menos que hayas compilado desde los repositorios, no hay chequeos... pero dudo que eso este pasando... deberias ejecutar 4 gigas de procesos...

todavia no probe en windows. tengo que generar ejecutables nuevos... cuando se reusan los ids, no siempre hace el crash inmediatamente, puesto que depende si esos valores de id estan todavia en la matriz y algun animal intenta interractuar con esa posicion...

pero deberias haber ejecutado 4 gigas de procesos para que el contador rote, y de hacerlo, estaria dando id menores a 65536 y eso colisionaria con los tipos de procesos... asi que no creo que eso este pasando...

para que se entienda, el codigo que vos usas hace esto:

static int instance_maxid =  FIRST_INSTANCE_ID ;

y esto

int instance_getid()
{
    return instance_maxid++ ;
}

estas son las 2 unicas funciones para asignar ids, no se usa nada mas...

y los ids 0-65535 son reservados para los tipos de procesos... (TYPE xxx)

imaginate el resto...
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 26, 2009, 12:31:48 PM
Comprendo, entonces será que se repiten IDs...

4Gb de procesos en absoluto han dado tiempo de generarse (Creo...), pero 65536 sin duda alguna, enseguida pongo un contador total de procesos generados, si hace crash cerca de los 65536+ ya sabemos cuál es el problema.

Si ese es el problema, quizás los animalicos tendrían que comprobar con WHILE (exists(id)) cuántos procesos activos hay con ese ID o algo similar y suicidarse si hay más de uno...

Creo que hasta la noche no podré hacer nuevas pruebas pero te mantendré al corriente.

EDIT: Tengo el contador funcionando, espero el crash. Por cierto, se podría cambiar ese static int instance_maxid por un static long long int instance_maxid en el peor de los casos... ¿Algo así es lo que dices que hay hecho en la versión de Windows para llegar a los 4Gb de IDs?
Title: Re: Spore 2D (Animalicos)
Post by: splinter_work on May 26, 2009, 01:42:10 PM
Creo que no logro explicarme correctamente... perdon... a ver si esta vez sale...

1) Los ultimos binarios liberados tienen las siguientes caracteristicas con respecto a las instancias:

    a) No tienen limite de id... este es desde 65536 hasta 4,294,967,295. (asi que si te da un id 65536+ no es ningun problema)
    b) Si se supera el limite (4,294,967,295) bennu (esto viene de fenix) empieza a asignar ids desde 0 en adelante, y eso esta mal, puesto que esos ids son reservados para los tipos de proceso (TYPE dentro de un getid, collision, etc). Incluso si alcanza nuevamente el 65536 en adelante puede pisar los id de procesos en ejecucion, lo cual desastroso.
    c) Las instancias son una lista hasheada de 256 elementos la cual puede tener varios procesos (instancias) por elemento.
    d) no hay limite en la cantidad de instancias concurrentes (las funciones tambien cuentan como instancias), salvo lo mencionado previamente.
    e) la asignacion de ids es ciclica

2) La nueva version del SVN, tiene las siguientes caracteristicas con respecto a las instancias.
    a) Tiene limite de id... este puede ser entre 65536 (10000h) y 131071 (1FFFFh) inclusive.
    b) Si se supera el limite, se busca el primer id libre y lo asigna, si no hay libre, falla la creacion del proceso.
    c) las instancias son una lista array de 65536 elementos, lo que permite/obliga que solo haya 1 proceso por elemento, y el acceso al mismo sea muy rapido.
    d) existe limite en la cantidad de instancias concurrentes (las funciones tambien cuentan como instancias), este limite es de 65536 instancias.
    e) la asignacion de ids es ciclica

Con respecto a tu otra pregunta, sobre el long long, debo decir que Bennu maneja datos de 32 bits... no se puede asignar elementos de 64bits, puesto que no seria posible manipularlos.

EDIT: Me olvide mencionar que los ids son elementos unicos, poner 2 ids igual es error, por lo que hacer getid reiterados no sirve para detectar si otro proceso tiene tu id... no deberia darlo, y si lo da, no tendrias forma de determinar que no eres tu, o que tu no eres el. En todo caso seria una condicion de bug con resultados inesperados.
Por otro lado, creo que el tema del crash en windows, aunque no descarto un bug en bennu, creo que podria deberse a que con el manejo de estas matrices y que no todo se esta controlando adecuadamente en el juego se esta pisando algun area de datos que no corresponde (concretamente dentro de la librender o datos que la lib render usa).
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 26, 2009, 05:22:31 PM
Ok Splinter, ahora sí que ha quedado totalmente claro, espero que esa nueva versión del SVN se libere pronto, tiene buen aspecto eso de tener 1 única instancia por elemento en lugar de hashear, quizá se logre más eficiencia.

Las 65536 instancias concurrentes... No me parece que sean demasiadas, pero para lo que hago en Bennu ahora mismo es suficiente.

Desde luego no llego a los 4G (4,294,967,295) IDs distintos ni por aproximación, así que NO hay problema en que se repitan IDs, eso me queda claro.

Pero sigue estando el problema en Windows y no lo veo en Linux... En Linux ya van 160K animalicos distintos y subiendo y todo va bien, mientras que en Windows tengo SIEMPRE el error de ejecución en la librender que he comentado antes... Desconozco si se trata de un bug de Bennu, no me veo capaz de determinarlo, yo por ahora veo bastante bien claro el código que accede a la matriz y creo que no debería causar ese problema... Añado que uso un XP con Virtual Box en Ubuntu y 512Mb de RAM reservados para él... Pero se lo pasé a un amigo con XP en solitario y le ocurrió lo mismo, seguiré probando.

Chan, chan, chan... Tal vez haya que dejar en un fichero el número de animalicos a la hora del crash, datos de la matriz u otra info que ayude a determinar la causa del error... Como me jode que no funcione bien en Windows :'(

Por cierto, nadie más nos comenta nada en este hilo (SOCORRO!), la verdad es que hemos usado una terminología un poco friki, pero la idea de Animalicos es bastante sencilla en el fondo...
Title: Re: Spore 2D (Animalicos)
Post by: splinter_work on May 26, 2009, 06:43:53 PM
A cuanto tiempo mas o menos hace el crash?
Compilaste en windows o usas los dcb generados en linux?
Seria bueno que agregues solo a modo de testeo en cada acceso a un array chequeo de limites... por ejemplo...


m[a][b][c]...


antes de eso, pongas


if ( a < 0 or a > max_a or
     b < 0 or b > max_b or
     c < 0 or c > max_c )
    say ( "Error in file=" + __FILE__ + " line="+ __LINE__ + " a="+ a + " b="+b+" c="+ c );
    exit(1)
end


EDIT: Reniego a aceptar el calificativo de "friki". COLASIÓNESE!
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 26, 2009, 08:37:41 PM
Vaya, no conocía la existencia de __FILE__ y __LINE__, parece una buena idea hacer eso.

En Windows XP el crash llega muy rápido, cuando empiezan a reproducirse llega el crash, nunca he conseguido una ejecución en XP sin crash.

Ahora mismo tengo... 413K+ animalicos generados en Linux y todo va perfecto. Por supuesto que en XP vuelvo a generar los .dcb, y un amigo en su XP también, y tiene el mismo crash.

Voy a probar ese chequeo de límites que propones.

De acuerdo, retiro lo de que ha sido friki, pero colasiónase tiene lo suyo... Nunca había oído esa palabra, lol

;D

EDIT: 530K+ animalicos generados y sigue estable en Linux, me iré a dormir y lo dejo hasta mañana, a ver si consigo sobrepasar los 4G y desbordar los ID. Creo que no uso ningún (type animalico) ni nada similar, así que no creo que haya problema en rebasar los 65K primeros IDs y seguir adelante hasta tener el error de ejecución más sangriento de la historia...
Title: Re: Spore 2D (Animalicos)
Post by: Windgate on May 26, 2009, 10:59:02 PM
Versión 0.9b, el crash en Windows XP sigue existiendo a veces transcurrido un tiempo, y parece que ocurre cuando hay mucha acumulación de animalicos. Probablemente el problema esté en la matriz y el acceso a zonas de memoria fuera de rango...

DESCARGAR ANIMALICOS 0.9b: http://www.mediafire.com/?0u3zmz0zmn3 (http://www.mediafire.com/?0u3zmz0zmn3)

Pongo esta nueva versión para que vean la pantalla de presentación del juego y la música, como novedad principal. La presentación es bonita y tras haber buscado mucho, la música me ha parecido apropiada para el juego y sobre todo graciosa xD

También hay un marcador que indica el número total de animalicos generados y alguna corrección en las estadísticas asignadas a cada animalico para lograr más equilibrio en el ecosistema y evitar que todos tengan la misma longevidad inicial y mueran a la vez, ahora hay un cierto margen de -10,+10.

Y bueno, también alguna puntualidad más en las que no merece la pena profundizar demasiado. Disfrutad!

EDIT: 2,000,000 de animalicos generados en Linux y todo ok, estoy pensando que quizás se trate de algún bug en la versión de Windows.

EDIT 2: He probado a actualizar todas las DLL de Windows con la RC 1.0.0 de Bennu, pero el problema persiste. Ando un poco ocupado, pero en cuanto saque un rato me pongo a debugear todo lo posible.