23.12 update, happy sinmas

This commit is contained in:
Frisk 2024-12-23 20:19:18 +01:00
parent 3dcddb08af
commit 5538dc1b19
8 changed files with 356 additions and 166 deletions

View file

@ -43,7 +43,7 @@ func getFlags():
"Saw_Azazel_Naked": flag(FlagType.Bool), "Saw_Azazel_Naked": flag(FlagType.Bool),
"Lamia_Chosen_Drawing": flag(FlagType.Text), "Lamia_Chosen_Drawing": flag(FlagType.Text),
"PC_Saw_Artwork_At_Lamias": flag(FlagType.Bool), "PC_Saw_Artwork_At_Lamias": flag(FlagType.Bool),
"Hiisi_Crossword_IDs_Used": flag(FlagType.Dict), "Hiisi_Crossword_Used": flag(FlagType.Number),
"Hiisi_Helped_Today": flag(FlagType.Bool), "Hiisi_Helped_Today": flag(FlagType.Bool),
# Slavery related # Slavery related
@ -69,7 +69,10 @@ func getFlags():
"Had_Sex_With_Issix": flag(FlagType.Bool), "Had_Sex_With_Issix": flag(FlagType.Bool),
"Litter_Guessing_Game": flag(FlagType.Dict), "Litter_Guessing_Game": flag(FlagType.Dict),
"Have_Received_Headpats_Lamia": flag(FlagType.Bool), "Have_Received_Headpats_Lamia": flag(FlagType.Bool),
"Received_Headpats_From_Lamia": flag(FlagType.Number) "Received_Headpats_From_Lamia": flag(FlagType.Number),
"Total_Fluids_Milked": flag(FlagType.Dict),
"Has_Been_Milked_Today": flag(FlagType.Bool),
"Submission": flag(FlagType.Number)
#"Gym_Bullies_Left_Alone": flag(FlagType.Bool) Currently cannot change the behavior of this :( #"Gym_Bullies_Left_Alone": flag(FlagType.Bool) Currently cannot change the behavior of this :(
} }
@ -90,7 +93,6 @@ func _init():
"res://Modules/IssixModule/Events/SlaveryIntroEvent.gd", "res://Modules/IssixModule/Events/SlaveryIntroEvent.gd",
"res://Modules/IssixModule/Events/IssixRegularSearch.gd", "res://Modules/IssixModule/Events/IssixRegularSearch.gd",
"res://Modules/IssixModule/Events/LamiaCellEvent.gd" "res://Modules/IssixModule/Events/LamiaCellEvent.gd"
#"res://Modules/IssixModule/Events/Overwrites/BullyGangEvent.gd" Cannot overwrite module that loads after
] ]
scenes = [ scenes = [
@ -111,7 +113,6 @@ func _init():
"res://Modules/IssixModule/Scenes/SlaveryIntroScene.gd", "res://Modules/IssixModule/Scenes/SlaveryIntroScene.gd",
"res://Modules/IssixModule/Scenes/SlaveryInfoScreenScene.gd", "res://Modules/IssixModule/Scenes/SlaveryInfoScreenScene.gd",
"res://Modules/IssixModule/Scenes/SlaveryFirst/IssixBringsComicbooks.gd", "res://Modules/IssixModule/Scenes/SlaveryFirst/IssixBringsComicbooks.gd",
#"res://Modules/IssixModule/Scenes/Overwrites/BullyGangScene.gd"
"res://Modules/IssixModule/Scenes/SlaveryFirst/IssixFindsAvoidingPlayer.gd" "res://Modules/IssixModule/Scenes/SlaveryFirst/IssixFindsAvoidingPlayer.gd"
] ]
@ -136,6 +137,10 @@ func _init():
"res://Modules/IssixModule/IssixPetQuest.gd" "res://Modules/IssixModule/IssixPetQuest.gd"
] ]
computers = [
"res://Modules/IssixModule/Scenes/ClosetComputer.gd"
]
GlobalRegistry.registerLustTopicFolder("res://Modules/IssixModule/InterestTopics/") GlobalRegistry.registerLustTopicFolder("res://Modules/IssixModule/InterestTopics/")
GlobalRegistry.registerSkinsFolder("res://Modules/IssixModule/Skins/") GlobalRegistry.registerSkinsFolder("res://Modules/IssixModule/Skins/")
GlobalRegistry.registerStatusEffectFolder("res://Modules/IssixModule/StatusEffects/") GlobalRegistry.registerStatusEffectFolder("res://Modules/IssixModule/StatusEffects/")
@ -144,10 +149,9 @@ func _init():
GlobalRegistry.registerSpeechModifiersFolder("res://Modules/IssixModule/SpeechModifiers/") GlobalRegistry.registerSpeechModifiersFolder("res://Modules/IssixModule/SpeechModifiers/")
GlobalRegistry.registerAttackFolder("res://Modules/IssixModule/Attacks/", true) GlobalRegistry.registerAttackFolder("res://Modules/IssixModule/Attacks/", true)
# External func postInit():
# "res://Scenes/ParadedOnALeashScene.gd" GlobalRegistry.registerScene("res://Modules/IssixModule/Scenes/Overwrites/BullyGangScene.gd", "Rahi") # Still consider it mostly Rahi's creation'
# "res://Game/World/Floors/Closet.gd" GlobalRegistry.registerEvent("res://Modules/IssixModule/Events/Overwrites/BullyGangEvent.gd")
# "res://Game/World/Floors/Closet.tscn"
static func addSceneToWatched(scene: String): static func addSceneToWatched(scene: String):
var scenes = GM.main.getModuleFlag("IssixModule", "Misc_Slavery_Info", {"scenes_seen": []}) var scenes = GM.main.getModuleFlag("IssixModule", "Misc_Slavery_Info", {"scenes_seen": []})
@ -255,3 +259,4 @@ func resetFlagsOnNewDay(): # I apologize for abusing this hook, but startNewDay
GM.main.setModuleFlag("IssixModule", "Helped_Lamia_With_Drawings_Today", false) GM.main.setModuleFlag("IssixModule", "Helped_Lamia_With_Drawings_Today", false)
GM.main.setModuleFlag("IssixModule", "Pet_Time_Interaction_Today", 0) GM.main.setModuleFlag("IssixModule", "Pet_Time_Interaction_Today", 0)
GM.main.setModuleFlag("IssixModule", "Eaten_Today", false) GM.main.setModuleFlag("IssixModule", "Eaten_Today", false)
GM.main.setModuleFlag("IssixModule", "Has_Been_Milked_Today", true)

