главная турниры статьи wiki карта сайта логин

Автор Тема: для алдари  (Прочитано 1086 раз)

0 Пользователей и 1 Гость просматривают эту тему.

DV

  • Глобальный Модератор
  • level 5
  • *****
  • Сообщений: 1285
  • Это - Стилфист в молодости.
  • OS:
  • Linux (Ubuntu) Linux (Ubuntu)
  • Browser:
  • Chrome 41.0.2272.76 Chrome 41.0.2272.76
    • Просмотр профиля
  • Раса: Мертвец
для алдари
« : Май 05, 2016, 07:43:42 »
вот, я чисто для примера и по приколу сварганил два варианта метода выбора вариации при найме трупов - оба используют исключительно дефолтные методы и не требуют создания дополнительных юнитов или чего бы то ни было еще - ты просто вставляешь ивент в любой веснотский сценарий и фишка будет работать в этом сценарии. либо, если у тебя аддон, ты вставляешь ивент в файл с утилитами этого аддона и ивент будет работать во всех сценариях твоего аддона.

метод 1: через message и options. картинки:

а) в рекрутлисте жмем на трупа.

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

в) зомби становится выбранной нами вариацией, оставаясь при этом дефолтным юнитом walking corpse. любой фильтр на тип юнита покажет, что это он.

г) повторяем операцию N раз

д) ...

е) ПРОФИТ!


Достоинства метода 1:
-сработает на любой версии веснота которую ты, скорее всего, сможешь найти.
-вмл-код понятен даже ежу.

недостатки метода 1:
-лично у меня окошко выбора слегка подтормаживало - вероятно, веснот морально не готов к мессаджам с десятком опшионов еще и с картинками. тем не менее, не смертельно - просто при прокрутке слегка расплывалось, потом налаживалось.
-этот метод хорош, если тебе нужно чтобы вариации зомби мог нанимать человек, играющий за сайд 1 (впрочем в 99% веснотской продукции человек играет за сайд 1. насколько я слышал о твоем сценарии, там все так же). в том, что компьютер сможет сделать выбор из таких вариантов, я не уверен. с человеком играющим за сайды 2-9 в теории вроде бы тоже должно получатся, но почему то я еще при разработке эры заметил, что функция side_for в сообщениях глючит. в настоящий момент я работаю над разрешением этой проблемы.

но постойте, дв изобрел еще и метод 2:

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




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

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


собственно суть всей этой темы: если дв, сев за комп в 6-37, может к 7-43м написать два метода реализации какой-то фишки, обладающие лишь некоторыми косметическими недостатками, наверное более пряморукий работник часов за 10 придумает совсем идеальный метод. и нет, переписывать движок не придется.
« Последнее редактирование: Май 05, 2016, 07:47:50 от DV »
Возглавляет силы зла

Aldarisvet

  • level 4
  • ****
  • Сообщений: 582
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Chrome 41.0.2272.101 Chrome 41.0.2272.101
    • Просмотр профиля
Re: для алдари
« Ответ #1 : Май 20, 2016, 09:45:42 »
Я написал на официальном форуме про твои методы вызова вариаций.
Один чувак с официального форума (логин Shiki )заинтересовался твоими способами решить проблему.
На этом форуме он зарегистрироваться не может почему-то, не приходит ему письмо об активации.
Он будет благодарен, если ты выложишь здесь код своих методов.

DV

  • Глобальный Модератор
  • level 5
  • *****
  • Сообщений: 1285
  • Это - Стилфист в молодости.
  • OS:
  • Linux (Ubuntu) Linux (Ubuntu)
  • Browser:
  • Chrome 41.0.2272.76 Chrome 41.0.2272.76
    • Просмотр профиля
  • Раса: Мертвец
Re: для алдари
« Ответ #2 : Май 20, 2016, 10:11:31 »
могу я увидеть ссылку на то место официального форума, где происходило вышеописанное действо?

на данный момент я уже удалил код, который писал для этой темы, т.к. ты не показал заинтересованности, но я разумеется смогу повторить, если это кому-то надо.
« Последнее редактирование: Май 20, 2016, 10:13:40 от DV »
Возглавляет силы зла

Aldarisvet

  • level 4
  • ****
  • Сообщений: 582
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Chrome 41.0.2272.101 Chrome 41.0.2272.101
    • Просмотр профиля

DV

  • Глобальный Модератор
  • level 5
  • *****
  • Сообщений: 1285
  • Это - Стилфист в молодости.
  • OS:
  • Linux (Ubuntu) Linux (Ubuntu)
  • Browser:
  • Chrome 41.0.2272.76 Chrome 41.0.2272.76
    • Просмотр профиля
  • Раса: Мертвец
Re: для алдари
« Ответ #4 : Май 20, 2016, 10:25:26 »
я должно быть чего-то не понимаю, но там только твой пост, а про человека, о котором ты говорил, ничего нету.
Возглавляет силы зла

Aldarisvet

  • level 4
  • ****
  • Сообщений: 582
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Chrome 41.0.2272.101 Chrome 41.0.2272.101
    • Просмотр профиля
Re: для алдари
« Ответ #5 : Май 20, 2016, 10:53:36 »
Потому что он мне в личку написал.

DV

  • Глобальный Модератор
  • level 5
  • *****
  • Сообщений: 1285
  • Это - Стилфист в молодости.
  • OS:
  • Linux (Ubuntu) Linux (Ubuntu)
  • Browser:
  • Chrome 41.0.2272.76 Chrome 41.0.2272.76
    • Просмотр профиля
  • Раса: Мертвец
Re: для алдари
« Ответ #6 : Май 20, 2016, 10:56:37 »
все, понял. да, интересный человек - понял все правильно, даже не зная языка. я восстановлю код где-нибудь завтра утром и скину.
Возглавляет силы зла

DV

  • Глобальный Модератор
  • level 5
  • *****
  • Сообщений: 1285
  • Это - Стилфист в молодости.
  • OS:
  • Linux (Ubuntu) Linux (Ubuntu)
  • Browser:
  • Chrome 41.0.2272.76 Chrome 41.0.2272.76
    • Просмотр профиля
  • Раса: Мертвец
Re: для алдари
« Ответ #7 : Май 20, 2016, 22:16:04 »
first method uses simple define like this:

#define APPLY_TO_VARIATION X Y NAME
    [object]
        silent=yes
        duration=forever

        [filter]
            x={X}
    y={Y}
        [/filter]

        [effect]
            apply_to=variation
            name={NAME}
        [/effect]
    [/object]
#enddef

and if you make event like this:

[event]
    name=prerecruit
    fitst_time_only=no
    [filter]
type=Soulless
    [/filter]
    [message]
speaker=narrator
message=_"Choose a variation:"
side_for=$side_number
[option]
    message=_"Normal zombie"
    [command]
{APPLY_TO_VARIATION $x1 $y1 "none"}
    [/command]
[/option]
[option]
    message=_"Mounted zombie"
    [command]
{APPLY_TO_VARIATION $x1 $y1 "mounted"}
    [/command]
[/option]
...
    [/message]
[/event]

it should work. you can see full list of zombies variation names in file data/core/units/undead/Corpse_Walking.cfg

If you want to change variation of unit which you hasn't recruit but achieved by some another way, you can make event like this:


[event]
    name=turn 1
    fitst_time_only=no
   
    [store_unit]
          [filter]
               type=Soulless
          [/filter]
          kill=no
          variation=zombies
    [/store_unit]
    {FOREACH zombies zz}
          ...
    {NEXT zz}
[/event]
Instead of "..." you use same method for every unit, uses $zombies[$zz].x as it's x-coordinater and $zombies[$zz].y as it's y-coordinate
so every soulless of the map will be replaced to variation which its owner can choose for every separate unit.

