Página 1 de 2

[GTA-PS2] Scripts

Enviado: 31 Dez 2018, 11:09
por DanielSantos
Índice de tutoriais

1. Tudo dentro do possível...

Estou reescrevendo este tutorial, pois percebi que exitem pouquíssimos tutoriais de main.scm pela internet, e os que existem, não são satisfatórios, então resolvi fazer o meu próprio, mas você também precisa fazer um esforço para as coisas darem certo, portanto, irei passar os requisitos mínimos para que possamos seguir com o tutorial.
Requisitos mínimos:

Um PC qualquer
Um PS2
Ler e entender os tutoriais de Sanny Builder

Para um melhor entendimento e aplicação, também irei passar os requisitos recomendados:

Um PC que rode o emulador de PS2
Ler e entender os tutoriais de Sanny Builder
Ler e entender os tutoriais de GTA3Script
Ler e entender o Learn GTA3Script in Y minutes.
Note que removi a necessidade de um PS2, caso você tenha um computador razoável que rode o PCSX2, isso facilita e deixa os testes muito mais rápidos, e antes que me venha falar que o emulador não é o PS2, saiba que ele foi feito para funcionar com o PS2, inclusive a "BIOS" usada neles é extraída de consoles reais, ou seja, o que de mod não funciona no emulador, não funciona no PS2, ponto.

2. Colocando as coisas na prática

Existem dois métodos para criação de scripts para PS2, utilizando Sanny Builder ou Visual Studio Code, para qualquer um dos casos, os tutoriais estão linkados no trecho abaixo de "requisitos recomendados". Mas pera aí, Daniel, por qual motivo você está indicando tutoriais de CLEO Scripting, sendo que o GTA San Andreas de Playstation 2 ainda não possui uma biblioteca CLEO? A Biblioteca CLEO (erroneamente chamada de livraria, falso cognato) adiciona apenas cerca de 100 opcodes para facilitar e aumentar as possibilidades para mods, mas é uma ínfima quantidade comparada a quantidade de opcodes originais, pouco mais de 2300, então, dependendo do tipo e nível de complexidade do mod que deseja criar/portar, o uso de Opcodes CLEO não é algo absolutamente necessário.


Mas afinal, quais são esses opcodes que não podemos utilizar?

