Alors bonjour à tous,
Aujourd'hui on va voir comment faire pour ajouter de nouveaux items (équipements, premiums, customs, etc...) à votre serveur.
Ce guide est très détaillé, n'est pas très simple à faire et n'est pas le meilleur ami de votre database (bien que je l'ai testé !), donc lisez bien attentivement.
En admettant que vous ayez un serveur en état de marche, il vous faudra:
* data.res
* dataSub2.res
* SQL Database
* Microsoft Visual C++
* Notepad/ConTEXT/Word/etc.
* Flyff Resource Manager
L'émulateur que vous utilisez ne joue pas (je crois), cela marche de la même manière ou est très ressemblant.
AJOUTER DE TOUT NOUVEAU ITEMS
Note: Cette partie est basée sur l'ajout d'une épée Job 1 (mercenaire/blade).
Imaginons que vous venez de créer une arme, ou trouver une arme stylé sur le net et vous voulez l'ajouter à votre serveur pour le personnalisé un peu et faire plaisir à vos joueurs. Voici comment on fait !
Première étape, ouvrir Flyff Resource Manager et extraire "defineItem.h", qui se trouve dans votre dossier "V15_files". Faite de même avec mdlDyna.inc (dans le data.res) et propItem.txt et propItem.txt.txt (oui ce n'est pas une erreur) de dataSub2.res.
Mettez-les à un endroit où vous ne les oublieraient pas !
defineItem.h
Ouvrez-le avec un éditeur de texte( Bloc-notes, Wordpad, etc...)
mdlDyna.inc
Ouvrez-le avec Microsoft visual C++.
propItem.txt
Ouvrez-le avec un éditeur de texte.
propItem.txt.txt
Ouvrez-le avec Microsoft visual C++.
Créer une petite icône pour votre arme avec l'extension .dds .
Vérifiez bien que l'image est transparente et de dimension 32x32.
En admettant que votre o3d à ses propres textures en .dds déjà, gardez ces 3 fichiers dans un dossier pour le moment.
Si vous débutez ou n'êtes pas familier avec la procédure, on va renommer le premier Item_WeaSwoAddon.o3d et les 2 fichiers .dds en Item_WeaSwoAddon.o3d. Rappelez-vous du nom que vous leurs attribuez ou si vous suivez le guide, gardez en tête le nom qu'on leurs à donner.
Pour avoir un item en ligne, l'émulateur va lire ces quatres fichiers que je vous ai demandé d'extraire en plus des tables de la database. Je ne suis pas sûr de l'ordre dans lequel il fait ça, mais il va scanner mdlDyna.inc pour trouver le fichier .o3d. "defineItem.h" donne le nom de l'item, "propItem.txt" est à peu près une copie littérale de la table item de la database. Pour ce qui est de "propItem.txt.txt", je ne suis pas tout à fait sûr pour le moment.
Allez dans "defineItem.h" et au milieu du fichier où vous voulez, tapez :
Code:
#define II_WEA_SWO_ADDON 50000
(je rappelle que le "WEA_SWO_ADDON" fait référence au nom de votre fichier créer plus tôt donc vérifier bien que c'est le même !)
Voilà à quoi cela devrait ressembler :
Code:
#define II_WEA_SWO_SHADEVING 71
#define II_WEA_SWO_HOTTER 73
#define II_WEA_SWO_POLICE_CLUB 76
#define II_WEA_SWO_ADDON 50000
#define II_WEA_AXE_RODNEY 81
#define II_WEA_AXE_MORROW 83
#define II_WEA_AXE_CURNING 85
#define II_WEA_AXE_SHYADIN 87
#define II_WEA_AXE_BRONZE 89
#define II_WEA_AXE_GRANG 91
#define II_WEA_AXE_DRONE 93
#define II_WEA_AXE_PROEM 95
#define II_WEA_AXE_CORIN 97
#define II_WEA_AXE_CROW 99
Rappellez-vous bien de 50000, cela correspond à l'ID de l'item quand vous voudrez le spawn dans le jeu !
Ensuite, ouvrez mdlDyna.inc avec Visual C++. N'importe où près de "Weapon", tapez:
Code:
"WeaSwoAddon" II_WEA_SWO_ADDON MODELTYPE_MESH "" 0 MD_NEAR 0 1.0f 0 1 ATEX_NONE 1
Maintenant ça va un peu se corsé. Ouvrez propItem.txt.
Avant toute chose vous devez regarder votre table d'item dans votre database. Pour gagner du temps, choisissez une épée si vous faite une épée comme ce guide pour modèle. Disons qu'on prend une Épée sanguinaire (Bloody Sword).
Voilà maintenant l'étape qui est complexe : vous devez apprendre la signification de chaque colonne.
Code:
flyff_version
id
name
number
packMax
type1
type2
type3
job
permanence
useable
gender
price
endurance
abrasion
maxRepair
handed
flag
parts
partsub
partfile
exclusive
basePartsIgnore
itemLVL
itemRare
shopAble
log
charged
linkKindBullet
linkKind
abilityMin
abilityMax
itemType
itemEAtk
parry
blockRating
addSkillMin
addSkillMax
atkStyle
weaponType
itemAtkOrder1
itemAtkOrder2
itemAtkOrder3
itemAtkOrder4
continuousPain
shellQuantity
recoil
loadingTime
AdjHitRate
atkSpeed
dmgShift
atkRange
probability
destParam1
destParam2
destParam3
adjParamValue1
adjParamValue2
adjParamValue3
chgParamValue1
chgParamValue2
chgParamValue3
destData1
destData2
destData3
activeSkill
activeSkillLvl
activeSkillPer
reqMP
reqFP
reqDisLVL
reSkill1
reSkillLVL1
reSkill2
reSkillLVL2
skillReadyType
skillReady
skillRange
sfxElemental
sfxObj
sfxObj2
sfxObj3
sfxObj4
sfxObj5
useMotion
circleTime
skillTime
exeTarget
useChance
spellRegion
spellType
referStat1
referStat2
referTarget1
referTarget2
referValue1
referValue2
skillType
resist_electricity
resist_fire
resist_wind
resist_water
resist_earth
evilDoing
expertLVL
expertMax
subDefine
exp
comboStyle
flightSpeed
flightLRAngle
flightTBAngle
flightLimit
fFuelReMax
aFuelReMax
fuelRe
limitLevel1
reflect
sndAttack1
sndAttack2
iconPath
questID
textFile
comment
Vous voyez à quel point choisir un autre item de la même catégorie comme modèle vous fait gagnez du temps ?
Une fois que vous aurez appris la signification de chaque colonne, il vous suffira de recopier littéralement ce qui se trouve dans votre SQL dans le fichier propItem.txt. L'affichage sera légèrement différent: à la place des (Null) et -1, vous aurez des =. Si l'arme à des dégâts additionnels aux coups critiques, il dira DST_CRITICAL_BONUS. Voici une liste des skills dont vous aurez besoin si vous voulez ajouter des bonus à adjParamValue1-3 (selon le niveau d'amélioration de l'arme) :
Code:
1 STR
2 DEX
3 INT
4 STA
5 YoYo DMG
6 Bow DMG
7 Chr Range
8 Block Range
9 Chr Chancecritical
10 Chr Bleeding
11 Speed
12 Ability min
13 Ability Max
14 Block Meele
15 Master Earth
16 Stop Movement
17 Mastery Fire
18 Mastery Warter
19 Mastery Electricity
20 Mastery Wind
21 Knuckle DMG
22 PVP DMG Rate
24 Attackspeed
25 Sword DMG
26 Adjdef
27 Resist Magic
28 Resist Electriicity
29 Reflect Damage
30 Resist Fire
31 Resist Wind
33 Resist Earth
34 Axe DMG
35 HP Max
36 MP Max
37 FP Max
38 HP
39 MP
40 FP
41 HP Recovery
42 MP Recovery
43 FP Recovery
44 Kill HP
45 Kill MP
46 Kill FP
47 Adj Hitrate
49 Clearbuff
50 Chr StealHP Immunity
51 Attackspeed Rate
52 HP Max Rate
53 MP Max Rate
54 FP Max Rate
55 Chr Weaeatkchange
56 Chr StealHP
57 Chr Chancestun
58 AutoHP
59 Chr ChanceDark
60 CHR ChancePosion
61 Immunity
62 Addmagic
63 Chr DMG
64 Chr State
65 Parry
66 Atkpower Rate
67 Experience
68 Jumping
69 Chr ChancestealHP
70 Chr Chancebleeding
71 Recovery Exp
72 Adjdef Rate
73 MP Dec Rate
74 FP Dec Rate
75 Spell Rate
76 Cast Critical Rate
77 Critical Bonus
78 Skill Level
79 Monster DMG
80 PVP DMG
81 Melee StealHP
82 Heal
83 AtkPower
85 OneHandMastery DMG
86 TwoHandMastery DMG
87 YoYoMastery DMG
88 BowMastery DMG
89 KnuckleMaster DMG
90 HawkeyeRate
91 Resist Magic Rate
92 Giftbox
Une fois que vous en aurez fini avec ce gros morceau, allez dans propItem.txt.txt et ajoutez :
Code:
IDS_PROPITEM_TXT_090000 Addon Weapon
IDS_PROPITEM_TXT_090001 Weapon that was added for testing.
Vérifiez bien que votre table est complète ainsi que vos 4 fichiers puis recompilez-les et ajouter data.res, datasub2.res, o3d dans le dossier Model, textures dans les dossiers Texture, TextureMid & TextureLow ainsi que l'icône dans le dossier Icon et vous devriez être en mesure de vous connecté et obtenir l'item dans votre inventaire avec son ID.
Soyez bien conscient que ce n'est pas une mince affaire mais ce n'est pas impossible.
AJOUTER DES ITEMS VENANT D'AUTRES VERSIONS
Alors c'est beaucoup plus simple là. Comme pour la première méthode, vous ouvrez les 4 fichiers grâce à Flyff Resource Manager. Obtenez les data.res et dataSub2.res du client que d'où vous voulez transférer les objets. Faites l'extraction des 4 même fichiers que précédemment.
Si vous voulez ajouter une épée sanguinaire à un serveur v6, il vous faudra copier les parties suivantes de chaque fichier :
defineItem.h
Code:
#define II_WEA_SWO_BLOODY 22354
mdlDyna.inc
Code:
"WeaSwoBloody" II_WEA_SWO_BLOODY MODELTYPE_MESH "" 0 MD_NEAR 0 1.0f 0 1 ATEX_NONE 1
propItem.txt
Code:
7 II_WEA_SWO_BLOODY IDS_PROPITEM_TXT_007515 1 1 IK1_WEAPON IK2_WEAPON_DIRECT IK3_SWD JOB_MERCENARY TRUE = = 500000 7200000 100 180 HD_ONE = PARTS_RWEAPON = 0 = = 110 200 = 1 = = = 338 340 _NONE 0 0 0 0 0 = WT_MELEE_SWD AS_HORIZONTAL AS_DIAGONAL AS_VERTICAL AS_THRUST = = = = = 0.085 = AR_SHORT = DST_CRITICAL_BONUS DST_CHR_CHANCECRITICAL DST_ATTACKSPEED 40 20 300 = = = = = = = = = = = = = = = = = = = = = = XI_HIT_SWORD01 = = = = = = = = = WEAPON_UNIQUE = II_WEA_SWO_BLOODYUM = 10000 = = 0 0 0 0 0 0 = = = = = = = = = = = = 120 = SND_PC_DMGSWDM SND_PC_DMGSWDC """Itm_WeaSwoBloody.dds""" 0 """""" IDS_PROPITEM_TXT_007516
propItem.txt.txt
Code:
IDS_PROPITEM_TXT_007515 Bloody Sword
IDS_PROPITEM_TXT_007516
Copier ces lignes depuis les nouveaux data.res et dataSub2.res aux votres, puis recompiler vos fichiers. A nouveau, vous devrez convertir les informations de propItem.txt dans la database, ce qui devrait prendre 10 minutes si vous suivez attentivement et que vous comprenez comment les uns s'intègrent avec les autres.
Les dernières étapes(déplacement des fichiers dans les bons dossiers) sont identiques avec celles de la première méthode, et vous devriez avoir une épée sanguinaire dans votre serveur v6. La méthode est valable aussi pour les armes v14 sur un serveur v6 à v13.
Bon courage pour ajouter de nouveaux items, mobs, capes, etc.
Remerciements :
Je n'ai pas fait ce tuto, me suis simplement occupé de la traduction pour qu'elle soit la plus fidèle et claire possible. L'intégralité des honneurs va à DazHaruhi de RaGEZONE.
_________________
Aujourd'hui on va voir comment faire pour ajouter de nouveaux items (équipements, premiums, customs, etc...) à votre serveur.
Ce guide est très détaillé, n'est pas très simple à faire et n'est pas le meilleur ami de votre database (bien que je l'ai testé !), donc lisez bien attentivement.
En admettant que vous ayez un serveur en état de marche, il vous faudra:
* data.res
* dataSub2.res
* SQL Database
* Microsoft Visual C++
* Notepad/ConTEXT/Word/etc.
* Flyff Resource Manager
L'émulateur que vous utilisez ne joue pas (je crois), cela marche de la même manière ou est très ressemblant.
AJOUTER DE TOUT NOUVEAU ITEMS
Note: Cette partie est basée sur l'ajout d'une épée Job 1 (mercenaire/blade).
Imaginons que vous venez de créer une arme, ou trouver une arme stylé sur le net et vous voulez l'ajouter à votre serveur pour le personnalisé un peu et faire plaisir à vos joueurs. Voici comment on fait !
Première étape, ouvrir Flyff Resource Manager et extraire "defineItem.h", qui se trouve dans votre dossier "V15_files". Faite de même avec mdlDyna.inc (dans le data.res) et propItem.txt et propItem.txt.txt (oui ce n'est pas une erreur) de dataSub2.res.
Mettez-les à un endroit où vous ne les oublieraient pas !
defineItem.h
Ouvrez-le avec un éditeur de texte( Bloc-notes, Wordpad, etc...)
mdlDyna.inc
Ouvrez-le avec Microsoft visual C++.
propItem.txt
Ouvrez-le avec un éditeur de texte.
propItem.txt.txt
Ouvrez-le avec Microsoft visual C++.
Créer une petite icône pour votre arme avec l'extension .dds .
Vérifiez bien que l'image est transparente et de dimension 32x32.
En admettant que votre o3d à ses propres textures en .dds déjà, gardez ces 3 fichiers dans un dossier pour le moment.
Si vous débutez ou n'êtes pas familier avec la procédure, on va renommer le premier Item_WeaSwoAddon.o3d et les 2 fichiers .dds en Item_WeaSwoAddon.o3d. Rappelez-vous du nom que vous leurs attribuez ou si vous suivez le guide, gardez en tête le nom qu'on leurs à donner.
Pour avoir un item en ligne, l'émulateur va lire ces quatres fichiers que je vous ai demandé d'extraire en plus des tables de la database. Je ne suis pas sûr de l'ordre dans lequel il fait ça, mais il va scanner mdlDyna.inc pour trouver le fichier .o3d. "defineItem.h" donne le nom de l'item, "propItem.txt" est à peu près une copie littérale de la table item de la database. Pour ce qui est de "propItem.txt.txt", je ne suis pas tout à fait sûr pour le moment.
Allez dans "defineItem.h" et au milieu du fichier où vous voulez, tapez :
Code:
#define II_WEA_SWO_ADDON 50000
(je rappelle que le "WEA_SWO_ADDON" fait référence au nom de votre fichier créer plus tôt donc vérifier bien que c'est le même !)
Voilà à quoi cela devrait ressembler :
Code:
#define II_WEA_SWO_SHADEVING 71
#define II_WEA_SWO_HOTTER 73
#define II_WEA_SWO_POLICE_CLUB 76
#define II_WEA_SWO_ADDON 50000
#define II_WEA_AXE_RODNEY 81
#define II_WEA_AXE_MORROW 83
#define II_WEA_AXE_CURNING 85
#define II_WEA_AXE_SHYADIN 87
#define II_WEA_AXE_BRONZE 89
#define II_WEA_AXE_GRANG 91
#define II_WEA_AXE_DRONE 93
#define II_WEA_AXE_PROEM 95
#define II_WEA_AXE_CORIN 97
#define II_WEA_AXE_CROW 99
Rappellez-vous bien de 50000, cela correspond à l'ID de l'item quand vous voudrez le spawn dans le jeu !
Ensuite, ouvrez mdlDyna.inc avec Visual C++. N'importe où près de "Weapon", tapez:
Code:
"WeaSwoAddon" II_WEA_SWO_ADDON MODELTYPE_MESH "" 0 MD_NEAR 0 1.0f 0 1 ATEX_NONE 1
Maintenant ça va un peu se corsé. Ouvrez propItem.txt.
Avant toute chose vous devez regarder votre table d'item dans votre database. Pour gagner du temps, choisissez une épée si vous faite une épée comme ce guide pour modèle. Disons qu'on prend une Épée sanguinaire (Bloody Sword).
Voilà maintenant l'étape qui est complexe : vous devez apprendre la signification de chaque colonne.
Code:
flyff_version
id
name
number
packMax
type1
type2
type3
job
permanence
useable
gender
price
endurance
abrasion
maxRepair
handed
flag
parts
partsub
partfile
exclusive
basePartsIgnore
itemLVL
itemRare
shopAble
log
charged
linkKindBullet
linkKind
abilityMin
abilityMax
itemType
itemEAtk
parry
blockRating
addSkillMin
addSkillMax
atkStyle
weaponType
itemAtkOrder1
itemAtkOrder2
itemAtkOrder3
itemAtkOrder4
continuousPain
shellQuantity
recoil
loadingTime
AdjHitRate
atkSpeed
dmgShift
atkRange
probability
destParam1
destParam2
destParam3
adjParamValue1
adjParamValue2
adjParamValue3
chgParamValue1
chgParamValue2
chgParamValue3
destData1
destData2
destData3
activeSkill
activeSkillLvl
activeSkillPer
reqMP
reqFP
reqDisLVL
reSkill1
reSkillLVL1
reSkill2
reSkillLVL2
skillReadyType
skillReady
skillRange
sfxElemental
sfxObj
sfxObj2
sfxObj3
sfxObj4
sfxObj5
useMotion
circleTime
skillTime
exeTarget
useChance
spellRegion
spellType
referStat1
referStat2
referTarget1
referTarget2
referValue1
referValue2
skillType
resist_electricity
resist_fire
resist_wind
resist_water
resist_earth
evilDoing
expertLVL
expertMax
subDefine
exp
comboStyle
flightSpeed
flightLRAngle
flightTBAngle
flightLimit
fFuelReMax
aFuelReMax
fuelRe
limitLevel1
reflect
sndAttack1
sndAttack2
iconPath
questID
textFile
comment
Vous voyez à quel point choisir un autre item de la même catégorie comme modèle vous fait gagnez du temps ?
Une fois que vous aurez appris la signification de chaque colonne, il vous suffira de recopier littéralement ce qui se trouve dans votre SQL dans le fichier propItem.txt. L'affichage sera légèrement différent: à la place des (Null) et -1, vous aurez des =. Si l'arme à des dégâts additionnels aux coups critiques, il dira DST_CRITICAL_BONUS. Voici une liste des skills dont vous aurez besoin si vous voulez ajouter des bonus à adjParamValue1-3 (selon le niveau d'amélioration de l'arme) :
Code:
1 STR
2 DEX
3 INT
4 STA
5 YoYo DMG
6 Bow DMG
7 Chr Range
8 Block Range
9 Chr Chancecritical
10 Chr Bleeding
11 Speed
12 Ability min
13 Ability Max
14 Block Meele
15 Master Earth
16 Stop Movement
17 Mastery Fire
18 Mastery Warter
19 Mastery Electricity
20 Mastery Wind
21 Knuckle DMG
22 PVP DMG Rate
24 Attackspeed
25 Sword DMG
26 Adjdef
27 Resist Magic
28 Resist Electriicity
29 Reflect Damage
30 Resist Fire
31 Resist Wind
33 Resist Earth
34 Axe DMG
35 HP Max
36 MP Max
37 FP Max
38 HP
39 MP
40 FP
41 HP Recovery
42 MP Recovery
43 FP Recovery
44 Kill HP
45 Kill MP
46 Kill FP
47 Adj Hitrate
49 Clearbuff
50 Chr StealHP Immunity
51 Attackspeed Rate
52 HP Max Rate
53 MP Max Rate
54 FP Max Rate
55 Chr Weaeatkchange
56 Chr StealHP
57 Chr Chancestun
58 AutoHP
59 Chr ChanceDark
60 CHR ChancePosion
61 Immunity
62 Addmagic
63 Chr DMG
64 Chr State
65 Parry
66 Atkpower Rate
67 Experience
68 Jumping
69 Chr ChancestealHP
70 Chr Chancebleeding
71 Recovery Exp
72 Adjdef Rate
73 MP Dec Rate
74 FP Dec Rate
75 Spell Rate
76 Cast Critical Rate
77 Critical Bonus
78 Skill Level
79 Monster DMG
80 PVP DMG
81 Melee StealHP
82 Heal
83 AtkPower
85 OneHandMastery DMG
86 TwoHandMastery DMG
87 YoYoMastery DMG
88 BowMastery DMG
89 KnuckleMaster DMG
90 HawkeyeRate
91 Resist Magic Rate
92 Giftbox
Une fois que vous en aurez fini avec ce gros morceau, allez dans propItem.txt.txt et ajoutez :
Code:
IDS_PROPITEM_TXT_090000 Addon Weapon
IDS_PROPITEM_TXT_090001 Weapon that was added for testing.
Vérifiez bien que votre table est complète ainsi que vos 4 fichiers puis recompilez-les et ajouter data.res, datasub2.res, o3d dans le dossier Model, textures dans les dossiers Texture, TextureMid & TextureLow ainsi que l'icône dans le dossier Icon et vous devriez être en mesure de vous connecté et obtenir l'item dans votre inventaire avec son ID.
Soyez bien conscient que ce n'est pas une mince affaire mais ce n'est pas impossible.
AJOUTER DES ITEMS VENANT D'AUTRES VERSIONS
Alors c'est beaucoup plus simple là. Comme pour la première méthode, vous ouvrez les 4 fichiers grâce à Flyff Resource Manager. Obtenez les data.res et dataSub2.res du client que d'où vous voulez transférer les objets. Faites l'extraction des 4 même fichiers que précédemment.
Si vous voulez ajouter une épée sanguinaire à un serveur v6, il vous faudra copier les parties suivantes de chaque fichier :
defineItem.h
Code:
#define II_WEA_SWO_BLOODY 22354
mdlDyna.inc
Code:
"WeaSwoBloody" II_WEA_SWO_BLOODY MODELTYPE_MESH "" 0 MD_NEAR 0 1.0f 0 1 ATEX_NONE 1
propItem.txt
Code:
7 II_WEA_SWO_BLOODY IDS_PROPITEM_TXT_007515 1 1 IK1_WEAPON IK2_WEAPON_DIRECT IK3_SWD JOB_MERCENARY TRUE = = 500000 7200000 100 180 HD_ONE = PARTS_RWEAPON = 0 = = 110 200 = 1 = = = 338 340 _NONE 0 0 0 0 0 = WT_MELEE_SWD AS_HORIZONTAL AS_DIAGONAL AS_VERTICAL AS_THRUST = = = = = 0.085 = AR_SHORT = DST_CRITICAL_BONUS DST_CHR_CHANCECRITICAL DST_ATTACKSPEED 40 20 300 = = = = = = = = = = = = = = = = = = = = = = XI_HIT_SWORD01 = = = = = = = = = WEAPON_UNIQUE = II_WEA_SWO_BLOODYUM = 10000 = = 0 0 0 0 0 0 = = = = = = = = = = = = 120 = SND_PC_DMGSWDM SND_PC_DMGSWDC """Itm_WeaSwoBloody.dds""" 0 """""" IDS_PROPITEM_TXT_007516
propItem.txt.txt
Code:
IDS_PROPITEM_TXT_007515 Bloody Sword
IDS_PROPITEM_TXT_007516
Copier ces lignes depuis les nouveaux data.res et dataSub2.res aux votres, puis recompiler vos fichiers. A nouveau, vous devrez convertir les informations de propItem.txt dans la database, ce qui devrait prendre 10 minutes si vous suivez attentivement et que vous comprenez comment les uns s'intègrent avec les autres.
Les dernières étapes(déplacement des fichiers dans les bons dossiers) sont identiques avec celles de la première méthode, et vous devriez avoir une épée sanguinaire dans votre serveur v6. La méthode est valable aussi pour les armes v14 sur un serveur v6 à v13.
Bon courage pour ajouter de nouveaux items, mobs, capes, etc.
Remerciements :
Je n'ai pas fait ce tuto, me suis simplement occupé de la traduction pour qu'elle soit la plus fidèle et claire possible. L'intégralité des honneurs va à DazHaruhi de RaGEZONE.
_________________