Files
ftrscene/koboldspawner.gd
2026-06-06 03:10:59 +01:00

96 lines
2.7 KiB
GDScript

extends Spatial
#export var textureset = ["9","13","16","21","22","23","28"]
var kobcount = 200
var kobolds = []
var skip = 1 # physics skip
var lskip = 4 # lighting skip
var sc = 0
var lsc = 0
var lights
var texsize = 128
var abusi
var abusc
var abuss
var bval2 = 0.0
var lbval2 = 0.0
var dbval2 = 0.0
var rms = 0.0
var arms = 0.0
var rpeak = 0.0
func _ready():
#for i in len(textureset):
# textureset[i] = load("res://textures/kobolds/%s.png" % textureset[i])
var ktex = load("res://textures/kobolds/atlas.png")
for i in kobcount:
var kobold = Sprite3D.new()
kobold.texture = ktex
kobold.pixel_size = 0.768/texsize #0.0015
kobold.billboard = 2
kobold.region_enabled = true
var texid = randi()%7
kobold.region_rect = Rect2(texid%4*texsize,floor(texid/4)*texsize,texsize,texsize)
add_child(kobold)
kobolds.append([Vector3(rand_range(-2,2),2,rand_range(-3,3)),Vector3.ZERO,kobold])
lights = get_parent().lights
abusi = AudioServer.get_bus_index("Input")
abusc = AudioServer.get_bus_effect(abusi,0)
abuss = AudioServer.get_bus_effect_instance(abusi,1)
abusc.buffer_length = 0.1
const bouncemin = 1
const bouncemax = 2
const hdeviation = 0.5
var bounceboost = 2
# real physics simulation was too expensive, so approximation will have to do :3
var velocity = Vector3.ZERO
func _physics_process(delta):
rms = 0
var adata = abusc.get_buffer(int(AudioServer.get_mix_rate()*delta)+1)
for v in adata:
rms += pow(v.x+v.y,2)
arms = arms*0.9 + rms*0.1
rpeak = clamp(rms/max(arms*2,1)-0.5,0,1)
#lbval2 = bval2
#bval2 = abuss.get_magnitude_for_frequency_range(18000,20000).length()*100
#dbval2 = (bval2-lbval2)*delta*1000
bounceboost = 1 + rpeak + clamp(rms/250,0,1)
$"/root/Spatial/DebugText".text = "%0.4f\n%0.4f\n%0.4f\n%d\n%d" % [rms,arms,rpeak,abusc.get_buffer_length_frames(),abusc.get_frames_available()]
#print(rms)
for i in range(sc,kobcount,skip):
var kobold = kobolds[i]
kobold[1].y -= 9.81*delta*skip
if kobold[0].y < 0:
kobold[1].y = 0
kobold[0].y = 0
kobold[1] += Vector3(rand_range(-hdeviation,hdeviation),rand_range(bouncemin,bouncemax),rand_range(-hdeviation,hdeviation))*bounceboost
if kobold[0].x < -2:
kobold[0].x = -2
kobold[1].x = 0
if kobold[0].x > 2:
kobold[0].x = 2
kobold[1].x = 0
if kobold[0].z < -3:
kobold[0].z = -3
kobold[1].z = 0
if kobold[0].z > 3:
kobold[0].z = 3
kobold[1].z = 0
kobold[0] += kobold[1] * delta*skip
kobold[2].position = kobold[0]+Vector3(0,0.25,0)
for i in range(lsc,kobcount,lskip):
var kobold = kobolds[i]
var lum = Vector3.ZERO
for light in lights:
lum += light[1]/max(light[0].distance_squared_to(to_global(kobold[0]))/2,1)
kobold[2].modulate = Color(lum.x,lum.y,lum.z)
sc = (sc + 1) % skip
lsc = (lsc + 1) % lskip