v1.10.0 SP1-SP4 Added some additional Teacher trait checks, some revised teacher room handling (it is now possible to assign a teacher their own office), and made it so that teachers are assigned to the teacher room at the start of classroom assignments (to hopefully prevent double-booking classrooms due to any old assignments). Additionally, added the new teacher office traits to the existing Teacher Room location. ---- The razor item events now only mark a single item instance as used. Additionally, the Shave button event now preferentially looks for used razors before using a new razor. ---- Altered the "Add To Dictionary" operations to have add/remove input links, and be retitled as "Modify Dictionary" ---- Reorganized some operations in UpdateStudentCount.ve.xml to prevent first-day enrollment of ScheduleHandlerNone NPCs. Fixed an incorrect variable link in Ward/Measurement.ve.xml ---- Added some instantiation checks to various text replacement dictionary functions. ---- Revised the SPE chain a bit. It should now be easier to open (no school-wide Lust requirement), the Computer Lab upgrade event is now non-random, and the journal will show up (under "Computer Room") before the club is opened to guide players towards what needs to be done. ---- Added a new set of status effect modifiers, which multiply the current value of a stat (allowing, e.g., +20% Lust) v1.10.0 SP1-SP3 updating the listing of rule groups within the file editor to reflect changes in code revision #2362. ---- Corrected "wardrode" instances to "wardrobe" (exception: filenames) Tweaked the logic in FunctionLibrary/Spycams/ChangingRoom.ve.xml to avoid pulling an object from an empty list. Fixed some text replacements in Classroom Shared/RainSoaked.ve.xml Modernized Ward/BreastExamLez.ve.xml ---- Removed the Ginny Nightshade requirement from SPE Club's start event. She is not specifically mentioned anywhere in the event, has no obvious connection to the club for players, and this seems like the most-likely cause of players reporting an inability to trigger the event. ---- Removed hard-coded NormalSchool paths in image references. ---- Added a tweak so that Add Person Stats With Limits will now ignore the effects of AddStatValue, MinStatValue, and MaxStatValue status effect modifiers, resulting in more accurate caps. ---- Stripping had an error which caused lust gain regardless of giverecieve settings. ---- Correction to seteffectsonobservers, giverecieve was set incorrectly. ---- Consolidated a number of Location-based operations into two: Person Location, and Location String, each of which have a number of link variants. Also includes an update to trait handling which will allow for automatic enrollment/expelling of students as they gain or lose the Enrolled and Expelled traits. ---- Fixed a bug where Subject Experience's Set input was adding instead of setting. Also includes DasBrain's fix of Set Object List, resolving a bug where it didn't actually activate its output link. ---- Fixed some missing connections within VirginAsk that could cause the event to end prematurely. ---- Added a LinkVariation for the Get Student's Class operation which returns the class's current classroom. If no class is currently in session, the result will be Nothing. ---- Revised Person.AddTrait(), Person.RemoveTrait(), and Person.ValidateTraitList() so that adding or removing the "Enrolled" trait, or adding the "Expelled" trait, should perform all required actions to enroll or expel the student. ---- Use event schedule to determine if the PA system has been build. Allows for easier updating of the relevant events. Fast Schedule Check should improve performance a bit. ---- Use HasQuest instead of special for candidate selection. ---- Added a new set of interactions to arbitrarily mark and unmark NPCs as favorites. ---- Added additional rule effect person groups. Also simplified the logic a bit. New list of groups: Principal, All, Student, Detention, Rogue, Parent, Teacher, Staff, OtherChild, OtherAdult ---- - Added some additional debug info to the Profiler tab. - Added ability to explicitly set thread pool size via command line arguments "-threadPoolMin" and "-threadPoolMax". ---- Add a quest filter to the PA system. ---- Altered SeqAct_HaveSex so that Nothing is a valid second person object, to allow for more intuitive setups for masturbation calls. Revised UpdateStudentCount so that it now *favors* minority genders in the calculations instead of *requiring* them; this way, it still shifts towards gender equality, but not so harshly as before. Fixed a few bugs (mostly resulting from me being an SQL noob) in VirginAsk. Replaced the SetPersonContextDict calls in BeachGirls with Text Replace (Person Context) operations; they were totally unnecessary for the event, since it never has the secondary girl talk and never uses the other features, and just needlessly added complexity. Added a Nude Uniform check to RoofNude, removed the Event Is Scheduled check since it has fast scheduling check enabled. Reordered operations in SwimTeamCoach to avoid a null reference for the secretary. Tweaked AndyNight so that it will work even without the included engine update. Added a missing text replacement tag closing bracket in Visit_BethManiliBoyfriendCheated. ---- Massive overhaul of VirginAsk. It now uses engine-level database tags to catch any sex interactions regardless of source, handles all genders, and has special penalty routes for asking people with whom you've had all possible types of sex. Additionally, the over-asking penalty has been changed from an absolute number of times to instead be based on re-asking during the same day. ---- Fixed a logic error in AskAboutParents.ve.xml, where the wrong parent was being checked before branching. ---- Enable Mods by default. ---- Fix Teacher Bondage uniform. v1.10.0 One of the goals of this release has been polishing up the existing content and introducing a general framework for certain gameplay mechanics, so they appear more coherent and balanced in terms of gameplay. There have been over 1000 commits with changes to content alone, over the course of several years. - Lots of events have been reworked, code cleaned and/or typos fixed, etc. - Stand out items (i.e. things to specifically look for) are noted below - For the complete list of all changes see: https://chat.henthighschool.com/channel/hhsplus - For the list of addressed issues that were reported via the bugtracker see: https://www.henthighschool.com/hhsplus/bugs/changelog_page.php?version_id=59 Notable Changes and New Stuff ----------------------------- - UI notifications have been added to show individual changes in the stats, skills, properties and relationship trackers of NPCs that are part of active events. We feel that this drastically alters the gameplay experience and improves the sense of agency of the player. There are many sophisticated VEE operations related to controlling this. Details are further below. - Global variables have been introduced as a mechanic in preparation of a future modding framework. - Panty Thief Paperdolls (not yet used) - New Hardman events in Ward - Rework and new content in Underwood quest line - Many reworks and improvements by Malorn (Annette, general school and interactions, beach, swimming) - Cleanup of rules (removed outdated parts, adjusted balancing) - Reducing image file size - Tagging images correctly - New PTA decisions (sex machines, affection at pool) - New background music available for selection - New enrollment mechanics - Balancing update to school events - Lactation drug (and paperdoll effects) - Custom calendar notes creation/editing - Bunch of new “apps” on the phone - Neglected lovers - Evolution of Get Physical - now called General Sex - Hypnosis now supported for female PC - Futas are shown in light green on the people list if you know their gender. - Improved visibility of favorite characters by adding a star before their name on the person list of the current location. - Added a new game option to remove HasQuest from all characters. Tester feedback showed that this feature is not universally liked, since it may spoil the discovery aspect. UI Notifications ---------------- - Added UI change notifications for operations: "Person Stats", "Person Stats by List", "Add Arousal by Fetish", "Person Body Sizes", "Have Sex", "Perform Intercourse", "Person Skill" - Fixed notifcation for groups showing the sum of the change instead of the average. - The Scenario Config has a new property that determines whether the notifications are enabled or disabled by default. The event may still explicitly override that property with the mentioned operation. - UI notifications are never shown for event hierarchies that were not originally started in their Execute phase. - Started work on grouping stat change notifications from multiple persons and operations. - Added operations to control the gathering and grouping of UI Change Notifications. - Added operation to add a list of persons to a UI Change Notification Group. - Fixed grouped notifications being shown for every person of the group, rather than just once at the end. - Grouped notifications now show the number of people in the group. - Sex Toy objects are now exempted from showing change notifications. - Gathered notifications are shown automatically on passing time now. - A flag in the scenario config now controls whether notifications are gathered by default or not. (Note: When gathering notifications, "Person Stats by List" will currently record the changes for each person individually if no group name has been set yet. This is due to how that operation works and might actually be intended in some use cases.) - Person Stats by List now implicitly adds affected persons to a group named "People" when changing their stats and gathering is enabled. - "Person Stats by List" operation will now attempt to use the comment of the linked Object List variable as group name for the stat notifications. - "Add to UI Change Notification Group" now has an optional variable link to specify the group name. If not set, it will use the name from the current event execution. - Removed the "Change" from the names of "UI Change Notification" operations for brevity. They still conceptually refer to notifications about changes, though. - Stat and Skill notifications can now define their increment/decrement colors in the XML definitions. - Stat notifications can now define whether they are shown for all characters, players or NPCs only or not at all in the XML definitions. - Notifications for NPCs are now shown under the location label, rather than the occupands table. - Prevented player character from ever being added to notification groups. - If a notification group only consists of a single person, it will just use the notification display for single persons (but still using the group name specified for the group instead of the NPC's name) instead of showing averages and the number of affected NPCs. - "Add to UI Notification Group" operation now has a link variation to replace the Object List variable link with one for Object variables, so the operation can now also be used to add individual persons directly. - AddToUIChangeNotificationGroup now supports link variations for objects and object lists at the same time. - Added separate operation SetUIChangeNotificationFakeName to set the fake name for notifications for a single person. - Reverted previous change so that group names are now also used, even when there is just a single person (in which case it still drops the "avg." part). - Fixed notifications using the real person Name instead of the Display Name. - Notifications should now honor the value of the UINotificationVisibility specified in the stat and skill definitions. - Notifications are now invoked directly by the queue's worker thread instead of creating a new work item for a threadpool first. - Improved clarity of text when showing relationship notifications. - If a grouoed relationship notification is from exactly one person to another, it will show the target's name instead of the number of affected relationships. - Added notification history. - Fixed duplicate history entries being created for single NPC notifications. Global Variables ---------------- - Added dedicated system for global variables. In order to make use of a global variable, it must be added as XML file to the new "GlobalVariables" folder. A new file editor tab helps with that. The old version with Reference Variables still works, but preferably this new version will be used from here on out for global stuff and the references only to refer to variables inside the same event. - Added new tab to debug panel to view and edit the values of global variables. - Added DisplayMode property to global variable definitions. It's currently used only in combination with global integer variables, where you can specify that the value should be shown and parsed as bit field instead of a regular integer. - The property form for assigning global variables will now show an edit button to open the regular property form for that variable type if opened via the Event Debugger. - Added the ability to create global variables from the editor. - Added the ability to "reload" global variables. Currently it only adds new global variables. Modding Framework ----------------- - Merged mod framework from feature branch to trunk. It is still disabled by default and uses an implementation instead that only uses the base game folder structure. - Added the directory where mod folders are meant to be kept. - Changed additional file system operations to properly use the modding framework. - Common FileManager functionality was extracted into an interface and the ModFileManager is no longer a subclass of the BaseGameFileManager. - Changed code in several places to now use file paths relative to the current scenario root folder instead of relative to the game directory. - There is still built-in backwards compatibility for resolving the legacy paths, but they should not be used anymore to allow for proper modding support. - Removed explicit mention of "Schools\NormalSchool\" in XML files, in accordance with the new code. - Fixed some issues with the order in which resources from mods were resolved. - Fixed resources from mods having a leading backslash when getting their relative path. - Moved FrontendWindow to a subfolder and extracted the UI for the Mods panel to a dedicated user control. - ModInfo.xml from mod directories is now used to display additional information about the selected mod in the Mods panel. - ModInfo now has an additional property for the TitleImage to display in the UI. - Added a button in the Mods panel to check all currently active mods (but not the base game) for errors. - Savegames now include their mod configuration and restore it when loading the savegame. - The active mod configuration can now be edited via a tab in the debug menu. - Added a new feature to the Mods menu to list all files that are overridden by files from a mod, as well as all files in the mod that get overridden by other files. - Related Events tool now properly handled events from active mods. Other tweaks ------------ - FontAwesome icons can now be used with event decision buttons by writing the "fa-iconname" tag at the start of the decision text. - Windows created from the Frontend now appear on the same monitor as the Frontend. - Accounting tab now shows net profit/loss as dedicated row in the list and has a description. - Shopping and Trading forms now have an additional button for convenience to buy/sell exactly one item. - Shopping and Trading forms now remember the last picked amount for buying/selling per item. (Based on the item's display name.) - Chat topics of the general chat event have been turned into individual interactions. The old event is still provided for compatibility and in case the new stuff still has some bugs. - Maximum timeout for async event processing is now configurable instead of hardcoding it. By default, if event processing has not finished after 30 seconds, it is forcefully aborted. - Sound device can now be configured from the settings page. - Some improvements to the Jobs panel in the management window: - Biography is now read from a dedicated field in the Person object, so it's possible to add bios for each teacher to display there. - The individual experience in each subject is now listed in addition to the subject family experience. (This is not the same as the overall qualification, which would take stats into account, though.) - Added a BaseValue for the Stamina subject influences in SchoolSport and Swimming subjects, so no teacher with average stamina is better in PE than in their primary subject. - Removed the Expell Student operation from MissingGirlFound. This way, taking the girl for your own slave still leaves a spot reserved for her at the school in case you free her in good condition. She will still get expelled by the WholeFamilyMovesAway function library event if she is underfed or released in poor condition. - Added Panty Thief support for Anastasia Goth (not yet used, but I plan to integrate it into some of her interaction events). - Restricted Kiss and Ask For Sex interactions so that they only appear if the player character is interested in the target's gender. - Added a MinigameConfig file which gives access to several variables each for the Lockpicking (Balance) and Hacking minigames. - When loading a saved game without a MinigameConfig file, a default one will be created for the savegame. This default file will have identical values to how the minigames functioned in previous game versions. - Also included is a variant config file which has more difficulty and skill level changes applied; be forewarned, the values in this variant config have not been heavily tested. - Added a member list to the club tab of the management window. - Altered the management window so that the student list, staff list, and club member list color character names as per the main screen's occupant list. - Added option to log unresponsive operations as warning if they take longer than a configurable threshold amount of time. - Added mechanism to log thread dumps of unresponsive VEE operations. - Moved setting to Profiling tab. - Added a smartphone app that lets the player pick their alarm clock sound. (Currently only has our existing beep sound and a muted option. Feel free to add more.) - Added negative event that fires every time the player tries to enter the OP room in the hospital. - General refactoring of GameWindow, turning some of the hardcoded button bindings and hotkeys into commands. Some hotkeys have changed as a result, for example settings are now opened with CTRL+S instead of CTRL+Q. - Notification history overlay now takes up the whole screen and blocks all UI elements behind it from being clicked. The toggle button has been moved in front of it to ensure it can be disabled. It's also bound to F2, so it can be summoned in events. - Toggling Worksafe Mode or Debug Exec Phase Only settings through hotkeys now writes a notification, so the player actually sees the effect. - Wait buttons now also use commands. - Prevent settings from being opened via hotkey while an event is showing. - Related Events tool now limits the result to events that are in the immediate vicinity of the current event. Developer/API changes (only relevant for mod authors) ----------------------------------------------------- - DetentionLocationProvider will now use the first rule with "detention" (case-insensitive) in its name instead of looking hard-coded for "Detention rules". - Rules now apply the actual value for a Reputation change on each day. Previously, it would only apply 1/5th of the value to avoid too rapid growth. This behavior was confusing and entirely opaque to modders. - CurrentOutfit is now always calculated whenever its checked. - While showing a teacher in the management panel, their OutfitName will be set to "Work" while updating their paperdoll and back to the previous value afterwards. - Random Chance now works for values from 0 to 100, rather than 1 to 99. - More population-related properties can now be configured in the ScenarioConfig. - ScenarioConfig is now visible in the Game Objects debug tab. - Documented use of the individual properties in the ScenarioConfig. - Adding/Setting the relationship value in the database now clamps it to the [-100;100] range. Previously it was only clamped when reading the value. - Event priority is now always serialized, even if it's 0. - Clubs will now validate if their current members have the correct gender for the club on a daily basis and kick out anyone who no longer fits. - Simplified code for the calendar note tooltip at the bottom and made it only show unfinished notes. - The maximum number of students per class can now be configured via the Scenario Config. A new VEE constant is available that returns the current value of the config. - "Item by Name" operations now use the regular "Name" property of an item by default and have a link variation for the "Display Name". - SetRuleActive is now named SetRuleAvailable in code and XML. - SetRuleChoiceActive is now named SetRuleChoiceAvailable in code and XML. - Added a new operation SetRuleChoiceActive (i.e. same name as the old operation) that can be used to set the currently active Rule Choice from VEE. - Creating calendar notes with a blank name now cause an exception. - Adding calendar notes with a blank name now causes an exception. - Deleting calendar notes now only considers the name and not at the other properties. - Database Query operation now has an additional input to end the iteration prematurely and also frees up resources when activating the Finished output. - Remote Event operations now have an error check for connections to "N/A" inputs and outputs. - Added button to Options menu to manually clear the event cache of the editor. - Refactored error checking framework to use structured data for findings instead of one big concatenated string. - Error messages have been overhauled for brevity, since context information is now provided in the structured data. - Added new view to present the structured results of the error check. - Checking for unlinked objects and incorrect variable cardinalities now also uses the new system, so all results can be presented in the same view at once and without individual message boxes. - Loading tooltips for Remote Events already placed in the editor will now load the tooltip of that specific event synchronously in order to provide instant feedback. (The tooltip is still cached in this step to avoid overhead) - Person name list in the debug menu is now editable and the category ALL is the preselected default. - VEE now uses WPF CommandBindings for common menu items, which come with some built-in keybindings that are familiar from other Windows software. - Toggling VEE tooltips is now bound to F2. - Command to show orphaned assets is now available in the VEE menu as well. - Refactored the whole BodySize mechanic and made it compatible with new StatusEffectModifiers. - This also makes it easier to add new body sizes in the future, since everything now uses a unified system to access them. - Added VEE operation to get the list of all School Subjects in the game. - Added custom override for last name, in the same way as for the first name. - Added property "HideFromMenu" to Rule definition to hide it from the management panel while otherwise preserving its functionality. - Added File Editor for Rules, so the descriptions and properties can be seen. (Not necessarily recommended for active use due to File Editor bugs.) - Added "Get Rule" operation to acquire a Rule object for use with reflective property modification. - Config now can specify in the setting "vee_AssetPathsWithoutMetadata" which paths relative to the school folder are OK to have no metadata associated with assets, preventing from showing them in the Orphaned Assets dialog. - Orphaned Assets results can now be exported to CSV. - Added new Dev Tool to the VEE that allows to check all events for errors at once. (Takes a moment to finish) - Fixed list in result window of error checking phase not being scrollable. - Added error report if an event with Trigger Type "Location", "Visit" or "Button" contains no reachable "Accept Event" operation. (It would be even better if it was checking if it can be reached from the Try-phase, but that's not as easy to fix right now.) - If the event description contains #NoAccept, it won't cause an error message when there is no Accept Event operation on specific Trigger Types. - Removed the almost all differences between the folders under Events\. - NativeEvents are still special, as the engine knows their name. - Vist events in Interactions are attached to the player at game start. - All events in StaticEvents are attached to the player at game start. - Events in folders mentioned by a Location or ClubLevel are attached to the Location/ClubLevel. - ScheduleHander events in ScheduleHandlers are attached to the person with that name. - The Snippets and Templates folders are ignored. - Schedule handlers now work for all persons, special or not. They can be attached/detached like any other event. - The Get Events from Folder operation now works for all folders (except Snippets and Templates). - New VE Op: Set Display Gender Override - overrides how the person should be displayed in the person list. Doesn't affect paperdolls. - New VE Conditions: Person Display Gender & Person Gender Override. Used to determine the data above. - PTA Members can be dynamically changed by adding / removing the PTA trait. - New VE Op: Convert To Object List - Idea is for this to be used after an Get Property By Name operation. - New VE Op: Set Object List. Doubles as List Union if more than one input list is used. - Created a universal WillpowerCheck.ve.xml that factors in various modifiers, can use authority of the 'enforcer' and has thresholds built in. Hopefully a good starting place for more willpower-related event work. - Added Link Variation to Attach Event to provide an event as parameter. - Added String Trim operation. - Implemented a simple dirty flag for the VE Editor. Moving an object around does not set the dirty flag, all other modifications should. - Don't ask if you want to close an event tab if the event is not dirty. - Don't ask if you want to close the editor if no loaded event has the dirty flag set. - Outfit Name now works with Locations too. For the Get input, it takes Location Modifiers into account. - Allow CheckEventExecution to work in syncronous execution. - Added SeqCond_PersonShift. - Implemented styling For Show Decisions and Show Decisions (Dynamic). - Made Text Replace Dictionary take the person dictionary into account. - Added 2 new operations: Get Account by Name and Get All Accounts. - Added a new condition: Is Account Active. - Added Link Variations to the existing 2 operations that deal with Accounts to accept an Account Object. - Virtualized all PaperDollHandlers. Threw messages on multi-threaded use before. - Show PD in outfit from the engine (Management Panel...) will also set Clothing Always Wear to true. - Add new status effect to allow temporary outfit changes. Not yet used, as this would break existing games. - Allow dynamically adding/removing staff (teachers included) to School Management - Adding or removing the Staff trait to a person makes it available/unavailable for hiring through School Management - If the person is hired and you change their Job property they will be fired - Adding the Teacher job to a person will add them subject experience if they don't have it already - Use enum for calendar status. - Text Replace operation now uses different values for each match if the replacement is a random variable. - GameObjects are now reloadable via a new tab in the debug menu. It's just the barebones functionality right now. No state is carried over from the previous one and no references are being replaced in other object instances. - Reloading certain objects now tries to keep the status of their availability, since it's likely they got enabled during gameplay and we don't want to break quest progress. - Job string is now cleared on unchecking Job checkmark, previously the check would reset if you didn't manually clear the string. - Checking the Job checkmark, but leaving the string empty will now match people without a Job (like Person Filter: Job), instead of throwing an exception. - Fixed copy-paste not remembering the job, unfortunately doesn't work if job is empty (need to reenable checkmark for now). - Fixed DisplayName not linking back to Name if no display name is set. - Show Decisions now shows the respective decision text on up to 80% of the operation's width (scales with zoom factor). - Added support for marking people as asleep through status effects (using the status tag "ScheduleHandlerAsleepIndicator"), to allow for future support for sleeping drugs / devices / etc. - Additionally made it so that people marked as asleep through status effects will not be moved by the scheduling system while the effect is active. - Added a ScheduleHandlerAwakeIndicator, which overrides the IsAsleep checks to return False. This indicator still blocks movement and still returns the Sleep outfit for paperdoll checks. - Added link variations to SeqAct_PersonStatusEffect to allow for directly setting the duration and/or start time when adding an effect to a Person, rather than requiring a separate SeqAct_PersonStatusEffectDuration node to accomplish this. - Added a new operation "Add Person Stats With Limits", which allows stat modifiers to a set of Person objects (or object lists, if using the link variation) which will not exceed supplied minimum and maximum values. - Added a new Add Person Skill With Limits operation. Same deal as the new stats operation, just targeting skills instead. - Added a new HeightMultiplier field to Person objects, which will affect the paper doll size in VEE events and the interaction menu (does not currently affect the Management Panel or Character Creator). - This can be controlled through a new gender-specific setting in the scenario config, and can be set directly within special character files. - The default config has been updated to provide some variation (by default, there will be an 8% range of variation, and males will tend to be SLIGHTLY taller than females, with futas being in-between) without looking too odd (e.g., students stretched to taller-than-adult sizes look weird because of their head size). - Added LikedGender (a List(Of Gender) property) and RequiredStats (a List(Of StatRange) property) to the Location class, to allow for more restrictions on who can visit a given location. - At the moment, the World Editor is able to alter the LikedGender property, but the RequiredStats property can only be edited through a text editor (Sorry, I suck with UI design!). Values have been added for the Cabaret's Dining Room location as an example. - Added a new OccupantInfoConfig filetype, which controls what information is displayed in the occupant list. - Added a {Job} replacement to the text replacer used by Text Replace (Person). - Added an additional automatic trait ("Parent"), which is added automatically to anyone with children as they are loaded or generated, and is removed from anyone without children. - Added a list of traits with hard-coded functionality to the descriptions of the Get Person Traits and Person Traits operations. - Added automatic tracking of the parents of enrolled children through a "HasEnrolledChild" trait. - Refactored enrollment and expelling to be handled through Person class subroutines, which handle any necessary schoolclass, club, and trait changes. - Added three more options to Get Person List, for retrieving lists of all parents, the parents of your school's students, and the parents of other students. - Added access properties for the Range.Min and Range.Max values to the StatRange struct, to make it play better with the File Editor. - Added a {Class} replacer to the Text Replace (Person) replacer, which replaces with a student's class number. - Added a string-based Fetish lookup function to the Person class. - Expanded the OccupantInfoConfig with many additional conditions, and grouped most of them into rough categories within the editor. - Updated all existing OccupantInfoConfigs for the renamed properties. - Added a new OccupantInfoConfig which displays the class number for enrolled students; their display should now read as ", Student (class 1)" or similar. - Added new VEE operation to put key-value-pairs into a dictionary in the event runner, which can then be read by the calling code. This allows events to provide optional return values to the code without impacting the use cases where it's not needed. - Interactions now check if a boolean result value is set for the key "Interaction_KeepGoing". - If it exists and is True, the interaction will force the NPC to stay in the location in order to keep it going. - If it exists and is False, the interaction dialog will forcefully stop (even if the NPC is not moved away). - If it does not exist, it behaves like before and depends on whether the NPC is still in the location. - This property is currently still experimental. It might get replaced with a probability-based one in the future. - Interaction Events can now use Text Replace gender placeholders in the Choice Name. - Checking events for errors now also ensures that the variable type of linked variables match the declared type of the connector they are linked to. - Reference Variables now display an info message during validation if the referenced variable does not have a comment. - String variables can now be converted to String List variables via the "Replace" menu. - String List variables can be converted back to String variables. (This will use a random entry from the list, so it could lead to potential loss of data) - Updated the Perform Intercourse VEE operation. It now handles updates the relationship database as appropriate when two non-sex-toy characters have sex. - Additionally, the previously-ignored Cum Inside parameter is now used to determine whether a creampie entry should be added to the database. - Updated the Person Intercourse Manager (used by the Have Sex VEE operation). It now properly accounts for sex toys, and will *NOT* update the relationship database if someone is just masturbating with a sex toy (but *will* give additional joy if they have masturbation or sex toy fetishes). - Additionally, it will now set "lost virginity to" / "took virginity of" entries for male and futa active partners having vaginal sex for the first time. - Copied the body size change calculations from the Perform Intercourse VEE operation to the Person Intercourse Manager, which previously did not have any size change functionality. - In the case of dildo-based sex, I made the PIM assumes a medium-sized dildo, since the Have Sex operation doesn't pass through any sort of size data and I really don't want to refactor it to do so. Bugfixes -------- - Fixed one constellation of PersonTraits operation removing the trait when it should actually add it. - Duplicating SeqCond_CompareDate now properly copies link variations. - Duplicating a ShowRandomImage operation now also duplicates the separate output links correctly, if that option is set on the source. - Fixed bug causing the CurrentOutfit to not properly resolve to the Club Outfit because it was comparing the name of the club location to the actual location. - Attempt to improve classroom scheduling. - Fixed null pointer when hashing the name of scenario configurations of existing save files. - Better handling for random numbers from floating point ranges. - Fixed off-by-1 error potentially preventing the last item in a location from being picked up by NPCs. - Made sure that String-to-Number conversions in VEE operations use the invariant culture, to avoid unexpected issues on specific locales. - Fixed bug causing exception when attaching/detaching an event to a person in Try-phase while having multi-threading disabled. - Database input field in debug menu now accepts return and tab keys. - Database input field in VEE menu now accepts return and tab keys. - SetPersonTextColor operation was reading variables at the wrong index. - Fixed String Pad operation not having an output link. - Check Rule condition now makes sure that rules have been loaded when pasting the operation. - Fixed bug causing status effects that modify the maximum value to change the minimum value instead. - AddArousalByFetish will now no longer reset the comment if it does not match the format of autogenerated comments for the operation. - Fixed bug causing PersonStatsByList operation to incorrectly calculate the average value if it was used for multiple stats in the same operation. - Fixed bug causing the reloading of events in a location subfolder to also be added to the parent folder. - Special characters now only get a random head assigned for the gender slot they are missing, rather than both. - The Frontend now disappears and stops the task bar status after the Initialize event, rather than the StartEvent. - Classes now only allow to add your own students to them, which fixes a bug that assigned expelled students to the "spare students" class. - If a GameMind for the current scenario does not contain a stat adjustment for a specific stat, this will no longer throw an exception but just skip the stat. - No longer throw an exception during daily population stat adjustments if the scenario defines no mind data. - Fixed exception when creating second VEE directly from new process where it skips the Frontend. - Fixed some Item operations not taking over their link variations when cloning them. - Description fields of objects in File Editor now support multi-line text. - Fixed clubs not applying their stat changes at the end of their meeting. - Clubs now only apply their stat changes if the person is in the location of the club meeting. - Fixed adding/removing a person to/from a club potentially doing so one more time than intended. - Pending autosaves are now also done after clicking on task buttons, interactions and using items, rather than just passing time. - The current day is now marked as last autosave day before doing the save, so it is correctly reflected in the save file. - Fixed typecast error in PersonStatsByList. - Set Inventory Image operation no longer throws random exceptions during error checking. - Bitwise Integer Math operation no longer requires a variable connected to B if ONLY the "NOT" input is used. It still does in all other cases. - Corrected layout resizing of school subject description. - Exporting profiling data to CSV now adds quotes to escape the name, since some SQL statements contain semicolons that otherwise mess up the format. - Button events are now checked in parallel if multithreading is not disabled. - Changed the way non-always outfit names work. Now each category is responsible for selecting the outfit. See PaperDollHandlers/Student/Swimsuit/ClothingItem.ve.xml for an example. - Fixed changed outfit names in all events. - Another fix for BrokenSwimsuit. - Fixed logic error in SeqAct_AttachEvent. It caused NPEs after loading a saved game. - Fixed miniquests. - Fixed multi-selection in VE. - Fixed copy and paste. - Change Number From String generation strategy. Should prevent stuff like n mod 9 = 0 => n mod 3 = 0 - Hopefully fixed IndexOfString with last input. Before it did start at position 0, and goes backwards, always returning -1. - Fixed events in the Debug Events list not being in alphabetical order after the rework of event loading. - Added a daily event to update the outfit levels of the characters. They were always 0. - Fixed Person Status Effect Duration returning the lifespan instead of te remaining lifespan in the Get input. - Fixed bug preventing numerical value of stat bars from being displayed. - Fixed some events to use Text Replace (Person Context) and proper placeholders for pronouns and names, so it's possible in theory to change the display name and gender of special characters. - Added an item event for the Double Dildo, which was lacking one; it's basically a placeholder copy of the Deluxe dildo event with slightly increased values, since balancing isn't really my forte. - Fixed an exception that occurs when hiring all available staff. - Fixed a logic error in TraitHelper.Match(), where the "Some" result could be incorrectly skipped due to the "HasNone" boolean never being toggled off when matches were found. Result: The "Has Traits" operation should now always return as expected, instead of sometimes incorrectly returning that no matches were found. - An inverted condition in the JobDoesNotEqual check was causing jobless people to pass checks that were supposed to filter out people without jobs. - Fixed comment boxes losing their stored size when copy-pasting them. Known (open) Issues ------------------- - Very rare and unreproducible performance drops during event progression where the game may freeze for several seconds. - If you enabled performance monitoring in the debug menu by entering a threshold value in the profiler tab (something reasonable like 5 seconds), you should be able to find an entry in the game's log folder about this incident. We would like to hear back about it. v.1.9.5-2050 Changes and New Stuff - https://www.henthighschool.com/hhsplus/(hhs-1-9-5)-official-release-thread/ v.1.9.4-2008 [Deleted Files] The following files from the full 1.9.3 release are no longer needed in 1.9.4 and can/should be deleted to avoid potential issues in the game: (Since we can't tell Zip archives to delete those files, you need to remove them manually) // General update to loan stuff. Existing events have been moved, merged and updated. - Schools/NormalSchool/Events/FunctionLibrary/LoanConsideration.ve.xml - Schools/NormalSchool/Events/FunctionLibrary/LoanGetNumRemainingPayments.ve.xml - Schools/NormalSchool/Events/FunctionLibrary/LoanGetPayment.ve.xml - Schools/NormalSchool/Events/Location/Bank/LoanRepaymentTittyfuck.ve.xml // Moved to changing room. - Schools/NormalSchool/Events/Location/School/Hallway Shared/LockerGirl.ve.xml // "My Debut" was not used anywhere. "School of Cock" has been replaced by three gender-specific books "School of Sex". - Schools/NormalSchool/Items/Books/My Debut.xml - Schools/NormalSchool/Items/Books/School of Cock.xml // Image folder was renamed to "School Main Gate". - Schools/NormalSchool/Images/Locations/Normal School // Item has been renamed to "Onsen Membership Card" and related events have been improved. - Schools/NormalSchool/Items/Miscellaneous/Onsen card.xml [Full Commit Log] The following commits have been made in this release: ---- - Fixed SQLite backup not working due to missing parameters for source and destination DB type. (Previous versions may have tolerated that, but the latest doesn't.) bug #1199 ---- - Fixed exception when trying to display tooltip for a RemoteEvent operation that had no event specified yet. bug #1198 ---- - Removed obsolete "BreakInLevel" legacy property from Item class. ---- Fixes (or should fix) two Principal clothing bugs (one per bug #1195) • Reported by roberttx: player's char is a floating head • Reported by xyza7890: Commando underwear variant of clothing not displayed ---- - Changed most (but not all) internal person list structures to use UIDs instead of names as reference. - Added some missing values to the String Constants Hint form. bug #1195 ---- Fixes a (progress stopping) bug reported by barteke22 (can't propose Practical Sex Ed) ---- - Remove Item from Inventory now processes all item variables attached to the operation. - Added note that the "set parameter to nothing for removal" option only applies to item events that are directly triggered by the engine. bug #1192 ---- - Removal of some hardcoded locations from ScheduleHandler. ---- General update and rework of the bank loans stuff (modernising, text improvements, etc.) - Fixes big reported by jsb (loan payment treated as income, not expense.) - Fixes unreported bug of loan terminating 1 month early - Merged LoanRepayment and LoanRepaymentTittyfuck into one event - Updated EdgarBanks xml (giving him his speaking color) - Added LOC_Bank (so bank is only open during office hours) - Linked Bank map to Stores Shared (so bank closes after office hours) ---- Updated Tanning oil_ItemEvent (overlooked in the work done per bug #1178) - Added some content and changed the effects - It's no longer such a 'quick and easy' appearance booster - But does deliver others things ---- - "Location Connection" operation now requires the additional "Travel Time" parameter when adding a new connection. - Removed obsolete "Time to Cross" property from location. ---- Moved LockerGirl to changing room (where there are lockers) and did a general update. ---- More work done on the map - Further tweaks to some school location visit frequencies (e.g. increased canteen usage during breaks) - Cleaned up Editor layout to improve readability - Changed Red corner and Cabaret linkages to what I believe feels more logical (and matches story content) - Reduced 'To Smallville' location buttons to only those required (i.e. is the only way out) - Renamed Onsen changing rooms to match event folder names ---- General clean up / modernisation of these events ---- Bug fix: Execute was connected to Add input of Person Stats 117 (increasing adding inhibition every time the event fired) ---- Adding moving player to bedroom if they fall asleep at home (per request from DeniedInMontana) - Also made a minor adjustment to probability of making it home [try to make it home path]. It's now 40 yes / 60 no ---- Fixes issue raised by jsd (relaxing time passing mechanic out of whack) ---- Should fix the bug reported by blumph (Exhibition club not progressing, and Club Journal throws an exception) - Also did a couple of minor clean-ups to related events ---- Just more typos ---- Mostly just fixing typos (plus some minor code clean ups) ---- Just marking various (with todos and notes) for rework ---- Just fixing typos ---- - "Database" tab in Debug Window can now correctly handle the use of "EXPLAIN QUERY PLAN" commands, to get an overview over the performance of a specific query. - Optimized query for Person Relationship Database by adding two indices to avoid full table scans on most operations. (This improves startup performance A LOT!) ---- Just updated (existing) todos. Event needs a general update. ---- Added a bookshelf (i.e. somewhere to store books) ---- Fixes bug report by Duskoxiv (general passing out from low energy not resulting in sleep) ---- - Amended some of the school navigation and button position (to what I believe feel is more logical) - Replaced item 'School of Cock' with 3 'School of Sex' items (with gender preference-specific variants and item images) - Removed item 'My Debut' (as isn't used anywhere) ---- Just fixing more typos ---- Just fixing typos (talk sentences missing closing quote) ---- Fixed bug reported by blumph (event was not rescheduling itself correctly) ---- Fixing (exception causing) bug in TriggerCompulsoryMasturbation ---- Main just typos (with a couple of minor code clean-ups) ---- - Fixed bug reported by remembermethistime (Special Char nude breasts not working) - Final cleanup and refinement to exhaustion mechanics ---- Fixed a bug reported by warrior89 (progress stopping exception the Underwood chain) ---- - Fixed World Editor trying to load Worlds as World Extension through the menu. bug #1188 ---- - Remove Item by Name from Inventory had incorrect variable link type set. bug #1190 ---- General clean-up and update to PrincipalSleepTracker - Adds a 'clock dream' (just to say something is still happening during long sleep period) - Adds a graduation factor into the algorithm (be better reflect exhaustion accumulating over time) - Fixed bug reported by imnotoverhere (not resetting states correctly after a collapse event) - Fixes lesser issue of not calculating fitness correctly ---- Corrected event intended to fire only a 'Classroom' firing in Gym, Swimming Pool, Etc. ---- Amended 'Normal School' location name to 'School Main Gate' and set description back to 'WayToSchool'. And, as part and parcel: - Renamed location image folder to match - Updated all events that use the location name and location image - Added a note to the Event Images Folder (which is still called 'Normal School') to explain the relationship - Also complete a general review of school locations and corrected various inconsistencies (full details posted to bug #1185) ---- Cleaned up Onsen membership and logic of the events: - Membership now required to use the Onsen (previously could use without being a member, even you're told you can't). - Membership lifetime fee increased to a (slightly more sensible) $500 - Membership card given an image and purpose is better explained ---- Bug fixes: Immodesty check was never firing (due to a bad regex) and the "Always wear" option in AccessWardrobe was broken ---- Torso of futa principal no longer looses breasts in onsen towel (reported by zaiaku) bug #1187 ---- v.1.9.3-1991 Added some new girl names (handpicked from the mod of 22mice) Statistics tab is now separated into individual sub-tabs for the different statistic topics Bug fixes: All item bugs believed to be now fixed (please report any items issues you still encounter) Lots of typos fixed, thanks to Positron (still more to do here) Fixed adult Education and Lust values ignoring the values defined in the config Various other minor bugs fixed (thanks to all the reporters) Fixed bad performance during event execution (caused by too detailed execution logging) Improved general startup time in release versions (by pre-compiling XML serializers) Developer/API changes (only relevant for mod authors): All school location event folders moved into single main folder "School" Various new functions added, existing ones amended (with descriptions added/updated) and some moved to appropriate category sub-folders VEE operations that change a person's inventory now have link variations that determine how many items are affected: Single item instance from a stack of items (Object variable); entire stack of items with the same properties (Object variable); all items with the same name (Object List variable). Stacks can be turned into a list of individual instances via flattening operation. "Remove Item from Inventory" operation can no longer be used to remove an item from the inventory of its owner while executing its own item event. Instead, set the Item parameter passed to the event to "Nothing". The "Search for Operation" function in the VEE's DevTools has been improved, so it's now possible to search for operations with a combination of specific names, comments and variable links. The "Find Unused and Missing Images" function in the VEE's DevTools has been improved and is a lot more reliable now. Item descriptions can now use placeholders like {Counter}, {Data}, {Uses}, {RemainingUses} and {MaxUses} to insert the respective property value into the text when showing it in the UI. The "Text Replace Dictionary" now behaves the same way as the "Text Replace Person Context" in terms of scope. It is no longer persisted with the owning event but instead valid for the duration of the current execution. The values are propagated to called remote events and changes made by those events are fetched back to the calling event. Removed hardcoded random assignment of club president from code. The logic has been recreated in UpdateClubPresidents.ve.xml. Added some operations to control which school classes are available and how students are assigned to them. Added mechanic to let mod authors add and override ingame locations in a non-destructive manner via "World Extensions". World Extensions are XML files that contain only a property "Locations" with a list of location data as it would be included in the actual base scenario file. At game start, these additional locations are merged into the existing world (allowing to override existing locations with the same name) before proceeding to load files as usual. The World Editor has a new option to save the current locations as World Extension. Added new VEE operation to add connections between locations at runtime, so you can hook up locations from World Extensions to the main game locations in an initialization event. Added new StatusEffectModifier "FollowUpEffect", which applies a new StatusEffect as soon as the existing one expires. Useful to chain different effects together if you don't need to fine-tune them with an actual ExpirationEvent. Reversed sorting logic in Initialize event: now events with a numerically "higher" priority value are run before those with a "lower" value. The Initialize events that were relying on this have been adjusted accordingly. This also matches the explanation of the "Priority" property in its tooltip.