Хакинг:Sonic Generations/SonicGLVL
После создания и запаковки уровня, у вас может появиться вопрос, что же дальше? Как мне поставить пружины или ускорители? Как вставить камеры? Здесь можно узнать ответы на все эти вопросы.
Содержание
Быстрый гайд
Многие затрудняются с камерой в SonicGLVLЮ т.к. она не похожа на ту, что есть в 3ds Max'е. Чтобы крутить камеру, зажмите колесико мышки, чтобы крутить влево/вправо/вверх/вниз – alt + колесико мышки. Чтобы приближать – ctrl + колесико мышки.
Объекты
Начнем с объектов в SonicGLVL. В основном, все нужные нам объекты находятся в Common. Там есть все нужное для нормального геймплея – кольца, кольца и панели для ускорения и т.д.
Стоит отметить, что каждый объект нуждается в тщательной калибровке, невозможно с первого раза поставить пружину так, чтобы попасть туда, куда вам нужно. Поэтому приготовьте много валерьянки, ибо бегать между программой и игрой вам придется очень много.
Основные параметры
IsCastShadow
- Если true, то объект будет отбрасывать тень. Если false - то не будет. Стоит отметить, что некоторые объекты не могут отбрасывать тень.
Range
- Это свойство устанавливает расстояние отрисовки объекта. Если диапазон очень низкий, то скорее всего, его не будет видно издали. Если же он наоборот высок, то его можно будет видеть за километр.
- Иногда приходится устанавливать очень большие значения в случае камер и изменений камер; это не только расстояние отрисовки, но и расстояние, на котором объект существует. Если объект попытается взаимодействовать с другими объектами, которые не загружены/не находятся в одной области с ним, то игра, скорее всего, вылетит.
SetObjectID
- Параметр ID объекта, не трогайте этот параметр без надобности.
OutOfControl
- Этот параметр дает понять, как долго эффект объекта будет действовать на Соника. К примеру, если в JumpBoard этот коэффициент большой, то вы не сможете некоторое время управлять Соником после взаимодействия.
IsTo3D
- Если true, то Соник вернется в 3D, если он в 2D разделе. Если false, Соник не будет переключаться обратно в 3D.
Вот немного особенностей некоторых объектов:
Ring
- IsLightSpeedDashTarget
- Если поставить true, то по этому кольцу можно будет пройти с Light Speed Dash, если false, то останется обычным.
GoalSignboard/GoalRing
- ResultsPosition – место, где происходит подсчет баллов. Если вы хотите повернуть камеру, то поверните сам объект.
ClassicItemBox
- IsRevive
- Если поставить true, то объект будет восстанавливаться после того, как вы его использовали. Если false, то его можно будет использовать только один раз.
- ItemType
- 1 = 10 Колец
- 2= 1-Up
- 3 = Speed Shoes
- 4 = Invincibility
- 5 = Skateboard
- 6 = Undefined
- 7 = Undefined (presumably 0)
- 8 = Fire Shield
- 9 = Bubble Shield
- 10 = Thunder Shield
Помните: ItemType 0 не существует, поэтому во избежание вылета игры, использовать его не нужно.
Springs
- FirstSpeed
- Скорость с которой пружина толкает Соника.
- KeepVelocityDistance
- Этот параметр задает, как долго Соник будет сохранять импульс до того, как на него начнёт действовать гравитация.
- MotionType (Modern)
- 0 = Обычная анимация.
- 1 = Обычная анимация.
- 2 = Соник сразу переходит в анимацию падения.
- 3 = Соник сворачивается в шар, после чего разворачивается из него.
- 4 = Трудно объяснить, что за анимация. См.скрин.
- 5 = Вылет.
- 6 = Такая же анимация как если бы соник попал в шарик.
Примечание: MotionType 7 и выше могут привести к вылету.
AdlibTrickJump
- SizeType
- Если 1 - то это нормальный размер. Если 0, то панель будет меньше, чем 1.
ObjectPhysics
- Обычно отвечает за разрушаемые объекты.
- Type
- Полный список объектов:
- bpc_obj_debrisA
- bpc_obj_debrisB
- bpc_obj_debrisC
- bpc_obj_debrisDa
- bpc_obj_debrisDb
- Bpc_obj_redcar
- Bpc_obj_taxi
- BrkDice
- BrkTip
- cmn_obj_tripplate
- cpz_obj_breakbox
- cpz_obj_breakboxtall
- cpz_obj_pipelinecapA
- cpz_obj_pushbox
- cpz_obj_roundirontower
- cpz_obj_shutter
- csc_obj_barricadeA
- csc_obj_barricadeB
- csc_obj_roadconeA
- csc_obj_roadconeB
- csc_obj_roadconeC
- csc_obj_roadconeD
- cte_obj_barricadeA
- cte_obj_bench
- cte_obj_cablecar
- cte_obj_chairA
- cte_obj_house
- cte_obj_house02
- cte_obj_hydrantA
- cte_obj_paperbox
- cte_obj_parasolA
- cte_obj_parasolB
- cte_obj_parkingmeter
- cte_obj_parkingsign
- cte_obj_post
- cte_obj_pushbox
- cte_obj_signal
- cte_obj_tableA
- cte_obj_telbox
- cte_obj_trashbox
- cte_obj_tree
- cte_obj_woodboxA
- euc_obj_barrel
- euc_obj_barrelgold
- euc_obj_boardA
- euc_obj_boardB
- euc_obj_breakirongate
- euc_obj_breakirongates
- euc_obj_chain
- euc_obj_chair01
- euc_obj_chair02
- euc_obj_fence
- euc_obj_flagA
- euc_obj_librarydoor
- euc_obj_librarydoorside
- euc_obj_lid
- euc_obj_manyflagA
- euc_obj_ObstructwindowB
- euc_obj_parasol01
- euc_obj_pole
- euc_obj_polebase
- euc_obj_potplant_benjaminJ
- euc_obj_potplant_dracaenaH
- euc_obj_potplant_green
- euc_obj_potplant_ivyH
- euc_obj_potplant_mixFF
- euc_obj_pushbox
- euc_obj_smallbarrel
- euc_obj_tableA
- euc_obj_tableB
- Floor_4bxh8
- ghz_obj_tn1_purplerock
- ghz_obj_tn1_purplerockmini
- IronBox
- IronWoodBox
- MotionTest
- pipe1
- pipe2
- pla_ks2_barricade
- pla_ks2_oildrum
- pla_ks2_plabox
- pla_ks2_safetydrum
- pla_obj_ExcavatorCutter
- pla_obj_ExcavatorDrill
- pla_obj_Redlight
- pla_obj_signarrowA
- PulleyBase
- PulleyStand
- sph_obj_barricadeA
- sph_obj_breakwindowA
- sph_obj_breakwindowB
- sph_obj_breakwindowC
- sph_obj_breakwindowD
- sph_obj_cartA
- sph_obj_chairA
- sph_obj_doorA
- sph_obj_drumA
- sph_obj_drumsetA
- sph_obj_exhaustportA
- sph_obj_glassgroundA_000
- sph_obj_glassgroundA_001
- sph_obj_guardrailA
- sph_obj_helicopter_stop
- sph_obj_hoteltableA
- sph_obj_nolightcarA
- sph_obj_nolightcarB
- sph_obj_nolightcarC
- sph_obj_nolightcarD
- sph_obj_potplantB
- sph_obj_roadcornA
- sph_obj_roadcornB
- sph_obj_roketglassA
- sph_obj_roketglassB
- sph_obj_searchlight_blue
- sph_obj_searchlight_red
- sph_obj_searchlight_ylw
- sph_obj_sofaA
- sph_obj_tableA
- sph_obj_trunk
- ssh_obj_bobsleigh_gate
- ssh_obj_breakroof01A
- ssh_obj_breakroof01B
- ssh_obj_breakroof02
- ssh_obj_broken-door
- ssh_obj_flagA
- ssh_obj_floorx
- ssh_obj_pot
- ssh_obj_pushbox
- ssh_obj_signarrow
- ssh_obj_whalehead
- ssh_obj_whalestatue
- ssz_obj_breakgroundA_02_brk_001
- ssz_obj_breakgroundA_02_brk_002
- ssz_obj_breakgroundA_02_brk_003
- ssz_obj_breakgroundA_02_brk_004
- ssz_obj_breakgroundA_02_brk_005
- ssz_obj_breakgroundA_02_brk_006
- ssz_obj_breakgroundA_02_brk_007
- ssz_obj_breakgroundA_02_brk_008
- ssz_obj_breakgroundA_02_brk_010
- ssz_obj_breakgroundA_02_brk_011
- ssz_obj_breakgroundA_02_brk_012
- ssz_obj_breakgroundA_02_brk_013
- ssz_obj_breakgroundA_02_brk_014
- ssz_obj_breakgroundA_02_brk_015
- ssz_obj_breakgroundA_02_brk_016
- ssz_obj_breakwindowA
- ssz_obj_breakwindowB
- ssz_obj_breakwindowC
- ssz_obj_breakwindowD
- ssz_obj_brkwinAnoBound
- ssz_obj_debrisA_000
- ssz_obj_fallingdebris_000
- ssz_obj_guidestick_20M
- ssz_obj_guidestick_7M
- ssz_obj_signarrow
- ThornBallDynamic
- ThornContainerSideBrk
- ThornContainerUpBrk
- ThornCylinder2M
- ThornCylinder3M
- WoodBox
Switch
- Type
- 0 = Если активировать, то уже не выключится.
- 1 = Если сойти с него, то он выключится.
- 2 = Если один раз активировать, то он деактивируется только через время, заданное в "OffTimer".
General Floor
- Модель каждой панели зависит от уровня, в котором вы его ставите.
- Amplitude
- Устанавливает, насколько платформа перемещается, если движение разрешено.
- Cycle
- Устанавливает скорость движения платформы, если движение разрешено.
- MoveType
- 0 = Без движения
- 1 = Движение вверх и вниз
- 2 = Движение влево и вправо
- FloorSize
- Нормальный размер где-то в районе 0-3. Чем больше значение, тем больше платформа будет.
- FloorType
- 0 = Обычная платформа
- 1 = Падающая платформа
- 2 = Блок
SetRigidBody
Этот объект создает невидимую стену (или пол).
- Collision_Height
- Параметр задает высоту.
- Collision_Length
- Задает параметр длинны.
- Collision_Width
- Задает параметр ширины.
Cannon
- BaseVel
- Задает высоту выстрела пушки. Если она слишком большая, то Соник может вылетать за уровень и не попасть в точку назначения. Но если значение маленькое, то Соник не достигнет своей цели и упадет раньше.
- DstPos
- Позиция, где Соник приземлится.
Коллизии
Что такое коллизия, вы знаете из создания уровня, там это была простая твердость. Тут у нас в руках есть куча разных включателей коллизии, от повышения гравитации до ускорения соника. Вот небольшой список того, что на данный момент известно:
Основные параметры коллизий
Collision_Height
- Параметр задает высоту.
Collision_Length
- Задает параметр длинны.
Collision_Width
- Задает параметр ширины.
Прочие параметры коллизий
GravityChangeCollision
- Эта коллизия изменяет гравитацию внутри.
JumpCollision
- Дает импульс Сонику.
ImpulseSpeedOnBoost
- Задает силу импульса, который даст коллизия, когда Соник использует буст.
ImpulseSpeedOnNormal
- Задает силу импульса, который даст коллизия, когда Соник бежит без буста.
Pitch
- Это параметр, который задает угол запуска Соника.
SpeedMin
- Устанавливает, насколько быстро Соник должен пройти для того, чтобы активировать действие коллизии.
FallDeadCollision
- Когда Соник проходит через эту коллизию, он умирает.
SlidingCollision
- Коллизия заставляет Соника скользить.
Враги
Враги находятся во вкладке Enemy. Там есть враги как для 2D-вида, так и для 3D. Но для того, чтобы ваши враги работали, и игра не вылетала, вам в вашем моде обязательно нужна будет папка bb3 в которой будет #Application.ar.00.
Невозможно поставить, к примеру, Egg Pawn'а в Green Hill Zone (далее GHZ), т.к. данных о нём в GHZ попросту нету. Для этого распаковываем #Application.ar.00 (по известному уже нам принципу), и внутри ищем файл EnemyArchiveTree.xml а уже в нем строку:
<DefAppend>
<Name>ghz_cmn</Name> (название уровня, расшифровка дана в первом туториале)
<Archive>EnemyCommon</Archive> (название врага)
<Archive>EnemyBeeton</Archive>
<Archive>EnemyBatabata</Archive>
<Archive>EnemyGanigani</Archive>
<Archive>EnemyMotora</Archive>
</DefAppend>
Если в GHZ вам нужен Egg Pawn, то находим строку о ssh и строку о Egg Pawn'е.
<Archive>EnemyEPawnCommon</Archive>
Далее вставляем последовательно в GHZ и сохраняем, перепаковываем и сохраняем это в наш bb3.
Камеры
А теперь мы подошли к самому трудному в нашем хакинге. Порой, чтобы сделать камеру такой, какой вы хотите, уходит уйма времени, от часа и до нескольких дней. Но это лишь настройка, а создать камеру легче простого.
Как заставить камеры работать
Создаем ChangeVolumeCamera - это пространство, в котором камера будет действовать. (ЭТО НЕ КАМЕРА) Необязательно чтобы камера была внутри него. Учтите, что от того, где будет начало камеры, и конец будет зависеть её эффектность. Для того, чтобы этот объект знал, к какой камере он принадлежит, вам требуется прокрутить список вниз и найти Target, где вы сможете указать свою камеру.
Также, на эффектность камеры влияет время входа и выхода камеры, параметр Ease_Time_Enter/Leave, трудно объяснить, что это, но вы сами попробуйте сначала поставить 1, а потом 20 и все поймете.
Далее, мы выбираем нужную нам камеру, обычно используется Parallel или Pan и иногда PanVertical камеры. Вот неполный список того, что они делают и как настроить:
Виды камер
- objCameraParallel – Эта камера двигается параллельно Сонику в зависимости от параметров.
- objCameraPan - Камера перемещается в точку, где стоит этот объект и смотрит оттуда на Соника, тут важную роль играет пространство VolumeCamera.
- objCameraPanVertical – Обычно нужна для моментов, где нужно подниматься на ступеньки или же вверх, очень интересно действует.
Настройки камер
objCameraParallel
- Distance - дистанция от камеры к Сонику, обычно нормальная дистанция - 10, 15. Близкая - 3 и все, что ниже.
- Время входа и выхода лучше задавать в Volume камере.
- Fovy - непонятно пока, что это, но когда ставишь какие-то значения, которые отличаются от 45, то камера ведет себя неистово глючно.
- IsCollision - если ставить true, то камера НЕ будет выходит за приделы коллизии уровня. Если false, то будет.
- IsControllable - если ставить true, то движение камеры будет зависеть от движения соника, если false то будет фиксирована.
- Pitch - наклон камеры по вертикали.
- TargetOffest_Right - сдвиг камеры влево или вправо. Ставятся отрицательные значения, чтобы сместить влево, и положительные - вправо.
- TargetOffest_Up - высота, на которой камера находится. Если в pan этот параметр задается относительно высоты, на которой вы поставили объект, то тут задается параметром. Тут можно ставить и отрицательные значения. Предпочтительные значения - -0.2 или же -0.6.
- TargetOffest_Vel - лучше не трогать. Если ставить значения больше 0.5, то камера при бусте Соника будет амортизировать, и отдаляться от него. Можно поставить 0, чтобы она никуда не отдалялась. Но тут уже все зависит от потребностей.
- Yaw - наклон (или же угол) камеры по горизонтали.
objCameraPan
Тут вся суть в том, что высота и наклон, и все-все остальное задается не вручную (это очень все облегчает), а самим расположением объекта (можете камерой SonicGLVL присмотреть себе ракурс и примерно поставить туда камеру, такой же вид будет и в игре). А все остальные настройки, как и в parallel, да и в других камерах такие же.
objCameraPanVertical
Настройки такие же, как и в parallel, а высота и расположение зависит от расположения в самом SonicGLVL, как и pan камера.
CameraCollisionBoard
Самая сложная коллизия для использования камеры. Представлена двумя отдельными объектами (воротами), одна – вход( включение камеры), вторая – выход (выключение). Она имеет очень много плюсов, но столько же и минусов перед ChangeVolumeCamera. К примеру, переходы между камерами будут более четкими, есть возможность использовать в узких местах, можно зациклить в бесконечное использование. Минусы: если проскочить объект, то камера не будет включена или выключена. Чтобы вам было легче, вот примеры для использования и сами параметры (не по порядку, чтобы было понятнее):
- BCameraID(_) – ID камеры, которая будет использоваться. Фактически тоже самое, что и Target.
- BLinkObjID(_) – ID следующей коллизии.
- ALinkObjID(_) – ID предыдущей коллизии (только для второй коллизии, в первой оставить 0)
- ALinkSide(_) – ставить 1 на второй коллизии, и 0 на первой.
- EaseTime: AtoB (_) – время включения камеры между коллизиями, тоже самое, что и Ease_Time_Enter/Leave. Ставить значения в первом и втором.
- BtoA(_) – включать только на третьем и более слоях.
- BCameraPriority(_) – приоритет камеры над стандартной, или, если она находится внутри ещё одной.
Примечание: Если камера не будет работать, лучше всего попробовать включить/отключить приоритет и ALinkSide.
Примеры использования
Обозначения:Пусть A – ID первой коллизия, В – ID второй, A1 – ID третьей, B1 – ID четвертой. C – ID первой камеры и т.д.
1. Пустота-A-B-пустота + C
К примеру, вам нужно использовать только одну камеру в определенном месте:
Первый объект:
- ACameraID(0)
- ALinkObjID(0)
- ALinkSide(0)
- BCameraID(C)
- BLinkObjID(B)
- EaseTime_AtoB(ваше время)
- EaseTime_BtoA(0)
Второй объект:
- ALinkObjID(A)
- ALinkSide(1)
- BCameraID(0)
- BLinkObjID(0)
- EaseTime_AtoB(ваше время)
- EaseTime_BtoA(0)
Готово.
2. Пустота-A-B-A1-B1-пустота + С,С1,С2
К примеру, вам нужно использовать несколько камер подряд:
Первый объект:
- ACameraID(0)
- ALinkObjID(0)
- ALinkSide(0)
- BCameraID(C)
- BLinkObjID(B)
- EaseTime_AtoB(ваше время)
- EaseTime_BtoA(0)
Второй объект:
- ALinkObjID(A)
- ALinkSide(1)
- BCameraID(С1)
- BLinkObjID(A1)
- EaseTime_AtoB(ваше время)
- EaseTime_BtoA(0)
Третий объект:
- ALinkObjID(В)
- ALinkSide(1)
- BCameraID(С2)
- BLinkObjID(В1)
- EaseTime_AtoB(ваше время)
- EaseTime_BtoA(ваше время)
Четвёртый объект:
- ALinkObjID(A1)
- ALinkSide(1)
- BCameraID(0)
- BLinkObjID(0)
- EaseTime_AtoB(ваше время)
- EaseTime_BtoA(0)
3. Так же можно закрутить в круг, для этого стоит в последней коллизии указать первую. Вот и все.
3D и 2D
Переходы от 3D и 2D задаются двумя вещами – сплайнами и объектами серии Changers. Этот пункт написан для тех, кто уже сделал сплайны для своего уровня. (если нет, смотрите туториал по сплайнам)
- Переход в 2D осуществляется с помощью объекта ChangeMode_3Dto2D. Ставится он обычно так, чтобы буковки EDOM были расположены к Сонику. (т.е. входить он должен в EDOM а не в MODE). Также, чтобы 2D все-таки заработало, вам нужно поставить False в параметре m_IsEnableFromBack, хотя иногда это и не нужно. Ставится ВСЕГДА этот объект там, где начинаются сплайны и не где-то в другом месте.
- Переход обратно в 3D осуществляется с помощью либо ChangeMode_3DtoForward, либо Dash. Тут уже менять в настройках ничего не нужно.
Material Editor
Материал Эдитор - очень важная штука. Он позволяет применять шейдеры к вашим материалам.
Разнообразие шейдеров дает вам огромный простор для фантазий.
Рассмотрим использование шейдеров на примере создания анимированной воды:
- Для того, чтобы добавить шейдер, нужно выбрать нужный объект, к примеру, waterssh.
- После чего выбираем нужный нам шейдер, к примеру, Water_Opacity_SoftEdge (самый оптимальный для воды).
- Дальше нам требуется добавить текстуры. Нажимаем Add Texture. Нам нужны текстуры dif, nrm, evn (их можно взять в уровне ssh). Для этого выбираем нужный вид и выбираем текстуру.
- После чего можно отредактировать движение воды (это особенно важно для водопадов), для этого стоит ставить отрицательные или положительные значения в g_WaterParam.
- После чего нужно нажать Apply Changes, иначе ничего не сохранится.
Список шейдеров воды:
- Water_Mul_SoftEdge
- Water Add
- Water_Opacity
- Water_Mul
- Water_Opacity_SoftEdge
- Water Add_SoftEdge
В принципе, все они дают один и тот же эффект, но немного различаются. Более полный список шейдеров будет приведен позже.
SonicGLvlSVN
В чем суть, чтобы создать разрушаемые объекты вам понадобится бета-версия SonicGLVL, т.к. она имеет много разных плюшек и доработок. (а также over9000 багов) Как это сделать:
Для начала качаем TortoiseSVN, устанавливаем. После чего выбираем папку, где лежит ваш SonicGLVL и кликаем правой кнопкой мыши. Выбираем SVN Checkout.
Вводим эту ссылку и скачиваем необходимый файл.