HentHighSchool Development Forum

Please login or register.

Login with username, password and session length
Advanced search  


Site Tools

Visual Event Editor (VEE)

Quick Guide Tutorial

Courtesy of Aesaris; much appreciated.

The VEE (Visual Event Editor) works like a script, you have operations and variables. The operations need variables to work and the variables needs to be set via operations (with some exceptions). After you know what operations do what, you know how to make events.

An event is split into two phases, the Try Phase and the Execute Phase. The Try phase defines the conditions you need to have to make the event able to trigger. The Execute phase contains all the parts that are triggered, all the things the player sees and all the changes in the population you can make.

When you right-click in VEE you have 4 choices on what to add; I will start with the simpler ones.

The Comment Box permits you to add a comment to your event so you can indicate things to others who edit/view the event. Mainly used on huge events to keep in mind the paths. When set, just select it and type in the "Comment" field of text that has appeared at top; multiple lines are available only in Comment Box. You can also use that comment field on operations and variables.


The Variables are a way to store a specific element from the game. An NPC, a Location, an object, a text or a number value. Every variable has a color associated and every operation will color their variables' input/output with the same color as the variable type they accept. Most variables can be double-clicked to access their value.

[color=Cyan]Integer Variable[/color]: a value that can only be a whole number: positive, negative or zero.

[color=Cyan]Integer BitField Variable[/color]: stores a position, 0 or 1 for every value it can contain. It is often used to keep track in the journals and the chains.

[color=blue]Double Variable[/color]: a value that can be every decimal number, whole or not. It's used, for example, for the stats changes.

[color=red]Boolean Variable[/color]: a true/false value. It's used to enable/disable choices in decision boxes or control if the player can go to a certain path of the chain if he/she has made a right decision in a previous event or decision.

[color=green]String Variable[/color]: contains a text; it can be double-clicked to access the text editor and write in it. It is used in showing or comparing text.

[color=green]String List Variable[/color]: contains multiple text strings. It's used to show one of the text to the player randomly or to show multiple decisions in some cases. (Even if the color is slightly different, it can be usually be used in the same operations as a String variable)

[color=brown]Date Variable[/color]: contains a specific date. It's used, for example, for getting the NPCs' birthday.

[color=purple]Object Variable[/color]: contains a specific entity (represented by a combination of variables); can be a person, a location, an item. Can't be set in the editor.

[color=pink]Object List Variable[/color]: contains a list of different objects. For example, used to get a set of NPCs in school, in the same location or in a different one to change how the event goes.

Variable Reference: a reference to a variable in the same event or another. Double click and enter the variable ID (you can find the ID of an operation/variable currently selected on top, beside the comment field) or right-click on a variable and click on Create Reference Var, then move it to where you want. It is really useful to reduce the number of lines crossing the screen. To make it refer to another event, just select Find and browse for the event file.

The Constants are variables that don't have to be set. They always have the same value. The names are very explicit, so I will only explain one.

[color=green]String Constant[/color]: Have to be a specific string. It can be Locations Names, Special Character Names, Item Names, Job Names, Subjects Names or Club Names. If you have a doubt on how the thing you want to set is written, you have a constants button that will show you all the constants it accepts. When it is written close the window, if the constant is still red, you have made a mistake in the word or it is not accepted; if it's green the constant is set correctly.


The Operations are the main thing to make the event works, how to set it up. When you hover over it you see that there are a lot of subfolders. But don't worry, it's really quick to learn where to find what you want.

As it's quite complicated for me to explain all the operations in all the folders, I will create a simple event. Let's say I want to have a repeatable encounter with a random student in the sports area if the student ha good stamina and the event will have 3 random outcomes and another that will only trigger when the event is trigger for the first time. It seems complicated, but it's not.

First, create an Add Operation > Time > Event Is Scheduled in a space to the right of the first block. This is an operation to make sure the event won't run every time you enter the location. It checks if a "timer" associated with that event permits it to trigger. We will set that timer at the end of the event; since the default is day 0, there is no restriction the first time. Then link the Try output of the Start Event to the In of the operation, by click-and-drag of the points.

Then, create a Get list of occupants, go to [i]Add Operation > Get Person > Get List of Occupants[/i] and link the True output of the previous operation to its input. This operation needs an Object list, let's add one, Add Variables > Object List Variable and link the [color=pink]List[/color] to the object list.

We then want to get that high-stamina person. We could use multiple filters, but one operation can do all the filters at once, Add Operation > Object List Filter > Person. As we want to see if an NPC in that location has good stamina and is a student, double click on the operation and write in Job "Student" and check stats "Stamina", then, let's say we want any student to have from 30 to 100 stamina, write the numbers in the boxes. Now the filter is set, you can close it. You need to add a variable object to link to the [color=purple]Per1[/color] we will use it in the future. click on it and in the field of text in the top part of the screen, we will type "target" to name it.