Opcodes que fazem parte da CLEO, e também os específicos para o PC e Xbox. Fiz uma lista, vou por em spoiler abaixo, pois ela é imensa:
Opcodes que não podem ser utilizados pelo PS2Abrir
  • 0A49:  is_xbox_version
  • 0A4A: get_pc_mouse_movement 201@ 202@
  • 0A4B:   is_pc_using_joypad
  • 0A4C:   is_mouse_using_vertical_inversion
  • 0A4D:   is_japanese_version
  • 0A4E:   is_xbox_player2_pressing_start
  • 0A8C: write_memory 0xC0BC15 size 1 val 1 vp 0
  • 0A8D: read_memory 1@ size 4 vp 0 store_to 0@
  • 0A8E: 4@ = 5@ + 6@
  • 0A8F: 4@ = 1@(0@,2i) - 1
  • 0A90: 30@ = 100 * 1@
  • 0A91: 0@ = 8 / 2
  • 0A92: start_new_custom_script "ShowTextBox.s"
  • 0A93: terminate_this_custom_script
  • 0A94: launch_custom_mission "missions\Custom\Mission1"
  • 0A95: save_this_custom_script
  • 0A96: get_char_pointer $PLAYER_ACTOR store_to 0@
  • 0A97: get_car_pointer 0@ store_to 1@
  • 0A98: get_object_pointer 0@ store_to 1@
  • 0A99: chdir 0
  • 0A9A:   open_file "settings.ini" mode 0x72 store_to 0@
  • 0A9B: close_file 0@
  • 0A9C: get_file_size 0@ store_to 1@
  • 0A9D: read_from_file 0@ size 2 store_to 1@
  • 0A9E: write_to_file 0@ size 128 from 0@
  • 0A9F: get_this_script_struct 0@
  • 0AA0: else_gosub @CREATE_NEW_ACTOR
  • 0AA1: else_return
  • 0AA2:   load_dynamic_library "CLEO\version.dll" store_to 0@
  • 0AA3: free_dynamic_library 0@
  • 0AA4:   get_dynamic_library_procedure "GetVersion" library 0@ store_to 1@
  • 0AA5: call_function 0@ num_params 1 pop 1 params 1@
  • 0AA6: call_method 0x6A3440 struct 0@ num_params 0 pop 0
  • 0AA7: call_function_return 0x569660 num_params 2 pop 2 0@ 1@ store_to 2@
  • 0AA8: call_method_return 0x4048E0 struct 0xB74494 num_params 1 pop 0 params 0@ store_to 1@
  • 0AA9:    is_game_version_original
  • 0AAA: get_script_struct_named 'OTB' store_to 0@
  • 0AAB:   does_file_exist "cleo\version.dll"
  • 0AAC: load_audio_stream "CLEO\playlist\1.mp3" store_to $hMP3
  • 0AAD: set_audio_stream_state $hMP3 to 1
  • 0AAE: release_audio_stream $hMP3
  • 0AAF: get_audio_stream_length $hMP3 store_to 0@
  • 0AB0:   is_key_pressed 0x73
  • 0AB1: call @GetSQR 1 10 store_to 0@
  • 0AB2: ret 1 0@
  • 0AB3: set_cleo_shared_var 0 to 10
  • 0AB4: get_shared_cleo_var 0 store_to 0@
  • 0AB5: store_closest_entities $PLAYER_ACTOR vehicle_to 0@ ped_to 1@
  • 0AB6: get_target_blip_coordinates 0@ 1@ 2@
  • 0AB7: get_car_number_of_gears 0@ store_to 10@
  • 0AB8: get_car_current_gear $CAR store_to 11@
  • 0AB9: get_audio_stream_state 0@ store_to 7@
  • 0ABA: terminate_all_custom_scripts_with_this_name 'BENZIN'
  • 0ABB: get_audio_stream_volume $hMP3 store_to 0@
  • 0ABC: set_audio_stream_volume $hMP3 to 0@
  • 0ABD:   is_car_siren_on 0@
  • 0ABE:   is_car_engine_on 0@
  • 0ABF: cleo_switch_car_engine 0@ to 0
  • 0AC0: set_audio_stream_looped $hMP3 to 1
  • 0AC1: load_3d_audio_stream "sample.mp3" store_to 0@
  • 0AC2: set_play_3d_audio_stream_at_coordinates $hMP3 to 0@ 1@ 2@
  • 0AC3: set_play_3d_audio_stream_at_object $hMP3 object $object
  • 0AC4: set_play_3d_audio_stream_at_char 0@ char 1@
  • 0AC5: set_play_3d_audio_stream_at_car 0@ car 1@
  • 0AC6: get_label_pointer @label store_to 0@
  • 0AC7: get_var_pointer 0@ store_to 0@
  • 0AC8: allocate_memory 260 store_to 0@
  • 0AC9: free_memory 0@
  • 0ACA: print_help_string 0@v
  • 0ACB: print_big_string 0@v time 1000 style 1
  • 0ACC: print_string 0x969110 time 100
  • 0ACD: print_string_now 0x969110 time 100
  • 0ACE: print_help_formatted "This is %.4X opcode" 0x0ACE
  • 0ACF: print_big_formatted "This is %.4X opcode" time 2000 style 1 0x0ACF
  • 0AD0: print_formatted "This is %.4X opcode" time 2000 0x0AD0
  • 0AD1: print_formatted_now "This is %.4X opcode" time 2000 0x0AD1
  • 0AD2:   get_char_player_is_targeting $PLAYER_CHAR store_to 0@
  • 0AD3: string_format 0@v format "%d + %d = %d" 2 2 4
  • 0AD4:   scan_string 0@v format "%d + %d = %d" store_num_results_to 4@ 5@ 6@ 7@
  • 0AD5:   file_seek $hFile offset 0x10 origin 1
  • 0AD6:   is_end_of_file_reached 0@
  • 0AD7:   read_string_from_file 0@ to 1@v size 15
  • 0AD8:   write_string_to_file $hFile string 0@v
  • 0AD9: write_formatted_string_to_file 0@ format "CLEO version: %d.%d.%d.%d" 4 0 0 1
  • 0ADA:   scan_file 0@ format "CLEO version: %d.%d.%d.%d" store_num_results_to 0@ 0@ 1@ 2@ 3@
  • 0ADB: get_name_of_vehicle_model #LANDSTAL store_to 0@v
  • 0ADC:   test_cheat "BLOWUP"
  • 0ADD: spawn_vehicle_by_cheating #RHINO
  • 0ADE: get_text_label_string 0@v store_to 0@
  • 0ADF: add_text_label "_TEST" text "Test string"
  • 0AE0: remove_text_label "_TEST"
  • 0AE1:   find_all_random_chars_in_sphere 0@ 1@ 2@ radius 10.0 find_next 1 skip_dead 1 store_to 3@
  • 0AE2:   find_all_random_vehicles_in_sphere 0@ 1@ 2@ radius 10.0 find_next 1 skip_dead 1 store_to 3@
  • 0AE3:   find_all_random_objects_in_sphere 0@ 1@ 2@ radius 10.0 find_next 1 store_to 3@
  • 0AE4:   does_directory_exist "CLEO\CLEO_INI"
  • 0AE5:   create_directory "CLEO\CLEO_INI"
  • 0AE6:   find_first_file "CLEO\*.cs" store_search_to 0@ store_filename_to 1@v
  • 0AE7:   find_next_file 0@ store_to 1@v
  • 0AE8: find_close 0@
  • 0AE9: pop_float 0@
  • 0AEA: get_char_pointer_handle 0@ store_to 1@
  • 0AEB: get_vehicle_pointer_handle 0@ store_to 1@
  • 0AEC: get_object_pointer_handle 0@ store_to 1@
  • 0AED: string_float_format 0@ format "%.15g" store_to 1@v
  • 0AEE: exp 2.0 base 0.5 store_to 0@
  • 0AEF: log 10.0 base 2.718281828459045 store_to 0@
  • 0AF0: read_int_from_ini_file "cleo\config.ini" section "SectionName" key "intKey" store_to 0@
  • 0AF1: write_int_to_ini_file 16 path "cleo\config.ini" section "SectionName" key "intKey"
  • 0AF2: read_float_from_ini_file "cleo\config.ini" section "SectionName" key "floatKey" store_to 0@
  • 0AF3: write_float_to_ini_file 0.0 path "cleo\config.ini" section "SectionName" key "floatKey"
  • 0AF4: read_string_from_ini_file "cleo\config.ini" section "SectionName" key "string" store_to 0@v
  • 0AF5: write_string_to_ini_file "new string value" path "cleo\config.ini" section "SectionName" key "stringKey"
  • 0B00:   delete_file "CLEO\log.txt"
  • 0B01:   delete_directory "CLEO\CLEO_SAVES" include_subdirs 0
  • 0B02:   move_file "CLEO\1.txt" to "CLEO\2.txt"
  • 0B03:   move_directory "CLEO\dir1" to "CLEO\dir2"
  • 0B04:   copy_file "CLEO\1.txt" to "CLEO\2.txt"
  • 0B05:   copy_directory "CLEO\dir1" to "CLEO\dir2"
  • 0B10: bitwise_and 0@ and 0xFF store_to 0@
  • 0B11: bitwise_or 0@ or 0x80 store_to 0@
  • 0B12: bitwise_xor 1@ xor 1 store_to 0@
  • 0B13: bitwise_not 0@ store_to 0@
  • 0B14: modulo 0@ mod 5 store_to 0@
  • 0B15: bitwise_shr 0@ shr 8 store_to 0@
  • 0B16: bitwise_shl 0@ shl 8 store_to 0@
  • 0B20: read_clipboard_data 0@ size 27
  • 0B21: write_clipboard_data 0x969110 size 28

