BGforgeNet / FO2tweaks

Fallout 2 tweaks
https://forums.bgforge.net/viewforum.php?f=26
126 stars 11 forks source link

Allow to toss grenades into empty hexes #15

Closed burner1024 closed 3 years ago

burner1024 commented 7 years ago

The player can only throw a grenade right in the enemy. Sometimes, depending on disposition, it would be more convenient to throw it into an empty hex next to the enemy (or a group of them).

It should be possible by implementing a moving door object.

Ref https://github.com/phobos2077/sfall/issues/289, https://github.com/rotators/Fo1in2/commit/cf4f31397d422ec181a607cd818992960d4cab13#r36665528

FakelsHub commented 7 years ago

It should be possible by implementing a moving door object.

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

FakelsHub commented 7 years ago

Хех, я тут потестил дверь с гранатой, и оказывается взрываясь граната на двери не наносит ущерба рядом стоящим криттерам и ГГ. Так что идея не жизни способна, и требуется доработка движка.

burner1024 commented 7 years ago

Странно. Попробую, ну если нет то нет.

FakelsHub commented 7 years ago

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

burner1024 commented 5 years ago

Looks like it cannot be done with a global script alone until fs_ functions are fixed.

FakelsHub commented 5 years ago

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

burner1024 commented 5 years ago

Кидай ссылку если есть, я посмотрю.

FakelsHub commented 5 years ago

Отдельного скрипта нет. И я пришел к выводуу, что чать кода нужно делать непосредственно в движке(sfall), ибо скриптовые издержки тормозят обработку.

burner1024 commented 5 years ago

ясно

burner1024 commented 5 years ago

Хотя вообще не такая уж нужная фича, чтобы в движке с ней заморачиваться.

burner1024 commented 4 years ago

Фиг с ним короче.

phobos2077 commented 4 years ago

Забавно. Одной из идей для будущей версии EcCo мода (которая так и не вышла), было как раз бросание гранат на пустой гекс. Именно таким же способом костыльным хотел реализовать (без правки движка). Цель - создание дымовых и светошумовых гранат, которых ИМХО очень не хватает для создания по настоящему тактической боевки в игре.

burner1024 commented 4 years ago

Так оттуда идея и есть по-моему. Но конкретно это просто для удобства. А чтобы была боевка нормальная надо учить врагов хотя бы прикрытием пользоваться для начала, как в jagged alliance. Потом можно уже думать про всякое спецоружие.

FakelsHub commented 4 years ago

А чтобы была боевка нормальная надо учить врагов хотя бы прикрытием пользоваться для начала, как в jagged alliance.

Есть такие планы. Реализовать конечно не просто будет. Но есть проблема у npc мало AP, им только и хвататет что сделать выстрел, а обратно отойти за преграду очков не хватит.

Сделать AI немного умнее вот что надо. Некоторые тупости AI я исправлял в своей версии, но секции CombatAI в оригинале нет.

FakelsHub commented 4 years ago

Костыль для кидания :) для ознакомления.

procedure grenade_throwing_proc begin
   variable obj_ptr, slot, pid, dmg_type, attack_mode, attack_type, hex_cursor, allow_weapon := false;

   if combat_is_initialized and get_cursor_mode == CURSOR_TARGETING then begin
      if key_pressed(DIK_LCONTROL) then begin
         if not(weapon_check_once) then begin
            hex_cursor := tile_under_cursor;
            if place_hex != hex_cursor then begin
               get_active_hand(slot);
               obj_ptr := critter_inven_obj(dude_obj, slot);
               if (obj_ptr and obj_item_subtype(obj_ptr) == item_type_weapon) then begin
                  pid := obj_pid(obj_ptr);
                  dmg_type := get_proto_data(pid, PROTO_WP_DMG_TYPE);
                  if (dmg_type == DMG_explosion) or (dmg_type == DMG_fire) then begin
                     attack_mode := get_proto_data(pid, PROTO_IT_FLAGS);
                     attack_type := get_attack_type; //call_offset_r2(0x47860C, obj_ptr, get_attack_type);

                     if (attack_type == ATKTYPE_LWEP_SECOND) or (attack_type == ATKTYPE_RWEP_SECOND) then
                        attack_mode := (attack_mode bwand 0xF0) / 16; //сдвиг на 4 разряда вправо
                     else
                        attack_mode := (attack_mode bwand 0x0F);
                     if (attack_mode == ATKMODE_PRI_THROW) then begin
                        allow_weapon := true;
                     end

                     if allow_weapon then begin
                        place_hex := hex_cursor;
                        if not(obj_blocking_tile(place_hex, dude_elevation, BLOCKING_TYPE_BLOCK)) then begin
                           if not(targetObject) then begin
                              DEBUGMSG("Create grenade target at: " + place_hex)
                              targetObject := create_object_sid(PID_THROWING_TARGET_OBJECT, place_hex, dude_elevation, -1);
                           end
                           else begin
                              DEBUGMSG("Replacement grenade target to: " + place_hex)
                              move_to(targetObject, place_hex, dude_elevation);
                           end
                        end
                        else if targetObject then begin
                           DEBUGMSG("Destroy grenade target.")
                           destroy_object(targetObject);
                           targetObject :=0;
                        end
                     end else
                        weapon_check_once := true;
                  end else
                     weapon_check_once := true;
               end else
                  weapon_check_once := true;
            end
         end
      end else if targetObject and place_hex > 0 then begin
         DEBUGMSG("Hide grenade target.")
         place_hex := 0;
         move_to(targetObject, place_hex, dude_elevation);
      end
   end
   else begin
      weapon_check_once := false;
      if targetObject then begin
         DEBUGMSG("Destroy grenade target.")
         destroy_object(targetObject);
         targetObject := 0;
         place_hex := 0;
      end
   end
