Issix-mod/Modules/IssixModule/Scenes/SlaveryFirst/RescueFromFightScene.gd

259 lines
12 KiB
GDScript

extends SceneBase
const Globals = preload("res://Modules/IssixModule/Globals.gd")
var enemyID := ""
var fightScene: SceneBase = null
func _init():
sceneID = "RescueFromFight"
func _initScene(_args = []):
enemyID = _args[0]
fightScene = _args[1]
func resolveCustomCharacterName(_charID):
if(_charID == "npc"):
return enemyID
func _run():
if(state == ""): # TODO If enemy is especially powerful summon Issix instead
playAnimation(StageScene.Duo, "stand", {pc="hiisi", npc=enemyID, npcAction="stand"}) # TODO Make an animation with 3 people
addCharacter("hiisi")
addCharacter(enemyID)
saynn("Before fight can continue, all of the sudden Hiisi appears on the scene, he looks a little out of breath but either way, he separates you from {npc.name}.")
saynn("[say=npc]The fuck are you doing here?[/say]")
saynn("[say=hiisi]None of your business, scram.[/say]")
saynn("[say=npc]And why should I?[/say]")
saynn("[say=hiisi]Because the alternative is that you eat shit.[/say]")
if GlobalRegistry.getCharacter(enemyID).getPersonality().getStat(PersonalityStat.Coward) > 0.2:
saynn("[say=npc]Fine, your "+boyfriend()+" is not worth a fight anyways.[/say]")
saynn("{npc.Name} leaves the place. Hiisi leads him with his eyes before turning back to you.")
saynn("[say=hiisi]Everything fine? Sorry for being late.[/say]")
addButton("Fine", "Tell Hiisi you are fine", "sayfine")
addButton("Been better", "Tell Hiisi you've been better", "saybetter")
if GM.pc.getPain() > 50:
addButton("Hurt", "Tell Hiisi you've been hurt", "sayhurt")
else:
addDisabledButton("Hurt", "You are not hurt badly enough to mention being hurt")
else:
saynn("[say=npc]Oh, you sure about that? Try me bitch.[/say]")
saynn("{npc.He} raises his fist readying to fight. Hiisi gestures you to go away.")
addButton("Observe", "Observe from a distance", "fightalone")
addButton("Push Hiisi", "Tell Hiisi that you've got this and he doesn't have to be doing this", "fightpc")
addButton("Leave", "Let the experienced canine handle this", "leave")
if state == "sayfine":
playAnimation(StageScene.Duo, "stand", {pc="hiisi", npc="pc", npcAction="stand"})
saynn("[say=pc]I'm fine, thank you Hiisi.[/say]")
saynn("[say=hiisi]Don't mention it, we need to stick together. I'll go, don't get into trouble again.[/say]")
saynn("[say=pc]Can't promise.[/say]")
addButton("Leave", "Leave as well", "endthescene")
if state == "saybetter":
playAnimation(StageScene.Duo, "stand", {pc="hiisi", npc="pc", npcAction="stand"})
saynn("[say=pc]Eh, I've been better.[/say]")
saynn("[say=hiisi]Hmm, are you hurt? Do you need help?[/say]")
saynn("[say=pc]No, no, not really. Thanks Hiisi, you saved by hide there.[/say]")
saynn("[say=hiisi]Don't mention it, we need to stick together. I'll go, don't get into trouble again.[/say]")
saynn("[say=pc]Can't promise.[/say]")
addButton("Leave", "Leave as well", "endthescene")
if state == "sayhurt":
playAnimation(StageScene.Duo, "kneel", {pc="hiisi", npc="pc", npcAction="kneel"})
saynn("[say=pc]Actually, I think I might need some medical attention, I've been bruised pretty badly.[/say]")
saynn("[say=hiisi]Shit, show.[/say]")
saynn("You show the canine damage on your body, hissing when he touches a place on your "+Globals.getSkinWord()+".")
if GM.pc.hasEffect(StatusEffect.Wounded): # TODO Do that only when there is direct path to medical, check with shit
saynn("[say=hiisi]You are looking really bad, we will have to get you out of here. Follow m- actually, nevermind, let me hold you.[/say]")
if GM.pc.isVisiblyPregnant():
saynn("Canine picks up your entire body, taking extra care not to hurt your offspring, as he moves you towards the infirmary.")
else:
saynn("Canine picks up your entire body and takes you to the infirmary.")
addButton("Infirmary", "See what happens next", "infirmary")
else:
saynn("[say=hiisi]Pretty bad, but I have just a thing.[/say]")
saynn("{hiisi.He} takes a sort of a small bottle with long nozzle as he moves it closer to places that are hurting you. A few drops of some strange liquid later and him massaging the place you feel much better, not feeling much actually. He also gives you a pill that you take to further deal with the pain.")
saynn("[say=hiisi]How is that?[/say]")
saynn("[say=pc]Better, thank you, I don't know what's this but it's pretty magic.[/say]")
saynn("[say=hiisi]Just some next level medicine, can't heal deep wounds but bruises you've had are easy to deal with. You can stand right?[/say]")
saynn("[say=pc]Yeah, no problem.[/say]")
saynn("[say=hiisi]Good. Feel free to come back to the harem if you need further help, alright?[/say]")
saynn("[say=pc]Yup, thanks again![/say]")
saynn("Canine simply leaves you as he moves back towards the corner.")
addButton("Leave", "Leave as well", "endthescene")
if state in ["fightalone", "fightalonedefeat"]:
if state == "fightalone":
saynn("You decide to observe Hiisi's fight from the distance.")
else:
saynn("You watch how Hiisi approaches the victorious inmate.")
saynn("[say=hiisi]You will learn that Issix's pets can fight back.[/say]")
saynn("[say=npc]You are fucking full of it.[/say]")
saynn("[say=hiisi]You'll change your tune.[/say]")
saynn("They continue fighting, at the end, Hiisi emerges victorious sending many punches towards {npc.name} and having no problem taking them down. The difference in power was quite significant.")
saynn("[say=npc]Fuck. Fine. Just leave me fucking be.[/say]")
saynn("[say=hiisi]Learn the smell of my Master and avoid his pets next time, fucker.[/say]")
saynn("[say=npc]Ugh...[/say]")
saynn("Hiisi leaves like that the inmate on his knees recovering {npc.himself}")
addButton("Leave", "Leave", "endthescene") # TODO Expand
if state == "fightpc":
saynn("[say=pc]Hey Hiisi, don't worry, I can handle this.[/say]")
if GM.pc.hasEffect(StatusEffect.Wounded):
saynn("[say=hiisi]No way I'm letting you, you are badly wounded, you are not going anywhere except the infirmary.[/say]")
saynn("[say=pc]No, really I ca-[/say]")
saynn("[say=hiisi]Shut the fuck up and watch, do not move, lay on the ground.[/say]")
saynn("Hiisi is having none of that, he makes you lay on the ground and wait for him to finish the fight.")
else:
saynn("[say=hiisi]Are you absolutely positive you can handle this?[/say]")
saynn("[say=pc]Yes, I'm.[/say]")
saynn("[say=hiisi]*sigh* Fine, go at it.[/say]")
saynn("He steps aside so you can continue fighting.")
addButton("Continue", "Resume the fight", "resumefight")
if state == "hiisi_congratulates":
saynn("[say=hiisi]Good job. I'll go now.[/say]")
saynn("[say=pc]You observed?[/say]")
saynn("[say=hiisi]Just making sure you are not in trouble.[/say]")
saynn("[say=pc]... Thanks.[/say]")
saynn("He waves at you as he continues slowly walking towards the harem. You are now free to do with {npc.name} as you wish.")
addButton(GlobalRegistry.getCharacter(enemyID).getName(), "See what you can do with them", "endthescene")
if state == "hiisi_takesover":
saynn("[say=hiisi]Let me take this over alright? Have some rest.[/say]")
saynn("Says Hiisi as he finishes the job with the inmate.")
addButton("Watch", "Watch what happens next", "fightalonedefeat")
if state == "leave":
saynn("You decide to leave the fight to a more experienced fighter, you are pretty sure Hiisi can handle it.")
addButton("Leave", "Leave the fight scene", "endthescene")
if state == "infirmary":
playAnimation(StageScene.Duo, "stand", {npc="eliza", npcAction="stand", bodyState={naked=true}})
aimCameraAndSetLocName("med_lobbymain")
addCharacter("eliza")
saynn("You arrive in the medical lobby seeing Eliza.")
saynn("[say=hiisi]Good day, I need help with {pc.Name}, they are badly hurt.[/say]")
saynn("[say=eliza]And where does it hurt?[/say]")
saynn("[say=pc]Inside.[/say]")
saynn("[say=eliza]Alright, can you walk by yourself?[/say]")
saynn("[say=pc]I think so.[/say]")
saynn("[say=eliza]Alright, come with me then. Inmate number {hiisi.inmateNumber}, you can now leave, I'll take care of this. As for the payment, your Master I'm sure will cover.[/say]")
saynn("[say=hiisi]Of course, Eliza. You are in good paws {pc.name}, come to our corner later, okey? Good luck.[/say]")
saynn("[say=pc]Thanks Hiisi.[/say]")
saynn("Eliza clips leash to your collar and leads you to the lab.")
addButton("Continue", "", "cryopodtreatment")
if state == "cryopodtreatment":
playAnimation(StageScene.Cryopod, "idle", {bodyState={naked=true}})
if getModuleFlag("MedicalModule", "Medical_FirstTimeHealedHappened"):
saynn("You step after Eliza until you arrive at the lab, Eliza unclasps your leash and begins to tap on machines keyboard, preparing it for your session.")
else: #TODO Expand?
saynn("You eventually arrive in large sterile room with large amount of expensive equipment around. {eliza.She} unclasps your leash and begins to tap on machines keyboard, preparing it for your session.")
addButton()
func boyfriend():
match GM.pc.getGender():
Gender.Male:
return "boyfriend"
Gender.Female:
return "girlfriend"
_:
return "lover"
func cleanupFight():
var pawn:CharacterPawn = GM.main.IS.getPawn("pc")
var interaction:PawnInteractionBase = pawn.getInteraction()
var pawn_ids = interaction.getInvolvedPawnIDs()
pawn_ids.erase("pc")
GM.main.IS.getPawn(pawn_ids[0]).satisfyAnger()
interaction.stopMe() # Force stop interaction with no gains
fightScene.parentSceneUniqueID = -1 # Nullify previous scene so the react is sent nowhere
GM.main.removeScene(fightScene) # Remove fighting scene as if it never happened
func continueFight(): # Hijack parent of FightScene, reorder scene order (so our scene is parent of fight scene, change so Hiisi doesn't interrupt and rerun fighting scene)
var ourCurrentScene = GM.main.sceneStack.pop_back() # Remove our current scene from the SceneStack and save its reference to a variable
fightScene.parentSceneUniqueID = ourCurrentScene.uniqueSceneID # Change parent scene of fightScene so we get a callback when FightScene is over
ourCurrentScene.parentSceneUniqueID = GM.main.sceneStack[-2].uniqueSceneID # Set our parent scene to WorldScene, not needed but makes things neat I guess?
GM.main.sceneStack.insert(GM.main.sceneStack.size()-1, ourCurrentScene) # Reorder stack scene, move this scene to be between WorldScene and FightScene
GM.main.sceneStack.back().sceneTag = "interaction_fight_pcdef_hijacked" # So GameExtender doesn't hijak the scene once again
GM.main.reRun()
func saveData():
var data = .saveData()
data["enemyID"] = enemyID
#warning-ignore:incompatible_ternary
data["fightScene"] = fightScene.uniqueSceneID if is_instance_valid(fightScene) else null
return data
func loadData(data):
.loadData(data)
enemyID = SAVE.loadVar(data, "enemyID", null)
var fight_scene_maybe = SAVE.loadVar(data, "fightScene", null)
if fight_scene_maybe:
fightScene = GM.main.getSceneByUniqueID(fight_scene_maybe) # We might need to find the ID of this one
else:
for scene in GM.main.sceneStack:
if scene.sceneID == "FightScene":
fight_scene_maybe = scene.uniqueSceneID
if fight_scene_maybe == null: # Fail safe
endScene()
return
fightScene = GM.main.getSceneByUniqueID(fight_scene_maybe)
func _react_scene_end(_tag, _result):
if(_tag == "interaction_fight_pcdef_hijacked"):
var battlestate = _result[0]
var parent_scene = GM.main.sceneStack[-2]
var ignore_func_calls := false
if parent_scene == null or parent_scene.sceneID != "WorldScene":
ignore_func_calls = true
if(battlestate == "win"):
if !ignore_func_calls:
parent_scene.sendStatusToInteraction({"won":false})
setState("hiisi_congratulates")
else:
# Nullify the interaction
var pawn:CharacterPawn = GM.main.IS.getPawn("pc")
var interaction:PawnInteractionBase = pawn.getInteraction()
interaction.stopMe()
setState("hiisi_takesover")
func _react(_action: String, _args):
if _action == "cryopodtreatment":
processTime(120*60)
if _action == "infirmary":
GM.pc.setLocation("med_lobbymain")
processTime(15*60)
if _action in ["sayfine", "saybetter", "sayhurt", "fightalone", "leave"]:
processTime(3*60)
cleanupFight()
if _action == "resumefight":
continueFight()
if _action == "sayhurt":
if !GM.pc.hasEffect(StatusEffect.Wounded):
GM.pc.addPain(-35)
GM.pc.addIntoxication(0.15)
processTime(5*60)
if(_action == "endthescene"):
endScene()
return
setState(_action)