Entrando en el mercado chino (7)

Después de investigar un poco me parece que hay algun tipo de problema con la integración del SDK a partir de compilaciones Android API +29. Por ese motivo en móviles que son Android 7 y 8 me funciona perfectamente. 
  • (Issue Code: ASI-0012) Compatibility issues found on certain mobile devices and induced crash when loading. Action: Fix the issues for your app and resubmit updated App File. compatibility issues device: Huawei Honor V10, Android version 9



Que podemos analizar a través del logfile:

 FATAL EXCEPTION: Thread-3  
  Process: com.cocodroloapps.Numbers, PID: 4129  
 java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion;   
 at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:108)  
 at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:96)  
 at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112)  
 Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.ProtocolVersion" on path: DexPathList[[zip file "/data/app/com.cocodroloapps.Numbers-ll8BtORaUmUEAYfaV1cCxA==/base.apk"],nativeLibraryDirectories=[/data/app/com.cocodroloapps.Numbers-ll8BtORaUmUEAYfaV1cCxA==/lib/arm64, /data/app/com.cocodroloapps.Numbers-ll8BtORaUmUEAYfaV1cCxA==/base.apk!/lib/arm64-v8a, /system/lib64, /product/lib64]]  
 at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)  
 at java.lang.ClassLoader.loadClass(ClassLoader.java:379)  
 at java.lang.ClassLoader.loadClass(ClassLoader.java:312)  
 at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:108)   
 at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:96)   
 at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112)   

La mejor solución que he encontrado es modificar el archivo AndroidManifest.xml que está en la carpeta

./Assets/Plugins/Android/

y añadir esta entrada:

   <uses-library  
                android:name="org.apache.http.legacy"  
                android:required="false" />  

Una vez añadido el cambio he vuelto a mandar la nueva versión del APK para su evaluación.

Respuesta

Han pasado 2 días y finalmente mi juego ha sido aprobado. He recibido un correo con la confirmación.


Ahora toca esperar el siguiente paso del proceso. Según el correo de respuesta este proceso:

  • Le informamos que la revisión del contenido de la aplicación para su proyecto ha sido completada y que ahora estamos en el proceso de adquirir los ID y las claves de la aplicación. Recibirá una notificación por correo electrónico una vez que su aplicación esté lista para la integración con el SDK. Este proceso suele durar unos 7 días laborables. 

Os mantendré informados en el próximo artículo.

Recursos de Fertile Soil

Hoy navegando por Twitter he descubierto una página de recursos que he encontrado muy interesante. 



Básicamente se trata de una página de Assets para juego gratis para uso personal o comercial de una calidad excelente. La página está creada por a Fertile soil productions

Además los assets son compatibles con la aplicación AssetForge con lo que nos permitirá crear composiciones con otros assets de manera muy fácil para luego exportar el trabajo para Unity.



Datos 
Página webhttps://www.fertilesoilproductions.com/
Twitterhttps://twitter.com/SoilFertile

Entrando en el mercado chino (6)

Cuando pensaba que ya había terminado el proceso he recibido una notificación con mas problemas en el juego.

  • (Issue Code: ASI-0003) App title NOT in Simplified Chinese. Action: Change your app title into Simplified Chinese (2048极限组合) and resubmit updated App File. Free Professional Translation service order available at your Dashboard.
  • (Issue Code: ASI-0012) Compatibility issues found on certain mobile devices and induced crash when loading. Action: Fix the issues for your app and resubmit updated App File. compatibility issues device: Huawei Honor V10, Android version 9


El primer problema es un error de interpretación. La traducción que ellos me proponen es como si creyesen que el juego es un clone del famoso juego 2048. El problema es que el juego que estamos publicando no es el mismo juego. De hecho tiene mecánicas muy diferentes y sólo tienen en común el hecho que vamos sumando números. En nuestro caso los números aparecen automáticamente y el objetivo es no quedarte sin casillas vacías. He mandado un correo con la explicación. A ver que pasa.

El segundo problema que detectan no se como solucionarlo sin su ayuda. Yo no dispongo de un terminal con estas características para hacer las pruebas. Así que he pedido su ayuda para resolver el problema.

Respuestas

