Affichage des résultats 1 à 8 sur 8

Discussion: [WeiDU] Comment utiliser la commande REPLACE_TEXTUALLY pour modifier un script ?

  1. #1
    Date d'inscription
    April 2009
    Localisation
    Maztica, vallée de Nexal
    Messages
    156

    [WeiDU] Comment utiliser la commande REPLACE_TEXTUALLY pour modifier un script ?

    Salut la CdC, j'ai un nouveau souci avec mon mod...

    C'est la 1ere fois que j'utilise la commande REPLACE_TEXTUALLY, pour patcher un script ; mais celle-ci ne fonctionne pas.
    Alors que je devrais avoir un remplacement du code entre les premiers "~~" par le code entre les deuxièmes "~~", je n'obtiens rien du tout, le script OBSDEM01.BCS reste inchangé (vérifié avec Near Infinity), et bien sûr ça ne fonctionne pas in-game.
    Je précise que le résultat est le même avec ou sans le "EXACT_MATCH" après "REPLACE_TEXTUALLY".

    Si vous avez des idées, ça m'aiderait énormément...

    Merci beaucoup


    Code:
    COPY_EXISTING ~OBSDEM01.BCS~ ~override~
      DECOMPILE_BCS_TO_BAF
      REPLACE_TEXTUALLY EXACT_MATCH ~IF
    Detect([PC])
    Global("summon","LOCALS",0)
    THEN
    RESPONSE #100
    CreateVisualEffect("SPFLAST2",[1972.1287])
    CreateVisualEffect("SPFLSRIN",[1972.1287])
    CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi
    CreateVisualEffect("SPFLAST2",[1889.1461])
    CreateVisualEffect("SPFLSRIN",[1889.1461])
    CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi
    CreateVisualEffect("SPFLAST2",[2244.1403])
    CreateVisualEffect("SPFLSRIN",[2244.1403])
    CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi
    SetGlobal("summon","LOCALS",1)
    END~
    ~IF
    Detect([PC])
    Global("summon","LOCALS",0)
    THEN
    RESPONSE #100
    CreateVisualEffect("SPFLAST2",[1995.1320])
    CreateVisualEffect("SPFLSRIN",[1995.1320])
    CreateCreature("QQILABY",[1995.1320],0) // Illithid avec cerveau
    CreateVisualEffect("SPFLAST2",[1972.1287])
    CreateVisualEffect("SPFLSRIN",[1972.1287])
    CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi
    CreateVisualEffect("SPFLAST2",[1889.1461])
    CreateVisualEffect("SPFLSRIN",[1889.1461])
    CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi
    CreateVisualEffect("SPFLAST2",[2244.1403])
    CreateVisualEffect("SPFLSRIN",[2244.1403])
    CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi
    SetGlobal("summon","LOCALS",1)
    END~
      COMPILE_BAF_TO_BCS
    Dernière modification par Freddy_Gwendo ; 09/04/2016 à 06h51. Motif: Modification du titre de la discussion

  2. #2
    Date d'inscription
    July 2003
    Localisation
    Plaisir
    Messages
    6 631
    A mon avis, le problème vient du fait que WeiDU décompile les scripts en faisant une mise en forme du script avec une indentation utilisant tabulation ou espaces, comme il le fait quand tu décompiles un script. Du coup, le texte que tu lui dis de chercher ne se trouve pas tel quel dans le script puisqu'il y a ces indentations.
    Je ne sais pas si la perte des indentations est dû au forum, c'est bien possible aussi.

    En tout cas, faute de savoir exactement l'indentation utilisée par WeiDU, il faut utiliser des variables et des expressions régulières. C'est ce que fait le BG2 Fixpack, par exemple ici :
    Code:
    // many dispel magic actions have two missing CheckStatGT triggers in an OR() block
    COPY_EXISTING ~abazdrag.bcs~ ~override~
                  ~amlich02.bcs~ ~override~
                  ~dragbrow.bcs~ ~override~
                  ~finsol04.bcs~ ~override~
                  ~gorgua02.bcs~ ~override~
                  ~meliss01.bcs~ ~override~
                  ~meliss02.bcs~ ~override~
                  ~meliss03.bcs~ ~override~
                  ~planet.bcs~   ~override~
                  ~senbattl.bcs~ ~override~
     DECOMPILE_BCS_TO_BAF
       REPLACE_TEXTUALLY ~CheckStatGT(LastSeenBy(Myself),0,0)[%tab% %lnl%%mnl%%wnl%]+CheckStatGT(LastSeenBy(Myself),0,0)~
                         ~CheckStatGT(LastSeenBy(Myself),0,IMPROVEDHASTE) CheckStatGT(LastSeenBy(Myself),0,STONESKINS)~
                         // triggers for a dispel magic
     COMPILE_BAF_TO_BCS
     BUT_ONLY_IF_IT_CHANGES
    Les variables %tab%, %lnl%, %mnl% et %wnl% sont définies dans la documentation de WeiDU et désigne les caractères tabulation et les sauts de ligne Linux, Mac et Windows. Ainsi WeiDU reconnaîtra n'importe lequel de ces caractères comme faisant partie de la chaine à chercher. Le fait d'avoir des crochets crée un groupe de caractères possibles, qui comprend donc ces quatre plus l'espace qui se trouve entre %tab% et %lnl%.
    Le + signifie qu'il faut chercher un ou plusieurs caractères faisant partie du groupe. C'est documenté dans la documentation WeiDU, partie RegExp.
    En gros, il te faut mettre ça partout où tu avais un saut de ligne dans le texte que tu cherchais.
    Comme ça utilise une expression régulière, il ne faut surtout pas que tu mettes EXACT_MATCH.

    L'absence dans ton cas du BUT_ONLY_IF_IT_CHANGES n'est pas responsable du problème. Mais il vaut mieux le mettre afin d'éviter de réécrire le fichier même si WeiDU n'a pas apporté de modification.
    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
    April 2009
    Localisation
    Maztica, vallée de Nexal
    Messages
    156
    Merci de ta réponse Isaya !!

    Si j'ai bien compris tes explications, au niveau de mon code ça donne :
    Code:
    COPY_EXISTING ~OBSDEM01.BCS~ ~override~
    DECOMPILE_BCS_TO_BAF
    REPLACE_TEXTUALLY EXACT_MATCH ~IF
     Detect([PC])
     Global("summon","LOCALS",0)
    THEN
     RESPONSE #100
      CreateVisualEffect("SPFLAST2",[1972.1287])[%tab% %lnl%%mnl%%wnl%]+
      CreateVisualEffect("SPFLSRIN",[1972.1287])[%tab% %lnl%%mnl%%wnl%]+
      CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+
      CreateVisualEffect("SPFLAST2",[1889.1461])[%tab% %lnl%%mnl%%wnl%]+
      CreateVisualEffect("SPFLSRIN",[1889.1461])[%tab% %lnl%%mnl%%wnl%]+
      CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+
      CreateVisualEffect("SPFLAST2",[2244.1403])[%tab% %lnl%%mnl%%wnl%]+
      CreateVisualEffect("SPFLSRIN",[2244.1403])[%tab% %lnl%%mnl%%wnl%]+
      CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+
      SetGlobal("summon","LOCALS",1)[%tab% %lnl%%mnl%%wnl%]+
    END~
    ~IF
     Detect([PC])
     Global("summon","LOCALS",0)
    THEN
     RESPONSE #100
             CreateVisualEffect("SPFLAST2",[1995.1320])
      CreateVisualEffect("SPFLSRIN",[1995.1320])
      CreateCreature("QQILABY",[1995.1320],0) // Illithid avec cerveau
      CreateVisualEffect("SPFLAST2",[1972.1287])
      CreateVisualEffect("SPFLSRIN",[1972.1287])
      CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi
      CreateVisualEffect("SPFLAST2",[1889.1461])
      CreateVisualEffect("SPFLSRIN",[1889.1461])
      CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi
      CreateVisualEffect("SPFLAST2",[2244.1403])
      CreateVisualEffect("SPFLSRIN",[2244.1403])
      CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi
      SetGlobal("summon","LOCALS",1)
    END~
    COMPILE_BAF_TO_BCS
    BUT_ONLY_IF_IT_CHANGES
    J'ai testé et malheureusement de nouveau aucune modification du .bcs post-installation.
    Dernière modification par Huxaltec ; 22/05/2011 à 10h47.

  4. #4
    Date d'inscription
    July 2003
    Localisation
    Plaisir
    Messages
    6 631
    A partir du moment où tu ajoutes une expression règulière à la fin de chaque ligne pour englober le saut de ligne et les espaces de début de ligne, il faut que tu élimines tous ces caractères de ce que tu donnes comme chaine à rechercher.
    Tel que tu l'as fait, tu as laissé les sauts de ligne et des espaces en début de ligne, alors que l'expression régulière était supposée les passer tous. Comme il n'y a pas deux sauts de lignes entre chaque ligne, la chaine demandée n'est pas trouvée. La séquence présente dans le fichier que tu veux patcher est : saut de ligne (unique), espace(s), commandes. Hors l'expression régulière couvre 1 ou plusieurs [saut de ligne et/ou espace et/ou tabulation] et le fait de laisser un saut de ligne après l'expression régulière fait que tu veux en trouver encore un autre après. Cette séquence n'existe pas dans le fichier à patcher, donc forcément ça ne fait rien.

    Il faut sans doute écrire l'expression comme ceci, avec tout sur la même ligne et aucun espace :
    Code:
    COPY_EXISTING ~OBSDEM01.BCS~ ~override~
    DECOMPILE_BCS_TO_BAF
    REPLACE_TEXTUALLY EXACT_MATCH ~IF[%tab% %lnl%%mnl%%wnl%]+Detect([PC])[%tab% %lnl%%mnl%%wnl%]+Global("summon","LOCALS",0)[%tab% %lnl%%mnl%%wnl%]+THEN[%tab% %lnl%%mnl%%wnl%]+RESPONSE #100[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLAST2",[1972.1287])[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLSRIN",[1972.1287])[%tab% %lnl%%mnl%%wnl%]+CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLAST2",[1889.1461])[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLSRIN",[1889.1461])[%tab% %lnl%%mnl%%wnl%]+CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLAST2",[2244.1403])[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLSRIN",[2244.1403])[%tab% %lnl%%mnl%%wnl%]+CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+SetGlobal("summon","LOCALS",1)[%tab% %lnl%%mnl%%wnl%]+END~
    ~IF
     Detect([PC])
     Global("summon","LOCALS",0)
    THEN
     RESPONSE #100
             CreateVisualEffect("SPFLAST2",[1995.1320])
      CreateVisualEffect("SPFLSRIN",[1995.1320])
      CreateCreature("QQILABY",[1995.1320],0) // Illithid avec cerveau
      CreateVisualEffect("SPFLAST2",[1972.1287])
      CreateVisualEffect("SPFLSRIN",[1972.1287])
      CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi
      CreateVisualEffect("SPFLAST2",[1889.1461])
      CreateVisualEffect("SPFLSRIN",[1889.1461])
      CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi
      CreateVisualEffect("SPFLAST2",[2244.1403])
      CreateVisualEffect("SPFLSRIN",[2244.1403])
      CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi
      SetGlobal("summon","LOCALS",1)
    END~
    COMPILE_BAF_TO_BCS
    BUT_ONLY_IF_IT_CHANGES
    BG2 Fixpack regorge de patchs de ce genre, plus ciblés en général (il s'agit plutôt de modifier des conditions, pas de changer tout un bloc) et ils sont tous bien écrits sur une seule ligne.
    BG2 Fixpack fait un usage encore plus poussé des expressions régulières, qui permettent aussi de récupérer un bloc de la chaine recherchée pour le reprendre dans la chaine de remplacement. Mais c'est une autre histoire, même si tu pourrais aussi en profiter ici puisque tu recopies une grosse partie.

    En fait tu pourrais même fortement alléger le tout puisqu'il semble que tu veuilles ajouter trois lignes au début du bloc RESPONSE (même si elles pourraient tout aussi bien être à la fin).

    A priori, tu pourrais l'écrire :
    Code:
    COPY_EXISTING ~OBSDEM01.BCS~ ~override~
    DECOMPILE_BCS_TO_BAF
    REPLACE_TEXTUALLY EXACT_MATCH ~\(IF[%tab% %lnl%%mnl%%wnl%]+Detect([PC])[%tab% %lnl%%mnl%%wnl%]+Global("summon","LOCALS",0)[%tab% %lnl%%mnl%%wnl%]+THEN[%tab% %lnl%%mnl%%wnl%]+RESPONSE #100[%tab% %lnl%%mnl%%wnl%]+\)\(CreateVisualEffect("SPFLAST2",[1972.1287])[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLSRIN",[1972.1287])[%tab% %lnl%%mnl%%wnl%]+CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLAST2",[1889.1461])[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLSRIN",[1889.1461])[%tab% %lnl%%mnl%%wnl%]+CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLAST2",[2244.1403])[%tab% %lnl%%mnl%%wnl%]+CreateVisualEffect("SPFLSRIN",[2244.1403])[%tab% %lnl%%mnl%%wnl%]+CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi[%tab% %lnl%%mnl%%wnl%]+SetGlobal("summon","LOCALS",1)[%tab% %lnl%%mnl%%wnl%]+END\)~
    ~\1
      CreateVisualEffect("SPFLAST2",[1995.1320])
      CreateVisualEffect("SPFLSRIN",[1995.1320])
      CreateCreature("QQILABY",[1995.1320],0) // Illithid avec cerveau
    \2~
    COMPILE_BAF_TO_BCS
    BUT_ONLY_IF_IT_CHANGES
    Le fait de mettre toute une partie entre \( et \) fait qu'on peut la récupérer dans la chaine de substitution en utilisant la forme \nnn, où nnn est le numéro d'ordre de la partie entre \( et \) dans la chaine de recherche.

    En principe, tu pourrais même fortement alléger la deuxième partie car, à moins d'une énorme subtilité qui m'échappe, il n'y a qu'un seul bloc de script qui peut correspondre vu que ce bloc change la seule variable qu'il teste, ce qui fait qu'aucun autre bloc ne devrait avoir le même déclencheur.
    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 !

  5. #5
    Date d'inscription
    April 2009
    Localisation
    Maztica, vallée de Nexal
    Messages
    156
    Aaaaahhh Ok !!!! cette fois-ci j'ai tout compris . J'étais vraiment à côté de la plaque.
    Je teste et je te dis mais il n'y a pas de raison pour que ça ne fonctionne pas cette fois-ci. En fait j'ai au moins une bonne dizaine d'autre codes à remplacer en utilisant replace_textually.
    Encore une fois (et il y en aura d'autres), ton aide m'a été précieuse... Grâce à toi je vais enfin pouvoir achever une nouvelle zone sur laquelle se pose la sphère planaire dans mon mod.

    Merci beaucoup Isaya !!

  6. #6
    Date d'inscription
    April 2009
    Localisation
    Maztica, vallée de Nexal
    Messages
    156
    J'ai essayé la version courte et la version longue du code que tu m'as donné et j'obtiens toujours le même résultat.
    J'ai essayé à tout hasard de supprimer les commentaires "//", mais sans succès.

    Si j'essaie de remplacer 1 seule ligne de code (donc sans utiliser le "[%tab% %lnl%%mnl%%wnl%]+"), ça fonctionne :
    Dans le tp2 j'ai :
    Code:
    COPY_EXISTING ~OBSDEM01.BCS~ ~override~
    DECOMPILE_BCS_TO_BAF
    REPLACE_TEXTUALLY EXACT_MATCH ~RESPONSE #100~
    ~ RESPONSE #100
      CreateVisualEffect("SPFLAST2",[1995.1320])
      CreateVisualEffect("SPFLSRIN",[1995.1320])
      CreateCreature("QQILABY",[1995.1320],0) // Illithid avec cerveau
    ~
    COMPILE_BAF_TO_BCS
    BUT_ONLY_IF_IT_CHANGES
    et dans le bcs ça donne :
    Code:
    IF
     Detect([PC])
     Global("summon","LOCALS",0)
    THEN
     RESPONSE #100
      CreateVisualEffect("SPFLAST2",[1995.1320])
      CreateVisualEffect("SPFLSRIN",[1995.1320])
      CreateCreature("QQILABY",[1995.1320],0) // Illithid
      CreateVisualEffect("SPFLAST2",[1972.1287])
      CreateVisualEffect("SPFLSRIN",[1972.1287])
      CreateCreature("OBSDEM04",[1972.1287],0) // Maurezhi
      CreateVisualEffect("SPFLAST2",[1889.1461])
      CreateVisualEffect("SPFLSRIN",[1889.1461])
      CreateCreature("OBSDEM04",[1889.1461],0) // Maurezhi
      CreateVisualEffect("SPFLAST2",[2244.1403])
      CreateVisualEffect("SPFLSRIN",[2244.1403])
      CreateCreature("OBSDEM04",[2244.1403],0) // Maurezhi
      SetGlobal("summon","LOCALS",1)
    END
    Même si j'obtiens le résultat attendu, j'aurais quand même aimé comprendre pourquoi ça ne fonctionne pas avec plusieurs lignes à remplacer.
    J'ai donc essayé avec simplement 2 lignes :
    Code:
    COPY_EXISTING ~OBSDEM01.BCS~ ~override~
    DECOMPILE_BCS_TO_BAF
    REPLACE_TEXTUALLY EXACT_MATCH ~THEN[%tab% %lnl%%mnl%%wnl%]+RESPONSE #100~
    ~ THEN
      RESPONSE #100
      CreateVisualEffect("SPFLAST2",[1995.1320])
      CreateVisualEffect("SPFLSRIN",[1995.1320])
      CreateCreature("QQILABY",[1995.1320],0) // Illithid avec cerveau
    ~
    COMPILE_BAF_TO_BCS
    BUT_ONLY_IF_IT_CHANGES
    et là ça ne fonctionne plus. Que faut-il en conclure ?


    Rohhh je ne suis qu'un gros boulet...


    EDIT : étant donné que j'avais plusieurs blocs de codes (des scripts de la sphère planaire) à modifier, j'ai du trouver une solution alternative. J'ai trouvé la fonction
    REPLACE_BCS_BLOCK oldFile newFile
    ça me permet d'échanger un bloc d'un script existant (que je copie dans un "oldfile.bcs") par un nouveau bloc que je place dans un "newfile.bcs". ça marche !
    Dernière modification par Huxaltec ; 23/05/2011 à 16h41.

  7. #7
    Date d'inscription
    July 2003
    Localisation
    Plaisir
    Messages
    6 631
    Pour faire court, je vais me contenter de me citer :
    Citation Envoyé par Isaya Voir le message
    Comme ça utilise une expression régulière, il ne faut surtout pas que tu mettes EXACT_MATCH.


    Je suis à peu-près certain que si tu supprimes EXACT_MATCH, ça devrait fonctionner.

    J'espère juste que le passage de la théorie à la pratique va fonctionner comme je le pense.
    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 !

  8. #8
    Date d'inscription
    April 2009
    Localisation
    Maztica, vallée de Nexal
    Messages
    156
    Hélas non, j'ai essayé avec et sans EXACT_MATCH, vraiment étrange si on regarde le code utilisé pour BG2fixpack entre autres...

    En tout cas la fonction REPLACE_BCS_BLOCK marche à merveille.

Discussions similaires

  1. [WeiDU] Utiliser la fonction CREATE avant la prochaine mise-à-jour de WeiDU
    Par Freddy_Gwendo dans le forum Programmation WeiDU
    Réponses: 1
    Dernier message: 15/02/2016, 22h18
  2. [WeiDU] Comment fonctionne la commande RANDOM de WeiDU ?
    Par Freddy_Gwendo dans le forum Programmation WeiDU
    Réponses: 2
    Dernier message: 23/07/2015, 23h47
  3. Réponses: 5
    Dernier message: 06/08/2014, 22h10
  4. Vos Weidu- Log SVP !
    Par Salomon Kane dans le forum Méga-mods : Big Picture, The Darkest Day, Shadow Over Soubar, Tortured Souls, Check The Bodies, Nev
    Réponses: 0
    Dernier message: 16/07/2008, 21h03
  5. [MODS] Weidu/ Non Weidu
    Par Folken dans le forum Le Bazar de l'Aventurier
    Réponses: 28
    Dernier message: 20/02/2004, 22h31

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