You've reached the press kit for The Foundation.

This page should contain all the information you need to post articles or get more informed about the game. If you need any additional information or want media provided in a different format contact us and we'll make it available!


FACT SHEET

  • Developer: NovaBox Studios; Based in Boise, Idaho
  • Release Date: TBA
  • Projected Platforms: Windows, Linux, Mac OSX
  • Website: www.novaboxstudios.com
  • Current File Size: ~150MB: PC Installer, ~180 OSX and Linux files


DESCRIPTION

Inspired by XCOM and a legion of brilliant authors this game puts you in the shoes of the newly appointed Overseer of the SCP Foundation, an extraterritoral organization charged to secure anomalous artifacts around the world, contain public knowledge, and protect the world's existence from the hazards these items possess.

You must Secure. Find anomalous events and SCP entities. Customize your armed forces and research powerful new technologies. Dispatch task forces to lock down and retrieve it. Fight off others interested in the same prize.

You must Contain. Suppress public knowledge of the events. Recruit governments, agents, and organizations to fund and support your goals.

You must Protect. Build bases and secure areas to store anomalous items. Stop the spread of anomalous effects. Beware of dangerous containment breaches.

As time passes the beginning hastens the end. Something nearly destroyed the Foundation once. It won't make the same mistake again.


FEATURES

  • GLOBAL CONTROL: Build a secret extra-territorial organization that spans the globe. Interact and negotiate with rival organizations and governments to contain anomalous threats.
  • TACTICAL SQUAD COMBAT: Control squads of soldiers to contain or destroy anomalous entities.
  • BASE DEFENSE: Contain hazardous anomalies for study in custom built containment facilities. Your base becomes the battle map. Design defenses to keep your collections in and rival organizations out.
  • OPEN ENDED UNIVERSE: Over 2000 different anomalies can appear in game. Connections to the SCP Wiki, a peer reviewed collection, allows for access to new and improved anomalies as they are added to the wiki.
  • MODDING: Designed for modding from the ground up. Plain text content allows non-technical players to still change the game as they wish. 


HISTORY

NovaBox Studios is an independent game company started in 2010 by two guys with a passion for game mechanics and the art of game design. Dedicated to gaming since our first pixels we set our sights on creating clever and enjoyable games. We strive to create our own line of brilliant, exciting games that will keep you coming back to see what we are working on next.


VIDEOS

Administrator Trailer: Download


SCREENSHOTS

Get the full media kit in a zip file here (Contains more images than shown): Download

The following is a simple C# function used to read a config file into a dictionary. I'm making it available on here in part for others, but mostly for our own future use.

This function requires that System.Collections.Generic, and System.IO be included in the file where it lives. Config files must contain a single setting per line in the format of: "key:value"

Please code responsibly :P


Dictionary<string, string> ReadConfigFile(string path) {
        Dictionary<string, string> configs = new Dictionary<string, string>();

        int counter = 0;
        string line;

        System.IO.StreamReader file = new System.IO.StreamReader(path);

        while ((line = file.ReadLine()) != null) {
            string[] words = line.Split(':');
            configs.Add(words[0], words[1]);
            counter++;
        }

        file.Close();

        return configs;
    }
The, as yet unnamed game I am currently building in Unity3D has need of doors. So I wrote a script for doing just that. I'm putting the door script out here for the benefit of any poor sap who may come across it. I hope it allows you to make your game faster than I did.

The following is the main code. Below it I'll explain a few bits.

1:  using UnityEngine;  
2:  using System.Collections;  
3:  public class Door : MonoBehaviour {  
4:       GameObject door1;  
5:       GameObject door2;  
6:       GameObject LockedCollider;  
7:       GameObject LockedDoors;  
8:       GameObject Unlocked;  
9:       bool doorClosed = true;  
10:       bool doorClosing = false;  
11:       bool doorLocked = false;  
12:       bool closeAndLock = false;  
13:       void Start () {  
14:            door1 = transform.Find("Unlocked/Door1").gameObject;  
15:            door2 = transform.Find("Unlocked/Door2").gameObject;  
16:            Unlocked = transform.Find("Unlocked").gameObject;  
17:            LockedCollider = transform.Find("LockedCollider").gameObject;  
18:            LockedDoors = transform.Find("LockedDoors").gameObject;  
19:            AstarPath.active.UpdateGraphs (transform.Find("Bulkhead1").collider2D.bounds);  
20:            AstarPath.active.UpdateGraphs (transform.Find("Bulkhead2").collider2D.bounds);  
21:       }  
22:       void Update () {  
23:       }  
24:       public void updateAStar() {  
25:            AstarPath.active.UpdateGraphs (LockedCollider.collider2D.bounds);  
26:       }  
27:       public void OpenDoor(){  
28:            if(doorLocked)  
29:                 return;  
30:            doorClosed = false;  
31:            iTween.MoveTo(door1,iTween.Hash("position", new Vector3(-0.35f,0,0.1f),"islocal", true,"time", 1));  
32:            iTween.MoveTo(door2,iTween.Hash("position", new Vector3(0.35f,0,0.1f),"islocal", true,"time", 1));  
33:       }  
34:       public void CloseDoor(){  
35:            doorClosing = true;  
36:            iTween.MoveTo(door1,iTween.Hash("position", new Vector3(-0.11f,0,0.1f),"islocal", true,"time", 0.5f));  
37:            iTween.MoveTo(door2,iTween.Hash("position", new Vector3(0.11f,0,0.1f),"islocal", true,"time", 0.5f, "onComplete", "CloseFinished", "onCompleteTarget", this.gameObject));  
38:       }  
39:       private void CloseFinished(){  
40:            doorClosed = true;  
41:            doorClosing = false;  
42:            if(closeAndLock) {  
43:                 closeAndLock = false;  
44:                 LockDoor ();  
45:            }  
46:       }  
47:       public void LockDoor() {  
48:            if(doorLocked)  
49:                 return;  
50:            if(!doorClosed) {  
51:                 closeAndLock = true;  
52:                 CloseDoor();  
53:                 return;  
54:            }  
55:            Unlocked.SetActive(false);  
56:            LockedDoors.SetActive(true);  
57:            LockedCollider.SetActive(true);  
58:            doorLocked = true;  
59:            updateAStar();  
60:       }  
61:       public void UnlockDoor() {  
62:            if(!doorLocked)  
63:                 return;  
64:            Unlocked.SetActive(true);  
65:            LockedDoors.SetActive(false);  
66:            LockedCollider.SetActive(false);  
67:            doorLocked = false;  
68:            updateAStar();  
69:       }  
70:       public void SensorTripped(){  
71:            if(doorClosed)  
72:                 OpenDoor();  
73:            if(doorClosing) {  
74:                 iTween.Stop(this.gameObject,true);  
75:                 //WaitForSeconds(0);  
76:                 OpenDoor();  
77:            }  
78:       }  
79:       /*void OnGUI() { // Used for Debug  
80:            if (GUI.Button(new Rect(10, 70, 50, 30), "Open"))  
81:                 OpenDoor();  
82:            if (GUI.Button(new Rect(10, 100, 50, 30), "Close"))  
83:                 CloseDoor();  
84:            if (GUI.Button(new Rect(10, 130, 50, 30), "Lock"))  
85:                 LockDoor();  
86:            if (GUI.Button(new Rect(10, 160, 50, 30), "Unlock"))  
87:                 UnlockDoor();  
88:       }*/  
89:  }  

The following Image shows the structure of the prefab that this script takes advantage of:

  • "Door" is just an empty at 0,0,0 with the above script attached.
  • The "Bulkhead" objects are the walls on ether side of the door. They each have their own 2D Box Collider for use by the pathfinding system.
  • "LockedCollider" is an empty object with just a Box Collider 2D. This gets enabled and disabled to help update the Actor pathing system.
  • "Unlocked" is just an empty used to enable and disable both door objects easier. 
  • The "Door" are just Sprites. no colliders.These are the objects that are moved using iTween to give the illusion of doors that open and close.
  • "Locked Doors" is just an empty used to enable and disable both "DoorPanel" objects easier
  • the "DoorPanel" objects are just sprites with a single position. they are ether enabled or disabled to show the locked state of the door.
  • "DoorSensor" is an empty with a collider covering the area where an actor will trigger the door to automatically open. It also has a very simple script on it called DoorSensor.cs the code can be found below.



1:  using UnityEngine;  
2:  using System.Collections;  
3:  public class DoorSensor : MonoBehaviour {  
4:       void OnTriggerEnter2D() {  
5:            transform.parent.GetComponent<Door>().SensorTripped();  
6:       }  
7:       void OnTriggerStay2D() {  
8:            transform.parent.GetComponent<Door>().SensorTripped();  
9:       }  
10:       void OnTriggerExit2D() {  
11:            transform.parent.GetComponent<Door>().CloseDoor();  
12:       }  
13:  }  

This script accesses the Door object and calls the above functions to make the door open and close when an Actor trips the door sensor.

My door looks like this in action:


If you have questions or find bugs in the code, let me know and I'll be glad to help.
So sometimes you are going along making a Unity3D game and you need to check to see if the player is executing a click and drag motion. But you also want to make sure that click+drag action is distinguished from a single click. Well I have a C# solution to this problem. Its also easy enough to convert to Javascript if thats how you roll. And if you use Boo...well why the hell are you using boo?


 bool mouseDragging = false;  
 bool mouseDraggingLastFrame = false;  
 Vector3 mousePosLastFrame;  
   
 bool MouseDragging() {  
      if(mouseDraggingLastFrame == true)  
           mouseDragging = true;  
      else   
           mouseDragging = false;  
   
      if(Input.GetMouseButton(0) && mousePosLastFrame != Input.mousePosition) {  
           mouseDraggingLastFrame = true;  
      } else {  
           mouseDraggingLastFrame = false;  
           mouseDragging = false;  
      }  
      mousePosLastFrame = Input.mousePosition;  
      return mouseDragging;  
 }  

This function will return true if the mouse is executing a click drag motion. But it needs to be called from within the Update method.

I'm done now.

I have spent many a frustrating hour working through some of the querks that come along with Unity3D. In particular, making Blender models work was something I had to figure out through trial and error because I could not find it online anywhere. The following Image shows the way you need to orient your model in blender to have the Z or Vector3.Forward in Unity work.

After the model is in this orientation in blender, Press "N" to show the transform panel. In the interface that shows up you will see the "Rotation" section. Set all the values to "0" and hit "CTRL+A" to apply the rotation. After that, you can save the .blend file and drop it straight into Unity3D. The Z vector will then be forward on the model, and your whole life will be better.
Leave a comment if this helped. Good luck.