1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Soft Как реализовано управление в demo-режиме в играх

Тема в разделе "Hard & Soft", создана пользователем Kristobal Hozevich Hunta, 13 янв 2024.

  1. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.254
    Уже на Спектрумах, Атари и в первых PC-играх были демо-уровни, где действиями главного героя управляет не пользователь, а сама игра.

    Например, в первой Prince of Persia модель игрока сама проходит демо-уровень.
    В игре International Karate в демо-режиме движениями обоих бойцов управляет компьютер.

    А как это было реализовано?

    Сначала я решил, что в демо-режиме игра направляет заранее рассчитанную последовательность байт в порт клавиатуры, имитируя таким образом управление моделью главного героя.

    Разбираясь с этим вопросом, я наткнулся на интересное обсуждение.

    Вот несколько цитат оттуда:

    Пытался найти подробнее про [fake player input], а также представить, как это работает на уровне ассемблера, но что-то материалов маловато.

    В современных движках упоминается также [simulate input events], но там специфичный код и разобраться сложновато.

    Думал дизассемблировать Принца, но вряд ли осилю без подсказки.

    У кого-то есть простые примеры?
     
    Последнее редактирование: 13 янв 2024
    Depressor и mcrstar нравится это.
  2. oFF_rus .

    oFF_rus

    Legacy

    Регистрация:
    25 фев 2007
    Сообщения:
    2.149
    Есть результаты дизассемблирования от некоего David:
    Modifications to prince.exe (hex editing) - Prince of Persia - нужен pop1_ida.zip

    По поводу управления принцем в демо режиме там находится следующее:
    Код:
    seg002:0F3F ; ███████████████ S	U B R O	U T I N	E ███████████████████████████████████████
    seg002:0F3F 
    seg002:0F3F ; Attributes: bp-based frame
    seg002:0F3F 
    seg002:0F3F do_demo_moves   proc far		    ; CODE XREF: level5_shadow+39p
    seg002:0F3F					    ; do_demo+36P
    seg002:0F3F 
    seg002:0F3F curr_move	    = word ptr -4
    seg002:0F3F demoindex	    = word ptr -2
    seg002:0F3F address	    = word ptr	6
    
    Здесь интересно то, что эта функция используется для демо-уровня, а также для управления тенью принца в 5 уровне (как я понимаю, это то место где тень реально много движется и выпивает бутылку апгрейда жизней быстрее чем принц успевает до неё добежать).

    Конкретно для демо-уровня в функцию передаётся ссылка на записанные команды управления принцем:
    Код:
    seg006:0D7B loc_7A2B:				    ; CODE XREF: do_demo+1Dj
    seg006:0D7B		    mov	    ax,	offset demo_moves
    seg006:0D7E		    push    ax
    seg006:0D7F		    call    do_demo_moves
    
    Сами команды лежат вместе с прочими данными в самом исполняемом файле:
    Код:
    data:0F22 demo_moves	  dw	  0,	 0	  ; DATA XREF: do_demo+32o
    data:0F22		  dw	  1,	 1
    data:0F22		  dw	0Dh,	 0
    data:0F22		  dw	1Eh,	 1
    data:0F22		  dw	25h,	 5
    data:0F22		  dw	2Fh,	 0
    data:0F22		  dw	30h,	 1
    data:0F22		  dw	41h,	 0
    data:0F22		  dw	49h,	 2
    data:0F22		  dw	4Bh,	 0
    data:0F22		  dw	63h,	 2
    data:0F22		  dw	64h,	 0
    data:0F22		  dw	73h,	 5
    data:0F22		  dw	80h,	 6
    data:0F22		  dw	88h,	 3
    data:0F22		  dw	9Dh,	 7
    data:0F22		  dw	9Eh,	 0
    data:0F22		  dw	9Fh,	 1
    data:0F22		  dw   0ABh,	 4
    data:0F22		  dw   0B1h,	 0
    data:0F22		  dw   0B2h,	 1
    data:0F22		  dw   0BCh,	 0
    data:0F22		  dw   0C1h,	 1
    data:0F22		  dw   0CDh,	 0
    data:0F22		  dw   0E9h,0FFFFh
    
    Как я понял, тут пары чисел. Первое число - момент времени, второе число - нужное действие.

    Действия записываются в некоторые переменные:

    Код:
    seg002:0FD7 loc_4657:				    ; CODE XREF: do_demo_moves+90j
    seg002:0FD7		    cmp	    [bp+curr_move], 5
    seg002:0FDB		    jnz	    loc_4663
    seg002:0FDD		    push    cs
    seg002:0FDE		    call    near ptr move_3_up
    seg002:0FE1		    jmp	    short loc_462D
    
    Код:
    seg002:0735 ; ███████████████ S	U B R O	U T I N	E ███████████████████████████████████████
    seg002:0735 
    seg002:0735 
    seg002:0735 move_3_up	    proc far		    ; CODE XREF: guard_block+4Fp
    seg002:0735					    ; do_demo_moves+87p ...
    seg002:0735		    mov	    al,	0FFh
    seg002:0737		    mov	    control_y, al
    seg002:073A		    mov	    control_up,	al
    seg002:073D		    retf
    seg002:073D move_3_up	    endp
    
    и уже в разных местах кода от текущего состояния этих переменных активируются различные действия принца.
     
    Virgil и Kristobal Hozevich Hunta нравится это.
  3. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.254
    @oFF_rus, "Неплохо, хороший товар!" :drink:

    Спасибо, уже смотрю.

    Для начала поменяю здесь :cunning:

    1.png
     
    Последнее редактирование: 15 янв 2024
  4. TBAPb MIA

    TBAPb

    Legacy

    Регистрация:
    26 сен 2005
    Сообщения:
    2.054
    Можно и стоя в гамаке кое-что делать. Зачем в клавиатурный порт-то?
    У игры уже есть функции управления персонажем, минуем весь цирк с опросом клавиатуры и напрямую фигачим в движок "давай туда, сюда, прыг, скок".
     
    Kristobal Hozevich Hunta нравится это.
  5. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.254
    Вот при такой последовательности принц постоит, подумает, скажет "Да ну нафиг", развернется и попробует сбежать, но на входе в демо-уровень будет убит, вероятно, неким killing floor :crazy:

    2.png

    Возможно, показалось, но при долгом ожидании (загрузили и не трогаем клавиатуру, смотрим демо несколько раз подряд) получаем разные концовки (это в оригинале).

    --- добавлено 15 янв 2024, предыдущее сообщение размещено: 15 янв 2024 ---
    Ну это были общие размышления на тему имитации присутствия пользователя.
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление