Перейти к содержимому


Фотография

(sfall) дополнения


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 1246

#1081 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 25 ноября 2017 - 17:33

QUOTE (Fakeman)
Почему в сфале не работает ProcessorIdle  — то что тут устанавливаешь значения ни как не влияет на загрузку проца, она всегда 50% да же в главном меню.
В HRP, если установишь данный фикс то там это работает.
QUOTE
;Set a number of milliseconds to idle each input loop in background mode
QUOTE
QUOTE
ProcessorIdle=10
Теперь нормально дружит с опцией HiRes patch CPU_USAGE_FIX=1 или нет?
А раньше не дружил? Просто не было смысла дважды делать одну и ту же работу и использовать совместно. Но по факту никаких побочных проблем не будет.

Оригинальная реализация ProcessorIdle делала идиотскую работу — отдавала тики когда игра была активной, а в фоновом режиме об этом забывала и начинала загружать процессор постоянным опросом клавиатуры. После "! Исправлен функционал переменной ProcessorIdle." всё как и должно быть — в фоновом режиме отдаются тики и загрузка процессора игрой ~0%, а в активном ~50% (с чего бы когда я в игре мне раздавать тики другим процессам).


#1082 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 25 ноября 2017 - 21:23

QUOTE
Исправлен функционал переменной ProcessorIdle." всё как и должно быть — в фоновом режиме отдаются тики и загрузка процессора игрой ~0%, а в активном ~50% (с чего бы когда я в игре мне раздавать тики другим процессам).

В фоновом это когда свернута игра? — не пойму.
В HiRes patch как-то по другому работает — в главном меню практически в 0% в самой игре 50%, а если открыть любой инвентарь то падает до 10%, в общем в HRP эта штука в плане КПД по лучше будет.


#1083 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 28 ноября 2017 - 15:15

QUOTE (Fakeman)
В фоновом это когда свернута игра? — не пойму.
Да.


#1084 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 28 ноября 2017 - 18:40

Есть функция tile_is_visible(int tile) — которая в нынешних реалиях c HRP не корректно работает, да и при ванильном разрешении 640х480 она тоже не совсем правильно работает.
Такой вопрос, можно как-то скриптово там подправить код, что-бы она правильно работала?

Или другой вариант, как скриптово получить значение _tile_center_tile
CODE
mov     ebx, ds:_tile_center_tile

функция tile_set_center(tile)
CODE
Макрос от metarule3(METARULE3_TILE_SET_CENTER, tileNum, 0, 0)

корректно работает при смене разрешения, думаю можно было бы от этой кординаты(_tile_center_tile) самим в скрипте узнавать "видим ли гекс на экране".

Это сообщение отредактировано Fakeman - 28 ноября 2017 | 18:47


#1085 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 28 ноября 2017 - 19:45

QUOTE (Fakeman)
Есть функция tile_is_visible(int tile) — которая в нынешних реалиях c HRP не корректно работает, да и при ванильном разрешении 640х480 она тоже не совсем правильно работает.
Она сделана для 640x480 (5 гексов) и содержит баг (если прошла проверка по x, то игнорируется по y). Но вообще перевод/описание неправильно понимается ("видим ли гекс на экране") — tile видим если не превышает 5 гексов от tile_center_tile. Ну чтобы float'ы от нпс появлялись только когда ГГ близко.

Сама функция tile_is_visible очень простая:
CODE
x := abs(tile_center_tile - tile) % 200;
y := abs(tile_center_tile - tile) / 200;
if x < 5 then return TRUE;
else if y < 5 then return TRUE;
return FALSE;
Вот картинка, только с 2 гексами (вместо "< 5" использовать "< 2"), а tile_center_tile := 402.

QUOTE (Fakeman)
Или другой вариант, как скриптово получить значение _tile_center_tile
read_int(0x66BE34);

Это сообщение отредактировано Crafty - 29 ноября 2017 | 14:10


#1086 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 29 ноября 2017 - 23:50

Спасибо.