View file

@ -0,0 +1,169 @@
extends ComputerBase
var connectedTo = ""
var loggedAsAdmin = false
func _init():
id = "ClosetComputer"
func reactToCommand(_command:String, _args:Array, _commandStringRaw:String):
if (connectedTo == "inmates.db"):
pass
if(connectedTo == "127.0.223"): # TODO Finish computer UwU
if(_command == "help"):
if(_args.size() == 1):
var tolearn = _args[0]
if(tolearn == "disconnect"):
return "Closes the connection"
elif(tolearn == "login"):
return "Allows you to login as an admin. Syntax: login <password>"
elif(tolearn == "ls"):
return "This command outputs the contents of your harddrive"
elif(tolearn == "cat"):
return "This command outputs file's contents into the console.\nSyntax 'cat <FILE INDEX>' where file index is a [b]number[/b] that can be obtained by using the ls command"
elif(tolearn == "sqlopen"):
return "This command opens a database file for simple operations\nSyntax 'sqlopen <FILE INDEX>' where file index is a [b]number[/b] that can be obtained by using the ls command"
return "No help found for that command"
learnCommand("disconnect")
learnCommand("login")
learnCommand("ls")
learnCommand("cat")
learnCommand("sqlopen")
return "Available commands:\ndisconnect\nlogin\nls\ncat\nsqlopen"
if(_command == "disconnect"):
if(_args.size() == 0):
connectedTo = ""
loggedAsAdmin = false
return "Disconnecting... Success"
else:
return "'disconnect' command expects 0 arguments"
if(_command == "sqlopen"):
if(_args.size() == 1):
var fileIndex = _args[0]
if(fileIndex in ["1", "inmates.db"]):
connectedTo = "inmates.db"
return "Opening inmates.db... Opened successfully."
else:
return "Error. File with such index wasn't found"
else:
return "'sqlopen' command expects 1 argument"
if(_command == "login"):
if(loggedAsAdmin):
return "Already logged in"
if(_args.size() == 1):
var modeStr = _args[0]
if(modeStr == "OWNERSHIP"):
loggedAsAdmin = true
return "Logged in as admin successfully. Welcome, administrator."
return "Error, wrong password"
if(_command == "ls"):
if(_args.size() == 0):
return "Found 1 file:\n1 - inmates.db"
else:
return "This command expects 0 arguments"
if(_command == "cat"):
if(_args.size() == 1):
var fileIndex = _args[0]
if(fileIndex in ["1", "inmates.db"]):
if loggedAsAdmin:
return "<EFBFBD>v<EFBFBD>KtablefilesfilesCREATE TABLE inmates (\nid INTEGER NOT NULL, \nfirst_name TEXT, \nlast_name TEXT, \ndescription TEXT, \nPRIMARY KEY (id)\n#<23><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{uoic]WQKE?93-'! smga[UOIC=71+% [corrupt]garbaaaageeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee[/corrupt]\n"
else:
return "cat: inmates.db: Permission denied"
else:
return "Error. File with such index wasn't found"
else:
return "'cat' expects 1 argument"
return "Error, server doesn't support this command"
if(connectedTo == ""):
if(_command == "connect"):
if(_args.size() == 1):
var server = _args[0]
if(server in ["127.0.223"]):
connectedTo = server
if(server == "127.0.223"):
var last_login = GM.main.getModuleFlag("IssixModule", "Last_Login_Server", GM.main.getDays()-2)
GM.main.setModuleFlag("IssixModule", "Last_Login_Server", GM.main.getDays())
return "Connecting to "+server+"... Connected!\nLast login: "+str(GM.main.getDays()-last_login)+" days ago."
else:
return "Connecting to "+server+"... Connection failed!"
else:
return "'connect' expects 1 argument"
if(_command == "ls"):
if(_args.size() == 0):
return "Found 2 files:\n1 - inmates.txt\n2 - forum.html"
elif(_args.size() == 1):
if (_args[0] in ["-a", "--all"]):
return "Found 2 files:\n1 - inmates.txt\n2 - forum.html\n3 - .dash_history"
else:
return "Unknown flag "+_args[0]
else:
return "This command expects 0 to 1 arguments"
if(_command == "cat"):
if(_args.size() == 1):
var fileIndex = _args[0]
if(fileIndex in ["1", "inmates.txt"]):
return "Please for the love of intergalactic squid - when you log into the database server (the one at 127.0.223) with goddamn inmate data, log out of it when you are done!!! AlphaOS has limited amount of sessions per server because apparently they invented the computers just now and are figuring trivial issues like that only now. Fuck."
elif(fileIndex in ["2", "forum.html"]):
return "...**[corrupt]corrupted data[/corrupt]**...\n\n<message>Anyone knows what's the status of black goo we've ordered?</message>\n<message>Black goo? What black goo?</message>\n<message>can it be used as lube?</message>\n<message>fuck, I hope so, the one from vendomat is way too watery</message>\n<message>No, it cannot be used as a lube you horny bitches, it's for engineering purposes, we need it to minimize friction in metallic joints of mechanic arms</message>\n<message>so what you are saying is that it's lube</message>\n<message>I hate you guys</message>\n<message>The vessel that supposed to have black goo didn't have it, we re-ordered it</message>\n<message>Finally an answer! Thank you!</message>\n<message>Sure thing, by the way, we ordered double the amount due to request from the guards</message>\n<message>Why do guards need black go- Oh for fuck's sake</message>\n\n...**[corrupt]more corrupted data[/corrupt]**..."
else:
return "Error. File with such index wasn't found"
else:
return "'cat' expects 1 argument"
if(_command == "quit"):
markFinishedFail()
return "Shutting down.."
if(_command == "help"):
if(_args.size() == 1):
var tolearn = _args[0]
if(tolearn == "help"):
return "This command outputs all other commands and can also provide help for certain command by typing 'help <COMMAND>'"
elif(tolearn == "ls"):
return "This command outputs the contents of your harddrive"
elif(tolearn == "cat"):
return "This command outputs file's contents into the console.\nSyntax 'cat <FILE INDEX>' where file index is a [b]number[/b] that can be obtained by using the ls command"
elif(tolearn == "connect"):
return "This command lets you connect to the remote server by using its ip.\nSyntax 'connect <IP>'. An example of an ip is 127.0.1"
elif(tolearn == "quit"):
return "Shutdown the console"
else:
return "Couldn't find command '"+str(tolearn)+"'. To see all the available commands type 'help'"
elif(_args.size() == 0):
learnCommand("help")
learnCommand("ls")
learnCommand("cat")
learnCommand("connect")
learnCommand("quit")
return "Available commands are: ls, cat, connect, help, quit.\nTo learn more about a command type 'help <COMMAND>'"
else:
learnCommand("help")
return "'help' expects 0 or 1 arguments"
learnCommand("help")
return "Error, unknown command. Use 'help' to list all available commands"
func saveData():
var data = .saveData()
data["connectedTo"] = connectedTo
data["loggedAsAdmin"] = loggedAsAdmin
return data
func loadData(data):
.loadData(data)
connectedTo = SAVE.loadVar(data, "connectedTo", "")
loggedAsAdmin = SAVE.loadVar(data, "loggedAsAdmin", false)

