Elmiria Опубликовано 22 мая, 2014 Жалоба Поделиться Опубликовано 22 мая, 2014 (изменено) Пишу игру, в которой столкнулась с тысячью проблем. На данном этапе мне нужно заставить монстра передвигаться по квадратному полю (на одну клетку). Именно монстра, так как поле большое, и дублировать неписей под это дело нет никакого желания. Используется bg_monster, так как только он генерирует GID требуемый командой unitwalk. Проблема в том, что мобы отказываются ходить даже в заранее заданном направлении.Весь скрипт велик , поэтому выложу лишь значимые в данный момент части.генерация моба:if ($moblvl == 31) {set $@game[getarg(0)],30;set .m, getarraysize($@orcind);//debugmes " arraysize orcind "+getarraysize($@orcind)+" ";for (set .@j,0; .@j<81; set .@j,.@j+1){//debugmes " elof orcind from j "+getelementofarray($@orcind,.@j)+" ";if (getelementofarray($@orcind,.m)==0);{set $@game[getarg(0)],30;set $@orcs[.m],.m;set $@orcind[.m],getarg(0);set $@orcx[.m],$x;set $@orcy[.m],$y;//debugmes " getarg0 "+getarg(0)+" ";//debugmes " cicle m "+.m+" ";//debugmes " elof orcs ot m "+getelementofarray ($@orcs,.m)+" ";//debugmes " elof orcx ot m "+getelementofarray ($@orcx,.m)+" ";//debugmes " elof orcy ot m "+getelementofarray ($@orcy,.m)+" ";//debugmes " elof orcind ot m "+getelementofarray ($@orcind,.m)+" ";setd "$orc_"+.m, bg_monster( 0, $mapname$,$x,$y,"Orc baby",2920+4000,"");//set $orc_1, bg_monster( 0, $mapname$,$x,$y,"Orc baby",2920+4000,"");debugmes " orc gid from m "+("$orc_"+.m)+" "+ getd("$orc_"+.m)+" ";debugmes " m "+.m+" ";//monster( $mapname$,$x,$y, "Orc baby",2920,1,""+.m+"::OnMywalkingmodead");callfunc ("searchsimilar", @temp);}}}Функция передвижения моба//------------------------------------------------------ORCMOVEfunction script orcmove {//debugmes " arraysize orcind(f-n orcmove befor loop) "+getarraysize($@orcind)+" ";if (getarraysize($@orcind)>0 ){set .@k,-1;for(set .@i,0; .@i<(getarraysize($@orcind)); set .@i,.@i+1) {set .@k,.@k+1;set .@b, 0;//debugmes " i(f-n orcmove) "+.@k+" ";//debugmes " elof orcind from i(f-n orcmove) "+.@b+" ";//debugmes " elof orcind from 0(f-n orcmove) "+getelementofarray($@orcind,0)+" ";//debugmes " arraysize orcind(f-n orcmove) "+getarraysize($@orcind)+" ";debugmes " k "+.@k+" ";//debugmes " elfo orcin from k "+getelementofarray($@orcind,.@k)+" ";if (getelementofarray($@game,getelementofarray($@orcind,.@k)+1) == 0) {setarray .@direction[.@b],1; set .@b,.@b+1;}if (getelementofarray($@game,getelementofarray($@orcind,.@k)-1) == 0) {setarray .@direction[.@b],2; set .@b,.@b+1;}if (getelementofarray($@game,getelementofarray($@orcind,.@k)+11) == 0) {setarray .@direction[.@b],3; set .@b,.@b+1;}if (getelementofarray($@game,getelementofarray($@orcind,.@k)-11) == 0) {setarray .@direction[.@b],4; set .@b,.@b+1;}debugmes " "+.@direction[0]+" "+.@direction[1]+" "+.@direction[2]+" "+.@direction[3]+" ";//debugmes " arrayysizy dirs "+getarraysize(.@direction)+" ";//debugmes " elof orcin from k "+getelementofarray($@orcind,.@k)+" ";//debugmes " elof game from elof orcin from k "+getelementofarray($@game,getelementofarray($@orcind,.@k)+1)+" ";if ( getelementofarray(.@direction,1) !=0 || getelementofarray(.@direction,2) !=0 || getelementofarray(.@direction,3) !=0 ){//debugmes " "+.@direction[0]+" "+.@direction[1]+" "+.@direction[2]+" "+.@direction[3]+" ";set .@n, getarraysize(.@direction);//debugmes " arraysize dirs "+.@n+" ";set .@l, rand(0,.@n);//debugmes " rand from dirs "+.@l+" ";set .@r, getelementofarray(.@direction,.@l);//debugmes " el from rand from dirs "+.@r+" ";if (.@r == 1) {debugmes " random "+1+" ";set $@orcx[.@k],getelementofarray($@orcx,.@k)+1;debugmes " k "+.@k+" ";debugmes " orc "+("$orc_"+.@k)+" "+getd("$orc_"+.@k)+" ";//unitwalk getd("$orc_"+.@k),getelementofarray($@orcx,.@k),getelementofarray($@orcy,.@k);unitwalk getd("$orc_"+.@k),117,80;set $@game[getelementofarray($@orcind,.@k)],0;set $@orcind[.@k],getelementofarray($@orcind,.@k)+1;set $@game[getelementofarray($@orcind,.@k)],30;cleararray .@direction[0],0,getarraysize(.@direction);debugmes " done ";}else if (.@r == 2) {debugmes " random "+2+" ";set $@orcx[.@k],getelementofarray($@orcx,.@k)-1;debugmes " k "+.@k+" ";debugmes " orc "+("$orc_"+.@k)+" "+getd("$orc_"+.@k)+" ";//unitwalk getd("$orc_"+.@k),getelementofarray($@orcx,.@k),getelementofarray($@orcy,.@k);unitwalk getd("$orc_"+.@k),117,80;set $@game[getelementofarray($@orcind,.@k)],0;set $@orcind[.@k],getelementofarray($@orcind,.@k)-1;set $@game[getelementofarray($@orcind,.@k)],30;cleararray .@direction[0],0,getarraysize(.@direction);debugmes " done ";}else if (.@r == 3) {debugmes " random "+3+" ";set $@orcy[.@k],getelementofarray($@orcy,.@k)+11;debugmes " k "+.@k+" ";debugmes " orc "+("$orc_"+.@k)+" "+getd("$orc_"+.@k)+" ";//unitwalk getd("$orc_"+.@k),getelementofarray($@orcx,.@k),getelementofarray($@orcy,.@k);unitwalk getd("$orc_"+.@k),117,80;set $@game[getelementofarray($@orcind,.@k)],0;set $@orcind[.@k],getelementofarray($@orcind,.@k)+11;set $@game[getelementofarray($@orcind,.@k)],30;cleararray .@direction[0],0,getarraysize(.@direction);debugmes " done ";}else if (.@r == 4) {debugmes " random "+4+" ";set $@orcy[.@k],getelementofarray($@orcy,.@k)-11;debugmes " k "+.@k+" ";debugmes " orc "+("$orc_"+.@k)+" "+getd("$orc_"+.@k)+" ";//unitwalk getd("$orc_"+.@k),getelementofarray($@orcx,.@k),getelementofarray($@orcy,.@k);unitwalk getd("$orc_"+.@k),117,80;set $@game[getelementofarray($@orcind,.@k)],0;set $@orcind[.@k],getelementofarray($@orcind,.@k)-11;set $@game[getelementofarray($@orcind,.@k)],30;cleararray .@direction[0],0,getarraysize(.@direction);debugmes " done ";}}else{return;}//{// set .@near,rand(3);//if .@near ==0//if .@near ==1//if .@near ==2//if .@near ==3//areamonster $mapname$,$x,$y,$x,$y,"Orc Baby",2920+4000,1,""+$j+"::OnMyWalkingMobDead";//}}return;}elsereturn;}вывод дебагов с консоли.[Debug]: script debug : 2000004 110386580 : done[Debug]: script debug : 2000004 110386580 : k 0[Debug]: script debug : 2000004 110386580 : 2 3 4 0[Debug]: script debug : 2000004 110386580 : random 3[Debug]: script debug : 2000004 110386580 : k 0[Debug]: script debug : 2000004 110386580 : orc $orc_0 110389158[Debug]: script debug : 2000004 110386580 : done[Debug]: script debug : 2000004 110386580 : k 1[Debug]: script debug : 2000004 110386580 : 1 2 3 4[Debug]: script debug : 2000004 110386580 : random 4[Debug]: script debug : 2000004 110386580 : k 1[Debug]: script debug : 2000004 110386580 : orc $orc_1 110389160[Debug]: script debug : 2000004 110386580 : done[Debug]: script debug : 2000004 110386580 : k 0[Debug]: script debug : 2000004 110386580 : 1 2 3 4[Debug]: script debug : 2000004 110386580 : random 3[Debug]: script debug : 2000004 110386580 : k 0[Debug]: script debug : 2000004 110386580 : orc $orc_0 110389158[Debug]: script debug : 2000004 110386580 : done[Debug]: script debug : 2000004 110386580 : k 1[Debug]: script debug : 2000004 110386580 : 1 2 3 4eathena 15238 (вроде) модификации есть: костюмы, автобай, телепортменю и еще одна (возможно из-за нее все) для скрипта goddameit вроде, которая позволяет моба атаковать мобов(не работает, кстати)BUILDIN_FUNC(getmobxy){int num, id;char *name;struct mob_data *md = NULL;TBL_PC *sd = st->rid?map_id2sd(st->rid):NULL;id = script_getnum(st,2);if(!(md = (struct mob_data *)map_id2bl(id)) || md->bl.type != BL_MOB || !data_isreference(script_getdata(st,3)) ){script_pushint(st,0);return 0;}num=st->stack->stack_data[st->start+3].u.num;name=(char *)(str_buf+str_data[num&0x00ffffff].str);setd_sub(st,sd,name,0,(void *)(int)md->bl.x,script_getref(st,3));setd_sub(st,sd,name,1,(void *)(int)md->bl.y,script_getref(st,3));script_pushint(st,1);return 0;}//BUILDIN_DEF(getmobxy,"i*"), Изменено 22 мая, 2014 пользователем Elmiria Ссылка на комментарий Поделиться на другие сайты Поделиться
botka4aet Опубликовано 22 мая, 2014 Жалоба Поделиться Опубликовано 22 мая, 2014 Разве в функцию не надо подавать входные данные? Ссылка на комментарий Поделиться на другие сайты Поделиться
Elmiria Опубликовано 22 мая, 2014 Автор Жалоба Поделиться Опубликовано 22 мая, 2014 (изменено) На данном этапе все переменные, которые передаются между функциями - глобальные - поэтому нет необходимости ничего вводитьсобственно не работает это и единственная переменная тут проверена, выдает верный GIDunitwalk getd("$orc_"+.@k),117,80; Изменено 22 мая, 2014 пользователем Elmiria Ссылка на комментарий Поделиться на другие сайты Поделиться
botka4aet Опубликовано 22 мая, 2014 Жалоба Поделиться Опубликовано 22 мая, 2014 (изменено) Пока вижу не по теме:set .@n, getarraysize(.@direction); .@n от 0 до 4set .@l, rand(0,.@n); .@l от 0 до 4set .@r, getelementofarray(.@direction,.@l); .@r при .@l=4 ? Изменено 22 мая, 2014 пользователем botka4aet Ссылка на комментарий Поделиться на другие сайты Поделиться
Elmiria Опубликовано 22 мая, 2014 Автор Жалоба Поделиться Опубликовано 22 мая, 2014 (изменено) Это было для дебага, вылавливала баги и ошибки логики. там часть над переделать, но смысл я поняла) 0, забыла убрать в последний раз. Там все равно в направлениях куева туча проверок убрана, из-за того, что мой эмуль отказывается работать с переменной перебора цикла. Мб канеш цикл по другому построить, но это будет уже когда основа заработает.Вообще у меня сейчас введена туча переменных, которые по хорошему не нужны. Либо для дебага, либо для наглядности. Но оптимизировать бум потом, как и убрать глобальные переменные.UPD принудительно заставила ходить своего чара вместо моба. сработало.... но почему мобы не хотят т__________т я не хочу уже все с начала начинать переделывать..... Изменено 22 мая, 2014 пользователем Elmiria Ссылка на комментарий Поделиться на другие сайты Поделиться
Functor Опубликовано 22 мая, 2014 Жалоба Поделиться Опубликовано 22 мая, 2014 У Вашего моба установлен режим MD_CANMOVE?Если нет, то моб не ходит из-за этих строк в функции unit_walktoxy:if(!(flag&2) && (!(status_get_mode(bl)&MD_CANMOVE) || !unit_can_move(bl)))return 0;Если Вам не надо, что бы моб сам по себе ходил, то надо править код скриптовой команды unitwalk. 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Sanasol Опубликовано 22 мая, 2014 Жалоба Поделиться Опубликовано 22 мая, 2014 У Вашего моба установлен режим MD_CANMOVE?Если нет, то моб не ходит из-за этих строк в функции unit_walktoxy:if(!(flag&2) && (!(status_get_mode(bl)&MD_CANMOVE) || !unit_can_move(bl)))return 0;Если Вам не надо, что бы моб сам по себе ходил, то надо править код скриптовой команды unitwalk.А как же делали марш мобов, там вроде нету сорсов, обычный нпц скрипт Ссылка на комментарий Поделиться на другие сайты Поделиться
Functor Опубликовано 22 мая, 2014 Жалоба Поделиться Опубликовано 22 мая, 2014 (изменено) Я этого скрипта не видел, но предположу, что у мобов был активен режим MD_CANMOVE. Изменено 22 мая, 2014 пользователем Functor Ссылка на комментарий Поделиться на другие сайты Поделиться
Elmiria Опубликовано 22 мая, 2014 Автор Жалоба Поделиться Опубликовано 22 мая, 2014 в марше были нпсы, с ними в разы проще. Ссылка на комментарий Поделиться на другие сайты Поделиться
Sanasol Опубликовано 22 мая, 2014 Жалоба Поделиться Опубликовано 22 мая, 2014 Ясно понятно, удаляй проверку на флаг хождение значит Ссылка на комментарий Поделиться на другие сайты Поделиться
Functor Опубликовано 22 мая, 2014 Жалоба Поделиться Опубликовано 22 мая, 2014 Удаление проверки чревато возможными проблемами. Оптимальное решение будет таким:Открываем ../src/map/script.c и меняем:BUILDIN_DEF(unitwalk,"ii?"),на:BUILDIN_DEF(unitwalk,"ii??"),В скриптовой функции меняем:script_pushint(st, unit_walktoxy(bl,x,y,0));// We'll use harder calculations.на:int flag = (script_hasdata(st,5) != 0) ? script_getnum(st,5) : 0;script_pushint(st, unit_walktoxy(bl,x,y,flag));// We'll use harder calculations.В скрипте вызываем так:unitwalk .@mob_bl_id, .@x, .@y, 2; 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Sanasol Опубликовано 22 мая, 2014 Жалоба Поделиться Опубликовано 22 мая, 2014 Удаление проверки чревато возможными проблемами. Оптимальное решение будет таким: Открываем ../src/map/script.c и меняем: BUILDIN_DEF(unitwalk,"ii?"), на: BUILDIN_DEF(unitwalk,"ii??"), В скриптовой функции меняем: script_pushint(st, unit_walktoxy(bl,x,y,0));// We'll use harder calculations. на: int flag = (script_hasdata(st,5) != 0) ? script_getnum(st,5) : 0;script_pushint(st, unit_walktoxy(bl,x,y,flag));// We'll use harder calculations. В скрипте вызываем так: unitwalk .@mob_bl_id, .@x, .@y, 2; Не спится? Это понятно, первое решение естественно не удаление, а опция. Но для неё проще удалить. Ссылка на комментарий Поделиться на другие сайты Поделиться
Functor Опубликовано 22 мая, 2014 Жалоба Поделиться Опубликовано 22 мая, 2014 Не спится? Да, работаю Ссылка на комментарий Поделиться на другие сайты Поделиться
Sanasol Опубликовано 22 мая, 2014 Жалоба Поделиться Опубликовано 22 мая, 2014 Не спится? Да, работаю Днем-то совсем не хочется работать Ссылка на комментарий Поделиться на другие сайты Поделиться
Elmiria Опубликовано 23 мая, 2014 Автор Жалоба Поделиться Опубликовано 23 мая, 2014 (изменено) Мда, умная мысль приходит последней. У меня ж мобы планты не ходячие. То есть мне нужно чтоб они не двигалист, когда мне не нужно и двигались когда нужно)сейчас последний раз проверю, если не заходят, пойду править сорцыUPD ходить они конечно начали.... медленно... но абсолютно бесконтрольно, куда вздумается. будем глядеть, код то не дописан.UPD2 ходят подконтрольно. (была ошибка в скрипте) только побыстрее бы...таки вопрос за что двойка отвечает? Изменено 23 мая, 2014 пользователем Elmiria Ссылка на комментарий Поделиться на другие сайты Поделиться
Functor Опубликовано 23 мая, 2014 Жалоба Поделиться Опубликовано 23 мая, 2014 только побыстрее бы...Ну дык измените им скорость в ../db/mob_db.txtтаки вопрос за что двойка отвечает?//flag parameter://&1 -> 1/0 = easy/hard//&2 -> force walking//&4 -> Delay walking if the reason you can't walk is the canwalk delay 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Elmiria Опубликовано 23 мая, 2014 Автор Жалоба Поделиться Опубликовано 23 мая, 2014 (изменено) только побыстрее бы...Ну дык измените им скорость в ../db/mob_db.txtтаки вопрос за что двойка отвечает?//flag parameter://&1 -> 1/0 = easy/hard//&2 -> force walking//&4 -> Delay walking if the reason you can't walk is the canwalk delayУже догадалась сама)Спасибо. Я правда все равно не поняла ничего) Ну главное что работает!Еще раз спасибо огромное!!! Изменено 23 мая, 2014 пользователем Elmiria Ссылка на комментарий Поделиться на другие сайты Поделиться
Functor Опубликовано 23 мая, 2014 Жалоба Поделиться Опубликовано 23 мая, 2014 (изменено) Я правда все равно не поняла ничего)flag это параметр функции unit_walktoxy, относительно значения которого меняется выполнение функции.Так вот при значении 2 функция игнорирует тот факт, что объект без режима MD_CANMOVE и не должен ходить.По дефолту скриптовая функция unitwalk вызывала unit_walktoxy с нулевым flag.Теперь мы имеем возможность опционально указать этот flag в скрипте. Изменено 23 мая, 2014 пользователем Functor 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Elmiria Опубликовано 23 мая, 2014 Автор Жалоба Поделиться Опубликовано 23 мая, 2014 (изменено) о, вот теперь понятно) Не могу не поделиться. Первый геймовер) Еще не все фуннкции реализованы, да и орки должны будут умирать, куда им ходить некуда, но уже поиграться можно) Изменено 23 мая, 2014 пользователем Elmiria 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Salfer Опубликовано 23 мая, 2014 Жалоба Поделиться Опубликовано 23 мая, 2014 это конечно круто, но Рагнарок не одиночная игра) Ссылка на комментарий Поделиться на другие сайты Поделиться
Elmiria Опубликовано 24 мая, 2014 Автор Жалоба Поделиться Опубликовано 24 мая, 2014 Скорей всего я добавлю возможность играть вдвоем, как пока не знаю. Но такое поле можно использовать для многих игр, хоть шашки, хоть крестики нолики, хоть линии. Мечта змейку написать, но это пока выше моих возможностей) Причем не простую, а на несколько игроков. В общем идей гора, да только время ограниченно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Salfer Опубликовано 24 мая, 2014 Жалоба Поделиться Опубликовано 24 мая, 2014 как я понял это игра головоломка, можешь сделать свою башню (эндлес тавер)и скажем через каждые 3-4 уровня босс а после твоя загаадка, и с каждыми следующими уровнями будет всё тяжелее, не только загадки но и монстры.как-то так Ссылка на комментарий Поделиться на другие сайты Поделиться
Elmiria Опубликовано 24 мая, 2014 Автор Жалоба Поделиться Опубликовано 24 мая, 2014 можно все что угодно). Хоть генератор лабиринтов написать (о чем я уже тоже думаю). Но у меня немного другая цель пока). Сначала закончить с тем что есть (там еще 18 пунктов, которые нужно реализовать), потом привлечь внимание к самой игре, а потом устраивать еженедельные/ежесмесячные соревнования, среди которых будет и эта игра. на данный момент пытаюсь заставить окров не ходить на занятые ячейки. Они упорно отказываются не ходить куда не надо) Наворотила такого, в чем сама уже с трудом разбираюсь XD Ссылка на комментарий Поделиться на другие сайты Поделиться
Salfer Опубликовано 24 мая, 2014 Жалоба Поделиться Опубликовано 24 мая, 2014 генератор лабиринта это большее 2000 мобов на карте,я просто написал 10 локаций размером с пронту)более 3 часов прохождения Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения