@shipload/sdk 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/shipload.d.ts +102 -33
- package/lib/shipload.js +348 -35
- package/lib/shipload.js.map +1 -1
- package/lib/shipload.m.js +314 -35
- package/lib/shipload.m.js.map +1 -1
- package/package.json +1 -1
- package/src/contracts/server.ts +48 -10
- package/src/contracts.ts +2 -0
- package/src/errors.ts +9 -0
- package/src/goods.ts +113 -0
- package/src/hash.ts +6 -2
- package/src/index-module.ts +4 -2
- package/src/market.ts +58 -0
- package/src/rolls.ts +8 -0
- package/src/shipload.ts +59 -1
- package/src/state.ts +0 -0
- package/src/travel.ts +47 -2
- package/src/types.ts +15 -0
package/src/contracts/server.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
Action,
|
|
3
|
+
Checksum256Type,
|
|
4
|
+
Int64Type,
|
|
5
|
+
NameType,
|
|
6
|
+
UInt16Type,
|
|
7
|
+
UInt64Type,
|
|
8
|
+
} from '@wharfkit/antelope'
|
|
2
9
|
import {
|
|
3
10
|
ABI,
|
|
4
11
|
Blob,
|
|
@@ -17,7 +24,7 @@ import {
|
|
|
17
24
|
import type {ActionOptions, ContractArgs, PartialBy, Table} from '@wharfkit/contract'
|
|
18
25
|
import {Contract as BaseContract} from '@wharfkit/contract'
|
|
19
26
|
export const abiBlob = Blob.from(
|
|
20
|
-
'
|
|
27
|
+
'DmVvc2lvOjphYmkvMS4yABwHYWR2YW5jZQAABmFycml2ZQACBW93bmVyBG5hbWUCaWQGdWludDY0CGJ1eWdvb2RzAAMHc2hpcF9pZAZ1aW50NjQHZ29vZF9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0CWNhcmdvX3JvdwAFAmlkBnVpbnQ2NAdzaGlwX2lkBnVpbnQ2NAdnb29kX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQGbG9hZGVkBnVpbnQ2NApjbGVhcnRhYmxlAAMKdGFibGVfbmFtZQRuYW1lBXNjb3BlBW5hbWU/CG1heF9yb3dzB3VpbnQ2ND8LY29vcmRpbmF0ZXMAAgF4BWludDY0AXkFaW50NjQGZW5hYmxlAAEHZW5hYmxlZARib29sCWVzdHRyYXZlbAACAmlkBnVpbnQ2NAtkZXN0aW5hdGlvbgtjb29yZGluYXRlcwpnb29kX3ByaWNlAAICaWQGdWludDE2BXByaWNlBnVpbnQ2NARoYXNoAAEFdmFsdWUGc3RyaW5nBGluaXQAAgRzZWVkC2NoZWNrc3VtMjU2CWVwb2Noc2VlZAtjaGVja3N1bTI1NgRqb2luAAEHYWNjb3VudARuYW1lDGxvYWRlcl9zdGF0cwAECGNhcGFjaXR5BnVpbnQxNgRtYXNzBnVpbnQzMghxdWFudGl0eQZ1aW50MTYGdGhydXN0BnVpbnQzMgttYXJrZXRwcmljZQACCGxvY2F0aW9uC2Nvb3JkaW5hdGVzB2dvb2RfaWQGdWludDE2DG1hcmtldHByaWNlcwABCGxvY2F0aW9uC2Nvb3JkaW5hdGVzCnBsYXllcl9yb3cAAwVvd25lcgRuYW1lB2JhbGFuY2UGdWludDY0BGRlYnQGdWludDY0CXNlbGxnb29kcwADB3NoaXBfaWQGdWludDY0B2dvb2RfaWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NAxzZXF1ZW5jZV9yb3cAAgNrZXkEbmFtZQV2YWx1ZQZ1aW50NjQIc2hpcF9yb3cACgJpZAZ1aW50NjQFb3duZXIEbmFtZQRuYW1lBnN0cmluZwhsb2NhdGlvbgtjb29yZGluYXRlcwRza2luBXVpbnQ4BHRpZXIFdWludDgFc3RhdGUKc2hpcF9zdGF0ZQVzdGF0cwpzaGlwX3N0YXRzB2xvYWRlcnMMbG9hZGVyX3N0YXRzCnRyYXZlbHBsYW4MdHJhdmVsX3BsYW4/CnNoaXBfc3RhdGUAAQZlbmVyZ3kGdWludDMyCnNoaXBfc3RhdHMABghjYXBhY2l0eQZ1aW50MzIFZHJhaW4GdWludDMyBG1hc3MGdWludDY0BW9yYml0BnVpbnQxNghyZWNoYXJnZQZ1aW50MzIGdGhydXN0BnVpbnQ2NAlzdGF0ZV9yb3cABQdlbmFibGVkBGJvb2wFZXBvY2gGdWludDY0CWVwb2Noc2VlZAtjaGVja3N1bTI1NgdnZW5lc2lzFGJsb2NrX3RpbWVzdGFtcF90eXBlBHNlZWQLY2hlY2tzdW0yNTYLc3VtbWFyeV9yb3cAAgNrZXkEbmFtZQV2YWx1ZQ50cmF2ZWxfc3VtbWFyeQR0ZXN0AAEEZGF0YQZzdHJpbmcGdHJhdmVsAAQFb3duZXIEbmFtZQJpZAZ1aW50NjQLZGVzdGluYXRpb24LY29vcmRpbmF0ZXMIcmVjaGFyZ2UEYm9vbAt0cmF2ZWxfcGxhbgADC2Rlc3RpbmF0aW9uC2Nvb3JkaW5hdGVzCWRlcGFydHVyZQp0aW1lX3BvaW50CGR1cmF0aW9uBnVpbnQzMg50cmF2ZWxfc3VtbWFyeQAMBXN0YXRzCnNoaXBfc3RhdHMHbG9hZGVycwxsb2FkZXJfc3RhdHMGb3JpZ2luC2Nvb3JkaW5hdGVzC2Rlc3RpbmF0aW9uC2Nvb3JkaW5hdGVzCGRpc3RhbmNlBnVpbnQ2NAl0b3RhbG1hc3MGdWludDY0DGFjY2VsZXJhdGlvbgZ1aW50NjQKZmxpZ2h0dGltZQZ1aW50NjQLZW5lcmd5dXNhZ2UGdWludDY0DHJlY2hhcmdldGltZQZ1aW50NjQIbG9hZHRpbWUGdWludDY0BHRpbWUGdWludDY0BHdpcGUAAA8AAABAoWl2MgdhZHZhbmNl0wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWR2YW5jZQpzdW1tYXJ5OiAnQWR2YW5jZSB0dXJuJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpBZHZhbmNlIHRoZSBnYW1lIHRvIHRoZSBuZXh0IHR1cm4uAAAAAKjt7jUGYXJyaXZlswItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYXJyaXZlCnN1bW1hcnk6ICdDb21wbGV0ZSB0cmF2ZWwnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNvbXBsZXRlIHRoZSB0cmF2ZWwgb2YgYSBzaGlwIGJ5IHVwZGF0aW5nIGl0cyBsb2NhdGlvbiB0byB0aGUgZGVzdGluYXRpb24gY29vcmRpbmF0ZXMgYWZ0ZXIgdGhlIHRyYXZlbCBkdXJhdGlvbiBoYXMgcGFzc2VkLgoKLS0tAAAAOFHKvD4IYnV5Z29vZHPdAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBidXlnb29kcwpzdW1tYXJ5OiAnQnV5IGdvb2RzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpQdXJjaGFzZSBnb29kcyBhbmQgYWRkIHRoZW0gdG8gYSBzaGlwJ3MgY2FyZ28uAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAACoeMxUBmVuYWJsZeIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnU2V0IGVuYWJsZWQgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZ2FtZSBvZiBTaGlwbG9hZC4KCi0tLQAAiGqbmzNWCWVzdHRyYXZlbAAAAAAAANCwaQRoYXNo6gEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogaGFzaApzdW1tYXJ5OiAnQ2FsY3VsYXRlIGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIGhhc2ggb2YgYSBzdHJpbmcgYmFzZWQgdXNpbmcgdGhlIGdhbWUgc2VlZC4AAAAAAJDddARpbml0/wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogaW5pdApzdW1tYXJ5OiAnSW5pdGlhbGl6ZSBnYW1lIHNlZWQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYWxpemUgYSB0aGUgZ2FtZXMgc2VlZCBhbmQgZXBvY2hzZWVkIHZhbHVlcyB0byBib290c3RyYXAgZ2FtZSBzdGF0ZS4AAAAAADAdfQRqb2luyQEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogam9pbgpzdW1tYXJ5OiAnSm9pbiBhIGdhbWUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkpvaW4gYSBnYW1lIG9mIFNoaXBsb2FkCgotLS0AFHK3ZgWvkQttYXJrZXRwcmljZZsCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG1hcmtldHByaWNlCnN1bW1hcnk6ICdHZXQgcHJpY2Ugb2YgZ29vZCBhdCBsb2NhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gZGV0ZXJtaW5lcyB0aGUgbWFya2V0IHByaWNlIG9mIGEgc3BlY2lmaWVkIGdvb2QgYXQgYSBnaXZlbiBsb2NhdGlvbi4KCi0tLYAVcrdmBa+RDG1hcmtldHByaWNlc5UCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG1hcmtldHByaWNlcwpzdW1tYXJ5OiAnR2V0IHByaWNlIG9mIGFsbCBnb29kcyBhdCBsb2NhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gZGV0ZXJtaW5lcyB0aGUgbWFya2V0IHByaWNlIG9mIGFsbCBnb29kcyBhdCBhIGdpdmVuIGxvY2F0aW9uLgAAwIlSFqPCCXNlbGxnb29kc9UBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNlbGxnb29kcwpzdW1tYXJ5OiAnU2VsbCBnb29kcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2VsbCBnb29kcyBmcm9tIGEgc2hpcCdzIGNhcmdvLgoKLS0tAAAAAACQscoEdGVzdLIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRlc3QKc3VtbWFyeTogJ0RFQlVHOiB0ZXN0IGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAABEtc3NBnRyYXZlbP0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBhIHNoaXAnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIHRyYXZlbCBvZiBhIHNoaXAgZnJvbSBpdHMgY3VycmVudCBsb2NhdGlvbiB0byBhIG5ldyBkZXN0aW5hdGlvbi4KCi0tLQAAAAAAoKrjBHdpcGWyAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlCnN1bW1hcnk6ICdERUJVRzogd2lwZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0GAAAAAADKrkEDaTY0AAAJY2FyZ29fcm93AAAAAFzlTawDaTY0AAAKcGxheWVyX3JvdwAAAApNpa3CA2k2NAAADHNlcXVlbmNlX3JvdwAAAAAAUF3DA2k2NAAACHNoaXBfcm93AAAAAACVTcYDaTY0AAAJc3RhdGVfcm93AAAAwF8jpcYDaTY0AAALc3VtbWFyeV9yb3cBEVNoaXBsb2FkIChTZXJ2ZXIpEVNoaXBsb2FkIChTZXJ2ZXIpAAAABAAAiGqbmzNWDnRyYXZlbF9zdW1tYXJ5AAAAAADQsGkLY2hlY2tzdW01MTIAFHK3ZgWvkQpnb29kX3ByaWNlgBVyt2YFr5EMZ29vZF9wcmljZVtd'
|
|
21
28
|
)
|
|
22
29
|
export const abi = ABI.from(abiBlob)
|
|
23
30
|
export namespace Types {
|
|
@@ -32,8 +39,6 @@ export namespace Types {
|
|
|
32
39
|
}
|
|
33
40
|
@Struct.type('buygoods')
|
|
34
41
|
export class buygoods extends Struct {
|
|
35
|
-
@Struct.field(Name)
|
|
36
|
-
buyer!: Name
|
|
37
42
|
@Struct.field(UInt64)
|
|
38
43
|
ship_id!: UInt64
|
|
39
44
|
@Struct.field(UInt64)
|
|
@@ -51,6 +56,8 @@ export namespace Types {
|
|
|
51
56
|
good_id!: UInt64
|
|
52
57
|
@Struct.field(UInt64)
|
|
53
58
|
quantity!: UInt64
|
|
59
|
+
@Struct.field(UInt64)
|
|
60
|
+
loaded!: UInt64
|
|
54
61
|
}
|
|
55
62
|
@Struct.type('cleartable')
|
|
56
63
|
export class cleartable extends Struct {
|
|
@@ -80,6 +87,13 @@ export namespace Types {
|
|
|
80
87
|
@Struct.field(coordinates)
|
|
81
88
|
destination!: coordinates
|
|
82
89
|
}
|
|
90
|
+
@Struct.type('good_price')
|
|
91
|
+
export class good_price extends Struct {
|
|
92
|
+
@Struct.field(UInt16)
|
|
93
|
+
id!: UInt16
|
|
94
|
+
@Struct.field(UInt64)
|
|
95
|
+
price!: UInt64
|
|
96
|
+
}
|
|
83
97
|
@Struct.type('hash')
|
|
84
98
|
export class hash extends Struct {
|
|
85
99
|
@Struct.field('string')
|
|
@@ -108,6 +122,18 @@ export namespace Types {
|
|
|
108
122
|
@Struct.field(UInt32)
|
|
109
123
|
thrust!: UInt32
|
|
110
124
|
}
|
|
125
|
+
@Struct.type('marketprice')
|
|
126
|
+
export class marketprice extends Struct {
|
|
127
|
+
@Struct.field(coordinates)
|
|
128
|
+
location!: coordinates
|
|
129
|
+
@Struct.field(UInt16)
|
|
130
|
+
good_id!: UInt16
|
|
131
|
+
}
|
|
132
|
+
@Struct.type('marketprices')
|
|
133
|
+
export class marketprices extends Struct {
|
|
134
|
+
@Struct.field(coordinates)
|
|
135
|
+
location!: coordinates
|
|
136
|
+
}
|
|
111
137
|
@Struct.type('player_row')
|
|
112
138
|
export class player_row extends Struct {
|
|
113
139
|
@Struct.field(Name)
|
|
@@ -119,8 +145,6 @@ export namespace Types {
|
|
|
119
145
|
}
|
|
120
146
|
@Struct.type('sellgoods')
|
|
121
147
|
export class sellgoods extends Struct {
|
|
122
|
-
@Struct.field(Name)
|
|
123
|
-
seller!: Name
|
|
124
148
|
@Struct.field(UInt64)
|
|
125
149
|
ship_id!: UInt64
|
|
126
150
|
@Struct.field(UInt64)
|
|
@@ -135,14 +159,17 @@ export namespace Types {
|
|
|
135
159
|
@Struct.field(UInt64)
|
|
136
160
|
value!: UInt64
|
|
137
161
|
}
|
|
162
|
+
@Struct.type('ship_state')
|
|
163
|
+
export class ship_state extends Struct {
|
|
164
|
+
@Struct.field(UInt32)
|
|
165
|
+
energy!: UInt32
|
|
166
|
+
}
|
|
138
167
|
@Struct.type('ship_stats')
|
|
139
168
|
export class ship_stats extends Struct {
|
|
140
169
|
@Struct.field(UInt32)
|
|
141
170
|
capacity!: UInt32
|
|
142
171
|
@Struct.field(UInt32)
|
|
143
172
|
drain!: UInt32
|
|
144
|
-
@Struct.field(UInt32)
|
|
145
|
-
energy!: UInt32
|
|
146
173
|
@Struct.field(UInt64)
|
|
147
174
|
mass!: UInt64
|
|
148
175
|
@Struct.field(UInt16)
|
|
@@ -175,6 +202,8 @@ export namespace Types {
|
|
|
175
202
|
skin!: UInt8
|
|
176
203
|
@Struct.field(UInt8)
|
|
177
204
|
tier!: UInt8
|
|
205
|
+
@Struct.field(ship_state)
|
|
206
|
+
state!: ship_state
|
|
178
207
|
@Struct.field(ship_stats)
|
|
179
208
|
stats!: ship_stats
|
|
180
209
|
@Struct.field(loader_stats)
|
|
@@ -279,7 +308,6 @@ export namespace ActionParams {
|
|
|
279
308
|
id: UInt64Type
|
|
280
309
|
}
|
|
281
310
|
export interface buygoods {
|
|
282
|
-
buyer: NameType
|
|
283
311
|
ship_id: UInt64Type
|
|
284
312
|
good_id: UInt64Type
|
|
285
313
|
quantity: UInt64Type
|
|
@@ -306,8 +334,14 @@ export namespace ActionParams {
|
|
|
306
334
|
export interface join {
|
|
307
335
|
account: NameType
|
|
308
336
|
}
|
|
337
|
+
export interface marketprice {
|
|
338
|
+
location: Type.coordinates
|
|
339
|
+
good_id: UInt16Type
|
|
340
|
+
}
|
|
341
|
+
export interface marketprices {
|
|
342
|
+
location: Type.coordinates
|
|
343
|
+
}
|
|
309
344
|
export interface sellgoods {
|
|
310
|
-
seller: NameType
|
|
311
345
|
ship_id: UInt64Type
|
|
312
346
|
good_id: UInt64Type
|
|
313
347
|
quantity: UInt64Type
|
|
@@ -333,6 +367,8 @@ export interface ActionNameParams {
|
|
|
333
367
|
hash: ActionParams.hash
|
|
334
368
|
init: ActionParams.init
|
|
335
369
|
join: ActionParams.join
|
|
370
|
+
marketprice: ActionParams.marketprice
|
|
371
|
+
marketprices: ActionParams.marketprices
|
|
336
372
|
sellgoods: ActionParams.sellgoods
|
|
337
373
|
test: ActionParams.test
|
|
338
374
|
travel: ActionParams.travel
|
|
@@ -342,6 +378,8 @@ export type ActionNames = keyof ActionNameParams
|
|
|
342
378
|
export interface ActionReturnValues {
|
|
343
379
|
esttravel: Types.travel_summary
|
|
344
380
|
hash: Checksum512
|
|
381
|
+
marketprice: Types.good_price
|
|
382
|
+
marketprices: Types.good_price[]
|
|
345
383
|
}
|
|
346
384
|
export type ActionReturnNames = keyof ActionReturnValues
|
|
347
385
|
export class Contract extends BaseContract {
|
package/src/contracts.ts
ADDED
package/src/errors.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const ERROR_SYSTEM_NOT_INITIALIZED = 'System not initialized'
|
|
2
|
+
export const GOOD_DOES_NOT_EXIST = 'Good does not exist'
|
|
3
|
+
export const GOOD_NOT_AVAILABLE_AT_LOCATION = 'Good not available at location'
|
|
4
|
+
export const PLAYER_NOT_FOUND = 'Player not found'
|
|
5
|
+
export const SHIP_NOT_FOUND = 'Ship not found'
|
|
6
|
+
export const SHIP_CANNOT_BUY_TRAVELING = 'Ship cannot buy while traveling'
|
|
7
|
+
export const INSUFFICIENT_BALANCE = 'Insufficient balance'
|
|
8
|
+
export const INSUFFICIENT_GOOD_QUANTITY = 'Insufficient good quantity'
|
|
9
|
+
export const REQUIRES_MORE_THAN_ONE = 'Requires more than one'
|
package/src/goods.ts
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import {UInt16, UInt16Type, UInt64} from '@wharfkit/antelope'
|
|
2
|
+
import {Good} from './types'
|
|
3
|
+
|
|
4
|
+
// List of goods with titles and descriptions
|
|
5
|
+
export const goods: Good[] = [
|
|
6
|
+
{
|
|
7
|
+
id: UInt16.from(1),
|
|
8
|
+
name: 'FizzGlo',
|
|
9
|
+
description: 'Pops with flavor! A neon drink that makes your burps glow.',
|
|
10
|
+
base_price: UInt64.from(200),
|
|
11
|
+
mass: UInt64.from(500),
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
id: UInt16.from(2),
|
|
15
|
+
name: 'ZapSnacks',
|
|
16
|
+
description: 'Electric taste! Spicy edible energy sparks for a tongue-tingling experience.',
|
|
17
|
+
base_price: UInt64.from(300),
|
|
18
|
+
mass: UInt64.from(2000),
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: UInt16.from(3),
|
|
22
|
+
name: 'Blob Buddies',
|
|
23
|
+
description: 'Squishy friends! Clingy, cute and mood-matching pet blobs for every home!',
|
|
24
|
+
base_price: UInt64.from(400),
|
|
25
|
+
mass: UInt64.from(10000),
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: UInt16.from(4),
|
|
29
|
+
name: 'TuneTooth',
|
|
30
|
+
description: 'Whistle while you eat! Edible instrument treats that play tunes when chewed.',
|
|
31
|
+
base_price: UInt64.from(600),
|
|
32
|
+
mass: UInt64.from(3000),
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: UInt16.from(5),
|
|
36
|
+
name: 'SunPods',
|
|
37
|
+
description: 'Miniature suns in your pocket providing on-demand light & warmth.',
|
|
38
|
+
base_price: UInt64.from(800),
|
|
39
|
+
mass: UInt64.from(1000),
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: UInt16.from(6),
|
|
43
|
+
name: 'Fuzzix',
|
|
44
|
+
description: 'Pocket-sized quantum fluff generator for instant comfy.',
|
|
45
|
+
base_price: UInt64.from(1000),
|
|
46
|
+
mass: UInt64.from(4000),
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: UInt16.from(7),
|
|
50
|
+
name: 'GlowGo',
|
|
51
|
+
description: 'Ingestible bioluminescent jelly, your inside glows in the dark!',
|
|
52
|
+
base_price: UInt64.from(140),
|
|
53
|
+
mass: UInt64.from(3000),
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: UInt16.from(8),
|
|
57
|
+
name: 'KrackleKaps',
|
|
58
|
+
description: 'Capsules packed with tiny firecrackers, spice up meals and parties.',
|
|
59
|
+
base_price: UInt64.from(180),
|
|
60
|
+
mass: UInt64.from(2000),
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: UInt16.from(9),
|
|
64
|
+
name: 'PlasmaMints',
|
|
65
|
+
description: 'Hypercharged candy giving plasma breath capable of cutting through steel.',
|
|
66
|
+
base_price: UInt64.from(220),
|
|
67
|
+
mass: UInt64.from(500),
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: UInt16.from(10),
|
|
71
|
+
name: 'TimeTreats',
|
|
72
|
+
description: 'Confectionery morsels releasing slow-mo effect over a limited period.',
|
|
73
|
+
base_price: UInt64.from(250),
|
|
74
|
+
mass: UInt64.from(3000),
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: UInt16.from(11),
|
|
78
|
+
name: 'QuantumQuencher',
|
|
79
|
+
description:
|
|
80
|
+
'Bottled hyper-fluid quenching thirst across multiple parallel realities simultaneously.',
|
|
81
|
+
base_price: UInt64.from(300),
|
|
82
|
+
mass: UInt64.from(6000),
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: UInt16.from(12),
|
|
86
|
+
name: 'TransmatterTruffles',
|
|
87
|
+
description: 'Delectable chocolates instantly teleporting consumers short distances.',
|
|
88
|
+
base_price: UInt64.from(350),
|
|
89
|
+
mass: UInt64.from(4000),
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
id: UInt16.from(13),
|
|
93
|
+
name: 'MemoryGum',
|
|
94
|
+
description: 'Chewable gum storing or replaying memories while being chewed.',
|
|
95
|
+
base_price: UInt64.from(400),
|
|
96
|
+
mass: UInt64.from(500),
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: UInt16.from(14),
|
|
100
|
+
name: 'SymbioSnack',
|
|
101
|
+
description: 'Edible alien larvae adopting owner’s taste preference upon consumption.',
|
|
102
|
+
base_price: UInt64.from(500),
|
|
103
|
+
mass: UInt64.from(1000),
|
|
104
|
+
},
|
|
105
|
+
]
|
|
106
|
+
|
|
107
|
+
export function getGood(good_id: UInt16Type): Good {
|
|
108
|
+
const good = goods.find((g) => g.id.equals(good_id))
|
|
109
|
+
if (!good) {
|
|
110
|
+
throw new Error('Good does not exist')
|
|
111
|
+
}
|
|
112
|
+
return good
|
|
113
|
+
}
|
package/src/hash.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import {Bytes, Checksum256Type, Checksum512} from '@wharfkit/antelope'
|
|
2
2
|
|
|
3
|
-
export function hash(seed: Checksum256Type, string: string):
|
|
3
|
+
export function hash(seed: Checksum256Type, string: string): Checksum512 {
|
|
4
4
|
const bytes = Bytes.from(`${seed}${string}`, 'utf8')
|
|
5
|
-
return
|
|
5
|
+
return Checksum512.hash(bytes)
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function hashBytes(seed: Checksum256Type, string: string): Uint8Array {
|
|
9
|
+
return hash(seed, string).array
|
|
6
10
|
}
|
package/src/index-module.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
export * from './contracts'
|
|
1
2
|
export * from './hash'
|
|
2
3
|
export * from './travel'
|
|
3
4
|
export * from './types'
|
|
4
|
-
export *
|
|
5
|
-
export *
|
|
5
|
+
export * from './goods'
|
|
6
|
+
export * from './market'
|
|
7
|
+
export * from './errors'
|
package/src/market.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import {Coordinates, GoodPrice} from './types'
|
|
2
|
+
import {getGood, goods} from './goods'
|
|
3
|
+
import {Checksum256Type, UInt16Type, UInt64, UInt64Type} from '@wharfkit/antelope'
|
|
4
|
+
import {roll} from './rolls'
|
|
5
|
+
|
|
6
|
+
export async function marketprice(
|
|
7
|
+
location: Coordinates,
|
|
8
|
+
good_id: UInt16Type,
|
|
9
|
+
gameSeed: Checksum256Type,
|
|
10
|
+
epochSeed: Checksum256Type
|
|
11
|
+
): Promise<UInt64> {
|
|
12
|
+
const good = getGood(good_id)
|
|
13
|
+
const rollSeed = `${location.x}${epochSeed}${location.y}${good_id}`
|
|
14
|
+
const rollValue = roll(gameSeed, rollSeed)
|
|
15
|
+
return priceFromRoll(good.base_price, rollValue)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export async function marketprices(
|
|
19
|
+
location: Coordinates,
|
|
20
|
+
gameSeed: Checksum256Type,
|
|
21
|
+
epochSeed: Checksum256Type
|
|
22
|
+
): Promise<GoodPrice[]> {
|
|
23
|
+
return Promise.all(
|
|
24
|
+
goods.map(async (good) => {
|
|
25
|
+
const price = await marketprice(location, good.id, gameSeed, epochSeed)
|
|
26
|
+
return {price, id: good.id}
|
|
27
|
+
})
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function priceFromRoll(basePrice: UInt64Type, roll: number): UInt64 {
|
|
32
|
+
basePrice = Number(basePrice)
|
|
33
|
+
let price: number
|
|
34
|
+
if (roll < 13) {
|
|
35
|
+
price = basePrice * 2.25 // ~0.02% chance
|
|
36
|
+
} else if (roll < 176) {
|
|
37
|
+
price = basePrice * 1.75 // ~0.25% chance
|
|
38
|
+
} else if (roll < 996) {
|
|
39
|
+
price = basePrice * 1.4 // ~1.25% chance
|
|
40
|
+
} else if (roll < 2966) {
|
|
41
|
+
price = basePrice * 1.225 // ~3.00% chance
|
|
42
|
+
} else if (roll < 19568) {
|
|
43
|
+
price = basePrice * 1.07 // ~25.33% chance
|
|
44
|
+
} else if (roll < 45988) {
|
|
45
|
+
price = 0 // ~40.30% chance
|
|
46
|
+
} else if (roll < 62508) {
|
|
47
|
+
price = basePrice * 0.925 // ~25.33% chance
|
|
48
|
+
} else if (roll < 64518) {
|
|
49
|
+
price = basePrice * 0.77 // ~3.00% chance
|
|
50
|
+
} else if (roll < 65437) {
|
|
51
|
+
price = basePrice * 0.595 // ~1.25% chance
|
|
52
|
+
} else if (roll < 65523) {
|
|
53
|
+
price = basePrice * 0.41 // ~0.25% chance
|
|
54
|
+
} else {
|
|
55
|
+
price = basePrice * 0.285 // ~0.02% chance
|
|
56
|
+
}
|
|
57
|
+
return UInt64.from(price)
|
|
58
|
+
}
|
package/src/rolls.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import {Checksum256Type} from '@wharfkit/antelope'
|
|
2
|
+
import {hashBytes} from './hash'
|
|
3
|
+
|
|
4
|
+
export function roll(game_seed: Checksum256Type, roll_seed: string): number {
|
|
5
|
+
const byteArray = hashBytes(game_seed, roll_seed)
|
|
6
|
+
// Combine the first two bytes to form a uint16_t value
|
|
7
|
+
return (byteArray[0] << 8) | byteArray[1]
|
|
8
|
+
}
|
package/src/shipload.ts
CHANGED
|
@@ -1 +1,59 @@
|
|
|
1
|
-
|
|
1
|
+
import {APIClient, UInt64} from '@wharfkit/antelope'
|
|
2
|
+
import {Coordinates, GoodPrice} from './types'
|
|
3
|
+
import {marketprice, marketprices} from './market'
|
|
4
|
+
import {ServerContract} from './contracts'
|
|
5
|
+
import {ERROR_SYSTEM_NOT_INITIALIZED} from './errors'
|
|
6
|
+
import {ChainDefinition} from '@wharfkit/session'
|
|
7
|
+
import ContractKit, {Contract} from '@wharfkit/contract'
|
|
8
|
+
|
|
9
|
+
interface ShiploadOptions {
|
|
10
|
+
contractName?: string
|
|
11
|
+
client?: APIClient
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface ShiploadConstructorOptions extends ShiploadOptions {
|
|
15
|
+
serverContract: Contract
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export class Shipload {
|
|
19
|
+
private client: APIClient
|
|
20
|
+
private server: Contract
|
|
21
|
+
|
|
22
|
+
constructor(chain: ChainDefinition, {client, serverContract}: ShiploadConstructorOptions) {
|
|
23
|
+
this.client = client || new APIClient({url: chain.url})
|
|
24
|
+
|
|
25
|
+
this.server = serverContract
|
|
26
|
+
? serverContract
|
|
27
|
+
: new ServerContract.Contract({client: this.client})
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
static async load(chain: ChainDefinition, shiploadOptions: ShiploadOptions): Promise<Shipload> {
|
|
31
|
+
let server: Contract = new ServerContract.Contract({
|
|
32
|
+
client: new APIClient({url: chain.url}),
|
|
33
|
+
})
|
|
34
|
+
if (shiploadOptions.contractName) {
|
|
35
|
+
const client = shiploadOptions.client || new APIClient({url: chain.url})
|
|
36
|
+
const contractKit = new ContractKit({client})
|
|
37
|
+
server = await contractKit.load(shiploadOptions.contractName)
|
|
38
|
+
}
|
|
39
|
+
return new Shipload(chain, {...shiploadOptions, serverContract: server})
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async getState(): Promise<ServerContract.Types.state_row> {
|
|
43
|
+
const state = await this.server.table('state').get()
|
|
44
|
+
if (!state) {
|
|
45
|
+
throw new Error(ERROR_SYSTEM_NOT_INITIALIZED)
|
|
46
|
+
}
|
|
47
|
+
return state
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async marketprice(location: Coordinates, good_id: number): Promise<UInt64> {
|
|
51
|
+
const {seed, epochseed} = await this.getState()
|
|
52
|
+
return marketprice(location, good_id, seed, epochseed)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async marketprices(location: Coordinates): Promise<GoodPrice[]> {
|
|
56
|
+
const {seed, epochseed} = await this.getState()
|
|
57
|
+
return marketprices(location, seed, epochseed)
|
|
58
|
+
}
|
|
59
|
+
}
|
package/src/state.ts
ADDED
|
File without changes
|
package/src/travel.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {Checksum256} from '@wharfkit/antelope'
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import {ServerContract} from './contracts'
|
|
4
|
+
import {hash} from './hash'
|
|
5
|
+
import {Coordinates, Distance} from './types'
|
|
6
|
+
|
|
7
|
+
export function distanceTraveled(ship: ServerContract.Types.ship_row): number {
|
|
4
8
|
if (ship.travelplan) {
|
|
5
9
|
const {departure, duration} = ship.travelplan
|
|
6
10
|
return (+new Date() - +departure.toDate()) / (Number(duration) * 1000)
|
|
@@ -8,6 +12,12 @@ export function distance(ship: ServerContract.Types.ship_row): number {
|
|
|
8
12
|
return 0
|
|
9
13
|
}
|
|
10
14
|
|
|
15
|
+
export function distanceBetweenPoints(x1: number, y1: number, x2: number, y2: number) {
|
|
16
|
+
const x = Math.pow(x1 - x2, 2)
|
|
17
|
+
const y = Math.pow(y1 - y2, 2)
|
|
18
|
+
return Math.sqrt(x + y)
|
|
19
|
+
}
|
|
20
|
+
|
|
11
21
|
export function lerp(origin: Coordinates, destination: Coordinates, time: number) {
|
|
12
22
|
return {
|
|
13
23
|
x: (1 - time) * origin.x + time * destination.x,
|
|
@@ -18,3 +28,38 @@ export function lerp(origin: Coordinates, destination: Coordinates, time: number
|
|
|
18
28
|
export function rotation(origin: Coordinates, destination: Coordinates) {
|
|
19
29
|
return Math.atan2(destination.y - origin.y, destination.x - origin.x) * (180 / Math.PI) + 90
|
|
20
30
|
}
|
|
31
|
+
|
|
32
|
+
export function hasPlanet(seed: Checksum256, coords: Coordinates): boolean {
|
|
33
|
+
const str = ['system', coords.x, coords.y].join('-')
|
|
34
|
+
return String(hash(seed, str)).slice(0, 2) === '00'
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function findNearbyPlanets(
|
|
38
|
+
seed: Checksum256,
|
|
39
|
+
origin: Coordinates,
|
|
40
|
+
maxDistance = 20
|
|
41
|
+
): Distance[] {
|
|
42
|
+
const nearbySystems: Distance[] = []
|
|
43
|
+
|
|
44
|
+
const xMin = origin.x - maxDistance
|
|
45
|
+
const xMax = origin.x + maxDistance
|
|
46
|
+
const yMin = origin.y - maxDistance
|
|
47
|
+
const yMax = origin.y + maxDistance
|
|
48
|
+
|
|
49
|
+
for (let x = xMin; x <= xMax; x++) {
|
|
50
|
+
for (let y = yMin; y <= yMax; y++) {
|
|
51
|
+
const samePlace = x === origin.x && y === origin.y
|
|
52
|
+
if (!samePlace) {
|
|
53
|
+
const distance = distanceBetweenPoints(origin.x, origin.y, x, y)
|
|
54
|
+
if (distance <= maxDistance) {
|
|
55
|
+
const system = hasPlanet(seed, {x, y})
|
|
56
|
+
if (system) {
|
|
57
|
+
nearbySystems.push({origin, destination: {x, y}, distance})
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return nearbySystems
|
|
65
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import {UInt16, UInt64} from '@wharfkit/antelope'
|
|
2
|
+
|
|
1
3
|
export interface Coordinates {
|
|
2
4
|
x: number
|
|
3
5
|
y: number
|
|
@@ -17,3 +19,16 @@ export interface Distance {
|
|
|
17
19
|
destination: Coordinates
|
|
18
20
|
distance: number
|
|
19
21
|
}
|
|
22
|
+
|
|
23
|
+
export interface Good {
|
|
24
|
+
id: UInt16
|
|
25
|
+
name: string
|
|
26
|
+
description: string
|
|
27
|
+
base_price: UInt64
|
|
28
|
+
mass: UInt64
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface GoodPrice {
|
|
32
|
+
id: UInt16
|
|
33
|
+
price: UInt64
|
|
34
|
+
}
|