LoafyLemon
8aba361ea9
* Partially sunset `game` var store and move relevant special variables inside `states` store. * Replace `game.daytime` -> `states.env.daytime`
459 lines
14 KiB
Plaintext
459 lines
14 KiB
Plaintext
# base potions:
|
|
# Polyjuice potion (Luna, Cat, Lamia)
|
|
# Expanding Elixir (Breast, Ass)
|
|
# Moreish mead (cum)
|
|
# Transparent tincture (Transparency potion)
|
|
# Coloring concoction (hair colors)
|
|
|
|
# Cum addiction = Moreish mead? + wormwood + your cum
|
|
# Ass expansion = Expanding Elixir + knotgrass
|
|
# Breast expansion = Expanding Elixir + Root of aconite
|
|
# Cat potion = Polyjuice + Cat hair
|
|
# Luna potion = Polyjuice + Luna's hair
|
|
# Lamia potion = Polyjuice + Basilisk scale
|
|
# Transparency potion = Transparent tincture + Niffler's fancy
|
|
|
|
# Cum addiction: wormwood+your cum (jerk off into it)
|
|
# Ass expansion: knotgrass
|
|
# Breast expansion: Root of aconite
|
|
# Luna potion: Luna's hair
|
|
# Transparency potion: Niffler's fancy
|
|
# Lamia potion: Basilisk scale
|
|
|
|
|
|
# wormwood = forbidden forest
|
|
# knotgrass = ?
|
|
# root_of_aconite =?
|
|
# cat_hair
|
|
# luna_hair = brush from room?
|
|
# basilisk_scale = ?
|
|
|
|
|
|
# all the metadata for the objects is stored statically any information
|
|
# that needs to be persistent is stored in a separate known dict value
|
|
default potion_lib = PotionCollection(
|
|
lib = [
|
|
PotionIngredient(
|
|
id = "ing_wormwood",
|
|
name = "Wormwood",
|
|
effect = "",
|
|
description = "Wormwood is sometimes found in the forbidden forest.",
|
|
picture = ""
|
|
),
|
|
PotionIngredient(
|
|
id = "ing_knotgrass",
|
|
name = "Knotgrass",
|
|
effect = "",
|
|
description = "You can sometimes find Knotgrass by the forbidden forest.",
|
|
picture = ""
|
|
),
|
|
PotionIngredient(
|
|
id = "ing_aconite_root",
|
|
name = "Root of Aconite",
|
|
effect = "",
|
|
description = "Root of Aconite can be found down by the lake.",
|
|
picture = ""
|
|
),
|
|
PotionIngredient(
|
|
id = "ing_niffler_fancy",
|
|
name = "Niffler's fancy",
|
|
effect = "",
|
|
description = "*Hmm*... I think I heard that it's found by the lake.",
|
|
picture = ""
|
|
),
|
|
PotionIngredient(
|
|
id = "ing_luna_hair",
|
|
name = "Luna's Hair",
|
|
effect = "",
|
|
description = "The hair of Luna Lovegood.",
|
|
picture = ""
|
|
),
|
|
PotionIngredient(
|
|
id = "ing_cat_hair",
|
|
name = "Cat Hair",
|
|
effect = "",
|
|
description = "The hair of a common cat.",
|
|
picture = ""
|
|
),
|
|
PotionIngredient(
|
|
id = "ing_basilisk_scale",
|
|
name = "Basilisk Scale",
|
|
effect = "",
|
|
description = "The scale of what appears to be a large snake.",
|
|
picture = ""
|
|
),
|
|
Potion(
|
|
id = "p_transparent_tincture",
|
|
cost = 20,
|
|
whoring_rec = 3,
|
|
name = "Transparent Tincture",
|
|
effect = "",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_polyjuice_potion",
|
|
cost = 40,
|
|
whoring_rec = 5,
|
|
name = "Polyjuice Potion",
|
|
effect = "",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_expanding_elixir",
|
|
cost = 30,
|
|
whoring_rec = 8,
|
|
name = "Expanding Elixir",
|
|
effect = "",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_imperius_potion",
|
|
cost = 45,
|
|
whoring_rec = 14,
|
|
name = "Imperius Potion",
|
|
effect = "",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_moreish_mead",
|
|
cost = 60,
|
|
whoring_rec = 14,
|
|
name = "Moreish Mead",
|
|
effect = "",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_cum_addiction",
|
|
ingredients = ["ing_wormwood","p_moreish_mead"],
|
|
name = "Cum Addiction Potion",
|
|
effect = "Cum Addiction",
|
|
start_label = "potion_scene_3_1_1",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_ass_expansion",
|
|
ingredients = ["ing_knotgrass","p_expanding_elixir"],
|
|
name = "Ass Expansion Potion",
|
|
effect = "Ass Expansion",
|
|
start_label = "potion_scene_2_2",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_breast_expansion",
|
|
ingredients = ["ing_aconite_root","p_expanding_elixir"],
|
|
name = "Breast Expansion Potion",
|
|
effect = "Breast Expansion",
|
|
start_label = "potion_scene_2_1_1",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_cat_transformation",
|
|
ingredients = ["ing_cat_hair","p_polyjuice_potion"],
|
|
name = "Cat Transformation Potion",
|
|
effect = "Cat Ears",
|
|
start_label = "potion_scene_1_1_1",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_luna_transformation",
|
|
ingredients = ["ing_luna_hair","p_polyjuice_potion"],
|
|
name = "Luna Transformation Potion",
|
|
effect = "Luna Potion",
|
|
start_label = "potion_scene_1_2",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_lamia_transformation",
|
|
ingredients = ["ing_basilisk_scale","p_polyjuice_potion"],
|
|
name = "Lamia Transformation Potion",
|
|
start_label = "potion_scene_1_3",
|
|
effect = "Snek",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_transparency",
|
|
ingredients = ["ing_niffler_fancy","p_transparent_tincture"],
|
|
name = "Transparency Potion",
|
|
effect = "Transparent Clothes",
|
|
start_label = "potion_scene_4",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_hypno",
|
|
ingredients = ["ing_aconite_root","p_imperius_potion"],
|
|
name = "Hypno Potion",
|
|
effect = "Hypno Potion",
|
|
start_label = "potion_scene_3_3_1",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_clone",
|
|
ingredients = ["p_polyjuice_potion","p_imperius_potion"],
|
|
name = "Clone Potion",
|
|
effect = "Clone Potion",
|
|
start_label = "potion_scene_1_4",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_milk_potion",
|
|
name = "Lactantium",
|
|
effect = "Lactantium",
|
|
start_label = "potion_scene_11",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_veritaserum",
|
|
name = "Veritaserum",
|
|
effect = "",
|
|
description = ""
|
|
),
|
|
Potion(
|
|
id = "p_voluptatem",
|
|
name = "Voluptatem",
|
|
effect = "Voluptatem",
|
|
start_label = "potion_scene_3_4_1",
|
|
description = ""
|
|
)
|
|
]
|
|
)
|
|
|
|
default potion_inv = PotionInventory()
|
|
default p_inv = {} # this stores the id and quantity of items the player has persistently
|
|
|
|
### Potions Room ###
|
|
|
|
screen potions_room():
|
|
tag room_screen
|
|
|
|
if states.env.daytime:
|
|
add "images/rooms/_bg_/corridor.webp" #Need day image.
|
|
else:
|
|
add "images/rooms/_bg_/corridor.webp"
|
|
|
|
zorder 0
|
|
|
|
label potions_room:
|
|
show screen blkfade
|
|
with d3
|
|
|
|
call room("potions_room")
|
|
call gen_chibi("hide")
|
|
|
|
if store_intro_done:
|
|
call gen_chibi("stand", "left", "base")
|
|
call hide_blkfade
|
|
else:
|
|
call gen_chibi("stand", 0, "base")
|
|
call hide_blkfade
|
|
call gen_walk("left", "base")
|
|
pause.2
|
|
jump potions_menu
|
|
|
|
label potions_menu:
|
|
python:
|
|
items_menu = []
|
|
for potion in potion_lib.get_craftables():
|
|
if potion_inv.can_craft(potion):
|
|
items_menu.append(potion.get_craft_menu_item())
|
|
else:
|
|
items_menu.append(potion.get_craft_menu_item(True))
|
|
|
|
items_menu.append(("-Never mind-", "nvm"))
|
|
potion_choice = renpy.display_menu(items_menu)
|
|
|
|
if potion_choice == "nvm":
|
|
jump return_office
|
|
elif isinstance(potion_choice, Potion):
|
|
$ renpy.say( None, potion_choice.get_mix_text() )
|
|
if potion_choice.id == "p_cum_addiction":
|
|
">... but it's missing the most important part."
|
|
menu:
|
|
"-Cum into the Potion-":
|
|
# TODO: add jerk_off here at some point
|
|
">you cum into the potion"
|
|
$ renpy.say(None,">You received the item: \""+potion_choice.name+"\".")
|
|
python:
|
|
for ingredient in potion_choice.ingredients:
|
|
potion_inv.remove(ingredient)
|
|
$ potion_inv.add(potion_choice.id)
|
|
else:
|
|
show screen blktone
|
|
">You lack the required materials to make this."
|
|
$ missing_items = []
|
|
$ tmp_txt = "You still need "
|
|
python:
|
|
for item in potion_choice:
|
|
if not potion_inv.has(item):
|
|
missing_items.append(item)
|
|
for i in range(len(missing_items)):
|
|
tmp_txt += "{size=+5}{b}"+potion_lib.get_name_by_id(missing_items[i])+"{/b}{/size}"
|
|
if len(missing_items) > 1:
|
|
if i < len(missing_items)-2:
|
|
tmp_txt += ", "
|
|
if i == len(missing_items)-2:
|
|
tmp_txt += " and "
|
|
$ tmp_txt += " to craft this"
|
|
$ renpy.say(None, tmp_txt)
|
|
#$ renpy.say(None,"You need {size=+5}{b}"+potion_lib.get_name_by_id(potion_choice[0])+"{/b}{/size} and {size=+5}{b}"+potion_lib.get_name_by_id(potion_choice[1])+"{/b}{/size} to craft this")
|
|
hide screen blktone
|
|
jump potions_menu
|
|
|
|
|
|
init -1 python:
|
|
|
|
class PotionBase(object):
|
|
id = ""
|
|
|
|
def __init__(self, **kwargs):
|
|
self.__dict__.update(**kwargs)
|
|
|
|
def __repr__(self):
|
|
return self.id
|
|
|
|
def __eq__(self, other):
|
|
if isinstance(other, self.__class__):
|
|
return self.id == other.id
|
|
else:
|
|
return False
|
|
def __ne__(self, other):
|
|
return not self.__eq__(other)
|
|
|
|
class Potion(PotionBase):
|
|
id = ""
|
|
cost = 0
|
|
ingredients = []
|
|
name = ""
|
|
effect = ""
|
|
description = ""
|
|
picture = ""
|
|
whoring_rec = 0
|
|
start_label = None
|
|
|
|
def get_store_menu_item(self, disabled=False):
|
|
if disabled:
|
|
return gui.menu_item(f'-{self.name}-', None, style="disabled")
|
|
else:
|
|
return gui.menu_item(f'-{self.name}-', self)
|
|
|
|
def get_craft_menu_item(self, disabled=False):
|
|
if disabled:
|
|
return gui.menu_item(f'-Craft: "{self.name}"-', self.ingredients, style="disabled")
|
|
else:
|
|
return gui.menu_item(f'-Craft: "{self.name}"-', self.id)
|
|
|
|
def get_mix_text(self):
|
|
return ">You mix the {i}" + potion_lib.get_name_by_id(self.ingredients[0]) \
|
|
+ "{/i} with the {i}" + potion_lib.get_name_by_id(self.ingredients[1]) + "{/i}"
|
|
|
|
|
|
class PotionIngredient(PotionBase):
|
|
id = ""
|
|
cost = 0
|
|
name = ""
|
|
effect = ""
|
|
description = ""
|
|
picture = ""
|
|
|
|
|
|
class PotionCollection(object):
|
|
lib = []
|
|
|
|
def __init__(self, **kwargs):
|
|
self.__dict__.update(**kwargs)
|
|
|
|
def get_name_by_id(self,id):
|
|
for item in self.lib:
|
|
if item.id == id:
|
|
return item.name
|
|
return None
|
|
|
|
def is_valid_id(self, id):
|
|
for item in self.lib:
|
|
if item.id == id:
|
|
return True
|
|
return False
|
|
|
|
def get_id_by_name(self, name):
|
|
for item in self.lib:
|
|
if item.name == name:
|
|
return item.id
|
|
return None
|
|
|
|
def get_craftables(self):
|
|
craftable = []
|
|
for item in self.lib:
|
|
if hasattr(item, 'ingredients') and len(item.ingredients) > 0:
|
|
craftable.append(item)
|
|
return craftable
|
|
|
|
def get_buyables(self):
|
|
buyable = []
|
|
for item in self.lib:
|
|
if hasattr(item, 'cost') and item.cost > 0:
|
|
buyable.append(item)
|
|
return buyable
|
|
|
|
def get_start_label(self, id):
|
|
for item in self.lib:
|
|
if hasattr(item, 'start_label') and item.id == id:
|
|
return item.start_label
|
|
return None
|
|
|
|
def get_playables(self):
|
|
requests = []
|
|
for item in self.lib:
|
|
if hasattr(item, 'start_label') and item.start_label is not None:
|
|
requests.append(item)
|
|
return requests
|
|
|
|
|
|
|
|
class PotionInventory(object):
|
|
|
|
def can_craft(self, potion):
|
|
global p_inv
|
|
for ing_id in potion.ingredients:
|
|
if ing_id in p_inv.keys():
|
|
if p_inv[ing_id] < 1:
|
|
return False
|
|
else:
|
|
return False
|
|
return True
|
|
|
|
def has(self, potion):
|
|
global p_inv
|
|
if isinstance(potion, Potion):
|
|
potion = potion.id
|
|
return potion in p_inv.keys()
|
|
|
|
def add(self, potion, quant=1):
|
|
global p_inv, potion_lib
|
|
if isinstance(potion, Potion):
|
|
potion = potion.id
|
|
if potion_lib.get_id_by_name(potion) is not None:
|
|
potion = potion_lib.get_id_by_name(potion)
|
|
if potion_lib.is_valid_id(potion):
|
|
if potion in p_inv.keys():
|
|
p_inv[potion] = p_inv[potion] + quant
|
|
else:
|
|
p_inv[potion] = quant
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def extend(self, list):
|
|
for item in list:
|
|
self.add(item)
|
|
|
|
def remove(self, potion, quant=1):
|
|
global p_inv
|
|
if isinstance(potion, Potion):
|
|
potion = potion.id
|
|
if potion in p_inv.keys():
|
|
p_inv[potion] = p_inv[potion] - quant
|
|
if p_inv[potion] < 1:
|
|
p_inv.pop(potion, None)
|
|
return True
|
|
else:
|
|
return False
|