Блоги

Амуниция

Провозившись с техникой «ударил-убежал» для победы над пауком, понял насколько это утомительно, потому что удар героя 1-1, и в среднем 1xHP.

И это при том, что здоровье паука уменьшено и он не обладает никаким интеллектом (пока), т.е. если не видит жертву то тупо рандомно ходит.

Просто если бы не а) уменьшенное здоровье б) не тупой интеллект (вернее его отсутствие) шансов у героя не было вообще, и значит нужно что-то менять.

А именно – придумаем экипировку, для начала (тут не буду оригинальным) – ржавый нож (+2-2), кожаную куртку (защита/броня +1).

Загоняем монстров в XML

А вернее изгоняем из исходного кода, в принципе "изгоняем монстров из исходного кода" звучит более брутально, да?
На текущий момент у нас есть следующие структурки:

TCreatureParams basicCreatureParams[TP_CREATURE_LAST + 1]=
{
{10,10,10,10,-1}, //human
{5,20,10, 0,-1}, //spider
};
char *creaturesNames[TP_CREATURE_LAST + 1] = {"","Паук-мохнач"};

а также кусок кода при вызова action = get_info (там char *nick = new char[ strlen(creaturesNames[c->Type])*6];URLencoding( convertToUtf8(creaturesNames[c->Type],strlen(creaturesNames[c->Type])).c_str(), nick);)

Всплывающие подсказки

После того как паука стало можно убить, очень было интересно узнать сколько у него осталось жизни.
Нет, конечно это было видно и по передающим данным из лога a,11,6,1,51,4,8,0, что удар был(damage) 4 HP и у него осталось 8HP, но как-то это не кошерно.
информация о существе. 7 Лабиринтов

Ответный удар

Дабы тупо не гибнуть в каждой арене с пауком, пришлось сделать возможность герою атаковать врагов.

В клиентской флэшке изменений по минимуму - в функции обработки мышки:
Ранее было:
if (tx==_root.heroX && ty==_root.heroY)
_root.showBook(1);
else
_root.moveHero(tx, ty);

стало:
if (tx==_root.heroX && ty==_root.heroY)
_root.showBook(1);
else
if (_root.enemySquare(tx,ty) && dx<=1 && dy<<1)
_root.strikeHero(tx,ty);
else
_root.moveHero(tx, ty);

Атака паука

Собственно не только паука, а любого враждебного существа.
Для ее реализации переписываем функцию bool computerTurnCreature(TMazeMap *m,int creatureid)
{
logaccess(16,"computerTurnCreature(%d)",creatureid);
TMazeCreature *c = getCreature(m,creatureid);
if (!c) return false;
vector<TMazeCreature *> crt;
if (findCreature(m,c,&crt)) {
float iam = Fast_Distance( c->x,c->y);
float min;
int index=0;
for(int i=0;i<(int)crt.size();i++) {
float tmp=Fast_Distance(crt[i]->x,crt[i]->y) - iam;
if (tmp<0) tmp*=-1.0;
if (i==0) min=tmp;

Паук пришел-2

Вообще перед тем как я начал внедрять «паука», я сильно заблуждался –считая, что код и меня уже сделан, что можно внедрять уже существ, кроме базового (героя).
Но оказалось, что зря казалось. Пришлось переписывать и искать баги.

Как бы, в базовом Flash ролике, уже обрабатывалось событие INS_CREATURE (при загрузке героя) – оно помещала в базовые массив классов creatureList - id существа и его координаты.

Следом вызвалась функция insertCreature, в которой уже пришлось делать первые изменения:if (plid==_root.userid)
creature.mcname = "you_hero";

И тут пришел паук

Почти как в фильме, паука нарисовал не я – а неплохой художник ForEveR aka Сергей, причем совершено добровольно, за это ему респект и уважуха.

И собственно было решено паучка протестить его и запустили в маленький лабиринт с игроком. Тут возникла проблема номер №1, для тестовой арены генерился маленький лабиринтик 10x10, и он не сгенерился, загружая проц на 90-100% комп задумался.

Правки

Избавился от пересчета нужно ли обновлять карту – теперь при открытии карты с сервера, запоминаются координаты, что с этого положения карта уже запрашивалась.
Пометка сохраняется в массиве watchmap.

На сервере связи с этим сделал, чтобы карта открывалась только по обозреваемой территории – алгоритм тут.

Если я не найду художника - то уничтожу мир

... своими художествами.

Собственно идея нарисовать паука в качестве явного антигероя была давно, и были даже наброски .

Но одно дело кривой лапой накорябать на бумаге, а другое на Flash если тебе при рождении медведь наступил на обе руки.
А еще нужно нарисовать анимацию движения и удара, т.к. на то он и антигерой, чтобы атаковать героя.

Интеграция

Нарисовал героя и даже сделав для него анимацию, попытался прикрутить его в основной проект.
Для начала пришлось все-таки переписать загрузчик для SWF, теперь он сразу создает нужный клип, название которого приходит ему качестве параметра: function loadclipfromserver(path, loadname,nameclip).

Затем пришлось в структуру(объект) creature добавить mcname,dx,dy,и все другие параметры для анимации
Теперь в функции moveCreature не сразу присваиваются _x и _y, а выполняется ряд действий (может и избыточных, но пока нужных)

RSS-материал