Countless fixes, hiisi scene, BDSM donation system, lamia dialogue
Fixed litter guessing minigame Fixed Hiisi's name dialogue being unavailable (#4) Fixed Lamia's logic error where player can lock themselves of being able to help Added donation system for player to donate their leftover BDSM gear and get something in return Added Hiisi's first scene
This commit is contained in:
parent
2ed81d7441
commit
e1f8dfbcd8
|
@ -1,25 +0,0 @@
|
|||
extends EventBase
|
||||
|
||||
func _init():
|
||||
id = "AzazelCorruptionAttemptEvent"
|
||||
|
||||
func registerTriggers(es):
|
||||
es.addTrigger(self, Trigger.EnteringRoom)
|
||||
|
||||
func react(_triggerID, _args):
|
||||
if not (GM.pc.getLocation().begins_with("main_hall") or (GM.pc.getLocation() in ["main_bathroom1"])) or GM.main.isVeryLate():
|
||||
return false
|
||||
if not (GM.main.getModuleFlag("IssixModule", "Azazel_Affection_given", 0) > 0 and GM.main.getModuleFlag("IssixModule", "Quest_Status", 0) < 1):
|
||||
return false
|
||||
if GM.main.getModuleFlag("IssixModule", "Azazel_Had_Corruption_Scene_Today", false) == false and RNG.chance(1.0):
|
||||
var scene_index = GM.main.getModuleFlag("IssixModule", "Azazel_Corruption_Scene", 1)
|
||||
if scene_index == -1 or scene_index > 3: # Player disabled corruption scenes or we ran out of them
|
||||
return false
|
||||
GM.main.setModuleFlag("IssixModule", "Azazel_Had_Corruption_Scene_Today", true)
|
||||
runScene("AzazelCorruption"+str(scene_index))
|
||||
return true
|
||||
return false
|
||||
|
||||
func getPriority():
|
||||
return 5
|
||||
|
65
Modules/IssixModule/Events/PetWanderEvent.gd
Normal file
65
Modules/IssixModule/Events/PetWanderEvent.gd
Normal file
|
@ -0,0 +1,65 @@
|
|||
extends EventBase
|
||||
|
||||
func _init():
|
||||
id = "AzazelCorruptionAttemptEvent"
|
||||
|
||||
func registerTriggers(es):
|
||||
es.addTrigger(self, Trigger.EnteringRoom)
|
||||
|
||||
func react(_triggerID, _args):
|
||||
if not (GM.pc.getLocation().begins_with("main_hall") or (GM.pc.getLocation() in ["main_bathroom1"])) or GM.main.isVeryLate():
|
||||
return false
|
||||
if GM.main.getModuleFlag("IssixModule", "Hiisi_Had_Encounter_Scene_Today", false) == false and RNG.chance(5.0):
|
||||
if activateHiisiScenes():
|
||||
return true
|
||||
if not (GM.main.getModuleFlag("IssixModule", "Quest_Status", 0) < 1): # Do not show those if player started the quest as Azazel doesn't have a reason to corrupt the player
|
||||
return false
|
||||
if activateAzazelScenes():
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
func activateHiisiScenes() -> bool:
|
||||
var scene_index = GM.main.getModuleFlag("IssixModule", "Hiisi_Encounter_scene", 1)
|
||||
if scene_index == -1 or GM.main.getModuleFlag("IssixModule", "Hiisi_Affection", -1) < scene_index*2 or scene_index > 2:
|
||||
return false
|
||||
if scene_index == 1: # Different conditions per Hiisi's scenes
|
||||
var pawns = findFreePawnsNearby()
|
||||
if pawns.size() > 1:
|
||||
GM.main.setModuleFlag("IssixModule", "Hiisi_Had_Encounter_Scene_Today", true)
|
||||
runScene("HiisiWanderScene1", [RNG.pick(pawns)])
|
||||
return true
|
||||
elif scene_index == 2:
|
||||
if GM.pc.getLocation() in ["main_bathroom1"]:
|
||||
return false
|
||||
var path = GM.world.calculatePath(GM.pc.getLocation(), "main_bathroom1")
|
||||
GM.main.setModuleFlag("IssixModule", "Hiisi_Had_Encounter_Scene_Today", true)
|
||||
GM.pc.setLocation(path[1])
|
||||
runScene("HiisiWanderScene2")
|
||||
return true
|
||||
return false
|
||||
|
||||
func activateAzazelScenes() -> bool:
|
||||
if GM.main.getModuleFlag("IssixModule", "Azazel_Had_Corruption_Scene_Today", false) == false and RNG.chance(2.0):
|
||||
var scene_index = GM.main.getModuleFlag("IssixModule", "Azazel_Corruption_Scene", 1)
|
||||
if scene_index == -1 or GM.main.getModuleFlag("IssixModule", "Azazel_Affection_given", -1) < scene_index*2 or scene_index > 3: # Player disabled corruption scenes, their affection score is too low or we ran out of them
|
||||
return false
|
||||
GM.main.setModuleFlag("IssixModule", "Azazel_Had_Corruption_Scene_Today", true)
|
||||
runScene("AzazelCorruption"+str(scene_index))
|
||||
return true
|
||||
return false
|
||||
|
||||
# Taken from PawnInteractionBase.gd
|
||||
func findFreePawnsNearby() -> Array:
|
||||
var result:Array = []
|
||||
|
||||
var pawns = GM.main.IS.getPawnsNear(GM.pc.getLocation(), 2)
|
||||
for pawn in pawns:
|
||||
if(!pawn.canBeInterrupted() or !pawn.isInmate() or pawn.isPlayer()):
|
||||
continue
|
||||
result.append(pawn.charID)
|
||||
return result
|
||||
|
||||
func getPriority():
|
||||
return 5
|
||||
|
150
Modules/IssixModule/Internal/InventoryScreenDonation.gd
Normal file
150
Modules/IssixModule/Internal/InventoryScreenDonation.gd
Normal file
|
@ -0,0 +1,150 @@
|
|||
# From UI/Inventory/InventoryScreen.gd
|
||||
|
||||
extends Control
|
||||
|
||||
onready var itemListContainer = $MarginContainer/HBoxContainer/VBoxContainer2/ScrollContainer/VBoxContainer2/VBoxContainer
|
||||
var inventoryEntry = preload("res://UI/Inventory/InventoryEntry.tscn")
|
||||
var inventoryGroupEntry = preload("res://UI/Inventory/InventoryGroupEntry.tscn")
|
||||
onready var itemNameLabel = $MarginContainer/HBoxContainer/VBoxContainer/Label
|
||||
onready var itemDescLabel = $MarginContainer/HBoxContainer/VBoxContainer/RichTextLabel
|
||||
onready var searchInput = $MarginContainer/HBoxContainer/VBoxContainer2/ScrollContainer/VBoxContainer2/SearchLineEdit
|
||||
|
||||
#var inventory: Inventory
|
||||
var itemsByGroup = {}
|
||||
var selectedItem: ItemBase
|
||||
var itemEntries = []
|
||||
var filterEnteries = []
|
||||
|
||||
signal onInteractWith(item)
|
||||
signal onInteractWithGroup(item)
|
||||
signal onItemSelected(item)
|
||||
|
||||
var currentMode = ""
|
||||
var isDonation = false
|
||||
var isEnchant = false
|
||||
|
||||
var shouldGrabInput = true
|
||||
|
||||
func _ready():
|
||||
if(shouldGrabInput && !OS.has_touchscreen_ui_hint()):
|
||||
searchInput.grab_focus()
|
||||
|
||||
#func setInventory(inv, isFight = false):
|
||||
#if(inventory != inv || isFightMode != isFight):
|
||||
# isFightMode = isFight
|
||||
# inventory = inv
|
||||
# updateInventory()
|
||||
|
||||
func setItems(newItems, theMode = "donation"):
|
||||
itemsByGroup = newItems
|
||||
currentMode = theMode
|
||||
isDonation = (theMode == "donation")
|
||||
isEnchant = (theMode == "enchant")
|
||||
updateInventory()
|
||||
filterInventory()
|
||||
|
||||
func filterInventory():
|
||||
var textToFilter = searchInput.text.to_lower()
|
||||
if(textToFilter == ""):
|
||||
for entry in filterEnteries:
|
||||
entry.visible = true
|
||||
return
|
||||
|
||||
for entry in filterEnteries:
|
||||
var nameToCheck = entry.getItem().getVisibleName().to_lower()
|
||||
|
||||
if(textToFilter in nameToCheck):
|
||||
entry.visible = true
|
||||
else:
|
||||
entry.visible = false
|
||||
|
||||
func updateInventory():
|
||||
Util.delete_children(itemListContainer)
|
||||
itemEntries = []
|
||||
filterEnteries = []
|
||||
|
||||
#if(inventory == null):
|
||||
# return
|
||||
|
||||
var theItemsGrouped = itemsByGroup#inventory.getItemsAndEquippedItemsTogetherGrouped()
|
||||
if(theItemsGrouped is Array):
|
||||
var newItemsGrouped = {}
|
||||
for item in theItemsGrouped:
|
||||
if(!newItemsGrouped.has(item.id)):
|
||||
newItemsGrouped[item.id] = [item]
|
||||
else:
|
||||
newItemsGrouped[item.id].append(item)
|
||||
theItemsGrouped = newItemsGrouped
|
||||
|
||||
for groupID in theItemsGrouped:
|
||||
var theItems = theItemsGrouped[groupID]
|
||||
|
||||
if(theItems.size() == 1):
|
||||
var item = theItems[0]
|
||||
var entry = inventoryEntry.instance()
|
||||
itemListContainer.add_child(entry)
|
||||
itemEntries.append(entry)
|
||||
filterEnteries.append(entry)
|
||||
entry.setItem(item, currentMode)
|
||||
|
||||
entry.connect("onInteractButtonPressed", self, "onEntryInteractButtonPressed")
|
||||
entry.connect("onItemSelected", self, "onEntrySelected")
|
||||
else:
|
||||
var newGroupEntry = inventoryGroupEntry.instance()
|
||||
itemListContainer.add_child(newGroupEntry)
|
||||
newGroupEntry.setItem(theItems[0], currentMode)
|
||||
filterEnteries.append(newGroupEntry)
|
||||
|
||||
newGroupEntry.connect("onInteractButtonPressed", self, "onGroupEntryInteractButtonPressed")
|
||||
# add entry to some group entries maybe here
|
||||
for item in theItems:
|
||||
var entry = inventoryEntry.instance()
|
||||
newGroupEntry.addEntry(entry)
|
||||
entry.setItem(item, currentMode)
|
||||
itemEntries.append(entry)
|
||||
|
||||
entry.connect("onInteractButtonPressed", self, "onEntryInteractButtonPressed")
|
||||
entry.connect("onItemSelected", self, "onEntrySelected")
|
||||
newGroupEntry.updateCollapsed()
|
||||
|
||||
updateSelectedHighlight()
|
||||
|
||||
func updateSelectedHighlight():
|
||||
for entry in itemEntries:
|
||||
if(entry.getItem() == selectedItem):
|
||||
entry.setSelected(true)
|
||||
else:
|
||||
entry.setSelected(false)
|
||||
|
||||
func updateSelectedInfo():
|
||||
if(selectedItem == null):
|
||||
itemNameLabel.text = "Pick an item"
|
||||
itemDescLabel.bbcode_text = ""
|
||||
return
|
||||
itemNameLabel.text = selectedItem.getStackName()
|
||||
itemDescLabel.bbcode_text = selectedItem.getVisibleDescription()
|
||||
|
||||
if isDonation:
|
||||
var price = selectedItem.getStackSellPrice()
|
||||
var priceStr = (str(price)+" credit") if price == 1 else (str(price)+" credits")
|
||||
itemDescLabel.bbcode_text += "\nSell value otherwise: " +priceStr
|
||||
if(selectedItem.getAmount() > 1):
|
||||
itemDescLabel.bbcode_text += " (for "+str(selectedItem.getAmount())+")"
|
||||
elif isEnchant:
|
||||
pass
|
||||
|
||||
func onEntryInteractButtonPressed(theItem):
|
||||
emit_signal("onInteractWith", theItem)
|
||||
|
||||
func onGroupEntryInteractButtonPressed(theItem):
|
||||
emit_signal("onInteractWithGroup", theItem)
|
||||
|
||||
func onEntrySelected(theItem):
|
||||
selectedItem = theItem
|
||||
updateSelectedInfo()
|
||||
updateSelectedHighlight()
|
||||
emit_signal("onItemSelected", selectedItem)
|
||||
|
||||
|
||||
func _on_SearchLineEdit_text_changed(_new_text):
|
||||
filterInventory()
|
112
Modules/IssixModule/Internal/InventoryScreenDonation.tscn
Normal file
112
Modules/IssixModule/Internal/InventoryScreenDonation.tscn
Normal file
|
@ -0,0 +1,112 @@
|
|||
[gd_scene load_steps=6 format=2]
|
||||
|
||||
[ext_resource path="res://UI/Inventory/InventoryEntry.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://Modules/IssixModule/Internal/InventoryScreenDonation.gd" type="Script" id=3]
|
||||
[ext_resource path="res://Fonts/Titillium-Regular.otf" type="DynamicFontData" id=4]
|
||||
|
||||
[sub_resource type="DynamicFontData" id=9]
|
||||
font_path = "res://Fonts/SourceCodePro/SourceCodePro-Regular.otf"
|
||||
|
||||
[sub_resource type="DynamicFont" id=1]
|
||||
size = 28
|
||||
outline_size = 2
|
||||
outline_color = Color( 0, 0, 0, 1 )
|
||||
use_mipmaps = true
|
||||
use_filter = true
|
||||
font_data = ExtResource( 4 )
|
||||
fallback/0 = SubResource( 9 )
|
||||
|
||||
[node name="InventoryScreen" type="Control"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
script = ExtResource( 3 )
|
||||
|
||||
[node name="ColorRect" type="ColorRect" parent="."]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
color = Color( 0.105882, 0.0588235, 0.258824, 1 )
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="."]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
custom_constants/margin_right = 4
|
||||
custom_constants/margin_top = 4
|
||||
custom_constants/margin_left = 4
|
||||
custom_constants/margin_bottom = 4
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"]
|
||||
margin_left = 4.0
|
||||
margin_top = 4.0
|
||||
margin_right = 1276.0
|
||||
margin_bottom = 716.0
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HBoxContainer"]
|
||||
margin_right = 422.0
|
||||
margin_bottom = 712.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="Label" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer"]
|
||||
margin_right = 422.0
|
||||
margin_bottom = 28.0
|
||||
custom_fonts/font = SubResource( 1 )
|
||||
text = "Pick an item"
|
||||
autowrap = true
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="MarginContainer/HBoxContainer/VBoxContainer"]
|
||||
margin_top = 32.0
|
||||
margin_right = 422.0
|
||||
margin_bottom = 36.0
|
||||
|
||||
[node name="RichTextLabel" type="RichTextLabel" parent="MarginContainer/HBoxContainer/VBoxContainer"]
|
||||
margin_top = 40.0
|
||||
margin_right = 422.0
|
||||
margin_bottom = 712.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
bbcode_enabled = true
|
||||
|
||||
[node name="VBoxContainer2" type="VBoxContainer" parent="MarginContainer/HBoxContainer"]
|
||||
margin_left = 426.0
|
||||
margin_right = 1272.0
|
||||
margin_bottom = 712.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_stretch_ratio = 2.0
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/HBoxContainer/VBoxContainer2"]
|
||||
margin_right = 846.0
|
||||
margin_bottom = 712.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="VBoxContainer2" type="VBoxContainer" parent="MarginContainer/HBoxContainer/VBoxContainer2/ScrollContainer"]
|
||||
margin_right = 846.0
|
||||
margin_bottom = 712.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="SearchLineEdit" type="LineEdit" parent="MarginContainer/HBoxContainer/VBoxContainer2/ScrollContainer/VBoxContainer2"]
|
||||
margin_right = 846.0
|
||||
margin_bottom = 24.0
|
||||
placeholder_text = "Search"
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HBoxContainer/VBoxContainer2/ScrollContainer/VBoxContainer2"]
|
||||
margin_top = 28.0
|
||||
margin_right = 846.0
|
||||
margin_bottom = 712.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="HBoxContainer" parent="MarginContainer/HBoxContainer/VBoxContainer2/ScrollContainer/VBoxContainer2/VBoxContainer" instance=ExtResource( 2 )]
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_right = 846.0
|
||||
margin_bottom = 64.0
|
||||
|
||||
[node name="HBoxContainer2" parent="MarginContainer/HBoxContainer/VBoxContainer2/ScrollContainer/VBoxContainer2/VBoxContainer" instance=ExtResource( 2 )]
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_top = 68.0
|
||||
margin_right = 846.0
|
||||
margin_bottom = 132.0
|
||||
|
||||
[connection signal="text_changed" from="MarginContainer/HBoxContainer/VBoxContainer2/ScrollContainer/VBoxContainer2/SearchLineEdit" to="." method="_on_SearchLineEdit_text_changed"]
|
44
Modules/IssixModule/Items/LuckToken.gd
Normal file
44
Modules/IssixModule/Items/LuckToken.gd
Normal file
|
@ -0,0 +1,44 @@
|
|||
extends ItemBase
|
||||
|
||||
func _init():
|
||||
id = "LuckToken"
|
||||
|
||||
func getVisibleName():
|
||||
return "Luck Token"
|
||||
|
||||
func getDescription():
|
||||
return "A flashy gold colored metal square with circular indention in the center, it weights quite a bit. According to Issix it may be possible to exchange it for something in the prison..."
|
||||
|
||||
func canUseInCombat():
|
||||
return false
|
||||
|
||||
func getPossibleActions():
|
||||
return []
|
||||
|
||||
func getPrice():
|
||||
return 0
|
||||
|
||||
func canSell():
|
||||
return false
|
||||
|
||||
func canCombine():
|
||||
return true
|
||||
|
||||
func tryCombine(_otherItem):
|
||||
return .tryCombine(_otherItem)
|
||||
|
||||
func getTags():
|
||||
return []
|
||||
|
||||
func getItemCategory():
|
||||
return ItemCategory.Generic
|
||||
|
||||
func saveData():
|
||||
var data = .saveData()
|
||||
return data
|
||||
|
||||
func loadData(data):
|
||||
.loadData(data)
|
||||
|
||||
func getInventoryImage():
|
||||
return "res://Modules/IssixModule/Items/Icons/lucktoken.png"
|
|
@ -48,6 +48,11 @@ func getFlags():
|
|||
"Azazel_Corruption_Scene": flag(FlagType.Number),
|
||||
"Azazel_Had_Corruption_Scene_Today": flag(FlagType.Bool),
|
||||
"Azazel_Agreed_Kiss": flag(FlagType.Bool),
|
||||
"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),
|
||||
|
||||
# Slavery related
|
||||
"PC_Enslavement_Role": flag(FlagType.Number),
|
||||
|
@ -100,7 +105,7 @@ func _init():
|
|||
"res://Modules/IssixModule/Events/IssixRegularSearch.gd",
|
||||
"res://Modules/IssixModule/Events/LamiaCellEvent.gd",
|
||||
"res://Modules/IssixModule/Events/TalkNovaEvent.gd",
|
||||
"res://Modules/IssixModule/Events/AzazelsCorruptionEvent.gd",
|
||||
"res://Modules/IssixModule/Events/PetWanderEvent.gd",
|
||||
]
|
||||
|
||||
scenes = [
|
||||
|
@ -126,6 +131,8 @@ 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/HiisiScenes/HiisiWanderScene.gd",
|
||||
"res://Modules/IssixModule/Scenes/IssixDonationScene.gd",
|
||||
]
|
||||
|
||||
characters = [
|
||||
|
@ -143,7 +150,8 @@ func _init():
|
|||
"res://Modules/IssixModule/Items/BellCollar.gd",
|
||||
"res://Modules/IssixModule/Items/CatnipItem.gd",
|
||||
"res://Modules/IssixModule/Items/ClosetMap.gd",
|
||||
"res://Modules/IssixModule/Items/CookieItem.gd" # I just felt like this game needs more variety in items, even if by themselves they don't do much
|
||||
"res://Modules/IssixModule/Items/CookieItem.gd", # I just felt like this game needs more variety in items, even if by themselves they don't do much
|
||||
"res://Modules/IssixModule/Items/LuckToken.gd"
|
||||
]
|
||||
|
||||
quests = [
|
||||
|
@ -213,9 +221,9 @@ static func getPlayerPetName():
|
|||
|
||||
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?
|
||||
GM.main.setModuleFlag("IssixModule", "Todays_Bred_Slave", "thischardoesntexist")
|
||||
return
|
||||
# if (int(GM.main.getDays()) % 2 == 0): # Breed only every second day?
|
||||
# GM.main.setModuleFlag("IssixModule", "Todays_Bred_Slave", "thischardoesntexist")
|
||||
# return
|
||||
var available_slaves = ['azazel', 'pc', 'hiisi']
|
||||
available_slaves.erase(GM.main.getModuleFlag("IssixModule", "Todays_Bred_Slave", "pc")) # Don't repeat same slave every day'
|
||||
var current_slave = RNG.pick(available_slaves)
|
||||
|
@ -224,13 +232,13 @@ func breedSlaveIfNpc():
|
|||
return # This will be handled by separate event
|
||||
current_slave = GM.main.getCharacter(current_slave)
|
||||
GlobalRegistry.getCharacter("issix").prepareForSexAsDom()
|
||||
if RNG.chance(5):
|
||||
current_slave.cummedInMouthBy("issix")
|
||||
if current_slave.hasVagina(): # azazel
|
||||
current_slave.cummedInVaginaBy("issix", FluidSource.Penis, 1.8)
|
||||
print("Azazel cummed in")
|
||||
if RNG.chance(40):
|
||||
current_slave.cummedInAnusBy("issix", FluidSource.Penis, 1.2)
|
||||
if RNG.chance(5):
|
||||
current_slave.cummedInMouthBy("issix")
|
||||
else: # hiisi
|
||||
print("Hiisi cummed in")
|
||||
current_slave.cummedInAnusBy("issix")
|
||||
|
@ -298,3 +306,4 @@ func resetFlagsOnNewDay(): # I apologize for abusing this hook, but startNewDay
|
|||
GM.main.setModuleFlag("IssixModule", "Trained_With_Hiisi_Combat", false)
|
||||
GM.main.setModuleFlag("IssixModule", "Azazel_Had_Corruption_Scene_Today", false)
|
||||
GM.main.setModuleFlag("IssixModule", "Hiisi_Helped_Today", false)
|
||||
GM.main.setModuleFlag("IssixModule", "Hiisi_Had_Encounter_Scene_Today", false)
|
||||
|
|
75
Modules/IssixModule/Scenes/HiisiScenes/HiisiWanderScene.gd
Normal file
75
Modules/IssixModule/Scenes/HiisiScenes/HiisiWanderScene.gd
Normal file
|
@ -0,0 +1,75 @@
|
|||
extends SceneBase
|
||||
|
||||
var pawnID := ""
|
||||
var pawn = null
|
||||
|
||||
func _init():
|
||||
sceneID = "HiisiWanderScene1"
|
||||
|
||||
func _initScene(_args = []):
|
||||
pawnID = _args[0]
|
||||
pawn = GlobalRegistry.getCharacter(pawnID)
|
||||
GM.main.IS.getPawn(pawnID).setLocation(GM.pc.getLocation())
|
||||
|
||||
func resolveCustomCharacterName(_charID):
|
||||
if(_charID == "npc"):
|
||||
return pawnID
|
||||
|
||||
func _run():
|
||||
if(state == ""):
|
||||
addCharacter("lamia")
|
||||
addCharacter(pawnID)
|
||||
playAnimation(StageScene.Duo, "stand", {pc="lamia", npc=pawnID})
|
||||
saynn("You are walking in the hallway when you notice Lamia striding towards the toilets, you continued walking while you heard whistling coming from where you've seen Lamia just a moment ago, you look at the source.")
|
||||
saynn("[say=npc]Look who we have in here, a stranded fox, you know what they say about foxes right? They are all holes.[/say]")
|
||||
saynn("Lamia seems unimpressed, looking at the inmate while rolling their eyes.")
|
||||
saynn("[say=npc]Come with me, I'll find better place for us two.[/say]")
|
||||
saynn("Inmate approaches Lamia and tries grabbing them by the wrist before Lamia swiftly takes their arm away.")
|
||||
saynn("[say=npc]Fucking slut, I said COME WITH ME.[/say]")
|
||||
saynn("Inmate is getting angry as their paws start fishing for Lamia's body.")
|
||||
addButton("Help", "Try to help Lamia", "helplamia")
|
||||
addButton("Observe", "Observe the situation from long distance", "observe")
|
||||
|
||||
if state in ["helplamia", "observe"]:
|
||||
addCharacter("hiisi")
|
||||
playAnimation(StageScene.Duo, "stand", {pc="hiisi", npc=pawnID})
|
||||
if state == "helplamia":
|
||||
saynn("You start walking towards Lamia as you see the situation is getting heated, however before you come there Hiisi suddenly appears on the scene, you are unsure where did they even come from. He swiftly inserts himself between Lamia and {npc.name} with stern look directed at the inmate.")
|
||||
else:
|
||||
saynn("You decide to stay where you are and continue looking at unfolding situation from safe distance. You see the inmate throwing punches at Lamia... Until seemingly out of nowhere Hiisi suddenly appears, you are unsure where did they even come from. He swiftly inserts himself between Lamia and {npc.name} with stern look directed at the inmate.")
|
||||
saynn("[say=hiisi]Keep those crummy sticks to yourself.[/say]")
|
||||
saynn("[say=npc]The fuck? The fox is mine.[/say]")
|
||||
saynn("[say=hiisi]Like hell he is, find yourself other target.[/say]")
|
||||
saynn("[say=npc]Oh, believe me, I think I just found one.[/say]")
|
||||
saynn("{npc.He} spits at the floor while they prepare their arms for a fight, Hiisi stands there as if nothing happened. Lamia simply... Left, towards the bathroom, as if nothing happened.")
|
||||
addButton("Continue", "See what happens next", "hiisifight")
|
||||
|
||||
if state == "hiisifight":
|
||||
removeCharacter("lamia")
|
||||
playAnimation(StageScene.Duo, "kick", {pc="hiisi", npc=pawnID, npcAction="defeat"})
|
||||
saynn("The inmate starts swinging {npc.his} fists at Hiisi, who skillfully blocks all of the attacks. Every 3rd attack or so he successfully counters the attack leaving the troublemaking inmate look more and more tired and wasted. The power imbalance between the two is pretty visible from perspective of a viewer, though {npc.name} doesn't seem to realize that yet.")
|
||||
if pawn.getSpecies().has("canine"):
|
||||
saynn("[say=npc]I despise things like you.[/say]")
|
||||
else:
|
||||
saynn("[say=npc]Stupid mutt. Should have stayed at your doghouse.[/say]")
|
||||
saynn("Hiisi doesn't seem bothered as he masterfully takes down {npc.name} with a kick on their side. {npc.Name} kneels defeated, Hiisi squats next to them.")
|
||||
saynn("[say=hiisi]Both me and the fox you tried to have fun with are Master Issix's property. Our Master doesn't like when other inmates play with his property. You must be new here if you didn't know that already, and trust me, you do not want to cross our Master. Now go make some friends and tell them how you've been knocked by mere pets in record time, that will be a fun story to tell.[/say]")
|
||||
saynn("{npc.Name} looks angry, though shaken enough not to retort with anything. Hiisi stands up and goes to the bathroom leaving the defeated inmate on the floor.")
|
||||
addButton("Leave", "Continue walking your way", "endthescene")
|
||||
|
||||
|
||||
func getDevCommentary():
|
||||
return ""
|
||||
|
||||
func hasDevCommentary():
|
||||
return false
|
||||
|
||||
|
||||
func _react(_action: String, _args):
|
||||
|
||||
if(_action == "endthescene"):
|
||||
setModuleFlag("IssixModule", "Hiisi_Encounter_scene", 2)
|
||||
endScene()
|
||||
return
|
||||
|
||||
setState(_action)
|
253
Modules/IssixModule/Scenes/IssixDonationScene.gd
Normal file
253
Modules/IssixModule/Scenes/IssixDonationScene.gd
Normal file
|
@ -0,0 +1,253 @@
|
|||
extends "res://Scenes/SceneBase.gd"
|
||||
|
||||
var inventoryScreenScene = preload("res://Modules/IssixModule/Internal/InventoryScreenDonation.tscn")
|
||||
|
||||
var lockedInto = false
|
||||
var rewardItem: ItemBase = null
|
||||
var rewardItemDescription := ""
|
||||
|
||||
func _initScene(_args = []):
|
||||
if(_args.size() > 0):
|
||||
lockedInto = true
|
||||
setState(_args[0])
|
||||
|
||||
func _init():
|
||||
sceneID = "IssixDonationScreen"
|
||||
|
||||
func filterNonAnnouncer(item) -> bool:
|
||||
return !item.hasTag(ItemTag.SoldByTheAnnouncer)
|
||||
|
||||
func filterArray(arr: Array, tester: String):
|
||||
var new_array = []
|
||||
for item in arr:
|
||||
if call(tester, item):
|
||||
new_array.append(item)
|
||||
return new_array
|
||||
|
||||
func _run():
|
||||
if(state == ""):
|
||||
saynn("You can donate BDSM gear to Issix, and he MAY reward you with some goodies after each 10 donations.")
|
||||
var current_donations = getModuleFlag("IssixModule", "Issix_Donation_Meter", 0)
|
||||
var used_donations = getModuleFlag("IssixModule", "Issix_Used_Donations", 0)
|
||||
|
||||
saynn("You've made "+str(current_donations) + " donations to Issix so far.")
|
||||
|
||||
addButton("Donate", "See what you can donate", "donatemenu")
|
||||
if (current_donations - used_donations) >= 10:
|
||||
addButton("Reward", "Ask Issix for reward for donations you've made so far", "issixdonationitemreward")
|
||||
else:
|
||||
addDisabledButton("Reward", "You haven't donated enough items to receive any rewards yet")
|
||||
|
||||
if getModuleFlag("IssixModule", "Issix_Donation_Meter", 0) > 49:
|
||||
if (current_donations - used_donations) >= 10:
|
||||
addButton("Enchant", "Upgrade a restraint with a smart lock", "enchantmenu")
|
||||
saynn("Fair warning: Applying smart locks willy-nilly may break your NPCs and make it impossible to get restraints off them, YOU are responsible for how you use the restraints made this way, this function is mainly made with idea that player may want to get those items on themselves, not NPCs.")
|
||||
else:
|
||||
addDisabledButton("Enchant", "Issix isn't willing to apply any SmartLocks to the gear just yet, donate more stuff to him")
|
||||
|
||||
addButton("Step away", "Talk about something else", "endthescene")
|
||||
|
||||
if(state == "donatemenu"):
|
||||
var inventory = inventoryScreenScene.instance()
|
||||
GM.ui.addFullScreenCustomControl("inventory", inventory)
|
||||
var inventoryItems = GM.pc.getInventory().getAllCombatUsableRestraints()
|
||||
inventory.setItems(filterArray(inventoryItems, "filterNonAnnouncer"), "donation") # TODO Change into something more about restraints
|
||||
var _ok = inventory.connect("onItemSelected", self, "onInventoryItemSelected")
|
||||
var _ok2 = inventory.connect("onInteractWith", self, "onInventoryItemInteracted")
|
||||
#var _ok3 = inventory.connect("onInteractWithGroup", self, "onInventoryItemGroupInteracted")
|
||||
|
||||
addButton("Back", "Don't donate anything", "")
|
||||
|
||||
# So, let's talk. I realize this feature is kinda wild. I don't think it is intended to have SmartLocked restraints inside of PC's inventory, they are made to be only equipped on someone's body, which is why the smartlock disappears once player gets off the restraint. This feature allows free-for-all slut lock application. I specifically chose tasks that any NPC could possibly do by themselves regardless of body configuration, but I'm sure there will still be issues even with that. Overall, it's up to the player whether they want to break their NPCs in bad ways or not.
|
||||
if state == "enchantmenu":
|
||||
var inventory = inventoryScreenScene.instance()
|
||||
GM.ui.addFullScreenCustomControl("inventory", inventory)
|
||||
var allItems = []
|
||||
for item in GM.pc.getInventory().getAllCombatUsableRestraints():
|
||||
if !item.getRestraintData().hasSmartLock():
|
||||
allItems.append(item)
|
||||
inventory.setItems(allItems.duplicate(), "enchant")
|
||||
var _ok = inventory.connect("onItemSelected", self, "onInventoryItemSelected")
|
||||
var _ok2 = inventory.connect("onInteractWith", self, "onInventoryItemInteracted")
|
||||
#var _ok3 = inventory.connect("onInteractWithGroup", self, "onInventoryItemGroupInteracted")
|
||||
|
||||
addButton("Back", "Don't donate anything", "")
|
||||
|
||||
if state == "issixdonationitemreward":
|
||||
saynn("[say=pc]I've donated some gear, would you consider giving me something in return?[/say]")
|
||||
saynn("[say=issix]Hmm, I suppose that's true, your donations are appreciated. Let's see...[/say]")
|
||||
saynn("Issix grabs his bag and searches through it for trinkets, you assume.")
|
||||
saynn("[say=issix]Hmm, how about this?[/say]")
|
||||
if rewardItem != null:
|
||||
saynn("Issix pulls out "+rewardItem.getVisibleName()+" and hands it to you.")
|
||||
saynn("[say=issix]"+rewardItemDescription+"[/say]")
|
||||
if GM.main.getModuleFlag("IssixModule", "PC_Enslavement_Role", 0) == 0:
|
||||
saynn("[say=pc]Thank you Issix.[/say]")
|
||||
else:
|
||||
saynn("[say=pc]Thank you, Master.[/say]")
|
||||
else:
|
||||
saynn("[color=red]YOU SHOULDN'T SEE THIS, I'VE FUCKED UP SOMETHING.[/color]")
|
||||
addButton("Back", "Continue", "")
|
||||
|
||||
# Cookie
|
||||
func reward1():
|
||||
rewardItemDescription = "You know, I've learned that sometimes it's the simplest things that bring us joy, so have this cookie, you can share it with someone if you'd like, I guess."
|
||||
return GlobalRegistry.createItem("Cookie")
|
||||
|
||||
func findDonor(pawns) -> BaseCharacter:
|
||||
var donor = null
|
||||
for inmate in pawns:
|
||||
if !inmate.isInmate() or inmate.isPlayer() or inmate.isSlaveToPlayer():
|
||||
continue
|
||||
if !inmate.getCharacter().hasPenis():
|
||||
continue
|
||||
donor = inmate.getCharacter()
|
||||
break
|
||||
return donor
|
||||
|
||||
# Boole of cum, get a random Male inmate pawn and milk them dry, if no male pawn explode, but seriously, those can be hella useful if you lack penis and have to do 213123123 slave tasks
|
||||
func reward2():
|
||||
var item = GlobalRegistry.createItem("PlasticBottle")
|
||||
var fluids = item.getFluids()
|
||||
var pawns = GM.main.IS.getPawns().values()
|
||||
pawns.shuffle()
|
||||
var donor = findDonor(pawns)
|
||||
if donor == null:
|
||||
fluids.addFluid("Milk", RNG.randf_range(900.0, 1100.0))
|
||||
rewardItemDescription = "This one is filled with sweet milk. I generally prefer bottles with other white fluid, but would you believe how hard it is to come by inmates with a penis in this prison? Strange..." # lol
|
||||
else:
|
||||
fluids.addFluid("Cum", RNG.randf_range(950.0, 1150.0), donor.getFluidDNA(FluidSource.Penis))
|
||||
rewardItemDescription = "Have you ever seen this much in one bottle? ... Of course it's cum. Let's just say I have uses for those, this one you can have."
|
||||
return item
|
||||
|
||||
func reward3():
|
||||
if getModuleFlag("IssixModule", "Got_Luck_Token_Before", false) == false:
|
||||
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)
|
||||
else:
|
||||
rewardItemDescription = "Another one of these? Where the hell do they come from? Here, have it."
|
||||
return GlobalRegistry.createItem("LuckToken")
|
||||
|
||||
func _react(_action: String, _args):
|
||||
if(_action == ""):
|
||||
if(lockedInto):
|
||||
endScene()
|
||||
return
|
||||
|
||||
if(_action == "donate"):
|
||||
var item = _args[0]
|
||||
var howMuch = 1
|
||||
if(_args.size() > 1):
|
||||
howMuch = _args[1]
|
||||
howMuch = Util.mini(item.getAmount(), howMuch)
|
||||
var howMuchStr = str(howMuch)+"x"
|
||||
|
||||
#GM.pc.addCredits(item.getSellPrice() * howMuch)
|
||||
GM.main.increaseModuleFlag("IssixModule", "Issix_Donation_Meter", howMuch)
|
||||
GM.pc.getInventory().removeXFromItemOrDelete(item, howMuch)
|
||||
|
||||
addMessage(howMuchStr+item.getVisibleName()+" was donated to Issix")
|
||||
|
||||
if GM.main.getModuleFlag("IssixModule", "Issix_Donation_Meter", 0) == 50:
|
||||
addMessage("You can now enchant items with smart locks thanks to Issix's good will")
|
||||
|
||||
setState("")
|
||||
if(lockedInto):
|
||||
endScene()
|
||||
return
|
||||
return
|
||||
|
||||
if _action == "enchant":
|
||||
var item = _args[0]
|
||||
var lock = _args[1]
|
||||
|
||||
var newLock = SmartLock.create(lock)
|
||||
newLock.onLocked({forcer = "pc"})
|
||||
item.getRestraintData.setLevel(item.getRestraintData.getLevel()+1) # Just an extra
|
||||
item.getRestraintData().setSmartLock(newLock)
|
||||
# Hey kids, don't do this at home, it's bound to be dangerous (seriously, I'm fucking surprised that works, though it feels like shoestring held kind of feature and fairly restricted)
|
||||
|
||||
if lock == SmartLock.SlutLock:
|
||||
var availableTasks = ["Orgasms", "Choke", "Bodywritings"] # Tasks should be available to anyone regardless any body configuration
|
||||
|
||||
var theTask:NpcBreakTaskBase = GlobalRegistry.createSlaveBreakTask(RNG.pick(availableTasks))
|
||||
|
||||
theTask.generateFor("pc", false, RNG.randf_rangeX2(1.0, 2.0))
|
||||
newLock.tasks.append(theTask)
|
||||
|
||||
for task in newLock.tasks:
|
||||
var _ok = task.connect("onTaskCompleted", newLock, "onSlutTaskCompleted")
|
||||
|
||||
addMessage(newLock.getName()+" has been applied to "+item.getVisibleName())
|
||||
setState("")
|
||||
if(lockedInto):
|
||||
endScene()
|
||||
return
|
||||
return
|
||||
|
||||
if _action == "issixdonationitemreward":
|
||||
GM.main.increaseModuleFlag("IssixModule", "Issix_Used_Donations", 10)
|
||||
var item = call("reward"+str(RNG.randi_range(1,3)))
|
||||
GM.pc.getInventory().addItem(item)
|
||||
rewardItem = item
|
||||
|
||||
if(_action == "endthescene"):
|
||||
endScene()
|
||||
return
|
||||
|
||||
setState(_action)
|
||||
|
||||
func saveData():
|
||||
var data = .saveData()
|
||||
|
||||
data["lockedInto"] = lockedInto
|
||||
data["rewardItem"] = rewardItem
|
||||
|
||||
return data
|
||||
|
||||
func loadData(data):
|
||||
.loadData(data)
|
||||
|
||||
lockedInto = SAVE.loadVar(data, "lockedInto", false)
|
||||
rewardItem = SAVE.loadVar(data, "rewardItem", null)
|
||||
|
||||
func onInventoryItemInteracted(item: ItemBase):
|
||||
if(state == "donatemenu"):
|
||||
GM.main.pickOption("donate", [item, item.getAmount()])
|
||||
|
||||
func onInventoryItemSelected(item: ItemBase):
|
||||
GM.ui.clearButtons()
|
||||
addButton("Back", "Don't do anything", "")
|
||||
|
||||
if(state == "donatemenu"):
|
||||
var itemAmount = item.getAmount()
|
||||
var amounts = [1, 2, 3, 4, 5, int(itemAmount * 0.3), int(itemAmount * 0.5), int(itemAmount * 0.7), itemAmount]
|
||||
amounts.sort()
|
||||
var amountsUsed = {}
|
||||
|
||||
for amount in amounts:
|
||||
if(amount < 1):
|
||||
continue
|
||||
if(itemAmount < amount):
|
||||
break
|
||||
if(amountsUsed.has(str(amount))):
|
||||
continue
|
||||
amountsUsed[str(amount)] = true
|
||||
|
||||
addButton("Donate "+(str(amount)), "Amount: "+str(amount), "donate", [item, amount])
|
||||
|
||||
if state == "enchantmenu":
|
||||
var smartLockTypes = SmartLock.getAll()
|
||||
for smartLock in smartLockTypes:
|
||||
if smartLock == SmartLock.KeyholderLock or smartLock == SmartLock.TightLock: # Ignore keyholder locks or TightLocks because they are too involved, from base game only really SlutLocks are left from the list :(
|
||||
continue
|
||||
var dummyLock = SmartLock.create(smartLock)
|
||||
addButton(dummyLock.getName(), "Apply "+dummyLock.getName()+" onto the restraint", "enchant", [item, smartLock])
|
||||
#dummyLock.free()
|
||||
|
||||
# func onInventoryItemGroupInteracted(item: ItemBase):
|
||||
# if(state == "donatemenu"):
|
||||
# GM.main.pickOption("sellall", [item])
|
||||
|
||||
|
||||
|
|
@ -33,6 +33,7 @@ func _run():
|
|||
else:
|
||||
saynn("While exploring the station a in the corner of a platform sits a demon-dragon Issix with three leashed creatures.")
|
||||
addButton("Talk", "Talk to Issix", "talk")
|
||||
addButton("Donate", "Donate loose BDSM gear you have to Issix", "issixdonate")
|
||||
addButton("Appearance", "Take a closer look at Issix", "appearance")
|
||||
addButton("Leave", "Be on your way", "endthescene")
|
||||
|
||||
|
@ -111,8 +112,9 @@ func _run():
|
|||
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=issix]What leads you to me? I don't suppose you are here to admire me like the three here.[/say]")
|
||||
saynn("He lets out a laugh")
|
||||
saynn("[say=issix]Anyways, 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]")
|
||||
saynn("[say=issix]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]")
|
||||
saynn("[say=issix]Anyways, I own this little corner including those three wonderful leashed pets beside me. Since you do seem fairly new here, I want to make something very clear to you - you do NOT touch my pets without their 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. I don't mind if you talk with them, if they allow you, you can even touch them, but you do not hurt or fuck my property, if you fancy any of them you can come to me and nicely ask for permission, but they are mine. Understood?[/say]")
|
||||
saynn("[say=pc]Understood.[/say]")
|
||||
saynn("[say=issix]As long as you follow this rule, you'll not have to worry about humble me. Now, is there any reason you came to me?[/say]")
|
||||
addButton("Heaven?", "Did you hear that correctly?", "heaven")
|
||||
addButton("You", "Learn more about Issix", "issixdetails")
|
||||
addButton("Pets", "Who are the pets?", "pets")
|
||||
|
@ -150,7 +152,7 @@ func _run():
|
|||
saynn("After a short moment you stand back up and look at pet on your right.")
|
||||
saynn("[say=issix]This one here is Hiisi. He is my latest, which doesn't mean I love him any different. This puppy rather keeps to himself, you may have difficulties getting him to open to you, if you'd ever want to do that. He's.. A troubled one, to say the least, but look at him, isn't he the pristine puppy boy? He loves 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![/say]")
|
||||
saynn("[say=hiisi]{pc.name} isn't it? Umm... Hi.[/say]")
|
||||
saynn("{hiisi.name} licks your leg, leaving a bit of saliva on your fur.") # TODO Fur/skin
|
||||
saynn("{hiisi.Name} licks your leg, leaving a bit of saliva on your fur.") # TODO Fur/skin
|
||||
saynn("[say=issix]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, he doesn't speak. He communicates with drawings. He is getting pretty good at them. He also doesn't seem to mind being mute, quite to the opposite, he seems excited that his... Speech is in form of images.[/say]")
|
||||
saynn("You can see Lamia drawing something, Issix gives you a signal to just wait a second. After a minute, Lamia presents you with a drawing, smiling.")
|
||||
saynn("The drawing shows a pretty good representation of yourself, on fours, while leashed by a figure that you can only infer to be Issix. There is Lamia, Azazel and Hiisi hanging around there as well besides you. Issix laughs when he sees the drawing.")
|
||||
|
@ -288,7 +290,8 @@ func _run():
|
|||
saynn("[say=issix]I gotta say, I did hear of a certain {pc.name} 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 no, my apologies but I'm simply not interested in you at the moment.[/say]")
|
||||
GM.main.setModuleFlag("IssixModule", "Score_Explored", score)
|
||||
elif(score_explored > 1):
|
||||
saynn("[say=issix]Hmm. you still look mostly the same, still unworthy.[/say]")
|
||||
saynn("[say=issix]You still look the same as the last time you came to me, do not waste my time. If you are really serious about becoming my pet you'll know what to do.[/say]")
|
||||
saynn("(May be a good idea to ask Issix's pets for advice)")
|
||||
else:
|
||||
saynn("[say=issix]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...", "talk")
|
||||
|
@ -383,6 +386,10 @@ func _react(_action: String, _args):
|
|||
GM.main.setModuleFlag("IssixModule", "Quest_Wait_Another_Day", true)
|
||||
#GM.pc.getInventory().removeFirstOf("IssixsMap") - might be useful for later?
|
||||
|
||||
if _action == "issixdonate":
|
||||
runScene("IssixDonationScreen")
|
||||
_action = ""
|
||||
|
||||
if(_action == "endthescene"):
|
||||
endScene()
|
||||
return
|
||||
|
|
|
@ -149,10 +149,10 @@ func _run():
|
|||
addButton("Drink", "Ask Hiisi about energy drink that you've won through the game of Rock Paper Scissors", "hiisienergy")
|
||||
if HiisiRPS["winh"] > 2 and HiisiRPS["reward_acquired"] == false:
|
||||
addButtonWithChecks("Hypnovisor", "Ask Hiisi to fulfill his request with hypnovisors", "hiisihypnovisors", [], [[ButtonChecks.HasItemWithTag, ItemTag.Hypnovisor]])
|
||||
if not getModuleFlag("IssixModule", "Hiisi_Name_Helped", false):
|
||||
addDisabledButton("Name", "You already asked Hiisi about his name")
|
||||
else:
|
||||
if getModuleFlag("IssixModule", "Hiisi_Name_Helped", false) != true:
|
||||
addButton("Name", "Ask Hiisi about his name", "hiisiname")
|
||||
else:
|
||||
addDisabledButton("Name", "You already asked Hiisi about his name")
|
||||
if getModuleFlag("IssixModule", "Hiisi_Helped_Today", false) == false:
|
||||
addButton("Help", "Ask if you can help the canine in something", "hiisihelp")
|
||||
else:
|
||||
|
@ -338,7 +338,7 @@ func _run():
|
|||
saynn("When you look at Lamia's blanket, you think of creative person. On blanket there are organizers, pens, brushes, pieces of paper, a bowl and a small trashcan filled to the brim with folded into spherical balls paper. In a way everything seems organized, the organizers are in one place, the drawing tools in other and yet even positioning of the trashcan makes sense. Other than that, the blanket seems fairly clean.")
|
||||
addButton("Talk", "Talk to Lamia", "lamiatalk")
|
||||
addButton("Appearance", "Look at Lamia", "lamiaappearance")
|
||||
if getModuleFlag("IssixModule", "Lamia_Times_Helped", 0) > 0:
|
||||
if getModuleFlag("IssixModule", "Lamia_Times_Helped") != null:
|
||||
match getModuleFlag("IssixModule", "Helped_Lamia_With_Drawings_Today"):
|
||||
null:
|
||||
addButton("Help", "You see a big stack of drawings and some drawers, it seems Lamia categorizes their drawings, ask if you could help?", "lamiahelp")
|
||||
|
@ -440,7 +440,7 @@ func _run():
|
|||
saynn("[say=azazel]Well, if you still have access to that sweet sweet catnip of yours, I'd love to get more of it, it's so intoxicating and fun! Gives such warm feelings. Have you tried it yourself?[/say]")
|
||||
said_something = true
|
||||
elif GM.main.getModuleFlag("IssixModule", "Lamia_Times_Helped", 0) < 10:
|
||||
saynn("[say=azazel]I'm sure if you'd help Lamia they would put in good word for you! Perhaps you could help them draw? I don't know.[/say]")
|
||||
saynn("[say=azazel]I'm sure if you'd help Lamia they would put in good word for you! Or well... You know what I mean. Perhaps you could help them draw? I don't know.[/say]")
|
||||
said_something = true
|
||||
elif GM.main.getModuleFlag("IssixModule", "Hiisi_Affection", 0) < 12:
|
||||
saynn("[say=azazel]Hiisi is our guardian angel, after Master, of course. He does all different kind of stuff tinkers with things and so on. Perhaps he needs some help too? I'm sure if you helped him a little bit he would maybe be happy to share some thoughts about you with Master.[/say]")
|
||||
|
@ -632,12 +632,12 @@ func _run():
|
|||
addButton("Explicit", "You've noticed Lamia doesn't draw any explicit things, perhaps worth asking about it?", "lamiaexplicit")
|
||||
|
||||
if lamia_affection > 6:
|
||||
addDisabledButton("Prison", "Ask Lamia how they ended up in the prison")
|
||||
addButton("Prison", "Ask Lamia how they ended up in the prison", "lamiaprison")
|
||||
else:
|
||||
addDisabledButton("Prison", "You don't feel like there is enough connection between you two to ask him that")
|
||||
|
||||
if lamia_affection > 11:
|
||||
addDisabledButton("Favorite", "Ask Lamia what is their favorite thing to draw")
|
||||
addDisabledButton("Favorite", "Ask Lamia what their favorite thing to draw is")
|
||||
else:
|
||||
addDisabledButton("Favorite", "You don't feel like there is enough connection between you two to ask him that")
|
||||
|
||||
|
@ -647,6 +647,32 @@ func _run():
|
|||
addDisabledButton("Draw", "You don't feel like there is enough connection between you two to ask him to draw for you something")
|
||||
addButton("Back", "Do something else", "lamiamain")
|
||||
|
||||
if state == "lamiaprison":
|
||||
saynn("[say=pc]A mute fox in general inmate uniform, do you feel comfortable sharing how did it came to be?[/say]")
|
||||
saynn("Fox looks at you and sighs. You realize perhaps this wasn't the right question to ask, but then he starts searching for something in their bag and pulls out a small stack of paper held together by a stapler. They look at the first page holding the entire stack in their paws before passing it to you. There is no cover or anything, it's just a bunch of papers with drawings on them, from brief look it seems like it all reads like a comic.")
|
||||
saynn("First page features a younger looking version of Lamia with a backpack on their back, next panels that span at least 3 pages show them walking through countless beautiful and detailed environments. There is a forest with weird looking trees spanning higher than any you've ever seen yourself, there is a jungle like place where Lamia sits alone next to a makeshift campfire, there are canyons with colorful rocks all around, huts on what you can only imagine are mountains and large open bodies of water including a stunning depiction of Lamia inside underwater glass tunnel with scary and beautiful looking ocean fauna. By sheer chance you notice a small piece of paper where the stapler stapled the pages, seems like there are at least two pages missing, ignoring that little detail you ask.")
|
||||
saynn("[say=pc]Holy fuck, those are just drawings but they look stunning, are those real places? On your planet?[/say]")
|
||||
saynn("Lamia nods")
|
||||
saynn("[say=pc]Woooahh.[/say]")
|
||||
saynn("All of those panels seem to have a theme of travel, you imagine Lamia traveled a lot, which seems like an interesting life to live. Finally, on 10th page Lamia arrives to what looks like a giant man made wall, it spans far and wide beyond what comic panel can depict, and there is seemingly one depicted entrance that has a man made solid road leading to it. Armed guards in it. Next few panels depict how meeting of Lamia and AlphaCorp guards went, Lamia, seemingly wanting to pass the giant wall was stopped by the armed guards, they put forward their paw as if expecting something, Lamia shakes their head and promptly gets told fo fuck off by the guard.")
|
||||
saynn("Next panel shows Lamia near another campfire next to an enormous wall. He must have stayed there for a while. You realize that the wall was likely impossible to overcome by regular means considering Lama chose to encamp near the earlier depicted entrance. A few panels show the fox boy observing the border check from a distance. On 8th page, during the night they've been sneaking around near the entrance, 2 guards seemingly asleep, one awoke but staring at the computer terminal. Lamia, as if ninja are sneaking through the gate, multiple panels show them literally crawling or thinning out to avoid detection. There is a panel showing their happy face on the other side of the wall, a wall entrance in a background - achieving their goal, where the next full page panel shows them laying on the ground unconscious with a projectile on their back. Last page of the saga shows transportation inside a spacecraft with them in cuffs. You can guess the rest.")
|
||||
saynn("[say=pc]That's... Wow. So, that was your planet, right? There was AlphaCorp there and they were like, guarding an entrance in a wall to the other side.[/say]")
|
||||
saynn("Lamia confirms.")
|
||||
saynn("[say=pc]And there was no way around it?[/say]")
|
||||
saynn("He confirms again.")
|
||||
saynn("[say=pc]That must have sucked. What the guards wanted, money? IDs?[/say]")
|
||||
saynn("They signal that the guards wanted both.")
|
||||
saynn("[say=pc]Ughhh...[/say]")
|
||||
saynn("You pass the stack of papers back to Lamia and they put it back into their bag.")
|
||||
saynn("[say=pc]So, you had neither right? No money, no identification...[/say]")
|
||||
saynn("They nod.")
|
||||
saynn("[say=pc]Guess why you wandered like that is a story for another day?[/say]")
|
||||
saynn("They yawn, seems so.")
|
||||
saynn("[say=pc]Alright, thank you for sharing this, I'll take my leave now.[/say]")
|
||||
saynn("They have you off.")
|
||||
addButton("Finish", "Lamia shared their story with you, now its time to leave", "lamiatalk")
|
||||
|
||||
|
||||
if state == "lamiatrydrawing":
|
||||
saynn("[say=pc]Hey Lamia, I were wondering, you've been drawing a lot of things, do you think I could try something on my own?[/say]")
|
||||
saynn("Lamia's eyes light up like candles, he doesn't waste a moment to grab a sheet of paper, a nearby brush and a solid piece of texture as a pad under the paper and practically shove those items into your paws. You kneel and start to lay down on your belly, your {pc.feet} are technically on Hiisi's blanket while the rest of your body is on Lamia's, you hope this won't bother the canine.")
|
||||
|
@ -726,7 +752,7 @@ func _run():
|
|||
saynn("Lamia shrugs, he starts drawing. At first a koala eating a bamboo shows up, a happy face drawn above it. Then he draws canine member and canine pussy with a stick figure doing shrug with their arms. What strikes you as odd is that even though Lamia doesn't seem to draw explicit scenes, their genitalia art is drawn with plenty of detail and effort.")
|
||||
saynn("[say=pc]Wow, that's pretty good, but I guess you kinda don't care much for those? Sex and all just doesn't do it for you, huh?[/say]")
|
||||
saynn("They nod in agreement.")
|
||||
saynn("[say=pc]I con respect that. You are a great artist, and you should draw whatever the fuck you want, that's the way to go.[/say]")
|
||||
saynn("[say=pc]I can respect that. You are a great artist, and you should draw whatever the fuck you want, that's the way to go.[/say]")
|
||||
saynn("They smile, you reward them with headpats.")
|
||||
addButton("Back", "Finish this conversation", "lamiatalk")
|
||||
|
||||
|
|
|
@ -4,7 +4,6 @@ var rng_per_day = null
|
|||
var pet_time_start = null
|
||||
var reply_litter = null
|
||||
var azazel_teased_motherhood = false
|
||||
var azazel = null
|
||||
var AVERAGE_WALK_DELAY = 9
|
||||
var milk_result = []
|
||||
|
||||
|
@ -14,7 +13,6 @@ func _init():
|
|||
func _initScene(_args = []):
|
||||
rng_per_day = RandomNumberGenerator.new()
|
||||
rng_per_day.seed = GM.main.getDays()
|
||||
azazel = GlobalRegistry.getCharacter("azazel")
|
||||
reply_litter = 0
|
||||
|
||||
func _run():
|
||||
|
@ -209,6 +207,7 @@ func _run():
|
|||
addButton("Reject", "You don't want to play if you don't know what's at stake", "azazelguesslitterreject")
|
||||
|
||||
if state == "littercountresult":
|
||||
var azazel = GlobalRegistry.getCharacter("azazel")
|
||||
if reply_litter == 0:
|
||||
saynn("[say=pc]Zero.[/say]")
|
||||
saynn("Azazel stares at you with confusion")
|
||||
|
@ -577,7 +576,7 @@ static func addIssixMood(mood: int):
|
|||
|
||||
func registerOffspringGuess():
|
||||
var past_guesses: Dictionary = getModuleFlag("IssixModule", "Litter_Guessing_Game", {"guesses_off": [], "last_guess": GM.CS.getChildrenAmountOf("azazel")})
|
||||
past_guesses["guesses_off"].append(reply_litter-azazel.getPregnancyLitterSize())
|
||||
past_guesses["guesses_off"].append(reply_litter-GlobalRegistry.getCharacter("azazel").getPregnancyLitterSize())
|
||||
past_guesses["last_guess"] = GM.CS.getChildrenAmountOf("azazel")
|
||||
setModuleFlag("IssixModule", "Litter_Guessing_Game", past_guesses.duplicate(true))
|
||||
|
||||
|
|
Loading…
Reference in a new issue