Table des matières

Client interface's configuration

The client interface of the game (commonly called GUI : Graphical User Interface) is managed by .xml files which are in the “code/ryzom/client/data/gamedev/interfaces_v3” source's repertory.
There is also the documentation about the file's content, in two documents : interface.txt and interface_notes.txt.

To make it easier and to eventually give more details on the explication, the reorganize content can be find below.

Important to note that since the Google Summer of Code 2012, a Ryzom Core Studio plugin allow a partial edition of the interface with graphics tools.

Even it's partially corrected and reformated, this page still need work to be clear. Part of codes can be more understandebale in table. Don't hesitate to participe at the clarification, edit!


Done until CONTROLSYannK 2016/12/21 23:24

inlinetoc

Interface's command

Command's and interface's parameter definition :

Note: in the parameter's syntax and description, the indicate value is the value by default.

Note: the X go on the right, the Y on the high. It's pixels value.

Note: DÉRIVÉ DE 1) means that it's possible to put the same parameters from the one which come the derive.

Note: MODIFIABLE means that it's possible to change dynamicly a parameter in the script (with a link for exemple).

Note: OBLIGATOIRE 2) means that the option must be present otherwise there is crash or a malfunction.

Note: Local localisation's identifier of string type (reference to an id from wk.uxt for exemple). The grid type of the localisation identifier is integrate.

Basics

Each VIEW, CONTROL, or GROUP can have the following parameters.

DÉRIVÉ DE interface_element.

Element Default value Use / Description
id element id. OBLIGATOIRE
activetruenotice or not MODIFIABLE
x0X position relative to the referent's position and the parent's position MODIFIABLE
y0Y position relative to the referent's position and the parent's position MODIFIABLE
w0Element size. If the element have a parent, take the W's parent by default MODIFIABLE
h0Element size. If the element have a parent, take the H's parent by default MODIFIABLE
posreferenceBL BLReferent position (Bottom Left, MiddleMiddle…). Read it like “ParentPosition MyPosition”. Ex: “BL TR” means “my Top Right is on the Bottom Left of the parent”
posparentparentDefine the element's parent for the position
sizereference possible value: “w”, “h”, “wh”, “w?h?” where ? is a determining factor between 1 and 9. In this case the parent's size is multiply by this factor then divide by 10. At the display moment, add the parent's size of W or/and H to the one define by w=“” et h=“”. Example: “w2h” involved that Wnotice = W + 2*parentW/10 and that Hnotice = H + parentH
sizerelative State the relative takes for the size's calculation of Wnotice and Hnotice, if this value is'nt specified, thus we take the posrelative to calculate the size
global_colortrueif it's true, it modulate the color by the global color
render_layer0value from -16t to +14, shift the order of the element preview
avoid_resize_parentfalseIf this value is turn to true, a group with a child_resize_x will not take this element into account for resize it

VIEWS

A VIEW have a type which is define by the type=“” parameter.

All the VIEWS share this parameters :

Element Default value Use / Description
alpha integrate MODIFIABLE

<view type="bitmap" />

GOAL : display a bitmap

Parameters :

Element Default value Use / Description
color255 255 255 255color (modulate) of the bitmap (string) MODIFIABLE
color_as_int color (modulate) of the bitmap (int) OPTIONNEL MODIFIABLE
color_as_rgba color (modulate) of the bitmap (rgba) OPTIONNEL MODIFIABLE
texture texture file (string) MODIFIABLE
scalefalseif false, the W and the H are forced to be at the size as the texture
rot0define rotation value of the bitmap
flipfalse
tilefalse
align0

<view type="background" />

DÉRIVÉ DE <view type="bitmap" />

GOAL : Display a bitmap in non compress texture (several texture in on piece)

Parameters

Element Default value Use / Description
txtoffsetx0offset in the texture (at hight-left and positive to low-right)
txtoffsety24offset in the texture
txtwidth800size of the texture
txtheight488

<view type="bar" />

DÉRIVÉ DE : <view type="bitmap" />

GOAL: Display a value to bar form. For the moment 4 versions are available : normal, mini, ultra_mini and mini_thick, the bitmaps uses are hardcoded in C++.

Parameters :

Element Default value Use / Description
value common value (Value or DB link)(int) MODIFIABLE
range range (Value ou DB link)(int) MODIFIABLE
reference subtracted value of value and range (example: time management).(Value or DB link)(int) MODIFIABLE
color_negative color when the values are negative
minitrueDisplay the mini version
ultra_minitrueDisplay the ultra mini version
mini_thicktrueDisplay the mini thick version

We can also change the value_dblink(string), the range_dblink(string) or the reference_dblink(string) if we used them.

<view type="bar3" />

DÉRIVÉ DE : <view type="bitmap" />

GOAL : In the same idea of <view type="bar" /> but display directly 3 bar.

Parameters :

Element Default value Use / Description
value1 MODIFIABLE
value2 MODIFIABLE
value3 MODIFIABLE
range1 MODIFIABLE
range2 MODIFIABLE
range3 MODIFIABLE
color1
color2
color3
color1_negative
color2_negative
color3_negative
minitrue

<view type="text" />

GOAL : Display a text.

Parameters :

Element Default value Use / Description
color255 255 255 255color (modulate) of the text (string) MODIFIABLE
color_rgba255 255 255 255color (modulate) of the text (rgba) OPTIONNEL MODIFIABLE
fontsize12
shadowfalse
shadow_color0 0 0 255shadow's colors of the text
hardtext If present define the display text. (Local localisation identifier)(string) MODIFIABLE
uc_hardtext If present define the display text. (Local localisation identifier)(ucstring) OPTIONNEL MODIFIABLE
multi_linefalse
multi_line_space8
justificationdont_clip_wordclip_word : no justification
dont_clip_word : not cut and not justified words
justified : not cut and justified words
underlinedfalseunderlined the sentence
case_mode0Capital letter rule
0 : CaseNormal : no modification of the capital and small letter
1 : CaseLower : All letters forced in small letters
2 : CaseUpper : All letters forced in capital letters
3 : CaseFirstStringLetterUp : The first letter of the string is in capital letter
4 : CaseFirstSentenceLetterUp : The first letter of the string is in capital letter as the following sentences (séparate by the .)
5 : CaseFirstWordLetterUp : The first letter of all the words are in capital letters
line_maxw16384maximum size of the line (multiline: minimized with the current Wreal of the parent)
multi_line_maxw_onlyfalsemultiline: don't minimize linemaxX with parent Wreal. Use only linemaxW
over_extend_view_textfalseusefull only if some line_maxw specified. If true and if the text is clipped cause of line_maxw, and if the mouse over the view text, then a special tooltip will be displayed over, to show all the text
over_extend_parent_rectfalsetrue to use in conjunction of over_extend_view_text: the over area is the parent, not the view
auto_clamptrue
continuous_updatetruemultiline text justification is recomputed continuously as the window parent is resized (not when the left button is released only) default is “false”

Note: No sizeref on a text VIEW .

Note: The text view can take the shape of TextFormatTagged. But only the multilingual text view intepret correclty the tags .
Possible tags are:


Note: It's not possible to specify a TextFormatTagged in an other way than by C++ code, or via the LUA function : setTextFormatTagged()

<view type="text_number" />

DÉRIVÉ DE <view type="text" />

GOAL : Display a data input of the database (integer) under the text form.

Parameters :

Element Default value Use / Description
value Link to the database to read the value OBLIGATOIRE.
positivetrue
suffix
prefix
formatfalsemake the number thousands formatted

<view type="text_formated" />

DÉRIVÉ DE : <view type="text" />

GOAL : Display a text. If the text contain one of the following specifics characters, there is a particular treatment :

Parameters :

Element Default value Use / Description
format channel to replace (empty channel by default)

<view type="text_quantity" />

GOAL : Display the databse number under the “8/10” form (with a max value of the database). If the number is 0, it display the string emptytext. By default emptytext=“”, and in this case, “0/80” is display (80 is finally the true max value).

Parameters :

Element Default value Use / Description
value Link to the database to read the value OBLIGATOIRE.
valuemax Link to the database to read the MAX value OBLIGATOIRE.
emptytext when value==0, string display. “” means display 0/valeurMax

Note : emptytext contain a locale localisation identifier.

<view type="text_id" />

DÉRIVÉ DE : <view type="text" />

