Перейти к содержимому


Фотография

Вариативность локаций в Ф2


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 19

#1 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 03 Февраль 2012 - 19:43

Суть в том, что при значение какой либо ГВАРы = x, при входе в город должна подгружаться локация 111, а при значении той же ГВАРы = y, должна подгружаться локация 222. Мне бы хотелось узнать: на сколько возможна (проблематична) эта концепция?


#2 Wasteland Ghost

Wasteland Ghost

    Маленькое Злое Привидение

  • Пользователи
  • PipPipPip
  • 3 451 сообщений

Отправлено 03 Февраль 2012 - 22:01

Именно так сделано изменение локации V15 в FO2. Сэ мэ файлик city.txt и доку по скриптам. ЕМНИП, это делается с помощью макроса mark_map_entrance_state.


#3 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 04 Февраль 2012 - 01:39

Я неправильно выразился....

По сути мне нужно сделать 2 вида одного и того же города, один из которых будет подгружаться в зависимости от ГВАРа. Легче всего в этом случае сделать именно 2 города и прописать их в файле city.txt как невидимые, а потом при помощи команды mark_area_known поставить один из этих городов видимым.

П.С. Извините за беспокойство, почему то этот очевидный вариант не дошел до меня сразу....

П.П.С. В доке написано:

QUOTE
void mark_area_known(int mark_type, int area, int mark_state) — установить статус локации
Аргументы:
mark_type — тип локации:
MARK_TYPE_TOWN (0) — город
MARK_TYPE_MAP (1) — карта
area — номер локации (см. MAPS.H и MAPS.TXT)
mark_state — статус:
MARK_STATE_UNKNOWN (0) — неизвестен
MARK_STATE_KNOWN (1) — известен
MARK_STATE_VISITED (2) — посещался
MARK_STATE_INVISIBLE (-66) — невидим


из чего следует , что в агрументе "area" нужно писать номер карты из MAPS.H и MAPS.TXT; но вот если мне нужно изменить статус города , мне нужно писать номер из CITY.txt или все таки из MAPS.txt?


#4 Wasteland Ghost

Wasteland Ghost

    Маленькое Злое Привидение

  • Пользователи
  • PipPipPip
  • 3 451 сообщений

Отправлено 04 Февраль 2012 - 18:35

По всей видимости, если mark_type==MARK_TYPE_TOWN, то указывается номер города, иначе — карты.

Не факт, что движок проглотит два города в одной точке мира. Проверяй. Если будет падать — пробуй вариант с включением/выключением entrance. Два вида одного и того же города, повторюсь, реализованы в V15. Как раз через включение/отключение entrance. Можно подсмотреть и сделать по аналогии. ;)


#5 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 04 Февраль 2012 - 22:28

Если честно, до меня че та не дошло как БИСовцы сделали это, точнее ГДЕ они сделали это. Я буду очень признателен, если кто нибудь помог мне разобраться с этим вопросом.....

QUOTE
[Area 09]                ; Vault 15
area_name=Vault 15 
world_pos=1284,1433 
start_state=On 
size=Medium 
townmap_art_idx=167 
townmap_label_art_idx=386 
entrance_0=On,180,273,The Squat A,-1,-1,0 
entrance_1=Off,-1,-1,The Squat A,-1,-1,0 
entrance_2=Off,-1,-1,The Squat B,-1,-1,0 
entrance_3=Off,-1,-1,Vault 15,-1,-1,0 
entrance_4=Off,-1,-1,Vault 15 East Entrance,-1,-1,0




#6 Wasteland Ghost

Wasteland Ghost

    Маленькое Злое Привидение

  • Пользователи
  • PipPipPip
  • 3 451 сообщений

Отправлено 05 Февраль 2012 - 14:35

Да, entrance тут, а включение/отключение в скриптах ищи.


#7 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 05 Февраль 2012 - 16:49

Окей, я только что проверил, что одинаковые координаты маркеров городов на мировой карте не ведет к падению игры, поэтому этот вариант мне кажется наиболее пригодным и простым, как говорится: "идем по пути наименьшего сопротивления".Да и, как выяснилось, способ с V15 тут не подходит — там просто менялась маска карты, а мне нужно чтобы были разные не только карты, но и нпс, вещи и т.д. Конечно все это можно провернуть путем заскрипчивания ненужных объектов на удаление (ну и все в таком духе). Но зачем так извращатся, когда есть довольно таки простой и действенный способ...

П.С.