Как то говорил тебе о возможности метать гранаты на свободный гекс в объект-дверь.
И вот только сейчас решил попробовать такое реализовать, и такой косяк всплыл, в общем нельзя так просто взять и создать "на лету" объект на карте, он тупо не создается, или создается каким-то таким фантомным, и с таким объектом нельзя взаимодействовать.
Только сейчас понял что объекты создаются, только при заходе на карту в map_enter_p_proc, даже если загружаешь игру из сохранки объект не будет создан.
Там какой-то баг в функции create_object_sid или это специально так устроено в движке?
сам указатель на объект создается, но объект не материализован, не появляется на указанных координатах, его можно передвинуть write(obj + 4, tile), но он просто как картинка сверху карты :)

***Хотя я помню что можно было создавать вот так объекты на карте, че за фигня то проблема с map_exit_proc то теперь с create_object_sid, чем больше копаешься тем больше говна всплывает из движка, кривой движок как моя жизнь))

Может такую фишку можно сделать на уровне движка, или это технически не возможно?

Это сообщение отредактировано Fakeman - 30 ноября 2017 | 00:06


#1087 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 30 ноября 2017 - 00:42

QUOTE (Fakeman)
или создается каким-то таким фантомным, и с таким объектом нельзя взаимодействовать.
set_obj_visibility :-p

QUOTE (Fakeman)
его можно передвинуть write(obj + 4, tile)
move_to ;)


#1088 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 30 ноября 2017 - 01:15

Ну блин кривой движок) Попробовал еще раз, во так работает
CODE
targetObject := create_object_sid(33554434, hex_cursor, 0, -1);
write_int(targetObject + 0x4, hex_cursor); // аля move_to

если конкретно указывать уровень карты нулевой, а если в параметр уровня вписать tile_num(dude_obj) то ни хрена, глючит игру, хотя игрок также на 0 уровне.

***ахах вот я тупанул))) вписал в элеватор, гекс игрока tile_num(dude_obj) — что-то заработался я сегодня...

QUOTE
Жертвы разбегаются после получения дамага от взрыва в дверь и не нападают. Можно и нужно выйти из боя, чтобы напали.

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

И еще как узнать какой текущий режим атаки выбран у оружия в руках.
Т.е. вот эти вот значения режима интересует
CODE
#define ATTACK_MODE_NONE        0
#define ATKMODE_PRI_PUNCH       1
#define ATKMODE_PRI_KICK        2
#define ATKMODE_PRI_SWING       3
#define ATKMODE_PRI_THRUST      4
#define ATKMODE_PRI_THROW       5
#define ATKMODE_PRI_SINGLE      6
#define ATKMODE_PRI_BURST       7
#define ATKMODE_PRI_FLAME       8
#define ATKMODE_SEC_PUNCH      16  // 0x00000010
#define ATKMODE_SEC_KICK       32  // 0x00000020
#define ATKMODE_SEC_SWING      48  // 0x00000030
#define ATKMODE_SEC_THRUST     64  // 0x00000040
#define ATKMODE_SEC_THROW      80  // 0x00000050
#define ATKMODE_SEC_SINGLE     96  // 0x00000060
#define ATKMODE_SEC_BURST     112  // 0x00000070
#define ATKMODE_SEC_FLAME     128  // 0x00000080


Это сообщение отредактировано Fakeman - 30 ноября 2017 | 01:55


#1089 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 30 ноября 2017 - 03:44

QUOTE (Fakeman)
write_int(targetObject + 0x4, hex_cursor); // аля move_to
Лучше всё же move_to, посколько он делает дополнительные необходимые штуки вроде выравнивания уровня света.

QUOTE (Fakeman)
Ага, твари не нападают можно что-то сделать) или пролет как фанера над парижем?
Давай под напряги извилинки, сделаешь будет новая фишка в метании гранат.
Это я уже ничё не помню...

QUOTE (Fakeman)
И еще как узнать какой текущий режим атаки выбран у оружия в руках.
Вообще в бою get_attack_type возвращает ATKTYPE_*.
QUOTE (Fakeman)
Т.е. вот эти вот значения режима интересует
Это битовые значения для определения субтипа оружия в прошниках, можно прочитать get_proto_data(weapon_pid, 0x18) и bwand.


#1090 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 30 ноября 2017 - 04:43

QUOTE
Лучше всё же move_to

да, я так увлекся всякими read/write что забыл что есть move

QUOTE
Вообще в бою get_attack_type возвращает ATKTYPE_*.