end
burner1024 commented 4 years ago

Есть такие планы. Реализовать конечно не просто будет. Но есть проблема у npc мало AP, им только и хвататет что сделать выстрел, а обратно отойти за преграду очков не хватит.

Сделать AI немного умнее вот что надо. Некоторые тупости AI я исправлял в своей версии, но секции CombatAI в оригинале нет.

Да, я про это и говорю. С одной стороны AI тупой как пробка. А с другой стороны полумерами тут не обойтись, если переделывать то работы немало. А с третьей стороны, если все переделать, то уже и игра получается совсем другая. Непонятно, надо такое будет кому-то или нет. Так-то если охота именно в тактику то есть Jagged Alliance уже. Так что по поводу серьезных переделок AI у меня энтузиазма мало.

FakelsHub commented 4 years ago

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

burner1024 commented 4 years ago

К следующему релизу посмотрю.

Lexx2k commented 4 years ago

Btw. when I was testing the script a few days ago, I was able to throw grenades anywhere, but I couldn't use any other weapon anymore.

FakelsHub commented 4 years ago

but I couldn't use any other weapon anymore.

Perhaps something broke, because there were code corrections in sfall and after the script was not tested. I'll see later.

burner1024 commented 4 years ago

@FakelsHub какие тогда предложения, что делать при промахе?

FakelsHub commented 4 years ago

А что там при промахе? все там вроде нормально было. Нужно было еще процедуру какую-то сделать, чтобы криттеры агрились (непомню уже для какого случая).

burner1024 commented 4 years ago

Иногда при промахе вместо ориганальной цели попадаешь в другую, при этом показывается имя оригинальной на дисплее (на скрине это "Scroll Blocker"). Ну и надо сделать, чтобы что-то нормальное выводило вместо этого.

Lexx2k commented 4 years ago

^ this is why I added a new misc proto and called it "ground" and use this for targeting - then the message log will say "x was hit instead of ground!", which I find acceptable. https://i.imgur.com/ohL7glH.png

FakelsHub commented 4 years ago

Иногда при промахе вместо ориганальной цели попадаешь в другую, при этом показывается имя оригинальной на дисплее (на скрине это "Scroll Blocker"). Ну и надо сделать, чтобы что-то нормальное выводило вместо этого.

Да точно! Это старая проблема. Надо хакать.

burner1024 commented 4 years ago

Ну вот я поэтому и открыл.

FakelsHub commented 4 years ago

Проверить баг (краш игры), возможно уже исправлен в этой версии, (если нет то я догадываюсь где это исправить). https://github.com/BGforgeNet/FO2tweaks/blob/49bf215ae603c712c35d8ab16b8657af42da3565/source/gl_g_grenades_anywhere.ssl#L75

burner1024 commented 4 years ago

Не понял - что за проблемы, как их воспроизвести?

FakelsHub commented 4 years ago

При взрыве если цепляет игрока то игра крашится, как-то так насколько я помню. Ну и сообщение при промахе надо как-то поменять.

burner1024 commented 4 years ago

У меня вроде не крэшится. На сообщение я решил просто забить пока. Не вижу, как его зачинить скриптово, ну и оно довольно редкое. А задача уже 3 с лишним года тянется, так что я решил выпустить как есть, ну и смотреть на фидбэк.

burner1024 commented 4 years ago

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

FakelsHub commented 4 years ago

Готово - Ну пусть тестируют) Сейчас другие проблемы с багами навалились, до гранат и другого не добраться.

FakelsHub commented 4 years ago

Зачем опять закрыл. я так вообще забуду что это есть)

zorchar commented 3 years ago

Sorry for distracting, but can you please tell me what is the current situation with the mod? Burn, you said you will publish this with the bugs and all, right?

burner1024 commented 3 years ago

It's working well, except for a rare situation when you miss one target and hit another, and then you see "X was hit instead of Scroll Blocker" in display.

FakelsHub commented 3 years ago

Сообщение о неправильной цели уже было исправлено на уровне движка, маркер куда кидать гранату должен иметь флаг Flat.

zorchar commented 3 years ago

So, where can I find the code?

Thanks.

burner1024 commented 3 years ago

Сообщение о неправильной цели уже было исправлено на уровне движка, маркер куда кидать гранату должен иметь флаг Flat.

А чего молчал-то.

So, where can I find the code?

Github is for bugs, forum is for questions. Code is in source directory.