Cheat Mod Ren'Py The Null Hypothesis Cheat Injector [v2.1] [Sleepingkirby]

Sheepy Cloud

Active Member
Apr 22, 2020
500
296
Code:
Searching for RPA packages
   + Unpacking "archive.rpa" - 581288697 bytes
Could not extract file  from archive: [Errno 2] the requested file . does not exist in the given Ren'Py archive

  Cleaning up temporary files...

  Creating cheat...
./scripts/interfaces/main_menu.rpy patched
./scripts/interfaces/base.rpy patched
./scripts/base/config.rpy patched
./scripts/mechanics/utilities.rpy patched
./scripts/base/player.rpy patched
./scripts/interfaces/Player_menu.rpy patched
./scripts/interfaces/sex.rpy patched
./scripts/mechanics/approval.rpy patched
./scripts/sex/request.rpy patched
./scripts/interfaces/interactions.rpy patched
./scripts/mechanics/movement.rpy patched
    Success! Cheats are now enabled!

  Cleaning up temporary files...
Cheats did enable.
Just posting that it seems to have thrown an error.
 

sleepingkirby

Active Member
Aug 8, 2017
902
1,406
Could not extract file from archive: [Errno 2] the requested file . does not exist in the given Ren'Py archive
There's nothing I can do about that error even though it's benign. That error is coming from rpatool, which is used to extra the files from archive.rpa. The error basically says, "I can't extract the current directory from the archive."
The only ways I can fix that error message is if I fix and compile my own version of rpatool. Which is not a smart thing to do.
 

Joker619

Newbie
Nov 4, 2020
82
84
When attempting to install on 0.7a gives below error:

"
No backup's found. Safe to progress.
Creating rpatool...

Searching for RPA packages

Cleaning up temporary files...

Creating cheat...
Traceback (most recent call last):
File "H:\Games\TheNullHypothesis-0.7a-pc\TheNullHypothesis-0.7a-pc\game\_cheat.py", line 23, in <module>
main_menu()
File "H:\Games\TheNullHypothesis-0.7a-pc\TheNullHypothesis-0.7a-pc\game\_cheat.py", line 10, in main_menu
with open(fn, "r") as file:
^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: './scripts/interfaces/main_menu.rpy'

Cleaning up temporary files...

----------------------------------------------------

Finished!

Enter "1" to go back to the menu, or any other"
 

sleepingkirby

Active Member
Aug 8, 2017
902
1,406
When attempting to install on 0.7a gives below error:

"
No backup's found. Safe to progress.
Creating rpatool...

Searching for RPA packages

Cleaning up temporary files...

Creating cheat...
Traceback (most recent call last):
File "H:\Games\TheNullHypothesis-0.7a-pc\TheNullHypothesis-0.7a-pc\game\_cheat.py", line 23, in <module>
main_menu()
File "H:\Games\TheNullHypothesis-0.7a-pc\TheNullHypothesis-0.7a-pc\game\_cheat.py", line 10, in main_menu
with open(fn, "r") as file:
^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: './scripts/interfaces/main_menu.rpy'

Cleaning up temporary files...

----------------------------------------------------

Finished!

Enter "1" to go back to the menu, or any other"
The last time this happened, that person's external hard drive was messed up. (Where are you guys buying these hard drives?) Here's what I wrote last time.

The output should have had the line:
Unpacking archive.rpa - ## bytes

In your games folder, does archive.rpa exist? Is it named archive.rpa or does it have a different file extension besides .rpa? Because, for some reason, the command prompt on your machine isn't finding that file and that file contains almost all of the games assets. You don't have a game if you don't have that file.
 

sleepingkirby

Active Member
Aug 8, 2017
902
1,406
working for v0.7b ?
Screenshot_2024-12-16_02-48-31.png
Dude. It's been 3 hours since it's been released and it's a beta version. Chill.

But also, probably? Don't know. Try it out. It should be compatible unless RonChon drastically rewrites code. Lastly, playing beta versions can mess up your saves. If you want to take that risk, that's up to you.
 
Jan 23, 2020
15
26
What do you mean it doesn't like adjusting the climax gauge? Do you mean it doesn't do it? It's difficult to? It crashes when you try?

Because it's working on my side.
my bad. for one im runnint 7b so that could def be the problem. but the moment i hover my mouse up i get an exception error saying tooltip has no name or something like that
 

Nimbus

Newbie
Dec 21, 2017
27
6
Not really a mod questionn but, is there an actual difference between the states of horny and nympho? I don't think I've gotten the latter to show up yet. Also how do you make them knock on your door more often?
 

sleepingkirby

Active Member
Aug 8, 2017
902
1,406
Not really a mod questionn but, is there an actual difference between the states of horny and nympho? I don't think I've gotten the latter to show up yet. Also how do you make them knock on your door more often?
Honestly, I'm not too sure myself. It's been a while since I've looked at those statuses and a lot of the code has changed since I've looked at it. Here's a quick scan of the code now. For the most part, horny and nympho do the same things. It's just that nympho is more than horny. Like the reaction is horny + 1.

