инструкция по составлению скриптов (на английском)
https://twistypuzzles.com/forum/viewtopic.php?p=424334#p424334---------------------------------------------------------------
Небольшая инструкция по созданию скриптов:
(Скорее всего буду что-то менять и дорабатывать)
Для инициализации головоломки нужно сделать несколько команд:
Name: Rashkey v1
Author: Oleg Raschkov
Link: https://twistypuzzles.com/app/museum/museum_showitem.php?pkey=1447
Scale: 3
Speed: 4
Flip: y
Может быть несколько команд Link. Команда «Перевернуть» может иметь несколько параметров «x, y, xy, Rotate»,
если вы хотите добавить фотографию головоломки, поместите файл jpg в папку «Фото» с тем же именем, что и в параметре «Имя».
# Variables
Param: pos_ring, 50+35*sqrt(3) # 110.62177827
Param: angle, 360/7 # 51.42857143
# ring number, center coordinates x y, radius, angle
Ring: 1, 50, 50, 50, 60
Ring: 2, 120, 50, 50, (100,60,100,100)
Ring: 3, 85, pos_ring, 50, angle
Ring: 4, 85, 50+35*sqrt(3) , 50, 360/7
вы можете установить любое количество вычисляемых переменных. также формулы можно задавать сразу внутри параметров
доступные функции: pi, sqrt, cos, sin, tan, acos, asin, atan, exp, pow, radians, degrees, hypot
вы также можете установить столько колец, сколько захотите. последний параметр Angle задается в градусах.
для некоторых головоломок можно задать вложенный массив углов, их сумма должна равняться 360 градусам
# new ring number, source ring number, rotate-command, radius, angle
CopyRing: 4, 2, 3R3, 50, 60
CopyRing: 5, 1, (3,120), 50, 60
Если вы хотите создать новое кольцо, используя параметры уже определенных колец. Вы можете скопировать их, используя команды поворота.
# ring number, center coordinates x y, radius, -, type (1)
Ring: 3, 50, 50, 50, 0, 1
CopyRing: 4, 2, 1R, 50, 0, 1
иногда вам понадобятся невидимые кольца, чтобы вырезать некоторые детали.
при создании таких колец (angle=0,type=1) детали внутри них образовываться не будут.
в параметре Angle можно указать углы, тогда части в этом круге можно вращать во время генерации головоломки, но круг все равно будет отключен во время игры
# ring number, center coordinates x y, radius, -, type (2)
Ring: 3, 50, 50, 50, 0, 2
CopyRing: 4, 2, 1R, 50, 0, 2
это также дополнительное невидимое кольцо (angle=0,type=2), здесь все работает также как с предыдущими кольцами (type=1)
если это кольцо вложено внутрь другого (концентрические крэйзи кольца), тогда оно имеет особое свойство - во время игры все части внутри этого кольца не будут поворачиваться.
получается пончик, внешние части большого кольца будут вращаться, а внутренние части нет.
иногда нужно удалить заданные ранее кольца
RemoveRings: 1,10вам нужно быть осторожным, чтобы в дальнейшем коде не было ссылок на номера удаленных кругов
ShowHiddenCirclesпо умолчанию симулятор не подсвечивает кольца которые невозможно повернуть. данный флаг отключает эту проверку
Круги головоломки, из которых будут создаваться детали после разрезов, появляются при запуске самой первой команды AutoCutParts.
Если вы сделаете второй раздел с помощью команд «Кольцо», после создания первых кругов. Вам придется скопировать детали в новые круги или запустить данную команду
MakeCircles: 3,4затем вы можете запустить команду для автоматического или ручного разделения кругов на части
AutoCutParts- эта команда сделает минимальное разделение кругов без их поворотов
AutoCutParts: Random, 150- эта команда запустит случайное вращение, которое должно разбить головоломку на части.
для более крупных головоломок нужно увеличить второе число, но это увеличит время открытия скрипта.
этот параметр подбирается экспериментально
AutoCutParts: 1R,1R,1R, 2L,2L,2L, 3R2эта команда запускает генератор их заранее заданных ходов, чтобы сделать нарезку круга вручную: это работает намного быстрее, чем параметр Random,
первое число — это номер круга из тега Ring. затем идет буква L или R (сделать поворот на 1 шаг, равный заданному углу).
параметр может иметь третье число – это возможность сразу совершить поворот на несколько шагов.
AutoCutParts: (1R),3, (2L,4R),3, 3R2вы можете использовать более короткую запись, указав, сколько раз повторять последовательность.
вложенные круглые скобки не будут работать
AutoCutParts: (Random,150,3), 1R,1R,1R, 2L,2L,2L, 3R2вы можете комбинировать выполнение команды Random и некоторые движения вручную.
Вы можете добавить третий параметр к команде Random, это инициализация зерна для встроенной функции Random.
AutoCutParts: (1L, 3L2, 1R), (1L, 3R2, 1R, 2), (1L, 2R2, 1R, 1,3) Если вы хотите точно настроить начало резки своих кругов, попробуйте этот формат записи.
будет выполнена та последовательность вращений, которую вы зададите в скобках, но начало процедуры резки начнется только в самом конце. таким образом вы сможете вращать некоторые детали, не разрезая их.
если в конце последовательности числовых параметров нет, то процедура резки начнется с использованием всех кругов.
если в конце будут числовые параметры, то резка начнется только с использованием заданных кругов,
если вы хотите просто вращать круги, не запуская процедуру резки
AutoCutParts: (1L, 2R2, 1R, 0) если вы хотите повернуть круг на заданный угол в градусах, используйте этот формат
AutoCutParts: (1,36), (2,-72) вы можете использовать вложенные скобки, чтобы упростить многие последовательности
AutoCutParts: ( (1R),5, (2,36) ),3 RotateCircles: 1R3, 2L
RotateCircles: (1R,2L),3
RotateCircles: (1,60),(2,-72)
Чтобы повернуть все части внутри круга, без запуска процедуры нарезки, используйте эту команду
Иногда нужно начать резать по заданным кругам, не вращая детали.
CutCircles: 1,3индексы всех предопределенных цветов
# colors: 0 white, 1 black, 2 gray, 3 red, 4 green, 5 blue, 6 yellow, 7 purple
# colors: 8 teal, 9 orange, 10 light blue, 11 pink, 12 brown, 13 lilac, 14 limeвы можете автоматически раскрасить все части с помощью этой команды
AutoColorParts: 2, 3если для головоломки с двумя кругами указать только два цвета - программа раскрасит два круга, а цвет пересечения кругов будет рассчитан автоматически
AutoColorParts: 2, 3, 4но вы можете указать третье число для цвета пересечения.
Эту команду можно использовать для указания цвета отдельных частей.
SetColorParts: 12,6, 8,3здесь вы указываете пары чисел. первое число — номер детали, второе число — индекс цвета.
SetColorParts: (1,8,25),3, (2,10,29),6, 3,4сначала вы указываете номера деталей во вложенном массиве, а затем указываете индекс цвета,
также можно раскрасить заданные круги.
SetColorCircles: 1,6, 2,3здесь вы указываете пары чисел. первое число — номер круга, второе число — индекс цвета.
вы можете указывать круги в произвольном порядке.
SetColorCircles: (2,4),4, (1,2,3,4),0если вы хотите раскрасить только те части, которые находятся в области пересечения нескольких кругов, то укажите в скобках все эти круги
с помощью этой команды вы можете удалить некоторые детали
RemoveParts: 56,58просто перечислите все номера деталей.
это команда для копирования частей
CopyParts: (1,2,5), 1R2
CopyParts: (3,4), (1,60), (6,7),(2,-120)просто перечислите все номера деталей и дайте команду повернуть.
почти то же самое, если нужно переместить детали без копирования
MoveParts: (1,2,5), 1R2
MoveParts: (3,4), (1,60), (6,7),(2,-120)Команда для зеркального отражения (с копированием) частей относительно заданной линии:
MirrorParts: (1,2,3), (50,50, ring_x,ring_y)Иногда вам нужно временно скрыть некоторые части, а затем показать их снова. Это необходимо для того, чтобы на них не повлияли процедуры обрезки.
HideParts: 2,3,4,7HideAllPartsсделайте это для заданного списка частей или для всех частей сразу
ShowParts: 2,3,4,7ShowAllPartsобратная процедура восстанавливает отображение деталей
InvertAllPartsвы можете изменить значение флага отображения для всех частей
во всех командах где есть списки с номерами частей вы можете указывать диапазон - 15..20. это эквивалентно - 15,16,17,18,19,20
CopyParts: (1..5), 1RИногда внутри пазла остается много микрочастиц, имеющих площадь менее одного пикселя, их лучше удалить.
RemoveMicroParts: 1Укажите эту команду. параметр — минимальная площадь.
Вы также можете автоматически удалять более крупные детали, если, например, укажете минимальную площадь 100.
если вы хотите повернуть построенный пазл, используйте эту функцию
RotateAllParts: x,y,angle
RotateAllParts: Angle
иногда после процедуры удаления или копирования деталей будет удобно отсортировать и перенумеровать все детали так, чтобы все маркеры шли слева направо и сверху вниз
RenumberingПри создании скриптов нужно понимать что функция Renumbering вызывается автоматически после некоторых команд.
она вызывается во время работы AutoCutParts, RotateCircles, CutCircles. Если вы хотите отключить автоматический запуск функции Renumbering, используйте команду:
RenumberingAuto: 0если вы хотите связать несколько колец с помощью шестереночной передачи, вам нужно использовать специальные команды
Linked: 2,-3
Linked: (2,4), (1,-6,-5)
если в группе числа имеют одинаковый знак, тогда круги вращаются в одну сторону. если противоположный знак, тогда круги вращаются в разные стороны.
также вам нужно обязательно задать передаточное число у всех указанных кругов в команде Linked
# ring number, center coordinates x y, radius, angle, type, gear ratio
Ring: 2, 50, 0, 50, 120, 0,12
# ring number, source ring number, rotate-command, radius, angle, type, gear ratio
CopyRing: 5, 3, 1R, 9, 0,1, 6
если вы хотите сделать кольца с защелками в некоторых частях, используйте эту команду.
Latch: (6,8),+, 14,-, 28,-
знак после номера части указывает в каком направлении будет крутиться данный круг
если вы хотите сделать головоломку с плюнгером (ограничитель поворотов), используйте такой вариант настройки колец
Ring: 1, 0, 50, radius, (60,0,0,60)
вам нужно в список углов добавить (0,0) - это и будет ограничителем поворотов
тк в головоломках с плюнгерами часто не используется вся видимая часть круга, используйте эту команду, чтобы ограничить область видимости
Display: -190,-90,190,190
здесь вы вручную задаете координаты области видимости. автоматический расчет пропускается.
вы можете пометить некоторые части текстовыми маркерами
# part number, text marker
SetMarkerParts: (1,0)
# part number, text marker, turn angle, font size
SetMarkerParts: (2,2,0,12)
# part number, text marker, turn angle, font size, horizontal shift, vertical shift
SetMarkerParts: (2,2,0,12, 20,5)
второй параметр — произвольная текстовая строка: вы можете использовать точку, а также специальный символ новой строки \n
# part number, text marker
SetMarkerParts: (1,6)
SetMarkerParts: (2,9.)
# part number, text marker, angle, font size
SetMarkerParts: (2,Battle\nGear,0,12)
SetMarkerParts: (6,R\no\nk\ne\nt\nt\no,0,10)
чтобы узнать номера деталей, нужно включить отображение автоматических цифровых маркеров.
AutoMarkerAutoMarker: 1после того, как вы раскрасите все нужные части, вы можете удалить эту команду или установить для нее значение 0
аналогичной команды для обозначения кругов
AutoMarkerRingесли вы хотите завершить выполнение скрипта
End--------------------------------------------------
Очень важно понимать, что все процедуры выполняются последовательно. если сначала сделать настройку цветов, а потом сортировку деталей. тогда твоя головоломка может запутаться
--------------------------------------------------------------------------------------------
вы можете добавить параметры командной строки чтобы запустить генерацию скриншотов головоломок из указанной папки.
это дает возможность проверить правильно ли формируется внешний вид головоломки, а также работает ли функция "scramble"
есть два режима запуска:
1) с параметром "test" - будут создаваться скриншоты решенной головоломки
"Geraniums Pot.exe" test path_puzzle_folder path_screenshots_folder
2) с параметром "test_scramble" - будут создаваться скриншоты решенной головоломки + scrambled puzzle
"Geraniums Pot.exe" test_scramble path_puzzle_folder path_screenshots_folder
вот пример запуска программы
"Geraniums Pot.exe" test_scramble D:\PycharmProjects\GeraniumsPot\Garden\Galen\ D:\PycharmProjects\GeraniumsPot\ScreenShots\