Так это другое, и там некоторых режимов нет.
и вообще он какой-то не понятный что значат эти WEP1/2
CODE
#define ATKTYPE_LWEP1           (0)
#define ATKTYPE_LWEP2           (1)
#define ATKTYPE_RWEP1           (2)
#define ATKTYPE_RWEP2           (3)

*** а кажись начинаю догонять — видимо это режим в котором находится оружие — те Primary/Secondary Mode надо будет проверить.

QUOTE
Это битовые значения для определения субтипа оружия в прошниках, можно прочитать get_proto_data(weapon_pid, 0x18) и bwand.

Да не из прошек надо, а из текущего типа атаки установленного у оружия.
Вот есть у оружия два типа SINGLE и BURST как ты узнаешь в каком режиме сейчас оружие. И нужно узнавать до совершения атаки.

QUOTE
Это я уже ничё не помню...

Ну надо вспомнить)
Покажи хоть что ты там на исправлял для дверей.

Это сообщение отредактировано Fakeman - 30 ноября 2017 | 04:50


#1091 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 30 ноября 2017 - 15:50

QUOTE (Fakeman)
и вообще он какой-то не понятный что значат эти WEP1/2
А так:
CODE
hit_left_weapon_primary    = 0
hit_left_weapon_secondary  = 1
hit_right_weapon_primary   = 2
hit_right_weapon_secondary = 3

QUOTE (Fakeman)
Вот есть у оружия два типа SINGLE и BURST как ты узнаешь в каком режиме сейчас оружие.
Если гиморно, то чтение из прошника оружия поля flags_ext и разбор в зависимости от основной/дополнительной атаки. Или использование движковых функций/данных напрямую.
Лучше опиши реальный пример практического использования, от этого и будем плясать.

QUOTE (Fakeman)
Покажи хоть что ты там на исправлял для дверей.
Ничё не помню :(


#1092 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 30 ноября 2017 - 16:08

QUOTE
Лучше опиши реальный пример практического использования, от этого и будем плясать.

Ну вот для этого случая и надо, когда в руке установлена оружие в режим метания.
сейчас для этого используется неправильный способ:
CODE
dmg_type := get_proto_data(pid, PROTO_WP_DMG_TYPE);
attack_mode := get_proto_data(pid, PROTO_IT_FLAGS);
if (dmg_type == DMG_explosion or dmg_type == DMG_fire)
  and ((attack_mode bwand ATKMODE_PRI_THROW) or (attack_mode bwand ATKMODE_SEC_THROW)
   or (attack_mode bwand ATKMODE_PRI_THROW + ATKMODE_SEC_THROW)) then begin

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

+ подскажи где задаются координаты для отладочного окна, оно появляется чуть ли не посредине экрана) я забадался уже его постоянно сдвигать в сторону.

Это сообщение отредактировано Fakeman - 30 ноября 2017 | 19:05


#1093 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 30 ноября 2017 - 20:22

QUOTE (Fakeman)
Ну вот для этого случая и надо, когда в руке установлена оружие в режим метания.
hs_keypress.ssl:
CODE
procedure start;

procedure start begin
 if not init_hook then begin
  variable event := get_sfall_arg, keyDX := get_sfall_arg, keyVK := get_sfall_arg;
  if (keyDX == 0x57) and (event == 0) then begin // F11
   variable hand_data, mode, attack_anim, isSecondary := "";
   hand_data := active_hand * 24 + 0x5970F8;
   mode := read_int(hand_data+16);
   if mode == 2 or mode == 4 then isSecondary := "прицельно ";
   if mode == 1 or mode == 2 then mode := read_int(hand_data+8);
   else if mode == 3 or mode == 4 then mode := read_int(hand_data+12);
   if mode == 5 then display_msg("перезарядка");
   else begin
    attack_anim := call_offset_r2(0x4785DC, dude_obj, mode);
    if attack_anim == 16 then display_msg(isSecondary+"удар рукой");
    else if attack_anim == 17 then display_msg(isSecondary+"удар ногой");
    else if attack_anim == 42 then display_msg(isSecondary+"рубить");
    else if attack_anim == 41 then display_msg(isSecondary+"ткнуть");
    else if attack_anim == 18 then display_msg(isSecondary+"метнуть");
    else if attack_anim == 45 then display_msg(isSecondary+"выстрел");
    else if attack_anim == 46 then display_msg(isSecondary+"очередь");
    else if attack_anim == 47 then display_msg(isSecondary+"огонь");
   end
  end
 end
