## Documentation ¶

### Index ¶

- Constants
- Variables
- func BodyBodyDistanceSq(a *cp.Body, b *cp.Body) float64
- func DecodeHook(from reflect.Value, to reflect.Value) (interface{}, error)
- func DecodeWithType(parsed map[string]interface{}, typ interface{}) (interface{}, error)
- func RoleToName(role Role) string
- func TimeFromUnix(t float64) time.Time
- type Role
- type Triangle
- type Triangularization

### Constants ¶

`const API_BASE = "https://calamityofsubterfuge.com"`

API_BASE contains the base URL of the server instance.

`const MAP_HEX_RADIUS = 10.0`

MAP_HEX_RADIUS is the radius of each of the hexes on the map which correspond to the player bases in world units. One world unit is 64 pixels at standard zoom.

`const MAP_HEX_WALL_THICKNESS = 1.0`

MAP_HEX_WALL_THICKNESS is the thickness of the walls on the edge of the map hexes.

`const VISION_DISTANCE = 10.0`

VISION_DISTANCE describes the view distance of players. Note that view distance is not calculated as a circle - it is a square where VISION_DISTANCE is half the length of each side. This improves performance and better matches the rectangular nature of clients.

`const WEBSOCKET_ORIGIN = "https://calamityofsubterfuge.com"`

WEBSOCKET_ORIGIN is the value of the Origin header on websockets. This is required or the server will reject the websocket, although it's mainly to protect against browsers starting websockets on different websites.

### Variables ¶

`var CONN_READ_TIMEOUT = 20 * time.Second`

CONN_READ_TIMEOUT is the amount of time we spend waiting for a read on the socket before we close the socket.

`var CONN_WRITE_TIMEOUT = 20 * time.Second`

CONN_WRITE_TIMEOUT is the amount of time we can spend waiting for a write to be acknowledged on the socket before we close the socket.

var MapHexCenters = []cp.Vector{ {X: math.Sqrt(3) * MAP_HEX_RADIUS * math.Cos(math.Pi/6.0), Y: math.Sqrt(3) * MAP_HEX_RADIUS * math.Sin(math.Pi/6.0)}, {X: math.Sqrt(3) * MAP_HEX_RADIUS * math.Cos(math.Pi/2.0), Y: math.Sqrt(3) * MAP_HEX_RADIUS * math.Sin(math.Pi/2.0)}, {X: math.Sqrt(3) * MAP_HEX_RADIUS * math.Cos(5*math.Pi/6.0), Y: math.Sqrt(3) * MAP_HEX_RADIUS * math.Sin(5*math.Pi/6.0)}, {X: math.Sqrt(3) * MAP_HEX_RADIUS * math.Cos(7*math.Pi/6.0), Y: math.Sqrt(3) * MAP_HEX_RADIUS * math.Sin(7*math.Pi/6.0)}, {X: math.Sqrt(3) * MAP_HEX_RADIUS * math.Cos(3*math.Pi/2.0), Y: math.Sqrt(3) * MAP_HEX_RADIUS * math.Sin(3*math.Pi/2.0)}, {X: math.Sqrt(3) * MAP_HEX_RADIUS * math.Cos(11*math.Pi/6.0), Y: math.Sqrt(3) * MAP_HEX_RADIUS * math.Sin(11*math.Pi/6.0)}, }

MapHexCenters maps from the hex index to the center of the hex.

`var MapHexEdgeTriangularization = NewHexEdgeTriangularization(MAP_HEX_RADIUS)`

MapHexEdgeTriangularization triangularizes the edges of one map hex. Note that this includes the walls within the hexagon! Use MapHexInnerEdgeTriangularization for just the non-wall part of a map-hex

`var MapHexInnerEdgeTriangularization = NewHexEdgeTriangularization(MAP_HEX_RADIUS - MAP_HEX_WALL_THICKNESS*0.5)`

MapHexEdgeTriangularization triangularizes the edges of one map hex, excluding the walls