Han pasado 24 horas y ya tengo respuesta. El equipo de AppTutti me propone otro nombre en chino para el juego (数字极限组合) que vendría a ser "Combinaciones de límites digitales". Para el segundo tema, creo que el problema reside en la acumulación de versiones.


La versión para el mercado chino deriva de la última versión de producción de Google Play, así que  contenía todo el código para la gestión de anuncios en AdMob así como la configuración al Google Games que he tenido que suprimir.  La opción más fácil ha sido crear un proyecto de zero y volver a poner el codigo fuente de la carpeta Assets, reinstalar SDK de AppTutti, modificar otra vez el fichero Manifest y generar un nuevo APK.

Una vez generado he vuelto a mandar la actualización a la plataforma. Seguimos...

Hama Beads: Wally

Hace tiempo que quería pasar una tarde haciendo una de las cosas que más me relajan. Hoy presento mi colección del mítico Wally, uno de los personajes mas queridos de mi infancia cuando pasaba horas intentando resolver los puzzles de Everyone's Wally. 


Ahora portados a figuras de Hama Beads para pasar una tarde creando los personajes de la serie de juegos para ZX Spectrum. Me he divertido mucho haciendo las figuras, aunque he gastado muchas piezas amarillas, eso sí.


Automania (1984)




Pyjamarama (1984)




Everyone's a Wally (1985)




Three Weeks in Paradise (1986)



Entrando en el mercado chino (5)

Después de integrar el SuperSDK en la aplicación para poder tener anuncios locales chinos en el juego envié la nueva versión para revisión. Al cabo de 24 horas ya tenia las ultimas revisiones hechas y aun debía hacer mas cambios en el juego. Según las leyes chinas los juegos deben cumplir reglas adicionales que las aplicaciones comunes no son de obligado cumplimiento.


  • (Issue Code: ASI-0003) App title NOT in Simplified Chinese. Action: Change your app title into Simplified Chinese and resubmit updated App File. Free Professional Translation service order available at your Dashboard.
En resumen, me piden que el título del juego también esté traducido a chino simplificado aunque seá un elemento de diseño y no afecte a la jugabilidad. Además en el sevicio de soporte me informan que el SDK no permite desabilitar el banner en función de la escena que se está visualizando, con lo que me obligará a modificar un poco las escenas para que siempre el banner esté visible. No es como a mi me gustaría pero los cambios no afectan demasiado.


Antes de mandar la última revisión os dejo aqui los puntos más importantes sobre la ley de la propiedad intelectual que afecta a todos los juegos que queramos publicar en el mercado chino.

  • La aplicación presentada DEBE estar totalmente traducida al chino simplificado, incluyendo el título, la descripción y el contenido de la aplicación.
  • Se debe mandar el código fuente parcial de la versión de la aplicación con los requisitos anteriores cumplidos. Las primeras 1500 y las últimas 1500 líneas de los códigos fuente de la aplicación específica en formato Microsoft Word para la verificación de los derechos de propiedad intelectual.
  • Libre de cualquier contenido no relacionado con APP, es decir, sin banners y/o publicidad en vídeo, sin información del desarrollador y/o copyright (incluyendo nombre(s) o sitio(s) web(s), aviso de copyright, reconocimiento del personal) en las páginas del juego.
  • En caso de que la aplicación requiera que el usuario inicie sesión, DEBE proporcionar una cuenta de superusuario con código de acceso.
  • Proporcionar una carta de autorización para la aplicación específica.

Entrando en el mercado chino (4)

Una vez traducido el juego vamos por el segundo problema. En el correo verificación se nos indica que:
  • (Issue Code: ASI-0008) Overseas game analytics/ foreign embedded files are banned in China. Action: REMOVE any Overseas game analytics and files embedded in your app then resubmit updated App File.
En el correo de aclaración especifican que además de tener que desactivar el Unity Analytics también es necesario desactivar los botones que enlazan con Google Play ya que sino la aplicación no sería aceptada.


De momento he anulado estos botones a nivel de código y he ocultado los botones para que no sean visibles para el usuario. 

Respecto al sistema de monetización, también en el correo de soporte se me pide que no utilice sistemas de  banners y anuncios occidentales y que instale su SDK para Unity para poner anuncios locales en el juego.


SuperSDK

SuperSDK es el SDK de Apptutti para el uso de anuncios chinos para Unity. 


