Я просто посоветовал вам не спорить на бессмысленную тему, только и всего.
Идей может быть у каждого миллион, а работает в итоге один человек. Ну да ладно.
Визуализация карты con03a в редакторе.
(http://i61.tinypic.com/ay1ptx.png)
Copy-Paste объектов/кусков из других участков карт/других карт была бы классной фичей...
Сделано!
(http://s24.postimg.org/op91rr9j9/copypaste.png)
Обновление.
Теперь можно совершать операции сразу с несколькими обьектами.
Для выделения сразу нескольких обьектов необходимо удерживать клавишу Shift
Стены и двери теперь можно поворачивать колесом мыши.
Добавлена отрисовка триггеров и нажимных плит, а также редактор TriggerXfer
Добавлена поддержка настраиваемых категорий обьектов (загружаются из categories.xml)
Требуемая версия .NET Framework снижена до 3.5 (Client Profile)
Исправлены некоторые мелкие баги. Найдете новые - пишите в ЛС на форуме или в скайп.
Теперь буду работать над скриптами...
Архив с бинарниками во вложениях.
Собственно почему же старый редактор скриптов был выкинут.
/* Sample Nox-C Script File. author: KirConjurer */
/**/
/* 0. Ignore this one */
GLOBAL()
{
return;
}
/* 1. This function contains global variables, which are accessible from any other function */
GLOBAL()
{
int ignore1;
int ignore2;
int ignore3;
int ignore4;
int ignore5;
int elevatorPtr;
int elevatorButtonPtr;
string[3] classNames;
int KircPtr;
/* FireSnakeTrigger */
int[40] fireSnakePs;
int[7] snakeFlames;
int fireTriggerPtr;
int currentSnakePos = 0;
return;
}
/* 2. This function is executed every time when the map is loaded in-game */
MapInitialize()
{
/* Initialize objects */
GLOBAL:elevatorPtr = Nox:ObjFromName("ElevatorFromSpawn");
GLOBAL:elevatorButtonPtr = Nox:ObjFromName("ElevatorButton");
GLOBAL:KircPtr = Nox:ObjFromName("Kirc");
GLOBAL:fireTriggerPtr = Nox:ObjFromName("FireTrigger");
/* Initialize class name array */
GLOBAL:classNames[0] = "client.c:Warrior";
GLOBAL:classNames[1] = "client.c:Wizard";
GLOBAL:classNames[2] = "client.c:Conjurer";
Script:FireSnakeInit();
return;
}
/* 3. Initialize fire snake demo */
FireSnakeInit()
{
int num = 0;
/* I am too lazy to implement for loop in compiler... */
repeat1:
if (num < 40)
{
GLOBAL:fireSnakePs[num] = Nox:WaypointFromName("FireSnakeWP" + Nox:IntToString(num + 1));
num += 1;
goto repeat1;
}
num = 0;
repeat2:
if (num < 7)
{
GLOBAL:snakeFlames[num] = Nox:ObjFromName("SnakeFlame" + Nox:IntToString(num + 1));
num += 1;
goto repeat2;
}
return;
}
/* 4. Trigger demo */
CallDemo()
{
int class = Nox:GetServerInfo(4); /* get host player class */
string classString = GLOBAL:classNames[class];
Nox:Print(classString); /* print it to the script caller */
/* string test begin */
string medievalCloak = "Medieval";
medievalCloak += "Cloak";
medievalCloak += "PrettyName";
string thingDb = "thing.db:";
Nox:Print(Nox:IntToString(GLOBAL:snakeFlames[2]));
Nox:Print(thingDb + medievalCloak);
return; /* Never forget to put return! */
}
/* 5. Enable elevator */
ActivateElevator()
{
Nox:DisableObject(GLOBAL:elevatorButtonPtr);
Nox:EnableObject(GLOBAL:elevatorPtr);
return;
}
/* 6. NPC Attacked event */
KircAggressive()
{
Nox:MonsterSetAggressiveness(GLOBAL:KircPtr, 0.83F);
return;
}
/* 7. Fire Snake Cycle */
FireSnakeTrigger()
{
/* we don't want multiple cycles to run simultaneously */
if (Nox:ObjIsEnabled(GLOBAL:fireTriggerPtr)) { Nox:DisableObject(GLOBAL:fireTriggerPtr); }
/* Update snake position */
GLOBAL:currentSnakePos += 1;
if (GLOBAL:currentSnakePos >= 40) { GLOBAL:currentSnakePos = 0; }
int snakeSegment = 0;
int snakeOffset = 0;
/* for each flame */
repeat:
if (snakeSegment < 7)
{
snakeOffset = snakeSegment + GLOBAL:currentSnakePos;
if (snakeOffset >= 40) { snakeOffset -= 40; } /* out of bounds */
/* move flames around */
Nox:TeleportObj(GLOBAL:snakeFlames[snakeSegment], Nox:GetWaypointX(GLOBAL:fireSnakePs[snakeOffset]), Nox:GetWaypointY(GLOBAL:fireSnakePs[snakeOffset]));
snakeSegment += 1;
goto repeat;
}
Nox:WaitFrames(2, 7);
return;
}
Карта с компилированными скриптами прилагается. Попробуйте открыть в старом редакторе 8)
NOTE: в последней версии моего редактора нашлась пара критических багов, из за которых карты могут вылетать при работе над обьектами. Настоятельно советую не использовать его до очередного обновления
Я более чем уверен, что после текущего поста меня опять закидают минусами за "неприемлемое отношение к чему-то" или "Тебе просто лень переучиваться!". Поэтому скажу что я минусов не боюсь (мне запросто можно карму снизить до 0) - я лишь высказываю своё мнение.
У меня назрело пару вопросов:
1. Почему код именно в C форме? Предыдущий язык был во 100 крат проще, чем эти танцы со скобками. Я ожидал что ЯП останется на высоком уровне.
2. Нафига было вводить строгую типизацию данных? Просто чтобы код пафосней выглядел? Бессмыслица.
3. Не понятно зачем надо было убивать удобный редактор скриптов в самом редакторе и выносить его в нечто отдельное? Теперь вместо одной программы надо держать ещё одну программу + ещё syntax highlighter писать отдельно.
4. В чём смысл пространств имён, используемых в коде? Очередная плюшка вида "чтоб код пафосней был"? Ибо весь код может исполняться либо из глобального контекста (обращение к Global переменным, другим функциям или Nox функциям), либо из локального (вообще не используется)
P.S> Пространства имён - вещь не из С, а из C++ :)
Я смотрю на этот пример кода и понимаю ничего принципиально нового в скриптовый язык не добавилось - только изменился на более строгий стиль для большего пафоса кода и что предыдущий редактор пусть и имеет ужасную реализацию, но в плане скриптнига он намного понятнее и несколько проще. А значит придётся пользоваться либо двумя сразу, либо вообще отказаться от нового.
Очередное обновление.
Исправлены некоторые критические ошибки.
Добавлен компилятор скриптов.
Запилена демо карта (прилагается к редактору)
Добавлена поддержка лазеров (SentryXfer); еще их можно поворачивать колесом мыши
Малость улучшена визуализация.
Скачать последний релиз (в .zip архиве) можно напрямую с BitBucket (https://bitbucket.org/AngryKirC/noxedit2014/downloads/NE2014.zip).
(на всякий случай - добавил еще и во вложения)
(http://s1.postimg.org/w0c85e23j/image.png)