Files
llamamod/docs/manual/11-cameras-triggers.md
T

201 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Cameras and triggers
The game has no free camera: it follows the llama on its own, and special objects in the level
change how it does that – camera zones, focus points and cut scenes. Other invisible objects react
when the llama enters an area or comes close: secrets, cut-scene triggers, force zones. This
chapter shows how to see, set up and tune all of them.
![A CameraSide zone with its box and the computed game camera](img/obj_camera_zone.jpg)
## How the game camera works
During play the camera hangs behind the llama at a certain **distance** and **height** and turns
with it smoothly. Camera objects change these values while the llama is inside their area:
* a **camera zone** sets the height, distance and often a fixed view direction (yaw),
* a **focus point** turns the camera towards an object when the llama is near,
* a **cut scene** takes over the camera completely and flies it along a path.
All camera objects are invisible in the game. In the editor they are drawn as markers, their
areas as boxes and their cameras as frusta (pyramids showing the view).
## The start camera
The **Llama** (the player start) owns a waypoint chain. Its **first node is the camera's start
position** when the level begins; the game then moves the camera to its normal place behind the
llama. Levels made with the editor put this node 8 cells behind the llama (the
[Player start](09-objects.md#player-start) setup keeps it there when you move the start).
The Llama's *Camera mode* parameter switches between the normal and an alternative camera
behaviour.
> **Note:** In the original levels the Llama's chain is often a longer list used by the level's
> scripts (for example the village's fly-by at the start). Edit it with care.
## Camera zones
A camera zone is an object with a **box**: two waypoints marking opposite corners on the ground.
While the llama stands inside the box (the game only tests x and z), the zone controls the camera.
Edit the box with the [Zones and triggers tool](#the-zones-and-triggers-tool-j).
### CameraSide
The most common camera zone. Its parameters (Inspector → **Object parameters**):
| Parameter | Meaning |
|---|---|
| **Height** | Camera height above the llama, 0 = keep the current value |
| **Distance** | Horizontal distance behind the llama, 0 = keep |
| **Yaw mode** | **free**; **node yaw** – the camera looks in the direction of the zone's first node; **node yaw ±180°** – that direction or the opposite one, whichever is closer to the current view; mode 3, mode 4 (unknown) |
| **Height limit** | Only active while the llama is below the first node's height |
| **Flag 0x10000** | Sets an object flag (purpose unknown) |
| **Several boxes** | The chain holds several boxes (node pairs 1–2, 3–4 …) |
| **Height offset** | Added to the camera height |
| **Alt. height** / **Alt. distance** | Used instead of Height / Distance in a special game state |
| p5 … p9 | Not decoded (originals use small values) |
With the **Camera frusta** layer on, a selected CameraSide shows where the game camera will be:
the editor assumes the llama in the centre of the first box (and distance 2, height 1 when the
parameters are 0).
![Entering the camera zone switches to the high view in the game](img/obj_game_camera_zone.jpg)
> **Tip:** The easiest way to set up a CameraSide is [Look through camera](#look-through-camera):
> select the zone, press **Ctrl+Shift+L** and fly the viewport to the view you want. Height,
> distance and the node yaw follow.
### CameraLift
A camera zone for lifts and object-relative views, with one box.
| Parameter | Meaning |
|---|---|
| **Yaw source** | **none**, **object yaw** (the camera turns with the zone object) or **player yaw** |
| **Use helper position** | Tests the box against a helper object instead of the llama |
| **Smooth** | Softer camera movement |
| **Height limit** | Only while the llama is below the node's height |
| **Flag 0x10000**, p2 | Not fully understood |
### CameraSetDistance and CameraFocusPoint
* **CameraSetDistance** sets several camera values while it is active: *Height* and four raw values
(*Value g82*, *g68*, *g83*, *g73*) whose exact effect is not known yet.
* **CameraFocusPoint** turns the camera towards the object while the llama is within **Radius**.
Further parameters: *Min. height*, *Max. angle* (largest angle between object and view),
*Height limit*, three flags and *Blend* (0–1, how fast the camera turns). The radius can be
dragged in the viewport (see [Radius triggers](#radius-triggers)).
## Cut scenes
Cut scenes are made of two kinds of objects:
* **CutSceneTrigger** starts a scene when the llama comes within its **Radius**. Its chain is the
camera path. Parameters: *Character* (the trigger is a talking character: drops onto the floor),
*Radius*, *Event bit* (the scene is skipped once this progress bit is set – so it plays only
once), *Height check* (the llama must also be above the trigger), *Flags* (1 = face the
llama, 2 = cannot be skipped) and two flags whose purpose is unknown.
* **CutSceneCameraDirectional** is the camera of a scene. Every node of its chain is a camera
position; the node's **yaw** and **pitch** give the view direction. Parameters: *Event bit*,
*Mode*, *Wait*, *Disabled* (removes itself at the start), *End mode*.
The dialogue, animations and character movements of a scene are part of the object scripts and
cannot be edited – but you can move, re-aim and re-time the camera, move the trigger and change
its radius.
![Camera frusta of a cut-scene camera path](img/obj_cutscene_frusta.jpg)
## Camera frusta layer
The **Camera frusta** layer (options bar → **Layers**, on by default) draws, for the selected
objects:
* **CameraSide** / **CameraLift** – the computed game camera looking at the zone,
* **cut-scene cameras** and **camera nodes** – a frustum at every node, pointing along the
node's yaw and pitch.
The game's field of view is approximated with 60°.
## Look through camera
**View → Camera → Look through camera (pilot)** (**Ctrl+Shift+L**), or the **Look through**
buttons in the Inspector and the options bar of the Zones and triggers tool, turns the viewport
into the selected camera:
| Selection | The viewport shows | Flying changes |
|---|---|---|
| A camera node (any waypoint) | The view from the node | Node position, yaw and pitch |
| A cut-scene camera or other camera object | The view from the first node of its chain | That node's position, yaw and pitch |
| A **CameraSide** zone | The game camera of the zone | *Height*, *Distance* and the first node's yaw |
| A **CameraLift** zone | The game camera of the zone | The first node's yaw |
While pilot mode is on, fly as usual (right mouse button + **W A S D**, **Q / E**) – the camera
object follows the viewport, and the whole pilot session is **one undo step**. Press
**Ctrl+Shift+L** again, or select something else, to end it. The status bar shows *Piloting …*
while it is active.
![Piloting a camera: the viewport is the camera](img/obj_pilot.jpg)
> **Note:** The first node of some original cut-scene cameras is a fly-in start point, so looking
> through it may show a wall.
## The Zones and triggers tool (J)
The **Zones & triggers** tool (toolbar, key **J**) adds handles to the selected object:
* **pink corner handles** at the four corners of each box of a box zone – drag a corner to resize
the box; the opposite corner stays,
* a **yellow radius knob** for every radius parameter (CutSceneTrigger, CameraFocusPoint, guards'
view and chase ranges, ForcePlayerMovement, Bunny) – drag it to change the radius; the status
bar shows the value.
Grid snapping applies (Ctrl inverts it). Clicks elsewhere select as usual. The options bar has a
**Look through camera** button for camera zones. Each drag is one undo step.
![Dragging the corners of a secret area](img/obj_zone_handles.jpg)
### Box zones
These types use one box (two nodes) – or, for CameraSide with *Several boxes*, several pairs:
| Type | Effect while the llama is inside |
|---|---|
| **Secret** | Shows the secret message and counts the secret (needs *Box area* on) |
| **CameraSide**, **CameraLift** | Camera control, see [Camera zones](#camera-zones) |
| **ObjectDontDropInBox** | Objects (for example fruit from smashed pots) are not dropped here |
| **FallOffNoHurt** | Falling off costs no energy (optional *Game state* condition) |
| **RiverCurrentBox** | River current (not decoded in detail) |
The box is a rectangle on the ground; the game ignores the height. The editor draws it with an
estimated height of about 1.2 cells above the lower node.
### Radius triggers
Radius parameters are distances in cells. The scripts compare the *squared* distance, which the
editor handles for you – just enter or drag the radius. The **Zone areas & trigger radii** layer
draws the circles of the selected objects.
![The trigger radius of a cut-scene trigger](img/obj_trigger_radius.jpg)
## Force and water objects
* **ForcePlayerMovement** pushes or steers the llama towards the points of its chain while it is
within *Radius*: *Active*, *Radius*, *Game state* (only in that state), *Lock controls*,
*Align yaw* (the llama turns to the node's yaw).
* **WaterReboundPoints** (and **WaterReboundPointsTurnsOff**): the points of its chain are where
the llama is thrown back to after falling into water. Parameter *Active*.
## Zone areas layer
The **Zone areas & trigger radii** layer draws the boxes of **all** zone objects as outlines and
fills the boxes and radius circles of the **selected** ones. Switch it off in a busy original
level if the outlines get in the way.
## Known limits
* The camera preview of CameraSide assumes the llama in the box centre and the default distance
and height when the parameters are 0; the real camera also depends on where the llama enters.
* Zone heights in the viewport are estimates; the game tests x and z only.
* Many camera parameters are only partly understood (*p5 … p9*, *Value g…*). Copying values
from similar zones in the original levels works best.
* Cut-scene content (dialogue, animation) cannot be edited.