Ren'Py Completed Sakura Dungeon [v1.0.5] [Winged Cloud]

4.00 star(s) 3 Votes

262177

Well-Known Member
Oct 26, 2017
1,574
1,295
someone has a save with 100% unlock?
I recommend using the developer console for this since all events have varying scenes depending on who's in your team at the time (there is no scene recollection, only the 120 CGs and the sprite testing you can unlock after beating the game).

1) Press Shift+O to fire up the console. If you can't run the console, create a file in the /game/ subfolder (where the .rpa files are) and save it as a .rpy file. Keep the indent as it is or you will run into errors.
Python:
init 999 python hide:
    config.console = True
    config.developer = True
Now run the game and try again. (config.developer should imply console, so skip config.console if you wish.)

2) If you still have to enable developer mode, type config.developer = True in the console. This will unlock sprite testing (if you haven't already cleared the game) and enable debugging.

3) Now to make it persistent. Check if you've cleared the game: persistent.game_clear. If it's False, set it to True.

4) Let's unlock your CGs now. Again, in the console:
Python:
for cg in cg_list:
    renpy.show(cg)
    renpy.hide(cg)
Check your CG menu to make sure they are all there.

5) Set the XP, drop rate and mana shard multiplier to 50x (will become 100x with the Luck Statue; anything higher will unbalance the drop rates and if the final multiplier is 200x or more you will never get any seed due to how the drop checking logic works). Besides, this is already overkill as developer mode is supposed to allow for 4x.
persistent.xp = 50.0

