@ -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<75> <70>
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)