As for how to get nympho, if someone's horny status is too high, it gets turned into nympho:
Code:
            elif status == "horny":
                if self.status["horny"] >= 2:
                    self.status["horny"] = 0
                    self.status["nympho"] += 2
                else:
                    self.status[status] += 1
            elif status == "nympho":
                self.status[status] += 2
As for how do you make them knock on your door, I don't know. Never looked that up. I'd have to see a dialogue or something to trace that down. The only ones I know are event driven.
 

vemnaroladopai

New Member
Jul 10, 2023
14
42
Not sure if it is even possible, but is there some way this mod could affect the "sexual training"? As in, their capability to wear bigger plugs and perform deepthroat. That is the only thing that is still a bit obtuse in the current version as they seem to have made RNG dependant events more consistent.

As far as I know, it used to work like this:
if buttplug_size == Girl.anal_training and Girl.History.check(f"used_buttplug_size_{buttplug_size}") >= 5:
$ Girl.anal_training = buttplug_size + 1
After some testing, by having all three girls starting to wear their plugs at the exact same time, but only having anal sex with one of them, only the girl who had sex was able to progress. This would make some sense, as throating can only be progressed in the sex minigame, so I'm wondering if the check happens during it or something. I'm not a coder, so I don't know how it all works, but the ability to set their training levels would be a god send.

Although, at this point, I'd be satisfied with just understanding how it actually works lmao.

Regardless, thank you so much for your work! I love the game as is, and thing that the team is refining the balance wonderfully, but being able to experiment with other routes without having to grind (and breaking the game a bit, it's always fun to leave them with cum in all possible spots and just have a movie night with all three lmao) is greatly appreciated.
 

sleepingkirby

Active Member
Aug 8, 2017
902
1,406
Although, at this point, I'd be satisfied with just understanding how it actually works lmao.
It's been a while since I've looked at the piece of code so I'll take a look.

As far as I know, it used to work like this:
Looking it over now, it's still more or less, what you wrote:
Code:
label Jean_round_anal_plug_change(plug_size):
    if plug_size > Jean.anal_training:
        $ Jean.change_face("worried1")

        ch_Jean "Can't fit that size yet. . ."

        return False
    else:
        $ Jean.change_face("smirk2")

        ch_Jean "I actually kinda like it. . ."

    return True
anal_training is actually a function, not a static value:
Code:
        def anal_training(self):
            sum = 0

            for A in ["self_dildo_ass", "anal", "dildo_ass"]:
                sum += self.History.check(A)/10

            for size in [3, 2, 1, 0]:
                if size < int(math.floor(sum + min(1, self.History.check(f"used_buttplug_size_{size}")/5))) - 1:
                    continue

                if self.History.check(f"used_buttplug_size_{size}"):
                    sum += min(1, self.History.check(f"used_buttplug_size_{size}")/5)

                    break

            return min(3, int(math.floor(sum)))
There's no randomization but there is a history check and then a summation of that history. So, basically, the more you've asked (and they've accepted) to use said toy, used the dildo or had anal sex, the higher the sum. And when it reaches a certain sum, you can reach the next toy size. Reread the formula. This is wrong. The according to this math, how many times you'ved asked them to use said plug has very little to no affect on the next size being allowed. It's all up to how many times you've used their ass. No RNG involved.


...there some way this mod could affect the "sexual training"? As in, their capability to wear bigger plugs and perform deepthroat.
Most likely, deepthroat is similar in mechanics (I haven't looked). Looked it up. Once they've done a blowjob, they'll agree to a deepthroat, provided your love and trust is high enough. Each time they try, the counter for it goes up. How it goes is the "training".

But the hardest part isn't getting this done. Hooking up a button chang a value isn't that hard. The hardest part is figuring out where/which button (or GUI interface) to hook that onto. I also want to avoid a "press here to get sex" button as that removes the game from the game (though, some people do want that, often to their own detriment...which they then complain about.). So looking for a place in the GUI of the game that both can serve that and is intuitive that that's what it is, is the major barrier.

With that said, I'm not opposed to this, but I also feel like any button that does this is just going to do what the game alredy does, but only like 20~30% quicker. Which, is it worth it at that point? (Not a rhetorical question. I truly do wonder.)

But yeah, anyone else reading this, if you want it (or don't want it) feel free to chime in. It's not a big priority for me, but I'm not opposed to making this if there's a good GUI interface to hook onto and the functionality is worthwhile (without reoving the game from the game).

ETA: If you're like, "When does Character.History.update(f"used_buttplug_size_{buttplug_size}") get called naturally?" It's when you ask them to use said toy and they agree.
 
Last edited:
  • Like
Reactions: vemnaroladopai