Affichage des résultats 1 à 8 sur 8

Discussion: [KIT] Comment coder la variable "Autorisation d'objets" d'un nouveau kit ?

  1. #1
    Date d'inscription
    April 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    4 649

    [KIT] Comment coder la variable "Autorisation d'objets" d'un nouveau kit ?

    Je suis en train de finaliser deux kits pour mon mod ; le Chevalier de Diamant et la Chevaucheuse de Licorne.

    Il me reste deux trois sorts à terminer, les fichiers 2da sont terminés, mais je bute sur la définition de cette variable à inclure au fichier KITLIST.2DA.

    Je me suis amusé à vérifier à quoi elle correspondait et c'est un peu le souk !
    Par exemple, celle du cavalier renvoie le code Neutre !

    Bref, pour mes deux kits de paladins, quelle valeur dois-je utiliser ?

    Je suppose que c'est lié aux objets qu'ils peuvent utiliser, mais je ne pige pas le truc.
    CARPE DIEM...
    Co-modérateur de La Forge et de La Chambre des Scribes
    Moddeur qui s'arrache les cheveux...

  2. #2
    Date d'inscription
    July 2003
    Localisation
    Plaisir
    Messages 
    6 833
    En réalité la valeur de KitList.2da indique plutôt les interdictions d'utilisation et ne correspond absolument pas aux bits que l'on met dans les objets pour indiquer qui a le droit de s'en servir (qui couvre classes et alignements, notamment). Chaque bit est associé à une classe ou un kit (pas d'alignement) et renvoie à une liste d'interdits qui découle sans doute du contenu de WEAPROF.2DA. Cela joue aussi sur le choix de compétence offert à la montée de niveau.

    Comme indiqué dans le tutoriel de création de kit, cette colonne permet de définir ce qui est interdit au kit. Chaque bit de la valeur correspond à une classe ou à un kit disponible dans BG II. Il y a une valeur particulière qui permet de reprendre à l'identique les interdits de la classe mère du kit. La seule alternative est d'adopter les interdits d'une classe ou d'un kit existant. Pour les masochistes, on peut aussi cumuler les interdits de plusieurs classes/kits.
    Peu disponible
    Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
    Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !

  3. #3
    Date d'inscription
    December 2007
    Localisation
    GAP, Hautes alpes
    Messages 
    2 033
    Freddy, dis moi ce que tu voudrais précisément comme interdiction d'équipement et je te dirais si c'est possible et/ou comment le faire/le contourner.
    Traduction d'Afaaq terminée. Reste à faire : relecture.

  4. #4
    Date d'inscription
    April 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    4 649
    J'ai fini par déchiffrer les codes hex donnés dans la kittable : ils correspondent à la seconde série des usability codes des fichiers itm.

    Mon problème consiste à en définir de nouveaux pour mes 2 kits.

    Exemple pour le Chevalier de Diamant :

    - Il ne peut porter que des armures de plates et des écus.
    - Il considère comme contraire à l'honneur de se battre à distance et refuse d'utiliser des armes de trait, excepté les haches et les marteaux de jet.
    - Il ne peut pas combattre dans le style de combat à deux armes.

    Code:
    ADD_KIT ~GW_DIAMNOND_KNIGHT~
    
    // pas d'épée courte, pas d'arc, pas de dagues
    
    ~GW_DIAMOND_KNIGHT       0           1           1           1           0           1           1           1~	// Types d'armes autorisés - CLASWEAP
    
    ~GW_DIAMOND_KNIGHT       5 0 0 5 5 5 5 0 5 5 0 5 5 5 2 0 5 0 5 0 0 0 0 0 0 0 0 0 2 2 2 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5~	// Compétences autorisées - WEAPPROF.2da
    
    // LARGE_SWORD 5	SMALL_SWORD	0	BOW	0	SPEAR 5	BLUNT 5	SPIKED 5	AXE 5 	MISSILE 0	
    // BASTARDSWORD 5	LONGSWORD 5			SHORTSWORD 0	AXE 5			TWOHANDEDSWORD 5	KATANA 5	SCIMITARWAKISASHININJATO 2	DAGGER 0	WARHAMMER 5	CLUB 0	SPEAR 5
    // HALBERD 0		FLAILMORNINGSTAR 0	MACE 0	QUARTERSTAFF 0	CROSSBOW 0	LONGBOW 0	SHORTBOW 0	DART 0	SLING 0
    // 2HANDED 2		SWORDANDSHIELD 2	SINGLEWEAPON 2	 2WEAPON 0

    Quand à la chevaucheuse, en gros, comme elle est sensée monter une licorne, elle ne peut pas porter d'armures plus lourdes que la cotte de mailles et possède à peu près les mêmes restrictions que les cavaliers, mais peut utiliser l'arc.
    Désolé pour ses caractéristiques exactes, mais je ne les ai pas sur moi en ce moment.
    CARPE DIEM...
    Co-modérateur de La Forge et de La Chambre des Scribes
    Moddeur qui s'arrache les cheveux...

  5. #5
    Date d'inscription
    December 2007
    Localisation
    GAP, Hautes alpes
    Messages 
    2 033
    Alors :
    - Il ne peut porter que des armures de plates et des écus.
    Il n'y a aucun code qui permette ça, mais tu peux tricher : tu peux par exemple patcher toutes les armures "de plates" (il faudra les patcher en fonction de l'animation, voir le code pour patcher "tous les katanas" dans le TP2 du chantelame v6)
    pour qu'elle puisse être utlisée par le métamophe, et tu donnes le code du métamorphe en plus de tous les autres à ton chevalier. Astuce : toutes les armures sont interdites au métamophes ET les armures de plates sont interdites au druide. En faisant comme indiqué il ne pourra porter aucune armure (parce que codé métamorphe) sauf les plates parce qu'elles sont patchée pour. Et l'armure de plate ne pourra de toute façon par être utilisée par le métamorphe parce qu'elle reste interdite aux druides.(et ton chevalier reste un guerrier ou paladin)
    Même méthode pour les bouclier : rendre interdit au métamorphe tout ce qui est petit bouclier, rondache, targe, etc.... (par défaut il sont autorisés), en les patchant. Comme ton chevalier à aussi le code du métamorphe, il lui restra l'acés à tout ce que tu n’auras pas patcher.
    Astuce de compatibilité : le chantelame v6 utilise lui même le code du métamorphe. En faisant cela tu lui autorisera les armures de plates, et je ne vois pas comment faire autrement (le métamophe et le kensai sont les seul kits interdisant les armures légères, si on excepte les mage spécialisés (mais ceux là on ne peut pas les utiliser car on ne peut rien interdire à un mage spécialisé qui peut se jumeler ou multiclasser en voleur/guerrier/prêtre).

    - Il considère comme contraire à l'honneur de se battre à distance et refuse d'utiliser des armes de trait, excepté les haches et les marteaux de jet.
    Ça c'est plus compliqué. Pas faisable par code non plus, mais en cherchant bien on se rend compte que le cavalier n'a à en théorie accès à aucune arme de jet sauf qu'il peut utiliser les haches de jet et les dagues de jet. Si tu veux bien que ton chevalier puisse utiliser les dagues de jets, code du cavalier et s'est fini. Sinon, même technique : code du cavalier+code du prêtre de Helm et patchage de toutes les dagues de jet (méthode empirique à adapter avec tous les mods rajoutant des dagues) pour être inutilisable par les prêtres de helm (elle ne le sont pas par défaut mais elle restent interdites au prêtre )

    - Il ne peut pas combattre dans le style de combat à deux armes.
    Trés facile, et tu l'as déjà fait, c'est effectivement le 0 après les trois 2 et avant la série de 5 dans la ligne correspondant au WEAPPROF.2da. Il peut utiliser deux armes, mais il aura un tel malus que ça ne vaut franchement pas le coup.
    [/QUOTE]
    Traduction d'Afaaq terminée. Reste à faire : relecture.

  6. #6
    Date d'inscription
    April 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    4 649
    Merci pour ce retour.

    Donc si j'ai bien compris, le but du jeu est d'additionner deux codes de kits déjà existants en choisissant ceux qui se rapportent aux interdictions que j'ai définies, puis de patcher les objets concernés.
    Ça va donc m'imposer de coder l'installation en deux parties : le mod proprement dit, puis les kits à installer en dernier en cas de Big Install pour prendre en compte les objets des autres mods.
    Comme j'ai prévu des scripts particuliers pour certains créatures, j'avais déjà imaginé une installation similaire pour ceux qui veulent installer SCS ou BP. Comme ça, mes scripts ne seraient pas concernés par l'IA général. Il me suffira de rajouter les kits à ce moment.


    Je travaillerai les codes d'interdiction ce week-end et te tiendrai informé.
    CARPE DIEM...
    Co-modérateur de La Forge et de La Chambre des Scribes
    Moddeur qui s'arrache les cheveux...

  7. #7
    Date d'inscription
    April 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    4 649
    Voici ce que ça donne :

    Modification des objets à installer APRES les autres mods :

    Code:
    COPY_EXISTING_REGEXP GLOB ~^.+\.itm$~ ~override~
    	PATCH_IF (SOURCE_SIZE > 0x71) BEGIN
    		READ_ASCII 0x22 animation (2)
    
    		PATCH_IF ("%animation%" STRING_EQUAL_CASE "4A") BEGIN	// Plates
    			WRITE_BYTE 0x29 THIS BAND 0b11101111		// ajoute Métamorphe
    		END
    
    		PATCH_IF (SHORT_AT 0x1c == 0x0C) BEGIN	// Boucliers
    
    			PATCH_IF ("%animation%" STRING_COMPARE_CASE "D3") AND ("%animation%" STRING_COMPARE_CASE "C1") AND ("%animation%" STRING_COMPARE_CASE "C3") 
    					AND ("%animation%" STRING_COMPARE_CASE "C5") AND ("%animation%" STRING_COMPARE_CASE "C7") BEGIN
    //	D3-Shield (Medium) - C3-Shield 2 (Medium) - C1-Shield 2 (Large) - C5-Shield 3 (Small) - C7-Scale Shield
    //	D2-Shield (Small)	C0-Shield 2 (Small)	D1-Buckler	C4-Shield 2 (Buckler)	D4-Shield (Large)	C2-Shield 3 (Large)	C6-Shield 4 (Large)
    				WRITE_BYTE 0x29 THIS | BIT4		// enlève Métamorphe
    			END
    
    		END
    
    		PATCH_IF (SHORT_AT 0x1c == 0x10) BEGIN	// Dagues
    			READ_LONG   0x64 "abil_off"
    			READ_SHORT  0x68 "abil_num"
    			FOR (i = 0 ; i < abil_num ; i = i + 1) BEGIN
    				READ_BYTE  ("%abil_off%" + (0x38 * i)) "type"
    				PATCH_IF (type = 2) BEGIN
    				WRITE_BYTE 0x29 THIS | BIT1		// enlève Prêtre de Helm
    				
    				END
    			END
    		END
    	END // Source
    BUT_ONLY
    Ce qui donne la ligne :

    Code:
    ~0x12000008     6~	// Autorisation d'objets - KITLIST.2DA	0x12000008 = Cavalier + Shapshifter + Prêtre de Helm
    Ne restera plus qu'à tester quand les autres divers problèmes auront été résolus !
    CARPE DIEM...
    Co-modérateur de La Forge et de La Chambre des Scribes
    Moddeur qui s'arrache les cheveux...

  8. #8
    Date d'inscription
    April 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    4 649
    J'exhume ce fil pour confirmer que tout fonctionne parfaitement bien. J'ai même réussi à autoriser ma chevaucheuse à utiliser les arcs SAUF les arcs composites et à porter des cottes de mailles elfiques MAIS PAS de cottes de mailles classiques.

    Mais plus fort et plus facile : pour tous ceux qui voudraient moder avec les versions EE, c'est beaucoup plus simple et on n'est plus obligé de bidouiller les codes d'interdiction. Il suffit de patcher les objets concernés avec le nouvel effet #319 en utilisant la valeur du kit pour le paramètre 1 et 9 pour le paramètre 2.

    #319 (0x13F) Usability: Item Usability
    Parameter #1: IDS Entry
    Parameter #2: IDS File
    Special: Description note
    Description:
    This effect restricts the item to creature(s) matching the object identifiers. The string to display when an invalid creature attempts to use the item is held in 0x2c.
    Known values for 'IDS File' are:
    2 EA.ids
    3 General.ids
    4 Race.ids
    5 Class.ids
    6 Specific.ids
    7 Gender.ids
    8 Align.ids
    9 Kit.ids
    10 Actor's name
    11 Actor's scripting name (8 maximum in resource field)
    If 'IDS File' is set to 10, the item is restricted to characters with the name specified by the strref held in parameter1.
    If 'IDS File' is set to 11, the item is restricted to characters with the death variable specified by the resource field.

    The message defined in 'Description note' will be displayed whenever this effect is triggered.
    Ce qui donne pour les armures légères :

    Code:
    COPY_EXISTING_REGEXP GLOB ~^.+\.itm$~ ~override~
       PATCH_IF (SOURCE_SIZE > 0x71) BEGIN
          READ_BYTE 0x18 flags1
          PATCH_IF ((flags1 & BIT3) = BIT3) BEGIN					// Movable, otherwise useless.
    	   READ_BYTE	0x29 kit_usability1
    	   READ_BYTE	0x2b kit_usability2
    	   READ_ASCII	0x22 animation (2)
    	   READ_BYTE	0x31 item_prof						// Weapon Proficiency
    
    // Armure de cuir, Besantine et Cuirasse (Leather, Studded, Hide) : Chevalier de Diamant can't wear them.
    // ------------------------------------------------------------------------------------------------------
    	   PATCH_IF ("%animation%" STRING_EQUAL_CASE "2A") BEGIN		// 2A = Animations des armures de cuir
    
    		PATCH_IF GW_EE BEGIN						// GW_EE = variable définie auparavant indiquant que le jeu est EE
    
    		   LPF ~GW_ITEM_RESTRICT_USABILITY_BGEE~ STR_VAR GW_restrict = "GW_DIAMOND_KNIGHT" GW_kind = "KIT" GW_mess319 = 7700002 END // @7700002 = ~Chevalier de Diamant~
    
    		END ELSE BEGIN							// Sinon, ce n'est pas une version EE
    
    		   PATCH_IF ((kit_usability1 & BIT4) = 0) BEGIN			// CD : if usable by shapeshifters
    
    		      WRITE_BYTE 0x29 THIS | BIT4					// remove shapeshifters flag
    
    		   END
    		END
    	   END
    ...
    avec la fonction GW_ITEM_RESTRICT_USABILITY_BGEE définie avant de lancer la procédure pour éviter d'aller chercher la valeur du kit.

    Code:
    /* =============================================================================================================== *
     * FONCTION GW_ITEM_RESTRICT_USABILITY_BGEE : INTERDIT l'UTILISATION d'UN OBJET à un type de créature dans BG2EE.  *
     * --------------------------------------------------------------------------------------------------------------- *
     * #319 Usability: Item Usability : This effect restricts the item to creature(s) matching the object identifiers. *
     * The string to display in the description note is held in 0x2c.                                                  *
     * =============================================================================================================== */
    
    DEFINE_PATCH_FUNCTION ~GW_ITEM_RESTRICT_USABILITY_BGEE~ 
    	STR_VAR GW_restrict = ""	// HUMAN, MALE, CAVALIER... Or string defining Actor's name, or scripting name (8 maximum length).
    		GW_kind		= ""	// IDS file : EA, General, Race, class, Specific, Gender, Align, Kit. OR Name (Actor's name), script_name (Actor's scripting name).
    		GW_mess319	= 0	// Description note (special field)
    BEGIN
    
    	PATCH_IF (ENGINE_IS ~bgee bg2ee eet~) OR GAME_INCLUDES ~sod~ BEGIN
    
    		SET GW_param2 = 0
    		SET GW_special319 = 0
    		SPRINT GW_resource319 ""
    
    		PATCH_IF ("%GW_restrict%" STR_CMP ~~) AND ("%GW_kind%" STR_CMP ~~) BEGIN 
    
    		// IDS files case : EA, General, Race, class, Specific, Gender, Align, Kit.
    		// --------------
    
    			PATCH_IF ("%GW_kind%" STRING_COMPARE_CASE ~NAME~) AND ("%GW_kind%" STRING_COMPARE_CASE ~SCRIPT_NAME~) BEGIN 
    
    				PATCH_IF FILE_EXISTS_IN_GAME ~%GW_kind%.ids~ BEGIN
    
    					SET GW_param1 = IDS_OF_SYMBOL (~%GW_kind%~ ~%GW_restrict%~)
    
    					PATCH_IF (GW_param1 != "-1") BEGIN		// IDS_OF_SYMBOL returns -1 if GW_restrict is not associated in GW_kind.ids.
    
    						PATCH_MATCH ~%GW_kind%~ WITH
    							EA		 BEGIN	SET GW_param2 = 2 END
    							GENERAL	 BEGIN	SET GW_param2 = 3 END
    							RACE	 BEGIN	SET GW_param2 = 4 END
    							CLASS	 BEGIN	SET GW_param2 = 5 END
    							SPECIFIC BEGIN	SET GW_param2 = 6 END
    							GENDER	 BEGIN	SET GW_param2 = 7 END
    							ALIGN	 BEGIN	SET GW_param2 = 8 END
    							KIT		 BEGIN	SET GW_param2 = 9 END
    							DEFAULT
    						END	// of PATCH_MATCH ~%GW_kind%~ WITH
    					END		// of PATCH_IF (GW_param1 != "-1")
    				END			// of PATCH_IF FILE_EXISTS_IN_GAME ~%GW_kind%.ids~
    			END				// of PATCH_IF ("%GW_kind%" STRING_COMPARE_CASE ~NAME~) AND ("%GW_kind%" STRING_COMPARE_CASE ~SCRIPT_NAME~)
    
    		// Actor's name case : If 'IDS File' is set to 10, the item is restricted to characters with the name specified by the strref held in parameter1.
    		// -----------------
    
    			PATCH_IF ("%GW_kind%" STRING_COMPARE_CASE ~NAME~ = 0) BEGIN
    				SET GW_param2 = 10
    				PATCH_IF (STRING_LENGTH "%GW_restrict%" > 6) BEGIN	// La première donnée du fichier tra est @8000001
    					SET GW_param1 = RESOLVE_STR_REF ((AT %GW_restrict%))
    				END ELSE BEGIN						// Sinon, on va chercher la référence dans le fichier dialog.tlk
    					SET GW_param1 = EVAL "%GW_restrict%"
    				END
    			END	// of PATCH_IF ("%GW_kind%" STRING_COMPARE_CASE ~NAME~ = 0)
    
    		// Actor's scripting name case : If 'IDS File' is set to 11, the item is restricted to characters with the death variable specified by the resource field. 
    		// ---------------------------
    
    			PATCH_IF ("%GW_kind%" STRING_COMPARE_CASE ~SCRIPT_NAME~ = 0) BEGIN
    				SET GW_param1 = 0
    				PATCH_IF (STRING_LENGTH "%GW_restrict%" < 9) BEGIN	// 8 caracters maximum in resource field
    					SPRINT GW_resource319 EVAL "%GW_restrict%"
    					SET GW_param2 = 11
    				END
    			END	// of PATCH_IF ("%GW_kind%" STRING_COMPARE_CASE ~SCRIPT_NAME~ = 0)
    
    			// Description note.
    			// -----------------
    
    			PATCH_IF (STRING_LENGTH "%GW_mess319%" > 6) BEGIN		// La première donnée du fichier tra est @8000001
    				SET GW_special319 = RESOLVE_STR_REF ((AT %GW_mess319%))
    			END ELSE BEGIN							// Sinon, on va chercher la référence dans le fichier dialog.tlk
    				SET GW_special319 = EVAL "%GW_mess319%"
    			END
    
    			// Adds Effect #319 Usability: Item Usability if needed.
    			// -----------------------------------------------------
    
    			PATCH_IF (GW_param2 > 0) BEGIN
    
    				LPF ~ADD_ITEM_EQEFFECT~ INT_VAR opcode = 319 target = 1 timing = 2 parameter1 = EVAL "%GW_param1%" parameter2 = EVAL "%GW_param2%" special = EVAL "%GW_special319%" STR_VAR resource = EVAL "%GW_resource319%" END
    
    			END	// of PATCH_IF (GW_param2 > 0)
    
    		END		// of PATCH_IF ("%GW_restrict%" STR_CMP ~~) AND ("%GW_kind%" STR_CMP ~~)
    	END	 		// of PATCH_IF (ENGINE_IS ~bgee bg2ee eet~) OR GAME_INCLUDES ~sod~
    END 				// of DEFINE_PATCH_FUNCTION
    Sans cette fonction, il suffit de remplacer dans le premier code

    Code:
    LPF ~GW_ITEM_RESTRICT_USABILITY_BGEE~ STR_VAR GW_restrict = "GW_DIAMOND_KNIGHT" GW_kind = "KIT" GW_mess319 = 7700002 END
    par
    Code:
    LPF ~ADD_ITEM_EQEFFECT~ INT_VAR opcode = 319 target = 1 timing = 2 parameter1 = IDS_OF_SYMBOL (~kit~ ~GW_DIAMOND_KNIGHT~) parameter2 = 9 special = RESOLVE_STR_REF (@7700002) STR_VAR resource = EVAL "%DEST_RES%" END
    Je l'ai définie car je l'utilise pour d'autres manips.
    Dernière modification par Freddy_Gwendo ; 18/06/2017 à 11h28.
    CARPE DIEM...
    Co-modérateur de La Forge et de La Chambre des Scribes
    Moddeur qui s'arrache les cheveux...

Discussions similaires

  1. [ANIM] Comment coder les hallucinations ?
    Par Freddy_Gwendo dans le forum Animations
    Réponses: 3
    Dernier message: 29/06/2014, 22h21
  2. Traduction d'un mod sans autorisation
    Par deratiseur dans le forum La Chambre des Scribes
    Réponses: 6
    Dernier message: 26/04/2008, 20h58
  3. [ITEM] Objets divers, comment les créer ?
    Par __kéké__ dans le forum Le Bazar de l'Aventurier
    Réponses: 11
    Dernier message: 28/02/2006, 12h13
  4. [NWN/SOU] Comment créer des objets magiques
    Par Master-Yip dans le forum L'Académie de Padhiver (NWN 1)
    Réponses: 5
    Dernier message: 27/01/2004, 12h16
  5. [SCRIPT] Comment coder un duel ?
    Par Grenouillebleue dans le forum Scripts
    Réponses: 3
    Dernier message: 28/09/2003, 13h52

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250