Mesmo com essa lista em mãos, a possibilidade de colocar um opcode errado e crashar seu game é grande,  portanto, eu(Daniel69) editei a versão mais recente do Sanny Builder e adicionei mais um "game" na lista inferior direita, o "GTA SA PS2". Com esse modo, você vai poder compilar qualquer código dentro do main.scm do PS2, e caso tenha algum opcode que o PS2 não leia, o Sanny Builder irá gerar um erro e parar o marcador direto no opcode não suportado. NÃO RECOMENDO DESCOMPILAR SCRIPTS USANDO ESTE MODO, para descompilar, use o modo GTA SA SCR, pois não dará nenhum erro na hora de descompilar scripts com comandos CLEO.
 
Imagem
Acho que já enrolei demais nessa parte, vamos pegar alguma situação prática.
 
 

Código: Selecionar tudo

03A4: script_name "VCAMRIV"

:VCAMRIV_11
0001: wait 0
00D6: if
0256:   is_player_playing $PLAYER_CHAR
004D: goto_if_false @VCAMRIV_11
0001: wait 0
00D6: if
80DF:   not is_char_in_any_car $PLAYER_ACTOR
004D: goto_if_false @VCAMRIV_11
0001: wait 0
00D6: if
8818:   not is_char_in_air $PLAYER_ACTOR
004D: goto_if_false @VCAMRIV_11
0002: goto @VCAMRIV_78

:VCAMRIV_78
0001: wait 0
00D6: if
0256:   is_player_playing $PLAYER_ACTOR
004D: goto_if_false @VCAMRIV_78
00D6: if and
80DF:   not is_char_in_any_car $PLAYER_ACTOR
86B9:   not has_cutscene_loaded
004D: goto_if_false @VCAMRIV_78
0819: get_char_height_above_ground $PLAYER_ACTOR store_to 10@
00D6: if or
8031:   not  10@ >= 5.0
0A0C:   is_player_using_jetpack $PLAYER_CHAR
004D: goto_if_false @VCAMRIV_78
04C4: get_offset_from_char_in_world_coords $PLAYER_ACTOR offset 0.27 0.2 0.5 store_to 1@ 2@ 3@
0920: camera_set_vector_track 1@ 2@ 3@ to 1@ 2@ 3@ time 100 ease 2
0922: camera_set_lerp_fov 70.0 to 70.0 time 2000 ease 2
00D6: if and
00E1:   is_button_pressed 0 button 6
8A0C:   not is_player_using_jetpack $PLAYER_CHAR
004D: goto_if_false @VCAMRIV_78
00D6: if and
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 1
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 2
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 3
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 4
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 5
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 6
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 7
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 8
004D: goto_if_false @VCAMRIV_78
00D6: if and
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 9
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 10
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 11
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 12
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 13
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 14
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 15
004D: goto_if_false @VCAMRIV_78
00D6: if and
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 16
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 17
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 18
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 39
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 40
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 44
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 45
82D8:   not is_char_holding_weapon $PLAYER_ACTOR weapon 46
004D: goto_if_false @VCAMRIV_78
0002: goto @VCAMRIV_443

:VCAMRIV_443
0925: camera_reset_new_scriptables
0002: goto @VCAMRIV_78
O utilizado como exemplo é um script simples que altera a posição da câmera, ele é tão simples que nem chega a usar opcodes da CLEO, mas então, como vamos colocar ele no PS2?

Primeiramente,  mude o modo para GTA SA PS2

Após isso, abra o main.scm e procure "start_new_script", e após encontrar, crie mais um com o seu mod, dessa forma:

Imagem

Depois disso, procure o último script, no meu caso, o :NONAME_2 vá até o fim dele, crie a label do seu mod e cole ele logo abaixo, ficando mais ou menos assim:

Imagem

Agora, só compilar o main.scm com o botão F6 ou na barra de ferramentas, e seja feliz ;)
 
Adendo 1:

Aqui abaixo, vou por alguns opcodes CLEO que você pode substituir por convencionais, então, essa parte será atualizada com o passar do tempo.

