Continued work on Azazel's 4th corruption scene, added Luck Token utility
This commit is contained in:
parent
6d7d64d1c8
commit
65db9c0970
21
Modules/IssixModule/Events/AnnouncerLuckTokenEvent.gd
Normal file
21
Modules/IssixModule/Events/AnnouncerLuckTokenEvent.gd
Normal file
|
@ -0,0 +1,21 @@
|
|||
extends EventBase
|
||||
|
||||
func _init():
|
||||
id = "AnnouncerIssixExtender"
|
||||
|
||||
func registerTriggers(es):
|
||||
es.addTrigger(self, Trigger.SceneAndStateHook, ["AnnouncerTalkScene", ""])
|
||||
|
||||
func run(_triggerID, _args):
|
||||
if GM.pc.getInventory().hasItemID("LuckToken"):
|
||||
addButton("Luck token", "Talk with Announcer about exchanging your luck token", "main")
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
func onButton(_method, _args):
|
||||
if(_method == "main"):
|
||||
runScene("AnnouncerLuckTokenDialogue")
|
||||
|
||||
func getPriority():
|
||||
return 20
|
|
@ -31,7 +31,7 @@ canEast = false
|
|||
[node name="CellblockRoom6" parent="." index="2" instance=ExtResource( 2 )]
|
||||
self_modulate = Color( 1, 0.6, 0.8, 1 )
|
||||
position = Vector2( 0, 256 )
|
||||
roomName = "My cell"
|
||||
roomName = "End of Liliac hallway"
|
||||
roomID = "petsdream_cellblock_pink_playercell"
|
||||
roomDescription = "((This will be your potential cell))"
|
||||
canWest = false
|
||||
|
@ -44,17 +44,10 @@ position = Vector2( 0, 128 )
|
|||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_nearcells"
|
||||
roomDescription = "This is where the 3 cell blocks branch off into their own sections, there are always a few inmates of all types milling around. Above you there are a number of guards on the catwalks, walls, and posts. From here, the orange, lilac, and red cell blocks lay further ahead."
|
||||
roomSprite = 7
|
||||
loctag_NoWallsNear = true
|
||||
|
||||
[node name="CellblockRoom8" parent="." index="4" instance=ExtResource( 2 )]
|
||||
self_modulate = Color( 1, 0.6, 0.6, 1 )
|
||||
position = Vector2( 512, 128 )
|
||||
roomName = "Solitary"
|
||||
roomID = "solitary_cell"
|
||||
roomDescription = "A tiny cell for very unruly inmates"
|
||||
roomColor = 2
|
||||
gridColor = 2
|
||||
|
||||
[node name="CellblockRoom9" parent="." index="5" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom9" parent="." index="4" instance=ExtResource( 2 )]
|
||||
self_modulate = Color( 1, 0.6, 0.6, 1 )
|
||||
position = Vector2( 64, 128 )
|
||||
roomName = "High-security cellblock"
|
||||
|
@ -64,10 +57,10 @@ canNorth = false
|
|||
canSouth = false
|
||||
roomColor = 2
|
||||
|
||||
[node name="CellblockRoom12" parent="." index="6" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom12" parent="." index="5" instance=ExtResource( 2 )]
|
||||
self_modulate = Color( 1, 0.6, 0.6, 1 )
|
||||
position = Vector2( 128, 128 )
|
||||
roomName = "My cell"
|
||||
roomName = "End of High-sec hallway"
|
||||
roomID = "petsdream_cellblock_red_playercell"
|
||||
roomDescription = "((This will be your potential cell))"
|
||||
canNorth = false
|
||||
|
@ -75,7 +68,7 @@ canSouth = false
|
|||
roomSprite = 1
|
||||
roomColor = 2
|
||||
|
||||
[node name="CellblockRoom10" parent="." index="7" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom10" parent="." index="6" instance=ExtResource( 2 )]
|
||||
self_modulate = Color( 1, 0.8, 0.6, 1 )
|
||||
position = Vector2( -64, 128 )
|
||||
roomName = "General-security cellblock"
|
||||
|
@ -85,24 +78,24 @@ canNorth = false
|
|||
canSouth = false
|
||||
roomColor = 5
|
||||
|
||||
[node name="CellblockRoom11" parent="." index="8" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom11" parent="." index="7" instance=ExtResource( 2 )]
|
||||
self_modulate = Color( 1, 0.8, 0.6, 1 )
|
||||
position = Vector2( -128, 128 )
|
||||
roomName = "My cell"
|
||||
roomName = "End of General hallway"
|
||||
roomID = "petsdream_cellblock_orange_playercell"
|
||||
canNorth = false
|
||||
canSouth = false
|
||||
roomSprite = 1
|
||||
roomColor = 5
|
||||
|
||||
[node name="CellblockRoom1" parent="." index="9" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom1" parent="." index="8" instance=ExtResource( 2 )]
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part2"
|
||||
roomDescription = "Your standing inside a giant sheet metal tube that connects the cellblocks with the rest of the prison. The only noteworthy thing here is the giant open blast door stretched across the hall."
|
||||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom2" parent="." index="10" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom2" parent="." index="9" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -64 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part3"
|
||||
|
@ -110,7 +103,7 @@ roomDescription = "Your standing inside a giant sheet metal tube that connects t
|
|||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom3" parent="." index="11" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom3" parent="." index="10" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -128 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part4"
|
||||
|
@ -118,7 +111,7 @@ roomDescription = "Your standing inside a giant sheet metal tube that connects t
|
|||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom13" parent="." index="12" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom13" parent="." index="11" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -192 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part5"
|
||||
|
@ -126,7 +119,7 @@ roomDescription = "Your standing inside a giant sheet metal tube that connects t
|
|||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom14" parent="." index="13" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom14" parent="." index="12" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -256 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part6"
|
||||
|
@ -134,7 +127,7 @@ roomDescription = "Your standing inside a giant sheet metal tube that connects t
|
|||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom15" parent="." index="14" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom15" parent="." index="13" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -320 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part7"
|
||||
|
@ -142,7 +135,7 @@ roomDescription = "Your standing inside a giant sheet metal tube that connects t
|
|||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom16" parent="." index="15" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom16" parent="." index="14" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -384 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part8"
|
||||
|
@ -150,7 +143,7 @@ roomDescription = "Your standing inside a giant sheet metal tube that connects t
|
|||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom17" parent="." index="16" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom17" parent="." index="15" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -448 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part9"
|
||||
|
@ -158,7 +151,7 @@ roomDescription = "Your standing inside a giant sheet metal tube that connects t
|
|||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom18" parent="." index="17" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom18" parent="." index="16" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -512 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part10"
|
||||
|
@ -166,7 +159,7 @@ roomDescription = "Your standing inside a giant sheet metal tube that connects t
|
|||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom19" parent="." index="18" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom19" parent="." index="17" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -576 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part11"
|
||||
|
@ -174,7 +167,7 @@ roomDescription = "Your standing inside a giant sheet metal tube that connects t
|
|||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom20" parent="." index="19" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom20" parent="." index="18" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -640 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part12"
|
||||
|
@ -182,7 +175,7 @@ roomDescription = "Your standing inside a giant sheet metal tube that connects t
|
|||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom21" parent="." index="20" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom21" parent="." index="19" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -704 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part13"
|
||||
|
@ -190,7 +183,7 @@ roomDescription = "Your standing inside a giant sheet metal tube that connects t
|
|||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom22" parent="." index="21" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom22" parent="." index="20" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -768 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part14"
|
||||
|
@ -198,7 +191,7 @@ roomDescription = "Your standing inside a giant sheet metal tube that connects t
|
|||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom23" parent="." index="22" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom23" parent="." index="21" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -832 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part15"
|
||||
|
@ -206,7 +199,7 @@ roomDescription = "Your standing inside a giant sheet metal tube that connects t
|
|||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom24" parent="." index="23" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom24" parent="." index="22" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -896 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part16"
|
||||
|
@ -214,13 +207,14 @@ roomDescription = "Your standing inside a giant sheet metal tube that connects t
|
|||
canWest = false
|
||||
canEast = false
|
||||
|
||||
[node name="CellblockRoom25" parent="." index="24" instance=ExtResource( 2 )]
|
||||
[node name="CellblockRoom25" parent="." index="23" instance=ExtResource( 2 )]
|
||||
position = Vector2( 0, -960 )
|
||||
roomName = "Corridor"
|
||||
roomID = "petsdream_cellblock_corridor_part17"
|
||||
roomDescription = "Your standing inside a giant sheet metal tube that connects the cellblocks with the rest of the prison. The only noteworthy thing here is the giant open blast door stretched across the hall."
|
||||
canWest = false
|
||||
canEast = false
|
||||
roomSprite = 4
|
||||
|
||||
[connection signal="onEnter" from="CellblockRoom6" to="." method="_on_CellblockRoom11_onEnter"]
|
||||
[connection signal="onPreEnter" from="CellblockRoom6" to="." method="_on_CellblockRoom11_onPreEnter"]
|
||||
|
|
14
Modules/IssixModule/GameExtender/processTimeCatcher.gd
Normal file
14
Modules/IssixModule/GameExtender/processTimeCatcher.gd
Normal file
|
@ -0,0 +1,14 @@
|
|||
extends GameExtender
|
||||
|
||||
func _init():
|
||||
id = "IssixModGE"
|
||||
|
||||
func register(_GES:GameExtenderSystem):
|
||||
_GES.register(self, ExtendGame.pcProcessTime)
|
||||
|
||||
func pcProcessTime(_pc:Player, _seconds):
|
||||
# Don't progress time while in a dream
|
||||
if GM.main.getModuleFlag("IssixModule", "Azazel_In_Dream", false):
|
||||
GM.main.timeOfDay -= _seconds
|
||||
|
||||
|
|
@ -1,7 +1,10 @@
|
|||
extends ItemBase
|
||||
|
||||
var quality = 1.0
|
||||
|
||||
func _init():
|
||||
id = "LuckToken"
|
||||
quality = RNG.randf_range(0.5, 1.0)
|
||||
|
||||
func getVisibleName():
|
||||
return "Luck Token"
|
||||
|
@ -24,6 +27,9 @@ func canSell():
|
|||
func canCombine():
|
||||
return true
|
||||
|
||||
func getQuality():
|
||||
return quality
|
||||
|
||||
func tryCombine(_otherItem):
|
||||
return .tryCombine(_otherItem)
|
||||
|
||||
|
@ -35,10 +41,15 @@ func getItemCategory():
|
|||
|
||||
func saveData():
|
||||
var data = .saveData()
|
||||
|
||||
data["quality"] = quality
|
||||
|
||||
return data
|
||||
|
||||
func loadData(data):
|
||||
.loadData(data)
|
||||
|
||||
quality = SAVE.loadVar(data, "quality", "")
|
||||
|
||||
func getInventoryImage():
|
||||
return "res://Modules/IssixModule/Items/Icons/lucktoken.png"
|
||||
|
|
|
@ -56,11 +56,14 @@ func getFlags():
|
|||
"Azazel_Agreed_Kiss": flag(FlagType.Bool),
|
||||
"Azazel_Corruption_Musk_Happened": flag(FlagType.Bool),
|
||||
"Azazel_Player_Donated_Gasmask": flag(FlagType.Bool),
|
||||
"Azazel_In_Dream": flag(FlagType.Bool),
|
||||
"Azazel_Corr_Dream_State": flag(FlagType.Dict),
|
||||
"Hiisi_Encounter_scene": flag(FlagType.Number),
|
||||
"Hiisi_Had_Encounter_Scene_Today": flag(FlagType.Bool),
|
||||
"Issix_Donation_Meter": flag(FlagType.Number),
|
||||
"Issix_Used_Donations": flag(FlagType.Number),
|
||||
"Got_Luck_Token_Before": flag(FlagType.Bool),
|
||||
"Announcer_PC_Naive": flag(FlagType.Bool),
|
||||
|
||||
# Slavery related
|
||||
"PC_Enslavement_Role": flag(FlagType.Number),
|
||||
|
@ -114,6 +117,8 @@ func _init():
|
|||
"res://Modules/IssixModule/Events/LamiaCellEvent.gd",
|
||||
"res://Modules/IssixModule/Events/TalkNovaEvent.gd",
|
||||
"res://Modules/IssixModule/Events/PetWanderEvent.gd",
|
||||
"res://Modules/IssixModule/Scenes/AzazelCorruption/StopsEvent.gd",
|
||||
"res://Modules/IssixModule/Events/AnnouncerLuckTokenEvent.gd",
|
||||
]
|
||||
|
||||
scenes = [
|
||||
|
@ -139,10 +144,12 @@ func _init():
|
|||
"res://Modules/IssixModule/Scenes/AzazelCorruption/AzazelCorruptionScene.gd",
|
||||
"res://Modules/IssixModule/Scenes/AzazelCorruption/AzazelCorruptionScene2.gd",
|
||||
"res://Modules/IssixModule/Scenes/AzazelCorruption/AzazelCorruptionScene3.gd",
|
||||
"res://Modules/IssixModule/Scenes/AzazelCorruption/AzazelCorruptionScene4.gd",
|
||||
"res://Modules/IssixModule/Scenes/HiisiScenes/HiisiWanderScene.gd",
|
||||
"res://Modules/IssixModule/Scenes/HiisiScenes/HiisiWanderScene2.gd",
|
||||
"res://Modules/IssixModule/Scenes/HiisiScenes/HiisiWanderScene3.gd",
|
||||
"res://Modules/IssixModule/Scenes/IssixDonationScene.gd",
|
||||
"res://Modules/IssixModule/Scenes/AnnouncerLuckTokensDialogue.gd",
|
||||
]
|
||||
|
||||
characters = [
|
||||
|
@ -152,6 +159,10 @@ func _init():
|
|||
"res://Modules/IssixModule/Characters/LamiaCharacter.gd"
|
||||
]
|
||||
|
||||
gameExtenders = [
|
||||
"res://Modules/IssixModule/GameExtender/processTimeCatcher.gd"
|
||||
]
|
||||
|
||||
worldEdits = [
|
||||
"res://Modules/IssixModule/IssixWorldEdit.gd"
|
||||
]
|
||||
|
@ -229,6 +240,18 @@ static func getPlayerPetName():
|
|||
else:
|
||||
return "pet"
|
||||
|
||||
static func hackProcessingCharacters():
|
||||
for charID in GM.main.getCharacters():
|
||||
var character = GlobalRegistry.getCharacter(charID)
|
||||
#character.checkOldWayOfUpdating(currentDay, timeOfDay)
|
||||
if(character.shouldBeUpdated()):
|
||||
GM.main.startUpdatingCharacter(charID)
|
||||
for charID in GM.main.dynamicCharacters:
|
||||
var character = GlobalRegistry.getCharacter(charID)
|
||||
#character.checkOldWayOfUpdating(currentDay, timeOfDay)
|
||||
if(character.shouldBeUpdated()):
|
||||
GM.main.startUpdatingCharacter(charID)
|
||||
|
||||
func breedSlaveIfNpc():
|
||||
## Function to process breeding by Master on randomly selected TODO maybe do that during the day as an event?
|
||||
# if (int(GM.main.getDays()) % 2 == 0): # Breed only every second day?
|
||||
|
|
68
Modules/IssixModule/Scenes/AnnouncerLuckTokensDialogue.gd
Normal file
68
Modules/IssixModule/Scenes/AnnouncerLuckTokensDialogue.gd
Normal file
|
@ -0,0 +1,68 @@
|
|||
extends SceneBase
|
||||
|
||||
func _init():
|
||||
sceneID = "AnnouncerLuckTokenDialogue"
|
||||
|
||||
func _run():
|
||||
if(state == ""):
|
||||
if getModuleFlag("IssixModule", "Got_Luck_Token_Before") == false:
|
||||
saynn("[say=pc]Umm, I've gotten this thing here, is this something you are interested in?[/say]")
|
||||
saynn("You show the announcer the luck token you've gotten from Issix.")
|
||||
saynn("[say=announcer]Hoo hoo, the luck tokens! Truth be told, they've lost on value with the time, but yes, I'm still collecting them. Though that makes me wonder, where have you got one babe? They aren't easy to come by in the prison, I haven't seen one in ages.[/say]")
|
||||
saynn("[say=pc]Let's just say that I found one?[/say]")
|
||||
saynn("[say=announcer]Oh, of course, you aren't willing to share, that's fine with me babe. Anything in specific you'd like in return for this gem?[/say]")
|
||||
if GM.pc.getPersonality().getStat(PersonalityStat.Naive) > 0:
|
||||
saynn("[say=pc]I'm not sure how expensive they are.[/say]")
|
||||
saynn("[say=announcer]Not very clever of you to be exchanging things that you don't know value of. Like I said, they aren't expensive at all, but they still hold their value. Tell you what, how does 40 credits sound like?[/say]")
|
||||
addButton("Fine", "Agree to the deal", "transaction")
|
||||
else:
|
||||
saynn("You take a close look at the metal token, this heavy blend of metals is rather rare in your chunk of galaxy. While you aren't sure about how rare exactly it is in here, you take a gander that melting the metal in this token could be a quite profitable endeavor.")
|
||||
addButton("90 credits", "That's your offer", "transaction")
|
||||
else:
|
||||
saynn("[say=pc]How much for this luck token?[/say]")
|
||||
# sorry
|
||||
var item = GM.pc.getInventory().getFirstOf("LuckToken")
|
||||
saynn("[say=announcer]This one? Hmm. I'm willing to pay you "+str(calculateCost(item))+" credits for this one, what do you think?[/say]")
|
||||
addButton("Sure", "Sell your luck token for "+str(calculateCost(item)), "agreesell")
|
||||
addButton("Nah", "Don't sell your luck token", "endthescene")
|
||||
|
||||
|
||||
if state == "transaction":
|
||||
if GM.pc.getPersonality().getStat(PersonalityStat.Naive) > 0:
|
||||
saynn("[say=pc]Fine by me.[/say]")
|
||||
saynn("[say=announcer]Splendid! Let me relive you of this weight now.[/say]")
|
||||
else:
|
||||
saynn("[say=pc]90 credits.[/say]")
|
||||
saynn("[say=announcer]Tsk. Fine. Your offer is at the very top of range that I'd be willing to pay for this token. But if you ever come back with more, don't expect the same sell price. Luck tokens were made with different degrees of quality, this one on the better end, but not every is.[/say]")
|
||||
saynn("You pass the token to the announcer.")
|
||||
saynn("[say=pc]Pleasure doing business.[/say]")
|
||||
saynn("[say=announcer]Likewise babe.[/say]")
|
||||
|
||||
func calculateCost(item):
|
||||
return int(ceil((45 if getModuleFlag("IssixModule", "Announcer_PC_Naive") else 95)*item.getQuality()))
|
||||
|
||||
func _react(_action: String, _args):
|
||||
if _action == "transaction":
|
||||
if GM.pc.getPersonality().getStat(PersonalityStat.Naive) > 0:
|
||||
setModuleFlag("IssixModule", "Announcer_PC_Naive", true)
|
||||
addMessage("You've exchanged one luck token to the announcer for 40 credits.")
|
||||
GM.pc.addCredits(40)
|
||||
else:
|
||||
setModuleFlag("IssixModule", "Announcer_PC_Naive", false)
|
||||
addMessage("You've exchanged one luck token to the announcer for 90 credits.")
|
||||
GM.pc.addCredits(90)
|
||||
GM.pc.getInventory().removeFirstOf("LuckToken")
|
||||
|
||||
if _action == "agreesell":
|
||||
var item = GM.pc.getInventory().getFirstOf("LuckToken")
|
||||
GM.pc.addCredits(calculateCost(item))
|
||||
GM.pc.getInventory().removeItem(item)
|
||||
addMessage("You've exchanged one luck token to the announcer for "+str(calculateCost(item))+" credits.")
|
||||
endScene()
|
||||
return
|
||||
|
||||
if(_action == "endthescene"):
|
||||
endScene()
|
||||
return
|
||||
|
||||
setState(_action)
|
|
@ -30,7 +30,7 @@ func _run(): # TODO Those corruption scenes don't really work when player is bl
|
|||
saynn("He baps you on the nose while giving you a cheerful laugh.")
|
||||
saynn("[say=pc]Mysterious, aren't we?[/say]")
|
||||
saynn("[say=azazel]It's gonna be fun, I promise.[/say]")
|
||||
addButton("Go", "Go with the feline to their cell (heavy drug use, pet play, domination)", "tocell")
|
||||
addButton("Go", "Go with the feline to their cell (heavy drug use, pet play, domination, body modification)", "tocell")
|
||||
addButton("Don't go", "Refuse feline", "dontgo")
|
||||
|
||||
if state == "dontgo":
|
||||
|
@ -105,11 +105,11 @@ func _run(): # TODO Those corruption scenes don't really work when player is bl
|
|||
saynn("[say=azazel]I gotta say, lack of breasts on you is kind of a relief. Not that I hate them! I have them sometimes myself, it's just that... I don't particularly enjoy them either? I don't know. Men usually like boobs, but personally I were never the fan, overhyped stuff.[/say]")
|
||||
|
||||
if GM.pc.getFemininity() >= 66:
|
||||
saynn("[say=azazel]Ahh, you have a very {pc.femininity} body! I like all kinds of bodies, I myself am a little freaky with that haha. Even though I'm a man I do have girl bits, can bear children and well, my body is pretty {azazel.femininity} as well.[/say]")
|
||||
saynn("[say=azazel]Ahh, you have a very {pc.feminine} body! I like all kinds of bodies, I myself am a little freaky with that haha. Even though I'm a man I do have girl bits, can bear children and well, my body is pretty {azazel.feminine} as well.[/say]")
|
||||
elif GM.pc.getFemininity() >= 33:
|
||||
saynn("[say=azazel]Ahh, you have a very {pc.femininity} body! I like all kinds of bodies, I myself am a little freaky with that haha. Even though I'm a man I do have girl bits, can bear children and well, while my body has been described as feminine, I'm fairly androgynous, wouldn't you agree?[/say]")
|
||||
saynn("[say=azazel]Ahh, you have a very {pc.feminine} body! I like all kinds of bodies, I myself am a little freaky with that haha. Even though I'm a man I do have girl bits, can bear children and well, while my body has been described as feminine, I'm fairly androgynous, wouldn't you agree?[/say]")
|
||||
else:
|
||||
saynn("[say=azazel]Ahh, you have a very {pc.femininity} body, I love that! Masculinity is hot. That said, I do like all kinds of bodies, I myself am a little freaky with that haha. Even though I'm a man I do have girl bits, can bear children and well.[/say]")
|
||||
saynn("[say=azazel]Ahh, you have a very {pc.feminine} body, I love that! Masculinity is hot. That said, I do like all kinds of bodies, I myself am a little freaky with that haha. Even though I'm a man I do have girl bits, can bear children and well.[/say]")
|
||||
saynn("[say=azazel]Also, have anyone told you your face is cute? Because it is.[/say]")
|
||||
addMessage("You've learned many of Azazel's interests.")
|
||||
|
||||
|
@ -282,6 +282,10 @@ func _run(): # TODO Those corruption scenes don't really work when player is bl
|
|||
addButton("Black out", "Lose consciousness...?", "transition")
|
||||
|
||||
if state == "transition": # Figure out if we can make player blinded without a blindfold?
|
||||
aimCameraAndSetLocName("petsdream_cellblock_lilac_nearcell")
|
||||
GM.pc.setLocation("petsdream_cellblock_lilac_nearcell")
|
||||
if GM.main.originalPC.isHeavilyPregnant():
|
||||
saynn("You have a strange feeling like you are missing something important, your body doesn't feel so bloated anymore.")
|
||||
saynn("You open your eyes, confused. You don't remember much, everything is... Fuzzy, you don't really remember what you were doing before you woke up. Your eyes see whiteness surrounding you bright light at the ceiling, and you are laying on your back, underneath you a hard cold floor.")
|
||||
saynn("You smell waft of something powerful from somewhere, the air feels stale, musty, it's a mix of pheromones, wet carpet, a tinge of sulfur.")
|
||||
saynn("[say=pc]What the fuck? Where-[/say]")
|
||||
|
@ -309,10 +313,34 @@ func hasDevCommentary():
|
|||
return false
|
||||
|
||||
func _react(_action: String, _args):
|
||||
if _action == "transition": # To make sure - player does not progress the time so event's don't happen
|
||||
if _action == "transition":
|
||||
# We want all of the player parts to look mostly the same. Some things may not survive but that's just how it is. Will track any issues and try to fix
|
||||
GM.main.overridePC()
|
||||
GM.pc.setName(GM.main.originalPC.getName())
|
||||
GM.pc.setGender(GM.main.originalPC.getGender())
|
||||
GM.pc.setSpecies(GM.main.originalPC.getSpecies())
|
||||
GM.pc.resetBodypartsToDefault()
|
||||
GM.pc.getInventory().equipItem(GlobalRegistry.createItem("Leotard"))
|
||||
for bodypart in GM.main.originalPC.bodyparts:
|
||||
if GM.main.originalPC.bodyparts[bodypart] == null:
|
||||
continue
|
||||
var replacedBodypart = GlobalRegistry.createBodypart(GM.main.originalPC.bodyparts[bodypart].id)
|
||||
var body_part_values = GM.main.originalPC.bodyparts[bodypart].getCharCreatorData()
|
||||
if body_part_values != null:
|
||||
for body_part_attribute in body_part_values:
|
||||
replacedBodypart.set(body_part_attribute[0], body_part_attribute[1])
|
||||
Console.printLine(str(GM.main.originalPC.bodyparts[bodypart].get_property_list()))
|
||||
GM.pc.giveBodypart(replacedBodypart)
|
||||
GM.pc.pickedThickness = GM.main.originalPC.getThickness()
|
||||
GM.pc.pickedFemininity = GM.main.originalPC.getFemininity()
|
||||
GM.pc.pickedSkin = GM.main.originalPC.pickedSkin
|
||||
GM.pc.pickedSkinRColor = GM.main.originalPC.pickedSkinRColor
|
||||
GM.pc.pickedSkinGColor = GM.main.originalPC.pickedSkinGColor
|
||||
GM.pc.pickedSkinBColor = GM.main.originalPC.pickedSkinBColor
|
||||
# Not part of the main game yet. Might need to send a pull request later.
|
||||
#GM.main.stopProcessingTime()
|
||||
# Disable processing characters except PC so there are no pregnancies or other events that could ruin the immersion
|
||||
setModuleFlag("IssixModule", "Azazel_In_Dream", true)
|
||||
GM.main.charactersToUpdate.clear() # TODO Remember to regenerate on exit
|
||||
GM.pc.updateNonBattleEffects()
|
||||
|
||||
if _action == "undress":
|
||||
|
@ -334,17 +362,18 @@ func _react(_action: String, _args):
|
|||
geared_up = _args[0]
|
||||
if geared_up: # Dress up time
|
||||
var item = GlobalRegistry.createItem("ropeharness")
|
||||
var inventory = GM.pc.getInventory()
|
||||
item.clothesColor = Color.deeppink
|
||||
GM.pc.equipItem(item)
|
||||
inventory.equipItem(item)
|
||||
addMessage(item.getVisibleName() + " has been put on your body.")
|
||||
item = GlobalRegistry.createItem("inmateanklecuffs")
|
||||
GM.pc.equipItem(item)
|
||||
inventory.equipItem(item)
|
||||
addMessage("Your ankles have been restrained by "+item.getVisibleName())
|
||||
item = GlobalRegistry.createItem("inmatewristcuffs")
|
||||
GM.pc.equipItem(item)
|
||||
inventory.equipItem(item)
|
||||
addMessage(item.getVisibleName() + " are now restraining your wrists.")
|
||||
item = GlobalRegistry.createItem("bondagemittens")
|
||||
GM.pc.equipItem(item)
|
||||
inventory.equipItem(item)
|
||||
addMessage(item.getVisibleName() + " made your paws useless.")
|
||||
|
||||
# if _action == "stripping":
|
||||
|
|
|
@ -0,0 +1,153 @@
|
|||
extends Character
|
||||
|
||||
# Incredibly subby and kinky creature, mostly aligns with mod's author preferences.'
|
||||
|
||||
func _init():
|
||||
id = "azazeldemon"
|
||||
npcHasMenstrualCycle = false
|
||||
npcCharacterType = CharacterType.Inmate
|
||||
|
||||
pickedSkin="AzazelSkin"
|
||||
pickedSkinRColor=Color("ff464545")
|
||||
pickedSkinGColor=Color("ff656465")
|
||||
pickedSkinBColor=Color("ff72005d")
|
||||
npcSkinData={
|
||||
"hair": {"r": Color("ff221310"),"g": Color("ff1f1514"),"b": Color("ff28000c"),},
|
||||
"horns": {"r": Color("ffa9a9a9"),"b": Color("ff606060"),},
|
||||
}
|
||||
npcPersonality = {
|
||||
PersonalityStat.Brat: -0.9,
|
||||
PersonalityStat.Mean: -1.0,
|
||||
PersonalityStat.Subby: 1.0,
|
||||
PersonalityStat.Impatient: 0.1,
|
||||
PersonalityStat.Naive: 1.0,
|
||||
PersonalityStat.Coward: -1.0,
|
||||
}
|
||||
npcLevel = 8
|
||||
npcBasePain = 80
|
||||
npcBaseLust = 80
|
||||
npcBaseStamina = 80
|
||||
npcDefaultFetishInterest = FetishInterest.Neutral
|
||||
|
||||
npcFetishes = {
|
||||
Fetish.AnalSexReceiving : FetishInterest.Loves,
|
||||
Fetish.AnalSexGiving : FetishInterest.Hates,
|
||||
Fetish.VaginalSexGiving : FetishInterest.Hates,
|
||||
Fetish.VaginalSexReceiving : FetishInterest.Loves,
|
||||
Fetish.OralSexReceiving : FetishInterest.Likes,
|
||||
Fetish.Sadism : FetishInterest.ReallyDislikes,
|
||||
Fetish.Masochism : FetishInterest.Likes,
|
||||
Fetish.UnconsciousSex : FetishInterest.Hates,
|
||||
Fetish.Breeding : FetishInterest.Hates,
|
||||
Fetish.BeingBred : FetishInterest.Loves,
|
||||
Fetish.Bondage : FetishInterest.Loves,
|
||||
Fetish.Rigging : FetishInterest.Likes,
|
||||
Fetish.Condoms : FetishInterest.Dislikes,
|
||||
Fetish.DrugUse : FetishInterest.Loves,
|
||||
Fetish.Exhibitionism : FetishInterest.Loves,
|
||||
Fetish.Tribadism : FetishInterest.Dislikes,
|
||||
Fetish.StraponSexVaginal : FetishInterest.Dislikes,
|
||||
Fetish.StraponSexAnal : FetishInterest.SlightlyDislikes,
|
||||
Fetish.Choking : FetishInterest.SlightlyDislikes,
|
||||
Fetish.HypnosisSubject : FetishInterest.Loves,
|
||||
}
|
||||
npcLustInterests = {
|
||||
InterestTopic.TallyMarks: Interest.ReallyLikes,
|
||||
InterestTopic.Bodywritings: Interest.ReallyLikes,
|
||||
InterestTopic.Gags: Interest.Neutral,
|
||||
InterestTopic.Blindfolds: Interest.KindaLikes,
|
||||
InterestTopic.BDSMRestraints: Interest.Loves,
|
||||
InterestTopic.ButtPlugs: Interest.Neutral,
|
||||
InterestTopic.VaginalPlugs: Interest.Neutral,
|
||||
InterestTopic.FeminineBody: Interest.KindaLikes,
|
||||
InterestTopic.AndroBody: Interest.Loves,
|
||||
InterestTopic.MasculineBody: Interest.ReallyLikes,
|
||||
InterestTopic.ThickBody: Interest.Dislikes,
|
||||
InterestTopic.SlimBody: Interest.Loves,
|
||||
InterestTopic.AverageMassBody: Interest.ReallyLikes,
|
||||
InterestTopic.BigBreasts: Interest.Hates,
|
||||
InterestTopic.LactatingBreasts: Interest.KindaLikes,
|
||||
InterestTopic.StuffedPussy: Interest.Likes,
|
||||
InterestTopic.StuffedPussyOrAss: Interest.KindaLikes,
|
||||
InterestTopic.Pregnant: Interest.Loves,
|
||||
InterestTopic.StuffedThroat: Interest.ReallyLikes,
|
||||
InterestTopic.CoveredInCum: Interest.ReallyLikes,
|
||||
InterestTopic.CoveredInLotsOfCum: Interest.Loves,
|
||||
InterestTopic.FullyNaked: Interest.Loves,
|
||||
InterestTopic.ExposedPussy: Interest.Dislikes,
|
||||
InterestTopic.ExposedAnus: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedBreasts: Interest.Hates,
|
||||
InterestTopic.ExposedCock: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedPanties: Interest.Neutral,
|
||||
InterestTopic.ExposedBra: Interest.Neutral,
|
||||
InterestTopic.LooseAnus: Interest.Neutral,
|
||||
InterestTopic.LoosePussy: Interest.Neutral,
|
||||
InterestTopic.TightAnus: Interest.Likes,
|
||||
InterestTopic.TightPussy: Interest.Likes,
|
||||
InterestTopic.BigCock: Interest.KindaLikes,
|
||||
InterestTopic.AverageCock: Interest.Loves,
|
||||
InterestTopic.SmallCock: Interest.Likes
|
||||
}
|
||||
|
||||
func updateBodyparts():
|
||||
addEffect(StatusEffect.TaviWombMark) # Not Tavi though womb mark was in Azazel's character design before I realized we have this effect lol
|
||||
|
||||
func _getName():
|
||||
return "Demonic 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.Demon, Species.Feline]
|
||||
|
||||
func getThickness() -> int:
|
||||
return 0
|
||||
|
||||
func getFemininity() -> int:
|
||||
return 67
|
||||
|
||||
func createBodyparts():
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("felinehead"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("combedbackhair"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("demonhorns2"))
|
||||
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"))
|
||||
var tail = GlobalRegistry.createBodypart("demontail")
|
||||
tail.tailScale = 1.9
|
||||
giveBodypartUnlessSame(tail)
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("hoofs"))
|
||||
skillsHolder.addPerk(Perk.FertilityBroodmother)
|
||||
skillsHolder.addPerk(Perk.FertilityBetterOvulation)
|
||||
skillsHolder.addPerk(Perk.FertilityBetterOvulationV2)
|
||||
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)
|
||||
|
||||
func getBirthWaitTime():
|
||||
return 60*60*24*3
|
||||
|
||||
func getDefaultEquipment():
|
||||
return ["inmatecollarbell"]
|
|
@ -0,0 +1,192 @@
|
|||
extends SceneBase
|
||||
|
||||
const Globals = preload("res://Modules/IssixModule/Globals.gd")
|
||||
|
||||
var hadVagina = false
|
||||
|
||||
func _init():
|
||||
sceneID = "DemonAzazelTalk"
|
||||
|
||||
func _run():
|
||||
if(state == ""):
|
||||
addCharacter("azazeldemon")
|
||||
saynn("Azazel sits atop of his small throne chair, not in dignified way, his ass is on its edge and his back bent between chair's support and base, he looks as if he has been bored to death by someone's long monologue. This position means his pussy and ass are on the display.")
|
||||
addButton("Talk", "Talk to Azazel", "talk")
|
||||
addButton("Appearance", "Check kitty's appearance", "appearance")
|
||||
if Globals.checkIfAchieved("Azazel_Corr_Dream_State", "Talked_With_Azazel"):
|
||||
if Globals.checkIfAchieved("Azazel_Corr_Dream_State", "Got_Azazels_Permission"):
|
||||
addDisabledButton("Better", "There is nothing more to be gained in here, move on")
|
||||
else:
|
||||
addButton("Better", "Become an ideal Master pet", "better")
|
||||
|
||||
if state == "talk":
|
||||
saynn("[say=pc]A-azazel? You look like him though... The colors and the tail...[/say]")
|
||||
saynn("[say=azazeldemon]Hehe. Welcome, little „morsel”.[/say]")
|
||||
saynn("[say=pc]Are you Azazel? Where, what is this place?[/say]")
|
||||
saynn("[say=azazeldemon]Curiosity killed the "+Util.getSpeciesName(GM.pc.getSpecies())+".[/say]")
|
||||
saynn("He laughs")
|
||||
saynn("[say=azazeldemon]Am I Azazel? Who's to say. What makes Azazel Azazel? Do I check all the boxes?... Probably not. I'm part of Azazel, but I'm not whole.[/say]")
|
||||
saynn("[say=pc]What?[/say]")
|
||||
saynn("[say=azazeldemon]Doesn't matter. You asked what is this place, don't you recognize it? It's your home.[/say]")
|
||||
saynn("[say=pc]My home?[/say]")
|
||||
saynn("[say=azazeldemon]Yes, your home. One where you'll spend your entire life. One which you love, don't you?[/say]")
|
||||
saynn("[say=pc]But it's a prison cellblock.[/say]")
|
||||
saynn("[say=azazeldemon]Wrong. It's a paradise.[/say]")
|
||||
saynn("Azazel stands up from his throne. He is still as short as you remember him to be, he approaches you, his finger tracing your body.")
|
||||
saynn("[say=azazeldemon]You look like you could be better, more fitted for our Master. Give me a word and I'll make wonders with your body.[/say]")
|
||||
saynn("He comes back onto his throne, assuming same position as before.")
|
||||
addButton("Continue", "Seems like this conversation is over", "")
|
||||
|
||||
if state == "better":
|
||||
saynn("[say=azazeldemon]Lay on your back for me.[/say]")
|
||||
saynn("[say=pc]Here? On the floor? It's cold.[/say]")
|
||||
saynn("A blanket appears under your {pc.feet}.")
|
||||
saynn("[say=azazeldemon]Lay. On. Your. Back.[/say]")
|
||||
addButton("Comply", "Lie on your back", "talklay")
|
||||
addButton("Refuse", "Do not comply with Azazel's command", "talkrefuse")
|
||||
|
||||
if state == "talkrefuse":
|
||||
saynn("[say=azazeldemon]This wasn't a request, it was an order. I'm not the one to instill loyalty into you, but... I think we could do with you being a bit more obedient.[/say]")
|
||||
saynn("He approaches you. At first you try ta take a step back but... You can't. His eyes look so beautiful. Purple eyes with such a pretty glow. Azazel puts two of his paw fingers on your forehead.")
|
||||
saynn("[say=azazeldemon][corrupt]Azeryūze[/corrupt][/say]")
|
||||
|
||||
saynn("Instantly as he finishes saying the word that you didn't understand, you felt different. You can't say what changed, but it felt significant.")
|
||||
saynn("[say=azazeldemon]Lay on the ground for me.[/say]")
|
||||
saynn("As he said that, you did. He is AZAZEL.")
|
||||
addButton("Comply", "Comply with Azazel's order", "talklay")
|
||||
|
||||
if state == "talklay":
|
||||
saynn("You comply with Azazel's order, his purple eyes glowing with intense color making you oblige.")
|
||||
|
||||
saynn("[say=azazeldemon]Good "+Globals.getPlayerPetName()+".[/say]")
|
||||
if GM.pc.hasPenis():
|
||||
saynn("[say=azazeldemon]Master doesn't need more pets with this thing.[/say]")
|
||||
saynn("He moves his hoof over your {pc.penis}, moving it around, pressing it. You feel hotness coming from his hoof.")
|
||||
if GM.pc.hasVagina():
|
||||
saynn("[say=azazeldemon]He needs more breeders, not those shitty flesh extensions. You already have what he wants, anything extra is unnecessary.[/say]")
|
||||
else:
|
||||
saynn("[say=azazeldemon]He needs more breeders, not those shitty flesh extensions. Only way to extend his blood line.[/say]")
|
||||
if !GM.pc.hasPenis() and !GM.pc.hasVagina():
|
||||
saynn("[say=azazeldemon]You have nothing there. This cannot be. Master needs breeders, you are useless like that.[/say]")
|
||||
if GM.pc.hasVagina() and !GM.pc.hasPenis():
|
||||
saynn("He smiles while he looks at you. Next, he says purring.")
|
||||
saynn("[say=azazeldemon]You'll be perfect for the Master. A breedable fuck pet, just as you should be.[/say]")
|
||||
|
||||
saynn("[say=azazeldemon]But you are missing a few things...[/say]")
|
||||
addButton("Continue", "See what Azazel has in store for you", "azazeltattoo")
|
||||
else:
|
||||
saynn("[say=azazeldemon]I'll remold you into Master's fuck pet. I'll make you actually useful.[/say]")
|
||||
saynn("He kneels next to your laying body and moves his paws around your "+("penis" if GM.hasPenis() else "crotch area")+ ". You can feel small tingling near that area.")
|
||||
addButton("Allow", "Allow Azazel to do whatever he intends to do to you (non-permanent body modification)", "allowbodymod")
|
||||
addButton("Resist", "Call the rest of your mental fortitude to resist Azazel's spell", "denybodymod")
|
||||
|
||||
if state == "allowbodymod":
|
||||
if GM.pc.hasPenis():
|
||||
saynn("You allow Azazel to do whatever he wants. Shortly after you feel even more heat concentrated on your {pc.penis} as well as arousal to level you've never felt. Your {pc.penis} gets instantly hard.")
|
||||
saynn("[say=pc]Aahhhh![/say]")
|
||||
saynn("You moan out.")
|
||||
saynn("[say=azazeldemon]Perfect. You just need to cum now my little lamb, cum. It will free you from the little masculinity you have left there. You won't need it where you are going. All you need is to be a nice little breedable "+Globals.getPlayerPetName()+" for our strong and virile Master, okey? So just let it go.[/say]")
|
||||
saynn("Words of the demon feline continue to affect you, feeling like honey, smooth and full of reason. That's the only thing that matters right now, is to do what he says and be a better vessel for Master's children. To be his broodmother, to leave being a stud behind and embrace a new you. Azazel massages your hard {pc.penis} as you approach your breaking point.")
|
||||
addButton("Cum", "Give in, cum", "cumafterpenis")
|
||||
else:
|
||||
saynn("You allow Azazel to do whatever he wants. Shortly after you feel even more heat concentrated on your crotch, feelings you've never felt there before, arousal climbing to level you've never felt.")
|
||||
saynn("[say=pc]Aahhhh![/say]")
|
||||
saynn("You moan out.")
|
||||
saynn("[say=azazeldemon]Perfect. You are coming out wonderfully, embrace the feeling. It will give in to something completely new, something that our Master will love. All you need is to be a nice little breedable "+Globals.getPlayerPetName()+" for our strong and virile Master, okey? So just let this do its work and become his breeding stock.[/say]")
|
||||
saynn("Words of the demon feline continue to affect you, feeling like honey, smooth and full of reason. That's the only thing that matters right now, is to do what he says and be a better vessel for Master's children. To be his broodmother, to embrace a new you. Azazel massages your crotch as you approach your breaking point.")
|
||||
|
||||
saynn("Eventually you reach your breaking point and feeling of Azazel's paw fingers on your crotch shifts into completely new feeling of him sinking his paw fingers [i]into[/i] you. The completely new feeling of being filled it's... Euphoric.")
|
||||
saynn("[say=azazeldemon]Good. Good. You are almost perfect now, we just need a finishing touch and you'll be ready.[/say]")
|
||||
saynn("Your hands reach to your new sex and start fingering it, you can't resist testing the new feeling, exploring something so completely different and so good.")
|
||||
addButton("Continue", "Continue to finger yourself", "azazeltattoo")
|
||||
|
||||
if state == "cumafterpenis":
|
||||
if hadVagina:
|
||||
saynn("You reach your peak and start cumming. It's probably your most „productive” milking in your life, and from the looks of it, it's also the last one. You look as your throbbing nugget of a penis reclines into your body leaving only your other sex for use, sealing your fate as Master's breeding bitch.")
|
||||
|
||||
saynn("[say=azazeldemon]Wonderful job, life is better without that pesky sack of flesh. You can enjoy your life with just pussy, that's all you'll ever need. Now, there is still a few more things to do here before I can let you go.[/say]")
|
||||
else:
|
||||
saynn("You reach your peak and start cumming. It's probably your most „productive” milking in your life, and from the looks of it, it's also the last one. You look as your throbbing nugget of a penis reclines into your body and a new body part appears. It's small, but you have no issues recognizing what is your new sex.")
|
||||
saynn("[say=azazeldemon]Feels good, doesn't it? Life is better without that pesky sack of flesh. You can enjoy your life with just pussy, that's all you'll ever need. Now, there is still a few more things to do here before I can let you go.[/say]")
|
||||
saynn("Your hands reach to your new sex and start fingering it, the completely new feeling of being filled is so overwhelmingly good, you feel like you've been missing out your entire life! You can't resist testing the new feeling, exploring something so completely different and so good.")
|
||||
addButton("Continue", "Continue to finger yourself", "azazeltattoo")
|
||||
|
||||
if state == "denybodymod":
|
||||
saynn("[say=pc]I don't know what you are plotting, but I don't want you to do anything to me![/say]")
|
||||
saynn("[say=azazeldemon]Your role is to obey, you will let me do what I want, now...[/say]")
|
||||
saynn("He continues touching you and while you do get more aroused by him stimulating your crotch, not much happens besides that. He is concentrating... Something, but that's about it.")
|
||||
saynn("[say=azazeldemon]Ughhh. Fine, you are too stubborn. Have it your way. I can't remold you like this. Mph![/say]")
|
||||
|
||||
saynn("[say=pc]Am I free to go now?[/say]")
|
||||
saynn("[say=azazeldemon]Sure, whatever. See you later, can't wait to see how the collar fits you.[/say]")
|
||||
saynn("Collar! You realize that you don't have any! Are you... Free? How did it happen? Why does Azazel look like this, and what did he mean by being „part of Azazel”? You think as the sulking demon cat came back to sit on his chair, avoiding eye contact with you, clearly annoyed by your response.")
|
||||
saynn("[say=pc]T-thanks. I'll go.[/say]")
|
||||
addButton("Leave", "Leave", "endthescene")
|
||||
|
||||
if state == "azazeltattoo":
|
||||
saynn("[say=azazeldemon]A good breeder must be ready for everything. A good breeder should be appropriately marked and be available at Master's command. I want to make you a perfect breeder, a perfect toy for the Master to break.[/say]")
|
||||
saynn("His paw finger once again hovers over you, this time it's above your {pc.vagina}. Once again, immense heat radiates from where Azazel's paw is, you look at this scene with bewilderment as a new something appears there - a womb tatoo, with each second the lines continue to appear permanenting the sigil inside your skin, the red heart inside takes shape, the dark red shape streaches with tubes connecting the central heart with ovaries - signifying your fertility and advertising yourself as breeding partner. Azazel's mischievous smile appears on his face, he runs his finger over your new tattoo, it feels so good.")
|
||||
saynn("[say=azazeldemon]This will keep you in service, it will keep you docile, receptive, it will show everyone who you are. When you are pregnant, it will glow. You will be a good mother {pc.girl}.[/say]")
|
||||
|
||||
saynn("[say=azazeldemon]Now go, I'll see you soon.[/say]")
|
||||
addButton("Leave", "Stand up, leave, probably masturbate a little too", "endthescene")
|
||||
|
||||
|
||||
func getDevCommentary():
|
||||
return ""
|
||||
|
||||
func hasDevCommentary():
|
||||
return false
|
||||
|
||||
func saveData():
|
||||
var data = .saveData()
|
||||
|
||||
data["hadvag"] = hadVagina
|
||||
|
||||
return data
|
||||
|
||||
func loadData(data):
|
||||
.loadData(data)
|
||||
|
||||
hadVagina = SAVE.loadVar(data, "hadvag", false)
|
||||
|
||||
|
||||
func _react(_action: String, _args):
|
||||
if _action == "talklay":
|
||||
Globals.modifyDictStates("Azazel_Corr_Dream_State", "Got_Molded_By_Azazel", true)
|
||||
|
||||
if _action == "azazeltattoo":
|
||||
GM.pc.addEffect(StatusEffect.TaviWombMark)
|
||||
GM.pc.forceIntoHeat()
|
||||
|
||||
if _action == "cumafterpenis":
|
||||
GlobalRegistry.getCharacter("azazeldemon").cummedOnBy("pc", FluidSource.Penis, 1.2)
|
||||
GM.pc.cummedOnBy("pc", FluidSource.Penis, 0.3)
|
||||
# Bye bye
|
||||
GM.pc.removeBodypart(BodypartSlot.Penis)
|
||||
if !GM.pc.hasVagina():
|
||||
var vagina = GlobalRegistry.createBodypart("vagina")
|
||||
GM.pc.giveBodypartUnlessSame(vagina)
|
||||
else:
|
||||
hadVagina = true
|
||||
|
||||
if _action == "allowbodymod":
|
||||
if GM.pc.hasPenis():
|
||||
var penis = GM.pc.getBodypart(BodypartSlot.Penis)
|
||||
penis.applyAttribute("cocksize", penis.getLength()*0.25)
|
||||
penis.applyAttribute("ballsscale", 0.3)
|
||||
else:
|
||||
var vagina = GlobalRegistry.createBodypart("vagina")
|
||||
GM.pc.giveBodypartUnlessSame(vagina)
|
||||
|
||||
if _action == "better":
|
||||
Globals.modifyDictStates("Azazel_Corr_Dream_State", "Got_Azazels_Permission", true)
|
||||
|
||||
if _action == "talk":
|
||||
Globals.modifyDictStates("Azazel_Corr_Dream_State", "Talked_With_Azazel", true)
|
||||
|
||||
if(_action == "endthescene"):
|
||||
endScene()
|
||||
return
|
||||
|
||||
setState(_action)
|
|
@ -0,0 +1,101 @@
|
|||
extends SceneBase
|
||||
|
||||
func _init():
|
||||
sceneID = "DemonHiisiTalk"
|
||||
|
||||
func _run():
|
||||
if(state == ""):
|
||||
addCharacter("hiisidemon")
|
||||
saynn("Muscular canine body sits a top of a throne placed at the end of the hallway. The dog is residing higher than you, their posture confident, indifferent.")
|
||||
addButton("Talk", "Talk to Hiisi", "talk")
|
||||
if Globals.checkIfAchieved("Azazel_Corr_Dream_State", "Talked_With_Hiisi"):
|
||||
addButton("Learn", "Learn from Hiisi about how the pet should behave", "learn")
|
||||
|
||||
if state == "talk":
|
||||
saynn("[say=pc]Hello Hiisi/[/say]")
|
||||
saynn("[say=hiisidemon]A fly caught in spider's web, how... Tragic.[/say]")
|
||||
saynn("[say=pc]Huh?[/say]")
|
||||
saynn("[say=hiisidemon]Sometimes I wonder who really is the devil - the one who treats free will as sacred, or the one who corrupts the very meaning of freedom, who wants others to follow in his footsteps leading to downfall.[/say]")
|
||||
if GM.pc.getPersonality().getStat(PersonalityStat.Naive) > 0:
|
||||
saynn("[say=pc]I have no idea what you are talking about, but I think the former is the nicer guy.[/say]")
|
||||
saynn("[say=hiisidemon]And yet-. Ah, who cares, the fate is determined already. Yes, yes, I can see you. Welcome {pc.name}.[/say]")
|
||||
else:
|
||||
saynn("[say=pc]Perhaps those who follow the latter seek the downfall he brings. Perhaps they choose themselves to be eternally damned.[/say]")
|
||||
saynn("Hiisi raises his eyebrows at your statement. He falls into deep thought.")
|
||||
saynn("[say=hiisidemon]That's... Illogical, and yet in the very essence is exactly what happens. The corruptor doesn't have power of his own, he draws it from those who allow themselves to be corrupted, he believes their downfall is their freedom and happiness. And for many - it is, in the wicked way.[/say]")
|
||||
saynn("[say=hiisidemon]Welcome {pc.name}, thank you for your food for thought.[/say]")
|
||||
|
||||
saynn("[say=hiisidemon]Let me tell you outright, I do not care whether you become Master's pet or not, it is of no concern to me. But considering you are here, I must teach you how a proper pet should behave. When you are ready to be taught, let me know.[/say]")
|
||||
addButton("Sure", "You will", "")
|
||||
|
||||
if state == "learn":
|
||||
playAnimation(StageScene.Duo, "allfours", {pc="pc", npc="hiisi"})
|
||||
saynn("[say=pc]I'm here to learn from you, Hiisi.[/say]")
|
||||
saynn("[say=hiisidemon]So be it. On fours then. A pet should know how to walk and how to keep balance on their fours. Crawl on the floor for me like this.[/say]")
|
||||
saynn("You stand on your fours, it isn't particularly difficult, though it gets tiring really quickly.")
|
||||
saynn("[say=hiisidemon]You'll have to learn how to crawl like this without consuming too much energy, not easy but requires practice. You'll work on it in your own time.[/say]")
|
||||
saynn("[say=hiisidemon]You already know how to listen to commands, but commands are important part of being a pet. To listen to commands you must obey your Master and trust them. Do you trust your Master?[/say]")
|
||||
saynn("You nod.")
|
||||
saynn("[say=hiisidemon]Will you obey your Master?[/say]")
|
||||
saynn("You nod again.")
|
||||
saynn("[say=hiisidemon]Good.[/say]")
|
||||
saynn("A bone shaped treat materializes out of nowhere in his paw, he shows it to you.")
|
||||
saynn("[say=hiisidemon]Now, beg for it.[/say]")
|
||||
addButton("Beg", "Beg for the treat (clicker training)", "beg")
|
||||
addButton("Refuse", "Refuse to beg", "refusebeg")
|
||||
|
||||
if state == "refusebeg":
|
||||
saynn("[say=pc]I refuse.[/say]")
|
||||
saynn("[say=hiisidemon]You refuse? You refuse to be trained and beg when Master so desires? Why?[/say]")
|
||||
saynn("[say=pc]That would be stooping too low for me.[/say]")
|
||||
saynn("[say=hiisidemon]Judging from you being in this domain, you are already in the deep. But so be it, like I said, it's not my concern what happens next. I were to try and teach you, but if student is unwilling, this entire exercise is pointless. Go now, Leave me be.[/say]")
|
||||
addButton("Leave", "", "endthescene")
|
||||
|
||||
if state == "beg":
|
||||
playAnimation(StageScene.Beg, "beg", {pc="pc", npc="hiisi"})
|
||||
saynn("Without giving it any thought you kneel on your twos and curl your paws obediently begging Hiisi for his treat, you hear a click from all around, it makes you happy.")
|
||||
saynn("[say=hiisidemon]See? It comes to you instinctively now. That's how it should be.[/say]")
|
||||
addButton("Catch", "Catch the treat", "catch")
|
||||
|
||||
if state == "catch":
|
||||
playAnimation(StageScene.Beg, "pat", {pc="pc", npc="hiisi"})
|
||||
saynn("Hiisi throws a treat at you and you catch it with your mouth.")
|
||||
saynn("[say=hiisidemon]Good {pc.boy}.[/say]")
|
||||
saynn("You repeat begging a few more times, and nail it perfectly each.")
|
||||
addButton("Continue", "Continue the exercises", "sitlay")
|
||||
|
||||
if state == "sitlay":
|
||||
playAnimation(StageScene.Duo, "kneel", {pc="pc", npc="hiisi"})
|
||||
saynn("[say=hiisidemon]Sit.[/say]")
|
||||
saynn("You follow his command immediately, hearing a click and feeling rushing endorphins in your blood. It's really your nature now. You don't know when it happened, when did a switch get flipped to make you so receptive to commands, how did that even happen? Right now, no matter what kind of command gets out of Hiisi's mouth you follow it without thinking.")
|
||||
saynn("[say=hiisidemon]Lay.[/say]")
|
||||
saynn("You ley on your belly in front of Hiisi. It's this click again. It's a sign you did good job. It's a sign you are a good {pc.boy}.")
|
||||
saynn("[say=hiisidemon]Sit.[/say]")
|
||||
saynn("And so you are sitting, once again. Hearing the same clicking sound. You no longer want to know where it comes from, you simply know its there and when its there everything is good. You feel good. You want to hear more of it. You want to obey your Master, you know it will lead to more clicks, you know you will be rewarded, maybe not always by something physical, even praise will do for you. You want to be a good {pc.boy}. This is something you crave, that you need for your continued existence.")
|
||||
saynn("Hiisi continues his training, which goes on for a little bit, many clicks later, your brain feeling so fuzzy but so good, he announces the training session is over, and you are trained.")
|
||||
saynn("[say=hiisidemon]Wonderful job. Master will be proud to have you as his pet. Now go, we will see each other soon.[/say]")
|
||||
addButton("Leave", "Training session is over", "endthescene")
|
||||
|
||||
|
||||
func getDevCommentary():
|
||||
return ""
|
||||
|
||||
func hasDevCommentary():
|
||||
return false
|
||||
|
||||
|
||||
func _react(_action: String, _args):
|
||||
if _action == "learn":
|
||||
Globals.modifyDictStates("Azazel_Corr_Dream_State", "Got_Hiisis_Permission", true)
|
||||
|
||||
if _action == "sitlay":
|
||||
Globals.modifyDictStates("Azazel_Corr_Dream_State", "Trained_With_Hiisi", true)
|
||||
|
||||
if _action == "talk":
|
||||
Globals.modifyDictStates("Azazel_Corr_Dream_State", "Talked_With_Hiisi", true)
|
||||
|
||||
if(_action == "endthescene"):
|
||||
endScene()
|
||||
return
|
||||
|
||||
setState(_action)
|
|
@ -0,0 +1,32 @@
|
|||
extends SceneBase
|
||||
|
||||
func _init():
|
||||
sceneID = "DemonLamiaTalk"
|
||||
|
||||
func _run():
|
||||
if(state == ""):
|
||||
addCharacter("lamiademon")
|
||||
saynn("You face Lamia. A fiery fox simply sits atop of a burning blanket, which doesn't seem to concern the fox at all. On the blanket, next to them lies a jar filled with water and many dark segmented worms swimming around and sticking to the glass with their circular opening of the body. On three walls surrounding them are countless drawings decorating the walls, you can see a few pentagrams, horned creatures, fiery hells.")
|
||||
addButton("Talk", "Talk with the fox", "talk")
|
||||
if true:
|
||||
addButton("Speech", "Learn how to speak like a good pet does", "learn")
|
||||
|
||||
if state == "talk":
|
||||
saynn("[say=pc]Hello Lamia, umm, how are you?[/say]")
|
||||
saynn("Lamia gives you thumbs up.")
|
||||
|
||||
func getDevCommentary():
|
||||
return ""
|
||||
|
||||
func hasDevCommentary():
|
||||
return false
|
||||
|
||||
|
||||
func _react(_action: String, _args):
|
||||
|
||||
|
||||
if(_action == "endthescene"):
|
||||
endScene()
|
||||
return
|
||||
|
||||
setState(_action)
|
|
@ -0,0 +1,38 @@
|
|||
extends EventBase
|
||||
|
||||
func _init():
|
||||
id = "DemonPetsEvent"
|
||||
|
||||
func registerTriggers(es):
|
||||
es.addTrigger(self, Trigger.EnteringRoom, "petsdream_cellblock_orange_playercell")
|
||||
es.addTrigger(self, Trigger.EnteringRoom, "petsdream_cellblock_red_playercell")
|
||||
es.addTrigger(self, Trigger.EnteringRoom, "petsdream_cellblock_pink_playercell")
|
||||
es.addTrigger(self, Trigger.EnteringRoom, "petsdream_cellblock_nearcells")
|
||||
|
||||
func run(_triggerID, _args):
|
||||
match GM.pc.getLocation():
|
||||
"petsdream_cellblock_orange_playercell":
|
||||
addButton("Lamia", "Talk to Lamia", "lamia")
|
||||
"petsdream_cellblock_red_playercell":
|
||||
addButton("Hiisi", "Talk to Hiisi", "hiisi")
|
||||
"petsdream_cellblock_pink_playercell":
|
||||
addButton("Azazel", "Talk to Azazel", "azazel")
|
||||
"petsdream_cellblock_nearcells":
|
||||
if(OPTIONS.isContentEnabled(ContentType.Watersports)):
|
||||
saynn("In the center here you see a fountain like structure, except the yellow fluid that reaches its base and drains into the metallic crates falls from the ceiling instead of being ejected from the ground like in all other fountains you've seen. The yellow fluid is very strong in smell.")
|
||||
else:
|
||||
saynn("In the center here you see a fountain like structure, except the transparent fluid that reaches its base and drains into the metallic crates falls from the ceiling instead of being ejected from the ground like in all other fountains you've seen.")
|
||||
addButton("Shower", "Go on the fountain and meet wet embrace of whatever falls from the ceiling", "fountain")
|
||||
|
||||
func getPriority():
|
||||
return 0
|
||||
|
||||
func onButton(_method, _args):
|
||||
if(_method == "lamia"):
|
||||
runScene("DemonLamiaTalk")
|
||||
if(_method == "hiisi"):
|
||||
runScene("DemonHiisiTalk")
|
||||
if(_method == "azazel"):
|
||||
runScene("DemonAzazelTalk")
|
||||
if _method == "fountain":
|
||||
runScene("AzazelDreamFountainScene")
|
|
@ -0,0 +1,18 @@
|
|||
extends EventBase
|
||||
|
||||
func _init():
|
||||
id = "ForceWalkingAnimationEvent"
|
||||
|
||||
func registerTriggers(es):
|
||||
es.addTrigger(self, Trigger.EnteringRoom)
|
||||
|
||||
func run(_triggerID, _args):
|
||||
if GM.pc.getLocation().begins_with("petsdream"):
|
||||
GM.ui.getStage3d().play(StageScene.PuppySolo, "walk", {}, true, true)
|
||||
|
||||
|
||||
func getPriority():
|
||||
return 0
|
||||
|
||||
func onButton(_method, _args):
|
||||
pass
|
|
@ -0,0 +1,129 @@
|
|||
extends Character
|
||||
|
||||
# Hiisi is a relatively dominating character out of all three pets. He still has some HighSec energy in them
|
||||
|
||||
func _init():
|
||||
id = "hiisidemon"
|
||||
npcHasMenstrualCycle = false
|
||||
npcCharacterType = CharacterType.Inmate
|
||||
|
||||
pickedSkin="ArconSkin"
|
||||
pickedSkinRColor=Color("ffc53232")
|
||||
pickedSkinGColor=Color("ff7b7877")
|
||||
pickedSkinBColor=Color("ffff0303")
|
||||
npcSkinData={
|
||||
"hair": {"r": Color("ffff2b00"),"g": Color("ffb05745"),"b": Color("ff2288ab"),},
|
||||
"penis": {"r": Color("ff000000"),"g": Color("ff000000"),"b": Color("ff991a1a"),},
|
||||
}
|
||||
npcPersonality = {
|
||||
PersonalityStat.Brat: 0.9,
|
||||
PersonalityStat.Mean: 0.4,
|
||||
PersonalityStat.Subby: 1.0,
|
||||
PersonalityStat.Impatient: 0.9,
|
||||
PersonalityStat.Naive: -1.0,
|
||||
PersonalityStat.Coward: -1.0,
|
||||
}
|
||||
npcLevel = 25
|
||||
npcBasePain = 250
|
||||
npcBaseLust = 250
|
||||
npcBaseStamina = 200
|
||||
npcDefaultFetishInterest = FetishInterest.Neutral
|
||||
npcFetishes = {
|
||||
Fetish.AnalSexReceiving : FetishInterest.ReallyDislikes,
|
||||
Fetish.AnalSexGiving : FetishInterest.Likes,
|
||||
Fetish.VaginalSexGiving : FetishInterest.Likes,
|
||||
Fetish.OralSexReceiving : FetishInterest.Likes,
|
||||
Fetish.OralSexGiving : FetishInterest.SlightlyDislikes,
|
||||
Fetish.Sadism : FetishInterest.Likes,
|
||||
Fetish.Masochism : FetishInterest.Hates,
|
||||
Fetish.UnconsciousSex : FetishInterest.Likes,
|
||||
Fetish.Bondage : FetishInterest.Likes,
|
||||
Fetish.Rigging : FetishInterest.Likes,
|
||||
Fetish.Breeding : FetishInterest.Dislikes,
|
||||
Fetish.Condoms : FetishInterest.Likes,
|
||||
Fetish.DrugUse : FetishInterest.SlightlyDislikes,
|
||||
Fetish.Tribadism : FetishInterest.Dislikes,
|
||||
Fetish.StraponSexVaginal : FetishInterest.Dislikes,
|
||||
Fetish.StraponSexAnal : FetishInterest.Dislikes,
|
||||
Fetish.Choking : FetishInterest.Likes,
|
||||
Fetish.HypnosisSubject : FetishInterest.Hates,
|
||||
Fetish.HypnosisHypnotist : 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.Likes,
|
||||
InterestTopic.AndroBody: Interest.Likes,
|
||||
InterestTopic.StuffedPussy: Interest.Likes,
|
||||
InterestTopic.StuffedPussyOrAss: Interest.KindaLikes,
|
||||
InterestTopic.StuffedThroat: Interest.Likes,
|
||||
InterestTopic.CoveredInCum: Interest.Dislikes,
|
||||
InterestTopic.CoveredInLotsOfCum: Interest.Dislikes,
|
||||
InterestTopic.FullyNaked: Interest.Likes,
|
||||
InterestTopic.ExposedPussy: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedAnus: Interest.ReallyLikes,
|
||||
InterestTopic.ExposedBreasts: Interest.Likes,
|
||||
InterestTopic.ExposedCock: Interest.KindaLikes,
|
||||
InterestTopic.ExposedPanties: Interest.Likes,
|
||||
InterestTopic.ExposedBra: Interest.Likes,
|
||||
InterestTopic.TightAnus: Interest.Likes,
|
||||
InterestTopic.TightPussy: Interest.Likes,
|
||||
InterestTopic.BigCock: Interest.Hates,
|
||||
}
|
||||
|
||||
|
||||
func _getName():
|
||||
return "Demonic Hiisi"
|
||||
|
||||
func getGender():
|
||||
return Gender.Male
|
||||
|
||||
func getSmallDescription() -> String:
|
||||
return "Wears an red uniform with number P-964."
|
||||
|
||||
func getSpecies():
|
||||
return [Species.Demon, 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"))
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("demonhorns"))
|
||||
var penis = GlobalRegistry.createBodypart("caninepenis")
|
||||
penis.lengthCM = 19
|
||||
penis.ballsScale = 1.2
|
||||
giveBodypartUnlessSame(penis)
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("anus"))
|
||||
var tail = GlobalRegistry.createBodypart("demontail")
|
||||
tail.tailScale = 1.25
|
||||
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)
|
||||
|
||||
func getBirthWaitTime():
|
||||
return 60*60*24*2
|
||||
|
||||
func getDefaultEquipment():
|
||||
return ["oldcollar", "Leotard", "sportyBriefs"]
|
|
@ -0,0 +1,138 @@
|
|||
extends Character
|
||||
|
||||
func _init():
|
||||
id = "lamiademon"
|
||||
npcHasMenstrualCycle = false
|
||||
npcCharacterType = CharacterType.Inmate
|
||||
|
||||
pickedSkin="DappledSkin"
|
||||
pickedSkinRColor=Color("ffca6702")
|
||||
pickedSkinGColor=Color("ffbb3e03")
|
||||
pickedSkinBColor=Color("ff9b2226")
|
||||
npcSkinData={
|
||||
"hair": {"r": Color("ff274fb9"),"g": Color("ff243770"),"b": Color("ff3022ab"),},
|
||||
"horns": {"r": Color("ff000000"),"g": Color("ff000000"),},
|
||||
"penis": {"r": Color("ff2b2a2a"),"g": Color("ff373232"),"b": Color("ff8b0000"),},
|
||||
"tail": {"skin": "WildSkin",},
|
||||
}
|
||||
npcPersonality = {
|
||||
PersonalityStat.Brat: -0.9,
|
||||
PersonalityStat.Mean: 0.4,
|
||||
PersonalityStat.Subby: 1.0,
|
||||
PersonalityStat.Impatient: 0.9,
|
||||
PersonalityStat.Naive: -1.0,
|
||||
PersonalityStat.Coward: -1.0,
|
||||
}
|
||||
npcDefaultFetishInterest = FetishInterest.Neutral
|
||||
npcLevel = 20
|
||||
npcBasePain = 180
|
||||
npcBaseLust = 1000
|
||||
npcBaseStamina = 100
|
||||
npcArmor = {
|
||||
DamageType.Lust: 100,
|
||||
}
|
||||
|
||||
npcFetishes = {
|
||||
Fetish.AnalSexReceiving : FetishInterest.ReallyDislikes,
|
||||
Fetish.AnalSexGiving : FetishInterest.Hates,
|
||||
Fetish.VaginalSexGiving : FetishInterest.Hates,
|
||||
Fetish.OralSexReceiving : FetishInterest.Dislikes,
|
||||
Fetish.OralSexGiving : FetishInterest.Dislikes,
|
||||
Fetish.Sadism : FetishInterest.Hates,
|
||||
Fetish.Masochism : FetishInterest.Hates,
|
||||
Fetish.UnconsciousSex : FetishInterest.Hates,
|
||||
Fetish.Breeding : FetishInterest.Hates,
|
||||
Fetish.Bondage : FetishInterest.Dislikes,
|
||||
Fetish.Rigging : FetishInterest.Dislikes,
|
||||
Fetish.Condoms : FetishInterest.Dislikes,
|
||||
Fetish.DrugUse : FetishInterest.Dislikes,
|
||||
Fetish.Exhibitionism : FetishInterest.Dislikes,
|
||||
Fetish.Tribadism : FetishInterest.SlightlyDislikes,
|
||||
Fetish.StraponSexVaginal : FetishInterest.Dislikes,
|
||||
Fetish.StraponSexAnal : FetishInterest.SlightlyDislikes,
|
||||
Fetish.Choking : FetishInterest.SlightlyDislikes,
|
||||
Fetish.HypnosisSubject : FetishInterest.Hates,
|
||||
Fetish.HypnosisHypnotist : FetishInterest.Hates,
|
||||
}
|
||||
npcLustInterests = {
|
||||
InterestTopic.TallyMarks: Interest.Dislikes,
|
||||
InterestTopic.Bodywritings: Interest.Dislikes,
|
||||
InterestTopic.Gags: Interest.Dislikes,
|
||||
InterestTopic.Blindfolds: Interest.Dislikes,
|
||||
InterestTopic.BDSMRestraints: Interest.Dislikes,
|
||||
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.Dislikes,
|
||||
InterestTopic.BigBreasts: Interest.Hates,
|
||||
InterestTopic.StuffedPussy: Interest.Dislikes,
|
||||
InterestTopic.StuffedPussyOrAss: Interest.Dislikes,
|
||||
InterestTopic.Pregnant: Interest.Dislikes,
|
||||
InterestTopic.StuffedThroat: Interest.Dislikes,
|
||||
InterestTopic.CoveredInCum: Interest.Dislikes,
|
||||
InterestTopic.CoveredInLotsOfCum: Interest.Dislikes,
|
||||
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.Dislikes,
|
||||
InterestTopic.LoosePussy: Interest.Dislikes,
|
||||
InterestTopic.TightAnus: Interest.Dislikes,
|
||||
InterestTopic.TightPussy: Interest.Dislikes,
|
||||
InterestTopic.BigCock: Interest.Hates,
|
||||
}
|
||||
|
||||
func _getName():
|
||||
return "Demonic Lamia"
|
||||
|
||||
func getGender():
|
||||
return Gender.Male
|
||||
|
||||
func getSmallDescription() -> String:
|
||||
return "Wears an orange uniform with number P-790."
|
||||
|
||||
func getSpecies():
|
||||
return [Species.Demon, 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 ["oldcollar", "Leotard", "sportyBriefs"]
|
||||
|
||||
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("demonhorns3"))
|
||||
var penis = GlobalRegistry.createBodypart("felinepenis")
|
||||
penis.lengthCM = 21
|
||||
penis.ballsScale = 1
|
||||
giveBodypartUnlessSame(penis)
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("anuswomb"))
|
||||
var tail = GlobalRegistry.createBodypart("demontail")
|
||||
tail.tailScale = 1.0
|
||||
giveBodypartUnlessSame(tail)
|
||||
giveBodypartUnlessSame(GlobalRegistry.createBodypart("digilegs"))
|
||||
skillsHolder.addPerk(Perk.StartInfertile)
|
||||
skillsHolder.addPerk(Perk.StartNoHeat)
|
26
Modules/IssixModule/Scenes/AzazelCorruption/StopsEvent.gd
Normal file
26
Modules/IssixModule/Scenes/AzazelCorruption/StopsEvent.gd
Normal file
|
@ -0,0 +1,26 @@
|
|||
extends EventBase
|
||||
|
||||
const Globals = preload("res://Modules/IssixModule/Globals.gd")
|
||||
|
||||
func _init():
|
||||
id = "StopPlayerFromLeavingDreamEvent"
|
||||
|
||||
func registerTriggers(es):
|
||||
es.addTrigger(self, Trigger.EnteringRoom, "petsdream_cellblock_corridor_part2")
|
||||
es.addTrigger(self, Trigger.EnteringRoom, "petsdream_cellblock_lilac_nearcell")
|
||||
|
||||
func run(_triggerID, _args):
|
||||
match GM.pc.getLocation():
|
||||
"petsdream_cellblock_corridor_part2":
|
||||
GM.ui.addDisabledButtonAt(6, "North", "You are being blocked")
|
||||
"petsdream_cellblock_lilac_nearcell":
|
||||
if !Globals.checkIfAchieved("Azazel_Corr_Dream_State", "Talked_With_Azazel"):
|
||||
GM.ui.addDisabledButtonAt(6, "North", "Large metal bars restrict you from going in that direction")
|
||||
|
||||
|
||||
|
||||
func getPriority():
|
||||
return 0
|
||||
|
||||
func onButton(_method, _args):
|
||||
pass
|
|
@ -121,9 +121,9 @@ func reward2():
|
|||
return item
|
||||
|
||||
func reward3():
|
||||
if getModuleFlag("IssixModule", "Got_Luck_Token_Before", false) == false:
|
||||
if getModuleFlag("IssixModule", "Got_Luck_Token_Before") == null:
|
||||
rewardItemDescription = "I've had this one in my bag for way too long. You can have it, I don't need it... Right, you probably are new to this. Been a while since I've done that, but I think there is still a single person in this prison who can exchange those tokens for credits for you. Try to look around, talk. Hopefully you'll find the one, I don't really care much for those credits."
|
||||
setModuleFlag("IssixModule", "Got_Luck_Token_Before", true)
|
||||
setModuleFlag("IssixModule", "Got_Luck_Token_Before", false)
|
||||
else:
|
||||
rewardItemDescription = "Another one of these? Where the hell do they come from? Here, have it."
|
||||
return GlobalRegistry.createItem("LuckToken")
|
||||
|
|
34
Modules/IssixModule/SpeechModifiers/PetTalk.gd
Normal file
34
Modules/IssixModule/SpeechModifiers/PetTalk.gd
Normal file
|
@ -0,0 +1,34 @@
|
|||
extends SpeechModifierBase
|
||||
|
||||
var petNoises = {Species.Canine: ["Woof", "Bark"], Species.Feline: ["Meow", "Mew"], Species.Equine: ["Neigh!"], Species.Unknown: ["Yip"]}
|
||||
var regex = RegEx.new()
|
||||
|
||||
func _init():
|
||||
id = "PetTalk"
|
||||
priority = 500
|
||||
regex.compile("([\\!\\.\\?]*)")
|
||||
|
||||
func appliesTo(_speaker: BaseCharacter) -> bool:
|
||||
return _speaker.hasEffect("PetLanguage") or _speaker.hasPerk("PetSpeech")
|
||||
|
||||
func modify(_text: String, _speaker: BaseCharacter) -> String:
|
||||
var species = petNoises[Species.Unknown]
|
||||
for single_species in _speaker.getSpecies():
|
||||
if single_species in species:
|
||||
species = petNoises[single_species]
|
||||
break
|
||||
var return_text = ""
|
||||
var split_text = _text.split(" ")
|
||||
for word in split_text:
|
||||
if RNG.chance(20): # Don't make a sound
|
||||
continue
|
||||
var addition = RNG.choice(species)
|
||||
if word.length() > addition:
|
||||
addition = word.substr(0, 0) + word[1].repeat(word.length()-addition.length()+1) + word.substr(2)
|
||||
var result = regex.search(word)
|
||||
return_text = return_text + " " + addition + (result.get_string() if result else "")
|
||||
if(GM.pc.hasPerk(Perk.BDSMGagTalk)):
|
||||
return return_text.dedent() +" ("+_text+")"
|
||||
else:
|
||||
return return_text.dedent()
|
||||
|
Loading…
Reference in a new issue