Finishing 0.8 Part VI

Only a short update this week, I’m afraid; this week I’ve been busy putting some of the final touches to my book and haven’t had as much time to program as I wanted; only half a day rather than a full day. As such, this week’s update is very short, but next week’s should be longer. However, in light of my new decision to have a gradual update log, I’m still going to do this post and then next week’s, instead of compressing both updates into one longer update. As such, this week:

  • Most centrally, I’ve finished the task of moving the code that exchanges default words for the preferred word of a given civilization. In some cases this was being called twice, and in other cases not at all, and even though in some cases it was correctly being called once, the range of situations this was being used in were making it all rather unclear. I’ve finished making this shift, which required moving around quite a bit of the sentence generation code and adding some new code to re-handle things like punctuation and capitalisation, but I think that’s now done and working correctly.
  • I’ve been going through and removing a lot of phrases, and a lot of word orders, which sound strange. As several people have pointed out, sentences could sometimes come out rather strangely; I’ve tried to fix as many of these as I can. At the same time, though, some of the interesting but logical sentences are generated from the same sources as the interesting but illogical sentences; it’s tricky to strike the right balance here. As ever, I think this will just need lots of playtesting.
  • Just stated sketching out (on paper) a list of the bugs and small issues that need to be resolved before 0.8 is released; I had a bunch of smaller lists of this sort, but I hadn’t really collated them into one place before. For some of the bugs I’ve decided they don’t need fixing until 0.9, and some of them I decided it was easier to simply remove the thing that caused the bug (temporarily) than to fix the bug now; as I’ve said several times, I’m really trying to do the absolute minimum now required to get 0.8 released, and putting some of this stuff off until 0.9 is definitely the way to go.

I’m afraid that’s all for now, folks. Should get a full day to code next week, so should be back with a larger update next time around. See you all next weekend!

Finishing 0.8 Part V

