Перейти к контенту

ted.80

Жители
  • Число публикаций

    546
  • Регистрация

  • Последнее посещение

  • Дней в топе

    4
  • AMKoin

    10,256 [Подарить AMKoin]

ted.80 последний раз побеждал 22 Января

ted.80 - автор самых популярных публикаций!

Баланс оценок

376

4 подписчика

О ted.80

  • День рождения 30.05.1980

Звание

  • Звание
    Винтажный Газогенератор

Контакты

  • Сайт
    https://yadi.sk/d/Snw1s-K43GjcX9

Информация

  • Реальное имя
    Денис
  • Город
    Павлодар.kz

Недавние посетители профиля

8 037 просмотров профиля

Закладки

  1. [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.

    У себя проверил - работает... может быть, пригодится кому-то)

     

     


  2. Скриптование
    Скриптование

    @mole venomous

    1. При построчном чтении конфига выводятся три переменных: пустышка, имя параметра, значение.

    2. Конфиг [keep_items] достаточно вычитать один раз – см. последний пример.

    Spoiler
    function drop_all_items()
    	local function fx(item)
    		db.actor:drop_item(item)
    	end
    
    	db.actor:inventory_for_each(fx)		-- кроме квестовых и специальных предметов
    end

     

    Spoiler
    local 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

     

    Spoiler
    local 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

     

     


  3. [SoC] Ковыряемся в файлах
    [SoC] Ковыряемся в файлах

    @Houdini_one 

    Скрытый текст
    
    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

     

     


  4. Ваши правки для Сталкер ЗП
    Ваши правки для Сталкер ЗП

    в реале подсветка сетки включается/выключается:

     

    Ссылка: https://yadi.sk/d/kj3ZhEbGt3ZuC

     

     


  5. Ваши правки для Сталкер ЧН
    Ваши правки для Сталкер ЧН

    Авто сохранения после взятии квеста для сталкер Чистое небо (примерно как в ЗП)

    Скрытый текст

    Автор: SaViMoN

    Скрытый текст

    Просьба, при добавлении в сборку или мод обязательно указать автора


×
×
  • Создать...