PROGRAMACIÓN EN PSP

Anuncio
PROGRAMACIÓN EN PSP
ALBERT PAÑOS
DAVID CUENCA
ANTONI SERRA
PSE
1
INDICE
INTRODUCCIÓN........................................................... 3
HISTORIA PSP ............................................................. 4
Especificaciones técnicas ............................................ 5
XrossMediaBar ............................................................ 9
Desarrollador.......................................................... 9
Legalidad pirateo PSP ................................................. 10
HOMEBREWS ............................................................ 15
PROGRAMACIÓN EN PSP: LUA ..................................... 19
PRÁCTICA: JUEGO EN LUA FUNCIONANDO EN PSP ......... 20
JUEGO EN PSP ........................................................... 29
COMPARATIVA Y CONCLUSIONES ................................ 29
BIBLIOGRAFIA........................................................... 31
2
INTRODUCCIÓN
La industria del videojuego es, a día de hoy, el sector con una facturación mayor
dentro del sector del ocio. En los últimos años ha superado incluso a la
todopoderosa industria discográfica.
Dentro del sector, en el presente la importancia de las consolas de sobremesa ha
disminuido de forma progresiva para dejar paso a las cada vez más crecientes
consolas portátiles. El monopolio de Nintendo con su Game Boy ha tocado a su fin,
y a día de hoy el de las portátiles es la que posee unas mayores perspectivas de
desarrollo a largo plazo. Su capacidad de juego en cualquier parte ha propiciado
que cada vez más usuarios descubran las posibilidades y ventajas que ofrece este
sistema.
Curiosamente, su desarrollo ha evolucionado en paralelo con el desarrollo de
software casero para ellas; por algún motivo, los usuarios tienen mas tendencia a
volcarse en el desarrollo de las portátiles; seguramente debido a que el hecho de
poder usarse en cualquier parte favorece el uso de muchas aplicaciones extra (tales
como lectores de pdf, reproductores de música, o receptores wifi) que no ofrece de
base el fabricante.
Con todo, la complejidad es mayor de lo que podría creerse a priori, pues la
compañía desarrolladora no ofrece ninguna facilidad para ello.
De todas las consolas portátiles en el mercado, la PSP es la que mas grupos de
desarrollo amateurs ha generado a su alrededor: entre otros motivos por ser la
consola más potente y con mas potencial; de hecho es casi un ordenador en
miniatura.
En el siguiente documento ofreceremos una visión del desarrollo de software
“casero” para la consola PSP, desde el punto de vista legal, técnico y de desarrollo,
pues crearemos un minijuego casero que funciona en una consola PSP.
3
HISTORIA PSP
Sony anunció por primera vez el desarrollo de la Playstation Portable en una
conferencia de prensa previa al E3 2003. Aunque no se presentó ningún dato
referente al sistema ni en la conferencia ni en el E3, Sony si mostró una lista con
extensos detalles referentes a la nueva consola.
EN el CEO de Sony Computer Entertainment, Ken kutaragi llamó al dispositivo el
“Walkman del siglo 21” en referencia a las capacidades multimedia de la consola.
Diversas webs de videojuegos quedaron impresionadas por las capacidades de la
consola y estaban expectantes por el potencial que podía tener como plataforma de
videojuegos.
Las primeras imágenes conceptuales de PSP aparecieron en Noviembre de 2003 en
el Sony Corporate Strategy Meeting y mostraron una PSP con botones anchos y sin
stick analógico. Aunque algunos expresaron su preocupación por la falta de stick
analógico, esos miedos se disiparon cuando la PSP fue presentada oficialmente en
la conferencia de prensa de Sony durante el E3 de 2004. Además de anunciar mas
detalles sobre el sistema y sus accesorios, Sony también mostró una lista con 99
compañías desarrolladoras que habían mostrado su apoyo para la nueva consola.
Diversas demos de PSP como el Metal Gear Acid de Konami, y el Wipeout Pure de
SCE Studio Liverpool se mostraron en esa conferencia.
Lanzamiento
El 17 de Octubre de 2004 Sony anunció que la PSP se lanzaría en Japón el 12 de
Diciembre de 2004 a un precio de 19800 yenes (185 euros) para el modelo base, y
24800 yenes (unos 230 euros) para el Sistema “Value”. La consola fue lanzada con
éxito con más de 200,000 unidades vendidas el mismo día.
Sony anunció el 3 de Febrero de 2005 que la PSP saldría a la venta en
Norteamérica el 24 de Marzo de 2005 en una configuración a un precio
recomendado de 249$. Algunos expresaron su preocupación debido al alto precio,
que era casi 20 dólares mas alto que el precio en Japón, y mas de 100$ de
diferencia con la Nintendo DS. A pesar de ello, el lanzamiento americano de PSP fue
un éxito, aunque dos semanas después hubo noticias de que el sistema no se
estaba vendiendo tan bien como se esperaba a pesar de las declaraciones de Sony
de que se habían vendido 500,000 unidades en los dos primeros días.
4
PSP debía haber sido lanzada el mismo día en las regiones PAL (como Europa) y en
Norteamérica, pero el 15 de Marzo de 2005, Sony anunció que el lanzamiento en
las regiones PAL se retrasaría debido a la alta demanda de la consola en
Norteamérica en Japón. Un mes después, el 25 de Abril de 2005, Sony anunció que
PSP se lanzaría en la región PAL el 1 de Septiembre de 2005 por 249€. Sony
defendió que el alto precio, que era cerca de 100$ mayor que en Norteamérica,
argumentando que los consumidores norteamericanos tenían que pagar tasas
locales y que el IVA era mayor en el Reino Unido que en USA. A pesar del alto
precio, las consolas de la región PAL fue un rotundo éxito, vendiendo mas de
185,000 unidades en el Reino Unido solamente, mas del doble que las ventas del
1er día de Nintendo DS (87,000). El sistema también disfrutó de un gran éxito en
otras regiones PAL con más de 25,000 unidades reservadas en Australia y cerca de
un millón por toda Europa en la primera semana
Especificaciones técnicas
¾
Unidad de Procesamiento Central: Custom CPU multipropósito Sony
"Allegrex" basado en MIPS de velocidad configurable en 1/333 MHz, incluye un
CPU basado en MIPS32 Rk-4 de 32 bits, un FPU (Unidad de Coma Flotante) y un
VFPU de cálculo vectorial. También incluye un procesador conocido como "Media
Engine"; siendo también un CPU basado en MIPS32 Rk-4 de 32 bits dedicado al
manejo de audio/video por hardware y un DSP (Procesador digital de señal)
programable "Virtual Mobile Engine". El "Media Engine" tiene funcionalidades
similares al CPU principal y sirve como equivalente ante la falta de VPU.
¾
Memoria: 32 MB RAM de memoria principal (64 MiB en PSP Slim & Lite) y 4 MiB
DRAM embedida; los 4 MiB corresponden a 2 MiB para el chip gráfico y a 2 MiB
del "Media Engine", ambos CPUs contienen 16KB de caché de instrucciones y
caché de datos y 16KB de scratchpad, además de 32 MiB de memoria Flash
NAND (usada para guardar configuraciones y archivos del sistema).
5
¾
Chip gráfico: Custom GPU de velocidad configurable en 1/166 MHz con 2 MiB
de memoria interna e interfaz de 512 bits soportando renderizado de polígonos
y NURBS, iluminación direccional por hardware, environment projection y
texture mapping, compresión de texturas y mosaicos, niebla, alpha blending,
depth and stencil test, vertex blending para efectos de morphing y dithering;
todo en 16 o 24 bits de profundidad de color. El Chip gráfico también maneja la
salida de vídeo. El sistema es capaz de mover unos 33 millones de polígonos
iluminados y tratados, con un ratio de 664 millones de píxeles por segundo.
¾
Chip de Sonido: Custom DSP configurable Sony "Virtual Mobile Engine" Sonido
3D, Multi-Canal 7.1ch.
¾
Pantalla: 4,3 pulgadas, 16:9 widescreen TFT LCD 480 x 272 píxeles (16.77
millones de colores)
¾
Códecs: ATRAC3 plus, AAC, MP3, WMA, AVC/@MP for Picture / Movi, H.264
(MPEG-4 Part 10). Soporte de imágenes en formato JPEG, GIF, TIFF, BMP y
PNG.
¾
Media: Lectura de datos desde sistema de discos ópticos UMD (Universal Media
Disk) y Memory Stick PRO DUO, conexión y manejo remoto del sistema
PlayStation 3. (Salida de TV en PSP Slim & Lite)
¾
WIFI: Wi-Fi IEEE 802.11b permite conexión Ad-HOC e Infraestructura con otras
PSP y con Internet con jugabilidad para 2/16 jugadores simultáneamente. El
software de sistema incluye un Navegador Web basado en Access NetFront.
¾
Gamesharing: Algunos títulos del sistema PSP soportan la transferencia de
juego en modo multijugador con otras consolas que no cuenten con el juego en
cuestión, esto se logra enviando los datos a través de conexión Ad-Hoc y
cargándolos sobre la memoria RAM. El soporte de esta opción está limitado a los
juegos que hacen uso de ella.
¾
Accesorios: Cámara de video de 1.2 mega píxeles "Chotto Shot", receptor de
señal GPS, receptor de TV digital y PSP Headset (incluido con ciertos títulos)
¾
Interfaz: XMB "XrossMediaBar" desarrollada por Sony y presente en sus
nuevos televisores así como en el sistema PlayStation 3.
¾
Medidas: 190 mm de anchura (110 de pantalla TFT) y 74 mm de altura.
¾
Peso: 260 g sin incluir batería (320 gramos con batería).
¾
Diseño: Shin'ichi Ogasawara para Sony Computer Entertainment (subsidiaria
de Sony Corporation)
6
PSP Desmontada, vemos la placa base y la tarjeta WIFI
(parte inferior)
Diagrama de bloques del sistema PSP
7
Especificaciones del disco UMD
Imagen del disco UMD
Sony originalmente desarrolló el UMD como un medio de almacenamiento
multimedia en tres versiones diferentes: PSP Game, UMD Video y UMD Audio.
Existe la posibilidad de usarse en un futuro para almacenar datos; es el caso del
HI-MD. En el momento de la salida de la Playstation Portable, el formato PSP Game
obtiene un soporte muy amplio pero en el caso de UMD Video no consigue el
soporte internacional que se esperaba debido a la fortaleza del DVD Video. En
cuanto al UMD Audio su soporte inicial fue nulo debido sobre todo a la fuerte
competencia de soportes mundialmente aceptados como el Compact Disc u otros
soportes como el Minidisc, DVD Audio y SACD.
Dimensiones: Aprox. 65×64x4.2 (mm)
Peso: Aprox. 10g
Diámetro: 60 mm
Capacidad máxima: 1.8GB
Longitud de onda del láser: 660nm (Láser rojo)
Encriptación: AES 128bit
Utilidades: Juego de PSP, Audio UMD (codec ATRAC3plus, PCM, (MPEG4 AVC),
UMD Video (codec MPEG4 AVC, ATRAC3plus, Caption PNG)
8
XrossMediaBar
XMB en PSP
PSX XMB en una Sony BRAVIA TV
El XrossMediaBar (XMB) es la interfaz de usuario gráfica de Sony para PSP y PS3
La interfaz incluye iconos que se esparcen horizontalmente a través de la pantalla.
La navegación mueve los iconos en vez del cursor. Estos iconos se usan como
categorías para organizar las opciones disponibles para el usuario. Cuando un icono
es seleccionado en la barra horizontal, diversas opciones mas aparecen en la
vertical, encima y debajo de él (seleccionable con el pad)
Usado originalmente en la PSX, el XroosMediaBar se usa como interfaz estándar
tanto en PSP como en PS3. Desde 2006 también se utiliza en los televisores WEGA,
BRAVIA desde la 3000 (solo en las series S y superior) y en el receptor de alta
salida STR-DA 5200ES AV. Los menús de los Sony Ericsson K859 i W910 también
son una versión del XMB, dando a entender que el XMB será lo próximo que se
implemente en los teléfonos Sony Ericsson. También se ha confirmado para la
próxima generación de las televisiones BRAVIA
Desarrollador
Q-Games Ltd, una pequeña compañía de desarrollo con sede en Kyoto, Japón
desarrolló la tecnología gráfica que hay tras el XMB, su estilizado fondo i los
visualizadores. La versión para PS3 usa una versión del explorador NetFront de
AccessCo. Como su explorador web interno. Es el mismo que en la PSP (SonyBranded NetFront 2.81) con las misma interface, menús y teclado virtual. Sony
también ha colaborado con la Universidad de Stanford para traer el proyecto
Folding@home a la PS3. Una vez descargado, el programa puede ser configurado
para funcionar cuando el sistema esta sin hacer nada o ejecutado manualmente
desde el XMB
9
Legalidad pirateo PSP
Actualmente se ha declarado una sentencia en el Tribunal de Valencia sobre la
legalidad de piratear la PSP. La sentencia fue la siguiente:
Conforme al Art. 270-3 del Código Penal, se castiga a “quien fabrique, importe,
ponga en circulación o tenga cualquier medio específicamente destinado a facilitar
la supresión no autorizada o la neutralización de cualquier dispositivo técnico que
se haya utilizado para proteger programas de ordenador o cualquiera de las otras
obras, interpretaciones o ejecuciones en los términos previstos en el apartado 1 de
este artículo.” Atendiendo a la literal dicción del referido artículo, y examinadas las
actuaciones, se impone la confirmación de la resolución recurrida, en la que la
Magistrado a quo, a petición del Ministerio Fiscal, acuerda el sobreseimiento
provisional de la causa al amparo del Art. 641-1 de la Ley de Enjuiciamiento
Criminal., por ser racional y ajustado a derecho su razonamiento de haberse
acreditado, por la prueba pericial practicada, que los chips que se instalan o se
pueden instalar en las videoconsolas de autos, pueden servir, desde luego, como
dispositivo tendente a desprotegerlas para permitir utilizar juegos no originales,
pero también, para permitir la ejecución de juegos originales de otras zonas y para
convertir la consola en un ordenador personal apto para realizar múltiples tareas
absolutamente lícitas, como pueda ser el manejo de fotografías, ejecutar juegos de
libre distribución no diseñados para consola, escuchar música, etc. No se cumpliría,
por tanto, el requisito de la exclusiva o específica destinación a la supresión o
neutralización de dispositivos de protección de las consolas, y en este sentido el
razonamiento de la instructora no resulta desacertado para este Tribunal.
Proceso de Downgrade
La consola de Sony está oficialmente vetada para ejecutar software de usuario.
Como hemos visto, actualmente es perfectamente lícito, pero la empresa no tiene
porqué proporcionar los medios para ello; así que los usuarios se ven obligados a
buscar errores de programación o “bugs” en el sistema para intentar buscar la
forma de acceder a todas las propiedades que ofrece el sistema. La idea es ejecutar
un “Exploit” o programa malicioso cuyo objetivo es romper las protecciones de
seguridad del sistema.
En si, toda la vida de PSP ha sido una lucha entre los programadores y Sony;
Llegando al punto de sacar actualizaciones periódicas solo para evitar la última
forma de pirateo.
10
El Exploit más común consiste en lo que llamamos “Downgrade”.
DOWNGRADE
En las versiones del firmware (esto es, la versión del software de la consola) 1.00
a 1.50 la ejecución de código casero era posible sin necesidad de ningún tipo de
exploit. Inmediatamente, Sony saco la versión 1.51 que corregía ese error. Desde
ese momento, el objetivo de todos los exploits mas populares de la red han sido el
“downgrade”, es decir, el volver a las versiones anteriores (normalmente la 1,5 por
ser la última) dónde si eran posible este tipo de acciones de forma sencilla.
Hay líneas de desarrollo que han intentado la ejecución de código casero en las
versiones posteriores directamente, pero esto no suele ser lo más óptimo: primero
porque suele ocurrir que la libertad de acción en estos casos es mucho menor y
solo permite código de tamaño pequeño o de acciones limitadas; y segundo porque
cada nueva versión tiene que buscar su propio exploit lo cuál es una tarea de
meses.
En este documento centraremos el estudio en describir un tipo de downgrade
estándar para mostrar cómo actúa sin entrar en detalles específicos.
Para empezar a describir lo necesario para realizar un Downgrade en la consola,
empezaremos por recalcar las características de la misma, necesarias para
entender el proceso:
Cada consola tiene un tipo de placa y, además, un tipo de consola.
Respecto al tipo de placa, hay que saber que ciertas placas no son compatibles con
la función de Downgrade. Hasta hace poco por lo menos, había un tipo de placa que
la hacia incompatible debido a sus altas probabilidades de “brickeo” (Apagado
definitivo de la consola sin probabilidad de iniciarla de nuevo. Del inglés brick,
ladrillo, porque es poco más que en lo que se convierte la consola después de que
ocurra).
11
Una vez confirmado que nuestra consola
está lista por hardware para el downgrade
se comprueba el software. El tipo de
consola indica la actualización por defecto
que
incluye,
firmware
y
esto
se
es,
indica
la
con
versión
una
del
letra
mayúscula asociada a una versión (A, B...
por ejemplo el G es la 2.01)
Cada versión del firmware tiene su propio
Comprobación de tipo de placa
exploit. Para el usuario medio saber que
exploit actúa y cómo lo hace no es importante, en la mayoría de casos los archivos
necesarios para el downgrade se presentan para que sea hecho de forma más o
menos intuitiva.
A modo de ejemplo se presentará la explicación técnica de dos casos de exploit
usados para el downgrade.
Buffer Overflow
El método mas conocido de exploit es el conocido como de “Buffer Overflow”.
Las variables locales de una rutina se guardan en la pila, que es una zona de la
memoria apuntada por un registro hardware (SP). Cuando se entra en la rutina,
hace falta guardar la dirección donde estaba para volver más tarde donde estaba
para seguir con la ejecución del programa. La PSP (procesador mips) guarda dicha
dirección en un registro llamado RA (return address). Si durante la rutina se llama
a otra rutina, dicho registro perdería su valor, por eso es necesario guardarlo en
memoria para poder restaurar su valor mas adelante. Esa información se guarda en
la pila.
Un buffer overflow (desbordamiento del buffer) es una condición anómala que se
produce en un programa al exceder un buffer en memoria (por ejemplo, se excede
la capacidad de un array). Suelen ser consecuencia de un fallo en la programación
(lo que se conoce como bug).
12
En este caso, se uso una imagen específicamente diseñada, para que al ser abierta
por el visor de imágenes desbordara la capacidad del buffer, sobrescribiendo
también la pila hasta el punto de perder el índice de retorno del programa.
Cuando el error ocurre y el punto de ejecución es movido al lugar sobrescrito por el
overflow se consigue un puntero para la ejecución de algún código sin pasar por los
sistemas de seguridad.
Este fallo fue explotado hasta poder hacer funcionar un programa que permitía
instalar una versión anterior del firmware, sobrescribiendo la existente. Como se
había saltado los sistemas de seguridad que permitían comprobar que la versión
instalada era más reciente, sencillamente borraba la actual y escribía la antigua
volviendo al firmware con el bug para poder hacer funcionar código casero.
El exploit 1.50
En el firmware 1.00 la ejecución de código casero era libre, es decir, nadie se
planteó que alguien pudiera hacer un cargador de código casero (eboot). Con la
versión 1.50, se solucionó eso.
Para contrarrestar eso, salió un exploit llamado “swaploit”, era un método que
aprovechaba un fallo en la lectura de la tarjeta de memoria que permitía cargar
código casero. No obstante, era un método que requería tener dos tarjetas de
memoria (memory sticks) e intercambiarlas en el momento justo, cosa que si no se
hacía bien, podía dañar la consola.
Poco tiempo después salió el Kxploit, un método mucho mas seguro que solo
requería de una tarjeta para funcionar.
El método era el siguiente:
El bootloader (cargador de programas, por así decirlo) de la PSP comprueba la
carpeta de la tarjeta de memoria (en formato FAT) que el código sea legal o
registrado (signed). Si encuentra código no legal, se niega a iniciar el programa.
Sin embargo, el sistema operativo (OS) de la PSP no comprueba eso. Asume
sencillamente que el bootloader ha filtrado cualquier código no válido y ejecuta el
código que encuentra.
Pero da la casualidad que el bootloader y el OS de la PSP no funcionan de la misma
manera. Se descubrió que el bootloader ignoraba el símbolo “%” pero el OS no. La
13
solución fue poner dos carpetas con el mismo nombre. La primera estaría vacía,
pero la segunda, que contendría el programa, tendría el mismo nombre pero con el
símbolo “%”. De esta forma el bootloader leería “nombre%” como “nombre” y daría
el acceso, y el OS cargaría el programa.
Esta es la idea básica detrás de la ejecución de código casero en PSP.
Reacción y contra reacción: Custom Firmware
El mayor handicap a la hora de jugar con la versión 1.50 es que eso implica
renunciar a las actualizaciones de Sony en materia de novedades en aplicaciones y
funcionalidades (por ejemplo, en la 1.50 no había navegador web con lo que no era
posible el acceso a Internet de ese modo).
Actualmente, la política de Sony respecto al pirateo le deja con las manos más
atadas, así que su solución es hacer que los juegos nuevos solo funcionen con
versiones de Firmware superiores a una concreta, obligando a los usuarios a
actualizar a un firmware con menos bugs para poder jugar a los juegos.
Para solucionarlo, el grupo de desarrolladores ha creado lo que se llama: Custom
Firmware, o emuladores de firmware. Para ello, el eboot carga un programa que te
deja elegir una versión de firmware para emular, así, de cara al exterior y a la
consola la versión que ejecuta es la del firmware seleccionado (emulando todas sus
funcionalidades y añadidos) pero corriendo en realidad sobre la 1.50, lo cual
permite la ejecución de código casero.
Actualmente, las últimas versiones cuentan con sistemas de menús dentro del
propio menú para seleccionar extras y cargar programas sin tener que reiniciar la
consola
Figura : Programa DevHook para ejecución
Figura: Botón de carga de DevHook en el
de custom firmware
menu de PSP
14
HOMEBREWS
Se suele denominar homebrew a las aplicaciones informáticas realizadas por
aficionados para plataformas de videojuegos propietarias. En otras palabras,
plataformas de videojuegos que no son típicamente programables por usuarios o
usan sistemas de almacenamiento propietarios.
Podemos encontrar diferentes tipos de homebrews dependiendo de la finalidad que
tenga. Así pues podemos tener:
Aplicaciones generales
Ad Hoc Messenger 2.0: recibir y enviar mensajes
sin Internet Wi-Fi, solo mediante Ad-Hoc.
HM Lua Player 5.0: permite
ejecutar juegos en
lua.
PspSpoof 1.1: permite ejecutar aplicaciones o juegos homebrew que necesiten un
Firmware superior sin necesidad de actualizarlo.
PSP-Maps v0.6: muy parecido a google maps que
permite ver mapas de todo el mundo.
PspDos 0.1: permite traer ms-dos de Windows a la consola para poder ejecutar
juegos o programas de MSDOS.
15
Windows Vista Lua v2: una Shell para psp con el
aspecto de Windows vista, permite explorar la
Memory Stick, activar el USB, jugar a juegos, etc.
Emulación
PSPUAE 0.71: emulador de Commodore Amiga.
RacePSP: emulador de los sistemas portátiles de
SNK NeoGeo Pocket y NeoGeo Pocket Color.
PSPTHOM
v1.2.0:
emulador
computadora
“Thomson T07”.
Juegos: CSPortable 0.75, Luigi World v.1, space 0.1, Mario Kart PSP v1.0, Kitten
Canon, Zelda Alpha 2, etc.
Aplicaciones multimedia
16
VisMP3 v0.1.2: permite reproducir MP3 y a la vez
pone
a
nuestro
alcance
un
entorno
gráfico
agradable.
DIR to XML Tool v.1.0.2: pasar nuestros archivos MP3 a RSS/XML, lo que
posibilita escuchar nuestras canciones del PC en nuestra PSP a través del sistema
WiFi.
PSPRadio v0.37: cliente de streaming de radio por
Internet.
Time Baby v12h: realiza la función de despertador,
que dispone de soporte MP3.
Aplicaciones customizables
NervOS v1.6: sustituye al XMB original.
Wallpaper Changer v1.20: permite a los usuarios
fijar un fondo de pantalla para determinadas fechas
y
variar
aleatoriamente
algunos
recursos
sin
necesidad de escribir la Flash.
17
Firmwares
RS
PsarDumper
v3.2:
permite
poder
desencriptar y descomprimir directamente los
archivos del firmware.
Time
Machine
Configurator
v2:
permite
configurar la Time Machine desde la PSP sin usar
el PC.
18
PROGRAMACIÓN EN PSP: LUA
Descripción
Lua
fue
creado
en
1993
por
Roberto
Ierusalimschy, Luiz Henrique de Figueiredo, I
Waldemar Celes.
-
de peso ligero: usa poca memoria, es fácil de implementar con una
estructura simple
-
reflexivo: permite analizar ,observar y modificar su estructura de alto nivel
-
imperativo: como casi todos los lenguajes actuales, declara una serie de
acciones que el programa debe ejecutar por orden paso a paso
-
Lenguaje script: lenguaje que puede ser escrito en un bloc de notas, no
requiere de compilación y normalmente ejecuta una programa o aplicación
de software simple
CARACTERÍSTICAS
Las variables no tienen tipo, solo los datos, q pueden ser: lógicos, enteros, coma
flotante, o cadenas de caracteres.
Lua solo posee una única estructura de datos: la tabla
La principal característica de Lua es que no ahonda dentro de un tipo concreto de
paradigma (Ej.: orientado a objetos) sino que se compone de una serie de
características generales muy poco restrictivas que permiten la implementación de
funciones, herencias, clases etc de forma relativamente simple mediante el uso de
las meta tablas.
19
Es un lenguaje ligero, pensado para ser simple y, al mismo tiempo y debido a eso,
muy flexible y capaz de extenderse mucho más de lo que podría parecer en una
primera aproximación.
Su propósito de uso es como extensión de otro programa, o como script, y es
suficientemente pequeño para caber en una amplia variedad de aplicaciones
Es bastante utilizado en juegos por su flexibilidad para añadir pequeños scripts de
apoyo o de extras a un juego concreto; o como en este caso, para crear
videojuegos.
PRÁCTICA: JUEGO EN LUA FUNCIONANDO EN PSP
A continuación describiremos el código de nuestro juego que ejecutamos en PSP. El
juego se trata de esquivar bloques enemigos que se dedican a rebotar por la
pantalla, aguantando el mayor tiempo posible.
Figura : Captura del joc en moviment
Figura: Captura de la pantalla de final de joc
Para empezar el lenguaje LUA no requiere el uso (de base) de librerías adicionales,
así que empezamos directamente a escribir el código.
azul = Color.new(0,0,255)
verde = Color.new(0,255,0)
blanco = Color.new(255,255,255)
Definimos tres colores que usaremos para el bloque del jugador, los bloques
enemigos y el texto.
player = Image.createEmpty(32,32)
20
player:clear(azul)
block = Image.createEmpty(32,32)
block:clear(verde)
Definimos el jugador como una imagen vacía de 32x32 y la vaciamos pintándola de
azul. Lo mismo para los bloques enemigos en verde
Player = { x=30, y=100}
playerHeight = 32
playerWidth = 32
Aquí podemos observar una de las características mas curiosas de LUA: definimos
una variable Player y le asignamos propiedades de estructura: de esta forma dentro
de Player tenemos “x” e “y” que nos definen la posición del jugador. Esta estructura
no necesita indicar el tipo de variable que contiene, puede tener tanto valores como
texto y la cantidad que deseemos, solo hace falta ir añadiéndolos a continuación y
el lenguaje lo interpreta automáticamente. Definimos altura y anchura del jugador
para poder referenciarla luego.
Block = {}
Block[1]=
{x=100,y=80,
height=block:height(),
width
=
block:width(),k=3,h=-2 }
Block[2]= {x=300,y=30, height=block:height(), width = block:width(),k=1,h=-2 }
Block[3]= {x=200,y=58, height=block:height(), width = block:width(),k=2,h=2 }
Aquí definimos un vector de estructuras. La cantidad de elementos la vamos
actualizando según nos interesa añadir mas. Creamos los bloques enemigos de un
modo distinto a como hemos creado Player pero en esencia contiene la misma
información. Las variables “k” i “h” indicaran la velocidad horizontal y vertical
respectivamente de cada bloque.
function movePlayer()
21
pad=Controls.read()
if pad:left() then
Player.x = Player.x -2
end
if pad:right() then
Player.x = Player.x +2
end
if pad:up() then
Player.y = Player.y -2
end
if pad:down() then
Player.y = Player.y +2
end
end
Después de definir las variables definiremos las funciones del programa. Como LUA
carece de programa principal (main) en realidad no importa el orden en que se
escriba el programa, pero eso si, es importante haber definido las funciones antes
de llamarlas claro. En nuestro programa incluimos funciones para comprobar
colisiones y mover los bloques tanto del jugador como de los bloques enemigos.
La función movePlayer controla el movimiento del bloque del jugador. Esta pensado
para leer la entrada del teclado (o de la psp) y reaccionar en consecuencia. La
velocidad de desplazamiento se ha ajustado para que sea competitivo. Vemos que
la función no contiene corchetes que la delimiten, sino solamente la palabra
reservada “end” que indica el fin de la función. Eso ocurre también con la condición
“if” cuya estructura se asemeja a la de Visual Basic con la combinación “if X then”.
La relación entre la función pad y el input la hace el programa que lo ejecuta (en
nuestro caso, el luaplayer)
22
function moveBlock (bloc)
bloc.x = bloc.x + bloc.k
bloc.y = bloc.y + bloc.h
end
La función moveBlock sencillamente desplaza los bloques enemigos una distancia
igual a su velocidad. Vemos como actualiza la variable posición.
function collisionWallsBlockCheck (obj)
if(obj.x + playerWidth < 35) or
(obj.x + playerWidth > 475) then
obj.k= -(obj.k)
end
if(obj.y + playerHeight < 35) or
(obj.y + playerHeight > 268)
then
obj.h= -(obj.h)
end
end
La función collisionWallsBlockCheck comprueba si los bloques enemigos llegan al
final de la pantalla y, en ese caso, les hace rebotar en la dirección opuesta. Los
limites de la pantalla se han descubierto por el método del prueba-error, aunque
nos consta que existen librerías que tienen implementada una función de
identificación de estos.
function collisionWallsCheck (obj)
if(obj.x + playerWidth < 35) or
23
(obj.x + playerWidth > 475) or
(obj.y + playerHeight < 35) or
(obj.y + playerHeight > 268)
then
obj.x=oldx
obj.y=oldy
end
end
Esta es la misma función para el caso del jugador. Sencillamente actualiza la
posición con la misma que tenia lo que consigue que se mantenga estático.
function collisionCheck(object1,object)
if(object1.x + playerWidth > object.x) and (Player.x <
object.x +
playerWidth) and
(object1.y + playerHeight > object.y) and (Player.y <
object.y +
playerHeight) then
return -1
else
return 0
end
end
Esta función comprueba si el jugador colisiona con alguno de los otros bloques. Vale
la pena destacar que como LUA no define tipo de función, la posibilidad de retornar
un valor a la salida es opcional y no hace falta declararlo. En este caso comprueba
24
los cuatro lados del jugador con el bloque pasado por referencia y devuelve –1 en
caso de colisión lo que nos marcaría el final de la partida.
function collisionBlockCheck(object1,object2)
if(object1.x + object1.width > object2.x) and (object1.x <
object2.x +
object2.width) and
(object1.y + object1.height > object2.y) and (object1.y <
object2.y +
object2.height) then
object1.h = -(object1.h)
object1.k = -(object1.k)
object2.k = -(object2.k)
object2.h = -(object2.h)
end
end
Finalmente, la función que controlará la colisión entre bloques enemigos que hará
que reboten en la dirección opuesta a la que iban. Destacar que los objetos pasados
por referencia no se indican, con lo que no se comprueba que realmente se esté
pasando algo con lo que se pueda trabajar. Dado que LUA carece de compilador el
programa sencillamente funcionará o no funcionará, pero siempre podrá ser
ejecutable. El luaplayer nos indica en una línea de texto de MS-DOS el error y la
línea donde se ha producido.
counter = Timer.new()
counter:start()
25
tiempo =0
result=true
Timer es una función que cuenta el tiempo en milisegundos que ha pasado desde el
inicio del programa. Lo que hacemos es mostrar ese tiempo por pantalla a modo de
puntuación.
while (result==true) do
currentTime=counter:time()
oldx = Player.x
oldy = Player.y
screen:clear()
screen:print(10,10,"Tiempo de juego: "..currentTime,blanco)
Empieza el bucle de juego del programa. Este bucle ejecuta lo que es propiamente
el juego y se repite hasta que se cumplen las condiciones de derrota. Para empezar
se guarda el valor de la posición actual del jugador y se limpia la pantalla con la
propiedad “clear”. Luego lo primero que hacemos es actualizar el tiempo de juego
mostrándolo por pantalla.
moveBlock(Block[1])
moveBlock(Block[2])
moveBlock(Block[3])
movePlayer()
Desplaza los bloques y comprueba si el jugador esta presionando el pad.
26
collisionWallsCheck(Player)
collisionWallsBlockCheck(Block[1])
collisionWallsBlockCheck(Block[2])
collisionWallsBlockCheck(Block[3])
Comprueba las colisiones de cada bloque con las paredes.
if(collisionCheck(Player,Block[1]) <= -1)or
(collisionCheck(Player,Block[2]) <= -1) or
(collisionCheck(Player,Block[3]) <=-1)then
result=false
end
Comprueba si el jugador está en colisión con alguno de los tres bloques, en cuyo
caso cambia “result” que es la variable que comprueba el bucle para decidir cuando
sale de él y finaliza el juego.
collisionBlockCheck(Block[1],Block[2])
collisionBlockCheck(Block[1],Block[3])
collisionBlockCheck(Block[2],Block[3])
Comprueba la colisiones entre cada uno de los bloques.
screen:blit(Player.x, Player.y, player)
for a = 1,3 do
screen:blit(Block[a].x, Block[a].y,block)
end
La función screen:blit pinta los elementos por pantalla. Vemos que usamos una
iteración “for” para mostrar los bloques dado que los tenemos en un vector.
27
screen.waitVblankStart()
screen.flip()
end
La primera función hace una pausa. La segunda muestra por pantalla las acciones
realizadas anteriormente, y por tanto actualiza cada bucle la imagen para crear el
movimiento. Con esto termina el bucle principal.
counter:stop()
while true do
screen:clear()
screen:print(200,100,"FIN DE LA PARTIDA",blanco)
screen: print(200, 120, "Puntuacion:"..currentTime,blanco)
screen.waitVblankStart()
screen.flip()
pad=Controls.read()
if pad:start() then break end
end
Esta es la parte final del programa al que solo se accede saliendo del bucle
principal, esto es, cuando pierdes. Detiene el contador, vacía la pantalla y muestra
la frase “FIN DE LA PARTIDA” junto con tu puntuación o tiempo. Esa pantalla esta
dentro de un bucle porque se mantiene hasta que el jugador presiona la tecla
“start” de la PSP.
28
JUEGO EN PSP
El juego requiere de un programa para ejecutarlo llamado “LUA player”.
Evidentemente como programa que es, solo es ejecutable en las versiones del
firmware que lo permitan. El programa contiene una lista de todos los elementos
que reconoce como archivos ejecutables (extensión *.lua)
Figura X: Dos capturas del LUA player en funcionamiento en la PSP
Captura del juego funcionando en PSP
29
COMPARATIVA Y CONCLUSIONES
Aun con todo lo que se ha conseguido, las capacidades que puede ofrecer la
ejecución “no legal” de código casero son todavía muy limitadas. Las capacidades
gráficas y de rendimiento de un sistema ejecutado desde UMD o desde memory
stick legalmente.
La diferencia principal es que el sistema “signed” trabaja en Kernel mode, esto es,
utilizando todas las capacidades que ofrece la consola; mientras que muchos de los
sistemas caseros no, con lo que cuentan con unas capacidades más limitadas.
El mayor problema a la hora de hacer software para la PSP, es la gran diversidad
de público con gran diversidad de firmwares y tipos de exploit. Como cada grupo de
desarrollo ha trabajado por su cuenta, existen muchas combinaciones de
firmwares-exploit: hay quien la tiene en la 1.50 con el downgrade, pero si algo falla
la consola puede brickearse, y eso asusta a muchos usuarios. Hay quien la posee en versiones posteriores usando solo una capacidad menor
debido a las limitadas capacidades del exploit encontrado; además Sony trabaja
rápido para tapar todos los posibles parches sacando actualizaciones, con lo que el
tipo de usuario cada vez se va diversificando más.
El objetivo del desarrollador de software es que llegue al mayor número de usuarios
posible, y eso a veces, le obliga a limitar las funcionalidades de su código.
La realidad por eso, es que la PSP como centro multimedia esta muy limitada por
las protecciones que impone Sony. Hoy en día es difícil imaginarse que alguien
desaproveche todas las opciones que podría ofrecerle su sistema limitándose a lo
que la compañía decide ofrecer.
No obstante, existe una cara negativa de todo eso, y es que la capacidad para
acceder al modo Kernel, permite ejecutar código de mayor capacidad de memoria.
Actualmente la venta de juegos de PSP ha disminuido en gran medida, y Sony sabe
que la mayor parte de usuarios aprovecha el filón de ejecutar código para ejecutar
“copias de seguridad” o mejor dicho “copias pirata”. Es una tentación muy fuerte
sobretodo si tenemos en cuenta el precio que alcanza un videojuego en el mercado.
30
BIBLIOGRAFIA
Conseguido kernel mode en PSP : http://tec.fresqui.com/kernel-mode-en-psp2-50-y-2-60
Exploits:
http://es.wikipedia.org/wiki/Exploit
Swaploit info:
http://www.afterdawn.com/glossary/terms/swaploit.cfm
Kxploit info: http://www.afterdawn.com/glossary/terms/kxploit.cfm
Firmware exploits:
http://wiki.scummvm.org/index.php/PlayStation_Portable
Buffer overflow:
http://www.pspain.com/foro/showthread.php?t=8584
http://www.elotrolado.net/hilo_descubierto-exploit-para-el-firmware-2-0-de-lapsp-re-actualizado_455619
Downgrade info:
http://www.todopsp.com/foros/showthread.php?t=48813
Custom firmware info:
http://www.todopsp.com/foros/showthread.php?t=34159
31
Descargar