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


Фотография

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


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

#981 Crafty

Crafty

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

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

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

QUOTE (Foxx)
Ну стандартные анимации ГГ: HMJMPSAA, HMLTHRAA, HMMAXXAA и т.д.
Технически всё верно — нпс и ГГ используют одну общую анимацию, которую подменяет хиромод. Раньше работало потому что в хиромоде был трюк со сдвигом fid'а у ГГ вверх на количество существующих анимаций из critters.lst.
Могу откатить, но тогда опять вернётся проблема с ГГ'шным fid'ом (/суммон Fakeman ;)) и вроде ещё из-за этого в Мегамоде была проблема с исчезающим тотемным столбом на стартовой локации.


#982 Foxx

Foxx

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

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

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

Ну раньше хоть была какая-то индивидуальность при выборе внешности, а теперь кругом лысые/патлаты/блондинки/рыжие. Весь смысл appearance_mod пропадает )))

QUOTE ("Mr.Stalin")
После твоих манипуляций c добавлением ресурсов из олимпа не совсем понятно, что не так на этом скрине :)
А, что зря ресурсам пропадать, да и лишняя реклама Олимпу не повредит ;)

Это сообщение отредактировано Foxx - 7 сентября 2017 | 16:04


#983 Fakeman

Fakeman

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

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

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

QUOTE
Запутал меня.
Открыт ли контейнер: obj_is_open(object) or not obj_is_locked(object);
Есть ли анимация: art_exists((obj_art_fid(object) bwand 0xFF00FFFF) bwor 0x10000);

Смотри obj_is_open возвращает True, в том случае если контейнер имеет анимацию открывания/закрывания и когда его текущий анимационный фрейм больше нуля, (obj_is_open использует проверку текущего фрема cur_frm > 0 = True)
для контейнеров не имеющих анимацию(имеющих только нулевой(1) фрейм) obj_is_open возвращает всегда false контейнер закрыт (не путать с Lоcкед).

Можно ли проверить содержит ли объект фреймов больше чем 1?
Или как определить что игрок открыл контейнер (не используя функцию get_game_mode), каким-нибудь read_int() прочитать флаг что-ли.

art_exists — тут не приделах.

Отправлено: 7 сен 17 16:11
QUOTE
. Раньше работало потому что в хиромоде был трюк со сдвигом fid'а у ГГ вверх на количество существующих анимаций из critters.lst.

Да-да я про это писал на форуме NMA — но там походу не вдуплили о чем я им толкую))

Отправлено: 7 сен 17 16:15
QUOTE
Могу откатить, но тогда опять вернётся проблема с ГГ'шным fid'ом

А может это и не проблема. :)
Просто в технической документации не указали что фид меняется, я сам день промучился, пока не понял в чем глюк.

Это сообщение отредактировано Fakeman - 7 сентября 2017 | 16:39


#984 Crafty

Crafty

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

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

Отправлено 07 сентября 2017 - 17:11

QUOTE (Foxx)
Весь смысл appearance_mod пропадает )))
Не угодишь вам :-p

QUOTE (Fakeman)
Смотри obj_is_open возвращает True, в том случае если контейнер имеет анимацию открывания/закрывания и когда его текущий анимационный фрейм больше нуля, (obj_is_open использует проверку текущего фрема cur_frm > 0 = True)
Немного не так: для контейнеров в cur_frm, содержимое которого возвращает obj_is_open, хранится номер используемой анимации для текущего состояния контейнера. Для закрытого равно 0, а для открытого 1.

QUOTE (Fakeman)
art_exists — тут не приделах.
А ты всё же попробуй конструкцию:
QUOTE
if obj_is_open(object) or art_exists((obj_art_fid(object) bwand 0xFF00FFFF) bwor 0x10000) then display_msg("Opened");


#985 Fakeman

Fakeman

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

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

Отправлено 07 сентября 2017 - 18:23

QUOTE
Немного не так: для контейнеров в cur_frm, содержимое которого возвращает obj_is_open, хранится номер используемой анимации для текущего состояния контейнера. Для закрытого равно 0, а для открытого 1.

Ниче не знаю)
Я проверял у контейнеров с анимацией которые открыты read_int(object + 0x18) — возвращает 5 т.е. последний фрейм в анимации. у которых нет анимации или они закрыты то 0.
0x18 — если смотреть структуру то это cur_frm.
(Но нужно протестировать с меньшим количеством фреймов что-бы подтвердить)

QUOTE
хранится номер используемой анимации