Después de contestar un breve cuestionario sobre que SDK específico necesito me ha dirigido al enlace de descarga.

Una vez descargado, copiad la carpeta descomprimida en cualquier sitio. Con vuestro proyecto de Unity hay que abrir el  SuperSDK_AD_Unity.unitypackage que encontrareis en la carpeta SDK. Una vez instalado tenéis que buscar el archivo AndroidManifest.xml que está en la carpeta

./Assets/Plugins/Android/

En le documento tenéis que poner los datos de vuestro juego en los 4 sitios tal y como indica la documentación.


Ahora ya podéis volver a Unity para seguir con las modificaciones a nivel de código para llamar al nuevo sistema de anuncios de AppTutti.

He substituido el antiguo código por este:

   public void Start()  
   {   
     APPTUTTiAds.getInstance().setlistener();  
     APPTUTTiAds.getInstance().init();  
   }  
   public void Banner()  
   {  
     APPTUTTiAds.getInstance().BannerAds();  
   }  
   public void LoadAdInterticial()  
   {  
     APPTUTTiAds.getInstance().interstitialAds();  
   }  

Una vez aquí ya sólo nos queda firmar el juego con la nueva clave pública que AppTutti nos proporciona para generar el APK con su sistema integrado.


Según la documentación, ahora debemos cargar el APK que hemos generado substituyendo el APK inicial que subimos a su plataforma para que ellos puedan verificar todo el proceso. He de decir que hacer este proceso ha sido más complejo de los que imaginaba ya que he tenido que borrar a conciencia los assets que utilizaba para ver los anuncios de Google AdMob para que todo funcionase.

En el próximo artículo os cuento como sigue esta historia.

Entrando en el mercado chino (3)

Después de publicar el primer juego y esperar un par de días recibí un correo con las siguientes sugerencias para publicar el juego en la plataforma AppTutti:

  • (Issue Code: ASI-0004) App content NOT in Simplified Chinese. Action: Translate your app contents into Simplified Chinese and resubmit updated App File. Free Professional Translation service order available at your Dashboard.
  • (Issue Code: ASI-0008) Overseas game analytics/ foreign embedded files are banned in China. Action: REMOVE any Overseas game analytics and files embedded in your app then resubmit updated App File.
  • (Issue Code: ASI-0011) Overseas URL/Website informations and Gmail addresses banned in China. Action: REMOVE Overseas URL/Website informations and Gmail addresses and resubmit updated App File.

El primer punto parece fácil de cumplir ya que con el servicio de traducción de la propia plataforma puedo obtener la traducción de los textos del juego. El segundo punto quiero suponer que es el sistema Analyics de Unity, así que puedo desactivarlo de la aplicación. Para resolver el tercer punto debería hacerme un correo en un dominio aprobado e redirigir los correos que allí reciba a mi cuenta habitual.

Chino simplificado 

Por suerte, para mis proyectos, utilizo el asset I2 Localization que me permite añadir nuevos idiomas de manera dinámica y substituir una fuente en función del idioma seleccionado. En primer lugar necesitava encontrar una fuente para añadirla al juego para los textos en chino simplificado. Para ello podeis utilizar la web https://www.freechinesefont.com/ donde concentrareis fuentes en chino de diferentes estilos para vuestras aplicaciones.


Una vez descargada y puesta en la carpeta fuentes de mi juego sólo he tenido que añadir el nuevo lenguaje (chino simplificado) y añadir todas las traducciones. Además la plataforma pide que el chino simplificado sea el idioma por defecto y así lo he establecido en la configuración.


A nivel de código sólo he tenido que añadir la asignación del idioma al pulsar el botón del idioma para guardar la configuración al fichero de configuración del juego. A nivel de interfaz he creado un nuevo termino Fonts de tipo fuente y he asignado la fuente para cada idioma, personalizando de este modo la fuente específica para cada idioma.

   public void SelectChinese()  
   {  
     GlobalInfo.language = "zh-CN";  
     StartCoroutine(SaveLangConfig());  
   }  
   IEnumerator SaveLangConfig()  
   {  
     yield return new WaitForSeconds(0.1f);  
     PlayerInfo loadedData = DataSaver.loadData<PlayerInfo>(GlobalInfo.configFile);  
     loadedData.language = GlobalInfo.language;  
     DataSaver.saveData(loadedData, GlobalInfo.configFile);  
     CloseLanguagePanel();  
   }  