View file

@ -78,6 +78,7 @@ func _run():
if state=="lookaround": if state=="lookaround":
saynn(GM.world.getRoomByID("eng_closet").getDescription()) saynn(GM.world.getRoomByID("eng_closet").getDescription())
addButton("Cabinets", "Try to search cabinets", "cabinets") addButton("Cabinets", "Try to search cabinets", "cabinets")
addButton("Computer", "There is a computer in the corner, you could try and interact with it", "computer")
addButton("Leave", "Try to leave the room", "leave") addButton("Leave", "Try to leave the room", "leave")
if state=="cabinets": if state=="cabinets":
@ -193,12 +194,14 @@ func _react(_action: String, _args):
return return
if(_action == "cabinetloot"): if(_action == "cabinetloot"):
processTime(60)
current_loot = generateLoot(_args[0]) current_loot = generateLoot(_args[0])
current_cabinet = _args[0] current_cabinet = _args[0]
if typeof(current_loot) == TYPE_INT: if typeof(current_loot) == TYPE_INT:
_action = "cabinetevent"+str(current_loot) _action = "cabinetevent"+str(current_loot)
if _action == "cabinets": if _action == "cabinets":
processTime(30)
var activated_cabinets = getModuleFlag("IssixModule", "Activated_Cabinets", {}) var activated_cabinets = getModuleFlag("IssixModule", "Activated_Cabinets", {})
if activated_cabinets.size() > 9: if activated_cabinets.size() > 9:
if RNG.chance(50): if RNG.chance(50):
@ -212,6 +215,9 @@ func _react(_action: String, _args):
if(_action == "strugglemenu"): if(_action == "strugglemenu"):
runScene("StrugglingScene") runScene("StrugglingScene")
return return
if _action == "computer":
runScene("ComputerSimScene", ["ClosetComputer"], "computerexplore")
setState(_action) setState(_action)
@ -235,3 +241,15 @@ func _react_scene_end(_tag, _result):
endScene() endScene()
else: else:
setState("cabinets") setState("cabinets")
if(_tag == "computerexplore"):
if(_result is Array):
if(_result[0] == true):
processTime(3*60)
# addMessage("You got 50 credits! But there is something else too..")
# addItemToSavedItems(GlobalRegistry.createItem("HorsecockDildo"))
# GM.pc.addCredits(50)
# addExperienceToPlayer(100)
setState("lookaround")
return
endScene()

View file

@ -69,12 +69,12 @@ func _run():
if state == "issixthreat": if state == "issixthreat":
saynn("[say=pc]I'm under Master Issix's care, please don't hurt me.[/say]") saynn("[say=pc]I'm under Master Issix's care, please don't hurt me.[/say]")
if GM.pc.getFluids().hasFluidTypeWithCharID("Piss", "issix"): if GM.pc.getFluids().hasFluidTypeWithCharID("Piss", "issix"):
saynn("[say=gymbully]Are you? That would explain why you are reeking of him. Are you a good little "+IssixModule.getPlayerPetName()+" for your Master Esshiks? Ohhh, how cute. Why aren't you on a leash then huh, fuck pet?[/say]") saynn("[say=gymbully]Are you? That would explain why you are reeking of him. Are you a good little "+getPlayerPetName()+" for your Master Esshiks? Ohhh, how cute. Why aren't you on a leash then huh, fuck pet?[/say]")
else: else:
saynn("[say=gymbully]Are you? That would explain why you look like a breeding bitch. Are you a good little "+IssixModule.getPlayerPetName()+" for your Master Esshiks? Ohhh, how cute. Why aren't you on a leash then huh, fuck pet?[/say]") saynn("[say=gymbully]Are you? That would explain why you look like a breeding bitch. Are you a good little "+getPlayerPetName()+" for your Master Esshiks? Ohhh, how cute. Why aren't you on a leash then huh, fuck pet?[/say]")
saynn("Sounds of laughter fills the place, all three of inmates having fun at your expense.") saynn("Sounds of laughter fills the place, all three of inmates having fun at your expense.")
saynn("[say=gymbully]Do you think your Master would mind if we borrowed you for a few minutes and had fun with you?[/say]") saynn("[say=gymbully]Do you think your Master would mind if we borrowed you for a few minutes and had fun with you?[/say]")
saynn("The main bully looks at the other two for a seond, all of them are rather satisfied with themselves.") saynn("The main bully looks at the other two for a second, all of them are rather satisfied with themselves.")
saynn("[say=gymbully]Whatever. You just look like one of his bitches, and I don't plan to mess around with the big man himself again, 5 credits ain't worth it. See ya later, slave.[/say]") saynn("[say=gymbully]Whatever. You just look like one of his bitches, and I don't plan to mess around with the big man himself again, 5 credits ain't worth it. See ya later, slave.[/say]")
addButton("Continue", "That... Worked better than expected", "endthescene") addButton("Continue", "That... Worked better than expected", "endthescene")
@ -142,6 +142,16 @@ func _react(_action: String, _args):
setState(_action) setState(_action)
static func getPlayerPetName():
if Species.Canine in GM.pc.getSpecies():
return "puppy"
elif Species.Feline in GM.pc.getSpecies():
return "kitty"
elif Species.Equine in GM.pc.getSpecies():
return "pony"
else:
return "pet"
func saveData(): func saveData():
var data = .saveData() var data = .saveData()

