Задача№9:Исправить"случайность"в Вендинге[сделано]

Общие вопросы по OpenKore обсуждаются здесь. Можно сказать, что это - основной раздел форума.
Возник вопрос? Вам сюда.

Модератор: 4epT

Правила форума
Все вопросы по OK не касающиеся плагинов и макросов публикуются в этом разделе.
Перед тем как что то писать, пожалуйста, удостоверьтесь что данная тема не поднималась, вы полностью изучили мануалы по конфигурационным файлам бота и не нашли там решения.
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Задача№9:Исправить"случайность"в Вендинге[сделано]

Сообщение piroJOKE »

[2006-X-17] (сокращенный вариант)

piroJOKE:
У купца, который ставит магазин, есть такая опция "случайный порядок вещей в магазине".
shop_random 1

Мне не нравится, как оно работает.

Предположим, у нас список shop.txt, и в нем 20 вещей.
Все эти вещи в тележке есть.
Теперь, если мы включим упомянутую выше опцию,
в список продажи будут каждый раз попадать лишь 12 первых вещей из списка
shop.txt, но в случайном порядке.

А хотелось бы, чтобы попадали 12 случайных вещей из 20. Не из 12 первых. А из всех 20.
...

Click:
Попытка №2
Мона попробовать написать два массива
1. Заполняется полностью до количества итемов в телеге, потом рендом по условию
2. заполняется из первого массива до $max_items

Попытка №3
1. Заполняется полностью до количества итемов в телеге, потом рендом по условию
2. Вот в этой процедуре:
sub openShop {
my @items = makeShop();
return unless @items;
$shop{title} = ($config{shopTitleOversize}) ? $shop{title} : substr($shop{title},0,36);
sendOpenShop($shop{title}, \@items);
message TF("Shop opened (%s) with %d selling items.\n", $shop{title}, @items.""), "success";
$shopstarted = 1;
$shopEarned = 0;
}
поставить не весь массив, а только с первого до $max_items = $char->{skills}{MC_VENDING}{lv} + 2

Ну эт просто предложение.

Третье будет более красиво.
Click:
нету у меня торгашей и не играл ими)
могу попробрвать написать, но как тестить?
piroJOKE:
Как обычно. ;) Качаешь eAthena, разворачиваешь его у себя, коннектишься к локальному серваку.
(Развертываение еА занимает 5 минут; с непривычки у тебя займет минут 20).
Click:
Скинь мне плиз конфиг на торгаша и нужные к нему файлы, ниразу не делал торгаша.
piroJOKE:
Никакого конфига нет. Просто заполняешь shop.txt. Ахтунг, там разделители - табуляторы.

Потом ценные команды:

testshop - посмотреть что за шоп получится
openshop - открыть
closeshop - закрыть
al - посмотреть что продалось (еще exp item в помощь)

Ну и разумеется полезная штука reload shop для перечитывания исправленного shop.txt, не выходя из игры.

PS: Еще вот это может пригодится. "если положить вещь в тележку, она становится "не идентифицированной" (здесь должна быть ссылка!). Хотя врядле.
PPS: Оффтоп: Залил клаву портвейном. Теперь кнопки залипают. Ну, вот и как дальше жить, когда жмешь одно, а печатается совсем другое? ^__^
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Click, 2006-10-18:
в общем сделал чтобы всё рандомизилось
тока вот не шарю как сделать например чтобы, например: из массива @odin, в котором 15 значений
забивались в массив @dva первые 12 значений
кто шарит в этом перле напишите плиз процедурку.
Click:
массив получается не из 12 значений, а больше. тестшоп выполняется, а магазин не открывается, так как нельзя запихнутть в магазин больше 12
вот теперь надо либо создавать второй массив из первого в котором будут первые 12 значений, или из первого удалять все значения которые дальше чем 12. Я перл в школе не проходил.
Click:
короче нах всё делаем вот так и всё работает без запар (способ 4)))

Код: Выделить всё

