Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
2 страниц V   1 2 >  
Ответить в эту темуОткрыть новую тему
> случайная генерация локаций
Milfes
сообщение Jul 20 2006, 22:30
Сообщение #1


Level 5
**

Класс: Друид
Характер: Lawful Neutral
Раса: Человек



Помогите пожалуйсто с решением проблемы. Предположим у меня 20 жилых домов (не играющих большой роли в игре), обязательно ли делать для каждого отдельную локацию? Или может быть возможно чтобы на одной локации происходила случайная генерация?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 20 2006, 22:43
Сообщение #2


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Опыт подсказывает что лучше чделать 10 уникальных запоминающихся интерьеров. Чем 30 разных генераций одного и того же. Это ИМХО.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
helvene
сообщение Jul 20 2006, 22:47
Сообщение #3


Mystery
Иконки Групп

Класс: Маг
Характер: Lawful Evil
Раса: Тварь
NWN: Контент
Амен



QUOTE(Milfes @ Jul 20 2006, 23:30) [snapback]88085[/snapback]
Или может быть возможно чтобы на одной локации происходила случайная генерация?

Возможно на патче 1.67
Но для домов - совершенно не нужно.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Milfes
сообщение Jul 20 2006, 22:56
Сообщение #4


Level 5
**

Класс: Друид
Характер: Lawful Neutral
Раса: Человек



QUOTE
Опыт подсказывает что лучше чделать 10 уникальных запоминающихся интерьеров. Чем 30 разных генераций одного и того же. Это ИМХО.


То есть ты имееш ввиду, что предположим 2 каких-то двери преведут в одну локацию, а две других в другую?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Jul 21 2006, 00:44
Сообщение #5


Level 17
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Человек
NWN: Скриптинг [PW]
Axistown SR 1.9
NWNX



QUOTE(helvene @ Jul 20 2006, 23:47) [snapback]88088[/snapback]
Возможно на патче 1.67
Можно меня просветить? Не знал о такой возможности.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 21 2006, 01:06
Сообщение #6


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



QUOTE(virusman @ Jul 21 2006, 03:44) [snapback]88099[/snapback]
Можно меня просветить? Не знал о такой возможности.