View file

@ -76,8 +76,8 @@ var odd_lamia_art = [
"at first what seems like a tube of some sorts, though later you notice that this tube ends with a hole on one end, around the „hole” a bunch of yellowish protrusions extending from the fleshy tube" "at first what seems like a tube of some sorts, though later you notice that this tube ends with a hole on one end, around the „hole” a bunch of yellowish protrusions extending from the fleshy tube"
] ]
var crossword_puzzles = [["Sex in 11 letters", "intercourse"], ["Subfamily of goats and sheep", "caprinae"], []] var crossword_puzzles = [["Sex in 11 letters", "Intercourse"], ["Subfamily of goats and sheep", "Caprinae"], ["Lacking the authority or capacity to act", "Powerless"], ["Male heir to the throne", "Prince"], ["Fantasy art of bringing creatures from death to living", "Necromancy"]]
# OWNERSHIP
func _init(): func _init():
sceneID = "PetsTalkScene" sceneID = "PetsTalkScene"
@ -116,7 +116,7 @@ func _run():
addButton("Give Catnip", "Give Azazel the catnip", "catnip") addButton("Give Catnip", "Give Azazel the catnip", "catnip")
else: else:
if getModuleFlag("IssixModule", "PC_Enslavement_Role", 0) == 0: if getModuleFlag("IssixModule", "PC_Enslavement_Role", 0) == 0:
saynn("You approach Azazel, he recognizes sudden attention given to him, he goes on his fours doing some kitty back streching before kneeling towards you expectantly. You notice he took a quick peek at his master beforehand.") saynn("You approach Azazel, he recognizes sudden attention given to him, he goes on his fours doing some kitty back stretching before kneeling towards you expectantly. You notice he took a quick peek at his master beforehand.")
else: else:
pass # TODO pass # TODO
addButton("Back", "Take a step back", "") addButton("Back", "Take a step back", "")
@ -154,34 +154,50 @@ func _run():
if state == "hiisihelp": if state == "hiisihelp":
saynn("[say=pc]Hey Hiisi, anything you'd like help with? I'd be happy to do something for you![/say]") saynn("[say=pc]Hey Hiisi, anything you'd like help with? I'd be happy to do something for you![/say]")
if hiisi_help_type == 1: match hiisi_help_type[0]:
saynn("[say=hiisi]Actually, yeah, I'd have something for you, this little padlock recently got stuck and I've been trying to open it without much luck, perhaps you'd be able to do something about it?[/say]") 1:
saynn("You look at the padlock, it connects two pieces of chain together, and even though its in unlocked position, the metal shackle is stuck inside the body. For a moment you try sheer brute force, though you imagine Hiisi already tried it considering his musculature. Your next strategy involves jigging the shackle in all direction, after a while the strategy proves successful and you manage to open the padlock.") saynn("[say=hiisi]Actually, yeah, I'd have something for you, this little padlock recently got stuck and I've been trying to open it without much luck, perhaps you'd be able to do something about it?[/say]")
saynn("[say=pc]Here you go, needed some jiggling.[/say]") saynn("You look at the padlock, it connects two pieces of chain together, and even though its in unlocked position, the metal shackle is stuck inside the body. For a moment you try sheer brute force, though you imagine Hiisi already tried it considering his musculature. Your next strategy involves jigging the shackle in all direction, after a while the strategy proves successful and you manage to open the padlock.")
saynn("[say=hiisi]Wow, I'm surprised you did it, I've been trying to open it for past hour and couldn't do it. Thanks {pc.name}![/say]") saynn("[say=pc]Here you go, needed some jiggling.[/say]")
addButton("Back", "You've helped the canine today, padlock open with two chains escaping their shackles", "hiisitalk") saynn("[say=hiisi]Wow, I'm surprised you did it, I've been trying to open it for past hour and couldn't do it. Thanks {pc.name}![/say]")
elif hiisi_help_type == 2: addButton("Back", "You've helped the canine today, padlock open with two chains escaping their shackles", "hiisitalk")
saynn("[say=hiisi]Oh, sorry, not today. I don't think I have anything for you to help me with.[/say]") 2:
saynn("[say=pc]Oh, I see. In that case... Could I give you a hug?[/say]") saynn("[say=hiisi]Oh, sorry, not today. I don't think I have anything for you to help me with.[/say]")
saynn("Hiisi gives you a reluctant nod with a little bit embarrassed face expression. You embrace Hiisi in a hug, his tail moves behind swiftly as you do.") saynn("[say=pc]Oh, I see. In that case... Could I give you a hug?[/say]")
saynn("[say=hiisi]Thank you, that's very nice of you.[/say]") saynn("Hiisi gives you a reluctant nod with a little bit embarrassed face expression. You embrace Hiisi in a hug, his tail moves behind swiftly as you do.")
addButton("Back", "You've helped the canine today, in one of many ways", "hiisitalk") saynn("[say=hiisi]Thank you, that's very nice of you.[/say]")
elif hiisi_help_type == 3: addButton("Back", "You've helped the canine today, in one of many ways", "hiisitalk")
saynn("[say=hiisi]Hmm. Actually, yeah, if you are willing to... I've been trying to solve a bunch of riddles lately and stumbled upon question that I'm not exactly sure how to answer, perhaps you could know. It reads as follows: "+ hiisi_help_type[1][0]+". Any idea what could it be?[/say]") 3:
addButton(hiisi_help_type[1][1], "Answer this", "hiisihelpresponse") saynn("[say=hiisi]Yeah, I do need help with something. Give me a second...[/say]")
elif hiisi_help_type == 4: saynn("He fetches a plastic cylinder from the nearby bag along with a lid that has a small metallic looking pipe coming out of it.")
saynn("[say=hiisi]Yeah, I do need help with something. Give me a second...[/say]") saynn("[say=hiisi]Can you please hold this one like that? It's difficult to pit it together without second person.[/say]")
saynn("He fetches a plastic cylinder from the nearby bag along with a lid that has a small metallic looking pipe coming out of it.") saynn("He grabs the cylinder and shows you how to hold it before passing it onto you. You replicate how he held it as he grabs another few parts and starts putting them on.")
saynn("[say=hiisi]Can you please hold this one like that? It's difficult to pit it together without second person.[/say]") saynn("[say=pc]Hmm, couldn't you ask Azazel or Lamia about this?[/say]")
saynn("He grabs the cylinder and shows you how to hold it before passing it onto you. You replicate how he held it as he grabs another few parts and starts putting them on.") saynn("[say=hiisi]I could, but you came just in time so I figured you could be the one helping me today.[/say]")
saynn("[say=pc]Hmm, couldn't you ask Azazel or Lamia about this?[/say]") saynn("Fe finishes and pulls the assembled thing from your paws.")
saynn("[say=hiisi]I could, but you came just in time so I figured you could be the one helping me today.[/say]") saynn("[say=pc]What is it anyways?[/say]")
saynn("Fe finishes and pulls the assembled thing from your paws.") saynn("[say=hiisi]Some kind of a dispenser, I don't know. found the parts somewhere, could be useful.[/say]")
saynn("[say=pc]What is it anyways?[/say]") saynn("He puts the assembled dispenser back into the bag and thanks you for your help.")
saynn("[say=hiisi]Some kind of a dispenser, I don't know. found the parts somewhere, could be useful.[/say]") addButton("Back", "You've helped the canine today, by helping them assemble a dispenser of some sorts", "hiisitalk")
saynn("He puts the assembled dispenser back into the bag and thanks you for your help.") 4:
addButton("Back", "You've helped the canine today, by helping them assemble a dispenser of some sorts", "hiisitalk") saynn("[say=hiisi]Hmm. Actually, yeah, if you are willing to... I've been trying to solve a bunch of riddles lately and stumbled upon question that I'm not exactly sure how to answer, perhaps you could know. It goes as follows: "+ hiisi_help_type[1][0]+". Any idea what could it be?[/say]")
addButton(hiisi_help_type[1][1], "Answer this", "hiisihelpresponse")
if state == "hiisihelpresponse":
saynn("[say=pc]What about "+hiisi_help_type[1][1]+"?[/say]")
saynn("Dog thinks for a little bit.")
saynn("[say=hiisi]I think that would work, thanks {pc.name}![/say]")
if hiisi_help_type[1][1] == "Necromancy":
saynn("[say=hiisi]Actually, I think that was the last one, so nice! Thank you![/say]")
saynn("[say=pc]Oh, that's wonderful! So, no more riddles for me?[/say]")
saynn("[say=hiisi]Yeah, I think we are done with those.[/say]")
saynn("[say=pc]Cool.[/say]")
saynn("As you look away from Hiisi and think what to do next, you hear a quiet murmur coming from Hiisi.")
saynn("[say=hiisi]N. E. C. R. O. M. A. N. C. Y... Hmm. It's [color=red][b]OWNERSHIP[/b][/color], why was this highlighted here?[/say]")
else:
saynn("[say=pc]Of course, glad I could help![/say]")
addButton("Back", "You've helped the canine today by solving a riddle", "hiisitalk")
if state == "hiisiappearance": if state == "hiisiappearance":
saynn("You approach a kneeling Hiisi, in many ways his fur coloring reminds you of huskies but... Backwards? The black coloring visible on his face and bottom of his canine tail, the tail so bushy and monochromatic that it reminds you of a skunk. The inside of his ears dark gray as well, along with the tip, with the pleasant light gray outline.\nWholly brighter palette on the back and his legs.") saynn("You approach a kneeling Hiisi, in many ways his fur coloring reminds you of huskies but... Backwards? The black coloring visible on his face and bottom of his canine tail, the tail so bushy and monochromatic that it reminds you of a skunk. The inside of his ears dark gray as well, along with the tip, with the pleasant light gray outline.\nWholly brighter palette on the back and his legs.")
@ -742,11 +758,22 @@ func _react(_action: String, _args):
processTime(5*60) processTime(5*60)
if _action == "hiisihelp": if _action == "hiisihelp":
processTime(2*60)
increaseModuleFlag("IssixModule", "Hiisi_Affection", 1) increaseModuleFlag("IssixModule", "Hiisi_Affection", 1)
setModuleFlag("IssixModule", "Hiisi_Helped_Today", true) setModuleFlag("IssixModule", "Hiisi_Helped_Today", true)
hiisi_help_type = [RNG.randi_range(1,4)] hiisi_help_type = [RNG.randi_range(1,4)]
if hiisi_help_type[0] == 3: if hiisi_help_type[0] == 4:
hiisi_help_type.append() var solved = getModuleFlag("IssixModule", "Hiisi_Crossword_Used", 0)
if solved == -1:
hiisi_help_type = [RNG.randi_range(1,3)]
hiisi_help_type.append(crossword_puzzles[solved])
if solved == 5:
setModuleFlag("IssixModule", "Hiisi_Crossword_Used", -1) # Mainly for future compatibility
else:
increaseModuleFlag("IssixModule", "Hiisi_Crossword_Used")
if _action == "hiisihelpresponse":
pass
if _action == "hiisisilence": if _action == "hiisisilence":
setModuleFlag("IssixModule", "Hiisi_Name_Helped", true) setModuleFlag("IssixModule", "Hiisi_Name_Helped", true)
@ -795,6 +822,7 @@ func _react(_action: String, _args):
increaseModuleFlag("IssixModule", "Lamia_Times_Helped", -1) increaseModuleFlag("IssixModule", "Lamia_Times_Helped", -1)
if _action == "artminigame": if _action == "artminigame":
processTime(1*60)
# 1 - humanoids and items, 2 - feral animals and flora, 3 - backgrounds, 4 - others/electronic devices # 1 - humanoids and items, 2 - feral animals and flora, 3 - backgrounds, 4 - others/electronic devices
var art_rand = RNG.pickWeighted([[1], [2], [3], [4], [1, 2], [1, 3], [2, 3], [1, 2, 3]], [15, 15, 15, 5, 10, 10, 5, 4]) var art_rand = RNG.pickWeighted([[1], [2], [3], [4], [1, 2], [1, 3], [2, 3], [1, 2, 3]], [15, 15, 15, 5, 10, 10, 5, 4])
artwork = [art_rand.duplicate(), generate_artwork_desc(art_rand), RNG.randi_range(1,151) == 50] # Here Frisk learned about how Godot variables lifespan ends with the end of _react leaving a very empty array after this function ends. Gave me quite a lot of confusion, but was fun to debug I suppose, Python would track the reference to a variable, Godot doesn't, sad. artwork = [art_rand.duplicate(), generate_artwork_desc(art_rand), RNG.randi_range(1,151) == 50] # Here Frisk learned about how Godot variables lifespan ends with the end of _react leaving a very empty array after this function ends. Gave me quite a lot of confusion, but was fun to debug I suppose, Python would track the reference to a variable, Godot doesn't, sad.

