particles

This commit is contained in:
Holly Stubbs 2025-02-23 23:00:07 +00:00
parent 42164dd611
commit 59a9ac02fe
Signed by: tgpholly
GPG key ID: B8583C4B7D18119E
12 changed files with 809 additions and 163 deletions

View file

@ -13,7 +13,7 @@ config_version=5
config/name="SCPCB" config/name="SCPCB"
run/main_scene="res://scenes/screens/Startup.tscn" run/main_scene="res://scenes/screens/Startup.tscn"
config/features=PackedStringArray("4.3", "GL Compatibility") config/features=PackedStringArray("4.3", "GL Compatibility")
run/max_fps=240 run/max_fps=30
boot_splash/bg_color=Color(0, 0, 0, 1) boot_splash/bg_color=Color(0, 0, 0, 1)
boot_splash/show_image=false boot_splash/show_image=false
config/icon="res://icon.png" config/icon="res://icon.png"

View file

@ -33,7 +33,7 @@ script = ExtResource("2_co6fy")
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0) transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0)
[node name="CSGBox3D" type="CSGBox3D" parent="."] [node name="CSGBox3D" type="CSGBox3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 100, -1.86909, -3.06) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11.2, 12.2, 0.3)
visible = false visible = false
use_collision = true use_collision = true
size = Vector3(15.4238, 0.866943, 15.2599) size = Vector3(15.4238, 0.866943, 15.2599)
@ -41,4 +41,6 @@ size = Vector3(15.4238, 0.866943, 15.2599)
[node name="Label3D" type="Label3D" parent="."] [node name="Label3D" type="Label3D" parent="."]
[node name="Player" parent="." instance=ExtResource("3_58gow")] [node name="Player" parent="." instance=ExtResource("3_58gow")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 100, 0, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11.2, 12.2, 0.3)
[node name="Sprite3D" type="Sprite3D" parent="."]

View file

@ -15,3 +15,5 @@ const ROOM4 = 5
const gridsz = 19 # Same size as the main map itself (better for the map creator) const gridsz = 19 # Same size as the main map itself (better for the map creator)
const RoomScale = 8.0 / 2048.0 const RoomScale = 8.0 / 2048.0
const HideDistance = 15

View file

@ -1,5 +1,569 @@
extends Node3D extends Node3D
func EntityX(obj: Node3D, global: bool = false):
return obj.global_position.x if global else obj.position.x
func EntityY(obj: Node3D, global: bool = false):
return obj.global_position.y if global else obj.position.y
func EntityZ(obj: Node3D, global: bool = false):
return obj.global_position.z if global else obj.position.z
func EntityPitch(obj: Node3D, global: bool = false):
return rad_to_deg(obj.global_rotation.x if global else obj.rotation.x)
func EntityYaw(obj: Node3D, global: bool = false):
return rad_to_deg(obj.global_rotation.y if global else obj.rotation.y)
func EntityRoll(obj: Node3D, global: bool = false):
return rad_to_deg(obj.global_rotation.z if global else obj.rotation.z)
func EntityParent(obj: Node, parent: Node):
parent.add_child(obj)
func ScaleEntity(obj: Node3D, x: float, y: float, z: float):
if obj == null:
pass
obj.scale.x = x
obj.scale.y = y
obj.scale.z = z
func CopyEntity(obj: Node):
return obj.duplicate()
func PointEntity(obj: Node3D, otherObj: Node3D):
if obj == null:
pass
obj.look_at(otherObj.global_position)
func PositionEntity(obj: Node3D, x: float, y: float, z: float, global: bool = false):
if obj == null:
pass
if global:
obj.global_position.x = x
obj.global_position.y = y
obj.global_position.z = z
else:
obj.position.x = x
obj.position.y = y
obj.position.z = z
# TODO: Move based on rotation, copy of translate for now.
func MoveEntity(obj: Node3D, x: float, y: float, z: float, global: bool = false):
if obj == null:
pass
if global:
obj.global_position.x += x
obj.global_position.y += y
obj.global_position.z += z
else:
obj.position.x += x
obj.position.y += y
obj.position.z += z
func TranslateEntity(obj: Node3D, x: float, y: float, z: float, global: bool = false):
if obj == null:
pass
if global:
obj.global_position.x += x
obj.global_position.y += y
obj.global_position.z += z
else:
obj.position.x += x
obj.position.y += y
obj.position.z += z
func TurnEntity(obj: Node3D, x: float, y: float, z: float, global: bool = false):
if obj == null:
pass
if global:
obj.global_rotation.x += deg_to_rad(x)
obj.global_rotation.y += deg_to_rad(y)
obj.global_rotation.z += deg_to_rad(z)
else:
obj.rotation.x += deg_to_rad(x)
obj.rotation.y += deg_to_rad(y)
obj.rotation.z += deg_to_rad(z)
func RotateEntity(obj: Node3D, x: float, y: float, z: float, global: bool = false):
if obj == null:
pass
if global:
obj.global_rotation.x = deg_to_rad(x)
obj.global_rotation.y = deg_to_rad(y)
obj.global_rotation.z = deg_to_rad(z)
else:
obj.rotation.x = deg_to_rad(x)
obj.rotation.y = deg_to_rad(y)
obj.rotation.z = deg_to_rad(z)
var particles: Array = []
func CreateParticle(x: float, y: float, z: float, image, size: float, gravity: float = 1.0, lifetime: float = 200) -> Particle:
var p: Particle = Particle.new()
particles.push_back(p)
p.lifetime = lifetime
var spr = Sprite3D.new()
p.obj = spr # CreateSprite()
add_child(p.obj)
PositionEntity(p.obj, x, y, z, true)
p.obj.texture = ParticleTextures[image]
RotateEntity(p.obj, 0, 0, randf_range(0, 360))
spr.billboard = BaseMaterial3D.BILLBOARD_ENABLED
#EntityFX(p\obj, 1 + 8)
#SpriteViewMode (p\obj, 3)
#Select image
#Case 0,5,6
#EntityBlend(p\obj, 1)
#Case 1,2,3,4,7
#EntityBlend(p\obj, BLEND_ADD)
p.pvt = Node3D.new()
add_child(p.pvt)
PositionEntity(p.pvt, x, y, z, true)
p.image = image
p.gravity = gravity * 0.004
p.R = 255
p.G = 255
p.B = 255
p.A = 1.0
p.size = size
#ScaleSprite(p.obj, p.size, p.size)
p.obj.scale.x = p.size
p.obj.scale.y = p.size
p.obj.scale.z = p.size
return p
var ClosestButton
var ClosestDoor
var GrabbedEntity = null
var ParticleAmount = 2
func UpdateDoors():
#var i = 0
#var d: Door
var x = 0.0
var z = 0.0
var dist = 0.0
if UpdateDoorsTimer <= 0:
for d: Door in doors:
var xdist = abs(EntityX(Global.player) - EntityX(d.obj, true))
var zdist = abs(EntityZ(Global.player) - EntityZ(d.obj, true))
d.dist = xdist + zdist
if d.dist > Constants.HideDistance * 2:
if d.obj != null:
d.obj.visible = false
if d.frameobj != null:
d.frameobj.visible = false
if d.obj2 != null:
d.obj2.visible = false
if d.buttons[0] != null:
d.buttons[0].visible = false
if d.buttons[1] != null:
d.buttons[1].visible = false
else:
if d.obj != null:
d.obj.visible = true
if d.frameobj != null:
d.frameobj.visible = true
if d.obj2 != null:
d.obj2.visible = true
if d.buttons[0] != null:
d.buttons[0].visible = true
if d.buttons[1] != null:
d.buttons[1].visible = true
#If PlayerRoom\RoomTemplate\Name$ = "room2sl"
#If ValidRoom2slCamRoom(d\room)
#If d\obj <> 0 Then ShowEntity d\obj
#If d\frameobj <> 0 Then ShowEntity d\frameobj
#If d\obj2 <> 0 Then ShowEntity d\obj2
#If d\buttons[0] <> 0 Then ShowEntity d\buttons[0]
#If d\buttons[1] <> 0 Then ShowEntity d\buttons[1]
#EndIf
#EndIf
UpdateDoorsTimer = 30
else:
UpdateDoorsTimer = max(UpdateDoorsTimer - Global.FPSfactor, 0)
ClosestButton = 0
ClosestDoor = null
for d: Door in doors:
if d.dist < Constants.HideDistance * 2 or d.IsElevatorDoor: # Make elevator doors update everytime because if not, this can cause a bug where the elevators suddenly won't work, most noticeable in room2tunnel - ENDSHN
if (d.openstate >= 180 or d.openstate <= 0) and GrabbedEntity == null:
for i in range(0, 2):
if d.buttons[i] != null:
if abs(EntityX(Global.player) - EntityX(d.buttons[i], true)) < 1.0:
if abs(EntityZ(Global.player) - EntityZ(d.buttons[i], true)) < 1.0:
dist = Utils.Distance(EntityX(Global.player, true), EntityZ(Global.player, true), EntityX(d.buttons[i], true), EntityZ(d.buttons[i], true))#entityDistance(collider, d\buttons[i])
if dist < 0.7:
var temp = Node3D.new()
add_child(temp)
#PositionEntity(temp, EntityX(Camera), EntityY(Camera), EntityZ(Camera))
PointEntity(temp, d.buttons[i])
#if EntityPick(temp, 0.6) == d.buttons[i]:
#If ClosestButton = 0 Then
#ClosestButton = d\buttons[i]
#ClosestDoor = d
#Else
#If dist < EntityDistance(Collider, ClosestButton) Then ClosestButton = d\buttons[i] : ClosestDoor = d
#End If
#End If
temp.queue_free()
if d.open:
if d.openstate < 180:
if d.dir == 0:
d.openstate = min(180, d.openstate + Global.FPSfactor * 2 * (d.fastopen + 1))
MoveEntity(d.obj, Global.Sin(d.openstate) * (d.fastopen * 2 + 1) * Global.FPSfactor / 80.0, 0, 0)
if d.obj2 != null:
MoveEntity(d.obj2, Global.Sin(d.openstate) * (d.fastopen+1) * Global.FPSfactor / 80.0, 0, 0)
elif d.dir == 1:
d.openstate = min(180, d.openstate + Global.FPSfactor * 0.8)
MoveEntity(d.obj, Global.Sin(d.openstate) * Global.FPSfactor / 180.0, 0, 0)
if d.obj2 != null:
MoveEntity(d.obj2, -Global.Sin(d.openstate) * Global.FPSfactor / 180.0, 0, 0)
elif d.dir == 2:
d.openstate = min(180, d.openstate + Global.FPSfactor * 2 * (d.fastopen + 1))
MoveEntity(d.obj, Global.Sin(d.openstate) * (d.fastopen + 1) * Global.FPSfactor / 85.0, 0, 0)
if d.obj2 != null:
MoveEntity(d.obj2, Global.Sin(d.openstate) * (d.fastopen * 2 + 1) * Global.FPSfactor / 120.0, 0, 0)
elif d.dir == 3:
d.openstate = min(180, d.openstate + Global.FPSfactor * 2 * (d.fastopen + 1))
MoveEntity(d.obj, Global.Sin(d.openstate) * (d.fastopen * 2 + 1) * Global.FPSfactor / 162.0, 0, 0)
if d.obj2 != null:
MoveEntity(d.obj2, Global.Sin(d.openstate) * (d.fastopen * 2 + 1) * Global.FPSfactor / 162.0, 0, 0)
elif d.dir == 4: #Used for 914 only
d.openstate = min(180, d.openstate + Global.FPSfactor * 1.4)
MoveEntity(d.obj, Global.Sin(d.openstate) * Global.FPSfactor / 114.0, 0, 0)
else:
d.fastopen = 0
#ResetEntity(d.obj)
#if d.obj2 != null:
#ResetEntity(d.obj2)
if d.timerstate > 0:
d.timerstate = max(0, d.timerstate - Global.FPSfactor)
#if d.timerstate + Global.FPSfactor > 110 and d.timerstate <= 110:
#d.SoundCHN = PlaySound2(CautionSFX, Camera, d\obj)
var sound = null
if d.dir == 1:
sound = randf_range(0, 1)
else:
sound = randf_range(0, 2)
if d.timerstate == 0:
d.open = not d.open
#d.SoundCHN = PlaySound2(CloseDoorSFX(d\dir,sound%), Camera, d\obj)
#if d.AutoClose and RemoteDoorOn:
#if EntityDistance(Camera, d\obj) < 2.1 Then
#If (Not Wearing714) Then PlaySound_Strict HorrorSFX(7)
#d\open = False : d\SoundCHN = PlaySound2(CloseDoorSFX(Min(d\dir,1), Rand(0, 2)), Camera, d\obj) : d\AutoClose = False
#EndIf
#EndIf
if d.openstate > 0:
if d.dir == 0:
d.openstate = max(0, d.openstate - Global.FPSfactor * 2 * (d.fastopen + 1))
MoveEntity(d.obj, Global.Sin(d.openstate) * -Global.FPSfactor * (d.fastopen + 1) / 80.0, 0, 0)
if d.obj2 != null:
MoveEntity(d.obj2, Global.Sin(d.openstate) * (d.fastopen + 1) * -Global.FPSfactor / 80.0, 0, 0)
elif d.dir == 1:
d.openstate = max(0, d.openstate - Global.FPSfactor * 0.8)
MoveEntity(d.obj, Global.Sin(d.openstate) * -Global.FPSfactor / 180.0, 0, 0)
if d.obj2 != null:
MoveEntity(d.obj2, Global.Sin(d.openstate) * Global.FPSfactor / 180.0, 0, 0)
if d.openstate < 15 and d.openstate + Global.FPSfactor >= 15:
if ParticleAmount == 2:
for i in range(randi_range(75,99)):
var pvt = Node3D.new()
add_child(pvt)
PositionEntity(pvt, EntityX(d.frameobj, true) + randf_range(-0.2,0.2), EntityY(d.frameobj, true) + randf_range(0.0,1.2), EntityZ(d.frameobj, true) + randf_range(-0.2,0.2))
RotateEntity(pvt, 0, randf_range(0, 360), 0)
var p:Particle = CreateParticle(EntityX(pvt), EntityY(pvt), EntityZ(pvt), 2, 0.002, 0, 300)
p.speed = 0.005
RotateEntity(p.pvt, randf_range(-20, 20), randf_range(0, 360), 0)
p.SizeChange = -0.00001
p.size = 0.01
#ScaleSprite p\obj,p\size,p\size
p.obj.scale.x = p.size
p.obj.scale.y = p.size
p.obj.scale.z = p.size
p.Achange = -0.01
#EntityOrder p\obj,-1
pvt.queue_free()
elif d.dir == 2:
d.openstate = max(0, d.openstate - Global.FPSfactor * 2 * (d.fastopen + 1))
MoveEntity(d.obj, Global.Sin(d.openstate) * -Global.FPSfactor * (d.fastopen + 1) / 85.0, 0, 0)
if d.obj2 != null:
MoveEntity(d.obj2, Global.Sin(d.openstate) * (d.fastopen + 1) * -Global.FPSfactor / 120.0, 0, 0)
elif d.dir == 3:
d.openstate = max(0, d.openstate - Global.FPSfactor * 2 * (d.fastopen + 1))
MoveEntity(d.obj, Global.Sin(d.openstate) * -Global.FPSfactor * (d.fastopen + 1) / 162.0, 0, 0)
if d.obj2 != null:
MoveEntity(d.obj2, Global.Sin(d.openstate) * (d.fastopen + 1) * -Global.FPSfactor / 162.0, 0, 0)
elif d.dir == 4: # Used for 914 only
d.openstate = min(180, d.openstate - Global.FPSfactor * 1.4)
MoveEntity(d.obj, Global.Sin(d.openstate) * -Global.FPSfactor / 114.0, 0, 0)
#if d.angle == 0 or d.angle == 180:
#if abs(EntityZ(d.frameobj, true) - EntityZ(Global.player)) < 0.15:
#if abs(EntityX(d.frameobj, true) - EntityX(Global.player)) < 0.7 * (d.dir * 2 + 1):
#z = CurveValue(EntityZ(d.frameobj, true) + 0.15 * sign(EntityZ(Global.player) - EntityZ(d.frameobj, true)), EntityZ(Global.player), 5)
#PositionEntity(Collider, EntityX(Collider), EntityY(Collider), z)
#EndIf
#EndIf
#Else
#If Abs(EntityX(d\frameobj, True)-EntityX(Collider))<0.15 Then
#If Abs(EntityZ(d\frameobj, True)-EntityZ(Collider))<0.7*(d\dir*2+1) Then
#x# = CurveValue(EntityX(d\frameobj,True)+0.15*Sgn(EntityX(Collider)-EntityX(d\frameobj, True)), EntityX(Collider), 5)
#PositionEntity Collider, x, EntityY(Collider), EntityZ(Collider)
#EndIf
#EndIf
#EndIf
#
#If d\DoorHitOBJ <> 0 Then
#ShowEntity d\DoorHitOBJ
#EndIf
else:
d.fastopen = 0
#PositionEntity(d\obj, EntityX(d\frameobj, True), EntityY(d\frameobj, True), EntityZ(d\frameobj, True))
#If d\obj2 <> 0 Then PositionEntity(d\obj2, EntityX(d\frameobj, True), EntityY(d\frameobj, True), EntityZ(d\frameobj, True))
#If d\obj2 <> 0 And d\dir = 0 Then
#MoveEntity(d\obj, 0, 0, 8.0 * RoomScale)
#MoveEntity(d\obj2, 0, 0, 8.0 * RoomScale)
#EndIf
#If d\DoorHitOBJ <> 0 Then
#HideEntity d\DoorHitOBJ
#EndIf
#UpdateSoundOrigin(d\SoundCHN,Camera,d\frameobj)
#if d.DoorHitOBJ != 0:
#If DebugHUD Then
#EntityAlpha d\DoorHitOBJ,0.5
#Else
#EntityAlpha d\DoorHitOBJ,0.0
#EndIf
#EndIf
func UpdateParticles():
for p:Particle in particles:
MoveEntity(p.pvt, 0, 0, p.speed * Global.FPSfactor)
if p.gravity != 0:
p.yspeed = p.yspeed - p.gravity * Global.FPSfactor
TranslateEntity(p.pvt, 0, p.yspeed * Global.FPSfactor, 0, true)
PositionEntity(p.obj, EntityX(p.pvt, true), EntityY(p.pvt, true), EntityZ(p.pvt, true), true)
#;TurnEntity(p\obj, 0, 0, FPSfactor)
if p.Achange != 0:
p.A = min(max(p.A + p.Achange * Global.FPSfactor, 0.0), 1.0)
#EntityAlpha(p\obj, p\A)
p.obj.modulate.a = p.A
if p.SizeChange != 0:
p.size = p.size + p.SizeChange * Global.FPSfactor
p.obj.scale.x = p.size
p.obj.scale.y = p.size
p.obj.scale.z = p.size
#ScaleSprite p.obj, p.size, p.size
p.lifetime = p.lifetime - Global.FPSfactor
if p.lifetime <= 0 or p.size < 0.00001 or p.A <= 0:
p.obj.queue_free()
p.pvt.queue_free()
particles.erase(p)
# TODO: Remove when real loader is in!!
var ParticleTextures = [
load(Utils.GetCaseiFileName("GFX/smoke.png")),
load(Utils.GetCaseiFileName("GFX/flash.jpg")),
load(Utils.GetCaseiFileName("GFX/dust.jpg")),
load(Utils.GetCaseiFileName("GFX/npcs/hg.pt")),
load(Utils.GetCaseiFileName("GFX/map/sun.jpg")),
load(Utils.GetCaseiFileName("GFX/bloodsprite.png")),
load(Utils.GetCaseiFileName("GFX/smoke2.png")),
load(Utils.GetCaseiFileName("GFX/spark.jpg")),
load(Utils.GetCaseiFileName("GFX/particle.png"))
]
var MenuOpen = false
var InvOpen = false
var OtherOpen = null
var ConsoleOpen = false
var Using294 = false
var EndingTimer = 0
var LightVolume = 0.0
var CanSave = false
var SelectedScreen = null
var SelectedDoor: Door = null
var UpdateDoorsTimer: float = 0.0
func _process(delta: float) -> void:
if not MenuOpen and not InvOpen and OtherOpen == null and SelectedDoor == null and not ConsoleOpen and not Using294 and SelectedScreen == null and EndingTimer >= 0:
#LightVolume = CurveValue(TempLightVolume, LightVolume, 50.0)
#CameraFogRange(Camera, CameraFogNear*LightVolume,CameraFogFar*LightVolume)
#CameraFogColor(Camera, 0,0,0)
#CameraFogMode Camera,1
#CameraRange(Camera, 0.05, Min(CameraFogFar*LightVolume*1.5,28))
#If PlayerRoom\RoomTemplate\Name<>"pocketdimension" Then
#CameraClsColor(Camera, 0,0,0)
#EndIf
#AmbientLight Brightness, Brightness, Brightness
#PlayerSoundVolume = CurveValue(0.0, PlayerSoundVolume, 5.0)
CanSave = true
#UpdateDeafPlayer()
UpdateEmitters()
#MouseLook()
#If PlayerRoom\RoomTemplate\Name = "dimension1499" And QuickLoadPercent > 0 And QuickLoadPercent < 100
#ShouldEntitiesFall = False
#EndIf
#MovePlayer()
#InFacility = CheckForPlayerInFacility()
#If PlayerRoom\RoomTemplate\Name = "dimension1499"
#If QuickLoadPercent = -1 Or QuickLoadPercent = 100
#UpdateDimension1499()
#EndIf
#UpdateLeave1499()
#ElseIf PlayerRoom\RoomTemplate\Name = "gatea" Or (PlayerRoom\RoomTemplate\Name="exit1" And EntityY(Collider)>1040.0*RoomScale)
#UpdateDoors()
#If QuickLoadPercent = -1 Or QuickLoadPercent = 100
#UpdateEndings()
#EndIf
#UpdateScreens()
#UpdateRoomLights(Camera)
#Else
UpdateDoors()
#If QuickLoadPercent = -1 Or QuickLoadPercent = 100
#UpdateEvents()
#EndIf
#UpdateScreens()
#TimeCheckpointMonitors()
#Update294()
#UpdateRoomLights(Camera)
#EndIf
#UpdateDecals()
#UpdateMTF()
#UpdateNPCs()
#UpdateItems()
UpdateParticles()
#Use427()
#UpdateMonitorSaving()
var emitters: Array = []
func UpdateEmitters():
Global.player.InSmoke = false
for e: Emitter in emitters:
if Global.FPSfactor > 0: #and (PlayerRoom == e.room or e.room.dist < 8):
#If ParticleAmount = 2 Or SmokeDelay#=0.0
var p: Particle = CreateParticle(EntityX(e.Obj, true), EntityY(e.Obj, true), EntityZ(e.Obj, true), randf_range(e.MinImage, e.MaxImage), e.Size, e.Gravity, e.LifeTime)
p.speed = e.Speed
RotateEntity(p.pvt, EntityPitch(e.Obj, true), EntityYaw(e.Obj, true), EntityRoll(e.Obj, true), true)
TurnEntity(p.pvt, randf_range(-e.RandAngle, e.RandAngle), randf_range(-e.RandAngle, e.RandAngle), 0)
TurnEntity(p.obj, 0, 0, randf_range(0, 360))
p.SizeChange = e.SizeChange
p.Achange = e.Achange
#EndIf
#e\SoundCHN = LoopSound2(HissSFX, e\SoundCHN, Camera, e\Obj)
#
#If InSmoke = False Then
#If WearingGasMask=0 And WearingHazmat=0 Then
#Local dist# = Distance(EntityX(Camera, True), EntityZ(Camera, True), EntityX(e\obj, True), EntityZ(e\obj, True))
#If dist < 0.8 Then
#If Abs(EntityY(Camera, True)-EntityY(e\obj,True))<5.0 Then InSmoke = True
#EndIf
#EndIf
#EndIf
#;If ParticleAmount <> 2
#; If SmokeDelay#<(10-(5*ParticleAmount))
#; SmokeDelay#=SmokeDelay#+FPSfactor
#; Else
#; SmokeDelay#=0.0
#; EndIf
#;EndIf
#If InSmoke Then
#If EyeIrritation > (70 * 6) Then BlurVolume = Max(BlurVolume, (EyeIrritation - (70 * 6)) / (70.0 * 24.0))
#If EyeIrritation > (70 * 24) Then
#DeathMSG = "Subject D-9341 found dead in [DATA REDACTED]. Cause of death: Suffocation due to decontamination gas."
#Kill()
#EndIf
#
#If KillTimer => 0 Then
#If Rand(150) = 1 Then
#If CoughCHN = 0 Then
#CoughCHN = PlaySound_Strict(CoughSFX(Rand(0, 2)))
#Else
#If Not ChannelPlaying(CoughCHN) Then CoughCHN = PlaySound_Strict(CoughSFX(Rand(0, 2)))
#End If
#EndIf
#EndIf
#
#EyeIrritation=EyeIrritation+FPSfactor * 4
#EndIf
func CreateEmitter(x: float, y: float, z: float, emittertype: int) -> Emitter:
var e: Emitter = Emitter.new()
e.Obj = Node3D.new()
e.Obj.name = "Emitter1"
if emittertype == 0: # smoke
e.Size = 0.03
e.Gravity = -0.2
e.LifeTime = 200
e.SizeChange = 0.005
e.Speed = 0.004
e.RandAngle = 20
e.Achange = -0.008
elif emittertype == 1:
e.Size = 0.03
e.Gravity = -0.2
e.LifeTime = 200
e.SizeChange = 0.008
e.Speed = 0.004
e.RandAngle = 40
e.Achange = -0.01
e.MinImage = 6
e.MaxImage = 6
for r: Room in rooms:
if abs(EntityX(e.Obj) - EntityX(r.obj)) < 4.0 and abs(EntityZ(e.Obj) - EntityZ(r.obj)) < 4.0:
e.Room = r
add_child(e.Obj)
PositionEntity(e.Obj, x, y, z, true)
emitters.push_back(e)
return e
func _ready() -> void: func _ready() -> void:
#add_child(RMesh.LoadRMesh("GFX\\map\\gatea_opt.rmesh", RoomTemplate.new())) #add_child(RMesh.LoadRMesh("GFX\\map\\gatea_opt.rmesh", RoomTemplate.new()))
#B3D.Load("GFX\\npcs\\106_2.b3d") #B3D.Load("GFX\\npcs\\106_2.b3d")
@ -24,6 +588,7 @@ func _ready() -> void:
var IntroEnabled: bool var IntroEnabled: bool
var I_Zone: MapZones = MapZones.new() var I_Zone: MapZones = MapZones.new()
var RandomSeed: String = "" var RandomSeed: String = ""
var SelectedEnding: String = ""
var MapWidth = Main.options.get("options").get("map size").to_int() var MapWidth = Main.options.get("options").get("map size").to_int()
var MapHeight = Main.options.get("options").get("map size").to_int() var MapHeight = Main.options.get("options").get("map size").to_int()
@ -56,9 +621,10 @@ func CreateDoor(lvl, x:float, y:float, z:float, angle:float, room:Room, dopen =
if room != null: if room != null:
parent = room.obj parent = room.obj
var d2:Door #var d2:Door
var d = Door.new() var d = Door.new()
#d.open = true
doors.push_back(d) doors.push_back(d)
if big == 1: if big == 1:
print("DOORS: Creating ContDoor in " + room.RoomTemplate.Name, ", X: ", x, ", Y: ", y, " Z: ", z) print("DOORS: Creating ContDoor in " + room.RoomTemplate.Name, ", X: ", x, ", Y: ", y, " Z: ", z)
@ -91,23 +657,20 @@ func CreateDoor(lvl, x:float, y:float, z:float, angle:float, room:Room, dopen =
d.frameobj = X.LoadModel("GFX/map/doorframe.x")#CopyEntity(DoorFrameOBJ) d.frameobj = X.LoadModel("GFX/map/doorframe.x")#CopyEntity(DoorFrameOBJ)
elif big == 3: elif big == 3:
print("DOORS: Creating ElevatorDoor in " + room.RoomTemplate.Name, ", X: ", x, ", Y: ", y, " Z: ", z) print("DOORS: Creating ElevatorDoor in " + room.RoomTemplate.Name, ", X: ", x, ", Y: ", y, " Z: ", z)
print("TODO: ELEVATOR DOOR!") #print("TODO: ELEVATOR DOOR!")
#for d2 = Each Doors for d2:Door in doors:
#If d2 <> d And d2\dir = 3 Then if d2 != d and d2.dir == 3:
#d\obj = CopyEntity(d2\obj) d.obj = CopyEntity(d2.obj)
#d\obj2 = CopyEntity(d2\obj2) d.obj2 = CopyEntity(d2.obj2)
#ScaleEntity d\obj, RoomScale, RoomScale, RoomScale ScaleEntity(d.obj, Constants.RoomScale, Constants.RoomScale, Constants.RoomScale)
#ScaleEntity d\obj2, RoomScale, RoomScale, RoomScale ScaleEntity(d.obj2, Constants.RoomScale, Constants.RoomScale, Constants.RoomScale)
#Exit break
#EndIf if d.obj == null:
#Next d.obj = B3D.Load("GFX/map/elevatordoor.b3d")#LoadMesh_Strict("GFX\map\elevatordoor.b3d")
#If d\obj=0 Then d.obj2 = CopyEntity(d.obj)
#d\obj = LoadMesh_Strict("GFX\map\elevatordoor.b3d") ScaleEntity(d.obj, Constants.RoomScale, Constants.RoomScale, Constants.RoomScale)
#d\obj2 = CopyEntity(d\obj) ScaleEntity(d.obj2, Constants.RoomScale, Constants.RoomScale, Constants.RoomScale)
#ScaleEntity d\obj, RoomScale, RoomScale, RoomScale d.frameobj = X.LoadModel("GFX/map/doorframe.x")#CopyEntity(DoorFrameOBJ)
#ScaleEntity d\obj2, RoomScale, RoomScale, RoomScale
#EndIf
#d\frameobj = CopyEntity(DoorFrameOBJ)
else: else:
print("DOORS: Creating Door in " + room.RoomTemplate.Name, ", X: ", x, ", Y: ", y, " Z: ", z) print("DOORS: Creating Door in " + room.RoomTemplate.Name, ", X: ", x, ", Y: ", y, " Z: ", z)
d.obj = X.LoadModel("GFX/map/door01.x")#CopyEntity(DoorOBJ) d.obj = X.LoadModel("GFX/map/door01.x")#CopyEntity(DoorOBJ)
@ -124,17 +687,19 @@ func CreateDoor(lvl, x:float, y:float, z:float, angle:float, room:Room, dopen =
#entityType d\obj2, HIT_MAP #entityType d\obj2, HIT_MAP
#scaleentity(d\obj, 0.1, 0.1, 0.1) #scaleentity(d\obj, 0.1, 0.1, 0.1)
d.frameobj.scale.x = Constants.RoomScale if d.frameobj:
d.frameobj.scale.y = Constants.RoomScale d.frameobj.scale.x = Constants.RoomScale
d.frameobj.scale.z = Constants.RoomScale d.frameobj.scale.y = Constants.RoomScale
d.frameobj.scale.z = Constants.RoomScale
d.obj.name = str("doar ", doors.size() - 1) #d.obj.name = str("doar ", doors.size() - 1)
parent.add_child(d.frameobj) parent.add_child(d.frameobj)
parent.add_child(d.obj) parent.add_child(d.obj)
d.frameobj.global_position.x = x if d.frameobj:
d.frameobj.global_position.y = y d.frameobj.global_position.x = x
d.frameobj.global_position.z = z d.frameobj.global_position.y = y
d.frameobj.global_position.z = z
#EntityPickMode d\frameobj,2 #EntityPickMode d\frameobj,2
#EntityType d\obj, HIT_MAP #EntityType d\obj, HIT_MAP
#EntityType d\obj2, HIT_MAP #EntityType d\obj2, HIT_MAP
@ -165,6 +730,9 @@ func CreateDoor(lvl, x:float, y:float, z:float, angle:float, room:Room, dopen =
d.buttons[i].scale.y = 0.03 d.buttons[i].scale.y = 0.03
d.buttons[i].scale.z = 0.03 d.buttons[i].scale.z = 0.03
EntityParent(d.buttons[0], d.frameobj)
EntityParent(d.buttons[1], d.frameobj)
if big > 0: if big > 0:
d.buttons[0].global_position.x = x - 432.0 * Constants.RoomScale d.buttons[0].global_position.x = x - 432.0 * Constants.RoomScale
d.buttons[0].global_position.y = y + 0.7 d.buttons[0].global_position.y = y + 0.7
@ -199,16 +767,6 @@ func CreateDoor(lvl, x:float, y:float, z:float, angle:float, room:Room, dopen =
d.obj2.global_position.y = y d.obj2.global_position.y = y
d.obj2.global_position.z = z d.obj2.global_position.z = z
var text3 = Label3D.new()
text3.position.y = 10
text3.scale.x = 3
text3.scale.y = 3
text3.scale.z = 3
text3.billboard = BaseMaterial3D.BILLBOARD_ENABLED
text3.name = "Egg"
d.obj2.add_child(text3)
d.obj2.set_script(load("res://src/stinky.gd"))
if big > 0: if big > 0:
d.obj2.rotation.y = deg_to_rad(angle) d.obj2.rotation.y = deg_to_rad(angle)
else: else:
@ -272,22 +830,25 @@ func FillRoom(r:Room):
#[Block] #[Block]
#the wooden door #the wooden door
r.Objects[2] = B3D.Load("GFX/map/forest/door_frame.b3d") r.Objects[2] = B3D.Load("GFX/map/forest/door_frame.b3d")
r.obj.add_child(r.Objects[2])
r.Objects[2].global_position.x = r.x + 184.0 * Constants.RoomScale r.Objects[2].global_position.x = r.x + 184.0 * Constants.RoomScale
r.Objects[2].global_position.y = 0 r.Objects[2].global_position.y = 0
r.Objects[2].global_position.z = r.z r.Objects[2].global_position.z = r.z
r.Objects[2].scale.x = 45.0 * Constants.RoomScale r.Objects[2].scale.x = 45.0 * Constants.RoomScale
r.Objects[2].scale.y = 45.0 * Constants.RoomScale r.Objects[2].scale.y = 45.0 * Constants.RoomScale
r.Objects[2].scale.z = 80.0 * Constants.RoomScale r.Objects[2].scale.z = 80.0 * Constants.RoomScale
r.obj.add_child(r.Objects[2])
#EntityParent r\Objects[2],r\obj r.Objects[3] = B3D.Load("GFX/map/forest/door.b3d")
# r.obj.add_child(r.Objects[3])
#r\Objects[3] = LoadMesh_Strict("GFX\map\forest\door.b3d") r.Objects[3].global_position.x = r.x + 112.0 * Constants.RoomScale
#PositionEntity r\Objects[3],r\x + 112.0 * RoomScale,0,r\z+0.05,True r.Objects[3].global_position.y = 0
r.Objects[3].global_position.z = r.z + 0.05
#EntityType r\Objects[3], HIT_MAP #EntityType r\Objects[3], HIT_MAP
#
#ScaleEntity r\Objects[3],46.0*RoomScale,45.0*RoomScale,46.0*RoomScale,True r.Objects[3].scale.x = 46.0 * Constants.RoomScale
#EntityParent r\Objects[3],r\obj r.Objects[3].scale.y = 45.0 * Constants.RoomScale
# r.Objects[3].scale.z = 46.0 * Constants.RoomScale
#r\Objects[4] = CopyEntity(r\Objects[3]) #r\Objects[4] = CopyEntity(r\Objects[3])
#PositionEntity r\Objects[4],r\x + 256.0 * RoomScale,0,r\z-0.05,True #PositionEntity r\Objects[4],r\x + 256.0 * RoomScale,0,r\z-0.05,True
#RotateEntity r\Objects[4], 0,180,0 #RotateEntity r\Objects[4], 0,180,0
@ -356,29 +917,38 @@ func FillRoom(r:Room):
#RotateEntity it\collider, 0, r\angle+170, 0 #RotateEntity it\collider, 0, r\angle+170, 0
#EntityParent(it\collider, r\obj) #EntityParent(it\collider, r\obj)
#;[End Block] #;[End Block]
#Case "lockroom" elif rn == "lockroom":
#;[Block] var d = CreateDoor(r.zone, r.x - 736.0 * Constants.RoomScale, 0, r.z - 104.0 * Constants.RoomScale, 0, r, true)
#d = CreateDoor(r\zone, r\x - 736.0 * RoomScale, 0, r\z - 104.0 * RoomScale, 0, r, True) d.timer = 70 * 5
#d\timer = 70 * 5 : d\AutoClose = False : d\open = False d.AutoClose = false
# d.open = false
#EntityParent(d\buttons[0], 0)
#PositionEntity(d\buttons[0], r\x - 288.0 * RoomScale, 0.7, r\z - 640.0 * RoomScale) r.obj.reparent(d.buttons[0])
#EntityParent(d\buttons[0], r\obj) d.buttons[0].global_position.x = r.x - 288.0 * Constants.RoomScale
# d.buttons[0].global_position.y = 0.7
#FreeEntity(d\buttons[1]) : d\buttons[1] = 0 d.buttons[0].global_position.x = r.z - 640.0 * Constants.RoomScale
#
#d2 = CreateDoor(r\zone, r\x + 104.0 * RoomScale, 0, r\z + 736.0 * RoomScale, 270, r, True) d.buttons[1].queue_free()
#d2\timer = 70 * 5 : d2\AutoClose = False: d2\open = False d.buttons[1] = null
#EntityParent(d2\buttons[0], 0)
#PositionEntity(d2\buttons[0], r\x + 640.0 * RoomScale, 0.7, r\z + 288.0 * RoomScale) var d2 = CreateDoor(r.zone, r.x + 104.0 * Constants.RoomScale, 0, r.z + 736.0 * Constants.RoomScale, 270, r, true)
#RotateEntity (d2\buttons[0], 0, 90, 0) d2.timer = 70 * 5
#EntityParent(d2\buttons[0], r\obj) d2.AutoClose = false
# d2.open = false
#FreeEntity(d2\buttons[1]) : d2\buttons[1] = 0 r.obj.reparent(d2.buttons[0])
# d2.buttons[0].global_position.x = r.x + 640.0 * Constants.RoomScale
#d\LinkedDoor = d2 d2.buttons[0].global_position.y = 0.7
#d2\LinkedDoor = d d2.buttons[0].global_position.z = r.z + 288.0 * Constants.RoomScale
# d2.buttons[0].rotation.x = 0
d2.buttons[0].rotation.y = deg_to_rad(90)
d2.buttons[0].rotation.z = 0
d2.buttons[1].queue_free()
d2.buttons[1] = null
d.LinkedDoor = d2
d2.LinkedDoor = d
#sc.SecurityCams = CreateSecurityCam(r\x - 688.0 * RoomScale, r\y + 384 * RoomScale, r\z + 688.0 * RoomScale, r, True) #sc.SecurityCams = CreateSecurityCam(r\x - 688.0 * RoomScale, r\y + 384 * RoomScale, r\z + 688.0 * RoomScale, r, True)
#sc\angle = 45 + 180 #sc\angle = 45 + 180
#sc\turn = 45 #sc\turn = 45
@ -404,24 +974,24 @@ func FillRoom(r:Room):
#PositionEntity(sc\ScrObj, r\x + 96.0 * RoomScale, 1.1, r\z - 668.0 * RoomScale) #PositionEntity(sc\ScrObj, r\x + 96.0 * RoomScale, 1.1, r\z - 668.0 * RoomScale)
#EntityParent(sc\ScrObj, r\obj) #EntityParent(sc\ScrObj, r\obj)
# #
#Local em.Emitters = CreateEmitter(r\x - 175.0 * RoomScale, 370.0 * RoomScale, r\z + 656.0 * RoomScale, 0) var em:Emitter = CreateEmitter(r.x - 175.0 * Constants.RoomScale, 370.0 * Constants.RoomScale, r.z + 656.0 * Constants.RoomScale, 0)
#TurnEntity(em\Obj, 90, 0, 0, True) TurnEntity(em.Obj, 90, 0, 0, true)
#EntityParent(em\Obj, r\obj) EntityParent(em.Obj, r.obj)
#em\RandAngle = 20 em.RandAngle = 20
#em\Speed = 0.05 em.Speed = 0.05
#em\SizeChange = 0.007 em.SizeChange = 0.007
#em\Achange = -0.006 em.Achange = -0.006
#em\Gravity = -0.24 em.Gravity = -0.24
#
#em.Emitters = CreateEmitter(r\x - 655.0 * RoomScale, 370.0 * RoomScale, r\z + 240.0 * RoomScale, 0) em = CreateEmitter(r.x - 655.0 * Constants.RoomScale, 370.0 * Constants.RoomScale, r.z + 240.0 * Constants.RoomScale, 0)
#TurnEntity(em\Obj, 90, 0, 0, True) TurnEntity(em.Obj, 90, 0, 0, true)
#EntityParent(em\Obj, r\obj) EntityParent(em.Obj, r.obj)
#em\RandAngle = 20 em.RandAngle = 20
#em\Speed = 0.05 em.Speed = 0.05
#em\SizeChange = 0.007 em.SizeChange = 0.007
#em\Achange = -0.006 em.Achange = -0.006
#em\Gravity = -0.24 em.Gravity = -0.24
#
#;This needs more work #;This needs more work
#;dem.DevilEmitters = CreateDevilEmitter(r\x-175.0*RoomScale,r\y+370.0*RoomScale,r\z+656.0*RoomScale,r,2) #;dem.DevilEmitters = CreateDevilEmitter(r\x-175.0*RoomScale,r\y+370.0*RoomScale,r\z+656.0*RoomScale,r,2)
#;dem\isDeconGas = True #;dem\isDeconGas = True
@ -462,57 +1032,74 @@ func FillRoom(r:Room):
#PositionEntity(sc\ScrObj, r\x + 96.0 * RoomScale, 1.1, r\z - 668.0 * RoomScale) #PositionEntity(sc\ScrObj, r\x + 96.0 * RoomScale, 1.1, r\z - 668.0 * RoomScale)
#EntityParent(sc\ScrObj, r\obj) #EntityParent(sc\ScrObj, r\obj)
#;[End Block] #;[End Block]
#Case "gatea" elif rn == "gatea":
#;[Block] r.RoomDoors[2] = CreateDoor(r.zone, r.x - 4064.0 * Constants.RoomScale, r.y - 1280.0 * Constants.RoomScale, r.z + 3952.0 * Constants.RoomScale, 0, r, false)
#r\RoomDoors[2] = CreateDoor(r\zone, r\x - 4064.0 * RoomScale, r\y-1280.0*RoomScale, r\z + 3952.0 * RoomScale, 0, r, False) r.RoomDoors[2].AutoClose = false
#r\RoomDoors[2]\AutoClose = False : r\RoomDoors[2]\open = False r.RoomDoors[2].open = false
#
#d2 = CreateDoor(r\zone, r\x, r\y, r\z - 1024.0 * RoomScale, 0, r, False) var d2 = CreateDoor(r.zone, r.x, r.y, r.z - 1024.0 * Constants.RoomScale, 0, r, false)
#d2\AutoClose = False : d2\open = False : d2\locked = True d2.AutoClose = false
# d2.open = false
#d2 = CreateDoor(r\zone, r\x-1440*RoomScale, r\y-480.0*RoomScale, r\z + 2328.0 * RoomScale, 0, r, False, False, 2) d2.locked = true
#If SelectedEnding = "A2" Then
#d2\AutoClose = False : d2\open = True : d2\locked = True d2 = CreateDoor(r.zone, r.x - 1440 * Constants.RoomScale, r.y - 480.0 * Constants.RoomScale, r.z + 2328.0 * Constants.RoomScale, 0, r, false, false, 2)
#Else if SelectedEnding == "A2":
#d2\AutoClose = False : d2\open = False : d2\locked = False d2.AutoClose = false
#EndIf d2.open = true
#PositionEntity d2\buttons[0], r\x-1320.0*RoomScale, EntityY(d2\buttons[0],True), r\z + 2288.0*RoomScale, True d2.locked = true
#PositionEntity d2\buttons[1], r\x-1584*RoomScale, EntityY(d2\buttons[0],True), r\z + 2488.0*RoomScale, True else:
#RotateEntity d2\buttons[1], 0, 90, 0, True d2.AutoClose = false
# d2.open = false
#d2 = CreateDoor(r\zone, r\x-1440*RoomScale, r\y-480.0*RoomScale, r\z + 4352.0 * RoomScale, 0, r, False, False, 2) d2.locked = false
#If SelectedEnding = "A2" Then
#d2\AutoClose = False : d2\open = True : d2\locked = True d2.buttons[0].global_position.x = r.x - 1320.0 * Constants.RoomScale
#Else d2.buttons[0].global_position.y = d2.buttons[0].global_position.y
#d2\AutoClose = False : d2\open = False : d2\locked = False d2.buttons[0].global_position.z = r.z + 2288.0 * Constants.RoomScale
#EndIf d2.buttons[1].global_position.x = r.x - 1584 * Constants.RoomScale
#PositionEntity d2\buttons[0], r\x-1320.0*RoomScale, EntityY(d2\buttons[0],True), r\z + 4384.0*RoomScale, True d2.buttons[1].global_position.y = d2.buttons[0].global_position.y
#RotateEntity d2\buttons[0], 0, 180, 0, True d2.buttons[1].global_position.z = r.z + 2488.0 * Constants.RoomScale
#PositionEntity d2\buttons[1], r\x-1584.0*RoomScale, EntityY(d2\buttons[0],True), r\z + 4232.0*RoomScale, True d2.buttons[1].rotation.x = 0
#RotateEntity d2\buttons[1], 0, 90, 0, True d2.buttons[1].rotation.y = 90
# d2.buttons[1].rotation.z = 0
#For r2.Rooms = Each Rooms
#If r2\RoomTemplate\Name = "exit1" Then d2 = CreateDoor(r.zone, r.x - 1440 * Constants.RoomScale, r.y - 480.0 * Constants.RoomScale, r.z + 4352.0 * Constants.RoomScale, 0, r, false, false, 2)
#r\Objects[1]=r2\Objects[1] if SelectedEnding == "A2":
#r\Objects[2]=r2\Objects[2] d2.AutoClose = false
#ElseIf r2\RoomTemplate\Name = "gateaentrance" d2.open = true
#;ylempi hissi d2.locked = true
#r\RoomDoors[1] = CreateDoor(0, r\x+1544.0*RoomScale, r\y, r\z-64.0*RoomScale, 90, r, False, 3) else:
#r\RoomDoors[1]\AutoClose = False : r\RoomDoors[1]\open = False d2.AutoClose = false
#PositionEntity(r\RoomDoors[1]\buttons[0],r\x+1584*RoomScale, EntityY(r\RoomDoors[1]\buttons[0],True), r\z+80*RoomScale, True) d2.open = false
#PositionEntity(r\RoomDoors[1]\buttons[1],r\x+1456*RoomScale, EntityY(r\RoomDoors[1]\buttons[1],True), r\z-208*RoomScale, True) d2.locked = false
#r2\Objects[1] = CreatePivot()
#PositionEntity(r2\Objects[1], r\x+1848.0*RoomScale, r\y+240.0*RoomScale, r\z-64.0*RoomScale, True) PositionEntity(d2.buttons[0], r.x - 1320.0 * Constants.RoomScale, EntityY(d2.buttons[0], true), r.z + 4384.0 * Constants.RoomScale, true)
#EntityParent r2\Objects[1], r\obj RotateEntity(d2.buttons[0], 0, 180, 0, true)
#EndIf PositionEntity(d2.buttons[1], r.x - 1584.0 * Constants.RoomScale, EntityY(d2.buttons[0], true), r.z + 4232.0 * Constants.RoomScale, true)
#Next RotateEntity(d2.buttons[1], 0, 90, 0, true)
#
#;106:n spawnpoint for r2: Room in rooms:
#r\Objects[3]=CreatePivot() if r2.RoomTemplate.Name == "exit1":
#PositionEntity(r\Objects[3], r\x+1216.0*RoomScale, r\y, r\z+2112.0*RoomScale, True) r.Objects[1] = r2.Objects[1]
#EntityParent r\Objects[3], r\obj r.Objects[2] = r2.Objects[2]
# elif r2.RoomTemplate.Name == "gateaentrance":
#;sillan loppup<75><70> # ylempi hissi
r.RoomDoors[1] = CreateDoor(0, r.x + 1544.0 * Constants.RoomScale, r.y, r.z - 64.0 * Constants.RoomScale, 90, r, false, 3)
r.RoomDoors[1].AutoClose = false
r.RoomDoors[1].open = false
PositionEntity(r.RoomDoors[1].buttons[0], r.x + 1584 * Constants.RoomScale, EntityY(r.RoomDoors[1].buttons[0], true), r.z + 80 * Constants.RoomScale, true)
PositionEntity(r.RoomDoors[1].buttons[1], r.x + 1456 * Constants.RoomScale, EntityY(r.RoomDoors[1].buttons[1], true), r.z - 208 * Constants.RoomScale, true)
r2.Objects[1] = Node3D.new()
r.obj.add_child(r2.Objects[1])
PositionEntity(r2.Objects[1], r.x + 1848.0 * Constants.RoomScale, r.y + 240.0 * Constants.RoomScale, r.z - 64.0 * Constants.RoomScale, true)
# 106:n spawnpoint
r.Objects[3] = Node3D.new()
r.obj.add_child(r.Objects[3])
PositionEntity(r.Objects[3], r.x + 1216.0 * Constants.RoomScale, r.y, r.z + 2112.0 * Constants.RoomScale, true)
# TODO: All of Gate A points
# bridge end
#r\Objects[4]=CreatePivot() #r\Objects[4]=CreatePivot()
#PositionEntity(r\Objects[4], r\x, r\y+96.0*RoomScale, r\z+6400.0*RoomScale, True) #PositionEntity(r\Objects[4], r\x, r\y+96.0*RoomScale, r\z+6400.0*RoomScale, True)
#EntityParent r\Objects[4], r\obj #EntityParent r\Objects[4], r\obj
@ -547,9 +1134,9 @@ func FillRoom(r:Room):
#r\Objects[11]=CreatePivot() #r\Objects[11]=CreatePivot()
#PositionEntity(r\Objects[11], r\x-4064.0*RoomScale, r\y-1248.0*RoomScale, r\z-1696.0*RoomScale, True) #PositionEntity(r\Objects[11], r\x-4064.0*RoomScale, r\y-1248.0*RoomScale, r\z-1696.0*RoomScale, True)
#EntityParent r\Objects[11], r\obj #EntityParent r\Objects[11], r\obj
#
#r\Objects[13]=LoadMesh_Strict("GFX\map\gateawall1.b3d",r\obj) r.Objects[13] = B3D.Load("GFX/map/gateawall1.b3d", r.obj)
#PositionEntity(r\Objects[13], r\x-4308.0*RoomScale, r\y-1045.0*RoomScale, r\z+544.0*RoomScale, True) PositionEntity(r.Objects[13], r.x - 4308.0 * Constants.RoomScale, r.y - 1045.0 * Constants.RoomScale, r.z + 544.0 * Constants.RoomScale, true)
#EntityColor r\Objects[13], 25,25,25 #EntityColor r\Objects[13], 25,25,25
#EntityType r\Objects[13],HIT_MAP #EntityType r\Objects[13],HIT_MAP
#;EntityFX(r\Objects[13],1) #;EntityFX(r\Objects[13],1)

View file

@ -50,6 +50,8 @@ var StaminaEffectTimer: float
var IsZombie : bool var IsZombie : bool
var Shake: float var Shake: float
var InSmoke: bool = false
var KillTimer: float var KillTimer: float
var PlayerFallingPickDistance: float var PlayerFallingPickDistance: float

View file

@ -144,6 +144,11 @@ static func get_node_aabb(node : Node3D = null, ignore_top_level : bool = true,
return box return box
static func Distance(x1:float, y1:float, x2: float, y2: float) -> float:
var x = x2 - x1
var y = y2 - y1
return sqrt(x * x + y * y)
static func StripFilename(file: String): static func StripFilename(file: String):
var mi = "" var mi = ""
var lastSlash = 0 var lastSlash = 0

View file

@ -151,7 +151,7 @@ static func ReadNode(reader:BufferStuffReader, parsedResult: B3D):
static func ReadBrush(reader:BufferStuffReader): static func ReadBrush(reader:BufferStuffReader):
pass pass
static func Load(filePath: String): static func Load(filePath: String, parent: Node3D = null):
var correctedPath = str("res://", filePath.replace("\\", "/")) var correctedPath = str("res://", filePath.replace("\\", "/"))
var fileHandle = FileAccess.open(correctedPath, FileAccess.READ) var fileHandle = FileAccess.open(correctedPath, FileAccess.READ)
@ -178,7 +178,9 @@ static func Load(filePath: String):
elif chunk.name == "NODE": elif chunk.name == "NODE":
resultScene.add_child(ReadNode(chunkReader, parsedResult)) resultScene.add_child(ReadNode(chunkReader, parsedResult))
print(resultScene) #print(resultScene)
if parent:
parent.add_child(resultScene)
return resultScene return resultScene
else: else:
print(str("Unknown b3d version. ", version)) print(str("Unknown b3d version. ", version))

View file

@ -25,16 +25,16 @@ static func LoadRMesh(file: String, rt: RoomTemplate):
var scene = Node3D.new() var scene = Node3D.new()
scene.name = str(fileName, "_", rt.Name, "_", RMESH_LOAD_COUNT) scene.name = str(fileName, "_", rt.Name, "_", RMESH_LOAD_COUNT)
# debug rot and name! # debug rot and name!
#var text3 = Label3D.new() var text3 = Label3D.new()
#text3.position.y = 10 text3.position.y = 10
#text3.scale.x = 3 text3.scale.x = 3
#text3.scale.y = 3 text3.scale.y = 3
#text3.scale.z = 3 text3.scale.z = 3
#text3.billboard = BaseMaterial3D.BILLBOARD_ENABLED text3.billboard = BaseMaterial3D.BILLBOARD_ENABLED
#text3.name = "Egg" text3.name = "Egg"
#scene.add_child(text3) scene.add_child(text3)
#scene.set_script(load("res://src/stinky.gd")) scene.set_script(load("res://src/stinky.gd"))
#scene.set_meta("rmesh", fileName) scene.set_meta("rmesh", fileName)
RMESH_LOAD_COUNT += 1 RMESH_LOAD_COUNT += 1
var count: int = 0 var count: int = 0

View file

@ -197,7 +197,7 @@ static func LoadModel(filePath: String):
#mat.albedo_texture = texture #mat.albedo_texture = texture
#mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA_DEPTH_PRE_PASS if activeAlbedoHasAlpha else BaseMaterial3D.TRANSPARENCY_DISABLED #mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA_DEPTH_PRE_PASS if activeAlbedoHasAlpha else BaseMaterial3D.TRANSPARENCY_DISABLED
meshInstance.set_surface_override_material(0, mat) meshInstance.set_surface_override_material(0, mat)
meshInstance.create_trimesh_collision() #meshInstance.create_trimesh_collision()
meshInstance.name = str(filePath, "_", Time.get_unix_time_from_system()) meshInstance.name = str(filePath, "_", Time.get_unix_time_from_system())
var meshSize = _CalcMinMaxPos(mesh.verts) var meshSize = _CalcMinMaxPos(mesh.verts)
meshInstance.set_meta("meshWidth", meshSize.x) meshInstance.set_meta("meshWidth", meshSize.x)

21
src/objects/Emitter.gd Normal file
View file

@ -0,0 +1,21 @@
class_name Emitter
extends Node
var Obj: Node3D
var Size: float
var MinImage: float
var MaxImage: float
var Gravity: float
var LifeTime: float
var Disable: bool = false
var Room: Room
var SoundCHN
var Speed: float
var RandAngle: float
var SizeChange: float
var Achange: float

22
src/objects/Particle.gd Normal file
View file

@ -0,0 +1,22 @@
class_name Particle
extends Node3D
var obj
var pvt
var image
var R: float
var G: float
var B: float
var A: float
var size: float
var speed: float
var yspeed: float
var gravity: float
var Rchange: float
var Gchange: float
var Bchange: float
var Achange: float
var SizeChange: float
var lifetime: float

View file

@ -2,12 +2,15 @@ extends Node3D
# for when it just isn't. # for when it just isn't.
#func _process(delta: float):
#$Egg.position.y = X.MeshHeight(self) + 0.5
#$Egg.scale.x = 15
#$Egg.scale.y = 15
#$Egg.scale.z = 15
#$Egg.text = str(
#"POS: ", position, "\n",
#"ROT: ", rad_to_deg(rotation.y), "\n"
#)
func _process(delta: float): func _process(delta: float):
$Egg.position.y = X.MeshHeight(self) + 0.5 $Egg.text = str("ROT: ", rad_to_deg(rotation.y), "\n", get_meta("rmesh"))
$Egg.scale.x = 15
$Egg.scale.y = 15
$Egg.scale.z = 15
$Egg.text = str(
"POS: ", position, "\n",
"ROT: ", rad_to_deg(rotation.y), "\n"
)