Updates 04.02

This commit is contained in:
Frisk 2025-02-04 21:34:26 +01:00
parent 0ffeaf9beb
commit 811e2a56fc
7 changed files with 287 additions and 68 deletions

View file

@ -1,16 +1,59 @@
extends EventBase
var scenes = {}
func _init():
id = "IssixEvent"
id = "SlaveryScreenOpen"
func registerTriggers(es):
es.addTrigger(self, "OpeningSlaveryScreen")
es.addTrigger(self, Trigger.TalkingToNPC, "slaveryscreen")
func react(_triggerID, _args):
if false:
runScene("SomeScene")
return true
if GM.main.getModuleFlag("IssixModule", "PC_Should_Be_Punished", 0) != 0:
var scene_to_play = assignScene("PUNISHMENT")
if scene_to_play:
runScene(scene_to_play)
GM.main.reRun()
GM.main.setModuleFlag("IssixModule", "PC_Should_Be_Rewarded", 0)
GM.main.setModuleFlag("IssixModule", "PC_Should_Be_Punished", 0)
return true
elif GM.main.getModuleFlag("IssixModule", "PC_Should_Be_Rewarded", 0) != 0:
var scene_to_play = assignScene("REWARD")
if scene_to_play:
runScene(scene_to_play)
GM.main.reRun()
GM.main.setModuleFlag("IssixModule", "PC_Should_Be_Rewarded", 0)
return true
return false
func isRequirementsBased(methods: Array):
for method in methods:
if method.get("name", "") == "checkIfFullfillsRequirements":
return true
return false
func gatherScenes():
for scene in GlobalRegistry.scenes:
if scene == "PunRewPawjob":
#print(GlobalRegistry.scenes[scene].base_object())
print(isRequirementsBased(GlobalRegistry.scenes[scene].get_script_method_list()))
if isRequirementsBased(GlobalRegistry.scenes[scene].get_script_method_list()):
var iscene = GlobalRegistry.createScene(scene) # Create temporary scene to be freed after this function runs, this is awful, I hate it, fuck
if !scenes.has(iscene.defaultCategory()):
scenes[iscene.defaultCategory()] = []
if iscene.checkIfFullfillsRequirements():
scenes[iscene.defaultCategory()].append(scene)
func assignScene(scene_type: String):
gatherScenes()
var possible_scenes = []
for scene in scenes[scene_type]:
possible_scenes.append(scene)
return RNG.pick(possible_scenes)
func onButton(_method, _args):
pass
func getPriority():
return 0
return 20

View file

@ -89,3 +89,62 @@ static func modifyDictStates(flagName: String, stateKey: String, stateValue):
# Add Issix's mood'
static func addIssixMood(mood: int):
GM.main.setModuleFlag("IssixModule", "Issix_Mood", clamp(GM.main.getModuleFlag("IssixModule", "Issix_Mood", 50)+mood, 0, 100))
# Get item that covers given inventory slot
static func getBodyCoveringItem(character, bodyslot):
var equippedItems = character.getInventory().getAllEquippedItems()
for inventorySlot in equippedItems:
var item = equippedItems[inventorySlot]
if(item.coversBodypart(bodyslot)):
return true
return null
# Verify requirements for pawns, requirements is array of two arrays, first one are methods which should return true in CharacterPawn obj and second is same but for BaseCharacter
static func verifyRequirements(pawn: CharacterPawn, requirements: Array) -> bool:
if pawn.isPlayer():
return false
for method in requirements[0]:
if !pawn.has_method(method) or !pawn.call(method):
return false
var base_character = pawn.getCharacter()
for method in requirements[1]:
base_character.has_method(method)
if !base_character.call(method):
return false
return true
# Find pawns that succeed requirements in list of lists
static func findPawns(requirements) -> Array:
var all_pawns = GM.main.IS.getPawns()
var results = []
for pawn_requirement in requirements:
var meet_criteria = []
for pawn in all_pawns:
if !verifyRequirements(all_pawns[pawn], pawn_requirement):
continue
meet_criteria.append(pawn)
results.append(meet_criteria)
return results
# Pick a unique random item for each of arrays
static func pick_unique_one(input_array: Array) -> Array:
var sizes_of_arrays = [] # We will need to compare sized of arrays to first process smallest arrays
var processed_array = input_array.duplicate(true)
for array in input_array:
sizes_of_arrays.append(array.size())
for _item in range(input_array.size()):
var smallest_array = sizes_of_arrays.min()
var index = sizes_of_arrays.find(smallest_array)
for _i in range(smallest_array):
var pick = processed_array[index].pick_random()
if pick in processed_array:
processed_array[index].erase(pick)
continue
processed_array[index] = pick
break
if processed_array[index] is Array:
processed_array[index] = null
sizes_of_arrays[index] = 999999
return processed_array

