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

Allow to toss grenades into empty hexes #15

Closed
burner1024 opened this issue Jun 1, 2017 · 38 comments
Closed

Allow to toss grenades into empty hexes #15

burner1024 opened this issue Jun 1, 2017 · 38 comments

Comments

@burner1024
Copy link
Member

burner1024 commented Jun 1, 2017

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 sfall-team/sfall#289, rotators/Fo1in2@cf4f313#r36665528

@FakelsHub
Copy link

FakelsHub commented Aug 5, 2017

It should be possible by implementing a moving door object.

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

@FakelsHub
Copy link

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

@burner1024
Copy link
Member Author

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

@FakelsHub
Copy link

FakelsHub commented Aug 6, 2017

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

@burner1024
Copy link
Member Author

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

@burner1024 burner1024 reopened this Jul 13, 2019
@FakelsHub
Copy link

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

@burner1024
Copy link
Member Author

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

@FakelsHub
Copy link

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

@burner1024
Copy link
Member Author

ясно

@burner1024
Copy link
Member Author

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

@burner1024
Copy link
Member Author

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

@phobos2077
Copy link
Contributor

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

@burner1024
Copy link
Member Author

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

@FakelsHub
Copy link

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

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

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

@FakelsHub
Copy link

FakelsHub commented Nov 13, 2019

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

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
Copy link
Member Author

burner1024 commented Nov 13, 2019

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

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

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

@FakelsHub
Copy link

FakelsHub commented Dec 18, 2019

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

@burner1024 burner1024 reopened this Dec 18, 2019
@burner1024
Copy link
Member Author

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

@Lexx2k
Copy link

Lexx2k commented Dec 18, 2019

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
Copy link

FakelsHub commented Dec 18, 2019

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
Copy link
Member Author

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

@FakelsHub
Copy link

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

@burner1024
Copy link
Member Author

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

@Lexx2k
Copy link

Lexx2k commented Feb 29, 2020

^ 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
Copy link

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

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

@burner1024
Copy link
Member Author

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

@FakelsHub
Copy link

FakelsHub commented Apr 2, 2020

  • Решить проблему при промахе по другому объекту - немного трудоемко так как добиться стабильного попадания в другой объект нетак легко.

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

if tile == dude_tile or tile == -1 then return; // TODO: need fix bug explosion on dude tile

@burner1024
Copy link
Member Author

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

@FakelsHub
Copy link

FakelsHub commented Apr 2, 2020

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

@burner1024
Copy link
Member Author

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

@burner1024
Copy link
Member Author

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

@FakelsHub
Copy link

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

@FakelsHub
Copy link

FakelsHub commented Apr 2, 2020

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

@zorchar
Copy link

zorchar commented Oct 16, 2020

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
Copy link
Member Author

burner1024 commented Oct 16, 2020

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
Copy link

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

@zorchar
Copy link

zorchar commented Oct 16, 2020

So, where can I find the code?

Thanks.

@burner1024
Copy link
Member Author

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

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

So, where can I find the code?

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

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

5 participants