diff --git a/Data/1499chunks.ini b/Data/1499chunks.ini
new file mode 100644
index 0000000..d492343
--- /dev/null
+++ b/Data/1499chunks.ini
@@ -0,0 +1,60 @@
+;WARNING: Editing this file might cause some several issues with the saving system (if you load a game)!
+;After you edited this file you should NOT load a save file where you entered "dimension1499" before!
+
+[general]
+count = 4
+
+[chunk0]
+count = 1
+obj0 = 3
+obj0-x = -6
+obj0-z = 18
+obj0-yaw = 90
+obj1 = 12
+obj1-x = 1
+obj1-z = -12
+obj1-yaw = RANDOM
+
+[chunk1]
+count = 2
+obj0 = 2
+obj0-x = 10
+obj0-z = -12
+obj0-yaw = 0
+obj1 = 6
+obj1-x = -16
+obj1-z = 11
+obj1-yaw = RANDOM
+obj2 = 9
+obj2-x = 16
+obj2-z = -4
+obj2-yaw = RANDOM
+
+[chunk2]
+count = 0
+obj0 = 5
+obj0-x = 0
+obj0-z = 0
+obj0-yaw = RANDOM
+
+[chunk3]
+count = 2
+obj0 = 3
+obj0-x = 15
+obj0-z = 5
+obj0-yaw = 180
+obj1 = 15
+obj1-x = -17
+obj1-z = -17
+obj1-yaw = RANDOM
+obj2 = 14
+obj2-x = 7
+obj2-z = -3
+obj2-yaw = RANDOM
+
+[chunk4]
+count = 0
+obj0 = 4
+obj0-x = 1
+obj0-z = -2
+obj0-yaw = RANDOM
\ No newline at end of file
diff --git a/Data/NPCBones.ini b/Data/NPCBones.ini
new file mode 100644
index 0000000..1da2dcc
--- /dev/null
+++ b/Data/NPCBones.ini
@@ -0,0 +1,19 @@
+[Guard]
+head_bonename = Neck
+head_controller_max = 2
+head_controlleraxis1 = yaw
+head_controlleraxis1_min = -60
+head_controlleraxis1_max = 60
+head_controlleraxis1_offset = 180
+head_controlleraxis1_smoothing = 10
+head_controlleraxis2 = pitch
+head_controlleraxis2_min = -60
+head_controlleraxis2_max = 60
+head_controlleraxis2_inverse = true
+head_controlleraxis2_offset = 15
+chest_bonename = Chest
+chest_controller_max = 1
+chest_controlleraxis1 = pitch
+chest_controlleraxis1_min = -60
+chest_controlleraxis1_max = 60
+chest_controlleraxis1_offset = 25
\ No newline at end of file
diff --git a/Data/NPCs.ini b/Data/NPCs.ini
new file mode 100644
index 0000000..147a026
--- /dev/null
+++ b/Data/NPCs.ini
@@ -0,0 +1,47 @@
+[SCP-173]
+speed = 38.0
+scale = 0.35
+
+[SCP-106]
+speed = 1.2
+scale = 0.25
+
+[SCP-096]
+speed = 9.0
+scale = 0.6
+
+[SCP-049]
+speed = 1.5
+scale = 1.2
+
+[SCP-049-2]
+speed = 0.8
+scale = 0.27
+
+[Guard]
+speed = 2.0
+scale = 0.29
+
+[MTF]
+speed = 2.0
+scale = 0.29
+
+[Forestmonster]
+speed = 8.0
+scale = 0.5
+
+[SCP-939]
+speed = 4.0
+scale = 0.5
+
+[SCP-066]
+speed = 2.0
+scale = 0.17
+
+[SCP-966]
+speed = 1.0
+scale = 0.5
+
+[SCP-1499-1]
+speed = 1.5
+scale = 0.08
\ No newline at end of file
diff --git a/Data/SCP-294.ini b/Data/SCP-294.ini
new file mode 100644
index 0000000..05c0976
--- /dev/null
+++ b/Data/SCP-294.ini
@@ -0,0 +1,999 @@
+;color = the color of the liquid
+;alpha = the transparency of the liquid (0.0 = invisible, 1.0 = nontransparent)
+;glow = makes the liquid glow (true/false)
+
+;sound = the sound clip played when the player drinks the liquid
+;dispensesound = the sound clip played when the liquid is dispensed ("SFX\SCP\294\dispense1.ogg" by default).
+
+;lethal = true/false
+;deathmessage = the text shown in the game over -screen if the player dies when drinking the liquid
+
+;blur = how many seconds the screen stays blurry after drinking the liquid
+;message = a text shown on the screen after drinking the liquid
+;damage = increases the injuries-value
+;blood loss = increases the blood loss - value
+;stomachache = true/false, has the same effect as appendicitis caused by SCP-1025 (decreased stamina and messages about stomach ache)
+
+;stamina effect = changes how fast stamina decreases (1.0 = normal speed, 2.0 = decreases twice as fast, 0.0 = doesn't decrease at all)
+;stamina effect timer = the amount of time it takes before stamina effect wears off
+;blink effect, blink effect timer
+
+;explosion = true/false, creates an explosion similar to the one at Gate B
+
+[Air|Nothing|Cup|Emptiness|Vacuum|HL3|Half Life 3]
+color = 0,0,0
+alpha = 0.0
+refusemessage = There is nothing to drink in the cup.
+dispensesound = SFX\SCP\294\dispense0.ogg
+
+[Alcohol|Ethanol|Ethanol Liquid|Spirit|Vodka]
+color = 255,255,255
+alpha = 0.5
+blur = 5
+dispensesound = SFX\SCP\294\dispense1.ogg
+sound = SFX\SCP\294\cough.ogg
+message = Damn, that's strong.
+
+[Aloe Vera Drink|Cactus Drink]
+color = 217,214,186
+alpha = 0.8
+sound = SFX\SCP\294\ahh.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+damage = -0.2
+
+[Amnesia]
+color = 255, 255, 255
+alpha = 0.5
+glow = true
+sound = SFX\SCP\294\slurp.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+blur = 10
+message = Daniel, is that you? What are you doing?
+
+[Anti-Energy Drink|Anti Energy Drink]
+color = 250,180,12
+alpha = 0.5
+sound = slurp.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = The drink tastes terrible. You feel tired and drained.
+stamina effect = 2.0
+stamina effect timer = 300
+blink effect = 1.5
+blink effect timer = 300
+
+[Antimatter|Anti-matter|Void]
+color = 0,0,0
+explosion = true
+dispensesound = SFX\SCP\294\Dispense3.ogg
+deathmessage = Recon teams sent in at [REDACTED] show that everything within a 210 mile radius from Site-[REDACTED] was vaporized, save for a 5 meter radius of unharmed area in the facility cafeteria of Sector [REDACTED], surrounding SCP-294.
+
+[Aqua Regia]
+color = 170,75,0
+refusemessage = Hmm... There should be more cuprite.
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Atomic|Nuclear|Nuclear Fusion|Nuclear Fission|Nuclear Reaction]
+color = 0, 255, 0
+alpha = 1.0
+glow = true
+dispensesound = SFX\SCP\294\dispense3.ogg
+explosion = true
+deathmessage = Recon teams sent in at [REDACTED] show that the entirety of Site-[REDACTED] was vaporized, save for a 5 meter radius of unharmed area in the facility cafeteria of Sector [REDACTED], surrounding SCP-294.
+
+[Beer|Lager]
+color = 235,165,40
+alpha = 0.8
+message = The drink tastes like a standard pale lager.
+sound = SFX\SCP\294\ahh.ogg
+
+[Black corrosive liquid|SCP-106|106|Old Man|Larry|Radical Larry]
+color = 0, 0, 0
+sound = SFX\SCP\106\Decay3.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+blur = 8
+message = You feel strange. It's as if there was something moving in your stomach.
+blood loss = 2.0
+stomachache = true
+
+[Bleach]
+color = 255,255,255
+alpha = 0.5
+sound = SFX\SCP\294\spit.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+blur = 300
+message = The liquid burns in your mouth and throat.
+deathtimer = 50
+
+[Blood]
+color = 145,32,50
+message = The drink tastes like red wine.
+sound = SFX\SCP\294\spit.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+blood loss = 40
+
+[Blood of Christ|Blood of Jesus|Blood of Jesus Christ]
+color = 145,32,50
+alpha = 0.9
+message = The drink tastes like red wine.
+sound = SFX\SCP\294\slurp.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+
+[Bose-Einstein Condensate|Quantum Gas]
+color = 255,230,255
+alpha = 0.2
+sound = SFX\SCP\294\burn.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+lethal = true
+deathmessage = A dead organic mass later identified as D-9341 through DNA tests was discovered with parts of the body frozen at near Absolute Zero temperatures. What was left of the throat and mouth cavity contained traces of near negative temperature Bosonic Particles, therefore making it a substance at a Bose-Einstein Condensate phase of matter the cause of death.
+
+[Carbon]
+color = 0,0,0
+blur = 15
+lethal = true
+sound = SFX\SCP\294\burn.ogg
+deathmessage = The mouth cavity, throat and face of the victim are covered in severe third degree burns. A layer of black, crystalline substance was found inside the mouth cavity. Sent for chemical analysis.
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Cassis Fanta]
+color = 204, 122, 235
+alpha = 0.6
+sound = SFX\SCP\294\ahh.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = Refreshing...
+
+[Carrot Juice|Carrot]
+color = 254,135,16
+message = Pretty good.
+sound = SFX\SCP\294\slurp.ogg
+
+[Champagne]
+color = 245, 202, 10
+alpha = 0.5
+sound = SFX\SCP\294\Ahh.ogg
+
+[Chim]
+color = 255,200,14
+glow = true
+message = There are no words in any human language to describe the taste of the liquid.
+blur = 100
+injuries = -4
+blood loss = -4
+
+[Cider|Apple Cider|Pear Cider]
+color = 240,190,50
+alpha = 0.8
+message = A bit too sugary for me.
+sound = SFX\SCP\294\slurp.ogg
+
+[Chocolate|Cocoa|Hot chocolate|Hot cocoa]
+color = 170,75,0
+blur = 2
+sound = SFX\SCP\294\ahh.ogg
+stamina effect = 1.1
+stamina effect timer = 200
+
+[Cocaine Energy Drink]
+color = 340,29,94
+alpha = 0.8
+message = The drink has a boost, and taste faintly hot with a hint of cinnamon.
+blur = 5
+stamina effect = 1.2
+stamina effect timer = 200
+sound = SFX\SCP\294\ahh.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+
+[Coffee|Black Coffee]
+color = 87,62,45
+message = The drink tastes like fairly strong black coffee.
+blur = 2
+stamina effect = 0.9
+stamina effect timer = 30
+sound = SFX\SCP\294\slurp.ogg
+
+[Coconut|Coconut milk|Coconut water|Coconut juice]
+color = 255,255,255
+sound = SFX\SCP\294\ahh.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = You enjoy the refreshing flavor of coconut milk.
+
+[Cola|Coke|Coca-Cola|Pepsi|Soda]
+color = 58,29,20
+alpha = 0.8
+message = It's cold and refreshing.
+sound = SFX\SCP\294\ahh.ogg
+
+[Cold|Cool|Freezing|Coldness]
+color = 200,200,200
+alpha = 0.2
+message = Your head aches from the freezing cold liquid.
+blur = 8.0
+
+[Cosmopolitan|Cocktail|Cosmopolitan Cocktail]
+color = 130, 0, 0
+alpha = 0.2
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = Even in the worst situations, nothing beats a fresh cosmopolitan.
+sound = SFX\SCP\294\ahh.ogg
+
+[Courage|Bravery]
+color = 41,28,22
+dispensesound = SFX\SCP\294\dispense3.ogg
+sound = SFX\SCP\294\ahh.ogg
+blink effect = 0.7
+blink effect timer = 180
+stamina effect = 0.5
+stamina effect timer = 180
+
+[Curry|Masala|Curry Sauce|Masala Sauce]
+color = 255, 83, 0
+dispensesound = SFX\SCP\294\dispense2.ogg
+message = Full of exotic spices and flavours, wet consistency, delicious.
+sound = SFX\SCP\294\slurp.ogg
+
+[Death|Game Over]
+color = 0,0,0
+alpha = 1.0
+Sound = SFX\SCP\294\cough.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+lethal = true
+deathmessage = A Class D found dead in the facility cafeteria of Sector [REDACTED]. Presumably killed by something dispensed by SCP-294.
+
+[Egg|Eggs]
+color = 252,252,212
+alpha = 1.0
+sound = SFX\SCP\294\ew2.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = It tastes just like raw eggs!
+
+[Element 0|Element Zero|Neutronium|Neutrium|Tetraneutron]
+color = 25,75,100
+glow = true
+sound = SFX\SCP\294\burn.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+lethal = true
+message = You didn't think Biotic Powers were real? Right?
+deathmessage = A body emitting large levels of radiation was discovered at Sector [REDACTED]. The subject appears to have consumed an unknown substance via SCP-294. Analysis of the radioactive substance via use of and chemical and nuclear testing shows that it has 0 charge, is composed purely of Neutrons, and appears to lack any Electrons or Protons. This indicates that the substance may be the theoretical Element known as Netronium.
+
+[ES|Euroshopper|Euroshopper Energy Drink|Energy Drink|Red Bull]
+color = 254,194,16
+alpha = 0.5
+sound = SFX\SCP\294\ahh.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = The drink tastes like an average energy drink.
+stamina effect = 0.9
+stamina effect timer = 180
+
+[Espresso]
+color = 204,91,53
+sound = SFX\SCP\294\slurp.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+
+[Estus]
+color = 250,200,15
+sound = SFX\SCP\294\ahh.ogg
+blood loss = -50
+damage = -2
+dispensesound = SFX\SCP\294\dispense2.ogg
+message = The taste is hard to describe. You feel refreshed.
+
+[Eternal Champion|Blood of Eternal Champion|Talin Warhaft]
+color = 124, 124, 124
+dispensesound = SFX\SCP\294\dispense3.ogg
+message = "I graciously accept thy position, my Emperor."
+sound = SFX\SCP\294\slurp.ogg
+blur = 10
+damage = -4
+blood loss = -4
+blink effect = 0.0
+blink effect timer = 10
+stamina effect = 2.0
+stamina effect timer = 30
+
+[Exotic Matter|Zero Point Energy|Negative Matter|Gravitons|Higgs Boson|God Particles|Black Holes]
+color = 255,255,255
+dispensesound = SFX\Horror\Horror16.ogg
+explosion = true
+deathmessage = After an investigation team was sent to inspect Site [DATA REDACTED], everything within a 30 meter radius of a strange energy orb was missing. Assumed to be a singularity, it eventually demagnetized and collapsed. Foundation personnel are still unsure as to the cause of the event.
+
+[Eyedrops|Eye Drops|ReVision Eyedrops|Anti-blink]
+color = 255,255,255
+alpha = 0.4
+sound = SFX\SCP\294\cough.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+message = The liquid tastes awful. Maybe it wasn't meant to be used orally.
+blink effect = 0.5
+blink effect timer = 200
+blur = 10
+stomachache = true
+
+[Fear|Scare|Horror|Terror]
+color = 0,0,0
+glow = true
+sound = SFX\Room\035Chamber\InProximity.ogg
+dispensesound = SFX\Horror\Horror3.ogg
+blur = 3
+deathtimer = 2
+deathmessage = Nine-Tailed Fox discovered the body of D-9341 near the cafeteria at Sector [REDACTED]. Tests concluded that the cause of death was cardiac arrest, presumably related to SCP-294.
+
+[Feces|Fecal matter|Shit|Crap|Poo|Poop|Dung|Scat|Turd|Bullshit|Horseshit|Diarrhea]
+color = 120,60,0
+refusemessage = Yeah, I'm not drinking that.
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Feces and Blood|Blood and Feces]
+color = 220,80,30
+refusemessage = The drink smells like SCP-173's containment chamber.
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Gin|Gin and Tonic|Gin & Tonic]
+color = 255, 255, 255
+alpha = 0.2
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = Gin has never tasted this good.
+sound = SFX\SCP\294\slurp.ogg
+
+[Glass]
+color = 255,0,0
+glow = true
+blur = 15
+deathtimer = 5
+sound = SFX\SCP\294\burn.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Gold]
+color = 255,200,15
+glow = true
+blur = 15
+sound = SFX\SCP\294\burn.ogg
+deathtimer = 5
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Grog]
+color = 207,120,39
+alpha = 0.7
+sound = SFX\SCP\294\slurp.ogg
+blur = 5
+message = It's been too long since you've had a good drink.
+
+[Happiness|Cheerfulness|Joy]
+color = 0,213,255
+alpha = 0.5
+glow = true
+message = An overwhelming sense of happiness takes you over. Your heart is pounding like crazy.
+sound = SFX\SCP\294\ahh.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+deathtimer = 10
+deathmessage = Nine-Tailed Fox discovered the body of D-9341 after the incident. The victim apparently had an abnormally large smile on his face. Further tests concluded that the cause of death was a heart attack, however the cause of the heart attack is still undetermined.
+
+[Heroin|Morphine]
+color = 255,255,255
+alpha = 0.5
+message = The liquid tastes awful.
+sound = SFX\SCP\294\cough.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+deathtimer = 30
+blurtimer = 30
+
+[Honey]
+color = 224,198,79
+alpha = 0.8
+sound = SFX\SCP\294\slurp.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+message = Mmm... Sweet.
+
+[Hot|Warm]
+color = 200,200,200
+alpha = 0.2
+message = The liquid stings your mouth, it is very hot.
+
+[Hot Tea|Tea|Green Tea|Black Tea|Yellow Tea]
+color = 137, 139, 65
+alpha = 0.8
+sound = SFX\SCP\294\Slurp.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = It's too hot!
+
+[Hydroflouric Acid|Hydrochloric Acid|Corrosive Acid]
+color = 200,200,200
+alpha = 0.2
+sound = SFX\SCP\294\burn.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+lethal = true
+deathmessage = D-9341 was found dead at Sector [REDACTED]. Autopsy reveals that severe acid burns are present within his digestive system, presumably related to SCP-294.
+
+[Ice Cream|Frozen Yoghurt]
+color = 255, 255, 179
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = It is vanilla flavoured ice cream of a perfectly smooth consistency.
+sound = SFX\SCP\294\slurp.ogg
+stamina effect = 0.5
+stamina effect timer = 10
+
+[Ink]
+color = 0,0,0
+message = You recoil from the powerful odor of the liquid.
+sound = SFX\SCP\294\cough.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+blur = 10
+
+[Insulin|NovoRapid|Novo Rapid|Glargine]
+color = 200,200,200
+message = It smells strong... but it tastes slightly of milk...
+dispensesound = SFX\SCP\294\dispense1.ogg
+sound = SFX\SCP\294\slurp.ogg
+alpha = 0.2
+blur = 10
+stomachache = true
+
+[Ipecac]
+color = 28, 0, 0
+alpha = 0.94
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = It tastes like tree sap, your stomach begins trembling soon after consumption.
+sound = SFX\SCP\294\ew1.ogg
+stomachache = true
+stamina effect = 1.5
+stamina effect timer = 20
+vomit = 20
+
+[Iron|Steel|Metal|Razor Blades|Razorblades]
+color = 255,100,30
+glow = true
+blur = 15
+lethal = true
+sound = SFX\SCP\294\burn.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Jewel of Fire|Lifeforce|The Jewel]
+color = 255, 0, 0
+glow = true
+dispensesound = SFX\SCP\294\dispense3.ogg
+message = An echoed voice shouts: "YOU MUST NOT! THE JEWEL HOLDS MY LIFEFORCE!!!"
+sound = SFX\SCP\294\burn.ogg
+deathtimer = 7
+blur = 100
+blood loss = 3
+stomachache = true
+
+[Jimmies|Rustling|Gorilla Munch]
+color = 242,239,27
+glow = true
+alpha = 0.3
+message = Shh, no tears, only dreams now. There is no need to be upset.
+dispensesound = SFX\SCP\294\dispense3.ogg
+sound = SFX\Ending\MenuBreath.ogg
+
+[Joe|Joseph|Cat|Dog|Intestines]
+color = 145,32,50
+alpha = 0.9
+message = The drink tastes like blood. It's still warm.
+sound = SFX\SCP\294\spit.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+
+[Jorge]
+color = 0, 0, 255
+alpha = 1.0
+glow = true
+dispensesound = SFX\SCP\294\dispense3.ogg
+message = You feel as though someone is expecting you.
+sound = SFX\SCP\970\thumbs.db
+blur = 2
+damage = -2
+blood loss = -2
+blink effect = 0.5
+blink effect timer = 30
+
+[Knowledge]
+color = 255,255,255
+alpha = 0.9
+glow = true
+message = I need SCP-079's help if I want to go through Gate B, or a distraction of some kind to go through Gate A.
+sound = SFX\SCP\294\slurp.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+
+[Lava|Magma|Earth|Rock|Rocks|Stone]
+color = 255,72,0
+alpha = 1.0
+glow = true
+sound = SFX\SCP\294\burn.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+message = The liquid disintegrates your insides almost instantly.
+lethal = true
+deathmessage = Subject D-9341 was found dead with the victim's organs and mouth cavity suffering numerous 4th degree burns and traces of molten igneous rock in the stomach. A polystyrene cup was also located next to the subject's body. Cause of death is most likely linked to [REDACTED].
+
+[Lemon|Lemon juice|Lemonade]
+color = 237, 229, 7
+alpha = 0.7
+sound = SFX\SCP\294\ahh.ogg
+dispensesound = SFX\SCP\294\Dispense1.ogg
+
+[Lemon fanta]
+color = 251, 253, 162
+alpha = 0.6
+sound = SFX\SCP\294\ahh.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = Take that! In one gulp, without breathing.
+
+[Life]
+color = 255,255,255
+alpha = 0.5
+blur = 10
+blood loss = -100
+damage = -10
+sound = SFX\SCP\294\ahh.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+message = The drink tastes unlike anything you've drink before. You feel better than ever.
+
+[Liquid Hydrogen|Hydrogen]
+color = 255,255,255
+alpha = 0.5
+blur = 10
+lethal = true
+sound = SFX\SCP\294\burn.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Liquid Nitrogen|Nitrogen]
+color = 255,255,255
+alpha = 0.5
+blur = 10
+lethal = true
+sound = SFX\SCP\294\burn.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Love]
+color = 255,100,100
+glow = true
+blur = 10
+lethal = true
+sound = SFX\SCP\294\ahh.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+
+[Mayo|Butter]
+color = 250,185,90
+alpha = 1.0
+sound = SFX\SCP\294\ew1.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+
+[Me|Myself|D-9431|D-9341]
+color = 200,0,0
+blur = 10
+sound = SFX\SCP\294\spit.ogg
+damage = 0.5
+blood loss = 50
+dispensesound = SFX\death2.ogg
+refusemessage = The liquid tastes like blood. It's still warm.
+
+[Memes|Meme|Maymays]
+color = 100,100,255
+blur = 10
+sound = SFX\SCP\294\ahh.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+refusemessage = Me gusta this drink xD le epic taste
+
+[Mercury|Quick Silver]
+color = 119,128,133
+blur = 50
+blood loss = 10
+stomach ache = true
+sound = SFX\SCP\294\cough.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = The drink is thick like cream, and burns your throat.
+
+[Microwave Casserole]
+color = 245,238,144
+refusemessage = Through a complex series of thoughts and inside events, you feel that this belongs to someone else.
+
+[Milk]
+color = 255,255,255
+sound = SFX\SCP\294\slurp.ogg
+
+[Molasses|Treacle|Black Treacle]
+color = 34, 0, 0
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = The flavour is tangy and sweet, but a little too much for your liking.
+sound = SFX\SCP\294\ew1.ogg
+blur = 1
+stamina effect = 0.4
+stamina effect timer = 10
+
+[Monkey Island Grog]
+color = 199,190,37
+alpha = 0.7
+glow = true
+sound = SFX\SCP\294\burn.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+blur = 8
+deathtimer = 8
+deathmessage = Subject D-9341 was found face down in a puddle of blood, upper digestive tract seemingly molten by corrosion. A cup with the message "The Styx is a river, not a sea, dumbass." printed on it was found near the corpse. Cause of death is without a doubt related to SCP-294.
+message = A pirate I was meant to be, trim the sails and roam the sea! Unfortunately, as you start feeling a terrible burning sensation in your throat and stomach, you realize you're actually not used to drinking such heavy stuff ...
+
+[Motor Oil|Oil]
+color = 0,0,0
+sound = SFX\SCP\294\cough.ogg
+blur = 10
+stomachache = true
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Mountain Dew]
+color = 234,252,163
+sound = SFX\SCP\294\slurp.ogg
+message = It's nice and cold.
+
+[Mucus]
+color = 102,204,0
+refusemessage = Why the hell would I want to drink this?
+
+[Mud|Clay]
+color = 120,60,0
+sound = SFX\SCP\294\cough.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Nausea]
+color = 59,92,32
+alpha = 0.6
+sound = SFX\SCP\294\ew2.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+message = Ugg... I don't feel so good...
+stomachache = true
+
+[Orange fanta|Orangina]
+color = 247, 174, 26
+alpha = 0.6
+sound = SFX\SCP\294\Slurp.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+lethal = false
+message = That tastes good...
+
+[Orange Juice|Orange]
+color = 240,175,70
+message = The drink tastes sweet and has quite a bit of pulp.
+sound = SFX\SCP\294\slurp.ogg
+
+[Pain|Agony]
+color = 0,0,0
+message = The drink tastes incredibly bitter. You feel a burning pain in your stomach.
+stomachache = true
+damage = 1.5
+sound = SFX\SCP\294\cough.ogg
+dispensersound = SFX\SCP\294\dispense3.ogg
+
+[Perfume|Deodorant|Shampoo|Cologne|Fragrance]
+color = 219,217,195
+alpha = 0.2
+dispensesound = SFX\SCP\294\dispense1.ogg
+refusemessage = While it does smell lovely, I'd rather wear it than drink it.
+
+[Pina Colada]
+color = 230,230,150
+alpha = 0.8
+sound = SFX\SCP\294\Slurp.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = Cold and sweet.
+
+[Plastic]
+color = 73, 23, 102
+damage = 1.0
+blur = 2
+sound = SFX\SCP\294\burn.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+message = The molten plastic burns your mouth.
+
+[Prune Juice]
+color = 73, 23, 102
+sound = SFX\SCP\294\slurp.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+
+[Purple Drank|Sizzurp|Lean|Codeine]
+color = 163,73,164
+alpha = 0.8
+refusemessage = The drink tastes like cough syrup.
+sound = SFX\SCP\294\ew1.ogg
+dispensersound = SFX\SCP\294\dispense2.ogg
+blur = 100
+
+[Pus]
+color = 245,245,149
+alpha = 1.0
+refusemessage = It smells like rancid egg salad. I think I'm going to puke!
+stomachache = true
+
+[Quarks|Glouns|Quark Gloun Plasma]
+color = 255,255,255
+dispensesound = SFX\Horror\Horror16.ogg
+explosion = true
+deathmessage = A large scorch mark measuring 30 meters in diameter with a glowing hot white crater was found in Sector [REDACTED]. Everything within a 10 meter radius appears to have completely disintegrated, save for a 5 meter radius surrounding SCP-294. Tests are being conducted to determine the cause of this anomaly, although it is presumably related to SCP-294.
+
+[Radioactive Element|Radioactive Material]
+color = 100,175,100
+glow = true
+sound = SFX\SCP\294\burn.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+lethal = true
+deathmessage = Subject D-9341 was found dead near SCP-294 holding what appears to be a cup of a molten radioactive element that is being identified by investigators. It appears that D-9341 ingested the material, judging by the severely burnt digestive organs and the radioactivity of the body.
+
+[Rage|Anger|Angry|Hate]
+color = 255,60,0
+alpha = 0.7
+message = Your blood boils with overwhelming hatred towards everything.
+lethal = true
+sound = SFX\Ending\GateB\Nuke2.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+deathmessage = Nine-Tailed Fox discovered the headless corpse of D-9341 among considerable amounts of blood, tissue and skull fragments. Medical staff cannot identify the cause of death, further tests are in progress.
+
+[Room-temperature Superconductor]
+color = 254,219,93
+alpha = 0.5
+message = The drink tastes like apple juice.
+sound = SFX\SCP\294\slurp.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+
+[Sadness|Unhappiness|Mourning|Grieving]
+color = 200,200,200
+alpha = 0.2
+message = The warm liquid has a salty after-taste, almost like tears.
+sound = SFX\SCP\294\slurp.ogg
+
+
+[SCP 294|SCP-294|294]
+color = 255, 255, 255
+alpha = 0.0
+dispensesound = SFX\SCP\294\dispense3.ogg
+refusemessage = On the side of the empty cup there are complex blueprints. They contain an untranslatable language and indecipherable diagrams.
+
+[Sea water|Saline water|Salt water]
+color = 200,200,200
+alpha = 0.2
+sound = SFX\SCP\294\cough.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = The extremely salty taste is almost unbearable. You begin to feel dehydrated and dizzy.
+stomachache = true
+blur = 4.0
+
+[Semen|Cum|Jizz|Man milk|Baby batter|Joy juice|Cock snot|Load|Man chowder|Wad|9gag]
+color = 240,240,240
+alpha = 0.9
+dispensesound = SFX\SCP\294\dispense2.ogg
+refusemessage = No way.
+
+[Smoothie]
+color = 176, 100, 136
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = It is a delicious blueberry and banana smoothie.
+sound = SFX\SCP\294\ahh.ogg
+stamina effect = 0.5
+stamina effect timer = 15
+
+[something that will destroy SCP-682|something that destroys SCP-682|something to destroy SCP-682]
+color = 255,255,255
+glow = true
+dispensesound = SFX\SCP\294\dispense3.ogg
+deathmessage = Recon teams sent in at [REDACTED] show that the entirety of Site-[REDACTED] was vaporized, save for a 5 meter radius of unharmed area in the facility cafeteria of Sector [REDACTED], surrounding SCP-294.
+explosion = true
+
+[Spinal Fluid|Brain Juice|Brain Fluid]
+color = 255, 255, 255
+alpha = 0.1
+dispensesound = SFX\SCP\294\dispense3.ogg
+message = It is mildly salty, tepid and watery. I shouldn't really be drinking this.
+sound = SFX\SCP\294\ew1.ogg
+
+[Spoiler|Spoilers|Spoiling]
+color = 100,100,255
+glow = true
+sound = SFX\Ending\GateB\EndingB3.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+message = You hear a voice inside your head.
+
+[Stew]
+color = 153, 123, 102
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = It is a scrumptious, warm and creamy mushroom stew
+sound = SFX\SCP\294\ahh.ogg
+blur = 10
+stamina effect = 0.5
+stamina effect timer = 20
+
+[Strawberry Juice]
+color = 255,50,50
+alpha = 0.8
+sound = SFX\SCP\294\Ahh.ogg
+message = So sweet.
+
+[Soup]
+color = 89,125,85
+message = The liquid tastes like the spinach soup you ate this morning.
+sound = SFX\SCP\294\slurp.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Speed|Velocity|Fastness|Sanic]
+color = 255,255,0
+alpha = 0.8
+glow = true
+blur = 15
+stamina effect = 0.0
+stamina effect timer = 15
+message = You feel really nervous.
+sound = SFX\SCP\294\slurp.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+
+[Stearin|Stearine]
+color = 200,200,200
+alpha = 0.9
+sound = SFX\SCP\294\burn.ogg
+blur = 2
+dispensesound = SFX\SCP\294\dispense2.ogg
+message = HOT HOT HOT
+
+[Strange Matter]
+color = 110,110,115
+glow = true
+sound = SFX\SCP\106\Decay1.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+lethal = true
+deathmessage = A portion of the facility was transformed into some form of grey colored goo-like substance before being demagnetized. Further analysis is being done.
+
+[Sulfuric Acid]
+color = 200,200,200
+alpha = 0.5
+sound = SFX\SCP\294\burn.ogg
+blur = 5
+deathtimer = 5
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Superfluid|Superfluid Helium|Helium|Helium-4|Liquid Helium]
+color = 255,255,255
+alpha = 0.2
+dispensesound = SFX\SCP\294\dispense3.ogg
+sound = SFX\SCP\294\burn.ogg
+lethal = true
+deathmessage = A dead body identified as D-9341 was discovered with a severely damaged throat and mouth cavity containing sharp icicles and traces of Helium-4. There are visible open wounds caused by Thermal Contraction located along the throat, and it would appear that the superfluid liquid passed right through the body, damaging any organs that it came in contact with.
+
+[Surprise|Surprise me|Shock|Shock me]
+color = 200,200,200
+alpha = 0.2
+sound = SFX\SCP\294\burn.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = The water burns your mouth instantly.
+blur = 2.0
+
+[Syrup|Golden Syrup|Maple Syrup]
+color = 117, 58, 0
+alpha = 0.5
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = While irresistibly sweet, you become overpowered by the sweetness to the point of nausea.
+sound = SFX\SCP\294\slurp.ogg
+blur = 7
+
+[Tachyons|Tachyonic Matter|Imaginary Matter|Neutrinos]
+color = 255,255,255
+dispensesound = SFX\Horror\Horror16.ogg
+explosion = true
+deathmessage = A beam of light was spotted emitting from Site [DATA REDACTED]. The origin was found to be from one of the site’s cafeterias housing SCP-294, which was left untouched by the vaporizing heat.
+
+[Tea|Ice Tea]
+color = 137, 139, 65
+alpha = 0.8
+sound = SFX\SCP\294\Slurp.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = It tastes like cold tea.
+
+[Tears|Tear|Saliva|Spit|Sweat]
+color = 255,255,255
+alpha = 0.2
+sound = SFX\SCP\294\Ew1.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Tequila]
+color = 230,230,150
+alpha = 0.2
+sound = SFX\SCP\294\Slurp.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = Could've used some lime and salt with that.
+
+[the best drink I've ever had|the best drink I've had]
+color = 235,165,40
+alpha = 0.8
+message = The drink tastes like a Vienna lager you drinked years ago.
+sound = SFX\SCP\294\ahh.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[the perfect drink|perfect drink|perfection]
+color = 179,120,211
+alpha = 0.8
+sound = SFX\SCP\294\ahh.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+lethal = true
+message = I can't take this anymore, everything at this point is just one big letdown.
+blur = 1000
+deathmessage = Subject D-9341's body was recovered with numerous self-inflicted injuries on the arms and [REDACTED].
+
+[Tropical juice|Tropical water]
+color = 255,128,0
+alpha = 0.7
+sound = SFX\SCP\294\ahh.ogg
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = The chilled orange beverage tastes like a combination of tropical fruits.
+
+[Tomato Juice]
+color = 204,0,0
+sound = SFX\SCP\294\slurp.ogg
+Message = Meh, it's ok. Never was a big fan of tomato juice though.
+
+[Urine|Piss|Pee|Jarate]
+color = 240,190,50
+alpha = 0.7
+refusemessage = I'm not drinking that.
+
+[Venom|Snake Venom]
+color = 230,212,23
+alpha = 0.8
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Vidya|v|4chan]
+color = 100,100,100
+alpha = 0.7
+sound = SFX\SCP\294\spit.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+message = The drink tastes awfully bitter.
+
+[Vinegar]
+color = 245,167,17
+alpha = 0.8
+blur = 10
+sound = SFX\SCP\294\cough.ogg
+dispensesound = SFX\SCP\294\dispense2.ogg
+
+[Vomit]
+color = 240,190,100
+refusemessage = I'm not drinking that.
+
+[Water|Mineral Water|Soda water]
+color = 200,200,200
+message = Well, that was refreshing.
+alpha = 0.2
+sound = SFX\SCP\294\slurp.ogg
+
+[Wax|Grease]
+color = 203,203,199
+message = The taste makes you feel ill.
+sound = SFX\SCP\294\ew2.ogg
+stomachache = true
+
+[Wine|Red Wine|Grape Wine]
+color = 145,32,50
+alpha = 0.9
+sound = SFX\SCP\294\slurp.ogg
+
+[Whisky|Whiskey|Scotch]
+color = 236,165,0
+alpha = 0.2
+sound = SFX\SCP\294\slurp.ogg
+
+[White Port and Lemon Juice|WPLJ]
+color = 239,228,176
+alpha = 0.8
+sound = SFX\SCP\294\ahh.ogg
+message = Please please please gimme some more
+
+[Yoghurt]
+color = 255, 128, 128
+dispensesound = SFX\SCP\294\dispense1.ogg
+message = It is a thick, mixed berry yoghurt with no solid bits.
+sound = SFX\SCP\294\slurp.ogg
+stamina effect = 0.5
+stamina effect timer = 10
+
+[420|Weed|Dope|Green Dragon]
+color = 54,177,30
+message = MAN DATS SOM GOOD ASS SHIT
+sound = SFX\Music\420J.ogg
+
+[Butt ghost|Liquid butt ghost]
+color = 0,0,0
+alpha = 1.0
+Sound = SFX\SCP\294\slurp.ogg
+dispensesound = SFX\SCP\294\dispense3.ogg
+message = Ouch, my ass is being eaten.
+blur = 10
+lethal = true
+deathmessage = Nine-Tailed Fox discovered the body of D-9341 near the cafeteria at Sector [REDACTED] without some pieces of [REDACTED]. The subject died of anomalous blood loss.
diff --git a/Data/achievementstrings.ini b/Data/achievementstrings.ini
new file mode 100644
index 0000000..56034af
--- /dev/null
+++ b/Data/achievementstrings.ini
@@ -0,0 +1,184 @@
+[s0]
+string1=Biohazard
+image=Achv008
+AchvDesc=Encountered the Zombie Plague.
+
+[s1]
+string1=Scribe
+image=Achv012
+AchvDesc=Encountered the Bad Composition.
+
+[s2]
+string1=Curtains Down
+image=Achv035
+AchvDesc=Encountered the Possessive Mask.
+
+[s3]
+string1=Doctor, Doctor
+image=Achv049
+AchvDesc=Found the cure
+
+[s4]
+string1=Anti-Meme
+image=Achv055
+AchvDesc=Recontained SCP-055
+
+[s5]
+string1=Deductive Reasoning
+image=Achv079
+AchvDesc=Encountered the Old AI.
+
+[s6]
+string1=Don't Look At Me
+image=Achv096
+AchvDesc=Encountered the Shy Guy.
+
+[s7]
+string1=A Decayed March
+image=Achv106
+AchvDesc=Encountered the Old Man.
+
+[s8]
+string1=Dirty Metal
+image=Achv148
+AchvDesc=Acquired the "Telekill Alloy".
+
+[s9]
+string1=Femme Fatale
+image=Achv205
+AchvDesc=Encountered the Shadow Lamps.
+
+[s10]
+string1=OUT OF RANGE
+image=Achv294
+AchvDesc=Obtained a liquid from the Coffee Machine.
+
+[s11]
+string1=The Corner of Your Eye...
+image=Achv372
+AchvDesc=Encountered the Peripheral Jumper.
+
+[s12]
+string1="Reggae, man."
+image=Achv420
+AchvDesc=Smoked some good ass shit.
+
+[s13]
+string1=Light of Life
+image=Achv427
+AchvDesc=Found and equipped the "Lovecraftian Locket".
+
+[s14]
+string1=A Taste of Immortality
+image=Achv500
+AchvDesc=Swallowed a sample of Panacea.
+
+[s15]
+string1=If You Ring It, He Will Come
+image=Achv513
+AchvDesc=Encountered an Old Cowbell.
+
+[s16]
+string1=Mental Exhaustion
+image=Achv714
+AchvDesc=Found a Jaded Ring.
+
+[s17]
+string1="by researcher james, age 11"
+image=Achv789
+AchvDesc=Encountered the Butt Ghost.
+
+[s18]
+string1=Blue Hue
+image=Achv860
+AchvDesc=Found a Blue Key.
+
+[s19]
+string1=Interference
+image=Achv895
+AchvDesc=Encountered an Old Coffin.
+
+[s20]
+string1=Refinery
+image=Achv914
+AchvDesc=Encountered the Clockworks Machine.
+
+[s21]
+string1=Show Yourself
+image=Achv939
+AchvDesc=Encountered the Creatures with Many Voices.
+
+[s22]
+string1=Rapid Eye Movement
+image=Achv966
+AchvDesc=Encountered the Sleep Killers.
+
+[s23]
+string1=Recursive Spacial Phenomenon
+image=Achv970
+AchvDesc=Encountered a Recursive Room.
+
+[s24]
+string1="Potential Bioweapon"
+image=Achv1025
+AchvDesc=Read the Encyclopedia of Common Diseases.
+
+[s25]
+string1=The Architect
+image=Achv1048
+AchvDesc=Encountered the Builder Bear.
+
+[s26]
+string1=The Final Solution
+image=Achv1123
+AchvDesc=Encountered the Atrocity Skull.
+
+[s27]
+string1=The Containment Breach
+image=AchvMaynard
+AchvDesc=Entered Doctor Maynard's office.
+
+[s28]
+string1=World-Ending Scenario
+image=AchvHarp
+AchvDesc=Entered Doctor Harp's office.
+
+[s29]
+string1=Technical Accomplishments
+image=AchvSNAV
+AchvDesc=Acquired the S-NAV Navigator Ultimate.
+
+[s30]
+string1=Unlimited Access
+image=AchvOmni
+AchvDesc=Acquired an Omni-level Keycard.
+
+[s31]
+string1=Fair Play
+image=AchvConsole
+AchvDesc=Didn't use console commands.
+
+[s32]
+string1=Shell Shocked
+image=AchvTesla
+AchvDesc=Lured the Old Man through a Tesla gate.
+
+[s33]
+string1=No Man's Land
+image=AchvPD
+AchvDesc=Escaped the Old Man's Pocket Dimension.
+
+[s34]
+string1=Pieces of the Past
+image=Achv1162
+AchvDesc=Encountered the Hole In The Wall.
+
+[s35]
+string1=Screams Of The Present
+image=Achv1499
+AchvDesc=Wore a GP-5 Gas Mask.
+
+[s36]
+string1=Survival In a Nightmare
+image=AchvKeter
+AchvDesc=Beat the game on Keter difficulty.
diff --git a/Data/events.ini b/Data/events.ini
new file mode 100644
index 0000000..b0f865d
--- /dev/null
+++ b/Data/events.ini
@@ -0,0 +1,304 @@
+[alarm]
+descr=The start event. Should always be present in all maps.
+room1=start
+
+[008]
+descr=The event in SCP-008's chamber where SCP-173 breaks the window. Should always be present in all maps.
+room1=008
+
+[914]
+descr=SCP-914's mechanism event. Required for SCP-914 to function.
+room1=914
+
+[coffin]
+descr=SCP-895's chamber event.
+room1=coffin
+
+[coffin106]
+descr=SCP-895's chamber event + SCP-106 spawn near the coffin.
+room1=coffin106
+
+[gateaentrance]
+descr=Gate A entrance event. Should always be present in all maps.
+room1=gateaentrance
+
+[exit1]
+descr=Gate B event. Should always be present in all maps.
+room1=exit1
+
+[endroom106]
+descr=An event where SCP-106 takes Janitor into the Pocket Dimension.
+room1=endroom
+
+[medibay]
+descr=Spawns an infected surgeon inside the room.
+room1=medibay
+
+[checkpoint]
+descr=CheckPoint room event.
+room1=checkpoint1
+room2=checkpoint2
+
+[lockroom173]
+descr=Spawns SCP-173 inside the room.
+room1=lockroom
+
+[lockroom096]
+descr=Spawns SCP-096 inside the room.
+room1=lockroom2
+
+[testroom]
+descr=Opens up the gas valves and plays a sound through the intercom once the player enters the lower level of the room.
+room1=testroom
+
+[tunnel2]
+descr=An event where the lights go out and SCP-173 spawns in front of the player.
+room1=tunnel2
+
+[tunnel2smoke]
+descr=Opens up the gas valves in the room.
+room1=tunnel2
+
+[096spawn]
+descr=Spawns SCP-096 inside the room.
+room1=tunnel2
+room2=room2pipes
+room3=room2pit
+room4=room3pit
+room5=room3tunnel
+room6=tunnel
+room7=room4tunnels
+room8=room4pit
+room9=room3z2
+
+[roompj]
+descr=Spawns SCP-372 once the player enters the room.
+room1=roompj
+
+[room012]
+descr=Required for SCP-012 to function.
+room1=room012
+
+[room035]
+descr=Spawns a scientist possessed by SCP-035 inside the room.
+room1=room035
+
+[room049]
+descr=Spawns SCP-049 and updates the levers and elevators within the room.
+room1=room049
+
+[room079]
+descr=Required for SCP-079 to interact with the player. Should be present in all maps.
+room1=room079
+
+[room106]
+descr=Required for SCP-106's recall protocol to function.
+room1=room106
+
+[room205]
+descr=Required for SCP-205 to function.
+room1=room205
+
+[room966]
+descr=Spawns multiple SCP-966 instances inside the room.
+room1=room966
+
+[room1123]
+descr=Required for SCP-1123 to function.
+room1=room1123
+
+[room2trick]
+descr=Secretly turns the player around by 180 degrees when they reach the middle of the hallway.
+room1=room2
+room2=room2_3
+
+[1048a]
+descr=Spawns SCP-1048-A inside the room.
+room1=room2
+room2=room2_2
+room3=room2_3
+
+[room2fan]
+descr=Activates the fan in the room.
+room1=room2_2
+
+[room2cafeteria]
+descr=Required for SCP-294 to function.
+room1=room2cafeteria
+
+[room2ccont]
+descr=Required for the levers inside the room to function. Should be present in all maps.
+room1=room2ccont
+
+[room2closets]
+descr=An event where a scientist and a janitor get killed by SCP-173.
+room1=room2closets
+
+[room2elevator]
+descr=An event where a guard enters the elevator in the room.
+room1=room2elevator
+
+[room2elevator2]
+descr=Spawns a dead janitor inside the room.
+room1=room2elevator
+
+[room2nuke]
+descr=Updates the levers inside the room. Should be present in all maps.
+room1=room2nuke
+
+[room2offices2]
+descr=Spawns an anomalous duck inside the room.
+room1=room2offices2
+
+[room2offices3]
+descr=An event where a door closes behind the player.
+room1=room2offices3
+
+[room2pipes106]
+descr=An event where SCP-106 appears from a wall.
+room1=room2pipes
+
+[room2pit]
+descr=Spawns SCP-173 inside the room.
+room1=room2pit
+room2=room2_4
+
+[room2pit106]
+descr=Spawns SCP-016 at the lower level of the room.
+room1=room2pit
+
+[room2poffices2]
+descr=Plays some sound effects when the player enters Dr L's office.
+room1=room2poffices2
+
+[room2servers]
+descr=An event where SCP-096 kills a guard.
+room1=room2servers
+
+[room2storage]
+descr=Required for the endless hallway to function.
+room1=room2storage
+
+[room2tesla]
+descr=Activates the tesla gate in the room.
+room1=room2tesla
+room2=room2tesla_lcz
+room3=room2tesla_hcz
+
+[testroom173]
+descr=An event where SCP-173 breaks through the window in the room.
+room1=room2testroom2
+
+[toiletguard]
+descr=An event where a guard commits suicide.
+room1=room2toilets
+
+[buttghost]
+descr=Spawns the butt ghost.
+room1=room2toilets
+
+[room2tunnel]
+descr=Generates and updates the maintenance tunnels.
+room1=room2tunnel
+
+[room2doors173]
+descr=Spawns SCP-173 inside the room.
+room1=room2doors
+
+[room3door]
+descr=Closes the doors behind the player.
+room1=room3
+room2=room3tunnel
+
+[room3servers]
+descr=Spawns SCP-173 inside the room.
+room1=room3servers
+room2=room3servers2
+
+[room3storage]
+descr=Spawns SCP-939 instances inside the room and updates the elevators.
+room1=room3storage
+
+[room3pitduck]
+descr=Spawns a saxophone-playing anomalous duck inside the room.
+room1=room3pit
+
+[room3pit1048]
+descr=An event where SCP-1048 hands over a drawing to the player.
+room1=room3pit
+
+[room3tunnel]
+descr=Eventroom3tunnel
+room1=room3tunnel
+
+[106victim]
+descr=Event where dead scientist falls down from the ceiling.
+room1=room3
+room2=room3_2
+
+[106sinkhole]
+descr=Spawns a sinkhole to the Pocket Dimension on the floor.
+room1=room3
+room2=room3_2
+room3=room4
+
+[room4]
+descr=May cause SCP-049 to appear on the walkway above the room.
+room1=room4
+
+[room860]
+descr=Required for the player to enter the forest.
+room1=room860
+
+[tunnel106]
+descr=Spawns SCP-106 inside the room.
+room1=tunnel
+
+[room4tunnels]
+descr=Spawns a dead body inside the room.
+room1=room4tunnels
+
+[room_gw]
+descr=Required for the airlock inside the room to be functional.
+room1=room2gw
+room2=room3gw
+
+[room2gw_b]
+descr=Spawns a guard inside the room.
+room1=room2gw_b
+
+[room1162]
+descr=Required for SCP-1162 to be functional.
+room1=room1162
+
+[room2scps2]
+descr=An event where Emily Ross gets captured by SCP-106.
+room1=room2scps2
+
+[room2sl]
+descr=Spawns SCP-049 inside the room.
+room1=room2sl
+
+[room2offices035]
+descr=Spawns the corpse of the possessed scientist inside the room after the player has released him from the containment chamber.
+room1=room2offices
+
+[medibay]
+descr=Spawns an SCP-008-1 instance inside the room.
+room1=medibay
+
+[room2shaft]
+descr=Spawns a dead guard inside the room.
+room1=room2shaft
+
+[room2pit106]
+descr=An event in which SCP-106 spawns at the bottom of the catwalk.
+room1=room2pit
+
+[room1archive]
+descr=Required for the entrance door to be functional.
+room1=room1archive
+
+[room1lifts]
+descr=Required for the elevator buttons to be clickable.
+room1=room1lifts
\ No newline at end of file
diff --git a/Data/materials.ini b/Data/materials.ini
new file mode 100644
index 0000000..2929670
--- /dev/null
+++ b/Data/materials.ini
@@ -0,0 +1,42 @@
+[tilefloor.jpg]
+bump = GFX\map\tilebump.jpg
+
+[whitewall.jpg]
+bump = GFX\map\whitewallbump.jpg
+
+[concretefloor.jpg]
+bump = GFX\map\concretefloorbump.jpg
+
+[metal3.jpg]
+bump = GFX\map\metal3bump.jpg
+stepsound = 1
+
+[vent.jpg]
+bump = GFX\map\ventbump.jpg
+
+[dirtymetal.jpg]
+bump = GFX\map\dirtymetalbump.jpg
+stepsound = 1
+
+[misc.jpg]
+bump = GFX\map\miscbump.jpg
+
+[rockmoss.jpg]
+bump = GFX\map\rockmossbump.jpg
+
+[metalpanels.jpg]
+bump = GFX\map\metalpanelsbump.jpg
+stepsound = 1
+
+[metalpanels2.jpg]
+bump = GFX\map\metalpanels2bump.jpg
+stepsound = 1
+
+[concretewall.jpg]
+bump = GFX\map\concretewallbump.jpg
+
+[scp1162.jpg]
+bump = GFX\map\scp1162bump.jpg
+
+[scp1162wall.jpg]
+bump = GFX\map\scp1162wallbump.jpg
\ No newline at end of file
diff --git a/Data/rooms.ini b/Data/rooms.ini
new file mode 100644
index 0000000..af91b1e
--- /dev/null
+++ b/Data/rooms.ini
@@ -0,0 +1,748 @@
+;=== STYLE ABBREVIATIONS ===
+;LCZ - Light Containment Zone
+;HCZ - Heavy Containment Zone
+;EZ - Entrance Zone
+;===========================
+
+[room ambience]
+ambience1 = SFX\Ambient\Room ambience\rumble.ogg
+ambience2 = SFX\Ambient\Room ambience\lowdrone.ogg
+ambience3 = SFX\Ambient\Room ambience\pulsing.ogg
+ambience4 = SFX\Ambient\Room ambience\ventilation.ogg
+ambience5 = SFX\Ambient\Room ambience\drip.ogg
+ambience6 = SFX\Alarm\Alarm.ogg
+ambience7 = SFX\Ambient\Room ambience\895.ogg
+ambience8 = SFX\Ambient\Room ambience\fuelpump.ogg
+ambience9 = SFX\Ambient\Room ambience\Fan.ogg
+ambience10 = SFX\Ambient\Room ambience\servers1.ogg
+
+;LIGHT CONTAINMENT ZONE ROOMS
+;============================
+[lockroom]
+descr=A timed airlock room, with two doors.
+mesh path=GFX\map\lockroom_opt.rmesh
+shape = 2C
+commonness = 30
+zone1=1
+zone2=3
+
+[173]
+descr=Class-D Cells & SCP-173's chamber in the intro. Placed automatically in all maps.
+mesh path=GFX\map\173bright_opt.rmesh
+shape = 1
+commonness = 0
+disabledecals = true
+
+[start]
+descr=SCP-173's chamber, after the breach. Placed automatically in all maps.
+mesh path=GFX\map\173_opt.rmesh
+shape = 1
+commonness = 0
+disabledecals = true
+
+[room1123]
+descr=SCP-1123's containment chamber.
+mesh path=GFX\map\1123_opt.rmesh
+shape = 2
+commonness = 0
+zone1=1
+disabledecals = true
+
+[room1archive]
+descr=An archive room, where various (random) items spawn on shelves.
+mesh path=GFX\map\room1archive_opt.rmesh
+shape = 1
+commonness = 80
+zone1=1
+
+[room2storage]
+descr=SCP-970's storage hallway.
+mesh path=GFX\map\room2storage_opt.rmesh
+shape = 2
+commonness = 0
+zone1=1
+disabledecals = true
+
+[room3storage]
+descr=SCP-939's storage area, with various roaming instances of 939.
+mesh path=GFX\map\room3storage_opt.rmesh
+shape = 3
+commonness = 0
+zone1=1
+disableoverlapcheck=true
+
+[room2tesla_lcz]
+descr=Hallway with a tesla gate. LCZ variant.
+mesh path=GFX\map\room2tesla_lcz_opt.rmesh
+shape = 2
+commonness = 100
+zone1=1
+
+[endroom]
+descr=Red-lit dead end room with a large, unopenable gate.
+mesh path=GFX\map\endroom_opt.rmesh
+shape = 1
+commonness = 100
+zone1=1
+zone3=3
+
+[room012]
+descr=SCP-012's containment chamber.
+mesh path=GFX\map\room012_opt.rmesh
+shape = 2
+commonness = 0
+zone1=1
+disabledecals = true
+
+[room205]
+descr=SCP-205's containment chamber.
+mesh path=GFX\map\room205_opt.rmesh
+shape = 1
+commonness = 0
+zone1=1
+large = true
+
+[room2]
+descr=An empty, two-door hallway.
+mesh path=GFX\map\room2_opt.rmesh
+shape = 2
+commonness = 45
+zone1=1
+
+[room2_2]
+descr=An empty, two-door hallway with a large fan/vent in the wall.
+mesh path=GFX\map\room2_2_opt.rmesh
+shape = 2
+commonness = 40
+zone1=1
+
+[room2_3]
+descr=A larger version of the two-door hallway, with lights in the floor.
+mesh path=GFX\map\room2_3_opt.rmesh
+shape = 2
+commonness = 35
+zone1=1
+
+[room2_4]
+descr=A two-door hallway, with a unopenable door off to the side.
+mesh path=GFX\map\room2_4_opt.rmesh
+shape=2
+commonness = 30
+zone1=1
+
+[room2_5]
+descr=A two-door hallway, with lowered ceilings.
+mesh path=GFX\map\room2_5_opt.rmesh
+shape=2
+commonness = 35
+zone1=1
+
+[room2C]
+descr=An empty, plain corner room.
+mesh path=GFX\map\room2C_opt.rmesh
+shape = 2C
+commonness = 40
+zone1=1
+
+[room2c2]
+descr=A corner room, with more of a LCZ style.
+mesh path=GFX\map\room2c2_opt.rmesh
+shape = 2C
+commonness = 30
+zone1=1
+
+[room2closets]
+descr=A storage hallway, where SCP-173 kills two NPCs. The Gas Mask & Batteries spawn here.
+mesh path=GFX\map\room2closets_opt.rmesh
+shape = 2
+commonness = 0
+zone1=1
+disabledecals = true
+large = true
+
+[room2elevator]
+descr=A two-door hallway, with an elevator off to the side.
+mesh path=GFX\map\room2elevator_opt.rmesh
+shape = 2
+commonness = 20
+zone1=1
+
+[room2doors]
+descr=Red-lit airlock room, in the shape of a T.
+mesh path=GFX\map\room2doors_opt.rmesh
+shape = 2
+commonness = 30
+zone1=1
+
+[room2scps]
+descr=SCP-714's, SCP-860's, & SCP-1025's two-door hallway.
+mesh path=GFX\map\room2scps_opt.rmesh
+shape = 2
+commonness = 0
+zone1=1
+
+[room860]
+descr=SCP-860-1's containment chamber. Can't be traversed without SCP-860.
+mesh path=GFX\map\room860_opt.rmesh
+shape = 2
+commonness = 0
+
+[room2testroom2]
+descr=Two-door hallway with a small testing room, where SCP-173 shatters the testroom's window.
+mesh path=GFX\map\room2testroom2_opt.rmesh
+shape = 2
+commonness = 0
+zone1=1
+
+[room3]
+descr=Three-door hallway, with a caged off portion in the back wall.
+mesh path=GFX\map\room3_opt.rmesh
+shape = 3
+commonness = 100
+zone1=1
+
+[room3_2]
+descr=A three-door hallway, without the caged portion.
+mesh path=GFX\map\room3_2_opt.rmesh
+shape = 3
+commonness = 100
+zone1=1
+
+[room4]
+descr=A four-door hallway, with a metal walkway hanging above.
+mesh path=GFX\map\room4_opt.rmesh
+shape = 4
+commonness = 100
+zone1=1
+
+[room4_2]
+descr=A varient of the four-door hallway, without the metal walkway.
+mesh path=GFX\map\room4_2_opt.rmesh
+shape=4
+commonness = 80
+zone1=1
+
+[roompj]
+descr=SCP-372's containment chamber.
+mesh path=GFX\map\roompj_opt.rmesh
+shape = 1
+commonness = 0
+disabledecals = true
+zone1=1
+
+[914]
+descr=SCP-914's containment chamber.
+mesh path=GFX\map\machineroom_opt.rmesh
+shape = 1
+commonness = 0
+zone1=1
+
+[room2gw]
+descr=A two-door contamination airlock.
+mesh path=GFX\map\room2gw_opt.rmesh
+shape=2
+commonness = 10
+zone1=1
+
+[room2gw_b]
+descr=Broken varient of the two-door contamination airlock.
+mesh path=GFX\map\room2gw_b_opt.rmesh
+shape=2
+commonness = 0
+zone1=1
+
+[room1162]
+descr=SCP-1162's containment chamber, in a corner room.
+mesh path=GFX\map\room1162_opt.rmesh
+shape=2c
+commonness = 0
+zone1=1
+
+[room2scps2]
+descr=SCP-1499 & SCP-500's containment chambers, in a two-door hallway.
+mesh path=GFX\map\room2scps2_opt.rmesh
+shape=2
+commonness = 0
+zone1=1
+
+[room2sl]
+descr=The surveillance room in the LCZ. Required for passing into HCZ, if used.
+mesh path=GFX\map\room2sl_opt.rmesh
+shape=2
+commonness = 0
+zone1=1
+large = true
+
+[lockroom3]
+descr=A varient of the timed lockroom, where a seperate path is opened. The airlock itself is broken.
+mesh path=GFX\map\lockroom3_opt.rmesh
+shape=2c
+commonness = 15
+zone1=1
+
+[room4info]
+descr=A 4-way hallway containing an info center.
+mesh path=GFX\map\room4info_opt.rmesh
+shape=4
+commonness = 0
+zone1=1
+
+[room3_3]
+descr=Another variant of a three-door hallway.
+mesh path=GFX\map\room3_3_opt.rmesh
+shape=3
+commonness = 20
+zone1=1
+
+[checkpoint1]
+descr=The keycarded checkpoint between the LCZ and HCZ.
+mesh path=GFX\map\checkpoint1_opt.rmesh
+shape = 2
+commonness = 0
+
+;HEAVY CONTAINMENT ZONE ROOMS
+;============================
+[008]
+descr=SCP-008's containment chamber.
+mesh path=GFX\map\008_opt.rmesh
+shape = 1
+commonness = 0
+disabledecals = true
+zone1=2
+
+[room035]
+descr=SCP-035's containment chamber.
+mesh path=GFX\map\room035_opt.rmesh
+shape = 1
+commonness = 0
+zone1=2
+
+[room049]
+descr=SCP-049's containment chamber.
+mesh path=GFX\map\room049_opt.rmesh
+shape = 2
+commonness = 0
+disabledecals = true
+walksound=1
+zone1=2
+usevolumelighting = 1
+disableoverlapcheck=true
+
+[room106]
+descr=SCP-106's containment chamber.
+mesh path=GFX\map\room106_opt.rmesh
+shape = 1
+commonness = 0
+disabledecals = true
+zone1=2
+large = true
+
+[room513]
+descr=SCP-513's containment chamber.
+mesh path=GFX\map\room513_opt.rmesh
+shape = 3
+commonness = 0
+zone1=2
+usevolumelighting = 1
+
+[coffin]
+descr=SCP-895's containment chamber.
+mesh path=GFX\map\coffin_opt.rmesh
+shape = 1
+commonness = 0
+disabledecals = true
+walksound=1
+zone1=2
+
+[room966]
+descr=SCP-966's containment chamber.
+mesh path=GFX\map\room966_opt.rmesh
+shape = 3
+commonness = 0
+zone1=2
+usevolumelighting = 1
+disableoverlapcheck=true
+
+[endroom2]
+descr=A small, red-lit, HCZ-styled endroom.
+mesh path=GFX\map\endroom2_opt.rmesh
+shape = 1
+commonness = 100
+zone1=2
+
+[testroom]
+descr=A large testroom, where SCP-682's document can be found.
+mesh path=GFX\map\testroom_opt.rmesh
+shape = 2
+commonness = 0
+walksound = 1
+disabledecals = true
+zone1=2
+
+[tunnel]
+descr=A two-door hallway, in the shape of a tunnel.
+mesh path=GFX\map\tunnel_opt.rmesh
+shape = 2
+commonness = 100
+walksound=1
+zone1=2
+usevolumelighting = 1
+
+[tunnel2]
+descr=A varient of the tunnel hallway, with a fuse box off to the side where SCP-173 spawns.
+mesh path=GFX\map\tunnel2_opt.rmesh
+shape = 2
+commonness = 70
+walksound=1
+zone1=2
+usevolumelighting = 1
+
+[room2Ctunnel]
+descr=A HCZ-styled corner room.
+mesh path=GFX\map\room2Ctunnel_opt.rmesh
+shape = 2C
+commonness = 40
+walksound=1
+zone1=2
+usevolumelighting = 1
+
+[room2nuke]
+descr=A two-door hallway, with a room on the side which leads to the Omega & Alpha warheads.
+mesh path=GFX\map\room2nuke_opt.rmesh
+shape = 2
+commonness = 0
+zone1=2
+large = true
+
+[room2pipes]
+descr=A two-door hallway, with caged floors and ceiling that contain various pipes. SCP-106 can appear out of the walls.
+mesh path=GFX\map\room2pipes_opt.rmesh
+shape = 2
+commonness = 50
+disabledecals = true
+walksound=1
+zone1=2
+
+[room2pit]
+descr=A two-door catwalk, where the catwalk spews gas.
+mesh path=GFX\map\room2pit_opt.rmesh
+shape = 2
+commonness = 75
+disabledecals = true
+walksound=1
+zone1=2
+
+[room3pit]
+descr=A three-door walkway, with a large box-like structure in the back wall.
+mesh path=GFX\map\room3pit_opt.rmesh
+shape = 3
+commonness = 100
+disabledecals = true
+walksound=1
+zone1=2
+
+[room4pit]
+descr=A four-door walkway, with a large cube-like stucture in the middle of the room.
+mesh path=GFX\map\room4pit_opt.rmesh
+shape=4
+commonness = 100
+zone1=2
+
+[room2servers]
+descr=SCP-096's spawn area, where 096 kills a guard.
+mesh path=GFX\map\room2servers_opt.rmesh
+shape = 2
+commonness = 0
+walksound=1
+zone1=2
+large = true
+
+[room2shaft]
+descr=A two-door hallway, which has a non-functional elevator and the maintenance shaft.
+mesh path=GFX\map\room2shaft_opt.rmesh
+shape = 2
+commonness = 0
+disabledecals = true
+
+[room2tunnel]
+descr=A closed gate, and elevators leading to the maintenance tunnels. Gate can be opened if SCP-372's chamber is in the map for the code.
+mesh path=GFX\map\room2tunnel_opt.rmesh
+shape = 2
+commonness = 0
+disabledecals = true
+walksound=1
+zone1=2
+
+[room3tunnel]
+descr=A three-door hallway, shaped after tunnels.
+mesh path=GFX\map\room3tunnel_opt.rmesh
+shape = 3
+commonness = 100
+walksound=1
+zone1=2
+usevolumelighting = 1
+
+[room4tunnels]
+descr=A four-door hallway, shaped after tunnels.
+mesh path=GFX\map\4tunnels_opt.rmesh
+shape = 4
+commonness = 100
+walksound=1
+zone1=2
+usevolumelighting = 1
+
+[room2tesla_hcz]
+descr=Hallway with a tesla gate. HCZ variant.
+mesh path=GFX\map\room2tesla_hcz_opt.rmesh
+shape = 2
+commonness = 100
+zone1=2
+
+[room3z2]
+descr=A T-shaped, three-door hallway.
+mesh path=GFX\map\room3z2_opt.rmesh
+shape=3
+commonness = 100
+zone1=2
+
+[room2cpit]
+descr=A corner room, with a large cube-like stucture in the middle of the room.
+mesh path=GFX\map\room2cpit_opt.rmesh
+shape=2c
+commonness = 0
+disabledecals = true
+zone1=2
+
+[room2pipes2]
+descr=Another variant of the two-door hallway, with caged floors and ceiling that contain various pipes.
+mesh path=GFX\map\room2pipes2_opt.rmesh
+shape = 2
+commonness = 70
+disabledecals = true
+zone1=2
+
+[checkpoint2]
+descr=The keycarded checkpoint which leads from the HCZ to the EZ.
+mesh path=GFX\map\checkpoint2_opt.rmesh
+shape = 2
+commonness = 0
+
+;ENTRANCE ZONE ROOMS
+;============================
+[room079]
+descr=SCP-079's containment chamber.
+mesh path=GFX\map\room079_opt.rmesh
+shape = 1
+commonness = 0
+disabledecals = true
+zone1=3
+large = true
+
+[lockroom2]
+descr=The open-doored lockroom, with SCP-096 sitting in the middle.
+mesh path=GFX\map\lockroom2_opt.rmesh
+shape = 2C
+commonness = 0
+zone1=3
+
+[exit1]
+descr=The entrance room to Gate B, with an elevator to the surface of Gate B.
+mesh path=GFX\map\exit1_opt.rmesh
+shape = 1
+commonness = 0
+zone1=3
+disableoverlapcheck=true
+
+[gateaentrance]
+descr=The room with the elevator to Gate A.
+mesh path=GFX\map\gateaentrance_opt.rmesh
+shape = 1
+commonness = 0
+zone1=3
+
+[gatea]
+descr=The surface of Gate A. Placed automatically in every map.
+mesh path=GFX\map\gatea_opt.rmesh
+shape = 1
+commonness = 0
+disableoverlapcheck=true
+
+[medibay]
+descr=A two-door hallway, leading to the medical bay. Contains a zombie.
+mesh path=GFX\map\medibay_opt.rmesh
+shape = 2
+commonness = 0
+zone1=3
+
+[room2z3]
+descr=An office-styled two-door hallway.
+mesh path=GFX\map\room2z3_opt.rmesh
+shape = 2
+commonness = 75
+zone1=3
+
+[room2cafeteria]
+descr=A two-doored walkway, with stairs leading to the cafeteria.
+mesh path=GFX\map\room2cafeteria_opt.rmesh
+shape = 2
+commonness = 0
+zone1=3
+large = true
+disabledecals = true
+
+[room2Cz3]
+descr=A corner room, with two benches against the walls.
+mesh path=GFX\map\room2Cz3_opt.rmesh
+shape = 2C
+commonness = 100
+zone1=3
+
+[room2ccont]
+descr=A corner room, which has the electrical center. Required to finish the game.
+mesh path=GFX\map\room2ccont_opt.rmesh
+shape = 2C
+commonness = 0
+zone1=3
+large = true
+
+[room2offices]
+descr=A small, plain office room with various deks.
+mesh path=GFX\map\room2offices_opt.rmesh
+shape = 2
+commonness = 30
+zone1=3
+
+[room2offices2]
+descr=An office room with stairs that extends downwards.
+mesh path=GFX\map\room2offices2_opt.rmesh
+shape = 2
+disabledecals=true
+commonness = 20
+zone1=3
+
+[room2offices3]
+descr=A large office with a second floor, and two seperate rooms.
+mesh path=GFX\map\room2offices3_opt.rmesh
+shape = 2
+commonness = 20
+zone1=3
+
+[room2offices4]
+descr=A varient of the offices.
+mesh path=GFX\map\room2offices4_opt.rmesh
+shape=2
+commonness = 0
+zone1=3
+
+[room2poffices]
+descr=A two-door hallway with three labeled offices (Harp, Maynard, & Gears).
+mesh path=GFX\map\room2poffices_opt.rmesh
+shape = 2
+commonness = 0
+zone1=3
+
+[room2poffices2]
+descr=A smaller hallway, with two doors leading to Dr. L's office and the conference rooms.
+mesh path=GFX\map\room2poffices2_opt.rmesh
+shape = 2
+commonness = 0
+zone1=3
+
+[room2sroom]
+descr=A two-door hallway with an office containing SCP-420-J
+mesh path=GFX\map\room2sroom_opt.rmesh
+shape = 2
+commonness = 0
+zone1=3
+
+[room2toilets]
+descr=Hallway containing SCP-789-J.
+mesh path=GFX\map\room2toilets_opt.rmesh
+shape = 2
+commonness = 30
+zone1=3
+
+[room2tesla]
+descr=Hallway with a tesla gate. EZ variant.
+mesh path=GFX\map\room2tesla_opt.rmesh
+shape = 2
+commonness = 100
+zone1=3
+
+[room3servers]
+descr=A maze of re-arranced servers, where SCP-173 spawns.
+mesh path=GFX\map\room3servers_opt.rmesh
+shape = 3
+commonness = 0
+disabledecals = true
+zone1=3
+
+[room3servers2]
+descr=Another variant of the server room, with a longer catwalk.
+mesh path=GFX\map\room3servers2_opt.rmesh
+shape = 3
+commonness = 0
+disabledecals = true
+zone1=3
+
+[room3z3]
+descr=A three-door hallway.
+mesh path=GFX\map\room3z3_opt.rmesh
+shape = 3
+commonness = 100
+zone1=3
+
+[room4z3]
+descr=A 4-door hallway.
+mesh path=GFX\map\room4z3_opt.rmesh
+shape = 4
+commonness = 100
+zone1=3
+
+[room1lifts]
+descr=A dead-end room with two elevators.
+mesh path=GFX\map\room1lifts_opt.rmesh
+shape=1
+commonness = 0
+zone1=3
+
+[room3gw]
+descr=An alternate, EZ-styled, broken contamination airlock.
+mesh path=GFX\map\room3gw_opt.rmesh
+shape=3
+commonness = 10
+zone1=3
+
+[room2servers2]
+descr=A server room dedicated to keep the Site-COMmunications up and running (no real value).
+mesh path=GFX\map\room2servers2_opt.rmesh
+shape=2
+commonness = 0
+zone1=3
+
+[room3offices]
+descr=A office room with three exits.
+mesh path=GFX\map\room3offices_opt.rmesh
+shape=3
+commonness = 0
+zone1=3
+
+[room2z3_2]
+descr=A varient of the two-door hallway.
+mesh path=GFX\map\room2z3_2_opt.rmesh
+shape=2
+commonness = 25
+zone1=3
+
+[pocketdimension]
+descr=SCP-106's pocket dimension. Placed automatically in all maps.
+mesh path=GFX\map\pocketdimension1_opt.rmesh
+shape = 1
+commonness = 0
+
+[dimension1499]
+descr=SCP-1499's dimension. Placed automatically in all maps.
+mesh path=GFX\map\dimension1499\1499object0_opt.rmesh
+shape=1
+commonness = 0
+disabledecals = true
diff --git a/a0.png b/a0.png
new file mode 100644
index 0000000..e72b773
Binary files /dev/null and b/a0.png differ
diff --git a/icon.svg.import b/a0.png.import
similarity index 62%
rename from icon.svg.import
rename to a0.png.import
index c6fa7a9..e820a2a 100644
--- a/icon.svg.import
+++ b/a0.png.import
@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://bnnxby4bprtmh"
-path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
+uid="uid://6fdmme6l7m0p"
+path="res://.godot/imported/a0.png-554458861febe5afb9c5b407bd9aeeca.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://icon.svg"
-dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
+source_file="res://a0.png"
+dest_files=["res://.godot/imported/a0.png-554458861febe5afb9c5b407bd9aeeca.ctex"]
[params]
@@ -32,6 +32,3 @@ process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
diff --git a/icon.png b/icon.png
new file mode 100644
index 0000000..8d2097e
Binary files /dev/null and b/icon.png differ
diff --git a/icon.png.import b/icon.png.import
new file mode 100644
index 0000000..d4d52ac
--- /dev/null
+++ b/icon.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://gsytawkst1eg"
+path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.png"
+dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/icon.svg b/icon.svg
deleted file mode 100644
index 9d8b7fa..0000000
--- a/icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/logo.ico b/logo.ico
new file mode 100644
index 0000000..99d177d
Binary files /dev/null and b/logo.ico differ
diff --git a/missing.png b/missing.png
new file mode 100644
index 0000000..6550a74
Binary files /dev/null and b/missing.png differ
diff --git a/missing.png.import b/missing.png.import
new file mode 100644
index 0000000..5f566eb
--- /dev/null
+++ b/missing.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://di000dlo382w"
+path="res://.godot/imported/missing.png-6de6bfc1abaa77bc165d73c8af33c288.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://missing.png"
+dest_files=["res://.godot/imported/missing.png-6de6bfc1abaa77bc165d73c8af33c288.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/project.godot b/project.godot
index cdc062e..bbf7fdb 100644
--- a/project.godot
+++ b/project.godot
@@ -13,7 +13,10 @@ config_version=5
config/name="SCPCB"
run/main_scene="res://scenes/screens/Startup.tscn"
config/features=PackedStringArray("4.3", "GL Compatibility")
-config/icon="res://icon.svg"
+run/max_fps=240
+boot_splash/bg_color=Color(0, 0, 0, 1)
+boot_splash/show_image=false
+config/icon="res://icon.png"
[autoload]
@@ -21,6 +24,11 @@ Global="*res://src/Global.gd"
Options="*res://src/Options.gd"
DebugMenu="*res://addons/debug_menu/debug_menu.tscn"
+[display]
+
+window/size/viewport_width=640
+window/size/viewport_height=480
+
[editor_plugins]
enabled=PackedStringArray("res://addons/debug_menu/plugin.cfg")
@@ -73,3 +81,4 @@ player_blink={
renderer/rendering_method="gl_compatibility"
renderer/rendering_method.mobile="gl_compatibility"
environment/defaults/default_clear_color=Color(0, 0, 0, 1)
+occlusion_culling/use_occlusion_culling=true
diff --git a/scenes/gui/LauncherResButton.tscn b/scenes/gui/LauncherResButton.tscn
new file mode 100644
index 0000000..ee4643b
--- /dev/null
+++ b/scenes/gui/LauncherResButton.tscn
@@ -0,0 +1,9 @@
+[gd_scene format=3 uid="uid://bdqtosfjpsvyl"]
+
+[node name="LauncherResButton" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
diff --git a/scenes/screens/GameStartup.tscn b/scenes/screens/GameStartup.tscn
new file mode 100644
index 0000000..e05c745
--- /dev/null
+++ b/scenes/screens/GameStartup.tscn
@@ -0,0 +1,12 @@
+[gd_scene load_steps=2 format=3 uid="uid://dl3obcg0k5dux"]
+
+[ext_resource type="Script" path="res://src/GameStartup.gd" id="1_4np6w"]
+
+[node name="GameStartup" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_4np6w")
diff --git a/scenes/screens/Launcher.tscn b/scenes/screens/Launcher.tscn
new file mode 100644
index 0000000..aeec365
--- /dev/null
+++ b/scenes/screens/Launcher.tscn
@@ -0,0 +1,29 @@
+[gd_scene load_steps=4 format=3 uid="uid://dc8jcyubx5hv7"]
+
+[ext_resource type="Script" path="res://src/Launcher.gd" id="1_cf26g"]
+[ext_resource type="Texture2D" uid="uid://d3sh54nbyqqiu" path="res://GFX/menu/launcher.jpg" id="2_6ldjf"]
+[ext_resource type="PackedScene" uid="uid://5ktmpg8aurb7" path="res://scenes/gui/Button.tscn" id="3_nah2s"]
+
+[node name="Launcher" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_cf26g")
+
+[node name="BG" type="TextureRect" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("2_6ldjf")
+
+[node name="Button" parent="." instance=ExtResource("3_nah2s")]
+offset_left = 267.0
+offset_top = 255.0
+offset_right = 417.0
+offset_bottom = 305.0
diff --git a/scenes/screens/LoadingScreen.tscn b/scenes/screens/LoadingScreen.tscn
new file mode 100644
index 0000000..c8d4d08
--- /dev/null
+++ b/scenes/screens/LoadingScreen.tscn
@@ -0,0 +1,9 @@
+[gd_scene format=3 uid="uid://ctajpl2bdscko"]
+
+[node name="LoadingScreen" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
diff --git a/scenes/screens/UpdateChecker.tscn b/scenes/screens/UpdateChecker.tscn
new file mode 100644
index 0000000..424a93c
--- /dev/null
+++ b/scenes/screens/UpdateChecker.tscn
@@ -0,0 +1,35 @@
+[gd_scene load_steps=3 format=3 uid="uid://cn6hlgepkjxef"]
+
+[ext_resource type="Script" path="res://src/UpdateChecker.gd" id="1_nqadt"]
+[ext_resource type="FontFile" uid="uid://xe31montgcoo" path="res://GFX/font/cour/Courier New.ttf" id="1_qoah1"]
+
+[node name="UpdateChecker" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_nqadt")
+
+[node name="HTTPRequest" type="HTTPRequest" parent="."]
+
+[node name="Text" type="Label" parent="."]
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -111.0
+offset_top = -11.5
+offset_right = 111.0
+offset_bottom = 11.5
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_fonts/font = ExtResource("1_qoah1")
+text = "Checking for updates..."
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[connection signal="request_completed" from="HTTPRequest" to="." method="_on_http_request_request_completed"]
diff --git a/src/DynamicMap.gd b/src/DynamicMap.gd
index 92b9516..179fabd 100644
--- a/src/DynamicMap.gd
+++ b/src/DynamicMap.gd
@@ -1,10 +1,23 @@
extends Node3D
-# Called when the node enters the scene tree for the first time.
-func _ready() -> void:
- #RMesh.LoadRMesh(self, "GFX\\map\\machineroom_opt.rmesh")
- B3D.Load("GFX\\npcs\\106_2.b3d")
+var usableRooms = Dictionary()
-# Called every frame. 'delta' is the elapsed time since the previous frame.
-func _process(delta: float) -> void:
- pass
+func _ready() -> void:
+ #RMesh.LoadRMesh(self, "GFX\\map\\gatea_opt.rmesh")
+ #B3D.Load("GFX\\npcs\\106_2.b3d")
+ var rooms = INI.Load("res://Data/rooms.ini")
+ for room in rooms:
+ if room == "loose":
+ continue
+
+ if room == "room ambience":
+ continue
+
+ var roomInfo = rooms[room]
+ if not roomInfo.has("mesh path"):
+ print(room, roomInfo)
+ continue
+ usableRooms.get_or_add(room, roomInfo)
+ #RMesh.LoadRMesh(self, roomInfo["mesh path"])
+
+
diff --git a/src/GameStartup.gd b/src/GameStartup.gd
new file mode 100644
index 0000000..bed5e5a
--- /dev/null
+++ b/src/GameStartup.gd
@@ -0,0 +1,11 @@
+extends Control
+
+var skipIntro = false
+
+func _ready() -> void:
+ DisplayServer.window_set_title(str("SCP - Containment Breach v", Global.GAME_VERSION))
+ if skipIntro:
+ get_tree().change_scene_to_file("res://scenes/screens/MainMenu.tscn")
+ else:
+ Global.videoToPlay = "res://GFX/menu/startup_Undertow.avi"
+ get_tree().change_scene_to_file("res://scenes/screens/IntroVideo.tscn")
diff --git a/src/Global.gd b/src/Global.gd
index 977afd8..592bc14 100644
--- a/src/Global.gd
+++ b/src/Global.gd
@@ -1,8 +1,11 @@
extends Node
+var GAME_VERSION = "1.3.11"
+
var menuScale: float
var displaySize: Vector2
var textureCache: Dictionary
+var audioCache: Dictionary
var videoToPlay: String
var clickSound: AudioStreamPlayer
@@ -14,15 +17,39 @@ func GetTextureFromCache(name:String):
return textureCache.get(fixedName)
return null
-func LoadTexture(name:String):
+var TRANSPARENT_TEXTURE = load("res://a0.png")
+var MISSING_TEXTURE = load("res://missing.png")
+
+func LoadTexture(name: String):
var fixedName = name.replace("\\", "/")
- return textureCache.get_or_add(fixedName, load(str("res://", fixedName)))
+ var fileName = Utils.GetCaseiFileName(str("res://", fixedName))
+ if fileName == null:
+ return MISSING_TEXTURE
+ elif fileName.contains(""):
+ return TRANSPARENT_TEXTURE
+
+ return textureCache.get_or_add(fixedName, load(fileName))
+
+func GetTextureSafe(name: String):
+ var fixedName = name.replace("\\", "/")
+ if textureCache.has(fixedName):
+ return textureCache.get(fixedName)
+ else:
+ return LoadTexture(name)
+
+func LoadAudio(name: String):
+ var fixedName = name.replace("\\", "/")
+ return audioCache.get_or_add(fixedName, load(str("res://", fixedName)))
func _ready():
clickSound = AudioStreamPlayer.new()
- clickSound.stream = load("res://SFX/Interact/Button.ogg")
+ clickSound.stream = LoadAudio("SFX/Interact/Button.ogg")
clickSound.max_polyphony = 5
add_child(clickSound)
+ Input.set_custom_mouse_cursor(Utils.KeyBackground(LoadTexture("GFX/cursor.PNG"), Color(0, 0, 0, 1)))
+
+ LoadTexture("GFX/BlinkMeter.jpg")
+
func _process(delta):
FPSfactor = delta
diff --git a/src/IntroVideo.gd b/src/IntroVideo.gd
index 6adb18f..6ca7031 100644
--- a/src/IntroVideo.gd
+++ b/src/IntroVideo.gd
@@ -7,6 +7,9 @@ func _ready() -> void:
$AspectRatioContainer/VideoStreamPlayer.play()
$AudioStreamPlayer.play()
+func _process(delta: float) -> void:
+ if Input.is_action_just_pressed("ui_accept"):
+ _on_video_stream_player_finished()
func _on_video_stream_player_finished() -> void:
if Global.videoToPlay == "res://GFX/menu/startup_TSS.avi":
diff --git a/src/Launcher.gd b/src/Launcher.gd
new file mode 100644
index 0000000..ae43f32
--- /dev/null
+++ b/src/Launcher.gd
@@ -0,0 +1,10 @@
+extends Control
+
+# Called when the node enters the scene tree for the first time.
+func _ready() -> void:
+ DisplayServer.window_set_title("SCP - Containment Breach Launcher")
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta: float) -> void:
+ pass
diff --git a/src/MainMenu.gd b/src/MainMenu.gd
index 8dfc080..368f5f2 100644
--- a/src/MainMenu.gd
+++ b/src/MainMenu.gd
@@ -24,7 +24,7 @@ func newGame():
print("clicked new game")
func quitGame():
- get_tree().quit()
+ get_tree().quit.call_deferred()
var jankyCounter = 0
func _process(delta: float) -> void:
diff --git a/src/Startup.gd b/src/Startup.gd
index b5ff9cf..c531fe0 100644
--- a/src/Startup.gd
+++ b/src/Startup.gd
@@ -1,10 +1,4 @@
extends Control
-var skipIntro = false
-
func _ready() -> void:
- if skipIntro:
- get_tree().change_scene_to_file("res://scenes/screens/MainMenu.tscn")
- else:
- Global.videoToPlay = "res://GFX/menu/startup_Undertow.avi"
- get_tree().change_scene_to_file("res://scenes/screens/IntroVideo.tscn")
+ get_tree().change_scene_to_file("res://scenes/screens/UpdateChecker.tscn")
diff --git a/src/UpdateChecker.gd b/src/UpdateChecker.gd
new file mode 100644
index 0000000..ffb4cb7
--- /dev/null
+++ b/src/UpdateChecker.gd
@@ -0,0 +1,9 @@
+extends Control
+
+func _ready() -> void:
+ DisplayServer.window_set_max_size(Vector2i(640, 480))
+ DisplayServer.window_set_min_size(Vector2i(640, 480))
+ $HTTPRequest.request("https://www.scpcbgame.com/changelog.txt")
+
+func _on_http_request_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void:
+ get_tree().change_scene_to_file("res://scenes/screens/Launcher.tscn")
diff --git a/src/Utils.gd b/src/Utils.gd
index 3fcda42..ce07ee8 100644
--- a/src/Utils.gd
+++ b/src/Utils.gd
@@ -17,3 +17,34 @@ static func WrapAngle(angle):
while angle >= 360:
angle = angle - 360
return angle
+
+static func KeyBackground(image, key: Color):
+ var imageRaw = image.get_image()
+ imageRaw.convert(Image.FORMAT_RGBA8)
+ for y in imageRaw.get_height():
+ for x in imageRaw.get_width():
+ if imageRaw.get_pixel(x, y) == key:
+ imageRaw.set_pixel(x, y, Color.TRANSPARENT)
+
+static var cachedLookupPaths = Dictionary()
+
+static func GetCaseiFileName(path: String):
+ var pathParts = path.split("/")
+ var dirName = "/".join(pathParts.slice(0, len(pathParts) - 1))
+
+ var loadedFileNames: Dictionary
+
+ if cachedLookupPaths.has(dirName.to_lower()):
+ loadedFileNames = cachedLookupPaths.get(dirName.to_lower())
+ else:
+ loadedFileNames = Dictionary()
+ var sillyDir = DirAccess.open(dirName)
+ sillyDir.list_dir_begin()
+ var dirFileName = sillyDir.get_next()
+ while dirFileName != "":
+ loadedFileNames.get_or_add(dirFileName.to_lower(), dirFileName)
+ dirFileName = sillyDir.get_next()
+
+ cachedLookupPaths.get_or_add(dirName.to_lower(), loadedFileNames)
+
+ return str(dirName, "/", loadedFileNames.get(pathParts[-1].to_lower()))
diff --git a/src/file_parsers/INI.gd b/src/file_parsers/INI.gd
new file mode 100644
index 0000000..04b0902
--- /dev/null
+++ b/src/file_parsers/INI.gd
@@ -0,0 +1,21 @@
+class_name INI
+
+static func Load(file: String):
+ var sections = Dictionary()
+
+ var fileHandle = FileAccess.open(file, FileAccess.READ)
+ var fileContent = fileHandle.get_as_text().replace("\r\n", "\n").split("\n")
+ fileHandle.close()
+
+ var currentSection: Dictionary = sections.get_or_add("loose", Dictionary())
+ for line in fileContent:
+ if line.strip_edges().strip_escapes() == "" or line.begins_with(";"):
+ continue
+
+ if line.begins_with("[") and line.ends_with("]"):
+ currentSection = sections.get_or_add(line.substr(1, len(line) - 2), Dictionary())
+ else:
+ var segments = line.split("=")
+ currentSection.get_or_add(segments[0], segments[1])
+
+ return sections
diff --git a/src/file_parsers/RMesh.gd b/src/file_parsers/RMesh.gd
index 33433dd..6f57b98 100644
--- a/src/file_parsers/RMesh.gd
+++ b/src/file_parsers/RMesh.gd
@@ -19,8 +19,11 @@ static func StripFilename(file: String):
static var EMPTY_TEXTURE = Texture2D.new()
+static var RMESH_LOAD_COUNT = 0
+
static func LoadRMesh(parentNode: Node3D, file: String):
var correctedPath = file.replace("\\", "/")
+ var fileName = correctedPath.split("/")[-1]
var fileHandle = FileAccess.open(str("res://", correctedPath), FileAccess.READ)
var reader = BufferStuffReader.create(fileHandle.get_buffer(fileHandle.get_length()))
@@ -33,13 +36,15 @@ static func LoadRMesh(parentNode: Node3D, file: String):
return
var scene = Node3D.new()
+ scene.name = str(fileName, "_", RMESH_LOAD_COUNT)
+ RMESH_LOAD_COUNT += 1
parentNode.add_child(scene)
var count: int = 0
var count2: int = 0
file = StripFilename(file)
- print(file)
+ #print(file)
var i
var j
@@ -212,8 +217,10 @@ static func LoadRMesh(parentNode: Node3D, file: String):
if isAlpha == 1:
#AddMesh childMesh,Alpha
#EntityAlpha childMesh,0.0
- print("loaded transparent face")
+ #print("loaded transparent face")
+ x
else:
+ x
#AddMesh childMesh,Opaque
#EntityParent childMesh,collisionMeshes
#EntityAlpha childMesh,0.0
@@ -225,7 +232,7 @@ static func LoadRMesh(parentNode: Node3D, file: String):
#FlipMesh(flipChild)
#AddMesh flipChild,childMesh
#FreeEntity flipChild
- print("loaded opaque geometry")
+ #print("loaded opaque geometry")
#var st = SurfaceTool.new()
#st.begin(Mesh.PRIMITIVE_LINE_STRIP)
@@ -257,7 +264,7 @@ static func LoadRMesh(parentNode: Node3D, file: String):
#meshInstance.create_trimesh_collision()
scene.add_child(meshInstance)
- print("YOYOYO MARKER")
+ #print("YOYOYO MARKER")
#Local hiddenMesh%
#hiddenMesh=CreateMesh()
@@ -314,7 +321,7 @@ static func LoadRMesh(parentNode: Node3D, file: String):
# trigger boxes
if hasTriggerBox:
- print("TriggerBoxEnable")
+ #print("TriggerBoxEnable")
var triggerBoxAmount = reader.readInt()
for tb in range(triggerBoxAmount):
var tbVerts = PackedVector3Array()
@@ -370,7 +377,7 @@ static func LoadRMesh(parentNode: Node3D, file: String):
count = reader.readInt() # point entities
for i1 in range(count):
temp1s = ReadString(reader)
- print(str("POINT ENTITY: ", temp1s))
+ #print(str("POINT ENTITY: ", temp1s))
if temp1s == "screen":
temp1 = -reader.readFloat() * WORLD_SCALE
temp2 = reader.readFloat() * WORLD_SCALE
@@ -409,7 +416,7 @@ static func LoadRMesh(parentNode: Node3D, file: String):
var lcolor = ReadString(reader).split(" ")
var intensity = min(reader.readFloat() * 0.8, 1.0)
- print(str("light. Range: ", range, ", lcolor: ", lcolor, ", intensity:", intensity))
+ #print(str("light. Range: ", range, ", lcolor: ", lcolor, ", intensity:", intensity))
var r = int(lcolor[0]) / 255 * intensity
var g = int(lcolor[1]) / 255 * intensity
var b = int(lcolor[2]) / 255 * intensity
@@ -444,7 +451,7 @@ static func LoadRMesh(parentNode: Node3D, file: String):
#
var innerconeangle = reader.readInt()
var outerconeangle = reader.readInt()
- print(str("spotlight. Range: ", range, ", lcolor: ", lcolor, ", intensity:", intensity, ", angles: ", angles, ", innerconeangle: ", innerconeangle, ", outerconeangle: ", outerconeangle))
+ #print(str("spotlight. Range: ", range, ", lcolor: ", lcolor, ", intensity:", intensity, ", angles: ", angles, ", innerconeangle: ", innerconeangle, ", outerconeangle: ", outerconeangle))
#lt\innerconeangle = ReadInt(f)
#lt\outerconeangle = ReadInt(f)
else:
diff --git a/src/file_parsers/X.gd b/src/file_parsers/X.gd
index 48bb380..28a701c 100644
--- a/src/file_parsers/X.gd
+++ b/src/file_parsers/X.gd
@@ -3,6 +3,11 @@ class_name X
static func LoadModel(filePath: String):
var sillyPath = str("res://", filePath.replace("/Map/", "/map/"))
var file = FileAccess.open(sillyPath, FileAccess.READ)
+
+ # Do a case insensitive lookup only if we have to, it's more expensive.
+ if file == null:
+ file = FileAccess.open(Utils.GetCaseiFileName(sillyPath), FileAccess.READ)
+
var fileLines = file.get_as_text(true).split("\n")
var meshDataStart = false