View file

@ -0,0 +1,61 @@
extends RequirementsBasedScene
var preference = 0
func _init():
sceneID = "PunRewOral"
func _run():
if(state == ""):
saynn("You admire the Harem and prepare yourself to preform another task for master~ However just before you can get started you hear a click then you see that you are being tugged to a chair by non other than Your Master himself~ Issix, as he Holds you with a leash~")
saynn("[say=pc]Eeep!~[/say]")
saynn("[say=issix]Now now~ Don't worry my pet~ I've got a better task for you to do that needs your immediate attention~[/say]")
saynn("You watch as he tugs you to his chair and he gets you to your knees as you look up at him, Then as you look down his body your eyes are met with a nice bulge~ And as he sees you eying his bulge he nods")
saynn("[say=issix]Yes my Pet~ You are going to service me nicely~ I need to use that Nice maw of yours so could you be so Kind an open up please?[/say]")
saynn("As you are asked to open your maw you watch him strip his pants of and out flops his hard and thick dragon cock~")
addButton("Open Wide", "Listen to your master and open that pretty maw of yours~", "normal")
addButton("Reject", "You don't want to suck him to enjoy your maw", "reject")
if state == "normal":
saynn("You blush watching him gently tug on the leash to pull your head closer to his length~ As he does so you open your maw nice and wide for him to slide into with plenty of ease however he smirks and looks at you")
saynn("[say=issix]Not yet~ You need to admire and polish this before I send it into your wanting maw Pet~ You need to work before you are rewarded~[/say]")
saynn("After he tells you this you nod and start to lick all around his nice and now throbbing length as it starts to harden up~ while he watched you polish and make his dragon cock shine with your saliva~")
saynn("[say=issix]Good pet There you go~ Give my tip some polishing and then I can feed you your reward~[/say]")
saynn("You nod and start to suck and lick his tip~ Making sure he enjoys it, you look up at him and watch as he keeps smirking and slowly nodding as you can start to taste a bit of precum leaking from his tip~")
saynn("[say=issix]Alright now pet~ Now open wide~ Time to put that throat to use and give you the reward you deserve~[/say]")
addButton("Continue~", "Now he is gonna enjoy that throat of yours~", "normal2")
if state == "normal2":
saynn("Watching as Issix nicely commands you to open wide, you listen and do exactly that as you show off your nice dripping maw~ Ready for his thick dragon cock, And for extra points you hang your tongue out showing how ready you are for it~")
saynn("[say=issix]I see someone is eager for a maw full of demon dragon cock~ Now don't worry~ I'm gonna enjoy every bit of that soaking wet maw of yours~[/say]")
saynn("He tugs on your leash and you feel the tip of his cock boops your nose as a blush creeps up your face seeing his cock up close once more and he nods to you expecting you to know what to do and you nod slightly before slowly sliding it into your maw and starting to suck up and down his ribbed length slowly to pleasure him~")
saynn("[say=issix]That's it~ Keep it up pet~ As you might just make me like you more than Azazel~[/say]")
saynn("He said with a smirk before slightly leaning his head back as he enjoyed your maw while you expertly suck his cock down, like the good pet he said you are~")
addButton("Continue", "Might As well speed it up~ Gotta get his delicious cream~", "normal3")
func oneTimeOnly(_checkID: String):
return true
func _react(_action: String, _args):
if _action == "normal":
GM.pc.addLust(20)
if _action == "normal2":
GM.pc.addLust(20)
if(_action == "endthescene"):
endScene()
return
setState(_action)
func getSceneCreator():
return "Phoenix"

View file

