You are not logged in.
Я немного переделал исходники, чтоб плеер работал в GTA 3 и VC. В текущей версии всё работает точно так же, как и в SA, а также добавлена возможность моментально завершить игру нажатием кнопки End.
Установка проста - radio.asi кидаем в корневую директорию игры, radio.ini в папку CLEO.
По умолчанию кнопки управления в radio.ini настроены так:
1 2 3 4 5 6 7 8 9 10 11 | [keys] key_on= 123 //F12 - включить/выключить key_prev= 120 //F9 - предыдущий трек в списке key_next= 121 //F10 - следующий трек в списке key_pause= 119 //F8 - пауза key_shuffle= 122 //F11 - режим перемешивания (треки будут играть в случайном порядке) key_end= 35 //END - завершение процесса игры [playlist] C:\Users\13\Music\OST Midnight Club L.A\Electronic\Midnight Madness.mp 3 C:\Users\13\Music\GTA 4 TBoGT OST\Vice City FM |
В разделе [playlist] указываются имена треков или папок с mp3.
Видео - http://www.youtube.com/watch?v=K9rulG_AeSY
Скачать - http://www.sendspace.com/file/7mwd3j
Скачать - http://www.sendspace.com/file/nonvcp
Last edited by Sergey81 (14-03-2011 18:58)
Offline
Сообщения сделать в принципе можно, я даже нашёл необходимые адреса, но функция ShowTextBox в SA отличается от аналогичной функции VC, я так и не разобрался как её правильно переделать в Delphi(может посмотрит кто?).
Я не смотрел, но скорее всего ты используешь тип PAnsiChar для передачи строки. Попробуй PWideChar (ну или какой там тип для юникода - я уже не помню). В Delphi, вообще говоря, принято использовать просто тип PChar или String, но в последних версиях Delphi этим типам соответствуют юникодные реализации, а в любимом многими Delphi 7 - ANSI реализации. Когда требуется делать какие-то низкоуровневые операции, на эти различия нужно обращать внимание.
Last edited by Alien (13-03-2011 18:14)
Offline
@Alien - Там загвоздка, насколько я могу судить, даже не в этом.
SanApi.pas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | unit SanApi; interface uses Windows; function KeyPressed( const Key: Smallint): Boolean; stdcall; var ShowTextBox: procedure(Text: PChar; Flag1, Infinite, Flag3: Byte); cdecl; procedure RemoveTextBox; implementation procedure RemoveTextBox; begin ShowTextBox(Nil, 1, 0, 0); end ; function KeyPressed( const Key: Smallint): Boolean; stdcall; begin Result := Hi(GetKeyState(Key))= $FF ; end ; begin if PLongInt(Ptr( $008A6168 ))^ = $465E60 then begin @ShowTextBox := Ptr( $00588BE0 ); end else begin @ShowTextBox := Ptr( $005893B0 ); end ; end . |
Для VC соответственно меняю адреса:
1 2 3 4 5 6 7 8 | if PLongInt(Ptr( $00XXXXXX ))^ = $XXXXXX then begin @ShowTextBox := Ptr( $0055BFC0 ); end else begin @ShowTextBox := Ptr( $0055BFE0 ); end ; |
Вместо XXXXXX можно тот же 55BFC0 подставить, но не суть важно.
В SA функция ShowTextBox вот такая:
1 2 3 4 5 6 7 8 9 10 11 12 13 | .text :00588BE0 _?ShowTextBox proc near ; CODE XREF: _checkCheatcode+D3p .text :00588BE0 ; sub_43DC10+8p .text :00588BE0 ; sub_43DC60+23p .text :00588BE0 ; CGameLogic__update+EBp ... .text :00588BE0 .text :00588BE0 arg_ 0 = dword ptr 4 .text :00588BE0 arg_ 4 = byte ptr 8 .text :00588BE0 arg_ 8 = byte ptr 0Ch .text :00588BE0 arg_C = byte ptr 10h .text :00588BE0 ... .text :00588D3C 000 retn .text :00588D3C _?ShowTextBox endp |
В VC же, такая:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | .text :0055BFC0 ; void __cdecl TextBox(wchar_t *, char, int permanent) .text :0055BFC0 TextBox proc near ; CODE XREF: sub_430A60+12B6p .text :0055BFC0 ; sub_430A60+2E20p .text :0055BFC0 ; CPickup__Process+AFCp .text :0055BFC0 ; CPickup__Process+14DEp ... .text :0055BFC0 .text :0055BFC0 text = dword ptr 4 .text :0055BFC0 arg_ 4 = byte ptr 8 .text :0055BFC0 permanent = dword ptr 0Ch .text :0055BFC0 .text :0055BFC0 000 cmp ds :replayStage , 1 ... .text :0055C1EE 000 retn .text :0055C1EE TextBox endp |
Нужно видоизменить var ShowTextBox в третьей строке и потом все её вызовы, я правильно понимаю?
Last edited by Sergey81 (13-03-2011 22:18)
Offline
О чем я и говорю, в VC используются игровые тексты с шириной символа 2 байта, а в SA - 1 байт. Для SA такое объявление:
1 | ShowTextBox: procedure(Text: PAnsiChar; Flag1, Infinite, Flag3: Byte); cdecl; |
Для VC такое:
1 | ShowTextBox: procedure(Text: PWideChar; Flag1, Infinite: Byte); cdecl; |
Никогда не знал хорошо Delphi, но, погуглив, накопал такой код вызова:
1 | ShowTextBox(PWideChar(WideString( 'string' )), 0, 0) |
PS: кажется, mp3-плеер, использовавшийся Seemann'ом несколько баженный.
Offline
@Alien - Ага, спасибо, всё получилось:
Доделаю поддержку гта 3 и разных версий экзешников, выложу с исходником.
PS: кажется, mp3-плеер, использовавшийся Seemann'ом несколько баженный.
Ну конечно не идеал, например фризы при загрузке трека, иногда бывают вылеты при переключении треков, но, учитывая что под 3 и вайс мп3 плееров насколько я знаю нет вобще, вполне сойдёт.
Я даже потестил ещё с десяток миссий на предмет ошибок IV hud под Vice City FM
UPD. Всё доделал, выложил и обновил первый пост.
Offline
Кхе-кхе, начал я с того, что кинул в трёшку вайсовские файлы, но всё равно плеер завопил так, что кинулся выключать колонки (игра зависла, она вобще так делала, когда плееру "в песнях не везло") и вспомнил, почему его в Сане не использую - а можно использовать не системные настройки громкости, а игры, например?
Вобщем, ярлыки не умеет подхватывать, дал папку, как начинал одну и ту же песню орать, игра зависала... Думал, может много файлов (109) или папок (~6), выкинул папки, начинает на тот же песне и...
Ладно, из плейлиста выдернул около 20 песен, в ини файл вставил, стал прокручивать, на песне (музыка вся на другом разделе того же жёсткого) с русским названием зависло, но только игра, а не музыка! (кнопка END хорошо иногда всё-таки срабатывала!), выкинул из *.ini эту строчку, на
F:\Music\1_Sborka\Tiesto_vsMaxi_jazz-dance4life.mp3
снова, Вайс не смотрел, поздно уже было...
Offline
Странно, версия для GTA 3 внезапно стала вешать игру при нажатии F12. Хотя раньше работала. Зависание явно вызвано функцией показа текст бокса, но что ей опять не нравится я пока не разобрался.
Offline
Странно, версия для GTA 3 внезапно стала вешать игру при нажатии F12. Хотя раньше работала. Зависание явно вызвано функцией показа текст бокса, но что ей опять не нравится я пока не разобрался.
А где у тебя функции обрабатываются в таймере?
Offline