Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su

7.3. Как помещать в гиперссылки сложный код?

В: Как помещать в гиперссылки сложный код?

О:

Большой кусок кода в гиперссылке будет трудно читать, к тому же это грозит ошибками. Некоторые плееры, работающие с бразуерным html-рендером, могут криво обрабатывать многострочный код в гиперссылках. Поэтому лучше избегать больших объёмов кода непосредственно в самих гиперссылках. Однако есть два решения, которые позволяют выполнять сколь угодно сложный код при щелчке по ссылке.

Например, мы делаем покупку предметов через гиперссылки:

*pl "<a href='exec: '>Купить кружку имбирного эля</a>"

И нам нужно, чтобы при щелчке по ссылке выполнялся такой вот код:

if no деньги<100:
    addobj 'Кружка имбирного эля' 
    кружка_эля+=1 
    деньги-=100
    *pl "Я приобрёл куржку имбирного эля."
else
    *pl "Мне не хватает денег на эль."
end
  1. Чтобы не совать весь код в гиперссылку, мы можем создать отдельную локацию, назвав её, например "купить_эль", разместить код в этой локации, а затем просто вызывать локацию из гиперссылки по `gosub`:

    *pl "<a href='exec:gosub ""купить_эль""'>Купить кружку имбирного эля</a>"
  2. Можно не создавать отдельную локацию под кусок кода, а выделить для него отдельную переменную. То есть, поместим наш код в текстовую переменную:

    $code={
        if no деньги<100:
            addobj 'Кружка имбирного эля' 
            кружка_эля+=1 
            деньги-=100
            *pl "Я приобрёл куржку имбирного эля."
        else
            *pl "Мне не хватает денег на эль."
        end
    }

Теперь этот код можно будет выполнить в любой момент, используя оператор `dynamic`:

*pl "<a href='exec:dynamic $code'>Купить кружку имбирного эля</a>"

Как видите, первый способ требует написания отдельной локации, а так же мы всё ещё можем неверно закрыть кавычки, прописывая команду для вызова этой локации. Во втором варианте этот риск минимален, однако нам приходится выделять для размещения кода переменную, которую нельзя уничтожать, пока игрок не щёлкнет по гиперссылке.