А верите ли вы что...
-
Контроль хомяка с компьютера игрока заключается исключительно в отправке команд поведения (для этого скрипты и нужны). Все остальное, в том числе шансы варки, вылупления и развития хомяка обсчитывает сервер. Так же, как и дроп с мобов, к примеру. Отсюда логичный вывод - все алгоритмы можно посмотреть в исходниках. Другое дело, что исходники Aegis (или что там официалки используют) недоступны простым смертным, но нам это и не надо. Мотр основан на еафине, а ее код открыт. Так что вот.
-
интересно как рандом описан в еафине? я не силён в програмизме, поэтому у меня удивление в твоей уверености об исходниках ... если исходники еафины открыты и ты в этом нехило шариш, раздупли мотровцев хотябы ...
-
[code:3tfnwgry]/* generates a random number on [0,0xffffffff]-interval /
static unsigned long atn_int32_randommt(void)
{
unsigned long y;
static unsigned long mag01[2]={0x0UL, MATRIX_A};
/= x * MATRIX_A for x=0,1 */if (mti >= N) { /* generate N words at one time */ int kk; if (mti == N+1) /* if init_genrand() has not been called, */ atn_srandommt(5489UL); /* a default initial seed is used */ for (kk=0;kk<N-M;kk++) { y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK); mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL]; } for (;kk<N-1;kk++) { y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK); mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL]; } y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL]; mti = 0; } y = mt[mti++]; /* Tempering */ y ^= (y >> 11); y ^= (y << 7) & 0x9d2c5680UL; y ^= (y << 15) & 0xefc60000UL; y ^= (y >> 18); return y;
}
long atn_int31_randommt(void)
{
return (long)(atn_int32_randommt()>>1);
}[/code:3tfnwgry]
Код функции генератора случайных чисел еафины за билдом нумер 2268. Не вдаваясь в подробности и ОЧЕНЬ утрированно - при запуске сервер создает случайное число. Все дальнейшие вызовы этой функции (а вызывается она часто - перемещение мобов по локации, дроп, скиллы, заточка и куча всего другого) над этим числом производятся хитрые преобразования, по результатам которых получается следующее число. И т.д. для каждого рандомайза. Суть в том, что теоретически возможно предсказать следующее значение, которое выдаст данная функция. Но для этого надо, чтобы данную функцию не вызывал вообще никто, кроме игрока (т.е. сервер должен держать абсолютно пустые локации. К примеру, замки не во время гв). Зная начальное значение генератора, можно добиться нужного нам результата, если рассчитать последовательность случайных чисел на мноооого шагов вперед и "сбрасывать" неподходящие значения ненужным вызовом этой функции (к примеру, быть мсом и пытаться нубоножик заточить). Отсюда вывод - при наличии сферического сервера в вакууме и большого количества упрямства можно корейским рандомом рулить.Теперь что касается покемончиков. Т.к. сейчас на компе афины у меня нет, а качать билд мне лень, точно сказать не могу. Но с огромной долей уверенности предположу, что в описании обработки левел апа гомункулуса идет вызов этого самого генератора, дабы определить рост статов. Учитывая вывод предыдущего абзаца - при наличии сферического сервера в вакууме и ОЧЕНЬ большого количества упрямства можно наутюжить себе идеального покемона, у которого рост статов на каждом уровне будет максимален для своего вида.
Но, повторюсь, это не в реалиях игровых серваков. Это на локальном-то фиг сделаешь (да и зачем?).Кстати, отсюда же опровержение того, что рост хомяка закладывается при рождении. Я крайне сомневаюсь, что на каждого покемона сервер создает файл, в котором закладывает значения для роста статов на левел-апы. Ибо нафиг надо разработчикам так делать. Логичнее при каждом уровне взывать ко всемогущему рандому.
Так что вот. Надеюсь, хоть сколько-то стало понятнее х___х
PS Цензура десу х_х заменила нехорошие слова на хорошие, но смысл остался тот же.
-
[code:18sdic9l]int merc_hom_levelup(struct homun_data *hd)
{
тут было бла бла про получение скилпоинтом и много чего еще, но не хочу огромных цитатgrowth_max_hp = rand(min->HP, max->HP); growth_max_sp = rand(min->SP, max->SP); growth_str = rand(min->str, max->str); growth_agi = rand(min->agi, max->agi); growth_vit = rand(min->vit, max->vit); growth_dex = rand(min->dex, max->dex); growth_int = rand(min->int_,max->int_); growth_luk = rand(min->luk, max->luk); //Aegis discards the decimals in the stat growth values! growth_str-=growth_str%10; growth_agi-=growth_agi%10; growth_vit-=growth_vit%10; growth_dex-=growth_dex%10; growth_int-=growth_int%10; growth_luk-=growth_luk%10; hom->max_hp += growth_max_hp; hom->max_sp += growth_max_sp; hom->str += growth_str; hom->agi += growth_agi; hom->vit += growth_vit; hom->dex += growth_dex; hom->int_+= growth_int; hom->luk += growth_luk;
тут было еще немного бла бла
}
[/code:18sdic9l]Это к теме левел апа. Считается прирост, откидываются знаки после запятой, прирост прибавляется к статам. Функция rand генерирует случайные числа между min и max. Значения статов для аргументов (например min->str, max->str) указаны в отдельном файле и для каждого типа свои.
Почему иначе было бы крайне нелогично хорошо расписано у Aiko Star.
Код из Revision 13695. -
А я верю в то, что если накормить хомячка до 200%, он раздуется и лопнет :sorry:
-
а ешё его разорвёт капля никатина
-
вот вам для раздумий:
Был у меня на сервере Терра хим с гомункулом Филир. очень хотелось посмотреть, что с ним(гомом) будет на 99 лвле..
Когда появился тестовый Альтаир, и был произведен перенос персов туда, то я решил исполнить свою мечту и покачать его там, заодно посмотреть как раскидываются статы... следил за ними последующие 10 лвлов
прокачал его на АЛьтаире, удовлетворился тестами и решил докачать на терре...
и что бы вы могли подумать? статы у гома вкачивались именно так, как это происходило на Альтаире.. точь-в-точь..
Совпадение? -
На Терре не могло быть гома, лол.
-
терра наверно нынешний мотр, ибо сириус на терру переносили
-
Переноса с сервера на сервер с гомункулами не было.
Сначала были терра+сириус, потом открыли альтаир, на который в какой-то момент перенесли дб с терры, а потом с сириуса.
Потом альтаир вайпнули, а на новый сервер, мотр, перенесли дб с сириуса и терры, где гомов не было. -
Мда долги был процесс.
Думаю парень чтото напутал, но суть в том, что гом получился такойже... -
Переноса с сервера на сервер с гомункулами не было.
был перенос, альтаир зимой запускали, моего гома тоже переносили, но я первого гома удалял и не следил одинаково качался или нет
-
Вы про зиму 08—09?
-
не помню зима какого года была... но факт имеет место быть...
или вы думаете я вам тут сказки придумываю? -
Ни на Терре, ни на Сириусе гомункулусов не было.
-
Гомункулусы были введены осенью 2008 года вместе с остальными обновлениями, примерно год назад. Не знаю, поднимали ли этой зимой альтаир, но хомяки были когда-то оооочень давно, когда этот самый альтаир назывался вегой еще.
-
@GingerAle:
Вы про зиму 08—09?да, и база чаров на альаире уже была за осень, уже успели насоздавать гомов
-
Тогда ок.
Подумаю еще, как это проверить на локалке. -
Учитывая, что сервер был не в вакууме, проверяется ненавязчиво: Вылупить хомяка, вырубить сервер, забекапить, прокачать десяток уровней, поднять с бекапа, повторить там, сравнить.
К тому же если бы хомяку прописывалась бы его судьба, уж наверняка не мы тут самые умные в мире, чтобы первыми до этого додуматься.
Технически куда логичнее каждый раз обращаться к процессору раз расчётом, чем иметь на дисках десятки тысяч файлов (на мотре 5к химиков, а это не самый большой сервер) с описаниями роста каждого гома, и то и дело обращаться к ним, считывать, искать там соответствующий уровень итд.
Sacrifice, что значит точь-в-точь? Расскажите, поподробнее. Одинаковый прирост каждого стата на каждом уровне? Как вы поняли что хомяки одинаковые, не по памяти же? -
Ну, то что статы не при создании, а при лвл апе задаются было уже доказано рестартами с откатами.
Но тем не менее от этого ничего для игрока не меняется.