Полная Версия: Вариативность локаций в Ф2
Nordan
Суть в том, что при значение какой либо ГВАРы = x, при входе в город должна подгружаться локация 111, а при значении той же ГВАРы = y, должна подгружаться локация 222. Мне бы хотелось узнать: на сколько возможна (проблематична) эта концепция?
Wasteland Ghost
Именно так сделано изменение локации V15 в FO2. Сэ мэ файлик city.txt и доку по скриптам. ЕМНИП, это делается с помощью макроса mark_map_entrance_state.
Nordan
Я неправильно выразился....

По сути мне нужно сделать 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?
Wasteland Ghost
По всей видимости, если mark_type==MARK_TYPE_TOWN, то указывается номер города, иначе — карты.

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

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


Wasteland Ghost
Да, entrance тут, а включение/отключение в скриптах ищи.
Nordan
Окей, я только что проверил, что одинаковые координаты маркеров городов на мировой карте не ведет к падению игры, поэтому этот вариант мне кажется наиболее пригодным и простым, как говорится: "идем по пути наименьшего сопротивления".Да и, как выяснилось, способ с 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 если быть точным).

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

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

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

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

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

Отправлено: 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
Я тут вспомнил, что подобное проворачивалось и в Модоке, где при взрыве сортира город покрывался "пакостью".

Пробил ГВАРы по слову "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, что делать дальше не очень представляю...

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

Upd: кстати, да. Голова моя дырявая. В V15 тоже, наверное, через override_map_start делается... В map_enter висит проверка на ГВАРу, затем стоит override_map_start. Ну, это значит только одно: работу mark_map_entrance_state определённо надо тестировать на собственных примерах. :)
Nordan
Аммм...с чузом понятно, его можно просто переместить на другой уровень карты, а с НПС тогда что делать ? :) Там же локация пустая :).
Wasteland Ghost
Тоже переместить. В map_enter каждого НПС. Тут ведь вот в чём проблема: если делать новую карту с такими же НПС и такими же скриптами, то для игры это будут совершенно разные объекты. И после изменения карты на новую все НПС "забудут" Чузена. Чтобы этого не произошло, скриптеры сделали 2 уровня одной и той же карты и переместили Чузена и НПС на новый уровень. Конечно, всегда можно "напомнить" новым НПС всё, что "знали" старые, но это усложнит скриптинг. Так, через 2 уровня, конечно проще.
Nordan
А, ну да, я слепой :) Раза три просматривал функции с картой местности, только щас увидел функцию critter_attempt_placement .

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

Вопрос исчерпан. ИМХО :)
Wasteland Ghost
override_map_start — это не перемещение Чузена, это смена стартовой позиции карты. Не совсем одно и то же. ;)
Nordan
Значит я не совсем так понял фразу "принудительно установить позицию игрока при загрузке карты", но все равно, в принципе, ничего это не меняет, главное принцип понят.


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

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

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

Upd: не, не так, конечно переместило в районе этого гекса, но не в нем...
Wasteland Ghost
Не 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)
Nordan
Ок, спасибо, разобрался.
Ваш ответ: