From b6a75a897f21b59e3cfd2b340978e4fdaa2571c5 Mon Sep 17 00:00:00 2001 From: ezsh <43062025+ezsh@users.noreply.github.com> Date: Sat, 15 Sep 2018 00:05:45 +0200 Subject: [PATCH] Add futa stat and activating item The "Futa" stat blocks penis, bust, and balls shrinking if their stats are lower or equal to the futa stat. Also, if the balls stat percent is lower than the futa one, balls do not produce hormonal shift. If, however, the futa stat is higher than the penis or bust stat, it results in willpower drain down to 15 --- src/000-SCRIPT_OBJ/Helpers.js | 27 ++++++++++ src/000-SCRIPT_OBJ/Player.js | 16 +++++- .../CLOTHES/uncatagorized_clothes.js | 10 ++++ .../EFFECTS/effects_body_natural.js | 50 ++++++++++++------- src/001-SCRIPT_DATA/EFFECTS/effects_unique.js | 12 ++++- src/001-SCRIPT_DATA/GameData.js | 19 +++++++ src/103-ABAMOND/TreasureRoom.twee | 11 +++- src/200-WIDGETS/printPlayerDescription.twee | 2 + 8 files changed, 126 insertions(+), 21 deletions(-) diff --git a/src/000-SCRIPT_OBJ/Helpers.js b/src/000-SCRIPT_OBJ/Helpers.js index 4db7b09..bb7eb08 100644 --- a/src/000-SCRIPT_OBJ/Helpers.js +++ b/src/000-SCRIPT_OBJ/Helpers.js @@ -921,6 +921,33 @@ App.PR = new function() { return this.TokenizeRating(Player, "BODY", "Penis", this.GetRating("Penis", pPercent)); }; + /** + * Print how does the futa state matches current body state + * @param {App.Entity.Player} Player + * @returns {string} + */ + this.pFutaStatus = function (Player) { + const pFuta = Player.GetStatPercent("STAT", "Futa"); + const hormones = Player.GetStat("STAT", "Hormones"); + if ((hormones > 100)) { + const pPenis = Player.GetStatPercent("BODY", "Penis"); + const dp = pFuta - pPenis; + if (dp > 90) return "You crave for a bigger penis." + if (dp > 60) return "You feel an urge to grow a bigger penis." + if (dp > 30) return "You are pretty sure a bigger penis would be a good thing to get." + if (dp > 5) return "You feel your penis could be a bit bigger." + return "You consider your penis size to be about right for you." + } else if (hormones) { + const pBust = Player.GetStatPercent("BODY", "Bust"); + const db = pFuta - pBust; + if (db > 90) return "You crave for bigger tits." + if (db > 60) return "You feel an urge to grow your boobs." + if (db > 30) return "You are pretty sure bigger tits would be a good thing to get." + if (db > 5) return "You feel your bust could be a bit bigger." + return "You consider your bust size to be about right for you." + } + } + /** * Prints out a description of the Player's height statistic. * @param {App.Entity.Player} Player diff --git a/src/000-SCRIPT_OBJ/Player.js b/src/000-SCRIPT_OBJ/Player.js index 0daf55d..dfcba57 100644 --- a/src/000-SCRIPT_OBJ/Player.js +++ b/src/000-SCRIPT_OBJ/Player.js @@ -55,7 +55,8 @@ App.Entity.PlayerState = function (){ "Fitness": 0, "Toxicity": 0, "Hormones": 0, - "Energy": 0 + "Energy": 0, + "Futa": 0 }; this.CoreStatsXP = { @@ -67,7 +68,8 @@ App.Entity.PlayerState = function (){ "Fitness": 0, "Toxicity": 0, "Hormones": 0, - "Energy": 0 + "Energy": 0, + "Futa": 0, }; this.BodyStats = { @@ -2309,6 +2311,16 @@ App.Entity.Player = /** @class Player @type {Player} */ class Player { return this.Inventory.EquippedReelItems(); } + /** + * @returns {boolean} + */ + IsFuta() { + if (this._state.CoreStats["Futa"] > 0) { + return true; + } + return false; + } + // endregion /** diff --git a/src/001-SCRIPT_DATA/CLOTHES/uncatagorized_clothes.js b/src/001-SCRIPT_DATA/CLOTHES/uncatagorized_clothes.js index a072a33..203c020 100644 --- a/src/001-SCRIPT_DATA/CLOTHES/uncatagorized_clothes.js +++ b/src/001-SCRIPT_DATA/CLOTHES/uncatagorized_clothes.js @@ -37,6 +37,16 @@ App.Data.Clothes["choker"] = { "WearEffect": [ "FEMININE_CLOTHING" ] }; +App.Data.Clothes["ancient metal collar"] = { + "Name": "ancient metal collar", + "ShortDesc": "an ancient metal collar", + "LongDesc": "An ancient collar made of metal inlaid with a few big gems of various colours.", + "Slot": "Neck", "Restrict": ["Neck"], "Color": "silver", + "Style": "LEGENDARY", "Type" : "ACCESSORY", + "WearEffect": [ "FUTA_COLLAR" ], + "InMarket" : false +}; + // NIPPLES SLOT // BRA SLOT diff --git a/src/001-SCRIPT_DATA/EFFECTS/effects_body_natural.js b/src/001-SCRIPT_DATA/EFFECTS/effects_body_natural.js index 3970199..4778f26 100644 --- a/src/001-SCRIPT_DATA/EFFECTS/effects_body_natural.js +++ b/src/001-SCRIPT_DATA/EFFECTS/effects_body_natural.js @@ -5,7 +5,7 @@ App.Data.EffectLib.NATURAL_HEALING = { "FUN" : /** @param {App.Entity.Player} p @param {App.Items.Consumable} o*/ - function(o, p) { + function(o, p) { var Health = 5 + Math.ceil(p.GetStat('STAT', 'Energy') * 2) + Math.ceil(p.GetStat('STAT', 'Fitness') / 10); // 5 + 0-20 + 0-10 var Energy = Math.floor( (p.GetStat('STAT', 'Nutrition')/25) + (p.GetStat('STAT', 'Fitness')/25)); // 1 - 8 @@ -20,19 +20,19 @@ App.Data.EffectLib.NATURAL_HEALING = { }; // Resting healing. -App.Data.EffectLib.NATURAL_RESTING = +App.Data.EffectLib.NATURAL_RESTING = { "FUN" : /** @param {App.Entity.Player} p @param {App.Items.Consumable} o*/ - function(o, p) { + function(o, p) { var Heal = Math.max(1, Math.min(Math.ceil( (p.GetStat('STAT', 'Nutrition')/20) + (p.GetStat('STAT', 'Fitness')/20)), 10)); // 1 - 10 var mod = 1 - Math.max(0, Math.min(p.GetStat('STAT', 'Toxicity')/150, 1.0)); // 0 - 1 p.AdjustStat('Health', Math.ceil(Heal * mod)); p.AdjustStat('Energy', 1); p.AdjustStat('Toxicity', -5); }, - "VALUE" : 0, - "KNOWLEDGE" : [ "Healing+" ] + "VALUE" : 0, + "KNOWLEDGE" : [ "Healing+" ] } App.Data.EffectLib.NATURAL_QUEST_HOOKS = { "FUN" : /** @param {App.Entity.Player} p */ @@ -56,7 +56,7 @@ App.Data.EffectLib.NATURAL_NUTRITION = { p.AdjustBodyXP("Waist", nutritionXP - 150); // Get Fatter!? setup.Notifications.AddMessage("STATUS_CHANGE", p.Day+1, "@@color:yellow;You feel as if you ate too much yesterday.@@"); } - + var nutrition = p.GetStat("STAT", "Nutrition"); // Going hungry, lose some belly fat. if (nutrition <= 40) { @@ -84,18 +84,18 @@ App.Data.EffectLib.NATURAL_DETOXIFICATION = { App.Data.EffectLib.NATURAL_TOXIC_DAMAGE = { "FUN" : /** @param {App.Entity.Player} p @param {App.Items.Consumable} o*/ - function(o, p) { + function(o, p) { var Tox = p.GetStat('STAT', 'Toxicity'); var dmg = Tox <= 100 ? 0 : Math.ceil(10 * (Tox/300)); if (dmg > 0) { p.AdjustStat('Health', (dmg * -1.0)); - setup.Notifications.AddMessage("STATUS_CHANGE", p.Day+1, "@@color:red;⇓You feel slightly sick@@... your current " + + setup.Notifications.AddMessage("STATUS_CHANGE", p.Day+1, "@@color:red;⇓You feel slightly sick@@... your current " + App.PR.ColorizeString(p.GetStatPercent("STAT", "Toxicity"), "Toxicity") + " is probably to blame."); } }, - "VALUE" : 0, + "VALUE" : 0, "KNOWLEDGE" : [ "Poisoned+" ] }; @@ -108,6 +108,10 @@ App.Data.EffectLib.NATURAL_HORMONE_SHIFT = { //Adjust physical characteristics based on hormone balance. Only shift body if there is XP related to the hormone //shift stored in the player object. var HormoneShift = 0; + // The "Futa" stat blocks penis, bust, and balls shrinking if their stats are lower or equal to the futa stat. + // Also, if the balls stat percent is lower than the futa one, balls do not produce hormonal shift. + // If, however, the futa stat is higher than the penis or bust stat, it results in willpower drain down to 15 + const FutaPercent = p.GetStatPercent("STAT", "Futa"); if ((p.GetStat("STAT", "Hormones") > 100) && p.GetStatXP("STAT", "Hormones") > 0 ) { HormoneShift = ( p.GetStat("STAT", "Hormones") - 100 ); @@ -116,23 +120,35 @@ App.Data.EffectLib.NATURAL_HORMONE_SHIFT = { p.AdjustBodyXP("Lips", HormoneShift , 40); p.AdjustBodyXP("Ass", HormoneShift , 10); p.AdjustBodyXP("Hips", HormoneShift , 10); - p.AdjustBodyXP("Penis", (HormoneShift * -1.0) , 1); - p.AdjustBodyXP("Balls", (HormoneShift * -1.0) , 0); + const PenisPercent = p.GetStatPercent("BODY", "Penis"); + if (PenisPercent > FutaPercent) { + p.AdjustBodyXP("Penis", (HormoneShift * -1.0) , 1); + } else if (FutaPercent > PenisPercent) { + p.AdjustStatXP("WillPower", FutaPercent - PenisPercent, 15); + } + if (p.GetStatPercent("BODY", "Balls") > FutaPercent) { + p.AdjustBodyXP("Balls", (HormoneShift * -1.0) , 0); + } } else if (p.GetStat("STAT", "Hormones") < 100 && p.GetStatXP("STAT", "Hormones") < 0 ) { - HormoneShift = ( 100 - p.GetStat("STAT", "Hormones")); + HormoneShift = (100 - p.GetStat("STAT", "Hormones")); + const BustPercent = p.GetStatPercent("BODY", "Bust"); p.AdjustBodyXP("Face", (HormoneShift * -1.0), p.GetStartStat("BODY", "Face")); - p.AdjustBodyXP("Bust", (HormoneShift * -1.0), p.GetStartStat("BODY", "Bust")); + if (BustPercent > FutaPercent) { + p.AdjustBodyXP("Bust", (HormoneShift * -1.0), p.GetStartStat("BODY", "Bust")); + } else if (FutaPercent > BustPercent) { + p.AdjustStatXP("WillPower", FutaPercent - BustPercent, 15); + } p.AdjustBodyXP("Lips", (HormoneShift * -1.0), p.GetStartStat("BODY", "Lips")); p.AdjustBodyXP("Ass", (HormoneShift * -1.0), p.GetStartStat("BODY", "Ass")); p.AdjustBodyXP("Hips", (HormoneShift * -1.0), p.GetStartStat("BODY", "Hips")); p.AdjustBodyXP("Penis", HormoneShift, p.GetStartStat("BODY", "Penis")); p.AdjustBodyXP("Balls", HormoneShift, p.GetStartStat("BODY", "Balls")); } - // Decrease the players hormone XP relative to the size of their balls. - var hormoneXP = Math.ceil(20 * ( p.GetStat('BODY', 'Balls')/100)) * -1.0 - p.AdjustStatXP('Hormones', hormoneXP); - } + if (p.GetStatPercent("BODY", "Balls") > FutaPercent) { + p.AdjustStatXP("Hormones", ((p.GetStat("BODY", "Balls") / 5) * -1.0)); // Bigger balls add more male hormones. + } + } }; /** FITNESS */ diff --git a/src/001-SCRIPT_DATA/EFFECTS/effects_unique.js b/src/001-SCRIPT_DATA/EFFECTS/effects_unique.js index b451373..84d6cd5 100644 --- a/src/001-SCRIPT_DATA/EFFECTS/effects_unique.js +++ b/src/001-SCRIPT_DATA/EFFECTS/effects_unique.js @@ -272,4 +272,14 @@ App.Data.EffectLib["BROW_THINNER"] = { }, "VALUE" : 250, "KNOWLEDGE" : [ "Eyebrows Thinner++", ] -}; \ No newline at end of file +}; + +App.Data.EffectLib["FUTA_COLLAR"] = { + "FUN" : /** @param {App.Entity.Player} p + @param {App.Items.Consumable} o*/ + function(o,p) { + p.AdjustStatXP('Futa', 50); + }, + "VALUE" : 50, + "KNOWLEDGE" : [ "Futanari Identity+" ] +}; diff --git a/src/001-SCRIPT_DATA/GameData.js b/src/001-SCRIPT_DATA/GameData.js index c6027de..4cd618d 100644 --- a/src/001-SCRIPT_DATA/GameData.js +++ b/src/001-SCRIPT_DATA/GameData.js @@ -787,6 +787,25 @@ App.Data.Lists = { 200 : { "COST" : 190, "STEP" : 1, "ADJECTIVE" : "ladylike" , "COLOR" : 16} } }, + "Futa": { "MIN" : 0, "MAX" : 100, "START" : 0, + "LEVELING" : { + 5 : { "COST" : 100, "STEP" : 1, "ADJECTIVE" : "shy" , "COLOR" : 1}, + 10 : { "COST" : 100, "STEP" : 1, "ADJECTIVE" : "timid" , "COLOR" : 2}, + 15 : { "COST" : 125, "STEP" : 1, "ADJECTIVE" : "timid" , "COLOR" : 3}, + 20 : { "COST" : 125, "STEP" : 1, "ADJECTIVE" : "diffident" , "COLOR" : 4}, + 30 : { "COST" : 200, "STEP" : 1, "ADJECTIVE" : "diffident" , "COLOR" : 5}, + 32 : { "COST" : 225, "STEP" : 1, "ADJECTIVE" : "open" , "COLOR" : 6}, + 38 : { "COST" : 250, "STEP" : 1, "ADJECTIVE" : "open" , "COLOR" : 7}, + 46 : { "COST" : 300, "STEP" : 1, "ADJECTIVE" : "outright" , "COLOR" : 8}, + 54 : { "COST" : 350, "STEP" : 1, "ADJECTIVE" : "outright" , "COLOR" : 9}, + 62 : { "COST" : 400, "STEP" : 1, "ADJECTIVE" : "daring" , "COLOR" : 10}, + 71 : { "COST" : 450, "STEP" : 1, "ADJECTIVE" : "daring" , "COLOR" : 12}, + 80 : { "COST" : 500, "STEP" : 1, "ADJECTIVE" : "daring" , "COLOR" : 13}, + 89 : { "COST" : 550, "STEP" : 1, "ADJECTIVE" : "perfect" , "COLOR" : 15}, + 98 : { "COST" : 600, "STEP" : 1, "ADJECTIVE" : "perfect" , "COLOR" : 16}, + 100 : { "COST" : 1500, "STEP" : 1, "ADJECTIVE" : "perfect" , "COLOR" : 16} + } + }, "Energy": { "MIN" : 0, "MAX" : 10, "START" : 3, "LEVELING" : { "NONE" : { "COST" : 0, "STEP" : 0 } diff --git a/src/103-ABAMOND/TreasureRoom.twee b/src/103-ABAMOND/TreasureRoom.twee index fc1025e..aa8a67e 100644 --- a/src/103-ABAMOND/TreasureRoom.twee +++ b/src/103-ABAMOND/TreasureRoom.twee @@ -3,4 +3,13 @@ After a long and arduous trek you've finally made your way into the deepest and Towards the back of the room you see a small opening. Upon inspecting it, it appears to be a secret tunnel leading back to the surface. -@@color:lime;Travel@@: [[Into the Jungle|Jungle]] \ No newline at end of file +<>\ +<>\ +<> +In one of the corners you notice remains of a human skeleton. Upon a closer look you notice something shining near it. Trying to take that thing out you discover that it was bound around the neck of the human, whose dead remains seem to be lying in this chamber for hundreds of years. Fortunately, it is not hard to pull it out through already rotten bones. Slightly cleaning the object you recognize a neck collar, made of a heavy, shining metal, and decorated with a few big gems. You decide to take the collar with you. + +<>\ +<> +<> + +@@color:lime;Travel@@: [[Into the Jungle|Jungle]] diff --git a/src/200-WIDGETS/printPlayerDescription.twee b/src/200-WIDGETS/printPlayerDescription.twee index ae95851..701a1d0 100644 --- a/src/200-WIDGETS/printPlayerDescription.twee +++ b/src/200-WIDGETS/printPlayerDescription.twee @@ -11,6 +11,7 @@ You have a <> <> <> and \ <>. You have <> and \ <> between your legs. +<><><> You consider your natural beauty to be <>. The fetish appeal of your body is <>.\ @@ -23,6 +24,7 @@ You have a <> <> <> and \ <>. You have <> and \ <> between your legs. +<><><> You consider your natural beauty to be <>. The fetish appeal of your body is <>.\