From eab0635db4b14ec62544a173487d841dc4faff47 Mon Sep 17 00:00:00 2001 From: LoafyLemon Date: Fri, 13 Sep 2024 19:52:19 +0100 Subject: [PATCH] Rework achievements, Add progression bars, bug fixes --- .../scripts/characters/cho/events/panties.rpy | 4 +- game/scripts/gui/player.rpy | 4 +- game/scripts/gui/settings.rpy | 2 +- game/scripts/interface/achievements.rpy | 122 +++++++++++------- game/scripts/utility/periodic_functions.rpy | 2 +- game/scripts/wardrobe/wardrobe.rpy | 1 - 6 files changed, 80 insertions(+), 55 deletions(-) diff --git a/game/scripts/characters/cho/events/panties.rpy b/game/scripts/characters/cho/events/panties.rpy index 750b5c28..418e28be 100644 --- a/game/scripts/characters/cho/events/panties.rpy +++ b/game/scripts/characters/cho/events/panties.rpy @@ -64,7 +64,7 @@ label cho_panties_response_T2: $ states.cho.ev.panty_thief.soaked = False - $ achievements.unlock("pantiesfapcho") + $ achievements.unlock("pantiesfap") call music_block jump main_room_menu @@ -132,7 +132,7 @@ label cho_panties_response_T3: $ states.cho.ev.panty_thief.soaked = False - $ achievements.unlock("pantiesfapcho") + $ achievements.unlock("pantiesfap") else: diff --git a/game/scripts/gui/player.rpy b/game/scripts/gui/player.rpy index 915dcc0f..8d1f2222 100644 --- a/game/scripts/gui/player.rpy +++ b/game/scripts/gui/player.rpy @@ -33,5 +33,5 @@ style player_text_title is player_text: style player_bar is empty: xmaximum 280 ysize 20 - left_bar Frame(Image("gui/creamy_pumpkin_pie/player/player_bar_full.png", oversample=4), tile=False) - right_bar Frame(Image("gui/creamy_pumpkin_pie/player/player_bar_empty.png", oversample=4), tile=False) \ No newline at end of file + left_bar Frame(Image("gui/creamy_pumpkin_pie/player/player_bar_full.png", oversample=4), 24, 0, tile=False) + right_bar Frame(Image("gui/creamy_pumpkin_pie/player/player_bar_empty.png", oversample=4), 24, 0, tile=False) diff --git a/game/scripts/gui/settings.rpy b/game/scripts/gui/settings.rpy index 90ce2424..2df89576 100644 --- a/game/scripts/gui/settings.rpy +++ b/game/scripts/gui/settings.rpy @@ -14,7 +14,7 @@ screen settings_general(): textbutton _("System Cursor") action Preference("system cursor", "toggle") textbutton _("Autosaves") action ToggleField(store, "_autosave") textbutton _("Automatic Update Checks") action settings.Toggle("updates") - textbutton _("Kinetic Text") action settings.Toggle("kinetictext") tooltip "{bounce}Kinetic Text Example.{/bounce}" + textbutton _("Kinetic Text") action settings.Toggle("kinetictext") tooltip "{bounce}{size=12}Kinetic Text Example.{/size}{/bounce}" text _("Skipping") textbutton _("Skip Unseen Text") action Preference("skip", "toggle") diff --git a/game/scripts/interface/achievements.rpy b/game/scripts/interface/achievements.rpy index 31b4cfd6..2653815b 100644 --- a/game/scripts/interface/achievements.rpy +++ b/game/scripts/interface/achievements.rpy @@ -1,47 +1,45 @@ -init python: +init -5 python: from collections import namedtuple - AchievementKind = namedtuple("AchievementKind", ("category", "name", "description", "icon", "secret")) + AchievementKind = namedtuple("AchievementKind", ("category", "name", "description", "icon", "progression", "progression_max")) AchievementKind.title = AchievementKind.name define achievements_db = { # id : (categoryname, title, description, icon, secret) - "unlockher": AchievementKind("Characters", "Granger Danger", "Awarded for unlocking Hermione Granger.", "interface/icons/head/hermione.webp", False), - "unlockcho": AchievementKind("Characters", "Chang Dynasty", "Awarded for unlocking Cho Chang.", "interface/icons/head/cho.webp", False), - "unlocklun": AchievementKind("Characters", "Looney Tunes", "Awarded for unlocking Luna Lovegood.", "interface/icons/head/luna.webp", False), - "unlockast": AchievementKind("Characters", "Green Peas", "Awarded for unlocking Astoria Greengrass.", "interface/icons/head/astoria.webp", False), - "unlockton": AchievementKind("Characters", "Nymphadoreador", "Awarded for unlocking Nymphadora Tonks.", "interface/icons/head/tonks.webp", False), - "overwhored": AchievementKind("Characters", "Overwhored", "Awarded for fully corrupting Hermione.", "interface/icons/head/hermione.webp", False), - "unlocksus": AchievementKind("Characters", "Boner", "Awarded for unlocking Susan Bones.", "interface/icons/head/susan.webp", False), - "unlocksna": AchievementKind("Characters", "Strictly colleagues", "Awarded for unlocking Severus Snape.", "interface/icons/head/snape.webp", False), - "mirror": AchievementKind("Mirror", "Mirror, mirror on the wall..", "Awarded for unlocking the Room of Requirement.", "images/rooms/room_of_requirement/mirror_hover.webp", False), - "gold": AchievementKind("General", "Gold Digger", "Awarded for having 10,000 gold in total.", "interface/icons/gold.webp", False), - "drunkard": AchievementKind("General", "Drunken Master", "Awarded for collecting 25 bottles of wine.", "interface/icons/wine.webp", True), - "workaholic": AchievementKind("General", "Workaholic", "Awarded for completing five full reports.", "interface/icons/generic_scroll.webp", False), - "fireplace": AchievementKind("General", "Feel the Heat", "Awarded for lighting the fireplace 5 times or more.", "images/rooms/main_room/fireplace/fireplace_idle.webp", True), - "peta": AchievementKind("General", "I think I forgot something...", "Awarded for not feeding the bird for 50 days.... \nYou monster.\n{size=-4}Disclaimer: No real nor fictional animals were harmed in the process.{/size}", "images/rooms/main_room/phoenix/phoenix_01.webp", True), - "petpal": AchievementKind("General", "Regular stroking", "Awarded for petting the bird 25 times.", "images/rooms/main_room/phoenix/phoenix_01.webp", False), - "postman": AchievementKind("Cardgame", "Poster Boy", "Awarded for buying all posters from the token shop.", "interface/icons/agrabah_poster.webp", False), - "hats": AchievementKind("Cardgame", "Mad Hatter", "Awarded for buying all hat decorations from the token shop.", "interface/icons/icon_gambler_hat.webp", False), - "daddy": AchievementKind("Characters", "Who's your daddy?", "Awarded for letting Hermione call you a {size=-5}(sugar){/size} daddy.", "interface/icons/head/hermione.webp", True), - "pantiesfap": AchievementKind("Characters", "I sneezed on them...", "Awarded for rubbing one out on Hermione's panties.", "characters/genie/chibis/jerk_off/02.webp", False), - "pantiesfapcho": AchievementKind("Characters", "Exercise is important", "Awarded for rubbing one out on Cho's panties.", "characters/genie/chibis/jerk_off/02.webp", False), - "bros": AchievementKind("Characters", "Bros before hoes", "Awarded for becoming best pals with Snape.", "interface/icons/head/snape.webp", False), - "knock": AchievementKind("Characters", "*Knock* *knock*", "Awarded for telling Hermione to go away during her introductory events.", "images/rooms/main_room/door/door_idle.webp", True), - "decorator": AchievementKind("Cardgame", "Decorator", "Awarded for decorating the office for the first time.", "interface/icons/stag_trophy.webp", False), - "flashback": AchievementKind("Cardgame", "Flashback", "Awarded for retelling what actually happened...", "interface/icons/cards.webp", True), - "start": AchievementKind("General", "Welcome to Hogwarts!", "Awarded for finishing the intro.", "interface/icon.webp", False), - "export": AchievementKind("General", "Sharing is caring", "Awarded for exporting an outfit through the wardrobe menu.", "interface/wardrobe/icons/load.webp", False), - "Credits": AchievementKind("General", "New game, who this?", "Awarded for checking out the Credits Menu.", "interface/icons/silver_scroll.webp", False), - "Cardwin": AchievementKind("Cardgame", "Time to duel", "Awarded for winning your first Card game duel.", "interface/icons/cards.webp", False), - "puzzle": AchievementKind("General", "Down the hatch!", "Awarded for wasting a bottle of unbelievably rare phoenix tears by drinking it.", "interface/icons/item_potion.webp", True), - "ending": AchievementKind("General", "Bittersweet Farewell", "Awarded for reaching the original ending.", "interface/icons/silver.webp", True), + "unlockher": AchievementKind("progression", "Granger Danger", "Unlock Hermione Granger.", "interface/icons/head/hermione.webp", None, None), + "unlockcho": AchievementKind("progression", "Chang Dynasty", "Unlocked Cho Chang.", "interface/icons/head/cho.webp", None, None), + "unlocklun": AchievementKind("progression", "Looney Tunes", "Unlocked Luna Lovegood.", "interface/icons/head/luna.webp", None, None), + "unlockast": AchievementKind("progression", "Green Peas", "Unlocked Astoria Greengrass.", "interface/icons/head/astoria.webp", None, None), + "unlockton": AchievementKind("progression", "Nymphadoreador", "Unlocked Nymphadora Tonks.", "interface/icons/head/tonks.webp", None, None), + "unlocksus": AchievementKind("progression", "Boner", "Unlocked Susan Bones.", "interface/icons/head/susan.webp", None, None), + "unlocksna": AchievementKind("progression", "Strictly colleagues", "Unlocked Severus Snape.", "interface/icons/head/snape.webp", None, None), + "overwhored": AchievementKind("progression", "Overwhored", "Fully corrupted one of the girls.", "interface/icons/head/hermione.webp", None, None), + "mirror": AchievementKind("events", "Mirror, mirror on the wall..", "Found the Room of Requirements.", "images/rooms/room_of_requirement/mirror_hover.webp", None, None), + "gold": AchievementKind("general", "Gold Digger", "Acquired 10,000 gold coins.", "interface/icons/gold.webp", "states.env.gold", 10000), + "drunkard": AchievementKind("general", "Drunken Master", "Acquired 25 bottles of wine.", "interface/icons/wine.webp", "wine_ITEM.owned", 25), + "workaholic": AchievementKind("general", "Workaholic", "Completed five full reports.", "interface/icons/generic_scroll.webp", "states.paperwork_reports_times", 5), + "fireplace": AchievementKind("general", "Feel the Heat", "Started fire 5 times.", "images/rooms/main_room/fireplace/fireplace_idle.webp", "states.fireplace_started_times", 5), + "peta": AchievementKind("general", "I think I forgot something...", "Forgot to feed the bird 50 days in a row.", "images/rooms/main_room/phoenix/phoenix_01.webp", "(states.env.day - states.bird_fed_times)", 50), + "petpal": AchievementKind("general", "Regular stroking", "Petted the bird 25 times.", "images/rooms/main_room/phoenix/phoenix_01.webp", "states.bird_petted_times", 25), + "postman": AchievementKind("general", "Poster Boy", "Bought all posters from the store.", "interface/icons/agrabah_poster.webp", None, None), + "hats": AchievementKind("general", "Mad Hatter", "Bought all hats from the store.", "interface/icons/icon_gambler_hat.webp", None, None), + "daddy": AchievementKind("events", "Who's your daddy?", "Been called a daddy.", "interface/icons/head/hermione.webp", None, None), + "pantiesfap": AchievementKind("events", "I sneezed on them...", "Rubbed one out on someone's panties.", "characters/genie/chibis/jerk_off/02.webp", None, None), + "bros": AchievementKind("events", "Bros before hoes", "Became best pals with Snape.", "interface/icons/head/snape.webp", None, None), + "knock": AchievementKind("events", "*Knock* *knock*", "Told Hermione to fuck off.", "images/rooms/main_room/door/door_idle.webp", None, None), + "decorator": AchievementKind("general", "Decorator", "Applied a decoration.", "interface/icons/stag_trophy.webp", None, None), + "flashback": AchievementKind("events", "Flashback", "Rolled back to the future at the right moment...", "interface/icons/cards.webp", None, None), + "start": AchievementKind("progression", "Welcome to Hogwarts!", "Finished the intro.", "interface/icon.webp", None, None), + "Credits": AchievementKind("general", "New game, who this?", "Watched the credits.", "interface/icons/silver_scroll.webp", None, None), + "Cardwin": AchievementKind("events", "Time to duel", "Won a card game duel.", "interface/icons/cards.webp", None, None), + "puzzle": AchievementKind("general", "Down the hatch!", "Waste a bottle of rare phoenix tears.", "interface/icons/item_potion.webp", None, None), + "ending": AchievementKind("events", "Bittersweet Farewell", "Reached the ending.", "interface/icons/silver.webp", None, None), #1.37 HG achievements - "busted": AchievementKind("Characters", "BUSTED!", "Awarded for getting busted by Hermione when busting a nut.", "interface/icons/head/hermione.webp", False), - "herstrip": AchievementKind("Characters", "Dance lessons", "Awarded for having Hermione dance naked in front of you... and Snape.", "interface/icons/head/hermione.webp", False), - "herkiss": AchievementKind("Characters", "First Kiss", "Awarded for having Hermione make out with you-- r... cock...", "interface/icons/head/hermione.webp", False), - "hertits": AchievementKind("Characters", "Boobs Lover", "Awarded for sticking it between Hermione's fun bags.", "interface/icons/head/hermione.webp", False), - "headlib": AchievementKind("Characters", "Head Librarian", "Awarded for releasing your seed in Hermione's mouth.", "interface/icons/head/hermione.webp", False), - "nerdgasm": AchievementKind("Characters", "Nerdgasm", "Awarded for doing the deed with Hermione.", "interface/icons/head/hermione.webp", False) + "busted": AchievementKind("events", "BUSTED!", "Got busted for busting a nut.", "interface/icons/head/hermione.webp", None, None), + "herstrip": AchievementKind("progression", "Dance lessons", "Allowed Hermione to dance naked in front of Snape.", "interface/icons/head/hermione.webp", None, None), + "herkiss": AchievementKind("progression", "First Kiss", "You made out with Hermione, or rather your cock did.", "interface/icons/head/hermione.webp", None, None), + "hertits": AchievementKind("progression", "Boobs Lover", "Stuck a dick between the valley of plenty.", "interface/icons/head/hermione.webp", None, None), + "headlib": AchievementKind("progression", "Head Librarian", "Had oral lessons with Hermione.", "interface/icons/head/hermione.webp", None, None), + "nerdgasm": AchievementKind("progression", "Nerdgasm", "Done the deed with Hermione.", "interface/icons/head/hermione.webp", None, None) } init python hide: @@ -116,10 +114,12 @@ transform rotate_circular(t=7): init python in achievements: def validate(): - """Check if icons are loadable at init""" + """Validate icons and progression flags""" for i in renpy.store.achievements_db.values(): if not renpy.loadable(i.icon): raise IOError(repr(i.icon)) + # if i.progression and not isinstance(eval(i.progression), (int, float)): + # raise TypeError(f"Progression flag must return a float or an integer - {i.progression}") validate() @@ -145,6 +145,21 @@ init python in achievements: items = sorted(items, key=lambda x: renpy.store.natsort_key(renpy.store.achievements_db[x].title)) return items + def get_list(category=None): + if category: + items = filter((lambda x: category==renpy.store.achievements_db[x].category), renpy.store.achievements_db) + else: + items = renpy.store.achievements_db + + # Sort titles + items = sorted(items, key=lambda x: renpy.store.natsort_key(renpy.store.achievements_db[x].title)) + # Sort unlocks + items = sorted(items, key=lambda x: renpy.store.achievement.has(x)) + return items + + def get_categories(): + return set(item.category for item in renpy.store.achievements_db.values()) + label achievements: $ disable_game_menu() call screen achievements @@ -163,6 +178,7 @@ screen achievements(): default navigation_exit = False default category = None + default menu_categories = achievements.get_categories() default menu_items = achievements.get_list(category) add last_frame at navigation_last_frame_atl @@ -170,8 +186,6 @@ screen achievements(): if navigation_exit: timer 0.4 action Return() - $ print(menu_items) - frame: style "empty" align (0.5, 0.5) @@ -184,10 +198,8 @@ screen achievements(): at navigation_subtabs_show textbutton _("All") action [SetScreenVariable("category", None), SetScreenVariable("menu_items", achievements.get_list())] selected (category==None) at navigation_tabs - textbutton _("General") action [SetScreenVariable("category", "general"), SetScreenVariable("menu_items", achievements.get_list("general"))] selected (category=="general") at navigation_tabs - textbutton _("Characters") action [SetScreenVariable("category", "characters"), SetScreenVariable("menu_items", achievements.get_list("characters"))] selected (category=="characters") at navigation_tabs - textbutton _("Cards") action [SetScreenVariable("category", "cardgame"), SetScreenVariable("menu_items", achievements.get_list("cardgame"))] selected (category=="cardgame") at navigation_tabs - textbutton _("Mirror of Erised") action [SetScreenVariable("category", "mirror"), SetScreenVariable("menu_items", achievements.get_list("mirror"))] selected (category=="mirror") at navigation_tabs + for i in menu_categories: + textbutton "[i.capitalize()]" action [SetScreenVariable("category", i), SetScreenVariable("menu_items", achievements.get_list(i))] selected (category==i) at navigation_tabs null height 35 textbutton _("Return") action [SetScreenVariable("navigation_last_frame_atl", navigation_last_frame_hide), SetScreenVariable("navigation_atl", navigation_hide), SetScreenVariable("navigation_exit", True)] keysym ["game_menu"] at navigation_tabs @@ -197,8 +209,6 @@ screen achievements(): # Add items viewport: ypos 32 - xalign 0.5 - ymaximum 392 scrollbars "vertical" mousewheel True vbox: @@ -218,13 +228,20 @@ screen achievements(): action NullAction() if item_unlocked: add "interface/topbar/icon_check.webp" xysize (24, 24) yalign 0.5 + if item_data.progression: + if item_unlocked: + bar value StaticValue(1.0) + else: + bar value StaticValue(eval(item_data.progression), item_data.progression_max) style "achievements_bar_disabled" add "frame_spacer" xalign 0.5 xsize 500 +style achievements_viewport is viewport: + xalign 0.5 + ymaximum 392 style achievements_vbox is frame_vbox: ypos 0 yspacing 0 xalign 0 - style achievements_frame is frame style achievements_label is frame_label style achievements_label_text is frame_label_text @@ -237,3 +254,12 @@ style achievements_button is frame_button: xfill True yminimum 48 style achievements_button_text is frame_button_text +style achievements_bar is player_bar: + xmaximum 400 + yalign 1.0 + xpos 78 + ysize 10 + yoffset -2 +style achievements_bar_disabled is achievements_bar: + left_bar Frame(Transform(Image("gui/creamy_pumpkin_pie/player/player_bar_full.png", oversample=4), matrixcolor=BrightnessMatrix(-0.5)), 24, 0, tile=False) + right_bar Frame(Transform(Image("gui/creamy_pumpkin_pie/player/player_bar_empty.png", oversample=4), matrixcolor=BrightnessMatrix(-0.5)), 24, 0, tile=False) diff --git a/game/scripts/utility/periodic_functions.rpy b/game/scripts/utility/periodic_functions.rpy index f155c559..0c1bf81a 100644 --- a/game/scripts/utility/periodic_functions.rpy +++ b/game/scripts/utility/periodic_functions.rpy @@ -18,7 +18,7 @@ init python: if not achievements.status('bros') and states.sna.level >= 100: achievements.unlock("bros") - if not achievements.status('overwhored') and states.her.level >= 24: + if not achievements.status('overwhored') and (states.her.level >= 24 or states.cho.level >= 24 or states.lun.level >= 24): achievements.unlock("overwhored") if not achievements.status('fireplace') and states.fireplace_started_times >= 5: diff --git a/game/scripts/wardrobe/wardrobe.rpy b/game/scripts/wardrobe/wardrobe.rpy index 846789d0..89fc8734 100644 --- a/game/scripts/wardrobe/wardrobe.rpy +++ b/game/scripts/wardrobe/wardrobe.rpy @@ -468,7 +468,6 @@ label wardrobe_menu(): filename += ".png" __choice[1].export_data(filename) - achievements.unlock("export") elif __choice[0] == "import": $ _outfit = char_active.import_outfit(__choice[1])