···11+class_name Stone
12extends Node2D
2334## vheading is our currently visible heading
···78## heading is the actual heading we will use for gameplay
89var heading: Vector2
910## maxlen is the maxlen that we can fire towards, perhaps this changes over the course of a game
1010-var maxlen: float = 200
1111+const maxlen: float = 200
1112var BOUNDS: Rect2
1313+1414+var velocity: Vector2
1515+var drag: float
1616+var trail: Array[Vector2]
1717+1818+enum state {
1919+ INIT,
2020+ FIRED,
2121+ DONE
2222+}
2323+var mystate: state = state.INIT
12241325var mypoly: PackedVector2Array
1426var mycolors: PackedColorArray
···5769 hconfirmed = false
5870 heading = Vector2.ZERO
5971 vheading = Vector2.ZERO
7272+ mystate = state.FIRED
7373+ trail = []
7474+ drag = 1.0
6075 queue_redraw()
6176 return h
7777+62786379## set_heading is called while we have our mouse down, and it truncates our length towards maxlen, with some
6480## polynomial falloff
player.gd.uid
stone.gd.uid
+33-21
target.gd
···2233var polyinner: PackedVector2Array
44var colyinner: PackedColorArray
55-var polyminner: PackedVector2Array
66-var colyminner: PackedColorArray
77-var polymouter: PackedVector2Array
88-var colymouter: PackedColorArray
95var polyouter: PackedVector2Array
106var colyouter: PackedColorArray
117var BOUNDS: Rect2
1281313-func initialize(fg: Color, bg: Color, bounds: Rect2):
99+func initialize(fg: Color, bounds: Rect2):
1410 colyinner = []
1515- colyinner.resize(11)
1616- colyinner.fill(bg)
1717- colyminner = []
1818- colyminner.resize(14)
1919- colyminner.fill(fg)
2020- colymouter = []
2121- colymouter.resize(19)
2222- colymouter.fill(bg)
1111+ colyinner.resize(11 + 14 + 2)
1212+ colyinner.fill(fg)
1313+2314 colyouter = []
2424- colyouter.resize(23)
1515+ colyouter.resize(23 + 19 + 2)
2516 colyouter.fill(fg)
2617 BOUNDS = bounds
2718 sketch()
28192920func sketch():
3030- polyinner = genpolygon(11, 14.0, 1.0)
3131- polyminner = genpolygon(14, 28.0, 1.1)
3232- polymouter = genpolygon(19, 50.0, 1.3)
3333- polyouter = genpolygon(23, 62.0, 1.5)
2121+ polyinner = genring(genpolygon(11, 14.0, 1.0), genpolygon(14, 28.0, 1.1))
2222+ polyouter = genring(genpolygon(19, 50.0, 1.3), genpolygon(23, 62.0, 1.5))
3423 queue_redraw()
35243625func _draw():
3726 for dx in [-1, 0, 1]:
3827 for dy in [-1, 0, 1]:
3928 draw_polygon(offsetpoly(polyouter, dx, dy), colyouter)
4040- draw_polygon(offsetpoly(polymouter, dx, dy), colymouter)
4141- draw_polygon(offsetpoly(polyminner, dx, dy), colyminner)
4229 draw_polygon(offsetpoly(polyinner, dx, dy), colyinner)
43304431func offsetpoly(a: PackedVector2Array, dx: int, dy: int) -> PackedVector2Array:
···5239 res[i] = a[i] + offset
5340 return res
54414242+## genring takes an [param inner] polygon and an [param outer] polygon, and concatenates them so that
4343+## they form a polygon with the inner polygon cut out from the outer polygon. doesn't do any checks
4444+## to make sure that the polygon actually tesselates, but it does pick the best point in the inner polygon
4545+## to connect to the first point from the outer polygon
4646+func genring(inner: PackedVector2Array, outer: PackedVector2Array) -> PackedVector2Array:
4747+ var res: PackedVector2Array = []
4848+ res.resize(inner.size() + outer.size() + 2)
4949+ for i in range(outer.size()):
5050+ res[i] = outer[i]
5151+ var fouter = outer[0]
5252+ res[outer.size()] = fouter
5353+ var bi: int = -1
5454+ var best: float = 100000.0
5555+ for j in range(inner.size()):
5656+ var nl = (fouter - inner[j]).length()
5757+ if nl < best:
5858+ best = nl
5959+ bi = j
6060+ var os = outer.size() + 1
6161+ for j in range(inner.size()):
6262+ var idx = (inner.size() - j + bi) % inner.size()
6363+ res[os + j] = inner[idx]
6464+ res[os + inner.size()] = inner[bi]
6565+ return res
6666+5567## genpolygon generates a (nonconvex polygon) with [param n] vertices, and the given [param radius]
5668## and [param deviation]
5769func genpolygon(n: int, radius: float, deviation: float) -> PackedVector2Array:
···6274 var rsum = 0
6375 for i in range(n):
6476 rads[i] = randfn(radius, deviation)
6565- rots[i] = rsum + randf()
7777+ rots[i] = rsum + randf() + .2
6678 rsum = rots[i]
6779 var poly = PackedVector2Array()
6880 poly.resize(n)