24.12 update

This commit is contained in:
Frisk 2024-12-24 23:16:45 +01:00
parent 9259860487
commit f90ddb81f1
21 changed files with 514 additions and 24 deletions

View file

@ -131,6 +131,16 @@ func createBodyparts():
skillsHolder.addPerk(Perk.FertilityBetterOvulationV3)
skillsHolder.addPerk(Perk.FertilityDesireToBreed)
skillsHolder.addPerk(Perk.FertilitySubmissiveAndBreedable)
skillsHolder.addPerk(Perk.NakedDodging)
skillsHolder.addPerk(Perk.NakedDodgingV2)
skillsHolder.addPerk(Perk.NakedDodgingV3)
skillsHolder.addPerk(Perk.NakedExtraStamina)
skillsHolder.addPerk(Perk.NakedExtraStaminaV2)
skillsHolder.addPerk(Perk.NakedMagicHips)
skillsHolder.addPerk(Perk.NakedNoShame)
skillsHolder.addPerk(Perk.NakedStunningLips)
skillsHolder.addPerk(Perk.MilkSquirt)
skillsHolder.addPerk(Perk.MilkFasterProduction)
func onGivingBirth(_impregnatedEggCells: Array, _newkids: Array):
.onGivingBirth(_impregnatedEggCells, _newkids)
@ -139,4 +149,4 @@ func getBirthWaitTime():
return 60*60*24*3
func getDefaultEquipment():
return ["inmatecollar", "inmateuniformSexDeviant"]
return ["inmatecollar", "inmateuniformSexDeviant", "plainPanties"]

View file

@ -118,7 +118,10 @@ func createBodyparts():
tail.tailScale = 1
giveBodypartUnlessSame(tail)
giveBodypartUnlessSame(GlobalRegistry.createBodypart("digilegs"))
skillsHolder.addPerk(Perk.CombatBetterGetUp)
skillsHolder.addPerk(Perk.CombatDoubleDown)
skillsHolder.addPerk(Perk.CombatShove)
skillsHolder.addPerk(Perk.HypnosisFastAsleep)
func onGivingBirth(_impregnatedEggCells: Array, _newkids: Array):
.onGivingBirth(_impregnatedEggCells, _newkids)

View file

@ -92,6 +92,7 @@ func _init():
InterestTopic.TightPussy: Interest.Likes,
InterestTopic.BigCock: Interest.Hates,
}
func interestVerbalReaction(interest):
if(interest == InterestTopic.Pregnant):
@ -148,6 +149,20 @@ func createBodyparts():
tail.tailScale = 1
giveBodypartUnlessSame(tail)
giveBodypartUnlessSame(GlobalRegistry.createBodypart("hoofs"))
skillsHolder.addPerk(Perk.BreedCumVolume)
skillsHolder.addPerk(Perk.BreedCumVolumeV2)
skillsHolder.addPerk(Perk.BreedCumProduction)
skillsHolder.addPerk(Perk.BreedCumProductionV2)
skillsHolder.addPerk(Perk.BreedCumProductionV3)
skillsHolder.addPerk(Perk.BreedStud)
skillsHolder.addPerk(Perk.BreedRapidConception)
skillsHolder.addPerk(Perk.BreedCockSlap)
skillsHolder.addPerk(Perk.BreedBreedersBliss)
skillsHolder.addPerk(Perk.CombatBetterGetUp)
skillsHolder.addPerk(Perk.CombatDoubleDown)
skillsHolder.addPerk(Perk.CombatFullStaminaBonus)
skillsHolder.addPerk(Perk.CombatScratching)
skillsHolder.addPerk(Perk.CombatShove)
func onGivingBirth(_impregnatedEggCells: Array, _newkids: Array):

View file

@ -15,8 +15,13 @@ class CustomSorter:
func checkRequirements(requirements: Dictionary):
for key in requirements.keys():
if requirements[key] is int or requirements[key] is float:
if getModuleFlag("IssixModule", key, 0) < requirements[key]:
return false
if key.begins_with("-"): # If we want to eliminate cases where the requirement value is LOWER than player's score
key = key.trim_prefix("-")
if getModuleFlag("IssixModule", key, 0) >= requirements[key]:
return false
else: # If we want to eliminate cases where the requirement value is HIGHER than player's score
if getModuleFlag("IssixModule", key, 0) < requirements[key]:
return false
elif requirements[key] is String:
if getModuleFlag("IssixModule", key, 0) != requirements[key]:
return false

View file