sub makeShop {
if ($shopstarted) {
 error T("A shop has already been opened.\n");
 return;
}

if (!$char->{skills}{MC_VENDING}{lv}) {
 error T("You don't have the Vending skill.\n");
 return;
}

if (!$shop{title}) {
 error T("Your shop does not have a title.\n");
 return;
}

my @items = ();
my $max_items = $char->{skills}{MC_VENDING}{lv} + 2;

# Iterate through items to be sold
findCartItemInit();
shuffleArray(\@{$shop{items}}) if ($config{shop_random});
for my $sale (@{$shop{items}}) {
 my $index = findCartItem($sale->{name}, 1, 1);
 next unless defined($index);

 # Found item to vend
 my $cart_item = $cart{inventory}[$index];
 my $amount = $cart_item->{amount};

 my %item;
 $item{name} = $cart_item->{name};
 $item{index} = $index;
 $item{price} = $sale->{price};
 $item{amount} =
$sale->{amount} && $sale->{amount} < $amount ?
  $sale->{amount} : $amount;
 push(@items, \%item);

 # We can't vend anymore items
 last if @items >= $max_items;
}

if (!@items) {
 error T("There are no items to sell.\n");
 return;
}
#shuffleArray(\@items) if ($config{shop_random});
return @items;
}
(табуляторы убились при переносе, увы)

делаем просто шафл шопа.тхт, а не шафл готового списка продажи

(piroJOKE: добавил тег CODE + нужные пробелы в код для "красоты")

Отредактировано Click (2006-10-18 04:25:15)
piroJOKE:
Жду пива
Ничего не будет. ;)
Зато вот - спасибо тебе, проверю! ;)

ЗЫ: Ээээ... Публикуй плз подобное безобразие в тегах [ code ] [/ code ], без них листинг очень трудно читаеццо!

ЗЗЫ: Сатри, как я оформляю подобные вещи:
______________________________________________________
\src\Misc.pm:

Код: Выделить всё

Код:

sub makeShop {
	...
	# Iterate through items to be sold
	findCartItemInit();
+	shuffleArray(\@{$shop{items}}) if ($config{shop_random});
	for my $sale (@{$shop{items}}) {
	...
-	shuffleArray(\@items) if ($config{shop_random});
	return @items;
	...
ЗЗЗЫ: Почему именно так? Вот смотри, чтобы понять, что именно ты изменил в коде, мне пришлось вырезать обе процедуры - твою и оригинальную, и сравнить их:
Изображение
А из примера выше разница видна сразу. (Особенно если не выкидывать куски кода, как я это сделал. ;)
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

piroJOKE, 2006-10-18:
Если пройдет проверку, опубликуем на форуме OpenKore. ^___^
piroJOKE:
Клик, зачот! ^_____^

А теперь минус(ы) метода...

Всё бы было ничего, но мы фактически лишились команды testshop, потому что она ни о чем не говорит (кроме заголовка магазина)... потому что следующий openshop сгенерирует уже другой список.
То есть, использование метода подразумевает высокую дисциплину при составлении shop.txt; и нужно обязательно проверять что мы продаем сразу после команды openshop; иначе легко сесть в лужу с ценами.

Вот если бы testshop фиксировал список, и после команды openshop он уже не "крутился" бы второй раз, это было бы самое оно... Интересно... это возможно?...
piroJOKE:
Финальный вариант:

\src\Misc.pm:

Код: Выделить всё

sub makeShop {
	...
	# Iterate through items to be sold
	findCartItemInit();
+	shuffleArray(\@{$shop{items}}) if ($config{'shop_random'} eq "2");
	for my $sale (@{$shop{items}}) {
	...
-	shuffleArray(\@items) if ($config{shop_random});
+	shuffleArray(\@items) if ($config{'shop_random'} eq "1");
	return @items;
	}
Теперь shop_random из config.txt может принимать такие значения:
0 - случайности в шоп-е отключены;
1 - классический рандом (продавать начало списка, но перемешивать его);
2 - полный рандом (продавать случайные вещи, набирая их из всего списка);

_________________

PS: Создал тему на форуме OpenKore: http://forums.openkore.com/viewtopic.php?t=25901
А дальше пошли дооолгие перепитии, как описать пользователям, ЧТО именно эта штука делает; я их опускаю... Но... это смешно - написать код оказалось быстрее, чем составить толковое описание! Короче, вот чем всё закончилось:

2006-11-05, news.txt из OpenKore 1.9.3 beta:

Код: Выделить всё

- shop_random <flag>
	<flag> may now be 1 (for the old behavior) or 2 (for improved shop
	list randomization). When set to 2, the shop list will first be mixed,
	then the list of items to sell will be generated. When set to 1, the
	the list of items to sell will first be generated, and then that
	list will be mixed. 

...

- Click: improved shop list randomization.
(C) !
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Ответить