end

QUOTE (Fakeman)
Ну блин покопайся там в исходниках узнай почему сразу не атакуют, может гдето надо что-то предварительно установить.
Нет смысла сейчас :-p

QUOTE (Fakeman)
+ подскажи где задаются координаты для отладочного окна, оно появляется чуть ли не посредине экрана) я забадался уже его постоянно сдвигать в сторону.
0xCC74D или 0x4DC34D, там 80, и для x и y.


#1094 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 30 ноября 2017 - 22:37

Там по проще функция рядом есть, указываешь указатель на предмет, вместо игрока.
CODE
item_w_anim_weap_

А что за mode требуется? что-то с ним какие-то сложные расчеты, в чем его смысл?

QUOTE
Нет смысла сейчас :-p

Что значит нет смысла?

Это сообщение отредактировано Fakeman - 30 ноября 2017 | 22:37


#1095 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 30 ноября 2017 - 23:25

QUOTE (Fakeman)
Там по проще функция рядом есть, указываешь указатель на предмет, вместо игрока.
Ну ты не уточнял что для конкретного предмета, поэтому я использовал более универсальную.

QUOTE (Fakeman)
А что за mode требуется? что-то с ним какие-то сложные расчеты, в чем его смысл?
Это режим ATKTYPE_*, функция get_attack_type нормально сработает только в очень комфортных условиях. В общем я сейчас её подправил и можно кусок кода (но без прицельности) в предыдущем примере переписать так:
CODE
variable mode, attack_anim;
mode := get_attack_type;
if mode == 6 or mode == 7 then display_msg("перезарядка");
else begin
 attack_anim := call_offset_r2(0x4785DC, dude_obj, mode);
 if attack_anim == 16 then display_msg("удар рукой");
 else if attack_anim == 17 then display_msg("удар ногой");
 else if attack_anim == 42 then display_msg("рубить");
 else if attack_anim == 41 then display_msg("ткнуть");
 else if attack_anim == 18 then display_msg("метнуть");
 else if attack_anim == 45 then display_msg("выстрел");
 else if attack_anim == 46 then display_msg("очередь");
 else if attack_anim == 47 then display_msg("огонь");
end

QUOTE (Fakeman)
Что значит нет смысла?
Так проект закрыт :-p


#1096 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 01 декабря 2017 - 00:12

QUOTE
Так проект закрыт :-p

Не может быть!

А в чем отличие между когда атакуешь объект Scenery и Critter ?
Вот ты меня вынуждаешь вместо двери создавать объект Critter, хотя дверь правильнее, там проценты серенькие, и нету сообщений что объект перенес атаку без последствий.

Отправлено: 1 дек 17 04:05
Я тут побаловаться этой штукой с дверью и гранатой, как оказываться в дверь то легче попасть чем в непеся, видимо модификатор брони(AC) влияет на % попадания да? — я что-то это как-то не учел, читерно как-то это получается метать гранаты на соседний гекс от непеся, зато реалистично кидай куда хочешь, как во всех тактик играх.

Давай расчехляй свой проект :P
Надо дофиксить опцию ExplosionAroundPortal
*Хотя может я скриптово добью это дело через хук какой-нибудь, потому как если в damage_p_proc нпс добавить attack(source_obj) то нпс сразу будет атаковать.

Это сообщение отредактировано Fakeman - 1 декабря 2017 | 05:07


#1097 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 01 декабря 2017 - 17:28

CODE

0045270A            call    gsound_play_sfx_file_
0045270F            cmp     eax, 0FFFFFFFFh
00452712            jz      short loc_45271F
00452714            mov     ecx, [esp+14h+var_14]
00452717            push    ecx
00452718            push    offset aGsoundPlayingA  ; "\nGsound: playing ambient map sfx: %s"
0045271D            jmp     short loc_452728
---------------------------------------------------------------------------
0045271F loc_45271F:                                ; gsound_sfx_q_process_+DEj
0045271F            mov     edx, [esp+14h+var_14]
00452722            push    edx
00452723            push    offset aGsoundPlayin_0  ; "\nGsound: playing ambient map sfx: %s. "...
00452728 loc_452728:                                ; gsound_sfx_q_process_+E9j
00452728            call    debug_printf_
0045272D            add     esp, 8

