Others Abandoned Esoteric Erotica [v0.149 Alpha] [EsoDev]

5.00 star(s) 1 Vote

EsoDev

Newbie
Mar 4, 2020
63
62
Okay, so it could be because I am still using Windows 7, 64-bit. That's the system. I extracted the files and installed as an administrator.
Yeah, it's not related to installation. If it doesn't install, it displays in the right colours but the UI doesn't work like it should. I think you'd be able to get to the second page of character creation and get stuck there. Still, no idea what's up. Can you show me how it looks? I know it runs on Windows 7, 64-bit because I used to develop it on one and nothing changed with the display since then. Are your .NET libraries up to date? That's the only thing I can suggest off the top of my head. It's just not enough for me to work off to find a solution.
 

Melongirl3

Newbie
Feb 6, 2019
87
82
Yeah, it's not related to installation. If it doesn't install, it displays in the right colours but the UI doesn't work like it should. I think you'd be able to get to the second page of character creation and get stuck there. Still, no idea what's up. Can you show me how it looks? I know it runs on Windows 7, 64-bit because I used to develop it on one and nothing changed with the display since then. Are your .NET libraries up to date? That's the only thing I can suggest off the top of my head. It's just not enough for me to work off to find a solution.
That's the main screen. Idk if my .NET libraries are up to date :O
 

EsoDev

Newbie
Mar 4, 2020
63
62
That's the main screen. Idk if my .NET libraries are up to date :O
Ah yeah, that's definitely the same thing that person from Japan mentioned. I never managed to reproduce it, unfortunately. So I have no idea what's up. I don't know, I'd suggest uninstalling. If I ever get enough data to figure out what the issue here is I'll fix it, but right now I have no ideas. All I can say is that the interpreter is running correctly but then the display doesn't parse the CSS. I'll try to look up if I can find anything. Can you at least tell me what version of Win 7 are you running?
 

Melongirl3

Newbie
Feb 6, 2019
87
82
Ah yeah, that's definitely the same thing that person from Japan mentioned. I never managed to reproduce it, unfortunately. So I have no idea what's up. I don't know, I'd suggest uninstalling. If I ever get enough data to figure out what the issue here is I'll fix it, but right now I have no ideas. All I can say is that the interpreter is running correctly but then the display doesn't parse the CSS. I'll try to look up if I can find anything. Can you at least tell me what version of Win 7 are you running?
Is there any uninstaller or just deleting the stuff from both registry and what extracted? I am using Windows 7 Ultimate. Thanks in advance! :)
 

EsoDev

Newbie
Mar 4, 2020
63
62
Is there any uninstaller or just deleting the stuff from both registry and what extracted? I am using Windows 7 Ultimate. Thanks in advance! :)
Delete manually from the registry, yeah. And delete the files.

I mean more like the update version, not the package version. The only theory I managed to concoct during the last few minutes is that it has something to do with having a Windows 7 that isn't fully updated. In that case, it might not understand the browser emulation feature version, since the one I use was introduced very late into Win7's life. So I'm guessing that might be an issue, you would definitely require at the very least Win7 SP1, possibly higher.
 

Melongirl3

Newbie
Feb 6, 2019
87
82
Delete manually from the registry, yeah. And delete the files.

I mean more like the update version, not the package version. The only theory I managed to concoct during the last few minutes is that it has something to do with having a Windows 7 that isn't fully updated. In that case, it might not understand the browser emulation feature version, since the one I use was introduced very late into Win7's life. So I'm guessing that might be an issue, you would definitely require at the very least Win7 SP1, possibly higher.
Ah okay, that could be the problem. Thank you for the clearing up :) I will try it on a windows 10 system then when I update to it.
 

OakWhoYell

Newbie
Nov 28, 2018
27
28
The two main things people seem to ask for is:
a) male characters
b) dominant characters
Neither of which I'm interested in doing, since I find it to absurdly bloat the scope of the game while also constituting something I'm not that fond of writing from a player character perspective.