И мну!!! (IMG:style_emoticons/kolobok_light/yes3.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Клемент Астилон
сообщение Jul 21 2006, 03:49
Сообщение #7


Level 11
Иконки Групп

Класс: Клерик
Характер: Chaotic Good
Раса: Полуэльф
NWN: DM



Да вообще полезный патч вроде сделали (IMG:style_emoticons/kolobok_light/smile.gif)

Список Изменений довольно внушительный.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Jul 21 2006, 08:01
Сообщение #8


Level 17
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Человек
NWN: Скриптинг [PW]
Axistown SR 1.9
NWNX



QUOTE(Клемент Астилон @ Jul 21 2006, 04:49) [snapback]88107[/snapback]

Да вообще полезный патч вроде сделали (IMG:style_emoticons/kolobok_light/smile.gif)

Список Изменений довольно внушительный.
Не сомневаюсь. Но в patch notes о генерации локаций ничего не сказано.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
helvene
сообщение Jul 21 2006, 09:05
Сообщение #9


Mystery
Иконки Групп

Класс: Маг
Характер: Lawful Evil
Раса: Тварь
NWN: Контент
Амен



Пользуйтесь
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Jul 21 2006, 10:31
Сообщение #10


Level 17
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Человек
NWN: Скриптинг [PW]
Axistown SR 1.9
NWNX



QUOTE(helvene @ Jul 21 2006, 10:05) [snapback]88115[/snapback]
Какое это имеет отношение к локациям (в смысле area, а не location)?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
helvene
сообщение Jul 21 2006, 10:35
Сообщение #11


Mystery
Иконки Групп

Класс: Маг
Характер: Lawful Evil
Раса: Тварь
NWN: Контент
Амен



Очевидно, никакого...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Jul 21 2006, 10:42
Сообщение #12


Level 17
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Человек
NWN: Скриптинг [PW]
Axistown SR 1.9
NWNX



А жаль, я бы от динамических лок не отказался. (IMG:style_emoticons/kolobok_light/wink3.gif)
В общем-то, сгенерить локацию (особенно такую простую, как дом) можно. Поставить на все входы скрипты, задающие номер дома, а при входе в локу дома - скрипт, который будет создавать плейсеблы и NPC, соответствующие этому дому. Правда, тут появится несколько проблем с сохранением (например, если в комнате стоит ящик, то с ним придётся разбираться отдельно), да и задавать точки, куда ставить объекты, проблематично (цифрами в скрипте - неудобно, вейпоинтами - будет нагромождение).
Естественно, это только для сингла. В мультиплеере это исключено.

Наконец, самый простой и доступный вариант, без всяких генераций и скриптов - сделать одну большую локу "дом" и разместить там кучу комнат, не связанных друг с другом.

Сообщение отредактировал virusman - Jul 21 2006, 10:44
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Nymor
сообщение Jul 21 2006, 14:46
Сообщение #13


Level 8
***

Класс: Рейнджер
Характер: Chaotic Neutral
Раса: Эльф



ну генерацию обьектов можно сделать, но не тайлов
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
maximal_up
сообщение Jul 21 2006, 15:09
Сообщение #14


Ищущий
*****

Класс: Рейнджер
Характер: Lawful Neutral
Раса: Эльф
ПОДМАСТЕРЬЕ



QUOTE(Milfes @ Jul 20 2006, 23:56) [snapback]88090[/snapback]
То есть ты имееш ввиду, что предположим 2 каких-то двери преведут в одну локацию, а две других в другую?

Нет, Айван имеет ввиду, что на каждый дом надо сделать собственную локу. А что так сложно? На одну локу интерьера уходит 30 мин максимум (у меня) и это при детальной проработке.

С генерацией у меня были идеи, но ничего толкового так в ум и не пришло.

К примеру можно сделать 16 плейсов на комнату. Далее написать скрипт (а можно ли?), чтобы при загрузке модельки этих плейсов СЛУЧАЙНО выбирались из заданного автором списка. Также можно поставить ограничение на не более 2х одинаковых плейсов.

НО ИМХО это слишком муторно и совсем не нужно.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Milfes
сообщение Jul 21 2006, 17:39
Сообщение #15


Level 5
**

Класс: Друид
Характер: Lawful Neutral
Раса: Человек



QUOTE
Наконец, самый простой и доступный вариант, без всяких генераций и скриптов - сделать одну большую локу "дом" и разместить там кучу комнат, не связанных друг с другом.


Но игрок помоему всё равно будет видеть все комнаты, даже если они не связаны.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Jul 21 2006, 18:15
Сообщение #16


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [Sn]



А как на счет того, что все это будет криейтица при загрузки локи?
ИМХО могут быть всякие лаги и баги. Чем больше плейсов, тем больше вероятность.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 21 2006, 18:50
Сообщение #17


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



Берем большую локацию, делаем в ней 10 комнат, запускаем в момент входа на такую локацию затирание карты, и довольствуемся своей комнатой. Генерировать случайную комнату можно в одиночной игре, но не стоит делать в многопользовательской, ибо всегда может произойти что-то не то, что хотелось изначально добиться.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Jul 21 2006, 19:36
Сообщение #18


Level 17
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Человек
NWN: Скриптинг [PW]
Axistown SR 1.9
NWNX



QUOTE(Milfes @ Jul 21 2006, 18:39) [snapback]88135[/snapback]

Но игрок помоему всё равно будет видеть все комнаты, даже если они не связаны.
Только те, в которых он уже был.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Jul 21 2006, 19:45
Сообщение #19


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



QUOTE(maximal_up @ Jul 21 2006, 16:09) [snapback]88130[/snapback]
К примеру можно сделать 16 плейсов на комнату. Далее написать скрипт (а можно ли?), чтобы при загрузке модельки этих плейсов СЛУЧАЙНО выбирались из заданного автором списка. Также можно поставить ограничение на не более 2х одинаковых плейсов.

НО ИМХО это слишком муторно и совсем не нужно.
А если так. Ставим 16 вэйпоинтов в комнате, далее лезем в скрипт и пишем цикл. Внутри цикла рандомом выбираем плейс (через свитч) и создаем на вэе с номером шага. Результат - 16 относительно случайных плейсеблов.

Но действительно муторно и все равно тайл выдаст подставу (IMG:style_emoticons/kolobok_light/smile.gif)

Зиррекс прав, у него самый идеальный (и часто используемый имхо) вариант. А главное - безглючный.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Milfes
сообщение Jul 21 2006, 20:34
Сообщение #20


Level 5
**

Класс: Друид
Характер: Lawful Neutral
Раса: Человек



А как делать затирание карты?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Zirrex
сообщение Jul 21 2006, 22:09
Сообщение #21


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



Milfes, в последних патчах появилась доработка к функции:

NSS
// Expose/Hide the entire map of oArea for oPlayer.
// - oArea: The area that the map will be exposed/hidden for.
// - oPlayer: The player the map will be exposed/hidden for.
// - bExplored: TRUE/FALSE. Whether the map should be completely explored or hidden.
void ExploreAreaForPlayer(object oArea, object oPlayer, int bExplored=TRUE)

Используй флажок "bExplored", чтобы затереть карту у игрока. В наборе тайлов "Микросет" можно вообще этой функцией выключить карту, на других наборах придется проверять.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Milfes
сообщение Jul 22 2006, 23:53
Сообщение #22


Level 5
**

Класс: Друид
Характер: Lawful Neutral
Раса: Человек



Проблема в том, что у меня нет пока последнего патча и у этой функции отсутствует последний параметр.

И ещё никто не знает где можно найти описание функций на русском языке, а то в Lexicone на английском не совсем разбираюсь?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 23 2006, 02:22
Сообщение #23


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Invisible Object - генерирует PLC объекты.
Скрипт спавнящий разных PLC объекты на локациях.
AM_PLC_SP_[+ TAG_OBJECT_SELF] - наши объекты.
UserDefinedEventNumber() == 7000 - Сигнал скрипту
Если установить на скрытый объект LocalFloat == "RandomLocation"
то ее значение будет радиусом на которм будет пояляться объект.
Если поставить один объект в точку, то все следующие будут появляться на его месте.
Если не ставить НИЧЕГО, то все бъекты будут создаваться на этом невидимом объекте.

Все объекты что должны появиться должны быть присовены на стринг невидимого объекта ResRef_PLC_1, ResRef_PLC_2 и т.д. ресрефом.
NSS
//:://////////////////////////////////////////////
//:: OnUserDefaine  am_cud_spawn
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
    СКРИПТ НЕПОСРЕДСТВЕННО ИСПОЛНЯЕТ ОБМЕН PLC_
    ОБЪЕКТОВ В ЛОКАЦИЯХ В СЛУЧАЕ РАЗРУШЕНИЯ И
    В СЛУЧАЕ ВХОДА РС В ЛОКАЦИЮ ПО СИГНАЛУ

  Скрипт спавнящий разных PLC объекты на локациях.
  AM_PLC_SP_[+ТАГ OBJECT_SELF] - наши объекты.
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 28.11.2005
//:://///////////////////////////////////////////
void Debug(string message)
{
    object oPC = GetFirstPC();
    if (!GetLocalInt(GetModule(), "DEBAG_PC"))
    {
      SendMessageToPC(oPC, "Debag message: "+message);
    }
    if (!GetLocalInt(GetModule(), "DEBAG_DM"))
          {
            SendMessageToAllDMs("Debag message to DMs: "+message);
          }
}

location CreateRandomLocation(object oTarget, float fRadius, int bOnLine = TRUE)
{
if(!bOnLine)
fRadius=IntToFloat(Random(FloatToInt(fRadius)));

float iXO=VectorMagnitude(GetPosition(oTarget))*cos(VectorToAngle(GetPosition(oTarget)));
float iYO=VectorMagnitude(GetPosition(oTarget))*sin(VectorToAngle(GetPosition(oTarget)));
float fRndomAngle=IntToFloat(Random(360));
location lNEW=Location(GetArea(oTarget),Vector(iXO+fRadius*cos(fRndomAngle),iYO+fRadius*sin(fRndomAngle)),360.0);
return lNEW;
}


void main()
{

  int nEvent = GetUserDefinedEventNumber();
  if (GetLocalInt(OBJECT_SELF, "STOP")) return; // Отключаем, если надо
  if (GetLocalInt(OBJECT_SELF, "DAYS_WAITING")>0) return;
//======================== USER DEFINED EVENT===================================
    if (nEvent == 7000)
  // nEvent == 7000 - сигнализируем скриптом.
    {
    if (GetLocalInt(OBJECT_SELF, "STOP"))
      return;

      object oSelf = OBJECT_SELF;
      string sTag = GetTag(oSelf); // Таг невидимого объекта (Общий таг группы)
      object oPlc = GetNearestObjectByTag("AM_PLC_SP_"+sTag);
      int i=1;
      string sResRef = GetLocalString(oSelf, "ResRef_PLC_"+IntToString(i));
      location lLoc; // Место где появляется наш объект

      // Задержка для стандартных объектов, зависит от имени OBJECT_SELF
      if(GetName(oSelf)=="Spawn PLC System")
      SetLocalInt(oSelf, "DAYS_WAITING", Random(6)+1);

      float f = GetLocalFloat(oSelf, "RandomLocation");
      if(f!=0.0)lLoc = CreateRandomLocation(oSelf, f);
      // Если установить на скрытый объект LocalFloat == "RandomLocation"
      // то ее значение будет радиусом на которм будет пояляться объект.
      // Если поставить один объект в точку, то все следующие будут
      // появляться на его месте. Если не ставить НИЧЕГО, то все объекты
      // будут создаваться на этом невидимом объекте.

      if(f==0.0)
      {
            if(!GetLocalInt(oSelf, "DO_THIS"))
            {
              if(oPlc != OBJECT_INVALID)
              {
                SetLocalLocation(oSelf, "SPAWN", GetLocation(oPlc));
              }
              else
                  {
                    SetLocalLocation(oSelf, "SPAWN", GetLocation(oSelf));
                  }
              SetLocalInt(oSelf, "DO_THIS", TRUE);
            }
          lLoc = GetLocalLocation(oSelf, "SPAWN");
        }

      while(sResRef!="")
      {
        i++;
        sResRef=GetLocalString(oSelf, "ResRef_PLC_"+IntToString(i));
      }
      // Так, как вверху, условие было для первого пустого значения
      // то один порядковый номер мы отнимаем из результата
      i = i-1;
      Debug("Общее число объектов - "+IntToString(i));
      int iNext = Random(i)+1;
      sResRef = GetLocalString(oSelf, "ResRef_PLC_"+IntToString(iNext));
      Debug("Следующий - "+IntToString(iNext));

      //----------------------------------------------------------------------
      //  Если выпал тот же ResRef, что стоит здесь
      //----------------------------------------------------------------------
        if(sResRef == GetResRef(oPlc))
        {
            Debug(IntToString(iNext)+" - этому PLC выпало опять быть здесь.");
            iNext++; // Увеличиваем его номер на еденицу
            if(iNext > i) iNext = 1;
            // Если номер больше общего кол-ва PLC, то начинаем с первого.
            Debug(IntToString(iNext)+" - сменим номер на еденицу больше.");
        }
        // Следующий объект на это место
        object oNext = CreateObject(OBJECT_TYPE_PLACEABLE, GetLocalString(oSelf, "ResRef_PLC_"+IntToString(iNext)), lLoc,0, "AM_PLC_SP_"+sTag);

      //----------------------------------------------------------------------
      //  Если мы открывали ящик и в нем уже есть лут
      //----------------------------------------------------------------------
        if (GetHasInventory(oPlc))
        {
          object oItem = GetFirstItemInInventory(oPlc);
          while (GetIsObjectValid(oItem))
          {
            string sTag = GetTag(oItem); // Debag message
            Debug("Destroy Item - "+sTag);
            DestroyObject(oItem);
            oItem = GetNextItemInInventory(oPlc);
          }
        }
        DestroyObject(oPlc);

    }
//------------------------------------------------------------------------------
}


Таким кодом я перебираю на локации объекты. Каждый день скриптом на хертбите. Т.е. я отмечаю каждый объект что он был сегодня уже на локации.

NSS
while (oObject != OBJECT_INVALID)
    {
        if (GetObjectType(oObject) == OBJECT_TYPE_PLACEABLE)
        {
          if(GetName(oObject)=="Spawn PLC System")
          {
            int i = GetLocalInt(oObject, "DAYS_WAITING"); // Сколько дней осталось
            if(i!=0)SetLocalInt(oObject, "DAYS_WAITING", i-1);
            Debug(GetTag(oObject)+" - PLC будет в локации "+GetName(GetArea(oObject))
            +" дней: "+IntToString(GetLocalInt(oObject, "DAYS_WAITING")));
          }
        }
        oObject = GetNextObjectInArea(oArea);
    }

Этим скриптом непосредственно меняю плейсы уже на входже в локацию игроком.
NSS
object oObject = GetFirstObjectInArea(OBJECT_SELF);
  while (oObject != OBJECT_INVALID)
    {
        if (GetObjectType(oObject) == OBJECT_TYPE_PLACEABLE)
        {
          if(GetName(oObject)=="Spawn PLC System")
          {
              DelayCommand(f, SignalEvent(oObject, EventUserDefined(7000)));
              f=f+0.2; // Сделай паузу!
              Debug(GetTag(oObject)+" - PLC будет в локации "+GetName(GetArea(oObject))
              +" дней: "+IntToString(GetLocalInt(oObject, "DAYS_WAITING")));
          }
        }
        oObject = GetNextObjectInArea(OBJECT_SELF);
    }


Как все это выгляджит в реале? У меня скажем локация, в ней 10 НПС и у них свои сундуки. Таверна. Прошел день, скрипт хертбита дал отмашку, что день. Пробежался по локе, отметил что были здесь день. У кого это последний день он отметил что пора менять. Как только РС вошел в локу, то скрипт обменял эти объекты.

Для чего это сделано? Например у таверны стоит куча повозок. Каждый день два одна из них меняется. За неделю все меняются. Или на случайных локациях спавнятся деревья, палатки и прочее. Конечно все трудно описать, настроить тоже будет не легко новичку. Но если захзотеть, то можно. Ну и вопросы задавать никто не запрещает. Или в таверне через неделю сменились все НПС постояльцы а с ними и их сундуки (IMG:style_emoticons/kolobok_light/wink3.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Dik Morris
сообщение Jul 24 2006, 16:04
Сообщение #24


Вечно меняющийся
Иконки Групп

Класс: Монах
Характер: True Neutral
Раса: Человек
NWN: Скриптинг [Sn]



QUOTE(Milfes @ Jul 23 2006, 01:53) [snapback]88187[/snapback]

И ещё никто не знает где можно найти описание функций на русском языке, а то в Lexicone на английском не совсем разбираюсь?


ЧИТАТЬ.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Milfes
сообщение Jul 24 2006, 18:13
Сообщение #25


Level 5
**

Класс: Друид
Характер: Lawful Neutral
Раса: Человек



Огромное спасибо! Жаль только немного, но для начала хватит.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

2 страниц V   1 2 >
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 28th March 2024 - 14:23