diff --git a/project.godot b/project.godot index 9cdb179..926d8c3 100644 --- a/project.godot +++ b/project.godot @@ -13,7 +13,7 @@ config_version=5 config/name="SCPCB" run/main_scene="res://scenes/screens/Startup.tscn" 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/show_image=false config/icon="res://icon.png" diff --git a/scenes/world/DynamicMap.tscn b/scenes/world/DynamicMap.tscn index 8f6a7c9..ce8d4ee 100644 --- a/scenes/world/DynamicMap.tscn +++ b/scenes/world/DynamicMap.tscn @@ -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) [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 use_collision = true 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="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="."] diff --git a/src/Constants.gd b/src/Constants.gd index 597f9ad..23648f0 100644 --- a/src/Constants.gd +++ b/src/Constants.gd @@ -15,3 +15,5 @@ const ROOM4 = 5 const gridsz = 19 # Same size as the main map itself (better for the map creator) const RoomScale = 8.0 / 2048.0 + +const HideDistance = 15 diff --git a/src/DynamicMap.gd b/src/DynamicMap.gd index 982c188..13c4b1d 100644 --- a/src/DynamicMap.gd +++ b/src/DynamicMap.gd @@ -1,5 +1,569 @@ 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: #add_child(RMesh.LoadRMesh("GFX\\map\\gatea_opt.rmesh", RoomTemplate.new())) #B3D.Load("GFX\\npcs\\106_2.b3d") @@ -24,6 +588,7 @@ func _ready() -> void: var IntroEnabled: bool var I_Zone: MapZones = MapZones.new() var RandomSeed: String = "" +var SelectedEnding: String = "" var MapWidth = 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: parent = room.obj - var d2:Door + #var d2:Door var d = Door.new() + #d.open = true doors.push_back(d) if big == 1: 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) elif big == 3: print("DOORS: Creating ElevatorDoor in " + room.RoomTemplate.Name, ", X: ", x, ", Y: ", y, " Z: ", z) - print("TODO: ELEVATOR DOOR!") - #for d2 = Each Doors - #If d2 <> d And d2\dir = 3 Then - #d\obj = CopyEntity(d2\obj) - #d\obj2 = CopyEntity(d2\obj2) - #ScaleEntity d\obj, RoomScale, RoomScale, RoomScale - #ScaleEntity d\obj2, RoomScale, RoomScale, RoomScale - #Exit - #EndIf - #Next - #If d\obj=0 Then - #d\obj = LoadMesh_Strict("GFX\map\elevatordoor.b3d") - #d\obj2 = CopyEntity(d\obj) - #ScaleEntity d\obj, RoomScale, RoomScale, RoomScale - #ScaleEntity d\obj2, RoomScale, RoomScale, RoomScale - #EndIf - #d\frameobj = CopyEntity(DoorFrameOBJ) + #print("TODO: ELEVATOR DOOR!") + for d2:Door in doors: + if d2 != d and d2.dir == 3: + d.obj = CopyEntity(d2.obj) + d.obj2 = CopyEntity(d2.obj2) + ScaleEntity(d.obj, Constants.RoomScale, Constants.RoomScale, Constants.RoomScale) + ScaleEntity(d.obj2, Constants.RoomScale, Constants.RoomScale, Constants.RoomScale) + break + if d.obj == null: + d.obj = B3D.Load("GFX/map/elevatordoor.b3d")#LoadMesh_Strict("GFX\map\elevatordoor.b3d") + d.obj2 = CopyEntity(d.obj) + ScaleEntity(d.obj, Constants.RoomScale, Constants.RoomScale, Constants.RoomScale) + ScaleEntity(d.obj2, Constants.RoomScale, Constants.RoomScale, Constants.RoomScale) + d.frameobj = X.LoadModel("GFX/map/doorframe.x")#CopyEntity(DoorFrameOBJ) else: print("DOORS: Creating Door in " + room.RoomTemplate.Name, ", X: ", x, ", Y: ", y, " Z: ", z) 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 #scaleentity(d\obj, 0.1, 0.1, 0.1) - d.frameobj.scale.x = Constants.RoomScale - d.frameobj.scale.y = Constants.RoomScale - d.frameobj.scale.z = Constants.RoomScale + if d.frameobj: + d.frameobj.scale.x = 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.obj) - d.frameobj.global_position.x = x - d.frameobj.global_position.y = y - d.frameobj.global_position.z = z + if d.frameobj: + d.frameobj.global_position.x = x + d.frameobj.global_position.y = y + d.frameobj.global_position.z = z #EntityPickMode d\frameobj,2 #EntityType d\obj, 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.z = 0.03 + EntityParent(d.buttons[0], d.frameobj) + EntityParent(d.buttons[1], d.frameobj) + if big > 0: d.buttons[0].global_position.x = x - 432.0 * Constants.RoomScale d.buttons[0].global_position.y = y + 0.7 @@ -198,16 +766,6 @@ func CreateDoor(lvl, x:float, y:float, z:float, angle:float, room:Room, dopen = d.obj2.global_position.x = x d.obj2.global_position.y = y 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: d.obj2.rotation.y = deg_to_rad(angle) @@ -272,22 +830,25 @@ func FillRoom(r:Room): #[Block] #the wooden door 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.y = 0 r.Objects[2].global_position.z = r.z r.Objects[2].scale.x = 45.0 * Constants.RoomScale r.Objects[2].scale.y = 45.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] = LoadMesh_Strict("GFX\map\forest\door.b3d") - #PositionEntity r\Objects[3],r\x + 112.0 * RoomScale,0,r\z+0.05,True + + r.Objects[3] = B3D.Load("GFX/map/forest/door.b3d") + r.obj.add_child(r.Objects[3]) + r.Objects[3].global_position.x = r.x + 112.0 * Constants.RoomScale + r.Objects[3].global_position.y = 0 + r.Objects[3].global_position.z = r.z + 0.05 #EntityType r\Objects[3], HIT_MAP - # - #ScaleEntity r\Objects[3],46.0*RoomScale,45.0*RoomScale,46.0*RoomScale,True - #EntityParent r\Objects[3],r\obj - # + + r.Objects[3].scale.x = 46.0 * Constants.RoomScale + 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]) #PositionEntity r\Objects[4],r\x + 256.0 * RoomScale,0,r\z-0.05,True #RotateEntity r\Objects[4], 0,180,0 @@ -356,29 +917,38 @@ func FillRoom(r:Room): #RotateEntity it\collider, 0, r\angle+170, 0 #EntityParent(it\collider, r\obj) #;[End Block] - #Case "lockroom" - #;[Block] - #d = CreateDoor(r\zone, r\x - 736.0 * RoomScale, 0, r\z - 104.0 * RoomScale, 0, r, True) - #d\timer = 70 * 5 : 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) - #EntityParent(d\buttons[0], r\obj) - # - #FreeEntity(d\buttons[1]) : d\buttons[1] = 0 - # - #d2 = CreateDoor(r\zone, r\x + 104.0 * RoomScale, 0, r\z + 736.0 * RoomScale, 270, r, True) - #d2\timer = 70 * 5 : d2\AutoClose = False: d2\open = False - #EntityParent(d2\buttons[0], 0) - #PositionEntity(d2\buttons[0], r\x + 640.0 * RoomScale, 0.7, r\z + 288.0 * RoomScale) - #RotateEntity (d2\buttons[0], 0, 90, 0) - #EntityParent(d2\buttons[0], r\obj) - # - #FreeEntity(d2\buttons[1]) : d2\buttons[1] = 0 - # - #d\LinkedDoor = d2 - #d2\LinkedDoor = d - # + elif rn == "lockroom": + var d = CreateDoor(r.zone, r.x - 736.0 * Constants.RoomScale, 0, r.z - 104.0 * Constants.RoomScale, 0, r, true) + d.timer = 70 * 5 + d.AutoClose = false + d.open = false + + r.obj.reparent(d.buttons[0]) + d.buttons[0].global_position.x = r.x - 288.0 * Constants.RoomScale + d.buttons[0].global_position.y = 0.7 + d.buttons[0].global_position.x = r.z - 640.0 * Constants.RoomScale + + d.buttons[1].queue_free() + d.buttons[1] = null + + var d2 = CreateDoor(r.zone, r.x + 104.0 * Constants.RoomScale, 0, r.z + 736.0 * Constants.RoomScale, 270, r, true) + d2.timer = 70 * 5 + d2.AutoClose = false + d2.open = false + r.obj.reparent(d2.buttons[0]) + d2.buttons[0].global_position.x = r.x + 640.0 * Constants.RoomScale + d2.buttons[0].global_position.y = 0.7 + 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\angle = 45 + 180 #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) #EntityParent(sc\ScrObj, r\obj) # - #Local em.Emitters = CreateEmitter(r\x - 175.0 * RoomScale, 370.0 * RoomScale, r\z + 656.0 * RoomScale, 0) - #TurnEntity(em\Obj, 90, 0, 0, True) - #EntityParent(em\Obj, r\obj) - #em\RandAngle = 20 - #em\Speed = 0.05 - #em\SizeChange = 0.007 - #em\Achange = -0.006 - #em\Gravity = -0.24 - # - #em.Emitters = CreateEmitter(r\x - 655.0 * RoomScale, 370.0 * RoomScale, r\z + 240.0 * RoomScale, 0) - #TurnEntity(em\Obj, 90, 0, 0, True) - #EntityParent(em\Obj, r\obj) - #em\RandAngle = 20 - #em\Speed = 0.05 - #em\SizeChange = 0.007 - #em\Achange = -0.006 - #em\Gravity = -0.24 - # + 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) + EntityParent(em.Obj, r.obj) + em.RandAngle = 20 + em.Speed = 0.05 + em.SizeChange = 0.007 + em.Achange = -0.006 + em.Gravity = -0.24 + + 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) + EntityParent(em.Obj, r.obj) + em.RandAngle = 20 + em.Speed = 0.05 + em.SizeChange = 0.007 + em.Achange = -0.006 + em.Gravity = -0.24 + #;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\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) #EntityParent(sc\ScrObj, r\obj) #;[End Block] - #Case "gatea" - #;[Block] - #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]\open = False - # - #d2 = CreateDoor(r\zone, r\x, r\y, r\z - 1024.0 * RoomScale, 0, r, False) - #d2\AutoClose = False : d2\open = False : d2\locked = True - # - #d2 = CreateDoor(r\zone, r\x-1440*RoomScale, r\y-480.0*RoomScale, r\z + 2328.0 * RoomScale, 0, r, False, False, 2) - #If SelectedEnding = "A2" Then - #d2\AutoClose = False : d2\open = True : d2\locked = True - #Else - #d2\AutoClose = False : d2\open = False : d2\locked = False - #EndIf - #PositionEntity d2\buttons[0], r\x-1320.0*RoomScale, EntityY(d2\buttons[0],True), r\z + 2288.0*RoomScale, True - #PositionEntity d2\buttons[1], r\x-1584*RoomScale, EntityY(d2\buttons[0],True), r\z + 2488.0*RoomScale, True - #RotateEntity d2\buttons[1], 0, 90, 0, True - # - #d2 = CreateDoor(r\zone, r\x-1440*RoomScale, r\y-480.0*RoomScale, r\z + 4352.0 * RoomScale, 0, r, False, False, 2) - #If SelectedEnding = "A2" Then - #d2\AutoClose = False : d2\open = True : d2\locked = True - #Else - #d2\AutoClose = False : d2\open = False : d2\locked = False - #EndIf - #PositionEntity d2\buttons[0], r\x-1320.0*RoomScale, EntityY(d2\buttons[0],True), r\z + 4384.0*RoomScale, True - #RotateEntity d2\buttons[0], 0, 180, 0, True - #PositionEntity d2\buttons[1], r\x-1584.0*RoomScale, EntityY(d2\buttons[0],True), r\z + 4232.0*RoomScale, True - #RotateEntity d2\buttons[1], 0, 90, 0, True - # - #For r2.Rooms = Each Rooms - #If r2\RoomTemplate\Name = "exit1" Then - #r\Objects[1]=r2\Objects[1] - #r\Objects[2]=r2\Objects[2] - #ElseIf r2\RoomTemplate\Name = "gateaentrance" - #;ylempi hissi - #r\RoomDoors[1] = CreateDoor(0, r\x+1544.0*RoomScale, r\y, r\z-64.0*RoomScale, 90, r, False, 3) - #r\RoomDoors[1]\AutoClose = False : r\RoomDoors[1]\open = False - #PositionEntity(r\RoomDoors[1]\buttons[0],r\x+1584*RoomScale, EntityY(r\RoomDoors[1]\buttons[0],True), r\z+80*RoomScale, True) - #PositionEntity(r\RoomDoors[1]\buttons[1],r\x+1456*RoomScale, EntityY(r\RoomDoors[1]\buttons[1],True), r\z-208*RoomScale, True) - #r2\Objects[1] = CreatePivot() - #PositionEntity(r2\Objects[1], r\x+1848.0*RoomScale, r\y+240.0*RoomScale, r\z-64.0*RoomScale, True) - #EntityParent r2\Objects[1], r\obj - #EndIf - #Next - # - #;106:n spawnpoint - #r\Objects[3]=CreatePivot() - #PositionEntity(r\Objects[3], r\x+1216.0*RoomScale, r\y, r\z+2112.0*RoomScale, True) - #EntityParent r\Objects[3], r\obj - # - #;sillan loppup�� + elif rn == "gatea": + 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].AutoClose = false + r.RoomDoors[2].open = 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 = 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) + if SelectedEnding == "A2": + d2.AutoClose = false + d2.open = true + d2.locked = true + else: + d2.AutoClose = false + d2.open = false + d2.locked = false + + d2.buttons[0].global_position.x = r.x - 1320.0 * Constants.RoomScale + d2.buttons[0].global_position.y = d2.buttons[0].global_position.y + d2.buttons[0].global_position.z = r.z + 2288.0 * Constants.RoomScale + d2.buttons[1].global_position.x = r.x - 1584 * Constants.RoomScale + d2.buttons[1].global_position.y = d2.buttons[0].global_position.y + d2.buttons[1].global_position.z = r.z + 2488.0 * Constants.RoomScale + d2.buttons[1].rotation.x = 0 + d2.buttons[1].rotation.y = 90 + d2.buttons[1].rotation.z = 0 + + 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) + if SelectedEnding == "A2": + d2.AutoClose = false + d2.open = true + d2.locked = true + else: + d2.AutoClose = false + d2.open = false + d2.locked = false + + PositionEntity(d2.buttons[0], r.x - 1320.0 * Constants.RoomScale, EntityY(d2.buttons[0], true), r.z + 4384.0 * Constants.RoomScale, true) + RotateEntity(d2.buttons[0], 0, 180, 0, true) + PositionEntity(d2.buttons[1], r.x - 1584.0 * Constants.RoomScale, EntityY(d2.buttons[0], true), r.z + 4232.0 * Constants.RoomScale, true) + RotateEntity(d2.buttons[1], 0, 90, 0, true) + + for r2: Room in rooms: + if r2.RoomTemplate.Name == "exit1": + r.Objects[1] = r2.Objects[1] + r.Objects[2] = r2.Objects[2] + elif r2.RoomTemplate.Name == "gateaentrance": + # 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() #PositionEntity(r\Objects[4], r\x, r\y+96.0*RoomScale, r\z+6400.0*RoomScale, True) #EntityParent r\Objects[4], r\obj @@ -547,9 +1134,9 @@ func FillRoom(r:Room): #r\Objects[11]=CreatePivot() #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 - # - #r\Objects[13]=LoadMesh_Strict("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) + + r.Objects[13] = B3D.Load("GFX/map/gateawall1.b3d", r.obj) + 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 #EntityType r\Objects[13],HIT_MAP #;EntityFX(r\Objects[13],1) diff --git a/src/Player.gd b/src/Player.gd index a77b8c5..54b1612 100644 --- a/src/Player.gd +++ b/src/Player.gd @@ -50,6 +50,8 @@ var StaminaEffectTimer: float var IsZombie : bool var Shake: float +var InSmoke: bool = false + var KillTimer: float var PlayerFallingPickDistance: float diff --git a/src/Utils.gd b/src/Utils.gd index 0056ba2..b7b9caa 100644 --- a/src/Utils.gd +++ b/src/Utils.gd @@ -144,6 +144,11 @@ static func get_node_aabb(node : Node3D = null, ignore_top_level : bool = true, 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): var mi = "" var lastSlash = 0 diff --git a/src/file_parsers/B3D.gd b/src/file_parsers/B3D.gd index 15c3642..3d98286 100644 --- a/src/file_parsers/B3D.gd +++ b/src/file_parsers/B3D.gd @@ -151,7 +151,7 @@ static func ReadNode(reader:BufferStuffReader, parsedResult: B3D): static func ReadBrush(reader:BufferStuffReader): pass -static func Load(filePath: String): +static func Load(filePath: String, parent: Node3D = null): var correctedPath = str("res://", filePath.replace("\\", "/")) var fileHandle = FileAccess.open(correctedPath, FileAccess.READ) @@ -178,7 +178,9 @@ static func Load(filePath: String): elif chunk.name == "NODE": resultScene.add_child(ReadNode(chunkReader, parsedResult)) - print(resultScene) + #print(resultScene) + if parent: + parent.add_child(resultScene) return resultScene else: print(str("Unknown b3d version. ", version)) diff --git a/src/file_parsers/RMesh.gd b/src/file_parsers/RMesh.gd index 714cec7..fbed4b6 100644 --- a/src/file_parsers/RMesh.gd +++ b/src/file_parsers/RMesh.gd @@ -25,16 +25,16 @@ static func LoadRMesh(file: String, rt: RoomTemplate): var scene = Node3D.new() scene.name = str(fileName, "_", rt.Name, "_", RMESH_LOAD_COUNT) # debug rot and name! - #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" - #scene.add_child(text3) - #scene.set_script(load("res://src/stinky.gd")) - #scene.set_meta("rmesh", fileName) + 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" + scene.add_child(text3) + scene.set_script(load("res://src/stinky.gd")) + scene.set_meta("rmesh", fileName) RMESH_LOAD_COUNT += 1 var count: int = 0 diff --git a/src/file_parsers/X.gd b/src/file_parsers/X.gd index 602be8a..167c7c6 100644 --- a/src/file_parsers/X.gd +++ b/src/file_parsers/X.gd @@ -197,7 +197,7 @@ static func LoadModel(filePath: String): #mat.albedo_texture = texture #mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA_DEPTH_PRE_PASS if activeAlbedoHasAlpha else BaseMaterial3D.TRANSPARENCY_DISABLED 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()) var meshSize = _CalcMinMaxPos(mesh.verts) meshInstance.set_meta("meshWidth", meshSize.x) diff --git a/src/objects/Emitter.gd b/src/objects/Emitter.gd new file mode 100644 index 0000000..b8612f8 --- /dev/null +++ b/src/objects/Emitter.gd @@ -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 diff --git a/src/objects/Particle.gd b/src/objects/Particle.gd new file mode 100644 index 0000000..9ddcaca --- /dev/null +++ b/src/objects/Particle.gd @@ -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 diff --git a/src/stinky.gd b/src/stinky.gd index af937b0..b10c3f7 100644 --- a/src/stinky.gd +++ b/src/stinky.gd @@ -2,12 +2,15 @@ extends Node3D # 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): - $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" - ) + $Egg.text = str("ROT: ", rad_to_deg(rotation.y), "\n", get_meta("rmesh"))