@ -41,13 +41,13 @@ func _run():
saynn("[say=issix][b]Lick[/b].[/say]")
saynn("You obey your Master. The tongue meets rough texture of {issix.his} {issix.toe}, you can't deny that the texture, smell and taste that you can feel on your tongue are slightly off putting, but it's not as bad as you initially imagined it to be. As you get used to all of it your licking becomes more intense.")
saynn("[say=issix]Get more spit on it, pet. You will thank yourself later.[/say]")
saynn("You do as commanded and cover the sole of Master's leg in more spit. There is only so much as the solid texture can take, which is apparent when your spit drips back onto your face covering it more and more. A minute later Master is satisfied.")
saynn("You do as commanded and cover the hoof of Master's leg in more spit. There is only so much as the solid texture can take, which is apparent when your spit drips back onto your face covering it more and more. A minute later Master is satisfied.")
saynn("[say=issix]Good hoof slut.[/say]")
if GM.pc.hasReachablePenis() and GM.pc.hasReachableVagina():
addButton("Penis", "He moves back and puts his sole onto your penis", "soletreatment", [1])
addButton("Vagina", "He moves back and puts his sole onto your vagina", "soletreatment", [2])
addButton("Penis", "He moves back and puts his hoof onto your penis", "soletreatment", [1])
addButton("Vagina", "He moves back and puts his hoof onto your vagina", "soletreatment", [2])
else:
addButton("Continue", "He moves back and puts his sole onto your privates", "soletreatment")
addButton("Continue", "He moves back and puts his hoof onto your privates", "soletreatment")
if state == "soletreatment":
match preference:
@ -55,16 +55,60 @@ func _run():
saynn("{issix.His} hoof moves over your crotch until it touches your {pc.penis} applying gentle pressure as you become accustomed with the feeling.")
saynn("[say=pc]Ahhh![/say]")
saynn("[say=issix]Shush, do not speak.[/say]")
saynn("All that lubricating spit you provided becomes very useful now as the sole of {issix.his} hoof massages your increasingly erect penis. This goes on for good few minutes, every now and then you grunt slightly, showing your Master appreciation for {issix.his} care.")
saynn("[say=issix]If you only saw yourself - a hoof slut squirming under my sole so happy {pc.his} {pc.penisSize} {pc.penis} receives attention from {pc.his} Master. Ah, whatever, I think you are too far gone.[/say]")
saynn("Master increases pressure and speed of his massage, regardless of rough texture of his sole it's still pleasant enough for you to ")
saynn("All that lubricating spit you provided becomes very useful now as the hoof of {issix.his} hoof massages your increasingly erect penis. This goes on for good few minutes, every now and then you grunt slightly, showing your Master appreciation for {issix.his} care.")
saynn("[say=issix]If you only saw yourself - a hoof slut squirming under my hoof so happy {pc.his} {pc.penisSize} {pc.penis} receives attention from {pc.his} Master. Ah, whatever, I think you are too far gone.[/say]")
saynn("Master increases pressure and speed of his massage, regardless of rough texture of his hoof it's still pleasant enough for you to ")
2:
saynn("{issix.His} hoof moves over your crotch until it touches your {pc.vagina} applying gentle pressure as you become accustomed with the feeling.")
saynn("[say=pc]Ahhh![/say]")
saynn("[say=issix]Shush, do not speak.[/say]")
saynn("All that lubricating spit you provided becomes very useful now as the hoof of {issix.his} hoof massages your increasingly wet {pc.vagina}. Its edge enters you slightly and with circular motions massages you as much as it can. This goes on for good few minutes, every now and then you grunt slightly, showing your Master appreciation for {issix.his} care.")
saynn("[say=issix]If you only saw yourself - a hoof slut squirming under my hoof so happy {pc.his} {pc.vaginaStretch} {pc.vagina} receives attention from {pc.his} Master. Ah, whatever, I think you are too far gone.[/say]")
saynn("Master increases pressure and speed of his massage, regardless of rough texture of his hoof it's still pleasant enough for you to ")
3:
saynn("{issix.His} hoof moves over your crotch until it touches it and applies gentle pressure and you become accustomed with the feeling.")
saynn("[say=pc]Ahhh![/say]")
saynn("[say=issix]Shush, do not speak.[/say]")
saynn("All that lubricating spit you provided becomes very useful now as the hoof of {issix.his} hoof massages your crotch. This goes on for good few minutes, every now and then you grunt slightly, showing your Master appreciation for {issix.his} care.")
saynn("[say=issix]If you only saw yourself - a hoof slut squirming under my hoof so happy {pc.his} null crotch receives attention from {pc.his} Master. Ah, whatever, I think you are too far gone.[/say]")
saynn("Master increases pressure and speed of his massage, regardless of rough texture of his hoof it's still pleasant enough for you to ")
saynn("[say=pc]Master, I...[/say]")
saynn("[say=issix]It's okey, you can let it go pet.[/say]")
if preference < 3:
addButton("Cum", "Let it go", "climax")
else:
addButton("Climax", "Let it go", "Climax")
if state == "climax":
saynn("[say=pc]Yipppp![/say]")
match preference:
1:
saynn("With a last yelp your you whine out the flood gates are released and you cover mostly yourself in your own baby batter.")
2:
saynn("With a last yelp your you whine out the flood gates are released and you cover mostly yourself in your own love juices.")
3:
saynn("With a last yelp your you whine out the flood gates are released and you climax.")
saynn("Master withdraws {issix.his} {issix.foot} and looks at your bright face.")
saynn("[say=issix]Happy, "+Globals.getPlayerPetName()+"? I certainly would hope so.[/say]")
saynn("[say=pc]Y-yess Master[/say]")
saynn("You thank your Master for rewarding you in such a special way and make yourself more or less presentable again.")
addButton("Back", "", "endthescene")
func oneTimeOnly(_checkID: String):
return true
func _react(_action: String, _args):
if _action == "climax":
if preference == 1:
GM.pc.cummedOnBy("pc", FluidSource.Penis, 0.8)
GlobalRegistry.getCharacter("issix").cummedOnBy("pc", FluidSource.Penis, 0.2)
elif preference == 2:
GM.pc.cummedOnBy("pc", FluidSource.Vagina, 0.8)
GlobalRegistry.getCharacter("issix").cummedOnBy("pc", FluidSource.Vagina, 0.2)
if _action == "soletreatment": # 1 = penis, 2 = vagina, 3 = nullo
if _args.size() > 0:
preference = _args[0]
@ -82,4 +126,8 @@ func _react(_action: String, _args):
var item = Globals.getBodyCoveringItem(GM.pc, BodypartSlot.Vagina)
GM.pc.getInventory().unequipItem(item)
if(_action == "endthescene"):
endScene()
return
setState(_action)

