Nordan
3 February 2012 | 20:43
Суть в том, что при значение какой либо ГВАРы = x, при входе в город должна подгружаться локация 111, а при значении той же ГВАРы = y, должна подгружаться локация 222. Мне бы хотелось узнать: на сколько возможна (проблематична) эта концепция?
Wasteland Ghost
3 February 2012 | 23:01
Именно так сделано изменение локации V15 в FO2. Сэ мэ файлик city.txt и
доку по скриптам. ЕМНИП, это делается с помощью макроса mark_map_entrance_state.
Nordan
4 February 2012 | 02: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?
Wasteland Ghost
4 February 2012 | 19:35
По всей видимости, если mark_type==MARK_TYPE_TOWN, то указывается номер города, иначе карты.
Не факт, что движок проглотит два города в одной точке мира. Проверяй. Если будет падать пробуй вариант с включением/выключением entrance. Два вида одного и того же города, повторюсь, реализованы в V15. Как раз через включение/отключение entrance. Можно подсмотреть и сделать по аналогии. ;)
Nordan
4 February 2012 | 23: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 |
Wasteland Ghost
5 February 2012 | 15:35
Да, entrance тут, а включение/отключение в скриптах ищи.
Nordan
5 February 2012 | 17: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 если быть точным).
Wasteland Ghost
5 February 2012 | 18:54
Да, как второй уровень. И точка входа меняется с первого уровня (entrance_0) на второй (entrance_1). Т.е. именно карта и именно меняется, не скриптово, а подменой уровней. Плюсом, там, по-идее, на смежной карте должны скриптово переустанавливаться зоны выхода.
Хотя, если движок терпит два города в одном, то так, наверное, будет проще.
Nordan
5 February 2012 | 19:13
Окееей, но я все равно до конца не понял как это сделано...
entrance_0=On , значит Чуз при первом входе в город всегда появляется на карте The Squat A, но потом, видимо, идет проверка ГВАРы , и карта локации (если необходимо) меняется с 1-ого уровня на 2-ой уровень...
А дальше все это фиксируется в сэйве, так по идеи...
Wasteland Ghost
5 February 2012 | 21:29
Примерно. :) Где-то есть скрипт, в котором есть проверка какой-то гвары и изменение entrance. Ищи. Контекстным поиском внутри исходников скриптов. По ключевым словам (именам функций, макрокомандам).
К сожалению, у меня лично нет времени ковырять скрипты. Могу только указать направление, в котором надо копать. Собственно, уже указала. V15. Искать "The Squat" и всё, что с ним связано: описания карт, локации V15, скрипты... Или другой вариант: ничего не искать, взять и проверить на конкретном примере своего собственного города работу макроса mark_map_entrance_state. Это вообще самый лучший способ разобраться: попытаться реализовать и посмотреть, как оно работает.
Nordan
6 February 2012 | 09: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
7 February 2012 | 21: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, что делать дальше не очень представляю...
Wasteland Ghost
7 February 2012 | 22:38
В Модоке делается через override_map_start, вроде...
Upd: кстати, да. Голова моя дырявая. В V15 тоже, наверное, через override_map_start делается... В map_enter висит проверка на ГВАРу, затем стоит override_map_start. Ну, это значит только одно: работу mark_map_entrance_state определённо надо тестировать на собственных примерах. :)
Nordan
7 February 2012 | 22:56
Аммм...с чузом понятно, его можно просто переместить на другой уровень карты, а с НПС тогда что делать ? :) Там же локация пустая :).
Wasteland Ghost
8 February 2012 | 08:40
Тоже переместить. В map_enter каждого НПС. Тут ведь вот в чём проблема: если делать новую карту с такими же НПС и такими же скриптами, то для игры это будут совершенно разные объекты. И после изменения карты на новую все НПС "забудут" Чузена. Чтобы этого не произошло, скриптеры сделали 2 уровня одной и той же карты и переместили Чузена и НПС на новый уровень. Конечно, всегда можно "напомнить" новым НПС всё, что "знали" старые, но это усложнит скриптинг. Так, через 2 уровня, конечно проще.
Nordan
8 February 2012 | 18:04
А, ну да, я слепой :) Раза три просматривал функции с картой местности, только щас увидел функцию critter_attempt_placement .
Ну тогда все понятно, по проверке гвары происходит перемещение Чузена(override_map_start) и перемещение НПС (critter_attempt_placement), ну а вещи из всяких шкафов (и т.п.) переносятся в свои аналоги на другой карте обычным перемещением инвентаря.
Вопрос исчерпан. ИМХО :)
Wasteland Ghost
8 February 2012 | 19:52
override_map_start это не перемещение Чузена, это смена стартовой позиции карты. Не совсем одно и то же. ;)
Nordan
8 February 2012 | 19:58
Значит я не совсем так понял фразу "принудительно установить позицию игрока при загрузке карты", но все равно, в принципе, ничего это не меняет, главное принцип понят.
Отправлено: 8 фев 12 20:57
И еще...
Не совсем понял как определять координату гекса по xy.
Допустим у меня есть гекс с номером 28499, по формуле (hex = 200 * y + x) получается что y=124 (28400/200) и x=99. Так чтоль???
Upd: не, не так, конечно переместило в районе этого гекса, но не в нем...
Wasteland Ghost
8 February 2012 | 22: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)
Nordan
8 February 2012 | 22:14
Ок, спасибо, разобрался.