(18.10.2021 09:34)Archer30 Wrote: [ -> ]I want to report another problem of the fucntion of getting the hero's basic primary skills. Spell Scrolls must be set as exceptions, otherwise we'd get bugs.
1. Снимать арты с героя для получения первичных навыков, а потом снова одевать арты - мегакостыли. Научитесь уже читать таблицу с бонусами первичных навыков от артефактов и перестаньте страдать воговщиной.

2. Скриптовые функции "!!FU(UnequipArtFromSlot):P(hero)/(slot);" и "!!FU(EquipArtToSlot)&(art)<>(NO_ART):P(hero)/(art)/(slot);" скорее всего не умеют снимать и одевать на героя свитки с заклинаниями (код данных функций не известен, что и как они делают автор проблемы увы не написал, рекомендуется для этого дела всё же использовать родные содовские функции).
XEPOMAHT, 1. Многие арты могут быть уже заскриптованы как раз на снятие, что никак в таблице не будет отражено.
XEPOMAHT, ага. И 2) Собственно, это переходники к содовским функциям.
Есть адрес и структура таблицы с бонусами первичных навыков и понимание, почему в воге она свая? Потому что в оригинальной нет новых артефактов?
Archer30, which bugs did you mean with spell scrols?
(18.10.2021 13:17)Berserker Wrote: [ -> ]2) Собственно, это переходники к содовским функциям.
И где посмотреть-то что там понакручено???
Дать артефакт в слот герою - вызов 4E2C70h
Забрать артефакт из слота героя - вызов 4E2E40h
В обоих функциях арт проверяется на свиток и работает обновление заклинаний, даваемых артефактами.
(18.10.2021 13:17)Berserker Wrote: [ -> ]Есть адрес и структура таблицы с бонусами первичных навыков и понимание, почему в воге она свая? Потому что в оригинальной нет новых артефактов?
Эмм... тогда это что такое в воговских сорцах:
1. Базовый адрес таблицы, которую можно читать с помощью UN:C
Code:
// бонусы артифактов
{0x4E2D26,DP(ArtBonus),4}, //
2. Собственно, перенесённая вогом таблица (Эмереал переносит её точно так же, поэтому разницы не будет, если конечно... Берсеркер опять против базовой адресации):
Code:
// Artifact
_ArtSetUp_ ArtTable[ARTNUM];
char ArtBonus[ARTNUM][4];
char ArtBonusAdd[ARTNUM-ARTNUM_0][4]={// новые артифакты
{0,0,0,0},
{0,0,0,0},
};
Berserker, there was no "/(art)>=(ART_CENTAUR_AXE)/(art)<1000" from the original function. The function will try to unequip scroll and equip back - thus results in problems.
XEPOMAHT,
Из кода сразу видны два адреса: 4E2C70, 4E2E40. Собственно, ты критикуешь то, что предлагаешь.
Quote:2. Собственно, перенесённая вогом таблица
HE:F../../../../1 с этой таблицей работает, но весьма сбойно, если командирский артефакт назначить слоту, например. Что с таблицей делают плагины артефактов не проверял. Просто люди жалуются на вылеты. Ещё любой код в событии Одеть/снять артефакт может реализовать собственные бонусы. Такие бонусы отловить только способом одел/снял всё можно.
Подозреваю, что проблема свитков в другом. Номер заклинаний хранится ведь в отдельном поле. Нужно тестировать, да времени пока нет.
(18.10.2021 22:23)Berserker Wrote: [ -> ]Из кода сразу видны два адреса: 4E2C70, 4E2E40. Собственно, ты критикуешь то, что предлагаешь.
Как раз наоборот: я попросил твой код, который вызывает функцию одевания артефакта. Сейчас смотрю его и вижу, что вызов у тебя организован неправильно, от чего и портятся свитки.
А именно, на функцию должен подаваться адрес 8-байтного куска памяти, в котором должны быть записаны идентификаторы артефакта и свитка. Ты же подаёшь 4-байтный номер артефакта, что естественно будет приводить к записи мусора в структуру героя, где хранится свиток, одетый на героя. А ERM-то с такими весёлыми штуками работать не умеет,
поэтому для вызова 4E2C70 потребуется отдельная ERM-команда с соответствующим переходником (на худой конец можно использовать переменные v1 и v2, сохраняя их значения в переменные y, посылая адрес v1 на функцию, а затем восстанавливая v1 и v2 после вызова, но это уже как-то смотрится кастыльновато...).

Твоя текущая реализация в виде "!!SN:E5123184/(CALLCONV_THISCALL)/(heroStruct)/?(art)/(slot);" всегда будет приводить к ошибкам в структуре героя.
XEPOMAHT, точно, забыл что там указатель на структуру ArtType/ArtSubType, исправлю, спасибо!
A suggestion of UN:I placing object command:
An additional parameter can be added to switch between "using the coordinates as the bottom right of the object" and "using the coordinates as the entrance of the object".
It is a little bit tricky to explain, but I will try.
Currently, the main purpose of this command is for object replacement. For example, in the
Object Replacement Template, it's used for placing a replacement object after removing the original with UN:O. However, when I use it in the template, it isn't convenient enough. In the template, an X coordinate offset and Y coordinate offset have to be set since the UN:I command generates the new object using the the given coordinates as the bottom right of the object, instead of using as the entrance.
Take Library of Legends (dwelling of Emissary of Lore) for example. By searching this object with the
object replacement template, we get the coordinate of the yellow tile. By placing an obejct with exactly the same passability, we've got to set X coordinate offset and Y coorindate offset to 1.

Yellow: Coordinate of the original obejct (get from function)
Red: New object would be placed with Red in the given coordinate
These offsets vary among objects. A script writter has to check the object manually from the map editor to make sure the object is placed correctly. Back to my suggestion, if there is a way to place an object using the given coordinate as the entrace, such trouble can be avoided.
What do you think about the idea

Archer30, what if object has two yellow squares?
Berserker, what's the algorithm for SN:O in this case? I suppose only the same needs to be used
(22.10.2021 12:25)Archer30 Wrote: [ -> ]what's the algorithm for SN:O in this case? I suppose only the same needs to be used
На стандартном ERM рассчитать разницу координат разве проблема? В ERA+ данный двеллинг уничтожается и перестраивается без проблем.
Archer30, SN:O probably returns the first found yellow square.
Yup. In most situations, a script writer would prefer UN:I placing an object from the first yellow square, instead of the square at bottom right. That's my conclusion.