pros of this method:
- it isn't requires lastest versions of wesnoth
- code is very simple
minuses of this method:
- it wouldn't work if you want to change not only variation but also type of the unit
- AI probably can't make a choice effectively
- lastest 1.13.4 verson has problems with showing messages to sides other than side 1 (side_for doesn't work correctly). Let's see how this problem will be developed in farther versions.

So there is more complex method which uses four defines:
1) define to remove one of units advancements (you can forbid advancement to every separate unit type):
#define REMOVE_ADVANCEMENTS X Y ID
    [object]
        silent=yes
        duration=forever

        [filter]
            x={X}
    y={Y}
        [/filter]

        [effect]
            apply_to=remove_advancement
    types={ID}
        [/effect]
    [/object]
#enddef
2) define to remove one of units AMLA advancements by id of this advancement (simple default "AMLA+3" which using by all default units has id=amla_default so you can forbid it If you need)
#define REMOVE_AMLAS X Y ID
    [object]
        silent=yes
        duration=forever

        [filter]
            x={X}
    y={Y}
        [/filter]

        [effect]
            apply_to=remove_advancement
    amlas={ID}
        [/effect]
    [/object]
#enddef
3) define with add advancement for unit (you can allow any unit to advance to any other unit):
#define ADD_ADVANCEMENT X Y FROM TO
    [object]
        silent=yes
        duration=forever

        [filter]
            x={X}
    y={Y}
        [/filter]

        [effect]
            apply_to=new_advancement
    replace=no
    [filter]
type={FROM}
    [/filter]
            types={TO}
        [/effect]
    [/object]
#enddef
filter with {from} required to unit don't advances to {to} type when it's already reach this type (it's possible for unit to be advanced to itself, but of course we want for advanced unit to be advanced accordingly to his new type advancement list, so we use this filter). you can read about effects and how it works on https://wiki.wesnoth.org/EffectWML

4) define to add AMLA advancement (unit advances to himself which some additional effects aplies. so we add AMLA with effect which we've used in method 1):

#define ADD_ADVANCEMENT_VARIATION X Y NAME DESCRIPTION
    [object]
        silent=yes
        duration=forever

        [filter]
            x={X}
    y={Y}
        [/filter]

        [effect]
            apply_to=new_advancement
    replace=no
            [advancement]
        id=adv_{NAME}
        description={DESCRIPTION}
            [effect]
                apply_to=variation
                name={NAME}
        [/effect]
        [/advancement]
        [/effect]
    [/object]
#enddef

don't forget about id of AMLA: you will need it to remove this AMLA.

using this 4 defines and developers' script {ADVANCE_UNIT (x,y=$x1,$y1) ()} we can transform any unit to any another unit or apply any possible effects to unit. If unit have different variants of advancement (simple advancement and amlas both), player can choose variant, and what very important, AI can work with this interface as well.
So, if we want to choose unit's variation we just need remove it's default advancements, add our "variation's" advancement, advance our unit, remove "variation's" amla's back and add default advancement back:

[event]
    name=prerecruit
    fitst_time_only=no
    [filter]
type=Walking Corpse
    [/filter]
    {REMOVE_ADVANCEMENTS $x1 $y1 "Soulless"}
    {ADD_ADVANCEMENT_VARIATION $x1 $y1 "none" _"Normal Zombie"}
    {ADD_ADVANCEMENT_VARIATION $x1 $y1 "mounted" _"Mounted Zombie"}
    ...
    {ADVANCE_UNIT (x,y=$x1,$y1) ()}
    [heal_unit]
[filter]
   x=$x1
   y=$y1
[/filter]
amount=full
    [/heal_unit]
    {REMOVE_AMLAS $x1 $y1 "adv_none"}
    {REMOVE_AMLAS $x1 $y1 "adv_mounted"}
    {ADD_ADVANCEMENT $x1 $y1 "Walking Corpse" "Soulless"}
[/event]

pros of this method:
- it can be used by any number of human players and AI as well
- you can change literally anything in unit.
minuses of this method:
- effects "new_advancement" and "remove_advancement" requires 1.13.2 or later version
- it's still not possible to choose message in advancement window so you will see absolutely irrelevant and inelegant "what your victorious unit should become?" every time you need choose some variants. Let's see how this problem will be developed in farther versions.
« Последнее редактирование: Май 20, 2016, 22:28:01 от DV »
Возглавляет силы зла