0A93: terminate_this_custom_script
para
004E: terminate_this_script


0AB0:   key_pressed 73
para
00E1: is_button_pressed 0 button 16
(Tabela de botões aqui)

Re: [GTA-PS2] Scripts

Enviado: 29 Jan 2019, 10:43
por VINICIAAO
Daniel69 EU Descobri Que Da Para Colocar os Efeitos(EFFECTS) de PC no PS2
Mas Tem Que Mexer no TXD o Ruim Que Fica Bugado(Ou eu Que Sou Burro)

Ps. Testei no Emulador, Usei o Overdose Effects

Re: [GTA-PS2] Scripts

Enviado: 02 Fev 2019, 20:15
por DanielSantos
VINICIAAO escreveu:
29 Jan 2019, 10:43
Daniel69 EU Descobri Que Da Para Colocar os Efeitos(EFFECTS) de PC no PS2
Mas Tem Que Mexer no TXD o Ruim Que Fica Bugado(Ou eu Que Sou Burro)

Ps. Testei no Emulador, Usei o Overdose Effects
Se fica muito bugado significa que ainda não é viável, vou testar depois

Re: [GTA-PS2] Scripts

Enviado: 07 Mar 2019, 02:04
por Nex'
Também não há porque fazer uma CLEO para PS2 tendo em vista os problemas da mesma no PC. Melhor partir para algo como o MoonLoader.

Re: [GTA-PS2] Scripts

Enviado: 07 Mar 2019, 02:29
por Junior_Djjr
Nex' escreveu:
07 Mar 2019, 02:04
Também não há porque fazer uma CLEO para PS2 tendo em vista os problemas da mesma no PC. Melhor partir para algo como o MoonLoader.
:peepo1:
"Não vale a pena fazer algo quase impossível, é melhor partir pra algo impossível".

Re: [GTA-PS2] Scripts

Enviado: 07 Mar 2019, 02:43
por DanielSantos
Junior_Djjr escreveu:
07 Mar 2019, 02:29
Nex' escreveu:
07 Mar 2019, 02:04
Também não há porque fazer uma CLEO para PS2 tendo em vista os problemas da mesma no PC. Melhor partir para algo como o MoonLoader.
:peepo1:
"Não vale a pena fazer algo quase impossível, é melhor partir pra algo impossível".
Se tá sendo difícil implementar a Cleo no PS2 (que foi uma das primeiras no PC), imagina LUA, que ainda nem tem suporte completo

Re: [GTA-PS2] Scripts

Enviado: 07 Mar 2019, 03:03
por Junior_Djjr
Daniel69 escreveu:
07 Mar 2019, 02:43
Junior_Djjr escreveu:
07 Mar 2019, 02:29
Nex' escreveu:
07 Mar 2019, 02:04
Também não há porque fazer uma CLEO para PS2 tendo em vista os problemas da mesma no PC. Melhor partir para algo como o MoonLoader.
:peepo1:
"Não vale a pena fazer algo quase impossível, é melhor partir pra algo impossível".
Se tá sendo difícil implementar a Cleo no PS2 (que foi uma das primeiras no PC), imagina LUA, que ainda nem tem suporte completo
CLEO já tem tudo o que precisa pronto no sistema do jogo, enquanto Lua (não é LUA, tem uma página no site oficial da Lua falando disso kkk) precisaria colocar todo o suporte para o PS2 rodar (que é um processador completamente diferente).

A única coisa que precisa pro modding de PS2 dar um UP, é uma CLEO que tenha no mínimo opcodes de chamar funções (call), só, mesmo read e write memory dá para improvisar só usando variáveis, mas call é impossível, e se fosse possível, poderíamos chamar qualquer função do jogo, isto é muito poderoso.

Re: [GTA-PS2] Scripts

Enviado: 07 Mar 2019, 23:02
por Nex'
Eu penso que a dificuldade é a mesma, tanto para implementar algo como a CLEO ou algo como MoonLoader você precisa fazer hooks no jogo.

