What topiary should I put on top of the new Courtyard map?

The true purpose of this post is to test the new CAPTCHA system I installed, after getting sick of reCAPTCHA letting in 40 spam comments a day.1 So, if you’ve never commented on the blog before, please chime in below so I can test that it works.  If you have commented before, then you shouldn’t notice anything different and shouldn’t see the CAPTCHA.  Edit: it looks like the new CAPTCHA works fine, thanks everybody!

The ostensible purpose of this post is to brainstorm what topiary shape should go on top of the center pillar in the new experimental Courtyard map, pictured here:

Radial pseudo-symmetry, not good for getting your bearings.

I will talk more about the design of this map in the future, but for now I will just say it’s really hard for the Sniper.  The radial pseudo-symmetry is not good for memorizing the statues…you can’t really get your bearings, and I’ve made it so the Sniper can just keep going around in circles so there’s no feeling of beginning or end.  One playtester at PAX got unlucky and all three statues were the Maltese Falcon, and he said he just kept going around in circles trying to see a different statue shape!

So, I figure I’d put a topiary animal or something on top of the pillar.  It can’t have radial symmetry, so a Christmas Tree or whatever is right out.  I thought a banana might be funny, but it might lead to, uh, perception problems.  So, any ideas? 

  1. I think it was cracked a couple weeks back, or the bad guys have really good OCR algorithms. []

The New SpyParty Character Art Style

Update: the second batch of five characters have been revealed.

I am incredibly excited to introduce the new SpyParty character art style!

I am also incredibly excited to introduce the new SpyParty character artist, John Cimino!

John’s the one who has ironed his shirt.

Full disclosure:  John has actually been working full time on SpyParty since September of 2011, we’ve just kept it a secret until we could reveal the new art style with a cool selection of characters representing some of the diversity we’re trying to achieve.  It’s been hard to keep this quiet over the past year, and when somebody would ask me if I was making the game by myself, I’d answer “yes” and rationalize it on a technicality, since we haven’t actually put anything John’s done into the game itself yet!

So, it’s true, I have doubled the team size.  This rate of growth simply cannot be sustained.

John and I worked together on Spore.  I would develop some crazy mostly-broken system for skinning or painting or animating the creatures, and John would do amazing and beautiful things with it, and not hate me afterwards.  After six years of that, I figured our working relationship had been battle tested, and so when I started working on SpyParty full time, I also started working on John full time, to try to get him to come work on the game.

John’s the perfect artist for SpyParty, because he’s amazing at all the artistic disciplines, from concept through modeling, texturing, and animating. While most of the industry is following movies and specializing roles to the point where an individual artist might only rig, or do textures, or animate, John can do it all.  You need someone like that for indie games, and to have somebody this talented in all of those areas is amazing…I am incredibly lucky to have him, and so are you, since he’s going to help make the game the kind of “perfect jewel” that is the reason I’m indie in the first place.

The Style

We’ve spent months and months defining the style of the characters, and I’m really happy with the results.  We call this style naturalistic and illustrative.  With a game like SpyParty, where the design and gameplay aesthetics are all about deep subtlety, it was important that we hit that level of  subtlety in the visual aesthetic as well.  I want the visual and design aesthetics to work in concert to deepen the game.  We also needed to skirt the Scylla of realism and the uncanny valley on one side, and the Charybdis of slapstick cartoon exaggeration on the other side.

We call the result naturalistic and illustrative because it’s based on nature and sound anatomy, but without cleaving too close to realism, using instead the simplifications and stylizations perfected by classic illustrators, people like J.C. Leyendecker, Harry Beckhoff, Robert McGinnis, and Herbert Paus.  We’ve spent days deciding exactly which wrinkles to include and which to elide on a just-past-middle-aged eyelid.

I want to explicitly thank my good friend Dan Zimmer, who publishes the incredibly beautiful Illustration Magazine, for introducing us to most of these illustrators.

Period

Talking about these classic illustrators brings me to questions of time period, and namely, “When does SpyParty take place?”  The answer is, “yes.”