@ -72,7 +72,8 @@ func getFlags():
"Received_Headpats_From_Lamia": flag(FlagType.Number),
"Total_Fluids_Milked": flag(FlagType.Dict),
"Has_Been_Milked_Today": flag(FlagType.Bool),
"Submission": flag(FlagType.Number)
"Submission": flag(FlagType.Number),
"Trained_With_Hiisi_Combat": flag(FlagType.Bool)
#"Gym_Bullies_Left_Alone": flag(FlagType.Bool) Currently cannot change the behavior of this :(
}
@ -140,7 +141,18 @@ func _init():
computers = [
"res://Modules/IssixModule/Scenes/ClosetComputer.gd"
]
skills = [
"res://Modules/IssixModule/Skills/Pet.gd"
]
perks = [
"res://Modules/IssixModule/Skills/Perks/BowlTraining.gd",
"res://Modules/IssixModule/Skills/Perks/FollowCommands.gd",
"res://Modules/IssixModule/Skills/Perks/PavlovsDog.gd",
"res://Modules/IssixModule/Skills/Perks/PetName.gd",
"res://Modules/IssixModule/Skills/Perks/PetSpeech.gd",
"res://Modules/IssixModule/Skills/Perks/PetWalk.gd"
]
GlobalRegistry.registerLustTopicFolder("res://Modules/IssixModule/InterestTopics/")
GlobalRegistry.registerSkinsFolder("res://Modules/IssixModule/Skins/")
GlobalRegistry.registerStatusEffectFolder("res://Modules/IssixModule/StatusEffects/")
@ -169,7 +181,7 @@ static func getPlayerRole():
return "pet" if GM.main.getModuleFlag("IssixModule", "PC_Enslavement_Role", 1) == 1 else "prostitute"
static func playerToFuck():
return (int(GM.main.getDays()) % 2 == 1) and GM.main.getModuleFlag("IssixModule", "Todays_Bred_Slave", "") == "pc" # every uneven day
return (int(GM.main.getDays()-1) % 2 == 1) and GM.main.getModuleFlag("IssixModule", "Todays_Bred_Slave", "") == "pc" # every uneven day
static func getPlayerPetName():
if Species.Canine in GM.pc.getSpecies():
@ -230,7 +242,7 @@ func calculateDailyScore() -> int:
func tickDay():
addIssixMood(RNG.randi_range(-7, 7))
if GM.pc.getLocation() != "medical_paddedcell_player":
if GM.pc.getLocation() == "medical_paddedcell_player":
pass # TODO Bust out scene
elif (GM.main.getDays() - GM.main.getModuleFlag("IssixModule", "Last_Day_Visited_Master", GM.main.getDays()) > 1):
addIssixMood(-10)
@ -239,8 +251,8 @@ func tickDay():
GM.main.increaseModuleFlag("IssixModule", "Comic_Books", RNG.randi_range(5, 8))
if int(GM.main.getDays()) % 30 == 0 and GM.main.getModuleFlag("IssixModule", "Strikes_For_Disobedience", 0) > 0: # every 30 days remove one strike
GM.main.increaseModuleFlag("IssixModule", "Strikes_For_Disobedience", -1)
if GM.main.getDays()-GM.main.getModuleFlag("IssixModule", "Last_Walk", GM.main.getDays()) == APPROX_WALK_DELAY:
GM.main.setModuleFlag("IssixModule", "Last_Walk", GM.main.getDays())
if GM.main.getDays()-1-GM.main.getModuleFlag("IssixModule", "Last_Walk", GM.main.getDays()) == APPROX_WALK_DELAY:
GM.main.setModuleFlag("IssixModule", "Last_Walk", GM.main.getDays()-1)
func resetFlagsOnNewDay(): # I apologize for abusing this hook, but startNewDay does not have ANY other hooks I can use and SleepInCell as a trigger is not covering all cases of days passing by
@ -261,3 +273,5 @@ func resetFlagsOnNewDay(): # I apologize for abusing this hook, but startNewDay
GM.main.setModuleFlag("IssixModule", "Pet_Time_Interaction_Today", 0)
GM.main.setModuleFlag("IssixModule", "Eaten_Today", false)
GM.main.setModuleFlag("IssixModule", "Has_Been_Milked_Today", true)
if GM.main.getModuleFlag("IssixModule", "Trained_With_Hiisi_Combat") != null:
GM.main.setModuleFlag("IssixModule", "Trained_With_Hiisi_Combat", false)

View file