Were you thinking of something in particular?
I got it that you're not interested in writing anything besides what you already stated (BDSM with tendency to more mature male characters), and yes, it will be a pain if you try to add entirely opposite colors, especially if you don't want to write it. But what about just a bit of neutral tones? I think just one or two options of more plain but more understandable to many relationships (in terms of age and sexual themes) will be good enough. More to it, if you're trying to make characters somehow deep (and I think you are, judging by the game description), it'll be just cool to add deep and complicated 'normal' relationships option just to show 'em porn game creation peasants how it's done, haha. Well, I'm just joking, sorry. Or an ability to shift focus from erotic part to 'a lore rich world for the player to interact with and one that offers adequate, satisfying choices' (the key word, again, is choices that suppose to be adequate and satisfying but... in that low range?) for people to enjoy the writing and (I hope) cool setting and deep character interactions. Again, I'm not asking anything, just trying to give options how to make project less niche without heavy additions to the core concept (and yes, I got it you don't even aim to a niche and working to your own... pleasure?). Damn, I'm not even sure the project will be done someday, but will be hoping for the best anyway.
 

EsoDev

Newbie
Mar 4, 2020
63
62
(BDSM with tendency to more mature male characters)
No, this isn't quite right, there's going to be two human doms (and a friendly tentacle monster too b.t.w.), you get to choose between a male and a female one. The other character got design work done but she never materialised in the game so far because, quite frankly, the person who was supposed to help writing her bailed on me without ever delivering anything.

More to it, if you're trying to make characters somehow deep (and I think you are, judging by the game description), it'll be just cool to add deep and complicated 'normal' relationships option
The way we're trying to handle this will not force you to do BDSM, actually there's nothing in there to force you to do anything. The game is very consent focused, that includes ability to say no to anything you are not interested in. The way our relationship systems is designed (and implemented) allows different kinds of relationships with the NPCs (you can befriend someone without having sex with them, for example) and our new sex systems are designed around adaptability. The idea that not only do the NPCs inquire about your interest and consent to sex acts, but also learn about your preferences and try to apply that to sex. And just to be clear, we have systems for learning preferences that are implemented and running at this point. It's one of those things that I've totally not been working on since the game doesn't have any progress, obviously.

I just have a particular interest in including BDSM because I like it myself.
 

regjunk

New Member
Nov 9, 2020
6
0
That would be working on the assumption that there's some core issue that makes the internal workings of the games complicated, rather than the reality of the content representation being just overall complicated. And with the actual situation being the latter, I've found it more worthwhile to automate the details where I can. I have a set of tutorials on my blog discussing adding a very simple event to the game in any case, you can see what the issue is from there:







Keep in mind it's a very simple event. Most of the content the game deals goes well beyond what's written there.
Wow, this is very interesting project. Underlying project architecture is beautiful, probably one of most interesting projects I've ever seen.
Additional points for set logic queries, did't expect to encounter them here.
However, engine and game logic itself is pretty strange (maybe because it is in early development stage?), there is a lot of imperative code with inline html/css, instead of declarative approach, which causes early stages of combinatorial explosion (too much copy-paste).
It is like inform7 games (which has interesting, but simplier data-driven architecture), where games often use imperative code instead of underlying concepts. Maybe it is easier for writers?

Not sure if it is intentional, but engine goes to great lengths to avoid concepts of attributes, but I cannot find reasons for that. This also causes bug in character creator, which allows mutually exclusive values (such as multiple eyes colors (but only one shown in description, which doesn't looks like attempt to represent heterochromia), warm+cold). Scoped variables is great concept, but it is too low-level and loses information about relationship between same variables in different scopes.
For example, color of eyes and hair is same thing and probably can re-use some description templates (of course eyes and hair has different subset of possible values, but it is easy to represent).

Small bug report screenshot attached. Also, assesing content of fridge ignores coat inside.
 

EsoDev

Newbie
Mar 4, 2020
63
62
why won't it accept any names i put in
What name are you trying to set?

Wow, this is very interesting project. Underlying project architecture is beautiful, probably one of most interesting projects I've ever seen.
Additional points for set logic queries, did't expect to encounter them here.
However, engine and game logic itself is pretty strange (maybe because it is in early development stage?), there is a lot of imperative code with inline html/css, instead of declarative approach, which causes early stages of combinatorial explosion (too much copy-paste).
It is like inform7 games (which has interesting, but simplier data-driven architecture), where games often use imperative code instead of underlying concepts. Maybe it is easier for writers?
Generally if there's inlined HTML/CSS or repetitive code somewhere it's because either it was generated that way or alternatively because the HTML/CSS is unique to something being displayed. In either case, it doesn't cause any combinatorial explosions and it's not copy pasted. Unless you consider a machine generating code to be copy pasting it, in which case, yeah kinda, but not really. I have no idea what you mean by making it declarative considering that no language used to write the game uses the declarative paradigm.

Not sure if it is intentional, but engine goes to great lengths to avoid concepts of attributes, but I cannot find reasons for that. This also causes bug in character creator, which allows mutually exclusive values (such as multiple eyes colors (but only one shown in description, which doesn't looks like attempt to represent heterochromia), warm+cold). Scoped variables is great concept, but it is too low-level and loses information about relationship between same variables in different scopes.
For example, color of eyes and hair is same thing and probably can re-use some description templates (of course eyes and hair has different subset of possible values, but it is easy to represent).
It's not my problem to ensure that people make characters that make sense (in terms of appearance) as much as it's my problem to ensure people have the tools to create the character they want (within reason). The choices you make are the attributes, I'm not sure what else you want me to do with it. Same with the "descriptive templates" thing. Hair and eyes have different descriptive templates. There's no possible cross over between them, because there's never a case where you'd describe hair in the same way you'd describe eyes.

Small bug report screenshot attached. Also, assesing content of fridge ignores coat inside.
Ah, there we go, corrected.
 

karinoire

New Member
Nov 2, 2021
3
1
Even though there's not much content, I do like what's been put out so far, especially the various choices you can make even in the prologue alone. Looking forward to see where this project goes.
 

regjunk

New Member
Nov 9, 2020
6
0
Generally if there's inlined HTML/CSS or repetitive code somewhere it's because either it was generated that way or alternatively because the HTML/CSS is unique to something being displayed. In either case, it doesn't cause any combinatorial explosions and it's not copy pasted.
Hm, I'm not sure if this is generated (I know about wizards for items):
interaction-resources (you can use some html templating here):
Code:
Line 18: true;<span class="indent"></span><i class="fa fa-chevron-circle-down fa-fw red"></i>: you take longer to accomplish tasks that would be otherwise trivial if you were not as tired, you might find yourself unable to do certain things, learning becomes harder, at very low values you may fall asleep randomly in some safe place;
Line 21: true;<span class="indent"></span><i class="fa fa-chevron-circle-down fa-fw red"></i>: your Stamina depletes slowly over time, faster when you exert yourself;
Line 25: true;<span class="indent"></span><i class="fa fa-chevron-circle-down fa-fw red"></i>: social interactions might become more difficult, learning becomes harder;
Line 29: true;<span class="indent"></span><i class="fa fa-chevron-circle-down fa-fw red"></i>: daily tedium takes its toll on you consistently, unpleasant events can push you even harder;
Line 35: true;<span class="indent"></span><i class="fa fa-chevron-circle-down fa-fw red"></i>: as you spend money you have less of it;
But mostly examples below.

Unless you consider a machine generating code to be copy pasting it, in which case, yeah kinda, but not really.
If its not manually modified, then its kinda ok (but harder to read anyway).

I have no idea what you mean by making it declarative considering that no language used to write the game uses the declarative paradigm.
Its not about language (they're all the same), but about code itself. For example, you can write imperative code in haskell and declarative code in javascript. Currently significant part of engine already declarative (rules, state transition, graphs), but there also too much specific imperative code everywhere which makes it a bit harder to read. Just to be sure, I'm not trying to impose anything, just sharing feedback.
For example, determine-height-difference.state, it shows most things I've talked about:
- there is copy-paste + attributes thing:
- npc and pc attribute height is different thing, which means there will be multiple description templates for them
- npc can be {short, average, tall}, but pc only {short, tall} by some reasons
- there is no support for npc in heels
- everything is defined as imperative code with GOTO (GOTO is ok, especially in games)
- instead of this it is possible to define that in declarative approach:
Code:
  short = 0, average = 1, tall = 2;
  // Note, its not assign of value, but assign of expression, which is dynamically calculated on access of attribute
  char.total_height = sum(char.height, char.heels?.height, char.hat?.height); // Or we can have attribute height in clothes itself and just sum all .height of all elements inside char.
  // Matrix of height differences (char1.height.values * char2.height.values, where '*' is set product), more declarative since describes state, not how to get it
  height_diff = (char1, char2)=>[
    // short average  tall
    equal,   taller,  taller,
    shorter, equal,   taller,
     shorter, shorter, equal,
  ];
  // OR at least
  height_diff = [shorter, equal, taller][clamp(char1.height-char2.height, -1, 1)]
  // where clamp = (value, start, end)=>Math.max(start, Math.min(value, end));
- its very basic conpcept, but already takes 50+ lines, which can make code unmanageble when more content added.
- it is impossible to set character height by user, need to know rules on how-to it selected (because of lack multi-valued attributes), and it is inconsistent:
for example: build petite+athtletic will trigger rules for is-short and is-tall at same time, which means for both short and tall npcs height will be equal to pc.
(maybe it was game mechanic, "try to create build with desired height"?)

It's not my problem to ensure that people make characters that make sense (in terms of appearance) as much as it's my problem to ensure people have the tools to create the character they want (within reason). The choices you make are the attributes, I'm not sure what else you want me to do with it. Same with the "descriptive templates" thing. Hair and eyes have different descriptive templates. There's no possible cross over between them, because there's never a case where you'd describe hair in the same way you'd describe eyes.
Well, in this specific case (warm+cold, small+big, thin+thick example, and multiple color choices) feels like bug. Multiple color choices is ok, but then better to use all colors, not randomly select one of them.
Also, if I understand correctly, same problem can happen when random character generator is used (and you cannot blame user for wrong choices) and in case of generated npcs (if they are planned).
About attributes, currently there is binary attributes instead of multi-valued one, which means that there is no information about theirs relations:
Code:
char.eyes.warm: false | true
char.eyes.blue: false | true
char.eyes.green: false | true
char.eyes.red: false | true
// instead of 
char.eyes.temperature: cold | warm
char.eyes.color: blue | green | red
I understand, that it is easier to create queries about binary attrbiutes (using set logic) and it is a bit more efficient, since you can use bitset for attribute storage.
But you can still have set-logic queries and multi-valued attributes at same time:
- there is 'world' graph (just array) for every object (not OOP, just generic game object/concept, such as character or clothes)
- every item in graph has structure like this: [tag, ...data], which has variable length (you can store and process it pretty efficiently).
- tag is edge in graph (indice in array of everything), which describes internal structure of node (set of fields names and nodes)
small example:
Code:
graph = [
// attribute values 
'red',
'green',
'blue', 
'warm'
'cold',
// color possible values
[0, 1, 2],
// temperature possible values  
[3,4],
// character metadata (set of [field_name, edge to set of possible values])
[['color', 5], ['temperature', 6]]
// character (color red+blue, temperature warm)
[tag: 7, [0, 2], [3]],
]
- edges list here (which looks like array []) is actually set, which means you can dynamically select implementation based on size and density for efficient storage (sorted array, bitset, range).
- graph is directed, which means you can construst inverted graph (not sure if its correct term) which has different direction of edges (A->B converts to B->A).
- In inverted graph all values will have edges to elements/objects in which they used and since edge list is a set, we can do set logic operations on it:
inverted_graph[0].edges & inverted_graph[3].edges // set of all elements which has attribute 'red' and 'warm'
If you found this interesting, I can think of less invasive design (but its not that complex and pretty easy to implement actually).

BTW, there is pretty strict rules about names (capitalized 2+ chars), age (18-35) and limited color choices, which looks a bit inconsistent with idea of "any character is possible".
Hair and eyes is probably bad example (however it still can be used in generic templaces like '[quantity, quality, size, age, shape, color, proper_adjective, purpose] {noun}'.
More correct example (also about copy+paste):
Code:
// fingernail-colour-complex
Line 14: pink;[?pink|pink|pink painted|pink coloured]
Line 16: red;[?red|red|red painted|red coloured]
Line 17: rose;[?rose|rose|rose painted|rose coloured]
// lip-colour-complex
Line 12: red;[?red|red|red painted|red coloured]
Line 14: pink;[?pink|pink|pink painted|pink coloured]
Line 15: rose;[?rose|rose|rose painted|rose coloured]
 

EsoDev

Newbie
Mar 4, 2020
63
62
- there is no support for npc in heels
Good catch. That did completely slip my mind.

Otherwise what you are describing is just syntactic sugar, the execution will not be simpler than what I've written already.
 

regjunk

New Member
Nov 9, 2020
6
0
Otherwise what you are describing is just syntactic sugar, the execution will not be simpler than what I've written already.
Yep, I'm mostly talking about readability and easier way to develop this. Execution should be pretty fast (and feels like it is fast already), I don't see any reasons why it should be slow, so there is not much reason to simplify it.

Updated:
Actually, execution in this specific case will be even faster, since matrix is branchless code which just loads value by address, when current code doing jumps by modifying instruction pointer which will cause cpu branch predictor to reset state, which is slow.
 
Last edited:

EsoDev

Newbie
Mar 4, 2020
63
62
Yep, I'm mostly talking about readability and easier way to develop this. Execution should be pretty fast (and feels like it is fast already), I don't see any reasons why it should be slow, so there is not much reason to simplify it.
I have no issues with the readability of the code. The code is written as it is specifically to balance readability for me and ease of parsing or the machine. There are things in the game that are complex enough that they encounter issues with processing time.

Updated:
Actually, execution in this specific case will be even faster, since matrix is branchless code which just loads value by address, when current code doing jumps by modifying instruction pointer which will cause cpu branch predictor to reset state, which is slow.
Sorry, but that's just not how any of this works. I can assure you, as the person who made the engine, that not a single word of what you wrote above has any relation to how this is executed internally.

Look, I appreciate your attempt to understand what's happening in the code, but it's just not accurate. You have a limited view of how any of this works internally and it leads you to miss the forest for the trees. There are reasons a lot of the things are the way they are, many of them have to do with optimising output quality, others are things that optimise the process by which the game comes to a conclusion.

Lets use the height difference thing as an example, the reason why the file is 50 lines long, apart from the formatting, is that what's stored there is already an optimised graph, or more specifically, a finite state automaton. The optimisation isn't about the volume of code, but instead the number of lines that need to be parsed to get to the end. I could make a more elegant looking implementation of it. But I don't think I could make a more efficient implementation of it. Did I need to write it as unwrapped code? Probably not, but I wrote it as unwrapped code when I wrote it and that's about it.

A different example is the "copy paste code" you cherry pick from the, let's say, fingernail-colour-complex file. The actual form of the file is this:
Code:
amber;[?amber|amber|amber coloured|amber painted]
amber;sunshine [?coloured|painted]
aqua;[?aquamarine|aquamarine|aquamarine coloured|aquamarine painted]
black,jet,dark;darkly painted
black;[?black|black|black painted|black coloured]
blue;[?blue|blue|blue painted|blue coloured]
crimson;[?crimson|crimson|crimson painted|crimson coloured]
emerald;[?emerald|emerald|emerald painted|emerald coloured]
glossy;glossy
gold;[?gold|gold|gold coloured|gold painted]
green;[?green|green|green painted|green coloured]
jet;jet [?coloured|painted]
orange;[?orange|orange|orange coloured|orange painted]
pink;[?pink|pink|pink painted|pink coloured]
purple;[?purple|purple|purple painted|purple coloured]
red;[?red|red|red painted|red coloured]
rose;[?rose|rose|rose painted|rose coloured]
sapphire;[?sapphire|sapphire|sapphire painted|sapphire coloured]
sparkling;sparkling
teal;[?turquoise|turquoise|turquoise coloured|turquoise painted]
violet;[?violet|violet|violet painted|violet coloured]
dark;dark
This file represents part of a bigger graph. This file has the form it has because it's the best way to form a relation between the BoW (bag of words, on the left) representing the fingernail attributes and the output (on the right) in a way that minimises repetition between different calls to this part of the graph overall. Why? Because the way it's written is based on the way it's interpreted. That's because it represents a set of production rules within a formal grammar. The reason why the game uses formal grammars to construct the writing (while the imperative code is exclusively concerned with game logic and UI formatting) has to do with specifically moving away from the kind of naive phrase building you suggests, which does not give good results in practice. Instead, the way it's set up, allows for things to be tackled on a case by case basis where it's needed. Yeah, this means that some paths through the graph will lead to very similar possible outputs (what you keep calling "copy+paste") but the important part of it is where it uses DIFFERENT resolutions for special and edge cases.

In all honestly, though. Just leave the coding alone. It was never an issue for the game. I've never had any problems with implementing anything and getting it to work. The time sunk into this game goes mostly towards design and writing. With the latter part there being the biggest problem, because I just don't get adequate help with it.
 

regjunk

New Member
Nov 9, 2020
6
0
I have no issues with the readability of the code. The code is written as it is specifically to balance readability for me and ease of parsing or the machine.
Sure, as I said before, I'm not trying to impose anything, just sharing outside feedback, which you may (or may not) find useful, since you writing tutorials about this language/engine.

There are things in the game that are complex enough that they encounter issues with processing time.
Thats pretty strange, I wouldn't expect any issues with that from what I saw.

Sorry, but that's just not how any of this works. I can assure you, as the person who made the engine, that not a single word of what you wrote above has any relation to how this is executed internally.
What I've described is how CPU works, it has nothing todo with any programming language/engine. At the end it will be executed on CPU, if engine creates this matrix from current code then it will be faster than with JMP.

Look, I appreciate your attempt to understand what's happening in the code, but it's just not accurate. You have a limited view of how any of this works internally and it leads you to miss the forest for the trees. There are reasons a lot of the things are the way they are, many of them have to do with optimising output quality, others are things that optimise the process by which the game comes to a conclusion.

Lets use the height difference thing as an example, the reason why the file is 50 lines long, apart from the formatting, is that what's stored there is already an optimised graph, or more specifically, a finite state automaton. The optimisation isn't about the volume of code, but instead the number of lines that need to be parsed to get to the end. I could make a more elegant looking implementation of it. But I don't think I could make a more efficient implementation of it. Did I need to write it as unwrapped code? Probably not, but I wrote it as unwrapped code when I wrote it and that's about it.
Wouldn't it be more efficient to not have this graph at all? (no transitions, no code, just single array access). Thats what I suggested with matrix stuff.


A different example is the "copy paste code" you cherry pick from the, let's say, fingernail-colour-complex file. The actual form of the file is this:
Code:
amber;[?amber|amber|amber coloured|amber painted]
amber;sunshine [?coloured|painted]
aqua;[?aquamarine|aquamarine|aquamarine coloured|aquamarine painted]
black,jet,dark;darkly painted
black;[?black|black|black painted|black coloured]
blue;[?blue|blue|blue painted|blue coloured]
crimson;[?crimson|crimson|crimson painted|crimson coloured]
emerald;[?emerald|emerald|emerald painted|emerald coloured]
glossy;glossy
gold;[?gold|gold|gold coloured|gold painted]
green;[?green|green|green painted|green coloured]
jet;jet [?coloured|painted]
orange;[?orange|orange|orange coloured|orange painted]
pink;[?pink|pink|pink painted|pink coloured]
purple;[?purple|purple|purple painted|purple coloured]
red;[?red|red|red painted|red coloured]
rose;[?rose|rose|rose painted|rose coloured]
sapphire;[?sapphire|sapphire|sapphire painted|sapphire coloured]
sparkling;sparkling
teal;[?turquoise|turquoise|turquoise coloured|turquoise painted]
violet;[?violet|violet|violet painted|violet coloured]
dark;dark
This file represents part of a bigger graph. This file has the form it has because it's the best way to form a relation between the BoW (bag of words, on the left) representing the fingernail attributes and the output (on the right) in a way that minimises repetition between different calls to this part of the graph overall. Why? Because the way it's written is based on the way it's interpreted. That's because it represents a set of production rules within a formal grammar. The reason why the game uses formal grammars to construct the writing (while the imperative code is exclusively concerned with game logic and UI formatting) has to do with specifically moving away from the kind of naive phrase building you suggests, which does not give good results in practice. Instead, the way it's set up, allows for things to be tackled on a case by case basis where it's needed. Yeah, this means that some paths through the graph will lead to very similar possible outputs (what you keep calling "copy+paste") but the important part of it is where it uses DIFFERENT resolutions for special and edge cases.
I'm not suggesting any changes in text generation process or rules (simple rule was just example), just to describe only difference for specific cases, when similar possible outputs is describe only once.
That way it can be even more efficient in parsing stage (less bytes to read from disk/memory).
In your example there is 16 items with template: '[?${color}|{color}|{color} coloured|{color} painted]', which can be unified.

In all honestly, though. Just leave the coding alone. It was never an issue for the game. I've never had any problems with implementing anything and getting it to work. The time sunk into this game goes mostly towards design and writing. With the latter part there being the biggest problem, because I just don't get adequate help with it.
Sure, just shared some feedback, no problem if it was not useful for you.
 

EsoDev

Newbie
Mar 4, 2020
63
62
What I've described is how CPU works, it has nothing todo with any programming language/engine. At the end it will be executed on CPU, if engine creates this matrix from current code then it will be faster than with JMP.
You are incorrect, it has everything to do with how the interpreter is implemented. By default the interpreter code is what branch prediction applies to, not what the interpreter is, well, interpreting. Unless of course, that was built into the intepreter, which I neither did, nor have any interest in doing.

Wouldn't it be more efficient to not have this graph at all? (no transitions, no code, just single array access). Thats what I suggested with matrix stuff.
The graph is the minimum viable representation for a general solution to the text generation problem. Or specifically for the quality of the output to meet my standards. Simplifying it further results in bad output or bury the actual representation so deep in pointless syntactic sugar, where writing new text content would be practically unfeasible. Also reminder you also suggested I represent things with graphs, because you didn't notice that the whole thing is just graphs top to bottom.

I'm not suggesting any changes in text generation process or rules (simple rule was just example), just to describe only difference for specific cases, when similar possible outputs is describe only once.
That way it can be even more efficient in parsing stage (less bytes to read from disk/memory).
In your example there is 16 items with template: '[?${color}|{color}|{color} coloured|{color} painted]', which can be unified.
You can't, because that would undermine the pruing proces that reduces repetition. That's what I'm saying when I say you are not taking into account how the engine actually works. The lines are meaningfully different from the point of view of the generation process. When you "simplify it", it stops being meaningfully different because the engine can't judge human intent as to why something is written like that. All it sees is that instead of several rules to work with, it now has one. And that changes the whole probability of when any production rule in the set will appear, specifically for the worse.
 

regjunk

New Member
Nov 9, 2020
6
0
You are incorrect, it has everything to do with how the interpreter is implemented. By default the interpreter code is what branch prediction applies to, not what the interpreter is, well, interpreting. Unless of course, that was built into the intepreter, which I neither did, nor have any interest in doing.
I understand why you may think that it works this way, but it affects interpeters too, as any indirection. Yes, there is already a lot indirections inside interpreter itself, but JUMP in interpreted code
adds more indirections and hurts performance. You can argue that it is more cache issue than branch prediction, but result is same. Also, you probably can write interpreter so slow that these indirections won't be significant, but I don't see a resons for that.

BTW, I've checked engine itself and it works exactly as I've expected, there is nothing fancy about this part, JUMP/GOTO in FSA just sets position in list of strings based on marker. In code without jumps this counter advances by +=1. Also, looks like set operators should be very slow, according to implementation.


But talk is cheap, lets benchmark:

determine-height-difference2.state:
Code:
//cg-tt-npc-height - height of NPC, either short, average or tall;
//cg-tt-height-diff - height difference of PC, either shorter, equal or taller;

createl "has-highheels" no
if =s fromarray var "cg-inv-equipped" 7 new: jump skip-shoes
    setl "has-highheels" containss strsplit decorate "[data\items\[cg-inv-equipped@7]$28]" "," "type-highheel"
marker skip-shoes;

sets "cg-tt-height-diff2" fromarray var "const-height-map" + + + * var has-highheels 12 * lengths intersect cvar "atashi" "build-adj" filestr "automata\tools\conditions\is-tall" 6 * lengths intersect cvar "atashi" "build-adj" filestr "automata\tools\conditions\is-short" 3 indexofs new{ "short" "average" "tall" } var "cg-tt-npc-height"
pop
Benchmark:
Code:
createsl cg-tt-height-diff new
createsl cg-tt-height-diff2 new

charload "user/characters/Beatrice Hanegraaff.char"
createsl cg-tt-npc-height "short"
createsag "cg-inv-equipped" fill 15 new
createiag "cg-inv-equipped-on" fill 15 0
setsa "cg-inv-equipped" new{ new "clothes\slips_white_satin" "clothes\socks_white_cotton" new new "clothes\demi_bra_white_satin" new "clothes\loafers_brown_leather" "clothes\sweetheart_blouse_white_linen" "clothes\pants_grey_tweed" new "clothes\cardigan_beige_cotton" new "clothes\hairband_black_satin" new }
createi "ts-start" 0
createi "ts-end" 0
createi "n" 0
createsag "const-height-map" new{ "impossible" "impossible" "impossible" "equal" "shorter" "shorter" "taller" "taller" "taller" "equal" "taller" "taller" "impossible" "impossible" "impossible" "taller" "equal" "equal" "taller" "taller" "taller" "taller" "taller" "taller" }


push tools determine-height-difference auto
p: 123 Out: [cg-tt-height-diff]<br>
p: 1234 Out: [>_ cvar "atashi" "build-adj"]<br>

setcharsa "atashi" "build-adj" new{ "athletic" "petite" }

push tools determine-height-difference auto
p: 123 RES: [cg-tt-height-diff] [>_ cvar "atashi" "build-adj"]<br>

sets "cg-tt-npc-height" "short"
setcharsa "atashi" "build-adj" new{ }
push tools determine-height-difference auto
p: OLD tall=0 short=0 height=0 RES: [cg-tt-height-diff]<br>
push tools determine-height-difference2 auto
p: NEW tall=0 short=0 height=0 RES: [cg-tt-height-diff2]<br>


sets "cg-tt-npc-height" "average"
setcharsa "atashi" "build-adj" new{ }
push tools determine-height-difference auto
p: OLD tall=0 short=0 height=1 RES: [cg-tt-height-diff]<br>
push tools determine-height-difference2 auto
p: NEW tall=0 short=0 height=1 RES: [cg-tt-height-diff2]<br>


sets "cg-tt-npc-height" "average"
setcharsa "atashi" "build-adj" new{ }
push tools determine-height-difference auto
p: OLD tall=0 short=0 height=1 RES: [cg-tt-height-diff]<br>
push tools determine-height-difference2 auto
p: NEW tall=0 short=0 height=1 RES: [cg-tt-height-diff2]<br>


sets "cg-tt-npc-height" "short"
setcharsa "atashi" "build-adj" new{ "petite" }
push tools determine-height-difference auto
p: OLD tall=0 short=1 height=0 RES: [cg-tt-height-diff]<br>
push tools determine-height-difference2 auto
p: NEW tall=0 short=1 height=0 RES: [cg-tt-height-diff2]<br>


sets "cg-tt-npc-height" "average"
setcharsa "atashi" "build-adj" new{ "petite" }
push tools determine-height-difference auto
p: OLD tall=0 short=1 height=1 RES: [cg-tt-height-diff]<br>
push tools determine-height-difference2 auto
p: NEW tall=0 short=1 height=1 RES: [cg-tt-height-diff2]<br>


sets "cg-tt-npc-height" "average"
setcharsa "atashi" "build-adj" new{ "petite" }
push tools determine-height-difference auto
p: OLD tall=0 short=1 height=1 RES: [cg-tt-height-diff]<br>
push tools determine-height-difference2 auto
p: NEW tall=0 short=1 height=1 RES: [cg-tt-height-diff2]<br>


sets "cg-tt-npc-height" "short"
setcharsa "atashi" "build-adj" new{ "athletic" }
push tools determine-height-difference auto
p: OLD tall=1 short=0 height=0 RES: [cg-tt-height-diff]<br>
push tools determine-height-difference2 auto
p: NEW tall=1 short=0 height=0 RES: [cg-tt-height-diff2]<br>


sets "cg-tt-npc-height" "average"
setcharsa "atashi" "build-adj" new{ "athletic" }
push tools determine-height-difference auto
p: OLD tall=1 short=0 height=1 RES: [cg-tt-height-diff]<br>
push tools determine-height-difference2 auto
p: NEW tall=1 short=0 height=1 RES: [cg-tt-height-diff2]<br>


sets "cg-tt-npc-height" "average"
setcharsa "atashi" "build-adj" new{ "athletic" }
push tools determine-height-difference auto
p: OLD tall=1 short=0 height=1 RES: [cg-tt-height-diff]<br>
push tools determine-height-difference2 auto
p: NEW tall=1 short=0 height=1 RES: [cg-tt-height-diff2]<br>


sets "cg-tt-npc-height" "short"
setcharsa "atashi" "build-adj" new{ "athletic" "petite" }
push tools determine-height-difference auto
p: OLD tall=1 short=1 height=0 RES: [cg-tt-height-diff]<br>
push tools determine-height-difference2 auto
p: NEW tall=1 short=1 height=0 RES: [cg-tt-height-diff2]<br>


sets "cg-tt-npc-height" "average"
setcharsa "atashi" "build-adj" new{ "athletic" "petite" }
push tools determine-height-difference auto
p: OLD tall=1 short=1 height=1 RES: [cg-tt-height-diff]<br>
push tools determine-height-difference2 auto
p: NEW tall=1 short=1 height=1 RES: [cg-tt-height-diff2]<br>


sets "cg-tt-npc-height" "average"
setcharsa "atashi" "build-adj" new{ "athletic" "petite" }
push tools determine-height-difference auto
p: OLD tall=1 short=1 height=1 RES: [cg-tt-height-diff]<br>
push tools determine-height-difference2 auto
p: NEW tall=1 short=1 height=1 RES: [cg-tt-height-diff2]<br>



seti "ts-start" nowt
foreachi "n" range 1 1000: push tools determine-height-difference auto
seti "ts-end" nowt
p: Old height difference [>_ vali / - [ts-end] [ts-start] 10000] ms. Out: [cg-tt-height-diff]<br>
seti "ts-start" nowt
foreachi "n" range 1 1000: push tools determine-height-difference2 auto
seti "ts-end" nowt
p: New height difference [>_ vali / - [ts-end] [ts-start] 10000] ms. Out: [cg-tt-height-diff2]<br>

seti "ts-start" nowt
foreachi "n" range 1 1000: push tools determine-height-difference auto
seti "ts-end" nowt
p: Old height difference [>_ vali / - [ts-end] [ts-start] 10000] ms. Out: [cg-tt-height-diff]<br>
seti "ts-start" nowt
foreachi "n" range 1 1000: push tools determine-height-difference2 auto
seti "ts-end" nowt
p: New height difference [>_ vali / - [ts-end] [ts-start] 10000] ms. Out: [cg-tt-height-diff2]<br>
Test runs:
Code:
old=124 new=109
old=126 new=93
old=140 new=109
old=141 new=108
old=125 new=109
old=123 new=94
The graph is the minimum viable representation for a general solution to the text generation problem. Or specifically for the quality of the output to meet my standards.
I completely agree with you on that part. But I didn't suggested to remove all graph related code, just specific part of graph/state machine, because it is very complex and a bit hard to understand whats going on, and there is a lot of things which looks like bugs. In this specific part it is not "text generation problem", but simple value comparison operator which by some reasons became pretty complex part of code.

Simplifying it further results in bad output or bury the actual representation so deep in pointless syntactic sugar, where writing new text content would be practically unfeasible. Also reminder you also suggested I represent things with graphs, because you didn't notice that the whole thing is just graphs top to bottom.
I didn't suggested to represent things with graphs, I've suggested specific design which allows set logic with multi-valued attributes, which is based on graphs. I know that state machine part is graph, nested scopes is graph too.
Rules for text generation is kinda graph too. There is even some graph algorithms inside scripting code. But graph is most basic data structure, almost everything is actually graph, even LinkedList is graph, so suggesting to "use graph" is kinda pointless.

You can't, because that would undermine the pruing proces that reduces repetition. That's what I'm saying when I say you are not taking into account how the engine actually works. The lines are meaningfully different from the point of view of the generation process. When you "simplify it", it stops being meaningfully different because the engine can't judge human intent as to why something is written like that. All it sees is that instead of several rules to work with, it now has one. And that changes the whole probability of when any production rule in the set will appear, specifically for the worse.
You can simplify it without any changes in text generation process and probabilities of rules, by adding some syntatic sugar, which also will allow to reduce memory consumption and increase performance a bit. But it will require some changes in engine itself, which you may find not neccessary enough.

I understand how engine works, at least on high level. Thats why I said before that engine architecture is beautiful. And I see enormous amount of effort you spent on research. Code can be significantly better in my opinion, but I was not sure why. Since you clearly happy with current, there is not much point to bother you.
 
Last edited:
5.00 star(s) 1 Vote