Camp Kids in Ford's Sanctuary

Posted: 24 Nov 2022

Exploring some oddities regarding the camp kids in Ford's Sanctuary

There are some very strange things going on in Ford’s sanctuary. Specifically, in relation to the camp kids when the campgrounds are in a certain state.

This is a small rabbithole I ended up going down when someone in the Double Fine Discord mentioned a very strange bug regarding the Lungfish call.

See, because this is Psychonauts, various characters have unique dialogue that they speak if you happen to blow the Lungfish call while standing near them. Amongst the camp kids, this includes Quentin, Phoebe, Chops and JT. (If you want to see all of the characters’ reactions, you can see this video: this video)

Yesterday though, someone in the Double Fine Discord claimed that if you blow the lungfish call while standing in the middle of Ford’s sanctuary, you’ll inexplicably hear Phoebe’s line from nowhere.

Pretty strange, huh? And just like the odd Milkman sedan bug I wrote about before, I couldn’t resist looking into this issue and seeing if I could figure out why it happened, especially seeing as I already had a couple of suspicions as to what may be going on.

So, I loaded directly into Ford’s sanctuary from the level select, gave myself the Lungfish call, stood in the middle of the room and blew it. Nothing. Raz just said his usual line. Was it bad information? Nope. In-fact, I had partially expected this to happen.

I stood in various places in the lab blowing the whistle and there was no phantom Phoebe voice to be heard. That’s because this bug only manifests if:

The reason for the first half of this is camp states, the mechanism used by the game to internally organise the different… uh, states, of the campgrounds as the game story progresses.

There are 7 different camp states - state 1 is the very start of the game (not much going on there). State 2 is after Basic Braining is finished. State 3 is after your first run through the Brain Tumbler, and so on.

The final state, state 7, is after you’ve beaten the blueprint brain tank (and thus everyone has been kidnapped and de-brained and so on) and is the state the camp is in for the whole game after that point, and it’s the only state this bug shows up in.

Sure enough, loading into camp state 7 through the debug menu and then blowing the whistle again, we hear Phoebe’s disembodied voice enthusiastically cheering on our lake whistle solo. There’s not even a subtitle!

So, what’s up with this camp state stuff anyway? How does that all work?

Well for managing these states, every camp kid has a table which tells the game which maps they’re in for each state, where they spawn, what state they’re in, and various other things. Here’s Vernon’s for instance.

There’s 7 entries, and each entry specifies a map and information associated with that map. Here we can see that in states 1-4, Vernon’s always in the kid’s cabins (CAKC). Within that, in states 2-3, he’s in his hide n’ seek state.

In state 5, he’s present in both the GPC area (CAGP) and the main campgrounds (CAMA), though it’s worth noting that his presence in CAMA is not “real”, he just exists so that a cutscene in that area and state can use him and he’s hidden by default otherwise.

In state 6 he’s in the main lodge (teee-veee) and finally we come to state 7. Here’s where things get interesting - once again he’s in 2 places. One of them is CALI which is the main lodge again, which makes sense, that’s where he shows up after re-braining.

But he spawns in CAJA as well. That’s Ford’s Sanctuary. So what’s he doing there? He’s not there because he’s in the observation room, the kids in that room actually aren’t even real, they’re pieces of the level geometry itself (hence why their lighting is so weird).

Well, remember how Vernon in state 5 shows up in CAMA for a cutscene? It’s the same here. If he’s not re-brained, he needs to be spawned in there (hidden) to be used for the re-braining cutscene.

And now we’re getting somewhere. It’s not just Vernon - every camp kid that hasn’t been re-brained yet spawns in CAJA so they can be present for their re-braining cutscene.

So, every camp kid (with 6 exceptions but we’ll get to them) actually spawns at the same position in CAJA, all hidden, waiting to run their re-braining scene. With a quick script, we can unhide them all and witness the horrifying clump.

So, it turns out Phoebe’s voice wasn’t quite disembodied after all! She’s somewhere in that mess of campers too, and even though she’s hidden and put into a nil state, she still gets picked up by the Lungfish whistle code and says her line!

So if Phoebe says her line, why not any of the other kids? Well, that’s because of the way the Lungfish whistle logic works when it comes to firing off the dialogue for the camp kids.

4 kids have lines, and it divides them into pairs. Quentin and Phoebe and JT and Chops.When both characters of a pair are present (like here) it checks if one character is closer to the player than the other and selects who plays their line based on that.

In this case, it checks if Quentin is closer to the player than Phoebe. But, Quentin and Phoebe are both at the exact same position in space, which means technically, he isn’t closer to Raz than Phoebe. That means Phoebe’s line wins out!

Now this does of course mean this bug has additional layers! The only thing stopping Quentin from playing his line is Phoebe. If we happen to re-brain Phoebe before we re-brain Quentin…

We get a phantom Quentin line instead!

And going through the logic of the whistle, if we then re-brain Quentin we get Chops’ line instead. Then if we re-brain Chops we get JT. Finally, if all 4 of those kids are re-brained, the ghosts will be purged from Ford’s Lab and we won’t get any more phantom lines.

So, that’s the explanation for this bug. From the start I had suspected pretty much this exact scenario, I had a feeling it’d be that Phoebe was present in the lab but hidden for the re-braining scene.

Though, I didn’t put the pieces together at first and didn’t expect to find that clump of kids. That caught me slightly off guard. Speaking of which, I mentioned before that there were in fact 6 campers who are not inside the clump. Why is that?

Well, as it happens there is a part 2 to this ordeal, because when I was testing stuff and unhiding the campers to see where they all were, I noticed something strange.

After running the script that unhides them all, I happened to head over to the observation room. Then, I noticed something that honestly startled me at first.

Several campers, all standing in this room in different spots.

Present are Franke, Kitty, Nils, Crystal, Clem and Benny. A strange set of characters, huh? I wasn’t sure why exactly they were all here. Well… except maybe one.

See there’s a somewhat obscure interaction where if you’ve re-brained Benny AND you’ve re-brained either Kitty or Franke (or both) then he’ll actually show up in this room… laughing to himself.

It’s worth noting that a duplicate of him is still sitting with the other kids but that might just be because I’m using scripts to quickly adjust the re-braining status of the kids, which might be breaking things. This does all work in the vanilla game though.

It’s… honestly quite bizarre. It’s such a specific, obscure set of conditions that needs to be met, it doesn’t really make much sense.

In-fact I only found out about this phenomenon after reading several old threads where people expressed confusion about Benny’s behaviour here:

However, we finally have an explanation for this. We can see some interesting remarks in Benny’s script file. Apparently, he’s meant to be “hanging out” with Kitty and/or Franke. But… they never show up.

No matter what combo of campers you re-brain, neither Kitty nor Franke will ever show up here. Their presence in the room when using the script to unhide them does suggest it was planned, but their scripts have no special behaviour to unhide their entities in CAJA. Their entities are removed once you re-brain them

So, Benny’s presence here under these specific conditions is now explained. He is a vestigial remnant of some clearly scrapped ideas for how the campers would be interacting after re-braining. Still kinda spooky.

This explains why Benny is there, partially explains why Franke and Kitty are there, but leaves Crystal, Clem and Nils unaccounted for.

If you read that mixnmojo post I mentioned earlier in regards to Benny, you will note that it does actually mention Crystal.

It claims that if you re-brain her without re-braining Clem too, she’ll show up in the observation room “immobile and to the right, closer to the window than the TV, staring off to the right a bit but still facing the observation window”

Sure enough, we re-brain just Crystal and… she’s there. Motionless. In the position from before. Still in her nil state. No doubt she’s intended to appear but something is clearly not right.

The MixnMojo thread also remarks that she still shows up cheering on Ranger Ford elsewhere in this case. Worth noting though that it claims she still does this after re-braining Clem, which isn’t correct. She disappears from this room when Clem’s got his brain back.

What isn’t mentioned is that, as you might expect, this happens in reverse. Re-braining Clem without Crystal makes him show up here staring into your soul.

We need not look further than the comments in Crystal’s code - they both share this code more or less. Apparently they were intended to be cheering on Raz if you rebrain one of them.

And then we come back to Kitty and Franke. Apparently if you rebrain just Kitty, they had intended to have a thing where she’d be trying to wake up Franke. Needless to say they never implemented that.

Crystal and Clem’s code for this is clearly unfinished. While Benny still did his thing despite the absence of 2 other characters, Crystal and Clem have absolutely nothing set up for this state besides the code that makes them appear.

And so, that explains why Crystal and Clem are here, and that comment gives us an explanation for Kitty’s presence. We can then extrapolate and assume Franke’s presence here is for a similar reason to Kitty’s.

So, Franke and Kitty are here because they were meant to try to wake each other up but none of that was implemented. Crystal and Clem were meant to cheer on either Raz or Kitty but that was only partially implemented (leading to a pretty creepy bug)

And of course, Benny was meant to hang out with Kitty and/or Franke. His implementation seems complete but without Franke and Kitty the conditions for him to appear suddenly become very strange and mysterious to anyone who doesn’t know what the intention was.

All that remains is Nils. He has no remarks on what he was meant to do in CAJA in his code, and no other code mentions it either. But, all is not lost. Once again, the dev documents from the 2013 Steam build come to our rescue.

Included in those docs is a couple of documents used to plan and detail the actions of each of the campers in each camp state! With that, we can confirm if we correctly figured out how this all lines up!

Starting with Benny - yep, this matches what we theorised. Notably though, it also mentions he was meant to be in CAMA with Bobby. In the final game, Bobby isn’t in CAMA (he’s with Chloe in the cabins).

In the final game Benny actually just up and disappears once Bobby’s rebrained. I guess they moved Bobby and after that there was just nowhere for Benny to go?

Next, Kitty and Franke. Not a lot to remark on here. It lines up perfectly with what we had surmised from the scripts. Interestingly, it sounds like even after both of them were re-brained, they were intended to stick around in the observation room.

Crystal & Clem next. Once again matches what we know so far. I’m a little disappointed that we never got those pessimistic cheering lines, they’d have probably been incredibly amusing. The doc also describes a different iteration of what they’d do when they were both awake again.

Dark, but not out of the ordinary for Crystal & Clem. The final game lightened this up a lot and gave them a bit of character development to boot. I think it was a good change.

Well, we’re just left with Nils. And Nils is… well quite frankly Nils is a damn creep. I mean, yeah that much is obvious but this might’ve been a bit too much. Probably another good change.

And… that’s it. Looks like we were pretty much right on the mark with everything. Which is not surprising given the code comments pretty much outright state most of this information.

It’s very fitting for this game that such niche details can lead down rabbit holes of interesting information like this. This game really keeps on giving with so much stuff that’s still left to discover.

Even when everything that’s actually ingame has been found, I’m sure that the scripts and documents will mean there’s still so much to learn. Maybe one day new stuff will surface. We still lack so much info about certain elements from earlier in development.

I hope we can learn more about some of that stuff one day, maybe even get to see some of it in action. I guess that depends on if any builds that old would’ve somehow survived.

Well, anyway, that does it for now. These are a pair of pretty interesting, tangentially related bugs and for that last one in particular it’s fascinating how it ended up coming to be. I’m glad we have all this info so we can solve this mystery.