@ -2,9 +2,9 @@ extends ComputerBase
var connectedTo = ""
var loggedAsAdmin = false
var records = {"533": "ID: 533\nfirstname: Issix\nlastname: [corrupt]Solomon[/corrupt]\n\nnotes: Issix, or rather [b]Gaap[/b] as his real real name goes, is a special case in BDCC, staff is NOT to take any punitive action in regards to this individual without first consulting with the director. He has not been convicted of any illegal activities, but rather has been introduced to prison based on order o[corrupt]f general Sonno[/corrupt]fer. \nOfficially - he is an inmate, unofficially he is is untouchable. Let him do whatever the fuck he wants, unless you don't value your own life. Incarcerated in [corrupt]4292 32 11[/corrupt].",\
"655": "ID: 655\nfirstname: Azazel\nlastname: Dreemurr\nPast inhabitant of planet [b]Pueri Meritorii[/b], sentenced for sex work with untreated STD. Original sentence was 10 years, it has been extended to indefinite due to circumstances in the prison.\nNOTE: THIS INMATE IS OWNED BY INMATE 533, PLEASE REFER TO MENTIONED INMATE ABOUT ALL MATTERS PERTAINING TO THIS INMATE",\
""}
var records = {"533": "ID: 533\nfirstname: Issix\nlastname: [corrupt]Solomon[/corrupt]\nitype: 1\n\nnotes: Issix, or rather [b]Gaap[/b] as his real real name goes, is a special case in BDCC, staff is NOT to take any punitive action in regards to this individual without first consulting with the director. He has not been convicted of any illegal activities, but rather has been introduced to prison based on order o[corrupt]f general Sonno[/corrupt]fer. \nOfficially - he is an inmate, unofficially he is is untouchable. Let him do whatever the fuck he wants, unless you don't value your own life. Incarcerated in [corrupt]4292 32 11[/corrupt].",\
"655": "ID: 655\nfirstname: Azazel\nlastname: Dreemurr\nitype: 3\nPast inhabitant of planet [b]Pueri Meritorii[/b], sentenced for sex work with untreated STD. Original sentence was 10 years, it has been extended to indefinite due to circumstances in the prison.\nNOTE: THIS INMATE IS OWNED BY INMATE 533, PLEASE REFER TO MENTIONED INMATE ABOUT ALL MATTERS PERTAINING TO THIS INMATE",\
"": ""}
func _init():
id = "ClosetComputer"
@ -15,7 +15,7 @@ func reactToCommand(_command:String, _args:Array, _commandStringRaw:String):
if _args.size() == 3:
if _args[0].to_upper() == "SELECT":
if _args[1].to_lower() == "inmates":
var record = records.get(_args[2])
var record = records.get(_args[2]) if _args[2] != GM.pc.getInmateNumber() else preparePCRecord()
if record == null:
return "No record with primary key of `"+_args[1]+"` has been found!"
return printRecord(record)
@ -24,7 +24,11 @@ func reactToCommand(_command:String, _args:Array, _commandStringRaw:String):
else:
return "`sqleasy` supports only read operations using SELECT."
else:
return "sqleasy makes SQL easy for you! Instead of knowing all this useless syntax, you only need to know the table name, ID from the primary key and SELECT!\n\nSyntax: SELECT <table name> <ID>\n\nIt will show you all columns corresponding to a record with given ID!\n©Lain (YOU ARE USING UNLICENSED COPY, PLEASE ACTIVATE YOUR VERSION WITH LICENSE!)"
return "sqleasy makes SQL easy for you! Instead of knowing all this useless syntax, you only need to know the table name, ID from the primary key and SELECT!\n\nSyntax: SELECT <table name> <ID> show record\nquit close the database\n\nIt will show you all columns corresponding to a record with given ID!\n©Lain (YOU ARE USING UNLICENSED COPY, PLEASE ACTIVATE YOUR VERSION WITH LICENSE!)"
if _command in ["quit", "disconnect", "q", "exit"]:
connectedTo = "127.0.223"
return "Closing database... Success"
if(connectedTo == "127.0.223"): # TODO Finish computer UwU
@ -94,7 +98,7 @@ func reactToCommand(_command:String, _args:Array, _commandStringRaw:String):
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, \nnotes 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"
return "<EFBFBD>v<EFBFBD>KtablefilesfilesCREATE TABLE inmates (\nid INTEGER NOT NULL, \nfirst_name TEXT, \nlast_name TEXT, \nitype INTEGER, \nnotes 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:
@ -175,8 +179,15 @@ func reactToCommand(_command:String, _args:Array, _commandStringRaw:String):
return "Error, unknown command. Use 'help' to list all available commands"
def printRecord(record:String) -> String:
return ""
func preparePCRecord() -> String:
var player_crimes = {Flag.Crime_Type.Innocent: "pleaded innocent, got sentenced with no evidence (typical for our courts)", Flag.Crime_Type.Theft: "sentenced for theft of property", Flag.Crime_Type.Murder: "sentenced for murder", Flag.Crime_Type.Prostitution: "sentenced for providing sexual services without a license"}
var output = "ID: "+GM.pc.getInmateNumber()+"\nfirstname: "+GM.pc.getName()+"\nlastname: [corrupt]noidea[/corrupt]\nitype: "+str(InmateType.getAll().find(GM.pc.inmateType)+1)
output += "\n\nnotes: [corrupt]Past inhabitant of planet -------------- [/corrupt], sentenced for "+player_crimes.get(GM.main.getFlag("Player_Crime_Type"))+". Indefinite sentence."
output += "\n" # note escapades with tavi
return output
func printRecord(record:String) -> String:
return record
func saveData():
var data = .saveData()

