Init commit
This commit is contained in:
parent
f37da7a07b
commit
d2a3a1e6ac
129
AzazelCharacter.gd
Normal file
129
AzazelCharacter.gd
Normal file
|
@ -0,0 +1,129 @@
|
|||
extends Character
|
||||
|
||||
func _init():
|
||||
id = "azazel"
|
||||
npcHasMenstrualCycle = true
|
||||
npcCharacterType = CharacterType.Inmate
|
||||
|
||||
pickedSkin="SoftSpikySkin" # TODO Check options
|
||||
pickedSkinRColor=Color("ffca3030")
|
||||
pickedSkinGColor=Color("ff720505")
|
||||
pickedSkinBColor=Color("ff000000")
|
||||
npcSkinData={
|
||||
"hair": {"r": Color("ffb05745"),"g": Color("ffb05745"),"b": Color("ff2288ab"),},
|
||||
}
|
||||
npcPersonality = {
|
||||
PersonalityStat.Brat: -0.9,
|
||||
PersonalityStat.Mean: -1.0,
|
||||
PersonalityStat.Subby: 1.0,
|
||||
PersonalityStat.Impatient: 0.1,
|
||||
PersonalityStat.Naive: 1.0,
|
||||
PersonalityStat.Coward: 0.7,
|
||||
}
|
||||
npcDefaultFetishInterest = FetishInterest.Neutral
|
||||
npcFetishes = {
|
||||
Fetish.AnalSexReceiving : FetishInterest.ReallyDislikes,
|
||||
Fetish.AnalSexGiving : FetishInterest.Hates,
|
||||
Fetish.VaginalSexGiving : FetishInterest.Hates,
|
||||
Fetish.VaginalSexReceiving : FetishInterest.Loves,
|
||||
Fetish.OralSexReceiving : FetishInterest.Likes,
|
||||
Fetish.OralSexGiving : FetishInterest.Likes,
|
||||
Fetish.Sadism : FetishInterest.ReallyDislikes,
|
||||
Fetish.Masochism : FetishInterest.Hates,
|
||||
Fetish.UnconsciousSex : FetishInterest.Loves,
|
||||
Fetish.BeingBred : FetishInterest.Dislikes,
|
||||
Fetish.Bondage : FetishInterest.Likes,
|
||||
Fetish.Rigging : FetishInterest.Likes,
|
||||
Fetish.Condoms : FetishInterest.Dislikes,
|
||||
Fetish.DrugUse : FetishInterest.Likes,
|
||||
Fetish.Exhibitionism : FetishInterest.Loves,
|
||||
Fetish.Tribadism : FetishInterest.SlightlyDislikes,
|
||||
Fetish.StraponSexVaginal : FetishInterest.Dislikes,
|
||||
Fetish.StraponSexAnal : FetishInterest.SlightlyDislikes,
|
||||
Fetish.Choking : FetishInterest.SlightlyDislikes,
|
||||
Fetish.HypnosisSubject : FetishInterest.Loves,
|
||||
}
|
||||
npcLustInterests = {
|
||||
InterestTopic.TallyMarks: Interest.ReallyLikes,
|
||||
InterestTopic.Bodywritings: Interest.KindaLikes,
|
||||
InterestTopic.Gags: Interest.Loves,
|
||||
InterestTopic.Blindfolds: Interest.Loves,
|
||||
InterestTopic.BDSMRestraints: Interest.Loves,
|
||||
InterestTopic.ButtPlugs: Interest.Dislikes,
|
||||
InterestTopic.VaginalPlugs: Interest.Dislikes,
|
||||
InterestTopic.FeminineBody: Interest.KindaLikes,
|
||||
InterestTopic.AndroBody: Interest.Likes,
|
||||
InterestTopic.MasculineBody: Interest.ReallyLikes,
|
||||
InterestTopic.ThickBody: Interest.Dislikes,
|
||||
InterestTopic.SlimBody: Interest.Likes,
|
||||
InterestTopic.BigBreasts: Interest.Hates,
|
||||
InterestTopic.StuffedPussy: Interest.Likes,
|
||||
InterestTopic.StuffedPussyOrAss: Interest.KindaLikes,
|
||||
InterestTopic.Pregnant: Interest.ReallyLikes,
|
||||
InterestTopic.StuffedThroat: Interest.ReallyLikes,
|
||||
InterestTopic.CoveredInCum: Interest.ReallyLikes,
|
||||
InterestTopic.CoveredInLotsOfCum: Interest.Likes,
|
||||
InterestTopic.FullyNaked: Interest.Loves,
|
||||
InterestTopic.ExposedPussy: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedAnus: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedBreasts: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedCock: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedPanties: Interest.Hates,
|
||||
InterestTopic.ExposedBra: Interest.Hates,
|
||||
InterestTopic.LooseAnus: Interest.SlightlyDislikes,
|
||||
InterestTopic.LoosePussy: Interest.SlightlyDislikes,
|
||||
InterestTopic.TightAnus: Interest.Likes,
|
||||
InterestTopic.TightPussy: Interest.Likes,
|
||||
InterestTopic.BigCock: Interest.Hates,
|
||||
}
|
||||
|
||||
func interestVerbalReaction(interest):
|
||||
if(interest == InterestTopic.Pregnant):
|
||||
return "Oh, do you have litter in there? Cuuute, meoowwww!"
|
||||
if(interest == InterestTopic.Blindfolds):
|
||||
return "Purrr. How is your hearing? Can you hear me purring from over there?"
|
||||
|
||||
func _getName():
|
||||
return "Azazel"
|
||||
|
||||
func getGender():
|
||||
return Gender.Male
|
||||
|
||||
func getSmallDescription() -> String:
|
||||
return "Wears an lilac uniform with number P-655. He is the embodiment of ”meek”."
|
||||
|
||||
func getSpecies():
|
||||
return [Species.Feline]
|
||||
|
||||
func getThickness() -> int:
|
||||
return 0
|
||||
|
||||
func getFemininity() -> int:
|
||||
return 50
|
||||
|
||||
func createBodyparts():
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("felinehead"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("combedbackhair"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("felineears"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("anthrobody"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("anthroarms"))
|
||||
var breasts = GlobalRegistry.createBodypart("malebreasts")
|
||||
breasts.size = 0
|
||||
giveBodypartUnlessSame(breasts)
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("vagina"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("anuswomb"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("anuswomb"))
|
||||
var tail = GlobalRegistry.createBodypart("felinetail")
|
||||
tail.tailScale = 1
|
||||
giveBodypartUnlessSame(tail)
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("plantilegs"))
|
||||
|
||||
|
||||
func onGivingBirth(_impregnatedEggCells: Array, _newkids: Array):
|
||||
.onGivingBirth(_impregnatedEggCells, _newkids)
|
||||
|
||||
func getBirthWaitTime():
|
||||
return 60*60*24*2
|
||||
|
||||
func getDefaultEquipment():
|
||||
return ["inmatecollar", "inmateuniformSexDeviant"]
|
67
CatnipItem.gd
Normal file
67
CatnipItem.gd
Normal file
|
@ -0,0 +1,67 @@
|
|||
extends ItemBase
|
||||
|
||||
func _init():
|
||||
id = "CatnipPlant"
|
||||
|
||||
func getVisibleName():
|
||||
return "Catnip"
|
||||
|
||||
func getDescription():
|
||||
return "An enticing plant for most of felines. Used as harmfull drug, unless in large quantities. Can have effects on a feline if consumed."
|
||||
|
||||
func isFeline(character:BaseCharacter):
|
||||
return "feline" in character.getSpecies()
|
||||
|
||||
func canUseInCombat():
|
||||
return isFeline(GM.pc)
|
||||
|
||||
func useInCombat(_attacker:Character, _receiver):
|
||||
if(isFeline(_attacker)):
|
||||
if(!(_attacker.isPlayer() and GM.main.getFlag("HypnokinkModule.SoftOptIn") == false)):
|
||||
_attacker.addEffect(StatusEffect.UnderHypnosis)
|
||||
_attacker.addLust(10)
|
||||
removeXOrDestroy(1)
|
||||
return _attacker.getName() + " ate a catnip plant! That feels... Wahhaa."
|
||||
else:
|
||||
removeXOrDestroy(1)
|
||||
return _attacker.getName() + " ate a catnip plant! It didn't have any effect."
|
||||
|
||||
func getPossibleActions():
|
||||
if(isFeline(GM.pc)): # We really shouldn't assume the item is being used by a player character, but sadly game does not give us context for the item user :(
|
||||
return [
|
||||
{
|
||||
"name": "Eat one!",
|
||||
"scene": "UseItemLikeInCombatScene",
|
||||
"description": "Eat the catnip",
|
||||
},
|
||||
]
|
||||
else:
|
||||
return []
|
||||
|
||||
func getPrice():
|
||||
return 0
|
||||
|
||||
func canSell():
|
||||
return true
|
||||
|
||||
func canCombine():
|
||||
return true
|
||||
|
||||
func tryCombine(_otherItem):
|
||||
return .tryCombine(_otherItem)
|
||||
|
||||
func getTags():
|
||||
return []
|
||||
|
||||
func getItemCategory():
|
||||
return ItemCategory.Medical
|
||||
|
||||
func saveData():
|
||||
var data = .saveData()
|
||||
return data
|
||||
|
||||
func loadData(data):
|
||||
.loadData(data)
|
||||
|
||||
func getInventoryImage():
|
||||
return "res://Modules/PierreModule/Items/catnip.png"
|
55
EventTileOnEnter.gd
Normal file
55
EventTileOnEnter.gd
Normal file
|
@ -0,0 +1,55 @@
|
|||
extends EventBase
|
||||
|
||||
func _init():
|
||||
id = "PierreEvent"
|
||||
|
||||
func registerTriggers(es):
|
||||
es.addTrigger(self, Trigger.EnteringRoom, "hall_ne_corner")
|
||||
|
||||
func run(_triggerID, _args):
|
||||
#if(doEventCheck("PierreBusy") != null):
|
||||
# return false
|
||||
|
||||
if(GM.main.isVeryLate()): # Add something in the nightime it's very late?
|
||||
saynn("You see an empty chair in the corner with three blankets laying around.")
|
||||
return false
|
||||
|
||||
if(!getModuleFlag("PierreModule", "Pierre_Introduced")): # Do that if not night
|
||||
saynn("You see a demon-dragon sitting on a chair in a corner, around him there are three leashed creatures.")
|
||||
GM.main.setModuleFlag("PierreModule", "Score_Explored", 0) # is there a better place to do this?
|
||||
GM.main.setModuleFlag("PierreModule", "Quest_Status", 0)
|
||||
addButton("Demon", "Talk to the demon-dragon", "talk")
|
||||
return
|
||||
|
||||
GM.main.applyWorldEdit("PierreWorldEdit")
|
||||
|
||||
saynn("You see Pierre sitting on a chair in a corner, around him there are three leashed slaves.")
|
||||
addButton("Pierre", "Talk to Pierre", "talk")
|
||||
if(!getModuleFlag("PierreModule", "Pets_Introduced")):
|
||||
#addButton("Look at pets", "Look at pets", "pets")
|
||||
addDisabledButton("Talk with pets", "You should probably first talk with intimidating figure who got them leashed")
|
||||
else:
|
||||
addButton("Pets", "Look at pets", "pets")
|
||||
#if(checkCharacterBusy("RahiBusy", "Seems like the kitty is not here", "Rahi")):
|
||||
# return
|
||||
#
|
||||
#if(getModuleFlag("RahiModule", "Rahi_NotThereToday", false)):
|
||||
# saynn("Seems like the kitty is not here")
|
||||
#
|
||||
# addDisabledButton("Rahi", "She is not here today")
|
||||
# return
|
||||
|
||||
#if(!getModuleFlag("RahiModule", "Rahi_Introduced")):
|
||||
# saynn("You see some unknown feline sitting on a bench")
|
||||
#else:
|
||||
# saynn("You see the Kitty sitting on a bench")
|
||||
#addButtonUnlessLate("Rahi", "Talk to the feline", "talk")
|
||||
|
||||
func getPriority():
|
||||
return 0
|
||||
|
||||
func onButton(_method, _args):
|
||||
if(_method == "talk"):
|
||||
runScene("PierreTalkScene")
|
||||
if(_method == "pets"):
|
||||
runScene("PetsTalkScene")
|
25
GreenhouseCatnip.gd
Normal file
25
GreenhouseCatnip.gd
Normal file
|
@ -0,0 +1,25 @@
|
|||
extends EventBase
|
||||
|
||||
func _init():
|
||||
id = "AzazelCatnipEvent"
|
||||
|
||||
func registerTriggers(es):
|
||||
es.addTrigger(self, Trigger.EnteringRoom, "main_green_corridor9")
|
||||
|
||||
func run(_triggerID, _args):
|
||||
if(GM.main.getModuleFlag("PierreModule", "Azazel_Catnip_talked") and RNG.chance(30)):
|
||||
GM.main.setModuleFlag("PierreModule", "Azazel_Catnip_found", true)
|
||||
|
||||
if(GM.main.getModuleFlag("PierreModule", "Azazel_Catnip_found")):
|
||||
saynn("While staring at plethora of different plants, you recognize one in particular - white flowers and specific smell. Catnip!")
|
||||
if(!GM.main.getModuleFlag("PierreModule", "Azazel_Catnip_taken_today")):
|
||||
addButtonUnlessLate("Steal", "Try and steal something", "steal")
|
||||
else:
|
||||
addDisabledButton("Steal", "Too dangerous to do this again today")
|
||||
|
||||
func getPriority():
|
||||
return 0
|
||||
|
||||
func onButton(_method, _args):
|
||||
if(_method == "steal"):
|
||||
runScene("GreenhouseCatnip")
|
46
GreenhouseCatnipStealScene.gd
Normal file
46
GreenhouseCatnipStealScene.gd
Normal file
|
@ -0,0 +1,46 @@
|
|||
extends SceneBase
|
||||
|
||||
func _init():
|
||||
sceneID = "GreenhouseCatnip"
|
||||
|
||||
func _run():
|
||||
if(state == ""):
|
||||
saynn("You approach the greenhouses, each one looks like a huge long tent with lots of artificial lights inside. You have to sneak around cause at any moment you can spotted by some guard.")
|
||||
|
||||
saynn("This specific station seems to be growing quite a variety of herbs, most of which are unknown to you.")
|
||||
|
||||
saynn("You spotted that the doors to the greenhouse have been left opened. Right behind them you see a familiar plant - catnip.")
|
||||
|
||||
saynn("What do you wanna do?")
|
||||
|
||||
addButton("Steal catnip plant", "Sneak in, grab one and get out", "catnip")
|
||||
addButton("Don't steal", "Too dangerous", "endthescene")
|
||||
|
||||
if(state == "catnip"):
|
||||
saynn("You find and cut one of many catnip at the bottom of the stem. Time to leave.")
|
||||
|
||||
addButton("Continue", "Try to escape without being seen", "caughtcheck")
|
||||
|
||||
func _react(_action: String, _args):
|
||||
if(_action == "catnip"):
|
||||
GM.main.setModuleFlag("PierreModule", "Azazel_Catnip_taken_today", true)
|
||||
|
||||
GM.pc.getInventory().addItem(GlobalRegistry.createItem("CatnipPlant"))
|
||||
addMessage("You stole catnip plant.")
|
||||
|
||||
if(_action == "caughtcheck"):
|
||||
processTime(10 * 5)
|
||||
|
||||
if(RNG.chance(25)):
|
||||
if(GM.ES.triggerReact(Trigger.CaughtStealingInGreenhouse)):
|
||||
endScene()
|
||||
return
|
||||
|
||||
addMessage("Seems like you got away safely")
|
||||
return
|
||||
|
||||
if(_action == "endthescene"):
|
||||
endScene()
|
||||
return
|
||||
|
||||
setState(_action)
|
131
HiisiCharacter.gd
Normal file
131
HiisiCharacter.gd
Normal file
|
@ -0,0 +1,131 @@
|
|||
extends Character
|
||||
|
||||
func _init():
|
||||
id = "hiisi"
|
||||
npcHasMenstrualCycle = false
|
||||
npcCharacterType = CharacterType.Inmate
|
||||
|
||||
pickedSkin="SoftSpikySkin" # TODO Check options
|
||||
pickedSkinRColor=Color("ffca3030")
|
||||
pickedSkinGColor=Color("ff720505")
|
||||
pickedSkinBColor=Color("ff000000")
|
||||
npcSkinData={
|
||||
"hair": {"r": Color("ffb05745"),"g": Color("ffb05745"),"b": Color("ff2288ab"),},
|
||||
}
|
||||
npcPersonality = {
|
||||
PersonalityStat.Brat: -0.9,
|
||||
PersonalityStat.Mean: 0.4,
|
||||
PersonalityStat.Subby: 1.0,
|
||||
PersonalityStat.Impatient: 0.9,
|
||||
PersonalityStat.Naive: -1.0,
|
||||
PersonalityStat.Coward: -0.4,
|
||||
}
|
||||
npcDefaultFetishInterest = FetishInterest.Neutral
|
||||
npcFetishes = {
|
||||
Fetish.AnalSexReceiving : FetishInterest.ReallyDislikes,
|
||||
Fetish.AnalSexGiving : FetishInterest.Hates,
|
||||
Fetish.VaginalSexGiving : FetishInterest.Hates,
|
||||
Fetish.VaginalSexReceiving : FetishInterest.Loves,
|
||||
Fetish.OralSexReceiving : FetishInterest.Likes,
|
||||
Fetish.OralSexGiving : FetishInterest.Likes,
|
||||
Fetish.Sadism : FetishInterest.ReallyDislikes,
|
||||
Fetish.Masochism : FetishInterest.Hates,
|
||||
Fetish.UnconsciousSex : FetishInterest.Loves,
|
||||
Fetish.BeingBred : FetishInterest.Dislikes,
|
||||
Fetish.Bondage : FetishInterest.Likes,
|
||||
Fetish.Rigging : FetishInterest.Likes,
|
||||
Fetish.Condoms : FetishInterest.Dislikes,
|
||||
Fetish.DrugUse : FetishInterest.Likes,
|
||||
Fetish.Exhibitionism : FetishInterest.Loves,
|
||||
Fetish.Tribadism : FetishInterest.SlightlyDislikes,
|
||||
Fetish.StraponSexVaginal : FetishInterest.Dislikes,
|
||||
Fetish.StraponSexAnal : FetishInterest.SlightlyDislikes,
|
||||
Fetish.Choking : FetishInterest.SlightlyDislikes,
|
||||
Fetish.HypnosisSubject : FetishInterest.Loves,
|
||||
}
|
||||
npcLustInterests = {
|
||||
InterestTopic.TallyMarks: Interest.ReallyLikes,
|
||||
InterestTopic.Bodywritings: Interest.KindaLikes,
|
||||
InterestTopic.Gags: Interest.Loves,
|
||||
InterestTopic.Blindfolds: Interest.Loves,
|
||||
InterestTopic.BDSMRestraints: Interest.Loves,
|
||||
InterestTopic.ButtPlugs: Interest.Dislikes,
|
||||
InterestTopic.VaginalPlugs: Interest.Dislikes,
|
||||
InterestTopic.FeminineBody: Interest.KindaLikes,
|
||||
InterestTopic.AndroBody: Interest.Likes,
|
||||
InterestTopic.MasculineBody: Interest.ReallyLikes,
|
||||
InterestTopic.ThickBody: Interest.Dislikes,
|
||||
InterestTopic.SlimBody: Interest.Likes,
|
||||
InterestTopic.BigBreasts: Interest.Hates,
|
||||
InterestTopic.StuffedPussy: Interest.Likes,
|
||||
InterestTopic.StuffedPussyOrAss: Interest.KindaLikes,
|
||||
InterestTopic.Pregnant: Interest.ReallyLikes,
|
||||
InterestTopic.StuffedThroat: Interest.ReallyLikes,
|
||||
InterestTopic.CoveredInCum: Interest.ReallyLikes,
|
||||
InterestTopic.CoveredInLotsOfCum: Interest.Likes,
|
||||
InterestTopic.FullyNaked: Interest.Loves,
|
||||
InterestTopic.ExposedPussy: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedAnus: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedBreasts: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedCock: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedPanties: Interest.Hates,
|
||||
InterestTopic.ExposedBra: Interest.Hates,
|
||||
InterestTopic.LooseAnus: Interest.SlightlyDislikes,
|
||||
InterestTopic.LoosePussy: Interest.SlightlyDislikes,
|
||||
InterestTopic.TightAnus: Interest.Likes,
|
||||
InterestTopic.TightPussy: Interest.Likes,
|
||||
InterestTopic.BigCock: Interest.Hates,
|
||||
}
|
||||
|
||||
func interestVerbalReaction(interest):
|
||||
if(interest == InterestTopic.Pregnant):
|
||||
return "Oh, do you have litter in there? Cuuute, meoowwww!"
|
||||
if(interest == InterestTopic.Blindfolds):
|
||||
return "Purrr. How is your hearing? Can you hear me purring from over there?"
|
||||
|
||||
func _getName():
|
||||
return "Hiisi"
|
||||
|
||||
func getGender():
|
||||
return Gender.Male
|
||||
|
||||
func getSmallDescription() -> String:
|
||||
return "Wears an red uniform with number P-964."
|
||||
|
||||
func getSpecies():
|
||||
return [Species.Canine]
|
||||
|
||||
func getThickness() -> int:
|
||||
return 23
|
||||
|
||||
func getFemininity() -> int:
|
||||
return 0
|
||||
|
||||
func createBodyparts():
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("anthrobody"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("anthroarms"))
|
||||
var breasts = GlobalRegistry.createBodypart("malebreasts")
|
||||
breasts.size = 0
|
||||
giveBodypartUnlessSame(breasts)
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("caninehead"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("simplehair"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("canineears3"))
|
||||
var penis = GlobalRegistry.createBodypart("caninepenis")
|
||||
penis.lengthCM = 10
|
||||
penis.ballsScale = 1.2
|
||||
giveBodypartUnlessSame(penis)
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("anus"))
|
||||
var tail = GlobalRegistry.createBodypart("huskytail")
|
||||
tail.tailScale = 1
|
||||
giveBodypartUnlessSame(tail)
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("digilegs"))
|
||||
|
||||
|
||||
func onGivingBirth(_impregnatedEggCells: Array, _newkids: Array):
|
||||
.onGivingBirth(_impregnatedEggCells, _newkids)
|
||||
|
||||
func getBirthWaitTime():
|
||||
return 60*60*24*2
|
||||
|
||||
func getDefaultEquipment():
|
||||
return ["inmatecollar", "inmateuniformHighSec"]
|
BIN
Items/catnip.png
Normal file
BIN
Items/catnip.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.5 KiB |
35
Items/catnip.png.import
Normal file
35
Items/catnip.png.import
Normal file
|
@ -0,0 +1,35 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="StreamTexture"
|
||||
path="res://.import/catnip.png-8e8639f539d499b22a07b1ce8bee6c82.stex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Modules/PierreModule/Items/catnip.png"
|
||||
dest_files=[ "res://.import/catnip.png-8e8639f539d499b22a07b1ce8bee6c82.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
|
131
LamiaCharacter.gd
Normal file
131
LamiaCharacter.gd
Normal file
|
@ -0,0 +1,131 @@
|
|||
extends Character
|
||||
|
||||
func _init():
|
||||
id = "lamia"
|
||||
npcHasMenstrualCycle = false
|
||||
npcCharacterType = CharacterType.Inmate
|
||||
|
||||
pickedSkin="SoftSpikySkin" # TODO Check options
|
||||
pickedSkinRColor=Color("ffca3030")
|
||||
pickedSkinGColor=Color("ff720505")
|
||||
pickedSkinBColor=Color("ff000000")
|
||||
npcSkinData={
|
||||
"hair": {"r": Color("ffb05745"),"g": Color("ffb05745"),"b": Color("ff2288ab"),},
|
||||
}
|
||||
npcPersonality = {
|
||||
PersonalityStat.Brat: -0.9,
|
||||
PersonalityStat.Mean: 0.4,
|
||||
PersonalityStat.Subby: 1.0,
|
||||
PersonalityStat.Impatient: 0.9,
|
||||
PersonalityStat.Naive: -1.0,
|
||||
PersonalityStat.Coward: -0.4,
|
||||
}
|
||||
npcDefaultFetishInterest = FetishInterest.Neutral
|
||||
npcFetishes = {
|
||||
Fetish.AnalSexReceiving : FetishInterest.ReallyDislikes,
|
||||
Fetish.AnalSexGiving : FetishInterest.Hates,
|
||||
Fetish.VaginalSexGiving : FetishInterest.Hates,
|
||||
Fetish.VaginalSexReceiving : FetishInterest.Loves,
|
||||
Fetish.OralSexReceiving : FetishInterest.Likes,
|
||||
Fetish.OralSexGiving : FetishInterest.Likes,
|
||||
Fetish.Sadism : FetishInterest.ReallyDislikes,
|
||||
Fetish.Masochism : FetishInterest.Hates,
|
||||
Fetish.UnconsciousSex : FetishInterest.Loves,
|
||||
Fetish.BeingBred : FetishInterest.Dislikes,
|
||||
Fetish.Bondage : FetishInterest.Likes,
|
||||
Fetish.Rigging : FetishInterest.Likes,
|
||||
Fetish.Condoms : FetishInterest.Dislikes,
|
||||
Fetish.DrugUse : FetishInterest.Likes,
|
||||
Fetish.Exhibitionism : FetishInterest.Loves,
|
||||
Fetish.Tribadism : FetishInterest.SlightlyDislikes,
|
||||
Fetish.StraponSexVaginal : FetishInterest.Dislikes,
|
||||
Fetish.StraponSexAnal : FetishInterest.SlightlyDislikes,
|
||||
Fetish.Choking : FetishInterest.SlightlyDislikes,
|
||||
Fetish.HypnosisSubject : FetishInterest.Loves,
|
||||
}
|
||||
npcLustInterests = {
|
||||
InterestTopic.TallyMarks: Interest.ReallyLikes,
|
||||
InterestTopic.Bodywritings: Interest.KindaLikes,
|
||||
InterestTopic.Gags: Interest.Loves,
|
||||
InterestTopic.Blindfolds: Interest.Loves,
|
||||
InterestTopic.BDSMRestraints: Interest.Loves,
|
||||
InterestTopic.ButtPlugs: Interest.Dislikes,
|
||||
InterestTopic.VaginalPlugs: Interest.Dislikes,
|
||||
InterestTopic.FeminineBody: Interest.KindaLikes,
|
||||
InterestTopic.AndroBody: Interest.Likes,
|
||||
InterestTopic.MasculineBody: Interest.ReallyLikes,
|
||||
InterestTopic.ThickBody: Interest.Dislikes,
|
||||
InterestTopic.SlimBody: Interest.Likes,
|
||||
InterestTopic.BigBreasts: Interest.Hates,
|
||||
InterestTopic.StuffedPussy: Interest.Likes,
|
||||
InterestTopic.StuffedPussyOrAss: Interest.KindaLikes,
|
||||
InterestTopic.Pregnant: Interest.ReallyLikes,
|
||||
InterestTopic.StuffedThroat: Interest.ReallyLikes,
|
||||
InterestTopic.CoveredInCum: Interest.ReallyLikes,
|
||||
InterestTopic.CoveredInLotsOfCum: Interest.Likes,
|
||||
InterestTopic.FullyNaked: Interest.Loves,
|
||||
InterestTopic.ExposedPussy: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedAnus: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedBreasts: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedCock: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedPanties: Interest.Hates,
|
||||
InterestTopic.ExposedBra: Interest.Hates,
|
||||
InterestTopic.LooseAnus: Interest.SlightlyDislikes,
|
||||
InterestTopic.LoosePussy: Interest.SlightlyDislikes,
|
||||
InterestTopic.TightAnus: Interest.Likes,
|
||||
InterestTopic.TightPussy: Interest.Likes,
|
||||
InterestTopic.BigCock: Interest.Hates,
|
||||
}
|
||||
|
||||
func interestVerbalReaction(interest):
|
||||
if(interest == InterestTopic.Pregnant):
|
||||
return "Oh, do you have litter in there? Cuuute, meoowwww!"
|
||||
if(interest == InterestTopic.Blindfolds):
|
||||
return "Purrr. How is your hearing? Can you hear me purring from over there?"
|
||||
|
||||
func _getName():
|
||||
return "Lamia"
|
||||
|
||||
func getGender():
|
||||
return Gender.Male
|
||||
|
||||
func getSmallDescription() -> String:
|
||||
return "Wears an orange uniform with number P-655. He is the embodiment of ”meek”."
|
||||
|
||||
func getSpecies():
|
||||
return [Species.Canine] # if in the future foxes are introduced, the character is canonically a fox
|
||||
|
||||
func onGivingBirth(_impregnatedEggCells: Array, _newkids: Array):
|
||||
.onGivingBirth(_impregnatedEggCells, _newkids)
|
||||
|
||||
func getBirthWaitTime():
|
||||
return 60*60*24*2
|
||||
|
||||
func getDefaultEquipment():
|
||||
return ["inmatecollar", "inmateuniformGeneral"]
|
||||
|
||||
func getThickness() -> int:
|
||||
return 70
|
||||
|
||||
func getFemininity() -> int:
|
||||
return 20
|
||||
|
||||
func createBodyparts():
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("anthrobody"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("anthroarms"))
|
||||
var breasts = GlobalRegistry.createBodypart("malebreasts")
|
||||
breasts.size = 0
|
||||
giveBodypartUnlessSame(breasts)
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("foxhead"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("messyhair2"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("fennecears"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("dragonhorns"))
|
||||
var penis = GlobalRegistry.createBodypart("felinepenis")
|
||||
penis.lengthCM = 15
|
||||
penis.ballsScale = 1
|
||||
giveBodypartUnlessSame(penis)
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("anuswomb"))
|
||||
var tail = GlobalRegistry.createBodypart("foxtail")
|
||||
tail.tailScale = 0.5
|
||||
giveBodypartUnlessSame(tail)
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("digilegs"))
|
51
Module.gd
Normal file
51
Module.gd
Normal file
|
@ -0,0 +1,51 @@
|
|||
extends Module
|
||||
class_name PierreModule
|
||||
|
||||
func getFlags():
|
||||
return {
|
||||
"Pierre_Introduced": flag(FlagType.Bool),
|
||||
"Pets_Introduced": flag(FlagType.Bool),
|
||||
"Score_Explored": flag(FlagType.Number),
|
||||
"Quest_Status": flag(FlagType.Number),
|
||||
"Azazel_Catnip_talked": flag(FlagType.Bool),
|
||||
"Azazel_Catnip_found": flag(FlagType.Bool),
|
||||
"Azazel_Catnip_taken_today": flag(FlagType.Bool)
|
||||
}
|
||||
|
||||
|
||||
func _init():
|
||||
id = "PierreModule"
|
||||
author = "Frisk"
|
||||
|
||||
events = [
|
||||
"res://Modules/PierreModule/EventTileOnEnter.gd",
|
||||
"res://Modules/PierreModule/GreenhouseCatnip.gd"
|
||||
]
|
||||
|
||||
scenes = [
|
||||
"res://Modules/PierreModule/PierreTalkMain.gd",
|
||||
"res://Modules/PierreModule/GreenhouseCatnipStealScene.gd",
|
||||
"res://Modules/PierreModule/PetsTalkMain.gd"
|
||||
]
|
||||
|
||||
characters = [
|
||||
"res://Modules/PierreModule/PierreCharacter.gd",
|
||||
"res://Modules/PierreModule/LamiaCharacter.gd",
|
||||
"res://Modules/PierreModule/HiisiCharacter.gd",
|
||||
"res://Modules/PierreModule/AzazelCharacter.gd"
|
||||
]
|
||||
|
||||
worldEdits = [
|
||||
"res://Modules/PierreModule/PierreWorldEdit.gd"
|
||||
]
|
||||
|
||||
items = [
|
||||
"res://Modules/PierreModule/CatnipItem.gd"
|
||||
]
|
||||
|
||||
quests = [
|
||||
"res://Modules/PierreModule/PierresPetQuest.gd"
|
||||
]
|
||||
|
||||
func resetFlagsOnNewDay():
|
||||
GM.main.setModuleFlag("PierreModule", "Azazel_Catnip_taken_today", false)
|
43
PetsTalkMain.gd
Normal file
43
PetsTalkMain.gd
Normal file
|
@ -0,0 +1,43 @@
|
|||
extends SceneBase
|
||||
|
||||
func _init():
|
||||
sceneID = "PetsTalkScene"
|
||||
|
||||
func _run():
|
||||
|
||||
if(state == ""):
|
||||
saynn("In front of you - three slaves belonging to Pierre.")
|
||||
addButton("Azazel", "Approach Azazel", "azazelmain")
|
||||
addButton("Hiisi", "Approach Hiisi", "hiisimain")
|
||||
addButton("Lamia", "Approach Lamia", "lamiamain")
|
||||
addButton("Leave", "Be on your way", "endthescene")
|
||||
|
||||
if(state == "azazelmain"):
|
||||
addButton("Talk", "Talk to Azazel", "azazeltalk")
|
||||
addButton("Appearance", "Look at Azazel", "azazelappearance")
|
||||
if(GM.pc.getInventory().hasItemID("CatnipPlant")):
|
||||
saynn("Before you even have the time to approach Azazel, you see his head hovering over his body, his little nose working very hard to track down the source of the curious smell. He looks around with interest, until he sees you approaching. ")
|
||||
addButton("Give Catnip", "Give Azazel the catnip", "catnip")
|
||||
|
||||
if(state == "catnip"):
|
||||
|
||||
setState("azazelmain")
|
||||
|
||||
if(state == "azazeltalk"):
|
||||
GM.main.setModuleFlag("PierreModule", "Azazel_Catnip_talked", true)
|
||||
pass
|
||||
|
||||
if(state == "azazelappearance"):
|
||||
pass
|
||||
|
||||
|
||||
func _react(_action: String, _args):
|
||||
if(_action == "catnip"):
|
||||
GM.pc.getInventory().removeXOfOrDestroy("CatnipPlant", 1)
|
||||
|
||||
|
||||
if(_action == "endthescene"):
|
||||
endScene()
|
||||
return
|
||||
|
||||
setState(_action)
|
131
PierreCharacter.gd
Normal file
131
PierreCharacter.gd
Normal file
|
@ -0,0 +1,131 @@
|
|||
extends Character
|
||||
|
||||
func _init():
|
||||
id = "pierre"
|
||||
npcHasMenstrualCycle = false
|
||||
npcCharacterType = CharacterType.Inmate
|
||||
|
||||
pickedSkin="SoftSpikySkin" # TODO Check options
|
||||
pickedSkinRColor=Color("ffca3030")
|
||||
pickedSkinGColor=Color("ff720505")
|
||||
pickedSkinBColor=Color("ff000000")
|
||||
npcSkinData={
|
||||
"hair": {"r": Color("ffb05745"),"g": Color("ffb05745"),"b": Color("ff2288ab"),},
|
||||
}
|
||||
npcPersonality = {
|
||||
PersonalityStat.Brat: 0.5,
|
||||
PersonalityStat.Mean: 1.0,
|
||||
PersonalityStat.Subby: -1.0,
|
||||
PersonalityStat.Impatient: 0.1,
|
||||
PersonalityStat.Naive: -1.0,
|
||||
PersonalityStat.Coward: -0.7,
|
||||
}
|
||||
npcDefaultFetishInterest = FetishInterest.Neutral
|
||||
npcFetishes = {
|
||||
Fetish.AnalSexReceiving : FetishInterest.ReallyDislikes,
|
||||
Fetish.AnalSexGiving : FetishInterest.Hates,
|
||||
Fetish.VaginalSexGiving : FetishInterest.Hates,
|
||||
Fetish.VaginalSexReceiving : FetishInterest.Loves,
|
||||
Fetish.OralSexReceiving : FetishInterest.Likes,
|
||||
Fetish.OralSexGiving : FetishInterest.Likes,
|
||||
Fetish.Sadism : FetishInterest.ReallyDislikes,
|
||||
Fetish.Masochism : FetishInterest.Hates,
|
||||
Fetish.UnconsciousSex : FetishInterest.Loves,
|
||||
Fetish.BeingBred : FetishInterest.Dislikes,
|
||||
Fetish.Bondage : FetishInterest.Likes,
|
||||
Fetish.Rigging : FetishInterest.Likes,
|
||||
Fetish.Condoms : FetishInterest.Dislikes,
|
||||
Fetish.DrugUse : FetishInterest.Likes,
|
||||
Fetish.Exhibitionism : FetishInterest.Loves,
|
||||
Fetish.Tribadism : FetishInterest.SlightlyDislikes,
|
||||
Fetish.StraponSexVaginal : FetishInterest.Dislikes,
|
||||
Fetish.StraponSexAnal : FetishInterest.SlightlyDislikes,
|
||||
Fetish.Choking : FetishInterest.SlightlyDislikes,
|
||||
Fetish.HypnosisSubject : FetishInterest.Loves,
|
||||
}
|
||||
npcLustInterests = {
|
||||
InterestTopic.TallyMarks: Interest.ReallyLikes,
|
||||
InterestTopic.Bodywritings: Interest.KindaLikes,
|
||||
InterestTopic.Gags: Interest.Loves,
|
||||
InterestTopic.Blindfolds: Interest.Loves,
|
||||
InterestTopic.BDSMRestraints: Interest.Loves,
|
||||
InterestTopic.ButtPlugs: Interest.Dislikes,
|
||||
InterestTopic.VaginalPlugs: Interest.Dislikes,
|
||||
InterestTopic.FeminineBody: Interest.KindaLikes,
|
||||
InterestTopic.AndroBody: Interest.Likes,
|
||||
InterestTopic.MasculineBody: Interest.ReallyLikes,
|
||||
InterestTopic.ThickBody: Interest.Dislikes,
|
||||
InterestTopic.SlimBody: Interest.Likes,
|
||||
InterestTopic.BigBreasts: Interest.Hates,
|
||||
InterestTopic.StuffedPussy: Interest.Likes,
|
||||
InterestTopic.StuffedPussyOrAss: Interest.KindaLikes,
|
||||
InterestTopic.Pregnant: Interest.ReallyLikes,
|
||||
InterestTopic.StuffedThroat: Interest.ReallyLikes,
|
||||
InterestTopic.CoveredInCum: Interest.ReallyLikes,
|
||||
InterestTopic.CoveredInLotsOfCum: Interest.Likes,
|
||||
InterestTopic.FullyNaked: Interest.Loves,
|
||||
InterestTopic.ExposedPussy: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedAnus: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedBreasts: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedCock: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedPanties: Interest.Hates,
|
||||
InterestTopic.ExposedBra: Interest.Hates,
|
||||
InterestTopic.LooseAnus: Interest.SlightlyDislikes,
|
||||
InterestTopic.LoosePussy: Interest.SlightlyDislikes,
|
||||
InterestTopic.TightAnus: Interest.Likes,
|
||||
InterestTopic.TightPussy: Interest.Likes,
|
||||
InterestTopic.BigCock: Interest.Hates,
|
||||
}
|
||||
|
||||
func interestVerbalReaction(interest):
|
||||
if(interest == InterestTopic.Pregnant):
|
||||
return "You are much better fit as a common breeder"
|
||||
if(interest == InterestTopic.Blindfolds):
|
||||
return "Overconfident much?"
|
||||
|
||||
func _getName():
|
||||
return "Pierre"
|
||||
|
||||
func getGender():
|
||||
return Gender.Male
|
||||
|
||||
func getSmallDescription() -> String:
|
||||
return "Wears a red block uniform with number P-9533. He is an intimidating tall demon-dragon, has red fur."
|
||||
|
||||
func getSpecies():
|
||||
return [Species.Dragon, Species.Demon]
|
||||
|
||||
func getThickness() -> int:
|
||||
return 40
|
||||
|
||||
func getFemininity() -> int:
|
||||
return 0
|
||||
|
||||
func createBodyparts():
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("dragonhead"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("combedbackhair"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("dragonears2"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("demonhorns3"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("anthrobody"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("buffarms"))
|
||||
var breasts = GlobalRegistry.createBodypart("malebreasts")
|
||||
breasts.size = 0
|
||||
giveBodypartUnlessSame(breasts)
|
||||
var penis = GlobalRegistry.createBodypart("dragonpenis")
|
||||
penis.lengthCM = 15
|
||||
penis.ballsScale = 1
|
||||
giveBodypartUnlessSame(penis)
|
||||
var tail = GlobalRegistry.createBodypart("demontail")
|
||||
tail.tailScale = 1
|
||||
giveBodypartUnlessSame(tail)
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("hoofs"))
|
||||
|
||||
|
||||
func onGivingBirth(_impregnatedEggCells: Array, _newkids: Array):
|
||||
.onGivingBirth(_impregnatedEggCells, _newkids)
|
||||
|
||||
func getBirthWaitTime():
|
||||
return 60*60*24*10
|
||||
|
||||
func getDefaultEquipment():
|
||||
return ["inmatecollar", "inmateuniform"]
|
8
PierreMod.json
Normal file
8
PierreMod.json
Normal file
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "Pierre Mod",
|
||||
"description": "Because all subs deserve a master",
|
||||
"author": "Frisk",
|
||||
"repository": "https://github.com/Friskygote/Pierre-mod",
|
||||
"modversion": "1.0",
|
||||
"gameversion": "0.1.6"
|
||||
}
|
182
PierreTalkMain.gd
Normal file
182
PierreTalkMain.gd
Normal file
|
@ -0,0 +1,182 @@
|
|||
extends SceneBase
|
||||
|
||||
func _init():
|
||||
sceneID = "PierreTalkScene"
|
||||
|
||||
func _run():
|
||||
if(state == ""):
|
||||
playAnimation(StageScene.Duo, "stand", {npc="pierre", npcAction="sit"})
|
||||
|
||||
|
||||
if(state == ""):
|
||||
if(!GM.main.getModuleFlag("PierreModule", "Pierre_Introduced")):
|
||||
sayn("While exploring the cellblock you stumble upon an uncommon sight - three leashed creatures resting on blankets around a sitting man. One of the creatures appears to be sleeping, the other one is laying on their front turned towards the man sitting on the chair and the third one is licking their paws with their eyes closed.\nThe sitting figure appears to be talking with the creature laying on their belly.")
|
||||
if(OPTIONS.isContentEnabled(ContentType.Watersports)):
|
||||
sayn("All of the three leashed creatures give off a pretty strong smell - they are all marked. While their fur seems dry, it's undeniable it had contact with piss, of a single male. Not difficult to figure out which.")
|
||||
addButton("Talk", "Talk to the intimidating demon", "talk")
|
||||
addButton("Appearance", "Take a closer look at the intimidating demon", "appearance")
|
||||
else:
|
||||
saynn("While exploring the station a In the corner of a platform sits a demon-dragon with three creatures.")
|
||||
addButton("Talk", "Talk to Pierre", "talk")
|
||||
addButton("Appearance", "Take a closer look at Pierre", "appearance")
|
||||
addButton("Leave", "Be on your way", "endthescene")
|
||||
|
||||
if(state == "appearance"):
|
||||
saynn("Before you, on his ”throne” stands an intimidating figure - a demon-dragon hybrid. His piercing black eyes look distinct from any other inmate.\n\nHe can certainly be called muscular, his arms and legs are on the beefier side, not extremaly so, but one wouldn't want to pick a fight with him.\nEven though intimidating, his face... Shows kindness and calm.\n\nWhat makes him much different from everyone else is the... Harem? He holds a bundle of 3 leashes attached to his wrist, at the end of each is a creature laying or sitting on a blanket.")
|
||||
addButton("Back", "Go back", "")
|
||||
|
||||
if(state == "talk"):
|
||||
if(!GM.main.getModuleFlag("PierreModule", "Pierre_Introduced")):
|
||||
GM.main.setModuleFlag("PierreModule", "Pierre_Introduced", true)
|
||||
saynn("You approach the intimidating demon, with a lot of distance still in-between you and him, standing right in front of his harem.")
|
||||
saynn("[say=pierre]Oh hello little morsel. Don't believe I've seen you. Name is Pierre. Do you have a name?[/say]")
|
||||
addButton("I'm "+GM.pc.getName(), "Introduce yourself with your name", "name")
|
||||
else:
|
||||
addButton("Prison", "How did he end up in prison?", "prison")
|
||||
addButton("Pets", "Have they really willingly gave to him?", "pets2")
|
||||
addButton("Guards", "Are prison guards giving him trouble?", "guards")
|
||||
addButton("Leave", "Be on your way", "endthescene")
|
||||
|
||||
if(state == "name"):
|
||||
addCharacter("pierre")
|
||||
saynn("[say=pierre]I see. Nice to meet you "+GM.pc.getName()+" and welcome to my humble corner in this piece of heaven. My name is Pierre.[/say]")
|
||||
saynn("He holds his paw up to you, not fazed by the fact that you are still separated by an awkwardly long distance from the demon-dragon.\nNot wanting to be rude, you lean forwards while making extra sure you will not trample upon laying inmate or fall forwards by yourself. Eventually your " + ("hand" if len(GM.pc.getSpecies()) == 1 and GM.pc.getSpecies()[0] == "human" else "paw") + " meets his and you are able to do shake them.") # ok, I have no idea what's the difference between buff arms and anthro arms, they seem the same, and technically neither have paws, too bad I'm the one writing dialogue though
|
||||
saynn("[say=pierre]I own this little corner including those three wonderful leashed pets beside me. You do NOT touch my pets without permission. Normally I wouldn't think this has to be mentioned, but for some reasons inmates think otherwise, those who do - don't keep this thought for long.[/say]")
|
||||
sayn("[say=pierre]That's probably everything you need to know about me. \nAlso, considering we didn't start on the wrong foot, you have my permission to speak with my pets. \nNow, please find some other business to attend to, unless you need something else of me?[/say]")
|
||||
addButton("Heaven?", "Did you hear that correctly?", "heaven")
|
||||
addButton("Pierre", "Learn more about Pierre", "pierredetails")
|
||||
addButton("Pets", "Who are the pets?", "pets")
|
||||
|
||||
if(state == "heaven"):
|
||||
saynn("[say=pc]Did you just call this prison a piece of heaven? Why?[/say]")
|
||||
saynn("[say=pierre]Because it is. I don't understand why everyone says it's not.[/say]")
|
||||
saynn("[say=pc]Because it's... A prison? It's a middle-of-nothing rock that belongs to some mega rich empire. Because we have collars on our necks.[/say]")
|
||||
saynn("[say=pierre]You are looking at it all wrong [/say]") # TODO
|
||||
addButton("Continue", "Ask about something else", "name")
|
||||
|
||||
if(state == "pets"):
|
||||
GM.main.setModuleFlag("PierreModule", "Pets_Introduced", true)
|
||||
saynn("[say=pc]So... Who are your pets exactly?[/say]")
|
||||
saynn("[say=pierre]Curious about my treasured pearls, aren't you? Oh, I'm happy to introduce you, people usually talk only with me, but I feel like they could use some social interactions with someone else than myself and themselves.[/say]")
|
||||
sayn("[say=pierre]This kitty here is my very first pet, they've recognized me as their master shortly after I came here. They were very spooked and lost in here, still unsure what exactly they did to end up in this place. I gave them meaning, they repay me by being an excellent pet. Azazel, say hi.")
|
||||
saynn("Pierre looks expectantly at Azazel - a fairly regular looking feline, he is wearing an lilac uniform. Until now he was curled and seemingly asleep, even though his ears were perking up whenever his master spoke. After hearing his master's voice speak his name however his head immediately went up, and along with it the rest of his body. He stood on his fours and turned towards you.")
|
||||
saynn("[say=azazel]Hello... Stranger.[/say]")
|
||||
saynn("Azazel said with reservation. He looked away from you for a second to look at face of his master, whos face didn't lose his expectant look. Turning back to you he hesitently rubbed his cheek on your leg and collapsed onto his blanket again, making sure to take a last look at his master before closing his eyelids and presumably continuing his slumber.")
|
||||
saynn("[say=pierre]Good kitty. He is the best breeding bitch in this entire institution, that's what nature made him to be. He doesn't mind petting his head, if that's something you'd like, otherwise we can move on.[/say]")
|
||||
saynn("In corner of your eye you see Azazel's faint smile in reaction to Pierre's comment.")
|
||||
addButton("Pet Azazel", "Pet that kitty!", "hiisipet")
|
||||
addButton("Move on", "Learn about second pet", "hiisi")
|
||||
|
||||
if(state in ["hiisipet", "hiisi"]):
|
||||
if(state == "hiisipet"):
|
||||
saynn("You crouch and gently pet Azazel's head. You can feel very delicate vibrations produced by the kitten. He doesn't open his eyes, but it's clear cat enjoys this treatment.")
|
||||
sayn("Master looks at this interaction with interest and sincere smile on his face.")
|
||||
saynn("After a short moment you stand back up and look at pet on your right.")
|
||||
saynn("[say=pierre]This one here is Hiisi. He is my lastest, which doesn't mean I love him any different. This puppy was actually one of the more recognized troublemakers around this prison.\nHe's been getting into pants of everyone against their own will to the point that even guards started getting concerned and wanted to take action. At one point he even attempted to breed my precious kitty Azazel, do you remember that Hiisi?[/say]") # TODO
|
||||
saynn("Hissi looks at his master and shakes his head.")
|
||||
saynn("[say=pierre]Right, of course you don't, hah. But look at him now, pristine puppy boy! He love his belly rubs and stays out of the trouble! ... Well, mostly. Anyways, despite his troubled past, he agreed to join me and became my pup! Hiisi cmon, welcome our guest, give {pc.him} a sniff!")
|
||||
saynn("[say=hiisi]" + GM.pc.getName() + " isn't it? Umm... Hi.[/say]")
|
||||
saynn("{hiisi.name} licks your leg, leaving a bit of saliva on your fur.") # TODO Fur/skin
|
||||
saynn("[say=pierre]I apologize for my pets, they aren't used to longer conversations with strangers. They've been through a lot and... *sigh* Anyways, Lamia! Lamia is a fox breed, [/say]")
|
||||
addButton("Leave", "Be on your way", "endthescene")
|
||||
addButton("Pets", "Ask more about pets", "hiisipet")
|
||||
|
||||
if(state == "pierredetails"):
|
||||
saynn("You ask Pierre about himself. He looks at you with intensity, studying your face.")
|
||||
saynn("[say=pierre]Honestly, don't think there is much for you to know morsel. But sure, I can entertain you a little.[/say]")
|
||||
saynn("Pierre relaxes, his shoulders straight, he puts one leg on another, in crossed position.")
|
||||
saynn("[say=pierre]I wanted to be here. My position offered me plenty of opportunities, everyone had their own expectations of everyone else's needs and wishes. I gave them all a big middle finger.\nThrough my connections I became an inmate. Nobody convicted me of any crime, like everyone else in here. I simply used my connections at AlphaCorp to be here. To gain my paradise.[/say]")
|
||||
if (GM.pc.getPersonality().getStat(PersonalityStat.Coward) < -0.2):
|
||||
saynn("[say=pc]You are craz-[/say]")
|
||||
else:
|
||||
saynn("[say=pc]That's... Cr-[/say]")
|
||||
saynn("[say=pierre]Crazy. I know. I've heard it a million times, thanks.[/say]")
|
||||
saynn("He rolls his eyes and sips water from the glass nearby.")
|
||||
saynn("[say=pierre]Anyways, this short story will have to do, morsel. I've talked enough about myself.[/say]")
|
||||
addButton("Back", "If he says so", "name")
|
||||
|
||||
if(state == "pets2"):
|
||||
|
||||
pass
|
||||
|
||||
if(state == "join"):
|
||||
var score = calculateHaremScore()
|
||||
var score_explored = GM.main.getModuleFlag("PierreModule", "Score_Explored")
|
||||
if(GM.pc.getPersonality().getStat(PersonalityStat.Subby) < 0):
|
||||
saynn("[say=pierre]Look, you are lovely and all that, but I don't think you are the right fit. I require absolute obedience. Once you submit to me there is no going back, you become MY treasured pet forever. Those three? They know their place, they are ready to be mated whenever I feel like doing so. You? You strike me as leader - like myself. Why not just be business partners in here eh? I think you are entirely capable of gathering your own pets.[/say]")
|
||||
elif(score > 89 and GM.main.getModuleFlag("PierreModule", "Quest_Status") > 1):
|
||||
pass
|
||||
elif(score > 75 and score_explored < 9999):
|
||||
saynn("You mention the intention to join his harem of pets, lust in your eyes. He looks at you and starts grinning.")
|
||||
saynn("[say=pierre]Mmmmmm. You are almost done morsel. Not mine yet, but so close... I really like you. I really really like you. I think you have all of the qualities I'm looking for in a pet but...[/say]")
|
||||
saynn("He looks away, and looks... Concerned? No. In deep thought rather.")
|
||||
saynn("[say=hiisi]Is something the matter, master?[/say]")
|
||||
saynn("[say=pierre]No Hiisi, you don't have to...[/say]")
|
||||
saynn("[say=azazel]Will "+GM.pc.getName()+" join us, master?[/say]")
|
||||
saynn("Pierre stands up, pulling on both Azazel's and Hiisi's leashes.")
|
||||
saynn("[say=pierre]You two, do not concern yourself. "+GM.pc.getName()+" here...[/say]")
|
||||
saynn("He looks at you, his black eyes again staring into yours. His face is neutral, still hazed by wandering thoughts.")
|
||||
saynn("[say=pierre]... Is interested, but he still needs to prove he is worthy to be owned by your master.[/say]")
|
||||
saynn("He comes closer to you, leashes in his paw, eyes on you. There are only two steps separating you and him, but with each his tall posture makes you feel as if he is getting taller and taller, or perhaps you smaller and smaller. Eventually you can feel his body heat on yours, he is standing just in front of you, a peanut away. Your face meets his chest, you don't dare to look him in the face.\nHis paw reaches your chin to correct that. You see his black eyes again, looking down on you, as if you were a little feral kitten looking at big human. Insignificant. Tiny. His face has a serious expression.")
|
||||
saynn("[say=pierre]Tell me "+GM.pc.getName()+", do you want to be my pet or do you want to stay a stray kitten?[/say]") # TODO depending on species
|
||||
GM.main.setModuleFlag("PierreModule", "Score_Explored", score)
|
||||
addButton("Y-your pet", "Submit to Pierre", "quest")
|
||||
if (GM.pc.getPersonality().getStat(PersonalityStat.Subby) < 0.3) and GM.pc.getLust() < 30 and !GM.pc.isWearingHypnovisor() and !GM.pc.hasEffect(StatusEffect.Suggestible) and !GM.pc.hasEffect(StatusEffect.UnderHypnosis): # Good luck lol
|
||||
GM.main.setModuleFlag("PierreModule", "Quest_Status", -1)
|
||||
addButton("Stray kitten", "You don't want to be his kitten", "quest")
|
||||
else:
|
||||
addDisabledButton("Stray kitten", "Your mind doesn't allow you to make this choice")
|
||||
elif(score > 45 and score_explored < 76):
|
||||
saynn("[say=pierre]Heh, interesting ask. It's still a no, though I have to admit, I do see some potential in here.[/say]")
|
||||
if (GM.pc.isBlindfolded()):
|
||||
saynn("Pierre stands up, takes a step towards you, grabs your blindfold, pulls it higher, grabs you by your chin to look you straight in your eyes.")
|
||||
elif (GM.pc.isWearingHypnovisor()):
|
||||
saynn("[say=pierre]Heh, I see you already come with the equipment. Let me take a look at you.[/say]")
|
||||
saynn("Pierre stands up, takes a step towards you, pulls you forward, grabs your chin, pulls your head higher to face his head on top of his tall body. You barely see his eyes through your visor, which continues to massage your brain to obey every whim of every alpha in the prison.")
|
||||
else:
|
||||
saynn("Pierre stands up, takes a step towards you, grabs you by your chin without asking and looks you straight into your eyes.")
|
||||
GM.pc.addLust(30)
|
||||
sayn("The moment takes forever, just as his gaze pierces through your eyes, you also observe his black, void pupils and irises. For a moment, it feels as if his pupil turned bright red. Could be just a play of light or something... But then... There is allure in those eyes. Something dangerous, yet enticing. You feel primal, bare. With every moment of this eye contact you feel less in control, weaker, inferior. Your knees start to bend ever so slightly before Pierre stedies your head again and takes his paws from your chin.")
|
||||
if (GM.pc.isBlindfolded()):
|
||||
sayn("He fixes your blindfold to be back on your eyes.")
|
||||
saynn("[say=pierre]Yess, you have the potential, whether you'll use it or not is up to you.[/say]")
|
||||
saynn("Pierre goes back to his chair and sits, staring at you with a grin on his face.")
|
||||
GM.main.setModuleFlag("PierreModule", "Score_Explored", score)
|
||||
elif(score > 25 and score_explored < 46):
|
||||
saynn("[say=pierre]I gotta say, I did hear of a certain "+GM.pc.getName()+" around doing some whoring, but that's about it. You must understand, my pets must have prior experience and right spirit that I can exploit. You seem like a small fish. So nah, my apologies but I'm simply not interested in you at the moment.[/say]")
|
||||
GM.main.setModuleFlag("PierreModule", "Score_Explored", score)
|
||||
elif(score_explored > 1):
|
||||
saynn("[say=pierre]Hmm. you still look mostly the same, still unworthy.[/say]")
|
||||
else:
|
||||
saynn("[say=pierre]Look, you are lovely and all that, but I don't think you have what it takes to join my other pets. I require absolute obedience and sexual experience. Once you submit to me there is no going back, you become MY treasured pet forever. Those three? They know their place, they are ready to be mated whenever I feel like doing so. They obey my every single command. I just don't see that in you, sorry.[/say]")
|
||||
addButton("Back", "Maybe another time then...", "pets2")
|
||||
if(state == "quest"):
|
||||
if (GM.main.getModuleFlag("PierreModule", "Quest_Status") == -1):
|
||||
saynn("[say=pierre]I see... Disappointing, but it's your choice and I respect that.[/say]")
|
||||
saynn("He looks at you some more, he takes away his paw from your chin, turns around and sits on his chair. A serious and... Disappointed look on his face.")
|
||||
saynn("[say=pierre]I'll give you one more chance if you change your mind. But this one will be final. My pets trust me, and they don't say no to me.[/say]")
|
||||
addButton("Leave", "Take your leave", "endthescene")
|
||||
else:
|
||||
saynn("He smiles briefly.")
|
||||
saynn("[say=pierre]Very well.[/say]")
|
||||
saynn("He puts his paws on sides of your head and starts scratching you behind your ears. Immediately you feel... Comfortable. Loved. Protected. You closed your eyes in bliss. And then he... Stops, the feeling of his paws is filled with void. You feel empty, unfulfilled. You open your eyes and meet his eyes staring at you again from the above. He looks at you expectendly. You aren't sure what to do, you don't want to fail your Master, but... His black eyes speak to you, yes. They want you to open your mouth. You don't even realize when your mouth opens. You didn't do that by yourself, did you?")
|
||||
sayn("He takes your tongue in between his paw fingers gently, pulls it out a little. He opens his mouth and he spits. Spit lands right on your tongue, with incredible precision right in the middle. He does it again, using the fact your mouth is still open. It lands deeper inside your mount. He pulls his paw fingers from your tongue and uses his two fingers to pressure your chin from below, giving you a signal to close your mouth.")
|
||||
sayn("You comply. There is nothing other than his eyes staring deep at you, his will is your will. His spit doesn't feel particularly different from yours, perhaps you can pick up some flavor or two, but it's more dignified flavor than one of cum that you are so used to. You keep the spit inside your mouth for a bit, tasting it, feeling it, connecting with its owner. And you swallow it, with a visible gulp.")
|
||||
saynn("Pierre smiles. He ruffles your " + ("hair" if GM.pc.hasHair() else "ears") + " with his paws.")
|
||||
saynn("[say=pierre]Good pet.\nNow, to be MY pet you'll have to prove yourself further. Besides the fact I want my pets to be all famous in this little heaven of ours, I want to make sure they follow my orders and don't leave my side. For you my dear, I have a little task, nothing you can't do, I'm sure, but it will be the proof I need you can become MY pet.[/say]")
|
||||
saynn("He turns around and moves towards his chair, where he sits.")
|
||||
saynn("[say=pierre][/say]")
|
||||
GM.main.setModuleFlag("PierreModule", "Quest_Status", 1)
|
||||
|
||||
func calculateHaremScore():
|
||||
var score = 0
|
||||
score += GM.pc.getPersonality().getStat("Subby")*10 # -10 - 10
|
||||
score += GM.pc.getReputation().getRepLevel(RepStat.Whore)*10 # 0 - 90
|
||||
return int(score)
|
||||
|
||||
func _react(_action: String, _args):
|
||||
if(_action == "endthescene"):
|
||||
endScene()
|
||||
return
|
||||
|
||||
setState(_action)
|
8
PierreWorldEdit.gd
Normal file
8
PierreWorldEdit.gd
Normal file
|
@ -0,0 +1,8 @@
|
|||
extends WorldEditBase
|
||||
|
||||
func _init():
|
||||
id = "PierreWorldEdit"
|
||||
|
||||
func apply(world: GameWorld):
|
||||
if(getFlag("PierreModule.Pierre_Introduced")):
|
||||
world.setRoomSprite("hall_ne_corner", RoomStuff.RoomSprite.PERSON)
|
26
PierresPetQuest.gd
Normal file
26
PierresPetQuest.gd
Normal file
|
@ -0,0 +1,26 @@
|
|||
extends QuestBase
|
||||
|
||||
func _init():
|
||||
id = "PierresPetQuest"
|
||||
|
||||
func getVisibleName():
|
||||
return "Becoming something lesser"
|
||||
|
||||
func getProgress():
|
||||
var quest_status = GM.main.getModuleFlag("PierreModule", "Quest_Status")
|
||||
var result = []
|
||||
|
||||
result.append("Pierre gave you a task")
|
||||
if(quest_status > 1):
|
||||
pass
|
||||
|
||||
return result
|
||||
|
||||
func isVisible():
|
||||
return GM.main.getModuleFlag("PierreModule", "Quest_Status") > 0
|
||||
|
||||
func isCompleted():
|
||||
return GM.main.getModuleFlag("PierreModule", "Quest_Status") > 10
|
||||
|
||||
func isMainQuest():
|
||||
return false
|
Loading…
Reference in a new issue