View file

@ -6,7 +6,7 @@ var reply_litter = null
var azazel_teased_motherhood = false var azazel_teased_motherhood = false
var azazel = null var azazel = null
var AVERAGE_WALK_DELAY = 9 var AVERAGE_WALK_DELAY = 9
var milk_result = []
func _init(): func _init():
sceneID = "SlaveryInfoScreen" sceneID = "SlaveryInfoScreen"
@ -32,6 +32,9 @@ func _run():
match GM.main.getModuleFlag("IssixModule", "PC_Enslavement_Role", 1): match GM.main.getModuleFlag("IssixModule", "PC_Enslavement_Role", 1):
1.0: 1.0:
saynn("Amount of time spent in Master's harem today: "+str(getTimeSpentReadable())) saynn("Amount of time spent in Master's harem today: "+str(getTimeSpentReadable()))
var forced = GM.main.getModuleFlag("IssixModule", "Is_Player_Forced_Today", 0)
if forced > 0:
saynn("You are expected to spend "+Util.getTimeStringHumanReadable(forced)+" in the harem today.")
2.0: 2.0:
saynn("To pay Master for sluttying around yesterday: " + str(GM.main.getModuleFlag("IssixModule", "Prostituation_fee_yesterday", 0) + GM.main.getModuleFlag("IssixModule", "Prostituation_flat_fee", 0))) saynn("To pay Master for sluttying around yesterday: " + str(GM.main.getModuleFlag("IssixModule", "Prostituation_fee_yesterday", 0) + GM.main.getModuleFlag("IssixModule", "Prostituation_flat_fee", 0)))
_: _:
@ -67,6 +70,9 @@ func _run():
addCharacter("issix") addCharacter("issix")
saynn("[say=issix]"+getMoodMessage()+"[/say]") saynn("[say=issix]"+getMoodMessage()+"[/say]")
saynn("Is there anything you want to do with Master?") saynn("Is there anything you want to do with Master?")
if GM.pc.hasBreastsFullOfMilk():
saynn("[say=issix]{pc.Name}, wouldn't you want to unburden your heavy chest a little?[/say]")
addButton("Milking", "Ask Issix about milking", "issixmilkingq")
if getModuleFlag("IssixModule", "Had_Sex_With_Issix", false) == false: if getModuleFlag("IssixModule", "Had_Sex_With_Issix", false) == false:
addButton("Sex", "Ask for sex with Master", "issixsexrequest") addButton("Sex", "Ask for sex with Master", "issixsexrequest")
else: else:
@ -76,6 +82,61 @@ func _run():
addDisabledButton("Options", "Ask your Master to change how he treats you (WIP)") #, "issixoptions" Pet etiquette, make player communicate via animalistic sounds, unlocks optional training addDisabledButton("Options", "Ask your Master to change how he treats you (WIP)") #, "issixoptions" Pet etiquette, make player communicate via animalistic sounds, unlocks optional training
addButton("Back", "Go back", "") addButton("Back", "Go back", "")
if state == "issixmilkingfirst":
saynn("[say=pc]Master, you mentioned something about unburdening my chest?[/say]")
saynn("[say=issix]Yes, pet. I can see your nipples leaking, you must be full. If you want, I could help you out. What do you say about it, do you want to be a little cow for me today? I can even give you something extra if you are a good little pet for me and give me your milk.[/say]")
addButton("Moo", "Moo at your Master", "issixmilking")
addButton("Not today", "You do not feel like getting milked right now", "issixpetmenu")
if state == "issixmilkingrepeat":
saynn("[say=pc]Master, I'd like you to milk me today.[/say]")
saynn("Master smiles at you and gestures you to come closer")
saynn("[say=issix]Of course my little cow, come here, let me take care of you.[/say]")
addButton("Moo", "Get milked by your Master", "issixmilking")
if state == "issixmilking":
playAnimation(StageScene.Duo, "sit", {npc="issix", bodyState={exposedChest=true, leashedBy="issix"}, npcAction="sit"})
saynn("[say=pc]Mooo.[/say]")
saynn("Your Master stands and sits you down on his chair.")
if !GM.pc.isFullyNaked():
saynn("[say=issix]First we will need to make you lose your clothes, don't you think? Little cows don't need any of that silly fabrics.[/say]")
saynn("Your Master eagerly removes the clothing covering your round orbs containing plenty of fluid your body meant for your children.")
saynn("Issix looks at your {pc.breasts} and starts massaging them with his paws, some {pc.milk} trickles out on his arm, he licks it.")
if GM.pc.hasBigBreasts():
saynn("[say=issix]You have such big {pc.milk} producers, can't wait to see just how much I can get out of them.[/say]")
else:
saynn("[say=issix]Modest size, but always cute to milk. If I were here for profit only I probably would skip the milking, but my precious pet cow deserves more than that, don't you?[/say]")
saynn("You respond with a little embarrassed moo.")
var term_for_breasts = ("udders" if GM.pc.hasBigBreasts() else "perky breasts")
saynn("Master grabs a bucket from under his chair, kneels with one of his legs and puts the bucket on your legs. He holds the bucket with his elbow while each of his paws lands on your {pc.breasts}.")
saynn("[say=issix]Hmm, perhaps that's not the best position for me, and I also think to complete your look we need one more thing.[/say]")
saynn("Your Master stands before producing another folded chair from a stash of stuff behind you. He also picks up a leash from his bag and attaches its clasp to your collar.")
saynn("[say=issix]That's better look for you, animals should be leashed. Now, my sweet little cow, relax and let me take care of you, okey?[/say]")
saynn("You nod to your Master, excited. He starts to tug on your "+term_for_breasts+" as you feel {pc.milk} escape your body into the bucket below, this feeling accompanied by a range of other pleasurable feelings.")
saynn("You look at your Master's face as he continues to gather your sweet {pc.milk}, though your look is blank - empty, just as your mind at that moment. You feel pleasure escaping from your "+term_for_breasts+" into every part of your body. Rhythmic squeezes currently fueling your existence. You live in a moment, letting your Master drain you, milk you like a feral animal. Your dumb stare is accompanied by open mouth with string of saliva dropping from your lips onto your body, if someone were to ask you a question, it likely wouldn't even register in your mind. Perhaps your Master milks you not only of {pc.milk} but also your mind? You wouldn't mind that though, would you?")
saynn("[say=issix]What a happy little cow you are! Don't worry, seems like we are nearing the end.[/say]")
saynn("You smile dumbly at your Master, not understanding his words. Cows don't think complex thoughts, they are to support their calves, or - like in your case - let their Master relieve them of burden. At some point you no longer register the waves of pleasure from your chest, and you hear snaps near your right ear. The blur in your eyes starts to sharpen out and you see happy face of your Master staring back at you, a bucket no longer on your legs.")
saynn("[say=issix]You there? Hello? Theeere you are. Enjoyed being a little cow?[/say]")
saynn("He scratches you behind your ears.")
saynn("[say=issix]Lets see...[/say]")
addButton("Continue", "Production review", "issixmilkingresult")
if state == "issixmilkingresult":
saynn("[say=issix]Today you've produced " +str(round(milk_result[0])) +" ml for me today. It makes it "+str(round(milk_result[1]))+" ml in total.[/say]")
if GM.pc.getSkillLevel(Skill.Milking) < 20 or milk_result[1] < 50000 or milk_result[0] < 600:
saynn("[say=issix]Perhaps you'd want to stay like you were when milking huh? Maybe some day, if you choose to be my little cow instead of "+getPlayerPetName()+" we could think about it okey? But you need to be a goood healthy cow producing lots and lots of milk for your Master alright? "+("You even look the part already! *gently pokes your horns*" if GM.pc.hasHorns() else "")+" Gooood cow.[/say]")
saynn("He pets your head")
else: # TODO I'll wait with this path for TF changes to land in main, perhaps player could become a female cow for Master?
addDisabledButton("Cow cow!", "Become a cow for your Master (transformation, WIP (likely very distant future if ever))")
addButton("Continue", "Come back to your senses", "issixpetmenu")
if state == "haremeat": if state == "haremeat":
saynn("You approach your bowl on the edge of your blanket, full of the gelatinous mass your Master fills it with and start munching its contents like a real pet would, without using tools or paws.") saynn("You approach your bowl on the edge of your blanket, full of the gelatinous mass your Master fills it with and start munching its contents like a real pet would, without using tools or paws.")
if GM.pc.getMaxStamina()*0.8 > GM.pc.getStamina(): if GM.pc.getMaxStamina()*0.8 > GM.pc.getStamina():
@ -405,6 +466,23 @@ func _react(_action: String, _args):
_action = "lamiapetrequestanother" _action = "lamiapetrequestanother"
GM.main.setModuleFlag("IssixModule", "Have_Received_Headpats_Lamia", true) GM.main.setModuleFlag("IssixModule", "Have_Received_Headpats_Lamia", true)
if _action == "issixmilkingq":
if GM.main.getModuleFlag("IssixModule", "Total_Fluids_Milked", 0) == 0:
_action = "issixmilkingfirst"
else:
_action = "issixmilkingrepeat"
if _action == "issixmilking":
processTime(10*60)
if _action == "issixmilkingresult":
var this_milking = GM.pc.milk()
var total_milk_obtained = getModuleFlag("IssixModule", "Total_Fluids_Milked", {"Milk": 0.0}) # Currently only fluid implemented in base game
total_milk_obtained["Milk"] = total_milk_obtained["Milk"] + this_milking
setModuleFlag("IssixModule", "Total_Fluids_Milked", total_milk_obtained)
milk_result = [this_milking, total_milk_obtained["Milk"]]
setModuleFlag("IssixModule", "Has_Been_Milked_Today", true)
if _action == "littercountresult": if _action == "littercountresult":
if(getTextboxData("litter_count") == ""): if(getTextboxData("litter_count") == ""):
return return
@ -478,6 +556,7 @@ func _react_scene_end(_tag, _result):
func saveData(): func saveData():
var data = .saveData() var data = .saveData()
data["milk_result"] = milk_result
data["replyLitter"] = reply_litter data["replyLitter"] = reply_litter
data["petTimeStart"] = pet_time_start data["petTimeStart"] = pet_time_start
data["azazelTease"] = azazel_teased_motherhood data["azazelTease"] = azazel_teased_motherhood
@ -490,3 +569,4 @@ func loadData(data):
pet_time_start = SAVE.loadVar(data, "petTimeStart", null) pet_time_start = SAVE.loadVar(data, "petTimeStart", null)
azazel_teased_motherhood = SAVE.loadVar(data, "azazelTease", false) azazel_teased_motherhood = SAVE.loadVar(data, "azazelTease", false)
reply_litter = SAVE.loadVar(data, "reply_litter", 0) reply_litter = SAVE.loadVar(data, "reply_litter", 0)
milk_result = SAVE.loadVar(data, "milk_result", [])

