IPB

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


unk1024
Отправлено: Apr 13 2008, 03:21 PM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Времени нет что-то, чтобы форум посещать sad.gif
  Форум: Таверна · Просмотр сообщения: #5324 · Ответов: 184 · Просмотров: 284,577

unk1024
Отправлено: Apr 13 2008, 10:36 AM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Спасибо огромное smile.gif Поживем-увидем wink.gif
  Форум: Таверна · Просмотр сообщения: #5321 · Ответов: 184 · Просмотров: 284,577

unk1024
Отправлено: Jun 15 2007, 01:03 PM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


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)
  Форум: Доки · Просмотр сообщения: #3400 · Ответов: 0 · Просмотров: 3,404

unk1024
Отправлено: Jun 15 2007, 01:02 PM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


**************************************************
*** Описание 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
  Форум: Доки · Просмотр сообщения: #3399 · Ответов: 0 · Просмотров: 3,856

unk1024
Отправлено: Jun 2 2006, 05:47 AM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Существуют и дополнительные параметры:

Код
LocalViewer = true/false;
Ambient = ЦВЕТ_В_16_СИСТЕМЕ;
TextureTransformFlags[ТЕКСТУРНАЯ_СТАДИЯ] = projected/count4/count3/count2/count1;
AlphaTestEnable = true/false;
AlphaBlendEnable = true/false;
SrcBlend = srcalpha;
DestBlend = invsrcalpha;
...



Остальные можно посмотреть в разделе Texture Stage States, Texture Blending, Render States DirectX SDK.

Их очень много.
  Форум: Доки · Просмотр сообщения: #1900 · Ответов: 6 · Просмотров: 10,968

unk1024
Отправлено: Jun 2 2006, 05:43 AM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


После всех операций пишутся:
Код
Render.Draw
Restore.States


Здесь первый метод - это собственно рисование, а второй - возврат старых значений состояний рендеринга.
  Форум: Доки · Просмотр сообщения: #1899 · Ответов: 6 · Просмотров: 10,968

unk1024
Отправлено: Jun 2 2006, 05:39 AM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Чтобы перевести аргументы из MfcTex в Storm приведу некоторые примеры: все, кроме Diffuse Inv, Texture Inv, Temp Inv, Current Inv, Factor, Factor Inv, Texture w/Alpha, Current w/Alpha, Diffuse w/Alpha конвертируется также как и написано там, только с маленькой буквы (хотя вроде не обязательно).

Factor конвертируется как tfactor.

Слова с суффиксами Inv конвертируются так, чтобы пробел заменялся подчеркиванием, а вместо Inv пишется complement.

Пример для Factor Inv:
Код
ColorArg2[0] = tfactor_complement;


Слова с суффиксами w/Alpha конвертируются так, чтобы пробел заменялся подчеркиванием, а вместо w/Alpha пишется alphareplicate.

Пример для Factor w/Alpha:
Код
ColorArg2[0] = tfactor_alphareplicate;


Фактор для текстуры задается как:
Код
TextureFactor = 0xff808080;


Здесь цвет задается в шестнадцатиричной системе счисления в формате ARGB (альфа,красный,зеленый,синий).

Альфа:
ff - непрозрачный
00 - полностью прозрачный
  Форум: Доки · Просмотр сообщения: #1898 · Ответов: 6 · Просмотров: 10,968

unk1024
Отправлено: Jun 2 2006, 05:30 AM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Т.к. текстурных стадий три, то именуются они в Storm как:
ColorOp[0], ColorOp[1], ColorOp[2]. Также в случае с альфа-каналом.

Дальше я приведу таблицу преобразований операций:

Код
Disable -> disable
Select Arg 1 -> SelectArg1
Select Arg 2 -> SelectArg2
Modulate -> modulate
Modulate 2X -> modulate2x
Modulate 4X -> modulate4x
Add -> add
Add Signed -> addsigned
Add Signed 2X -> addsigned2x
Subtract -> subtract
Add Smooth -> addsmooth
Blend Diffuse -> blenddiffusealpha
Blend Texture -> blendtexturealpha
Blend Factor -> blendfactoralpha
Blend Texture PM -> blendtexturealphapm
Blend Current PM -> blendcurrentalpha
Premodulate -> premodulate
Modulate Alpha Add Color -> modulatealpha_addcolor
Modulate Color Add Alpha -> modulatecolor_addalpha
Modulate Inv Alpha Add Color -> modulateinvalpha_addcolor
Modulate Inv Color Add Alpha -> modulateinvcolor_addalpha
Bump EnvMap -> bumpenvmap
Bump EnvMap w/Luminance -> bumpenvmapluminance
DotProduct3 -> dotproduct3
Multiply Add -> multiplyadd
Lerp -> lerp
  Форум: Доки · Просмотр сообщения: #1897 · Ответов: 6 · Просмотров: 10,968

unk1024
Отправлено: Jun 2 2006, 05:19 AM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Далее идут параметры техники. Их на самом деле много. Вообще, я рекомендую программу MfcTex, когда-то входящую в релиз DirectX SDK я ее выложил в сообщении). Она позволяет устанавливать Rendering States - состояния рендеринга. Техника - это вольное название состояний рендеринга, придуманное Акеллой. Сказочники =)

Запустим программу MfcTex.

Слева мы видим окошко рендеринга, которое можно перевести в полноэкранный режим кнопкой Fullscreen. Справа находятся 3 текстурных стадий (stage). Нумеруются они не с единицы, а с нуля. Не все видеокарты поддерживают более 2 текстурных стадий, моя, например, поддерживает восемь. Там же можно указать три текстуры, с которыми мы будем производить операции.