что за номер анимации? у типа итемов по сути она одна.
Эти?
CODE
// basic animations  0-19
#define ANIM_stand                    (0)
#define ANIM_walk                     (1)
#define ANIM_jump_begin               (2)
#define ANIM_jump_end                 (3)
#define ANIM_climb_ladder             (4)
#define ANIM_falling                  (5)


QUOTE
art_exists((obj_art_fid(object) bwand 0xFF00FFFF) bwor 0x10000)

Да проверял возвращало всегда 1.
Это больше к криттерам относится.

Отправлено: 7 сен 17 18:46
Я бы мог воспользоваться предварительной проверкой read_int(object + 0x18), но скрипта так работает, что до использования контейнера нельзя получить указатель на контейнер, а когда уже юзнул контейнер то и вся проверка уже бессмысленна.

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


#986 Crafty

Crafty

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

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

Отправлено 07 сентября 2017 - 19:44

QUOTE (Fakeman)
Еще интересует можно ли проверить имеет ли объект контейнер анимацию открывания/закрывания т.е. имеет ли он фреймов >1 ?
CODE
variable temp, max_frames := 1;
if call_offset_r2(0x419160, obj_art_fid(object), temp) then begin // art_ptr_lock_
 max_frames := call_offset_r0(0x41978C); // art_frame_max_frame_
 temp := call_offset_r1(0x419260, temp); // art_ptr_unlock_
end
if max_frames > 1 then ...

QUOTE (Fakeman)
Ниче не знаю)
Да там муторно, без стакана не объяснить :-p
QUOTE (Fakeman)
Я бы мог воспользоваться предварительной проверкой read_int(object + 0x18), но скрипта так работает, что до использования контейнера нельзя получить указатель на контейнер, а когда уже юзнул контейнер то и вся проверка уже бессмысленна.
"if read_int(object + 0x18)" это абсолютный аналог "if obj_is_open(object)" независимо от типа объекта. Но как ты сможешь что либо узнать о контейнере (obj_is_open или obj_art_fid) если у тебя нет на него указателя?
Вообще закралось подозрение что какими-то извращёнными костылями пытаешься воссоздать режим INTFACELOOT ;-p


#987 Fakeman

Fakeman

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

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

Отправлено 07 сентября 2017 - 20:39

QUOTE
Вообще закралось подозрение что какими-то извращёнными костылями пытаешься воссоздать режим INTFACELOOT;-p

Оно уже давно воссоздано, когда еще не было этого INTFACELOOT, и работает для партийцев, и только для багажника по причине того что открывавшиеся контейнеры все портили.
и вот я решил эту байду победить(не знаю зачем), и расширить до всех контейнеров.

CODE

if call_offset_r2(0x419160, obj_art_fid(object), temp) then begin // art_ptr_lock_
max_frames := call_offset_r0(0x41978C); // art_frame_max_frame_
temp := call_offset_r1(0x419260, temp); // art_ptr_unlock_
end

О магическая функция, попробую. :)
edit: НЕРАБОТАТЕТ. условие не выполняется, убрал if игра падает на max_frames := call_offset_r0(0x41978C);

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

Это сообщение отредактировано Fakeman - 7 сентября 2017 | 21:08


#988 Crafty

Crafty

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

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

Отправлено 07 сентября 2017 - 21:58

Притормозил конечно ;)
CODE
variable temp, frame, max_frames := 1;
frame := call_offset_r2(0x419160, obj_art_fid(object), temp); // art_ptr_lock_
if frame then begin
 max_frames := call_offset_r1(0x41978C, frame); // art_frame_max_frame_
 temp := call_offset_r1(0x419260, temp); // art_ptr_unlock_
end
if max_frames > 1 then ...


#989 Fakeman

Fakeman

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

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

Отправлено 07 сентября 2017 - 22:45

да условие не выполняется frame = 0
без условия max_frames всегда = -1

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


#990 Crafty

Crafty

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

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

Отправлено 07 сентября 2017 - 22:51

Объект-то есть? Дай свой полигон для тестов.


#991 Fakeman

Fakeman

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

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

Отправлено 07 сентября 2017 - 23:02

QUOTE
Объект-то есть? Дай свой полигон для тестов.

да есть конечно.

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


#992 Crafty

Crafty

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

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

Отправлено 08 сентября 2017 - 00:29

Докумекал что я хз как ссылку передать скриптово и потому вместо ссылки на temp передаётся её значение и frame становится равен 0.
Поэтому сделал для этих целей sfall_func2("obj_art_max_frames", object, animID) — вернёт количество фреймов для анимации в текущем виде объекта. Если нет объекта или у него нет fid'а или такая анимация не поддерживается, то вернёт 0.
Под текущим видом объекта подразумевается его ориентация в пространстве, а для персонажей так ещё и оружие в руках.
Проверяй "if obj_is_open(object) or sfall_func2("obj_art_max_frames", object, 0) == 1 then...".


