Профиль
unk1024 не указал(а) ничего о себе.
unk1024
Матрос
Возраст не указан лет
Пол не указан
Место жительства не указано
Нет данных
Регистрация: 17-May 06
Просмотров профиля: 6,128*
Последнее посещение: 1st October 2018 - 06:06 AM
Часовой пояс: May 12 2024, 06:14 PM
137 сообщений (0 за день)
Нет данных
Нет данных
Нет данных
Нет данных
скрыто
* Просмотры профиля обновляются каждый час
|
Содержимое
Core Engine details:
Atom Atom is internal core object, which contain internal engine information for objects, such as layers assigment, services flag and other. For each entity exist one atom object, connected to this entity. Atoms objects can be accessed by engine core only. Atom id structure equal to connected entity id structure.
Engine Objects are: Entities, Services and Layers
Core application programming interface - Core API Core API is a engine core base class. Using pointer on this object, entities can call to engine functions. Core API Pointer - pointer to static engine object, it never changed during the programm execution.
Entity Constructor: Core setup Core Api Pointer before any of objects in module can be created, but You cannot use Api in object constructor. Used Api from constructor for creating and deleting engine objects can damage engine state save/load mechanism. When the engine core meet call of this type, exception "api call from constructor" generated and execution halted.
Messages and save/load state format specificators:
'b' - byte 'w' - word 'l' - long 'u' - dword 'f' - float 'd' - double 'p' - pointer (char *) 's' - string (char *) 'm' - memory block (dword size, char * memory) 'v' - structure (sizeof(struct),struct)
Examples read: byte b = m.Byte(); word w = m.Word(); long l = m.Long(); dword u = m.Dword(); float f = m.Float(); double d = m.Double(); char * p = m.Pointer(); char s[200]; m.String(sizeof(s),s);
char buffer[1024]; m.MemoryBlock(sizeof(buffer),buffer);
RECT struct; m.Struct(sizeof(struct),&struct);
Examples write: Send_Message("bwlufdp",b,w,l,u,f,d,p); Send_Message("s",s); Send_Message("m",sizeof(buffer),buffer); Send_Message("v",sizeof(struct),struct);
Save state mechanism scheme: 1. Create save state file 2. Save engine core state (CoreState struct) 3. Save classes table: classes count N, class name 0,...,class name N 4. Save atoms states: atoms count N, atoms id 0, atom state 0,...,atoms id N, atom state N 5. Save layer information: layers count N, layer index 0, layer name 0, layer_state 0, objects count 0, object priority 0, object id 0,...,object priority N, object id N ,..., layer index N, layer name N, layer_state N, objects count N, object priority 0, object id 0,...,object priority N, object id N 6. Save objects data: object id 0, object state data 0,...,object id N, object state data N (via CreateState() function)
Load state mechanism scheme:
1. Open state file 2. Read core state, check engine version and reload classes table 3. Read classes table and compare with currently loaded 4. Read atoms states and entities ids, restoration of atom structure and objects 5. Read layers information, creation of layers and restoring of layers content 6. Uploading objects states (via LoadState() function)
************************************************** *** Описание INI файла для интерфейсов *** ******************************************************************************** *********
INI-файлы размещаются в директории "RESOURSE\INI\INTERFACES" и включают в себя следующие секции:
!!!!!!СЕКЦИЯ!!!!!! [MAIN] Здесь описывается список тех компонент интерфейса которые присутствуют в данном интерфейсе (Полный список приводится ниже), следующим образом: -------------------------------------- item = тип компоненты, имя компоненты -------------------------------------- Каждая компонента списка выводится на экране в очередности как сверху в низ в описанном списке компонент.
В конце списка размещен указатель на тот компонент, который станет текущим при старте интерфейса. --------------------------- start = имя компоненты ---------------------------
!!!!!!СЕКЦИЯ!!!!!! [имя компоненты] Здесь описаны все параметры компоненты меню.
======================================================================== СПИСОК КОМПОНЕНТ : ======================================================================== BUTTON VIDEO SCROLLIMAGE IMAGECOLLECTION STRINGCOLLECTION FOURIMAGES RECTANGLE BOUNDER TITLE TEXTBUTTON SCROLLBAR LINECOLLECTION STATUSLINE CHANGER PICTURE CONTEXTHELP GLOWS LRCHANGER TWO_PICTURE SCROLLER QUESTTITLE QUESTTEXT SLIDEPICTURE
======================================================================== ОБЩИЕ КОМАНДЫ (СООБЩЕНИЯ) : ======================================================================== // выполнить нодом команду (заданную кодом) SendMessage(&GameInterface,"lslll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", -1, 0, <command code>); // установить статус для нода: можно/нельзя кликать мышью SendMessage(&GameInterface,"lslll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", -1, 1, <clickable status>); // получить статус для нода: можно/нельзя кликать мышью int SendMessage(&GameInterface,"lslll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", -1, 2); // выполнить нодом команду (заданную строкой - названием) SendMessage(&GameInterface,"lslls",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", -1, 3, <command name>); // изменить позицию для нода SendMessage(&GameInterface,"lsllllll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", -1, 4, left,top, right,bottom);
[SCROLLEDPICTURE] // в INI файле весь набор параметров для PICTURE + следующие дополнительные: basesize = 1000,1000 // масштаб картинки (в этих единицах задаются координаты в картинке) scale1 = 1.0, 1.0 // масштаб по X,Y (1.0 показывается вся картинка целиком) scale2 = 0.5, 0.5 ... scaleN = 0.1, 0.1 startscale = 2 // первый включаемый масштаб //--------------------------------------- // в скрипте заполняются следующие поля: //--------------------------------------- GameInterface.<имя элемента>.centerX позиция для центрирования в картинке GameInterface.<имя элемента>.centerY //--------------------------------------- // список встроенных картинок GameInterface.<имя элемента>.imagelist.img1 ... imgN где каждый элемент состоит: //--------------------------------------- GameInterface.<имя элемента>.imagelist.img1.x // позиция встроенной картинки GameInterface.<имя элемента>.imagelist.img1.y // либо GameInterface.<имя элемента>.imagelist.img1.group // имя группы и самой картинки GameInterface.<имя элемента>.imagelist.img1.pic // либо GameInterface.<имя элемента>.imagelist.img1.file // имя файла для картинки //------------------------------------------------- // для управления используются следующие сообщения //------------------------------------------------- // весь набор сообщений для PICTURE. + : // установить центрикрование в картинке по следующим координатам (пределы заданы basesize) // заданные числами с плавающей точкой SendMessage(&GameInterface,"lslff",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 10, centerX,centerY);
[CHECKBUTTON] exclusiveChoose = 0 // выбранной может быть только одна кнопка textClickable = 0 // клик мыши работает как на тексте, так и на иконке font = interface_normal // шрифт fontScale = 1.0 // масштаб шрифта normalFontColor = 255,200,200,200 // цвет обычного текста selectFontColor = 255,200,200,255 // цвет текста для помеченной как включено кнопки disableFontColor = 255,68,68,68 // цвет текста для запрещенной кнопки rect_textoffset = 40,0,0,0 // отступы слева,сверху,справа,снизу для текста (относительно позиции контролки) lineheight = 16 // вертикальное расстояние между строками alignment = center // выравнивание текста (left,center,right) sectioninterval = 12 // дополнительный вертикальный отступ между кнопками (+lineheight=общий отступ) iconsize = 32,32 // размер иконки кнопки icongroup = ICONS // имя группы картинок для иконок кнопок normalpicture = ship back // иконка для нормальной (невыделенной) кнопки normalpiccolor = 255,128,128,128 // цвет для нормальной иконки selectpicture = exit button // иконка для выделенной (отмеченной) кнопки selectpiccolor = 255,128,128,128 // цвет для выделенной кнопки disablepicture = black rectangle // иконка для запрещенной кнопки disablepiccolor = 255,128,128,128 // цвет иконки для незапрещенной кнопки iconoffset = 0,0 // смещение иконки относительно левой координаты позиции и верхней строки текста (для кнопки) individualpos = 0 // у каждой кнопки своя индивидульная позиция (см. параметр posN=) // pos1 = 0,0 // позиции для кнопок (работают при включенном флаге individualpos) ... posN = 0,0 // section1 = 0,0,text for first button // описание кнопки: <выделение 0-1>, <запрещение 0-1>, "текст" ... // текст является ID для строки sectionN = 1,1,#???????????????????? // если текст начинается с #, то текст берется как есть // Сообщения для элемента: // добавить кнопку SendMessage(&GameInterface,"lslsll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 0, "текст", selectStatus, disableStatus ); // установить новый текст на кнопку SendMessage(&GameInterface,"lslls",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 1, buttonNumber, "текст"); // установить выбор на кнопку SendMessage(&GameInterface,"lslll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 2, buttonNumber, selectStatus ); // получить сосотояние кнопки (возвращает 1 - выбрана, 0 - невыбрана) SendMessage(&GameInterface,"lsll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 3, buttonNumber ); // получить выбранную кнопку (для не эксклюзивного выбора выдает номер первой выбранной) SendMessage(&GameInterface,"lsl",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 4 ); // запретить/разрешить кнопку SendMessage(&GameInterface,"lslll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 5, buttonNumber, disableStatus ); // Поля используемые в скрипте GameInterface.<имя элемента>.state1 // состояние (выбрано/нет) для кнопки с указанным номером (0-off,1-on) ... // GameInterface.<имя элемента>.stateN // // При изменении состояния кнопки высылается event event( "CheckButtonChange", "sll", имя_нода, номер_кнопки, новое_состояние{0,1} )
[TABLE] class = TABLE fontcell = interface_normal fontcellcolor = 255,255,255,255 fontcellscale = 1.0 fontcellalignment = center fontcellvalignment = top fonttitle = interface_normal fonttitlecolor = 255,148,148,148 fonttitlescale = 1.2 fonttitlealignment = center fonttitlevalignment = top backimage = piclist=PAPIRUS, picname=papirus_store_price, color=(255,128,128,128) bordericongroup = MAIN_ICONS borderlefttop = BORDER_UPLEFT borderleftbottom = BORDER_DOWNLEFT borderrighttop = BORDER_UPRIGHT borderrightbottom = BORDER_DOWNRIGHT borderleft = BORDER_LEFT borderright = BORDER_LEFT bordertop = BORDER_CENTER borderbottom = BORDER_CENTER bordervline = BORDER_LEFT borderhline = BORDER_CENTER bordercolor = 255,128,128,128 borderwidth = 4 vlinewidth = 4 hlineheight = 4 headerlineheight = 4 hlineisbreakable = 0 bordercornersize = 9,9 rowquantity = 4 colquantity = 4 rowsheight = 0,0,0,0 colswidth = 60,80,120,60 cellspacesize = 4,4 scroller = имя контролки скроллера fontlist1 = font_name_1 ... // из етого списка можно применять фонты в отдельных ячейках ... // если поставить в скрипте атрибут .td<n>.fontidx = {0,1,...,N} fontlistN = font_name_N // без етого атрибута используется стандартный шрифт //Сообщения для элемента: // обновить строки (нужно после изменений из скрипта) SendMessage(&GameInterface,"lsl",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 0 ); // получить номер строки на которой находится указатель мыши (-1 - указатель за пределами) int SendMessage(&GameInterface,"lsl",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 1 ); // Поля заполняемые и используемые в скрипте GameInterface.<имя элемента>.top - индекс первой отображаемой строки GameInterface.<имя элемента>.select - индекс выделенной строки GameInterface.<имя элемента>.hr. - заполнение строки заголовка(отсутствует если нет заголовка) : GameInterface.<имя элемента>.hr.speccolor - argb color для специального выделения строки GameInterface.<имя элемента>.hr.td1. - ячейки строки : ... GameInterface.<имя элемента>.hr.td<n>. GameInterface.<имя элемента>.hr.td1.icon. - картинка установленная в ячейку : !!! или GameInterface.<имя элемента>.hr.td1.icon1 ... GameInterface.<имя элемента>.hr.td1.iconN GameInterface.<имя элемента>.hr.td1.icon.group - имя группы GameInterface.<имя элемента>.hr.td1.icon.image - имя самой картинки в группе GameInterface.<имя элемента>.hr.td1.icon.texture - имя файла с текстурой (uv => 0,0 - 1,1) GameInterface.<имя элемента>.hr.td1.icon.uv - UV-coordinates (left,top,right,bottom) GameInterface.<имя элемента>.hr.td1.icon.texturepointer - указатель на класс текстуры (IDirect3DTexture8*) GameInterface.<имя элемента>.hr.td1.icon.width - ширина/высота картинки (необязательный - по умолчанию размер исходной картинки) GameInterface.<имя элемента>.hr.td1.icon.height GameInterface.<имя элемента>.hr.td1.icon.cellsize = 1 - использовать ширину и высоту ячйки для размера иконки GameInterface.<имя элемента>.hr.td1.icon.offset = "0,0" - смещение картинки GameInterface.<имя элемента>.hr.td1.icon.valign = {"top","center","bottom"} - вертикальное выравнивание GameInterface.<имя элемента>.hr.td1.str - строка прописанная в ячейке (можно использовать /n для переноса строки) GameInterface.<имя элемента>.hr.td1.color - цвет шрифта (необязателен - по умолчанию берется из инишника) GameInterface.<имя элемента>.hr.td1.scale - масштаб шрифта (необязателен - по умолчанию берется из инишника) GameInterface.<имя элемента>.hr.td1.align - горизонтальное выравнивание в ячейке ("left","center" or "right") GameInterface.<имя элемента>.hr.td1.valign - вертикальное выравнивание в ячейке ("top","center" or "bottom") GameInterface.<имя элемента>.hr.td1.textoffset = "0,0" - смещение для текста GameInterface.<имя элемента>.hr.td1.textoffsets.s1 ... - вертикальное смещение для каждой строки (не обязательно для всех, номер есть номер строки) GameInterface.<имя элемента>.tr1. - строки (не заголовочные) все параметры как и в заголовке прописываются в td1 ... td<n> ... GameInterface.<имя элемента>.tr<n>. // присылаемые evnts: Event( "OnTableClick", "sll", node_name, row,col ) - где row&col=1...N (если row=0 - это "шапка"); Event( "TableSelectChange", "sll", node_name, row,col );
[SCROLLBAR] fontID = interface_normal fontColor = 255,255,255,255 fontScale = 1.0 fontOffset = 0,0 // смещение текста относительно середины по горизонтали(всегда выравнивание по центру) и верхней точки по вертикали faceColor = 255,128,128,128 // цвет для картинки shadowColor = 155,0,0,0 // цвет для тени group = ICONS // группа иконок применяемых в изображении pressPictureOffset = 2,2 // смещение кнопок при нажатии shadowOffset = 3,3 // смещение тени кнопок (без нажатия) pressShadowOffset = 1,1 // смещение тени кнопок при нажатии pressDelay = 20 // задержка на нажатии в милисекундах leftPicture = small left arrow rightPicture = small right arrow centerPicture = scrollbar selectCenterPicture = select scrollbar barWidth = 100 // ширина центральной картинки (без стрелок) ;sideWidth = 16 // ширина стрелки (если прописан, то параметр barWidth не используется) valueShow = 0 // выводить на показ внутреннее значение (если использованть его) valueMin = 0 // минимальное значение valueMax = 100 // максимальное значение valueStart = 0 // стартовое значение (если перед инициализацией интерфейса выставить атрибут GameInterface.<nodeName>.str = <n>, то стартовым будет значение из атрибута) valueStep = 1 // шаг увеличения/уменьшения внутреннего значения valueStepMultiply = 10 // множитель шага увеличения/уменьшения значения для быстрого изменения //Сообщения для элемента: // установить минимальное значение SendMessage(&GameInterface,"lslf",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 0, 0.0 ); // установить максимальное значение SendMessage(&GameInterface,"lslf",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 1, 100.0 ); // изменить значение SendMessage(&GameInterface,"lslf",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 2, 10.0 ); // Поля заполняемые и используемые в скрипте GameInterface.<имя элемента>.str - значение (тип float)
[PICTURE] groupName = groupname picName = picname textureName = texture file name videoName = video texture name color = 255,128,128,128 blind = 0 blindUpTime = 1.5 blindDownTime = 1.0 blindMinColor = 255,128,128,128 blindMaxColor = 255,168,168,168 //Сообщения для элемента: // Установить картинку на новую позицию SendMessage(&GameInterface,"lslllll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 0, left,top,right,bottom ); // Установить текстурные координаты картинки SendMessage(&GameInterface,"lslffff",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 1, left,top,right,bottom ); // Установить новую картинку или видео картинку SendMessage(&GameInterface,"lslls",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 2, bUseVideo, <video or texture file name> ); // Установить случайную картинку из директории SendMessage(&GameInterface,"lsls",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 3, <directory name> ); // Установить новый цвет SendMessage(&GameInterface,"lsll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 4, argbColor ); // установить/снять мигание SendMessage(&GameInterface,"lsll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 5, bSetBlind ); // установить новую картинку заданную именем группы и именем картинки SendMessage(&GameInterface,"lslss",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 6, groupName, pictureName ); // установить новую картинку из указателя на тексуру (IDirect3DTexture8*) SendMessage(&GameInterface,"lsll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 6, pTexture );
[STRINGCOLLECTION] string = string_id,font:interface_normal,pos:{100,100},fc:{255,255,255,255},bc:{0,128,128 ,128},scale:1.000000,state:{CS} // где: // string_id - идентификатор строки в common.ini // font - имя фонта // pos - позиция по x,y // fc - цвет шрифта // bc - цвет фона // scale - масштаб шрифта // state - флаги: L-выравнивание в лево, C-выравнивание по центру, R-выравнивание по правому краю, S-тень //Сообщения для элемента: // добавить динамическую строку SendMessage(&GameInterface,"lslsssllllllfl",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 0, str_id, str_text, fontname, pos.x,pos.y, font_color,back_color, alignment={SCRIPT_ALIGN_RIGHT,SCRIPT_ALIGN_CENTER,SCRIPT_ALIGN_LEFT}, bShadow={true,false}, scale, width ); // если width<=0, то параметр не учитывается, иначе масштаб приводится к тому, что бы строка уместилась в заданной ширине // Сменить строку по номеру (если новаястрока начинается с #, то берется строка как написана - иначе это ID строки) SendMessage( &GameInterface,"lslls",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 1, string_number, string_text ); // скопировать строку с одного места на другое (первая строка имеет номер 1) SendMessage( &GameInterface,"lslll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 2, dst_string_number, src_string_number ); // поменять цвет строки SendMessage( &GameInterface,"lslll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 3, string_number, color );
[RECTANGLE] ;position = left,top,right,bottom leftColor = 255,255,255,255 topColor = 205,100,50,11 rightColor = 255,255,255,255 bottomColor = 205,100,50,11 //Сообщения для элемента: // изменить положение SendMessage( &GameInterface,"lslllll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 0, left,top,right,bottom ); // Сменить цвет прямоугольника и границы SendMessage( &GameInterface,"lslll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 1, rectangle_color, border_color );
[IMAGECOLLECTION] groupName = имя группы picture = имя картинки (если задается picture = editsection:имя_секции, то данное описание не является описание картинки, но является секцией для редактора - всех последующих картинок до следующей секции или picture = editsection:end) ... picture = имя картинки //Сообщения для элемента: // добавить иконку SendMessage( &GameInterface,"lslslllll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 0, имя_картинки, цвет_картинки, left,top,right,bottom ); // установить текстуру SendMessage( &GameInterface,"lsls",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 1, имя_группы ); // удалить все картинки (текстуру оставить) SendMessage( &GameInterface,"lsl",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 2 ); // установить цвет картинки SendMessage( &GameInterface,"lslll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 3, номер_картинки, новый_цвет ); // изменить картинку SendMessage( &GameInterface,"lslls",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 4, номер_картинки, имя_картинки );
[FORMATEDTEXT] wrapoff = 0 syncnodes = node1,node2,...nodeN fontScale = 1.0 scrollerName = nodename alignment = {left,center,right} leftoffset = 0 upOffset = 0 videoName = animate_texture_name backColor = 0 backOffset = 0,0,0,0 UpEnableTexture = texture_name UpDisableTexture = texture_name UpEnablePos = 0,0,0,0 UpEnableUV = 0.0,0.0,1.0,1.0 UpDisableUV = 0.0,0.0,1.0,1.0 DownEnableTexture = texture_name DownDisableTexture = texture_name DownEnablePos = 0,0,0,0 DownEnableUV = 0.0,0.0,1.0,1.0 DownDisableUV = 0.0,0.0,1.0,1.0 lineSpace = 30 color = 255,128,128,128 font = font_name string = stringID or #string string = -/- ... string = -/- //Сообщения для элемента: // добавить текст к форматированному списку и вернуть количество занимаемых строк SendMessage( &GameInterface,"lsle",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 0, &string ); // установить текущий выделенный текст в списке (по его номеру) SendMessage( &GameInterface,"lsll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 1, string_number ); // установить текущий выделенный текст в списке (по относительному номеру строки от 0 до 1) SendMessage( &GameInterface,"lslf",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 2, relative_number ); // заполнить атрибуты размерами текстов SendMessage( &GameInterface,"lsla",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 3, arOutValueTable ); // заполнить аттрибуты Y координатами вершины текста SendMessage( &GameInterface,"lsla",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 4, arOutValueTable ); // Центрировать текст вертикально SendMessage( &GameInterface,"lsl",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 5 ); // Получить состояние возможности продвижения текста вверх/вниз SendMessage( &GameInterface,"lsll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 6, {true,false}=>{верх,низ} ); // установить строки на заданные позиции SendMessage( &GameInterface,"lsla",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 7, arStringList ); // Установить цвет для группы SendMessage( &GameInterface,"lslll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 8, stringNum, color ); // Узнать количество строк которое займет строка (return value) int SendMessage( &GameInterface,"lsle",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 9, &string ); // заменить строку под номером SendMessage( &GameInterface,"lslle",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 10, stringNum, &string ); // получить номер текущей выделенной строки (return value) int SendMessage( &GameInterface,"lsl",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 11 ); // получить вертикальную координату строки (если -1,то ее нет в отображаемом окне); SendMessage( &GameInterface,"lsll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 12, stringNum ); // заморозить контрол (обрабатывать только евент правой кнопки мыши) SendMessage( &GameInterface,"lsll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 13, isFreezed );
[LINECOLLECTION] line = (left,top)-(right,bottom),col:{a,r,g,b} //Сообщения для элемента: // сменить цвет для линии с номером или всех строк (если номер = -1) SendMessage( &GameInterface,"lslll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 0, color, line_num ); // добавить динию и вернуть ее номер long SendMessage( &GameInterface,"lsllllll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 1, color, left,top,right,bottom );
[TEXTBUTTON] faceColor = 255,128,128,128 faceColorPressed = 255,128,128,128 faceColorSelected = 255,128,128,128 shadowColor = 255,0,0,0 fontColor = 255,255,255,255 unselectableFontColor = 255,128,128,128 group = MAIN_ICONS ;ShadowTexture = interfaces\shadow.tga ;ShadowUV = 0.0,0.0,1.0,1.0 ;shadowScale = 1.2 pressPictureOffset = 2,2 ;shadowOffset = 0,4 ;pressShadowOffset = 0,1 pressDelay = 20 font = interface_button strOffset = 7 buttonLeft = left side button buttonMiddle = middle side button selectButtonMiddle = select middle side button selectButtonleft = select left side button ;midVideo = button backColor = 0,0,0,0 class = TEXTBUTTON //Сообщения для элемента: // поменять текст на кнопке SendMessage( &GameInterface,"lsls",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 0, "new text" ); // если текст начинается с #, то ставится в точности он (иначе это ID строки) // поменять позицию кнопки SendMessage( &GameInterface,"lslllll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 1, left,top,right,bottom );
[SCROLLIMAGE] ;centerXoffset = центральная позиция - выделенная картинка ;centerYoffset = центральная позиция - выделенная картинка fMoveDelta = 35.0 speedMul = 3 imageSize = 128,128 fBoundScale = 1.0 wDelta = 4 blendColor = 255,128,128,128 blindDelay = 400 LayerQuantity = 1 dwNormalColorARGB1 = 255,128,128,128 dwSelectColorARGB1 = 255,48,48,48 dwNormalColorARGB2 = 255,128,128,128 dwSelectColorARGB2 = 255,168,168,168 borderShowUp = 1 border = ICONS,select border UseOneString = 0 scale1 = 1.0 font1 = interface_normal dwXOffset1 = 0 dwYOffset1 = 92 dwForeColor1 = 255,255,255,155 dwBackColor1 = 0,0,0,0 UseTwoString = 0 scale2 = 1.0 font2 = interface_normal dwXOffset2 = 0 dwYOffset2 = 0 dwForeColor2 = 255,255,255,255 dwBackColor2 = 0,0,0,0 //Сообщения для элемента: // разрешить/запретить показ рамки SendMessage( &GameInterface,"lsll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 0, bBorderShow ); // установить новую текущую картинку SendMessage( &GameInterface,"lsll",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 1, nNewSelectIndex ); // узнать номер картинки в которой находится курсор мыши (-1 не находится в картинке) int SendMessage( &GameInterface,"lsl",MSG_INTERFACE_MSG_TO_NODE,"имя элемента", 2 );
[PCEDITBOX] strFont = fontname fontScale = 1.0 disguisestring = 0 argbFontColor = 255,255,255,255 stringLength = -1 stringWidth = -1 stringoffset = 0,0 stringalign = left
[SLIDEPICTURE] // скрипты GameInterface.имя_нода.offset.x - координаты левого верхнего угла в мировых координатах GameInterface.имя_нода.offset.y
Все мы знаем, что в папке MODULES\ лежат странные файлики под названием Techniques (техники). Кроме того, там лежат еще и шейдеры (правда, я не люблю asm'овские шейдеры, мне больше по вкусу эффекты D3D, но в восьмой версии DirectX, которая применяется в ПКМ, эффектов нет, жаль), но они пока не интересны, хотя с их помощью можно создать новое море. Для начала давайте посмотрим, как установить существующую технику для моделей локации (см. Locations\Init\*.c). У них есть специальный аттрибут tech, в котором и указывается, какая техника будет использована для рендеринга модели. Устанавливается техника следующим образом: Код ... Locations[n].models.always.Имя_объекта.tech = "Имя_техники"; ... Добавить технику можно двумя способами: 1) в уже существующий .sha файл; 2) в новый .sha файл (при этом указывать его наличие нигде не надо, движок сам увидит, что добавилась новая техника и обработает ее. Продолжение следует...
Я не знаю, может, вы это знаете, но все же. В ПКМ есть встроенный дебаггер, который напоминает (отдаленно) дебаггер, например, MSVC. Для его активации необходимо создать файлик с именем "project.df" (без кавычек) и записать туда следующее содержимое: Код [options] break_on_error = 1 Дебаггер вызывается, если где-то возникла ошибка. В нем можно выполнять различные скриптовые функции, назначать значения переменным и т.д. Кроме того, доступен исходный код скрипта, где возникла ошибка. В К3 этот дебаггер тоже присутствует, кроме того, он улучшен. Вызывается точно также. Есть дополнительная команда вызова дебаггера (если изменилось значение переменной). В версии 1- было много ошибок, поэтому дебаггер вызывался многократно. Так мне удалось посмотреть исходники Net'овских скриптов и некоторых других.
Блог unk1024 по поводу формата ресурсов в ПКМ ВМЛ: ..5 мая 2006 г. Команда разработчиков мне не особо нравится, это мое личное.. Об остальном скажу побольше. Они скрыли свой код ВМЛ, им дали (?) код К3. Не скажу, чтобы зависть, но нехорошо. Я тут сижу, думаю, что это за формат SFFS, а они так просто.. Ну ладно, не буду забивать голову такими вещами, вообще не люблю все эти вещи. Начнем, пожалуй. У этой так называемой команды во главе с ALexusB (ничего не имею против) есть свои раздумьки по поводу хранения ресурсов (в том числе и скриптов) в игре. Они придумали (а может и не они?) такую систему: у них есть 7z-овский архив (причем запароленый), из которого при запуске их утилиты разархивирования извлекаются файлики, в том числе и файлы с ресурсами игры. Пароль не представляет особой сложности - "slib_pasz" (нашел, просматривая, но не дебагингом, а глазами файлик setup_upd.exe - та самая утилита). В итоге я сумел зайти WinRar'ом в этот архив. В нем я нашел ничего такого, что смогло дать мне возможность открыть их код. Поэтому, задача состояла в том, что мне самому необходимо расшифровать формат хранения ресурсов. Этим я и занялся. Включив в WinAmp'е трэк System of a Down - Kill Rock'n'Roll, я принялся за работу. Итак, что я имею: 1. Достаточное знание C++. 2. Достаточное знакомство с различными форматами ресурсов. 3. Достаточное количество написанных программ-грабберов. 4. Файлик с ресурсами. Это все, что мне необходимо. Итак, за работу.. Сначала откроем файлик "stormex2.dll" (хранит сами ресурсы в зашифрованном виде) и просмотрим его глазами. Так, например, я нашел (как же не заметить такое?) в конце FAT-таблицу. Первая структура ее, что пришла мне в голову, была следующей: 1. Размер строки с именем файла (включая каталоги) (тип: int). 2. Сама строка размером, указанным выше (тип: char []). 3. Размер самого файла (тип: int). 4. Нуль (тип: int). 5. Смещение от начала (тип: int). 6. Нуль (тип: int). Эта структура точно подходила на ту, что я видел в файле. Правда, я сомневался, действительно ли третьим и пятым элементом является то, что написал я. Это необходимо было проверить, но это я хотел оставить немного попозже, т.к. сейчас есть более важные вещи. Перейдем к самому концу файла. В соответствии с предложенной мной структурой, остаются лишние блоки данных размером в 24 байта. Я подумал, что это скорее всего заголовок FAT, правда к нему надо было бы подобрать другое название =) Здесь я предложил следующую структуру: 1. Количество файлов в FAT-таблице (тип: int). 2. Нуль (тип: int). 3. Смещение на начало FAT-таблицы от начала файла с ресурсами (тип: int). 4. Нуль (тип: int). 5. Размер FAT-таблицы (тип: int). 6. Нуль (тип: int). Т.к. заголовок FAT расположен в конце, то читать файл нужно с конца. Следующий этап заключается в том, является ли первый элемент - количеством файлов в таблице. Это можно проверить, правда, погрешности в вычислении будут очень большими. Для этого нужно взять размер FAT-таблицы и разделить его на приблизительный размер структуры файловой информации. Размер FAT-таблицы: 80EBh = 33003. Приблизительный размер структуры файловой информации: 6 * sizeof (int) + ~30 = 54 Приблизительное количество файлов: 33003 / 54 = 611. Выходит, что первый элемент не количество файлов в FAT-таблице. И тут до меня только дошло. Я чисто случайно увидел смещение к началу ресурсов в DLL'ке. Оно оказалось 3C00h. А это равняется как раз значению первого элемента. Значит, вторая структура, предложенная мной, оказалось немного неправильной. Вот как выглядит она точно: 1. Смещение на начало ресурсов (тип: int). 2. Нуль (тип: int). 3. Смещение на начало FAT-таблицы от начала файла с ресурсами (тип: int). 4. Нуль (тип: int). 5. Размер FAT-таблицы (тип: int). 6. Нуль (тип: int). Теперь остается самое трудное - определить, каким образом шифруется содержимое файлов в ресурсах. На этом я пока остановлюсь. ..6 мая 2006 г. Пора вернуться к делу. Ничего нового не пришло в голову (и во сне тоже).. Можно посчитать количество файлов в ресурсе. Для этого надо написать программку. Через 10 мин была написана программка. Получилось, что количество файлов в ресурсе достигает 691. Не очень много, но и не очень мало. ..7 мая 2006 г. Ночью пришла мысль (а я прям как Кекуле из его случая с бензолом) о том, почему в ресурсе файлики занимают менее 2 МБ? Я подумал, что применяется метод компрессии. Осталось только проверить. Обычно компрессуют с помощью ZLib-библиотеки. Надо было изучить DLL-ки, связанные с защитой. В "stormex2.dll" я ничего не нашел, но зато оставался другой файлик - "stormext.dll". И... Действительно ZLib присутствовал в DLL (это я увидел в списке используемых модулей, т.к. Delphi оставляет эту запись зачем-то). Я уже был уверен в том, что дело близиться к завершению. Пришлось закачивать библиотеку из Интернета, т.к. я ее потерял у себя на винте =) Ну ладно, 400 кб никому не навредят. Врубив в плэйлист System of a Down - Aerials, я переделал свою программку, добавил туда метод декомпрессии, а также смастерил рекурсивную функцию для создания директорий. Запустил... О!.. Ура! Победа! Первый файлик "animals.c" декомпрессирован отлично. Далее пошли второй, третий и, наконец, 691-ый. Моя мысля меня не подвела - все файлики лежали у меня в рабочей директории. Дело, которое хотелось давно сделать, сделано. Можно закрываться. Отправил файлик capitan_blood'у. Жду ответа.
|
Просмотры
![](style_images/aurora3/folder_profile_portal/user-offline.png) 1 Apr 2019 - 13:44
![](style_images/aurora3/folder_profile_portal/user-offline.png) 22 Oct 2014 - 2:52
![](style_images/aurora3/folder_profile_portal/user-offline.png) 25 May 2014 - 20:07
![](style_images/aurora3/folder_profile_portal/user-offline.png) 4 May 2013 - 18:12
Гость
11 Jan 2013 - 23:00
|