Перейти к содержанию

Рекомендуемые сообщения

Пишу игру, в которой столкнулась с тысячью проблем. На данном этапе мне нужно заставить монстра передвигаться по квадратному полю (на одну клетку). Именно монстра, так как поле большое, и дублировать неписей под это дело нет никакого желания. Используется 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);

}
}
}

Функция передвижения моба


//------------------------------------------------------ORCMOVE
function 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;
}
else
return;
}

вывод дебагов с консоли.


[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 4

eathena 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*"),

Изменено пользователем Elmiria
Ссылка на комментарий
Поделиться на другие сайты

На данном этапе все переменные, которые передаются между функциями - глобальные - поэтому нет необходимости ничего вводить

собственно не работает это и единственная переменная тут проверена, выдает верный GID

unitwalk getd("$orc_"+.@k),117,80;

Изменено пользователем Elmiria
Ссылка на комментарий
Поделиться на другие сайты

Пока вижу не по теме:

set .@n, getarraysize(.@direction); .@n от 0 до 4

set .@l, rand(0,.@n); .@l от 0 до 4

set .@r, getelementofarray(.@direction,.@l); .@r при .@l=4 ?

Изменено пользователем botka4aet
Ссылка на комментарий
Поделиться на другие сайты

Это было для дебага, вылавливала баги и ошибки логики. там часть над переделать, но смысл я поняла) 0, забыла убрать в последний раз. Там все равно в направлениях куева туча проверок убрана, из-за того, что мой эмуль отказывается работать с переменной перебора цикла. Мб канеш цикл по другому построить, но это будет уже когда основа заработает.

Вообще у меня сейчас введена туча переменных, которые по хорошему не нужны. Либо для дебага, либо для наглядности. Но оптимизировать бум потом, как и убрать глобальные переменные.

UPD принудительно заставила ходить своего чара вместо моба. сработало.... но почему мобы не хотят т__________т я не хочу уже все с начала начинать переделывать.....

Изменено пользователем Elmiria
Ссылка на комментарий
Поделиться на другие сайты

У Вашего моба установлен режим MD_CANMOVE?

Если нет, то моб не ходит из-за этих строк в функции unit_walktoxy:

if(!(flag&2) && (!(status_get_mode(bl)&MD_CANMOVE) || !unit_can_move(bl)))
return 0;

Если Вам не надо, что бы моб сам по себе ходил, то надо править код скриптовой команды unitwalk.

  • Upvote 2
Ссылка на комментарий
Поделиться на другие сайты

У Вашего моба установлен режим MD_CANMOVE?

Если нет, то моб не ходит из-за этих строк в функции unit_walktoxy:

if(!(flag&2) && (!(status_get_mode(bl)&MD_CANMOVE) || !unit_can_move(bl)))
return 0;

Если Вам не надо, что бы моб сам по себе ходил, то надо править код скриптовой команды unitwalk.

А как же делали марш мобов, там вроде нету сорсов, обычный нпц скрипт

Ссылка на комментарий
Поделиться на другие сайты

Удаление проверки чревато возможными проблемами. Оптимальное решение будет таким:

Открываем ../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;

  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты

Удаление проверки чревато возможными проблемами. Оптимальное решение будет таким:

Открываем ../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;

Не спится? :)

Это понятно, первое решение естественно не удаление, а опция. Но для неё проще удалить.

Ссылка на комментарий
Поделиться на другие сайты

Мда, умная мысль приходит последней. У меня ж мобы планты не ходячие. То есть мне нужно чтоб они не двигалист, когда мне не нужно и двигались когда нужно)

сейчас последний раз проверю, если не заходят, пойду править сорцы

UPD ходить они конечно начали.... медленно... но абсолютно бесконтрольно, куда вздумается. будем глядеть, код то не дописан.

UPD2 ходят подконтрольно. (была ошибка в скрипте) только побыстрее бы...

таки вопрос за что двойка отвечает?

Изменено пользователем Elmiria
Ссылка на комментарий
Поделиться на другие сайты

только побыстрее бы...

Ну дык измените им скорость в ../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

  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты

только побыстрее бы...

Ну дык измените им скорость в ../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

Уже догадалась сама)

Спасибо. Я правда все равно не поняла ничего) Ну главное что работает!

Еще раз спасибо огромное!!!

Изменено пользователем Elmiria
Ссылка на комментарий
Поделиться на другие сайты

Я правда все равно не поняла ничего)

flag это параметр функции unit_walktoxy, относительно значения которого меняется выполнение функции.

Так вот при значении 2 функция игнорирует тот факт, что объект без режима MD_CANMOVE и не должен ходить.

По дефолту скриптовая функция unitwalk вызывала unit_walktoxy с нулевым flag.

Теперь мы имеем возможность опционально указать этот flag в скрипте.

Изменено пользователем Functor
  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты

о, вот теперь понятно)

Не могу не поделиться. Первый геймовер) Еще не все фуннкции реализованы, да и орки должны будут умирать, куда им ходить некуда, но уже поиграться можно)

EdDrBqZsrBo.jpg

Изменено пользователем Elmiria
  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты

Скорей всего я добавлю возможность играть вдвоем, как пока не знаю. Но такое поле можно использовать для многих игр, хоть шашки, хоть крестики нолики, хоть линии. Мечта змейку написать, но это пока выше моих возможностей) Причем не простую, а на несколько игроков. В общем идей гора, да только время ограниченно.

Ссылка на комментарий
Поделиться на другие сайты

как я понял это игра головоломка, можешь сделать свою башню (эндлес тавер)

и скажем через каждые 3-4 уровня босс а после твоя загаадка, и с каждыми следующими уровнями будет всё тяжелее, не только загадки но и монстры.

как-то так

Ссылка на комментарий
Поделиться на другие сайты

можно все что угодно). Хоть генератор лабиринтов написать (о чем я уже тоже думаю). Но у меня немного другая цель пока). Сначала закончить с тем что есть (там еще 18 пунктов, которые нужно реализовать), потом привлечь внимание к самой игре, а потом устраивать еженедельные/ежесмесячные соревнования, среди которых будет и эта игра.

на данный момент пытаюсь заставить окров не ходить на занятые ячейки. Они упорно отказываются не ходить куда не надо) Наворотила такого, в чем сама уже с трудом разбираюсь XD

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...
Яндекс.Метрика