← Dev Log
BallOrcs2 min read

BallOrcs: sheep to herd, cows to tip, and houses with round doors

Cows that fall over when a fast ball hits them, a sheep-herding prototype, round houses on every level, and a charger that can now aim in a cone.

In plain words

The farm levels got livelier this week. Cows no longer trot politely out of your way: roll into one fast enough and it tips over, kicks its legs, and gets back on its feet a few seconds later. Every level's houses are now round, with round doors and rounded roofs. There is a sheep-herding prototype too. Press the call button and nearby sheep come running to your ball, so you can steer them into a pen. It is still a rough idea, so expect it to change.

Other changes: the chargers can now rush in a cone instead of a single straight line, and every villager you help celebrates in their own way. On a phone, a small camera icon now shows where to drag to look around, and the menus are big enough to tap with a finger.

Under the hood

  • Cow tipping (cow_tip.gd): a ball above 3 m/s that hits a cow tips it onto its side. It stands again after 8 s. Slow touches do nothing. A "Cows tipped: N of M" line appears on the results screen. Orbs, bots and baselines are unchanged.
  • Sheep herding prototype: a fifth ability, the Call, pulls sheep within 18 m toward the ball for 6 s, with a 9 s cooldown. sheep_pen.gd builds a fenced pen with a gate gap at run time. Sheep only cross the fence at the gate. Fast balls scare sheep further.
  • Round houses (tools/levels/open_level.py, house()): a cylinder wall, a flat roof with a torus rim, and a round doorway facing the level's centre line. Two new MultiMesh kinds (disc and torus) carry the new shapes. cyl_facing() returns a proper rotation, because a mirrored one turns the disc inside out and it gets culled.
  • Charger cone mode: cone_angle sets the wedge in degrees either side of aim. The default of 0 keeps the old straight lane. A charger that hits a wall is dazed.
  • Keepsakes: keepsake.gd gives each owner a unique flourish and their own lines, written by add_keepsakes.py. One example: the swim villager dives into the pond with a new splash cue.
  • Fire Fount: a volcanic landscape with a lava plane under the level, three erupting volcanoes, and textured vine walls. One Landscape covers both halves of the instanced Furnace Run.
  • Orchard Halfpipe: the trough bodies join the surface_stick group, so a fast ball rides the wall. The stick is opt-in, so it did nothing in any level until now.
  • Shadows: the sun's shadow pancake on Forward+ and Mobile was clamping long wall vertices into the floor. Fixing that and halving the shadow bias removed a stripe of lit floor at each wall's foot.
  • Touch: touch_controls.gd draws a camera glyph on the right half of the screen, with MOUSE_FILTER_IGNORE, so it never takes a button. ui_scale.gd adds a MenuZoom so menu buttons are fingertip-sized on touch.
  • Controls footer: the hint line follows the last-used device. A HintLabel.SHOWN constant hides the duplicate footer, so it can return with a one-line change.

Play this build: ./infra/fetch-build.sh windows

#levels#prototype#physics#touch#art