View file

@ -195,6 +195,7 @@ func _run():
if(state == "join"):
var score = calculateHaremScore()
#var pets = [getModuleFlag("IssixModule", "Azazel_Affection_given", 0), getModuleFlag("IssixModule", "Lamia_Times_Helped", 0), getModuleFlag("IssixModule", "Hiisi_Affection", 0)]
var score_explored = GM.main.getModuleFlag("IssixModule", "Score_Explored")
saynn("[say=pc]"+RNG.pick(["What would you say about me becoming one of your pets?", "Do you think I would fit in with your harem?", "I'd like to become one of your pets, is this possible?"])+"[/say]")
if(GM.pc.getPersonality().getStat(PersonalityStat.Subby) < 0):

View file

@ -68,6 +68,7 @@ func _react(_action: String, _args):
setModuleFlag("IssixModule", "Progression_Day_Next", GM.main.getDays()+5)
else:
setModuleFlag("IssixModule", "Progression_Day_Next", GM.main.getDays()+2)
GM.pc.getSkillsHolder().addPerk("PetWalkies")
if _action == "walkies2":
processTime(4*60)

View file

@ -74,6 +74,7 @@ func _react(_action: String, _args):
if(_action == "endthescene"):
increaseModuleFlag("IssixModule", "PC_Training_Level")
increaseModuleFlag("IssixModule", "Progression_Points")
GM.pc.getSkillsHolder().addPerk("BowlTraining")
var scenes = GM.main.getModuleFlag("IssixModule", "Misc_Slavery_Info", {"scenes_seen": []})
scenes["scenes_seen"].append(sceneID)
GM.main.setModuleFlag("IssixModule", "Misc_Slavery_Info", scenes.duplicate(true))

View file

