Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Animation not played when using object at point blank range #356

Closed
burner1024 opened this issue Jan 31, 2021 · 65 comments
Closed

Animation not played when using object at point blank range #356

burner1024 opened this issue Jan 31, 2021 · 65 comments

Comments

@burner1024
Copy link
Contributor

burner1024 commented Jan 31, 2021

According to my tests, when using a spray in EPA, the plant doesn't play "falling" animation when used from a point blank range.
If used from a distance, dude walks to the plant and the animation does play.

Relevant issue, with a save to test.

Probably related to punching bag one, and also magic hands not working in "trap door"?

epac8.ssl:

/*
  ***   Script conwerted to Interplay format by Fallout Script Edytor (by Jargo)  ***
*/

#define SCRIPT_REALNAME "epac8"
#include "../headers/define.h"
//#include "../headers/<TownMapName.h>"

#define NAME                    SCRIPT_EPAC8          //Script name from scripts.h
#define TOWN_REP_VAR            GVAR_TOWN_REP_           //Global variable name for this Town

#include "../headers/command.h"

#define LVAR_Herebefore                 (4)
#define LVAR_Hostile                    (5)
#define LVAR_Personal_Enemy             (6)

#define max_attack_distance 16

procedure start;
procedure critter_p_proc;
procedure map_enter_p_proc;
procedure destroy_p_proc;
procedure use_p_proc;
procedure look_at_p_proc;
procedure description_p_proc;
procedure use_skill_on_p_proc;
procedure use_obj_on_p_proc;
procedure damage_p_proc;
procedure map_update_p_proc;
procedure talk_p_proc;

procedure timed_event_p_proc;

procedure start begin
   if not self_obj then return;
   set_self_team(TEAM_RND_SPORE_PLANT);
   set_self_ai(AI_SPORE_PLANT);
end

procedure critter_p_proc begin
   if not self_obj then return;
   // if self_can_see_dude and (distance_dude <= max_attack_distance) then attack(dude_obj);
end

procedure map_enter_p_proc begin
   variable item;
   if (map_first_run) then begin
      item:=create_object(PID_PLANT_SPIKE_EPA,0,0);
      add_mult_objs_to_inven(self_obj,item,10);
   end
end

procedure destroy_p_proc begin
  inc_global_var(GVAR_KILL_EPAPLANTS);
  if (global_var(GVAR_KILL_EPAPLANTS) >= 26) then begin
   display_msg(mstr(100));
  end
end

procedure use_p_proc
begin
end

procedure look_at_p_proc
begin
end

procedure description_p_proc
begin
end

procedure use_skill_on_p_proc begin
   if (action_being_used == SKILL_STEAL) then
      script_overrides;
end


procedure damage_p_proc
begin
   if (source_obj == dude_obj) then begin
      attack(dude_obj);
   end
end

procedure map_update_p_proc
begin
end

procedure talk_p_proc
begin
end

procedure timed_event_p_proc
begin
end

procedure use_obj_on_p_proc begin
   script_overrides;
   if ((obj_pid(obj_being_used_with) == PID_PLANT_SPRAY)) then begin
      inc_global_var(GVAR_KILL_EPAPLANTS);
      if (global_var(GVAR_KILL_EPAPLANTS) >= 26) then begin
        display_msg(mstr(100));
      end
      switch self_pid begin
         case PID_EPA_SPORE_PLANT: give_xp(150);
         case PID_RED_SPORE_PLANT: give_xp(200);
         case PID_GIANT_SPORE_PLANT: give_xp(350);
      end

      reg_anim_combat_check(0);
      reg_anim_clear(self_obj);
      reg_anim_begin();
         reg_anim_animate(self_obj,ANIM_fall_back,-1);
      reg_anim_end();
      // kill_critter(self_obj, ANIM_melted_to_nothing_sf);
   end
end
@FakelsHub
Copy link
Contributor

попробуй другую анимацию.

@burner1024
Copy link
Contributor Author

пробовал

@FakelsHub
Copy link
Contributor

FakelsHub commented Feb 1, 2021

Сделал на цветке такую же процедуру, и все нормально. Ищите косяк в RP.

procedure use_obj_on_p_proc begin
   script_overrides;
   if ((obj_pid(obj_being_used_with) == PID_KNIFE)) then begin
      reg_anim_combat_check(0);
      reg_anim_clear(self_obj);
      reg_anim_begin();
         reg_anim_animate(self_obj,ANIM_fall_back,-1);
      reg_anim_end();
      // kill_critter(self_obj, ANIM_melted_to_nothing_sf);
   end
end

@burner1024
Copy link
Contributor Author

burner1024 commented Feb 1, 2021

Ну скрипт же есть, сейв есть. Ты проверь не такую же а именно ту же. Тут у тебя оружие, возможно оно по другому работает.
Вот скопилированный epac8.int.zip.

@FakelsHub
Copy link
Contributor

FakelsHub commented Feb 1, 2021

проверял на русской сборке 2.3.3 с вот этим апдетом https://yadi.sk/d/0x1Br5gdqvzRIw

@burner1024
Copy link
Contributor Author

burner1024 commented Feb 1, 2021

Что за русская сборка? Поставлю, попробую с ней.
Ну а kill_critter это killap писал, к нему претензии. Я-то как раз разбираюсь в его каше.

@FakelsHub
Copy link
Contributor

FakelsHub commented Feb 1, 2021

Я ктому что kill_critter - Моментального действия, а reg_anim_animate действует отложенно, уже после килл.

@FakelsHub
Copy link
Contributor

FakelsHub commented Feb 1, 2021

Опция для увеличения количества одновременых анимаций в ddraw надеюсь у вас на макс установлена.?

@burner1024
Copy link
Contributor Author

Я ктому что kill_critter - Моментального действия, а reg_anim_animate действует отложенно, уже после килл.

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

Опция для увеличения количества одновременых анимаций в ddraw надеюсь у вас на макс установлена.?

Установлена.

проверял на русской сборке 2.3.3 с вот этим апдетом https://yadi.sk/d/0x1Br5gdqvzRIw

Что за сборка, дай ссылку. В апдейте этом нету epac8.int.

@FakelsHub

This comment has been minimized.

@burner1024
Copy link
Contributor Author

А, нашел.. Попробовал, никакой разницы не вижу.
Давай свой, скомпилированный.

@FakelsHub
Copy link
Contributor

Я так понял анимации нет только когда стоишь в упор?

@burner1024
Copy link
Contributor Author

Да какая разница, твой, мой.

Ну так надо сравнить строчка в строчку и узнаем, разница есть или нет.

Я так понял анимации нет только когда стоишь в упор?

Да, вот видео.

@FakelsHub
Copy link
Contributor

FakelsHub commented Feb 1, 2021

Да, вот видео.

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

@burner1024
Copy link
Contributor Author

burner1024 commented Feb 1, 2021

Именно та ситуация, я не знаю, какую ты проверял.
Мисклика нет, смотри на сообщения, там пишет "used spray", это мой дебаг из скрипта epac8. Анимации никогда и не было.

@FakelsHub
Copy link
Contributor

FakelsHub commented Feb 1, 2021

Именно та ситуация, я не знаю, какую ты проверял.

обе ситуации не в RP
в RP только не в бою.

@burner1024
Copy link
Contributor Author

burner1024 commented Feb 1, 2021

Мне непонятно, какие обе. EPA это RP, ситуация с ней.
В общем, надеюсь теперь ясно, какая именно проблема обсуждается.

Без боя то же самое, кстати.

@FakelsHub
Copy link
Contributor

Мне непонятно, какие обе.

На своей тестируемой карте (не RP), проверял в плотную в бою, и не в бою. результат работы OK.

@burner1024
Copy link
Contributor Author

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

@FakelsHub
Copy link
Contributor

Ну а смысл тестировать что-то другое.

Что бы быть уверенным что баг есть везде.

@FakelsHub
Copy link
Contributor

Без боя то же самое, кстати.

без reg_anim_combat_check(0); также нет анимации?

@FakelsHub
Copy link
Contributor

FakelsHub commented Feb 1, 2021

/* Anim Commands */
#define RB_UNRESERVED   1    // unreserved animation sequence, may fail if no available slots
#define RB_RESERVED     2    // reserved animation sequence, should never fail
#define reg_anim_begin()    reg_anim_func(REG_ANIM_BEGIN, RB_UNRESERVED)

Еще попробуй использовать RB_RESERVED в reg_anim_begin()

или это anim({ObjectPtr who}, {int anim}, {int direction});

@burner1024
Copy link
Contributor Author

без reg_anim_combat_check(0); также нет анимации?

Да.

Первое не помогает, второе играет но потом коржеит и застывает.
Может быть, связано с пропуском фреймов?
Вроде где-то 1 из 10 все же срабатывает, как и с динамитом на дверях.

@FakelsHub

This comment has been minimized.

@FakelsHub
Copy link
Contributor

Я потом еще раз проверю на вашем оригинальном sfall есть у меня одна мысля почему это может не работать.

@FakelsHub
Copy link
Contributor

FakelsHub commented Feb 2, 2021

Проверил, этот баг есть с оригинальным sfall, на моей версии все OK.

@NovaRain
Wait with the release, if there is not a difficult bug search, then we will include it in the version.

@NovaRain
Copy link
Collaborator

NovaRain commented Feb 2, 2021

Проверил, этот баг есть с оригинальным sfall, на моей версии все OK.

I guess it's related to the tweak of action_use_an_item_on_object_ in animations.cpp in your build?

@FakelsHub
Copy link
Contributor

FakelsHub commented Feb 2, 2021

no. but that's what gave me the idea of where to look for the problem.

@NovaRain
Copy link
Collaborator

NovaRain commented Feb 2, 2021

no. but that's what gave me the idea of where to look for the problem.

Oh, OK. It's not like we're hurrying for something. If it can fix both RPU's and EtTu's problem I'm all for it.

@egornovivan
Copy link

@FakelsHub там в EPA кстати еще робот был, его анимации так колбасило что fps в 0 падало. Гдето даже на стриме этот момент был записан.

@FakelsHub
Copy link
Contributor

But the ext tweak doesn't seem to help the case of punching bag in Et Tu, which has a similar "anim plays if the player walks one hex, but no anim if at point blank range" issue.

Where to find this script. maybe in that sequence it is easier to detect a bug than in here?

@NovaRain
Copy link
Collaborator

NovaRain commented Feb 2, 2021

But the ext tweak doesn't seem to help the case of punching bag in Et Tu, which has a similar "anim plays if the player walks one hex, but no anim if at point blank range" issue.

Where to find this script. maybe in that sequence it is easier to detect a bug than in here?

In its issue 70:
rotators/Fo1in2#70

It probably has a different cause than EPA plant spray, but the symptom is similar.

@FakelsHub
Copy link
Contributor

FakelsHub commented Feb 2, 2021

      if ( scenType != scenery_type_stairs && !_item ) <<<< here tweak
      {
         register_object_animate_(_source, useAnim, -1);
      }
      if ( _item )                                                              // если применяем предмет
      {
         register_object_call3_(_source, _target, _item, obj_use_item_on_, -1); <<<< here execute use_obj_on_p_proc
      }

that doesn't work if the write_short lines are in use_obj_on_p_proc procedure?

yes

@NovaRain

This comment has been minimized.

@FakelsHub

This comment has been minimized.

@NovaRain
Copy link
Collaborator

NovaRain commented Feb 3, 2021

it just shifted)

Ah, OK, at least I know my idea doesn't work now, back to square one I guess.

@FakelsHub
Copy link
Contributor

FakelsHub commented Feb 3, 2021

It probably has a different cause than EPA plant spray, but the symptom is similar.

there in the use_p_proc procedure as opposed to here in use_obj_on_p_proc

I'll try to do tests on a punching bag

@FakelsHub
Copy link
Contributor

Well, there's no problem with the punching bag.
They just remove the animation of "hands" in the hook, so this bug appears.

Ну с грушей никакой проблемы нет.
Там просто убирают в крючке анимацию "рук" поэтому и появляется этот баг.

@egornovivan
Copy link

Искать надо где баг.

Может имеет смысл потыкать старые версии sfall? Может тогда станет ясно где и когда свернули не туда?

@FakelsHub
Copy link
Contributor