To add a little randomness to the event let's add a chance pass. Go to Add Operation > Random > Random Chance; this operation needs a integer from 0 to 100 to work, let's add one with 30 and link the found output of the Filter Person to its input, to have a 30% chance of passing.

To finalize the Try phase we need to add a Add Operation > Accept Event; when you link it the phase is done.

That's generally when I save the event. As we want to trigger at the Sports Area, let's save it in Locations\Sports Area (which is in the Schools\NormalSchool\Events folder).

Now the Execute phase. We want a special path for the first time the event is triggered, so we will use a compare Boolean (Add Operation> Compare > Compare Boolean) and add a Boolean to the operation (Add Variable > Boolean Variable) double click that variable and check "Value" so now, the default value is set to true. When I use a Boolean to do multiple paths, I like to comment the Boolean variable. Click on it and in the comment field of text above, write something – I will use "First Time?".

Let's now work on the first time the event is triggered. Connect the true output to the false input of a created Set Boolean To (Add Operation > Base > Set Boolean To) and link the [color=red]Var[/color] to the Boolean "First Time?" Now when the event triggers for the first time it will go through that path but when triggered a second time it won't. Now let's add a picture and a text. Add Operation > User Interface > Background > Show Image, link the Set Boolean "out" to the show and Double click on the operation. Here you can obviously load your picture but also give it filters for the content. As this path is safe we will imagine that picture has no nudity nor sex so no blacklist filter required. Pick a picture from Images\EventPictures\Location\Sports Area for this example.

Close that window and create a show text (Add Operation > User Interface > Interactive > Show Text) and a string and link everything. In that string we will say that the player sees someone working hard on the track.

Enter, without the quote marks since it is not a person speaking, "You see a student working hard on the track course."

Now we want the event to end on that path. We have to add a Set Next Schedule so the first operation we have created, Event Is Scheduled will make the event triggers in the future, and add a double var of 1 so it will potentially trigger the next day. (As it will only trigger once in that path it's acceptable but make sure other paths won't repeat the event every day.) As some time has passed, why not add Add Operation > Time > Pass Time and let's say 2 minutes. Here you see that an integer is required instead of a double.

Now let's work on the other path, when the event has already run at least once. Create a Random Split (Add Operation > Random > Random Split), double-click it and add a choice, so we will have 3 possible paths that will be chosen randomly every time.

For the output 1, we will say that the player talks with a student so we will show the student's paperdoll, Add Operation > User Interface > Background > Show PDl Over Location. We want to link it to the object "target," but if we do that an ugly line will pass over all the other operations. Let's keep it clean: right-click on target and Create a Reference Var; you have now a reference variable that links to our target object, and it also kept the name to help us keep track. Click and drag it to near the Show PDI operation, then link that to the Show PDl Over Location.

As the player will talk to the NPC we want situational texts; let's create a Person replace operation Add Operation > Text Replace > Text Replace (Person). "What is this?!" you will ask; don't worry, it's not as complicated as it looks. Instead of giving the string to show in a show text we will pass it first in that "Text Replace" machine to convert key words to the proper values. You can use 1 or multiple persons, here we will just use 1 person. Let's write something to show you. Add a Variable String linked to Source and type for example:

You watch the students run. One of them, {Name}, seems to surpass {him}self, you are pleased with the student and think it can't hurt to show {him}.

[paragraphstop] At the end of the training you approach {him}: [color={Color}]"Oh, hi, {PrincipalSir}."[/color] [color=LightBlue]"I saw you training, you seem to like exceeding your limits, it's a good thing, I like this behavior."[/color] [color={Color}]"Thanks"[/color], {he} responds, a huge grin on {his} sweaty face.

You might have already guessed {Name} shows the full name of the person, {him} shows him or her. The Paragraphstop is not limited to the Text Replace Person, you can use it in a simple Show Text; it stops the text here and shows the next part after the player clicks. I like to use it when some time passes but not enough to delete the first part of the text (which [Pagebreak] does). But that is your choice to use it or not. When the person speaks, the color is {Color} so it will always associate it with the proper text color of the NPC. Every keyword can be used to get the player values by using Principal before the keyword.

Now link the [color=purple]1[/color] to the reference variable of target and the result to an empty string that you will link to a Show Text. Now let's say that that person is happy from your comment. Add a Add Operation > Person Relationship > Person Relationship and link the output of the show text to the Add input.