@ -68,7 +68,7 @@ func _run():
if state == "issixpetmenu":
addCharacter("issix")
saynn("[say=issix]"+getMoodMessage()+"[/say]")
saynn("[say=issix]"+getSituationalMessage() + " " + getMoodMessage()+"[/say]")
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]")
@ -135,6 +135,9 @@ func _run():
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))")
if milk_result[2] > 0:
saynn("[say=issix]You know, since your milk already brings me some profit I don't mind giving you a small share, perhaps my pet would want to get something for himself huh? Do you? Aww. Of course you do. Have this.[/say]")
addButton("Continue", "Come back to your senses", "issixpetmenu")
if state == "haremeat":
@ -273,18 +276,127 @@ func _run():
var _ok = textBox.connect("text_entered", self, "onTextBoxEnterPressed")
addButton("Confirm", "Guess this number", "littercountresult")
if state == "hiisipetmenu":
playAnimation(StageScene.Duo, "kneel", {pc="hiisi", npcAction="kneel", npc="pc", bodyState={naked=false, hard=false}})
addCharacter("hiisi")
if GM.pc.getSkillLevel(Skill.Combat) < 16:
addDisabledButton("Learn", "Learn something from Hiisi (WIP)") # , "hiisilearncombat"
if GM.pc.getSkillLevel(Skill.Combat) < 16: # Just thought about it, it just may be the only way to skill this up in pacifist way to do skill checks on combat, that's awesome
if getModuleFlag("IssixModule", "Trained_With_Hiisi_Combat", false) != true:
addButtonWithChecks("Learn", "Learn something from Hiisi (requires Energy Drink)", "hiisilearncombat", [], [[ButtonChecks.HasItemID, "EnergyDrink"], [ButtonChecks.HasStamina]])
else:
addDisabledButton("Learn", "You've trained with Hiisi today already, both you and he need a break")
else:
addDisabledButton("Learn", "There isn't anything more you can learn from Hiisi about combat")
addDisabledButton("Sex", "Ask for sex with Hiisi (WIP)") # , "hiisisexrequest"
addButton("Back", "Go back", "")
if state == "hiisilearncombatfirst":
playAnimation(StageScene.Yoga, "warrior", {pc="hiisi", bodyState={naked=true}})
saynn("Figuring Hiisi might need an encouragement to teach you something, you prepare an energy drink to further convince the canine to teach you combat.")
saynn("[say=pc]Hey Hissi, I were wondering, you seem to know how to fight, any chance you could perhaps teach me something?[/say]")
saynn("Hiisi looks at you, surprised a little.")
saynn("[say=hiisi]Teach? Combat... I'm not so sure, I don't think I'm a good teacher material.[/say]")
saynn("[say=pc]I think you'd do great Hiisi.[/say]")
saynn("[say=hiisi]I don't think it's a great idea.[/say]")
saynn("[say=pc]Can I convince you with this then?[/say]")
saynn("You show an energy drink to Hiisi.")
saynn("[say=hiisi]Oh. Hmm... Alright, I can teach you, but I expect the same for every lesson, alright?[/say]")
saynn("[say=pc]Deal.[/say]")
saynn("[say=hiisi]Cool.[/say]")
if GM.pc.hasEffect(StatusEffect.Yoga) or GM.pc.hasEffect(StatusEffect.WorkOutLight) or GM.pc.hasEffect(StatusEffect.WorkOut):
saynn("Canine begins stretching, he also loses his clothes, makes sense. You do some light stretching but you recently stretched a fair bit so you are ahead in this regard")
else:
saynn("Canine begins stretching, he also loses his clothes, makes sense. He gesticulates you should start exercising as well, which you promptly start doing. You do some pull-ups, squats, planks... Eventually you feel pretty good about your form for today's training.")
saynn("[say=hiisi]Oh, forgot to ask, how advanced are you in combat?[/say]")
var combat_level = GM.pc.getSkillLevel(Skill.Combat)
if combat_level < 3:
saynn("[say=pc]Absolute novice, I didn't have much combat experience.[/say]")
saynn("[say=hiisi]I see... I guess we will start with basics then and go from there.[/say]")
elif combat_level < 7:
saynn("[say=pc]I have some experience. Fought here and there.[/say]")
saynn("[say=hiisi]Hmm... Your posture seems right so I assume you already know the basics, we will focus on other things then[/say]")
elif combat_level < 12:
saynn("[say=pc]I think I'm pretty good actually, thought I'm sure there is still plenty I can learn from you.[/say]")
saynn("[say=hiisi]Judging from your posture alone, it does seem like you know your shit. Can you show how you punch?[/say]")
saynn("You do attempt punch and freeze your arm.")
saynn("[say=hiisi]Yeah, that's good. There are small details you'll have to perfect but that's about it.[/say]")
else:
saynn("[say=pc]I fight regularly, so I have plenty of experience, I'm really looking for someone I can spar with and you seem pretty capable yourself.[/say]")
saynn("[say=hiisi]I didn't really agree to be a sparring partner, but I'm sure there is still something to perfect with your form so lets proceed.[/say]")
addButton("Training", "Start training under watchful eye of Hiisi", "hiisilearncombattraining")
if state == "hiisilearncombatrepeat":
saynn("[say=pc]Student {pc.name} arrived for training![/say]")
saynn("You smile at Hiisi while doing a salute. Hiisi attempts to hide his blush.")
saynn("[say=hiisi]You don't have to do thaaaat. Anyways, do you have the goods?[/say]")
saynn("You pass the energy drink to Hiisi, he catches it and puts near his blanket.")
saynn("[say=pc]Don't overdose on those![/say]")
saynn("[say=hiisi]Yeah, sure, sure. Let's start.[/say]")
addButton("Training", "Start training under watchful eye of Hiisi", "hiisilearncombattraining")
if state == "hiisilearncombattraining1":
playAnimation(StageScene.Solo, "stand", {pc="hiisi", bodyState={naked=true}})
saynn("[say=hiisi]Since you are still a baby as far as combat goes, first you need to understand the basics of posture.[/say]")
saynn("He stands with his two legs having a sizable gap in-between, marginally bended knees, his back straight and paws curled into fists in front of him. You attempt to replicate his posture.")
saynn("[say=hiisi]Extend your arm here a little, yes, like that. More space in between your legs, you don't want someone to just push you and lose your balance, that leg is there to keep you steady. Face the opponent, like this, yes. Good. Keep your back straight, can be a little curved if that's better for you, every species have a little different balance but basis for stance is the same for each and every of them.[/say]")
saynn("He gives you tips on posture here and there, you start to understand more and more about combat. After 25 minutes of training you feel like you can't take much more of advice for today, it's been a productive session.")
saynn("[say=pc]Thank you Hiisi, I think I learned a bunch from you.[/say]")
saynn("[say=hiisi]No problem, and remember about energy drink![/say]")
saynn("[say=pc]Yeah, yeah, sure.[/say]")
addButton("End", "End training for today", "hiisipetmenu")
if state == "hiisilearncombattraining2":
playAnimation(StageScene.Solo, "punch", {pc="hiisi", bodyState={naked=true}})
saynn("[say=hiisi]You know a little about training already, how about we add a few things to that knowledge?[/say]")
saynn("He stands with his two legs having a sizable gap in-between, marginally bended knees, his back straight and paws curled into fists in front of him. He punches the air a few times with fists of his right paw, you observe the quick moves. He switches to punching with left fist a few times.")
saynn("[say=hiisi]What matters is you and your opponent. Observation is very important part of fight, you react to what your opponent does. It must be like a reflex for you. Those who don't have reflexes can't predict how their opponent is going to behave, that's why it needs training, best in real sparring.[/say]")
saynn("You replicate the punches he thrown, sort of, at the very least you try your best. Hiisi corrects you fairly often, pointing out your countless mistakes, making reflexes a thing can be hard when you still have to think about your posture. 25 minutes pass and you decide that's enough of punching air for today.")
saynn("[say=pc]That was enlightening, thanks Hiisi![/say]")
saynn("[say=hiisi]Sure, see you later![/say]")
saynn("[say=pc]Yup.[/say]")
addButton("End", "End training for today", "hiisipetmenu")
if state == "hiisilearncombattraining3":
playAnimation(StageScene.Solo, "kick", {pc="hiisi", bodyState={naked=true}})
saynn("[say=hiisi]Combat is surely not something new to you anymore. But lets take it to the next level.[/say]")
saynn("He stands with his two legs having a sizable gap in-between, marginally bended knees, his back straight and paws curled into fists in front of him. He throws punches but he also involves his legs in the mixture. It occurs to you that it's a bit funny seeing him fight with invisible opponent.")
saynn("[say=hiisi]To fight, you must involve your entire body, not just arms, not just legs but entire body.[/say]")
if GM.pc.hasHorns():
saynn("[say=pc]Can I utilize horns?[/say]")
saynn("He looks at you bewildered, before his face is replaced with heavy thinking.")
saynn("[say=hiisi]That's... Yeah, that's something you can definitely do. It's good that you are thinking about your ENTIRE body. Horns are sturdy and can do plenty damage if used in appropriate moment.[/say]")
saynn("He continues to give you guidance as he shows a few moves he knows. He teaches you how to react to different body cues coming from your opponent. Punching air gets tiring pretty quick and you decide to rest for today.")
saynn("[say=pc]I feel like I'm getting better at this, thank you Hiisi![/say]")
saynn("[say=hiisi]Of course, I feel like I might actually not be too bad as a teacher.[/say]")
saynn("[say=pc]You are great! Seriously, I learn so much from you.[/say]")
saynn("Canine blushes and waves you off")
addButton("End", "End training for today", "hiisipetmenu")
if state == "hiisilearncombattraining4":
playAnimation(StageScene.Solo, "dodge", {pc="hiisi", bodyState={naked=true}})
saynn("[say=hiisi]There is little more I can teach you, but I can try. Master is a lot more skilled in combat than I'm, maybe he could help?[/say]")
saynn("He stands with his two legs having a sizable gap in-between, marginally bended knees, his back straight and paws curled into fists in front of him. He throws punches but he also involves his legs in the mixture. You can feel tense energy in the air, he gives it all and his technique is pretty refined, you can feel he doesn't do anything „simple” and doesn't try to make it easy to digest for you, this is high level.")
saynn("[say=hiisi]All of the techniques you already learned must be perfected to work together, body posture, reflexes, proper technique on punches and kicks. You observe your opponent and choose the best course of action, rely on intuition, it's faster than reason.[/say]")
saynn("You repeat the process over and over, you stand alongside Hiisi and try to synchronize your body with his, you imagine your opponent in front of you and try to beat them. Hiisi laughs.")
saynn("[say=hiisi]That's pretty good, good. I'm pretty proud of you, combat is no stranger to you anymore.[/say]")
saynn("[say=pc]Yeah! I feel plenty powerful, like... I could take down so many bullies![/say]")
saynn("[say=hiisi]*chuckle* Don't get ahead of yourself. You need not to underestimate the opponent, the one who does - loses. Treat each and every opponent as someone who knows their shit so they don't knock you down when you fall to your pride. You are not Master.[/say]")
saynn("[say=pc]What do you mean by that? I mean, Master sure looks well-built and I'm sure he can defend himself, but is he this good?[/say]")
saynn("[say=hiisi]I truthfully believe that if he wanted he could take down all guards with his bare fists. He is Master not only in name but in combat as well.[/say]")
saynn("It makes you wonder just how good your Master must be to hear such praise from someone like Hiisi about him,")
addButton("End", "End training for today", "hiisipetmenu")
if state == "lamiapetmenu":
playAnimation(StageScene.Duo, "kneel", {pc="lamia", npcAction="kneel", npc="pc", bodyState={naked=false, hard=false}})
addCharacter("lamia")
@ -293,8 +405,17 @@ func _run():
addButton("Pets", "Ask for pets", "lamiapetrequest")
else:
addDisabledButton("Pets", "You've asked for headpats today already!")
if GM.pc.getInventory().hasRemovableRestraintsNoLockedSmartlocks():
addButton("Get help", "Get Lamia's help with bondage gear that is on you", "lamiahelpbondage")
else:
addDisabledButton("Get help", "You are currently not bound by anything that Lamia could help you with")
addButton("Back", "Go back", "")
if state == "lamiahelpbondage":
saynn("[say=pc]Hey, Lamia, uhhh, could you help getting me out of those?[/say]")
saynn("Lamia gives you a look and nods, they come up to you and start helping you out of your various bondage gear you have on yourself.\nFinally you are no longer burdened by all that bondage gear on your body. Lamia smiles at you and gives you a pat before returning to their usual activity.")
addButton("Back", "Continue", "lamiapetmenu")
if state == "lamiapetrequestfirst":
saynn("A fox breed is consumed by snacking on food in their pet bowl.")
if GM.pc.getPersonality().getStat(PersonalityStat.Coward) > 0.3:
@ -382,6 +503,30 @@ func getTimeSpentReadable():
return "[color=red]0 minutes[/color]"
return "[color="+("green" if isTimeOkey() else "red")+"]"+ Util.getTimeStringHumanReadable(getTimeSpent()) + "[/color]"
func getSituationalMessage():
var responses = []
if GM.pc.isWearingHypnovisor():
responses.append("Making sure you stay obedient for your Master with that thing? That's cute. I like it.")
if GM.pc.isHeavilyPregnant():
responses.append("Almost ready for kits? Wonder how many of them are mine.")
if GM.pc.isCoveredInPiss():
responses.append("Love to see you smelling of urine.")
if GM.pc.isInHeat():
responses.append("I can smell your love juices from here, is my pet in heat? Aww. You need a good fuck don't you?")
if GM.pc.isWearingPortalPanties() and GM.pc.isFullyNaked():
responses.append("Personally not a fan of those new technologies, what's fun about fucking someone when you can't feel them wriggle in your arms?")
if GM.pc.isMuzzled():
responses.append("All bark no bite haha. I love when my pets come to me with equipment befitting their role in life.")
if GM.pc.hasBoundLegs() and GM.pc.hasBlockedHands() and GM.pc.hasBoundArms() and GM.pc.isBlindfolded() and GM.pc.isOralBlocked() and GM.pc.getInventory().hasItemIDEquipped("ropeharness"):
responses.append("*whistles* You look like a rope bunny to me, in this place it screams „I consent to everything”, quite dangerous if you ask me, but fuck, if you like it maybe you don't mind being a rape bait for everyone in this facility.")
if GM.pc.hasBoundLegs():
responses.append("Do you enjoy struggling with walking so much? I hope you do.")
if GM.pc.hasBlockedHands():
responses.append("Fuck yes. It gotta be one of my favorite things when my pet's paws are reduced to absolutely useless mittens. I think this look befits you, in fact, I think you should wear them permanently.")
if GM.pc.getInventory().hasItemIDEquipped("GasMask"):
responses.append("Where the hell have you found that thing? A fucking gas mask? Damn. Did not expect that.")
return ""
func getMoodMessage():
var issix_mood = getModuleFlag("IssixModule", "Issix_Mood", 50)
if issix_mood < 10:
@ -416,7 +561,6 @@ func getMood():
else:
return "[color=green]excellent[/color]"
static func playerToFuck():
return (int(GM.main.getDays()) % 2 == 1) and GM.main.getModuleFlag("IssixModule", "Todays_Bred_Slave", "") == "pc"
@ -477,10 +621,15 @@ func _react(_action: String, _args):
if _action == "issixmilkingresult":
var this_milking = GM.pc.milk()
var credits = 0
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"]]
if this_milking > 500 and total_milk_obtained["Milk"] > 3000:
credits = clamp(int(floor(sqrt(this_milking / 100.0) / 1.3)) - 15, 0.0, 300.0)
if credits > 0:
addMessage("Your Master passes to you "+str(credits)+" credits.")
milk_result = [this_milking, total_milk_obtained["Milk"], credits]
setModuleFlag("IssixModule", "Has_Been_Milked_Today", true)
if _action == "littercountresult":
@ -498,6 +647,34 @@ func _react(_action: String, _args):
if not reply_litter > 100:
registerOffspringGuess()
if _action == "hiisilearncombat":
if GM.main.getModuleFlag("IssixModule", "Trained_With_Hiisi_Combat") == null:
_action = "hiisilearncombatfirst"
else:
_action = "hiisilearncombatrepeat"
GM.pc.getInventory().removeXOfOrDestroy("EnergyDrink", 1)
addMessage("You've given away 1 energy drink.")
if _action == "hiisilearncombattraining":
processTime(25*60)
var skill = GM.pc.getSkillsHolder().getSkill(Skill.Combat)
var exp_calc = 25
if skill != null:
exp_calc = int(skill.getRequiredExperience(skill.getLevel()+1)/4)
GM.pc.addSkillExperience(Skill.Combat, exp_calc) # Needs <4 trainings per level, to not be too OP
addMessage("You've gained "+str(exp_calc)+"XP in Combat thanks to training with Hiisi.")
GM.main.setModuleFlag("IssixModule", "Trained_With_Hiisi_Combat", true)
GM.pc.addStamina(-80)
var combat_level = GM.pc.getSkillLevel(Skill.Combat)
if combat_level < 3:
_action = "hiisilearncombattraining1"
elif combat_level < 7:
_action = "hiisilearncombattraining2"
elif combat_level < 12:
_action = "hiisilearncombattraining3"
else:
_action = "hiisilearncombattraining4"
if _action == "azazelguesslitterstare":
GM.pc.addEffect(StatusEffect.Suggestible, [20])
GM.pc.addLust(100)
@ -525,6 +702,17 @@ func _react(_action: String, _args):
_:
_action = "azazelguesslitterfun"
if _action == "lamiahelpbondage":
var bondage = GM.pc.getInventory().getEquppedRemovableRestraintsNoLockedSmartlocks()
processTime(bondage.size()*60)
for item in bondage:
if RNG.chance(99):
GM.pc.getInventory().unequipItem(item)
addMessage(item.getVisibleName()+ " has been taken off you and added back to your inventory")
else:
GM.pc.getInventory().removeEquippedItem(item)
addMessage(item.getVisibleName()+ " has been taken off but has been damaged beyond repair, Lamia discards the item into the trash bin")
if _action == "passtime":
processTime(15*60)
_action = ""

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