It’s important to me that the game’s visual design be timeless, not retro, not futuristic, but ambiguous, where it could be happening at any or all time periods.  If you look at the collection of spy images I posted way back in September 2009, it’s very easy to visually date some of them, and I want to avoid that. I think 60’s retro spy-fi is as cool as the next guy, but it goes in an out of fashion, and it can be subtly alienating even when it’s in.  My biggest inspiration for the timelessness we’re going for is Pixar’s film, The Incredibles.

The art direction of that film is, well, incredible, and they did a great job of keeping the actual time period ambiguous…it could be the 50’s, it could be today, it could be the future.  I want a similar vibe for SpyParty. If you follow the game, you’ll know there is gameplay associated with checking your watch.  There will be characters who check wrist watches, characters who check pocket watches, and characters who check mobile phones, all integrated visually and mechanically in the same game.

Fashion

I’m guessing John and I spend more time on the clock than most game developers do discussing hair styles and shoes.  Since SpyParty is not your usual orcs and space marines fare, we end up going to fashion magazines and celebrity red carpet blogs for a lot of inspiration and reference.  I have a growing pile of tearouts from Vogue, W, In Style, Harper’s Bazaar, and Esquire.  Here are a few images I’ve collected to give you a flavor of the kind of things we look to for visual inspiration:

The Characters

Who are these specific people we’re revealing now?  They’re going to have to remain mysterious for a while.  Each character in SpyParty will have a dossier that will eventually be important to learn for playing at advanced levels, due to upcoming game mechanics involving individual behaviors and histories.  For now, these folks are visual stakes in the ground as we explore the diversity of different races, genders, ages, abilities, sizes, and orientations that we’re going to put in the game.

These characters don’t even have names yet.  For a brief while I considered using some of the names from the current beta characters, but I decided that would be disrespectful to the current guys, who have gone above and beyond the call of duty for the game.  So, in deference to their service, I plan to “retire the jerseys” of all the current characters when the new art goes in.  The new characters will have all new names, and I might crowd-source some of them, so put your central casting hats on.

The Game

And with that, we come to the question of when these new characters will go in the game.  The short answer is, “not for a while.”  These are characters that will eventually go into the game, but they’re currently at the initial stages of the very long production pipeline that comes with doing a high-end 3D game these days.  These are high-poly-count models, and these images we’re revealing today are rendered with a non-realtime renderer.  They still have to be decimated, and rigged, and textured and normal mapped, and animated, and the game engine needs to be redone to support higher quality characters like these.  They are a long way off, sometime next year at least.

Finally, we come to the most important question of all, “What if the new art screws up the game balance?”  I will not let that happen, or at least won’t let that happen for long.  The deep and balanced game design is the absolute top priority, so if for some crazy reason I simply can’t get the game deep and balanced with different art, I will throw it all away and ship the ugly art that’s in the game now.

But, I don’t think that extreme will be necessary.  I think we can make SpyParty a deep and subtle and beautiful game. Even once the game engine is ready to support the new characters, I will introduce them slowly in their own maps alongside the existing art, so we can make sure they don’t mess things up. I’m sure there will be some stumbles along the way, since perception is one of the key mechanics in the game and the new art will clearly impact perception, but we’ll figure it out and keep the game on the path to a competition worthy player-skill game.

What about the environments and objects?  Those visual styles are yet to be determined, but they’re going to take a lot of time and thought, the same as the characters.  The foreground-background separation is a key part of SpyParty, and the art style of the environments and objects needs to reinforce that.

Gallery

So, here are the new SpyParty characters.  We love them and hope you do too!

Update: Their placeholder names until we name them for real—in order of appearance in the group shot—are Mr. C, Ms. B, Mr. A, Ms. E, and Mr. D.

Wallpapers

Here are high-resolution high-quality (read: large file sizes) images rendered out at various aspect ratios, so they should be suitable for even the largest desktop wallpapers, if your computer would like to wear them for a while.

Aspect Resolution Images
4:3 1600×1200      
16:9 2560×1440      
16:10 2560×1600      

And here are the high-resolution high-quality versions of the portraits.  They’re 1000×1500 resolution:

    

That Yoda Quote About Opening Betas and the PAX West 2012 Guest Indie

Do or do not...there is no open beta yet.