GOAL : Display a text according to a network identifier ( it's a charcaters line equivalent to set_server_string(ah))

Element Default value Use / Description
textid the identifier itself (“654123”) MODIFIABLE
textid_dblink database link to the idientifier (“UI:TEMP:VAR1”) (string) OPTIONNEL MODIFIABLE
dynamic_stringtrueif true the sentence is composed (CStringManagerClient::getDynString), if not it's a server identifier (CStringManagerClient::getString)
<view type="text_id_formated" />

DÉRIVÉ DE : <view type="text_id" />

GOAL : In the same idea of the VIEW text_formated. It contain the same particular traitments that text_formated where you need to add :

Parameters :

Element Default value Use / Description
format$tBye default
textid For exemple :“SERVER:BOTCHAT:DM_CHOICE2:TITLE”

<view type="digit" />

GOAL: Special view wich display un number with special digits (bitmap).

Parameterss :

Element Default value Use / Description
valueSERVER:….link on the database. OBLIGATOIRE
numdigit2digit's number display (eg 00 if void value). Default:2. Min:1 et Max: 10
wspace-1pixel spacing between each digit. Default: -1
color255 255 255 255like button, whithe is by défault

The total size is automaticly calculate in function of the 0 digit and of the digit number.

CONTROLS

DERIVE DE <view type=“” /> A control has a type define by the type=“” paramater.

<ctrl type="" 
	tooltip=""						// contextual help by default
	tooltip_i18n=""					// same for tooltip, but necessarily search the definition in the wk.uxt,
									// even if the text don't start by "ui"
	on_tooltip=""					// action handler wich allow to add an other contextual help
	on_tooltip_params=""			// parameters of the handler action
	instant_help="true"				// Is the contaxtual help is correclty display?
 
	tooltip_parent="ctrl"			// "ctrl", "win" or "mouse". Define the relative parent during the display
									// du tooltip.
											"ctrl" means that the tooltip is wedge against this control
											"win" means that the tooltip is display against the window
													containing the control
											"mouse" means that the tooltip is wedge against the mouse
	tooltip_posref="auto"			// Position de tooltip reference against its parent (see tooltip_parent)
											"auto" the reference position is intelligemment choose following the
													parent's type:
													"ctrl": "TL BR" or "TR BL" following the window's container
														the control is more on the left or on the right
													"win": "TL BL" or "BL TL" following the window's container
														the control is more on the top or on the low
													"mouse": "BL BL"
											"TL BR" (or all other reference position possible): fix wedge
 
/>

MODIFIABLE: alpha (int)

<ctrl type="tooltip" />

GOAL : Derivating control from ctrl_base, and wich manage no evenement and display nothing. Its only aim is to have a place to display a tooltip when the mouse pass on it.

SYNTAX:

<ctrl type="tooltip" />

<ctrl type="button" />

GOAL : button, push, radio or toggle.

SYNTAX:

<ctrl type="button" 
	button_type="toggle_button"	// button's type: "toggle_button", "push_button" or "radio_button"
	pushed="false"			// pushed state by default
	color="255 255 255 255"		// color normal state
	col_pushed="255 255 255 255"	// color when pushed
	col_over="255 255 255 255"	// color when over
	global_color_normal=""		// replace the global_color setup for the normal state of the button
	global_color_pushed=""		// replace the  global_color setup for the pushed state of the button
	global_color_over=""		// replace the global_color setup for the over state of the button
	tx_normal=""			// normal state texture
	tx_pushed=""			// pushed statetexture
	tx_over=""			// over state texture
	scale="false"
	onclick_l=""			// action to launch on left click
	params_l=""			// action's parameter to launch on a left click
	onlongclick_l=""		// action to launch on a long click
	params_longclick_l=""
	onclick_r=""			// action to launch on a right click
	params_r=""			// action's parameter to launch on right click
	align=""			// si pas de scale et que zone définie plus grande que l’image
	menu_l=""			// context menu to display on left click button (see group of type menu)
	menu_r=""			// context menu to display on right click button (see group of type menu)
	menu_b=""			// context menu to display on right or left click button (see group of type menu)
	frozen="false"			// button is frozen
/>

MODIFIABLE:

			pushed			(bool)
			col_normal		(string ('#r #g #b #a'))
			col_over		(string ('#r #g #b #a'))
			col_pushed		(string ('#r #g #b #a'))
			col_normal_rgba	(rgba)
			col_over_rgba	(rgba)
			col_pushed_rgba	(rgba)
			frozen			(bool)
			params_l		(string)
 
			texture			(string)
			texture_pushed	(string)
			texture_over	(string)

<ctrl type="text_button" />

GOAL : button, push, radio or toggle.

SYNTAXE:

<ctrl type="text_button" 
	button_type="toggle_button"			// button type: "toggle_button", "push_button" or "radio_button"
	pushed="false"						//  pushed state by default
	color="255 255 255 255"				// normal color state
	col_pushed="255 255 255 255"		// color when pushed
	col_over="255 255 255 255"			// color when over
	global_color_normal=""				// replace  the global_color state for the normal state of the button
	global_color_pushed=""				// replace  the global_color state for the pushed state of the button
	global_color_over=""				// replace  the global_color state for the over state of the button
 
	//  Texture: 
	// unlike the button, here you just need to set "textb_normal" for example. 
	// the "_l.tga", "_m.tga", "_r.tga" are automatically add to find the parts.
	// left, center (the one wedge on X) and right.
 
	tx_normal=""						// normal state texture. 
	tx_pushed=""						// pushed state texture.
	tx_over=""							// over state texture.
	onclick_l=""						// action to launch on a left click
	params_l=""							// action parameters to launch on a left click
	onlongclick_l=""					// action to launch on a long click
	params_longclick_l=""
	onclick_r=""						// action to launch on a right click
	params_r=""							// action parameter to launch on a right click
	menu_l=""							// contextual menu to display on a left button click (see group of type menu)
	menu_r=""							// contextual menu to display on a right button click (see group of type menu)
	menu_b=""							// contextual menu to display on a left or right button click (see group of type menu)
 
	// Texte infos:
	hardtext=""
	fontsize=""
	shadow=""
	underlined=""
 
	// Special behaviour of the text's colors
	text_color_normal="255 255 255 255"
	text_color_pushed="255 255 255 255"
	text_color_over="255 255 255 255"
	text_shadow_color_normal="0 0 0 255"
	text_shadow_color_pushed="0 0 0 255"
	text_shadow_color_over="0 0 0 255"
	text_global_color_normal=""
	text_global_color_pushed=""
	text_global_color_over=""
 
	// Special:
	text_y=""							// tex's offset in Y against the button (-2)
	wmargin=""							// size to add to the text to get the button size
	wmin=""								// minimum size of the button
 
/>

MODIFIABLE:

	pushed			(bool)
			col_normal		(string ('#r #g #b #a'))
			col_over		(string ('#r #g #b #a'))
			col_pushed		(string ('#r #g #b #a'))
			col_normal_rgba	(rgba)
			col_over_rgba	(rgba)
			col_pushed_rgba	(rgba)
			frozen			(bool)
			params_l		(string)
 
			uc_hardtext		(unaltered ucstring)
			hardtext		(localise string)

<ctrl type="scroll" />

BUT: scroll bar.

SYNTAXE:

<ctrl type="scroll"
 
	tx_bottomleft=""		// button's texture (ni background display) (bottom or left)
	tx_middle=""
	tx_topright=""			// top or right (depends id the sb is vertical)
 
	vertical=""				// Is that a vertical or horizontal sb
	align=""				// T, B, L or R
 
	value=""				// Value from DB or number (if not present the sb is link to a target)
	min=""					// If the sb isn't link to a target, so the number which it represent change from min to max
	tracksize=""			// Track size (the button)
 
	onscroll=""				// Handler action called when the sb is displaced
	onscrollend=""			// Called when the scroller is stoped
	params=""
 
	target=""				// If the sb isn't link to a value so it can be link to a group. On this case the group displace itself in its max_w and max_h limits relativelyy to its w and h.
	target_stepx=""			// Give the pixel number to dsiplaced inone time. Wich allow, in example, in the 
	target_stepy=""			// list of sheet to be wedge on a sheet
	step_value=""
/>

<ctrl type="sheet" />

GOAL : Display a item special's button, brick…

SYNTAX:

<ctrl type="sheet"
	value=""							// Link to the database. OBLIGATOIRE.
										// example: SERVER:INVENTORY:8:1. NB: link to a database division
										// which MUST countain SHEET, and can have QUANTITY and/or QUALITY
	nature="item"						// "item", "brick", "spell"
	brick_type=""						// "COMBAT", "MAGIC". may be important for some filter (memory...)
										// Can also put multiple filter like this: "COMBAT|MAGIC|HARVEST"
	tx_noitem=""
	col_noitem="true"					// "true": when no item, modulate the color with the global color
 
	onclick_l=""						// action to launch on a left click
	params_l=""							// action's parameters to launch on a left click
	onclick_r=""						// action to launch on a right click
	params_r=""							// action's parameters to launch on a right click
 
	menu_l=""							// contextual menu to display on a left button click (see group of menu type)
	menu_r=""							// contextual menu to display on a right button click (see group of menu type)
	menu_b=""							// contextual menu to display on a left or right button click (see group of menu type)
 
	dragable="false"					// drag and drop able?
	oncandrop=""						// Action to launch to know if we can drop on me.
	params_candrop=""
	ondrop=""							// Action to launch on a drop on me
	params_drop=""
 
	use_quantity="true"					// display the Item Quantity
	use_quality="true"					// display the Item Quality
	duplicate_on_drag="false"			// when drag a sheet (item only), leave the bitmap in the original slot
	use_slot_type_db_entry="false"		// Automatic Type.
 
	grayed="false"						// in it the sheet as grayed or not
	auto_grayed="false"					// Gray auto the sheet according to Item LOCKED state or Brick LATENT state
	slot="true"							// Draw the slot
/>

MODIFIABLE:

		sheet			(string) (link value to the DB)
		color1			(rgba)
		color2			(rgba)
		back			(int)
		symbol			(int)
		invert_symbol	(bool)

<ctrl type="colpick" />

GOAL : Display a picture to choose a color in it

SYNTAX:

<ctrl type="colpick" 
	texture="color_palette.tga"			// The Texture to use (no grouped texture!)
	onchange="proc"						// Action to launch when the selectionned color change.
	onchange_params="proc_col_change"	// Action's parameter
	dbcolr="UI:TEMP:COL:R"				// .
	dbcolg="UI:TEMP:COL:G"				// .
	dbcolb="UI:TEMP:COL:B"				// .
	dbcola="UI:TEMP:COL:A"				// Directs link with the database of the selectionned color
/>

MODIFIABLE:

	r, g, b, a (int) The components of the selectionned color
			color (string ('#r #g #b #a'))

GROUPS

<group>

DÉRIVÉ DE <ctrl type=""/>

BUT: Définit un group qui pourra contenir des groups, des controls ou des views. Aucun affichage n'est fait sinon celui des fils.

Pour qu'un groupe soit affiché, il faut qu'il apparaisse dans une liste de <tree node=“”> avec son id indiquée dans une treenode.
Dans login_main.xml, les tree node sont listées à la fin, mais dans d'autres fichiers ce n'est pas le cas.

SYNTAXE:

<group
 overlappable="true"		// Recupere les événements	
 child_resize_w="false"		// si true, resize le groupe en W selon ses fils.
 child_resize_h="false"		// si true, resize le groupe en H selon ses fils.
 child_resize_wmargin="0"	// si child_resize_w="true" ajoute une marge à la largeur totale des fils
 child_resize_hmargin="0"	// si child_resize_h="true" ajoute une marge à la hauteur totale des fils
 on_active=""			// nom d’un handler appelé quand la fenêtre est activée
 on_active_params=""		// paramètre passé au handler quand la fenêtre est activée
 on_deactive=""			// nom d’un handler appelé quand la fenêtre est désactivée
 on_deactive_params=""		// paramètre passé au handler quand la fenêtre est activée
 on_enter=""			// windows et modal only: Gere l evenement entree : Quand on appuie sur enter (return)
 on_enter_params=""		// windows et modal only: Les paramètres de l’événement entré
 escapable="false"		// windows only: true : ferme la fenetre si ESC appuyée.
 
 max_w=""			// max_w et max_h définissent la taille maximum affichée tandis que w et h
 max_h=""			// définissent la taille du document (qui est dedans et peut donc être scrollé)
 max_sizeref=""
 max_sizeparent=""
 group_onclick_r=""
 group_params_r=""
 group_onclick_l=""
 group_params_l=""
 win_priority=""
 use_cursor=""
/>

MODIFIABLE:

 ofsx (int)
 ofsy (int)

<group type="list">

BUT:

SYNTAXE:

<group type="list"
	maxelements="10"
	addelt="B"				// "B", "T", "L" ou "R"
	align="L"				// "B", "T", "L" ou "R"
	space="0"
	chat="false"
 
	// Text options
	color=""
	fontsize=""
	shadow=""
	shadow_color=""
	line_at_bottom=""
	multi_line=""
	justification=""
	multi_line_space=""
 
	over="false"			// doit-on afficher la sélection sous la souris
	col_over="255 255 255 32" // la couleur de la sélection
 
	// Initial text
	hardtext="uiAZE"		// init la liste avec un texte a identifiant de localisation local
	textid="654"			// init la liste avec un texte a identifiant de localisation réseau
/>

<group type="container">

Hérite de group

BUT: Afficher un container

SYNTAXE:

<group type="container"
	localize=""					// Def:true est ce que le titre doit être localisé ?
	title=""
	title_opened=""
	title_closed=""
	header_active="true"
	header_color="UI:SAVE:MYCOLOR"	// db col entry
	right_button="true"
	movable="false"				// true == on peut bouger la fenêtre
	popable="false"				// true == la fenêtre peut se détacher de son container parent
	lockable=""					// Def:true
	locked=""					// Def:false
	openable="true"				// peut on ouvrir le container en cliquant sur la barre de titre
	opened="false"				// l’état initial en ouverture
	open_when_popup="false"		// Ouvre le container quand on le popup (le ferme quand popin)
	resizer="true"				// est-ce que l on peut resizer la fenêtre
 
	on_open=""					// nom dun handler appelé quand le container est ouvert
	on_open_params=""			// paramètre passé au handler quand le container est ouvert
	on_close=""					// nom dun handler appelé quand le container est fermé
	on_close_params=""			// paramètre passé au handler quand le container est fermé
 
	on_deactive_check=""	
	on_deactive_check_params=""	
 
	max_w=""
	min_w=""
 
	pop_max_w=""
	pop_min_w=""
	pop_max_h=""
	pop_min_h=""
 
	movable_in_parent_list=""
	savable="true"				// true == la fenêtre est sauvegardée sur disque et est dépendante des modes.
	active_savable=""
	modal_parent=""
	options=""					// nom des options à utiliser (pas fonction d'un layer)
/>

MODIFIABLE:

 title, title_opened, title_closed (string)
			uc_title_opened, uc_title_closed, uc_title (ucstring)
			title_color (string)
			pop_max_h (int)
			openable, opened (bool)
			lockable, locked (bool)

Note: si global_color est à true le bouton et le titre sont colorés par la couleur globale

<group type="frame">

Hérite de group

BUT: comme un group mais affiche un cadre et un fond (fixé: bitmaps de la modal).

SYNTAXE:

<group type="frame"
	display="false"					// si false n affiche pas la frame (true par défaut)
	color="255 255 255 255"
/>

MODIFIABLE:

color (string ('#r #g #b #a'))

<group type="modal">

Hérite du group de type “frame” (affiche donc un cadre)

BUT: Affiche une fenêtre qui pourra être ouverte sur une action. Cachée par defaut (active=false) NOTE: un group modal NE DOIT PAS être défini dans les <tree node=“”>. En fait ils sont automatiquement ajoutés NB: par défaut les modals sont ESCAPABLE

SYNTAXE:

<group type="modal"
	mouse_pos="true"				// si "true", Spawn la fenêtre sur la position de la souris, en suivant posref""
									// par exemple posref="BL TL" positionnera le coin TL de la fenêtre sur la souris.
									// NB: BL (posref du parent) est donc ignoré ici
	exit_click_out="true"			// si "true" la fenêtre modal est fermée si on clique à l’extérieur
	exit_click_l="false"			// si "true" la fenêtre modal est fermée si on clique sur le bouton gauche 
									// (après lancement éventuelle action de la modal)
	exit_click_r="false"			// si "true" la fenêtre modal est fermée si on clique sur le bouton droit
									// (après lancement éventuelle action de la modal)
	exit_click_b="false"			// équivalent à exit_click_l="val" ET exit_click_r="val" (val: true ou false)
	exit_key_pushed="false"			// Close the modal if a key is pushed
 
	force_inside_screen="false"		// Clip la fenêtre à l intérieur de l’écran. Note: automatique si mouse_pos="true"
	onclick_out=""
	onclick_out_params=""
/>

Certaines actions handlers prennent un id de window en paramètre (eg: “ui:interface:taskbar”). L'id spécial se nommant “ctrl_launch_modal” désigne en fait le bouton ou le control qui a fait ouvrir la fenêtre modal.

eg: Un control sheet dans une fenêtre modal échange son sheet id avec le ctrl sheet qui a ouvert la modal:

<ctrl type="sheet" onclick_l="exchange" params_l="src=ctrl_launch_modal">

Dans le xml, il faut bien faire attention à ce que les modals soient à la racine sinon elles peuvent être affichées plusieurs fois. Il ne faut pas non plus qu'elles soient ajoutées en tant que node dans un <tree>

<group type="menu">

Hérite du groupe de type “modal”

BUT: Affiche un menu contextuel Caché par défaut

SYNTAXE:

<group type="menu" id="cm_byes" 
	context="true"						// "false" si doit être utilisé (et donc affiché) dans un autre groupe
										// et non tout seul (sur un menu_r de bouton par exemple)
	color="255 255 255 255"				// couleur du texte
	shadow_color="0 0 0 255"			// couleur de l’ombre du texte (noire par défaut)
	fontsize="12"
	shadow="false"
	color_over="255 255 255 255"		// couleur du texte quand survole de la souris dessus
	shadow_color_over="0 0 0 255"		// couleur de l’ombre du texte quand survole de la souris (noire par défaut)
	highlight_over="128 0 0 255"		// higlight sous le texte quand survolé. Mettre A=0 pour rien.
	color_grayed="128 128 128 255"		// couleur du texte quand celui-ci est inactif
	shadow_color_grayed="0 0 0 255"		// couleur de l’ombre du texte quand celui-ci est inactif
	>
		<action				// Une action est une ligne de menu (ou de sous-menu) (ici cette action possède un sous-menu)
			id="aze"		// Identifiant facultatif si absent, l id est la position dans le menu (à partir de 0)
			name="Action1"	// Nom localise et affiche
			handler=""		// handler appelé si la ligne est cliquée (même en cas de sous-menu)
			params=""		// Les paramètres du handler
			grayed="true"	// est-ce que la ligne est grisée ? facultatif
			usergroup_l=""			// Nom d’un template pour mettre un groupe à gauche du texte
			usergroup_params_l=""	// Paramètres du template délimités par des | (...params_l="posref=TL TL|x=5" )
			usergroup_r=""			// Pareil à droite
			usergroup_params_r=""
		>
			<action name="imbriquée" handler="" params="" /> // Ligne simple
		</action>
 
 
	...
</group>

MODIFIABLE: pour une action : grayed, checked et tous les modifiables d’une vue texte on peut récupérer les usergroup en faisant comme d'habitude menuid:actionid:usergroupid

<group type="list_sheet">

BUT: affiche une liste variable de ctrl_sheet

SYNTAXE:

<group type="list_sheet" id="pipo0" 
 
	value="SERVER:INVENTORY:8"	// Pointe sur une branche de la database. OBLIGATOIRE
								// Les fils doivent être de type #number:SHEET (optionnel #number:QUALITY et #number:QUANTITY).
 
	wspace="2" hspace="2"		// donne l’espacement entre chaque slot. 0 par défaut
 
	maxitem="12"				// donne le nombre maximum d’item lu dans la branch (eg: 6 pour un bag). 
								// Nb: temporaire??, normalement c la database qui donne ce nombre. Défaut: infini
 
	startitem="12"				// donne l id de départ dans la database. utile pour les bag (bag0: 0, bag1: 6, bag2: 12, etc...)
 
	array="false"				// si "false", les sheet vides ne sont pas affichés. defaut: "true"
 
	lmargin="12"				// Marges left, right Top et bottom des slots par rapport au group. Defaut:0. Il Faut en mettre si ya une scrollBar et des boutons +- forcément...
	rmargin="2"
	tmargin="12"
	bmargin="2"
 
	rowmin="0"					// Nombre de ligne minimum affichées. Défaut: 1. 
								// Important si on veut par exemple afficher la liste des malus vides sans que le groupe se resize à H=0 (vide)
 
	rowmax="2"					// Nombre de lignes maximum affichées. Défaut: infini. 
								// Important si on veut afficher qu’une seule ligne toujours (pour les malus par exemple) 
								// quelque soit la largeur du parent. C’est cette valeur qui est éditée par les boutons +- (si présents)
 
	column_max="4294967295"		// taille maximum du nombre de sheet par ligne
	column_factor="1"			// si 3 par exemple, le nombre de sheet par ligne ne pourra être que 3,6,9...
	column_center="false"		// si true, centre les sheet en X suivant le WReal donnée par list_sheet
 
	// Paramètres communs au ctrl type="sheet". Voir ce control pour les détails
 
	nature=""
	tx_noitem=""
	onclick_l=""
	params_l=""
	onclick_r=""
	params_r=""
	dragable=""
	oncandrop=""
	params_candrop=""
	ondrop=""
	params_drop=""
	menu_l=""
	menu_r=""
	menu_b=""
 
	// Filters
 
	onfilter=""
	params_filter=""
	>
 
	// Le mode "Resize" n'existe pas en fait. Le scripteur est libre de mettre ou pas une scroll bar et/ou des boutons qui permettent de changer rowmax
 
	<ctrl type="button" id="add_row" button_type="push_button" posref="TR TR" tx_normal="W_arrow_up_3.tga" tx_pushed="W_arrow_up_3.tga" tx_over="W_button_08_over.tga" />
	<ctrl type="button" id="sub_row" button_type="push_button" posparent="add_row" posref="TL TR" tx_normal="W_arrow_down_3.tga" tx_pushed="W_arrow_down_3.tga" tx_over="W_button_08_over.tga" />
 
	// Setup tyipque de scrollBar. L'alignement est hardcodé pour être Top. Le y devrait être égal à "-tmargin" du group list_sheet
 
	<ctrl type="scroll" id="scroll_row" posref="TL TL" w="8" x="2" y="12" 
		<!-- choix des textures de la scroll -->
		tx_bottomleft= "w_scroll_l123_b.tga"
		tx_middle= "w_scroll_l123_m.tga"
		tx_topright= "w_scroll_l123_t.tga"
	/>
 
</group>

MODIFIABLE: nbelt (int en lecture seul !) le nombre d'element valide si array=false sinon maxelt

<group type="list_job">

BUT: affiche un tableau de familles de métier avec la bonne brick. son grand père DOIT être un container (pour initialiser son nom)

SYNTAXE:

<group type="list_job" 
 
	brick_type=""				// MAGIC, COMBAT, FABER,... Obligatoire!!
	career=""					// index OBLIGATOIRE de la carrière
	job=""						// index OBLIGATOIRE du job. -1 si "all"
	level=""					// variable database qui donne le level du joueur dans ce job. OBLIGATOIRE
	wspace="0"					// donne l’espacement entre chaque slot. 0 par défaut
	hspace="0"					// donne l’espacement entre chaque slot. 0 par défaut
	lmargin="0"					// Marges left, right Top et bottom des slots par rapport au group. Il Faut en mettre si ya des bouton +- forcément...
	rmargin="0"
	tmargin="0"
	bmargin="0"
 
	list_sentence=""			// Pour la magie Pointe vers un group de type="list_sentence". Utilise pour savoir
								// ou sont ajoutés les sentences nouvelles.
 
	// Paramètres communs au ctrl type="sheet". Voir ce control pour les détails
 
	nature=""					// la nature n’est pas necessaire ici. C’est FORCEMENT une "brick"
	tx_noitem=""
	onclick_l=""
	params_l=""
	onclick_r=""
	params_r=""
	dragable=""
	oncandrop=""
	params_candrop=""
	ondrop=""
	params_drop=""
 
	/>
 
	// Boutons pour changer le niveau de brick voulu
 
	<ctrl type="button" id="add_level" button_type="push_button" posref="TR TR" tx_normal="W_arrow_up_3.tga" tx_pushed="W_arrow_up_3.tga" tx_over="W_button_08_over.tga" />
	<ctrl type="button" id="sub_level" button_type="push_button" posparent="add_row" posref="TL TR" tx_normal="W_arrow_down_3.tga" tx_pushed="W_arrow_down_3.tga" tx_over="W_button_08_over.tga" />
 
	// vue qui affiche le niveau sélectionné
 
	<view type="text" id="view_level" />
 
	// group de décoration qui affiche un fond derrière le texte (sert pour le scroll des levels à la molette)
	<group id="box_text" />
</group>

<group type="select_number">

BUT: widget qui sert pour augmenter et diminuer un nombre de la database

SYNTAXE:

<group type="select_number" 
	value=""				// lien vers la database. OBLIGATOIRE
	loop="true" 
	min="0" 
	max="9" 
	/>
	<view type="text" id="number" />				// une vue qui permettra d'afficher le nombre
	<ctrl type="button" id="arrow_up" />			// bouton pour incrémenter
	<ctrl type="button" id="arrow_down" />			// bouton pour décrémenter
</group>

<group type="scroll_text">

BUT: widget servant à afficher des lignes de chat ou autres défilant, avec une scrollBar et des boutons pour augmenter la taille de la fenêtre

SYNTAXE:

<group type="scroll_text" 
	min_height="16"
	max_height="128"
	invert_scroll_bar="true" 
	>
	<ctrl type="scroll" id="scroll_bar"/>
	<ctrl type="button" id="button_add"/>
	<ctrl type="button" id="button_sub"/>
	<group type="list"  id="text_list"/>
</group>

<group type="editbox" />

BUT: édition de texte

SYNTAXE:

<group type="edit_box" 
	onenter=""							// Action a lancer quand ENTER est pressé
	params=""							// paramètres de l’Action à lancer quand ENTER est pressé
	onchange=""
	onchange_params=""
	enter_loose_focus="true"			// si enter perd le focus
	max_num_chars="oo"					// chars maxi (infini par défaut)
	prompt=">"
	entry_type=""						// text, integer, positive_integer, alpha, alpha_num, password
	menu_r=""
	max_historic="0"					// Si !=0 enable l historique de l editBox (4Dos like). Sinon donne la taille de l historique
	>
	<view id="edit_text" type="text">
</group>

MODIFIABLE:

	input_string (string)
			uc_input_string (ucstring)

<group type="build_sentence_magic" />

BUT: Widget de composition de magie

SYNTAXE:

<group type="build_sentence_magic" >
	// Brick racine
	<ctrl type="sheet" id="root_brick" nature="brick" />		
	// Brick mandatory
	<vector template="ctrl_brick_mandatory" id="mandatory_brick$i" _size="%BRICKS_PER_SENTENCE" index="$i" />
	// Brick optional
	<vector template="ctrl_brick_optional" id="optional_brick$i" _size="%BRICKS_PER_SENTENCE" index="$i" />
 
	// bouton de validation
	<ctrl type="button" id="valid_button" />
</group>

<group type="build_sentence_faber" />

BUT: Widget de composition de magie

SYNTAXE:

<group type="build_sentence_faber" >
	// Brick racine
	<ctrl type="sheet" id="root_brick" nature="brick" />		
	// Brick optional
	<vector template="ctrl_brick_optional" id="optional_brick$i" _size="%BRICKS_PER_SENTENCE" index="$i" />
	// bouton de validation
	<ctrl type="button" id="valid_button" />
 
	// Tool
	<ctrl type="sheet" id="tool" nature="item" />
	// MPs
	<vector template="ctrl_faber_mp" id="mp$i" _size="%MAX_FABER_REQ_MP" index="$i" />
	// Select number
	<group type="select_number" id="select_num_items" value="bricks:faber:num_items" loop="false" min="1" max="1" >
	</group>
</group>

<group type="list_sentence" />

BUT: Widget d'affichage des sentence connues. cf list_job pour le lien “list_sentence”

SYNTAXE:

<group type="list_sentence" id="pipo0" 
 
	wspace="2" hspace="2"		// donne l’espacement entre chaque slot. 0 par défaut
 
	lmargin="12"				// Marges left, right Top et bottom des slots par rapport au group. Defaut:0. Il Faut en mettre si ya une scrollBar et des bouton +- forcément...
	rmargin="2"
	tmargin="12"
	bmargin="2"
 
	rowmin="0"					// Nombre de lignes minimum affichées. Défaut: 1. 
								// Important si on veut par exemple afficher la liste des malus vides sans que le groupe se resize à H=0 (vide)
 
	rowmax="2"					// Nombre de lignes maximum affichées. Défaut: infini. 
								// Important si on veut afficher qu’une seule ligne toujours (pour les malus par exemple) 
								// quelque soit la largeur du parent. C’est cette valeur qui est éditée par les boutons +- (si présents)
 
	sep_slot0=""				// Image pour le séparateur Root-Mandatory
	sep_slot1=""				// Image pour le séparateur Mandatory-Optional
	sep_w0="0"					// décalage Root-Mandatory
	sep_w1="0"					// décalage Mandatory-Optional
 
	selected_color="255 255 255 255"	// couleur du highlight de la sentence sélectionnée
 
	// Paramètres communs au ctrl type="sheet". Voir ce control pour les détails
 
	nature=""					// forcé en type brick
	tx_noitem=""
	onclick_l=""
	params_l=""
	onclick_r=""
	params_r=""
	dragable=""
	oncandrop=""
	params_candrop=""
	ondrop=""
	params_drop=""
	menu_l=""
	menu_r=""
	menu_b=""
	>
 
	// Le mode "Resize" n'existe pas en fait. Le scripteur est libre de mettre ou pas une scroll bar et/ou des boutons qui permettent de changer rowmax
 
	<ctrl type="button" id="add_row" button_type="push_button" posref="TR TR" tx_normal="W_arrow_up_3.tga" tx_pushed="W_arrow_up_3.tga" tx_over="W_button_08_over.tga" />
	<ctrl type="button" id="sub_row" button_type="push_button" posparent="add_row" posref="TL TR" tx_normal="W_arrow_down_3.tga" tx_pushed="W_arrow_down_3.tga" tx_over="W_button_08_over.tga" />
 
	// Setup tyipque de scrollBar. L'alignement est hardcodé pour être Top. Le y devrait être égal à "-tmargin" du group list_sheet
 
	<ctrl type="scroll" id="scroll_row" posref="TL TL" w="8" x="2" y="12" 
		<!-- choix des textures de la scroll -->
		tx_bottomleft= "w_scroll_l123_b.tga"
		tx_middle= "w_scroll_l123_m.tga"
		tx_topright= "w_scroll_l123_t.tga"
 
</group>

<group type="combo_box" />

BUT: affiche une combo_box. Un bouton sur un texte qui fait apparaitre un menu de sélection de texte quand on clique dessus

SYNTAXE:

<group type="combo_box" 
	value=""					// Valeur de la database qui indique l’index de sélection de la comboBox.
	on_select_start=""			// optionnel. ActionHandler appelé après ouverture des choix de la combo box
	>
	// Texte qui affiche le choix courant.
	<view type="text" id="text" />
	// Boutton qui sert pour ouvrir la liste.
	<ctrl type="button" button_type="push_button" id="select" />
	// ajoute un choix pour la combo_box
	<combo_text	name="" />		
</group>

Note: il faut que “ui:interface:combo_box_select_menu” soit définie comme un <group type=“menu”> avec les paramètres d'aspect que l'on veut. Les champs actions sont remplis quand la combo_box est ouverte

EXEMPLE: Ce setup permet de faire une combo box ou le bouton est invisible et recouvre en fait tout le group: si on clique sur le texte, on ouvre alors la liste de choix.

<group type="combo_box" id="combo1" w="100" h="18"
	value="UI:COMBO_SELECT1"
	>
	// un cadre juste pour faire joli
	<instance template="box_widget" id="back" sizeref="wh" w="0" h="0" />
 
	// notre text
	<view type="text" id="text" posref="ML ML" x="2" />
	// Note pas de texture définie sauf l'over: c'est fait exprès.
	<ctrl type="button" button_type="push_button" id="select" sizeref="wh" w="0" h="0" col_over="255 255 255 128" tx_over="blank.tga" scale="true" />
 
	<combo_text	name="choix 1" />		
	<combo_text	name="choix 2" />		
	<combo_text	name="choix 3" />		
	<combo_text	name="choix 4" />		
 
</group>

<group type="tree" />

hérite de group

BUT: affiche un arbre (comme un menu)

EXEMPLE:

<group type="tree" id="pipo" col_over="255 255 255 128" col_select="255 128 128 128" fontsize="12" >
	<node id="invit"	name="uimGcmInvit" handler="" params="" />
	<node id="harvest1"	name="uimGcmHarvest" opened="true" >
		<node id="dig"		name="uimGcmDigging"/>
		<node id="har"		name="uimGcmHarvesting"/>
	</node>
</group>

Sur les nodes qui contiennent des fils on peut setuper la valeur de départ à ouvert ou fermé

<group type="html" />

<group type="html" 
	error_color="255 0 0"				// Error color
	link_color="128 128 255"			// Link color
	text_color="255 255 255"			// Text color
	h1_color="128 255 255"				// Headline 1 color
	h2_color="255 128 255"				// Headline 2 color
	h3_color="255 255 128"				// Headline 3 color
	h4_color="255 255 255"				// Headline 4 color
	h5_color="255 255 255"				// Headline 5 color
	h6_color="255 255 255"				// Headline 6 color
	error_color_global_color="false"	// Error uses global color
	link_color_global_color="false"		// Link uses global color
	text_color_global_color="false"		// Text uses global color
	h1_color_global_color="false"		// Headline 1 uses global color
	h2_color_global_color="false"		// Headline 2 uses global color
	h3_color_global_color="false"		// Headline 3 uses global color
	h4_color_global_color="false"		// Headline 4 uses global color
	h5_color_global_color="false"		// Headline 5 uses global color
	h6_color_global_color="false"		// Headline 6 uses global color
	text_font_size="12"					// Text font size
	h1_font_size="24"					// Headline 1 font size
	h2_font_size="20" 					// Headline 2 font size
	h3_font_size="16" 					// Headline 3 font size
	h4_font_size="16" 					// Headline 4 font size
	h5_font_size="16" 					// Headline 5 font size
	h6_font_size="16"					// Headline 6 font size
	paragraph_begin_space="12"			// Space between paragraphs
	multi_line_space_factor="0.25"		// Space between 2 lines of a paragraph. Factor of the font size
	td_begin_space="0"					// Space at the beginning of a table cell
	li_begin_space="4"					// H space when "<IL>"
	ul_begin_space="12"					// H space when "<UL>"
	li_indent="-10"						// W space when "<LI>"
	ul_indent="30"						// W space when "<UL>"
	form_text_area_group="edit_box_widget"		// The group to instanciate for a form edit box. It must have a child group CGroupEditBox* with the id "eb"
	checkbox_bitmap_normal="checkbox_normal.tga"	// The "off" bitmap use in form checkbox
	checkbox_bitmap_pushed="checkbox_pushed.tga"	// The "on" bitmap use in form checkbox
	checkbox_bitmap_over="checkbox_over.tga"		// The "over" bitmap use in form checkbox
	background_bitmap_view="bg"			// The name of the child bitmap view used for background
	home="http://www.nevrax.org"		// The home url (you can browsse to the home url with the url "home"
	browse_next_time="false"			// If true, the url is browsed when the group is created
>
</group>

<group type="quick_help" /> (derived from HTML)

<group type="quick_help" 
	non_selected_color="255 0 0"		// The unselected paragraphes color
	non_selected_link_color"0 0 128"	// The unselected link color
	non_selected_global_color="true"	// The unselected paragraphes uses gobal color
	non_selected_font_size="10"			// The unselected paragraphes font size
>
</group>

<group type="in_scene" /> (derived from group)

<group type="in_scene" 
	in_scene_offset_x="12"				// Offset in pixels
	in_scene_offset_y="12"				// Offset in pixels
>
</group>

<group type="table" /> (derived from group)

a html-like table :

The table is essentially an array. Each line must have the same number of cells. The width of the table can be arbitrary. Either sizeref=“w” or a fixed w can be used. using child_resize_w has undefined results. The height or the table is imposed by its children cells (like with html table)

Table is specified using the standard <TR> & <TD>

Option for the table :

border : the same the html tables 'border'
cellpadding : the same the html tables 'cellpadding'
cellspacing : the same the html tables 'cellspacing'
bgcolor     : background color with format "R G B A" ("255 0 0 255" for example)
width		: wanted width of table in pixels (same than html "width"). could be a ratio like "100%"
			  usually the table will specify sizeref="w" or w and width="100%"
continuous_update : whan set to true, the table will be updated continuously has its parent container is resized, and not when mouse left button is released only

Options for the cells (<TD> tag)

Cells can have an id. If none is given a id like cell_1_2 id generated (first number is column, second is row)
align  : horizontal alignment of cell content. Can be "left", "right" or "center" (same than HTML 'align')
valign : vertical alignment of cell content. Can be 'top", "middle" or "bottom" (same than HTML 'valign')
left_margin : offset added to the x position of the cell content
nowrap : same then htlm table 'nowrap'
bgcolor : color of the cell background (with the "R G B A" format)
width : same then htlm table 'width' : gives width of column for that cell, or a percentage
add_child_w : take the wanted size from the size of the children (equivalent to child_resize_h), and add the 'width' (not added if a percentage)
height : minimum height of the cell
ignore_max_width : if "true", the cell content max_used_w is ignored when computing the width of the cell
ignore_min_width : if "true", the cell content min_used_w is ignored when computing the width of the cell
<group type="table" id="my_table" posref="TL TL" sizeref="w" width="100%" border="2" bgcolor="0 255 0 255" y="-4"
			 cellspacing="1"
			 cellpadding="0"
			 continuous_update="true"
			> 
		<!-- test 1 -->							
		<TR>
			<TD width="30%" bgcolor="0 0 0 127" height="30" align="center" valign="middle" id="optionnal_id">
				<view type="text" id="mon_text" global_color="true" fontsize="20" shadow="true" hardtext="cell 1 cell 1 cell 1 cell 1"
				 multi_line="true"
				/>					
			</TD>
			<TD bgcolor="255 0 0 127" height="30" align="center" valign="middle">
				<view type="text" id="mon_text" global_color="true" fontsize="20" shadow="true" hardtext="cell 2"/>
			</TD>
		</TR>
		<TR>
			<TD width="30%" bgcolor="0 0 0 192" height="30" align="center" valign="middle">
				<view type="text" id="mon_text" global_color="true" fontsize="20" shadow="true" hardtext="cell 3"/>
			</TD>
			<TD bgcolor="0 0 255 192" height="30" align="center" valign="middle">
				<view type="text" id="mon_text" global_color="true" fontsize="20" shadow="true" hardtext="cell 4"/>
			</TD>
		</TR>			
		<!--			
		<TR>				
			<TD width="100%" bgcolor="255 0 0 127" height="30">
				<view type="text" posref="TL TL" global_color="true" fontsize="20" shadow="true" hardtext="cell 2"/>
			</TD>
		</TR>			
		-->
	</group>		
</group>

MISC: DEFINE, PROCEDURES, TEMPLATES, ANIM, SCENE3D, ...

<define>

BUT: Permet de définir une constante.

SYNTAXE:

<define id="id_du_define" value="valeur_a_remplacer" />

EXAMPLE:

<define id="pipo_title" value="yoyo" />
....
<group type="container" id="player" title="Hello %pipo_title" >

Comme ça “Hello %pipo_title” est remplacé par “Hello yoyo”

L'id du define ne peut contenir que les caractères:

    'a' à 'z'    
    'A' à 'Z'
    '0' à '9'
    '_'

Du coup si vous voulez vraiment afficher un % dans un string (par exemple “25 %”), il faut l'écrire en double

"25 %%"

<proc>

BUT: Définis une action handler spéciale qui lance des actions handlers à la suite

SYNTAXE:

<proc id="nom_procedure" >
	<action	handler="action_handler0" params="" />
	<action	handler="action_handler1" params="" />
	<action	handler="action_handler2" params="@0|@1" />
</proc>

Les paramètres sont optionnels. Une action handler peut être elle-même une autre procédure (attention récursivité :))