Você pode pensar: CLEO é mais fácil pois já utiliza a engine de scripts do jogo!

Sim, mas isso apenas para os opcodes originais do jogo. Para adicionar novos opcodes é o praticamente a mesma dificuldade em qualquer dos casos, só dar uma olhada no source da CLEO e do LuaHooker do Fábio por exemplo.
Junior_Djjr escreveu:enquanto Lua (não é LUA, tem uma página no site oficial da Lua falando disso kkk) precisaria colocar todo o suporte para o PS2 rodar (que é um processador completamente diferente).
Site do Lua escreveu:Lua é portátil
Lua é distribuída via um pequeno pacote e compila sem modificações em todas as plataformas que têm um compilador C padrão. Lua roda em todos os tipos de Unix e Windows, e também em dispositivos móveis (usando Android, iOS, BREW, Symbian, Windows Phone), em microprocessadores embutidos (como ARM e Rabbit, para aplicações como Lego MindStorms), e até mainframes IBM.

Acho que impossível é encontrar algo que não esteja apto a rodar Lua.

Re: [GTA-PS2] Scripts

Enviado: 08 Mar 2019, 09:09
por Junior_Djjr
Eu sei como é adicionar novos opcodes e eu já tentei recriar a CLEO 1 no PS2 (exceto os opcodes ainda), só que a gente ainda não testou (e faz tempão já).

O que você disse é incomparável, CLEO é um absurdo de fácil, no próprio executável onde é processado os opcodes há um espaço para adicionar um redirecionamento para ler seus opcodes adicionais. Isto se faz com poucas linhas no main.scm. Lembrando que praticamente a única coisa que precisa para ter um modding bom são opcodes de call, só isto já dá para fazer MUITA coisa no jogo (read e write também, pois o modo gambiarra de manipular memória não tem a quebra de proteção, assim complica se quer fazer NOP por exemplo), e é o objetivo principal aqui, não precisa gastar tempo com um sistema novo feito do zero só pra isso (e realmente poucos vão modificar o PS2).

Re: [GTA-PS2] Scripts

Enviado: 08 Mar 2019, 12:54
por DanielSantos
Irei testar o código depois, só falta achar um espaço no código, mas antes eu pretendo terminar o modloader/asi loader

Re: [GTA-PS2] Scripts

Enviado: 09 Mar 2019, 09:43
por Junior_Djjr
Daniel69 escreveu:
08 Mar 2019, 12:54
só falta achar um espaço no código
Que espaço?

Re: [GTA-PS2] Scripts

Enviado: 09 Mar 2019, 10:49
por DanielSantos
Junior_Djjr escreveu:
09 Mar 2019, 09:43
Daniel69 escreveu:
08 Mar 2019, 12:54
só falta achar um espaço no código
Que espaço?

Confundi o código do scm com código do elf

Re: [GTA-PS2] Scripts

Enviado: 09 Mar 2019, 13:42
por Diogo Santos
Eu não entendo como funciona isso de adicionar o Cleo no gta de ps2 e tals, mas ae, no ps2 tinham aqueles games shark, game genie/code breaker uns elfs de por trapaças, aquilo poderia ser útil para algo assim?

Re: [GTA-PS2] Scripts

Enviado: 09 Mar 2019, 17:27
por DanielSantos
Diogo Santos escreveu:
09 Mar 2019, 13:42
Eu não entendo como funciona isso de adicionar o Cleo no gta de ps2 e tals, mas ae, no ps2 tinham aqueles games shark, game genie/code breaker uns elfs de por trapaças, aquilo poderia ser útil para algo assim?

Antes era, hoje não mais, pois já existem formas de alterar o código em tempo real nos testes

Re: [GTA-PS2] Scripts

Enviado: 11 Out 2019, 10:31
por MR GALO
Ainda Acredito Que Um Dia Pode Ser Possivel Implementar Uma Livraria Cleo No Ps2,Os Carros Do GTA PS2 Deixou De Ser Um Mito Graças Ao Daniel69 e Os Demais Que Ajudaram,Ainda Acredito Na Livraria Cleo PS2.