Lots more coding this week! Let’s get to it:

  • I’ve implemented what happens when the player repeats compliments and insults over and over again (I have previously implemented the repeating of “general statements and questions”, i.e. almost everything, and repeating greetings, which are handled differently). When one says a compliment over and over, the NPC will appreciate it, and express their appreciation, but if you do it too much, they will begin to be a little bit puzzled; there are also some unique responses for repeated greetings being offered to particular classes of NPC. In the future I want to enable some greetings to be met with less positive responses if one greets repeatedly someone who might come from a culture which doesn’t especially like or appreciate the greeting in question.
  • If you repeat the same insult again, the NPC will quickly become even more annoyed than if you had simply said the insult once (which is itself a guaranteed mood drop) and will tell you to stop saying it, threaten you, become exasperated and ask why the hell you keep saying that, and so forth. Given that insults are unequivocally, well, insulting, this was a pretty easy group of phrases to code. I have also made it so that three or more insults in a row always has a 50/50 chance of ending a conversation: so be capable who you have a go at!
  • There was a bug with repeated comments; sometimes the game would seem to forget that you’d just asked something ten times, and if they answered, then said “why are you still asking this?” nine more times, on the eleventh time they would suddenly reply again. That was from the simplest of typos where the game was decided what kind of “why are you still asking this?” response it would give, where very rarely the game would select one which didn’t actually exist, and therefore default back to the previous sentence. This is now fixed.
  • The game previously only checked if someone’s mood had dropped to 1 or 0 to decide whether or not to end a conversation; this meant that if an NPC’s mood dropped from 2 or more to -1 or less, the game wouldn’t catch it, and they would go on talking and hating you, but not ending the conversation. This has also been fixed, and NPCs will end the conversation with you regardless of how low it drops. (It should be noted, the conversation does not literally “end” at this point; I need to add a dialogue box saying “This NPC has walked away” or whatever, and “Press Enter” to then end the conversation. I’ll be doing this before 0.8 is released, and shouldn’t really be too difficult; I’ll also need to add something when you talk to an NPC who has rejected you again, such as “I’ve told you, I have other things to do”, and the like).
  • I’ve given each civilization a list of reasons they might not want to respond to questions about particular topics. So people from an Isolationist nation might be disinclined to answer national or political questions because they are very wary of outsiders; someone from a theocratic nation might be disinclined to answer a religious question because that’s a matter for the state; and so forth.
  • Fixed a range of grammatical errors with the construction of sentences ,and discovered that in some cases, sentences were going through the system that varies each sentence for each culture twice, which was a big problem. That has now been fixed, shifting the “sentence varying” part of the process to something which only takes place once, and before. Before release I will need to spend quite a bit of time talking to every NPC I can find and dealing with every grammatical error I can possibly hunt down, but it’s a work in progress; the speech generation system is so complex, and so much varies, that it’s hard to pin down too much in any one sweep.
  • If people don’t want to respond to the questions you’re asking for personal reasons, there is now a set of responses in place for them explaining that they don’t want to respond for political reasons, or for religious reasons, or whatever. There are also some unique responses if you’re asking particular classes, so an inquisitor might mention it’s particularly suspicious if you keep asking about heresy. What this means if that there are many, many layers of questions and answers that the player will rarely, but sometimes see, and should provide a lot of variety. In this case, you need to ask someone something, it needs to be a topic they would be willing to reply to, and know something about, but they don’t want to talk about, and they decide not to talk to you about it, and they’re of a particular class and asking a particular question, you’ll get a unique response. I want these chains to be as long as possible, to maximise the chance of the player encountering a new response, no matter how long they’ve played the game.
  • I’ve put a lot of work into these responses, which take three forms: “uninterested” (the person doesn’t fancy talking about the topic), “stupid” (they think it’s a dumb question to be asked), and “suspicious” (they are troubled by you asking something).
  • In the case of the “Uninterested” response, they will begin with a sentence along the lines of “I don’t want to answer that” or “I don’t feel like talking about that”. After that, they will follow up with a comment that might be a general comment, or a class-specific comment. If it’s a general comment, they might say “It doesn’t really interest me”, or “I don’t think about such things”, or “Aren’t there other more interesting matters to discuss?”, and so forth. Class-specific, meanwhile, might be something like a miner saying “I should really get back to the seam…” or a priest saying “I would really prefer to speak to you about [god]”, or things of that sort. These have a nice variety, and I was able to think of at least three options for every class, as well as many general variations, all of which will of course vary across culture as with all sentences, so there’s a huge amount of variety here in the kids of responses one will get out of NPCs. 
  • With the “Stupid” response, NPCs will instead open with something like “What a weird question” or “What a strange thing to ask me”, and then proceed to again, either give class-specific or general responses. General responses might be something like “Am I really the person to ask about this?”, or “That makes very little sense”, or “Why are you even asking?”. For the class-specific responses, they will reply in a way that emphasises why this was an especially daft question to ask that NPC class. If you ask a jailer about geography, they might say “My work is in here, and always will be”; if you ask a Concubine about war, they might say “What could I possibly know of battle from in here?”; if you ask a doctor about politics, they might say “Diseases and ailments care not for one’s political allegiance”; and so on. These should help the player to think about what kinds of things they should be asking different kinds of NPCs, what classes and questions make sense together – as well as what classes and questions definitely do not make sense together – and, as ever, dramatically increase even further the variety of things people might say to you in the URR world.
  • For “Suspicious” answers, they start off the same as the “Uninterested” answers, by saying “I don’t really want to speak on that” or whatever, but then things change. For each tag (“political”, “religious”, “geographical”, etc) some NPC classes have special responses, and all have a set of general responses. For example, asking about politics to a concubine might have them ask if you if you’re only asking because of their closeness to a ruler; for other classes, they might say “Politics is a strange topic for you to be asking me about…”, or equivalent. If one asks an individual question, a clerk might emphasise their personal life has no bearing on their work, or an inquisitor emphasises that their purpose is simply to pursue heresy, not to think about themselves. If one is asking about military matters, an officer might question why you want to know about potentially classified material, whilst someone from a militia questions why you’re interested in the defence of their homeland. There are then also some responses based on national ideologies, too, which will sometimes be thrown into the mix. Again: maximising number, maximising variety and difference, maximising the potential for the player to always be discovering new possible responses.

For this week’s sole coding screenshot, here’s a bunch of the “defaults” for the uninterested answers (which are picked at random, then varied for each culture according to procedurally-generated constraints and norms, as usual):

Next up: in the coming week, my objective is to finish fixing any remaining bugs to be found in the above set of points, and then start – I anticipate this taking several weeks – putting into place a structure for filling in the “[god]” and “[nation]” and whatnot parts of sentences, i.e. the parts that vary every time they get uttered and cannot be stored, but have to call reference to a wide range of different saved elements of the game world. I have no idea how fast/slow this will go, but all I can do is get started, so I’ll be doing that next Saturday/Sunday. See you all next week for the first steps into this crucial part of the conversation system!

Finishing 0.8 Part IV

This week I’ve basically been playtesting everything that I coded in the previous three weeks since development actively restarted: this meant playtesting the mood system, playtesting NPCs becoming annoyed with you, making sure NPCs can say a tremendous range of things when you ask repeated questions (as ever, variation and believability are central here, and the two go hand in hand), and then seeing what happens when you ask NPCs all the questions you can ask, and making sure they can give some kind of logical response to them. NPCs should also be able to end conversations, make appropriate comments when they don’t want to respond something, choose what to not respond to, and so forth. I’d say pretty much everything in this selection seems to be working now! Here are some nice screenshots, all taken with one person from one civilisation for each demonstration. You’ll note the [thing] sections remain ambiguous, which is one of the tasks for the coming weeks, but hopefully here you can begin to see how NPCs give you reasons for not responding in various ways, or commenting when you say the same thing too regularly:

Some more work still needs to be done on the “naturalness” of what people say, and ensuring variation of all sentences, and so forth, but you can immediately get some idea from these about how things are shaping up with some of their more detailed responses, and the variety in responses, and there’s also of course a vast amount shown here with unique responses for certain classes, certain questions, certain questions asked to certain classes, asking certain classes from certain nations about certain topics, and so forth. As above, my goal is always to ensure the player might be able to see a new kind of statement in a new context, something that makes the conversation system feel truly deep and open-ended and potentially-infinite, whilst also being able to understand the many factors and many elements encouraging the NPCs one meets to respond in the ways they do. (One might also note a strange name for one NPC – need to fix that! I also got one NPC called “Son of Sluts”, which was pretty great – I’ll be sure to add that to the list of excluded terms). These screenshots have also shown me I need to find a way to add more facial variation to people from the same racial background; although in a global sense the variation is still huge, people will be spending significant blocks of time in one area, and that needs to vary more. I won’t be doing that in 0.8, but probably in 0.9. Next week: more conversation programming! Will be focusing on expanding “uninterested”, “stupid” and “suspicious” responses, people giving political or religious reasons or whatever for not answering things, and how to handle repeated insults and repeated compliments. See you then!

Finishing 0.8 Part III

Before anything else, I had some unexpected donations this week. I don’t push for donations – although such a button is hidden on my site – but one donation in particular was unusually generous this week, and I must express my sincere appreciation to BP (that seems anonymous enough!) for the support; it’s very generous and very much appreciated. Otherwise, I am pleased to report another productive week of coding for the books. Instead of playtesting everything I did last week, I decided to add another large body of new code, then playtest everything from the last three weeks next week instead. So, here’s the new code implemented this week:

  • Most importantly we have three new elements that influence how NPCs respond to conversations: sensitive topics are “tagged” as such, NPCs are more or less inclined to respond to those sensitive topics, and they have three kinds of basic responses when explaining why they don’t want to respond to something you’ve said for personal reasons (as opposed to not knowing the information, which is factored in elsewhere, and isn’t a case of “not wanting to reply”, but rather “being unable to reply”).
  • Every possible question now has what I’m loosely calling a “conversation tag”, which denotes whether it might be a sensitive topic on any of seven possible axes – “individual”, “political”, “national”, “religious”, “military”, “cultural”, “geographical”. Some of the questions will be potentially sensitive on more than one count. For example, if you ask about the politics of an NPC’s nation, that will naturally be flagged under both the “political” and “national”. Most questions have no tags, then it looks like around a third have one tag, and then a very small number have two tags or more; the most tags are questions asking people about the ideologies of their nation, which might be “political”, and “national”, and then “religious” or “cultural” or whichever other applies. What this means is that when you ask someone a question, it will check whether this is a sensitive topic, and the answer to that question will influence whether or not they are willing to give you an answer at all.
  • Then the next part is inclinations – how inclined are people to tell you about potentially sensitive topics? Each NPC has a rating for religious topics, for political topics, and so forth, which varies hugely across NPC classes. This is on an internal scale of 0-4; at 0, they will rarely talk to you about a sensitive topic (of the sorts listed above), at 4 they will always talk to you (extremely rare: only national and religious leaders, and then one NPC class per category, will always tell you about X). All other classes are spread out along 1-3 (default “humans” are almost always on 0, or if not, they are on 1 instead). If you ask a non-sensitive question, whether or not they answer will be dependent on other factors (how much they like you, etc) – if you ask a sensitive question, it will check which conversation tags are listed for that question, and compare their rating.
  • This might seem incredibly complex, so here’s an easy example. You ask someone about their religion. The game checks how inclined that NPC class is to talk about religious matters; a priest is very inclined, your average innkeep doesn’t have much time for religious matters, and so forth. An appropriate die is then rolled for the question; if successful (and other tests are passed, e.g. the NPC likes you enough), you get your answer. So what happens if they say they don’t want to talk about X?
  • Well, I’ve split the “I don’t want to talk about X” into three categories, I’m calling “stupid”, “uninteresting” and “suspicious”, which are the reasons NPCs will give you for not wanting to give you a reply. The “stupid” option means that the NPC is baffled why you are asking them about that particular topic: for example, asking a monk about military matters, or a farmer about sculpture, or an officer about plant life, is likely to elicit this response. The “uninteresting” options is the default, and simply means the NPC doesn’t want to talk about it right now, for which they might give a bunch of reasons. The “suspicious” option means that the NPC refuses to talk on the topic, and is puzzled, concerned, worried, anxious, or most obviously suspicious about why you ask – this happens most often when happening about military matters, but can crop up for any conversation topic except the “cultural” ones.
  • In some cases NPCs will give you a specific reason for not wanting to continue the conversation. If you asked about a religious topic, and they don’t want to reply, and they are from a particularly zealous nation, they might say something like “That knowledge is only for loyal followers of [god]”; or if you asked about a political topic, and they are from an isolationist nation, they might explain a dislike of talking to strangers about the politics of their homeland.
  • So, a “I don’t want to reply” looks like the following. If “Uninteresting”, they say “[Sorry, I don’t want to talk about that]. [Cultural reason why not]”. If “Stupid”, they say “[Am I really the person you want to ask/I dislike that topic/why are you even asking this?]” (without cultural reason). If “Suspicious”, they say “[Cultural reason why I can’t answer. And why are you even asking?]”.
  • I noticed very few questions have the “Cultural” tag – I’ll have to add some more in later versions.