На самом деле там с V15 ваще странная история, походу даже разрабы мучались с похожей проблемой... Из срочек в City.txt:

QUOTE
entrance_0=On,180,273,The Squat A,-1,-1,0   
entrance_1=Off,-1,-1,The Squat A,-1,-1,0   
entrance_2=Off,-1,-1,The Squat B,-1,-1,0


видно что по идеи должны меняться локации The Squat A и The Squat B. Я посмотрел как должны называться карты для них и обнаружил что для карты The Squat B просто нету....карты. Т.е. она прописана и в City.txt и в Maps.txt, но самого файла карты нету.
На самом деле The Squat B существует просто как 2-ой уровень карты The Squat A (V15ent.map если быть точным).



#8 Wasteland Ghost

Wasteland Ghost

    Маленькое Злое Привидение

  • Пользователи
  • PipPipPip
  • 3 451 сообщений

Отправлено 05 Февраль 2012 - 17:54

Да, как второй уровень. И точка входа меняется с первого уровня (entrance_0) на второй (entrance_1). Т.е. именно карта и именно меняется, не скриптово, а подменой уровней. Плюсом, там, по-идее, на смежной карте должны скриптово переустанавливаться зоны выхода.

Хотя, если движок терпит два города в одном, то так, наверное, будет проще.


#9 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 05 Февраль 2012 - 18:13

Окееей, но я все равно до конца не понял как это сделано...

entrance_0=On , значит Чуз при первом входе в город всегда появляется на карте The Squat A, но потом, видимо, идет проверка ГВАРы , и карта локации (если необходимо) меняется с 1-ого уровня на 2-ой уровень...

А дальше все это фиксируется в сэйве, так по идеи...

Это сообщение отредактировано Nordan - 5 февраля 2012 | 19:18


#10 Wasteland Ghost

Wasteland Ghost

    Маленькое Злое Привидение

  • Пользователи
  • PipPipPip
  • 3 451 сообщений

Отправлено 05 Февраль 2012 - 20:29

Примерно. :) Где-то есть скрипт, в котором есть проверка какой-то гвары и изменение entrance. Ищи. Контекстным поиском внутри исходников скриптов. По ключевым словам (именам функций, макрокомандам).

К сожалению, у меня лично нет времени ковырять скрипты. Могу только указать направление, в котором надо копать. Собственно, уже указала. V15. Искать "The Squat" и всё, что с ним связано: описания карт, локации V15, скрипты... Или другой вариант: ничего не искать, взять и проверить на конкретном примере своего собственного города работу макроса mark_map_entrance_state. Это вообще самый лучший способ разобраться: попытаться реализовать и посмотреть, как оно работает.


#11 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 06 Февраль 2012 - 08:13

Ок, на досуге поищу, если найду что нибудь интерессное — тогда отпишусь.

Отправлено: 6 фев 12 19:10
Окей, долго думал над определением макроса:
QUOTE
mark_map_entrance_state(int map_idx, int state) — задать состояние входа на карту (выкл/вкл) для всех уровней

точнее над фразой "состояние входа"; не долго думая, написал простейший скрипт:

CODE

procedure start;    
procedure map_enter_p_proc;      

procedure start    
begin    
end        

procedure map_enter_p_proc  
begin
 
set_global_var(634, 1);        

if global_var(634) > 0 then    
metarule3(104, 10, 1, -1);    //10-ая локация - городок трапперов
display_msg("Скрипт работает");    
end


приклеил его к гидранту в Кламате :) (на стартовой локации, ессно ) , и попробовал в игре....

получилась такая ситуация:
скрипт сработал и открыл городок трапперов (маркер) на карте города (даже если не входить в сам городок трапперов).

Я так понял: нада все таки искать как это сделали БИСовцы в исходниках :)

П.С. metarule3 — это исходная команда макроса mark_map_entrance_state.
Просто я только что отошел от моральной травмы в связи с потерей винчестера (по совместительству со всеми наработками и инструментарием), оффициальный компилятор еще не настроил, а скрипт эдитор мозги парит с подключением файлов заголовков, так что работу препроцессора я взял на себя :)

Это сообщение отредактировано Nordan - 6 февраля 2012 | 19:59


#12 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 07 Февраль 2012 - 20:46

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

Пробил ГВАРы по слову "shit" , нашел гвару "GVAR_MODOC_SHITTY_DEATH".

Дальше нашел использование этой ГВАРы в скрипте MILADDER (похоже это скрипт лестницы):

