Made guard template have two new possible attacks
Added two harem tasks (Laundry, Drone)
This commit is contained in:
parent
811e2a56fc
commit
b19016fcd8
|
@ -117,7 +117,7 @@ func getGender():
|
|||
return Gender.Male
|
||||
|
||||
func _getAttacks():
|
||||
return ["IssixSlaveTease", "trygetupattack", "simplepunchattack","CuffPCHands", "ForceGagPC", "ForceMuzzlePC", "simplekickattack", "biteattack", "shoveattack"]
|
||||
return ["IssixSlaveTease", "trygetupattack", "simplepunchattack","CuffPCHands", "ForceGagPC", "ForceMuzzlePC", "simplekickattack", "biteattack", "shoveattack", "PetCommandRoll", "PetCommandSit"]
|
||||
|
||||
func getSmallDescription() -> String:
|
||||
return "Wears a red block uniform with number P-533. He is an intimidating tall demon-dragon, has red fur."
|
||||
|
|
5
Modules/IssixModule/Internal/Guard.gd
Normal file
5
Modules/IssixModule/Internal/Guard.gd
Normal file
|
@ -0,0 +1,5 @@
|
|||
extends "res://Game/InteractionSystem/PawnTypes/Guard.gd"
|
||||
|
||||
func onPawnSpawned(_pawn:CharacterPawn):
|
||||
_pawn.getChar().npcAttacks.append("PetCommandSit")
|
||||
_pawn.getChar().npcAttacks.append("PetCommandRoll")
|
|
@ -97,8 +97,15 @@ func getFlags():
|
|||
"PC_Pet_Didnt_Fullfill_Daily": flag(FlagType.Bool),
|
||||
"PC_Pet_Didnt_Mate": flag(FlagType.Bool),
|
||||
"PC_Bad_Sex": flag(FlagType.Number),
|
||||
"Hiisi_Protects_PC": flag(FlagType.Bool)
|
||||
#"Gym_Bullies_Left_Alone": flag(FlagType.Bool) Currently cannot change the behavior of this :(
|
||||
"Hiisi_Protects_PC": flag(FlagType.Bool),
|
||||
"Azazel_Fertility_Training_Today": flag(FlagType.Bool),
|
||||
"Had_Previously_Trained_Fertility_LVL1": flag(FlagType.Bool),
|
||||
"Trained_Pet_Today": flag(FlagType.Bool),
|
||||
"PC_Should_Be_Punished": flag(FlagType.Number),
|
||||
"PC_Should_Be_Rewarded": flag(FlagType.Number),
|
||||
"Did_Task_Today": flag(FlagType.Bool),
|
||||
"Drone_Task_Timeout": flag(FlagType.Number), # 0 = everything is fine, -1 = drone lost, 0> day at which when the task can resume,
|
||||
"Drone_Flight_Unlocked": flag(FlagType.Bool) # null = locked, false = unlocked, true = flew in the past
|
||||
}
|
||||
|
||||
|
||||
|
@ -123,7 +130,8 @@ func _init():
|
|||
"res://Modules/IssixModule/Scenes/AzazelCorruption/StopsEvent.gd",
|
||||
"res://Modules/IssixModule/Events/AnnouncerLuckTokenEvent.gd",
|
||||
"res://Modules/IssixModule/Scenes/AzazelCorruption/DemonPetsEvent.gd",
|
||||
"res://Modules/IssixModule/Scenes/AzazelCorruption/LongCorridorEvent.gd"
|
||||
"res://Modules/IssixModule/Scenes/AzazelCorruption/LongCorridorEvent.gd",
|
||||
"res://Modules/IssixModule/Events/SlaveryScreenOpen.gd"
|
||||
]
|
||||
|
||||
scenes = [
|
||||
|
@ -161,7 +169,11 @@ func _init():
|
|||
"res://Modules/IssixModule/Scenes/AzazelCorruption/FountainScene.gd",
|
||||
"res://Modules/IssixModule/Scenes/AzazelCorruption/FinalIssixDrugScene.gd",
|
||||
"res://Modules/IssixModule/Scenes/SlaveryFirst/RescueFromFightScene.gd",
|
||||
"res://Modules/IssixModule/Scenes/SlaveryFirst/GenericTrainSessionScene.gd", "res://Modules/IssixModule/Scenes/SlaveryFirst/WalkiesTrainingScene.gd"
|
||||
"res://Modules/IssixModule/Scenes/SlaveryFirst/GenericTrainSessionScene.gd",
|
||||
"res://Modules/IssixModule/Scenes/SlaveryFirst/WalkiesTrainingScene.gd",
|
||||
"res://Modules/IssixModule/Scenes/SlaveryFirst/PunRew/IssixPawJobScene.gd",
|
||||
"res://Modules/IssixModule/Scenes/Tasks/DroneFinder.gd",
|
||||
"res://Modules/IssixModule/Scenes/Tasks/HiisiLaundry.gd"
|
||||
]
|
||||
|
||||
characters = [
|
||||
|
@ -230,8 +242,34 @@ func postInit():
|
|||
# Overwrite scenes for dealing with bullies, they need to be initiated in here due to module initialization order overwriting our modules
|
||||
GlobalRegistry.registerScene("res://Modules/IssixModule/Scenes/Overwrites/BullyGangScene.gd", "Rahi") # Still consider it mostly Rahi's creation'
|
||||
GlobalRegistry.registerEvent("res://Modules/IssixModule/Events/Overwrites/BullyGangEvent.gd")
|
||||
# var console_commands = load("res://Modules/IssixModule/Internal/ConsoleCommands.gd")
|
||||
# if(!console_commands):
|
||||
# Log.printerr("ERROR: couldn't load console_commands from path ")
|
||||
# return
|
||||
# var commands = console_commands.new()
|
||||
# commands.init()
|
||||
GlobalRegistry.registerPawnType("res://Modules/IssixModule/Internal/Guard.gd")
|
||||
|
||||
#GM.ES.registerEventTrigger("OpeningSlaveryScreen", EventTriggerLocation.new()) # TODO Find a way to do that
|
||||
|
||||
# https://gitlab.com/Delta-V-Modding/Mods/-/blob/main/game/ModLoader.gd, credits to harrygiel, Mariusz Chwalba and Vladimir Panteleev
|
||||
func installScriptExtension(childScriptPath:String):
|
||||
var childScript = ResourceLoader.load(childScriptPath)
|
||||
|
||||
# Force Godot to compile the script now.
|
||||
# We need to do this here to ensure that the inheritance chain is
|
||||
# properly set up, and multiple mods can chain-extend the same
|
||||
# class multiple times.
|
||||
# This is also needed to make Godot instantiate the extended class
|
||||
# when creating singletons.
|
||||
# The actual instance is thrown away.
|
||||
childScript.new()
|
||||
|
||||
var parentScript = childScript.get_base_script()
|
||||
var parentScriptPath = parentScript.resource_path
|
||||
print("ModLoader: Installing script extension: %s <- %s" % [parentScriptPath, childScriptPath])
|
||||
childScript.take_over_path(parentScriptPath)
|
||||
|
||||
static func handleUpdates():
|
||||
if (GM.main.getModuleFlag("IssixModule", "PC_Enslavement_Role", 0) >= 1): # if enslaved
|
||||
if GM.main.getModuleFlag("IssixModule", "Hiisi_Protects_PC") == null: # Hiisi protecting the player by default if enslaved
|
||||
|
@ -361,6 +399,17 @@ func resetFlagsOnNewDay(): # I apologize for abusing this hook, but startNewDay
|
|||
GM.main.setModuleFlag("IssixModule", "Has_Been_Milked_Today", true)
|
||||
if GM.main.getModuleFlag("IssixModule", "Trained_With_Hiisi_Combat") != null:
|
||||
GM.main.setModuleFlag("IssixModule", "Trained_With_Hiisi_Combat", false)
|
||||
if GM.main.getModuleFlag("IssixModule", "Azazel_Fertility_Training_Today") != null:
|
||||
GM.main.setModuleFlag("IssixModule", "Azazel_Fertility_Training_Today", 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)
|
||||
GM.main.setModuleFlag("IssixModule", "Trained_Pet_Today", false)
|
||||
if GM.main.getModuleFlag("IssixModule", "Did_Task_Today") != null:
|
||||
GM.main.setModuleFlag("IssixModule", "Did_Task_Today", false)
|
||||
# Reward player if master happy
|
||||
if GM.main.getModuleFlag("IssixModule", "Issix_Mood", 50) > 80:
|
||||
if RNG.chance(35):
|
||||
GM.main.setModuleFlag("IssixModule", "PC_Should_Be_Rewarded", 10)
|
||||
if GM.main.getDays() >= GM.main.getModuleFlag("IssixModule", "Drone_Task_Timeout", 0):
|
||||
GM.main.setModuleFlag("IssixModule", "Drone_Task_Timeout", 0)
|
||||
|
|
|
@ -8,6 +8,7 @@ var reply_litter = null
|
|||
var azazel_teased_motherhood = false
|
||||
var AVERAGE_WALK_DELAY = 9
|
||||
var milk_result = []
|
||||
var allow_pawns = false
|
||||
|
||||
func _init():
|
||||
sceneID = "SlaveryInfoScreen"
|
||||
|
@ -84,14 +85,28 @@ func _run():
|
|||
addButton("Training", "Ask Master if he could train you to be a better pet", "issixpettraining")
|
||||
else:
|
||||
addDisabledButton("Training", "You can only train once per day")
|
||||
addButton("Tasks", "Ask for extra tasks", "issixtaskquestion") # , "issixtaskquestion"
|
||||
match getModuleFlag("IssixModule", "Did_Task_Today"):
|
||||
true:
|
||||
addDisabledButton("Tasks", "You've already done a task today")
|
||||
false:
|
||||
addButton("Tasks", "Ask for extra tasks", "issixtaskquestion")
|
||||
null:
|
||||
pass
|
||||
addDisabledButton("Options", "Ask your Master to change how he treats you (WIP)") #, "issixoptions" Pet etiquette, make player communicate via animalistic sounds, unlocks optional training
|
||||
addButton("Back", "Go back", "")
|
||||
|
||||
|
||||
if state == "issixtaskquestionlist":
|
||||
saynn("You can do certain tasks for Master to help in the harem and raise Issix's mood.")
|
||||
addButton("")
|
||||
addButton("Laundry", "Help Hiisi with laundry", "starthiisilaundry")
|
||||
if getModuleFlag("IssixModule", "Drone_Task_Timeout", 0) == -1:
|
||||
addDisabledButton("Drone", "Drone is currently unavailable, talk with Master Issix")
|
||||
elif getModuleFlag("IssixModule", "Drone_Task_Timeout", 0) > 0:
|
||||
addDisabledButton("Drone", "New drone has been ordered, however it will take a while before it gets to the prison")
|
||||
elif getModuleFlag("IssixModule", "Progression_Points", 0) > 5:
|
||||
addButtonWithChecks("Drone", "Help with finding items", "start_drone_task", [], [ButtonChecks.NotBlindfolded, ButtonChecks.NotHandsBlocked])
|
||||
else:
|
||||
addDisabledButton("????", "You haven't unlocked this yet")
|
||||
addButton("Back", "Go back", "")
|
||||
|
||||
|
||||
|
@ -916,6 +931,10 @@ func _react(_action: String, _args):
|
|||
_action = "lamiapetrequestanother"
|
||||
GM.main.setModuleFlag("IssixModule", "Have_Received_Headpats_Lamia", true)
|
||||
|
||||
if _action == "start_drone_task":
|
||||
allow_pawns = true
|
||||
runScene("DroneFlightTask", [], "drone_end")
|
||||
|
||||
if _action == "issixmilkingq":
|
||||
if GM.main.getModuleFlag("IssixModule", "Total_Fluids_Milked", 0) == 0:
|
||||
_action = "issixmilkingfirst"
|
||||
|
@ -1035,6 +1054,8 @@ func _react(_action: String, _args):
|
|||
func onTextBoxEnterPressed(_new_text:String):
|
||||
GM.main.pickOption("littercountresult", [])
|
||||
|
||||
func supportsShowingPawns() -> bool:
|
||||
return allow_pawns
|
||||
|
||||
func _react_scene_end(_tag, _result):
|
||||
if _tag == "subbysexissix":
|
||||
|
@ -1051,6 +1072,10 @@ func _react_scene_end(_tag, _result):
|
|||
Globals.addIssixMood(5)
|
||||
setState("after_sex_issix")
|
||||
|
||||
if _tag == "drone_end":
|
||||
allow_pawns = false
|
||||
setState("issixpetmenu")
|
||||
|
||||
|
||||
func saveData():
|
||||
var data = .saveData()
|
||||
|
@ -1059,6 +1084,7 @@ func saveData():
|
|||
data["replyLitter"] = reply_litter
|
||||
data["petTimeStart"] = pet_time_start
|
||||
data["azazelTease"] = azazel_teased_motherhood
|
||||
data["allowPawns"] = allow_pawns
|
||||
|
||||
return data
|
||||
|
||||
|
@ -1069,3 +1095,28 @@ func loadData(data):
|
|||
pet_time_start = SAVE.loadVar(data, "petTimeStart", null)
|
||||
azazel_teased_motherhood = SAVE.loadVar(data, "azazelTease", false)
|
||||
reply_litter = SAVE.loadVar(data, "reply_litter", 0)
|
||||
allow_pawns = SAVE.loadVar(data, "allowPawns", false)
|
||||
|
||||
func getDebugActions():
|
||||
return [
|
||||
{
|
||||
"id": "spawnGuard",
|
||||
"name": "SpawnGuard",
|
||||
"args": [
|
||||
],
|
||||
},
|
||||
{
|
||||
"id": "checkGuard",
|
||||
"name": "checkGuard",
|
||||
"args": [
|
||||
],
|
||||
},
|
||||
]
|
||||
|
||||
func doDebugAction(_id, _args = {}):
|
||||
if(_id == "spawnGuard"):
|
||||
GM.main.IS.trySpawnPawn("Guard")
|
||||
if _id == "checkGuard":
|
||||
for pawn in GM.main.IS.pawns:
|
||||
if !GM.main.IS.pawns[pawn].isPlayer():
|
||||
print(String(GM.main.IS.pawns[pawn].getChar().npcAttacks))
|
||||
|
|
331
Modules/IssixModule/Scenes/Tasks/DroneFinder.gd
Normal file
331
Modules/IssixModule/Scenes/Tasks/DroneFinder.gd
Normal file
|
@ -0,0 +1,331 @@
|
|||
extends SceneBase
|
||||
|
||||
func _init():
|
||||
sceneID = "DroneFlightTask"
|
||||
|
||||
var missing_items = ["Syndicate flier", "a black and white striped keyring", "notebook", "floral pin", "a pair of slimy panties", "a space pirate flag", "a rubber rat squishy toy", "a book titled „Introduction to sex 101”", "a very squeezable plushie of an Intergalactic Squid", "fake boobs", "naga necklace", "a mechanical cube", "yoga mat", "a pizza cutter", "a magnifying glass", "a remote", "pair of headphones", "elaborate multi-tool"]
|
||||
var location = ""
|
||||
var item_target = ""
|
||||
var item_target_type = 1
|
||||
var item = ""
|
||||
var distance = 0
|
||||
var minigameScene = preload("res://Game/Minigames/ClickAtTheRightTime/ClickAtTheRightTime.tscn")
|
||||
const Globals = preload("res://Modules/IssixModule/Globals.gd")
|
||||
var strike = 0
|
||||
var flying_back = false
|
||||
var location_dir = {"hall_elevator": "med_elevator", "mining_elevator": "hall_elevator", "med_elevator": "mining_elevator","main_stairs2": "CBStairs2","main_stairs1": "CBStairs1", "CBStairs2": "main_stairs2", "CBStairs1": "main_stairs1"}
|
||||
|
||||
func _initScene(_args = []):
|
||||
item = RNG.pick(missing_items)
|
||||
location = GM.pc.getLocation()
|
||||
item_target = RNG.pick(["main_dressing2", "main_green_corridor10", "main_green_secret", "main_dressing1", "main_hallroom5", "med_mental_entrance", "medical_hospitalwards", "medical_storage", "med_corridor_split2", "med_nearshower", "med_researchlab", "med_milkingroom", "eng_corridor_blue3", "eng_airventskip", "eng_robotics", "eng_storage", "eng_corridor6", "eng_corridor3", "eng_assemblylab", "mining_shafts_entering", "eng_bay_nearbreakroom", "cellblock_red_playercell", "cellblock_lilac_nearcell", "cellblock_orange_playercell", "cellblock_corridor_nearstairs"])
|
||||
strike = 0
|
||||
flying_back = false
|
||||
# DEBUG
|
||||
item_target = "eng_assemblylab"
|
||||
|
||||
func _run():
|
||||
if(state == ""):
|
||||
addCharacter("hiisi")
|
||||
addCharacter("issix")
|
||||
if getModuleFlag("IssixModule", "Drone_Flight_Unlocked") == false: # first time doing this
|
||||
saynn("[say=pc]Master, is there something I could help with?[/say]")
|
||||
saynn("[say=issix]Pet wants to help? Hmm. Actually there might be something. Hiisi?[/say]")
|
||||
saynn("[say=hiisi]Yes Master?[/say]")
|
||||
saynn("[say=issix]Can you get me a recent task from {pawn1.name}?[/say]")
|
||||
saynn("[say=hiisi]Here you go, Master.[/say]")
|
||||
saynn("Hiisi hands the Master some kind of a note.")
|
||||
saynn("[say=issix]Yeah, {pawn1.name} have lost "+item+" somewhere and they need it back. Based on their scent we can approximate location of "+item+" however you'll still need to do some finding.[/say]")
|
||||
saynn("[say=pc]So... Do I just walk there and look for it?[/say]")
|
||||
saynn("[say=issix]No. Of course not. That would take too long. You are going to use a mini drone.[/say]")
|
||||
saynn("[say=pc]What?[/say]")
|
||||
saynn("[say=issix]A mini drone. Have you ever played with one?[/say]")
|
||||
saynn("[say=pc]Never did.[/say]")
|
||||
saynn("[say=issix]Hiisi will give you an introduction then. It's pretty fun.[/say]")
|
||||
addButton("Introduction", "Hiisi gives you instructions on how to search for items", "introduction")
|
||||
else:
|
||||
saynn("You see a note stickled to Hiisi's blanket. It's another missing item.")
|
||||
|
||||
saynn("[say=pc]You mind if I search for this one?[/say]")
|
||||
saynn("[say=hiisi]Go ahead. I'd rather do something else.[/say]")
|
||||
if GM.pc.getLust() > 60:
|
||||
saynn("[say=pc]Can I be something else?[/say]")
|
||||
saynn("You wink at Hiisi with a smirk, he rolls his eyes and waves you off.")
|
||||
|
||||
saynn("You pull out a drone from the bag and activate it. Putting googles on your head beginning the operation.")
|
||||
addButton("Start", "Start searching for "+item, "search")
|
||||
|
||||
if state == "introduction":
|
||||
|
||||
saynn("[say=hiisi]Alright, so the general idea is as follows - we do various services for people in the prison. One of them is finding their lost items. Just because you are in the prison doesn't mean you don't own things that can get lost. Master acquired a drone that has multiple functionalities, including appropriate sensors for finding scents.[/say]")
|
||||
saynn("[say=pc]Is that even possible? And how is it allowed?[/say]")
|
||||
saynn("[say=hiisi]Well, anthros are a bit better with smell than humans, but nothing beats a specialized machine, so yes, all of the things you use have your smell in some capacity and this device tracks it down. Something something few molecules in big number of particles is good enough. It can somehow differentiate items too, I'm not exactly sure how that works. As to how is it allowed... It isn't. Guards have a hard-on for drones and if they notice one they can get pissy and try to take down the drone. That's why you'll have to [b]avoid guards and engineers[/b] when you fly, drone isn't so easy to catch so you might get lucky, but you are responsible for it if they take it. Inmates don't really care, I think they even like the distraction when they notice a drone.[/say]")
|
||||
saynn("[say=pc]How do I avoid the guards?[/say]")
|
||||
saynn("[say=hiisi]Just make sure you don't bump into walls, allow the drone to go too low or go too near the guards and you should be fine. Usually when you stay in one place the drone is also quieter so guards may not notice it, but it's still a gamble.[/say]")
|
||||
saynn("( You have to use the minimap for checking where the guards/engineers/nurses are, for a reminder - they are marked in blue or yellow )")
|
||||
saynn("[say=pc]What about nurses?[/say]")
|
||||
saynn("[say=hiisi]They don't care. If your item is in the medical wing consider yourself lucky.[/say]")
|
||||
|
||||
saynn("[say=pc]And how will I know where the item is?[/say]")
|
||||
saynn("[say=hiisi]The closer you get the more vibrations the controller gives you. [/say]")
|
||||
saynn("He pulls out the equipment from the bag and passes them to you.")
|
||||
saynn("[say=hiisi]You wear the googles to see what the drone sees, and the controller is as you can imagine - to control the drone. We'd use some kind of neura-link to steer it better however it was way outside the budget and obviously it's not the kind of thing we can make on our own, so analog controller it is. Don't worry, you can do it.[/say]")
|
||||
saynn("[say=hiisi]Oh, also, the drone is pretty quick, so watch out when you fly not to bump into walls.[/say]")
|
||||
|
||||
saynn("He shows you the controls and how to use them. It's pretty intuitive to use even if you don't see the controller when wearing googles. You put the googles on your head, the strap comfortably wraps around your "+GM.pc.getBodypart(BodypartSlot.Head).getName()+".")
|
||||
saynn("[say=hiisi]Looks good. When you are ready hit start button.[/say]")
|
||||
addButton("Start", "Start the search", "search")
|
||||
|
||||
if state == "retrival_failure":
|
||||
saynn("You attempted to fly down and grab "+item+" but missed it with the grabby arms of the drone. You need to do better in next attempt!")
|
||||
state = "search"
|
||||
|
||||
if state == "search":
|
||||
playAnimation(StageScene.Nothing, "nothing", {})
|
||||
aimCameraAndSetLocName(location)
|
||||
saynn("You are hovering in air in "+GM.world.getRoomByID(location).getName())
|
||||
if !flying_back:
|
||||
if distance < 2:
|
||||
saynn("The vibrations of the controller are [b][color=#960003]very intense[/color][/b], the item must be nearby.")
|
||||
elif distance < 4:
|
||||
saynn("The vibrations of the controller are [color=#ff8000]intense[/color] but you feel like this isn't everything you can squeeze out of it.")
|
||||
elif distance < 8:
|
||||
saynn("The vibrations of the controller are [color=green]constant but lightweight[/color], you are getting somewhere but it's still not there.")
|
||||
elif distance < 15:
|
||||
saynn("The vibrations of the controller are [color=blue]sporadic and gentle[/color], this is probably not the area you are looking for.")
|
||||
else:
|
||||
saynn("The controller doesn't vibrate at all, you must be quite far away from your goal.")
|
||||
else:
|
||||
saynn("You are flying back to the corner.")
|
||||
|
||||
var roomID = location
|
||||
if(GM.world.canGoID(roomID, GameWorld.Direction.NORTH)):
|
||||
addButtonAt(6, "North", "Fly north", "go", [GameWorld.Direction.NORTH, Direction.North])
|
||||
else:
|
||||
addDisabledButtonAt(6, "North", "Can't go north")
|
||||
|
||||
if(GM.world.canGoID(roomID, GameWorld.Direction.WEST) or location in ["main_green_corridor7", "med_lobbynw", "med_staffonly_door2", "eng_bay_corridor"]):
|
||||
addButtonAt(10, "West", "Fly west", "go", [GameWorld.Direction.WEST, Direction.West])
|
||||
else:
|
||||
addDisabledButtonAt(10, "West", "Can't go west")
|
||||
|
||||
if(GM.world.canGoID(roomID, GameWorld.Direction.SOUTH)):
|
||||
addButtonAt(11, "South", "Fly south", "go", [GameWorld.Direction.SOUTH, Direction.South])
|
||||
else:
|
||||
addDisabledButtonAt(11, "South", "Can't go south")
|
||||
|
||||
if(GM.world.canGoID(roomID, GameWorld.Direction.EAST) or location in ["yard_vaulthere", "med_staffonly_door1", "med_lobbyne", "eng_bay_nearbreakroom"]):
|
||||
addButtonAt(12, "East", "Fly east", "go", [GameWorld.Direction.EAST, Direction.East])
|
||||
else:
|
||||
addDisabledButtonAt(12, "East", "Can't go east")
|
||||
addButton("Wait", "Stay in place (while being more quiet)", "wait")
|
||||
addButtonsForFloors()
|
||||
if !flying_back:
|
||||
addButton("Retrieve", "Search and retrieve the item", "search_retrieve")
|
||||
|
||||
if state == "search_retrieve":
|
||||
var game = minigameScene.instance()
|
||||
GM.ui.addCustomControl("minigame", game)
|
||||
game.instantEscapePerk()
|
||||
|
||||
game.setDifficulty(RNG.randi_range(1, 2))
|
||||
game.connect("minigameCompleted", self, "onMinigameCompleted")
|
||||
|
||||
if state == "retrival_success":
|
||||
saynn("You were able to fish out "+item+" without an issue! Time to fly back to the harem.")
|
||||
addButton("Fly back", "Fly back", "fly_back")
|
||||
|
||||
if state == "drone_lost":
|
||||
saynn("You lunged with the drone to grab the item again, however someone grabbed the drone while it was diving in for the item and that's about it. You didn't see who that was when the camera feed cut off.")
|
||||
addButton("Drone lost", "You've lost the drone", "issix_fail")
|
||||
|
||||
if state == "landing":
|
||||
aimCameraAndSetLocName(location)
|
||||
saynn("You skillfully land the drone back on empty space of your own blanket. You've successfully brought back "+item+", job well done! You take off your visors and look at the drone with the payload.")
|
||||
saynn("[say=hiisi]Oh nice, you brought the drone back with the item, thanks I'll fetch that and Master will process it.[/say]")
|
||||
saynn("[say=issix]Good job, pet! Our dear customer will surely be happy about it.[/say]")
|
||||
saynn("[say=issix]Hmm, you deserve a little something for this task...[/say]")
|
||||
saynn("He throws a small sack with some physical credits at you")
|
||||
saynn("[say=issix]Here you go[/say]")
|
||||
addButton("Finish", "End the task", "endthescene")
|
||||
|
||||
if state == "guard_catch":
|
||||
aimCameraAndSetLocName(location)
|
||||
saynn("As you continue flying out of the sudden a large object appears in your eyes scaring you. The visor flashes in colors before becoming completely dark.")
|
||||
saynn("[say=pc]What the fuck![/say]")
|
||||
saynn("You continue watching but nothing changes. The controls don't do anything and the visor is completely black.")
|
||||
saynn("[say=hiisi]Anything wrong?[/say]")
|
||||
saynn("[say=pc]I don't know, there was something big that appeared on the screen, then it looked as if camera fell down and...[/say]")
|
||||
saynn("[say=hiisi]Probably not the camera but rather entire drone. That's not great.[/say]")
|
||||
saynn("[say=pc]What?[/say]")
|
||||
saynn("[say=hiisi]Are you sure there were no guards or engineers where you flew?[/say]")
|
||||
saynn("[say=pc]I... Maybe? Do you think...[/say]")
|
||||
saynn("[say=hiisi]Unless you hit invisible wall, which is a thing on video games only - yeah, that's how it looks like when they throw something at the drone.[/say]")
|
||||
saynn("[say=pc]Fuck... What now?[/say]")
|
||||
saynn("[say=hiisi]Eh, it's not great, we don't have any more drones. We either need to order a new one or you somehow recover the one you've lost.[/say]")
|
||||
saynn("[say=pc]And how would I recover this one?[/say]")
|
||||
saynn("[say=hiisi]Beats me.[/say]")
|
||||
saynn("[say=pc]Fuuuck...[/say]")
|
||||
addButton("Issix", "Tell Master about failed task", "issix_fail")
|
||||
|
||||
if state == "issix_fail":
|
||||
saynn("You are afraid of doing this but you did fuck the task up. Only way forward is to admit to your failure.")
|
||||
|
||||
saynn("[say=pc]Master Issix... I'm sorry, I lost the drone.[/say]")
|
||||
if getModuleFlag("IssixModule", "Issix_Mood", 50) < 40:
|
||||
saynn("[say=issix]This is no good, pet. You were responsible for the drone and you fucking lost it.[/say]")
|
||||
saynn("Master seems agitated by your admission.")
|
||||
saynn("[say=issix]They cost a fortune for fuck's sake, is it this fucking difficult to keep it stealthy when you do an item search?[/say]")
|
||||
saynn("[say=pc]I apologize... It was an honest mistake.[/say]")
|
||||
saynn("[say=issix]A mistake you are going to pay for, I hope you have 550 work credits ready, with a bit of luck I could probably turn them into less shitty currency to buy another one. Ugh.[/say]")
|
||||
else:
|
||||
saynn("Master sighs, hiding his face behind a paw that massages their face.")
|
||||
saynn("[say=issix]It's okey, pet. This happens sometimes. Still not great - we need that drone, but not much you can do I guess. Drones usually cost plenty, for work credits that you are acquainted with it would be around 500, I still need to turn that into actual currency. While I could buy one already, you still have to cover the cost for that one.[/say]")
|
||||
saynn("[say=pc]I understand...[/say]")
|
||||
addButtonWithChecks("Pay", "Pay for the drone now", "paydrone", [], [[ButtonChecks.HasCredits, 550 if getModuleFlag("IssixModule", "Issix_Mood", 50) < 40 else 500]])
|
||||
addButton("Pay later", "Pay for the drone at later time (you can do that later in Issix's pet menu)", "endthescenefail")
|
||||
|
||||
if state == "paydrone":
|
||||
saynn("You hand your Master the payment for the drone.")
|
||||
|
||||
saynn("[say=issix]Thank you. I'll make requests and hopefully it should arrive in here in a few days, whenever is the next resupply anyways.[/say]")
|
||||
addButton("End", "End conversation", "endthescenefail")
|
||||
|
||||
func addButtonsForFloors():
|
||||
var loc = location_dir.get(location)
|
||||
if loc:
|
||||
if location.to_lower().find("stairs") != -1:
|
||||
addButton("Use", "Use stairs", "switch_place", [loc.substr(0)])
|
||||
else:
|
||||
addButton("Use", "Use elevator shaft", "switch_place", [loc.substr(0)])
|
||||
|
||||
func onMinigameCompleted(result:MinigameResult):
|
||||
GM.main.pickOption("minigameResult", [result])
|
||||
|
||||
func getDevCommentary():
|
||||
return ""
|
||||
|
||||
func hasDevCommentary():
|
||||
return false
|
||||
|
||||
func supportsShowingPawns() -> bool:
|
||||
return true
|
||||
|
||||
func saveData():
|
||||
var data = .saveData()
|
||||
|
||||
data["location"] = location
|
||||
data["item_target"] = item_target
|
||||
data["item_target_type"] = item_target_type
|
||||
data["item"] = item
|
||||
data["strike"] = strike
|
||||
data["flying_back"] = flying_back
|
||||
|
||||
return data
|
||||
|
||||
func loadData(data):
|
||||
.loadData(data)
|
||||
|
||||
location = SAVE.loadVar(data, "location", "hall_ne_corner")
|
||||
item_target = SAVE.loadVar(data, "item_target", "eng_assemblylab")
|
||||
item_target_type = SAVE.loadVar(data, "item_target_type", 1)
|
||||
item = SAVE.loadVar(data, "item", RNG.pick(missing_items))
|
||||
strike = SAVE.loadVar(data, "strike", 0)
|
||||
flying_back = SAVE.loadVar(data, "flying_back", false)
|
||||
|
||||
func _react(_action: String, _args):
|
||||
if _action == "minigameResult":
|
||||
var minigameResult:MinigameResult
|
||||
minigameResult = _args[0]
|
||||
var minigameScore:float = minigameResult.score
|
||||
if minigameScore >= 0.8:
|
||||
_action = "retrival_success"
|
||||
else:
|
||||
_action = "retrival_failure"
|
||||
|
||||
if _action == "retrival_failure":
|
||||
strike += 1
|
||||
if strike > 2:
|
||||
_action = "drone_lost"
|
||||
setModuleFlag("IssixModule", "Drone_Task_Timeout", -1)
|
||||
|
||||
if _action == "go":
|
||||
location = GM.world.applyDirectionID(location, _args[0])
|
||||
var pawsAtNewLoc = GM.main.IS.getPawnsAt(location)
|
||||
var chances = 0
|
||||
for pawn in pawsAtNewLoc:
|
||||
if pawn.isGuard():
|
||||
chances += 20
|
||||
if RNG.chance(chances) and location != "hall_ne_corner":
|
||||
_action = "guard_catch"
|
||||
elif flying_back:
|
||||
if location != "hall_ne_corner":
|
||||
_action = "fly_back"
|
||||
else:
|
||||
_action = "landing"
|
||||
else:
|
||||
_action = "search"
|
||||
|
||||
if _action == "search":
|
||||
processTime(20)
|
||||
var endLocation = null
|
||||
if item_target_type == 1:
|
||||
endLocation = item_target
|
||||
else:
|
||||
endLocation = GM.main.IS.getPawn(item_target).getLocation()
|
||||
var path = GM.world.calculatePath(location, endLocation)
|
||||
if(path.size() <= 0):
|
||||
endScene()
|
||||
distance = path.size()
|
||||
|
||||
if _action == "landing":
|
||||
var reward = 20
|
||||
var item_index = missing_items.find(item)
|
||||
if item_index != -1:
|
||||
reward = (item_index*8)+RNG.randi_range(0,7)
|
||||
addMessage("You've received "+str(reward)+" from Issix for successful task")
|
||||
GM.pc.addCredits(reward)
|
||||
|
||||
if _action == "switch_place":
|
||||
processTime(20)
|
||||
location = _args[0]
|
||||
_action = "search"
|
||||
|
||||
if _action == "wait": # in case of second type of search this may be broken
|
||||
processTime(60)
|
||||
var pawsAtNewLoc = GM.main.IS.getPawnsAt(location)
|
||||
var chances = 0
|
||||
for pawn in pawsAtNewLoc:
|
||||
if pawn.isGuard():
|
||||
chances += 5
|
||||
if RNG.chance(chances):
|
||||
_action = "guard_catch"
|
||||
else:
|
||||
_action = "search"
|
||||
|
||||
if _action == "fly_back":
|
||||
processTime(20)
|
||||
flying_back = true
|
||||
_action = "search"
|
||||
|
||||
if _action == "guard_catch":
|
||||
setModuleFlag("IssixModule", "Drone_Task_Timeout", -1)
|
||||
|
||||
if(_action == "endthescene"):
|
||||
Globals.addIssixMood(5)
|
||||
setModuleFlag("IssixModule", "Did_Task_Today", true)
|
||||
addMessage("Issix's mood has improved")
|
||||
endScene()
|
||||
return
|
||||
|
||||
if _action == "paydrone":
|
||||
GM.pc.addCredits(-550 if getModuleFlag("IssixModule", "Issix_Mood", 50) < 40 else -500)
|
||||
setModuleFlag("IssixModule", "Drone_Task_Timeout", GM.main.getDays() + RNG.randi_range(4, 6))
|
||||
|
||||
if _action == "endthescenefail":
|
||||
setModuleFlag("IssixModule", "Did_Task_Today", true)
|
||||
Globals.addIssixMood(-3)
|
||||
endScene()
|
||||
return
|
||||
|
||||
setState(_action)
|
172
Modules/IssixModule/Scenes/Tasks/HiisiLaundry.gd
Normal file
172
Modules/IssixModule/Scenes/Tasks/HiisiLaundry.gd
Normal file
|
@ -0,0 +1,172 @@
|
|||
extends SceneBase
|
||||
|
||||
const Globals = preload("res://Modules/IssixModule/Globals.gd")
|
||||
|
||||
var variations1 = ["You pick up a bucket as well as a few T-Shirts.", "You pick up a small basket inside of which there are many counts of used underwear, the entire pile gives a very musky smell.", "Today you only pick up a bottle with some kind of badly smelling fluid, some kind of detergent?", "Hiisi's basket is overflowing with things and two briefs have fallen from the basket pile, he asks you to help out which you do, picking the dropped briefs from the ground and placing them on top of the pile."]
|
||||
var variations2 = ["The laundry at this time is empty. There aren't other inmates roaming around.", "There are a few creatures around the laundry, however they mind their own business.", "Two creatures stand at the furthest-from-entrance end of the laundry and chat, looking at anyone entering the room. Their look fills you with unease."]
|
||||
var will_surprise = false
|
||||
|
||||
|
||||
func _init():
|
||||
sceneID = "HiisiLaundryTask"
|
||||
|
||||
func _run():
|
||||
if(state == ""):
|
||||
saynn("You notice a basket with dirty clothes nearby.")
|
||||
|
||||
saynn("[say=pc]Hey, Hiisi, do you plan to do laundry soon?[/say]")
|
||||
saynn("[say=hiisi]Hmm, I suppose. Want to help?[/say]")
|
||||
saynn("[say=pc]Yes![/say]")
|
||||
saynn("[say=hiisi]Aren't you a bit too excited? It's just laundry. *sigh* Whatever, come.[/say]")
|
||||
saynn("He points at things you are supposed to pick up and move while himself he picks up a large basket with clothes. "+RNG.pick(variations1))
|
||||
saynn("Having everything you both need, you head towards the laundry.")
|
||||
addButton("Continue", "Continue", "laundry")
|
||||
|
||||
if state == "laundry":
|
||||
saynn("You both arrive at the laundry. "+(RNG.pick(variations2)) if !will_surprise else variations2[-1])
|
||||
saynn("Hiisi shows you where, how to put clothes as well as how to program machines for best results"+(", you can hear hushed voices in the back of the laundry" if will_surprise else "")+". It all kind of goes through your head. Hiisi starts the bulky machines one-by-one. They make a loud static noise as machines apply various methods of cleaning the clothes. From water based cleaning to laser cleaning and some other methods you don't recognize and which names of flash on the small and simple display. While waiting for machines to finish, you strike a small talk with Hiisi.")
|
||||
if getModuleFlag("IssixModule", "Hiisi_Affection", 0) < 20:
|
||||
saynn("[say=pc]Those machines look pretty old. Even the consumer grade stuff on medium-advanced planets have newer and faster laundry machines.[/say]")
|
||||
saynn("[say=hiisi]They get the job done. Don't think prison staff cares about anything more.[/say]")
|
||||
saynn("[say=pc]I suppose...[/say]")
|
||||
saynn("[say=hiisi]It doesn't take this long anyway.[/say]")
|
||||
saynn("You both stare at laundry machine finishing up the job, making beeping noise.")
|
||||
else:
|
||||
saynn("[say=pc]Any cool rumors you've overheard recently?[/say]")
|
||||
saynn("[say=hiisi]Hmmm... No, not really. Last few days were rather boring.[/say]")
|
||||
saynn("[say=pc]Really? Nothing? Bummer. I was hoping we could gossip a little while waiting for this boring junk to finish its job.[/say]")
|
||||
saynn("[say=hiisi]Come on, it doesn't take this long.[/say]")
|
||||
if will_surprise:
|
||||
saynn("Hiisi's ears perk up, you notice that he seems to be on guard for some reason, it's barely noticeable, and you only spot it because you've spent a while near Hiisi at this point to recognize his body language.")
|
||||
if GM.pc.getPersonality().getStat(PersonalityStat.Impatient) > 0:
|
||||
saynn("[say=pc]Not long? It takes aaaageeessss. Couldn't we just come back to the corner while it does its thing?[/say]")
|
||||
saynn("[say=hiisi]It's really not that long, you can't possibly be this impatient?[/say]")
|
||||
saynn("[say=pc]I'm not impatient, I'm just trying to save time![/say]")
|
||||
saynn("Hiisi sighs")
|
||||
else:
|
||||
saynn("[say=pc]I guess you are right. How much you think it will take still?[/say]")
|
||||
saynn("[say=hiisi]4 minutes give or take.[/say]")
|
||||
saynn("[say=pc]Doable.[/say]")
|
||||
|
||||
addButton("Continue", "Continue", "laundrycontinued")
|
||||
|
||||
if state == "laundryattack":
|
||||
|
||||
saynn("Machine claims that it should be done in just a minute, you yawn, preparing yourself to start doing [i]something[/i] useful again. Out of nowhere something feels wrong, you've heard slight noise from your right - place you didn't look at for a bit, there were two creatures talked in hushed tones before, the noise you've heard feels really off. You look in the direction of the noise to see an object approaching your face fast.")
|
||||
addButtonWithChecks("Duck", "Duck!", "laundryattackducked", [], [[ButtonChecks.StatCheck, Stat.Agility, 20]])
|
||||
addButton("Stand", "Don't move", "laundryattacksuccess")
|
||||
|
||||
|
||||
if state == "laundryattackducked":
|
||||
saynn("You duck just in time before the object hits your face, shortly after two individuals come at you from the same direction as the thrown object which lands on the floor behind you with a plastic sound.")
|
||||
if GM.pc.getStat(Stat.Strength) > 20 or RNG.chance(20):
|
||||
saynn("Effortlessly you manage to handle the oncoming attack, thwarting it with aggressor relenting.")
|
||||
else:
|
||||
saynn("You struggle with the attack, yanking at each other until you separate.")
|
||||
saynn("Hiisi manages to floor the opponent that attacked them, his {hiisi.foot} steadily keep the aggressor to the ground. He looks your way to assess situation.")
|
||||
saynn("[say=hiisi]Let me help, keep this one.[/say]")
|
||||
saynn("He pulls {hiisi.foot} from inmate laying on the ground that you replace with your own {pc.foot}. He approaches the other inmate that you just fought with, inmate is redying their stance but not fast enough before Hiisi's fist runs over their face and knocks them out in one hit.")
|
||||
|
||||
saynn("[say=pc]Woah...[/say]")
|
||||
|
||||
saynn("[say=hiisi]You okey?[/say]")
|
||||
|
||||
saynn("[say=pc]Yeah, I think...[/say]")
|
||||
|
||||
saynn("[say=hiisi]Bunch of twerps, as usual. I've had an eye on them for a bit since we entered the laundry. They basically smelled of „no good” energy.[/say]")
|
||||
saynn("[say=pc]Will they be okey?[/say]")
|
||||
saynn("[say=hiisi]There is no reason for them not to be, they are just knocked out. This one however...[/say]")
|
||||
saynn("He grabs the inmate from under your {pc.foot} by the collar of their uniform, grabbed inmate looks indifferent but defeated.")
|
||||
saynn("[say=hiisi]Try that again and I'll make sure you are next fuckmeat in stocks.[/say]")
|
||||
|
||||
saynn("Hiisi releases grip on the inmate who thumps to the ground.")
|
||||
saynn("[say=hiisi]It's finished, let's get it over with {pc.name}.[/say]")
|
||||
addButton("Continue", "Take the clothes off the laundry and finish here", "laundryend")
|
||||
|
||||
if state == "laundryend":
|
||||
saynn("The process finally finishes and both of you open the doors of the laundry machines and pick up the clothing inside, putting them all back into the baskets. Clothing is already dry and doesn't have any folds, that's the industrial washing process for you.")
|
||||
saynn("[say=pc]Looks and smells good.[/say]")
|
||||
saynn("[say=hiisi]Mhm.[/say]")
|
||||
if will_surprise:
|
||||
saynn("The two inmates are still laying on the floor as you finish packing, one of them has opened eyes and looks at you as if waiting for you to leave.")
|
||||
|
||||
saynn("[say=hiisi]We got everything, let's go.[/say]")
|
||||
saynn("You follow Hiisi with bunch of stuff back to the corner. Thankfully it's a short walk.")
|
||||
|
||||
saynn("[say=hiisi]Place it there, I'll sort it, no worries. Thanks for the help.[/say]")
|
||||
saynn("[say=pc]Sure, always happy to help.[/say]")
|
||||
saynn("[say=issix]Good {pc.boy}.[/say]")
|
||||
saynn("He says as he ruffles your "+("hair" if GM.pc.hasHair() else "fur")+".")
|
||||
addButton("Task complete", "You've completed the task", "endthescene")
|
||||
|
||||
if state == "laundryattacksuccess":
|
||||
saynn("The object hits you straight in faceleaving you in pain and confusion. You are unsure what hit you, though judging by texture, and weight of what hit you you can sayy it was likely plastic. There is commotion around you, and among ringing sound in your ears you feel punches violating your body.")
|
||||
|
||||
saynn("Vision eventually clears, what you see are two other inmates laying with their backs to the ground.")
|
||||
saynn("You look at yourself, there is blood coming from your nose and you feel in pain both on your face as well as your torso.")
|
||||
saynn("[say=pc]I... No, not really.[/say]")
|
||||
saynn("[say=hiisi]Darn, we will patch you up in the corner. Let's go.[/say]")
|
||||
saynn("[say=pc]What about laundry?[/say]")
|
||||
saynn("[say=hiisi]Doesn't matter, I'll get it later.[/say]")
|
||||
addButton("Come back", "Come back to the harem", "comeback")
|
||||
|
||||
if state == "comeback":
|
||||
saynn("You take Hiisi's paw and walk from the laundry to the corner.")
|
||||
|
||||
saynn("[say=pc]So, do you know the two?[/say]")
|
||||
saynn("[say=hiisi]They are new here, just some ruffians who didn't know any better.[/say]")
|
||||
saynn("[say=pc]What did they even wanted from us?[/say]")
|
||||
saynn("[say=hiisi]Who the hell knows. they were reds, they don't need a reason to attack someone.[/say]")
|
||||
saynn("[say=pc]You are red too...[/say]")
|
||||
saynn("[say=hiisi]Have you seen me attack anyone not in an act of defense?[/say]")
|
||||
saynn("[say=pc]No.[/say]")
|
||||
saynn("[say=hiisi]There you have it.[/say]")
|
||||
saynn("Your short walk ends as you arrive at the harem. Hiisi take a few things from the first aid kit. Your Master looks at you.")
|
||||
saynn("[say=issix]Nothing serious, I assume?[/say]")
|
||||
saynn("[say=pc]Nah, just a-[/say]")
|
||||
saynn("[say=hiisi]He is bruised but fine. Two newbies attacked us at the shower.[/say]")
|
||||
saynn("[say=issix]I see, what about you?[/say]")
|
||||
saynn("[say=hiisi]I'm fine, Master. They sucked at throwing punches as much as they sucked at thinking.[/say]")
|
||||
saynn("[say=issix]Understood[/say]")
|
||||
saynn("Issix shifts his focus back to his other tasks while Hiisi applies some kind of gel to places you were bruised at, it stings for few seconds before giving in to coldness.")
|
||||
saynn("[say=hiisi]Should be fine soon. Disinfected, this should get you better quick. I'll get the laundry, thanks for all the help, stay here and take it easy for a while, okey? [/say]")
|
||||
saynn("[say=pc]Sure you don't need help taking it all back? It was more than one person can take.[/say]")
|
||||
saynn("[say=hiisi]It's okey, I'll just do two rounds. See ya.[/say]")
|
||||
saynn("He leaves.")
|
||||
addButton("Task complete", "You've completed the task", "endthescene")
|
||||
|
||||
|
||||
func _react(_action: String, _args):
|
||||
if _action == "laundrycontinued":
|
||||
if will_surprise:
|
||||
_action = "laundryattack"
|
||||
else:
|
||||
_action = "laundryend"
|
||||
processTime(15*60)
|
||||
|
||||
if _action == "comeback":
|
||||
processTime(10*60)
|
||||
GM.pc.addPain(-30)
|
||||
|
||||
if _action == "laundryend":
|
||||
processTime(10*60)
|
||||
|
||||
if _action == "laundryattacksuccess":
|
||||
GM.pc.addPain(50)
|
||||
|
||||
if _action == "laundryattackducked":
|
||||
GM.pc.addPain(5)
|
||||
|
||||
if _action == "laundry":
|
||||
if RNG.chance(20):
|
||||
will_surprise = true
|
||||
processTime(5*60)
|
||||
|
||||
if(_action == "endthescene"):
|
||||
Globals.addIssixMood(3)
|
||||
setModuleFlag("IssixModule", "Did_Task_Today", true)
|
||||
addMessage("Issix's mood has improved")
|
||||
endScene()
|
||||
return
|
||||
|
||||
setState(_action)
|
Loading…
Reference in a new issue