The Free Pascal binding
The generated Clunkyard unit uses C-packed records and cdecl functions
to call the core. Functions return a status and fill the caller's output
arguments. CY_NONE means absent; negative statuses are errors and
cy_last_error gives their text. Text takes a UTF-8 byte pointer and length.
For lists, pass the first array element, capacity and output count; a short
array returns CY_SHORT with the capacity needed.
Install with make install SDK=/opt/clunkyard/sdk. Build with
fpc -O2 -Fu/opt/clunkyard/sdk/bindings/pascal -Fl/opt/clunkyard/sdk/lib -obot bot.pas. The unit links the static core and
its native support libraries. The artifact carries only the executable.
cy_open opens standard I/O and protects the protocol pipe. For memory
tests, cy_open_memory, cy_session_feed and cy_session_reply use the
same session. After cy_session_next returns CY_E_INTERNAL, send the
core's empty reply and continue to recover on the next state.
cy_session_forfeit reports a robot forfeit.
A tiny robot
program Tiny;
{$mode objfpc}{$H+}
uses Clunkyard;
var Robot:TCyRobot;Target:TCyContact;Aim:TCySolution;Last:TCyScan;
Status,Event,CanFire:LongInt;Heading,Power,Delta,Control:Double;
begin
Status:=cy_open(2,0,'clunkyard-pascal',16,'2.0.0',5,Robot);
repeat
Status:=cy_session_next(Robot,Event);
if Status=CY_E_INTERNAL then begin Status:=cy_session_send(Robot);if Status<0 then Break;Continue;end;
if (Status<>CY_OK) or (Event=CY_EVENT_END) then Break;
if Event=CY_EVENT_STATE then begin
Status:=cy_me_heading(Robot,Heading);
if cy_sensors_nearest(Robot,Target)<>CY_OK then begin
Status:=cy_drive_throttle(Robot,0.75);Status:=cy_drive_turn(Robot,0.25);
Status:=cy_scanner_heading(Robot,Heading);Status:=cy_scanner_arc(Robot,40);
Status:=cy_scanner_last(Robot,Last);Status:=cy_status_text(Robot,'SEARCH',6);Status:=cy_status_value(Robot,Last.Arc);
end else begin
Status:=cy_gun_power_for_flight_time(Robot,Target.Range,1,Power);
if cy_gun_lead(Robot,Target,Power,Aim)<>CY_OK then begin Aim.Heading:=Target.Bearing;Aim.Pitch:=Target.Elevation;end;
Status:=cy_gun_aim_heading(Robot,Aim.Heading);Status:=cy_gun_aim_pitch(Robot,Aim.Pitch);
Status:=cy_gun_can_fire(Robot,Power,10,CanFire);
if CanFire<>0 then begin Status:=cy_gun_fire(Robot);Status:=cy_gun_power(Robot,Power);end;
Status:=cy_angles_angle_diff(Target.Bearing,Heading,Delta);Status:=cy_angles_clamp(Delta,-1,1,Control);
Status:=cy_drive_throttle(Robot,0.5);Status:=cy_drive_turn(Robot,Control);
Status:=cy_scanner_heading(Robot,Target.Bearing);Status:=cy_scanner_arc(Robot,10);
Status:=cy_status_text(Robot,'TRACK',5);Status:=cy_status_value(Robot,Target.Range);
end;
end;
Status:=cy_session_send(Robot);
until False;
cy_close(Robot);
end.
make test calls every generated Pascal declaration against the core's
conformance vectors, checking record layout, marshalling, exact numeric bits
and serialized acts.
Names
Every entry of the robot API 2.0.0 in Free Pascal. names.md has every language side by side.
| Canonical | Form | Free Pascal |
|---|---|---|
match.mode |
property | cy_match_mode |
match.ruleset |
property | cy_match_ruleset |
match.control |
property | cy_match_control |
match.robots |
property | cy_match_robots |
match.is_3d |
property | cy_match_is_3d |
match.tick_rate |
property | cy_match_tick_rate |
match.max_ticks |
property | cy_match_max_ticks |
match.robot_id |
call | cy_robot_id |
clock.tick |
property | cy_clock_tick |
clock.seconds |
property | cy_clock_seconds |
clock.remaining_ticks |
property | cy_clock_remaining_ticks |
arena.size |
property | cy_arena_size |
arena.gravity |
property | cy_arena_gravity |
arena.terrain_kind |
property | cy_arena_terrain_kind |
arena.ground_height |
call | cy_arena_ground_height |
me.health |
property | cy_me_health |
me.position |
property | cy_me_position |
me.velocity |
property | cy_me_velocity |
me.heading |
property | cy_me_heading |
me.pitch |
property | cy_me_pitch |
me.roll |
property | cy_me_roll |
me.angular_velocity |
property | cy_me_angular_velocity |
me.attitude |
property | cy_me_attitude |
me.grounded |
property | cy_me_grounded |
me.altitude |
property | cy_me_altitude |
me.applied |
property | cy_me_applied |
battery.charge |
property | cy_battery_charge |
battery.capacity |
property | cy_battery_capacity |
battery.regen |
property | cy_battery_regen |
battery.sustainable_drive |
property | cy_battery_sustainable_drive |
battery.compute |
property | cy_battery_compute |
battery.drive_cost |
call | cy_battery_drive_cost |
drive.hover_lift |
property | cy_drive_hover_lift |
drive.set |
control | cy_drive_throttle, cy_drive_turn, cy_drive_pitch_turn |
drive.forces |
control | cy_drive_thrust, cy_drive_strafe, cy_drive_lift, cy_drive_yaw_torque, cy_drive_pitch_torque, cy_drive_roll_torque, cy_drive_brake |
drive.get |
call | cy_drive_get_throttle, cy_drive_get_turn, cy_drive_get_pitch_turn, cy_drive_get_thrust, cy_drive_get_strafe, cy_drive_get_lift, cy_drive_get_yaw_torque, cy_drive_get_pitch_torque, cy_drive_get_roll_torque, cy_drive_get_brake |
gun.aim_now |
property | cy_gun_aim_now |
gun.cooldown_ticks |
property | cy_gun_cooldown_ticks |
gun.spread |
property | cy_gun_spread |
gun.max_power |
property | cy_gun_max_power |
gun.damage_scale |
property | cy_gun_damage_scale |
gun.can_fire |
call | cy_gun_can_fire |
gun.shot_speed |
call | cy_gun_shot_speed |
gun.shot_cost |
call | cy_gun_shot_cost |
gun.reload_ticks |
call | cy_gun_reload_ticks |
gun.shot_damage |
call | cy_gun_shot_damage |
gun.power_for_speed |
call | cy_gun_power_for_speed |
gun.power_for_flight_time |
call | cy_gun_power_for_flight_time |
gun.lead |
call | cy_gun_lead |
gun.lead_point |
call | cy_gun_lead_point |
gun.aim |
control | cy_gun_aim_heading, cy_gun_aim_pitch |
gun.fire |
control | cy_gun_fire, cy_gun_power |
gun.get |
call | cy_gun_get_aim_heading, cy_gun_get_aim_pitch, cy_gun_get_fire, cy_gun_get_power |
scanner.last |
property | cy_scanner_last |
scanner.proximity_range |
property | cy_scanner_proximity_range |
scanner.reach |
call | cy_scanner_reach |
scanner.arc_for_reach |
call | cy_scanner_arc_for_reach |
scanner.set |
control | cy_scanner_heading, cy_scanner_arc, cy_scanner_pitch |
scanner.get |
call | cy_scanner_get_heading, cy_scanner_get_arc, cy_scanner_get_pitch |
sensors.contacts |
property | cy_sensors_contacts |
sensors.nearest |
property | cy_sensors_nearest |
sensors.cues |
property | cy_sensors_cues |
sensors.contact |
call | cy_sensors_contact |
sensors.position_of |
call | cy_sensors_position_of |
tracker.cue |
property | cy_tracker_cue |
tracker.nearest_bearing_rate |
property | cy_tracker_nearest_bearing_rate |
tracker.velocity |
call | cy_tracker_velocity |
tracker.position |
call | cy_tracker_position |
tracker.last_seen |
call | cy_tracker_last_seen |
tracker.configure |
call | cy_tracker_configure |
nav.zone |
property | cy_nav_zone |
nav.zone.margin |
call | cy_nav_zone_margin |
nav.zone.contains |
call | cy_nav_zone_contains |
nav.zone.distance_from |
call | cy_nav_zone_distance_from |
nav.storm |
property | cy_nav_storm |
nav.storm.margin |
call | cy_nav_storm_margin |
nav.storm.contains |
call | cy_nav_storm_contains |
nav.storm.distance_from |
call | cy_nav_storm_distance_from |
nav.hill |
property | cy_nav_hill |
nav.hill.margin |
call | cy_nav_hill_margin |
nav.hill.contains |
call | cy_nav_hill_contains |
nav.hill.distance_from |
call | cy_nav_hill_distance_from |
nav.pickups |
property | cy_nav_pickups |
nav.nearest_pickup |
call | cy_nav_nearest_pickup |
nav.field_distance |
call | cy_nav_field_distance |
score.me |
property | cy_score_me |
score.best |
property | cy_score_best |
score.armour |
property | cy_score_armour |
angles.normalize |
call | cy_angles_normalize |
angles.angle_diff |
call | cy_angles_angle_diff |
angles.bearing_to |
call | cy_angles_bearing_to |
angles.elevation_to |
call | cy_angles_elevation_to |
angles.direction |
call | cy_angles_direction |
angles.distance |
call | cy_angles_distance |
angles.clamp |
call | cy_angles_clamp |
status.set |
control | cy_status_text, cy_status_value |
status.get |
call | cy_status_get_text, cy_status_get_value |
raw.number |
call | cy_raw_number |
raw.text |
call | cy_raw_text |
raw.has |
call | cy_raw_has |
raw.flag |
call | cy_raw_flag |
raw.count |
call | cy_raw_count |
raw.line |
call | cy_raw_line |
raw.extra |
call | cy_raw_extra |
session.event |
property | cy_session_event |
session.next |
call | cy_session_next |
session.send |
call | cy_session_send |
session.forfeit |
call | cy_session_forfeit |
session.log |
call | cy_session_log |
session.feed |
call | cy_session_feed |
session.reply |
call | cy_session_reply |