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
  
 
  Ок, спасибо, разобрался.