Здравствуйте.
Вопрос у меня таков: почему функция SaveStr() для hashtable может работать выборочно, то есть при одинаковой по принципу записи функций для сохранения строки одна из них работает, а другая - нет. ParentKey отличается на 5, а ChildKey одинаков.
Связано ли это с тем, что нужны разные ChildKey? Не работает та функция, которая должна сохранять строку первой.

Принятый ответ

PhysCraft, ясно ты пытаешься использовать хэш для рецептов
но лучше для этих целей использовать массивы(на каждый рецепт отводи по 6-7 ячеек)
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
28
9 лет назад
0
набыдлокодил значит
кидай пример своих попыток чтобы знать где ты ошибся
0
20
9 лет назад
Отредактирован PhysCraft
0
nvc123, вот:
call SaveStr(B0S_HT,10,'rhe2',CreateRecipe(3,'oslo','gomn','pams',0,0,0,0,0,0,0,0,0,0,0))
call SaveStr(B0S_HT,15,'rhe2',CreateRecipe(3,'oslo','rsps','pams',0,0,0,0,0,0,0,0,0,0,0))

call rec.SetReagents(LoadStr(B0S_HT,lvl+15,newitem)) // сработало
call rec.SetReagents(LoadStr(B0S_HT,lvl+10,newitem)) // не сработало,
// в обоих случаях lvl равно 0, newitem равно 'rhe2'.
CreateRecipe просто делает одну строку из всех равкодов и числа.
В некоторых случаях все срабатывает. Может дело в том, что берется lvl+10 а не просто 10?
2
28
9 лет назад
2
дебаг добавь на все ключи
и что это за строка такая?
если там только равкод то лучше инт сохранять
просто я использовал сохранение строк только для каста скилов
и там всё работало нормально
0
20
9 лет назад
0
Не могу инт, мне нужна последовательность равкодов одной переменной. Даже если сделать массив равкодов, то мне нужны буду строки с индексами элементов. В большинстве случаев все работает нормально, но вот такое иногда. Будем дебажыть и обходить использование lvl.

Передебажил, реально проблема в строке. Ключи на месте все. Но вот почему некоторые сохраняет, а некоторые нет - неизвестно, да и не сохраняет оно не по порядку записи в коде. Буду искать другой способ достижений нужного результата, по другому организовывать проверку рецепта.
2
28
9 лет назад
2
PhysCraft, ясно ты пытаешься использовать хэш для рецептов
но лучше для этих целей использовать массивы(на каждый рецепт отводи по 6-7 ячеек)
Принятый ответ
0
20
9 лет назад
0
То есть, взять огромный массив integer, отвести на каждый рецепт 7 ячеек, а в таблицу тогда сохранять для рецепта лишь количество компонентов и индекс первого из них. Тогда равкод брать как ParentKey. Но не всегда нужно отводить до 7 ячеек, ведь они все заданы наперед, в некоторых компонент лишь 2-3. Идея ясна. Попутно нашел утечки со строкой.
Но предметов куча, лучше тогда 2 массива хотя-бы, что бы индекс потом не вышел за границу при добавлении новых предметов в базу.

Базовая идея реализована, закроем вопрос.
0
28
9 лет назад
0
взять огромный массив integer
зачем огромный?
стандартного 13 размера хватит
PhysCraft:
количество компонентов и индекс первого из них
зачем?
количество компонентов равно 7
просто те компоненты у которых равкод равен 0 не учитываем
например для предмета из 2 ингредиентов рецепт следующий
'I000','I001',0,0,0,0,0
приложу свою старую системку для 6 предметов(открывать блокнотом)
Загруженные файлы
0
20
9 лет назад
Отредактирован PhysCraft
0
я просмотрел твою системку,она хорошая, но я решил сделать иначе.
Я подумал сделать так:
  • есть глобальный массив равкодов предметов, упорядочен по рецептам
  • я сохраняю дополнительно индекс первого элемента рецепта и количество компонент.
Почему? Большинство рецептов в карте имеют менее 7 компонент, зачастую 2 или 3.
Некоторые я объединил в последовательность и обрабатываю как апгрейд.
Итого, те элементы, которые равны 0 я даже не рассматриваю, их нет изначально
Вместо 7 значений integer я сохраняю только 4, если компонентов 2.
А дальше у меня есть структура рецепта, куда я просто пересылаю данные о его нахождении в массиве, а там уже методы делают свое дело.
В твоем случае нужно регистрировать на каждый рецепт отдельный экземпляр структуры, в моем - все в массиве, но еще используется hashtable, как и у тебя. Плюс тебе нужно еще каждый предмет регистрировать, а у меня все, что не подпадет под некоторые условия рецептов просто проходит мимо.
Что лучше: делать экземпляры и сохранять на них ссылки или взять массив и сохранять ссылки на него? Или мой минус в ограниченности массива, которых можно взять и несколько?
Минусом есть то, что при изменении рецептов придется вручную редактировать весь массив.
Но можно сделать функцию для заполнения массива, тогда он сам по себе будет правильно заполняться регистрацией рецептов.
И извините за разведение оффтопа.
0
28
9 лет назад
0
PhysCraft, твой минус в том что ты не учёл что один и тотже предмет может использоваться в разных рецептах
по сути регистрация предметов у меня нужна для того чтобы облегчить поиск возможных рецептов
тоесть если юнит получает предмет с равкодом 'I000' то мы проверяем только те рецепты которые используют предмет 'I000' (их у меня максимум 6) вместо проверки 100500 различных рецептов что приведёт к лагам
структура == массив
PhysCraft:
И извините за разведение оффтопа.
это не оффтоп а уточнение ответа
0
20
9 лет назад
0
nvc123, у меня там своя система проверки рецептов. Я не говорю, что моя система идеальна (кстати я все же переделал потом под структуры немного освежив в памяти информацию о них). Почти все рецепты активируются на базе покупкой пустышек из магазина, имея рав--код пустышки я получаю прямую ссылку на рецепт в таблице. Также использовал разделение предметов по типам и уровням. Перебор там лишь в одном случае идет, и то до 18 максимум( уже больше 6!). Твой пример еще потребуется изучить дополнительно, в любом случае спасибо за помощь.
Я ведь все это заварил как раз из-за проверки многих рецептов по GUI-триггерах. Идея с регистрацией предметов пока пусть полежит рядом, ее польза не отрицается.
Суть в том, что я не хочу регистрировать все предметы, это нужно разве что для перебора до 18.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.