What does this do, exactly?
- 50x XP gain (which means you'll always gain at least 5 XP regardless of level difference)
- 50x Mana Shard gain
- 50x drop rate for seeds (drop rate varies depending on enemy level, but since the drop list is processed in succession and exits once it has a drop, you do not want to disable important drops unless you plan to spawn the item and don't mind never seeing it)
- 25% drop rate for skill scrolls instead of 0.5%

6) Start a new game while still in developer mode (difficulty doesn't matter but I'd still recommend playing at Abyssal difficulty). This will allow you to directly spawn to post-game with all events still unseen, as well as watch events individually if you want to.

Recommended guides for achievements and 100% secrets (you can also check for them using the debugger)
by Ssenkrad_II
by TRG

Very late to the party but hope this helps.

Edit: Fixed priority and location. Been a (very) long time since I touched Ren'py and assumed it backwards, so the new config would just end up being overwritten by config calls.
 
Last edited:
  • Like
Reactions: Plazm54 and o_o233

262177

Well-Known Member
Oct 26, 2017
1,574
1,295
Unfortunately don't have a copy of the Android version but you could either use an external keyboard or send virtual keystrokes to emulate a Windows Shift+O. Alternately, a mod that acts as a console, but I wouldn't recommend something that directly modifies the engine - always make sure you look at what it does before you run it, you can never be too careful.

From , RenpyTom did not plan on supporting the console/devtools for Android and stated their reasons.

Useful links if you intend to rebuild it yourself (make sure you unRPA the archives and verify that the project runs):

or any other RPA extractor working with newer Ren'py versions. Do make sure to read the developer's disclaimer as well.
 

aaver85

Newbie
May 22, 2021
15
0
get xp to work how do you get drop rate and mana shard multiplier to 50x to work for developer mode
 

aaver85

Newbie
May 22, 2021
15
0
what is code i find code for xppersistent.xp = 50.0 what code for 50x Mana Shard gain and
- 50x drop rate
 

262177

Well-Known Member
Oct 26, 2017
1,574
1,295
From memory, persistent.xp affects all three variables listed, not just experience gain. To make sure it works, check how many shards you gain and how often seeds and skill scrolls drop.

It's not recommended to set it too high if you are trying to get a specific type of item (because the drop would be replaced by the higher priority one during the random check; the game uses an exclusive drop check, kind of like how Steal prevented you from getting certain items in some classic RPGs), so don't go any higher than 50x. Check the value in the console to make sure it has been changed (and obviously make sure you have config.developer set to True).

You can also directly replace skills, innate abilities or stats, though caution is advised when replacing universal skills.

From code:

actor.rpy, line 252:
Python:
        def xpchange(self, level):         
            if  self.level+4 < level:
                val = 2.0
            elif self.level+4 == level:
                val = 1.0/3*5
            elif self.level+4 == level:
                val = 1.0/3*4
            elif self.level+3 == level:
                val = 1.0
            elif self.level+2 == level:
                val = 1.0/6*5
            elif self.level+1 == level:
                val = 1.0/6*4
            elif self.level  == level:
                val = 1.0/2
            elif self.level-1 == level:
                val = 1.0/3
            elif self.level-2  == level:
                val = 1.0/5
            elif self.level-3  == level:
                val = 1.0/8
            elif self.level-4  == level:
                val = 1.0/12
            elif self.level-5  == level:
                val = 1.0/16
            else:
                val = 1.0/20
            if self.level==1:
                val= val*12
            elif self.level==2:
                val=val*10
            elif self.level==3:
                val=val*9
            elif self.level==4:
                val=val*8
            elif self.level==5:
                val=val*7
            elif self.level==6:
                val=val*6.4
            elif self.level==7:
                val=val*6
            elif self.level==8:
                val=val*5.6
            elif self.level==9:
                val=val*5.3
            elif self.level==10:
                val=val*5
            elif self.level==11:
                val=val*4.8
            elif self.level==12:
                val=val*4.6
            elif self.level==13:
                val=val*4.4
            elif self.level==14:
                val=val*4.2
            else:
                val = val*4
            self.xp += val*persistent.xp/2.0
            if self.xp>=100:
                if self in party[:3]:
                    slot_y = .95
                    if self == party[0]:
                        slot_x = .12
                    elif self == party[1]:
                        slot_x = .35
                    elif self == party[2]:
                        slot_x = .58
                    renpy.music.play("level_up", channel="audio")
                    renpy.show("levelup", at_list=[show_state(slot_x, slot_y)], layer="screens", what=Text(_("Level Up"), style="effect_text", color="ff9"))
                if "Capacity" in self.abilities:
                    self.stats_check(self.level, self.level+1)
                self.level+=1
                self.xp=0.0
battle.rpy (having the luck statue further doubles droprate but not xp/shards as they directly use persistent.xp), line 254:
Python:
    if battle_result=="win":
        $ check_achievement()
        python:
            if player.has(luck_statue):
                gain_boost = persistent.xp*2.0
            else:
                gain_boost = persistent.xp
            gain_currency = int(sum([x.currency for x in enemy])*persistent.xp)
            if difficulty >0:
                gain_currency = gain_currency//2
            player.currency += gain_currency
            annotator("You found [gain_currency] mana shards")
            for i in enemy:
                if renpy.random.random()<0.005*gain_boost:
                    gain_item = getattr(store, renpy.random.choice(["{}_scroll".format(renpy.random.choice(i.skills[1:]).objectname)]))
                    player.items.append(copy(gain_item))
                    renpy.music.play("Get_Item", channel="audio")
                    annotator("You found a [gain_item.name]")
                elif renpy.random.random()< 0.0005*min(i.level-50, 10)*gain_boost:
                    gain_item = renpy.random.choice([vitality_seed_h, agility_seed_h, mentality_seed_h, strength_seed_h, dexterity_seed_h, resilience_seed_h])
                    player.items.append(copy(gain_item))
                    renpy.music.play("Get_Item", channel="audio")
                    annotator("You found a [gain_item.name]")
                elif renpy.random.random()< 0.0005*min(i.level-30, 20)*gain_boost:
                    gain_item = renpy.random.choice([vitality_seed_l, agility_seed_l, mentality_seed_l, strength_seed_l, dexterity_seed_l, resilience_seed_l])
                    player.items.append(copy(gain_item))
                    renpy.music.play("Get_Item", channel="audio")
                    annotator("You found a [gain_item.name]")
                elif renpy.random.random()< 0.0005*min(i.level-10, 50-i.level)*gain_boost:
                    gain_item = renpy.random.choice([vitality_seed_m, agility_seed_m, mentality_seed_m, strength_seed_m, dexterity_seed_m, resilience_seed_m])
                    player.items.append(copy(gain_item))
                    renpy.music.play("Get_Item", channel="audio")
                    annotator("You found a [gain_item.name]")
                elif renpy.random.random()<0.0001*min(20, 30-i.level)*gain_boost:
                    gain_item = renpy.random.choice([vitality_seed_s, agility_seed_s, mentality_seed_s, strength_seed_s, dexterity_seed_s, resilience_seed_s])
                    player.items.append(copy(gain_item))
                    renpy.music.play("Get_Item", channel="audio")
                    annotator("You found a [gain_item.name]")
 
Last edited:
4.00 star(s) 3 Votes