From eae0e2ca1b164085bd8d6679bf76a5f313b512bc Mon Sep 17 00:00:00 2001 From: Frisk <7283122+Friskygote@users.noreply.github.com> Date: Wed, 30 Oct 2024 22:25:47 +0100 Subject: [PATCH] 30.10 update, progress on quest --- AzazelCharacter.gd | 4 +- CookieItem.gd | 55 +++++++++++++ EngRoomClosetEvent.gd | 20 +++++ EngRoomScene.gd | 149 ++++++++++++++++++++++++++++++++++ GreenhouseCatnipStealScene.gd | 5 +- Items/cookie.png | Bin 0 -> 5877 bytes Items/cookie.png.import | 35 ++++++++ Items/pierresmap.png | Bin 0 -> 3442 bytes Items/pierresmap.png.import | 35 ++++++++ MapItem.gd | 62 ++++++++++++++ Misc/asciimapsmall.txt | 19 +++++ Module.gd | 16 +++- PetsTalkMain.gd | 34 ++++++-- PierreTalkMain.gd | 29 ++++++- PierresPetQuest.gd | 14 +++- 15 files changed, 458 insertions(+), 19 deletions(-) create mode 100644 CookieItem.gd create mode 100644 EngRoomClosetEvent.gd create mode 100644 EngRoomScene.gd create mode 100644 Items/cookie.png create mode 100644 Items/cookie.png.import create mode 100644 Items/pierresmap.png create mode 100644 Items/pierresmap.png.import create mode 100644 MapItem.gd create mode 100644 Misc/asciimapsmall.txt diff --git a/AzazelCharacter.gd b/AzazelCharacter.gd index 4bc60b1..14b9eed 100644 --- a/AzazelCharacter.gd +++ b/AzazelCharacter.gd @@ -99,11 +99,12 @@ func getThickness() -> int: return 0 func getFemininity() -> int: - return 50 + return 67 func createBodyparts(): giveBodypartUnlessSame(GlobalRegistry.createBodypart("felinehead")) giveBodypartUnlessSame(GlobalRegistry.createBodypart("combedbackhair")) + giveBodypartUnlessSame(GlobalRegistry.createBodypart("dragonhorns")) giveBodypartUnlessSame(GlobalRegistry.createBodypart("felineears")) giveBodypartUnlessSame(GlobalRegistry.createBodypart("anthrobody")) giveBodypartUnlessSame(GlobalRegistry.createBodypart("anthroarms")) @@ -112,7 +113,6 @@ func createBodyparts(): giveBodypartUnlessSame(breasts) giveBodypartUnlessSame(GlobalRegistry.createBodypart("vagina")) giveBodypartUnlessSame(GlobalRegistry.createBodypart("anuswomb")) - giveBodypartUnlessSame(GlobalRegistry.createBodypart("anuswomb")) var tail = GlobalRegistry.createBodypart("felinetail") tail.tailScale = 1 giveBodypartUnlessSame(tail) diff --git a/CookieItem.gd b/CookieItem.gd new file mode 100644 index 0000000..b2c7ff4 --- /dev/null +++ b/CookieItem.gd @@ -0,0 +1,55 @@ +extends ItemBase + +func _init(): + id = "Cookie" + +func getVisibleName(): + return "Cookie" + +func getDescription(): + return "A regular cookie, has brown chocolate chips on it." + +func canUseInCombat(): + return true + +func useInCombat(_attacker:Character, _receiver): + _attacker.addStamina(15) + removeXOrDestroy(1) + return _attacker.getName() + " ate a cookie. They feel a little bit more full." + +func getPossibleActions(): # We really shouldn't assume the item is being used by a player character, but sadly game does not give us context for the item user :( + return [ + { + "name": "Eat one!", + "scene": "UseItemLikeInCombatScene", + "description": "Eat the cookie", + }, + ] + +func getPrice(): + return 0 + +func canSell(): + return true + +func canCombine(): + return true + +func tryCombine(_otherItem): + return .tryCombine(_otherItem) + +func getTags(): + return [] + +func getItemCategory(): + return ItemCategory.Generic + +func saveData(): + var data = .saveData() + return data + +func loadData(data): + .loadData(data) + +func getInventoryImage(): + return "res://Modules/PierreModule/Items/cookie.png" diff --git a/EngRoomClosetEvent.gd b/EngRoomClosetEvent.gd new file mode 100644 index 0000000..6173999 --- /dev/null +++ b/EngRoomClosetEvent.gd @@ -0,0 +1,20 @@ +extends EventBase + +func _init(): + id = "EngRoomClosetEvent" + +func registerTriggers(es): + es.addTrigger(self, Trigger.EnteringRoom, "eng_corridor6") + +func run(_triggerID, _args): + if(3 > getModuleFlag("PierreModule", "Quest_Status") and getModuleFlag("PierreModule", "Quest_Status") > 0): # In the future potentially make it possible to be a daily event thing + if(GM.pc.isBlindfolded()): + addButton("Pierre's Task", "Is it time?", "wall") + +func getPriority(): + return 0 + +func onButton(_method, _args): + if(_method == "wall"): + runScene("EngRoomScene") + diff --git a/EngRoomScene.gd b/EngRoomScene.gd new file mode 100644 index 0000000..4744876 --- /dev/null +++ b/EngRoomScene.gd @@ -0,0 +1,149 @@ +extends SceneBase + +var cabinets = {2: {"name": "2"}, 9: {"name": "9"}, 14: {"name": "14"}, 20: {"name": "20"}, 28: {"name": "28"}, 42: {"name": "|/\\"}, 51: {"name": "51"}, 69: {"name": "69"}, 84: {"name": "84"}, 87: {"name": "87"}, 90: {"name": "90"}} +var empty_loots = [ + "This shelf is filled to the brim with various metallic nuts and bolts. However it has nothing of interest to you", + "After putting your paw deep within the shelve you start feeling very unpleasant coldness coming from the tips of your fingers. Oof! You immediately pull out your paw.", + "The entire filling cabinet starts vibrating after opening this shelve. It does not bode well, you immediately close this shelve. The vibration stops. That was odd." +]# TODO Write more of those +var cabinet_random = RandomNumberGenerator.new() +var current_loot = null # TODO will not survive save/load +var current_cabinet = null + +func _init(): + sceneID = "EngRoomScene" + +func _run(): + if(state == ""): + saynn("You hesitate, last time you walked this hallway you are sure that in this part the only thing you'll meet, if you continue walking, is a wall. This entire thing sounds dumb, and yet... It's a trust excercie, no? Realistically the worst thing that will happen is that you'll eventually hit a wall, doesn't sound like something you can't take.") + addButton("Wall time", "Trust Pierre and walk towards the wall", "trust") + addButton("Nope", "You are not trusting Pierre, this is stupid", "endthescene") + + if(state == "trust"): + aimCameraAndSetLocName("eng_closet") + GM.pc.setLocation("eng_closet") + GM.main.setModuleFlag("PierreModule", "Quest_Status", 2) + saynn("You decide to trust Pierre. You turn 90 degrees, take a deep breath and walk forward. Last time you went this corridor while not blind there was a wall here, an maybe this time...") + saynn("You hear a beep before you, a few screeching sounds. Holy shit, perhaps Pierre was onto something here? You continue walking, the atmosphere changes, the echo of your steps disappeared, the air is more dry and you start to feel claustrophobic. You cautiously drag your foot forward until it hits something seemingly metal. Have you reached your destination?") + processTime(2*60) + var item: ItemBase = GM.pc.getInventory().getEquippedItem(InventorySlot.Eyes) + if(item != null): + var restraint = item.getRestraintData() + if(restraint != null): + if (restraint.canStruggleFinal() and GM.pc.getStamina() > 0) or GM.pc.getInventory().hasItem("restraintkey"): + addButton("Struggle", "It would be useful to see what is going on around", "strugglemenu") + else: + addDisabledButton("Struggle", "Your "+item.getVisibleName() + " is stuck on your eyes") + else: + addButton("Look around", "Look around", "lookaround") + else: + addButton("Look around", "Look around", "lookaround") + addButton("Leave", "Try to leave the room", "leave") + + if state=="leave": + if(GM.pc.isBlindfolded()): + if(GM.pc.hasBlockedHands()): + saynn("You attempt to retrace your setps back where you came from, however it seems like whatever you went through has closed. It's hard to judge how can you even open the doors. After a while of trying, you blast the doors with a serios of forceful pushes, it does not budge.") + processTime(7*60) + else: + saynn("You attempt to retrace your setps back where you came from, however it seems like whatever you went through has closed. Thankfully, it seems like from this end there is a very analog door handle that pulling seems to lead back to the hallway. Or at least you judge that from the sounds.") + processTime(4*60) + else: + processTime(2*60) + saynn("Thankfully, the doors have a regular old-school door handle. You pull it and they swing open.") + saynn("On the other side - curiously, completely flat wall texture. You close the doors and observe how this fit of engineering doors leading to ancient technology closet fits the wall so perfectly that it leaves no evidence of ever existing, not even a tiny crevice can be seen. Above the doors is a camera, maybe it opens the doors?") + aimCameraAndSetLocName("eng_corridor6") + GM.pc.setLocation("eng_corridor6") + addButton("Pierre", "Guess it's time to go back to Pierre", "endthescene") + + if state=="lookaround": + saynn(GM.world.getRoomByID("eng_closet").getDescription()) + addButton("Cabinets", "Try to search cabinets", "cabinets") + addButton("Leave", "Try to leave the room", "leave") + + if state=="cabinets": + saynn("Within so many filling cabinets there are over 12 shelves. You could open some of them and see what's in them, however only one of them is really interesting to you.") # TODO placeholder + addButton("Back", "Look around again", "lookaround") + var activated_cabinets = getModuleFlag("PierreModule", "Activated_Cabinets", {}) + for item in cabinets: + if item in activated_cabinets: + addDisabledButton("Cabinet "+cabinets[item]["name"], "You've already looted this cabinet") + else: + addButton("Cabinet " + cabinets[item]["name"], "Check the cabinet with number "+cabinets[item]["name"], "cabinetloot", [item]) + + if state=="cabinetloot": + saynn("You chose to open cabinet number "+str(current_cabinet)+"...") + if(typeof(current_loot) == 2 or typeof(current_loot) == 0): # event + pass + elif(typeof(current_loot) == 4): #nothing + saynn(current_loot) + else: + saynn("Inside you've found "+str(current_loot.getAmount())+" of "+ current_loot.getVisibleName() +".") + addButton("Take items", "Take the items", "acceptloot") + addButton("Cabinets", "Look at cabinets without picking up anything", "cabinets") + + if state=="cabinet84": + saynn("It is the cabinet mentioned by Pierre. You reach your paw inside and there is a single item inside - a pack of gumball. You grab and take it.") + GM.main.setModuleFlag("PierreModule", "Quest_Status", 3) + addButton("Back", "Look at cabinets", "cabinets") + +func randomItemFromSeed(array): + return array[cabinet_random.randi() % array.size()] + +func randomNumberFromSeed(numStart, numEnd): + cabinet_random.randi_range(numStart, numEnd) + +func generateLoot(cabinet_number: int): + cabinet_random.seed = GM.main.getDays() + cabinet_number * 1000 + var rand_num = cabinet_random.randf() * 100 + if (rand_num < 16): # item + var item_type = randomItemFromSeed(["PlantEgg", "Cookie", "lube", "PlasticBottle", "restraintkey", "WorkCredit", "UsedCondom"]) + var newItem = GlobalRegistry.createItem(item_type) + if item_type == "PlantEgg": + newItem.whoGaveBirth = "thisnamedoesntexistbecauseplayercantpossiblyknowwhoseggsthoseare" + newItem.setAmount(randomNumberFromSeed(2, 3)) + elif item_type == "cookie": + newItem.setAmount(randomNumberFromSeed(2, 3)) + elif item_type == "Credit": + newItem.setAmount(randomNumberFromSeed(3, 5)) + elif item_type == "UsedCondom": + newItem.markLastUser("unknown person") + newItem.generateFluids() + var fluids = newItem.getFluids() + var allowedFluids = ["CumLube", "BlackGoo"] + if OPTIONS.isContentEnabled(ContentType.Watersports): + allowedFluids.append("Piss") + fluids.addFluid(randomItemFromSeed(allowedFluids), randomNumberFromSeed(2, 5)*100.0) + return newItem + elif (rand_num < 21): # TODO event + saynn(randomItemFromSeed(empty_loots)) + var activated_cabinets = getModuleFlag("PierreModule", "Activated_Cabinets", {}) + activated_cabinets[cabinet_number] = true + GM.main.setModuleFlag("PierreModule", "Activated_Cabinets", activated_cabinets) + return 1 + else: + return randomItemFromSeed(empty_loots) + + +func _react(_action: String, _args): + + if(_action == "endthescene"): + endScene() + return + + if(_action == "cabinetloot"): + current_loot = generateLoot(_args[0]) + current_cabinet = _args[0] + + if(_action == "acceptloot"): + var activated_cabinets = getModuleFlag("PierreModule", "Activated_Cabinets", {}) + activated_cabinets[current_cabinet] = true + GM.main.setModuleFlag("PierreModule", "Activated_Cabinets", activated_cabinets) + GM.pc.getInventory().addItem(current_loot) + _action = "cabinets" + + if(_action == "strugglemenu"): + runScene("StrugglingScene") + return + + setState(_action) diff --git a/GreenhouseCatnipStealScene.gd b/GreenhouseCatnipStealScene.gd index 5ec0f48..f4ab7d8 100644 --- a/GreenhouseCatnipStealScene.gd +++ b/GreenhouseCatnipStealScene.gd @@ -13,7 +13,7 @@ func _run(): saynn("What do you wanna do?") - addButton("Steal catnip plant", "Sneak in, grab one and get out", "catnip") + addButton("Take catnip", "Sneak in, grab one and get out", "catnip") addButton("Don't steal", "Too dangerous", "endthescene") if(state == "catnip"): @@ -37,6 +37,7 @@ func _react(_action: String, _args): return addMessage("Seems like you got away safely") + addButton("Leave", "Leve the crime scene", "endthescene") return if(_action == "endthescene"): @@ -44,3 +45,5 @@ func _react(_action: String, _args): return setState(_action) + +# The amount of times I wrote "catnap" instead of "catnip" is insane. Thanks that one horror game franchise. diff --git a/Items/cookie.png b/Items/cookie.png new file mode 100644 index 0000000000000000000000000000000000000000..2506b9f1810270eb64b6c2315f6ba9658d46e779 GIT binary patch literal 5877 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 H+AR2g=zSn9 literal 0 HcmV?d00001 diff --git a/Items/cookie.png.import b/Items/cookie.png.import new file mode 100644 index 0000000..f754118 --- /dev/null +++ b/Items/cookie.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/cookie.png-336e1b6e247a83a565bb339a213d5e2c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Modules/PierreModule/Items/cookie.png" +dest_files=[ "res://.import/cookie.png-336e1b6e247a83a565bb339a213d5e2c.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=0 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/Items/pierresmap.png b/Items/pierresmap.png new file mode 100644 index 0000000000000000000000000000000000000000..292acf77da8f9cae65a3e38d31479ef3588c0a1b GIT binary patch literal 3442 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 89 and GM.main.getModuleFlag("PierreModule", "Quest_Status") > 1): pass elif(score > 75 and score_explored < 9999): + playAnimation(StageScene.Duo, "stand", {npc="pierre", npcAction="stand"}) saynn("You mention the intention to join his harem of pets, lust in your eyes. He looks at you and starts grinning.") saynn("[say=pierre]Mmmmmm. You are almost done morsel. Not mine yet, but so close... I really like you. I really really like you. I think you have all of the qualities I'm looking for in a pet but...[/say]") saynn("He looks away, and looks... Concerned? No. In deep thought rather.") @@ -127,6 +128,7 @@ func _run(): else: addDisabledButton("Stray kitten", "Your mind doesn't allow you to make this choice") elif(score > 45 and score_explored < 76): + playAnimation(StageScene.Duo, "stand", {npc="pierre", npcAction="stand"}) saynn("[say=pierre]Heh, interesting ask. It's still a no, though I have to admit, I do see some potential in here.[/say]") if (GM.pc.isBlindfolded()): saynn("Pierre stands up, takes a step towards you, grabs your blindfold, pulls it higher, grabs you by your chin to look you straight in your eyes.") @@ -150,7 +152,9 @@ func _run(): else: saynn("[say=pierre]Look, you are lovely and all that, but I don't think you have what it takes to join my other pets. I require absolute obedience and sexual experience. Once you submit to me there is no going back, you become MY treasured pet forever. Those three? They know their place, they are ready to be mated whenever I feel like doing so. They obey my every single command. I just don't see that in you, sorry.[/say]") addButton("Back", "Maybe another time then...", "pets2") + if(state == "quest"): + playAnimation(StageScene.Duo, "stand", {npc="pierre", npcAction="sit"}) if (GM.main.getModuleFlag("PierreModule", "Quest_Status") == -1): saynn("[say=pierre]I see... Disappointing, but it's your choice and I respect that.[/say]") saynn("He looks at you some more, he takes away his paw from your chin, turns around and sits on his chair. A serious and... Disappointed look on his face.") @@ -163,10 +167,27 @@ func _run(): sayn("He takes your tongue in between his paw fingers gently, pulls it out a little. He opens his mouth and he spits. Spit lands right on your tongue, with incredible precision right in the middle. He does it again, using the fact your mouth is still open. It lands deeper inside your mount. He pulls his paw fingers from your tongue and uses his two fingers to pressure your chin from below, giving you a signal to close your mouth.") sayn("You comply. There is nothing other than his eyes staring deep at you, his will is your will. His spit doesn't feel particularly different from yours, perhaps you can pick up some flavor or two, but it's more dignified flavor than one of cum that you are so used to. You keep the spit inside your mouth for a bit, tasting it, feeling it, connecting with its owner. And you swallow it, with a visible gulp.") saynn("Pierre smiles. He ruffles your " + ("hair" if GM.pc.hasHair() else "ears") + " with his paws.") - saynn("[say=pierre]Good pet.\nNow, to be MY pet you'll have to prove yourself further. Besides the fact I want my pets to be all famous in this little heaven of ours, I want to make sure they follow my orders and don't leave my side. For you my dear, I have a little task, nothing you can't do, I'm sure, but it will be the proof I need you can become MY pet.[/say]") + saynn("[say=pierre]Good pet.\nNow, to be MY pet you'll have to prove yourself further. Besides the fact I want my pets to be all famous in this little heaven of ours, I want to make sure they follow my orders. For you my dear, I have a few little tasks, nothing you can't do, I'm sure, but it will be the proof I need you can become MY pet.[/say]") saynn("He turns around and moves towards his chair, where he sits.") - saynn("[say=pierre][/say]") - GM.main.setModuleFlag("PierreModule", "Quest_Status", 1) + saynn("[say=pierre]Your first task will require... Trust. In me. Tell me, do you trust me?[/say]") + addButton("Yes", "Say you trust Pierre", "questresponseyes") + addButton("No", "Say you don't trust Pierre", "questresponseno") + + if(state in ["questresponseyes", "questresponseno"]): + GM.main.setModuleFlag("PierreModule", "Quest_Status", 1) + if(state=="questresponseyes"): + saynn("Pierre grins after hearing the answer.") + sayn("[say=pierre]Excellent. Now, what I want to do is verify your trust, and gain some of my own trust in you. You must be acutely aware how words, especially in this place"+ (" and especially coming from a red like yourself" if GM.pc.getInmateType() == InmateType.HighSec else "") + " can be deceptive.[/say]") + if(state=="questresponseno"): + saynn("Pierre looks at you, studying you.") + saynn("[say=pierre]Curious. Not the answer I anticipated. It's fine, we can work on that.[/say]") + saynn("[say=pierre]For your first task, you'll need something I'm sure you are now well acquainted with - a blindfold. After all, what is the better tool to test someone's trust than tell them to do something stupid blind?[/say]") + saynn("He chuckles") + saynn("[say=pierre]You will have to use your little head a bit too before you put one. I'll give you a map, I've drawn it myself, but it has to do. I won't spoil your fun and tell you what it shows, I'm sure you are clever enough to figure it out by yourself, after all, this prison isn't thaaat big, right?[/say]") + saynn("He winks at you, and lets out a chuckle.") + saynn("[say=pierre]Go there, blind yourself, go through a wall and bring me the goods. The number you'll need is 84. And morsel, don't hang in there for too long, trust me on that. Don't worry, I'll know if you succeed or not, don't try to cheat. Remember, trust is the key.[/say]") + addButton("Leave", "Take your leave", "endthescene") + func calculateHaremScore(): var score = 0 diff --git a/PierresPetQuest.gd b/PierresPetQuest.gd index c1e8129..668da11 100644 --- a/PierresPetQuest.gd +++ b/PierresPetQuest.gd @@ -10,9 +10,11 @@ func getProgress(): var quest_status = GM.main.getModuleFlag("PierreModule", "Quest_Status") var result = [] - result.append("Pierre gave you a task") + result.append("Pierre gave you a map and a task - to get him whatever is in a place marked on the map, and look for number 84. Apparently this trust exercise requires you to wear a blindfold, wonder why...") if(quest_status > 1): - pass + result.append("You've found the hidden closet. Now just to find what Pierre asked of you...") + if(quest_status > 2): + result.append("You've got a pack of gumball. Return it to Pierre.") return result @@ -24,3 +26,11 @@ func isCompleted(): func isMainQuest(): return false + +# quest_status - state (number) +# 0 - no quest/haven't started +# -1 - refused Pierres quest +# 1 - accepted Pierres quest +# 2 - arrived at closet +# 3 - looted the gumball +# 4 - gave the gumball to Pierre