alfa10 написал:
Точняк! Все заработало! Спасибо тебе, дружище!
Обращайся! ![]()
alfa10 написал:
Дык вот это именно пример из обучения.
Я вот заглянул в учебник, и там на самом деле <<display 'Заголовок'>> ![]()
Неактивен
alfa10 написал:
Ребят, такой вопрос: создаю книгу, вставляю в нею фотки. Потом сохраняю книгу в файл HTML. На другом компьютере запускаю этот сохраненный файл - а фоток нет. Как делать так, чтобы фотографии были в книге, даже если я смотрю файл на другом компьютере? Например, вот напишу я книгу, захочу ее сохранить в файл и отослать друзьям - а фотки получается, пропадут?
Картинки не встраиваются в html-файл, там только изображения кнопок. Если ты добавляешь картинки пунктом меню "Выбрать локальный файл", они копируются в папку files рядом с sm-файлом. Соответственно отсылай друзьям ещё и папку files вместе с html-файлом. Для пересылки по почте можно всё предварительно упаковать в архив.
Неактивен
alfa10 написал:
Получается только так? А если публиковать книгу из программы в библиотеку - тогда все нормально пропишется и фотографии останутся?
Когда будешь публиковать в библиотеку, редактор закачает все картинки и музыку на сайт, и у всех будет всё отображаться (при условии подключения к Интернету
)
alfa10 написал:
И еще вопрос - почему то вставляю музыку, а она не играется на странице, хотя значок динамика отображается на странице. Код такого вида вставляю:
Код:
[[File: files/Scooter - Fire.mp3]]
А какой браузер ты используешь, случайно не Оперу? Для неё нужен звуковой файл с таким же именем, но в формате ogg. Если вставляешь музыку в игру, придётся каждый звуковой файл в двух форматах рядышком класть mp3 и ogg, чтобы у всех проигрывалась музыка независимо от браузера.
Неактивен
Max написал:
что означает объект и рядом с ним []. например - $match[3]
Это означает, что объект $match является списком (одномерным массивом), а $match[3] - это элемент списка с индексом 3. Как верно подметил Flash, можно почитать в руководстве пользователя про списки.
Вообще мне кажется, в примере Oldrik'а можно вполне обойтись без списков, заменив их на простые объекты. Например, вместо $match[3] --> $сколькоЗабилГГ
Неактивен
alfa10 написал:
Flash написал:
alfa10, эта строчка ничего не делает. Переменная приравнивпется сама себе.
а как тогда сделать, чтобы в текущем параграфе переменная брала то значение, которое она имела до этого параграфа? Может так тогда?
Код:
<<set $удача1 = $удача>>
Все переменные глобальные. Т.е. если задать значение переменной на одном параграфе, на всех следующих параграфах переменная сохранит это значение. До тех пор пока ты не перезапустишь игру.
Неактивен
alfa10 написал:
Теперь вопрос - а как сделать так, чтобы мелодии игрались по-очереди по ходу книги?
Если есть несколько мелодий и нужно, чтобы они игрались друг за другом независимо от параграфа, можно соединить их в один файл. Правда он будет загружаться некоторое, возможно, продолжительное время.
Неактивен
alfa10 написал:
А что означает gte ? Значение "больше"?
gte = Greater Than or Equals - больше либо равно. Лучше используй в макросах if именно такие, буквенные операторы.
alfa10 написал:
Как можно сделать так, чтобы при значении параметра $жизнь - 0 бой заканчивался?
Ещё один макрос if. Попробуй так:
<<if $жизнь lte 0>> (меньше либо равно)
<<goto 'ГеймОвер'>> (переход на другой параграф)
<<endif>>
Неактивен
alfa10 написал:
А как зациклить код? Чтобы значения уменьшались до того момента, пока переменная жизнь не примет нулевое значение?
Допустим, сражение у нас в параграфе "Битва". Начальное значение жизней нужно установить до этого параграфа:
:: Параграф_до_битвы
<<set $жизнь = 7>>
<<set $жизнь1 = 6>>
Внезапно путь преграждает <<print $враг>>!
<<print $я>> - <<print $жизнь>>
<<print $враг>> - <<print $жизнь1>>
[[Начать битву|Битва]]
[[Убежать|Бегство]]
:: Битва
<<random $кубик = 10>>
<<if $кубик gte 3>>
<<print $я>> наносит удар!
<<set $жизнь1 = $жизнь1 - 1>>
<<else>>
<<print $враг>> наносит удар!
<<set $жизнь = $жизнь - 1>>
<<endif>>
<<print $я>> - <<print $жизнь>>
<<print $враг>> - <<print $жизнь1>>
<<if $жизнь lte 0>>
<<print $я>> падает на землю без чувств...
[[Это конец|GameOver]]
<<elseif $жизнь1 lte 0>>
<<print $враг>> падает на землю, путь свободен!
[[Праздновать победу|Победа]]
<<else>>
[[Продолжать битву|Битва]]
[[Убежать|Бегство]]
<<endif>>Лучше зацикливать так, на ссылках, чтобы у игрока создавалось ощущение, что он на что-то влияет.
Неактивен
alfa10 написал:
Спасибо тебе большое! очень сильно помогаешь мне
И всем вам ребята - большое спасибо
Пожалуйста ![]()
alfa10 написал:
Еще вопрос - можно ли сделать, чтобы во время боя страница автоматически обновлялась, а не клацать каждый раз на продолжить?
Как заметил DD, можно через макрос repeat:
:: Параграф_до_битвы
...
[[Начать битву|НачалоБитвы]] (всё то же самое кроме этой строчки)
:: НачалоБитвы
<<repeat 'Битва' 2>> (здесь число - это время обновления в секундах)
<<display 'Битва'>> (сразу показываем параграф "Битва", чтобы не ждать первый раз)
:: Битва
<<clrscr>> (в самом начале очищаем экран, если не очищать - будет "лог" битвы)
<<random $кубик = 10>>
<<if $кубик gte 3>>
<<print $я>> наносит удар!
<<set $жизнь1 = $жизнь1 - 1>>
<<else>>
<<print $враг>> наносит удар!
<<set $жизнь = $жизнь - 1>>
<<endif>>
<<print $я>> - <<print $жизнь>>
<<print $враг>> - <<print $жизнь1>>
<<if $жизнь lte 0>>
<<print $я>> падает на землю без чувств...
<<stop 'Битва'>> (битва окончена - останавливаем авто обновление)
[[Это конец|GameOver]]
<<elseif $жизнь1 lte 0>>
<<print $враг>> падает на землю, путь свободен!
<<stop 'Битва'>> (и в этом случае тоже останавливаем)
[[Праздновать победу|Победа]]
<<endif>>И да, Руководство пользователя AXMA Story Maker - очень хорошая вещь, рекомендую! ![]()
Неактивен
NeoMatrix777 написал:
Господа, а есть ли возможность на этом движке запилить рогалик? Я в программирование не силен, поэтому у меня даже нет особых идей по алгоритму передвижения героя-символа по пустому полю.
Ну а что, списки и циклы есть, моноширинный шрифт есть - значит теоретически возможно
Только карта будет монохромной, разве что некоторые объекты на карте будут ссылками. Ещё один нюанс: на мелких экранах мобильных устройств карта может отображаться неверно из-за переносов строк (но в меню можно попробовать изменить размер шрифта). А идея алгоритма передвижения проста: у героя есть координаты X и Y. Если герой идёт на север или юг, изменяем вертикальную координату, на запад или восток - горизонтальную. Заодно с изменением координаты проверяем границы окна и карты, наличие на пути непроходимых объектов, затем перерисовываем карту.
Неактивен
Max написал:
подскажите, как понимать эту запись
<<random $гол1 = 2>>
<<random $гол2 = 2>>
<<random $rnd = 99>>
<<if $rnd lt 50 + ($ком_ГГ[1] - $ком[1]) * 5>>
особенно последняя строчка...
Ну <<random $rnd = N>> означает случайное целое число от 0 до N включительно.
Рандом от 0 до 99 я использую, когда известна вероятность какого-то события, и надо определить, произошло ли событие:
<<random $rnd = 99>>
<<if $rnd lt M>>
# Событие произошло!
<<endif>>
где M - это вероятность события в процентах (от 0 до 100).
Теперь, допустим, если силы команд равны, то вероятность победы первой команды = 50%. Иначе разница в силе команд на 1 изменяет вероятность победы/поражения на 5%. Соответственно, если первая команда сильнее хотя бы на 10, вероятность её победы = 100%.
Попробуй просто перед матчем рассчитывать общую "силу" команды. А вот сила в данном случае уже зависит от атаки, защиты, и морали (дома играем или в гостях).
Неактивен
Max написал:
тогда каждый раз выбирая команду, нужно в ручную прописывать влияние Ат, Защ, Мор на СИЛУ???
Морыч категорически одобряет параметр "Мор" ![]()
Вручную не надо, формула же будет. Только нужно определиться с диапазоном изменения Атк, Защ и Мор. Например, от 1 до 10.
Тогда можно, к примеру, так:
<<if команда1_играет_дома>>
<<set $K = 1>> (коэф. влияния морали)
<<else>>
<<set $K = 0.5>>
<<endif>>
<<set $Сила1 = Math.round(Math.max(1, $Атк1 - $Защ2 + $Мор1 * $К))>> (при помощи max ограничиваем силу, чтобы не получилась меньше 1, round - округление до целого)
<<set $Сила2 = Math.round(Math.max(1, $Атк2 - $Защ1 + $Мор2 * (1.5 - $К)))>> (если первая команда играет у себя, то вторая в гостях, и наоборот)Получается, Сила может принимать значения от 1 до 19, а разница сил от -18 до 18. Значит условие для определения победителя немного изменится:
<<random $rnd = 99>>
<<if $rnd lt 50 + ($Сила1 - $Сила2) * 2.6>>
Т.о. при самом лучшем раскладе шанс победы 96.8%, оставшиеся проценты - шанс критической неудачи. То же самое и с критическим успехом при наихудшем раскладе.
Неактивен
NeoMatrix777 написал:
То, что требуется система координат - достаточно естественно. Однако каким более конкретным образом она пилиться? Я вот думал как-нибудь через массивы, но чего-то ни к чему толковому не пришел...
Через массивы, всё верно, массивы строк. Например, в цикле вывести все строки массива карты до координаты Y гг. Затем выводим часть строки до координаты X, рисуем @ (гг), выводим оставшуюся часть строки, затем выводим оставшиеся строки карты.
Неактивен
alfa10 написал:
Просьба помочь разобраться в ошибке кода:
Почему-то у меня назад не возвращает. Как можно сделать так, чтобы если жизни остаются, параграф продолжался заново с начала?
Давай попробуем разобраться, но сначала небольшая работа над ошибками
Читай закомментированные строки (после символа #)
<<set $жизнь = $жизнь>>
<<set $жизнь1 = $жизнь1>>
# Две верхние строчки не нужны
Мое здоровье - ''<<print $жизнь>>''
Здоровье вора - ''<<print $жизнь1>>''
Вор поворачивается ко мне. Его лицо скрывает балахон. Не говоря ни слова, гость направляется на меня...
<<if $успех eq 1>>
[[Ударить в лицо|БойВорНеус {$успех = 2}]]
[[Ударить в живот|БойВорНеус {$успех = 3}]]
[[Кинуть в вора стул|БойВорНеус {$успех = 4}]]
<<endif>>
# Советую выделять внутренности блока if-endif
# при помощи табуляции, код будет легче читать
<<if $успех eq 2>>
<<clrscr>>
<<random $кубик = 6>>
<<if $кубик gte 5>>
Я ударяю вора в голову. Великолепный удар!
<<set $жизнь1 = $жизнь1 - 3>>
Мое здоровье - ''<<print $жизнь>>''
Здоровье вора - ''<<print $жизнь1>>''
<<else>>
Вор ставит блок и проводит ответный удар!
<<set $жизнь = $жизнь - 1>>
Мое здоровье - ''<<print $жизнь>>''
Здоровье вора - ''<<print $жизнь1>>''
<<endif>>
# Выше дважды написано одно и то же (про жизни гг и противника)
# такого быть не должно. Лучше вынести эти две строки за endif,
# вот прям сюда
<<if $жизнь1 lte 0>>
<<goto 'ОсмотретьсяЖив'>>
<<else>>
<<goto 'БойВорНеус' {$успех = 1}>>
<<elseif $жизнь lte 0>>
<<goto 'Конец1'>>
<<else>>
<<goto 'БойВорНеус' {$успех = 1}>>
<<endif>>
# Программа никогда не дойдёт до двух нижних goto,
# поскольку при истинности первого условия выполнится первый goto,
# а второй goto выполнится во всех остальных случаях.
# В блоке if-endif внутри может быть сколько угодно elseif,
# но всегда только один else, причём стоять он должен самым последним!
<<endif>>Неактивен
alfa10 написал:
Спасибо! Еще б расшифровал бы код - вообще круто было бы
Этот код разбивает введённую строку $адрес на две строки: $улица и $дом. Разделение строк происходит в цикле посимвольно: до запятой - собирается название улицы, после запятой - номер дома.
Есть другой способ сделать то же самое:
:: vvod
Введите адрес:
<<input '0' $адрес>>
:: 0
<<set $адрес = $адрес.replace(/ /g,"").toLowerCase()>> ---- удалить все пробелы из строки $адрес, преобразовать в нижний регистр
<<set $улица = "">>
<<set $дом = "">>
<<set $i = $адрес.indexOf(",")>> ---- индекс первой запятой в строке $адрес
<<if $i gt -1>> ---- если есть запятая
<<set $улица = $адрес.substr(0, $i)>> ---- название улицы - это часть строки до запятой
<<set $дом = $адрес.substr($i + 1)>> ---- номер дома - часть строки после запятой
<<endif>>
Улица: <<print $улица>>;
Дом: <<print $дом>>;Неактивен
Отличный баг выловил! Спасибо!
Неактивен
Прикольно
Может ты ещё что-нибудь сделал из ToDo незаметно для себя, а никто кроме Flash'а и не знает? ![]()
Неактивен
Delakha написал:
Условие: есть три навыка (Навык Тяжелого оружия ближнего боя, Легкого оружия ближнего боя и Оружия дальнего боя). Есть один дар и два таланта, которым можно придать значение навыка. Дар и талант не могут быть обозначены одним навыком, как и два таланта. Если обозначить навык как дар, то возможность выбрать как талант исчезнет. Однако если выбрать даром другой навык, то возможность опять появится. С талантами то же самое. Если выбрать один для навыка, возможность выбрать этот навык вторым талантом должна исчезнуть.
Я тут покрутил немного, и получилось вот что:
:: Start
<<display 'Объекты'>>
[[Навыки]]
:: Объекты
<<set $навык = "">>
<<set $нет = "нет">>
<<set $дар = $нет>>
<<set $талант1 = $нет>>
<<set $талант2 = $нет>>
<<set $выбрано = 0>>
:: Навыки
<<if ($выбрано neq 1) and ($дар eq $навык)>>
<<set $дар = $нет>>
<<endif>>
<<if ($выбрано neq 2) and ($талант1 eq $навык)>>
<<set $талант1 = $нет>>
<<endif>>
<<if ($выбрано neq 3) and ($талант2 eq $навык)>>
<<set $талант2 = $нет>>
<<endif>>
Дар: <<print $дар>>
Талант первый: <<print $талант1>>
Талант второй: <<print $талант2>>
[[Тяжёлое оружие ближнего боя|ОписаниеНавыков {$навык = "тяжёлое оружие"}]]
[[Лёгкое оружие ближнего боя|ОписаниеНавыков {$навык = "лёгкое оружие"}]]
[[Оружие дальнего боя|ОписаниеНавыков {$навык = "дальнее оружие"}]]
:: ОписаниеНавыков
<<if $навык eq "тяжёлое оружие">>
Описание навыка «Тяжёлое оружие».
<<elseif $навык eq "лёгкое оружие">>
Описание навыка «Лёгкое оружие».
<<else>>
Описание навыка «Дальнее оружие».
<<endif>>
<<if $навык neq $дар>>
[[Выбрать как дар|Навыки {$дар = $навык} {$выбрано = 1}]]
<<endif>>
<<if ($навык neq $талант1) and ($навык neq $талант2)>>
<<if ($талант1 eq $нет) or ($талант2 neq $нет)>>
[[Выбрать как талант|Навыки {$талант1 = $навык} {$выбрано = 2}]]
<<else>>
[[Выбрать как талант|Навыки {$талант2 = $навык} {$выбрано = 3}]]
<<endif>>
<<endif>>
[[Назад|Навыки {$навык = ""}]]Посмотрите, правильно ли работает.
У вас, я заметил, отсутствует закрывающая скобка в таких условиях:
<<elseif $дар neq 'тяжелое оружие' and (!$талант2 or $талант2 neq 'тяжелое оружие' and $талант1>>
Неактивен
Из учебника:
В самом начале истории мы создадим объект «$селение», в котором будем запоминать номер описания сцены «Старое селение». Первоначально значение объекта «$селение» будет равно 1.
Т.е. в параграфе Start нужно написать:
<<set $селение = 1>>
Этой командой мы явно задаём начальное значение объекта. Если этого не сделать, значение объекта будет неопределённым (undefinied).
В учебнике все начальные значения объектов задаются в специальном параграфе "Создание объектов", который вызывается во вступлении. Смотрите главу "Инициализация объектов" в четвёртой части.
Неактивен
Собственно, дело именно в этом. Если копировать из редактора, то не выходит, а если открыть файл sm в блокноте и скопировать оттуда, то все отлично.
(В окошке онлайн конструктора так и написано: скопируйте исходный текст из файла *.sm)
Неактивен
Привет! Просить прощения не нужно, это специальная тема для вопросов и ответов
Программа работает совсем не странно, а вполне себе логично. Параграф «Установка объектов» выполнился один раз и всё. Чтобы какой-то код выполнился ещё раз, соответствующий параграф нужно вызвать (макросом <<display>>, <<goto>> или перейти в параграф по ссылке). Предлагаю перенести проверку профессии в новый параграф «Увеличение возраста», и написать там так:
<<set $время = $время + 1>>
<<If $кузнец>>
<<set $сила = $сила + 1>>
<<elseIf $библиотекарь>>
<<set $интеллект = $интеллект + 1>>
<<endIf>>
<<goto 'Основной параграф'>>Конечно же из параграфа «Установки объектов» этот кусок кода надо убрать, т.к. ни одна из проверок там не работает (и $кузнец и $библиотекарь = false).
А в «Основном параграфе» внизу напишем так:
[[Повзрослеть|Увеличение возраста]]
П.С. И ещё один момент, относящийся к стилю программирования. Если мы проверяем логическую переменную на истинность, то пишем просто <<if $объект>>, если на ложность, то <<if not $объект>> или <<if !$объект>>.
Неактивен
Нене, я про проверку значения объектов, которые используются для хранения исключительно true либо false. В остальных случаях лучше использовать eq, чтобы код легче читался.
Неактивен
Пожалуйста! Обращайтесь, если что ![]()
Неактивен
Вета, прошу прощения за поздний ответ, праздники, сама понимаешь. Собственно вот:
:: Start
[[Старт|параграф 1]]
:: параграф 1
<<display 'инт'>>
Текст, текст, текст...
[[Идти в 2|параграф 2]]
:: параграф 2
<<display 'инт'>>
Текст 2, текст 2, текст 2...
[[Идти в 1|параграф 1]]
:: инвентарь
<<display 'инт'>>
Список предметов...
:: инт
<<if $$title neq "инвентарь">>
===Главная || [[Инвентарь|инвентарь {$passage = $$title}]]===
<<else>>
===[[Главная|$passage]] || Инвентарь===
<<endif>>Неактивен
Вета написал:
И еще, как мне в инвентаре сделать проверку такого вида:
предмет - НИТКИ (ссылка)
Щелкаем по ниткам.
Если локация=1, то переходим на эту локацию и там появляется ссылка "Использовать нитки"
иначе
появляется надпись в инвентаре: "Нитки тут не применимы".
Вот попробуй так:
:: Start
<<fade = 500>>
<<set $item = "">>
<<set $nitki = 1>>
[[Старт|параграф 1]]
:: параграф 1
<<display 'инт'>>
Тут нет ничего интересного. Только дверь в другую комнату.
[[Идти в другую комнату|параграф 2]]
<<display 'предметы'>>
:: параграф 2
<<display 'инт'>>
Здесь стоит швейная машинка.<<if $nitki eq 2>> Вы заправили в машинку свои нитки. Осталось найти занавеску и можно сшить плащ.<<endif>>
[[Вернуться в пустую комнату|параграф 1]]
<<display 'предметы'>>
:: инт
<<if $$title neq "инвентарь">>
===Главная || [[Инвентарь|инвентарь {$passage = $$title}]]===
<<else>>
===[[Главная|$passage]] || Инвентарь===
<<endif>>
:: инвентарь
<<display 'инт'>>
Содержимое карманов:
<<if $nitki eq 1>>
* [[Нитки|$passage {$item = "нитки"}]]
<<endif>>
<<if (not $use) and ($item neq "")>>
Вы не представляете, как здесь можно использовать <<print $item>>.
<<endif>>
<<set $item = "">>
:: предметы
<<set $use = false>>
<<if $item eq "нитки">>
<<if $passage eq "параграф 2">>
[[Заправить нитки в машинку|$passage {$nitki = 2}]]
<<set $use = true>>
<<endif>>
<<endif>>
<<if (not $use) and ($item neq "")>>
<<goto 'инвентарь'>>
<<else>>
<<set $item = "">>
<<endif>>Неактивен