My plan seemed like a good one at the time I made it:  get the lobby server backend scalable, use the remaining 12595 uninvited people1 to test that scalability, and then open up the beta, all before PAX West 2012.  Then, when people played SpyParty at little old booth #3002, instead of telling them they had to sign up to get in line, I could just tell them to go home and start playing immediately!

Alas, it turns out I ended up more on the try side of Yoda’s quote than the do side of the quote.  I still think it’s a good plan, I’ll just have search-and-replace “PAX West 2012” with some other upcoming event2  in the Official Plan Documents™. 3

As the clock started ticking down, I started scrambling and contemplating worse and worse hacks to make my deadline, until I finally took a step back and realized I had way more to lose by screwing up the open beta launch (and potentially the wonderful community that’s developed in the beta so far) than I had to gain by opening it up before PAX.  Plus, given how close to the wire I was getting, I would have been busy on the show floor in the booth without internet while something terrible could have been happening with my server.  Trust me, I want to open it up, but I want to do it right, and it looks like that’s going to take a little more time.

So, the new plan is to finish up the rooms support I’ve been working on, and invite bunch of new folks in over the weekend to test it, but then hold off on more invites until I get back from PAX.  Then, when I’m back and slept, I will try to open up the beta.

And, since I never like to keep things simple, I think as consolation to myself I will try to add a new map and mission to the game for PAX.  The new map is going to be called Courtyard, and it’s a patio area surrounded by shrubs, with a small plant right in the middle with some statues around it.  The Sniper can move in a loop the entire way around the map, but the plant in the middle obscures at least one of the statues at any given time.  The new mission was actually suggested by beta tester monaters, and it’s a really great idea:  Toby carries around an item on his tray, and you can chose to take it as your Spy move when taking a drink.  The Sniper needs to notice the item is gone, and then backtrack to who took a drink recently.  It’s simple, but rich with potential.

Storyteller, the Special Guest Indie

When I was thinking about this post, I realized I have had or been a guest indie game every PAX.  First, in 2010, we had Jonathan Blow’s The Witness in our booth.  Then, I was the guest in Firehose’s booth at PAX East.  Last year, I had Marc ten Bosch’s Miegakure (and almost AirMech) as the guest indie in the SpyParty booth. 

This year, continuing in that tradition, I am hosting Daniel Benmergui’s Storyteller Saturday and Sunday mornings, 10am – 11am, booth #3002.  This is the same great little corner booth I had last year.

Storyteller delights me as a player and as a designer, and I can’t wait to see where Daniel takes the game, and how the PAX folks react to it!  Daniel will be hanging around the SpyParty booth all weekend if you miss the 10-11am playtest slots and want to talk to him about his awesome game.

See you soon!

 

  1. The current beta signup scorecard so far:  19340 hit submit on the beta signup, 17114 confirmed, 4705 invited, 1842 joined. []
  2. maybe “IndieCade 2012”? []
  3. Hint: there are no official plan documents. []

Chat Room “Design”

I just posted this in the private Beta forums, but I figure folks not-yet-in-the-beta might have some thoughts.

In preparation for opening the beta, I’m about to do chat rooms in the lobby. I’m going to do the simplest thing possible at first, and hope it gets us through the surge. Here is the current “design”, let me know if you think it’s okay. Please don’t turn this into a giant thread of how the ultimate lobby should work given infinite time and resources, we can have that discussion later when time and resources are infinite. For now, I just want to make sure I’m not missing something stupid and obvious in this thing I plan to spend one (1) day on.

  • When you log in, you will be presented with a list of available rooms, including the room name, and how many people are in it. You will have to pick one. I don’t know what I’ll do if you let it sit on that screen, probably time you out and kick you after a reasonable period, or auto-join you to the default room.
  • There will be a default main chat room called This is the Main Lobby Default Chat Room or something like that. It can’t be changed, and won’t disappear even if nobody is in it.
  • /say will broadcast to everybody in the current room. Being in a room is basically like being in the lobby right now.
  • You will only be able to play people in the current room, because that’s the only time you see a name to click on.
  • /whisper will still complete nicks of everybody on the server, unless that becomes a performance problem.
  • I will probably add a /who command to list everybody (with regex) and what room they’re in. This way ZeroTKA won’t have to constantly /whisper to see who’s in the lobby.
  • /joinroom will complete with the room name, or you can back out to the room selection screen. When you go out to the room chooser you’re still considered in the current room until you choose a new one.
  • /makeroom will create a new room with the name you specify (yikes) and put you in it. If people are jerks I’ll have to add a way to report naughtiness. For now, it’ll just say “mail support at spyparty.com with problems” or something. There probably won’t be a visual UI for creating a room, only the chat cmd, which will act as a bit of a weeder.
  • Rooms are deleted when the last person leaves them. Room names cannot be changed once created. There are no owners of rooms, no hidden rooms, no moderators, etc.
  • I’m hoping people make rooms with descriptive names, like, “Newbs Get Mentoring Here” and “Players with Less than 20 Wins”, and the like. I’m sure that’s a total game designer fantasy, and they’re going to end up being things like “Your Grandma’s Bedroom Closet”, sadly.
  • There is going to be no limit on the number of people in a room at the start. We’ll see how bad that is.

I will also try to color code chat lines in a way that’s not terrible. 

Thoughts? Clear, simple, parsimonious thoughts?

Chris

Scalability and Asserts I’m Not Yet Fixing

I’ve been a bit quiet because I’ve been working on (hopefully) completely invisible stuff involving backend server scalability.  What does that mean, you ask?  In practical player-facing terms, it means I’m trying to get the lobby and registration system robust enough to first invite the rest of the waiting list in,1 and then to open the beta up completely, allowing people to hear about the game, visit the site, pay their money, and get into the beta instantly.  Between 10 and 500 people sign up a day, depending on how much press the game is getting at the time, and I’m very curious to find out how many of those will join the beta if it’s available immediately, and they aren’t told they have to wait.

I’m currently working on the text-mode robot client.  I’ve got it logging into the lobby and pretending it’s a full SpyParty client, and it can chat, and invite people to games.  I posted on facebook and twitter asking for suggestions of what the robots should say to each other as they’re hanging out in the lobby.

Next up, I’m going to get the robots playing fake matches and games and reporting the game results to the lobby, and logging in and out a bunch.  Then, I’m going to hack up the bees with machineguns load testing app to launch a bunch of EC2 micro instances with multiple robots running on each, and aim them all at my test server.  I expect chaos.

Once I’ve got the obvious stuff fixed, and have figured out how many clients my system can host at a given machine size, I’ll do some tests with beefier machines to make sure it scales linearly.  There are four basic machine resources: CPU, memory, network, and disk…I assume I’ll run out of memory first, but I don’t know for sure.  I was originally going to try to get the entire backend infrastructure running in the cloud, but I think for the near term I’m going to just make sure I get a machine that can accept way more clients signing up and playing than I think I’m going to get when I open up the beta, and hope it holds up.  If it dies due to too much traffic, well, I guess that’s a good problem to have, at least!  I did this same kind of thing with when I started taking beta signups, and I stress tested and optimized it well enough that it didn’t even break a sweat, so hopefully the beta launch itself will go as smoothly. If not, then if Blizzard can do it, so can I! Yikes.

Then, once I’ve got the backend scalable for the robots, I’ll start inviting much larger groups into the beta to loadtest with live players.  There are some features I’m going to need to add to make this work, like chat rooms and colored chat text, and it’s going to be pretty raw to start with, but it should work okay.  The beta testers have been very forgiving of my incredibly primitive lobby so far, so hopefully that attitude will continue!

After everybody’s in, I’ll shut off the signups and let it stew for a few days, and if it’s working, I’ll open it up!  I hesitate to give time estimates on this stuff, because I’ve never hit a date, but most of this will be happening over the next few weeks.

Asserts!

Programming is complicated, and handling errors makes it even more complicated.  Oftentimes, it’s good programming practice to not handle some types of errors gracefully, but simply assert that you aren’t in a state you shouldn’t be in, and if the assertion fails, you exit with an error.

assert(1 + 1 == 2);  // integer arithmetic better work or we're hosed

Of course, during development, the impossible is not only possible, but likely, and so your asserts fire.  And, often in complicated code, you’ll assert things that should be true, but aren’t catastrophic if they’re not true, and so you usually pop up a dialog that gives you the choice to break into the debugger, abort the program, or ignore the assert (just this once, or forever).  The problem is, once you let yourself have that ignore option, you can get lazy, and start using asserts as popup reminders of things to fix.  This tends to be really bad on a large team, because the game is asserting every 2 seconds, and you’re just hitting ignore all the time to other people’s asserts, and it becomes a habit.  However, on an indie sized team, which in my case means exactly one programmer, one can use asserts this way and they can still be useful.  I can get a feel for how often certain types of things are going wrong while I’m testing, and I can remember what I was doing when a specific assert fired most of the time…it goes from a purely quantitative tool to a qualitative tool.

I also can leave the asserts on in beta builds, but in a way that fires silently once and then auto-ignores-forever, and then have them shipped off over the network to the server, so I can see what kinds of things are going wrong on player machines, and how frequently they go wrong.

I tend to be pretty liberal with asserts in my code, and so they fire a lot, and in turn the server logs a lot of them.  About 30000 of them so far in the beta.  Here they are, sorted by frequency:

4918 internalMcostTest(sx, sy)
object_system\subsystems\pathing\pathing.cpp
2237 holding
object_system\subsystems\animation\animation.cpp
2237 ad
object_system\subsystems\animation\animation.cpp
2145 am && (right || left)
object_system\subsystems\animation\animation.cpp
1780 am->playing.blend_out == am->queue.front().blend_in
object_system\subsystems\animation\animation.cpp
1485 am && (boneId != -1) && ad
object_system\subsystems\animation\animation.cpp
1415 cd->object_of_interest
character.cpp
1350 d->NearBookcaseID
situations\bookcase\bookcase.cpp
1114 (err = glGetError()) == GL_NO_ERROR, “code: 0x00000501”
spyparty.cpp
1105 cd->object_of_interest && (cd->object_of_interest == BriefcaseID)
situations\briefcase\briefcase.cpp
994 StatueAD && (StatueAD->Object->Type == object_types::STATUE) && (object_system::GetObject(StatueAD->ParentID)->Type == object_types::PEDESTAL)
situations\pedestal\pedestal.cpp
952 am && (am->playing.type == &core_talks)
situations\conversation\conversation.cpp
813 BriefcaseAD && HoldingBriefcase && d->PlayingCycle
situations\briefcase\briefcase.cpp
801 !d->PlayingCycle
situations\drinks\drinks.cpp
628 verify( pathing::pathGetCharacterValue(x, y) == BriefcasePathValue )
situations\briefcase\briefcase.cpp
539 verify( animation::HandleDetach(am, am->Events[i].event->boneId, cd->holding_right, cd->holding_left, &OnRight) && OnRight )
situations\briefcase\briefcase.cpp
478 cd->object_of_interest == BriefcaseID
situations\briefcase\briefcase.cpp
469 !PoppedYesNoQuestioner
spyparty.cpp
413 d->GoalPedestalID == d->NearPedestalID
situations\pedestal\pedestal.cpp
278 HoldingBriefcase && BriefcaseAD
situations\briefcase\briefcase.cpp
252 verify( HandleDetach(am, am->Events[i].event->boneId, cd->holding_right, cd->holding_left, &OnRight) && OnRight )
situations\pedestal\pedestal.cpp
236 IK.Bone && IK.Target && IK.MeshHardpoint
object_system\subsystems\animation\animation.cpp
229 am->queue.empty()
object_system\subsystems\animation\animation.cpp
216 x == p->ex && y == p->ey
object_system\subsystems\pathing\pathing.cpp
193 0, “unknown packet type: 9”
spy_server.cpp
188 !”stuck!”
character.cpp
172 cd->disposable_left
situations\pedestal\pedestal.cpp
160 verify( pathing::pathGetCharacterValue(x, y) == pathing::PATH_VALUE_INFINITE )
situations\briefcase\briefcase.cpp
151 !cd->holding_right || (cd->holding_right == d->BookID)
situations\bookcase\bookcase.cpp
139 (cd->holding_left == d->BookID) && (!cd->holding_right || (cd->holding_right == d->BookID))
situations\bookcase\bookcase.cpp
110 e.MatchTimestamp > RoundTimeline[LastMarkSuspectIdx].MatchTimestamp
round_events.cpp
97 verify( GetConnectionNames(Us, sizeof(Us), Them, sizeof(Them)) )
spyparty.cpp
78 0, “unknown packet type: 15”
spy_server.cpp
77 0, “unknown packet type: 9”
sniper_client.cpp
74 Distance2(cd->Object->Position, ps_sci->Object->Position) <= MaxHandoffDistance2
situations\briefcase\briefcase.cpp
70 !gd->ForceGoToPedestalID
situations\steal_statue\steal_statue.cpp
66 am->playing.type == &core_briefcase_pickups
situations\briefcase\briefcase.cpp
59 !”spy stuck!”
spy_server.cpp
59 0, “unknown packet type: 9”
spyparty.cpp
55 pathTestOpen(sx, sy)
object_system\subsystems\pathing\pathing.cpp
50 0, “unknown packet type: 7”
spy_server.cpp
48 d->BookBookcaseID && cd->IsGoalOwner(this)
situations\bookcase\bookcase.cpp
43 !”what do to here?”
examples\lobby\lobbyclient.cpp
40 verify( animation::GetPlayingAnimationInfo(am, &time, &duration) )
situations\conversation\conversation.cpp
40 HoldingBriefcase
situations\briefcase\briefcase.cpp
40 am->playing.animid == -1
situations\pedestal\pedestal.cpp
35 n
spyparty.cpp
32 e.MatchTimestamp > RoundTimeline[LastMarkBookIdx].MatchTimestamp
round_events.cpp
26 verify( animation::HandleDetach(am, am->Events[i].event->boneId, cd->holding_right, cd->holding_left, &OnRight) && !OnRight )
situations\bookcase\bookcase.cpp
26 object_system::GetObject(cd->holding_left) && (object_system::GetObject(cd->holding_left)->Type == FNV1(“BOOK”))
situations\bookcase\bookcase.cpp
26 it != am->AnimHandleMap.end()
network.cpp
26 IsTypingString
spyparty.cpp
26 0, “unknown packet type: 8”
spyparty.cpp
25 DefaultCharacterStatePacket && (ndata == CharacterStatePacketSizeBytes)
sniper_client.cpp
25 cd->object_of_interest == d->BookID
situations\bookcase\bookcase.cpp
24 !p2pauth_con && (p2pauthn_state == WAITING_AUTHN)
examples\lobby\lobbyclient.cpp
24 !IsSpy && d->TargetBookcaseID
situations\bookcase\bookcase.cpp
24 HoldingDrink
situations\drinks\drinks.cpp
23 obj->Rotation.IsIdentity()
character.cpp
23 HoldingBook
situations\bookcase\bookcase.cpp
23 !err, “krb5_rd_priv err: -1765328342”
examples\lobby\lobbyclient.cpp
22 (w >= 0) && (w <= 1)
object_system\subsystems\animation\animation_cal3dutils.cpp
22 d_cust && (d_cust->State == drinks_data::INVALID)
situations\serving\serving.cpp
21 !”somehow in a valid state but !HoldingDrink?!”
situations\drinks\drinks.cpp
20 propid && ( (Spy->holding_right == propid) || (Spy->holding_left == propid))
situations\steal_statue\steal_statue.cpp
20 !HoldingDrink
situations\drinks\drinks.cpp
18 !”somehow didn’t get statue”
situations\pedestal\pedestal.cpp
18 ad && (ad->Object->Type == object_types::STATUE)
situations\pedestal\pedestal.cpp
16 o && !(o->Flags & object::UNMANAGED)
object_system\object_manager.cpp
16 am->queue.empty()
situations\drinks\drinks.cpp
13 !”something went wrong picking up briefcase!”
situations\briefcase\briefcase.cpp
12 !”should have detached”
situations\bookcase\bookcase.cpp
11 !”should not get here”
situations\conversation\conversation.cpp
11 0, “unknown packet type: 11”
spyparty.cpp
10 (w >= 0) && (w <= 1) && (u >= 0) && (u <= 1) && (v >= 0) && (v <= 1)
checkerlib\misc\geomutils.cpp
10 verify( network::SendPacket(&gs, sizeof(gs), true) )
spy_server.cpp
10 (rem >= 0.0f) && (rem < 1.0f)
spyparty.cpp
10 Pedestal
situations\pedestal\pedestal.cpp
10 (err = glGetError()) == GL_NO_ERROR, “code: 0x00000505”
spyparty.cpp
9 Statue && (Statue->Type == object_types::STATUE)
object_utils.cpp
9 Level
network.cpp
9 !err
examples\lobby\async_krb5_wrapper.cpp
9 0, “unknown packet type: 1”
sniper_client.cpp
8 SpyCheck == player_control::state::TESTING
situations\check_watch\check_watch.cpp
8 ObjectIDToByte.empty() || nettest_mode
network.cpp
8 !IsSpy && cd->object_of_interest
situations\pedestal\pedestal.cpp
8 ByteToObjectID.empty() || nettest_mode
network.cpp
8 0, “unknown packet type: 20”
sniper_client.cpp
8 0, “unknown packet type: 13”
spy_server.cpp
8 0, “unknown packet type: 13”
spyparty.cpp
7 ObjectIDToByte.empty() && ByteToObjectID.empty()
network.cpp
7 (CameraMode == SNIPER_CAMERA) && Level
round_events.cpp
7 0, “unknown packet type: 24”
spy_server.cpp
6 SwapStatueID && ( (Spy->holding_right == SwapStatueID) || (Spy->holding_left == SwapStatueID))
situations\steal_statue\steal_statue.cpp
6 RoundTimeline.size() < round_events_packet::MAX_NUM_EVENTS
round_events.cpp
6 o
network.cpp
6 mc && (mc->Object->Type == object_types::STATUE) && (StatueMeshIndex < mc->Meshes.size())
object_utils.cpp
6 IsChatAllowed()
spyparty.cpp
6 ad
object_utils.cpp
6 0, “unknown packet type: 21”
sniper_client.cpp
5 !”shouldn’t get here”
situations\steal_statue\steal_statue.cpp
5 mark_value <= 1.0f
spyparty.cpp
5 client && client->OtherClientID
spyparty_lobby.cpp
5 0, “unknown packet type: 25”
spy_server.cpp
4 !”shouldn’t get here, must have moved while holding book”
situations\book_transfer\book_transfer.cpp
4 object_system::GetObject(History.States[i].ID)
network.cpp
4 Level
sniper_client.cpp
4 Level->ActiveGameTypeIndex < Level->GameTypes.size()
sniper_client.cpp
4 !err
examples\lobby\lobbyclient.cpp
4 am
network.cpp
4 0, “unknown packet type: 10”
spyparty.cpp
3 SpyCheck == player_control::state::TESTING
situations\seduction\seduction.cpp
3 !”shouldn’t get here”
examples\lobby\lobbyclient.cpp
3 i_ind == i_dep+1
character.cpp
3 !Focus
player_control.cpp
3 Control->GetSpyTriggeredResult(this) == player_control::state::TESTING
situations\double_agent\double_agent.cpp
3 !(ChooserCurrentCharacter->Object->Flags & object_system::object::UNMANAGED)
ui.cpp
3 am->Events[i].animation->getCoreAnimation()
situations\drinks\drinks.cpp
3 0, “unknown packet type: 16”
spyparty.cpp
3 0, “unknown packet type: 15”
spyparty.cpp
2 verify( network::SendPacket(&p, sizeof(p), true) )
network.cpp
2 verify( network::SendPacket(&gs, sizeof(gs), true) )
spyparty.cpp
2 verify( ConfirmGameIDToLobby(CurrentPlayID, CurrentGameID) )
spy_server.cpp
2 verify( animation::GetPlayingAnimationInfo(am, &time, &duration) )
situations\book_transfer\book_transfer.cpp
2 t >= 0
round_events.cpp
2 State.CurrentNode->Parent->StringSoFar == State.CurrentLeaf->StringSoFar
spyparty.cpp
2 s
checkerlib\misc\glutils.cpp
2 mc
situations\steal_statue\steal_statue.cpp
2 glMultiTexCoord2f_ && glActiveTexture_
spy_server.cpp
2 GameIDs.find(PacketPlayID) == GameIDs.end()
examples\lobby\lobbyclient.cpp
2 !err && p2pauth_con && krbtgt.data && (krbtgt.length < KRBTGT_LIMIT)
examples\lobby\lobbyclient.cpp
2 (err = glGetError()) == GL_NO_ERROR, “code: 0x00000506”
spyparty.cpp
2 !decoder.underflowed() && decoder.on_last_byte()
examples\lobby\lobbyclient.cpp
2 CurrentNetworkObjectID
network.cpp
2 !ChooserScrollDrag
ui.cpp
2 (cd->object_of_interest == d->BookID) || (ps->status != pathing::PATH_success)
situations\bookcase\bookcase.cpp
2 cd->object_of_interest && (cd->object_of_interest == d->BookID)
situations\bookcase\bookcase.cpp
2 ATPCachedDescription
player_control.cpp
2 Array && Num
checkerlib\misc\utils.h
2 am->playing.type == core_book_hidefilm_okay
situations\book_transfer\book_transfer.cpp
2 0, “unknown packet type: 8”
sniper_client.cpp
2 0, “unknown packet type: 2”
spy_server.cpp
2 0, “unknown packet type: 22”
sniper_client.cpp
1 verify( network::SendPacket(DefaultCharacterStatePacket, CharacterStatePacketSizeBytes, true) )
spy_server.cpp
1 verify( network::SendPacket(CommandsPacketBuffer, SizeBytes, true) )
network.cpp
1 verify( Camera.Project(vector_3(0, 0,0), &origin) )
spyparty.cpp
1 StatueAD && (StatueAD->Object->Type == object_types::STATUE)
situations\pedestal\pedestal.cpp
1 !”somehow didn’t get book”
situations\bookcase\bookcase.cpp
1 ScreamSound
spy_server.cpp
1 network::IsConnected()
spy_server.cpp
1 it != NetTestByteMap.end()
network.cpp
1 fabs(1-Length2(Axis)) < 1e-5
checkerlib\misc\math4d.h
1 (err = glGetError()) == GL_NO_ERROR, “code: 0x00000502”
spyparty.cpp
1 DefaultCharacterStatePacket && (ndata == sizeof(*DefaultCharacterStatePacket) + DefaultCharacterStatePacket->NumCharacters*sizeof(DefaultCharacterStatePacket->States[0]))
sniper_client.cpp
1 !decoder.underflowed()
network.cpp
1 !decoder.underflowed() && decoder.on_last_byte()
network.cpp
1 (d >= 0) && (d <= 1)
c:\users\checker\dev\spyparty\project\spyparty\code\network.h
1 CharacterStatePacket && (CharacterStatePacket->NumCharacters <= MaxNumCharacters)
network.cpp
1 ByteToObjectID.find(CurrentNetworkObjectID) == ByteToObjectID.end()
network.cpp
1 0, “unknown packet type: 8”
spy_server.cpp
1 0, “unknown packet type: 6”
spy_server.cpp
1 0, “unknown packet type: 6”
sniper_client.cpp
1 0, “unknown packet type: 4”
sniper_client.cpp
1 0, “unknown packet type: 2”
sniper_client.cpp
1 0, “unknown packet type: 25”
sniper_client.cpp
1 0, “unknown packet type: 19”
spyparty.cpp
1 0, “unknown packet type: 18”
spyparty.cpp
1 0, “got new play id with existing: 0xca98 “
sniper_client.cpp
1 0, “got new play id with existing: 0x57a5 “
sniper_client.cpp
1 0, “got new play id with existing: 0x5267 “
sniper_client.cpp
1 0, “got new play id with existing: 0x3e15 “
sniper_client.cpp
1 0, “got new play id with existing: 0x33fc “
sniper_client.cpp
1 0, “got new play id (0xabeb) with existing (0xcdb6) “
sniper_client.cpp
1 0, “got new play id (0x6f9f) when already playing with existing (0xfb2e) “
sniper_client.cpp
  1. currently at 16681 people as of this post []