-
Notifications
You must be signed in to change notification settings - Fork 0
/
ObjShip.gd
121 lines (103 loc) · 3.89 KB
/
ObjShip.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
extends Sprite
class_name ObjShip
enum ShipState {
SEARCHING, GOING_TO_DEAL, SELLING_WARES, RUNNING_AWAY
}
export var hull = 10
export(R_Ware.CargoType) var type ### TODO Use this
export(int) var cargoSpaceMetersCubed = 100
onready var cargoBay : CargoBay = CargoBay.new(cargoSpaceMetersCubed)
export(NodePath) var destinationPosition
var destination : Node2D
export(ShipState) var state = ShipState.SEARCHING
func _ready():
destination = get_node(destinationPosition)
if destination == null:
destination = Node2D.new()
get_parent().add_child(destination)
destination.position = position
func _process(delta):
if destination && state == ShipState.GOING_TO_DEAL:
position += Vector2.LEFT.rotated(position.angle_to_point(destination.position)) * delta * 10
if position.distance_to(destination.position) < 5:
arrivedAtDestination()
""" Meant to be overwritten by child classes """
func arrivedAtDestination():
destination = null
print("arrived!")
""" Meant to be overwritten by child classes """
func tick():
pass
"""############################################################################
tt iii lll iii tt
uu uu tt lll tt yy yy
uu uu tttt iii lll iii tttt yy yy
uu uu tt iii lll iii tt yyyyyy
uuuu u tttt iii lll iii tttt yy
yyyyy
#############################################################################"""
func findClosestStation() -> ObjStation:
var targetStation = null
var entity:Node2D
for entity in get_parent().get_children():
if entity.is_in_group("stations"):
if destination != null:
if entity == destination:
# Don't pick a station we are already at.
continue
if !targetStation:
targetStation = entity
else:
if position.distance_to(entity.position) < position.distance_to(targetStation.position):
targetStation = entity
if !targetStation:
print("WARNING: Couldn't find any stations in-sector.")
return targetStation
func findCheapestStation(wareName:String):
var targetStation = null
var entity:Node2D
var cheapestPrice : int = 99999999
for entity in get_parent().get_children():
if entity.is_in_group("stations"):
var station : ObjStation = entity
if destination != null:
if entity == destination:
continue
if station._produces.name != wareName or station.currentSellPrice > cheapestPrice:
continue
cheapestPrice = station.currentSellPrice
targetStation = entity
if !targetStation:
print("WARNING: Couldn't find any stations in-sector.")
return targetStation
""" Find a station that needs one of our wares. """
func findStationWithBestDeal(wareName:String):
var targetStation = null
var entity:Node2D
var bestPrice : int = 1
var lowestAmt : int = 999
## TODO This really should be set to the lowest price of the ware plus some buffer OR the highest price this ware was bought at.
## That way this freigher wouldn't sell at a loss.
print ("Trying to sell "+wareName)
# Find the station with the highest buy price for our ware.
for entity in get_parent().get_children():
if entity.is_in_group("stations"):
var station : ObjStation = entity
if destination != null:
if entity == destination:
continue
# Put these values in variable to help with debugging
var requiresThis : bool = station.requiresThisWareName(wareName)
if requiresThis:
var currentPrice : int = station.getBuyPriceName(wareName) ##### TODO, current the AI is not selling eCubes to stations that need it most.
print ("Found a place with ("+ String(station.cargoBay.wareNameAmount(wareName)) +") buying for "+String(currentPrice))
if currentPrice >= bestPrice:
var amt = station.cargoBay.wareNameAmount(wareName)
if amt < lowestAmt:
print ("PICKED!")
bestPrice = currentPrice
lowestAmt = amt
targetStation = entity
if !targetStation:
print("WARNING: Couldn't find any stations in-sector.")
return targetStation