Сами операции имеют суффик Op. Для канала цвета - это ColorOp, для альфа-канала - AlphaOp. Развернув список операций, можно удивиться, что их много. Поиграйте с ними попозже.

Аргументы для операций соответственно имеют суффикс Arg, причем каждый канал может иметь до трех возможных аргументов. Также поиграйте потом с ними.

Поле Result помогает записать данные не сразу в текстуру, а в промежуточный результат, который именутся Temp. Чтобы использовать его необходимо в следующей стадии указать аргумент Temp.

Слева также находятся два поля. Первый - Diffuse Color - цвет полигона, второе поле - Blend Factor - фактор блендинга между диффузным цветом и альфа-каналом. Слева сверху можно выбрать один из доступных пресетов. Посмотреть результирующий код можно с помощью кнопки View Code, но заметьте, что он будет в формате C++ - Direct3D. Поэтому, конвертировать его в технику Storm нам надо самим.

Вот, смотрите, как это делать.
Прикрепленные файлы
Прикрепленный файл  mfctex.rar ( 163.72 килобайт ) Кол-во скачиваний: 7
 
  Форум: Доки · Просмотр сообщения: #1896 · Ответов: 6 · Просмотров: 10,968

unk1024
Отправлено: Jun 2 2006, 05:10 AM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Давайте взглянем на одну из техник. Пусть это будет Ship\Sail.sha.

Код
block ShipSail()
{
    technique t0
    {
 pass p0
 {
     Lighting = true;
     CullMode = none;
     DiffuseMaterialSource = material;
     AmbientMaterialSource = color1;
     AlphaTestEnable = true;
     AlphaBlendEnable = true;
     SrcBlend = srcalpha;
     DestBlend = invsrcalpha;

     ColorOp[0] = modulate;
     ColorArg1[0] = texture;
     ColorArg2[0] = current;

     AlphaOp[0] = SelectArg1;
     AlphaArg1[0] = texture;

     ColorOp[1] = SelectArg1;
     ColorArg1[1] = current;

     AlphaOp[1] = modulate;
     AlphaArg1[1] = current;
     AlphaArg2[1] = texture;

     ColorOp[2] = disable;

     Render.Draw

     Restore.States
 }
    }
}


После ключевого слова block, как видно, идет название блока (техники объединяются в блоки, на самом деле, в tech-аттрибуте указывается не техника, а блок, в который она входит). У нас это - ShipSail. Далее открывается блок техник. Каждая техника начинается с ключевого слова technique. У нас всего одна техника - t0. Далее идет новый блок - проход. Многие техники рисуются не за один раз, а, например, за 2 или 3. Поэтому, их формируют в проходы. За один проход выполняется только часть техники, за другой - оставшаяся часть и т.д.
  Форум: Доки · Просмотр сообщения: #1895 · Ответов: 6 · Просмотров: 10,968

unk1024
Отправлено: Jun 2 2006, 05:05 AM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Все мы знаем, что в папке MODULES\ лежат странные файлики под названием Techniques (техники). Кроме того, там лежат еще и шейдеры (правда, я не люблю asm'овские шейдеры, мне больше по вкусу эффекты D3D, но в восьмой версии DirectX, которая применяется в ПКМ, эффектов нет, жаль), но они пока не интересны, хотя с их помощью можно создать новое море.

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

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


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

Продолжение следует...
  Форум: Доки · Просмотр сообщения: #1894 · Ответов: 6 · Просмотров: 10,968

unk1024
Отправлено: Jun 2 2006, 04:58 AM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


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

Код
[options]
break_on_error = 1


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

В К3 этот дебаггер тоже присутствует, кроме того, он улучшен. Вызывается точно также. Есть дополнительная команда вызова дебаггера (если изменилось значение переменной). В версии 1- было много ошибок, поэтому дебаггер вызывался многократно. Так мне удалось посмотреть исходники Net'овских скриптов и некоторых других.
  Форум: Доки · Просмотр сообщения: #1893 · Ответов: 0 · Просмотров: 3,559

unk1024
Отправлено: May 19 2006, 04:02 PM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Вряд-ли.. Как они говорят остался один патч.. Но пока же мы не будем им говорить, ведь правда? =) Кстати, мы с тобой одного года рождения!
  Форум: Доки · Просмотр сообщения: #1785 · Ответов: 6 · Просмотров: 13,928

unk1024
Отправлено: May 19 2006, 03:46 PM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Кроме нас никто.. Хотя сказать можно =) Какая теперь разница, скрипты то у нас =)
  Форум: Доки · Просмотр сообщения: #1780 · Ответов: 6 · Просмотров: 13,928

unk1024
Отправлено: May 18 2006, 11:49 AM


Матрос
***

Группа: Командор
Сообщений: 137
Регистрация: 17-May 06
Пользователь №: 105


Блог 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
 
  Форум: Доки · Просмотр сообщения: #1766 · Ответов: 6 · Просмотров: 13,928


Новые сообщения  Открытая тема (есть новые ответы)
Нет новых сообщений  Открытая тема (нет новых ответов)
Популярная тема  Горячая тема (есть новые ответы)
Нет новых  Горячая тема (нет новых ответов)
Опрос  Опрос (есть новые голоса)
Нет новых голосов  Опрос (нет новых голосов)
Закрыта  Закрытая тема
Перемещена  Тема перемещена
 

Текстовая версия Сейчас: 28th March 2024 - 08:54 PM
Aurora 3 | Designed by XGhozt © 2007 | XGhozt.com | Background by co2metal.