`var MapHexInnerTriangularization = NewHexTriangularization(MAP_HEX_RADIUS - MAP_HEX_WALL_THICKNESS*0.5)`

MapHexInnerTriangularization triangularizes the inner, non-wall part of a hex. Note the center hex has no walls.

`var MapHexTriangularization = NewHexTriangularization(MAP_HEX_RADIUS)`

MapHexTriangularization triangularizes one map hex. Note that this includes the wall within the hexagon! Use MapHexInnerTriangularization for just the non-wall part of a map hex

### Functions ¶

#### func BodyBodyDistanceSq ¶ added in v0.2.5

BodyBodyDistanceSq approximates the squared distance between the two bodies. This is stable but may be an overestimate of the squared distance.

#### func DecodeHook ¶ added in v0.2.14

DecodeHook is a valid mapstructure DecodeHook in order to correctly interpret json.Number, which is a subtype of string, as actual numbers in the target struct. This produces the correct error based on the target size (e.g., the json number 256 can't be stored in a int8, so an error would be produced)

#### func DecodeWithType ¶ added in v0.2.14

DecodeWithType is a convenience method to use a mapstructure Decoder using the DecodeHook to decode the given map with the given target type.

#### func RoleToName ¶

RoleToName converts a role constant to its typical name.

#### func TimeFromUnix ¶

TimeFromUnix is a convenience function for converting the unix time returned from API responses into an actual golang time

### Types ¶

#### type Role ¶

type Role int

Role is an enum describing all the roles within the game that players can have. Each player has uniquely one role.

const ( // RoleInvalid is the default value meaning that there was a bug // that caused the player to not have a role set. RoleInvalid Role = 0 // RolePlayer is the role of humans RolePlayer Role = 1 // RoleEconomyAI is the role of AI's acting in a pair to control the // fiscal policy of the team RoleEconomyAI Role = 2 // RoleMilitaryAI is the role of AI's acting in a pair to control the // defense and foreign policy of the team RoleMilitaryAI Role = 3 // RoleScienceAI is the role of AI's acting in a pair to control the // scientific policy of the team RoleScienceAI Role = 4 )

#### func RoleFromName ¶

#### type Triangle ¶ added in v0.1.1

type Triangle struct { // Vertices are the vertices of the 2d simplex; they must not // fall on a line Vertices [3]cp.Vector // Basis is a 2x2 matrix that makes up the basis for this triangle. // If V is a 2x1 vector such that both components are in the unit // interval, then BV is a point within the triangle. This can be used // to sample from the triangle quickly. // // the first row is Basis[0], Basis[1]. The second row is Basis[2] Basis[3] Basis [4]float64 }

Triangle describes a 2d simplex

#### func NewTriangle ¶ added in v0.1.1

NewTriangle computes the basis of the given triangle then constructs it

#### type Triangularization ¶ added in v0.1.1

type Triangularization struct { // Triangles contains the triangles within this triangularization. // In general this should sorted according to descending area for // best performance, but this is not required Triangles []Triangle // AreaPartialSums contains the sum of the area of all triangles up // to and including the index. AreaPartialSums []float64 }

Triangularization is a triangularization of some polygon which can rapidly sampled from

#### func NewHexEdgeTriangularization ¶ added in v0.1.1

func NewHexEdgeTriangularization(radius float64) *Triangularization

NewHexEdgeTriangularization triangularizes a hexagon of the given radius, but without the inner diamond

#### func NewHexTriangularization ¶ added in v0.1.1

func NewHexTriangularization(radius float64) *Triangularization

NewHexTriangularization triangularizes a hexagon of the given radius

#### func NewTriangularization ¶ added in v0.1.1

func NewTriangularization(triangles []Triangle) *Triangularization

NewTriangularization returns a new triangularization produced by the given triangles. The resulting triangularization is a copy of the given slice sorted according to descending area, with area partial sums filled in.

#### func (*Triangularization) Sample ¶ added in v0.1.1

func (t *Triangularization) Sample() cp.Vector

Sample a point uniformly from one of the triangles in this triangularization