Отключил ненужную информацию в логе о "Gsound: playing ambient map sfx: %s"
и перепрыгиваю с jmp short loc_452728 за debug_printf_, тут нужно прыгать на add esp, 8 или add esp тоже надо пропускать? — пока прыгаю на нее но вдруг это неправильно.

У тебя там в опкодах добавлено, это ты свое добавлял(хотя навряд ли) — просто забыли что он есть?
CODE
0x824A - void block_combat(bool flag)

что опкод делает — не дает войти в режим боя?
помню в олипме какой-то костыль придумали с кнопкой, что бы в бой не входило, а тут опкод есть.

Еще как-то спрашивал но ты не ответил, у тебя в hs_withinperception.ssl используется sneak_success но раньше у тебя там была движковая функция, ты как-то подправил у себя sneak_success? — ибо ты раньше говорил что оригинальная с косяком.

Ты все такие не документированные правки куда-нибудь в отдельный файлик пиши, чтобы знать.
и get_attack_type тоже укажи, что работает теперь по другому (правильно).


Это сообщение отредактировано Fakeman - 1 декабря 2017 | 18:56


#1098 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 03 декабря 2017 - 05:03

QUOTE (Fakeman)
А в чем отличие между когда атакуешь объект Scenery и Critter ?
Тю, а то я так и знаю/помню — смотреть надо :-p
QUOTE (Fakeman)
видимо модификатор брони(AC) влияет на % попадания да?
Да.
QUOTE (Fakeman)
Давай расчехляй свой проект :P
Надо дофиксить опцию ExplosionAroundPortal
Нет смысла сейчас ;)
QUOTE (Fakeman)
тут нужно прыгать на add esp, 8 или add esp тоже надо пропускать?
Второе.
QUOTE (Fakeman)
что опкод делает — не дает войти в режим боя?
Блокирует вхождение в бой с помощью клавиши или иконки оружия на интерфейсной панели. И почему забыли?
QUOTE (Fakeman)
ты как-то подправил у себя sneak_success? — ибо ты раньше говорил что оригинальная с косяком.
Давно ещё, hs_keypress.ssl:
CODE
procedure start;
procedure start begin
 if not init_hook then begin
  variable event := get_sfall_arg, keyDX := get_sfall_arg, keyVK := get_sfall_arg;
  if (keyDX == 0x57) and (event == 0) then begin // F11
   critter_mod_skill(dude_obj, 8, 300);
   if sneak_success then display_msg("success"); else display_msg("failed");
  end
 end
end
Нажми F11, 1, F11, 1, F11.


#1099 Fakeman

Fakeman

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 557 сообщений

Отправлено 03 декабря 2017 - 18:05

CODE
Нет смысла сейчас;)

Ладно. тут похоже надо ситуацию скриптово поправлять.

Как узнать, может ли игрок в текущий момент выйти из боя — это когда пишет "вы не можете закончить бой рядом с врагами", т.е как определяется что есть враги?
я полагаю где-то у криттера есть флаг означающий, что он является врагом для dude?

QUOTE
Давно ещё

Поделись исправлением, чтоб в ориге исправить.

QUOTE
И почему забыли?

Ну потому, что не вписали. :)


#1100 Crafty

Crafty

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 423 сообщений

Отправлено 03 декабря 2017 - 18:27

QUOTE (Fakeman)
Как узнать, может ли игрок в текущий момент выйти из боя — это когда пишет "вы не можете закончить бой рядом с врагами", т.е как определяется что есть враги?
Для всех персонажей на карте нужно вызвать combatai_want_to_stop и combatai_want_to_join, в общем смотри как это сделано в combat_end.

QUOTE (Fakeman)
Поделись исправлением, чтоб в ориге исправить.
Есть в сишных исходниках.




Похожие темы Свернуть

  Название темы Форум Автор Статистика Последнее сообщение


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Рейтинг@Mail.ru