FakelsHub commented Feb 3, 2021

Думаю эту проблему следует отложить на следующие версии, нужно разбираться в функциях движка как он анимирует это все. там все сложно код ни черта не понятен и не разобран в большинстве частях.

I think this problem should be postponed to the next versions, need to understand the functions of the engine as it animates it all. everything is complicated there, the code is not clear and is not disassembled in most parts.

@NovaRain
Copy link
Collaborator

NovaRain commented Feb 3, 2021

Well, there's no problem with the punching bag.
They just remove the animation of "hands" in the hook, so this bug appears.

Not sure if I understand the cause correctly: both cases (no anim if the player is right next to the obj, but works if the player walks to the obj) are because there should be an animation (magic hands or movement) registered prior to use_obj_on_p_proc and use_p_proc for the anim sequence inside them to work?

For EPA plant spray, there's no animation because by default the engine doesn't register an anim for using items on obj, and your tweak forces the engine to register magic hands for it before calling the proc?
For Et Tu punching bag, it's the original magic hand anim got blocked so the follow-up sequence in the hook doesn't work?

@FakelsHub
Copy link
Contributor

Yes, you understand all this correctly :-)

@NovaRain
Copy link
Collaborator

NovaRain commented Feb 3, 2021

Yes, you understand all this correctly :-)

OK, it would be nice if the requirement of having an anim registered prior to the procedures can be fixed or removed somehow.

@burner1024
Copy link
Contributor Author

More findings:
If you start combat standing near the critter, then move away, then back close and use the item, the animation is still not played.

@FakelsHub
Copy link
Contributor

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

NovaRain added a commit that referenced this issue May 7, 2021
* for issues with scripted animations not playing (#356)
NovaRain added a commit that referenced this issue May 7, 2021
* for issues with scripted animations not playing (#356)
@NovaRain
Copy link
Collaborator

NovaRain commented May 9, 2021

The issue in the first post should be fixed by now with the new tweak. I tested a similar animation sequence with Klint (using any item on him will play "knocked down" anim), and the anim plays when using items at point blank range in/out of combat.

@burner1024
Copy link
Contributor Author

Cool, where's the build again? Lost the link. Maybe add it to readme?

@NovaRain
Copy link
Collaborator

Test build: sfall_fc53df5.zip
Or you can just make a global script that simply runs write_short(0x4120B8, 0x9090); on game start, which is exactly how the tweak works.

@FakelsHub
Copy link
Contributor

FakelsHub commented May 10, 2021

@burner1024
Кажется я разобрался в причине этой проблемы, тут вроде бага никакого нет. Просто регистрируется анимация когда еще движок не завершил предыдущую зарегистрированную анимацию. Визуально анимация уже может закончится а в движке проходит еще стадия ее завершения и поэтому регистрация новой анимации не происходит.
В таких случая нужна небольшая задержка перед регистрацией.
Функция anim_busy должна помочь в этом деле.

reg_anim_clear(self_obj); - не очищает приоритетные анимации.
возможно сделаю макрос: reg_anim_force_clear

@FakelsHub
Copy link
Contributor

The issue in the first post should be fixed by now with the new tweak.

This tweak is not a solution to this problem.

@NovaRain
Copy link
Collaborator

NovaRain commented May 11, 2021

The issue in the first post should be fixed by now with the new tweak.

This tweak is not a solution to this problem.

Well, it does prevent the issue of animation not playing for EPA plants as when you tested with your build.

@FakelsHub
Copy link
Contributor

It's just that the engine manages to finish the animation before the registration of the next animation begins.

@burner1024
Copy link
Contributor Author

Well, however it works under the hood, it does work. Thanks!

burner1024 added a commit to BGforgeNet/Fallout2_Restoration_Project that referenced this issue May 22, 2021
@burner1024
Copy link
Contributor Author

So apparently the change forces magic hands, I somehow missed that and thought it was a clean fix. And of course, not everyone likes it.

В таких случая нужна небольшая задержка перед регистрацией.
Функция anim_busy должна помочь в этом деле.
reg_anim_clear(self_obj); - не очищает приоритетные анимации.
возможно сделаю макрос: reg_anim_force_clear

Any example?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants