I've been trying to write this essay, but it keeps turning into a book. Let's see if I can keep this short...
First, you'll need to read this. In order for a social NPC to be of any interest, they need to have some kind of feedback. It is best to link this into the gameplay - being friends with someone has an in-game effect of some kind. You may also choose to make it social or personal, such as them sharing secrets or childhood wishes. These should not, however, be the only kind of response.
The difficulty here is that the kind of game you're running will, by its nature, limit the kinds of responses you can have. For example, if you're doing a zombie game, the social NPCs are pretty much limited to responses that affect your zombie protection measures. Become friends, they'll share their food, or try to protect you rather than running away, or follow orders better, etc. You can add in the ever-present personal elements too: romance, personal friendship, etc.
This is very limited. In this kind of situation, the "edges" of the simulation, the parts where the players will naturally want to go, will be the parts that don't have anything to do with zombies. It's the "luxury" gameplay: once you've mastered getting people to cooperate with your zombie-protection efforts, you can move on to getting them to kiss you.
Unless you're aiming to make a pornographic game, this is going to be a pretty limited kind of relationship... so let's consider what kinds of feedback (what kinds of things the NPCs can do) would make the social situation "deep" enough to allow for "deep" social gameplay?
To me, the basic idea is the same as in every other form of gameplay. You need to have nested feedback loops. Once the inner one is learned, the next one out starts to spin, modulated by how the player is using the inner one. When that one is learned, you spin up the next one... just like a first person shooter where you learn to move, learn to navigate, learn to shoot, learn to fight, learn to use different weapons, learn to manage ammunition...
There are also side-loops that aren't directly in the chain, such as hacking or other 'mini-games' that don't directly involve the chain... and the chain isn't usually quite as clearly nested as I'm pretending... but overall, it's more or less like I describe.
Most games stick to only one "social loop", and a very one-dimensional loop: how much the character likes you. Once you learn how to make them like you, you get whatever useless reward they offer and then never see them again.
We can think of this linear scale as a first element, much like being able to move left and right in a Super Mario game. If we want to clone the same nested loops that Mario has, we have to implement a "level" (the "mental and social terrain" of the NPC). Moving left and right (being nice or cold) can't get you to the goal, because there's stuff in the way: just being nice all the time will make you fall down the pit because he or she gets suspicious of your cloying nature. Or you hit a wall: they don't mind you being nice, but it's not going to make them like you any better.
Navigating this terrain is important, so we add "jump" functionality, just like in Mario. Once you can socially "jump", you can navigate the terrain left and right - sometimes having to be cold instead of nice in order to get over some blockage.
What does the "jump" represent? What kind of social action "jumps"?
I would probably say "hanging out". Doing some kind of activity together, whether it's slaying monsters or watching a movie or whatever. Spending time together "jumps". We can make different kinds of hanging out have different effectivenesses on different characters: If you're trying to jump in a warrior's social world, watching a movie with them is just a little hop while fighting demon dogs with them is a big leap.
Continuing on the Mario framework, it's not simply jumping and walking around a still level: you have to navigate enemies. Some enemies can be stomped, some enemies can be stomped and give resources (shells), some enemies cannot be stomped and must either be evaded or fireballed.
The fireball would, I think, be a gift. Again, the size and speed of the fireball would depend on the kind of gift. If you're trying to be friends with a Star Wars geek, giving him a basketball would not produce much of a fireball.
At this stage we've built a complex level and method of navigation, although we're kind of pushing to the side any idea of representation. These nested feedback loops are guaranteed to make our social gameplay more interesting, so long as it's possible to see what we're doing. Unlike most games with social elements, we're not dictated as to exactly what we do, we're just dictated as to the kinds of challenges we encounter. How we deal with them is up to us.
In-world rewards are kind of scarce and boolean with this, though. What does beating a level get you, exactly? You win, they're your friend, you get their useless little thing, and then you never see them again?
Instead, I would have it so that every time you wanted something from them, a level is generated that you have to navigate. If you want them to give you their cool sword, you face a difficult level that will require a lot of being cold, being nice, hanging out, and giving gifts... You would get a different level (but the same general idea) if you wanted them to vote against the Orc Party in the senate...
Some situations would have time pressure - can you convince them to vote before the senate meets? Others wouldn't. But time would be measured in terms of "real-world" time rather than "Mario-level" time.
Anyway, I have lots more thoughts on the matter, and there are a lot more games I want to clone and demonstrate (particularly ones that don't start with a 1D navigation), but this is already long enough.
Do you see what I'm getting at? Do you understand? What do you think?