-
Число публикаций
546 -
Регистрация
-
Последнее посещение
-
Дней в топе
4 -
AMKoin
10,256 [Подарить AMKoin]
Закладки
-
[SOC] Мелкие правки движка
[SOC] Мелкие правки движкаДелаю первые шаги в C++
Так что сильно не пинайте. Но, правочки такой, почему-то никто не выкладывал. Выложу тогда я.
Скрытый текстДобавление возможности автокоррекции размеров иконок и сеток, в окнах слотов и инвентаря.
Править потребовалось один единственный файл: xrGame/ui/UIXmlInit.cpp
Один метод в нем, изменил вот так:
bool CUIXmlInit::InitDragDropListEx(CUIXml& xml_doc, const char* path, int index, CUIDragDropListEx* pWnd) { R_ASSERT3(xml_doc.NavigateToNode(path,index), "XML node not found", path); float x = xml_doc.ReadAttribFlt(path, index, "x"); float y = xml_doc.ReadAttribFlt(path, index, "y"); float width = xml_doc.ReadAttribFlt(path, index, "width"); float height = xml_doc.ReadAttribFlt(path, index, "height"); InitAlignment (xml_doc, path, index, x, y, pWnd); pWnd->Init (x,y, width,height); Ivector2 w_cell_sz, w_cells, w_cell_sp; // Add by Zander Fvector2 device_scale; device_scale.x = 1024.0f / _max((float)Device.dwWidth, 1.0f); device_scale.y = 768.0f / _max((float)Device.dwHeight, 1.0f); int autclc = xml_doc.ReadAttribInt(path, index, "autocalc", 0); int cellmin = xml_doc.ReadAttribInt(path, index, "cell_minimals", 0); // end w_cell_sz.x = xml_doc.ReadAttribInt(path, index, "cell_width"); w_cell_sz.y = xml_doc.ReadAttribInt(path, index, "cell_height"); // Add by Zander if (autclc == 1) { w_cell_sz.x = (int)round(w_cell_sz.x * device_scale.x); w_cell_sz.y = (int)round(w_cell_sz.y * device_scale.y); } if (autclc == 2) { w_cell_sz.x = (int)round(50.0f * device_scale.x); w_cell_sz.y = (int)round(50.0f * device_scale.y); } // end w_cells.y = xml_doc.ReadAttribInt(path, index, "rows_num"); w_cells.x = xml_doc.ReadAttribInt(path, index, "cols_num"); // Add by Zander if (cellmin == 1) { // Приоритет - необходимое число ячеек в указанном объеме int w_cell_sz_x = (int)trunc(width / _max((float)w_cells.x, 1.0f)); int w_cell_sz_y = (int)trunc(height / _max((float)w_cells.y, 1.0f)); if (w_cell_sz_x < w_cell_sz.x) w_cell_sz.x = w_cell_sz_x; if (w_cell_sz_y < w_cell_sz.y) w_cell_sz.y = w_cell_sz_y; } else { // Приоритет - правильный размер иконок и сетки if (autclc == 1) { // Заполняем сетку максимально w_cells.x = (int)trunc(width / _max((float)w_cell_sz.x, 1.0f)); w_cells.y = (int)trunc(height / _max((float)w_cell_sz.y, 1.0f)); } } // end w_cell_sp.x = xml_doc.ReadAttribInt(path, index, "cell_sp_x", 0); w_cell_sp.y = xml_doc.ReadAttribInt(path, index, "cell_sp_y", 0); pWnd->SetCellSize (w_cell_sz); pWnd->SetCellsSpacing (w_cell_sp); pWnd->SetStartCellsCapacity (w_cells); int tmp = xml_doc.ReadAttribInt(path, index, "unlimited", 0); pWnd->SetAutoGrow (tmp!=0); tmp = xml_doc.ReadAttribInt(path, index, "group_similar", 0); pWnd->SetGrouping (tmp!=0); tmp = xml_doc.ReadAttribInt(path, index, "custom_placement", 1); pWnd->SetCustomPlacement(tmp!=0); tmp = xml_doc.ReadAttribInt(path, index, "vertical_placement", 0); pWnd->SetVerticalPlacement(tmp != 0); tmp = xml_doc.ReadAttribInt(path, index, "show_grid", 1); pWnd->SetDrawGrid (tmp != 0); tmp = xml_doc.ReadAttribInt(path, index, "condition_progress_bar", 0); pWnd->SetConditionProgBarVisibility(tmp!=0); if (xr_strlen(path)) pWnd->SetWindowName (path, TRUE); return true; }
В результате этой правки, движок начинает понимать в конфигах xml инвентаря, два новых атрибута в окнах с инвентарными сетками:
autocalc (возможные значения - 0,1,2) - необходимость пересчитывать размер ячеек сетки и иконок.
cell_minimals (возможные значения - 0,1) - необходимость во что бы то ни стало вместить указанное количество ячеек в заданные размеры окна.
Если эти атрибуты в конфигах отсутствуют, или указано значение 0 - то поведение в точности такое же, как и раньше. Сетка/иконки выводятся в координатах 1024х768, в тех размерах и координатах, что указаны в xml.
autocalc="1" - ячейки иконок примут размер в пикселах, указанный в xml, на мониторе конечного пользователя с учетом его разрешения. Т.е. если например у нас написано
<dragdrop_bag cell_width="42" cell_height="42" autocalc="1"/>
То 1 клетка сетки/иконок примет размер 42х42 пиксела на мониторе юзера. И не важно, какое у него разрешение, и насколько оно (не)похоже на то, что имели в виду составители xml конфига.
Ненужные в данном вопросе атрибуты xml в этой строке опущены, но удалять их конечно не надо.
autocalc="2" - для ленивых) Поведение то же, что и в предыдущем варианте, но подгонять сетку будет к размеру 50х50, игнорируя указания cell_width, cell_height.
cell_minimals="1" - Это для слотов. Если указано 1, окно слота маленькое, и указанное число ячеек в нем не помещается, то размер ячейки дополнительно ужимается до того чтобы поместилось. Это все опять же на экране пользователя с учетом его разрешения.
Ну и бонусом, если для окна инвентаря указать autocalc 1 или 2, и cell_minimals 0, то размер ячейки будет изменен с учетом разрешения монитора пользователя, а сетка инвентаря переформирована под то число ячеек, которое в нее поместится с учетом этого изменения. Игнорируя указанные в xml значения rows_num и cols_num.
У себя проверил - работает... может быть, пригодится кому-то)
-
Скриптование
Скриптование1. При построчном чтении конфига выводятся три переменных: пустышка, имя параметра, значение.
2. Конфиг [keep_items] достаточно вычитать один раз – см. последний пример.
Spoilerfunction drop_all_items() local function fx(item) db.actor:drop_item(item) end db.actor:inventory_for_each(fx) -- кроме квестовых и специальных предметов end
Spoilerlocal t = {} function drop_all_items() local function fx(dummy, item) t[#t +1] = item -- можно заносить в таблицу сами предметы – drop_item позволяет обходить пустышки end db.actor:iterate_inventory(fx, nil) for i = 1, 5 do -- несколько случайных предметов local k = math.random(#t) -- случайный ключ db.actor:drop_item( t[k] ) table.remove(t, k) -- построчная очистка end end
Spoilerlocal keep = {} -- полный список; заполняется один раз keep.bolt = true keep.device_torch = true keep.device_pda = true local death_ini = ini_file("misc\\death_generic.ltx") local n = death_ini:line_count("keep_items") for i = 0, n -1 do local dummy, sect, bool = death_ini:r_line("keep_items", i, "" , "") -- три переменных: пустышка, параметр, значение (в данном случае true для всех) keep[sect] = bool end local items = {} function drop_all_items() local function list(dummy, item) if not keep[ item:section() ] then -- сверка по ключу (вместо перебора) items[#items +1] = item -- можно заносить в таблицу сами предметы – drop_item позволяет обходить пустышки без вылета -- items[#items +1] = item:id() -- вариант с id end end db.actor:iterate_inventory(list, nil) for i = 1, #items do db.actor:drop_item( items[i] ) -- db.actor:drop_item( level.object_by_id( items[i] ) ) -- вариант с id end items = {} -- полная очистка end
-
[SoC] Ковыряемся в файлах
[SoC] Ковыряемся в файлахСкрытый текстfunction get_cost() local t_cost = 0 local objects = {} db.actor:iterate_inventory(function(d, o) local sect = o:section() if sect ~= "bolt" and sect ~= "device_pda" then t_cost = t_cost + o:cost() table.insert(objects, o) end end) for _, obj in pairs(objects) do local sobj = alife():object(obj:id()) if sobj then alife():release(sobj, true) end end dialogs.relocate_money(db.actor, t_cost, "in") end
-
Ваши правки для Сталкер ЧН
Ваши правки для Сталкер ЧНАвто сохранения после взятии квеста для сталкер Чистое небо (примерно как в ЗП)
Скрытый текстАвтор: SaViMoN
Скрытый текстПросьба, при добавлении в сборку или мод обязательно указать автора