Interfaz:


Ahora es necesario a cada termino del juego que queramos traducir con varias fuentes añadir en las opciones secundarias el termino Fonts que hemos definido previamente.



El el siguiente artículo hablaremos de como resolver los otros puntos que debemos sortear antes de poder publicar nuestra aplicación.


Entrando en el mercado chino (2)

En este segundo artículo querría mostrar el proceso realizado para subir mi primer juego para el mercado chino y mi experiencia personal.


Tal y como expliqué en el artículo anterior, una vez registrados en la plataforma de AppTutti y esperar a ser aceptado podemos empezar a publicar nuestros juegos. La publicación consiste en un gran formulario donde nos pedirán los datos del juego, como si se tratase la ficha de Google Play (descripción corta, descripción larga, icono, capturas del juego, etc.). El proceso es bastante fácil ya que si tenemos publicado el juego en Google Play, introduciendo la URL el sistema capturará la mayor parte de información necesaria.

Así mismo hay algunas peculiaridades... deberemos adjuntar una carta (hay platilla para ello) Partner Authorization Letter donde autorizamos a AppTutti a comercializar nuestro juego en China, además hay que especificar como vamos a monetizar nuestra aplicación. 


Aquí es cuando debemos empezar a plantearnos si queramos hacer algunos cambios importantes en nuestro juego. Tal como explica el tutorial, no podemos utilizar sistemas occidentales de publicidad, ni sistemas de validación sociales, ni siquiera un enlace a una dirección Gmail de contacto.


Eso conlleva plantearse algunos cambios importantes. Por suerte AppTutti tienen una SDK que podemos integrar fácilmente en Unity para el tema de la monetización y el resto es cuestión de tener sistemas alternativos para cumplir los requisitos del gobierno chino.

Por otro lado es condición básica tener traducida el juego a chino tradicional. Yo personalmente he utilizado varios traductores de Internet para traducir los aspectos básicos del juego, así mimo Apptutti tiene un servicio de traducción gratuito para las primeras 1000 palabras donde para mis juegos es mas que suficiente.


Así mismo este proceso no es inmediato. He tenido que esperar dos días a que aprobaran la aplicación para poder acceder a los servicios de la plataforma. Una vez aceptado el juego, he accedido al servicio de traducción y he mandado un fichero MS Excel para que ellos traduzcan los textos del juego.

En el correo de validación, además se me advierte que debo hacer cambios específicos para poder publicar el juego. Hablaremos de ello en el próximo artículo.

Entrando en el mercado chino (1)

Ahora con varios juegos publicados me ha surgido la oportunidad de publicar mis juegos para el mercado chino. Sin duda que es es una oportunidad comercial importante por el volumen de posibles jugadores que tienen el mercado asiático, pero también constituye un reto, ya que publicar en china es toda una aventura.



Hace unos días vi en Twitter este anuncio que me llamo la atención. Teniendo juegos publicados pensé que era una oportunidad para ampliar mi mercado y hacer que mis juegos llegaran a China. Después de una exploración me decanté por AppTutti donde esta plataforma de Honk Kong ofrece entrar al mercado asiático a través de 3 tiendas virtuales con su plan gratuito.





Una vez en la página web inicié el proceso de registro. Este proceso consiste en 5 formularios con información detallada de tu organización así como los datos personales y bancarios. La información es exhaustiva y debe rellenarse para poder seguir con el proceso. Una vez realizado el registro pasaran unos días, 2 en mi caso, hasta que tu cuenta quede aprobada y puedas seguir adelante.


Mientras esperas a la aprobación de tu cuenta me estuve documentando sobre el sistema chino. Después de ver este vídeo esta claro que tendré que cambiar algunas cosas en los juegos que quiera publicar aquí ya que entre las restricciones del gobierno chino y los temas de localización no podría publicar los juegos tal y como están creados actualmente.

Attila. El final del camino

Hace unos días que publiqué Atila, Tierra quemada en al @IndieDevDay 2019 en Barcelona. Aproveché los dos días de la feria para recoger impresiones del juego para poder aplicar las buenas ideas a la versión definitiva del juego. 


Tengo que decir que el juego recibió una buena acogida y saqué algunos interesantes y sabios consejos. Pruébalo!

El sistema de combate

En un primer lugar, el sistema de combate diseñado consistía en un modo parecido a los que tienen los juegos de estrategia. El número de tropas, unos dados y el azar decidían el resultado de la contienda.


A la práctica, este sistema que en un juego de mesa es suficiente bueno demostró en la fase de testeo que era ineficiente ya que la mayor parte de los jugadores se mostraban indiferentes al modo de batalla ya que no tenían poder de decisión en el resultado.

En una segunda versión propusimos a los jugadores un sistema donde ellos debían decidir que estrategia querían utilizar en el combate (cargar, marchar o esperar) y la IA del ejercito romano escogía la suya aleatoriamente. Este sistema respetaba el sistema clásico de los juegos de estrategia añadiendo un factor humano, pero los jugadores seguían sin entender la dinámica del proceso y lo veían como una molestia al proceso del juego.


En una tercera propuesta el jugador decidía que estrategia quería utilizar en función de la estrategia que utilizaba la IA del jugador romano que funcionaba en modo automático y era mostrado en pantalla. Este sistema convertía las batalla en un mini juego. En la fase de pruebas el sistema parecía funcionar en las primeras batallas, pero paulatinamente nos dimos cuenta que finalmente el jugador pulsaba una opción al azar o vejaba que el proceso fuera aleatorio.


Finalmente decidimos hacer un cambio radical y transformamos las batallas en un mini juego de acción. Actualmente sólo tienen un sistema de batalla (golpear), así mismo el sistema tiene mas posibilidades de interacción que se pueden implementar.


Aunque este sea el sistema finalmente implementado, en la feria recibimos criticas de jugadores que les gustaba más el sistema tradicional de los wargames, aunque mayoritariamente tubo una buena acogida.

Comercio y espías

El juego se tiene como principales mecánicas la gestión del movimiento a través del juego del caballo de ajedrez, pero también la gestión de recursos para mover el ejercito de Atila. En las primeras versiones del juego sólo se podía comerciar al final de cada nivel forzando al jugador a reiniciar el nivel si se quedaba sin recursos. Este modelo hacia el juego con un curva de dificultad muy grande para un juego de dispositivos móviles, así que decidimos incluir la posibilidad de comerciar varias veces al medio de cada nivel. 


Este sistema, aunque satisfactorio necesitaba algún factor límite para equilibrar la dificultad del juego. En la siguiente versión se añadió el límite de 10 acciones comerciales en toda la partida, aunque como veremos podemos romper este límite en algunas circunstancias.


Finalmente al dotar de los recursos de una importancia crucial también encontramos interesante añadir otra opción interesante para jugadores más experimentados. En muchos niveles hay múltiples caminos para llegar a completar el circuito necesario para completar el nivel. Aquí es donde entra en marcha la opción de espionaje en el juego. Con esta opción podemos ver que recursos obtendremos de una determinada casilla aunque no estemos encima de ella. Esto nos permite en determinadas circunstancias determinar que estrategia queremos utilizar para completar un nivel.



Recompensas

Como ya he explicado en otros artículos, uno de los mayores problemas de los juegos gratuitos para dispositivos móviles es la retención de los usuarios. Al no ser un juego casual, sino de estrategia perderemos muchos usuarios  confundidos buscando un tipo de juego que en realidad no es lo que ellos esperaban. Así mismo, se han plantado algunas estrategias de retención que implementaré en las próximas semanas.
  • Premios diarios. Aprovechando las limitaciones en el modo de espionaje y el comercio dentro de un nivel, podemos ofrecer aumentar los límites de estas funciones como regalos diarios a la fidelidad de los jugadores.
  • Premios. Podemos ofrecer recursos a través de compras in-app o a cambio de la visualización de publicidad para no dejar al jugador sin recursos para seguir con su partida.
  • Guardar la partida. Aunque inicialmente no estaba contemplada, la opción de guardar y cargar una partida permite asegurar un estado inicial en el caso que debamos reiniciar el juego porque no disponemos de recursos necesario para seguir. 


Como hacer copias de tu código de Unity con GitHub

Podriamos escribir un libro entero de las bondades de Git para el trabajo colaborativo y la gestión de versiones en un entorno como Unity. D...