View file

@ -23,6 +23,8 @@ In tags: M/player, M/M (implied), petplay, slave, watersports, parasite
## Mod's audience ## Mod's audience
Mod is directed pretty much exclusively at players who are submissive. In game there are already a bunch of ways the player can effectively submit to other creatures - recentlishly added hypnokink is a great example of that, Tavi's questline also has a route/revolves around player submitting to Tavi as their pet. Those things are wonderful and I love them, but in-game slave system is definitely directed at dominant players. This mod tries to address that by adding a character that can enslave **the player**. It features degradation, pet-play content, watersports (for those who switch it on), branding. In addition - worth noting that the entire harem of pets is male. Mod is directed pretty much exclusively at players who are submissive. In game there are already a bunch of ways the player can effectively submit to other creatures - recentlishly added hypnokink is a great example of that, Tavi's questline also has a route/revolves around player submitting to Tavi as their pet. Those things are wonderful and I love them, but in-game slave system is definitely directed at dominant players. This mod tries to address that by adding a character that can enslave **the player**. It features degradation, pet-play content, watersports (for those who switch it on), branding. In addition - worth noting that the entire harem of pets is male.
What you **shouldn't expect** from the mod at the moment is for it to be heavy on non-con or roughness. While the "non-con" is one of the ideas I have, it is planned to be implemented at later time if I have enough motivation.
## Slavery ## Slavery
I think there is a reason why there are dozens of harem-management games where player becomes harem's owner and manages slave instead of being one. I think in large part there isn't much of a way to make the player be a slave and keep the gameplay entertaining. If becoming a slave means less choice - the game may become boring. In this mod I'm trying my best to still feel like player is enslaved while at the same time let them continue playing the game with full functionality. This is not an easy task to do, but probably better than eternity of being stuck in one time playing card game with another pet. I think there is a reason why there are dozens of harem-management games where player becomes harem's owner and manages slave instead of being one. I think in large part there isn't much of a way to make the player be a slave and keep the gameplay entertaining. If becoming a slave means less choice - the game may become boring. In this mod I'm trying my best to still feel like player is enslaved while at the same time let them continue playing the game with full functionality. This is not an easy task to do, but probably better than eternity of being stuck in one time playing card game with another pet.

