Raceday: Willowbank quarter mile + the Queensland Raceway Paperclip

Two proper venues off the real Ipswich pair, both built in code.

Willowbank Dragway (levels/willowbank_dragway): a true 402 m dual-lane
strip -- concrete launch pad, FLUX-rubbered lanes, crowd grandstand with
canopy, red control tower, distance boards at 60ft/eighth/1000ft,
checkered finish under a scoreboard gantry, sand trap and tyre wall,
smashable SL_ light towers and a staging paddock of parked fleet cars.
Between the lanes: a working christmas tree, six bulbs driven by game.gd
through material_override emission.

Drag mode grew the event around it. Every drag now stages at the tree
(three ambers, green at 2.7 s); rolling >2 m early is a RED LIGHT that
bogs your launch. The opposition is a six-rung ladder of preset locals
(Nanna's Shopping Run through The Willowbank Widowmaker), each with its
own fleet car, power and reaction time. Beating your current rung climbs
the ladder and pays an escalating purse ($250-$1600, top dog repeats);
crossing at all pays $50; and every car keeps a persistent quarter-mile
PB worth $150 when beaten. Losing no longer ends the run early -- you
still cross for your ET, with a 10 s grace if you dawdle. Ladder rung
and PBs persist in the garage save (schema extended compatibly).

Queensland Raceway (levels/qld_raceway): the National Circuit digitised
from the official track map and scaled to its exact 3126 m lap. The road
is one generated quad strip with trimesh collision; kerbs, gravel traps
and tyre stacks derive automatically from centreline curvature, sponsor
hoardings space themselves down the straights, and the SF straight gets
the checkered line, gantry, pit wall and the mandatory red pit complex.
Plus the pond. Race/cruise/rage all run on its RacePath.

Trap for the diary: Godot front faces wind CLOCKWISE. The first cut of
the road ribbon wound CCW and rendered invisible from above while
colliding perfectly -- the smoke suite passed and the screenshot showed
four cars gridded on open grass.

Three new FLUX textures (crowd, dragstrip, sand; the sand prompt tripped
Cloudflare's NSFW filter, of all things, and fell back to local). Smoke
suite covers tree staging, the held rival, rung-0 identity, green-bulb
emission, red-light innocence, PB/rung persistence and the 3126 m lap.
Also swept stale shot_*.png.import debris and ignored the pattern.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
m3ultra 2026-07-31 11:43:08 +10:00
parent 117d950675
commit 21032191a3
84 changed files with 897 additions and 2717 deletions

1
.gitignore vendored
View File

@ -10,3 +10,4 @@ after_*.png
before_*.png.import
after_*.png.import
*.iso
shot_*.png.import

View File

@ -58,7 +58,15 @@ Controls: WASD/arrows drive, Shift drift, Space boost, R reset (or retry after C
winnable and honestly tuned, but they're scenery crashes rather than pile-ups. Both
sit on curved approaches where the launch street bends away from the intersection.
Worth hand-picking better crossings for those two.
- **Race** — 3 laps vs 3 rubber-banded rivals on the level's `RacePath`.
- **Race** — 3 laps vs 3 rubber-banded rivals on the level's `RacePath`. The
proper venue is **Queensland Raceway** (`levels/qld_raceway`) — "the
Paperclip", the National Circuit digitised from the official track map and
scaled to its real 3126 m lap: three tilted parallel straights, the T2
hairpin, the inner loop, the T6 fishhook, kerbs and gravel traps derived
automatically from curvature, sponsor hoardings down the straights, the pond,
and the red pit complex. The road is one generated quad strip with trimesh
collision (wound clockwise: Godot culls CCW faces, and the first cut of the
ribbon was invisible from above while colliding perfectly).
- **Road Rage** — Burnout 3's headline mode: 90 seconds, wreck as many rivals
as you can. They recover and keep driving so the supply never dries up, and a
leash teleports strays back into play. Bronze/silver/gold at 4/8/12.
@ -68,8 +76,24 @@ Controls: WASD/arrows drive, Shift drift, Space boost, R reset (or retry after C
genuinely straight stretch of wide road (the builder finds it and drops
`DragStart`/`DragEnd` markers, so no level needs hand-authored coordinates).
The gearbox *is* the game — revs climb, **space shifts**, and shifting inside
the window pays while an early shift or sitting on the limiter bogs you. One
opponent alongside.
the window pays while an early shift or sitting on the limiter bogs you.
The proper venue is **Willowbank Dragway** (`levels/willowbank_dragway`, built
in code like the carpark): a real 402 m with a concrete launch pad, rubbered
lanes, crowd grandstand, red control tower, sand trap and tyre wall — and a
working **christmas tree**. Every drag now stages at the tree: three ambers
half a second apart, launch on the green. Roll more than 2 m early and it's a
**RED LIGHT** — you launch bogged while the tree makes sure everyone saw.
The opposition is a **ladder** of six preset locals, weakest first: NANNA'S
SHOPPING RUN, P-PLATE PEPPER, MULLET MERV, TORQUE'N TEZZA, a SELF-DESCRIBED
BATHURST LEGEND and THE WILLOWBANK WIDOWMAKER. Each has its own car, power and
reaction time (Nanna sits at the green for most of a second; the Widowmaker
leaves with you). Beat your current rung to climb and collect the purse
($250 up to $1600, and the top dog repeats). Crossing at all pays $50, and
every car keeps a persistent **personal best ET** — beating it pays $150 and
is recorded in the garage save. Losing doesn't end the run early: you still
get to cross for your ET.
- **Derby** — Destruction Derby in the Woolies carpark: five opponents, last one
running wins. They use the pursuit AI, each hunting a different car so it's a
brawl rather than a mob, and leaving the ring for 8 s forfeits.
@ -104,7 +128,8 @@ one thing parts can't buy: panels that hang on through bigger hits (it raises
the car's shed-a-panel and wreck thresholds). Parts buy bling; the shed buys
labour.
Purchases are per-car (tools are global) and persist in `user://garage.save`.
Purchases are per-car (tools are global) and persist in `user://garage.save`,
which also carries the drag **ladder rung** and per-car **quarter-mile PBs**.
Upgrades apply to a duplicate of the CarStats resource -- the .tres is shared
with traffic and parked spawns of the same model, and tuning your Lazza must
not secretly tune every Lazza in the city. Bolt-ons attach after the deformer

BIN
assets/textures/crowd.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

View File

@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bsi3itd11kct2"
path="res://.godot/imported/shot_boom.png-f4ed7c2b8b65bee8e8d626deb1966c57.ctex"
uid="uid://dkm6pv1unrlkk"
path="res://.godot/imported/crowd.jpg-1b17b50537d9934dcb17506f222113db.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_boom.png"
dest_files=["res://.godot/imported/shot_boom.png-f4ed7c2b8b65bee8e8d626deb1966c57.ctex"]
source_file="res://assets/textures/crowd.jpg"
dest_files=["res://.godot/imported/crowd.jpg-1b17b50537d9934dcb17506f222113db.ctex"]
[params]

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

View File

@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://b553yjcq4ijve"
path="res://.godot/imported/shot_derelica.png-72a2e528235e0fda933bf4773a7452df.ctex"
uid="uid://mq0icgai0rr5"
path="res://.godot/imported/dragstrip.jpg-74090b2ade60c5a42d3debc768000d06.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_derelica.png"
dest_files=["res://.godot/imported/shot_derelica.png-72a2e528235e0fda933bf4773a7452df.ctex"]
source_file="res://assets/textures/dragstrip.jpg"
dest_files=["res://.godot/imported/dragstrip.jpg-74090b2ade60c5a42d3debc768000d06.ctex"]
[params]

BIN
assets/textures/sand.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

View File

@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://ckgqxm67w4wjg"
path="res://.godot/imported/shot_dusk.png-f6af1b6e4e64591ef1de1c661224bed5.ctex"
uid="uid://bp42dwu7txb6i"
path="res://.godot/imported/sand.jpg-cb159e87994df8b4b0b8c0252bc45be5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_dusk.png"
dest_files=["res://.godot/imported/shot_dusk.png-f6af1b6e4e64591ef1de1c661224bed5.ctex"]
source_file="res://assets/textures/sand.jpg"
dest_files=["res://.godot/imported/sand.jpg-cb159e87994df8b4b0b8c0252bc45be5.ctex"]
[params]

View File

@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Script" path="res://levels/qld_raceway/raceway.gd" id="1"]
[node name="QldRaceway" type="Node3D"]
script = ExtResource("1")

View File

@ -0,0 +1,373 @@
extends Node3D
## Queensland Raceway's National Circuit -- "the Paperclip" -- built in code.
## The centreline is digitised from the official track map (pixel coords) and
## scaled so the lap is exactly 3126 m, the real National Circuit length.
## Three tilted parallel straights, two outer hairpins, the inner loop and the
## T6 fishhook. Corners get kerbs, sand traps and tyre stacks automatically
## from curvature; straights get billboard hoardings.
##
## Race mode picks up the RacePath (same curve) and grids the field on it.
const TEX := "res://assets/textures/%s.jpg"
const LAP_M := 3126.0
const ROAD_W := 13.0
const STEP := 4.0 # road-mesh sampling, metres
## National Circuit red line off the track map, in image pixels (x, y-down).
## Drive order: SF heading west -> T1 -> west straight -> T2 hairpin -> top
## straight east -> east 180 -> middle straight west -> inner loop left ->
## third straight east -> T6 fishhook -> front straight -> SF.
const CENTRE_PX := [
[680, 795], [300, 800], [150, 782], [85, 720], [70, 620], [68, 400],
[85, 290], [130, 235], [220, 215], [700, 262], [1290, 335],
[1345, 372], [1352, 420], [1300, 452], [900, 470], [460, 485],
[400, 505], [375, 545], [385, 590], [430, 622], [520, 640],
[800, 680], [1080, 718], [1150, 720], [1200, 748], [1195, 782],
[1140, 795],
]
var curve: Curve3D
func _ready() -> void:
var rng := RandomNumberGenerator.new()
rng.seed = 3126
curve = _build_curve()
var samples := _samples()
# grass world sized off the track's bounding box
var lo := Vector3(INF, 0, INF)
var hi := Vector3(-INF, 0, -INF)
for s in samples:
lo.x = minf(lo.x, s["pos"].x); lo.z = minf(lo.z, s["pos"].z)
hi.x = maxf(hi.x, s["pos"].x); hi.z = maxf(hi.z, s["pos"].z)
var mid := (lo + hi) * 0.5
var span := hi - lo
_slab(Vector3(mid.x, -0.5, mid.z), Vector3(span.x + 260, 1, span.z + 260), _mat("grass", 18.0))
_road(samples)
var corners := _corners(samples)
_kerbs(samples)
for c in corners:
_corner_dressing(c, samples)
_hoardings(samples, corners)
_start_finish(samples)
_pits(samples)
# the pond, as seen from every aerial photo of the place
var pond := Vector3(lo.x + span.x * 0.25, 0.03, lo.z + span.z * 0.37)
_slab(pond, Vector3(55, 0.03, 38), _flat(Color(0.13, 0.25, 0.30), 0.15), false)
_gums(rng, samples, lo, hi)
var path := Path3D.new()
path.name = "RacePath"
path.curve = curve
add_child(path)
var spawn := Marker3D.new()
spawn.name = "Spawn"
var t0: Dictionary = samples[3]
spawn.transform = Transform3D(Basis.looking_at(t0["tan"], Vector3.UP),
t0["pos"] + Vector3.UP * 0.5)
add_child(spawn)
func _build_curve() -> Curve3D:
# raw pixel loop -> catmull tangents -> measure -> scale to LAP_M exactly
var raw: Array[Vector3] = []
for p in CENTRE_PX:
raw.append(Vector3(p[0], 0, p[1]))
var c := Curve3D.new()
var n := raw.size()
for i in n + 1:
var p := raw[i % n]
var t: Vector3 = (raw[(i + 1) % n] - raw[(i - 1 + n) % n]) * 0.2
c.add_point(p, -t, t)
var scale := LAP_M / c.get_baked_length()
var sc := Curve3D.new()
for i in c.point_count:
sc.add_point(c.get_point_position(i) * scale,
c.get_point_in(i) * scale, c.get_point_out(i) * scale)
return sc
func _samples() -> Array:
## [{pos, tan, side, dist}] every STEP metres. side points to the LEFT of
## the drive direction.
var out: Array = []
var L := curve.get_baked_length()
var d := 0.0
while d < L:
var p := curve.sample_baked(d)
var q := curve.sample_baked(fmod(d + 2.0, L))
var tn := (q - p)
tn.y = 0.0
tn = tn.normalized() if tn.length_squared() > 0.0001 else Vector3.FORWARD
out.append({"pos": p, "tan": tn, "side": Vector3.UP.cross(tn).normalized(), "dist": d})
d += STEP
return out
func _road(samples: Array) -> void:
## One long quad strip with real collision -- cars live on this surface.
var st := SurfaceTool.new()
st.begin(Mesh.PRIMITIVE_TRIANGLES)
var h := Vector3.UP * 0.05
var n := samples.size()
for i in n:
var a: Dictionary = samples[i]
var b: Dictionary = samples[(i + 1) % n]
var al: Vector3 = a["pos"] + a["side"] * ROAD_W * 0.5 + h
var ar: Vector3 = a["pos"] - a["side"] * ROAD_W * 0.5 + h
var bl: Vector3 = b["pos"] + b["side"] * ROAD_W * 0.5 + h
var br: Vector3 = b["pos"] - b["side"] * ROAD_W * 0.5 + h
var va: float = a["dist"] * 0.14
var vb: float = (a["dist"] + STEP) * 0.14
# Godot front faces wind CLOCKWISE seen from the normal side: the first
# cut of this strip wound CCW and the entire road was culled from above
for v in [[al, Vector2(0, va)], [br, Vector2(1.8, vb)], [ar, Vector2(1.8, va)],
[al, Vector2(0, va)], [bl, Vector2(0, vb)], [br, Vector2(1.8, vb)]]:
st.set_normal(Vector3.UP)
st.set_uv(v[1])
st.add_vertex(v[0])
var mesh := st.commit()
var m := StandardMaterial3D.new()
m.albedo_texture = load(TEX % "asphalt")
m.roughness = 0.92
mesh.surface_set_material(0, m)
var body := StaticBody3D.new()
var mi := MeshInstance3D.new()
mi.mesh = mesh
body.add_child(mi)
var cs := CollisionShape3D.new()
cs.shape = mesh.create_trimesh_shape()
body.add_child(cs)
add_child(body)
func _curvature(samples: Array, i: int) -> float:
## signed heading change per metre; positive = turning left
var n := samples.size()
var a: Vector3 = samples[i]["tan"]
var b: Vector3 = samples[(i + 1) % n]["tan"]
return a.signed_angle_to(b, Vector3.UP) / STEP
func _corners(samples: Array) -> Array:
## contiguous runs of |curvature| > threshold, min 6 samples (24 m)
## -> [{from, to, sign}] as sample indices
var out: Array = []
var n := samples.size()
var run_start := -1
var run_sign := 0.0
for i in n:
var k := _curvature(samples, i)
if absf(k) > 0.010:
if run_start < 0:
run_start = i
run_sign = signf(k)
else:
if run_start >= 0 and i - run_start >= 6:
out.append({"from": run_start, "to": i - 1, "sign": run_sign})
run_start = -1
if run_start >= 0 and n - run_start >= 6:
out.append({"from": run_start, "to": n - 1, "sign": run_sign})
return out
func _kerbs(samples: Array) -> void:
## red/white kerb blocks along both edges wherever the road actually turns
var red := _flat(Color(0.78, 0.12, 0.10), 0.7)
var white := _flat(Color(0.90, 0.90, 0.86), 0.7)
var n := samples.size()
for i in n:
if absf(_curvature(samples, i)) < 0.008 or i % 2 != 0:
continue
var s: Dictionary = samples[i]
for e in [-1.0, 1.0]:
var at: Vector3 = s["pos"] + s["side"] * e * (ROAD_W * 0.5 + 0.7) + Vector3.UP * 0.045
var mi := MeshInstance3D.new()
var bm := BoxMesh.new()
bm.size = Vector3(1.4, 0.07, STEP * 2.0)
bm.material = red if (i / 2) % 2 == 0 else white
mi.mesh = bm
mi.position = at
mi.basis = Basis.looking_at(s["tan"], Vector3.UP)
add_child(mi)
func _corner_dressing(c: Dictionary, samples: Array) -> void:
## outside of every real corner: a sand trap; inside: a tyre stack
var midi := int((int(c["from"]) + int(c["to"])) / 2.0)
var s: Dictionary = samples[midi]
# turning left (+sign) means the outside is the RIGHT edge (-side)
var out_dir: Vector3 = s["side"] * (-1.0 if float(c["sign"]) > 0.0 else 1.0)
var span := (int(c["to"]) - int(c["from"])) * STEP
if span > 40.0: # only proper corners earn a gravel trap
var at: Vector3 = s["pos"] + out_dir * (ROAD_W * 0.5 + 13.0)
var mi := MeshInstance3D.new()
var bm := BoxMesh.new()
bm.size = Vector3(minf(span * 0.9, 60.0), 0.04, 26.0)
bm.material = _mat("sand", 5.0)
mi.mesh = bm
mi.position = Vector3(at.x, 0.035, at.z)
mi.basis = Basis.looking_at(s["tan"], Vector3.UP)
add_child(mi)
var rubber := _flat(Color(0.07, 0.07, 0.08), 0.85)
var inn: Vector3 = s["pos"] - out_dir * (ROAD_W * 0.5 + 3.5)
for j in 5:
var mi := MeshInstance3D.new()
var cm := CylinderMesh.new()
cm.top_radius = 0.58
cm.bottom_radius = 0.58
cm.height = 1.05
cm.radial_segments = 9
cm.material = rubber
mi.mesh = cm
mi.position = inn + s["tan"] * (j - 2.0) * 1.3 + Vector3.UP * 0.53
add_child(mi)
func _hoardings(samples: Array, corners: Array) -> void:
## sponsor boards down the straights, FLUX gibberish and all
var ads := ["billboard_ad", "billboard_ad2", "billboard_ad3"]
var n := samples.size()
var since := 0.0
var adi := 0
for i in n:
since += STEP
if since < 130.0 or absf(_curvature(samples, i)) > 0.004:
continue
since = 0.0
var s: Dictionary = samples[i]
var at: Vector3 = s["pos"] + s["side"] * (ROAD_W * 0.5 + 9.0)
var post := _flat(Color(0.3, 0.31, 0.33), 0.5)
for j in [-3.2, 3.2]:
_boxat(at + s["tan"] * j + Vector3.UP * 0.9, Vector3(0.18, 1.8, 0.18), post, s["tan"])
_boxat(at + Vector3.UP * 1.9, Vector3(8.0, 1.9, 0.12), _mat(ads[adi % 3], 0.24, 0.4), s["tan"])
adi += 1
func _start_finish(samples: Array) -> void:
var s: Dictionary = samples[0]
for row in 2:
for i in 9:
var c := Color(0.05, 0.05, 0.06) if (i + row) % 2 == 0 else Color(0.92, 0.92, 0.9)
var at: Vector3 = s["pos"] + s["side"] * (-6.0 + i * 1.5) + s["tan"] * float(row) * 1.5
_boxat(Vector3(at.x, 0.06, at.z), Vector3(1.5, 0.02, 1.5), _flat(c, 0.7), s["tan"])
var steel := _flat(Color(0.25, 0.26, 0.28), 0.5)
for e in [-1.0, 1.0]:
_boxat(s["pos"] + s["side"] * e * (ROAD_W * 0.5 + 1.2) + Vector3.UP * 3.5,
Vector3(0.35, 7.0, 0.35), steel, s["tan"])
_boxat(s["pos"] + Vector3.UP * 6.6, Vector3(ROAD_W + 4.5, 1.6, 0.3),
_mat("billboard_ad2", 0.22, 0.4), s["tan"])
func _pits(samples: Array) -> void:
## the red pit complex on the outside of the front straight: garage row,
## pit wall, paddock awnings, a couple of transporters
var s: Dictionary = samples[mini(20, samples.size() - 1)] # ~80 m up-track of SF
var out_dir: Vector3 = -s["side"] # outside of the circuit on the front straight
var red := _flat(Color(0.72, 0.10, 0.08), 0.55)
var base: Vector3 = s["pos"] + out_dir * (ROAD_W * 0.5 + 22.0)
_boxat(base + Vector3.UP * 4.0, Vector3(14, 8.0, 95), red, s["tan"], true)
_boxat(base + Vector3.UP * 8.2, Vector3(15, 0.4, 98), _flat(Color(0.16, 0.17, 0.19), 0.6), s["tan"])
_boxat(base - out_dir * 7.1 + Vector3.UP * 5.9, Vector3(0.2, 2.2, 88),
_mat("facade_glass", 0.2, 0.25), s["tan"])
_boxat(base - out_dir * 7.1 + Vector3.UP * 2.0, Vector3(0.25, 3.4, 88),
_mat("shopfront", 0.2, 0.4), s["tan"])
# pit wall between track and pit lane
_boxat(s["pos"] + out_dir * (ROAD_W * 0.5 + 2.5) + Vector3.UP * 0.45,
Vector3(0.4, 0.9, 130), _mat("concrete_ground", 3.0), s["tan"], true)
# paddock: white awnings + transporters behind the garages
var wt := _mat("panel_white", 0.5, 0.5)
for j in 4:
_boxat(base + out_dir * 16.0 + s["tan"] * (-33.0 + j * 22.0) + Vector3.UP * 2.9,
Vector3(9, 0.2, 7), wt, s["tan"])
for j in 2:
_boxat(base + out_dir * 27.0 + s["tan"] * (-12.0 + j * 26.0) + Vector3.UP * 1.9,
Vector3(2.5, 3.8, 13.5), _flat(Color(0.82, 0.83, 0.86), 0.4), s["tan"], true)
func _gums(rng: RandomNumberGenerator, samples: Array, lo: Vector3, hi: Vector3) -> void:
## eucalypt scatter anywhere that's 25 m clear of the racing line
var pts: Array[Vector3] = []
for i in range(0, samples.size(), 3):
pts.append(samples[i]["pos"])
var placed := 0
var tries := 0
while placed < 40 and tries < 400:
tries += 1
var at := Vector3(rng.randf_range(lo.x - 90, hi.x + 90), 0, rng.randf_range(lo.z - 90, hi.z + 90))
var ok := true
for p in pts:
if Vector2(at.x - p.x, at.z - p.z).length_squared() < 625.0:
ok = false
break
if not ok:
continue
placed += 1
var trunk := MeshInstance3D.new()
var cm := CylinderMesh.new()
cm.top_radius = 0.14
cm.bottom_radius = 0.24
cm.height = rng.randf_range(5.0, 8.5)
cm.radial_segments = 7
cm.material = _mat("bark", 1.4)
trunk.mesh = cm
trunk.position = at + Vector3(0, cm.height * 0.5, 0)
add_child(trunk)
var crown := MeshInstance3D.new()
var sm := SphereMesh.new()
sm.radius = rng.randf_range(2.4, 3.6)
sm.height = sm.radius * 1.6
sm.radial_segments = 10
sm.rings = 6
sm.material = _mat("foliage", 0.55)
crown.mesh = sm
crown.position = at + Vector3(0, cm.height + sm.radius * 0.4, 0)
add_child(crown)
func _boxat(pos: Vector3, size: Vector3, mat: Material, along: Vector3, collide := false) -> void:
var mi := MeshInstance3D.new()
var bm := BoxMesh.new()
bm.size = size
bm.material = mat
mi.mesh = bm
if collide:
var body := StaticBody3D.new()
var cs := CollisionShape3D.new()
var bs := BoxShape3D.new()
bs.size = size
cs.shape = bs
body.add_child(cs)
body.add_child(mi)
body.position = pos
body.basis = Basis.looking_at(along, Vector3.UP)
add_child(body)
else:
mi.position = pos
mi.basis = Basis.looking_at(along, Vector3.UP)
add_child(mi)
func _mat(tex: String, scale: float, rough := 0.9) -> StandardMaterial3D:
var m := StandardMaterial3D.new()
m.albedo_texture = load(TEX % tex)
m.uv1_scale = Vector3(scale, scale, scale)
m.uv1_triplanar = true
m.roughness = rough
m.metallic = 0.0
return m
func _flat(color: Color, rough := 0.85) -> StandardMaterial3D:
var m := StandardMaterial3D.new()
m.albedo_color = color
m.roughness = rough
m.metallic = 0.0
return m
func _slab(pos: Vector3, size: Vector3, mat: Material, collide := true) -> void:
var body := StaticBody3D.new()
var mi := MeshInstance3D.new()
var bm := BoxMesh.new()
bm.size = size
bm.material = mat
mi.mesh = bm
body.add_child(mi)
if collide:
var shape := CollisionShape3D.new()
var bs := BoxShape3D.new()
bs.size = size
shape.shape = bs
body.add_child(shape)
body.position = pos
add_child(body)

View File

@ -0,0 +1 @@
uid://k5xln5yysglo

View File

@ -0,0 +1,261 @@
extends Node3D
## Willowbank-ish quarter mile, built in code like the carpark. A real 402 m of
## strip plus shutdown, sand trap and tyre wall, with a working christmas tree
## (game.gd drives the bulbs via their material_override emission).
##
## Geometry contract with game.gd's drag mode: DragStart sits at (0,0,0) in the
## .tscn and DragEnd at (0,0,-402); the player spawns at x=-2, the rival at
## x=+2, both facing -Z. The tree stands between the lanes at z=-6, visual only
## -- collision there would turn a wandering launch into a head-on with a pole.
const TEX := "res://assets/textures/%s.jpg"
const STRIP_HALF := 12.0 # wall-to-wall half width
const FINISH := -402.0
const SHUTDOWN_END := -640.0
func _ready() -> void:
var rng := RandomNumberGenerator.new()
rng.seed = 1320 # a respectable ET
_slab(Vector3(0, -0.5, -280), Vector3(420, 1, 900), _mat("grass", 14.0))
# the strip: asphalt base, concrete launch pad, rubbered lanes down-track
_slab(Vector3(0, -0.45, -290), Vector3(STRIP_HALF * 2, 1, 740), _mat("asphalt", 9.0))
_slab(Vector3(0, 0.065, -40), Vector3(STRIP_HALF * 2, 0.03, 80), _mat("concrete_ground", 4.0), false)
for lx in [-4.0, 4.0]:
_slab(Vector3(lx, 0.062, -320), Vector3(7.5, 0.02, 480), _mat("dragstrip", 5.0), false)
# centre line (double yellow) and edge lines
var yellow := _flat(Color(0.85, 0.72, 0.18), 0.7)
var white := _flat(Color(0.88, 0.88, 0.84), 0.7)
for cx in [-0.18, 0.18]:
_slab(Vector3(cx, 0.07, -305), Vector3(0.12, 0.02, 670), yellow, false)
for ex in [-10.8, 10.8]:
_slab(Vector3(ex, 0.07, -305), Vector3(0.14, 0.02, 670), white, false)
# concrete walls with alternating red/white caps, like every strip on earth
var conc := _mat("concrete_ground", 3.0)
for sx in [-1.0, 1.0]:
_slab(Vector3(sx * STRIP_HALF, 0.475, -315), Vector3(0.5, 0.95, 690), conc)
for i in 40:
var z := 20.0 - i * 17.0
_slab(Vector3(sx * STRIP_HALF, 0.99, z), Vector3(0.54, 0.08, 8.0),
_flat(Color(0.78, 0.12, 0.10) if i % 2 == 0 else Color(0.9, 0.9, 0.88), 0.6), false)
_tree()
_start_line()
_finish_line()
_boards()
_grandstand()
_tower()
_sand_trap()
# return road up the right-hand side, back to the staging paddock
_slab(Vector3(19.0, 0.04, -290), Vector3(8, 0.02, 700), _mat("asphalt", 9.0), false)
# staging paddock: PP_ markers become shuntable parked fleet cars (game.gd)
for i in 8:
var m := Marker3D.new()
m.name = "PP_pad%d" % i
m.position = Vector3(20.0 + 5.5 * (i % 4), 0.0, 22.0 + 8.0 * (i / 4))
m.rotate_y(PI * 0.5 + rng.randf_range(-0.08, 0.08))
add_child(m)
# lighting towers as SL_ markers: game.gd builds them as smashable street
# lights that really cast light at night. Yes, you can flatten them.
var sl := 0
for z in [-80.0, -220.0, -360.0, -500.0]:
for sx in [-1.0, 1.0]:
var m := Marker3D.new()
m.name = "SL_%d" % sl
sl += 1
m.position = Vector3(sx * (STRIP_HALF + 2.0), 0.0, z)
add_child(m)
# wheelie bins behind the wall because there is always a row of wheelie bins
for i in 6:
var m := Marker3D.new()
m.name = "WB_%d" % i
m.position = Vector3(14.5, 0.0, 8.0 - i * 3.0)
add_child(m)
_gums(rng)
_race_path()
func _mat(tex: String, scale: float, rough := 0.9) -> StandardMaterial3D:
var m := StandardMaterial3D.new()
m.albedo_texture = load(TEX % tex)
m.uv1_scale = Vector3(scale, scale, scale)
m.uv1_triplanar = true
m.roughness = rough
m.metallic = 0.0
return m
func _flat(color: Color, rough := 0.85) -> StandardMaterial3D:
var m := StandardMaterial3D.new()
m.albedo_color = color
m.roughness = rough
m.metallic = 0.0
return m
func _slab(pos: Vector3, size: Vector3, mat: Material, collide := true) -> void:
var body: PhysicsBody3D = StaticBody3D.new()
var mi := MeshInstance3D.new()
var bm := BoxMesh.new()
bm.size = size
bm.material = mat
mi.mesh = bm
body.add_child(mi)
if collide:
var shape := CollisionShape3D.new()
var bs := BoxShape3D.new()
bs.size = size
shape.shape = bs
body.add_child(shape)
body.position = pos
add_child(body)
func _tree() -> void:
## The christmas tree: pole + backboard + six named bulbs. game.gd finds
## them by name and flips material_override.emission_enabled. Visual only.
var steel := _flat(Color(0.22, 0.23, 0.25), 0.5)
_slab(Vector3(0, 1.1, -6), Vector3(0.14, 2.2, 0.14), steel, false)
_slab(Vector3(0, 2.0, -6), Vector3(0.55, 1.75, 0.10), _flat(Color(0.10, 0.10, 0.12), 0.6), false)
var bulbs := [
["TreeStage", 2.68, Color(0.9, 0.9, 0.8)],
["TreeAmber1", 2.38, Color(1.0, 0.68, 0.05)],
["TreeAmber2", 2.12, Color(1.0, 0.68, 0.05)],
["TreeAmber3", 1.86, Color(1.0, 0.68, 0.05)],
["TreeGreen", 1.58, Color(0.15, 0.95, 0.25)],
["TreeRed", 1.30, Color(0.95, 0.10, 0.08)],
]
for b in bulbs:
var mi := MeshInstance3D.new()
var sm := SphereMesh.new()
sm.radius = 0.105
sm.height = 0.21
sm.radial_segments = 12
sm.rings = 6
mi.mesh = sm
var m := StandardMaterial3D.new()
m.albedo_color = Color(b[2]) * 0.35 # dim housing until it fires
m.roughness = 0.4
m.emission_enabled = false
m.emission = Color(b[2])
m.emission_energy_multiplier = 3.5
mi.material_override = m
mi.name = String(b[0])
mi.position = Vector3(0, float(b[1]), -6.06)
add_child(mi)
func _start_line() -> void:
var white := _flat(Color(0.9, 0.9, 0.86), 0.7)
_slab(Vector3(0, 0.07, 0), Vector3(STRIP_HALF * 2 - 1.6, 0.02, 0.4), white, false)
# burnout box water patches behind the line
for lx in [-4.0, 4.0]:
_slab(Vector3(lx, 0.068, 8.0), Vector3(5.0, 0.015, 9.0),
_flat(Color(0.10, 0.11, 0.13), 0.15), false)
func _finish_line() -> void:
# checkered strip + scoreboard gantry
for row in 2:
for i in 11:
var c := Color(0.05, 0.05, 0.06) if (i + row) % 2 == 0 else Color(0.92, 0.92, 0.9)
_slab(Vector3(-10.0 + i * 2.0, 0.07, FINISH - row * 2.0),
Vector3(2.0, 0.02, 2.0), _flat(c, 0.7), false)
var steel := _flat(Color(0.25, 0.26, 0.28), 0.5)
for sx in [-1.0, 1.0]:
_slab(Vector3(sx * (STRIP_HALF + 0.8), 3.5, FINISH), Vector3(0.35, 7.0, 0.35), steel)
_slab(Vector3(0, 7.1, FINISH), Vector3(STRIP_HALF * 2 + 2.5, 0.45, 0.45), steel, false)
for sx in [-5.0, 5.0]:
_slab(Vector3(sx, 5.9, FINISH), Vector3(4.5, 2.0, 0.3), _mat("billboard_ad3", 0.22, 0.4), false)
func _boards() -> void:
# distance boards: 60ft, eighth, 1000ft -- the numbers that matter
var posts := _flat(Color(0.85, 0.85, 0.8), 0.6)
for z in [-18.3, -201.2, -305.0]:
for sx in [-1.0, 1.0]:
_slab(Vector3(sx * (STRIP_HALF + 1.2), 1.0, z), Vector3(0.16, 2.0, 0.16), posts, false)
_slab(Vector3(sx * (STRIP_HALF + 1.2), 2.2, z), Vector3(1.3, 0.9, 0.1), posts, false)
func _grandstand() -> void:
## Six stepped tiers with FLUX crowd panels on the risers and a white canopy.
var conc := _mat("concrete_ground", 3.0)
for i in 6:
var x := -16.5 - i * 2.6
var y := 0.55 + i * 0.85
_slab(Vector3(x, y * 0.5, -80), Vector3(2.6, y, 120), conc)
_slab(Vector3(x + 1.28, y + 0.75, -80), Vector3(0.08, 1.5, 118), _mat("crowd", 7.0, 0.9), false)
var steel := _flat(Color(0.3, 0.31, 0.33), 0.5)
for zi in 5:
_slab(Vector3(-24.0, 3.8, -128 + zi * 24.0), Vector3(0.3, 7.6, 0.3), steel, false)
_slab(Vector3(-25.5, 7.6, -80), Vector3(20.0, 0.25, 124), _mat("panel_white", 0.5, 0.5), false)
func _tower() -> void:
## The red control tower: every Queensland circuit building is this shade.
var red := _flat(Color(0.72, 0.10, 0.08), 0.55)
var glass := _mat("facade_glass", 0.2, 0.25)
_slab(Vector3(21.0, 6.0, -14), Vector3(9.0, 12.0, 8.0), red)
_slab(Vector3(21.0, 10.4, -9.95), Vector3(8.2, 2.6, 0.2), glass, false)
_slab(Vector3(21.0, 12.3, -14), Vector3(9.6, 0.4, 8.6), _flat(Color(0.16, 0.17, 0.19), 0.6), false)
_slab(Vector3(21.0, 7.4, -9.9), Vector3(8.2, 1.6, 0.15), _mat("billboard_ad", 0.3, 0.4), false)
# paddock awnings behind it
for i in 3:
_slab(Vector3(30.0, 2.9, -30.0 - i * 14.0), Vector3(7.0, 0.2, 10.0), _mat("panel_white", 0.5, 0.5), false)
for sx in [-3.0, 3.0]:
for sz in [-4.5, 4.5]:
_slab(Vector3(30.0 + sx, 1.45, -30.0 - i * 14.0 + sz), Vector3(0.15, 2.9, 0.15),
_flat(Color(0.5, 0.5, 0.52), 0.5), false)
func _sand_trap() -> void:
_slab(Vector3(0, 0.055, -668), Vector3(STRIP_HALF * 2, 0.03, 56), _mat("sand", 5.0), false)
# tyre wall: fat black cylinders in a row, then an honest collision slab
var rubber := _flat(Color(0.07, 0.07, 0.08), 0.85)
for i in 17:
var mi := MeshInstance3D.new()
var cm := CylinderMesh.new()
cm.top_radius = 0.62
cm.bottom_radius = 0.62
cm.height = 1.15
cm.radial_segments = 10
cm.material = rubber
mi.mesh = cm
mi.position = Vector3(-11.2 + i * 1.4, 0.58, -694)
add_child(mi)
_slab(Vector3(0, 1.0, -695.2), Vector3(STRIP_HALF * 2 + 2, 2.0, 1.0), rubber)
func _gums(rng: RandomNumberGenerator) -> void:
for i in 26:
var sx := -1.0 if i % 2 == 0 else 1.0
var at := Vector3(sx * rng.randf_range(30.0, 80.0), 0, rng.randf_range(-620.0, 40.0))
var trunk := MeshInstance3D.new()
var cm := CylinderMesh.new()
cm.top_radius = 0.14
cm.bottom_radius = 0.24
cm.height = rng.randf_range(5.0, 8.0)
cm.radial_segments = 7
cm.material = _mat("bark", 1.4)
trunk.mesh = cm
trunk.position = at + Vector3(0, cm.height * 0.5, 0)
add_child(trunk)
var crown := MeshInstance3D.new()
var sm := SphereMesh.new()
sm.radius = rng.randf_range(2.2, 3.4)
sm.height = sm.radius * 1.6
sm.radial_segments = 10
sm.rings = 6
sm.material = _mat("foliage", 0.55)
crown.mesh = sm
crown.position = at + Vector3(0, cm.height + sm.radius * 0.4, 0)
add_child(crown)
func _race_path() -> void:
# loop for cruise traffic: down the strip, back up the return road
var path := Path3D.new()
path.name = "RacePath"
var c := Curve3D.new()
var pts := [Vector3(0, 0, 40), Vector3(0, 0, -620), Vector3(19, 0, -620), Vector3(19, 0, 40)]
for i in pts.size() + 1:
var p: Vector3 = pts[i % pts.size()]
var to_prev: Vector3 = (pts[(i - 1 + pts.size()) % pts.size()] - p).normalized() * 8.0
var to_next: Vector3 = (pts[(i + 1) % pts.size()] - p).normalized() * 8.0
c.add_point(p, to_prev, to_next)
path.curve = c
add_child(path)

View File

@ -0,0 +1 @@
uid://5urdkjgbac5y

View File

@ -0,0 +1,15 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Script" path="res://levels/willowbank_dragway/dragway.gd" id="1"]
[node name="WillowbankDragway" type="Node3D"]
script = ExtResource("1")
[node name="Spawn" type="Marker3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 40)
[node name="DragStart" type="Marker3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
[node name="DragEnd" type="Marker3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -402)

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cacaot1ody7kd"
path="res://.godot/imported/shot_albert_parklands.png-709880ec3f07b35d5884c6bc8143677c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_albert_parklands.png"
dest_files=["res://.godot/imported/shot_albert_parklands.png-709880ec3f07b35d5884c6bc8143677c.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bqaxeko1tl5w7"
path="res://.godot/imported/shot_bridge.png-2373c808c2e6eab2488c5d984769ec6f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_bridge.png"
dest_files=["res://.godot/imported/shot_bridge.png-2373c808c2e6eab2488c5d984769ec6f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cfq88o84umvip"
path="res://.godot/imported/shot_bridge_dem.png-75be2353aa1d96cb1fa690daade691e3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_bridge_dem.png"
dest_files=["res://.godot/imported/shot_bridge_dem.png-75be2353aa1d96cb1fa690daade691e3.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://wxu5r0kb7at5"
path="res://.godot/imported/shot_busted_leyland.png-1b68c6edebd14db41b2b3046347cecf4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_busted_leyland.png"
dest_files=["res://.godot/imported/shot_busted_leyland.png-1b68c6edebd14db41b2b3046347cecf4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bvj8acey6cfwt"
path="res://.godot/imported/shot_casserola_dx.png-143068759f8248f4e67facd7ba986a47.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_casserola_dx.png"
dest_files=["res://.godot/imported/shot_casserola_dx.png-143068759f8248f4e67facd7ba986a47.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://caxryihtxhm3"
path="res://.godot/imported/shot_casserola_ke80.png-25193f7ba65f0ecac14cf98f399167eb.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_casserola_ke80.png"
dest_files=["res://.godot/imported/shot_casserola_ke80.png-25193f7ba65f0ecac14cf98f399167eb.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dtw68ub6k2k57"
path="res://.godot/imported/shot_chaebol_90.png-34f2f19d59a1dfc9c9065b0f098ba31b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_chaebol_90.png"
dest_files=["res://.godot/imported/shot_chaebol_90.png-34f2f19d59a1dfc9c9065b0f098ba31b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dj88gcnypqq47"
path="res://.godot/imported/shot_chaebol_92.png-72629faa17fdf8d9689fb8bb7ae41c7e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_chaebol_92.png"
dest_files=["res://.godot/imported/shot_chaebol_92.png-72629faa17fdf8d9689fb8bb7ae41c7e.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bm80bpeqm41q4"
path="res://.godot/imported/shot_chaebol_x1.png-ab23f1251ae9c80a4dbe158ad9a4e40d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_chaebol_x1.png"
dest_files=["res://.godot/imported/shot_chaebol_x1.png-ab23f1251ae9c80a4dbe158ad9a4e40d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://khjyhwdfp4of"
path="res://.godot/imported/shot_chaebol_x2.png-85e80bf3292aa38ec2e2af06d6395f40.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_chaebol_x2.png"
dest_files=["res://.godot/imported/shot_chaebol_x2.png-85e80bf3292aa38ec2e2af06d6395f40.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://x0ap1xtqufy"
path="res://.godot/imported/shot_crash.png-0fd81ecc7f94fef4c0d6e80bfb3abf5a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_crash.png"
dest_files=["res://.godot/imported/shot_crash.png-0fd81ecc7f94fef4c0d6e80bfb3abf5a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dr1yh3qyfpgew"
path="res://.godot/imported/shot_dadson_240z.png-607e7502187621a2dca20481e5ded264.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_dadson_240z.png"
dest_files=["res://.godot/imported/shot_dadson_240z.png-607e7502187621a2dca20481e5ded264.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://csax7yqjgptvt"
path="res://.godot/imported/shot_datto_120y.png-85e191822a21ddbb3112ee0a47028b7f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_datto_120y.png"
dest_files=["res://.godot/imported/shot_datto_120y.png-85e191822a21ddbb3112ee0a47028b7f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cp2rgao7fesff"
path="res://.godot/imported/shot_deform_after.png-3d28120be42a8120e987f9dc2910eef4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_deform_after.png"
dest_files=["res://.godot/imported/shot_deform_after.png-3d28120be42a8120e987f9dc2910eef4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://caxvklepgk1l0"
path="res://.godot/imported/shot_deform_before.png-f2ee82086fe3fb722b601ee9d7cccf9e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_deform_before.png"
dest_files=["res://.godot/imported/shot_deform_before.png-f2ee82086fe3fb722b601ee9d7cccf9e.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://3n2kvgojbgwf"
path="res://.godot/imported/shot_facade_f.png-9fa96bfde3dcbd65751693978b15004c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_facade_f.png"
dest_files=["res://.godot/imported/shot_facade_f.png-9fa96bfde3dcbd65751693978b15004c.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cjfi57xn0na3h"
path="res://.godot/imported/shot_facade_r.png-2e6fbc4bb08a15dde0b9e54f90566d31.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_facade_r.png"
dest_files=["res://.godot/imported/shot_facade_r.png-2e6fbc4bb08a15dde0b9e54f90566d31.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cd5quvmmdk7wy"
path="res://.godot/imported/shot_floored_xd.png-6498dca165edfeb647825ab5252ac5e1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_floored_xd.png"
dest_files=["res://.godot/imported/shot_floored_xd.png-6498dca165edfeb647825ab5252ac5e1.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dr7aglv20utx3"
path="res://.godot/imported/shot_garage_f.png-aa2f56aea17c124e5ede0f7b9bc1c349.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_garage_f.png"
dest_files=["res://.godot/imported/shot_garage_f.png-aa2f56aea17c124e5ede0f7b9bc1c349.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bmlq6d63wenbp"
path="res://.godot/imported/shot_garage_r.png-524c5e48bfb09463cc90db7e4ba2f22b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_garage_r.png"
dest_files=["res://.godot/imported/shot_garage_r.png-524c5e48bfb09463cc90db7e4ba2f22b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ogsrhjmu4sa5"
path="res://.godot/imported/shot_hardon_cmere.png-791bf7aa28c70148da5c8cc8507cb785.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_hardon_cmere.png"
dest_files=["res://.godot/imported/shot_hardon_cmere.png-791bf7aa28c70148da5c8cc8507cb785.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dcofpebmsrb7e"
path="res://.godot/imported/shot_hardon_effex.png-ce88a33c72f9e74e80b1be1d7cd98350.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_hardon_effex.png"
dest_files=["res://.godot/imported/shot_hardon_effex.png-ce88a33c72f9e74e80b1be1d7cd98350.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://crxu1cferab8n"
path="res://.godot/imported/shot_hardon_eh.png-4a87b9f2900c736fab809fe8e9cd34a0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_hardon_eh.png"
dest_files=["res://.godot/imported/shot_hardon_eh.png-4a87b9f2900c736fab809fe8e9cd34a0.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bu5mmxfeeas03"
path="res://.godot/imported/shot_hardon_hr.png-852559122027f557a8bf101f41ade1d7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_hardon_hr.png"
dest_files=["res://.godot/imported/shot_hardon_hr.png-852559122027f557a8bf101f41ade1d7.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://m6mfjs5lhsdj"
path="res://.godot/imported/shot_hardon_shaggen.png-ac88433802c5d63125f57723ad489e3a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_hardon_shaggen.png"
dest_files=["res://.godot/imported/shot_hardon_shaggen.png-ac88433802c5d63125f57723ad489e3a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dkm1p5n1xyg7t"
path="res://.godot/imported/shot_jct.png-d1005de9ee52815e0d48b6f3b6f72efa.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_jct.png"
dest_files=["res://.godot/imported/shot_jct.png-d1005de9ee52815e0d48b6f3b6f72efa.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b4qj6hifty7co"
path="res://.godot/imported/shot_jct_woolies.png-8055f5e30848dcfa5c2e67aa3a1cbdb1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_jct_woolies.png"
dest_files=["res://.godot/imported/shot_jct_woolies.png-8055f5e30848dcfa5c2e67aa3a1cbdb1.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d00cb83dfqjw4"
path="res://.godot/imported/shot_juice1.png-fba2fcb034fbfdcb8d9ae2a583d4d311.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_juice1.png"
dest_files=["res://.godot/imported/shot_juice1.png-fba2fcb034fbfdcb8d9ae2a583d4d311.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://l2umf3kh323s"
path="res://.godot/imported/shot_juice2.png-2a393fa7456855db0f24793b286f65ec.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_juice2.png"
dest_files=["res://.godot/imported/shot_juice2.png-2a393fa7456855db0f24793b286f65ec.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://nfevhdjjdgey"
path="res://.godot/imported/shot_kangaroo_point.png-f630857604c681c00ff4ab8023aaa971.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_kangaroo_point.png"
dest_files=["res://.godot/imported/shot_kangaroo_point.png-f630857604c681c00ff4ab8023aaa971.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://brgybf6k2kpms"
path="res://.godot/imported/shot_kingswood_hz.png-7d4abe16335ac30b38209e6834875a74.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_kingswood_hz.png"
dest_files=["res://.godot/imported/shot_kingswood_hz.png-7d4abe16335ac30b38209e6834875a74.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bvti3upsy17mh"
path="res://.godot/imported/shot_kp.png-38a7ee1a2c8da54f618e19705f30821f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_kp.png"
dest_files=["res://.godot/imported/shot_kp.png-38a7ee1a2c8da54f618e19705f30821f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bflslcdy1e4vi"
path="res://.godot/imported/shot_kp2.png-e7a65557575e8977229d43997986ddec.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_kp2.png"
dest_files=["res://.godot/imported/shot_kp2.png-e7a65557575e8977229d43997986ddec.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://boesb5lcxhlfv"
path="res://.godot/imported/shot_kp_dem.png-c9ce5dfc952a5ba8544840830a36b4c0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_kp_dem.png"
dest_files=["res://.godot/imported/shot_kp_dem.png-c9ce5dfc952a5ba8544840830a36b4c0.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dv0r0ctfsvyse"
path="res://.godot/imported/shot_kp_top.png-9b910b7280f9d3c8de3410ea2430621a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_kp_top.png"
dest_files=["res://.godot/imported/shot_kp_top.png-9b910b7280f9d3c8de3410ea2430621a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bbib77a1k1ctx"
path="res://.godot/imported/shot_lazza_f.png-c4f6c2fc6a04fba4e5ef692bbc36f5ef.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_lazza_f.png"
dest_files=["res://.godot/imported/shot_lazza_f.png-c4f6c2fc6a04fba4e5ef692bbc36f5ef.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bgmqcpm3wcbxc"
path="res://.godot/imported/shot_lazza_r.png-83a41ac1c2e13b89e6d117f1a065c9f1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_lazza_r.png"
dest_files=["res://.godot/imported/shot_lazza_r.png-83a41ac1c2e13b89e6d117f1a065c9f1.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dnefwmnb6uh83"
path="res://.godot/imported/shot_leyland_morry.png-6f6ed93a4bdf1412b7f94fc8f339450b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_leyland_morry.png"
dest_files=["res://.godot/imported/shot_leyland_morry.png-6f6ed93a4bdf1412b7f94fc8f339450b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dsunbri1n1hdl"
path="res://.godot/imported/shot_maxi_merk.png-d03ea9df7245aee513664c0ffe034bb5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_maxi_merk.png"
dest_files=["res://.godot/imported/shot_maxi_merk.png-d03ea9df7245aee513664c0ffe034bb5.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://btgywefwig6wi"
path="res://.godot/imported/shot_menu.png-c61344a3ec1e3de2e32ce9670e847ca3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_menu.png"
dest_files=["res://.godot/imported/shot_menu.png-c61344a3ec1e3de2e32ce9670e847ca3.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dqcoi0fwl2ifg"
path="res://.godot/imported/shot_mini_merk.png-4058795d9b92ecc2207e6bc083eb6cae.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_mini_merk.png"
dest_files=["res://.godot/imported/shot_mini_merk.png-4058795d9b92ecc2207e6bc083eb6cae.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b1vkow0v583bx"
path="res://.godot/imported/shot_minicab.png-43c91c995b8c283a20b4adb3e1f5787d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_minicab.png"
dest_files=["res://.godot/imported/shot_minicab.png-43c91c995b8c283a20b4adb3e1f5787d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bn4ofl8uhfeaq"
path="res://.godot/imported/shot_morry.png-654f7e7886c576aa15987960425204b9.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_morry.png"
dest_files=["res://.godot/imported/shot_morry.png-654f7e7886c576aa15987960425204b9.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ceecujmymhp7v"
path="res://.godot/imported/shot_new_bubbla_600.png-05b2db194b7a014fc14c973c912e5583.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_new_bubbla_600.png"
dest_files=["res://.godot/imported/shot_new_bubbla_600.png-05b2db194b7a014fc14c973c912e5583.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://mll58atwcrp6"
path="res://.godot/imported/shot_new_falcodore_gtho.png-e66ed2ab5a9d8d094ec961c70879ba93.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_new_falcodore_gtho.png"
dest_files=["res://.godot/imported/shot_new_falcodore_gtho.png-e66ed2ab5a9d8d094ec961c70879ba93.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c7vogu04epx1b"
path="res://.godot/imported/shot_new_hardon_waggo.png-070bed85dde44ad7d2157c19c292a0a0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_new_hardon_waggo.png"
dest_files=["res://.godot/imported/shot_new_hardon_waggo.png-070bed85dde44ad7d2157c19c292a0a0.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bgjfj2d166iw"
path="res://.godot/imported/shot_new_hardon_wb_ute.png-7ed5d240147f85803b553146a1f90363.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_new_hardon_wb_ute.png"
dest_files=["res://.godot/imported/shot_new_hardon_wb_ute.png-7ed5d240147f85803b553146a1f90363.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ssfx4eea0hio"
path="res://.godot/imported/shot_night.png-18957e7f26c9433700879ac3d7e65fdb.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_night.png"
dest_files=["res://.godot/imported/shot_night.png-18957e7f26c9433700879ac3d7e65fdb.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://chisg1pamath8"
path="res://.godot/imported/shot_probe1.png-7fcccbd8717c822595793ca3bec750d3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_probe1.png"
dest_files=["res://.godot/imported/shot_probe1.png-7fcccbd8717c822595793ca3bec750d3.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c6iefyegaq2wn"
path="res://.godot/imported/shot_probe2.png-80097fc680af478bf18b1d5937767200.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_probe2.png"
dest_files=["res://.godot/imported/shot_probe2.png-80097fc680af478bf18b1d5937767200.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://mfkte8qttss2"
path="res://.godot/imported/shot_qsm.png-967b3acff66d7bf0bed2878528afe78c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_qsm.png"
dest_files=["res://.godot/imported/shot_qsm.png-967b3acff66d7bf0bed2878528afe78c.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cyrxo3cw4imnk"
path="res://.godot/imported/shot_qsm_top.png-6e1ac5a3e8dd19f56575f328b6aac35d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_qsm_top.png"
dest_files=["res://.godot/imported/shot_qsm_top.png-6e1ac5a3e8dd19f56575f328b6aac35d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dqfosdy1qrqlv"
path="res://.godot/imported/shot_queen_st_mall.png-574d98f9268cb3086d50834347bcbd80.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_queen_st_mall.png"
dest_files=["res://.godot/imported/shot_queen_st_mall.png-574d98f9268cb3086d50834347bcbd80.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://rlp11v4g2ur1"
path="res://.godot/imported/shot_sb1.png-da1bbcae1e530a41f044756363f0c5e7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_sb1.png"
dest_files=["res://.godot/imported/shot_sb1.png-da1bbcae1e530a41f044756363f0c5e7.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dpv2rx6laf2w3"
path="res://.godot/imported/shot_sb_bridge.png-3a49e069a8658d202658083a9b3802d5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_sb_bridge.png"
dest_files=["res://.godot/imported/shot_sb_bridge.png-3a49e069a8658d202658083a9b3802d5.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d4kx2h1eua5tv"
path="res://.godot/imported/shot_sb_top.png-3f1ec0b6cf3244f763576dcf24a3d29e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_sb_top.png"
dest_files=["res://.godot/imported/shot_sb_top.png-3f1ec0b6cf3244f763576dcf24a3d29e.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cekys4ivgu4h8"
path="res://.godot/imported/shot_signals.png-63a3c63abf5322b610cd10df0b3df2ad.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_signals.png"
dest_files=["res://.godot/imported/shot_signals.png-63a3c63abf5322b610cd10df0b3df2ad.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://s6i8tuutr6lt"
path="res://.godot/imported/shot_skin_f.png-c6f63b09adc28589fda207aea5e20aef.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_skin_f.png"
dest_files=["res://.godot/imported/shot_skin_f.png-c6f63b09adc28589fda207aea5e20aef.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bkffl21h7ydui"
path="res://.godot/imported/shot_skin_r.png-d462c89253aeeef933841bff40b3422a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_skin_r.png"
dest_files=["res://.godot/imported/shot_skin_r.png-d462c89253aeeef933841bff40b3422a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cfi0qm6la5und"
path="res://.godot/imported/shot_smash.png-74c714eba18dc662dd518b4cb8cf6335.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_smash.png"
dest_files=["res://.godot/imported/shot_smash.png-74c714eba18dc662dd518b4cb8cf6335.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dq74to3ccwpby"
path="res://.godot/imported/shot_southbank.png-c868fc85f6d129b498f68423d5fba80c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_southbank.png"
dest_files=["res://.godot/imported/shot_southbank.png-c868fc85f6d129b498f68423d5fba80c.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dqolmf6smk5rw"
path="res://.godot/imported/shot_story_bridge.png-c0dda03340591aca8bb2478b891d1ef7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_story_bridge.png"
dest_files=["res://.godot/imported/shot_story_bridge.png-c0dda03340591aca8bb2478b891d1ef7.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://w384sbljyqjk"
path="res://.godot/imported/shot_trolleys.png-4bc10206031793a54eda76f31a101806.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_trolleys.png"
dest_files=["res://.godot/imported/shot_trolleys.png-4bc10206031793a54eda76f31a101806.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dbp7gnpd3ju1h"
path="res://.godot/imported/shot_turdeno.png-d5b513f8b0848eb839603ea9d63538a4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_turdeno.png"
dest_files=["res://.godot/imported/shot_turdeno.png-d5b513f8b0848eb839603ea9d63538a4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bxit0l621tsok"
path="res://.godot/imported/shot_turdrunner_slur.png-2dfbb7c644ee0226f53c86ea197285f9.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_turdrunner_slur.png"
dest_files=["res://.godot/imported/shot_turdrunner_slur.png-2dfbb7c644ee0226f53c86ea197285f9.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dnjqu44q2852h"
path="res://.godot/imported/shot_wheel.png-4565b180afd912702d97c89afcbab902.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_wheel.png"
dest_files=["res://.godot/imported/shot_wheel.png-4565b180afd912702d97c89afcbab902.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dpuclminxkqb1"
path="res://.godot/imported/shot_woolies_carpark.png-a6b0808bdf7ff1a418fb8121ad945c2f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://shot_woolies_carpark.png"
dest_files=["res://.godot/imported/shot_woolies_carpark.png-a6b0808bdf7ff1a418fb8121ad945c2f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -50,6 +50,22 @@ const DRAG_GEARS := 5
const SHIFT_LO := 0.74 # revs below this = shifted early, lose drive
const REDLINE := 0.99 # hit it without shifting and the engine bogs
const DRAG_REV_RATE := [0.0, 0.62, 0.50, 0.40, 0.32, 0.26] # per gear, revs/sec
## The Willowbank ladder: preset rivals, weakest first. power is their
## power_scale once they launch, reaction is how long after the green they sit
## there blinking, purse is what beating them pays. Beat the rung you're on to
## climb; the top dog repeats and keeps paying.
const DRAG_LADDER := [
{"name": "NANNA'S SHOPPING RUN", "car": "morry", "power": 0.55, "reaction": 0.85, "purse": 250},
{"name": "P-PLATE PEPPER", "car": "excel_x3", "power": 0.78, "reaction": 0.55, "purse": 400},
{"name": "MULLET MERV", "car": "kingswood_hq", "power": 0.98, "reaction": 0.40, "purse": 600},
{"name": "TORQUE'N TEZZA", "car": "vl_terbo", "power": 1.12, "reaction": 0.30, "purse": 850},
{"name": "SELF-DESCRIBED BATHURST LEGEND", "car": "floored_xd", "power": 1.26, "reaction": 0.22, "purse": 1200},
{"name": "THE WILLOWBANK WIDOWMAKER", "car": "falcodore_gtho", "power": 1.45, "reaction": 0.15, "purse": 1600},
]
const TREE_AMBERS := [1.2, 1.7, 2.2] # seconds into staging, sportsman tree
const TREE_GREEN := 2.7
const DRAG_FINISH_PAY := 50 # crossing the line at all
const DRAG_PB_PAY := 150 # beating your own best
const DERBY_CARS := 5 # opponents in the arena, last one running wins
const DERBY_ARENA := 90.0 # leave the ring this long and you forfeit
const DERBY_OUT := 8.0
@ -88,7 +104,16 @@ var revs := 0.0
var bog := 0.0 # seconds of lost drive from a blown shift
var clean_shifts := 0
var blown_shifts := 0
var drag_t := 0.0
var drag_t := 0.0 # elapsed time, counted from the GREEN
var drag_state := "" # "stage" (at the tree) -> "run" (green light)
var stage_t := 0.0
var jumped := false # rolled out of the beams before the green
var drag_rung_now := 0 # index into DRAG_LADDER for this event
var rival_reaction := 0.0
var rival_et := 0.0 # rival's ET once it crosses; 0 = hasn't yet
var rival_wait := 0.0 # grace timer after the rival crosses first
var _tree_bulbs := {} # "TreeGreen" etc -> MeshInstance3D (dragway only)
var _launch_pos := Vector3.ZERO
var derby: Array[Cop] = [] # arena opponents; Cop AI already hunts a target
var derby_centre: Vector3
@ -253,15 +278,29 @@ func _ready() -> void:
sc.add_point(drag_end + Vector3.UP * (drag_end_y + 0.7) + lane + fwd * 120.0)
strip.curve = sc
add_child(strip)
var pool := Registry.cars().values()
# the ladder: your current rung decides who's in the other lane
drag_rung_now = mini(Garage.drag_rung(), DRAG_LADDER.size() - 1)
var rung: Dictionary = DRAG_LADDER[drag_rung_now]
rival_reaction = float(rung["reaction"])
var cars_dict := Registry.cars()
var r: Rival = (load("res://src/rival.tscn") as PackedScene).instantiate()
r.stats = load(pool[randi() % pool.size()])
r.stats = load(cars_dict[rung["car"]]) if cars_dict.has(rung["car"]) \
else load(cars_dict.values()[randi() % cars_dict.size()])
r.path = strip
r.power_scale = 0.0 # held at the tree until green + reaction time
add_child(r)
r.global_transform = Transform3D(Basis.looking_at(fwd, Vector3.UP),
car.global_position + lane)
r.progress = 0.0
rivals.append(r)
drag_state = "stage"
_launch_pos = car.global_position
# the Willowbank tree, if this level has one: bulbs are MeshInstance3Ds
# with an emission material_override that _bulb() switches on and off
for bn in ["TreeStage", "TreeAmber1", "TreeAmber2", "TreeAmber3", "TreeGreen", "TreeRed"]:
var b := level.find_child(bn, true, false)
if b is MeshInstance3D:
_tree_bulbs[bn] = b
elif mode == "rage" and race_path:
time_left = RAGE_TIME
var pool := Registry.cars().values()
@ -735,8 +774,16 @@ func _drag_tick(delta: float) -> void:
if drag_len <= 0.0:
info_label.text = "no drag strip in this level"
return
if drag_state == "stage":
_stage_tick(delta)
return
drag_t += delta
bog = maxf(bog - delta, 0.0)
# the rival launches when its reaction time is up -- Nanna sits at the green
# for most of a second; the Widowmaker leaves with you
if not rivals.is_empty():
rivals[0].power_scale = 0.0 if drag_t < rival_reaction \
else float(DRAG_LADDER[drag_rung_now]["power"])
if gear <= DRAG_GEARS:
revs = minf(revs + DRAG_REV_RATE[gear] * delta * (1.0 if bog == 0.0 else 0.25), 1.0)
@ -764,23 +811,97 @@ func _drag_tick(delta: float) -> void:
var flat := Vector3(car.global_position.x, 0.0, car.global_position.z)
var left := flat.distance_to(drag_end)
var rival_left := INF
if not rivals.is_empty():
if rival_et == 0.0 and not rivals.is_empty():
var rf := Vector3(rivals[0].global_position.x, 0.0, rivals[0].global_position.z)
rival_left = rf.distance_to(drag_end)
info_label.text = "GEAR %d %s %dm %.1fs" % [
if rf.distance_to(drag_end) < 12.0:
rival_et = drag_t
var pb := Garage.drag_pb(Garage.car_id_of(car_path))
info_label.text = "VS %s%s\nGEAR %d %s %dm %.1fs" % [
DRAG_LADDER[drag_rung_now]["name"],
(" | PB %.2f" % pb) if pb > 0.0 else "",
mini(gear, DRAG_GEARS),
("BOGGED" if bog > 0.0 else ("SHIFT!" if revs >= SHIFT_LO else "%d%%" % int(revs * 100))),
int(left), drag_t]
# the rival crossing has to end it too, or losing means the run never stops
if left < 12.0 or rival_left < 12.0:
over = true
car.power_scale = 1.0 # _drag_tick stops on `over`, so reset it here
var won := left <= rival_left
var drag_pay := 400 if won else 0
Garage.earn(drag_pay)
_msg("%s %.2fs +$%d bucks\n%d clean / %d blown\nR to retry, Esc for menu"
% ["WON" if won else "LOST", drag_t, drag_pay, clean_shifts, blown_shifts], 44, true)
# the event ends when YOU cross: losing to the rival mustn't rob you of your
# ET and PB. If the rival's crossed and you dawdle 10 s, it gets called.
if rival_et > 0.0:
rival_wait += delta
if left < 12.0:
_drag_finish(true)
elif rival_wait > 10.0:
_drag_finish(false)
func _stage_tick(delta: float) -> void:
## At the tree. The RIVAL is held by the electronics; you're held by nothing
## but your own discipline, which is the whole point of a christmas tree.
var was := stage_t
stage_t += delta
if not rivals.is_empty():
rivals[0].power_scale = 0.0
car.power_scale = 0.8
if was <= 0.0:
_bulb("TreeStage", true)
for i in TREE_AMBERS.size():
if was < float(TREE_AMBERS[i]) and stage_t >= float(TREE_AMBERS[i]):
_bulb("TreeAmber%d" % (i + 1), true)
Sfx.shot_2d("clunk", -10.0)
if not jumped and car.global_position.distance_to(_launch_pos) > 2.0:
jumped = true
_bulb("TreeRed", true)
Sfx.shot(car, "bog", -2.0)
_msg("RED LIGHT", 44)
var rung: Dictionary = DRAG_LADDER[drag_rung_now]
var pb := Garage.drag_pb(Garage.car_id_of(car_path))
info_label.text = "VS %s%s\nHOLD FOR THE GREEN..." % [rung["name"],
(" | PB %.2fs" % pb) if pb > 0.0 else ""]
if stage_t >= TREE_GREEN:
drag_state = "run"
for i in 3:
_bulb("TreeAmber%d" % (i + 1), false)
_bulb("TreeGreen", true)
Sfx.shot_2d("clunk", -2.0)
if jumped:
bog = 1.6 # you launched at a light that wasn't green
_msg("GO! (BOGGED: RED LIGHT)", 44)
else:
_msg("GO!", 52)
func _drag_finish(crossed: bool) -> void:
over = true
car.power_scale = 1.0 # _drag_tick stops on `over`, so reset it here
var rung: Dictionary = DRAG_LADDER[drag_rung_now]
var won := crossed and (rival_et == 0.0 or drag_t <= rival_et)
var pay := DRAG_FINISH_PAY if crossed else 0
var lines: Array[String] = []
if crossed:
lines.append("%s vs %s -- %.2fs" % ["WON" if won else "LOST", rung["name"], drag_t])
if Garage.record_drag_pb(Garage.car_id_of(car_path), drag_t):
pay += DRAG_PB_PAY
lines.append("NEW PERSONAL BEST +$%d" % DRAG_PB_PAY)
else:
lines.append("LOST vs %s (never crossed)" % rung["name"])
if won:
pay += int(rung["purse"])
lines.append("PURSE +$%d" % int(rung["purse"]))
if Garage.drag_rung() == drag_rung_now and drag_rung_now < DRAG_LADDER.size() - 1:
Garage.drag_advance()
lines.append("UP THE LADDER: next is %s" % DRAG_LADDER[drag_rung_now + 1]["name"])
elif drag_rung_now == DRAG_LADDER.size() - 1:
lines.append("TOP OF THE LADDER. AGAIN?")
if jumped:
lines.append("(red light. we saw it. everyone saw it.)")
Garage.earn(pay)
lines.append("+$%d bucks | %d clean / %d blown" % [pay, clean_shifts, blown_shifts])
lines.append("R to retry, Esc for menu")
Sfx.shot_2d("sting_win" if won else "bog")
_msg("\n".join(lines), 40, true)
func _bulb(bn: String, on: bool) -> void:
if not _tree_bulbs.has(bn):
return # street drags have no tree hardware; the HUD carries the count
var m := (_tree_bulbs[bn] as MeshInstance3D).material_override as StandardMaterial3D
if m:
m.emission_enabled = on
func add_heat(amount: float) -> void:
if mode != "cruise" or heat_cd > 0.0 or not cops.is_empty():

View File

@ -186,6 +186,35 @@ static func buy_tune(car_id: String, tune: String) -> bool:
_flush()
return true
## ---- raceday: the drag ladder + personal bests ----------------------------
## Rung index into game.gd's DRAG_LADDER; beat your current rung to advance.
## PBs are per-car elapsed times (seconds from the green), 0.0 = none yet.
static func drag_rung() -> int:
_load()
return int(_data.get("drag_rung", 0))
static func drag_advance() -> void:
_load()
_data["drag_rung"] = drag_rung() + 1
_flush()
static func drag_pb(car_id: String) -> float:
_load()
return float(_data.get("drag_pbs", {}).get(car_id, 0.0))
static func record_drag_pb(car_id: String, et: float) -> bool:
## Returns true when this run is a new personal best.
_load()
var pbs: Dictionary = _data.get("drag_pbs", {})
var old := float(pbs.get(car_id, 0.0))
if old > 0.0 and et >= old:
return false
pbs[car_id] = et
_data["drag_pbs"] = pbs
_flush()
return true
static func car_id_of(stats_path: String) -> String:
# res://cars/<id>/stats.tres -> <id>
return stats_path.get_base_dir().get_file()

View File

@ -51,6 +51,14 @@ func _run() -> void:
gg = await _boot("cruise")
_check(gg.car.part_dv > Car.PART_DV + 1.0, "retorque didn't harden panels (%.1f)" % gg.car.part_dv)
gg.free()
# raceday persistence: ladder rung and per-car quarter-mile PBs
_check(Garage.drag_rung() == 0, "fresh save not on ladder rung 0")
Garage.drag_advance()
_check(Garage.drag_rung() == 1, "ladder didn't advance")
_check(Garage.record_drag_pb("datto_120y", 14.5), "first ET not a PB")
_check(not Garage.record_drag_pb("datto_120y", 15.0), "slower ET counted as a PB")
_check(Garage.record_drag_pb("datto_120y", 13.9), "faster ET refused as PB")
_check(absf(Garage.drag_pb("datto_120y") - 13.9) < 0.01, "PB not stored")
Garage._reset_for_test() # later stages must run stock
# cruise: throttle 3s, car must move
@ -154,12 +162,28 @@ func _run() -> void:
_check(game.heat_cd > 0.0, "no cooldown after escape")
game.free()
# drag: needs a level with DragStart/DragEnd, so not the code-built carpark
Game.level_path = levels["southbank"]
# drag: the Willowbank quarter mile -- tree staging, ladder rival, then the box
Game.level_path = levels["willowbank_dragway"]
print(" .. drag")
game = await _boot("drag")
_check(game.drag_len > 100.0, "no drag strip found (%.0f m)" % game.drag_len)
_check(absf(game.drag_len - 402.0) < 5.0, "quarter mile measures %.0f m" % game.drag_len)
_check(game.rivals.size() == 1, "drag had no opponent")
_check(game.drag_state == "stage", "no tree staging phase")
_check(game.drag_rung_now == 0, "fresh ladder not starting at rung 0")
_check(game.rivals[0].stats.resource_path.contains("morry"),
"rung 0 rival isn't Nanna (%s)" % game.rivals[0].stats.resource_path)
_check(game._tree_bulbs.size() == 6, "christmas tree bulbs missing (%d)" % game._tree_bulbs.size())
await physics_frame
_check(game.rivals[0].power_scale == 0.0, "rival not held at the tree")
# hold still like a disciplined launch: no red light, wait out the ambers
var tree_spin := 0
while game.drag_state != "run" and tree_spin < 400:
await physics_frame
tree_spin += 1
_check(game.drag_state == "run", "tree never went green")
_check(not game.jumped, "stationary car scored a red light")
var green_m := (game._tree_bulbs["TreeGreen"] as MeshInstance3D).material_override as StandardMaterial3D
_check(green_m.emission_enabled, "green bulb didn't light")
Input.action_press("throttle")
for i in 10:
await physics_frame
@ -230,9 +254,12 @@ func _run() -> void:
_check(game.car.boost > 0.05, "oncoming earned no boost (%.3f)" % game.car.boost)
game.free()
# race: rivals spawn and make progress along the path
# race: grid up at Queensland Raceway -- the paperclip is ~3126 m of Path3D
Game.level_path = levels["qld_raceway"]
print(" .. race")
game = await _boot("race")
var lap: float = game.race_path.curve.get_baked_length()
_check(absf(lap - 3126.0) < 60.0, "paperclip lap measures %.0f m" % lap)
_check(game.rivals.size() == Game.RIVAL_COUNT, "rivals missing")
var p0: float = game.rivals[0].progress
for i in 240:
@ -244,7 +271,7 @@ func _run() -> void:
_check(moved, "no rival is driving")
game.free()
print("smoke ok: %d cars, %d levels | cruise %.1f m | crash $%d | junction $%d | outrun arms+pays | pursuit spawns+escapes | drag shifts | derby %d cars | race AI driving" %
print("smoke ok: %d cars, %d levels | cruise %.1f m | crash $%d | junction $%d | outrun arms+pays | pursuit spawns+escapes | quarter mile stages+shifts | derby %d cars | paperclip race AI driving" %
[cars.size(), levels.size(), dist, int(crash_score), int(jct_score), Game.DERBY_CARS])
quit(0)