View file

@ -0,0 +1,48 @@
extends RequirementsBasedScene
var preference = 0
func _init():
sceneID = "PunRewScold"
func _run():
if(state == ""):
saynn("You approach the harem but Issix calls you in.")
saynn("[say=issix]Pet. I'm disappointed.[/say]")
saynn("He continues - scolding you for your behavior. calling you a bad pet, and giving you advice on how to do better.")
addButton("Accept", "Accept your place", "accept")
addButton("Disagree", "Disagree with your Master", "decline")
if state == "accept":
saynn("You listen thoroughly to your Master, you agree with him that your behavior wasn't appropriate, apologize to him and make amends.")
saynn("[say=pc]I'm sorry Master, I promise I'll not repeat the mistake again.[/say]")
saynn("[say=issix]I appreciate this, pet, and I'll hold your word for that. So don't go break it again, understood?[/say]")
saynn("[say=pc]Yes, Master.[/say]")
saynn("[say=issix]Then we are done here.[/say]")
addButton("End", "End the conversation", "endthescene")
if state == "decline":
saynn("You finally find a moment to interject.")
saynn("[say=pc]I didn't do anything wrong! You are jus-[/say]")
saynn("Issix shuts you up by muzzling your mouth.")
saynn("[say=issix]Exactly what I were talking about. Bratty pet. Wasn't your turn to speak, especially in a such unworthy of a pet manner.[/say]")
saynn("He applies more pressure on your muzzle, his strong grip causing you enough pain to whimper.")
saynn("[say=issix]Learn. When. To. Speak. Get out of my sight now.[/say]")
addButton("End", "End the conversation", "endthescene")
func defaultCategory() -> String:
return "PUNISHMENT"
func oneTimeOnly(_checkID: String):
return true
func _react(_action: String, _args):
if _action == "decline":
Globals.addIssixMood(-3)
if(_action == "endthescene"):
endScene()
return
setState(_action)

View file