So: these were the things that last week I wanted to get done this week, and they’ve been done. Very please with the week’s coding! You’ll also probably note there are a lot of elements going into how and whether NPCs reply to you. What is their mood? What culture are they from? What culture do they think you are from? What topic are you asking them about? How has the conversation previously played out? What NPC class are they? And if you’re thinking this is a lot… it is! But I think this is what goes into making a reasonably realistic, and hopefully gameplay-interesting, conversation system. When you “fail” to get a reply, for any of the above reasons, the “failure” messages are all being designed so that you know why you didn’t get a response. If the NPC didn’t reply because they don’t like you, because you’re asking about a sensitive topic, or because they dislike the nation you seem to be from, it should always be clear, and allow the player to learn what it takes to find people who are willing to talk to them, and to talk to them in an appropriate way to actually get an answer.

Next week: playtesting and screenshots!

Finishing 0.8 Part II

Lots more progress this week! Still feels so great to be back into coding, and make solid and rapid progress on the conversation systems too; it’s striking how much can be done in a day when one really focuses. In keeping with our new method of rapid blog-entry-writing which is something akin to a changelog, here we go:

  • Finished off all the possible “annoyed responses”, which fall into four categories, which I’m calling “general responses”, “class responses”, “default responses” and “special responses”. When you ask someone the same thing twice or thrice, they give increasingly annoyed or puzzled responses; then, when you ask again, one of these comes into play. 50% of the time when you ask someone the same question over and over, they’ll give a response similar to the responses they gave when you’d asked the same question twice or thrice, i.e. “why are you still asking me this?”, which will sound more or less annoyed depending on their mood (“general”).
  • However, sometimes instead of a general response they will give a “class” response, which is a response tailored to their class. For instance, a ruler will specifically scold you for wasting their time; a torturer or a gladiator might make veiled threats about wasting their time; monks will express anxiety about the fact they aren’t getting on with their studies; and so forth. These give a nice little bit of flavour; roughly half of all the NPC classes have “class responses” of this sort when you get on their nerves, but they don’t always come into play. These will also later on appear when you ask irrelevant questions, as well repeated questions.
  • Then, the other 50% of the time (when general/class responses are not triggered) the game will look to see if there is a special response for being annoyed about that particular topic, which might be annoyed after giving a positive response (the NPC answered you, yet you keep asking) or a negative response (the NPC didn’t answer you, yet you keep asking). Some questions have special responses for positive/negative original answers, others just for one. If one exists, it then picks one; for instance, if you asked an inquisitor about heresy, and they didn’t answer, and you repeatedly ask, they might say “At this point, I begin to find your fascination with heresy concerning…”, or if you asked them about nearby volcanoes, and they answered, and you keep asking, they might give a snide response like “I’ve said all I can – these things are hard to miss”. If a special response exists, it is chosen 75% of the time.
  • Then, if there is no special response coded for the question and the specific positive/negative modifier in question, the game then goes for a “default response”. If they responded positively, they might say something like “I’ve told you everything I know about [topic]”, or if negatively, something like “I will not speak about [topic], can we move on?”. The [topic] in this case will be drawn from a large library of phrases, like “buildings”, “my health”, “my homeland”, “weapons”, “fighting”, “these tombs”, “noble houses”, or whatever makes sense for the topic.
  • These also vary according to mood, so an NPC who still likes you after your constant questioning might say “What interests you so much about [x]” or “I’ve already told you about [x]”, whereas an NPC annoyed with you will give sharper “Why do you persist in asking about [x]” or “I have got nothing more to say to you about [x]”.
  • What all of this means is that the responses of NPCs when you get on their nerves is tremendously varied according to their mood, their background, their NPC class, their origins, what you’re asking about, how many times you’ve asked them, a wide range of other factors. It would take a tremendously long time for anyone to come close to seeing all the possible annoyed responses in the general/ class/ default/ special response categories.
  • Some questions being asked repeatedly cause a bigger mood drop than others. For example, if you ask about sensitive topics, they get miffed much faster; if you ask about particularly mild topics, there is now a small chance they will not lose 1 mood; in general, though, asking a question twice will, 90% of the time, cause mood to drop by 1 (for those who don’t recall, “mood” is on a nine-point scale, and if it drops to 2, there is a 33% chance they end the conversation; at 1 there is a 66% chance they end it; if it’s at 1 and should drop again, they will always end the conversation).
  • Also, asking people from more hostile or more closed nations the same question over and over comes with a die-roll for an extra mood drop alongside the default “1”. What all of these points mean is that (in the extreme cases) asking someone from a friendly nation about a neutral topic will take a while to annoy them if you repeat the same query; asking someone from a much more hostile nation about their work as an inquisitor is going to tire them out extremely quickly; and all other interactions fall somewhere in the middle of that spectrum.
  • Lastly, some NPC classes will always have their mood drop faster if you annoy them: this means rulers of various sorts, top-tier military officers, inquisitors, archivists… basically any high-rank NPC will get annoyed with you far more rapidly.
  • I’ve also coded in what NPCs say when they want to leave a conversation with you; for now, this only happens if you ignore them. There are a wide range of default goodbyes that any class can potentially use, and some classes can only use because they don’t have special goodbyes. Other classes do have special goodbyes, where they will explain that they need to go and do X, or talk to Y, or handle Z, or otherwise that your inane blather is generally less important to them than whatever else they might be doing. They then conclude with a “goodbye”, “farewell”, or similar.
  • Note that these are very different from the goodbyes you get from NPCs if you say goodbye first and they echo the goodbye; they will give you at least a reasonably nice response back, even if their mood value is getting quite low. These goodbyes only happen if the NPC decides on their own account to end the conversation because whatever the player is saying is too annoying/irrelevant/distracting to continue the conversation.
  • On some goodbyes where appropriate, NPCs might mention the time, e.g. “Good day to you” or “I bid you good night”, etc, and the word used will be appropriate to the time of day, i.e. morning/day/evening/night.
  • Also, of course, made sure illogical goodbyes cannot be said – for example, a prisoner will not say “I must attend to other matters now!” and then just go back to walking around their cell; whereas free NPCs might say that, a prisoner might instead say “This conversation has become too trying”, or “Your tedious questions have become too much”, or whatever.
  • Added another 100 words/phrases that can be unpacked and spoken differently in each nation, and made sure they can conjugate all the other versions of the phrase sensibly; so “say” can be “say”, “utter” or “speak”, then “said” could be “said”, “uttered”, “spoke”, and “saying” can be “saying”, “uttering” or “speaking”, and so on and so forth. Also added new conjugations of existing phrases or words which hadn’t previously been put into the database.

Next week? I’ll be playtesting all of this stuff, and once that’s all working fine, working on some other aspect of conversations. As mentioned before, I am actually not trying to do everything needed for conversations per se for 0.8 – the “metaquestions” (“What do you think of [artwork]”, etc) are being omitted until 0.9 at least, for example – but just enough to get the release off the ground and let people explore the central elements of the conversation system. As well as playtesting these elements, I want to start going through all the questions you can ask people, and check those work – I’m sure there are some bugs or typos in there I haven’t spotted yet. I’m confident by the end of next week I can have all that done, after which I’ll start working on having things like “[god]” or “[nation]” or “[house]” or “[officertitle]” or whatever correctly appear in speech. Those are a complex set of variables which will have to draw on a lot of different parts of the game, and I don’t want to tackle that until everything here, and the standard Q&A, are all implemented. See you all next week!

Some of the new word variables/extensions, where the comments remind me which other conjugations also need to be covered:

The general words people will use when they ask things like “why are you still asking me about X”:

As you can tell, a large part of this week has been writing massive lists! At least next week it’ll be back to playing the game itself and seeing how things play, so hopefully some in-game screenshots will come your way next time…