From e763c085c1df077d96379842a6714d2afd79b470 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 12 Feb 2019 23:24:22 +0100 Subject: [PATCH] 0.8l2 --- Corruption-of-Champions-FD-STANDALONE.as3proj | 2 +- classes/classes/BaseContent.as | 4 + classes/classes/CoC.as | 4 +- classes/classes/Creature.as | 1 + classes/classes/EngineCore.as | 1 - classes/classes/EventParser.as | 1486 +++++++++-------- classes/classes/Items/ArmorLib.as | 2 + classes/classes/Items/Mutations.as | 4 +- classes/classes/PerkLib.as | 310 ++-- classes/classes/Player.as | 63 +- classes/classes/PlayerEvents.as | 4 +- classes/classes/PlayerInfo.as | 6 +- .../Scenes/Areas/Caves/DisplacerBeastScene.as | 4 +- classes/classes/Scenes/Camp.as | 12 +- classes/classes/Scenes/Camp/CampUpgrades.as | 2 +- classes/classes/Scenes/Changelog.as | 123 +- .../classes/Scenes/Combat/MagicSpecials.as | 8 +- classes/classes/Scenes/Dungeons/Factory.as | 3 +- .../Scenes/Monsters/GoblinAdventurers.as | 2 +- classes/classes/Scenes/NPCs/AikoScene.as | 33 +- classes/classes/Scenes/NPCs/AriaFollower.as | 4 + classes/classes/Scenes/NPCs/Aurora.as | 2 +- classes/classes/Scenes/NPCs/AyaneFollower.as | 10 +- classes/classes/Scenes/NPCs/CeaniScene.as | 21 + classes/classes/Scenes/NPCs/ChiChiFollower.as | 26 +- .../classes/Scenes/NPCs/ElectraFollower.as | 9 + classes/classes/Scenes/NPCs/LunaFollower.as | 36 + classes/classes/Scenes/NPCs/PatchouliScene.as | 16 + classes/classes/Scenes/Places/HeXinDao.as | 49 +- classes/classes/StatusEffects.as | 1 + classes/classes/display/SpriteDb.as | 14 + res/sprites/aria.png | Bin 0 -> 2033 bytes res/sprites/bimbo-cat.png | Bin 0 -> 3840 bytes res/sprites/electra1.png | Bin 0 -> 5041 bytes res/sprites/luna-maid.png | Bin 0 -> 2780 bytes res/sprites/patts1.png | Bin 0 -> 2733 bytes 36 files changed, 1250 insertions(+), 1012 deletions(-) create mode 100644 res/sprites/aria.png create mode 100644 res/sprites/bimbo-cat.png create mode 100644 res/sprites/electra1.png create mode 100644 res/sprites/luna-maid.png create mode 100644 res/sprites/patts1.png diff --git a/Corruption-of-Champions-FD-STANDALONE.as3proj b/Corruption-of-Champions-FD-STANDALONE.as3proj index 430755cdb9..ce002761d1 100644 --- a/Corruption-of-Champions-FD-STANDALONE.as3proj +++ b/Corruption-of-Champions-FD-STANDALONE.as3proj @@ -4,7 +4,7 @@ - + diff --git a/classes/classes/BaseContent.as b/classes/classes/BaseContent.as index 31dc40e162..c775b47e59 100644 --- a/classes/classes/BaseContent.as +++ b/classes/classes/BaseContent.as @@ -41,6 +41,10 @@ import coc.xxc.StoryContext; { EventParser.cheatTime(time, needNext); } + protected function cheatTime2(time:Number, needNext:Boolean = false):void + { + EventParser.cheatTime2(time, needNext); + } /*protected function incrementDay(time:Number):void { CoC.instance.incrementDay(time); diff --git a/classes/classes/CoC.as b/classes/classes/CoC.as index e1a42b39c9..d50f7adc05 100644 --- a/classes/classes/CoC.as +++ b/classes/classes/CoC.as @@ -249,8 +249,8 @@ public class CoC extends MovieClip //model.debug = debug; // TODO: Set on model? //Version NUMBER - ver = "1.0.2_mod_Xianxia_0.8l"; - version = ver + " (New Lunar Year mini-event + pig/boar/elf TF's rework, orc + displacer beast TF, 2 new areas + new enemies, Job: Gunslinger perk line, Perk-o-calipse 4 (77 perks), Achiev-o-calipse (over 70 new achievs), The Unicorn Daughter Strikes Back (Yes Celess is Back))"; + ver = "1.0.2_mod_Xianxia_0.8l2"; + version = ver + " (Bugfixes + missing content that not make in time for previous version)"; this.images = new ImageManager(stage, mainView); this.inputManager = new InputManager(stage, mainView, false); diff --git a/classes/classes/Creature.as b/classes/classes/Creature.as index 50406b11c9..4e5d342d98 100644 --- a/classes/classes/Creature.as +++ b/classes/classes/Creature.as @@ -2568,6 +2568,7 @@ public class Creature extends Utils public static const canPounceArms:Array = [ Arms.CAT, + Arms.DISPLACER, Arms.LION, Arms.SPHINX, Arms.WOLF, diff --git a/classes/classes/EngineCore.as b/classes/classes/EngineCore.as index c252563170..e0ba3f95f2 100644 --- a/classes/classes/EngineCore.as +++ b/classes/classes/EngineCore.as @@ -833,7 +833,6 @@ public class EngineCore { trace("Do next setup cancelled by game over"); return; } - //trace("DoNext have item:", eventNo); //choices("Next", event, "", 0, "", 0, "", 0, "", 0, "", 0, "", 0, "", 0, "", 0, "", 0); menu(); diff --git a/classes/classes/EventParser.as b/classes/classes/EventParser.as index 34ab5e8e21..59a065b4cb 100644 --- a/classes/classes/EventParser.as +++ b/classes/classes/EventParser.as @@ -1,733 +1,753 @@ -package classes { -import classes.BodyParts.Hair; -import classes.GlobalFlags.kACHIEVEMENTS; -import classes.GlobalFlags.kFLAGS; -import classes.Items.ArmorLib; -import classes.Items.ShieldLib; -import classes.Items.UndergarmentLib; -import classes.Items.WeaponLib; -import classes.Scenes.Dungeons.DungeonAbstractContent; -import classes.Scenes.SceneLib; -import classes.internals.Utils; - -import coc.view.MainView; - -import flash.net.SharedObject; -import flash.utils.getQualifiedClassName; - -public class EventParser { - private static var _timeAwareClassList:Vector. = new Vector.(); - //Used by the eventParser in calling timeAwareLarge - private static var timeAwareLargeLastEntry:int = -1; - private static var _doCamp:Function; - private static var _campSet:Boolean = false; - - public static function playerMenu():void { - CoC.instance.mainViewManager.hidePlayerDoll(); - if (!CoC.instance.inCombat) { - CoC.instance.spriteSelect(-1); - } - CoC.instance.mainView.setMenuButton(MainView.MENU_NEW_MAIN, "New Game", CoC.instance.charCreation.newGameGo); - CoC.instance.mainView.nameBox.visible = false; - if (CoC.instance.gameState == 1 || CoC.instance.gameState == 2) { - SceneLib.combat.combatMenu(); - return; - } - //Clear restriction on item overlaps if not in combat - CoC.instance.plotFight = false; - if (DungeonAbstractContent.inDungeon) { - //dungeonMenu(); - SceneLib.dungeons.checkRoom(); - return; - } - else if (DungeonAbstractContent.inRoomedDungeon) { - if (DungeonAbstractContent.inRoomedDungeonResume != null) DungeonAbstractContent.inRoomedDungeonResume(); - return; - } - CoC.instance.flags[kFLAGS.PLAYER_PREGGO_WITH_WORMS] = 0; - _doCamp(); - } - - public static function gameOver(clear:Boolean = false):void { //Leaves text on screen unless clear is set to true - if (CoC.instance.testingBlockExiting) { - EngineCore.doNext(SceneLib.camp.returnToCampUseOneHour); //Prevent ChaosMonkah instances from getting stuck - } - else { - var textChoices:Number = Utils.rand(4); - if (clear) EngineCore.clearOutput(); - EngineCore.outputText("\n\n"); - if (textChoices == 0) EngineCore.outputText("GAME OVER"); - if (textChoices == 1) EngineCore.outputText("Game over, man! Game over!"); - if (textChoices == 2) EngineCore.outputText("You just got Bad-Ended!"); - if (textChoices == 3) EngineCore.outputText("Your adventures have came to an end..."); - EngineCore.outputText(""); - //Delete save on hardcore. - if (CoC.instance.flags[kFLAGS.HARDCORE_MODE] > 0) { - EngineCore.outputText("\n\nYour save file has been deleted as you are on Hardcore Mode!"); - CoC.instance.flags[kFLAGS.TEMP_STORAGE_SAVE_DELETION] = CoC.instance.flags[kFLAGS.HARDCORE_SLOT]; - var test:* = SharedObject.getLocal(CoC.instance.flags[kFLAGS.TEMP_STORAGE_SAVE_DELETION], "/"); - if (test.data.exists) { - trace("DELETING SLOT: " + CoC.instance.flags[kFLAGS.TEMP_STORAGE_SAVE_DELETION]); - test.clear(); - } - } - CoC.instance.flags[kFLAGS.TIMES_BAD_ENDED]++; - EngineCore.awardAchievement("Game Over!", kACHIEVEMENTS.GENERAL_GAME_OVER, true, true); - EngineCore.menu(); - EngineCore.addButton(0, "Game Over", gameOverMenuOverride).hint("Your game has ended. Please load a saved file or start a new game."); - if (CoC.instance.flags[kFLAGS.HARDCORE_MODE] <= 0) EngineCore.addButton(1, "Continue", SceneLib.camp.wakeFromBadEnd).hint("It's all just a dream. Wake up."); - //addButton(3, "NewGamePlus", charCreation.newGamePlus).hint("Start a new game with your equipment, experience, and gems carried over."); - if (CoC.instance.flags[kFLAGS.EASY_MODE_ENABLE_FLAG] == 1 || CoC.instance.debug) EngineCore.addButton(4, "Debug Cheat", playerMenu); - gameOverMenuOverride(); - - } - CoC.instance.inCombat = false; - DungeonAbstractContent.dungeonLoc = 0; //Replaces inDungeon = false; - } - - private static function gameOverMenuOverride():void { //Game over event; override whatever the fuck has been done to the UI up to this point to force display of the data and new game buttons - CoC.instance.mainView.showMenuButton(MainView.MENU_NEW_MAIN); - CoC.instance.mainView.showMenuButton(MainView.MENU_DATA); - CoC.instance.mainView.hideMenuButton(MainView.MENU_APPEARANCE); - CoC.instance.mainView.hideMenuButton(MainView.MENU_LEVEL); - CoC.instance.mainView.hideMenuButton(MainView.MENU_PERKS); - } - - public static function getCurrentStackTrace():String // Fuck, stack-traces only work in the debug player. - { - var tempError:Error = new Error(); - var stackTrace:String = tempError.getStackTrace(); - return stackTrace; - } - - public static function errorPrint(details:* = null):void { - EngineCore.rawOutputText("Congratulations, you've found a bug!", true); - EngineCore.rawOutputText("\nError: Unknown event!"); - EngineCore.rawOutputText("\n\nPlease report that you had an issue with code: \"" + details + "\" "); - EngineCore.rawOutputText("\nGame version: \"" + CoC.instance.ver + "\" (THIS IS IMPORTANT! Please be sure you include it!) "); - - var sTrace:String = getCurrentStackTrace(); - - if (sTrace) // Fuck, stack-traces only work in the debug player. - EngineCore.rawOutputText("and stack-trace: \n
" + sTrace + "
\n"); - EngineCore.rawOutputText("to fake-name on the forums or better yet, file a bug report on github: "); - EngineCore.rawOutputText("\nhttps://github.com/herp-a-derp/Corruption-of-Champions"); - - EngineCore.rawOutputText("\nPlease try to include the details of what you were doing when you encountered this bug "); - if (sTrace) - EngineCore.rawOutputText(" (including the above stack trace copy&pasted into the details),"); - EngineCore.rawOutputText(" to make tracking the issue down easier. Thanks!"); - - EngineCore.doNext(SceneLib.camp.returnToCampUseOneHour); - } - - public static function goNext(time:Number, needNext:Boolean):Boolean { - Utils.Begin("eventParser", "goNext", time); - var x:Boolean = goNextWrapped(time, needNext); - Utils.End("eventParser", "goNext"); - return x; - } - - private static function goNextWrapped(time:Number, needNext:Boolean):Boolean { - var player:Player = CoC.instance.player; - //Update system time - //date = new Date(); - //trace ("MONTH: " + date.month + " DATE: " + date.date + " MINUTES: " + date.minutes); - //clearOutput(); - if (timeAwareLargeLastEntry >= 0) { //Finish calling timeChangeLarge before advancing the hour again - for (; timeAwareLargeLastEntry < _timeAwareClassList.length; timeAwareLargeLastEntry++) { - var item:TimeAwareInterface = _timeAwareClassList[timeAwareLargeLastEntry]; - var classname:String = getQualifiedClassName(item); - Utils.Begin("TimeAwareInterface", classname + ".timeChangeLarge"); - if (item.timeChangeLarge()) { - Utils.End("TimeAwareInterface", classname + ".timeChangeLarge"); - return true; - } - Utils.End("TimeAwareInterface", classname + ".timeChangeLarge"); - } - timeAwareLargeLastEntry = -1; - } - while (CoC.instance.timeQ > 0) { - CoC.instance.timeQ--; - CoC.instance.model.time.hours++; - SceneLib.combat.regeneration(false); - if (player.findPerk(PerkLib.JobSoulCultivator) >= 0) SceneLib.combat.soulforceregeneration(false); - if (player.findPerk(PerkLib.JobSorcerer) >= 0) SceneLib.combat.manaregeneration(false); - SceneLib.combat.wrathregeneration(false); - //Inform all time aware classes that a new hour has arrived - for (var tac:int = 0; tac < _timeAwareClassList.length; tac++) { - item = _timeAwareClassList[tac]; - classname = getQualifiedClassName(item); - Utils.Begin("TimeAwareInterface", classname + ".timeChange"); - if (item.timeChange()) needNext = true; - Utils.End("TimeAwareInterface", classname + ".timeChange"); - } - if (CoC.instance.model.time.hours > 23) { - CoC.instance.model.time.hours = 0; - CoC.instance.model.time.days++; - } else if (CoC.instance.model.time.hours == 21) { - if (CoC.instance.flags[kFLAGS.LETHICE_DEFEATED] <= 0) EngineCore.outputText("\nThe sky darkens as a starless night falls. The blood-red moon slowly rises up over the horizon.\n"); - else EngineCore.outputText("\nThe sky darkens as a starry night falls. The blood-red moon slowly rises up over the horizon.\n"); - needNext = true; - } else if (CoC.instance.model.time.hours == 6) { - EngineCore.outputText("\nThe sky begins to grow brighter as the moon descends over distant mountains, casting a few last ominous shadows before they burn away in the light.\n"); - needNext = true; - } - //BIG EVENTS GO IN HERE - //BIG EVENTS GO IN HERE - //BIG EVENTS GO IN HERE - //BIG EVENTS GO IN HERE - - /* Inform all time aware classes that it's time for large events to trigger. Note that timeChangeLarge could be called multiple times in a single tick - of the clock, so any updates should happen in timeChange and any timeChangeLarge events need to make sure they cannot repeat within the same hour. - In effect these are the same rules the existing code acted under. */ - for (timeAwareLargeLastEntry = 0; timeAwareLargeLastEntry < _timeAwareClassList.length; timeAwareLargeLastEntry++) { - item = _timeAwareClassList[timeAwareLargeLastEntry]; - classname = getQualifiedClassName(item); - Utils.Begin("TimeAwareInterface", classname + ".timeChangeLarge"); - if (item.timeChangeLarge()) { - Utils.End("TimeAwareInterface", classname + ".timeChangeLarge"); - return true; - } - Utils.End("TimeAwareInterface", classname + ".timeChangeLarge"); - } - timeAwareLargeLastEntry = -1; //If this var is -1 then this function has called timeChangeLarge for all entries in the _timeAwareClassList - - Utils.Begin("eventParser", "impGangBangProgress"); - var igb:int = impGangBangProgress(); - Utils.End("eventParser", "impGangBangProgress"); - if (igb == 1) needNext = true; - if (igb == 2) return true; - - Utils.Begin("eventParser", "pregnancyProgress"); - igb = pregnancyProgress(); - Utils.End("eventParser", "pregnancyProgress"); - if (igb == 1) needNext = true; - if (igb == 2) return true; - - Utils.Begin("eventParser", "eggLoot"); - igb = eggLootProgress(); - Utils.End("eventParser", "eggLoot"); - if (igb == 1) needNext = true; - if (igb == 2) return true; - } - - // Hanging the Uma massage update here, I think it should work... - SceneLib.telAdre.umasShop.updateBonusDuration(time); - if (player.hasStatusEffect(StatusEffects.UmasMassage)) { - trace("Uma's massage bonus time remaining: " + player.statusEffectv3(StatusEffects.UmasMassage)); - } - - SceneLib.highMountains.izumiScenes.updateSmokeDuration(time); - if (player.hasStatusEffect(StatusEffects.IzumisPipeSmoke)) { - trace("Izumis pipe smoke time remaining: " + player.statusEffectv1(StatusEffects.IzumisPipeSmoke)); - } - - //Drop axe if too short! - if (player.tallness < 78 && player.weapon == CoC.instance.weapons.L__AXE) { - EngineCore.outputText("\nThis axe is too large for someone of your stature to use, though you can keep it in your inventory until you are big enough.\n"); - SceneLib.inventory.takeItem(player.setWeapon(WeaponLib.FISTS), playerMenu); - return true; - } - if (player.tallness < 78 && player.weapon == CoC.instance.weapons.DL_AXE_) { - EngineCore.outputText("\nThis dual axes are too large for someone of your stature to use, though you can keep them in your inventory until you are big enough.\n"); - SceneLib.inventory.takeItem(player.setWeapon(WeaponLib.FISTS), playerMenu); - return true; - } - if (player.tallness < 60 && player.weapon == CoC.instance.weapons.L_HAMMR) { - EngineCore.outputText("\nYou've become too short to use this hammer anymore. You can still keep it in your inventory, but you'll need to be taller to effectively wield it.\n"); - SceneLib.inventory.takeItem(player.setWeapon(WeaponLib.FISTS), playerMenu); - return true; - } -// if (player.weapon == weapons.CLAYMOR && player.str < 40) { -// outputText("\nYou aren't strong enough to handle the weight of your weapon any longer, and you're forced to stop using it.\n"); -// inventory.takeItem(player.setWeapon(WeaponLib.FISTS), playerMenu); -// return true; -// } -// if (player.weapon == weapons.WARHAMR && player.str < 80) { -// outputText("\nYou aren't strong enough to handle the weight of your weapon any longer!\n"); -// inventory.takeItem(player.setWeapon(WeaponLib.FISTS), playerMenu); -// return true; -// } - //Drop beautiful sword if corrupted! - if (player.weaponPerk == "holySword" && player.cor >= (33 + player.corruptionTolerance())) { - EngineCore.outputText("\nThe [weapon] grows hot in your hand, until you are forced to drop it. Whatever power inhabits this blade appears to be unhappy with you. Touching it gingerly, you realize it is no longer hot, but as soon as you go to grab the hilt, it nearly burns you.\n\nYou realize you won't be able to use it right now, but you could probably keep it in your inventory.\n\n"); - SceneLib.inventory.takeItem(player.setWeapon(WeaponLib.FISTS), playerMenu); - return true; - } - //Drop Excalibur if corrupted! - if (player.weaponPerk == "Excalibur" && player.cor >= (33 + player.corruptionTolerance())) { - EngineCore.outputText("\nThe [weapon] grows hot in your hand, until you are forced to drop it. Whatever power inhabits this blade appears to be unhappy with you. Touching it gingerly, you realize it is no longer hot, but as soon as you go to grab the hilt, it nearly burns you.\n\nYou realize you won't be able to use it right now, but you could probably keep it in your inventory.\n\n"); - SceneLib.inventory.takeItem(player.setWeapon(WeaponLib.FISTS), playerMenu); - return true; - } - //Drop scarred blade if not corrupted enough! - if (player.weapon == CoC.instance.weapons.SCARBLD && player.cor < (66 - player.corruptionTolerance()) && CoC.instance.flags[kFLAGS.MEANINGLESS_CORRUPTION] <= 0) { - SceneLib.sheilaScene.rebellingScarredBlade(); - return true; - } - if (CoC.instance.flags[kFLAGS.SCARRED_BLADE_STATUS] == 1 && player.cor >= 70) { - SceneLib.sheilaScene.findScarredBlade(); - return true; - } - //Unequip Lusty maiden armor - if (player.armorName == "lusty maiden's armor") { - //Removal due to no longer fitting: - //Grew Cock or Balls - if ((player.hasCock() && !player.hasSheath()) || player.balls > 0) { - EngineCore.outputText("\nYou fidget uncomfortably in the g-string of your lewd bikini - there simply isn't enough room for your "); - if (player.hasCock()) EngineCore.outputText("maleness"); - else EngineCore.outputText("bulgy balls"); - EngineCore.outputText(" within the imprisoning leather, and it actually hurts to wear it. You'll have to find some other form of protection!\n\n"); - SceneLib.inventory.takeItem(player.setArmor(ArmorLib.NOTHING), playerMenu); - return true; - } - //Lost pussy - else if (!player.hasVagina()) { - EngineCore.outputText("\nYou fidget uncomfortably as the crease in the gusset of your lewd bikini digs into your sensitive, featureless loins. There's simply no way you can continue to wear this outfit in comfort - it was expressly designed to press in on the female mons, and without a vagina, you simply can't wear this exotic armor.\n\n"); - SceneLib.inventory.takeItem(player.setArmor(ArmorLib.NOTHING), playerMenu); - return true; - } - //Tits gone or too small - else if (player.biggestTitSize() < 4) { - EngineCore.outputText("\nThe fine chain that makes up your lewd bikini-top is dangling slack against your flattened chest. Every movement and step sends it jangling noisily, slapping up against your [nipples], uncomfortably cold after being separated from your " + player.skinFurScales() + " for so long. There's no two ways about it - you'll need to find something else to wear.\n\n"); - SceneLib.inventory.takeItem(player.setArmor(ArmorLib.NOTHING), playerMenu); - return true; - } - } - //Unequip undergarment if you have bizarre lower body. - if (player.lowerGarment != UndergarmentLib.NOTHING) { - if (player.isTaur() || player.isDrider() || player.isScylla() || (player.isNaga() && player.lowerGarmentPerk != "NagaWearable")) { - EngineCore.outputText("You feel something slipping off as if by magic. Looking down on the ground, you realize it's your [lowergarment]. Looking down at your lower body, you let out a sigh and pick up your [lowergarment]. "); - SceneLib.inventory.takeItem(player.setUndergarment(UndergarmentLib.NOTHING, 1), playerMenu); - return true; - } - } - //Unequip shield if you're wielding a large weapon. - if (((player.weaponPerk == "Large" && player.findPerk(PerkLib.TitanGrip) < 0) || player.weaponPerk == "Dual" || player.weaponPerk == "Dual Large") && player.shield != ShieldLib.NOTHING) { - EngineCore.outputText("Your current weapon requires the use of two hands. As such, your shield has been unequipped automatically. "); - SceneLib.inventory.takeItem(player.setShield(ShieldLib.NOTHING), playerMenu); - return true; - } - // update cock type as dog/fox depending on whether the player resembles one more then the other. - // Previously used to be computed directly in cockNoun, but refactoring prevents access to the Player class when in cockNoun now. - if (player.cockTotal() != 0) { - var counter:Number = player.cockTotal() - 1; - while (counter >= 0) { - if (player.cocks[counter].cockType == CockTypesEnum.DOG || player.cocks[counter].cockType == CockTypesEnum.FOX) { - if (player.dogScore() >= player.foxScore()) - player.cocks[counter].cockType = CockTypesEnum.DOG; - else - player.cocks[counter].cockType = CockTypesEnum.FOX; - } - counter--; - // trace("IMA LOOPIN", counter); - } - - } - if (SceneLib.prison.trainingFeed.prisonCaptorFeedingQuestTrainingExists() && SceneLib.prison.trainingFeed.prisonCaptorFeedingQuestTrainingIsTimeUp() && Utils.rand(100) < (CoC.instance.flags[kFLAGS.PRISON_CAPTURE_CHANCE] + player.obey / 4) && !DungeonAbstractContent.inDungeon && !DungeonAbstractContent.inRoomedDungeon && !SceneLib.prison.inPrison && !SceneLib.ingnam.inIngnam) { - SceneLib.prison.goBackToPrisonBecauseQuestTimeIsUp(); - return true; - } - EngineCore.statScreenRefresh(); - if (needNext) { - EngineCore.doNext(playerMenu); - return true; - } - playerMenu(); - return false; - } - - private static function eggLootProgress():int { - //Egg loot! - var player:Player = CoC.instance.player; - if (player.hasStatusEffect(StatusEffects.LootEgg)) { - trace("EGG LOOT HAS"); - if (!player.hasStatusEffect(StatusEffects.Eggs)) { //Handling of errors. - EngineCore.outputText("Oops, looks like something went wrong with the coding regarding gathering eggs after pregnancy. Hopefully this should never happen again. If you encounter this again, please let Ormael/Aimozg/Oxdeception know so he can fix it."); - player.removeStatusEffect(StatusEffects.LootEgg); - EngineCore.doNext(playerMenu); - return 2; - } - //default - var itypes:Array = [ - [ - CoC.instance.consumables.BROWNEG, - CoC.instance.consumables.PURPLEG, - CoC.instance.consumables.BLUEEGG, - CoC.instance.consumables.PINKEGG, - CoC.instance.consumables.WHITEEG, - CoC.instance.consumables.BLACKEG - ], - [ - CoC.instance.consumables.L_BRNEG, - CoC.instance.consumables.L_PRPEG, - CoC.instance.consumables.L_BLUEG, - CoC.instance.consumables.L_PNKEG, - CoC.instance.consumables.L_WHTEG, - CoC.instance.consumables.L_BLKEG - ] - ]; - - var sEgg:ItemType = null; - - if (player.hasStatusEffect(StatusEffects.Eggs)) { - var size:int = player.statusEffectv2(StatusEffects.Eggs); - - if (size < 0 || size > 1) { - size = Utils.rand(2); - } - var col:int = player.statusEffectv1(StatusEffects.Eggs); - - if (col < 0 || col > 5) { - col = Utils.rand(6); - } - sEgg = itypes[size][col]; - } - else { - sEgg = CoC.instance.consumables.BROWNEG; - } - player.removeStatusEffect(StatusEffects.LootEgg); - player.removeStatusEffect(StatusEffects.Eggs); - trace("TAKEY NAU"); - SceneLib.inventory.takeItem(sEgg, playerMenu); - return 2; - } - // Benoit preggers update - if (CoC.instance.flags[kFLAGS.FEMOIT_EGGS] > 0) CoC.instance.flags[kFLAGS.FEMOIT_INCUBATION]--; // We're not capping it, we're going to use negative values to figure out diff events - return 0; - } - - private static function pregnancyProgress():int { - var needNext:Boolean = false; - //No diapause? Normal! - var player:Player = CoC.instance.player; - var flags:DefaultDict = CoC.instance.flags; - if (player.findPerk(PerkLib.Diapause) < 0) { - if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden - if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { - flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; - return 2; - } - //DOUBLE PREGGERS SPEED - if (player.findPerk(PerkLib.MaraesGiftFertility) >= 0) { - if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden - } - //DOUBLE PREGGERS SPEED - if (player.findPerk(PerkLib.MagicalFertility) >= 0) { - if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden - } - if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { - flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; - return 2; - } - if (player.findPerk(PerkLib.FerasBoonBreedingBitch) >= 0) { - if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden - } - if (player.findPerk(PerkLib.FerasBoonWideOpen) >= 0 || player.findPerk(PerkLib.FerasBoonMilkingTwat) >= 0) { - if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden - } - if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { - flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; - return 2; - } - //DOUBLE PREGGERS SPEED - if (player.findPerk(PerkLib.BroodMother) >= 0) { - if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden - } - if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { - flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; - return 2; - } - } - //Diapause! - else if (flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00228] > 0 && (player.pregnancyIncubation > 0 || player.buttPregnancyIncubation > 0)) { - if (flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00229] == 1) { - flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00229] = 0; - EngineCore.outputText("\n\nYour body reacts to the influx of nutrition, accelerating your pregnancy. Your belly bulges outward slightly."); - needNext = true; - } - if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { - flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; - return 2; - } - flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00228]--; - if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden - if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { - flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; - return 2; - } - if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden - if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { - flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; - return 2; - } - if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden - if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { - flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; - return 2; - } - //DOUBLE PREGGERS SPEED - if (player.findPerk(PerkLib.MaraesGiftFertility) >= 0) { - if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden - } - //DOUBLE PREGGERS SPEED - if (player.findPerk(PerkLib.MagicalFertility) >= 0) { - if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden - } - if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { - flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; - return 2; - } - if (player.findPerk(PerkLib.FerasBoonBreedingBitch) >= 0) { - if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden - } - if (player.findPerk(PerkLib.FerasBoonWideOpen) >= 0 || player.findPerk(PerkLib.FerasBoonMilkingTwat) >= 0) { - if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden - } - if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { - flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; - return 2; - } - //DOUBLE PREGGERS SPEED - if (player.findPerk(PerkLib.BroodMother) >= 0) { - if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden - } - if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { - flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; - return 2; - } - } - return needNext ? 1 : 0; - } - - private static function impGangBangProgress():int { - //IMP GANGBAAAAANGA - //The more imps you create, the more often you get gangraped. - var player:Player = CoC.instance.player; - var chance:Number = player.statusEffectv1(StatusEffects.BirthedImps) * 2; - if (chance > 7) chance = 7; - if (player.findPerk(PerkLib.PiercedLethite) >= 0) chance += 4; - if (player.inHeat) chance += 2; - if (SceneLib.vapula.vapulaSlave()) chance += 7; - //Reduce chance - var flags:DefaultDict = CoC.instance.flags; - if (flags[kFLAGS.CAMP_WALL_PROGRESS] > 0) chance /= 1 + (flags[kFLAGS.CAMP_WALL_PROGRESS] / 100); - if (flags[kFLAGS.CAMP_WALL_GATE] > 0) chance /= 2; - if (flags[kFLAGS.CAMP_WALL_SKULLS] > 0) chance *= 1 - (flags[kFLAGS.CAMP_WALL_SKULLS] / 100); - if (CoC.instance.model.time.hours == 2) { - if (CoC.instance.model.time.days % 30 == 0 && flags[kFLAGS.ANEMONE_KID] > 0 && player.hasCock() && flags[kFLAGS.ANEMONE_WATCH] > 0 && flags[kFLAGS.TAMANI_NUMBER_OF_DAUGHTERS] >= 40) { - SceneLib.anemoneScene.goblinNightAnemone(); - return 1; - } else if (chance > Utils.rand(100) && !player.hasStatusEffect(StatusEffects.DefenseCanopy)) { - if (player.gender > 0 && (!player.hasStatusEffect(StatusEffects.JojoNightWatch) || !player.hasStatusEffect(StatusEffects.PureCampJojo)) && (flags[kFLAGS.HEL_GUARDING] == 0 || !SceneLib.helFollower.followerHel()) && flags[kFLAGS.ANEMONE_WATCH] == 0 && (flags[kFLAGS.HOLLI_DEFENSE_ON] == 0 || flags[kFLAGS.FUCK_FLOWER_KILLED] > 0) && (flags[kFLAGS.KIHA_CAMP_WATCH] == 0 || !SceneLib.kihaFollower.followerKiha()) && !(flags[kFLAGS.CAMP_BUILT_CABIN] > 0 && flags[kFLAGS.CAMP_CABIN_FURNITURE_BED] > 0 && (flags[kFLAGS.SLEEP_WITH] == "Marble" || flags[kFLAGS.SLEEP_WITH] == "")) && - (flags[kFLAGS.IN_INGNAM] == 0 && flags[kFLAGS.IN_PRISON] == 0) || flags[kFLAGS.CAMP_UPGRADES_MAGIC_WARD] == 2) { - SceneLib.impScene.impGangabangaEXPLOSIONS(); - EngineCore.doNext(playerMenu); - return 2; - } - else if (flags[kFLAGS.KIHA_CAMP_WATCH] > 0 && SceneLib.kihaFollower.followerKiha()) { - EngineCore.outputText("\nYou find charred imp carcasses all around the camp once you wake. It looks like Kiha repelled a swarm of the little bastards.\n"); - return 1; - } - else if (flags[kFLAGS.HEL_GUARDING] > 0 && SceneLib.helFollower.followerHel()) { - EngineCore.outputText("\nHelia informs you over a mug of beer that she whupped some major imp asshole last night. She wiggles her tail for emphasis.\n"); - return 1; - } - else if (player.gender > 0 && player.hasStatusEffect(StatusEffects.JojoNightWatch) && player.hasStatusEffect(StatusEffects.PureCampJojo)) { - EngineCore.outputText("\nJojo informs you that he dispatched a crowd of imps as they tried to sneak into camp in the night.\n"); - return 1; - } - else if (flags[kFLAGS.HOLLI_DEFENSE_ON] > 0 && flags[kFLAGS.FUCK_FLOWER_LEVEL] == 4) { - EngineCore.outputText("\nDuring the night, you hear distant screeches of surprise, followed by orgasmic moans. It seems some imps found their way into Holli's canopy...\n"); - return 1; - } - else if (flags[kFLAGS.HOLLI_DEFENSE_ON] > 0 && flags[kFLAGS.FLOWER_LEVEL] == 4) { - EngineCore.outputText("\nDuring the night, you hear distant screeches of surprise, followed by screams of pain. It seems some imps found their way into Holli's canopy...\n"); - return 1; - } - else if (flags[kFLAGS.ANEMONE_WATCH] > 0) { - EngineCore.outputText("\nYour sleep is momentarily disturbed by the sound of tiny clawed feet skittering away in all directions. When you sit up, you can make out Kid A holding a struggling, concussed imp in a headlock and wearing a famished expression. You catch her eye and she sheepishly retreats to a more urbane distance before beginning her noisy meal.\n"); - return 1; - } - else if (flags[kFLAGS.CAMP_BUILT_CABIN] > 0 && flags[kFLAGS.CAMP_CABIN_FURNITURE_BED] > 0 && (flags[kFLAGS.SLEEP_WITH] == "Marble" || flags[kFLAGS.SLEEP_WITH] == "") && (player.inte / 5) >= Utils.rand(15)) { - EngineCore.outputText("\nYour sleep is momentarily disturbed by the sound of imp hands banging against your cabin door. Fortunately, you've locked the door before you've went to sleep.\n"); - return 1; - } - else if (flags[kFLAGS.CAMP_UPGRADES_MAGIC_WARD] == 3) { - EngineCore.outputText("\nYou notice an unusual pulse in the ward surrounding the camp. It appears that a few uninvited visitors attempted to locate your camp last night.\n"); - return 1; - } - } - //wormgasms - else if (flags[kFLAGS.EVER_INFESTED] == 1 && Utils.rand(100) <= 4 && player.hasCock() && !player.hasStatusEffect(StatusEffects.Infested)) { - if (player.hasCock() && (!player.hasStatusEffect(StatusEffects.JojoNightWatch) || !player.hasStatusEffect(StatusEffects.PureCampJojo)) && (flags[kFLAGS.HEL_GUARDING] == 0 || !SceneLib.helFollower.followerHel()) && flags[kFLAGS.ANEMONE_WATCH] == 0 && (flags[kFLAGS.CAMP_CABIN_FURNITURE_BED] > 0 && flags[kFLAGS.SLEEP_WITH] == "")) { - SceneLib.mountain.wormsScene.nightTimeInfestation(); - return 2; - } - else if (flags[kFLAGS.CAMP_CABIN_FURNITURE_BED] > 0 && flags[kFLAGS.SLEEP_WITH] == "") { - EngineCore.outputText("\nYou hear the sound of a horde of worms banging against the door. Good thing you locked it before you went to sleep!\n"); - return 1; - } - else if (flags[kFLAGS.HEL_GUARDING] > 0 && SceneLib.helFollower.followerHel()) { - EngineCore.outputText("\nHelia informs you over a mug of beer that she stomped a horde of gross worms into paste. She shudders after at the memory.\n"); - return 1; - } - else if (player.gender > 0 && player.hasStatusEffect(StatusEffects.JojoNightWatch) && player.hasStatusEffect(StatusEffects.PureCampJojo)) { - EngineCore.outputText("\nJojo informs you that he dispatched a horde of tiny, white worms as they tried to sneak into camp in the night.\n"); - return 1; - } - else if (flags[kFLAGS.ANEMONE_WATCH] > 0) { - EngineCore.outputText("\nKid A seems fairly well fed in the morning, and you note a trail of slime leading off in the direction of the lake.\n"); // Yeah, blah blah travel weirdness. Quickfix so it seems logically correct. - return 1; - } - } - } - return 0; - } - - public static function cheatTime(time:Number, needNext:Boolean = false):void { - //Advance minutes - var minutesToPass:Number = (time -= Math.floor(time)) * 60; - minutesToPass = Math.round(minutesToPass); - CoC.instance.model.time.minutes += minutesToPass; - if (CoC.instance.model.time.minutes > 59) { - CoC.instance.timeQ++; - CoC.instance.model.time.minutes -= 60; - if (!EngineCore.buttonIsVisible(0)) goNext(CoC.instance.timeQ, needNext); - } - time = Math.floor(time); - //Advance hours - while (time > 0) { - time--; - CoC.instance.model.time.hours++; - if (CoC.instance.model.time.hours > 23) { - CoC.instance.model.time.days++; - CoC.instance.model.time.hours = 0; - } - } - EngineCore.statScreenRefresh(); - } - - public static function growHair(amount:Number = .1):Boolean { - //Grow hair! - var player:Player = CoC.instance.player; - var currentLength:Number = player.hairLength; - player.hairLength += amount; - if (player.hairLength > 0 && currentLength == 0) { - EngineCore.outputText("\nYou are no longer bald. You now have " + Appearance.hairDescription(player) + " coating your head.\n"); - return true; - } - else if (player.hairLength >= 1 && currentLength < 1) { - EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); - return true; - } - else if (player.hairLength >= 3 && currentLength < 3) { - EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); - return true; - } - else if (player.hairLength >= 6 && currentLength < 6) { - EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); - return true; - } - else if (player.hairType == Hair.GORGON && player.hairLength >= 6 && currentLength < 6) { - EngineCore.outputText("\nYour gorgon's hair growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); - return true; - } - else if (player.hairLength >= 10 && currentLength < 10) { - EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); - return true; - } - else if (player.hairType == Hair.GORGON && player.hairLength >= 10 && currentLength < 10) { - EngineCore.outputText("\nYour gorgon's hair growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); - return true; - } - else if (player.hairLength >= 16 && currentLength < 16) { - EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); - return true; - } - else if (player.hairType == Hair.GORGON && player.hairLength >= 16 && currentLength < 16) { - EngineCore.outputText("\nYour gorgon's hair growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); - return true; - } - else if (player.hairLength >= 26 && currentLength < 26) { - EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); - return true; - } - else if (player.hairType == Hair.GORGON && player.hairLength >= 26 && currentLength < 26) { - EngineCore.outputText("\nYour gorgon's hair growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); - return true; - } - else if (player.hairLength >= 40 && currentLength < 40) { - EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); - return true; - } - else if (player.hairType == Hair.GORGON && player.hairLength >= 40 && currentLength < 40) { - EngineCore.outputText("\nYour gorgon's hair growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); - return true; - } - else if (player.hairLength >= 40 && player.hairLength >= player.tallness && currentLength < player.tallness) { - EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); - return true; - } - else if (player.hairType == Hair.GORGON && player.hairLength >= 40 && player.hairLength >= player.tallness && currentLength < player.tallness) { - EngineCore.outputText("\nYour gorgon's hair growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); - return true; - } - return false; - } - - public static function growBeard(amount:Number = .1):Boolean { - //Grow beard! - var player:Player = CoC.instance.player; - var tempBeard:Number = player.beardLength; - player.beardLength += amount; - - if (player.beardLength > 0 && tempBeard == 0) { - EngineCore.outputText("\nYou feel a tingling in your cheeks and chin. You now have " + Appearance.beardDescription(player) + " coating your cheeks and chin.\n"); - return true; - } - else if (player.beardLength >= 0.2 && tempBeard < 0.2) { - EngineCore.outputText("\nYour beard's growth has reached a new threshhold, giving you " + Appearance.beardDescription(player) + ".\n"); - return true; - } - else if (player.beardLength >= 0.5 && tempBeard < 0.5) { - EngineCore.outputText("\nYour beard's growth has reached a new threshhold, giving you " + Appearance.beardDescription(player) + ".\n"); - return true; - } - else if (player.beardLength >= 1.5 && tempBeard < 1.5) { - EngineCore.outputText("\nYour beard's growth has reached a new threshhold, giving you " + Appearance.beardDescription(player) + ".\n"); - return true; - } - else if (player.beardLength >= 3 && tempBeard < 3) { - EngineCore.outputText("\nYour beard's growth has reached a new threshhold, giving you " + Appearance.beardDescription(player) + ".\n"); - return true; - } - else if (player.beardLength >= 6 && tempBeard < 6) { - EngineCore.outputText("\nYour beard's growth has reached a new threshhold, giving you " + Appearance.beardDescription(player) + ".\n"); - return true; - } - - return false; - } - //Any classes that need to be aware of the passage of time can add themselves to this array using timeAwareAdd. - // Once in the array they will be notified as each hour passes, allowing them to update actions, lactation, pregnancy, etc. - - public static function timeAwareClassAdd(newEntry:TimeAwareInterface):void { - _timeAwareClassList.push(newEntry); - } - - public static function timeAwareClassRemove(toRemove:TimeAwareInterface):void { - var i:int = _timeAwareClassList.indexOf(toRemove); - if (i >= 0) { - _timeAwareClassList.splice(i, 1); - } - } - - public static function set doCamp(value:Function):void { - if(_campSet){throw new Error("Multiple Docamp Inits");return;} - _doCamp = value; - _campSet = true; - } -} -} +package classes { +import classes.BodyParts.Hair; +import classes.GlobalFlags.kACHIEVEMENTS; +import classes.GlobalFlags.kFLAGS; +import classes.Items.ArmorLib; +import classes.Items.ShieldLib; +import classes.Items.UndergarmentLib; +import classes.Items.WeaponLib; +import classes.Scenes.Dungeons.DungeonAbstractContent; +import classes.Scenes.SceneLib; +import classes.internals.Utils; + +import coc.view.MainView; + +import flash.net.SharedObject; +import flash.utils.getQualifiedClassName; + +public class EventParser { + private static var _timeAwareClassList:Vector. = new Vector.(); + //Used by the eventParser in calling timeAwareLarge + private static var timeAwareLargeLastEntry:int = -1; + private static var _doCamp:Function; + private static var _campSet:Boolean = false; + + public static function playerMenu():void { + CoC.instance.mainViewManager.hidePlayerDoll(); + if (!CoC.instance.inCombat) { + CoC.instance.spriteSelect(-1); + } + CoC.instance.mainView.setMenuButton(MainView.MENU_NEW_MAIN, "New Game", CoC.instance.charCreation.newGameGo); + CoC.instance.mainView.nameBox.visible = false; + if (CoC.instance.gameState == 1 || CoC.instance.gameState == 2) { + SceneLib.combat.combatMenu(); + return; + } + //Clear restriction on item overlaps if not in combat + CoC.instance.plotFight = false; + if (DungeonAbstractContent.inDungeon) { + //dungeonMenu(); + SceneLib.dungeons.checkRoom(); + return; + } + else if (DungeonAbstractContent.inRoomedDungeon) { + if (DungeonAbstractContent.inRoomedDungeonResume != null) DungeonAbstractContent.inRoomedDungeonResume(); + return; + } + CoC.instance.flags[kFLAGS.PLAYER_PREGGO_WITH_WORMS] = 0; + _doCamp(); + } + + public static function gameOver(clear:Boolean = false):void { //Leaves text on screen unless clear is set to true + if (CoC.instance.testingBlockExiting) { + EngineCore.doNext(SceneLib.camp.returnToCampUseOneHour); //Prevent ChaosMonkah instances from getting stuck + } + else { + var textChoices:Number = Utils.rand(4); + if (clear) EngineCore.clearOutput(); + EngineCore.outputText("\n\n"); + if (textChoices == 0) EngineCore.outputText("GAME OVER"); + if (textChoices == 1) EngineCore.outputText("Game over, man! Game over!"); + if (textChoices == 2) EngineCore.outputText("You just got Bad-Ended!"); + if (textChoices == 3) EngineCore.outputText("Your adventures have came to an end..."); + EngineCore.outputText(""); + //Delete save on hardcore. + if (CoC.instance.flags[kFLAGS.HARDCORE_MODE] > 0) { + EngineCore.outputText("\n\nYour save file has been deleted as you are on Hardcore Mode!"); + CoC.instance.flags[kFLAGS.TEMP_STORAGE_SAVE_DELETION] = CoC.instance.flags[kFLAGS.HARDCORE_SLOT]; + var test:* = SharedObject.getLocal(CoC.instance.flags[kFLAGS.TEMP_STORAGE_SAVE_DELETION], "/"); + if (test.data.exists) { + trace("DELETING SLOT: " + CoC.instance.flags[kFLAGS.TEMP_STORAGE_SAVE_DELETION]); + test.clear(); + } + } + CoC.instance.flags[kFLAGS.TIMES_BAD_ENDED]++; + EngineCore.awardAchievement("Game Over!", kACHIEVEMENTS.GENERAL_GAME_OVER, true, true); + EngineCore.menu(); + EngineCore.addButton(0, "Game Over", gameOverMenuOverride).hint("Your game has ended. Please load a saved file or start a new game."); + if (CoC.instance.flags[kFLAGS.HARDCORE_MODE] <= 0) EngineCore.addButton(1, "Continue", SceneLib.camp.wakeFromBadEnd).hint("It's all just a dream. Wake up."); + //addButton(3, "NewGamePlus", charCreation.newGamePlus).hint("Start a new game with your equipment, experience, and gems carried over."); + if (CoC.instance.flags[kFLAGS.EASY_MODE_ENABLE_FLAG] == 1 || CoC.instance.debug) EngineCore.addButton(4, "Debug Cheat", playerMenu); + gameOverMenuOverride(); + + } + CoC.instance.inCombat = false; + DungeonAbstractContent.dungeonLoc = 0; //Replaces inDungeon = false; + } + + private static function gameOverMenuOverride():void { //Game over event; override whatever the fuck has been done to the UI up to this point to force display of the data and new game buttons + CoC.instance.mainView.showMenuButton(MainView.MENU_NEW_MAIN); + CoC.instance.mainView.showMenuButton(MainView.MENU_DATA); + CoC.instance.mainView.hideMenuButton(MainView.MENU_APPEARANCE); + CoC.instance.mainView.hideMenuButton(MainView.MENU_LEVEL); + CoC.instance.mainView.hideMenuButton(MainView.MENU_PERKS); + } + + public static function getCurrentStackTrace():String // Fuck, stack-traces only work in the debug player. + { + var tempError:Error = new Error(); + var stackTrace:String = tempError.getStackTrace(); + return stackTrace; + } + + public static function errorPrint(details:* = null):void { + EngineCore.rawOutputText("Congratulations, you've found a bug!", true); + EngineCore.rawOutputText("\nError: Unknown event!"); + EngineCore.rawOutputText("\n\nPlease report that you had an issue with code: \"" + details + "\" "); + EngineCore.rawOutputText("\nGame version: \"" + CoC.instance.ver + "\" (THIS IS IMPORTANT! Please be sure you include it!) "); + + var sTrace:String = getCurrentStackTrace(); + + if (sTrace) // Fuck, stack-traces only work in the debug player. + EngineCore.rawOutputText("and stack-trace: \n
" + sTrace + "
\n"); + EngineCore.rawOutputText("to fake-name on the forums or better yet, file a bug report on github: "); + EngineCore.rawOutputText("\nhttps://github.com/herp-a-derp/Corruption-of-Champions"); + + EngineCore.rawOutputText("\nPlease try to include the details of what you were doing when you encountered this bug "); + if (sTrace) + EngineCore.rawOutputText(" (including the above stack trace copy&pasted into the details),"); + EngineCore.rawOutputText(" to make tracking the issue down easier. Thanks!"); + + EngineCore.doNext(SceneLib.camp.returnToCampUseOneHour); + } + + public static function goNext(time:Number, needNext:Boolean):Boolean { + Utils.Begin("eventParser", "goNext", time); + var x:Boolean = goNextWrapped(time, needNext); + Utils.End("eventParser", "goNext"); + return x; + } + + private static function goNextWrapped(time:Number, needNext:Boolean):Boolean { + var player:Player = CoC.instance.player; + //Update system time + //date = new Date(); + //trace ("MONTH: " + date.month + " DATE: " + date.date + " MINUTES: " + date.minutes); + //clearOutput(); + if (timeAwareLargeLastEntry >= 0) { //Finish calling timeChangeLarge before advancing the hour again + for (; timeAwareLargeLastEntry < _timeAwareClassList.length; timeAwareLargeLastEntry++) { + var item:TimeAwareInterface = _timeAwareClassList[timeAwareLargeLastEntry]; + var classname:String = getQualifiedClassName(item); + Utils.Begin("TimeAwareInterface", classname + ".timeChangeLarge"); + if (item.timeChangeLarge()) { + Utils.End("TimeAwareInterface", classname + ".timeChangeLarge"); + return true; + } + Utils.End("TimeAwareInterface", classname + ".timeChangeLarge"); + } + timeAwareLargeLastEntry = -1; + } + while (CoC.instance.timeQ > 0) { + CoC.instance.timeQ--; + CoC.instance.model.time.hours++; + SceneLib.combat.regeneration(false); + if (player.findPerk(PerkLib.JobSoulCultivator) >= 0) SceneLib.combat.soulforceregeneration(false); + if (player.findPerk(PerkLib.JobSorcerer) >= 0) SceneLib.combat.manaregeneration(false); + SceneLib.combat.wrathregeneration(false); + //Inform all time aware classes that a new hour has arrived + for (var tac:int = 0; tac < _timeAwareClassList.length; tac++) { + item = _timeAwareClassList[tac]; + classname = getQualifiedClassName(item); + Utils.Begin("TimeAwareInterface", classname + ".timeChange"); + if (item.timeChange()) needNext = true; + Utils.End("TimeAwareInterface", classname + ".timeChange"); + } + if (CoC.instance.model.time.hours > 23) { + CoC.instance.model.time.hours = 0; + CoC.instance.model.time.days++; + } else if (CoC.instance.model.time.hours == 21) { + if (CoC.instance.flags[kFLAGS.LETHICE_DEFEATED] <= 0) EngineCore.outputText("\nThe sky darkens as a starless night falls. The blood-red moon slowly rises up over the horizon.\n"); + else EngineCore.outputText("\nThe sky darkens as a starry night falls. The blood-red moon slowly rises up over the horizon.\n"); + needNext = true; + } else if (CoC.instance.model.time.hours == 6) { + EngineCore.outputText("\nThe sky begins to grow brighter as the moon descends over distant mountains, casting a few last ominous shadows before they burn away in the light.\n"); + needNext = true; + } + //BIG EVENTS GO IN HERE + //BIG EVENTS GO IN HERE + //BIG EVENTS GO IN HERE + //BIG EVENTS GO IN HERE + + /* Inform all time aware classes that it's time for large events to trigger. Note that timeChangeLarge could be called multiple times in a single tick + of the clock, so any updates should happen in timeChange and any timeChangeLarge events need to make sure they cannot repeat within the same hour. + In effect these are the same rules the existing code acted under. */ + for (timeAwareLargeLastEntry = 0; timeAwareLargeLastEntry < _timeAwareClassList.length; timeAwareLargeLastEntry++) { + item = _timeAwareClassList[timeAwareLargeLastEntry]; + classname = getQualifiedClassName(item); + Utils.Begin("TimeAwareInterface", classname + ".timeChangeLarge"); + if (item.timeChangeLarge()) { + Utils.End("TimeAwareInterface", classname + ".timeChangeLarge"); + return true; + } + Utils.End("TimeAwareInterface", classname + ".timeChangeLarge"); + } + timeAwareLargeLastEntry = -1; //If this var is -1 then this function has called timeChangeLarge for all entries in the _timeAwareClassList + + Utils.Begin("eventParser", "impGangBangProgress"); + var igb:int = impGangBangProgress(); + Utils.End("eventParser", "impGangBangProgress"); + if (igb == 1) needNext = true; + if (igb == 2) return true; + + Utils.Begin("eventParser", "pregnancyProgress"); + igb = pregnancyProgress(); + Utils.End("eventParser", "pregnancyProgress"); + if (igb == 1) needNext = true; + if (igb == 2) return true; + + Utils.Begin("eventParser", "eggLoot"); + igb = eggLootProgress(); + Utils.End("eventParser", "eggLoot"); + if (igb == 1) needNext = true; + if (igb == 2) return true; + } + + // Hanging the Uma massage update here, I think it should work... + SceneLib.telAdre.umasShop.updateBonusDuration(time); + if (player.hasStatusEffect(StatusEffects.UmasMassage)) { + trace("Uma's massage bonus time remaining: " + player.statusEffectv3(StatusEffects.UmasMassage)); + } + + SceneLib.highMountains.izumiScenes.updateSmokeDuration(time); + if (player.hasStatusEffect(StatusEffects.IzumisPipeSmoke)) { + trace("Izumis pipe smoke time remaining: " + player.statusEffectv1(StatusEffects.IzumisPipeSmoke)); + } + + //Drop axe if too short! + if (player.tallness < 78 && player.weapon == CoC.instance.weapons.L__AXE) { + EngineCore.outputText("\nThis axe is too large for someone of your stature to use, though you can keep it in your inventory until you are big enough.\n"); + SceneLib.inventory.takeItem(player.setWeapon(WeaponLib.FISTS), playerMenu); + return true; + } + if (player.tallness < 78 && player.weapon == CoC.instance.weapons.DL_AXE_) { + EngineCore.outputText("\nThis dual axes are too large for someone of your stature to use, though you can keep them in your inventory until you are big enough.\n"); + SceneLib.inventory.takeItem(player.setWeapon(WeaponLib.FISTS), playerMenu); + return true; + } + if (player.tallness < 60 && player.weapon == CoC.instance.weapons.L_HAMMR) { + EngineCore.outputText("\nYou've become too short to use this hammer anymore. You can still keep it in your inventory, but you'll need to be taller to effectively wield it.\n"); + SceneLib.inventory.takeItem(player.setWeapon(WeaponLib.FISTS), playerMenu); + return true; + } +// if (player.weapon == weapons.CLAYMOR && player.str < 40) { +// outputText("\nYou aren't strong enough to handle the weight of your weapon any longer, and you're forced to stop using it.\n"); +// inventory.takeItem(player.setWeapon(WeaponLib.FISTS), playerMenu); +// return true; +// } +// if (player.weapon == weapons.WARHAMR && player.str < 80) { +// outputText("\nYou aren't strong enough to handle the weight of your weapon any longer!\n"); +// inventory.takeItem(player.setWeapon(WeaponLib.FISTS), playerMenu); +// return true; +// } + //Drop beautiful sword if corrupted! + if (player.weaponPerk == "holySword" && player.cor >= (33 + player.corruptionTolerance())) { + EngineCore.outputText("\nThe [weapon] grows hot in your hand, until you are forced to drop it. Whatever power inhabits this blade appears to be unhappy with you. Touching it gingerly, you realize it is no longer hot, but as soon as you go to grab the hilt, it nearly burns you.\n\nYou realize you won't be able to use it right now, but you could probably keep it in your inventory.\n\n"); + SceneLib.inventory.takeItem(player.setWeapon(WeaponLib.FISTS), playerMenu); + return true; + } + //Drop Excalibur if corrupted! + if (player.weaponPerk == "Excalibur" && player.cor >= (33 + player.corruptionTolerance())) { + EngineCore.outputText("\nThe [weapon] grows hot in your hand, until you are forced to drop it. Whatever power inhabits this blade appears to be unhappy with you. Touching it gingerly, you realize it is no longer hot, but as soon as you go to grab the hilt, it nearly burns you.\n\nYou realize you won't be able to use it right now, but you could probably keep it in your inventory.\n\n"); + SceneLib.inventory.takeItem(player.setWeapon(WeaponLib.FISTS), playerMenu); + return true; + } + //Drop scarred blade if not corrupted enough! + if (player.weapon == CoC.instance.weapons.SCARBLD && player.cor < (66 - player.corruptionTolerance()) && CoC.instance.flags[kFLAGS.MEANINGLESS_CORRUPTION] <= 0) { + SceneLib.sheilaScene.rebellingScarredBlade(); + return true; + } + if (CoC.instance.flags[kFLAGS.SCARRED_BLADE_STATUS] == 1 && player.cor >= 70) { + SceneLib.sheilaScene.findScarredBlade(); + return true; + } + //Unequip Lusty maiden armor + if (player.armorName == "lusty maiden's armor") { + //Removal due to no longer fitting: + //Grew Cock or Balls + if ((player.hasCock() && !player.hasSheath()) || player.balls > 0) { + EngineCore.outputText("\nYou fidget uncomfortably in the g-string of your lewd bikini - there simply isn't enough room for your "); + if (player.hasCock()) EngineCore.outputText("maleness"); + else EngineCore.outputText("bulgy balls"); + EngineCore.outputText(" within the imprisoning leather, and it actually hurts to wear it. You'll have to find some other form of protection!\n\n"); + SceneLib.inventory.takeItem(player.setArmor(ArmorLib.NOTHING), playerMenu); + return true; + } + //Lost pussy + else if (!player.hasVagina()) { + EngineCore.outputText("\nYou fidget uncomfortably as the crease in the gusset of your lewd bikini digs into your sensitive, featureless loins. There's simply no way you can continue to wear this outfit in comfort - it was expressly designed to press in on the female mons, and without a vagina, you simply can't wear this exotic armor.\n\n"); + SceneLib.inventory.takeItem(player.setArmor(ArmorLib.NOTHING), playerMenu); + return true; + } + //Tits gone or too small + else if (player.biggestTitSize() < 4) { + EngineCore.outputText("\nThe fine chain that makes up your lewd bikini-top is dangling slack against your flattened chest. Every movement and step sends it jangling noisily, slapping up against your [nipples], uncomfortably cold after being separated from your " + player.skinFurScales() + " for so long. There's no two ways about it - you'll need to find something else to wear.\n\n"); + SceneLib.inventory.takeItem(player.setArmor(ArmorLib.NOTHING), playerMenu); + return true; + } + } + //Unequip undergarment if you have bizarre lower body. + if (player.lowerGarment != UndergarmentLib.NOTHING) { + if (player.isTaur() || player.isDrider() || player.isScylla() || (player.isNaga() && player.lowerGarmentPerk != "NagaWearable")) { + EngineCore.outputText("You feel something slipping off as if by magic. Looking down on the ground, you realize it's your [lowergarment]. Looking down at your lower body, you let out a sigh and pick up your [lowergarment]. "); + SceneLib.inventory.takeItem(player.setUndergarment(UndergarmentLib.NOTHING, 1), playerMenu); + return true; + } + } + //Unequip shield if you're wielding a large weapon. + if (((player.weaponPerk == "Large" && player.findPerk(PerkLib.TitanGrip) < 0) || player.weaponPerk == "Dual" || player.weaponPerk == "Dual Large") && player.shield != ShieldLib.NOTHING) { + EngineCore.outputText("Your current weapon requires the use of two hands. As such, your shield has been unequipped automatically. "); + SceneLib.inventory.takeItem(player.setShield(ShieldLib.NOTHING), playerMenu); + return true; + } + // update cock type as dog/fox depending on whether the player resembles one more then the other. + // Previously used to be computed directly in cockNoun, but refactoring prevents access to the Player class when in cockNoun now. + if (player.cockTotal() != 0) { + var counter:Number = player.cockTotal() - 1; + while (counter >= 0) { + if (player.cocks[counter].cockType == CockTypesEnum.DOG || player.cocks[counter].cockType == CockTypesEnum.FOX) { + if (player.dogScore() >= player.foxScore()) + player.cocks[counter].cockType = CockTypesEnum.DOG; + else + player.cocks[counter].cockType = CockTypesEnum.FOX; + } + counter--; + // trace("IMA LOOPIN", counter); + } + + } + if (SceneLib.prison.trainingFeed.prisonCaptorFeedingQuestTrainingExists() && SceneLib.prison.trainingFeed.prisonCaptorFeedingQuestTrainingIsTimeUp() && Utils.rand(100) < (CoC.instance.flags[kFLAGS.PRISON_CAPTURE_CHANCE] + player.obey / 4) && !DungeonAbstractContent.inDungeon && !DungeonAbstractContent.inRoomedDungeon && !SceneLib.prison.inPrison && !SceneLib.ingnam.inIngnam) { + SceneLib.prison.goBackToPrisonBecauseQuestTimeIsUp(); + return true; + } + EngineCore.statScreenRefresh(); + if (needNext) { + EngineCore.doNext(playerMenu); + return true; + } + playerMenu(); + return false; + } + + private static function eggLootProgress():int { + //Egg loot! + var player:Player = CoC.instance.player; + if (player.hasStatusEffect(StatusEffects.LootEgg)) { + trace("EGG LOOT HAS"); + if (!player.hasStatusEffect(StatusEffects.Eggs)) { //Handling of errors. + EngineCore.outputText("Oops, looks like something went wrong with the coding regarding gathering eggs after pregnancy. Hopefully this should never happen again. If you encounter this again, please let Ormael/Aimozg/Oxdeception know so he can fix it."); + player.removeStatusEffect(StatusEffects.LootEgg); + EngineCore.doNext(playerMenu); + return 2; + } + //default + var itypes:Array = [ + [ + CoC.instance.consumables.BROWNEG, + CoC.instance.consumables.PURPLEG, + CoC.instance.consumables.BLUEEGG, + CoC.instance.consumables.PINKEGG, + CoC.instance.consumables.WHITEEG, + CoC.instance.consumables.BLACKEG + ], + [ + CoC.instance.consumables.L_BRNEG, + CoC.instance.consumables.L_PRPEG, + CoC.instance.consumables.L_BLUEG, + CoC.instance.consumables.L_PNKEG, + CoC.instance.consumables.L_WHTEG, + CoC.instance.consumables.L_BLKEG + ] + ]; + + var sEgg:ItemType = null; + + if (player.hasStatusEffect(StatusEffects.Eggs)) { + var size:int = player.statusEffectv2(StatusEffects.Eggs); + + if (size < 0 || size > 1) { + size = Utils.rand(2); + } + var col:int = player.statusEffectv1(StatusEffects.Eggs); + + if (col < 0 || col > 5) { + col = Utils.rand(6); + } + sEgg = itypes[size][col]; + } + else { + sEgg = CoC.instance.consumables.BROWNEG; + } + player.removeStatusEffect(StatusEffects.LootEgg); + player.removeStatusEffect(StatusEffects.Eggs); + trace("TAKEY NAU"); + SceneLib.inventory.takeItem(sEgg, playerMenu); + return 2; + } + // Benoit preggers update + if (CoC.instance.flags[kFLAGS.FEMOIT_EGGS] > 0) CoC.instance.flags[kFLAGS.FEMOIT_INCUBATION]--; // We're not capping it, we're going to use negative values to figure out diff events + return 0; + } + + private static function pregnancyProgress():int { + var needNext:Boolean = false; + //No diapause? Normal! + var player:Player = CoC.instance.player; + var flags:DefaultDict = CoC.instance.flags; + if (player.findPerk(PerkLib.Diapause) < 0) { + if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden + if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { + flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; + return 2; + } + //DOUBLE PREGGERS SPEED + if (player.findPerk(PerkLib.MaraesGiftFertility) >= 0) { + if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden + } + //DOUBLE PREGGERS SPEED + if (player.findPerk(PerkLib.MagicalFertility) >= 0) { + if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden + } + if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { + flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; + return 2; + } + if (player.findPerk(PerkLib.FerasBoonBreedingBitch) >= 0) { + if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden + } + if (player.findPerk(PerkLib.FerasBoonWideOpen) >= 0 || player.findPerk(PerkLib.FerasBoonMilkingTwat) >= 0) { + if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden + } + if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { + flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; + return 2; + } + //DOUBLE PREGGERS SPEED + if (player.findPerk(PerkLib.BroodMother) >= 0) { + if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden + } + if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { + flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; + return 2; + } + } + //Diapause! + else if (flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00228] > 0 && (player.pregnancyIncubation > 0 || player.buttPregnancyIncubation > 0)) { + if (flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00229] == 1) { + flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00229] = 0; + EngineCore.outputText("\n\nYour body reacts to the influx of nutrition, accelerating your pregnancy. Your belly bulges outward slightly."); + needNext = true; + } + if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { + flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; + return 2; + } + flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00228]--; + if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden + if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { + flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; + return 2; + } + if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden + if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { + flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; + return 2; + } + if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden + if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { + flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; + return 2; + } + //DOUBLE PREGGERS SPEED + if (player.findPerk(PerkLib.MaraesGiftFertility) >= 0) { + if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden + } + //DOUBLE PREGGERS SPEED + if (player.findPerk(PerkLib.MagicalFertility) >= 0) { + if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden + } + if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { + flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; + return 2; + } + if (player.findPerk(PerkLib.FerasBoonBreedingBitch) >= 0) { + if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden + } + if (player.findPerk(PerkLib.FerasBoonWideOpen) >= 0 || player.findPerk(PerkLib.FerasBoonMilkingTwat) >= 0) { + if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden + } + if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { + flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; + return 2; + } + //DOUBLE PREGGERS SPEED + if (player.findPerk(PerkLib.BroodMother) >= 0) { + if (player.pregnancyAdvance()) needNext = true; //Make sure pregnancy texts aren't hidden + } + if (flags[kFLAGS.EVENT_PARSER_ESCAPE] == 1) { + flags[kFLAGS.EVENT_PARSER_ESCAPE] = 0; + return 2; + } + } + return needNext ? 1 : 0; + } + + private static function impGangBangProgress():int { + //IMP GANGBAAAAANGA + //The more imps you create, the more often you get gangraped. + var player:Player = CoC.instance.player; + var chance:Number = player.statusEffectv1(StatusEffects.BirthedImps) * 2; + if (chance > 7) chance = 7; + if (player.findPerk(PerkLib.PiercedLethite) >= 0) chance += 4; + if (player.inHeat) chance += 2; + if (SceneLib.vapula.vapulaSlave()) chance += 7; + //Reduce chance + var flags:DefaultDict = CoC.instance.flags; + if (flags[kFLAGS.CAMP_WALL_PROGRESS] > 0) chance /= 1 + (flags[kFLAGS.CAMP_WALL_PROGRESS] / 100); + if (flags[kFLAGS.CAMP_WALL_GATE] > 0) chance /= 2; + if (flags[kFLAGS.CAMP_WALL_SKULLS] > 0) chance *= 1 - (flags[kFLAGS.CAMP_WALL_SKULLS] / 100); + if (CoC.instance.model.time.hours == 2) { + if (CoC.instance.model.time.days % 30 == 0 && flags[kFLAGS.ANEMONE_KID] > 0 && player.hasCock() && flags[kFLAGS.ANEMONE_WATCH] > 0 && flags[kFLAGS.TAMANI_NUMBER_OF_DAUGHTERS] >= 40) { + SceneLib.anemoneScene.goblinNightAnemone(); + return 1; + } else if (chance > Utils.rand(100) && !player.hasStatusEffect(StatusEffects.DefenseCanopy)) { + if (player.gender > 0 && (!player.hasStatusEffect(StatusEffects.JojoNightWatch) || !player.hasStatusEffect(StatusEffects.PureCampJojo)) && (flags[kFLAGS.HEL_GUARDING] == 0 || !SceneLib.helFollower.followerHel()) && flags[kFLAGS.ANEMONE_WATCH] == 0 && (flags[kFLAGS.HOLLI_DEFENSE_ON] == 0 || flags[kFLAGS.FUCK_FLOWER_KILLED] > 0) && (flags[kFLAGS.KIHA_CAMP_WATCH] == 0 || !SceneLib.kihaFollower.followerKiha()) && !(flags[kFLAGS.CAMP_BUILT_CABIN] > 0 && flags[kFLAGS.CAMP_CABIN_FURNITURE_BED] > 0 && (flags[kFLAGS.SLEEP_WITH] == "Marble" || flags[kFLAGS.SLEEP_WITH] == "")) && + (flags[kFLAGS.IN_INGNAM] == 0 && flags[kFLAGS.IN_PRISON] == 0) || flags[kFLAGS.CAMP_UPGRADES_MAGIC_WARD] == 2) { + SceneLib.impScene.impGangabangaEXPLOSIONS(); + EngineCore.doNext(playerMenu); + return 2; + } + else if (flags[kFLAGS.KIHA_CAMP_WATCH] > 0 && SceneLib.kihaFollower.followerKiha()) { + EngineCore.outputText("\nYou find charred imp carcasses all around the camp once you wake. It looks like Kiha repelled a swarm of the little bastards.\n"); + return 1; + } + else if (flags[kFLAGS.HEL_GUARDING] > 0 && SceneLib.helFollower.followerHel()) { + EngineCore.outputText("\nHelia informs you over a mug of beer that she whupped some major imp asshole last night. She wiggles her tail for emphasis.\n"); + return 1; + } + else if (player.gender > 0 && player.hasStatusEffect(StatusEffects.JojoNightWatch) && player.hasStatusEffect(StatusEffects.PureCampJojo)) { + EngineCore.outputText("\nJojo informs you that he dispatched a crowd of imps as they tried to sneak into camp in the night.\n"); + return 1; + } + else if (flags[kFLAGS.HOLLI_DEFENSE_ON] > 0 && flags[kFLAGS.FUCK_FLOWER_LEVEL] == 4) { + EngineCore.outputText("\nDuring the night, you hear distant screeches of surprise, followed by orgasmic moans. It seems some imps found their way into Holli's canopy...\n"); + return 1; + } + else if (flags[kFLAGS.HOLLI_DEFENSE_ON] > 0 && flags[kFLAGS.FLOWER_LEVEL] == 4) { + EngineCore.outputText("\nDuring the night, you hear distant screeches of surprise, followed by screams of pain. It seems some imps found their way into Holli's canopy...\n"); + return 1; + } + else if (flags[kFLAGS.ANEMONE_WATCH] > 0) { + EngineCore.outputText("\nYour sleep is momentarily disturbed by the sound of tiny clawed feet skittering away in all directions. When you sit up, you can make out Kid A holding a struggling, concussed imp in a headlock and wearing a famished expression. You catch her eye and she sheepishly retreats to a more urbane distance before beginning her noisy meal.\n"); + return 1; + } + else if (flags[kFLAGS.CAMP_BUILT_CABIN] > 0 && flags[kFLAGS.CAMP_CABIN_FURNITURE_BED] > 0 && (flags[kFLAGS.SLEEP_WITH] == "Marble" || flags[kFLAGS.SLEEP_WITH] == "") && (player.inte / 5) >= Utils.rand(15)) { + EngineCore.outputText("\nYour sleep is momentarily disturbed by the sound of imp hands banging against your cabin door. Fortunately, you've locked the door before you've went to sleep.\n"); + return 1; + } + else if (flags[kFLAGS.CAMP_UPGRADES_MAGIC_WARD] == 3) { + EngineCore.outputText("\nYou notice an unusual pulse in the ward surrounding the camp. It appears that a few uninvited visitors attempted to locate your camp last night.\n"); + return 1; + } + } + //wormgasms + else if (flags[kFLAGS.EVER_INFESTED] == 1 && Utils.rand(100) <= 4 && player.hasCock() && !player.hasStatusEffect(StatusEffects.Infested)) { + if (player.hasCock() && (!player.hasStatusEffect(StatusEffects.JojoNightWatch) || !player.hasStatusEffect(StatusEffects.PureCampJojo)) && (flags[kFLAGS.HEL_GUARDING] == 0 || !SceneLib.helFollower.followerHel()) && flags[kFLAGS.ANEMONE_WATCH] == 0 && (flags[kFLAGS.CAMP_CABIN_FURNITURE_BED] > 0 && flags[kFLAGS.SLEEP_WITH] == "")) { + SceneLib.mountain.wormsScene.nightTimeInfestation(); + return 2; + } + else if (flags[kFLAGS.CAMP_CABIN_FURNITURE_BED] > 0 && flags[kFLAGS.SLEEP_WITH] == "") { + EngineCore.outputText("\nYou hear the sound of a horde of worms banging against the door. Good thing you locked it before you went to sleep!\n"); + return 1; + } + else if (flags[kFLAGS.HEL_GUARDING] > 0 && SceneLib.helFollower.followerHel()) { + EngineCore.outputText("\nHelia informs you over a mug of beer that she stomped a horde of gross worms into paste. She shudders after at the memory.\n"); + return 1; + } + else if (player.gender > 0 && player.hasStatusEffect(StatusEffects.JojoNightWatch) && player.hasStatusEffect(StatusEffects.PureCampJojo)) { + EngineCore.outputText("\nJojo informs you that he dispatched a horde of tiny, white worms as they tried to sneak into camp in the night.\n"); + return 1; + } + else if (flags[kFLAGS.ANEMONE_WATCH] > 0) { + EngineCore.outputText("\nKid A seems fairly well fed in the morning, and you note a trail of slime leading off in the direction of the lake.\n"); // Yeah, blah blah travel weirdness. Quickfix so it seems logically correct. + return 1; + } + } + } + return 0; + } + + public static function cheatTime(time:Number, needNext:Boolean = false):void { + //Advance minutes + var minutesToPass:Number = (time -= Math.floor(time)) * 60; + minutesToPass = Math.round(minutesToPass); + CoC.instance.model.time.minutes += minutesToPass; + if (CoC.instance.model.time.minutes > 59) { + CoC.instance.timeQ++; + CoC.instance.model.time.minutes -= 60; + if (!EngineCore.buttonIsVisible(0)) goNext(CoC.instance.timeQ, needNext); + } + time = Math.floor(time); + //Advance hours + while (time > 0) { + time--; + CoC.instance.model.time.hours++; + if (CoC.instance.model.time.hours > 23) { + CoC.instance.model.time.days++; + CoC.instance.model.time.hours = 0; + } + } + EngineCore.statScreenRefresh(); + } + public static function cheatTime2(time:Number, needNext:Boolean = false):void { + //Advance minutes + var minutesToPass:Number = time; + CoC.instance.model.time.minutes += minutesToPass; + if (CoC.instance.model.time.minutes > 59) { + CoC.instance.timeQ++; + CoC.instance.model.time.minutes -= 60; + } + time = Math.floor(time); + //Advance hours + if (CoC.instance.timeQ > 0) { + CoC.instance.timeQ--; + CoC.instance.model.time.hours++; + if (CoC.instance.model.time.hours > 23) { + CoC.instance.model.time.days++; + CoC.instance.model.time.hours = 0; + } + } + EngineCore.statScreenRefresh(); + } + + public static function growHair(amount:Number = .1):Boolean { + //Grow hair! + var player:Player = CoC.instance.player; + var currentLength:Number = player.hairLength; + player.hairLength += amount; + if (player.hairLength > 0 && currentLength == 0) { + EngineCore.outputText("\nYou are no longer bald. You now have " + Appearance.hairDescription(player) + " coating your head.\n"); + return true; + } + else if (player.hairLength >= 1 && currentLength < 1) { + EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); + return true; + } + else if (player.hairLength >= 3 && currentLength < 3) { + EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); + return true; + } + else if (player.hairLength >= 6 && currentLength < 6) { + EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); + return true; + } + else if (player.hairType == Hair.GORGON && player.hairLength >= 6 && currentLength < 6) { + EngineCore.outputText("\nYour gorgon's hair growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); + return true; + } + else if (player.hairLength >= 10 && currentLength < 10) { + EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); + return true; + } + else if (player.hairType == Hair.GORGON && player.hairLength >= 10 && currentLength < 10) { + EngineCore.outputText("\nYour gorgon's hair growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); + return true; + } + else if (player.hairLength >= 16 && currentLength < 16) { + EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); + return true; + } + else if (player.hairType == Hair.GORGON && player.hairLength >= 16 && currentLength < 16) { + EngineCore.outputText("\nYour gorgon's hair growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); + return true; + } + else if (player.hairLength >= 26 && currentLength < 26) { + EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); + return true; + } + else if (player.hairType == Hair.GORGON && player.hairLength >= 26 && currentLength < 26) { + EngineCore.outputText("\nYour gorgon's hair growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); + return true; + } + else if (player.hairLength >= 40 && currentLength < 40) { + EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); + return true; + } + else if (player.hairType == Hair.GORGON && player.hairLength >= 40 && currentLength < 40) { + EngineCore.outputText("\nYour gorgon's hair growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); + return true; + } + else if (player.hairLength >= 40 && player.hairLength >= player.tallness && currentLength < player.tallness) { + EngineCore.outputText("\nYour hair's growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); + return true; + } + else if (player.hairType == Hair.GORGON && player.hairLength >= 40 && player.hairLength >= player.tallness && currentLength < player.tallness) { + EngineCore.outputText("\nYour gorgon's hair growth has reached a new threshhold, giving you " + Appearance.hairDescription(player) + ".\n"); + return true; + } + return false; + } + + public static function growBeard(amount:Number = .1):Boolean { + //Grow beard! + var player:Player = CoC.instance.player; + var tempBeard:Number = player.beardLength; + player.beardLength += amount; + + if (player.beardLength > 0 && tempBeard == 0) { + EngineCore.outputText("\nYou feel a tingling in your cheeks and chin. You now have " + Appearance.beardDescription(player) + " coating your cheeks and chin.\n"); + return true; + } + else if (player.beardLength >= 0.2 && tempBeard < 0.2) { + EngineCore.outputText("\nYour beard's growth has reached a new threshhold, giving you " + Appearance.beardDescription(player) + ".\n"); + return true; + } + else if (player.beardLength >= 0.5 && tempBeard < 0.5) { + EngineCore.outputText("\nYour beard's growth has reached a new threshhold, giving you " + Appearance.beardDescription(player) + ".\n"); + return true; + } + else if (player.beardLength >= 1.5 && tempBeard < 1.5) { + EngineCore.outputText("\nYour beard's growth has reached a new threshhold, giving you " + Appearance.beardDescription(player) + ".\n"); + return true; + } + else if (player.beardLength >= 3 && tempBeard < 3) { + EngineCore.outputText("\nYour beard's growth has reached a new threshhold, giving you " + Appearance.beardDescription(player) + ".\n"); + return true; + } + else if (player.beardLength >= 6 && tempBeard < 6) { + EngineCore.outputText("\nYour beard's growth has reached a new threshhold, giving you " + Appearance.beardDescription(player) + ".\n"); + return true; + } + + return false; + } + //Any classes that need to be aware of the passage of time can add themselves to this array using timeAwareAdd. + // Once in the array they will be notified as each hour passes, allowing them to update actions, lactation, pregnancy, etc. + + public static function timeAwareClassAdd(newEntry:TimeAwareInterface):void { + _timeAwareClassList.push(newEntry); + } + + public static function timeAwareClassRemove(toRemove:TimeAwareInterface):void { + var i:int = _timeAwareClassList.indexOf(toRemove); + if (i >= 0) { + _timeAwareClassList.splice(i, 1); + } + } + + public static function set doCamp(value:Function):void { + if(_campSet){throw new Error("Multiple Docamp Inits");return;} + _doCamp = value; + _campSet = true; + } +} +} diff --git a/classes/classes/Items/ArmorLib.as b/classes/classes/Items/ArmorLib.as index 41c524e201..9b476ef341 100644 --- a/classes/classes/Items/ArmorLib.as +++ b/classes/classes/Items/ArmorLib.as @@ -23,6 +23,8 @@ package classes.Items public const BEEARMR:Armor = new BeeArmor(); public const BIMBOSK:ArmorWithPerk = new ArmorWithPerk("BimboSk","BimboSk","bimbo skirt","a skirt that looks like it belongs on a bimbo",1,0,40,"A tight, cleavage-inducing halter top and an extremely short miniskirt. The sexual allure of this item is undoubtable.","Light", PerkLib.SluttySeduction,10,0,0,0,"Your delightfully slutty yet upbeat garb helps you seduce your foes!", false, false); + public const BLKIMONO:ArmorWithPerk = new ArmorWithPerk("Bl.Kimono","Bl.Kimono","black kimono","a black kimono",0,1,200,"This lovely black kimono is adorned with a red floral pattern. It will likely increase your spiritual power as a kitsune.","Light", + PerkLib.WizardsAndDaoistsEndurance,20,20,0,0); public const BKIMONO:ArmorWithPerk = new ArmorWithPerk("B.Kimono","B.Kimono","blue kimono","a blue kimono",0,1,200,"This lovely blue kimono is adorned with a floral pattern. It will likely increase your spiritual power as a kitsune.","Light", PerkLib.WizardsAndDaoistsEndurance,20,20,0,0); public const BONSTRP:ArmorWithPerk = new ArmorWithPerk("BonStrp","BonStrp","barely-decent bondage straps","a set of bondage straps",0,0,40,"These leather straps and well-placed hooks are actually designed in such a way as to be worn as clothing. While they technically would cover your naughty bits, virtually every other inch of your body would be exposed.","Light", diff --git a/classes/classes/Items/Mutations.as b/classes/classes/Items/Mutations.as index 9d096ddd2c..e42b261909 100644 --- a/classes/classes/Items/Mutations.as +++ b/classes/classes/Items/Mutations.as @@ -7726,8 +7726,8 @@ public final class Mutations extends MutationsHelper if (player.balls == 0) outputText(" Two rounded orbs drop down below, filling out a new, fleshy sac above your [legs]. Sweet! You can probably cum buckets with balls like these."); outputText("\n\n"); player.createCock(); - player.cocks[0].cockLength = 12; - player.cocks[0].cockThickness = 2.75; + player.cocks[0].cockLength = 10; + player.cocks[0].cockThickness = 2; if (player.balls == 0) { player.balls = 2; player.ballSize = 3; diff --git a/classes/classes/PerkLib.as b/classes/classes/PerkLib.as index 3dd5748c3a..fd21c7e9a1 100644 --- a/classes/classes/PerkLib.as +++ b/classes/classes/PerkLib.as @@ -97,15 +97,15 @@ public class PerkLib public static const AscensionNaturalMetamorph:PerkType = mk("Ascension: Natural Metamorph", "Ascension: Natural Metamorph", "When others needs to work hard on unlocking their metamorph potential you never had to do it. Whatever the reason for that is... truth be told you try not to think about it, affraid of what it might mean for you. You do not want to care about it as long as it's nothing harmfull for you in the long run."); public static const AscensionTranscendentalGeneticMemoryStage1:PerkType = mk("Ascension: Transcendental Genetic Memory (Stage 1)", "Ascension: Transcendental Genetic Memory (Stage 1)", - "Allows to retain up to 10 choosen unlocked metamorph options."); + "Allows to retain up to 15 choosen unlocked metamorph options."); public static const AscensionTranscendentalGeneticMemoryStage2:PerkType = mk("Ascension: Transcendental Genetic Memory (Stage 2)", "Ascension: Transcendental Genetic Memory (Stage 2)", - "Allows to retain up to 20 choosen unlocked metamorph options."); - public static const AscensionTranscendentalGeneticMemoryStage3:PerkType = mk("Ascension: Transcendental Genetic Memory (Stage 3)", "Ascension: Transcendental Genetic Memory (Stage 3)", "Allows to retain up to 30 choosen unlocked metamorph options."); + public static const AscensionTranscendentalGeneticMemoryStage3:PerkType = mk("Ascension: Transcendental Genetic Memory (Stage 3)", "Ascension: Transcendental Genetic Memory (Stage 3)", + "Allows to retain up to 45 choosen unlocked metamorph options."); public static const AscensionTranscendentalGeneticMemoryStage4:PerkType = mk("Ascension: Transcendental Genetic Memory (Stage 4)", "Ascension: Transcendental Genetic Memory (Stage 4)", - "Allows to retain up to 40 choosen unlocked metamorph options."); + "Allows to retain up to 60 choosen unlocked metamorph options."); public static const AscensionTranscendentalGeneticMemoryStage5:PerkType = mk("Ascension: Transcendental Genetic Memory (Stage 5)", "Ascension: Transcendental Genetic Memory (Stage 5)", - "Allows to retain up to 50 choosen unlocked metamorph options."); + "Allows to retain up to 75 choosen unlocked metamorph options."); public static const AscensionUnderdog:PerkType = mk("Ascension: Underdog", "Ascension: Underdog", "You're underdog. Gains twice more exp for beating up enemies above your current level with doubled limit after which increase to gained exp stops.");// Also allow to use 'accidentally' finding all forgotten or hidden legacies from times before the demon invasion."); public static const AscensionUnlockedPotential:PerkType = mk("Ascension: Unlocked Potential", "Ascension: Unlocked Potential", @@ -114,12 +114,22 @@ public class PerkLib "Due to reincarnation experience your body becoming strong faster than in previous life (increased passive wrath, mana, soulforce gains at lvl-up)."); // public static const AscensionAdditionalOrganMutation02:PerkType = mk("Ascension: Additional Organ Mutation (2nd Stage)", "Ascension: Additional Organ Mutation (2nd Stage)", // "Numerous internal mutation changed your body to allow handle 3rd mutation of the same organ/internal body part."); + // public static const AscensionAdditionalOrganMutation03:PerkType = mk("Ascension: Additional Organ Mutation (3rd Stage)", "Ascension: Additional Organ Mutation (3rd Stage)", + // "Numerous internal mutation changed your body to allow handle 4th mutation of the same organ/internal body part."); // public static const AscensionTranscendentalGeneticMemoryStage6:PerkType = mk("Ascension: Transcendental Genetic Memory (Stage 6)", "Ascension: Transcendental Genetic Memory (Stage 6)", - // "Allows to retain up to 60 choosen unlocked metamorph options."); - // public static const Ascension:PerkType = mk("Ascension: Artifical-made Metamorph", "Ascension: Artifical-made Metamorph", - // "."); + // "Allows to retain up to 90 choosen unlocked metamorph options."); + // public static const AscensionTranscendentalGeneticMemoryStage7:PerkType = mk("Ascension: Transcendental Genetic Memory (Stage 7)", "Ascension: Transcendental Genetic Memory (Stage 7)", + // "Allows to retain up to 105 choosen unlocked metamorph options."); // public static const AscensionBuildingPrestige06:PerkType = mk("Ascension: Building Prestige (6th Stage)", "Ascension: Building Prestige (6th Stage)", // "Your understanding of prestige jobs from previous life allows to pick 7th one at lvl 42+."); + // public static const AscensionBuildingPrestige07:PerkType = mk("Ascension: Building Prestige (7th Stage)", "Ascension: Building Prestige (7th Stage)", + // "Your understanding of prestige jobs from previous life allows to pick 8th one at lvl 42+."); + // public static const Ascension:PerkType = mk("Ascension: Artifical-made Metamorph", "Ascension: Artifical-made Metamorph", + // "."); + // public static const Ascension:PerkType = mk("Ascension: ", "Ascension: ", + // "."); + // public static const Ascension:PerkType = mk("Ascension: ", "Ascension: ", + // "."); // public static const Ascension:PerkType = mk("Ascension: ", "Ascension: ", // "."); // public static const Ascension:PerkType = mk("Ascension: ", "Ascension: ", @@ -176,131 +186,8 @@ public class PerkLib "Seductive experience causes your tease attacks to be 15% more effective.", null, true); // Ordinary (levelup) perks - public static const Wizened:PerkType = mk("Wizened", "Wizened", - ". (+10% max Soulforce)", - "You choose the 'Wizened' perk, gaining +10% max Soulforce."); - public static const PathOfEnlightenment:PerkType = mk("Path of Enlightenment", "Path of Enlightenment", - ". (+10% max Soulforce)", - "You choose the 'Path of Enlightenment' perk, gaining +10% max Soulforce."); - public static const Embodiment:PerkType = mk("Embodiment", "Embodiment", - ". (+10% max Soulforce)", - "You choose the 'Embodiment' perk, gaining +10% max Soulforce."); - public static const InControl:PerkType = mk("In Control", "In Control", - ". (+10% max Soulforce)", - "You choose the 'In Control' perk, gaining +10% max Soulforce."); - public static const Metamorphable:PerkType = mk("Metamorphable", "Metamorphable", - ". (+10% max Soulforce)", - "You choose the 'Metamorphable' perk, gaining +10% max Soulforce."); - public static const SoulPowered:PerkType = mk("Soul Powered", "Soul Powered", - ". (+10% max Soulforce)", - "You choose the 'Soul Powered' perk, gaining +10% max Soulforce."); - public static const AllSeeing:PerkType = mk("All-Seeing", "All-Seeing", - ". (+10% max Soulforce)", - "You choose the 'All-Seeing' perk, gaining +10% max Soulforce."); - public static const PewWarmer:PerkType = mk("Pew Warmer", "Pew Warmer", - ".", - "You choose the 'Pew Warmer' perk, ."); - public static const Acolyte:PerkType = mk("Acolyte", "Acolyte", - ".", - "You choose the 'Acolyte' perk, ."); - public static const Priest:PerkType = mk("Priest", "Priest", - ".", - "You choose the 'Priest' perk, ."); - public static const Pastor:PerkType = mk("Pastor", "Pastor", - ".", - "You choose the 'Pastor' perk, ."); - public static const Saint:PerkType = mk("Saint", "Saint", - ".", - "You choose the 'Saint' perk, ."); - public static const Cardinal:PerkType = mk("Cardinal", "Cardinal", - ".", - "You choose the 'Cardinal' perk, ."); - public static const Pope:PerkType = mk("Pope", "Pope", - ".", - "You choose the 'Pope' perk, ."); - public static const Studious:PerkType = mk("Studious", "Studious", - ". (+10% max Mana)", - "You choose the 'Studious' perk, gaining +10% max Mana."); - public static const Teacher:PerkType = mk("Teacher", "Teacher", - ". (+10% max Mana)", - "You choose the 'Teacher' perk, gaining +10% max Mana."); - public static const Professor:PerkType = mk("Professor", "Professor", - ". (+10% max Mana)", - "You choose the 'Professor' perk, gaining +10% max Mana."); - public static const Principle:PerkType = mk("Principle", "Principle", - ". (+10% max Mana)", - "You choose the 'Principle' perk, gaining +10% max Mana."); - public static const Dean:PerkType = mk("Dean", "Dean", - ". (+10% max Mana)", - "You choose the 'Dean' perk, gaining +10% max Mana."); - public static const President:PerkType = mk("President", "President", - ". (+10% max Mana)", - "You choose the 'President' perk, gaining +10% max Mana."); - public static const Nerd:PerkType = mk("NERD!!!", "NERD!!!", - ". (+10% max Mana)", - "You choose the 'NERD!!!' perk, gaining +10% max Mana."); - public static const SoldiersFriend:PerkType = mk("Soldier's Friend", "Soldier's Friend", - ". (+10% range phys dmg)", - "You choose the 'Soldier's Friend' perk, gaining +10% range phys dmg."); - public static const PyrosFriend:PerkType = mk("Pyro's Friend", "Pyro's Friend", - ". (+10% range phys dmg)", - "You choose the 'Pyro's Friend' perk, gaining +10% range phys dmg."); - public static const HeavysFriend:PerkType = mk("Heavy's Friend", "Heavy's Friend", - ". (+10% range phys dmg)", - "You choose the 'Heavy's Friend' perk, gaining +10% range phys dmg."); - public static const EngineersFriend:PerkType = mk("Engineer's Friend", "Engineer's Friend", - ". (+10% range phys dmg)", - "You choose the 'Engineer's Friend' perk, gaining +10% range phys dmg."); - public static const SnipersFriend:PerkType = mk("Sniper's Friend", "Sniper's Friend", - ". (+10% range phys dmg)", - "You choose the 'Sniper's Friend' perk, gaining +10% range phys dmg."); - public static const SpysEnemy:PerkType = mk("Spy's Enemy", "Spy's Enemy", - ". (+10% range phys dmg)", - "You choose the 'Spy's Enemy' perk, gaining +10% range phys dmg."); - public static const ShitYouTouchedSasha:PerkType = mk("SHIT YOU TOUCHED SASHA!!!", "SHIT YOU TOUCHED SASHA!!!", - ". (+10% range phys dmg)", - "You choose the 'SHIT YOU TOUCHED SASHA!!!' perk, gaining +10% range phys dmg."); - public static const Whistles:PerkType = mk("Whistles", "Whistles", - ". (+20% fatigue recovery rate)", - "You choose the 'Whistles' perk, gaining +20% fatigue recovery rate."); - public static const LyingDown:PerkType = mk("Lying Down", "Lying Down", - ". (+20% fatigue recovery rate)", - "You choose the 'Lying Down' perk, gaining +20% fatigue recovery rate."); - public static const TakingABreak:PerkType = mk("Taking a Break", "Taking a Break", - ". (+20% fatigue recovery rate)", - "You choose the 'Taking a Break' perk, gaining +20% fatigue recovery rate."); - public static const SkippingWork:PerkType = mk("Skipping Work", "Skipping Work", - ". (+20% fatigue recovery rate)", - "You choose the 'Skipping Work' perk, gaining +20% fatigue recovery rate."); - public static const Napping:PerkType = mk("Napping", "Napping", - ". (+20% fatigue recovery rate)", - "You choose the 'Napping' perk, gaining +20% fatigue recovery rate."); - public static const ZZZ:PerkType = mk("ZZZ", "ZZZ", - ". (+20% fatigue recovery rate)", - "You choose the 'ZZZ' perk, gaining +20% fatigue recovery rate."); - public static const Lazy:PerkType = mk("LAZY!!!", "LAZY!!!", - ". (+20% fatigue recovery rate)", - "You choose the 'LAZY!!!' perk, gaining +20% fatigue recovery rate."); - public static const Amateur:PerkType = mk("Amateur", "Amateur", - ". (+15% tease dmg)", - "You choose the 'Amateur' perk, gaining +15% tease dmg."); - public static const Prostitute:PerkType = mk("Prostitute", "Prostitute", - ". (+15% tease dmg)", - "You choose the 'Prostitute' perk, gaining +15% tease dmg."); - public static const Escort:PerkType = mk("Escort", "Escort", - ". (+15% tease dmg)", - "You choose the 'Escort' perk, gaining +15% tease dmg."); - public static const BrothelOwner:PerkType = mk("Brothel Owner", "Brothel Owner", - ". (+15% tease dmg)", - "You choose the 'Brothel Owner' perk, gaining +15% tease dmg."); - public static const Pornstar:PerkType = mk("Pornstar", "Pornstar", - ". (+15% tease dmg)", - "You choose the 'Pornstar' perk, gaining +15% tease dmg."); - public static const SexChampion:PerkType = mk("Sex Champion", "Sex Champion", - ". (+15% tease dmg)", - "You choose the 'Sex Champion' perk, gaining +15% tease dmg."); public static const SexDeity:PerkType = mk("Sex Deity", "Sex Deity", - ". (+15% tease dmg)", + "Screw ----, you're the true sex deity! You're holiness empowers your sex drive, increasing your tease damage by 15%.", "You choose the 'Sex Deity' perk, gaining +15% tease dmg."); public static const TooAngryToDie:PerkType = mk("Too Angry to Die", "Too Angry to Die", ".",//stay alive when berserking at cost of super fast 5-15% max wrath drain per turn when below min HP or above max Lust? @@ -332,6 +219,9 @@ public class PerkLib public static const Acclimation:PerkType = mk("Acclimation", "Acclimation", "Reduces lust gain by 15%.", "You choose the 'Acclimation' perk, making your body 15% more resistant to lust, up to a maximum of 75%."); + public static const Acolyte:PerkType = mk("Acolyte", "Acolyte", + "You carry that long pole with a lit flme on it... you no longer sleep during mass, so you know how to further decrease your minimum libido and boost lust resistance. (-2 min libido/+5% to lust resistance)", + "You choose the 'Acolyte' perk, lowering min libido by 2 and rise lust resistance by 5%."); public static const AdvancedAerialCombat:PerkType = mk("Advanced Aerial Combat", "Advanced Aerial Combat", "You are trained to fight while in flight. (extend flight duration by 2 turns and increase evasion when flying by 5%)", "You choose the 'Advanced Aerial Combat' perk, you trained to fight while in flight."); @@ -366,6 +256,12 @@ public class PerkLib public static const Agility:PerkType = mk("Agility", "Agility", "Boosts armor points by a portion of your speed on light/medium armors.", "You choose the 'Agility' perk, increasing the effectiveness of Light/Medium armors by a portion of your speed."); + public static const AllSeeing:PerkType = mk("All-Seeing", "All-Seeing", + "You see everything... so you should have expected this description, and the 10% soul force gain.", + "You choose the 'All-Seeing' perk, gaining +10% max Soulforce."); + public static const Amateur:PerkType = mk("Amateur", "Amateur", + "You've just started out on your sex life. You don't know much, but you can tease well. (+15% tease dmg)", + "You choose the 'Amateur' perk, gaining +15% tease dmg."); public static const AmateurGunslinger:PerkType = mk("Amateur Gunslinger", "Amateur Gunslinger", "Gain an extra firearm attack per turn (2nd one).", "You choose the 'Amateur Gunslinger' perk, gaining an extra firearm attack per turn."); @@ -557,7 +453,10 @@ public class PerkLib "You choose the 'Brawler' perk, allowing you to make two unarmed attacks in a turn!"); public static const Brawn:PerkType = mk("Brawn", "Brawn", "You have increased your striking power. (+10% to phantom Str bonus, +5% to unarmed atk)", - "You choose the 'Brawn' perk, increasing your striking power."); + "You choose the 'Brawn' perk, increasing your striking power. (+10% to phantom Str bonus, +5% to unarmed atk)"); + public static const BrothelOwner:PerkType = mk("Brothel Owner", "Brothel Owner", + "You are now above having sex by yourself, having created an industry and now teach new women and men to have sex. These allow you to refine your tricks, increasing your tease damage by 15%.", + "You choose the 'Brothel Owner' perk, gaining +15% tease dmg."); public static const BrutalBlows:PerkType = mk("Brutal Blows", "Brutal Blows", "[if(player.str>=75)" + "Reduces enemy armor with each hit." + @@ -567,7 +466,10 @@ public class PerkLib "You choose the 'Brutal Blows' perk, which reduces enemy armor with each hit."); public static const Brute:PerkType = mk("Brute", "Brute", "You have increased your striking strength. (add 20 pts of phantom Str (scalable))", - "You choose the 'Brute' perk, increased your striking strength."); + "You choose the 'Brute' perk, increased your striking strength. (add 20 pts of phantom Str (scalable))"); + public static const Cardinal:PerkType = mk("Cardinal", "Cardinal", + "You are on of the more important people of faith, and an aid to the pope themself. Your dedication to both the pope and your faith decreases the minimum libido you have and boost lust resistance. (-2 min libido/+5% to lust resistance)", + "You choose the 'Cardinal' perk, lowering min libido by 2 and rise lust resistance by 5%."); public static const CarefulButRecklessAimAndShooting:PerkType = mk("Careful but Reckless Aim and Shooting", "Careful but Reckless Aim and Shooting", "Increase accuracy by 30% at cost of loosing 15 Tou.", "You choose the 'Careful but Reckless Aim and Shooting' perk, improving your accuracy by 30% at the cost of lowering by 15 your toughness."); @@ -771,6 +673,9 @@ public class PerkLib public static const DeadlyThrow:PerkType = mk("Deadly Throw", "Deadly Throw", "You learned how to use throwing weapon with better efficiency adding your speed to the damage.", "You choose the 'Deadly Throw' perk, adding your speed to throwing weapon damage."); + public static const Dean:PerkType = mk("Dean", "Dean", + "You control a section of the school as a member of the school board, answering only to the president. This increases max mana by 10%.", + "You choose the 'Dean' perk, gaining +10% max Mana."); public static const DeathPlunge:PerkType = mk("Death plunge", "Death plunge", "When using Great Dive you may add your weapon damage as part of the attack damage as if using power attack at its current maximum value consuming no wrath in the process.", "You choose the 'Death plunge' perk. When using Great Dive you may add your weapon damage as part of the attack damage as if using power attack at its current maximum value consuming no wrath in the process."); @@ -909,12 +814,18 @@ public class PerkLib public static const ElvishPeripheralNervSysFinalForm:PerkType = mk("Elvish Peripheral NervSys (Final Form)", "Elvish Peripheral NervSys (Final Form)", "Your Elvish Peripheral NervSys is giving you 15 pts of phantom Spe (scalable), increase your natural speed and evasion, decrease melee/range accuracy penalty when using multiattack options.", "You choose the 'Elvish Peripheral NervSys (Final Form)' perk, your peripheral nervous system reached it final changes to reassamble elvish peripheral nervous system."); + public static const Embodiment:PerkType = mk("Embodiment", "Embodiment", + "You embody the principles of the monks... as usual you should only expect the 10% soulforce gain.", + "You choose the 'Embodiment' perk, gaining +10% max Soulforce."); public static const EnableCriticals:PerkType = mk("Enable Criticals", "Enable Criticals", "You now score crits on all naturaly immune to them enemies like constructs, goo or plants.", "You choose the 'Enable Criticals' perk, allowing you to get crits on normaly immune to this enemy types."); public static const Enchantment:PerkType = mk("Enchantment", "Enchantment", "Using your arcane knowledge associated with alchemy, you enchant each item to further power its effects +1 effect.", "You choose the 'Enchantment' perk, number of possible effects of transformatives +1."); + public static const EngineersFriend:PerkType = mk("Engineer's Friend", "Engineer's Friend", + "Ah Spah's sappin' mah Sentrah! (Damn that's a thick accent... best take the +10% ranged damage buff before he turns it on you)", + "You choose the 'Engineer's Friend' perk, gaining +10% range phys dmg."); public static const Enhancement:PerkType = mk("Enhancement", "Enhancement", "Using your knowledge of alchemy, you've found a way to enhance the effects of transformatives +1 effect.", "You choose the 'Enhancement' perk, number of possible effects of transformatives +1."); @@ -923,10 +834,10 @@ public class PerkLib "You choose the 'Envenomed Bolt' perk, allowing you to apply your own venom to arrows and bolts."); public static const EpicBrawn:PerkType = mk("Epic Brawn", "Epic Brawn", "You have improved your striking power to epic level. (+25% to phantom Str bonus, +20% to unarmed atk)", - "You choose the 'Epic Brawn' perk, improving your striking power to epic level."); + "You choose the 'Epic Brawn' perk, improving your striking power to epic level. (+25% to phantom Str bonus, +20% to unarmed atk)"); public static const EpicBrute:PerkType = mk("Epic Brute", "Epic Brute", "You have improved your striking strength to epic level. (add 80 pts of phantom Str (scalable))", - "You choose the 'Epic Brute' perk, improving your striking strength to epic level."); + "You choose the 'Epic Brute' perk, improving your striking strength to epic level. (add 80 pts of phantom Str (scalable))"); public static const EpicDiehard:PerkType = mk("Epic Diehard", "Epic Diehard", "You can't loose by HP until reaching droping into negative health larger than 8% of max HP + 800(scalable). HP limit cumulative with other Diehard perks and when below 0 HP will not longer loose 1% of max HP per turn.", "You choose the 'Epic Diehard' perk, getting third upgrade of Diehard effect."); @@ -978,6 +889,9 @@ public class PerkLib public static const EromancyMaster:PerkType = mk("Eromancy (Master)", "Eromancy (Master)", "+2 extra maximum mana for each point of intelligence and +2 extra maximum fatigue for each point of libido, tease exp for use of Arouse spell or m. specials dealing lust dmg.", "You choose 'Eromancy (Master)' perk, granting +2 extra maximum mana for each point of intelligence and +2 extra maximum fatigue for each point of libido, tease exp for use of Arouse spell or m. specials dealing lust dmg."); + public static const Escort:PerkType = mk("Escort", "Escort", + "You've gotten so good you can now charge people money for having sex with you. There's many tricks you learned, increasing your tease damage by 15%.", + "You choose the 'Escort' perk, gaining +15% tease dmg."); public static const EternalyLastingBuffs:PerkType = mk("(Eternaly) Lasting Buffs", "(Eternaly) Lasting Buffs", "Buff spells last another 5 turns longer at another 2x increase of their costs.", "You choose the '(Eternaly) Lasting Buffs' perk. Your mastery over buffs reached (eternaly) lasting level."); @@ -1138,10 +1052,10 @@ public class PerkLib "You choose the 'Greater Aerial Combat' perk, you learned to use air and gravity to your own benefit."); public static const GreaterBrawn:PerkType = mk("Greater Brawn", "Greater Brawn", "You have greatly improved your striking power. (+20% to phantom Str bonus, +15% to unarmed atk)", - "You choose the 'Greater Brawn' perk, greatly improving your striking power."); + "You choose the 'Greater Brawn' perk, greatly improving your striking power. (+20% to phantom Str bonus, +15% to unarmed atk)"); public static const GreaterBrute:PerkType = mk("Greater Brute", "Greater Brute", "You have greatly improved your striking strength. (add 60 pts of phantom Str (scalable))", - "You choose the 'Greater Brute' perk, greatly improving your striking strength."); + "You choose the 'Greater Brute' perk, greatly improving your striking strength. (add 60 pts of phantom Str (scalable))"); public static const GreaterCrinosShape:PerkType = mk("Greater Crinos Shape", "Greater Crinos Shape", "Crinos Shape increase to physical might rise to 80% of str/tou/spe.", "You choose the 'Greater Crinos Shape' perk, gaining another increase to phys stats boost in Crinos Shape (+80%)."); @@ -1276,6 +1190,9 @@ public class PerkLib public static const HeartOfSteel:PerkType = mk("Heart of Steel", "Heart of Steel", "Even your heart has grown used to fighting, after all, the saying goes 'Steel your heart', further increasing your melee strength. (+10% melee phys dmg)", "You choose the 'Heart of Steel' perk, gaining +10% melee phys dmg."); + public static const HeavysFriend:PerkType = mk("Heavy's Friend", "Heavy's Friend", + "I like you! Cover Heavy! (You'll definitely need that +10% ranged damage buff if you're going in front of that dude)", + "You choose the 'Heavy's Friend' perk, gaining +10% range phys dmg."); public static const HectaAttackSmall:PerkType = mk("Hecta Attack (Small)", "Hecta Attack (Small)", "Allows you to perform seven melee attacks with small weapons per round.", "You choose the 'Hecta Attack (Small)' perk. This allows you to make seven melee attacks with small weapons."); @@ -1327,10 +1244,10 @@ public class PerkLib "You've chosen the 'Impale' perk. Your spear and lance critical hit attacks bonus damages are doubled."); public static const ImprovedBrawn:PerkType = mk("Improved Brawn", "Improved Brawn", "You have improved your striking power. (+15% to phantom Str bonus, +10% to unarmed atk)", - "You choose the 'Improved Brawn' perk, improving your striking power."); + "You choose the 'Improved Brawn' perk, improving your striking power. (+15% to phantom Str bonus, +10% to unarmed atk)"); public static const ImprovedBrute:PerkType = mk("Improved Brute", "Improved Brute", "You have improved your striking strength. (add 40 pts of phantom Str (scalable))", - "You choose the 'Improved Brute' perk, improving your striking strength."); + "You choose the 'Improved Brute' perk, improving your striking strength. (add 40 pts of phantom Str (scalable))"); public static const ImprovedCrinosShape:PerkType = mk("Improved Crinos Shape", "Improved Crinos Shape", "Crinos Shape increase to physical might rise to 40% of str/tou/spe.", "You choose the 'Improved Crinos Shape' perk, increasing boost recived by using Crinos Shape (+40%)."); @@ -1364,6 +1281,9 @@ public class PerkLib public static const ImprovingNaturesBlueprintsApexPredator:PerkType = mk("Improving Nature's Blueprints (Apex Predator)", "Improving Nature's Blueprints (Apex Predator)", "Changing negative bonuses to max Int and Wis from Job: Beast Warrior is the same value positive bonuses. While using Crinos shape increasing natural regeneration by 2% of max HP per turn.", "You choose the 'Improving Nature's Blueprints (Apex Predator)' perk, allowing you to become an Apex Predator that isn't dull and slow witted along with increased regeneration while using Crinos Shape."); + public static const InControl:PerkType = mk("In Control", "In Control", + "You are in control of your desires, that's it... except another 10% soul force gain.", + "You choose the 'In Control' perk, gaining +10% max Soulforce."); public static const InhumanDesireI:PerkType = mk("Inhuman Desire I", "Inhuman Desire I", "Raises max LP by 20.", "You choose the 'Inhuman Desire I' perk, giving you an additional 20 LP!"); @@ -1535,12 +1455,15 @@ public class PerkLib public static const LadyGodivasFavoriteChild:PerkType = mk("Lady Godiva's favorite Child", "Lady Godiva's favorite Child", "That's the source of your fortune... not only are you her child... but you're also her favorite... take your bonus and leave me alone while I wallow in my moneyless despair... meanie (More money upon victory because the writer began to sulk). (15% more gems from victories)", "You choose the 'Lady Godiva's favorite Child' perk, increasing gem gains from victories by 15%."); + public static const Lazy:PerkType = mk("LAZY!!!", "LAZY!!!", + "Sample Text Here/+20% fatigue recovery rate", + "You choose the 'LAZY!!!' perk, gaining +20% fatigue recovery rate."); public static const LegendaryBrawn:PerkType = mk("Legendary Brawn", "Legendary Brawn", "You have improved your striking power to epic level. (+30% to phantom Str bonus, +25% to unarmed atk)", - "You choose the 'Legendary Brawn' perk, improving your striking power to epic level."); + "You choose the 'Legendary Brawn' perk, improving your striking power to epic level. (+30% to phantom Str bonus, +25% to unarmed atk)"); public static const LegendaryBrute:PerkType = mk("Legendary Brute", "Legendary Brute", "You have improved your striking strength to epic level. (add 100 pts of phantom Str (scalable))", - "You choose the 'Legendary Brute' perk, improving your striking strength to epic level."); + "You choose the 'Legendary Brute' perk, improving your striking strength to epic level. (add 100 pts of phantom Str (scalable))"); public static const LegendaryEndurance:PerkType = mk("Legendary Endurance", "Legendary Endurance", "Increases maximum fatigue by 10000.", "You choose the 'Legendary Endurance' perk. Thanks to your legendary physical conditioning, your maximum fatigue has been increased by 10000!"); @@ -1621,6 +1544,9 @@ public class PerkLib "You are too slow to benefit from this perk." + "]", "You choose the 'Lunging Attacks' perk, granting 50% armor penetration for standard attacks."); + public static const LyingDown:PerkType = mk("Lying Down", "Lying Down", + "Sample Text Here/+20% fatigue recovery rate", + "You choose the 'Lying Down' perk, gaining +20% fatigue recovery rate."); public static const Mage:PerkType = mk("Mage", "Mage", "[if (player.inte>=50)" + "Increases base spell strength by 20% and mana pool by 30." + @@ -1696,6 +1622,9 @@ public class PerkLib "Grants 15% chance per round of cleansing poisons/drugs from your body. Increases HP restoration on rest.", "You choose the 'Medicine' perk, giving you a chance to remove debilitating poisons automatically! Also, increases HP restoration on rest."); public static const Metamorph:MetamorphPerk = new MetamorphPerk(); + public static const Metamorphable:PerkType = mk("Metamorphable", "Metamorphable", + "You can manipulate your soul force to change your body... but this increases your soul force by 10%.", + "You choose the 'Metamorphable' perk, gaining +10% max Soulforce."); public static const MindOfSteel:PerkType = mk("Mind of Steel", "Mind of Steel", "Careful now, you're becoming too much like a weapon. You're mindset has become that of a weapon, allowing you to connect with your melee weapon to deal even more damage. (+10% melee phys dmg)", "You choose the 'Mind of Steel' perk, gaining +10% melee phys dmg."); @@ -1740,10 +1669,10 @@ public class PerkLib "You choose the 'Muscles of Steel' perk, gaining +10% melee phys dmg."); public static const MythicalBrawn:PerkType = mk("Mythical Brawn", "Mythical Brawn", "You have improved your striking power to epic level. (+35% to phantom Str bonus, +30% to unarmed atk)", - "You choose the 'Mythical Brawn' perk, improving your striking power to epic level."); + "You choose the 'Mythical Brawn' perk, improving your striking power to epic level. (+35% to phantom Str bonus, +30% to unarmed atk)"); public static const MythicalBrute:PerkType = mk("Mythical Brute", "Mythical Brute", "You have improved your striking strength to epic level. (add 120 pts of phantom Str (scalable))", - "You choose the 'Mythical Brute' perk, improving your striking strength to epic level."); + "You choose the 'Mythical Brute' perk, improving your striking strength to epic level. (add 120 pts of phantom Str (scalable))"); public static const MythicalEndurance:PerkType = mk("Mythical Endurance", "Mythical Endurance", "Increases maximum fatigue by 20000.", "You choose the 'Mythical Endurance' perk. Thanks to your mythical physical conditioning, your maximum fatigue has been increased by 20000!"); @@ -1783,6 +1712,9 @@ public class PerkLib public static const NakedTruth:PerkType = mk("Naked Truth", "Naked Truth", "Opponent have a hard time dealing serious damage as the sight of your naked body distract them (+10% dmg reduction).", "You choose the 'Naked Truth' perk, causing opponent have a hard time dealing serious damage as the sight of your naked body distract them."); + public static const Napping:PerkType = mk("Napping", "Napping", + "Sample Text Here/+20% fatigue recovery rate", + "You choose the 'Napping' perk, gaining +20% fatigue recovery rate."); public static const NaturalHealingEpic:PerkType = mk("Natural healing (Epic)", "Natural healing (Epic)", "Incease healing power by 50% and lower healing spells mana costs by 20%.", "You choose the 'Natural healing (Epic)' perk, increasing healing spells effectivnes and lowering their costs."); @@ -1819,6 +1751,9 @@ public class PerkLib public static const NaturesSpringVI:PerkType = mk("Nature's Spring VI", "Nature's Spring VI", "Raises max fatigue by 20 and regain it 5% faster.", "You choose the 'Nature's Spring VI' perk, giving you an additional 20 fatigue and boosting your fatigue recovery rate."); + public static const Nerd:PerkType = mk("NERD!!!", "NERD!!!", + "Piccolo's words, not mine... but they are perfect for describing you. Increase max mana by 10%.", + "You choose the 'NERD!!!' perk, gaining +10% max Mana."); public static const NonaAttackSmall:PerkType = mk("Nona Attack (Small)", "Nona Attack (Small)", "Allows you to perform nine melee attacks with small weapons per round.", "You choose the 'Nona Attack (Small)' perk. This allows you to make nine melee attacks with small weapons."); @@ -1868,6 +1803,12 @@ public class PerkLib "You are not fast enough to gain benefit from this perk." + "]", "You choose the 'Parry' perk, giving you a chance to deflect blow with your weapon. (Speed-based)."); + public static const Pastor:PerkType = mk("Pastor", "Pastor", + "Congratulations! You went from sleeping during the sermon, to being the putting people to sleep with sermons! The sheer devotion to your faith lowers you minimum libido and boost lust resistance. (-2 min libido/+5% to lust resistance)", + "You choose the 'Pastor' perk, lowering min libido by 2 and rise lust resistance by 5%."); + public static const PathOfEnlightenment:PerkType = mk("Path of Enlightenment", "Path of Enlightenment", + "You walk a path of enlightenment... You should stop expecting anything other than the 10% more soulforce.", + "You choose the 'Path of Enlightenment' perk, gaining +10% max Soulforce."); public static const PeerlessEndurance:PerkType = mk("Peerless Endurance", "Peerless Endurance", "Increases maximum fatigue by 1000.", "You choose the 'Peerless Endurance' perk. Thanks to your peerless physical conditioning, your maximum fatigue has been increased by 1000!"); @@ -1895,6 +1836,9 @@ public class PerkLib public static const PerfectStrike:PerkType = mk("Perfect strike", "Perfect strike", "When you strike (with puch/kick/soulblast) a stunned or frozen solid opponent you deal extra damage (50%).", "You choose the 'Perfect strike' perk, allowing to deal more damage to stunned or frozen solid enemeis with punch/kick type soulskills."); + public static const PewWarmer:PerkType = mk("Pew Warmer", "Pew Warmer", + "You attend mass, but have a small tendecy to sleep during the sermon... but hey, merely attending was enough to help lower your minimum libido and boost lust resistance. (-2 min libido/+5% to lust resistance)", + "You choose the 'Pew Warmer' perk, lowering min libido by 2 and rise lust resistance by 5%."); public static const PhantomStrike:PerkType = mk("Phantom Strike", "Phantom Strike", "Allows to attack twice with some P. Specials at double cost. (Wing Slap, Stone Claw, Tail Slam, Kick and few others)", "You choose the 'Phantom Strike' perk, allowing to attack twice with some P. Specials at double cost."); @@ -1907,6 +1851,12 @@ public class PerkLib public static const PigBoarFatFinalForm:PerkType = mk("Pig/Boar Fat (Final Form)", "Pig/Boar Fat (Final Form)", "Your altered fat tissue increased again your natural resistance to damage, toughness and thickness limit. Body Slam power increase twicefold and it not req. to be pig/boar to use it, also another lowering of min. thickness to use it.", "You choose the 'Pig/Boar Fat (Final Form)' perk. Your pig fat tissue changes boosted your pig special once again."); + public static const Pope:PerkType = mk("Pope", "Pope", + "You are the most important mortal in your faith, the pinnacle of faith and devotion! Of course this means your minimum libido and lust resistance is as far as it will go! (-2 min libido/+5% to lust resistance)", + "You choose the 'Pope' perk, lowering min libido by 2 and rise lust resistance by 5%."); + public static const Pornstar:PerkType = mk("Pornstar", "Pornstar", + "You are famous for your acts of sex, with many teenagers dreaming of having a chance with you. All the tips you learned help your tease damage by 15%.", + "You choose the 'Pornstar' perk, gaining +15% tease dmg."); public static const PowerSweep:PerkType = mk("Power Sweep", "Power Sweep", "Allows the use of whirlwind using one handed weapons at 75% of the normal effect. Large weapon gain a 25% bonus to whirlwind damage (Does not include fist).", "You choose the 'Power Sweep' perk. This allows you to improve Whirlwind attack."); @@ -1916,6 +1866,9 @@ public class PerkLib public static const Precision:PerkType = mk("Precision", "Precision", "Reduces enemy armor by 10. (Req's 25+ Intelligence)", "You've chosen the 'Precision' perk. Thanks to your intelligence, you're now more adept at finding and striking an enemy's weak points, reducing their damage resistance from armor by 10. If your intelligence ever drops below 25 you'll no longer be smart enough to benefit from this perk."); + public static const President:PerkType = mk("President", "President", + "You own the school board, controlling what classes are taught, further increasing max mana by 10%.", + "You choose the 'President' perk, gaining +10% max Mana."); public static const PrestigeJobArcaneArcher:PerkType = mk("Prestige Job: Arcane Archer", "Prestige Job: Arcane Archer", "You've trained in prestige art of combining magic and arrows.", "You choose 'Prestige Job: Arcane Archer' perk, training yourself to became Arcane Archer."); @@ -1940,6 +1893,9 @@ public class PerkLib public static const PrestigeJobTempest:PerkType = mk("Prestige Job: Tempest", "Prestige Job: Tempest", "You've trained in prestige art of dual wielding as you hack and slice through your opponents like a raging storm of steel.", "You choose 'Prestige Job: Tempest' perk, training yourself to became Tempest."); + public static const Priest:PerkType = mk("Priest", "Priest", + "You now speak during mass, your words of wisdom empowerin others and you to have a lower minimum libido and boost lust resistance. (-2 min libido/+5% to lust resistance)", + "You choose the 'Priest' perk, lowering min libido by 2 and rise lust resistance by 5%."); public static const PrimalFuryI:PerkType = mk("Primal Fury I", "Primal Fury I", "Raises max Wrath by 10, generates 1 point of Wrath out of combat and double this amount during fight.", "You choose the 'Primal Fury I' perk, increasing passive wrath generation and max Wrath."); @@ -1958,6 +1914,18 @@ public class PerkLib public static const PrimalFuryVI:PerkType = mk("Primal Fury VI", "Primal Fury VI", "Raises max Wrath by 10, generates 1 point of Wrath out of combat and double this amount during fight.", "You choose the 'Primal Fury VI' perk, increasing passive wrath generation and max Wrath."); + public static const Principle:PerkType = mk("Principle", "Principle", + "You oversee the day to day actions inside the school, your studious nature increasing max mana by 10%.", + "You choose the 'Principle' perk, gaining +10% max Mana."); + public static const Professor:PerkType = mk("Professor", "Professor", + "You're more important than the standard teacher, and your paycheck reflects that. You're hired for your knowledge which increases max mana by 10%.", + "You choose the 'Professor' perk, gaining +10% max Mana."); + public static const Prostitute:PerkType = mk("Prostitute", "Prostitute", + "It's official, everyone knows to go to you for sex. You're still new to the business, but you learned some new tricks. (+15% tease dmg)", + "You choose the 'Prostitute' perk, gaining +15% tease dmg."); + public static const PyrosFriend:PerkType = mk("Pyro's Friend", "Pyro's Friend", + "Mmmphmm! (No idea what he? is trying to say... but same rules apply... +10% ranged damage buff)", + "You choose the 'Pyro's Friend' perk, gaining +10% range phys dmg."); public static const QuadrupleAttack:PerkType = mk("Quadruple Attack", "Quadruple Attack", "Allows you to perform four melee attacks with non-large weapons per round.", "You choose the 'Quadruple Attack' perk. This allows you to make four melee attacks with non-large weapons."); @@ -2046,6 +2014,9 @@ public class PerkLib public static const Sadist:PerkType = mk("Sadist", "Sadist", "Deal 20% more damage, but gain lust at the same time.", "You choose the 'Sadist' perk, increasing damage by 20 percent but causing you to gain lust from dealing damage."); + public static const Saint:PerkType = mk("Saint", "Saint", + "You go on periodic journeys to spread your faith and help those in need. These constant pilgrimages decrease your minimum libido and boost lust resistance. (-2 min libido/+5% to lust resistance)", + "You choose the 'Saint' perk, lowering min libido by 2 and rise lust resistance by 5%."); public static const SalamanderAdrenalGlands:PerkType = mk("Salamander Adrenal Glands", "Salamander Adrenal Glands", "Your Salamander adrenal glands are giving you slight boost to your natural stamina and libido.", "You choose the 'Salamander Adrenal Glands' perk, due to repeadly exposure to effects of lustzerk your adrenal glands mutated."); @@ -2073,6 +2044,9 @@ public class PerkLib public static const Sensual:PerkType = mk("Sensual", "Sensual", "Lowering by ~40% needed exp to lvl-up tease and +1 more tease exp after succes.", "You choose the 'Sensual' perk, lowering by ~40% needed exp to lvl-up tease and +1 more tease exp after succes."); + public static const SexChampion:PerkType = mk("Sex Champion", "Sex Champion", + "You are the shining symbol of the sex industry, the beacon of hope for those aspiring in the industry. The sheer number of tricks and tips you have up your tease damage 15%.", + "You choose the 'Sex Champion' perk, gaining +15% tease dmg."); public static const Sharpshooter:PerkType = mk("Sharpshooter", "Sharpshooter", "Allow to increase non-bow range weapons attack up to 200% (Intelligence-based).", "You choose the 'Sharpshooter' perk, allowing to slightly increase non-bow range weapons attack."); @@ -2105,6 +2079,12 @@ public class PerkLib public static const ShieldWard:PerkType = mk("Shield Ward", "Shield Ward", "When you wearing a shield lower chance to be knocked back or disarmed by enemy attacks.", "You choose the 'Shield Ward' perk, allowing to lower chance to be knocked back or disarmed when using shield."); + public static const ShitYouTouchedSasha:PerkType = mk("SHIT YOU TOUCHED SASHA!!!", "SHIT YOU TOUCHED SASHA!!!", + "DIE!!! (You're fucked... not even this final +10% ranged damage buff will save your sorry ass...)", + "You choose the 'SHIT YOU TOUCHED SASHA!!!' perk, gaining +10% range phys dmg."); + public static const SkippingWork:PerkType = mk("Skipping Work", "Skipping Work", + "Sample Text Here/+20% fatigue recovery rate", + "You choose the 'Skipping Work' perk, gaining +20% fatigue recovery rate."); public static const Slayer:PerkType = mk("Slayer", "Slayer", "Increase sneaky attack dmg by another 300% base value (7x).", "You choose the 'Slayer' perk. Increase sneaky attack dmg by another 300% base value (7x)."); @@ -2114,6 +2094,12 @@ public class PerkLib public static const SneakyAttack:PerkType = mk("Sneaky attack", "Sneaky attack", "Strike the vitals of a stunned, blinded or distracted opponent for heavy damage (2x).", "You choose the 'Sneaky attack' perk. Strike the vitals of a stunned, blinded or distracted opponent for heavy damage (2x)."); + public static const SnipersFriend:PerkType = mk("Sniper's Friend", "Sniper's Friend", + "Angry Ausie Noises! (Did you understand him? Neither did I... be careful of the piss jars and get that +10% ranged damage buff!)", + "You choose the 'Sniper's Friend' perk, gaining +10% range phys dmg."); + public static const SoldiersFriend:PerkType = mk("Soldier's Friend", "Soldier's Friend", + "Get out there ya commie! (Just go, don't argue with him and take a +10% ranged damage buff)", + "You choose the 'Soldier's Friend' perk, gaining +10% range phys dmg."); public static const SoulAncestor:PerkType = mk("Soul Ancestor", "Soul Ancestor", "Allow reaching 12th stage of soul cultivation. (+35 max Hunger, +140 max SF at lvl 72, 74, 76; +25% to max SF at lvl 72)", "You choose the 'Soul Ancestor' perk, reaching 12th stage of soul cultivation! (+35 max Hunger, +140 max SF at lvl 72, 74, 76; +25% to max SF at lvl 72)"); @@ -2141,6 +2127,9 @@ public class PerkLib public static const SoulPersonage:PerkType = mk("Soul Personage", "Soul Personage", "Allow reaching 2nd stage of soul cultivation. (+20 max Hunger, +40 max SF at lvl 12, 14, 16; +10% to max SF at lvl 12)", "You choose the 'Soul Personage' perk, reaching 2nd stage of soul cultivation! (+20 max Hunger, +40 max SF at lvl 12, 14, 16; +10% to max SF at lvl 12)"); + public static const SoulPowered:PerkType = mk("Soul Powered", "Soul Powered", + "You use your soul force more than anything else... increasing its size by 10%.", + "You choose the 'Soul Powered' perk, gaining +10% max Soulforce."); public static const SoulScholar:PerkType = mk("Soul Scholar", "Soul Scholar", "Allow reaching 5th stage of soul cultivation. (+25 max Hunger, +70 max SF at lvl 30, 32, 34; +15% to max SF at lvl 30)", "You choose the 'Soul Scholar' perk, reaching 5th stage of soul cultivation! (+25 max Hunger, +70 max SF at lvl 30, 32, 34; +15% to max SF at lvl 30)"); @@ -2194,6 +2183,9 @@ public class PerkLib public static const SpiritedDive:PerkType = mk("Spirited Dive", "Spirited Dive", "You can perform a terrifying dive-bomb attack. (Great Dive have full AoE dmg bonus vs Groups)", "You choose the 'Spirited Dive' perk, learning to perform terrifying dive-bomb attack. (AoE dmg on Great Dive)"); + public static const SpysEnemy:PerkType = mk("Spy's Enemy", "Spy's Enemy", + "Backst- Enemy Spy is here! Aww Dammit! (Close call there... I'd take the +10% ranged damage buff before he comes back)", + "You choose the 'Spy's Enemy' perk, gaining +10% range phys dmg."); public static const StarlightStrikes:PerkType = mk("Starlight Strikes", "Starlight Strikes", "[if(player.spe>=60)" + "Increases the attack damage for small weapons." + @@ -2216,6 +2208,9 @@ public class PerkLib public static const StrongestElementalBond:PerkType = mk("Strongest Elemental Bond", "Strongest Elemental Bond", "Lower by 90 needed mana to sustain active elemental in combat.", "You choose the 'Strongest Elemental Bond' perk, reaching near the peak of connection strength with your elementals."); + public static const Studious:PerkType = mk("Studious", "Studious", + "You're a new student, kinda have to be studious. Your hours of study has helped you increase max mana by 10%.", + "You choose the 'Studious' perk, gaining +10% max Mana."); public static const SuperChargedCore:PerkType = mk("Super Charged Core", "Super Charged Core", "At the cost of using additional mana you can super charge each temporal golem core attaing ever better effects than before.", "You choose 'Super Charged Core' perk, learning how to make core charging more effective."); @@ -2262,6 +2257,9 @@ public class PerkLib "You are too dumb to gain benefit from this perk." + "]", "You choose the 'Tactician' perk, increasing physical critical hit chance by up to 10% (Intelligence-based)."); + public static const TakingABreak:PerkType = mk("Taking a Break", "Taking a Break", + "Sample Text Here/+20% fatigue recovery rate", + "You choose the 'Taking a Break' perk, gaining +20% fatigue recovery rate."); public static const TankI:PerkType = mk("Tank I", "Tank I", "+3 extra HP per point of toughness.", "You choose the 'Tank I' perk, granting +3 extra maximum HP for each point of toughness."); @@ -2280,6 +2278,9 @@ public class PerkLib public static const TankVI:PerkType = mk("Tank VI", "Tank VI", "+3 extra HP per point of toughness.", "You choose the 'Tank VI' perk, granting +3 extra maximum HP for each point of toughness."); + public static const Teacher:PerkType = mk("Teacher", "Teacher", + "Instead of being taught, now you teach others. Your skill allows you to increase max mana by 10%.", + "You choose the 'Teacher' perk, gaining +10% max Mana."); public static const ThirstForBlood:PerkType = mk("Thirst for blood", "Thirst for blood", "Weapon and effect that causes bleed damage have this damage increased by 50%.", "You choose the 'Thirst for blood' perk, increasing damage done by bleed effects."); @@ -2471,12 +2472,21 @@ public class PerkLib public static const WhirlwindFeral:PerkType = mk("Feral Whirlwind", "Feral Whirlwind", "Feral Whirlwind special deal increased damage based on current strength and unarmed bonus.", "You choose the 'Feral Whirlwind' perk, making your Feral Whirlwind special stronger."); + public static const Whistles:PerkType = mk("Whistles", "Whistles", + "Sample Text Here/+20% fatigue recovery rate", + "You choose the 'Whistles' perk, gaining +20% fatigue recovery rate."); public static const WildQuiver:PerkType = mk("Wild Quiver", "Wild Quiver", "You grab and shoot arrows at blinding speed, gaining an extra shot.", "You choose the 'Wild Quiver' perk, you combine it with triple attack and manyshot to shoot up to 5 times."); public static const WisenedHealer:PerkType = mk("Wisened Healer", "Wisened Healer", "Adds wisdom based scaling to healing spells at cost of doubling spells costs.", "You choose the 'Wisened Healer' perk. Increasing healing spells effects based on current wisdom."); + public static const Wizened:PerkType = mk("Wizened", "Wizened", + "You are wise, what did you expect, something wise? You do get 10% more soulforce though.", + "You choose the 'Wizened' perk, gaining +10% max Soulforce."); + public static const ZZZ:PerkType = mk("ZZZ", "ZZZ", + "Sample Text Here/+20% fatigue recovery rate", + "You choose the 'ZZZ' perk, gaining +20% fatigue recovery rate."); //Perki obecnie nie używanie nigdzie - do usuniecia lub wykorzystania w czymś innym public static const UnlockMind:PerkType = mk("Unlock: Mind", "Unlock: Mind (1st Stage)", "Unlocking mind potential grants additional 5 Mana on each lvl-up (retroactive effect).", @@ -4886,7 +4896,8 @@ public class PerkLib .requireAnyPerk(HistoryFortune, PastLifeFortune); Nurse.requireLevel(6) .requireAnyPerk(HistoryHealer, PastLifeHealer); - //Religious + PewWarmer.requireLevel(6) + .requireAnyPerk(HistoryReligious, PastLifeReligious); Studious.requireLevel(6) .requireAnyPerk(HistoryScholar, PastLifeScholar); SoldiersFriend.requireLevel(6) @@ -5203,7 +5214,8 @@ public class PerkLib .requirePerk(Lucky); Doctor.requireLevel(24) .requirePerk(Nurse); - //Religious + Acolyte.requireLevel(24) + .requirePerk(PewWarmer); Teacher.requireLevel(24) .requirePerk(Studious); PyrosFriend.requireLevel(24) @@ -5383,7 +5395,8 @@ public class PerkLib .requirePerk(ExtremelyLucky); FirstResponse.requireLevel(42) .requirePerk(Doctor); - //Religious + Priest.requireLevel(42) + .requirePerk(Acolyte); Professor.requireLevel(42) .requirePerk(Teacher); HeavysFriend.requireLevel(42) @@ -5452,7 +5465,8 @@ public class PerkLib .requirePerk(MoneyFinder); Paramedic.requireLevel(72) .requirePerk(FirstResponse); - //Religious + Pastor.requireLevel(72) + .requirePerk(Priest); Principle.requireLevel(72) .requirePerk(Professor); EngineersFriend.requireLevel(72) diff --git a/classes/classes/Player.as b/classes/classes/Player.as index 2d94373f81..cde425d50e 100644 --- a/classes/classes/Player.as +++ b/classes/classes/Player.as @@ -420,14 +420,14 @@ use namespace CoC; if (skin.hasBaseOnly(Skin.STONE)) armorDef += (10 * newGamePlusMod); //'Thick' dermis descriptor adds 1! if (skinAdj == "smooth") armorDef += (1 * newGamePlusMod); - //Plant score bonuses + //Plant races score bonuses if (plantScore() >= 4) { if (plantScore() >= 7) armorDef += (10 * newGamePlusMod); else if (plantScore() == 6) armorDef += (8 * newGamePlusMod); else if (plantScore() == 5) armorDef += (4 * newGamePlusMod); else armorDef += (2 * newGamePlusMod); } - if (yggdrasilScore() >= 10) armorDef += (10 * newGamePlusMod); + if (yggdrasilScore() >= 10 || alrauneScore() >= 10) armorDef += (10 * newGamePlusMod); //Dragon score bonuses if (dragonScore() >= 10) { if (dragonScore() >= 28) armorDef += (10 * newGamePlusMod); @@ -702,8 +702,8 @@ use namespace CoC; //Natural Claws (arm types and weapons that can substitude them) public function haveNaturalClaws():Boolean { - return arms.type == Arms.CAT || arms.type == Arms.DEVIL || arms.type == Arms.DRAGON || arms.type == Arms.FOX || arms.type == Arms.GARGOYLE || arms.type == Arms.LION || arms.type == Arms.LIZARD || arms.type == Arms.RAIJU - || arms.type == Arms.RED_PANDA || arms.type == Arms.SALAMANDER || arms.type == Arms.WOLF; + return arms.type == Arms.CAT || arms.type == Arms.DEVIL || arms.type == Arms.DISPLACER || arms.type == Arms.DRAGON || arms.type == Arms.FOX || arms.type == Arms.GARGOYLE || arms.type == Arms.LION + || arms.type == Arms.LIZARD || arms.type == Arms.RAIJU || arms.type == Arms.RED_PANDA || arms.type == Arms.SALAMANDER || arms.type == Arms.WOLF; } public function haveNaturalClawsTypeWeapon():Boolean { @@ -1319,6 +1319,13 @@ use namespace CoC; if(findPerk(PerkLib.ResistanceIV) >= 0) lust -= 5; if(findPerk(PerkLib.ResistanceV) >= 0) lust -= 5; if(findPerk(PerkLib.ResistanceVI) >= 0) lust -= 5; + if(findPerk(PerkLib.PewWarmer) >= 0) lust -= 5; + if(findPerk(PerkLib.Acolyte) >= 0) lust -= 5; + if(findPerk(PerkLib.Priest) >= 0) lust -= 5; + if(findPerk(PerkLib.Pastor) >= 0) lust -= 5; + if(findPerk(PerkLib.Saint) >= 0) lust -= 5; + if(findPerk(PerkLib.Cardinal) >= 0) lust -= 5; + if(findPerk(PerkLib.Pope) >= 0) lust -= 5; if(findPerk(PerkLib.LactaBovinaOvariesEvolved) >= 0) lust -= 5; if(findPerk(PerkLib.MinotaurTesticlesEvolved) >= 0) lust -= 5; if((findPerk(PerkLib.UnicornBlessing) >= 0 && cor <= 20) || (findPerk(PerkLib.BicornBlessing) >= 0 && cor >= 80)) lust -= 10; @@ -6714,6 +6721,27 @@ use namespace CoC; if (this.findPerk(PerkLib.HistoryReligious) >= 0 || this.findPerk(PerkLib.PastLifeReligious) >= 0) { minLib -= 2; } + if (this.findPerk(PerkLib.PewWarmer) >= 0) { + minLib -= 2; + } + if (this.findPerk(PerkLib.Acolyte) >= 0) { + minLib -= 2; + } + if (this.findPerk(PerkLib.Priest) >= 0) { + minLib -= 2; + } + if (this.findPerk(PerkLib.Pastor) >= 0) { + minLib -= 2; + } + if (this.findPerk(PerkLib.Saint) >= 0) { + minLib -= 2; + } + if (this.findPerk(PerkLib.Cardinal) >= 0) { + minLib -= 2; + } + if (this.findPerk(PerkLib.Pope) >= 0) { + minLib -= 2; + } if (this.findPerk(PerkLib.GargoylePure) >= 0) { minLib = 5; minSen = 5; @@ -6722,21 +6750,20 @@ use namespace CoC; minSen += 15; } //Factory Perks - if(this.hasPerk(PerkLib.DemonicLethicite)) {minCor+=10;minLib+=10;} - if(this.hasPerk(PerkLib.ProductivityDrugs)) {minLib+=this.perkv1(PerkLib.ProductivityDrugs);minCor+=10;} - + if (this.hasPerk(PerkLib.DemonicLethicite)) {minCor+=10;minLib+=10;} + if (this.hasPerk(PerkLib.ProductivityDrugs)) {minLib+=this.perkv1(PerkLib.ProductivityDrugs);minCor+=10;} //Minimum Sensitivity - if(this.manticoreScore() >= 6) minSen += (30 * newGamePlusMod); - if(this.manticoreScore() >= 12) minSen += (15 * newGamePlusMod); - if(this.devilkinScore() >= 7) minSen += (10 * newGamePlusMod); - if(this.devilkinScore() >= 11) minSen += (15 * newGamePlusMod); - if(this.devilkinScore() >= 14) minSen += (30 * newGamePlusMod); - if(this.elfScore() >= 5) minSen += (15 * newGamePlusMod); - if(this.elfScore() >= 11) minSen += (15 * newGamePlusMod); - if(this.raijuScore() >= 5) minSen += (25 * newGamePlusMod); - if(this.raijuScore() >= 10) minSen += (25 * newGamePlusMod); - if(this.hellcatScore() >= 10) minSen += (25 * newGamePlusMod); - + if (this.manticoreScore() >= 6) minSen += (30 * newGamePlusMod); + if (this.manticoreScore() >= 12) minSen += (15 * newGamePlusMod); + if (this.devilkinScore() >= 7) minSen += (10 * newGamePlusMod); + if (this.devilkinScore() >= 11) minSen += (15 * newGamePlusMod); + if (this.devilkinScore() >= 14) minSen += (30 * newGamePlusMod); + if (this.elfScore() >= 5) minSen += (15 * newGamePlusMod); + if (this.elfScore() >= 11) minSen += (15 * newGamePlusMod); + if (this.raijuScore() >= 5) minSen += (25 * newGamePlusMod); + if (this.raijuScore() >= 10) minSen += (25 * newGamePlusMod); + if (this.hellcatScore() >= 10) minSen += (25 * newGamePlusMod); + if (minLib < 1) minLib = 1; return { str:minStr, tou:minTou, diff --git a/classes/classes/PlayerEvents.as b/classes/classes/PlayerEvents.as index 69bddf4525..a3aa9ca992 100644 --- a/classes/classes/PlayerEvents.as +++ b/classes/classes/PlayerEvents.as @@ -1752,7 +1752,7 @@ if (CoC.instance.model.time.hours > 23) { //Once per day flags[kFLAGS.SOUL_SENSE_WORLD_TREE] = 1; EngineCore.doNext(playerMenu); return true; - } + }/* if (player.hasKeyItem("Jade Talisman") >= 0 && flags[kFLAGS.AURORA_LVL] < 1) { outputText("\nYou have weird dream tonight. In that dream you’re back in the Hidden Cave, exploring it room after room, smashing to pieces any of the golems or small bat golems you find and looting the treasures. Then you face the dragon-boy in short, but intensive fight, ending with him running away like coward, while still having enough courage to leave some witty remarks."); outputText("\n\nMaking sure you not overlooked any valuable items you walk slowly toward stairway leading to first floor when... your gaze stops on one of walls in the room with the stairway. Compared to other nearby walls which are all without any damage or otherwise imperfections you spot on this particular wall something. Something like a crack or...keyhole? Intrigued you start to walk toward it..."); @@ -1761,7 +1761,7 @@ if (CoC.instance.model.time.hours > 23) { //Once per day flags[kFLAGS.AURORA_LVL] = 1; EngineCore.doNext(playerMenu); return true; - } + }*/ if (player.lib > 50 || player.lust > 40) { //Randomly generated dreams here if (dreams.dreamSelect()) return true; } diff --git a/classes/classes/PlayerInfo.as b/classes/classes/PlayerInfo.as index 609435fa97..af863dbf2e 100644 --- a/classes/classes/PlayerInfo.as +++ b/classes/classes/PlayerInfo.as @@ -504,7 +504,11 @@ public class PlayerInfo extends BaseContent { if (flags[kFLAGS.CHI_CHI_AFFECTION] > 0) { interpersonStats += "Chi Chi Affection: " + Math.round(flags[kFLAGS.CHI_CHI_AFFECTION]) + "%\n"; - if (flags[kFLAGS.CHI_CHI_FOLLOWER] == 3) { + if (flags[kFLAGS.CHI_CHI_FOLLOWER] == 4) interpersonStats += "Chi Chi status: Wife\n"; + if (flags[kFLAGS.CHI_CHI_FOLLOWER] == 3) interpersonStats += "Chi Chi status: Lover\n"; + if (flags[kFLAGS.CHI_CHI_FOLLOWER] == 2) interpersonStats += "Chi Chi status: Dead\n"; + if (flags[kFLAGS.CHI_CHI_FOLLOWER] < 2) interpersonStats += "Chi Chi status: Apprentice\n"; + if (flags[kFLAGS.CHI_CHI_FOLLOWER] >= 3) { if (flags[kFLAGS.CHI_CHI_LVL_UP] == 8) interpersonStats += "Chi Chi lvl: 76\n"; if (flags[kFLAGS.CHI_CHI_LVL_UP] == 7) interpersonStats += "Chi Chi lvl: 70\n"; if (flags[kFLAGS.CHI_CHI_LVL_UP] == 6) interpersonStats += "Chi Chi lvl: 64\n"; diff --git a/classes/classes/Scenes/Areas/Caves/DisplacerBeastScene.as b/classes/classes/Scenes/Areas/Caves/DisplacerBeastScene.as index 5a8c00cdb8..37dbd8e693 100644 --- a/classes/classes/Scenes/Areas/Caves/DisplacerBeastScene.as +++ b/classes/classes/Scenes/Areas/Caves/DisplacerBeastScene.as @@ -40,7 +40,7 @@ public function displacerBeastMilkfeeding():void { } public function displacerBeastDefeat():void { clearOutput(); - outputText("As you fall defeated by the octopi-cat woman. Her expression change from aggressive to delighted as she strips your gear away. You expect your crotch to get played with but to your surprise, she goes for your [breast] applying her tentacles on them like a pair of suction cups. You gasp in surprise as something not unlike needles somehow enter your nipples doing god knows what inside of your chest which inflate to "); + outputText("As you fall defeated by the octopi-cat woman. Her expression change from aggressive to delighted as she strips your gear away. You expect your crotch to get played with but to your surprise, she goes for your [breasts] applying her tentacles on them like a pair of suction cups. You gasp in surprise as something not unlike needles somehow enter your nipples doing god knows what inside of your chest which inflate to "); if (player.breastRows[0].breastRating < 5) { if (player.breastRows.length == 0) { player.createBreastRow(); @@ -52,7 +52,7 @@ public function displacerBeastDefeat():void { } else player.growTits(2, 1, false, 3); if (player.breastRows[0].lactationMultiplier < 1) player.breastRows[0].lactationMultiplier = 1.25; - outputText("[breastcup] cup! You feel sudden dribbles of milk begin to flow out of your overgrown breasts as the tentacles begin to suckle on them and you moan in surprise at this violation!\n\n"); + outputText(player.breastCup(0) + " cup! You feel sudden dribbles of milk begin to flow out of your overgrown breasts as the tentacles begin to suckle on them and you moan in surprise at this violation!\n\n"); outputText("The four-armed catgirl seems to be enjoying herself, mewling as she forcefully sucks your" + (player.breastRows[0].lactationMultiplier == 1.25 ?" newly flowing":"") + " milk out! The feeling in your chest eventually becomes too much for you and you"); if (player.hasCock()) { if (player.hasVagina()) outputText("r’e cock and pussy leak fluid"); diff --git a/classes/classes/Scenes/Camp.as b/classes/classes/Scenes/Camp.as index 9ea412c273..d607f6c864 100644 --- a/classes/classes/Scenes/Camp.as +++ b/classes/classes/Scenes/Camp.as @@ -1693,11 +1693,12 @@ private function campBuildingSim():void { if (player.hasKeyItem("Carpenter's Toolbox") >= 0) { if (flags[kFLAGS.CAMP_WALL_PROGRESS] < 100 && getCampPopulation() >= 4) addButton(0, "Build Wall", buildCampWallPrompt).hint("Build a wall around your camp to defend from the imps." + (flags[kFLAGS.CAMP_WALL_PROGRESS] >= 10 ? "\n\nProgress: " + (flags[kFLAGS.CAMP_WALL_PROGRESS]/10) + "/10 complete": "") + ""); if (flags[kFLAGS.CAMP_WALL_PROGRESS] >= 100 && flags[kFLAGS.CAMP_WALL_GATE] <= 0) addButton(0, "Build Gate", buildCampGatePrompt).hint("Build a gate to complete your camp defense."); - addButton(3, "Build Cabin(O)", campUpgrades.buildCampMembersCabinsMenu).hint("Work on your camp members cabins."); - addButton(5, "Build Misc", campUpgrades.buildmiscMenu).hint("Build other structures than walls or cabins for your camp."); + //addButton(2, "Build Cabin(O)", campUpgrades.buildCampMembersCabinsMenu).hint("Work on your camp members cabins."); + addButton(5, "Build Misc", campUpgrades.buildmisc1Menu).hint("Build other structures than walls or cabins for your camp."); + //addButton(6, "Build Misc(O)", campUpgrades.).hint("Other structures than walls or cabins for your camp."); } - if (flags[kFLAGS.CAMP_WALL_PROGRESS] >= 10 && player.hasItem(useables.IMPSKLL, 1)) addButton(1, "AddImpSkull", promptHangImpSkull).hint("Add an imp skull to decorate the wall and to serve as deterrent for imps.", "Add Imp Skull"); - if (flags[kFLAGS.CAMP_CABIN_PROGRESS] > 0 && flags[kFLAGS.CAMP_CABIN_PROGRESS] < 10) addButton(2, "Build Cabin", cabinProgress.initiateCabin).hint("Work on your cabin."); //Work on cabin. + if (flags[kFLAGS.CAMP_CABIN_PROGRESS] > 0 && flags[kFLAGS.CAMP_CABIN_PROGRESS] < 10) addButton(1, "Build Cabin", cabinProgress.initiateCabin).hint("Work on your cabin."); //Work on cabin. + if (flags[kFLAGS.CAMP_WALL_PROGRESS] >= 10 && player.hasItem(useables.IMPSKLL, 1)) addButton(10, "AddImpSkull", promptHangImpSkull).hint("Add an imp skull to decorate the wall and to serve as deterrent for imps.", "Add Imp Skull"); addButton(14, "Back", campActions); } @@ -3027,6 +3028,7 @@ private function ascendForReal():void { //Companions performancePoints += companionsCount(); if (flags[kFLAGS.CHI_CHI_FOLLOWER] == 2) performancePoints++; + if (flags[kFLAGS.PATCHOULI_FOLLOWER] == 3) performancePoints++; if (player.hasStatusEffect(StatusEffects.DianaOff)) performancePoints++; if (player.hasStatusEffect(StatusEffects.DivaOff)) performancePoints++; if (player.hasStatusEffect(StatusEffects.ElectraOff)) performancePoints++; @@ -3666,7 +3668,7 @@ private function promptSaveUpdate():void { if (flags[kFLAGS.MOD_SAVE_VERSION] == 22) { flags[kFLAGS.MOD_SAVE_VERSION] = 23; clearOutput(); - outputText("Transcendenting Transcendental Genetic Memory by 50%, Catching Cowardly dragon-boys and refreshing does of Productivity Drugs."); + outputText("Transcendenting Transcendental Genetic Memory by 50%, Catching Cowardly dragon-boys and refreshing dose of Productivity Drugs."); if (player.hasPerk(PerkLib.AscensionTranscendentalGeneticMemoryStage1)) player.addStatusValue(StatusEffects.TranscendentalGeneticMemory, 1, 5); if (player.hasPerk(PerkLib.AscensionTranscendentalGeneticMemoryStage2)) player.addStatusValue(StatusEffects.TranscendentalGeneticMemory, 1, 10); if (player.hasPerk(PerkLib.AscensionTranscendentalGeneticMemoryStage3)) player.addStatusValue(StatusEffects.TranscendentalGeneticMemory, 1, 15); diff --git a/classes/classes/Scenes/Camp/CampUpgrades.as b/classes/classes/Scenes/Camp/CampUpgrades.as index 357792c449..54c3217631 100644 --- a/classes/classes/Scenes/Camp/CampUpgrades.as +++ b/classes/classes/Scenes/Camp/CampUpgrades.as @@ -89,7 +89,7 @@ flagi na przyszłościowe surowce coby nie zapomnieć iż je już wpisałem do k CAMP_CABIN_SAND_RESOURCES CAMP_CABIN_CONCRETE_RESOURCES */ -public function buildmiscMenu():void { +public function buildmisc1Menu():void { menu(); if (flags[kFLAGS.MATERIALS_STORAGE_UPGRADES] == 1 || flags[kFLAGS.MATERIALS_STORAGE_UPGRADES] == 2) addButton(0, "Wood Storage", materialgatheringstorageupgrade).hint("Build up storage to gather more wood at the camp. (Req. 150 fatigue)"); if (flags[kFLAGS.MATERIALS_STORAGE_UPGRADES] == 3) addButton(0, "Stone Storage", materialgatheringstorageupgrade).hint("Build up storage to gather more stones at the camp. (Req. 150 fatigue)"); diff --git a/classes/classes/Scenes/Changelog.as b/classes/classes/Scenes/Changelog.as index 1937d8b6dc..ae7c1a2899 100644 --- a/classes/classes/Scenes/Changelog.as +++ b/classes/classes/Scenes/Changelog.as @@ -19,7 +19,7 @@ package classes.Scenes public function accessChangelogMenu():void { Changelog25(); } - //zrobić do 2019 na świta event z choinką i reniferami i nie odblokowywać go do ok. 20-24 grudnia 2019 xD + //zrobić do 2019 na świeta event z choinką i reniferami i nie odblokowywać go do ok. 20-24 grudnia 2019 xD private function Changelog26():void { clearOutput(); menu(); @@ -38,7 +38,6 @@ package classes.Scenes outputText("-Each year between 21th January and 20th February there will be new holidat period - Lunar New Year that will have some events happening in Mareth during that time.\n"); outputText("-For this year i put in small celebration event in He'Xin'Dao that allow to eat food for free or buy new clothes (they are all the same just with 4 diff colors and for male/female PC's). And what cool that npc's there are matching current new year (well within reason so going to next year or beofre year 2015 will set animal to the one for either year 2015 or year 2019).\n"); outputText("-New clothes: Red/Green/Blue/Purple Lunar new year dress (m)/(f). All of them bought during New Lunar event in He'Xin'Dao for 100 gems. They have 0 armor/mag resistance but grants 5% to dodge and 5% to crit chance for phys and mag attacks.\n"); - //outputText("-New encounter in Glacial Rift: Melkie Huntress.\n"); outputText("-New body part - arms: Pig arms. Req. Cloven Hooves Legs and Pig Tail\n"); outputText("-New body part - arms: Boar arms. Req. Cloven Hooves Legs and Pig Tail\n"); outputText("-Pig/Boar race now have racial bonuses. Half Pig-morph/Pig-morph/Boar-morph that req. 4/8/12 pts in pig score: +30/60/125 to max Str, +60/120/125 to max Tou, -10/15/15 to max Spe, -5/10/10 to max Int, -0/5/0 to max Wis\n"); @@ -53,8 +52,6 @@ package classes.Scenes outputText("-New body part - rear body: Displacer tentacles. Req. Displacer Arms\n"); outputText("-New TF item: Displacer Fruit. Buyable at Dinah shop. Using this item will turn PC into displacer beast. Displacer beast bonuses at 13+ racial score (scalable): +80 to max Str, +100 to max Spe, -25 to max Int, -20 to max Wis, +60 to max Lib\n"); outputText("-New body part - face: Animal fangs. General type of face that is human with exception of having animal-like teeth. Some of races would have in future added this ver of face as option to full animal face or as just a face variant used by that race.\n"); - //outputText("-New TF item: . Gained by bringing Orc Mead to Lumi for enhancing. Using this item will turn PC into high orc. High Orc (scalable): +130 to max Str, +30 to max Tou, +10 to max Spe, -30 to max Int, +25 to max Lib, +20% to max Wrath.\n"); - //outputText("-New TF item: . Gained by bringing Elf Ear to Lumi for enhancing. Using this item will turn PC into high elf. High Elf (scalable): -10 to max Str, -15 to max Tou, +80 to max Spe, +80 to max Int, +60 to max Wis, +30 max/min Sens, +20% to max Mana.\n"); outputText("-Celess is once again accesable. She come back with alternative recruit path for non virgin PC's that involve fight with Nightmare.\n"); outputText("-75 new achievements (26 of them are shadow achiev). Some of them are not yet possible to unlock, so not worry too much, if you can't catch them all.\n"); outputText("-Dam and Fishery structures giving 2x more asc points per build tier. Completed Feral Imp Capture quest is giving 5 asc points.\n"); @@ -84,15 +81,72 @@ package classes.Scenes outputText("-Fixed bugs: missing toogle for lightning and darkness arrows, missing feminity meter on stats page, satyr tf not unlocking relevant metamorph options, cat tf's not unlocking fur option in metamorph, bee wings tf only triggering from no wings or demon wings, demon/devil tf only tf-ing specific type of wings, not working vampire face metamorph option, no menu after defeating "); outputText("phoenix outside the tower when PC lust was above 33, Dominika spell learning error msg, T.Golems 3 and 5 send option error in picking cores, some weapon not counting toward using whirlwind, Cleave special usable before learning it and having no fatigue cost, magical soulskills still scaling of intelligence, Focused Mind improperly affecting min backfire chance, Crinos Shape "); outputText("and Dwarf Rage specials not increasing current HP proportional to max HP, ivory inlaid arquebus not loading ammo at combat start or reloading ammo during combat, Hardcore save slot number not kept during ascension, Deep Cave Pod bad-end suddenylu becoming victory scene, Second Wind not increasing also max Reg % cap for it duration, not adding dmg bonus to arrow/bolt attacks "); - outputText("for using lightning or darkness arrows, eating in HXD restaurant / giving Sidone BJ / giving Konstantine BJ not refilling hunger, chitin gathering not progressing properly\n\n");/*ostatni punkt changelogu + outputText("for using lightning or darkness arrows, eating in HXD restaurant / giving Sidone BJ / giving Konstantine BJ not refilling hunger, chitin gathering not progressing properly\n\n"); outputText("Version 0.8l2:\n\n"); - outputText("-New quest on Adventure Guild: gather green gel. First time completing reward is 1 perk point and all afterward completetions giving 3 spirit stones.\n"); - outputText("-\n"); + outputText("-New armor: Black Kimono. Buyable at Ayane shop magic resistance: 1, 200 gems, decrease spells and soulskills costs by 20%, increase foxfire power by 20%\n"); + outputText("-New option at Lunar Festival at HXD: Gifts. Usable only once (need to ascend to been able pick it up again) and give randomn amount of gems.\n"); + outputText("-New option at Lunar Festival at HXD: Fireworks. Accesable when it's 8 pm or later.\n"); + outputText("-New option at Lunar Festival at HXD: Chi Chi. req. to fight with her once at arena and not causing her death. Accesable when it's 6 pm or later. Also added Chi Chi status on NPC's stats subpage.\n"); + outputText("-Eating food or buying clothes would now progress time a bit.\n"); + outputText("-Killing Patchouli would also give asc point just like bimbofication and making her slave at camp giving. Not like i suggest to be so cruel to him.\n"); + outputText("-Chi Chi, Raiju, Ceani, Patchouli have sprite added to many more scenes.\n"); + outputText("-New tier 1 misc lvl-up perk: Pew Warmer. Req. History: Religious or Past Life: Religious perk. Effect: -2 min libido and +5% to lust resistance.\n"); + outputText("-New tier 4 misc lvl-up perk: Acolyte. Req. Pew Warmer perk. Effect: -2 min libido and +5% to lust resistance.\n"); + outputText("-New tier 7 misc lvl-up perk: Priest. Req. Acolyte perk. Effect: -2 min libido and +5% to lust resistance.\n"); + outputText("-New tier 12 misc lvl-up perk: Pastor. Req. Priest perk. Effect: -2 min libido and +5% to lust resistance.\n"); + /*outputText("-New tier 17 misc lvl-up perk: Saturation. Req. Refinement perk. Effect: number of possible effects of transformatives +1.\n"); + outputText("-New tier 17 misc lvl-up perk: Metamorphable. Req. In Control perk. Effect: +10% max soulforce.\n"); + outputText("-New tier 17 misc lvl-up perk: Mind of Steel. Req. Body of Steel perk. Effect: +10% melee phys dmg.\n"); + outputText("-New tier 17 misc lvl-up perk: Hoarder. Req. Collector perk. Effect: 15% more gems from victories.\n"); + outputText("-New tier 17 misc lvl-up perk: Surgeon's Aide. Req. Paramedic perk. Effect: increases HP gains by 20%.\n"); + outputText("-New tier 17 misc lvl-up perk: Saint. Req. Pastor perk. Effect: -2 min libido and +5% to lust resistance.\n"); + outputText("-New tier 17 misc lvl-up perk: Dean. Req. Principle perk. Effect: +10% max mana.\n"); + outputText("-New tier 17 misc lvl-up perk: Sniper's Friend. Req. Engineer's Friend perk. Effect: +10% range phys dmg.\n"); + outputText("-New tier 17 misc lvl-up perk: Napping. Req. Skipping Work perk. Effect: +20% to fatigue recovery.\n"); + //slut line + outputText("-New tier 17 misc lvl-up perk: Anvil. Req. Hammer perk. Effect: increasing armor proficiency. (+5% phys/mag resistance)\n"); + outputText("-New tier 17 misc lvl-up perk: Pornstar. Req. Brothel Owner perk. Effect: +15% tease dmg.\n"); + outputText("-New tier ?? misc lvl-up perk: Perfection. Req. Saturation perk. Effect: number of possible effects of transformatives +1.\n"); + outputText("-New tier ?? misc lvl-up perk: Soul Powered. Req. Metamorphable perk. Effect: +10% max soulforce.\n"); + outputText("-New tier ?? misc lvl-up perk: Soul of Steel. Req. Mind of Steel perk. Effect: +10% melee phys dmg.\n"); + outputText("-New tier ?? misc lvl-up perk: Blessed by Lady Godiva. Req. Hoarder perk. Effect: 15% more gems from victories.\n"); + outputText("-New tier ?? misc lvl-up perk: Surgeon. Req. Surgeon's Aide perk. Effect: increases HP gains by 20%.\n"); + outputText("-New tier ?? misc lvl-up perk: Cardinal. Req. Saint perk. Effect: -2 min libido and +5% to lust resistance.\n"); + outputText("-New tier ?? misc lvl-up perk: President. Req. Dean perk. Effect: +10% max mana.\n"); + outputText("-New tier ?? misc lvl-up perk: Spy's Enemy. Req. Sniper's Friend perk. Effect: +10% range phys dmg.\n"); + outputText("-New tier ?? misc lvl-up perk: ZZZ. Req. Napping perk. Effect: +20% to fatigue recovery.\n"); + //slut line + outputText("-New tier ?? misc lvl-up perk: Weapon. Req. Anvil perk. Effect: increasing armor proficiency. (+5% phys/mag resistance)\n"); + outputText("-New tier ?? misc lvl-up perk: Sex Champion. Req. Pornstar perk. Effect: +15% tease dmg.\n"); + outputText("-New tier ?? misc lvl-up perk: Creationism. Req. Perfection perk. Effect: number of possible effects of transformatives +1.\n"); + outputText("-New tier ?? misc lvl-up perk: All-Seeing. Req. Soul Powered perk. Effect: +10% max soulforce.\n"); + outputText("-New tier ?? misc lvl-up perk: God of Steel. Req. Soul of Steel perk. Effect: +10% melee phys dmg.\n"); + outputText("-New tier ?? misc lvl-up perk: Lady Godiva's favorite Child. Req. Blessed by Lady Godiva perk. Effect: 15% more gems from victories.\n"); + outputText("-New tier ?? misc lvl-up perk: MEDIC!!!. Req. Surgeon perk. Effect: increases HP gains by 20%.\n"); + outputText("-New tier ?? misc lvl-up perk: Pope. Req. Cardinal perk. Effect: -2 min libido and +5% to lust resistance.\n"); + outputText("-New tier ?? misc lvl-up perk: NERD!!!. Req. President perk. Effect: +10% max mana.\n"); + outputText("-New tier ?? misc lvl-up perk: SHIT YOU TOUCHED SASHA!!! Req. Spy's Enemy perk. Effect: +10% range phys dmg.\n"); + outputText("-New tier ?? misc lvl-up perk: LAZY!!! Req. ZZZ perk. Effect: +20% to fatigue recovery.\n"); + //slut line + outputText("-New tier ?? misc lvl-up perk: Armor. Req. Weapon perk. Effect: increasing armor proficiency. (+5% phys/mag resistance)\n"); + outputText("-New tier ?? misc lvl-up perk: Sex Deity. Req. Sex Champion perk. Effect: +15% tease dmg.\n");*/ + /*outputText("-New tier 1 misc lvl-up perk: . Req. History: Slut or Past Life: Slut perk. Effect: .\n");. + outputText("-New tier 4 misc lvl-up perk: . Req. perk. Effect: .\n"); + outputText("-New tier 7 misc lvl-up perk: . Req. perk. Effect: .\n"); + outputText("-New tier 12 misc lvl-up perk: . Req. perk. Effect: .\n"); + outputText("-New tier 17 misc lvl-up perk: . Req. perk. Effect: .\n"); + outputText("-New tier ?? misc lvl-up perk: . Req. perk. Effect: .\n"); + outputText("-New tier ?? misc lvl-up perk: . Req. perk. Effect: .\n"); outputText("-\n"); outputText("-\n"); outputText("-\n"); outputText("-\n"); - outputText("-Fixed bugs: \n\n\n\n\n\n"); + outputText("-\n");*/ + outputText("-Fixed bugs: Alraune loosing natural armor bonus from been plant race, Displacer beast defeat scene parser errors, Bro Brew giving incorrect cock size, one of new goblins group not fully recognized as group by game, unable to use Pounce/Sky Pounce as displacer beast, Aiko recognizing non-kitsune PC as kitsune\n\n\n\n\n\n");/*ostatni punkt changelogu + //outputText("-New encounter in Glacial Rift: Melkie Huntress.\n"); + //outputText("-New TF item: . Gained by bringing Orc Mead to Lumi for enhancing. Using this item will turn PC into high orc. High Orc (scalable): +130 to max Str, +30 to max Tou, +10 to max Spe, -30 to max Int, +25 to max Lib, +20% to max Wrath.\n"); + //outputText("-New TF item: . Gained by bringing Elf Ear to Lumi for enhancing. Using this item will turn PC into high elf. High Elf (scalable): -10 to max Str, -15 to max Tou, +80 to max Spe, +80 to max Int, +60 to max Wis, +30 max/min Sens, +20% to max Mana.\n"); + //outputText("-New quest on Adventure Guild: gather green gel. First time completing reward is 1 perk point and all afterward completetions giving 3 spirit stones.\n"); //outputText("-New tier 11 strength lvl-up perk: Too Angry to Die. Req. Fuel for the Fire perk. Effect: . (+600 max Wrath)\n"); outputText("\n");cel na 0.8: dodać nekomanta TF outputText("\n");cel na 0.8: dodać kitsune/salamander TF @@ -203,6 +257,9 @@ package classes.Scenes outputText("\n"); outputText("\n"); outputText("\n"); + outputText("\n"); + outputText("\n"); + outputText("\n"); outputText("\n");*/ outputText("\n\n\n"); outputText("Plans for future builds (I know some of them are HUGE ones but without dreams to chase how can one change?):\n"); @@ -301,56 +358,6 @@ package classes.Scenes outputText("-New event perk: Ferocity. Gained by using orc tf when having orc: legs, arms, fangs, eyes; scar shaped tattoes and 11+ in orc score. Effect: PC continue fighting even when HP is below 0. Will loose 1% of max HP each round and would loose fight by HP defeat when negative HP reach 15% of max HP. Doubles wrath generated when below 0 HP. Would be lost if orc score drop below 11 pts. (+2 to orc score)\n"); outputText("-New event perk: Elven Sense. Gained by using elf tf when PC have both elf eyes and ears. Effect: Gain a chance to dodge attacks (+5%) and an increased chance to score critical hits (+5% to both phys and magical crit chance when having 50+ int/wis). Would be lost if PC not have elf eyes and ears. (+1 to elf score)\n"); outputText("-New event perk: Flawless Body. Gained by using elf tf when PC skin change to flawless human skin. Effect: Your elven body with its flawless form and skin is so alluring it reinforces your ability to tease. Would be lost if PC not have elf arms, elf legs and flawless normal (human) skin. (+10 slutty seduction, +1 to elf score)\n"); - /*outputText("-New tier 17 misc lvl-up perk: Saturation. Req. Refinement perk. Effect: number of possible effects of transformatives +1.\n"); - outputText("-New tier 17 misc lvl-up perk: Metamorphable. Req. In Control perk. Effect: +10% max soulforce.\n"); - outputText("-New tier 17 misc lvl-up perk: Mind of Steel. Req. Body of Steel perk. Effect: +10% melee phys dmg.\n"); - outputText("-New tier 17 misc lvl-up perk: Hoarder. Req. Collector perk. Effect: 15% more gems from victories.\n"); - outputText("-New tier 17 misc lvl-up perk: Surgeon's Aide. Req. Paramedic perk. Effect: increases HP gains by 20%.\n"); - - outputText("-New tier 17 misc lvl-up perk: Dean. Req. Principle perk. Effect: +10% max mana.\n"); - - outputText("-New tier 17 misc lvl-up perk: Napping. Req. Skipping Work perk. Effect: +20% to fatigue recovery.\n"); - outputText("-New tier 17 misc lvl-up perk: Anvil. Req. Hammer perk. Effect: increasing armor proficiency. (+5% phys/mag resistance)\n"); - outputText("-New tier 17 misc lvl-up perk: Pornstar. Req. Brothel Owner perk. Effect: +15% tease dmg.\n"); - outputText("-New tier ?? misc lvl-up perk: Perfection. Req. Saturation perk. Effect: number of possible effects of transformatives +1.\n"); - outputText("-New tier ?? misc lvl-up perk: Soul Powered. Req. Metamorphable perk. Effect: +10% max soulforce.\n"); - outputText("-New tier ?? misc lvl-up perk: Soul of Steel. Req. Mind of Steel perk. Effect: +10% melee phys dmg.\n"); - outputText("-New tier ?? misc lvl-up perk: Blessed by Lady Godiva. Req. Hoarder perk. Effect: 15% more gems from victories.\n"); - outputText("-New tier ?? misc lvl-up perk: Surgeon. Req. Surgeon's Aide perk. Effect: increases HP gains by 20%.\n"); - - outputText("-New tier ?? misc lvl-up perk: President. Req. Dean perk. Effect: +10% max mana.\n"); - - outputText("-New tier ?? misc lvl-up perk: ZZZ. Req. Napping perk. Effect: +20% to fatigue recovery.\n"); - outputText("-New tier ?? misc lvl-up perk: Weapon. Req. Anvil perk. Effect: increasing armor proficiency. (+5% phys/mag resistance)\n"); - outputText("-New tier ?? misc lvl-up perk: Sex Champion. Req. Pornstar perk. Effect: +15% tease dmg.\n"); - outputText("-New tier ?? misc lvl-up perk: Creationism. Req. Perfection perk. Effect: number of possible effects of transformatives +1.\n"); - outputText("-New tier ?? misc lvl-up perk: All-Seeing. Req. Soul Powered perk. Effect: +10% max soulforce.\n"); - outputText("-New tier ?? misc lvl-up perk: God of Steel. Req. Soul of Steel perk. Effect: +10% melee phys dmg.\n"); - outputText("-New tier ?? misc lvl-up perk: Lady Godiva's favorite Child. Req. Blessed by Lady Godiva perk. Effect: 15% more gems from victories.\n"); - outputText("-New tier ?? misc lvl-up perk: MEDIC!!!. Req. Surgeon perk. Effect: increases HP gains by 20%.\n"); - - outputText("-New tier ?? misc lvl-up perk: NERD!!!. Req. President perk. Effect: +10% max mana.\n"); - - outputText("-New tier ?? misc lvl-up perk: LAZY!!! Req. ZZZ perk. Effect: +20% to fatigue recovery.\n"); - outputText("-New tier ?? misc lvl-up perk: Armor. Req. Weapon perk. Effect: increasing armor proficiency. (+5% phys/mag resistance)\n"); - outputText("-New tier ?? misc lvl-up perk: Sex Deity. Req. Sex Champion perk. Effect: +15% tease dmg.\n");*/ - /*outputText("-New tier 1 misc lvl-up perk: . Req. History: Religious or Past Life: Religious perk. Effect: .\n"); - outputText("-New tier 4 misc lvl-up perk: . Req. perk. Effect: .\n"); - outputText("-New tier 7 misc lvl-up perk: . Req. perk. Effect: .\n"); - outputText("-New tier 12 misc lvl-up perk: . Req. perk. Effect: .\n"); - outputText("-New tier 17 misc lvl-up perk: . Req. perk. Effect: .\n"); - outputText("-New tier ?? misc lvl-up perk: . Req. perk. Effect: .\n"); - outputText("-New tier ?? misc lvl-up perk: . Req. perk. Effect: .\n"); - outputText("-New tier 17 misc lvl-up perk: Sniper's Friend. Req. Engineer's Friend perk. Effect: +10% range phys dmg.\n"); - outputText("-New tier ?? misc lvl-up perk: Spy's Enemy. Req. Sniper's Friend perk. Effect: +10% range phys dmg.\n"); - outputText("-New tier ?? misc lvl-up perk: SHIT YOU TOUCHED SASHA!!! Req. Spy's Enemy perk. Effect: +10% range phys dmg.\n");*/ - /*outputText("-New tier 1 misc lvl-up perk: . Req. History: Slut or Past Life: Slut perk. Effect: .\n");. - outputText("-New tier 4 misc lvl-up perk: . Req. perk. Effect: .\n"); - outputText("-New tier 7 misc lvl-up perk: . Req. perk. Effect: .\n"); - outputText("-New tier 12 misc lvl-up perk: . Req. perk. Effect: .\n"); - outputText("-New tier 17 misc lvl-up perk: . Req. perk. Effect: .\n"); - outputText("-New tier ?? misc lvl-up perk: . Req. perk. Effect: .\n"); - outputText("-New tier ?? misc lvl-up perk: . Req. perk. Effect: .\n");*/ outputText("-History: Smith and Past Life: Smith have bonus to phys armor bonus and magic resistance bonus lowered from 10% to 5%.\n"); outputText("-History: Scholar and Past Life: Scholar perks effects was changed from -20% of spells mana cost to +10 max mana.\n"); outputText("-History: Fighter and Past Life: Fighter perks now grant additionaly 10% to melee accuracy. Tactician and Great tactician affects crit chance for bow/crossbow/throwing weapon range attacks and specials based on using those weapons.\n"); diff --git a/classes/classes/Scenes/Combat/MagicSpecials.as b/classes/classes/Scenes/Combat/MagicSpecials.as index 1908a89194..69b25e26eb 100644 --- a/classes/classes/Scenes/Combat/MagicSpecials.as +++ b/classes/classes/Scenes/Combat/MagicSpecials.as @@ -2077,7 +2077,7 @@ public class MagicSpecials extends BaseCombatContent { if (player.tailCount == 4) dmg *= 0.6; if (player.tailCount == 5) dmg *= 0.8; if (player.shieldName == "spirit focus") dmg *= 1.2; - if (player.armorName == "white kimono" || player.armorName == "red kimono" || player.armorName == "blue kimono" || player.armorName == "purple kimono") dmg *= 1.2; + if (player.armorName == "white kimono" || player.armorName == "red kimono" || player.armorName == "blue kimono" || player.armorName == "purple kimono" || player.armorName == "black kimono") dmg *= 1.2; if (player.headjewelryName == "fox hairpin") dmg *= 1.2; if (player.hasPerk(PerkLib.StarSphereMastery)) dmg *= (1 + (player.perkv1(PerkLib.StarSphereMastery) * 0.05)); dmg = Math.round(dmg); @@ -2165,7 +2165,7 @@ public class MagicSpecials extends BaseCombatContent { corruptedfoxfiredmgmulti += spellMod() - 1; corruptedfoxfiredmgmulti += soulskillMod() - 1; if (player.shieldName == "spirit focus") corruptedfoxfiredmgmulti += .2; - if (player.armorName == "white kimono" || player.armorName == "red kimono" || player.armorName == "blue kimono" || player.armorName == "purple kimono") corruptedfoxfiredmgmulti += .2; + if (player.armorName == "white kimono" || player.armorName == "red kimono" || player.armorName == "blue kimono" || player.armorName == "purple kimono" || player.armorName == "black kimono") corruptedfoxfiredmgmulti += .2; if (player.headjewelryName == "fox hairpin") corruptedfoxfiredmgmulti += .2; if (player.hasPerk(PerkLib.StarSphereMastery)) corruptedfoxfiredmgmulti += player.perkv1(PerkLib.StarSphereMastery) * 0.05; if (player.hasPerk(PerkLib.NinetailsKitsuneOfBalance)) corruptedfoxfiredmgmulti += .25; @@ -2284,7 +2284,7 @@ public class MagicSpecials extends BaseCombatContent { fusedfoxfiredmgmulti += spellMod() - 1; fusedfoxfiredmgmulti += soulskillMod() - 1; if (player.shieldName == "spirit focus") fusedfoxfiredmgmulti += .2; - if (player.armorName == "white kimono" || player.armorName == "red kimono" || player.armorName == "blue kimono" || player.armorName == "purple kimono") fusedfoxfiredmgmulti += .2; + if (player.armorName == "white kimono" || player.armorName == "red kimono" || player.armorName == "blue kimono" || player.armorName == "purple kimono" || player.armorName == "black kimono") fusedfoxfiredmgmulti += .2; if (player.headjewelryName == "fox hairpin") fusedfoxfiredmgmulti += .2; if (player.hasPerk(PerkLib.StarSphereMastery)) fusedfoxfiredmgmulti += player.perkv1(PerkLib.StarSphereMastery) * 0.05; if (player.hasPerk(PerkLib.NinetailsKitsuneOfBalance)) fusedfoxfiredmgmulti += .5; @@ -2396,7 +2396,7 @@ public class MagicSpecials extends BaseCombatContent { purefoxfiredmgmulti += spellMod() - 1; purefoxfiredmgmulti += soulskillMod() - 1; if (player.shieldName == "spirit focus") purefoxfiredmgmulti += .2; - if (player.armorName == "white kimono" || player.armorName == "red kimono" || player.armorName == "blue kimono" || player.armorName == "purple kimono") purefoxfiredmgmulti += .2; + if (player.armorName == "white kimono" || player.armorName == "red kimono" || player.armorName == "blue kimono" || player.armorName == "purple kimono" || player.armorName == "black kimono") purefoxfiredmgmulti += .2; if (player.headjewelryName == "fox hairpin") purefoxfiredmgmulti += .2; if (player.hasPerk(PerkLib.StarSphereMastery)) purefoxfiredmgmulti += player.perkv1(PerkLib.StarSphereMastery) * 0.05; if (player.hasPerk(PerkLib.NinetailsKitsuneOfBalance)) purefoxfiredmgmulti += .25; diff --git a/classes/classes/Scenes/Dungeons/Factory.as b/classes/classes/Scenes/Dungeons/Factory.as index 39389833be..d0f67b16c2 100644 --- a/classes/classes/Scenes/Dungeons/Factory.as +++ b/classes/classes/Scenes/Dungeons/Factory.as @@ -244,13 +244,14 @@ use namespace CoC; //HERM if(player.vaginas.length > 0 && player.cocks.length > 0) outputText("You feel your " + multiCockDescript() + " getting milked by many wet holes, though you are too busy sucking cocks and moaning in ecstasy to notice who they belong to. "); outputText("The next eight hours are lost to your desires as you cum over and over, feeling mind-shattering pleasure. You recover a while on the floor, soaked with a mixture of milk, cum, and pussy-juice. Getting dressed is a bit troublesome with the recent changes, but you manage to squeeze back into your [armor]. You walk away while still feeling horny, and the moaning of the girls behind you doesn't help. Maybe you could stay for another round..."); + if (!player.hasStatusEffect(StatusEffects.TensionReleased)) player.createStatusEffect(StatusEffects.TensionReleased, 0, 0, 0, 0); if (player.isGargoyle() && player.hasPerk(PerkLib.GargoyleCorrupted)) player.refillGargoyleHunger(30); player.orgasm(); dynStats("int", -player.cor / 10, "lib", 2 * player.cor, "cor", 20); player.slimeFeed(); } //Third time, move on to bad end! - else if (player.perkv2(PerkLib.ProductivityDrugs) == 20) { + else if (player.hasPerk(PerkLib.ProductivityDrugs) && player.hasStatusEffect(StatusEffects.TensionReleased)) { doBadEndTension(); } doNext(roomMainChamber); diff --git a/classes/classes/Scenes/Monsters/GoblinAdventurers.as b/classes/classes/Scenes/Monsters/GoblinAdventurers.as index afeaf87cd4..dc98855336 100644 --- a/classes/classes/Scenes/Monsters/GoblinAdventurers.as +++ b/classes/classes/Scenes/Monsters/GoblinAdventurers.as @@ -135,7 +135,7 @@ import classes.internals.*; this.short = "goblin adventurers"; this.imageName = "goblinassassin"; this.long = "Their appearances are those of a regular goblin, curvy and pale green, perhaps slightly taller than the norm. Their wavy, untamed hair is a deep shade of blue, covering their pierced ears and reaching just above shoulders. Soft curves are accentuated by their choice of wear, a single belt lined with assorted needles strapped across full chest and a pair of fishnet stockings reaching up to thick thighs. They bounces on the spot, preparing to dodge anything you might have in store, though your eyes seem to wander towards their bare slits and jiggling asses. Despite obvious knowledge in combat, they’re a goblins all the same – a hard cock can go a long way."; - // this.plural = false; + this.plural = true; this.createVagina(false, VaginaClass.WETNESS_DROOLING, VaginaClass.LOOSENESS_NORMAL); this.createStatusEffect(StatusEffects.BonusVCapacity, 90, 0, 0, 0); createBreastRow(Appearance.breastCupInverse("E")); diff --git a/classes/classes/Scenes/NPCs/AikoScene.as b/classes/classes/Scenes/NPCs/AikoScene.as index 65ca3a2b5c..e898d2d704 100644 --- a/classes/classes/Scenes/NPCs/AikoScene.as +++ b/classes/classes/Scenes/NPCs/AikoScene.as @@ -83,7 +83,24 @@ public function encounterAiko():void { +"You find yourself at a loss for words, your mouth hanging agape. \n\n" +"Giggling lightly, the fox-eared woman walks up to you, pushing your lower jaw up with her index finger and walking around you, as if sizing you up. “Hmm...It’s been a long time since I’ve seen a newcomer around here,” she said, nodding slowly to herself. “You must be the one that everyone has been talking about.”\n\n" +"Everyone? What is she talking about? Finally, you come to your senses and ask her who she is, and what just happened to the giant. \n\n"); - if (player.kitsuneScore() == 0) { + if (player.kitsuneScore() >= 6 && player.tailType == 13) { + if (player.tailCount == 9) { + outputText("“I am Aiko, guardian of these woo...” she suddenly stops and wides her eyes, noting the swishy wheel of nine tails behind you. Gritting her teeth, she immediately falls on her knees, biting her lower lip much to your confusion. “Please accept my deepest apologies! I... I didn't think you were nine-tails, my "+ player.mf("lord", "lady") +"! I'm so sorry!”\n\n" + +"Confused, you rub your fingers into your [hair], speechless. After some time, your recall Ayane's description of nine-tailed kitsunes, you are supposed to be nobility into the kitsune race, but you give a playful smile and tell her to not worry about that since it's your first meeting, offering her a hand.\n\n" + +"Embarrassed, she lower her ears in shame and accepts your help, moving nervously her seven swishy tails. “I-I just can't resist playing with newcomers, but since you fell into my prank, I thought you were some kind of illusionist with your tails!” Giving a very nervous laugh, she successfully tries to mask her embarrassed blush. “My name is Aiko, the guardian of these woods. My village didn't inform me that a nine-tails was on their way to visit us.. can I ask yours, my "+ player.mf("lord", "lady") +"”\n\n" + +"You calmly give her your name, she's a very interesting fellow, and at least she's not trying to rape you like half of Mareth. You add that you only recently became a nine-tailed kitsune and you are still learning about their culture, telling her she shouldn't be so formal." + +"\n\n“"+ player.mf("Lord", "Lady") +" [name]... no... [name]...It can be a bit sudden.. but can I ask you my ball back, please? You know how important is for us, probably you have one of your own, too.” She seems much more relaxed after you told her to not worry about formalities.\n\n" + +"“Even if I'm strong, I don't know if I can match the power of a High "+ player.mf("Priest", "Priestess") +" of our god... but if I have to, I can get pretty rough... So tell me, [name], do I have to get rough?”"); + } + else { + outputText("“I am Aiko, guardian of these woods. I see that you are one of my kind, but you are not from my village. So, are other clans still unaffected by the corruption?”\n\n" + +"Calmly, you explain that you only recently have become a kitsune via the magic that lurks in Mareth. She gives a playful nod and laughs slightly. “I just can't resist, it was so easy to trick you, you need to improve if you want to be a full-fledged kitsune!” she says with a playful grin, you can't help to be a bit embarrassed for this.\n\n" + +"“Anyhow, what's your name, fellow kitsune? We don't often get visitors since the Demons came.” she asks, folding her arms under her large jiggling breasts.\n\n" + +"You give her your name, somewhat relieved to find another resident of this world that is interested in more than beating you into submission and raping you—at least, so far." + +"\n\n“[name], huh? Well, [name], would it be terribly too much trouble for you to give me back my Ball? You know how important is for us since you're my kind.” You know how important the sphere is for a kitsune, but before you can make the decision, she cuts you off “Of course, I'm not afraid to get rough when I need to. So tell me, [name], do I have to get rough?”"); + } + } + else { outputText("“I am Aiko, guardian of these woods. You’re trespassing in kitsune territory. Didn’t you see the sign?”\n\n" +"You explain to her that you couldn’t read the sign, but even when you tried to leave, you ended up getting turned around again and again.\n\n" +"“Oh. Right…” Aiko says, making a show of trying to look innocent. “What can I say, I just couldn’t resist! Like I said, you’re the first newcomer I’ve seen in quite some time. There’s only so much amusement to be found when your only company is a tree. So then, newcomer, I’ve given you my name, why don’t you tell me yours?”\n\n" @@ -94,20 +111,6 @@ public function encounterAiko():void { +", now understanding that the giant was merely an illusion cast by this girl.\n\n" +"“Of course, I’m not afraid to get rough when I have to. So tell me, [name], do I have to get rough?”"); } - else if (player.tail.type == Tail.FOX && player.tail.count == 9) { - outputText("“I am Aiko, guardian of these woo...” she suddenly stops and wides her eyes, noting the swishy wheel of nine tails behind you. Gritting her teeth, she immediately falls on her knees, biting her lower lip much to your confusion. “Please accept my deepest apologies! I... I didn't think you were nine-tails, my "+ player.mf("lord", "lady") +"! I'm so sorry!”\n\n" - +"Confused, you rub your fingers into your [hair], speechless. After some time, your recall Ayane's description of nine-tailed kitsunes, you are supposed to be nobility into the kitsune race, but you give a playful smile and tell her to not worry about that since it's your first meeting, offering her a hand.\n\n" - +"Embarrassed, she lower her ears in shame and accepts your help, moving nervously her seven swishy tails. “I-I just can't resist playing with newcomers, but since you fell into my prank, I thought you were some kind of illusionist with your tails!” Giving a very nervous laugh, she successfully tries to mask her embarrassed blush. “My name is Aiko, the guardian of these woods. My village didn't inform me that a nine-tails was on their way to visit us.. can I ask yours, my "+ player.mf("lord", "lady") +"”\n\n" - +"You calmly give her your name, she's a very interesting fellow, and at least she's not trying to rape you like half of Mareth. You add that you only recently became a nine-tailed kitsune and you are still learning about their culture, telling her she shouldn't be so formal." - +"\n\n“"+ player.mf("Lord", "Lady") +" [name]... no... [name]...It can be a bit sudden.. but can I ask you my ball back, please? You know how important is for us, probably you have one of your own, too.” She seems much more relaxed after you told her to not worry about formalities.\n\n" - +"“Even if I'm strong, I don't know if I can match the power of a High "+ player.mf("Priest", "Priestess") +" of our god... but if I have to, I can get pretty rough... So tell me, [name], do I have to get rough?”"); - } else { - outputText("“I am Aiko, guardian of these woods. I see that you are one of my kind, but you are not from my village. So, are other clans still unaffected by the corruption?”\n\n" - +"Calmly, you explain that you only recently have become a kitsune via the magic that lurks in Mareth. She gives a playful nod and laughs slightly. “I just can't resist, it was so easy to trick you, you need to improve if you want to be a full-fledged kitsune!” she says with a playful grin, you can't help to be a bit embarrassed for this.\n\n" - +"“Anyhow, what's your name, fellow kitsune? We don't often get visitors since the Demons came.” she asks, folding her arms under her large jiggling breasts.\n\n" - +"You give her your name, somewhat relieved to find another resident of this world that is interested in more than beating you into submission and raping you—at least, so far." - +"\n\n“[name], huh? Well, [name], would it be terribly too much trouble for you to give me back my Ball? You know how important is for us since you're my kind.” You know how important the sphere is for a kitsune, but before you can make the decision, she cuts you off “Of course, I'm not afraid to get rough when I need to. So tell me, [name], do I have to get rough?”"); - } //[Yes][No] menu(); diff --git a/classes/classes/Scenes/NPCs/AriaFollower.as b/classes/classes/Scenes/NPCs/AriaFollower.as index 440d521301..0a61c53af0 100644 --- a/classes/classes/Scenes/NPCs/AriaFollower.as +++ b/classes/classes/Scenes/NPCs/AriaFollower.as @@ -7,6 +7,7 @@ package classes.Scenes.NPCs import classes.*; import classes.GlobalFlags.kFLAGS; import classes.Scenes.NPCs.Aria; +import classes.display.SpriteDb; public class AriaFollower extends NPCAwareContent { @@ -15,6 +16,7 @@ import classes.Scenes.NPCs.Aria; {} public function MelkieEncounter():void { + spriteSelect(SpriteDb.s_aria); clearOutput(); outputText("As you explore the rift you hear the echoes of a singing voice in the distance. Captivated, you head toward the source of the sound and come upon what at first looks like a woman sitting on the icy ground, you can see the sea in the distance. A closer examination reveals that she has long, drooping, spotted ears, a powerful seal like tail where her legs would normally be. "); outputText("The things you mistook for a pair of gloves from a distance are actually her two paws with finned forearms, ending with a set of sharp claws. The girl stops singing and turns over to look at you.\n\n"); @@ -26,11 +28,13 @@ import classes.Scenes.NPCs.Aria; } public function MelkieEncounterLost():void { + spriteSelect(SpriteDb.s_aria); clearOutput(); outputText("You are defeated. Luckily for you, the seal girl seems to have no interest in sex at the moment and decide to knocks you out, leaving you to freeze on the rift’s glacial landscape. When you wake up, you find out she also got away with some of your gems.\n\n"); cleanupAfterCombat(); } public function MelkieEncounterWon():void { + spriteSelect(SpriteDb.s_aria); clearOutput(); outputText("You Won! Congrats but for now only fight itself is tested so nothing to see here yet.\n\n"); cleanupAfterCombat(); diff --git a/classes/classes/Scenes/NPCs/Aurora.as b/classes/classes/Scenes/NPCs/Aurora.as index 854348c866..88f5978fa1 100644 --- a/classes/classes/Scenes/NPCs/Aurora.as +++ b/classes/classes/Scenes/NPCs/Aurora.as @@ -244,7 +244,7 @@ use namespace CoC; this.a = ""; this.short = "Aurora"; this.imageName = "aurora"; - this.long = "Before you stands Aurora at 9 feet tall, and has an overall thicker body than most golems. She has HHH cup breasts. Right above where her cleavage begins, is a black tattoo with the letter A above 3 lines, forming the Roman numeral 3. Her skin is a light turquoise with blue markings all over, and a white belly. Her hair is a navy blue, with green eyes on a bat-like face. Two huge bat wings come from her back, and she has a long tail ending in blue fur. Around her neck is a mane of light blue fur. Two huge bat ears swivel around from the top of her head, detecting all noises in the area."; + this.long = "Before you stands Aurora at 9 feet tall, and has an overall thicker body than most golems. She has HHH cup breasts. Right above where her cleavage begins, is a black tattoo with the letter A above 3 lines, forming the Roman numeral 3. Her skin is a light turquoise with blue markings all over, and a white belly. Her hair is a navy blue, with green eyes on a bat-like face. Two huge bat wings come from her back, and she has a long tail ending in blue fur. Around her neck is a mane of light blue fur. Two huge bat ears swivel around from the top of her head, detecting all noises in the area."; this.plural = false; this.createVagina(false, VaginaClass.WETNESS_SLAVERING, VaginaClass.LOOSENESS_NORMAL); this.createStatusEffect(StatusEffects.BonusVCapacity, 30, 0, 0, 0); diff --git a/classes/classes/Scenes/NPCs/AyaneFollower.as b/classes/classes/Scenes/NPCs/AyaneFollower.as index f5f2dcf83b..0bb1f1e85f 100644 --- a/classes/classes/Scenes/NPCs/AyaneFollower.as +++ b/classes/classes/Scenes/NPCs/AyaneFollower.as @@ -103,10 +103,11 @@ public function ayaneShop():void { addButton(1, armors.RKIMONO.shortName, sellItem, armors.RKIMONO); addButton(2, armors.BKIMONO.shortName, sellItem, armors.BKIMONO); addButton(3, armors.PKIMONO.shortName, sellItem, armors.PKIMONO); - addButton(4, armors.ARCBANG.shortName, sellItem, armors.ARCBANG); - addButton(5, shields.SPI_FOC.shortName, sellItem, shields.SPI_FOC); - addButton(6, headjewelries.FOXHAIR.shortName, sellItem, headjewelries.FOXHAIR); - addButton(7, consumables.FOXJEWL.shortName, sellItem, consumables.FOXJEWL); + addButton(4, armors.BLKIMONO.shortName, sellItem, armors.BLKIMONO); + addButton(5, armors.ARCBANG.shortName, sellItem, armors.ARCBANG); + addButton(7, shields.SPI_FOC.shortName, sellItem, shields.SPI_FOC); + addButton(8, headjewelries.FOXHAIR.shortName, sellItem, headjewelries.FOXHAIR); + addButton(9, consumables.FOXJEWL.shortName, sellItem, consumables.FOXJEWL); addButton(10, consumables.AGILI_E.shortName, sellItem, consumables.AGILI_E, 15); addButton(11, consumables.SMART_T.shortName, sellItem, consumables.SMART_T); addButton(12, consumables.VIXEN_T.shortName, sellItem, consumables.VIXEN_T); @@ -139,6 +140,7 @@ public function ayaneShop():void { switch(item){ case armors.WKIMONO: case armors.RKIMONO: + case armors.BLKIMONO: case armors.BKIMONO: case armors.PKIMONO: outputText("\"To look the part, you will have to dress the part. This magical clothing is made for a kitsune, and to be honest I think " + cost.toString() + " gems is somewhat cheap for an enchanted garment like this.\""); diff --git a/classes/classes/Scenes/NPCs/CeaniScene.as b/classes/classes/Scenes/NPCs/CeaniScene.as index c17b8cd2bd..14e9c08e1a 100644 --- a/classes/classes/Scenes/NPCs/CeaniScene.as +++ b/classes/classes/Scenes/NPCs/CeaniScene.as @@ -113,6 +113,7 @@ public function basicarcherytraining2():void public function beachInteractionsAfterArcheryTraining():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); if (player.statusEffectv1(StatusEffects.Kindra) > 145 && player.weaponRange == weaponsrange.SHUNHAR && flags[kFLAGS.CEANI_ARCHERY_TRAINING] == 4) { outputText("You have gone a long way in learning how to use various ranged weapons. It occurs to you Ceani could learn a thing or two from you, and, as you spot the orca girl lazily resting on the beach you give her a wave.\n\n"); @@ -173,6 +174,7 @@ public function beachInteractionsAfterArcheryTraining():void public function oceanInteractionsAfterArcheryTraining():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("You find move around the ocean when you spot Ceani swimming nearby.\n\n"); outputText("\"Hey it’s you [name] nice to see you. I was wondering how you were. How is your demon hunting going?\"\n\n"); @@ -204,6 +206,7 @@ public function oceanInteractionsAfterArcheryTraining():void } public function ceaniCampMainMenu():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("As you walk over to her Ceani greet with with a bright smile. Her tail swishing once or twice behind her.\n\n"); outputText("\"Good "); @@ -221,6 +224,7 @@ public function ceaniCampMainMenu():void { } public function ceaniAppearance():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("Ceani is a 11 feet tall Orca morph. Her flowing pink hair are tied on the front in two bangles and left flowing on her back with a larger golden bangle to tie them together at the end. Her orange pupils always sparkle with the shine of someone who is almost always ready to laugh and her somewhat flat orca nose and cute toothy mouth only make her face all the more friendly. Her large ears are alert to sound both on land and underwater, likely she also uses them for directions. She is laying on the sand next to you smiling as you look her up. She wears a pink bikini to cover her privates.\n\n"); outputText("Her arms and legs looks about human save for the fins on her forearms not to mention her webbed fingers and toes. Her, still wet, skin is black with a white underside that runs all along her body length up to below her nose. She has a pair of white circles under and above her eyes in an orca pattern. From her well shaped ass surges a powerful tail with a dorsal fin that swishes constantly behind her. It is strong enough to launch her several meter above the water level when she swim.\n\n"); @@ -239,6 +243,7 @@ public function beachInteractionsTalk():void } public function talkHer():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("So is she genuinely from Mareth or does she hail from another world?\n\n"); outputText("\"Actually, yes, I am from Mareth, though this isn’t the same ocean as I used to hunt in. Many of the aquatic species migrated to the lake or to the underground ocean when the demons began to hold the water up. This area however is under a constant spell that cancels their magic, so it rains from time to time albeit with powerful thunderstorms. Many of the species living in these depths are from a different world, including less than friendly creatures "); @@ -252,6 +257,7 @@ public function talkHer():void } public function talkHunger():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("Ok, so how come is she constantly hungry anyway?\n\n"); outputText("\"Well, truth be told, I’m a big eater and my size doesn’t help, so I have to constantly stay on the hunt to maintain my strength. I can spend up to 3 or 4 hours without eating if needs be but the rest of the time I eat every catch I find right away.\"\n\n"); @@ -261,6 +267,7 @@ public function talkHunger():void } public function talkSea():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("Last you heard, Mareth water supply ran low, so how come there is an entire sea here. Ceani simply shrugs in reply.\n\n"); outputText("\"Marae roots doesn’t extend to this place mainly because this sea was not originally here. The cult of the deep one is the reason why there is water here in the first place. When the demons attempted to dry out the world, they hid in underwater caves and sealed them shut to prevent the water from escaping. One of their air breathing acolytes came to this place and started the initial flood that would fill this area, the rest of them came over. "); @@ -276,6 +283,7 @@ public function talkSea():void public function beachInteractionsDate():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("You ask the Orca if she would like to go on a date with you?\n\n"); outputText("\"Sure! but I can’t leave the sea for too long. I prefer to stay close to my food if possible.\"\n\n"); @@ -286,6 +294,7 @@ public function beachInteractionsDate():void public function oceanInteractionsDate():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("You ask the Orca if she would like to go on a date with you?\n\n"); outputText("\"Sure! but I can’t leave the sea for too long. I prefer to stay close to my food if possible.\"\n\n"); @@ -296,6 +305,7 @@ public function oceanInteractionsDate():void public function campInteractionsDateAndFuck():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("Where would you like to hang out with her?\n\n"); menu(); @@ -304,6 +314,7 @@ public function campInteractionsDateAndFuck():void } public function beachInteractionsDateUnderwater3():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("The two of you make the trip back to the ocean. As soon as she is in range Ceani dive in laughing.\n\n"); outputText("\"Oh I had forgot how different from the stream sea salted waters feels like. Come on [name] I wouldn't want you to be left behind especially since I am in a swimming mood.\"\n\n"); @@ -311,6 +322,7 @@ public function beachInteractionsDateUnderwater3():void } public function beachInteractionsDateOnTheBeach3():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("The both of you go take a stroll on the beach discussing your daily activities. There isn’t anyone aside from you two in the area and soon Ceani realise this.\n\n"); beachInteractionsDateOnTheBeach2(); @@ -318,6 +330,7 @@ public function beachInteractionsDateOnTheBeach3():void public function beachInteractionsDateUnderwater0():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("You propose the two of you move underwater and have a trip out at sea.\n\n"); outputText("\"Oh, so you want us to swim together? Sure I was done sunbathing anyway.\"\n\n"); @@ -328,6 +341,7 @@ public function beachInteractionsDateUnderwater0():void public function beachInteractionsDateUnderwater1():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("Why go anywhere else? The water here is pleasant enough and the two of you could go sightseeing.\n\n"); outputText("\"I agree and I think I know just the places too.\"\n\n"); @@ -430,6 +444,7 @@ public function underwaterDateFemaleVer():void public function beachInteractionsDateOnTheBeach0():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("How about a walk? It's not like she spend that much time out of the water anyway. The both of you take a stroll on the beach"); beachInteractionsDateOnTheBeach2(); @@ -437,6 +452,7 @@ public function beachInteractionsDateOnTheBeach0():void public function beachInteractionsDateOnTheBeach1():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("How about a walk? It's not like she spend that much time out of the water anyway.\n\n"); outputText("\"Well I guess you’re right. I spend most of my day underwater. A walk wouldn’t hurt.\"\n\n"); @@ -544,6 +560,7 @@ public function beachDateFemaleVer():void { public function come2campCeani():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("You ask Ceani if she would mind living with you. Her white spots reddens in shyness.\n\n"); outputText("\"I...Sure [name] we could both live together at the sea I would really be happy to share life with you.\"\n\n"); @@ -573,6 +590,7 @@ public function come2campCeani():void public function fishingContestWithCeani():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("You ask Ceani if she would mind for the two of you to have a friendly fishing competition again.\n\n"); outputText("\"Well sure lover, honestly I don’t care whoever win I need exercise and the catches will make for a neat meal. That said I plan to win.\"\n\n"); @@ -591,6 +609,7 @@ public function fishingContestWithCeani():void public function sparringWithCeani():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("You ask the Orca morph if she would mind sparring with you.\n\n"); outputText("\"I don’t want to hurt you and...\"\n\n"); @@ -601,6 +620,7 @@ public function sparringWithCeani():void } public function sparringWithCeaniWon():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("Ceani kneels to the ground to admit defeat.\n\n"); outputText("\"Wow [name] your way stronger then you look! Had I been any less tough or smaller you could have broke some of my bones. I'll have to be more careful next time. Care to help me back to my bedroll? I think I will need a nap...\"\n\n"); @@ -634,6 +654,7 @@ public function sparringWithCeaniWon():void } public function sparringWithCeaniLost():void { + spriteSelect(SpriteDb.s_ceani); clearOutput(); outputText("You put a kneel down in defeat. Wow she's way tougher than she looks.\n\n"); outputText("\"Oh my gosh! Wow, I’m so sorry! Are you hurt [name]! Gah I knew I should have held back!!!\"\n\n"); diff --git a/classes/classes/Scenes/NPCs/ChiChiFollower.as b/classes/classes/Scenes/NPCs/ChiChiFollower.as index 4939b06ccf..067e17b2aa 100644 --- a/classes/classes/Scenes/NPCs/ChiChiFollower.as +++ b/classes/classes/Scenes/NPCs/ChiChiFollower.as @@ -8,7 +8,8 @@ package classes.Scenes.NPCs import classes.GlobalFlags.kFLAGS; import classes.CoC; import classes.Scenes.Places.HeXinDao; -import classes.Scenes.SceneLib; + import classes.Scenes.SceneLib; + import classes.display.SpriteDb; use namespace CoC; @@ -20,6 +21,7 @@ use namespace CoC; {} public function EnterOfTheChiChi():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("You step into the arena once more, but this time your opponent is slightly different. While of small stature like other mice you’ve met in He’Xin’Dao, this mouse morph has pinkish red hair and oriental clothes. She wears a pair of spiked gloves, her fists are clenched slightly at her sides, and she clearly sports a pair of C cup breasts under her clothes. The announcer screams out the participant's names as usual, their enthusiastic introductions is something you’ve grown used to.\n\n"); outputText("\"In the left corner, coming from another world, [name], Champion of Ingnam! And in the right corner, from a land far away to the east, the martial arts master, Chi Chi of the four winds!\"\n\n"); @@ -34,6 +36,7 @@ public function EnterOfTheChiChi():void { } public function WonFirstFight():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("The mouse looks at you in complete disbelief, her shaking voice slowly breaking down as she falls to her knees and coughs blood on the ground.\n\n"); outputText("\"Is this... my blood... it is... beautiful. I never thought I would see the day when I...\"\n\n"); @@ -45,6 +48,7 @@ public function WonFirstFight():void { } public function LostFirstFight():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); if (player.HP < 1) { outputText("\"Is that all you’ve got? How dare you even call yourself a champion? You barely know how to fight! You tried well, albeit, not well enough. If you intend to actually call yourself a warrior, perhaps someday you should seek me out in town, I could teach you... if you have knowledge of the basics that is, I don’t teach my skill to just anyone.\"\n\n"); @@ -61,6 +65,7 @@ public function LostFirstFight():void { } public function WonSecondFight():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("Chi Chi looks at you in disbelief, as your last hit propels her brutally into the arena wall, the sheer power of your strike imprinting the mouse's form in the rock.\n\n"); outputText("Chi Chi falls limp to the ground, barely able to stand as her fire dies out with a puff of smoke. She looks so weak and vulnerable now.\n\n"); @@ -121,6 +126,7 @@ public function WonSecondFightYes():void { } public function LostSecondFight():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("Chi Chi sighs at your defeated form and jumps out of the ring.\n\n"); outputText("\"I have nothing more to teach you, though you did fight with courage and valor, you couldn’t defeat me. From now on, you must continue and learn on your own.\"\n\n"); @@ -131,6 +137,7 @@ public function LostSecondFight():void { } public function WonSparringFight():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("Chi Chi bows down, admitting defeat.\n\n"); outputText("\"Good fight. You aren’t losing your edge, which is good. You will need it to defeat "); @@ -173,6 +180,7 @@ public function WonSparringFight():void { } public function LostSparringFight():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("Chi Chi helps you up as you kneel in defeat.\n\n"); outputText("\"[name] are you ok!? Oh, I knew I shouldn’t have used that move...\"\n\n"); @@ -182,6 +190,7 @@ public function LostSparringFight():void { } public function MeetingChiChiInHeXinDao():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("You spot Chi Chi meditating by the river. There are various scorched wooden dummies next to her and it’s obvious the monk was practicing her techniques. You barely take two steps towards her before the mouse stands up and looks you straight in the eye.\n\n"); if (flags[kFLAGS.CHI_CHI_AFFECTION] > 20) { @@ -207,6 +216,7 @@ public function MeetingChiChiInHeXinDao():void { } public function MeetingChiChiInHeXinDao2():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("Chi Chi cross her arm impatiently.\n\n"); outputText("\"Anything else I can do for you [name]?\"\n\n"); @@ -224,6 +234,7 @@ public function NotReadyForTheTraining():void { } public function TrainingSoulArtsWithChiChi():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); if (flags[kFLAGS.CHI_CHI_DAILY_TRAINING] < 1) { if (flags[kFLAGS.CHI_CHI_SAM_TRAINING] == 2) { @@ -308,6 +319,7 @@ public function VeryReadyForTheFinalTraining():void { } public function SoulskilsManualsShop():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("\"I’m glad you take your training seriously, [name]. There are various scrolls I can teach you"); if (flags[kFLAGS.CHI_CHI_FOLLOWER] < 1) outputText(" but I would need a few spirit stones first"); @@ -323,6 +335,7 @@ public function SoulskilsManualsShop():void { } public function SoulskilsManualsShopIceFist():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("\"This one? Are you sure about that?\"\n\n"); menu(); @@ -345,6 +358,7 @@ public function SoulskilsManualsShopIceFist2():void { } public function SoulskilsManualsShopFirePunch():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("\"This one? Are you sure about that?\"\n\n"); menu(); @@ -367,6 +381,7 @@ public function SoulskilsManualsShopFirePunch2():void { } public function SoulskilsManualsShopHurricaneDance():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("\"This one? Are you sure about that?\"\n\n"); menu(); @@ -389,6 +404,7 @@ public function SoulskilsManualsShopHurricaneDance2():void { } public function SoulskilsManualsShopEarthStance():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("\"This one? Are you sure about that?\"\n\n"); menu(); @@ -411,6 +427,7 @@ public function SoulskilsManualsShopEarthStance2():void { } public function SoulskilsManualsShopPunishingKick():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("\"This one? Are you sure about that?\"\n\n"); menu(); @@ -438,6 +455,7 @@ public function ChiChiCampMainMenu2():void { } public function ChiChiCampMainMenu():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("You go over to Chi Chi who pauses her training to head to you once you are close."); if (flags[kFLAGS.CHI_CHI_FOLLOWER] < 4) outputText("\"Oh how are you doing [name]? I just finished a new set of kicks and punches. Did you want us to train together or did you have something else in mind?\" She’s arm crossed waiting on your reply."); @@ -452,6 +470,7 @@ public function ChiChiCampMainMenu():void { } public function chichiAppearance():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("Chi Chi is an hinezumi, a subspecies of mouse morph with fiery affinities. Hair hair are fiery red, the strands turning pink at the tip the same color as the rest of her fur. Her face is that of a mouse with the characteristic buck teeths and twitching nose and her embery eyes have a serious expression to them which, unlike Jojo" + (flags[kFLAGS.JOJO_BIMBO_STATE] == 3 ? " who is now Joy,":"") + " do warn those she teaches to that she will be merciless."); if (flags[kFLAGS.CHI_CHI_FOLLOWER] >= 4) outputText(" That said Chi Chi tend to soften around you thanks to the feelings you both share. She wears the ruby ring you gave her at all time, symbol and reminder of your love."); @@ -474,6 +493,7 @@ public function chichiAppearance():void { } public function chichiTalksMenu():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("\"What did you want to talk about? I need to keep training to maintain shape.\"\n\n"); menu(); @@ -483,6 +503,7 @@ public function chichiTalksMenu():void { } public function chichiTalksMartialArts():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("Where and how did she learn to fight?\n\n"); outputText("\"Ah, that was a long time ago. I was from the very eastern lands from beyond the mountains. Most of what I learned was from a... old creature I met in a cave, hidden behind a waterfall. He had scales green as emeralds yet a body like that of a snake. His eyes were full of wisdom and wisdom he was willing to share, even to a little girl like me... he told me... he told me that one day perhaps the future of Mareth might depend on my ability to teach what he would impart to me. After ten years under his tutelage I founded my own martial arts school and began teaching promising students what he had imparted on me. You were the first pupil I had in ages...\"\n\n"); @@ -497,6 +518,7 @@ public function chichiTalksMartialArts():void { cheatTime(1/4); } public function chichiTalksFormerStudents():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("She said she had former students before. What happened to them?\n\n"); outputText("Chi Chi hands suddenly tremble and shake... as if she was containing her fury.\n\n"); @@ -525,6 +547,7 @@ public function chichiTalksFormerStudents():void { } public function chichiSparring():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("You ask Chi Chi if she would like a friendly spar"); if (flags[kFLAGS.CHI_CHI_FOLLOWER] < 4) outputText(" now that she has recovered a little"); @@ -535,6 +558,7 @@ public function chichiSparring():void { } public function mishapsLunaChiChi():void { + spriteSelect(SpriteDb.s_chichi); clearOutput(); outputText("As you go to visit Chi Chi you hear her scream. Running over to check whats going on you notice the fire mouse is now a sobbing mess, wet with water. You don’t recall her crying before so this must be serious.\n\n"); outputText("\"Why why? Why would someone put a bucket right above my bedroll now I’m all wet and my fire will take hours to rise again!\"\n\n"); diff --git a/classes/classes/Scenes/NPCs/ElectraFollower.as b/classes/classes/Scenes/NPCs/ElectraFollower.as index ee33c54f5d..f1681d12ef 100644 --- a/classes/classes/Scenes/NPCs/ElectraFollower.as +++ b/classes/classes/Scenes/NPCs/ElectraFollower.as @@ -6,6 +6,7 @@ package classes.Scenes.NPCs { import classes.*; import classes.GlobalFlags.kFLAGS; + import classes.display.SpriteDb; public class ElectraFollower extends NPCAwareContent { @@ -24,6 +25,7 @@ public function electraAffection(changes:Number = 0):Number public function firstEnc():void { + spriteSelect(SpriteDb.s_electra); clearOutput(); outputText("As you wander the mountain you hear the sound of echoing thunder through this time around it clearly didn’t come from the sky. You see multiple imps and even a minotaur run away from the spot where the sound was heard. As you go there to see what’s going on you come upon a single girl with animal morph features. She's panting on the ground a hand under her dress.\n\n"); outputText("\"Ahhhh someone... someone help me get rid of this maddening desire... rape me... fuck me I don’t care how you do it. Gah why are they all fleeing!...come back! Come back so I can get rid of my itches... Come back so we can FUCK!\"\n\n"); @@ -39,18 +41,21 @@ public function firstEnc():void } public function repeatMountainEnc():void { + spriteSelect(SpriteDb.s_electra); clearOutput(); outputText("As you wander the mountain you hear the sound of echoing thunder through this time around it clearly didn’t come from the sky. You see multiple imps and even a minotaur run away from the spot where the sound was heard. "); repeatElectraEnc(); } public function repeatPlainsEnc():void { + spriteSelect(SpriteDb.s_electra); clearOutput(); outputText("As you wander the plains you hear the sound of echoing thunder through this time around it clearly didn’t come from the sky. You see multiple imps and even a satyr run away from the spot where the sound was heard. "); repeatElectraEnc(); } public function repeatDeepwoodsEnc():void { + spriteSelect(SpriteDb.s_electra); clearOutput(); outputText("As you wander the woods you hear the sound of echoing thunder through this time around it clearly didn’t come from the sky. You see multiple imps and even a satyr run away from the spot where the sound was heard. "); repeatElectraEnc(); @@ -73,6 +78,7 @@ public function repeatElectraEnc():void } public function ElectraSexPlayer():void { + spriteSelect(SpriteDb.s_electra); clearOutput(); outputText("You fall to the ground unable to continue fighting. The girl however seems to be really happy about this.\n\n"); outputText("\"FINALLY!!!.. FUCKING FINALLY!!! I found someone to discharge my electricity! I felt I was going to go mad!\"\n\n"); @@ -93,6 +99,7 @@ public function ElectraSexPlayer():void } public function PlayerSexElectra():void { + spriteSelect(SpriteDb.s_electra); clearOutput(); if (flags[kFLAGS.ELECTRA_TALKED_ABOUT_HER] >= 3) { outputText("Electra falls to the ground defeated again.\n\n"); @@ -116,6 +123,7 @@ public function PlayerSexElectra():void } public function ElectraSeXYes():void { + spriteSelect(SpriteDb.s_electra); clearOutput(); if (flags[kFLAGS.ELECTRA_TALKED_ABOUT_HER] >= 3) outputText("Electra"); else outputText("The raiju"); @@ -201,6 +209,7 @@ public function ElectraSeXHeadpat():void } public function ElectraSeXNo():void { + spriteSelect(SpriteDb.s_electra); clearOutput(); outputText("No, you ain't going to give her satisfaction after she tried to rape you. You walk away heading back to your camp barely hearing the echoes of her cries as the crazy girl begs for you to fuck her brains out.\n\n"); electraAffection(2); diff --git a/classes/classes/Scenes/NPCs/LunaFollower.as b/classes/classes/Scenes/NPCs/LunaFollower.as index b599c65c29..61a3852359 100644 --- a/classes/classes/Scenes/NPCs/LunaFollower.as +++ b/classes/classes/Scenes/NPCs/LunaFollower.as @@ -20,6 +20,7 @@ package classes.Scenes.NPCs import classes.GlobalFlags.kFLAGS; import classes.Scenes.SceneLib; import classes.Items.MutationsHelper; + import classes.display.SpriteDb; public class LunaFollower extends NPCAwareContent { @@ -43,6 +44,7 @@ package classes.Scenes.NPCs } public function mainLunaMenu():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("You call out to Luna and the maid comes over as fast as she can.\n\n"); outputText("\"Good "); @@ -72,6 +74,7 @@ package classes.Scenes.NPCs } public function LunaAppearance():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); if (flags[kFLAGS.LUNA_FOLLOWER] < 7) { outputText("Luna is a human maid. She wears the classic maid uniform and bonnet at all times. Her golden eyes always look to you, paying close attention, waiting for any potential orders. That said, her face is not bad to look at and she could pass for cute. Her ashen hair fits her perfectly.\n\n"); @@ -87,6 +90,7 @@ package classes.Scenes.NPCs } public function talkMenuLuna():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("You tell Luna you would like to discuss a few things with her.\n\n"); outputText("\"How may I be of help, " + player.mf("Master","Mistress") + "?\"\n\n"); @@ -101,6 +105,7 @@ package classes.Scenes.NPCs addButton(14, "Back", mainLunaMenu); } public function talkMenuLunaHer():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("How long has she worked as a maid?\n\n"); outputText("\"Um... it’s been a while. I recall entering the service at a very young age and bounced from master to master several times. I don’t think that event at the magic shop counts, however.\"\n\n"); @@ -113,6 +118,7 @@ package classes.Scenes.NPCs doNext(camp.returnToCampUseOneHour); } public function talkMenuLunaWhatCanSheDo():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("Just what can she do for you, exactly? No one in Ingnam was rich enough to employ a maid, and you barely understand what the job exactly entails.\n\n"); outputText("\"Well, I am a maid. I do cleaning, cooking, nursing, and even a few side jobs you don’t want to think about, like washing the dishes and pest control. That said, if you ever need anything from me just ask."); @@ -124,6 +130,7 @@ package classes.Scenes.NPCs doNext(camp.returnToCampUseOneHour); } public function talkMenuLunaHuman():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); if (flags[kFLAGS.LUNA_FOLLOWER] > 6) { outputText("She lied to you when she said she was human. Why?\n\n"); @@ -141,6 +148,7 @@ package classes.Scenes.NPCs doNext(camp.returnToCampUseOneHour); } public function talkMenuLunaCampThoughts():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("What does she think of your camp?\n\n"); if (flags[kFLAGS.CAMP_CABIN_PROGRESS] >= 10) outputText("\"I can’t say your home is as big as the ones I’m used to dwelling in. Perhaps one day the good " + player.mf("master","mistress") + " will consider expanding it?\"\n\n"); @@ -150,6 +158,7 @@ package classes.Scenes.NPCs doNext(camp.returnToCampUseOneHour); } public function talkMenuLunaLycanthropy():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("So what's it exactly like to be a werewolf? Aside from it making you howl at the moon.\n\n"); outputText("\"Well, my hormonal system is totally messed up as the lunar cycle causes me to go into heat.The closer we lycanthropes get to the full moon, the hornier we get, until we all turn into sex crazed beasts willing to go so far as to rape innocent people for a good fuck. That said, sex is not all there is to it. We are all gifted with the ability to change form at will, and I know for a fact that we’re also faster, "); @@ -162,6 +171,7 @@ package classes.Scenes.NPCs doNext(camp.returnToCampUseOneHour); } public function talkMenuBiteMe():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("It occurs to you that you could gain the same kind of powers as Luna if you asked her. That said, is that what you truly want?\n\n"); menu(); @@ -220,6 +230,7 @@ package classes.Scenes.NPCs } public function sparLuna():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("You ask Luna if she wouldn’t mind sparring with you.\n\n"); outputText("\"" + player.mf("Master", "Mistress") + ", we both know it is best not to awaken my instincts during the day. I am a pitiful woman.\"\n\n"); @@ -229,6 +240,7 @@ package classes.Scenes.NPCs startCombat(new Luna()); } public function sparLunaWon():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("Luna sit down like a good well behaved dog to admit defeat.\n\n"); outputText("\"I yield " + player.mf("Master", "Mistress") + ". You win this one. I hope this warm up was worth your time.\"\n\n"); @@ -271,6 +283,7 @@ package classes.Scenes.NPCs doNext(camp.returnToCampUseOneHour); } public function sparLunaLost():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("Luna pounces on you with a hungry growl. Guess you had it coming when you asked her to spar you.\n\n"); outputText("\"You lost " + player.mf("Master", "Mistress") + ", therefore I’m entitled to do whatever I want with you. Well I don’t care what it is as long as we do it now.\"\n\n"); @@ -280,6 +293,7 @@ package classes.Scenes.NPCs } public function mealLuna():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("You ask Luna if today's meal is ready.\n\n"); if (flags[kFLAGS.LUNA_MEAL] == 1) { @@ -303,6 +317,7 @@ package classes.Scenes.NPCs } public function nurseLuna():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("You ask the maid if she could heal you.\n\n"); outputText("\"I will tend to your wounds at once.\"\n\n"); @@ -325,6 +340,7 @@ package classes.Scenes.NPCs } private function lunaSleepToggle():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); if(flags[kFLAGS.SLEEP_WITH] != "Luna") { outputText("You ask Luna if she would mind sleeping with you.\n\n"); @@ -343,6 +359,7 @@ package classes.Scenes.NPCs flags[kFLAGS.SLEEP_WITH] = arg; } private function lunaChainToggle():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); if (flags[kFLAGS.LUNA_FOLLOWER] == 9 || flags[kFLAGS.LUNA_FOLLOWER] == 10) { outputText("Luna is currently free to roam at night.\n\n"); @@ -366,6 +383,7 @@ package classes.Scenes.NPCs } public function warrningAboutJelously():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); if (flags[kFLAGS.LUNA_FOLLOWER] == 5) flags[kFLAGS.LUNA_FOLLOWER] = 6; else if (flags[kFLAGS.LUNA_FOLLOWER] == 7) flags[kFLAGS.LUNA_FOLLOWER] = 8; @@ -380,6 +398,7 @@ package classes.Scenes.NPCs } public function fullMoonEvent():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); if (flags[kFLAGS.LUNA_FOLLOWER] == 7 || flags[kFLAGS.LUNA_FOLLOWER] == 8) { outputText("Luna is smirking, a green glint in her eyes.\n\n"); @@ -402,6 +421,7 @@ package classes.Scenes.NPCs else addButton(1, "Resist", fullMoonEventResist); } public function fullMoonEventAccept():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("You declare that you won’t fight her.\n\n"); outputText("\"Wait, what? You.. you're just going to give in? Like this?\"\n\n"); @@ -414,6 +434,7 @@ package classes.Scenes.NPCs doNext(sexMenuVaginal); } public function fullMoonEventResist():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("You shove her with all your strength and get ready for a fight.\n\n"); outputText("\"I knew you would need some convincing but it's all right, [name], I’m more than glad to help you with that.\"\n\n"); @@ -423,6 +444,7 @@ package classes.Scenes.NPCs doNext(playerMenu); } public function fullMoonEventResistWin():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("Luna falls to the ground in defeat. You swiftly proceed to tie her up so she does not cause further mayhem.\n\n"); outputText("\"" + player.mf("Master","Mistress") + "... I am so sorry...on these nights I have no control over myself. Please do not fire me.\"\n\n"); @@ -436,6 +458,7 @@ package classes.Scenes.NPCs addButton(2, "Chain Her", fullMoonEventResistWinChainHer); } public function fullMoonEventResistWinFireHer():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("Luna looks at you as if her world is breaking apart.\n\n"); outputText("\"[name], y..you’re firing me?\"\n\n"); @@ -448,12 +471,14 @@ package classes.Scenes.NPCs doNext(camp.sleepWrapper); } public function fullMoonEventResistWinFireHerForest():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("As you explore the forest you come upon a gruesome sight. You thought Luna would've made it back to Tel’Adre but it seems that she didn’t. She’s right there in front of you… hanging from a rope tied to a tree. That she'd fall into such despair didn’t occur to you when you kicked her out of your camp. You leave the gruesome scene, still shaken by her lifeless expression. You can’t help but think deep down, that this was all your fault.\n\n"); flags[kFLAGS.LUNA_FOLLOWER] = 3; doNext(camp.returnToCampUseOneHour); } public function fullMoonEventResistWinChainHer():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("You resolve to chain her to a tree every full moon from now on, though you suspect it'll be hard on her.\n\n"); flags[kFLAGS.LUNA_FOLLOWER] = 9; @@ -464,6 +489,7 @@ package classes.Scenes.NPCs doNext(camp.sleepWrapper); } public function fullMoonEventResistDefeat():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("You are too weak to keep fighting and Luna senses it. Before you can react she pounces on you. You’re back to the position you were in earlier and this time you are in no way capable of putting up a fight.\n\n"); outputText("\"It's ok, [name], the pain will only last for a few seconds and then...\"\n\n"); @@ -512,6 +538,7 @@ package classes.Scenes.NPCs } public function sexMenuMain():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("You feel really hot right now and mention it to Luna, who blushes.\n\n"); outputText("\"I...It would be my pride to attend to your needs... Any needs you may have, " + player.mf("Master","Mistress") + ". What would you wish of me?\"\n\n"); @@ -532,6 +559,7 @@ package classes.Scenes.NPCs addButton(14, "Back", mainLunaMenu); } public function sexMenuHeadpat():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("Luna is so cute, you can’t help yourself from patting her head! At first she's surprised but, soon after, she closes her eyes in delight as her ears take on their wolfish appearance. Her tail pops out and wags from side to side as she sighs in happiness. She realises only a few second later that she’s transforming and swiftly puts an end to it, masking her animalistic features.\n\n"); outputText("\"Uhhhh, sorry, " + player.mf("master","mistress") + ". I don’t know what took hold of me.\"\n\n"); @@ -539,6 +567,7 @@ package classes.Scenes.NPCs doNext(camp.returnToCampUseOneHour); } public function sexMenuVaginalIntro():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("Your body aches from your time out adventuring. It seems your constant expeditions have taken a toll on you, unable to even bring yourself to a full smile in the presence of your devoted maid and instead settle for a small one. Your body language worries Luna and she rushes to your side, placing a hand on your chest and looking deeply into your eyes.\n\n"); outputText("\"" + player.mf("Master","Mistress") + ", are you well? Have you been injured while on your journeys?\"\n\n"); @@ -589,6 +618,7 @@ package classes.Scenes.NPCs else doNext(camp.returnToCampUseOneHour); } public function sexMenuSpearPolishing():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); var x:int = player.cockThatFits(36, "length"); outputText("You request Luna to pleasure you with her mouth.\n\n"); @@ -618,6 +648,7 @@ package classes.Scenes.NPCs doNext(camp.returnToCampUseOneHour); } public function sexMenuBoobjob():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("Your eyes can’t help but rove over Luna’s form, focusing on those modest C cups she sports. Lost in your lustful thoughts, you imagine many different ways you could pleasure yourself with teets such as hers, your cock" + (player.cocks.length == 1 ? "" : "s") + " aching in need as a result.\n\n"); outputText("Luna searches your face for a moment, before nodding knowingly. \"Master, would you like to relieve yourself using my body?\" You compliment her for her intuition, you’d indeed enjoy relieving yourself with her lovely body. A single nod with a knowing smile is her response. She moves to undress you, removing your [armor] " + (player.weaponName == "fists" ? "" : "and [weapon] ") + "laying them down beside you before removing her own clothing. "); @@ -633,6 +664,7 @@ package classes.Scenes.NPCs doNext(camp.returnToCampUseOneHour); } public function sexMenuDoggyTreats():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("You wouldn't mind her giving in to her less human instincts while the two of you have sex, so long as she keeps it under control. Heck, right now, you would really like to check out that cute butt of hers.\n\n"); outputText("Your reply has an immediate effect on Luna and she licks her lips with a seductive stare, slowly taking off her clothes. It does not take long before she is entirely naked and you see the telltale signs of her body shapeshifting. Her eyes begin to take on a glowing green hue and fur begins to grow out of her limbs.\n\n"); @@ -649,6 +681,7 @@ package classes.Scenes.NPCs doNext(camp.returnToCampUseOneHour); } public function sexMenuSandwichWithAyane():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("As you mull over your options. Ayane comes over to do her report and stare at you both with wide eyes.\n\n"); outputText("\"No way! You’re going to reward the mutt over your devoted priestess? I will have none of that! Luna, I challenge you to a duel to see who makes [name] cum first!\"\n\n"); @@ -674,12 +707,14 @@ package classes.Scenes.NPCs } public function sexMenuDominateHerIntro():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("You ask the maid how she feels about giving in to her beastly desire. The green glimmer in her eyes is all you need to see how much she desires it before she begins to shapeshift into her beast form.\n\n"); flags[kFLAGS.LUNA_MOONING] = 1; doNext(sexMenuDominateHer); } public function sexMenuDominateHer():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("You grab at the werewolf girl’s exposed chest and begin tugging, making her moan in delight at your forceful attention.\n\n"); outputText("\"Ooooh " + player.mf("Master","Mistress") + ", I knew you loved me! Please make me your bitch for the night!\"\n\n"); @@ -744,6 +779,7 @@ package classes.Scenes.NPCs } /* public function sexMenuSpearPolishing():void { + spriteSelect(SpriteDb.s_luna_maid); clearOutput(); outputText("WIP\n\n"); outputText("\"WIP\"\n\n"); diff --git a/classes/classes/Scenes/NPCs/PatchouliScene.as b/classes/classes/Scenes/NPCs/PatchouliScene.as index 1013c50d11..d7a6f43166 100644 --- a/classes/classes/Scenes/NPCs/PatchouliScene.as +++ b/classes/classes/Scenes/NPCs/PatchouliScene.as @@ -14,6 +14,7 @@ import classes.Scenes.Areas.HighMountains.Phoenix; import classes.Scenes.Areas.Mountain.Minotaur; import classes.Scenes.Areas.Swamp.CorruptedDrider; import classes.Scenes.Camp.Jabberwocky; +import classes.display.SpriteDb; import coc.view.ButtonDataList; @@ -58,6 +59,7 @@ public class PatchouliScene extends NPCAwareContent { } public function meetThePatchouli():void { + spriteSelect(SpriteDb.s_patchouli_male); clearOutput(); var follower:* = flags[kFLAGS.PATCHOULI_FOLLOWER]; if (follower < 1) { @@ -97,6 +99,7 @@ public class PatchouliScene extends NPCAwareContent { } function patchouliForgiveHim():void { + spriteSelect(SpriteDb.s_patchouli_male); clearOutput(); outputText("You sigh and decide to forgive the cat for what he has done.\n\n"); outputText("\"Thank you! Thank you! Don’t worry, I will never trick anyone again!\"\n\n"); @@ -106,6 +109,7 @@ public class PatchouliScene extends NPCAwareContent { } function patchouliRapeHim():void { + spriteSelect(SpriteDb.s_patchouli_male); clearOutput(); outputText("You got plans for this insolent cat. Let’s see how long he smiles once you're violating that "); if (player.hasVagina()) { @@ -147,6 +151,7 @@ public class PatchouliScene extends NPCAwareContent { } function patchouliKillHim(silly:Boolean = false):void { + spriteSelect(SpriteDb.s_patchouli_male); clearOutput(); if (silly) { outputText("You toss the cat into the air and start by punching its chest to increase his altitude, then kick his balls. You chain this with a hundred kicks, tossing him even higher into the air as you charge an energy ball and fire it at the feline. As the cat is disintegrated, a disembodied voice growls out “FATALITY!” in the background. You strike a vicious pose… And are immediately mortified of whatever came over to you.\n\n"); @@ -307,6 +312,7 @@ public class PatchouliScene extends NPCAwareContent { public function patchouleMainCampMenu():void { clearOutput(); if (flags[kFLAGS.PATCHOULI_FOLLOWER] == TIEDINCAMP) { + spriteSelect(SpriteDb.s_patchouli_male); outputText("You approach the tied up cat wary of possible hidden tricks.\n\n"); outputText("\"Hello again... felt like visiting your prisoner for a chat? You know I could do soooo many things If I was not tied up to the tree.\"\n\n"); menu(); @@ -319,6 +325,7 @@ public class PatchouliScene extends NPCAwareContent { } addButton(14, "Back", camp.campSlavesMenu); } else { + spriteSelect(SpriteDb.s_patchouli_bimbo); outputText("You check on Patchoulie. The bimbo catgirl is lazily resting on a tree branch, smiling unsettlingly as you approach her.\n\n"); outputText("\"Felt like havin fun, [name]? Else I can get us to " + (visitedAllAreas()? "my place anytime" : "a new place") + ".\"\n\n"); menu(); @@ -332,6 +339,7 @@ public class PatchouliScene extends NPCAwareContent { } private function patchouleBimbofication():void { + spriteSelect(SpriteDb.s_patchouli_male); clearOutput(); player.destroyItems(consumables.BIMBOLQ, 1); outputText("You tell your prisoner he will soon be free to go so long as he drinks the weird bottle you are holding.\n\n"); @@ -362,12 +370,14 @@ public class PatchouliScene extends NPCAwareContent { private function patchouleAppearance():void { clearOutput(); if (flags[kFLAGS.PATCHOULI_FOLLOWER] == TIEDINCAMP) { + spriteSelect(SpriteDb.s_patchouli_male); outputText("Patchouli looks like your typical cat morph. However, the color of his fur is clearly unnatural. Striped black on a background of purple, Patchouli’s fur clearly does not belong on any normal cat. His fur is hardly the only thing ‘unnatural’ about him, as he almost smiles constantly, not just once in awhile, with the most unsettling grin he can muster. You would believe him to be up to some crazy mischief "); outputText("if somehow tying him up to a tree did not hold him from teleporting away. Go figure, why doesn’t he? It's likely some fucked up rule of his world. His green cat eyes have been observing you the whole time with interest, his tail twitching every now and then with the infinite patience of someone up to no good.\n\n"); outputText("\"Nya, having a good view [name]? Feel free to admire me all you like I love being looked at.\"\n\n"); outputText("You move your gaze away before it gets any more awkward than it already is.\n\n"); } else { + spriteSelect(SpriteDb.s_patchouli_bimbo); outputText("Patchoulie "); if (flags[kFLAGS.PATCHOULI_GIRL_OR_MORPH] == 1) { outputText("used to look like the typical cat morph but uses of transformatives allowed you to alter her into the perfect figure of a cat girl, with a human face and only a partially covered body. Regardless of her demi human look, Patchoulie’s tongue, eyes and abnormally long canine clearly still belong on a cat. The transformatives so far sparred her paws, ears and tail, not that you would ever get rid of them anyway"); @@ -387,6 +397,8 @@ public class PatchouliScene extends NPCAwareContent { } private function patchouleTalkMenu():void { + if (flags[kFLAGS.PATCHOULI_FOLLOWER] == TIEDINCAMP) spriteSelect(SpriteDb.s_patchouli_male); + else spriteSelect(SpriteDb.s_patchouli_bimbo); clearOutput(); outputText("You tell Patchouli you have a few questions "+(tiedUp?"he":"she")); var tiedUp:Boolean = flags[kFLAGS.PATCHOULI_FOLLOWER] == TIEDINCAMP; @@ -401,6 +413,8 @@ public class PatchouliScene extends NPCAwareContent { } private function patchouleTalkMenuTrickPeople():void { + if (flags[kFLAGS.PATCHOULI_FOLLOWER] == TIEDINCAMP) spriteSelect(SpriteDb.s_patchouli_male); + else spriteSelect(SpriteDb.s_patchouli_bimbo); var tiedUp:Boolean = flags[kFLAGS.PATCHOULI_FOLLOWER] == TIEDINCAMP; clearOutput(); outputText("Seriously, what is with "+(tiedUp?"him":"her")); @@ -416,6 +430,8 @@ public class PatchouliScene extends NPCAwareContent { } private function patchouleTalkMenuWhoIsSHe():void { + if (flags[kFLAGS.PATCHOULI_FOLLOWER] == TIEDINCAMP) spriteSelect(SpriteDb.s_patchouli_male); + else spriteSelect(SpriteDb.s_patchouli_bimbo); var tiedUp:Boolean = flags[kFLAGS.PATCHOULI_FOLLOWER] == TIEDINCAMP; clearOutput(); outputText("Just what is " + (tiedUp ? "he" : "she") + " really? You don’t know of cat morph with teleportation ability.\n\n"); diff --git a/classes/classes/Scenes/Places/HeXinDao.as b/classes/classes/Scenes/Places/HeXinDao.as index 7b81d4a457..fc17760af6 100644 --- a/classes/classes/Scenes/Places/HeXinDao.as +++ b/classes/classes/Scenes/Places/HeXinDao.as @@ -66,20 +66,31 @@ public class HeXinDao extends BaseContent else if (flags[kFLAGS.LUNAR_NEW_YEAR] >= 2019) flags[kFLAGS.LUNAR_NEW_YEAR_ANIMAL] = "pig";; outputText("You go deeper in town and discover the whole place is indeed covered in red. The big question now is what should you check upon first?"); menu(); - //addButton(0, "", riverislandVillageStuffLunarGifts); + if (!player.hasStatusEffect(StatusEffects.CanGetLunarGift)) addButton(0, "Gifts", riverislandVillageStuffLunarGifts); addButton(1, "Food", riverislandVillageStuffLunarFood); addButton(2, "Clothing", riverislandVillageStuffLunarClothing); - //addButton(3, "Fireworks", riverislandVillageStuffLunarFireworks); - //addButton(4, "Chi Chi", riverislandVillageStuffLunarChiChi); + if (model.time.hours > 19) addButton(3, "Fireworks", riverislandVillageStuffLunarFireworks); + else addButtonDisabled(3, "Fireworks", "You need to wait till 8 PM for that."); + if (flags[kFLAGS.CHI_CHI_AFFECTION] >= 20 && flags[kFLAGS.CHI_CHI_FOLLOWER] != 2 && model.time.hours > 17) addButton(4, "Chi Chi", riverislandVillageStuffLunarChiChi); + else addButtonDisabled(4, "Chi Chi", "You need to wait until it's 6 PM or later for that."); addButton(14, "Back", riverislandVillageStuff1).hint("Leave festival part of He'Xin'Dao."); } public function riverislandVillageStuffLunarGifts():void { - + clearOutput(); + outputText("There seems to be a gift exchange going about. Some people are handing over red envelopes, something about luck for the coming year. You get hold of one and open it hoping for great luck. You open the envelope and... "); + var Gems:Number = 501; + Gems += rand(1000); + outputText("Wow! You were lucky! There was " + Gems + " gems inside! This sure is good fortune for the coming year."); + player.createStatusEffect(StatusEffects.CanGetLunarGift,0,0,0,0); + player.gems += Gems; + statScreenRefresh(); + doNext(riverislandVillageStuffLunar); } public function riverislandVillageStuffLunarFood():void { clearOutput(); outputText("The local restaurant seems to be offering some speciality food and the best of it all; is it's free! Some " + flags[kFLAGS.LUNAR_NEW_YEAR_ANIMAL] + "-morphs are handling it all over for extra thematics. You proceed to grab a plate of these strange ravioli the people calls jiǎozi taking this rice dessert they call niángāo right after. The meal is comforting and you would believe everything in mareth was going fine right now if not for the reddish stormy sky in the far distance which contrast with these festivities."); player.refillHunger(50); + cheatTime2(30); doNext(riverislandVillageStuffLunar); } public function riverislandVillageStuffLunarClothing():void { @@ -113,23 +124,39 @@ public class HeXinDao extends BaseContent outputText("\n\nYou put the dress in your bag for now. Now to put it on."); outputText("\n\nYou got a Lunar new year dress.\n\n"); player.gems -= 100; - statScreenRefresh(); + cheatTime(1/3); inventory.takeItem(itype, riverislandVillageStuffLunar); } public function riverislandVillageStuffLunarFireworks():void { - + clearOutput(); + outputText("There are some extravagantly beautiful fireworks exploding in the sky above town. Red rockets are regularly shot up there exploding in bright flashes. You chuckle inside pondering what would happen if some harpy accidentally was to use this aerial space at the time… would it become roasted chicken? Speaking of chickens while you were thinking about harpies a few imps indeed drop dead from the sky, guess some demons indeed got a little too close to the explosion and got caught in the blast."); + doNext(camp.returnToCampUseFourHours); } public function riverislandVillageStuffLunarChiChi():void { clearOutput(); outputText("You are surprised to spot Chi Chi in the crowd wearing a traditional kimono. The hinezumi notice you right away and invite you to join her."); - if (flags[kFLAGS.CHI_CHI_FOLLOWER] < 4) { - outputText("\n\n\"Oh it's you? Did you came to train? I’m sorry, but today I’m on a break. It's the Lunar festival and this event only happens once a year. How about we share a cup of sake and watch the fireworks? You could use a break too, ya know?\""); - outputText("\n\nYou both share sake and food and jokes all night while watching the fireworks. It's only when it gets very late that you bid her farewell and head back to camp."); - doNext(riverislandVillageStuff); + if (flags[kFLAGS.CHI_CHI_FOLLOWER] > 3) { + outputText("\n\n\"Come over people! Look the part! Buy a dress for the festivities only for 50 gems! C'mon and buy while there's some left!\""); + outputText("\n\nYou put the dress in your bag for now. Now to put it on."); + } + else if (flags[kFLAGS.CHI_CHI_FOLLOWER] == 3) { + outputText("\n\n\"Hey, Baka! I thought you'd never join in. You know I waited for you here all day? Sit right next to me and hold my hand. I want the folks out there to know we're together.\""); + outputText("\n\nTogether as in a couple? Is she opening up or something? Your comment makes her light red cheeks even redder."); + outputText("\n\n\"N..no! Nothing of the sort! It's not like I care if all the other girls look at you right now! I’m just preventing you from flirting with half of the town's feminine cast!\""); + outputText("\n\nYou spend several hours watching the fireworks. Eventually Chi Chi asks you something."); + outputText("\n\n\"Say [name] if.. if the both of us were hypothetically truly a couple... would you kiss me right now?\""); + outputText("\n\nYou sure would, why?"); + outputText("\n\n\"Well w..would you please kiss me, then? It's not what you think it's only she to...\""); + outputText("\n\nYou proceed to shut up her silly explanation by taking hold of her mouth and pulling her in for a deep kiss her eyes opening wide in surprise before she gives herself up to you fully her arms hugging you."); + outputText("\n\nYou both break the kiss a few seconds later Chi Chi redder than a canine pepper."); + outputText("\n\n\"T..That was nice. Don’t you go around in camp telling everyone we did that though.\""); + outputText("\n\nYeah sure whatever she say. You spend a little more time with her before returning to camp."); } else { - outputText("\n\n\"Come over people! Look the part! Buy a dress for the festivities only for 50 gems! C'mon and buy while there's some left!\""); + outputText("\n\n\"Oh it's you? Did you came to train? I’m sorry, but today I’m on a break. It's the Lunar festival and this event only happens once a year. How about we share a cup of sake and watch the fireworks? You could use a break too, ya know?\""); + outputText("\n\nYou both share sake and food and jokes all night while watching the fireworks. It's only when it gets very late that you bid her farewell and head back to camp."); } + doNext(camp.returnToCampUseSixHours); } public function riverislandVillageStuff():void { diff --git a/classes/classes/StatusEffects.as b/classes/classes/StatusEffects.as index dfe71d5552..5dbee91fe1 100644 --- a/classes/classes/StatusEffects.as +++ b/classes/classes/StatusEffects.as @@ -40,6 +40,7 @@ import classes.StatusEffects.VampireThirstEffect; public static const BuiltMilker:StatusEffectType = mk("BUILT: Milker"); public static const BurpChanged:StatusEffectType = mk("Burp Changed"); public static const ButtStretched:StatusEffectType = mk("ButtStretched"); + public static const CanGetLunarGift:StatusEffectType = mk("Can Get Lunar Gift"); public static const CanMeetNightmare:StatusEffectType = mk("Can Meet Nightmare"); public static const CampAnemoneTrigger:StatusEffectType = mk("Camp Anemone Trigger"); public static const CampMarble:StatusEffectType = mk("Camp Marble"); diff --git a/classes/classes/display/SpriteDb.as b/classes/classes/display/SpriteDb.as index 834adbbb4b..259e638758 100644 --- a/classes/classes/display/SpriteDb.as +++ b/classes/classes/display/SpriteDb.as @@ -48,6 +48,8 @@ public class SpriteDb { public static function get s_anemone(): Class { return is8bit ? s_anemone_8bit : s_anemone_16bit; } + [Embed(source="../../../res/sprites/aria.png")] + public static var s_aria:Class; [Embed(source="../../../res/sprites8bit/assmole-old.png")] public static var s_assmole_8bit:Class; public static function get s_assmole(): Class { @@ -102,6 +104,8 @@ public class SpriteDb { public static function get s_chameleon(): Class { return is8bit ? null : s_chameleon_16bit; } + [Embed(source="../../../res/sprites/chichi.png")] + public static var s_chichi:Class; [Embed(source="../../../res/sprites/chickenHarpy.png")] public static var s_chickenHarpy_16bit:Class; public static function get s_chickenHarpy(): Class { @@ -154,6 +158,8 @@ public class SpriteDb { public static function get s_dickworms(): Class { return is8bit ? s_dickworms_8bit : s_dickworms_16bit; } + [Embed(source="../../../res/sprites/diva.png")] + public static var s_diva:Class; [Embed(source="../../../res/sprites/drider.png")] public static var s_drider_16bit:Class; [Embed(source="../../../res/sprites8bit/drider-old.png")] @@ -175,6 +181,8 @@ public class SpriteDb { public static function get s_edryn(): Class { return is8bit ? s_edryn_8bit : s_edryn_16bit; } + [Embed(source="../../../res/sprites/electra1.png")] + public static var s_electra:Class; [Embed(source="../../../res/sprites/etna.png")] public static var s_etna:Class; [Embed(source="../../../res/sprites/exgartuan.png")] @@ -426,6 +434,8 @@ public class SpriteDb { public static function get s_lottie(): Class { return is8bit ? s_lottie_8bit : s_lottie_16bit; } + [Embed(source="../../../res/sprites/luna-maid.png")] + public static var s_luna_maid:Class; [Embed(source="../../../res/sprites/lumi.png")] public static var s_lumi_16bit:Class; [Embed(source="../../../res/sprites8bit/lumi-old.png")] @@ -536,6 +546,10 @@ public class SpriteDb { public static function get s_oswald(): Class { return is8bit ? s_oswald_8bit : s_oswald_16bit; } + [Embed(source="../../../res/sprites/patts1.png")] + public static var s_patchouli_male:Class; + [Embed(source="../../../res/sprites/bimbo-cat.png")] + public static var s_patchouli_bimbo:Class; [Embed(source="../../../res/sprites/poisontail.png")] public static var s_poisontail_16bit:Class; [Embed(source="../../../res/sprites8bit/roxanne-old.png")] diff --git a/res/sprites/aria.png b/res/sprites/aria.png new file mode 100644 index 0000000000000000000000000000000000000000..6c4adb0987c333ce881a45af30959a973b4507cf GIT binary patch literal 2033 zcmVmSg?tP5U99pEU}o37(*6}KQznC=92x<@MAL= z=hTQBO-=0+O;!1nek0r0=R%YLyGFz-Ff&wJ1E(|t|~o(<>u8O)Ad zi3@mH0<;-AXft#X%Q~BJ0Q8)Y!IF>=1e`fk$4BGKSR%xvh|46d1nfIjk28nr_;6If zf;nEFgxVbg0ds113yyBe($HFngLMm1=Y~j=nOTOYqI0+;SoCT z&F$|I68MB5fT#cfT0Z+cq#u>4`+x(0xh6YaY1@q>=1mkhA>oL56JBZCjkzX!+{z%N zJ|I*Q0N~|!y8r;=V_rI@Gt>yi$Q+Rh5`zF%1#0Ra0MK?0m$%*W_4;E|;Iob3vyHfX z;9sEaT(FfSJ_JlW^m36DeiiTuQv%_rU{^y5 zo@ENx`oX?l4EFU3Izw@boX~p#B`Ppm9lXg{gx`Kx2LSMnv@LFb^;xiNEcU7G&(oBI zUw`>F<|;^*yD;(4%V{%o^auR>{WrKb`vg61H>bu6GB?`r3bX z{)$ULP2JOAGaoD@=5$?+{xgD*R)MygPQ@xn5!Lh^X4#`9ARhN;p8&USsl?7b`(d^^ z_=F%pbxe9t;9vGAc>ghA+z&h<6~L-MvHXd-O?nnV-X8G1$e4fJeY6@a&5aa1AtLS` zAQd$mY`h#9?xWQLQzF!PJ8f6d`0b&)1vman^a%LDr{`M`El!&s@+K7`7F$I{d4!*3kR*-#@u_&|; zVf;XBf(cs!Z8x1<@6#L*@T)Zz0eJFMsAG1oY?HK936P~QZhb&$em<{sKhWLN5HQAq zZ*^&~1D?ffv#WqaHwXa3o_>0a^v-Ze1%v{;yQd-O5A3sUS8aepu68aO+v13Lz>uq* zD_%K{;+5mFa|$eLaA)v=kBEhWKOE zU}Mzk(f|NV#v(!XhduqsHI&5H1l2wdAU|HC*TU%CKV2U6{*!whx zdH?`a*z=H;xmqwcH7ScKf-RRX&V235(84?b;CWK2K z{Jnvg4Ap%=FcOFv2I~u!GD`x!zw<&s#?4j-pJOT~;E-b~$M|q31x?P$bwWu{hb$(V=Bk!$PEm++Bvh;!RH!E1lbmYB}ev}Mz4jftco6OWmUAX zQmuecNl*h`EP3JwY?h^>sJt2)y_OyUz}bB%@~v<%5=a?nCoih{?4t5&K{nZQxr}S{ zS_)XO!gOB>@Cc%U7kjBP~6hf`2qN5kOGH z9*9V(fmMMT9}s7q1xzw72EV!3fX&4QJe&9BVfOLk*gX?uNeI^)2&mDK8^|@32$sR| z;Z9lb0MKyq6dF#RT6`YSeu9%T?q7FTLxByNYVB_s)9Otw16+ia`@suO1-G9ypQNK P00000NkvXXu0mjfpN6Pf literal 0 HcmV?d00001 diff --git a/res/sprites/bimbo-cat.png b/res/sprites/bimbo-cat.png new file mode 100644 index 0000000000000000000000000000000000000000..7df502699d3b4d694939051bdf0c9f117f5c4648 GIT binary patch literal 3840 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 literal 0 HcmV?d00001