IPB

Здравствуйте, гость ( Вход | Регистрация )

Профиль
Фотография
Опции
Опции
О себе
unk1024 не указал(а) ничего о себе.
Личная информация
unk1024
Матрос
Возраст не указан
Пол не указан
Место жительства не указано
День рождения не указан
Интересы
Нет данных
Статистика
Регистрация: 17-May 06
Просмотров профиля: 6,128*
Последнее посещение: 1st October 2018 - 06:06 AM
Часовой пояс: Mar 28 2024, 10:55 PM
137 сообщений (0 за день)
Контактная информация
AIM Нет данных
Yahoo Нет данных
ICQ Нет данных
MSN Нет данных
Контакт скрыто
* Просмотры профиля обновляются каждый час

unk1024

Командор

***


Темы
Сообщения
Комментарии
Друзья
Содержимое
15 июня 2007
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)
15 июня 2007
**************************************************
*** Описание 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
2 июня 2006
Все мы знаем, что в папке MODULES\ лежат странные файлики под названием Techniques (техники). Кроме того, там лежат еще и шейдеры (правда, я не люблю asm'овские шейдеры, мне больше по вкусу эффекты D3D, но в восьмой версии DirectX, которая применяется в ПКМ, эффектов нет, жаль), но они пока не интересны, хотя с их помощью можно создать новое море.

Для начала давайте посмотрим, как установить существующую технику для моделей локации (см. Locations\Init\*.c). У них есть специальный аттрибут tech, в котором и указывается, какая техника будет использована для рендеринга модели. Устанавливается техника следующим образом:

Код
...
Locations[n].models.always.Имя_объекта.tech = "Имя_техники";
...


Добавить технику можно двумя способами: 1) в уже существующий .sha файл; 2) в новый .sha файл (при этом указывать его наличие нигде не надо, движок сам увидит, что добавилась новая техника и обработает ее.

Продолжение следует...
2 июня 2006
Я не знаю, может, вы это знаете, но все же. В ПКМ есть встроенный дебаггер, который напоминает (отдаленно) дебаггер, например, MSVC. Для его активации необходимо создать файлик с именем "project.df" (без кавычек) и записать туда следующее содержимое:

Код
[options]
break_on_error = 1


Дебаггер вызывается, если где-то возникла ошибка. В нем можно выполнять различные скриптовые функции, назначать значения переменным и т.д. Кроме того, доступен исходный код скрипта, где возникла ошибка.

В К3 этот дебаггер тоже присутствует, кроме того, он улучшен. Вызывается точно также. Есть дополнительная команда вызова дебаггера (если изменилось значение переменной). В версии 1- было много ошибок, поэтому дебаггер вызывался многократно. Так мне удалось посмотреть исходники Net'овских скриптов и некоторых других.
18 мая 2006
Блог 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'у. Жду ответа.
Прикрепленные файлы
Прикрепленный файл  StormExTractor.rar ( 91.44 килобайт ) Кол-во скачиваний: 38
 
Просмотры


1 Apr 2019 - 13:44


22 Oct 2014 - 2:52


25 May 2014 - 20:07


4 May 2013 - 18:12
Гость


11 Jan 2013 - 23:00

Комментарии
Другие пользователи не оставили комментарии для unk1024.

Друзья
Друзей нет.
Текстовая версия Сейчас: 28th March 2024 - 07:55 PM
Aurora 3 | Designed by XGhozt © 2007 | XGhozt.com | Background by co2metal.
 
     

.
,