View file

@ -1,122 +0,0 @@
extends "res://Scenes/SceneBase.gd"
var startLocation = ""
var endLocation = ""
var path = []
var whoLeashingID = ""
var randomChat = []
var teleportwhenskipped = true
var pose = "walk"
func _initScene(_args = []):
whoLeashingID = _args[0]
startLocation = _args[1]
endLocation = _args[2]
if(_args.size() > 3):
randomChat = _args[3]
if (_args.size() > 4):
teleportwhenskipped = _args[4]
if (_args.size() > 5):
pose = _args[5]
path = GM.world.calculatePath(startLocation, endLocation)
if(path.size() <= 0):
endScene()
func _init():
sceneID = "ParadedOnALeashScene"
func _run():
if(state == ""):
addCharacter(whoLeashingID)
if(state == "" || state == "leashed"):
if(state == "leashed"):
playAnimation(StageScene.Duo, pose, {npc=whoLeashingID, npcAction="walk", flipNPC=true, bodyState={leashedBy=whoLeashingID}})
if(path.size() > 0):
aimCameraAndSetLocName(path[0])
var _roomInfo = GM.world.getRoomByID(path[0])
if(_roomInfo == null):
saynn("You're being walked on a leash by {leasher.name}")
else:
saynn("You're being walked on a leash by {leasher.name}")
if(GM.pc.isBlindfolded() && !GM.pc.canHandleBlindness()):
saynn(_roomInfo.getBlindDescription())
else:
saynn(_roomInfo.getDescription())
if(randomChat.size() > 0 && RNG.chance(min(30, randomChat.size() * 10))):
saynn("[say=leasher]"+RNG.pick(randomChat)+"[/say]")
if (teleportwhenskipped):
addButton("Skip", "Skip the walk", "skipwalk")
else:
addButton("Skip", "Skip the walk", "endthescene")
addButtonAt(6, "Follow", "Follow the leash", "follow")
addDisabledButtonAt(10, "Leashed", "Can't escape from the leash")
addDisabledButtonAt(11, "Leashed", "Can't escape from the leash")
addDisabledButtonAt(12, "Leashed", "Can't escape from the leash")
if (state == "skipwalk"):
aimCamera(endLocation)
GM.pc.setLocation(endLocation)
endScene()
func _react(_action: String, _args):
if(_action == "endthescene"):
endScene()
return
if(_action == "follow"):
if(path.size() == 0):
endScene()
return
var nextLoc = path[0]
path.remove(0)
if(!GM.world.hasRoomID(nextLoc)):
endScene()
return
GM.pc.setLocation(nextLoc)
if(path.size() == 0):
endScene()
return
setState("leashed")
return
setState(_action)
func saveData():
var data = .saveData()
data["startLocation"] = startLocation
data["endLocation"] = endLocation
data["path"] = path
data["whoLeashingID"] = whoLeashingID
data["randomChat"] = randomChat
data["teleportwhenskipped"] = teleportwhenskipped
data["pose"] = pose
return data
func loadData(data):
.loadData(data)
startLocation = SAVE.loadVar(data, "startLocation", "")
endLocation = SAVE.loadVar(data, "endLocation", "")
path = SAVE.loadVar(data, "path", [])
whoLeashingID = SAVE.loadVar(data, "whoLeashingID", "")
randomChat = SAVE.loadVar(data, "randomChat", [])
teleportwhenskipped = SAVE.loadVar(data, "teleportwhenskipped", true)
pose = SAVE.loadVar(data, "pose", "walk")
func resolveCustomCharacterName(_charID):
if(_charID == "leasher" && whoLeashingID != ""):
return whoLeashingID
return null