La procédure se lance en utilisant l'action handler “proc” avec comme paramètre “nom_procédure”

La procédure peut prendre des paramètres en entrée (voir l'action handler proc pour comment faire). Pour chaque action, le champ params=“” est parsé. Toute chaine de type @#, ou # est un numéro (à N chiffres) copiera alors le paramètre (simple copie de chaine) au moment de l'appel.

Note: de la même façon que les % dans les define, un double @ permet de ne pas considérer l'@ comme un descripteur de paramètre

EXAMPLE:

<proc id="select_quit_modal" >
	<action	handler="exchange" params="src=ctrl_launch_modal" />
	<action	handler="leave_modal" />
</proc>

….

<ctrl type="button" onclick_l="proc" params_l="select_quit_modal">

EXAMPLE paramètres:

<proc id="set_quit_modal" >
	<action	handler="set" params="dblink=SERVER:PIPO|value=@0" />
	<action	handler="leave_modal" />
</proc>
 
....
 
<ctrl type="button" onclick_l="proc" params_l="set_quit_modal|10">

Dans cet exemple, sur un clic gauche du bouton, set sera appelé avec une valeur de 10!! Notez que l'index des paramètres commence à 0.

<template>

BUT: Définit un patron qui permet d'instancier des groups, ctrls ou vues qui se ressemblent.

SYNTAXE: Définition du template:

<template name="nom_du_template" ...paramètres du template...>
	corps du template (group, controls etc...) qui référence les paramètres du template avec #
</template>

Instanciation du template:

<instance template="nom_du_template" paramètres du template remplis />

EXAMPLE:

<!--Définit un template de nom "SNH" qui attend des paramètres id, value, loop etc... (si "" est mis à un paramètre, 
	celui-ci doit être défini à l'instanciation)
-->
<template name="SNH" id="" value="" loop="true" min="0" max="9" posparent="parent" posref="MM MM" x="0" y="0" w="26" h="16" >
	<group type="select_number" id="#id" value="#value" loop="#loop" min="#min" max="#max" x="#x" y="#y" w="#w" h="#h" posparent="#posparent" posref="#posref" >
		<view type="bitmap" id="slot_number" posref="TL TL" texture="W_slot_number.tga" />
		<view type="text" id="number" posparent="slot_number" posref="MM MM" color="255 255 255 255" fontsize="12" shadow="true" hardtext="0" />
		<ctrl type="button" id="arrow_up" button_type="push_button" posref="TR TR" tx_normal="W_arrow_up_3.tga" tx_pushed="W_arrow_up_3.tga" tx_over="W_button_08_over.tga" />
		<ctrl type="button" id="arrow_down" button_type="push_button" posref="BR BR" tx_normal="W_arrow_down_3.tga" tx_pushed="W_arrow_down_3.tga" tx_over="W_button_08_over.tga" />
	</group>
</template>
 
<!--Instancie le template SNH
-->
<instance template="SNH" id="shortnumber" value="SERVER:USER:SAP" loop="true" min="0" max="9" posref="ML ML" />

<vector>

BUT: Create an array of template's instances (mutli instance version of <instance>)

SYNTAXE:

<vector
	template="template_name"		// as in <instance....
	_size=""						// required. number of isntance to create
	_firstindex="0"					// optional to begin the index of instance to a number!=0
 
	// Next ones are required only if the template is a serie of interface elements (group, view....)
	// that need to be sticked against each other (eg: a vertical array of view text)
	_firstpos=""					// posref (TL TL...) of the first element, sticked to the parent
	_nextpos=""						// posref (TR TL...) of next elements, sticked to the previous one
	_xfirst=""						// special x of the first element
	_yfirst=""						// special y of the first element
/>

Then for each instance created, All properties of the XML node are parsed, and $i are replaced with the index of the instance

EXAMPLE:

<template name="temp_tab" keep="true" nb="" id="" posparent="" posref="" x="" >
	<ctrl style="tab_button_new" id="#id" posparent="#posparent" posref="#posref" 
		group="content:group#nb" text="TabNo#nb" />
</template>
<vector template="temp_tab" _size="16" _firstpos="TR TL" _nextpos="TR TL" _xfirst="4" x="1" id="tab_array0_$i" nb="$i" posparent="tabref" />

This will create 16 instances of ctrls (tab_array0_0, tab_array0_1, tab_array0_2….)

The first one will be placed on right of “tabref”, but with a x of 4 (_firstpos=“TR TL” _xfirst=“4”)

The next ones will be placed on right of each other, but sticked with a x of 1 (_nextpos=“TR TL” x=“1” )

NB: if '_xfirst' is not defined, then 'x' will be taken for the first position also

NB: if '_yfirst' is not defined, then 'y' will be taken for the first position also

NB: Both _firstpos/_nextpos must be defined in order for the “stick system” to work

also you must declare id="", posparent="" and posref="" in the template definition.

<variable>

BUT: crée une variable et associe une valeur

SYNTAXE:

<variable 
	entry=""			// Obligatoire. Lien vers la database.
	type=""				// Obligatoire. sint32, sint64, float, double, bool, rgba, hotspot. 
						// float et double on le même effet
	value=""			// valeur à mettre
	size=""				// Si définit, alors <variable> sert à définir un tableau.
/>

EXAMPLE:

<variable entry="UI:MODE" type="sint32" value="0"/>

Dans le cas de définition d'un tableau, le premier “$i” rencontré est remplacé par l'index de 0 à size-1.

<variable entry="UI:LIST:$i:SHEET" type="sint32" value="0" size="4" />

BUT: Lier une expression à une valeur d'une vue (target). L'expression doit dépendre d'entrée de la database. À chaque fois qu'une entrée de la database est updatée, l'expression est recalculée, et le target est updatée.

SYNTAXE:

<link 
 expr=""     // obligatoire : expression à évaluer. L'expression doit dépendre au moins d'une entrée de la database
 target=""   // valeurs auxquelles doit être affectée le résultat de l’expression, relatif au groupe qui contient le link, ou considéré comme une adresse absolue si non trouvée
 action=""   // facultatif  : un action handler a appeller en cas d update
 params=""   // facultatif  : paramètre pour l action handler
 cond=""	 // facultatif  : condition à l'exécution de l'action handler
/>

EXAMPLE:

<view type="bitmap" id="my_view" >
<link expr="ne(@my_db_entry, 0)" target="my_view:active,my_other_view:active" // si l’entrée de database 'my_db_view' ne vaut pas 0, alors my_view:active est mis à true
/>

CRÉATION DYNAMIQUE DE LIEN: Elle est utile si on veut que les update ne soient pris en compte qu'à un moment précis (par exemple dans une boite modale). C'est surtout bien dans le cas de test couteux ou si des textes non visibles sont updatés pour rien.

Création

handler="add_link" params="id=identifier_unique|expr=expression_a_evaluer|target=dest_de_lexpression"

Suppression

handler="remove_link" params="id=identifier_unique|expr=expression_a_evaluer|target=dest_de_lexpression"

par exemple, en reprenant l’exemple précédent:

handler="add_link" params="id=mon_lien|expr=ne(@my_db_entry, 0)|target=my_view:active" 
handler="remove_link" params="id=mon_lien"

<anim> <track> <key>

<anim 
	id="specie_in"			// nom du timer
	duration="3.0"			// temps en seconde pour faire varier l’entrée dans la database
	loop="true"				// est-ce que l’anim doit boucler ?
	reverse="false"			// est-ce que l’anim doit être jouée a l’envers 
	on_finish="ahwhenfini"	// action handler a lancer quand le timer arrive a la fin
	on_finish_params="ahp"	// les paramètres de l’action handler
/>
<track 
	type="linear"			// linear, bezier, tcb
	target="specie:race:y"	// all the targets affected may be more than one
	dynamic="true"			// (def:false) si true évalue tous les paramètres des cles lors du lancement de l anim
/>

Si la track est de type linear :

<key
	time="1.0"				// Une valeur de temps comprise entre 0 et la durée de l anim
	value="15"				// la valeur que prennent les targets au temps : time
/>

Si la track est de type bezier :

<key
	time="1.0"				// Une valeur de temps comprise entre 0 et la durée de l anim
	value="15"				// la valeur que prennent les targets au temps : time
	intan="0.0"				// float facultatif def:0		???? aucune idée de ce à quoi ça peut servir
	outtan="0.0"			// float facultatif def:0		???? aucune idée de ce à quoi ça peut servir
	step="true"				// bool  facultatif def:false	???? aucune idée de ce a quoi ça peut servir
/>

Si la track est de type TCB :

<key
	time="1.0"				// Une valeur de temps comprise entre 0 et la durée de l anim
	value="15"				// la valeur que prennent les targets au temps : time
	tension="1.0"			// float facultatif def:0
	continuity="0.0"		// float facultatif def:0
	bias="1.0"				// float facultatif def:0
	easeto="0.1"			// float facultatif def:0
	easefrom="0.3"			// float facultatif def:0
/>

un exemple typique est :

<group id="specie" sizeref="wh" on_active="anim_start" on_active_params="anim=t1">
	<group id="race" posref="BL BL" x="16" y="64">
	</group>
</group>
 
<anim id ="t1" duration="3.0" >
	<track type="linear" target="specie:race:y">
		<key time="0.0" value="-16"/>
		<key time="3.0" value="64"/>
	</track>
</anim>

quand on va activer le groupe specie cela va lancer l'animation t1. la valeur specie:race:y va être modifiée → cela va faire monter le groupe specie:race

<scene3d>

<scene3d
	reference="id_scene3d"		// Donne la référence sur une autre scène 3d (dans ce cas-là c’est juste une vue sur une autre scène)
	ambient="0 0 0" 
	sun_ambient="50 50 50" 
	sun_diffuse="255 255 255" 
	sun_specular="255 255 255" 
	sun_direction="-1.0 1.0 -1.0"
	curcam="id_camera"			// Camera courante
	curcs="id_camera"			// Cluster system courant (un ig avec des clusters)
 
	user_interaction="true"		// Interaction camera (qui doit être calée en y (ie camx=tgtx & camz=tgtz)
	rotz_factor="0.005"			// Facteur de vitesse lors d’une rotation autour
	rotz_limit_min="-45"		// Limites d’angles
	rotz_limit_max="45"
	roty_factor="0.005"			// Facteur de vitesse lors d’une rotation haut-bas
	roty_limit_min="-20"
	roty_limit_max="20"
	dist_factor="0.005"			// Facteur de vitesse lors d’un déplacement de distance
	dist_limit_min="0.1"		// Limites de distances en mètres
	dist_limit_max="20"
 
/>

DERIVANT DE <group>

MODIFIABLE:

curcam (string)
curcs (string)
rotzfactor (float)

<character3d>

<character3d
	dblink="UI:TEMP:CHAR3D"
	pos="1.0 2.0 3.0"
	rot="0.0 0.0 90.0"
/>

MODIFIABLE:

headx, heady, headz (float la position de la tete apres au moins une frame d animation)
			posx, posy, posz (float la position)
			rotx, roty, rotz (float angle en degres)
			anim (int)

<ig>

<ig name="ig_name.ig" pos="1.0 2.0 3.0" rot="1.0 2.0 3.0" />

MODIFIABLE:

Il semblerait que la modification de pos ne fonctionne pas pour déplacer le .ig, qui demeure à l'emplacement indiqué lors de sa création (et qu'on peut connaître grâce à un ig_info).

Vérifier si c'est un bug ou si c'est voulu par le système.

<shape>

<shape
	name="shape_name.shape"
	pos="1.0 2.0 3.0"
	rot="1.0 2.0 3.0"
/>

MODIFIABLE:

posx, posy, posz (float la position)
			posx, posy, posz (float l orientation en degree)
			name (string)

<camera>

<camera pos="1.0 2.0 3.0" target="2.0 3.0 4.0" fov="50.0" roll="0.0" />

MODIFIABLE:

<light>

<light
	pos="1.0 2.0 3.0"
	near="3.0"
	far="10.0"
	color="127 255 64 255"
/>

MODIFIABLE:

 posx, posy, posz (float la position)
			near, far (float)
			colr, colg, colb (int)

<fx>

<fx
	name="sp_cast_loop.ps"
	pos="1.0 2.0 3.0"
	rot="0.0 0.0 0.0"
/>

MODIFIABLE:

 posx, posy, posz (float la position)
			rotx, roty, rotz (float la rotation)
			started (bool le fx est il en train d’être joue ?)

Pour que le système de particules soit actif, il faut l'activer avec une commande de type :

<action handler="set" params="target_property=ui:outgame:charsel:char3d:fx1:started|value=1" />

Cette commande metà 'vrai' l'activation du fx appelé fx1 dans la scène char3d de charsel de outgame de l'ui.

Un exemple typique :

<scene3d id="char3d" x="576" y="-32" w="576" h="488" posref="TR TR" curcam="cam" 
					ambient="0 0 0" sun_ambient="50 50 50" sun_diffuse="255 255 255" sun_specular="255 255 255" sun_direction="-1.0 1.0 -1.0" >
 
	<character3d id="char" dblink="UI:TEMP:CHAR3D" pos="0.07 26.52 0.85" rot="0.0 0.0 -90.0" />
 
	<camera id="cam" fov="45" pos="0.01 22.29 2.5" target="0.01 37.9 1.53" roll="0" />
 
	<light id="l1" pos="-1.0 24.29 2.0" color="0 255 0" near="1.0" far="5.0" />
 
	<ig id="env" name="matis.ig" pos="0 0 0" />
 
	<fx id="fx1" pos="0.0 0.0 0.0" name="Sp_Cast_Loop.ps" />
 
</scene3d>

<action_category > <action> <parameter> <value>

// <action_category > 
//		<action> 
//			<parameter> 
//				<value>

Definition d'une category d'action

<action_category 
	hardtext="uiUI"			// Nom de la category localisé (défaut : "")
/>

Une définition d'action de base

<action 
	repeat="0"				// 1 : l'action est répétée avec la répétition clavier, 0 : elle n'est pas répétée. (défaut : 0)
	name="screenshot"		// Nom de l'action handler utilisé par l'action (défaut : "")
	hardtext="uiTakeScreenshot"			// Nom localisé de l'action (défaut : "")
/>

Un paramètre d'action de base

<parameter
	type="action_param_constant"	// Type de paramètre :
									// action_param_hidden : le paramètre est caché à l'utilisateur
									// action_param_constant : le paramètre est une valeur prédéterminée (voir <value>)
									// action_param_user : le paramètre est entré par l'utilisateur. Tous les caractères sont permis.
									// action_param_user_name : le paramètre est entré par l'utilisateur. Uniquement les caractères permis dans les noms sont utilisés.
									// (défaut : action_param_constant)
	name="filename"				// Nom du paramètre (défaut : "")
	hardtext="uiFilename"		// Nom localisé du paramètre (défaut : "")
	value=""					// La valeur par défaut du paramètre (défaut : "")
/>

Une valeur prédéfinie de paramètre d'action de base

<value
	value="toto"				// La valeur (défaut : "")
	hardtext="uiToto"			// Le nom localisé de la valeur (défaut : "")
>

Exemple :

<action_category hardtext="uiDivers">
 
	// Action pour envoyer un message à un joueur
	<action repeat="0" name="tell" hardText="uiTell">
		<parameter type="action_param_user_name" name="user" hardText="uiUsername" visible="1"/>
		<parameter type="action_param_user" name="message" hardText="uiMessage" visible="1"/>
	</action>
 
	// Action pour passer en mode labo
	<action name="set_mode" hardText="uiModelabo">
		<parameter value="2" visible="0"/>
	</action>
 
	// Action pour ouvrir un inventaire de sac
	<action repeat="0" name="open_window" hardText="uiOpenWindow">
		<parameter type="action_param_constant" name="" hardText="uiWindow" visible="1">
			<value value="UI:BAG1" hardtext="uiBag1"/>
			<value value="UI:BAG2" hardtext="uiBag2"/>
			<value value="UI:BAG3" hardtext="uiBag3"/>
		</parameter>
	</action>
 
</action_category>

<key>

<key name="Key1" ctrl="0" shift="0" menu="0" action="run_shortcut" params="1"/>

Bind a key combo to an action handler.

ACTIONS

<action="enter_modal" params="group=ui:interface:yoyo_modal1">

affiche la fenêtre modal ui:interface:yoyo_modal1 ici.

<action="leave_modal">

cache la fenêtre modal courante

<action="proc" params="nom_procedure|arg0|arg1|...">

lance une procédure. Les arguments sont séparés du nom de la procédure par des “|”.

<action="set" params="dblink=liendatabase|value=expr">

set un sint32, résultat de l'évaluation de expr, dans la database.

<action="set" params="target_property=target0,target1,...,targetn|value=expr">

affecte le résultat de l'évaluation de expr à chacun des target (valeur exportée des éléments de l'interface tel que 'active')