#993 Fakeman

Fakeman

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

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

Отправлено 08 сентября 2017 - 02:34

QUOTE
sfall_func2("obj_art_max_frames", object, animID)

ну ты не понял главной фишки) мне нужно то для старых версий под оригинал.
без всяких новых функций.

Это сообщение отредактировано Fakeman - 8 сентября 2017 | 02:36


#994 Fakeman

Fakeman

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

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

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

QUOTE
У функции add_mult_objs_to_inven есть забавный недокументированный эффект

Можно этот эффект выключить? :)

Это сообщение отредактировано Fakeman - 13 сентября 2017 | 20:29


#995 Crafty

Crafty

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

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

Отправлено 13 сентября 2017 - 22:39

QUOTE (Fakeman)
Можно этот эффект выключить? :)
Могут быть последствия (ну как с текущим лимитом — в то время никому и в голову не пришло что можно его превысить).


#996 Fakeman

Fakeman

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

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

Отправлено 13 сентября 2017 - 23:16

QUOTE
как с текущим лимитом

текущий лимит это что?

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

Странное какое-то решение почему именно 500? для чего как думаешь?
по логике должно быть ограничение в 99999 но не как в 500 баг точно.

Это сообщение отредактировано Fakeman - 13 сентября 2017 | 23:34


#997 Crafty

Crafty

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

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

Отправлено 14 сентября 2017 - 01:20

QUOTE (Fakeman)
текущий лимит это что?
Вот эти 99999, видимо из-за навязчивого окошка для указания количества при передаче предмета.
QUOTE (Fakeman)
Странное какое-то решение почему именно 500? для чего как думаешь?
Звёзды так сложились, прикололись, а может спец.значение чтобы показать что было переполнение.


#998 Fakeman

Fakeman

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

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

Отправлено 14 сентября 2017 - 01:53

QUOTE
а может спец.значение чтобы показать что было переполнение.

это навряд ли, если добавлять 500 предметов то тоже получим типа переполнение)
я кстати пробовал сменил там 99999 на MAXINT, и нормально без каких либо видимых проблем добавляет сразу 200к

Это сообщение отредактировано Fakeman - 14 сентября 2017 | 02:16


#999 Crafty

Crafty

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

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

Отправлено 20 сентября 2017 - 02:35

Вообще шикарный способ увидеть цель в бою:
CODE
procedure combat_is_starting_p_proc begin
 call iSeeYouInCombat in 1; // или "call iSeeYouInCombat when combat_is_initialized;"
end

procedure combat_is_over_p_proc begin
 cancel(iSeeYouInCombat);
end

procedure iSeeYouInCombat begin
 if combat_is_initialized then begin
  if obj_can_see_obj(self_obj, dude_obj) and свои_условия_для_нападения then attack_setup(self_obj, dude_obj);
  else call iSeeYouInCombat in 1; // лучше 0 вместо 1, тогда частота будет максимальная как у critter_p_proc (быстрее заметят)
 end
end

Можно даже через start или critter_p_proc вместо combat_is_*, но потребует дополнительных усилий.

Альтернативный вариант через событие (общий максимум 40):
CODE
procedure combat_is_starting_p_proc begin
 addnamedhandler("iSeeYouInCombat", iSeeYouInCombat); // не addnamedevent!
 signalnamed("iSeeYouInCombat");
end

procedure combat_is_over_p_proc begin
 clearnamed("iSeeYouInCombat");
end

procedure iSeeYouInCombat begin
 if combat_is_initialized then begin
  if obj_can_see_obj(self_obj, dude_obj) and свои_условия_для_нападения then attack_setup(self_obj, dude_obj);
  else signalnamed("iSeeYouInCombat");
 end
end


Это сообщение отредактировано Crafty - 26 сентября 2017 | 08:30


#1000 Fakeman

Fakeman

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

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

Отправлено 20 сентября 2017 - 16:55

CODE
call [...in | when...]
Calls a procedure with an optional delay or condition.

А это что конструкция рабочая?

А критические блоки тоже работают?
CODE
startcritical...endcritical
Declares a block of code as critical.


И это поведение вызовов тоже относится к движку фола?.
CODE
Procedure2 will begin execution immediately after Procedure1 begins execution but possibly before Procedure1 completes. Procedure2 may also finish before Procedure1 if it is shorter or faster than Procedure1

call Procedure1;
call Procedure2;


Это сообщение отредактировано Fakeman - 20 сентября 2017 | 16:59




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

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


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

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

Рейтинг@Mail.ru