WIKI

Mods

Ambient birds

Las guías de mods están en inglés, tal como vienen con el juego.

Birds cross the arena from random points outside the frame, alone or in flocks, over the pit and out the far side. Which species fly depends on the time of day, and nobody flies in rain or a sandstorm: when a storm starts the birds already in the air turn away and leave, and new arrivals wait until the sky has been clear for a few seconds.

They are scenery only. They have no collision, never touch the combat RNG and are never saved, so a mod that only changes birds keeps the vanilla profile (achievements, XP and leaderboards stay on).

A mod changes birds with two optional files beside mod.json:

my_birds/
  mod.json
  birds.json            species, flocks, timing and limits
  models.json           Birds/<Name> GLBs (new species or replacements)
  Models/Flamingo.glb

The shipped values are in vanilla_reference/birds.json (a copy of the game's Data/birds.json). example_birds adds flamingos at dusk and retunes two vanilla species; its Blender source is included.

birds.json

{
  "version": 1,
  "settings": {"density": 1.3},
  "species": {
    "flamingo": {"model": "Birds/Flamingo", "active": {"twilight": 3, "night": 1},
                 "group": [6, 16], "flock_chance": 1.0, "formation": "v"},
    "sandgrouse": {"group": [10, 24]},
    "raven": {"active": {"day": 0}}
  }
}

Mods are merged in load order over the vanilla file: settings key by key and species by id. An id that already exists keeps every field you leave out, so {"raven": {"active": {"day": 0}}} only silences ravens by day. A new id needs a model; the fields it omits come from the vanilla raven, except call_family, which defaults to none for new species. A field that fails validation is named in the log and the Mods screen, and the value before it is kept.

settings

FieldVanillaMeaning
enabledtruefalse removes every bird
audio_enabledtrueenable positional wing strokes and bird calls
density1.0arrival rate multiplier, 0–5
first_arrival_seconds[4, 10]first flight after a run or replay starts
interval_seconds[18, 44]pause between arrivals, divided by density
max_birds[18, 30, 48, 64]birds in the air at once on Low, Medium, High, Ultra
shadows[false, true, true, true]sun shadows per preset
grounded_by_rain / grounded_by_sand0.06storm strength (0–1) above which nobody flies
leave_speed1.8speed multiplier of birds fleeing a storm
return_delay_seconds8clear sky needed before the next arrival
crossing_radius1500how far from the arena flights start and end, in world units
light_bandsday [0.82, 1.01], twilight [0.32, 0.86], night [0, 0.36]the hour's luminance for each band

The hour is the luminance of the world's time-of-day tint: 1.0 at noon, about 0.60 at dusk and 0.19 at night. It moves with the waves (day turns to dusk on difficulty 1, dusk to night on 2, night to dawn on 3) and follows a mod's time_of_day settings, so bands are the robust way to target an hour.

species

FieldMeaning
call_familynone, corvid, small or owl; new species default to none
call_interval_secondsinterval [min, max] between calls, each from 4 to 180 seconds
call_gain_db, wing_gain_dbindependent event gains, from −60 to 0 dB; a quieter owl wing is built in
modela Birds/<Name> model key: a stock one or one from your models.json
activelight bands it flies in: ["day", "twilight"], or weights {"day": 3, "twilight": 1}; 0 disables
group, flock_chanceflock size [min, max], and the chance a flight is a flock instead of one bird
formationsolo, loose (spread pairs and parties), cluster (a tight flock whose turns ripple through it), v (a skein with near-synchronous wingbeats) or thermal (soarers that circle and climb over the arena before gliding on)
spacingdistance between flock members, in wingspans
altitude, speed, sizeheight above the pit floor (the plateau is at 137), cruise speed in units per second, and a random scale
wingbeat_hz, flap_degrees, hand_degrees, sweep_degreeswingbeat frequency; arm stroke; how far the hand bends at the wrist; how far it sweeps back on the upstroke
dihedral_degrees, glide_dihedral_degrees, glide_hand_degreesthe wings' mean lift while flapping and gliding (a buzzard glides in a shallow V, a swift slightly drooped)
flap_seconds, glide_secondsbouts of flapping and of gliding; [0, 0] glides never
turn_degrees, bank_degrees, wanderturn rate per second, lean into turns, and how much the flight weaves
thermal_loops, thermal_radius, thermal_climbcircles, radius and climb rate for thermal birds
sheen, feather_lines, backlight, barringplumage gloss, the procedural feather edges, light through sunlit flight feathers, fine dark barring
feather_relief, feather_contraston the stock models only: depth and contrast of the feather maps (overlapping contour feathers, flight feathers with their shafts) that replace the procedural feather edges
plumage_patternstock feather pigment style: plain (default), speckled, barred, or mottled; follows individual feather coordinates. Strength uses plumage_markings. Replacement GLBs keep their own material.
plumage_markingsstock feather pigment streaks and pale tips, 0–2; 0 disables them. The markings follow the wingbeat and fade below pixel size; replacement GLBs keep their own finish

Flight sounds

Wing strokes follow the descending wing pose. Gliding is silent; calls are spaced events attached to the visible birds. Position, height and distance from the shared overview/cockpit camera determine stereo direction, volume and the loss of distant high frequencies. Zooming near their altitude makes nearby wings easier to hear. They use the Sound Effects volume setting. Pause suspends playback; departing birds release their sources, and a run reset clears them. The showcase is silent. At most eight wing events and three calls can play together, even with large modded flocks.

The stock call families use field recordings: corvid calls for ravens, short mixed-bird calls for swifts and sandgrouse, and owl hoots. Other species have wing sounds only. A new species must explicitly choose a family if desired; it never inherits the raven call. These are artistic families, not a complete species-specific sound library.

The normal sounds.json overrides can replace bird_wing_0 through bird_wing_2, bird_corvid_0/1, bird_small_0/1 and bird_owl_0/1. Use short, mono events with no leading silence for accurate spatialization. The CC0 sources and preparation steps are documented in Assets/Sounds/Birds/CREDITS.md and tools/audio/prepare_bird_audio.py.

Bird models

A bird is one GLB at its in-game size, in Torreta's Blender frame (X forward, Y left, Z up), with the origin between the shoulders and the wings spread flat. The game flaps the wings on the GPU, so a model has no bones or animations. It carries its rig as data:

  • UV map 2 (BirdRig): U is the signed span, 0 at the shoulder and ±1 at the wingtip, positive on the bird's right; V is the part: 0 body, 1 wing, 2 tail (U runs 0 at the vent to 1 at the tip, and the tail spreads in turns), 3 head, 4 legs. Blender's glTF export flips V, so write 1 - part in Blender.
  • Empties ShoulderL, ShoulderR, WristL, WristR, children of the model's root: the two hinge lines of each wing. The hand (beyond the wrist) folds and sweeps back on the upstroke.

Both are optional. Without the UV map the game derives the wing from the span (everything beyond the shoulder flaps, the rear of the body is tail); without the empties it places the shoulder at 12% and the wrist at 52% of the half-span. An untagged GLB still flies, only more stiffly.

tools/art/build_blender_birds.py builds the eight stock birds with this rig and tools/mods/build_bird_example.py builds the flamingo from the same code.

In models.json use "material": "game" for vertex-coloured plumage, lit like the stock birds, or "imported" to keep your own PBR colour, texture and roughness (a texture replaces the procedural feather lines). Keep a bird under about 6,000 triangles: up to 64 can be in the air at once.

A mod may also replace a stock bird by shipping its key, for example "Birds/Raven": {"file": "Models/MyCrow.glb", "material": "game"}.

Checking a bird

Enable the mod in Options → Mods and restart. With the in-game admin weather panel (F8) you can set the hour's weather to rain to watch the birds leave. In the repository, ART_REVIEW_BIRDS=1 runs the native review: species by hour, weather, limits, the reset and a close-up photograph of every species.

ART_REVIEW_REGRESSION=bird_audio ART_REVIEW_AUDIO_DRIVER=CoreAudio checks real mixed distance/height attenuation, stereo passage, gameplay zoom, pause, mod controls and bounded playback. Use a real native audio driver: Dummy does not mix any samples. On Windows, use WASAPI instead.