Link the Person to the target reference variable, the other person to a Constant Player object and add a double with a value randomized between (minimum) 0.1 to 0.3 to the Amount. You can then end this path with a set next schedule and pass time with the two values higher than the previous path. (You can click ad drag an area to select the two operations and variables you already made, right click, duplicate them, drag by a highlighted object to the new location and change the values).

For the next random split we will try something else. Let's start by checking the stats of the target. Add a Add Operation > Person Properties > Person Stats, link the "get" input to the output "2" of the Random Split and double-click the operation. Here we can check what stat(s) we want; let's check Inhibition and Lust. Two double outputs have appeared, link the person to the target reference variable and add two double vars that you will link to the two outputs. I comment-name the two doubles following the stats I chose "Inhib" and "Lust" so I know what they are when I will use reference for them.

Add a Switch by Double Range (Add Operation > Compare > Switch by Double Range) and double click it. Change the 0 to 20 and close the window. Then link the Inhib value to it (at the bottom). This operation will permit us to have 2 paths, one if the inhibition of the person is below 20 and another when it's equal or above. Create another Switch by Double Range, links it to the Lust value (with a reference variable if the link is too long for you) and add 2 connectors for that one and change it to the values that please you.

Now we have 3 paths by Lust when inhibition is below 20 and if you duplicate it you can also have 3 more for inhibition above 20. This is where it starts to get huge and so I won't do all of them and let you experiment on all the paths with all you have learned. I will do if inhibition is below 20 and lust above 40.

I will add a Add Operation > Person > Check Person Gender set with another reference of target and add three operations: Add Operation > Compare > Content Filter, so each output have one. Double click on each of them to set the one from the male to filter Male, the one from female to Female and the one from futa to Futa (short for futanari/hermaphrodite). These content filters are important; it's to avoid player seeing things they don't want.

Male/Female/Futa are filter to check when nudity or intense content of these genders are shown. I link the blacklist to the Show PDl Over Location from the output 1 of the Random Split (which will normally be another event but it's just to get rid of it). A quick tip when you have multiple links that go over your event is you can use a Dummy op (Add Operation > Base > Dummy); you attach incoming branches of it to the input, and the output to where they should go, now you only have one line instead of 3.

I add 3 Show Image, one for each Content filter and links the "passes" output to the show input. I then add a single Person Likes Gender (Add Operation > Person Relationship > Check Person Likes Gender) and link all the show image output to the proper gender and links a Constant Player to the Person input. Now we can add some texts; remember that this path will be for naked lusty students. Add a Replace Text (person) to the True output and add a text. Something like this:

You watch the training. The students are training naked, not that it bothers them, you might even say that they love glancing at each others' parts. You specially take your time looking at the muscular shape of {Name}. {He} impresses you, not only does {he} do a great job running but {his} body is beautiful. {Gender:His abs are perfectly shaped, his buttocks are firm and his cock, pointing straight to the sky pouring precum, seems like a standard bearer able to lead anyone to victory.

You watch him run and also when he doesn't; his sweaty body takes all the attention you can give.|Her boobs are round and well shaped. Her abs, even if subtle are highlighted by the sweat and her tits makes you crave to tickle and sucks them. Her muscular thighs are pouring wet and you are sure that it's not only from sweat.|Her boobs are round; sweat pearling on them make you want to lick them. Her abs are more defined than most of the males here, but her dick gives her a plus that makes you watch her running more than the others.} [paragraphstop]

You are woken from your daydream by the students going back to the locker room.

Here I used something to write for all the genders possible at the same time "{Gender:||}". It's a really cool way to write events so you don't forget that the events might trigger on someone who doesn't have the same Sexual Preference as you.

You can then add a Person Stats by List (Add Operation > Person Properties > Person Stats By List) and this time link the output to Add instead of Get, select some stats, I opted for Stamina, Lust and Inhibition and added -0.3 to -0.6 for inhibition and added 0.3 to 0.6 for Lust and Stamina (you can link one Double var to the two links), and get the list from the Get All Occupants in the try phase.

You can then end the event branch like the others: Set Next Schedule and Pass Time (always in that order; a Pass Time should not have operations after it, it can mess them up because of people moving).

Now that your event is done, you can go to Edit > Event Properties and set in the Author field your name. It's also here that you can change the type of event as here it's a Location event in Sports Area, it only needs to be saved in Sports Area to work.

I haven't shown you all the possibilities, you have to experiment with all the functions to see all you can do with it by yourself. I think that should give everyone a good basis to create events.

And Yes, that is a "quick" guide to VEE ;D :-D

I added the file if you want to verify if you have done it right. I don't recommend you to use it in the game. Since you saved the tutorial sample, move it to another folder to prevent it from running.

VEETutorEvent.ve.xml - open and download example for VEE editor use.

game/editor/visual_event_editor.txt · Last modified: 2016/10/23 05:49 by dougthec