@ -41,7 +41,7 @@ func _run():
if pawns_interactions.size() < 2:
setState("follow")
else:
playAnimation(StageScene.SexTrain, "inside", {pc=pawns_interactions[0], npc="nova", npc2=pawns_interactions[1], bodyState={naked=true, hard=true}, npcBodyState={naked=true, hard=true}})
playAnimation(StageScene.SexTrain, "sex", {pc="nova", npc=pawns_interactions[0], npc2=pawns_interactions[1], bodyState={naked=true, hard=true}, npcBodyState={naked=true, hard=true}})
if GM.pc.isBlindfolded() and !GM.pc.canHandleBlindness():
saynn("You are crawling on your fours while walking towards "+destinations[destination]+" while as you continue, both you and your Master become aware and curious about source of some intense sounds. You close in to the sounds, walking forward there is a little bit of free space on the left, you recognize the sounds as... Intense love making. The leash that usually slightly tugs on you becomes much more loose, signifying your Master has stopped, you take a break as well.")
else:
@ -259,7 +259,7 @@ func _react(_action: String, _args):
if(path.size() == 0):
setState(destination)
return
if path.size() in custom_scenes[destination] and RNG.chance(20):
if path.size() in custom_scenes[destination] and RNG.chance(25):
_action = custom_scenes[destination][path.size()]
pace = 0
elif RNG.chance(1):
@ -272,13 +272,13 @@ func _react(_action: String, _args):
return
if _action == "nova_horny":
pawns_interactions = pick_unique_one(findPawns([[["isInmate"], []], [["isInmate"], ["hasPenis"]]]))
pawns_interactions = Globals.pick_unique_one(Globals.findPawns([[["isInmate"], []], [["isInmate"], ["hasPenis"]]]))
if null in pawns_interactions:
setState("leashed")
return
if _action == "irritatingguard":
pawns_interactions = pick_unique_one(findPawns([[["isGuard"], []]]))
pawns_interactions = Globals.pick_unique_one(Globals.findPawns([[["isGuard"], []]]))
if null in pawns_interactions:
setState("leashed")
return
@ -291,55 +291,7 @@ func _react(_action: String, _args):
setState(_action)
# Verify requirements for pawns TODO TEST
func verifyRequirements(pawn: CharacterPawn, requirements: Array) -> bool:
for method in requirements[0]:
pawn.has_method(method)
if !pawn.call(method):
return false
var base_character = pawn.getCharacter()
for method in requirements[1]:
base_character.has_method(method)
if !base_character.call(method):
return false
return true
# Find pawns that succeed requirements in list of lists
func findPawns(requirements) -> Array:
var all_pawns = GM.main.IS.getPawns()
var results = []
for pawn_requirement in requirements:
var meet_criteria = []
for pawn in all_pawns:
if !verifyRequirements(all_pawns[pawn], pawn_requirement):
continue
meet_criteria.append(pawn)
results.append(meet_criteria)
return results
func check_if_string(element):
return element is String
# Pick a unique random item for each of arrays
func pick_unique_one(input_array: Array) -> Array:
var sizes_of_arrays = [] # We will need to compare sized of arrays to first process smallest arrays
var processed_array = input_array.duplicate(true)
for array in input_array:
sizes_of_arrays.append(array.size())
for _item in range(input_array.size()):
var smallest_array = sizes_of_arrays.min()
var index = sizes_of_arrays.find(smallest_array)
for _i in range(smallest_array):
var pick = input_array.pick_random()
if pick in processed_array:
continue
processed_array[index] = pick
break
if processed_array[index] is Array:
processed_array[index] = null
sizes_of_arrays[index] = 999999
return processed_array
func shouldBeInHeavyBondage(): # TODO Skill rebalance
return GM.pc.getSkillsHolder().getSkill("Pet").getLevel() > 2 or GM.pc.getSkillsHolder().getSkill("Pet").getExperience() > 80

View file

@ -24,7 +24,7 @@ func _run():
playAnimation(StageScene.Duo, "kneel", {npc="issix", npcAction="stand"})
if pet_time_start == null:
pet_time_start = GM.main.getTime()
addMessage("WARNING: A lot of the content in here is a placeholder. It will change, it will break, it will cause calamities. Treat it as a sneek peek into the (potential) future.")
#addMessage("WARNING: A lot of the content in here is a placeholder. It will change, it will break, it will cause calamities. Treat it as a sneek peek into the (potential) future.")
saynn("Your slave role: "+("pet" if GM.main.getModuleFlag("IssixModule", "PC_Enslavement_Role", 1) == 1 else "prostitute"))
saynn("Your training: "+trainingCheck())
saynn("Master's mood: "+getMood())
@ -65,7 +65,8 @@ func _run():
addButtonWithChecks("Comic", "Read one of "+ str(getModuleFlag("IssixModule", "Comic_Books", 0)) +" comic books", "readabook", [], [ButtonChecks.NotBlindfolded])
if not (GM.main.getModuleFlag("IssixModule", "Is_Player_Forced_Today", 0) > (getTimeSpent())) or GM.main.isVeryLate():
addButton("Leave", "Leave", "endthescene")
GM.ES.triggerRun("OpeningSlaveryScreen")
#GM.ES.triggerRun("OpeningSlaveryScreen")
GM.ES.triggerReact(Trigger.TalkingToNPC, ["slaveryscreen"])
if state == "issixpetmenu":
addCharacter("issix")
@ -83,10 +84,17 @@ func _run():
addButton("Training", "Ask Master if he could train you to be a better pet", "issixpettraining")
else:
addDisabledButton("Training", "You can only train once per day")
addDisabledButton("Tasks", "Ask for extra tasks (WIP)") # , "issixtaskquestion"
addButton("Tasks", "Ask for extra tasks", "issixtaskquestion") # , "issixtaskquestion"
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", "")
if state == "issixtaskquestionlist":
saynn("You can do certain tasks for Master to help in the harem and raise Issix's mood.")
addButton("")
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]")