<action="copy" params="dbdst=liendatabase|dbsrc=liendatabase">

copie une valeur de la database dans une autre

<oncandrop="isitem" params="">

test si dropable est un item

<oncandrop="isitem_slot" params="type=itemslot">

test si dropable est un item d'un certain type (HEAD, ARMS…)

<onfilter="filter_item" params_filter="type=itemslot">

test si le ctrlSheet est un item d'un certain type (HEAD, ARMS…) à mettre sur les props de list_sheet

<action="set_keyboard_focus" params="target=ui:interface_my_edit_box|select_all=true">

Met le focus sur l'edit box en target. Sélectionne tout le texte si select_all vaut true

<on_active="timer_start" on_active_params="timer=specie_in">

Lance un timer (voir <timer>)

<action="set_server_id" params="value=@%user_name_id|target=player_name:uc_hardtext">

Affecte une value a une target. La value représente un identifiant de mot réseau (nom des joueurs par exemple)

<action="set_server_string" params="value=@%user_name_id|target=player_name:uc_hardtext">

Affecte une value a une target. La value représente un identifiant de chaine réseau (phrase composée de plusieurs mots)

COMMON EXPRESSIONS

Nom Arguments Description
add2return (arg1 + arg2)
sub2return (arg1 - arg2)
mul2return (arg1 * arg2)
div2return (arg1 / arg2)
mod2return (arg1 % arg2)
abs1return abs(arg1) (valeur absolue de arg1)
identity1return (arg1)
ne2return (arg1 != arg2)
eq2return (arg1 == arg2)
lt2return (arg1 < arg2)
le2return (arg1 ⇐ arg2)
gt2return (arg1 > arg2)
ge2return (arg1 >= arg2)
orn > 0return (arg1 || arg2 || ... || argn)
andn > 0return (arg1 && arg2 && … && argn)
not1return (!arg0)
strn > 0converti tous les arguments en string et return arg1_str + arg2_str + … + argn_str
int1converti l'argument en entier
ifthenelse2 ou 3 (1er argument de type bool)retourne le 2eme argument si le 1er est vrai sinon retourne le 3eme argument (si il existe)
switchau moins 2 (1er argument de type int)retourne le n ieme argument où n est la valeur du premier argument +1 si arg1 vaut 0 on retourne arg2 si arg1 vaut 1 on retourne arg3 et ainsi de suite
ilinear3 double (1er == interpolant (0 - 1.0)) (a 0 arg2 max, a 1 arg3 max)retourne arg2 + arg1 * (arg3 - arg2)
getbit2 entiers (1er == valeur, 2nd == numéro du bit désiré)retournent le arg2_ieme bits de la valeur arg1
rand2 doublesretournent une valeur comprise entre arg1 et arg2
dbcount1 (string) (exemple : dbcount('SERVER:MODIFIERS:BONUS:$:SHEET')compte le nombre d’occurrences dans la database. Si l’entrée est un noeud alors détecte qu’il ne soit pas égal a zéro ; il faut obligatoirement un $ (qui sera remplacé par 0,1,2,…)
getprop1 (string) (exemple : getprop('ui:interface:define_day_color:pick:b'))retourne la valeur MODIFIABLE d’un élément d’interface
intToColor1 (integer)retourne la même valeur en rgba
getRed1 (rgba)retourne la même valeur du rouge
getGreen1 (rgba)retourne la même valeur du vert
getBlue1 (rgba)retourne la même valeur du bleu
getAlpha1 (rgba)retourne la même valeur de l alpha
makeRGB3 ou 4 (int)retourne un rgb ou rgba
minn>0 (int ou double)retourne la valeur minimum de tous les arguments
maxn>0 (int ou double)retourne la valeur maximum de tous les arguments
dependsaucunretourne zéro ; sert uniquement a créer des dépendances sur des éléments de database pour appeler des actions
identityn>0retourne le premier argument ; sert un peu comme depends mais en plus permet un setup direct d’une target
bandn>=0retourne AND bit à bit de tous les arguments. 0 si nargs==0.
born>=0retourne OR bit à bit de tous les arguments. 0 si nargs==0.
bxorn==2retourne XOR bit à bit des 2 arguments.
bnotn==1retourne NOT bit à bit de l'argument.

GAME EXPRESSIONS

Nom Arg. Description
isOpenTODOTODO
getCompassText1convertit l'argument de type float (angle radian) en text
getPactText1 entierconvertit l'argument qui représente le numéro du type de pacte en chaine de character
getDateText1 entierconvertit un jour ryzom (entier) en date sous le format 06 / 02 /03
getDifficultyText1 entierretourne en ucstring le texte de difficulté internationalise
isCharSelSlotEmpty1 entierretourne un booleen qui dit si le arg1_ieme (0-5) slot de character summary est vide ou non
getClientActionTypeTextTODOTODO
getClientActionTypeColorTODOTODO
is2HandItem1true si le sheetId définit un item à 2 mains
getSmoothServerTick1convert a serverTick in smoothServerTick
getVSIndex2 strings (exemple : getVSIndex('fy_cheveux_shave01.sitem','HEAD'))retourne (int) l’index de visual slot en fonction d’un nom d’item et d’un type de slot
getRoleId1 stringretourne un entier qui est le numéro de la carrière (dans l enum)
getLightLevel0donne le facteur de blend jour/nuit (un double de 0.0 a 1.0)
strToIntFlag1 string (exemple : strToIntFlag('Combat'))retourne (int) le numéro du flag correspondant a la string
getSheathSlot1 string (exemple : getSheathSlot('ammo1'))retourne (int) le numéro du fourreau en fonction de son nom
getInventorySlot1 string (exemple : getInventorySlot('pack_animal1'))retourne (int) le numéro du slot d’inventaire en fonction de son nom
getEquipmentSlot1 string (exemple : getEquipmentSlot('FingerL'))retourne (int) le numéro du slot d’équipement en fonction de son nom
getChatWinTODOTODO

USER EXPRESSIONS

Expression Arg. Explication
getSelectedItemPrice 0 Get the price of the current selected item (should come from bot inventory)
getDraggedSheet 0 Get ptr object on the current dragged sheet
getSelectedSheet 0 Get ptr object on the current selected sheet
getMenuItemSheet 0 Get ptr object on the last sheet that trigerred menu.
getSheetID From a pointer on a sheet, get its sheetID
getSheetSelectionGroup From a pointer on a sheet, get its selection group name
getSheetName From a pointer on a sheet, or a sheet ID, get its name
getSheetIndex From a pointer on a sheet, get its index in the parent sheet list
getSheetQuantity From a pointer on a sheet, retrieve its quantity
getSheetQuality From a pointer on a sheet, retrieve its quality
isStackable From a pointer on a sheet, get its index in the parent sheet list
isTeleport From a pointer on a sheet or a sheet ID, test if an item is a teleport item
isPlainItem From a pointer on a sheet or a sheet ID, test if an item is a plain item (not a teleport, not a brick, not a pact)
isBrick From a sheet ID, test if an item is a brick
isPact From a sheet ID, test if an item is a pact
isRangeWeapon From a pointer on a sheet or a sheet ID, test if an item is a ran,ged weapon
isRoomLeftFor From a sheet ID, test if there's room for it in the inventory
getSelectionGroupNameFromId Get the name of a selection group from its id
getSelectionGroupIdFromName Get the id of a selection group from its name
getItemsWeight(basePath, firstItem, numItem) Get the sum of all item's weight at the given db path
getItemBranchsWeight(baseBranch, firstBranch, numBranch) Get the sum of all items located in several branchs
getSeedsWeight() Returns the weight of the seeds owned by the player
getArmoursWeight() Returns the weight of all armours pieces worn by the player
getInventoryWeight() Returns the weight of the whole inventory, not including beasts'inventory of course
getSheathWeight() Returns the weight of the sheaths
getBranchSheetCategory() return the types of items that are contained in a branch (with the enum CDBCtrlSheet::TSheetCategory
copySheet param 0 = pointer on a sheet, param 1 = dbAdress. This copy characteristics of a sheet (quantity, quality, sheet id) at the given database adress

interface_notes.txt

À traduire.

ADVANCED SCRIPT NOTES

SCROLL BAR

Simple sample : the doc is fixed size and view region (maxw,maxh) is fixed size The only trickiest thing is that the doc/view group (here its 'sbtest') has size bigger than those displayed So we cannot link scrollbar pos to it. ScrollBars has the same size than the target (in w for a horizontal scrollbar and in h for a vertical scrollbar). Note the automatic detection of mouse wheel in the group

To activate the sample put it in a .xml that is loaded (see client_default.cfg for that) If you have access to the console command just type : /ah show trap else you have to activate it by hand in a reset proc or something

<group type="container" id="trap" w="200" title="TRAPTEST" multi_resize="false" global_color="false" open_button="false" force_open_out="true" header_color="UI:SAVE:WIN:COLORS:HELP"
 title_bar_open="false" min_w="208" min_h="64" max_w="2000"
 max_h="1600" pop_max_w="2000" pop_max_h="1600" lockable="true" openable="false" opened="true" movable="true" resizer="false" active="true">
 
	<group id="header_closed" x="0" y="0" h="12" posref="TL TL"
		 group_onclick_r="active_menu"
	 	group_params_r="menu=ui:interface:base_menu_with_color" >
	</group>
 
	<group id="header_opened" x="0" y="0" w="170" h="13" posref="TL TL" child_resize_h="true" child_resize_hmargin="8" 	
			group_onclick_r="active_menu" group_params_r="menu=ui:interface:base_menu_with_color">
	</group>
 
	<!-- w of content is set by the parent so here its 208 - (bitmap left + bitmap right) = 200 -->
	<group id="content" posref="TL TL" child_resize_h="true" >
 
		<!-- Group of fixed size because content is resized from children and we cannot predict exactly the size -->
		<group id="all" x="0" y="0" w="200" h="200" posref="TL TL" >
 
			<!-- Simple sample : the doc is fixed size and view region (maxw,maxh) is fixed size -->
			<view type="bitmap" id="back" posref="TL TL" x="32" y="-32" w="64" h="64" scale="true" texture="w_box_blank.tga" color="128 128 128 128" />
 
			<!-- the ref pos of the group indicates where to put the view region TL, TR, BL, BR -->
			<!-- The following comments shows the influence of ref pos over the starting configuration -->
			<!--<group id="sbtest" posref="TL TL" x="32" y="-32" w="128" h="128" max_w="64" max_h="64" >-->
			<!--<group id="sbtest" posref="BL BL" x="32" y="104" w="128" h="128" max_w="64" max_h="64" >-->
			<!--<group id="sbtest" posref="BR BR" x="-104" y="104" w="128" h="128" max_w="64" max_h="64" >-->
			<group id="sbtest" posref="TR TR" x="-104" y="-32" w="128" h="128" max_w="64" max_h="64" >
				<view type="bitmap" id="b1" posref="BL BL"					texture="w_answer_16_cancel.tga" />
				<view type="bitmap" id="b2" posref="BL BL" y="56"			texture="w_answer_16_cancel.tga" />
				<view type="bitmap" id="b3" posref="BL BL" y="112"			texture="w_answer_16_cancel.tga" />
				<view type="bitmap" id="b4" posref="BL BL" x="56"			texture="w_answer_16_valid.tga" />
				<view type="bitmap" id="b5" posref="BL BL" x="56" y="56"	texture="w_answer_16_cancel.tga" />
				<view type="bitmap" id="b6" posref="BL BL" x="56" y="112"	texture="w_answer_16_cancel.tga" />
				<view type="bitmap" id="b7" posref="BL BL" x="112"			texture="w_answer_16_cancel.tga" />
				<view type="bitmap" id="b8" posref="BL BL" x="112" y="56"	texture="w_answer_16_valid.tga" />
				<view type="bitmap" id="b9" posref="BL BL" x="112" y="112"	texture="w_answer_16_valid.tga" />
			</group>
			<!-- The scroll bar cannot have sbtest as parent ref for their pos because the size is 128 and not 64 (what is viewed) -->
			<ctrl type="scroll" id="sv" posref="TL TL" x="22" y="-32" w="8" tx_topright="w_scroll_l123_t.tga" 
				tx_middle="w_scroll_l123_m.tga" tx_bottomleft="w_scroll_l123_b.tga" target="sbtest" />
 
			<ctrl type="scroll" id="sh" posref="TL TL" x="32" y="-98" h="8" vertical="false" tx_topright="w_scroll_R.tga" 
				tx_middle="w_scroll_M.tga" tx_bottomleft="w_scroll_L.tga"		target="sbtest" />
 
		</group>
 
	</group>
 
</group>	
<tree node="trap"/>

Quelques commentaires

le fichier out_v2_appear.xml

Ce fichier configure la fenêtre de création de personnages. Je l'explique séquentiellement.

Structure du fichier

Au début du fichier, des définitions de variables, exemple : <variable entry=“UI:TEMP:M1_1:PEOPLE” type=“sint64” value=“0” />

Ensuite des “Widgets”, qui sont des espèces de macros, exemple :

<template name="slider" posref="TL TL" x="0" y="0" w="180" h="48"  id="" posparent="parent" sizeref="" keep="true">
	<group id="#id" posparent="#posparent" posref="#posref" w="#w" h="#h" x="#x" y="#y" sizeref="#sizeref" >
		<view type="bitmap" id="left" posref="TL TL" texture="opt_off_l.tga"/>
		<view type="bitmap" id="right" posref="TR TR" texture="opt_off_r.tga"/>
		<view type="bitmap" id="middle" posref="MM MM" scale="true" sizeref="hw" h="0" w="-64" texture="opt_off_m.tga"/>
	</group>
</template>

On voit l'utilisation de codes qui semblent servir à paramétrer. Je n'ai rien touché jusque la.

Ensuite les procs, les actions, exemple :

<proc id="import_fyros">
	<action handler="copy" params="dbdst=UI:TEMP:CHAR3D|dbsrc=UI:TEMP:CHAR3DFYROS" />
</proc>

Il y a notamment la procédure d'initialisation : <proc id=“proc_init_CP”>

lignes 246-247, j'ai ajouté deux lignes qui servent à placer les effets spéciaux sur le menu des races, sélectionné au départ.

	<!-- placement des effets à l'initialisation -->
	<action handler="set" params="target_property=ui:outgame:appear:3d_select:x|value=2" />
	<action handler="set" params="target_property=ui:outgame:appear:3d_select:y|value=-95" />

Cette section est longue, j'ai encore fait une petite modification pour que le choix initial de la race se fasse uniquement entre Fyros et Matis

<!-- Pour avoir 2 races seulement au départ , modifié rand(0,3) en rand(0,1) -->
<proc id="proc_rand_specie">
	<action handler="set" params="dblink=UI:TEMP:CHAR3D:PEOPLE|value=rand(0,1)" />
</proc>

</WRAP>

Voir aussi

1)
derive from
2)
necessary