CODE
procedure use_p_proc
begin    
if (global_var(GVAR_MODOC_SHITTY_DEATH) == 0) then begin
set_leaving_shitter;
end else begin        
script_overrides;    
end  
end


Дальше нашел set_leaving_shitter в MODOC.H:

CODE
#define set_leaving_shitter                     set_modoc_flag_1_on(leaving_shitter_bit)


Дальше несколько переходов в MODOC.H:
CODE
#define set_modoc_flag_1_on(x)                  set_modoc_flag_on(x, 1)
#define set_modoc_flag_on(x, y)                 set_gvar_bit_on(GVAR_MODOC_GENERIC_FLAG_##y, x)


Дошел до функции set_gvar_bit_on, что делать дальше не очень представляю...



#13 Wasteland Ghost

Wasteland Ghost

    Маленькое Злое Привидение

  • Пользователи
  • PipPipPip
  • 3 451 сообщений

Отправлено 07 Февраль 2012 - 21:38

В Модоке делается через override_map_start, вроде...

Upd: кстати, да. Голова моя дырявая. В V15 тоже, наверное, через override_map_start делается... В map_enter висит проверка на ГВАРу, затем стоит override_map_start. Ну, это значит только одно: работу mark_map_entrance_state определённо надо тестировать на собственных примерах. :)


#14 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 07 Февраль 2012 - 21:56

Аммм...с чузом понятно, его можно просто переместить на другой уровень карты, а с НПС тогда что делать ? :) Там же локация пустая :).

Это сообщение отредактировано Nordan - 7 февраля 2012 | 22:58


#15 Wasteland Ghost

Wasteland Ghost

    Маленькое Злое Привидение

  • Пользователи
  • PipPipPip
  • 3 451 сообщений

Отправлено 08 Февраль 2012 - 07:40

Тоже переместить. В map_enter каждого НПС. Тут ведь вот в чём проблема: если делать новую карту с такими же НПС и такими же скриптами, то для игры это будут совершенно разные объекты. И после изменения карты на новую все НПС "забудут" Чузена. Чтобы этого не произошло, скриптеры сделали 2 уровня одной и той же карты и переместили Чузена и НПС на новый уровень. Конечно, всегда можно "напомнить" новым НПС всё, что "знали" старые, но это усложнит скриптинг. Так, через 2 уровня, конечно проще.


#16 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 08 Февраль 2012 - 17:04

А, ну да, я слепой :) Раза три просматривал функции с картой местности, только щас увидел функцию critter_attempt_placement .

Ну тогда все понятно, по проверке гвары происходит перемещение Чузена(override_map_start) и перемещение НПС (critter_attempt_placement), ну а вещи из всяких шкафов (и т.п.) переносятся в свои аналоги на другой карте обычным перемещением инвентаря.

Вопрос исчерпан. ИМХО :)

Это сообщение отредактировано Nordan - 8 февраля 2012 | 18:51


#17 Wasteland Ghost

Wasteland Ghost

    Маленькое Злое Привидение

  • Пользователи
  • PipPipPip
  • 3 451 сообщений

Отправлено 08 Февраль 2012 - 18:52

override_map_start — это не перемещение Чузена, это смена стартовой позиции карты. Не совсем одно и то же. ;)


#18 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 08 Февраль 2012 - 18:58

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


Отправлено: 8 фев 12 20:57
И еще...

Не совсем понял как определять координату гекса по xy.

Допустим у меня есть гекс с номером 28499, по формуле (hex = 200 * y + x) получается что y=124 (28400/200) и x=99. Так чтоль???

Upd: не, не так, конечно переместило в районе этого гекса, но не в нем...

Это сообщение отредактировано Nordan - 8 февраля 2012 | 21:00


#19 Wasteland Ghost

Wasteland Ghost

    Маленькое Злое Привидение

  • Пользователи
  • PipPipPip
  • 3 451 сообщений

Отправлено 08 Февраль 2012 - 21:03

Не 124, а 142. Опечатка?

x равняется остатку от деления hex на 200, а y — целой части от деления hex на 200.

А вообще, используй макрос override_map_start_hex из maps.h:
#define override_map_start_hex(x,y,z) override_map_start(x%200,x/200,y,z)


#20 Nordan

Nordan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 209 сообщений

Отправлено 08 Февраль 2012 - 21:14

Ок, спасибо, разобрался.




Похожие темы Свернуть

  Название темы Форум Автор Статистика Последнее сообщение


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Рейтинг@Mail.ru