Registrarse

FR | [En progreso] Getspritepos

Invert

why so serious?
Hace poco hablando con @FEL!X por Skype surgio una gran idea, hacer un Getspritepos.
Como muchos ya saben, el comando Getplayerpos almacena en un par de variables la posición del player, ahora, imagino lo que se podría hacer si se pudiera almacenar la posición de otro sprite.

He estado investigando algunas cosas, y comparto lo que llevo ya que no tengo ni idea de muchas cosas xD

Código:
PUSH    {R4,R6,LR}
LDR     R4, var_8004
ldr r0, saveblock1_mapdata
ldr r0, [r0]	
ldrb r0, [r4]		@ person/local ID from var 0x8000
ldrb r1, [r0, #5] 	@ current map
ldrb r2, [r0, #4]       @ current bank
ldr r5, npc_id_by_local_id_and_map_ret_success
bl call_via_r5

@@ Get npc_States
ldrb r1, [r0]
lsl r0, r1, #3		@ npc_states + 0x24 * npc_id
add r0, r1
lsl r0, #2
ldr r1, npc_states
add r6, r0, r1
mov r0, r6

@@ Get ncp_pos_x
mov r1, r0
ldr r4, var_8005
ldrh r4, [r4]
LDRH    R4, [R0,#0x10] @ npc_to
SUB    R4, #7
STRH    R4, [R1,#4]

@@ Get ncp_pos_y

ldr r4, var_8006
ldrh r4, [r4]
LDRH    R4, [R0,#0x12] @ npc_to
SUB    R4, #7
STRH    R4, [R1,#6]
MOVS    R0, #0
POP     {R4,R6}
POP     {R0}

var_8004: .word 0x020370C0
var_8005: .word 0x020370C2
var_8006: .word 0x020370C4
saveblock1_mapdata: .word 0x03005008
npc_states: .word 0x02036E38
npc_id_by_local_id_and_map_ret_success:	.word 0x0805DF84 + 1
No sé si lo estoy haciendo bien o mal.
Pero la estructura de los "npc_state" dice que:

0000000C stay_around: coords16 ?
00000010 to: coords16 ?
00000014 from: coords16 ?

Dan las coordenadas x_y de los sprites.
Esto de las estructuras se me da mal, así que, espero su ayuda. :hmm:
 

FEL!X

ᴛᴜ ᴀᴍɪɢᴏ ᴇʟ ᴇsᴘᴀᴅᴀᴄʜíɴ
Usuario de Oro
Hace poco hablando con @FEL!X por Skype surgio una gran idea, hacer un Getspritepos.
Como muchos ya saben, el comando Getplayerpos almacena en un par de variables la posición del player, ahora, imagino lo que se podría hacer si se pudiera almacenar la posición de otro sprite.

He estado investigando algunas cosas, y comparto lo que llevo ya que no tengo ni idea de muchas cosas xD
Yeeeah. Me encanta y más aún ver que lo empiezas a investigar. Puto Invert, que grande. Últimamente estás satisfaciendo mis necesidades scripteras xD.

Un comando getspritepos, en caso de facilitarlo mediante un call podría dar mucha más jugabilidad de lo que parece. El getspritepos lo que haría sería guardar en dos variables la posición X e Y de un NPC del juego. Nos puede ser útil para definir dos situaciones:

- NPCs estáticos que varían su posición por efecto del jugador. (Por ejemplo, rocas: con este comando podríamos facilitar ciertos puzles sin usar el sistema de variables de la calle victoria)

- NPCs con un hábito de movimiento. Éste es más interesante aún, ver qué sucede dependiendo de la posición de un mini en movimiento. Se pueden hacer scripts interesantes con ello, scripts semi-temporales por así decirlo.

Imaginaos un sprite con comportamiento caminar en sentido del reloj ( 4 pasos) y un script de gatillo con un getspritepos que analice la posición del mini la cual variará temporalmente debido a cada paso.

El mini lo dejamos oculto y hacemos un paso con llamas que salen y se ocultan (tiles animados acorde a la velocidad de los pasos del mini, con 2 frames de fuego y 2 de sin fuego). Podemos hacer un compare para determinar la situación (Pos del mini=Situación del tile) para que cuando pise, si hay fuego se queme y tire un paso atrás y si no pues que tire u paso para adelante. Es decir hacer varios resultados dependiendo de la posición in-game del mini.

Son ejemplos de posibles scripts que se pueden hacer mediante el comando. Tienen sus pros y sus contras pero son bastante interesantes.

Bueno, un abrazo Invert. Te deseo que tengas suerte. Me mola mucho como puede tomar forma el asunto. ¡A tope bro! :awesome::awesome::awesome:
 

Invert

why so serious?
Holis ;)
Hoy he terminado el código y todo gracias a @jiangzhengwenjz por explicarme absolutamente todo sobre las estructuras.
Aquí está:

Código:
.code 16
push {lr}
ldr r0, =0x20370c0 @var_8004
ldrh r0, [r0] @localid
ldr r1, =0x3005008 @saveblock1
ldr r1, [r1]
ldrb r2, [r1, #4] @bank
ldrb r1, [r1, #5] @map
ldr r3, =0x805DF61 NPC_id_by_local_id
bl bx_r3
ldr r1, =0x2036E38 NPC_state
mov r2, #0x24
mul r2, r0
add r0, r1, r2
ldrh r1, [r0, #0x12] @y
ldrh r0, [r0, #0x10] @x
sub r0, #0x7
sub r1, #0x7
ldr r2, =0x20370c0 @var_8004
strh r0, [r2, #2] @var_8005
strh r1, [r2, #4] @var_8006
pop {pc}
.ltorg
bx_r3: bx r3
Su modo de uso es:
setvar 0x8004 0xID NCP (Es el numero de la persona)
callasm 0x

El codigo almacenará las posiciones x(var 8005) y (var 8006) en las variables.
Como dijo @FEL!X antes, puede ser de mucha ayuda para hacer eventos grandes.
 

Dani_SR_17

¡Pokémon LionHeart!
Me renta muy, muy, muy mucho esto, es algo que siempre he echado en falta la verdad.

¿Funciona si el personaje esta fuera de pantalla o invisible?
 

Dr._Seuss

Average RomHacker
Gran investigación, no voy a usarlo porque no se me ocurre como podría servirme, pero me parece genial que hagan rutinas molonas como estas, sigue así tio c:
 

Nacho

Nadando hasta la otra orilla
gran investigación, olvidada como muchas, pabel aportaste mucho en tu actividad, lastima que no estés activo.
creo que la usaré para los script que nombrar FELIX (que tambien tenia muy buenas ideas y es tambien una lástima que estuviera retirado ). Enahorabuena a revivir estos métodos y crear buenas mecanicas nuevas!

felicidades!
 

Nacho

Nadando hasta la otra orilla
He estado, viendo el posible uso de esa rutina, y me queda perfecto para una idea que tengo. Pero me ha entrado una duda. Una pregunta para los que saben más de ASM.

¿Qué tan dificil sería en vez de determinar la posición XY de un OBJ, que fuera otro diferente al MINI, como por ejemplo un sprite cargado a la OAM (create sprite, por alguna rutina de mugshot, por showpokepic, etc.)

Determinar las posiciones en el mapa de distintos OBJ sería ideal.

dejo link de interés:

creación de un OBJ
https://www.pokecommunity.com/showthread.php?t=318279

estructura del OBJ
https://problemkaputt.de/gbatek.htm#lcdobjoverview
 
Arriba