View file

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/bowl.png-72c1c86674f3d8c2360b1faf40e45074.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Modules/IssixModule/Skills/Images/bowl.png"
dest_files=[ "res://.import/bowl.png-72c1c86674f3d8c2360b1faf40e45074.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=0
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

View file

@ -0,0 +1,26 @@
extends PerkBase
func _init():
id = "BowlTraining"
skillGroup = "Pet"
func getVisibleName():
return "Undignified eater"
func getVisibleDescription():
return "You learned how to eat from the common pet bowl."
func getMoreDescription():
return "You can now only eat like a pet, from the bowl without using your paws or tools."
func getSkillTier():
return 0
func getPicture():
return "res://Modules/IssixModule/Skills/Images/bowl.png"
func toggleable():
return false
func unlockable():
return false

View file

@ -0,0 +1,26 @@
extends PerkBase
func _init():
id = "Commands"
skillGroup = "Pet"
func getVisibleName():
return "Commands"
func getVisibleDescription():
return "You learned basic commands that others can give you"
func getSkillTier():
return 10
func getPicture():
return "res://Modules/IssixModule/Skills/Images/commands.png"
func toggleable():
return false
func unlockable():
return false
func hiddenWhenLocked():
return true

View file

@ -0,0 +1,26 @@
extends PerkBase
func _init():
id = "Clicker"
skillGroup = "Pet"
func getVisibleName():
return "Pavlov's Dog"
func getVisibleDescription():
return "You have unconditional urge to stop what you are doing when you hear a click"
func getSkillTier():
return 10
func getPicture():
return "res://Modules/IssixModule/Skills/Images/clicker.png"
func toggleable():
return false
func unlockable():
return false
func hiddenWhenLocked():
return true

View file

@ -0,0 +1,26 @@
extends PerkBase
func _init():
id = "PetName"
skillGroup = "Pet"
func getVisibleName():
return "New name"
func getVisibleDescription():
return "You have received a completely new name from your Master - Seir"
func getSkillTier():
return 5
func getPicture():
return "res://Modules/IssixModule/Skills/Images/name.png"
func toggleable():
return false
func unlockable():
return false
func hiddenWhenLocked():
return true

View file

@ -0,0 +1,24 @@
extends PerkBase
func _init():
id = "PetSpeech"
skillGroup = "Pet"
func getVisibleName():
return "Meow bark"
func getVisibleDescription():
return "You have learned the speech of animals without losing ability to communicate with humanoids"
func getSkillTier():
return 5
func getPicture():
return "res://Modules/IssixModule/Skills/Images/petspeech.png"
func toggleable():
var ch = npc if npc != null else GM.pc
return !(ch.getSkillsHolder().hasPerk(self.id))
func unlockable():
return false

View file

@ -0,0 +1,23 @@
extends PerkBase
func _init():
id = "PetWalkies"
skillGroup = "Pet"
func getVisibleName():
return "Walkies"
func getVisibleDescription():
return "Have been trained in walking alongside your master on fours."
func getSkillTier():
return 0
func getPicture():
return "res://Modules/IssixModule/Skills/Images/walkies.png"
func toggleable():
return false
func unlockable():
return false

View file

@ -0,0 +1,20 @@
extends SkillBase
func _init():
id = "Pet"
func getVisibleName():
return "Pet"
func getVisibleDescription():
return "Shows how used you are to being a pet"
func getPerkTiers():
return [
[0],
[5],
[10],
]
func scripted():
return true

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View file

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/catnipoverdose.png-eda69f9f042ff6dec39ecd15f09e9f3a.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Modules/IssixModule/StatusEffects/catnipoverdose.png"
dest_files=[ "res://.import/catnipoverdose.png-eda69f9f042ff6dec39ecd15f09e9f3a.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=0
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0