The PHP binding

The Clunkyard robot API in PHP, through the FFI extension and the core's C ABI. The API classes, records and declarations are generated from protocol/v2/api.json; only the run loop and exception mapping are written by hand. Tracking, physics, parsing and serialization stay in the core.

Install with make install SDK=/opt/clunkyard/sdk. Run with php -d ffi.enable=preload -d include_path=/opt/clunkyard/sdk/bindings/php bot.php. The binding loads libclunkyard.so.2, or CLUNKYARD_LIB.

Subsystems are properties and facts are methods. Names use camelCase. Optional results are null; records have public fields and enum values use their protocol strings. Controls accept positional or named arguments and change only supplied fields in the turn. drive->get('throttle') reads a pending field. Throw new Clunkyard\Forfeit(code, message) to forfeit. Other exceptions are logged with their trace and send the controls already set. Clunkyard\play(robot, lines) plays in memory for tests.

A tiny robot

<?php
require 'clunkyard.php';
use Clunkyard as cy;

class Tiny extends cy\Robot {
    public function onTurn():void{
        $target=$this->sensors->nearest();
        if($target===null){
            $this->drive->set(throttle:0.75,turn:0.25);
            $this->scanner->set($this->me->heading(),40);
            $this->status->set('SEARCH',$this->scanner->last()->arc);
            return;
        }
        $power=$this->gun->powerForFlightTime($target->range,1);
        $aim=$this->gun->lead($target,$power);
        $this->gun->aim($aim?->heading??$target->bearing,$aim?->pitch??$target->elevation);
        if($this->gun->canFire($power,10))$this->gun->fire($power);
        $this->drive->set(throttle:0.5,turn:$this->angles->clamp($this->angles->angleDiff($target->bearing,$this->me->heading())));
        $this->scanner->set($target->bearing,10);
        $this->status->set('TRACK',$target->range);
    }
}
cy\run(new Tiny());

make test SDK=... compares every API vector and emitted act with the core's transcript, including exact floating-point bits. The README robot also participates in the cross-language identity check.

Names

Every entry of the robot API 2.0.0 in PHP. names.md has every language side by side.

Canonical Form PHP
match.mode property match->mode()
match.ruleset property match->ruleset()
match.control property match->control()
match.robots property match->robots()
match.is_3d property match->is3d()
match.tick_rate property match->tickRate()
match.max_ticks property match->maxTicks()
match.robot_id call match->robotId()
clock.tick property clock->tick()
clock.seconds property clock->seconds()
clock.remaining_ticks property clock->remainingTicks()
arena.size property arena->size()
arena.gravity property arena->gravity()
arena.terrain_kind property arena->terrainKind()
arena.ground_height call arena->groundHeight()
me.health property me->health()
me.position property me->position()
me.velocity property me->velocity()
me.heading property me->heading()
me.pitch property me->pitch()
me.roll property me->roll()
me.angular_velocity property me->angularVelocity()
me.attitude property me->attitude()
me.grounded property me->grounded()
me.altitude property me->altitude()
me.applied property me->applied()
battery.charge property battery->charge()
battery.capacity property battery->capacity()
battery.regen property battery->regen()
battery.sustainable_drive property battery->sustainableDrive()
battery.compute property battery->compute()
battery.drive_cost call battery->driveCost()
drive.hover_lift property drive->hoverLift()
drive.set control drive->set()
drive.forces control drive->forces()
drive.get call drive->get()
gun.aim_now property gun->aimNow()
gun.cooldown_ticks property gun->cooldownTicks()
gun.spread property gun->spread()
gun.max_power property gun->maxPower()
gun.damage_scale property gun->damageScale()
gun.can_fire call gun->canFire()
gun.shot_speed call gun->shotSpeed()
gun.shot_cost call gun->shotCost()
gun.reload_ticks call gun->reloadTicks()
gun.shot_damage call gun->shotDamage()
gun.power_for_speed call gun->powerForSpeed()
gun.power_for_flight_time call gun->powerForFlightTime()
gun.lead call gun->lead()
gun.lead_point call gun->leadPoint()
gun.aim control gun->aim()
gun.fire control gun->fire()
gun.get call gun->get()
scanner.last property scanner->last()
scanner.proximity_range property scanner->proximityRange()
scanner.reach call scanner->reach()
scanner.arc_for_reach call scanner->arcForReach()
scanner.set control scanner->set()
scanner.get call scanner->get()
sensors.contacts property sensors->contacts()
sensors.nearest property sensors->nearest()
sensors.cues property sensors->cues()
sensors.contact call sensors->contact()
sensors.position_of call sensors->positionOf()
tracker.cue property tracker->cue()
tracker.nearest_bearing_rate property tracker->nearestBearingRate()
tracker.velocity call tracker->velocity()
tracker.position call tracker->position()
tracker.last_seen call tracker->lastSeen()
tracker.configure call tracker->configure()
nav.zone property nav->zone()
nav.zone.margin call nav->zone->margin()
nav.zone.contains call nav->zone->contains()
nav.zone.distance_from call nav->zone->distanceFrom()
nav.storm property nav->storm()
nav.storm.margin call nav->storm->margin()
nav.storm.contains call nav->storm->contains()
nav.storm.distance_from call nav->storm->distanceFrom()
nav.hill property nav->hill()
nav.hill.margin call nav->hill->margin()
nav.hill.contains call nav->hill->contains()
nav.hill.distance_from call nav->hill->distanceFrom()
nav.pickups property nav->pickups()
nav.nearest_pickup call nav->nearestPickup()
nav.field_distance call nav->fieldDistance()
score.me property score->me()
score.best property score->best()
score.armour property score->armour()
angles.normalize call angles->normalize()
angles.angle_diff call angles->angleDiff()
angles.bearing_to call angles->bearingTo()
angles.elevation_to call angles->elevationTo()
angles.direction call angles->direction()
angles.distance call angles->distance()
angles.clamp call angles->clamp()
status.set control status->set()
status.get call status->get()
raw.number call raw->number()
raw.text call raw->text()
raw.has call raw->has()
raw.flag call raw->flag()
raw.count call raw->count()
raw.line call raw->line()
raw.extra call raw->extra()
session.event property session->event()
session.next call session->next()
session.send call session->send()
session.forfeit call session->forfeit()
session.log call session->log()
session.feed call session->feed()
session.reply call session->reply()

Download this page as Markdown