From 297ca81c7cf0191ed77149ef227878f4a3f4f0d8 Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 8 Aug 2024 19:19:48 -0300 Subject: [PATCH 001/105] - Add array containing general chapters labels - Add dictionary for endings - Add chapter transition functions --- game/storyline.rpy | 66 ++++++++++++++++++++++++++++++++++++++++++++++ game/utility.rpy | 12 +++++++++ 2 files changed, 78 insertions(+) diff --git a/game/storyline.rpy b/game/storyline.rpy index e5139a7..b1cc307 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -1,3 +1,31 @@ +default persistent.old_endings = None +default persistent.endings = None + +# Store the general chapters inside an array for easy manipulation +define general_chapters = [ + "chapter_1", "chapter_2", "chapter_3", "chapter_4", "chapter_5", + "chapter_6", "chapter_7", "chapter_8", "chapter_9", "chapter_10", "chapter_11" +] + +define ending_routes = { + 4: ["chapter_11D", "chapter_12D", "chapter_12_5D", "chapter_13D", "chapter_14D"], + 3: ["chapter_11C", "chapter_12C", "chapter_12_5C", "chapter_13C", "chapter_14C"], + 2: ["chapter_11B", "chapter_12B", "chapter_13B", "chapter_14B"], + 1: ["chapter_11A", "chapter_12A", "chapter_12_5D", "chapter_13A", "chapter_14A"] +} + +# Index number for the current position of the general chapters array +define chapter_index = 0 + +# This will store the name of the label as a string +define current_chapter = None + +default chapters_array_length = len(general_chapters) - 1 + +define ending_route_number = None +define ending_chapter_index = 0 + + init -1 python: def ending_image(): #0b0000, DCBA, flash the bits with |=, check with & @@ -10,6 +38,44 @@ init -1 python: persistent.old_endings = persistent.endings persistent.endings = endings + +init python: + + def next_story_chapter(): + global chapter_index + global current_chapter + global ending_route_number + + if is_end_of_chapters(): + ending_route_number = get_ending() + next_ending_chapter() + return + + + def is_end_of_chapters(): + return chapter_index >= chapters_array_length + + + def next_ending_chapter(): + global ending_route_number, ending_chapter_index + + if ending_route_number in ending_routes: + # Save the ending chapters array from + # the ending_routes dictionary + current_ending_list = ending_routes[ending_route_number] + + if ending_chapter_index < len(current_ending_list): + # Stores the label name from the current_ending_list array in the item variable + item = current_ending_list[ending_chapter_index] + # Increases the index and jumps to the label + ending_chapter_index += 1 + renpy.jump(item) + else: + return + else: + return + + label storyline: call chapter_1 from _call_chapter_1 call chapter_2 from _call_chapter_2 diff --git a/game/utility.rpy b/game/utility.rpy index 591f274..ce4bf65 100644 --- a/game/utility.rpy +++ b/game/utility.rpy @@ -20,3 +20,15 @@ label get_ending: return(2) # Doomer else: return(1) # Shooter + + +init python: + def get_ending(): + if anonscore >= 4 and fangscore >= 4 and wingStory: + return 4 # Golden + elif anonscore >= 3 and fangscore <=4: + return 3 # Tradwife + elif anonscore <= 3 and fangscore >=3: + return 2 # Doomer + else: + return 1 # Shooter From 79569c7441f08f53c9a82b779b2d2b90eb131985 Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 8 Aug 2024 19:43:36 -0300 Subject: [PATCH 002/105] Add call first element of the general_chapters array in script --- game/script.rpy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/game/script.rpy b/game/script.rpy index 94c48f7..465c647 100644 --- a/game/script.rpy +++ b/game/script.rpy @@ -325,5 +325,7 @@ label start: $ fangscore = 0 $ anonscore = 0 $ wingStory = False + pause 1.0 - call storyline from _call_storyline + + $ renpy.call(general_chapters[0]) # Call first element of the general_chapters array From 4b662b54886481db5c4f840c2f815fb7cc408bd3 Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 8 Aug 2024 19:51:18 -0300 Subject: [PATCH 003/105] Replace get_ending label usage for new function in chapter 11 --- .../11.school-assignment-and-route-lock.rpy | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/game/script/11.school-assignment-and-route-lock.rpy b/game/script/11.school-assignment-and-route-lock.rpy index eb2262c..ad78761 100644 --- a/game/script/11.school-assignment-and-route-lock.rpy +++ b/game/script/11.school-assignment-and-route-lock.rpy @@ -448,8 +448,9 @@ label chapter_11: #THIS SECTION IS SCORE DEPENDENT # Doomer ending skips this segment - call get_ending from _call_get_ending - if _return == 2: + $ ending_score = get_ending() + + if ending_score == 2: stop music fadeout 3 pause 2 jump lPromAnnouncement @@ -585,8 +586,7 @@ label chapter_11: Nas "Don’t take it the wrong way, but my mind just screamed at me ‘worst case scenario’." pause .5 - call get_ending from _call_get_ending_1 - if _return == 4: # Golden + if ending_score == 4: # Golden jump lSortingThings elif _return == 3: # tradwife jump lMendingThings @@ -5211,8 +5211,8 @@ label chapter_11: "Fang and I have been together for a month now." pause .5 - call get_ending from _call_get_ending_2 - if _return == 3: # tradwife + + if ending_score == 3: # tradwife "Things are going pretty well. When we discount Trish’s weekly attempt to talk with Fang." @@ -5467,8 +5467,7 @@ label chapter_11: "{cps=*.1}...{/cps}" # skip this segment if we're doing ending 1 - call get_ending from _call_get_ending_3 - if _return == 1: #shooter + if ending_score == 1: #shooter return # the following segment makes sense in the context of 11B+11C+11D From c50eb0ce32b9afcd95e73bbb6fd1972d04fab6d0 Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 8 Aug 2024 19:51:58 -0300 Subject: [PATCH 004/105] Replace get_ending label usage in credits.rpy --- game/src/credits.rpy | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/game/src/credits.rpy b/game/src/credits.rpy index c1a1825..ab68d72 100644 --- a/game/src/credits.rpy +++ b/game/src/credits.rpy @@ -241,8 +241,7 @@ image d_credits_text = Composite( label lending: - call get_ending from _call_get_ending_4 - $ cached_ending = _return + $ cached_ending = get_ending() if cached_ending == 4: pause 0.5 show snootgame_big with dissolve: # Renpy not allowing you to grab images from the gui folder is serious bullshit From dbf1aa34ef6092ddb90120c33f53f82adae290ab Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 8 Aug 2024 20:01:30 -0300 Subject: [PATCH 005/105] Adjustments to next_ending_chapter function --- game/storyline.rpy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index b1cc307..4014bbd 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -70,7 +70,9 @@ init python: # Increases the index and jumps to the label ending_chapter_index += 1 renpy.jump(item) - else: + else: # We've reached the end of the final chapters + ending_image() + renpy.call("lending") return else: return From 1345686055a674def53b4d9dd0dcf0207c6e23d4 Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 8 Aug 2024 21:21:36 -0300 Subject: [PATCH 006/105] Replace return calls with next_story_chapter function --- game/script/1.first-two-days-anon-meets-fang.rpy | 2 +- .../10.an-excellent-reason-to-start-abusing-mod-powers.rpy | 2 +- game/script/11.school-assignment-and-route-lock.rpy | 6 +++--- game/script/2.fourth-day-of-school.rpy | 2 +- .../3.showing-up-at-band-practice-and-giving-feedback.rpy | 2 +- game/script/4.anon-needs-help-during-music-period.rpy | 2 +- .../5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy | 2 +- game/script/6.anon-helps-fang-find-a-venue-for-band.rpy | 2 +- game/script/7.concert-day.rpy | 2 +- game/script/8.anon-and-fang-study-together.rpy | 5 +++-- game/script/9.anons'-dirty-laundry-gets-put-up-to-air.rpy | 2 +- 11 files changed, 15 insertions(+), 14 deletions(-) diff --git a/game/script/1.first-two-days-anon-meets-fang.rpy b/game/script/1.first-two-days-anon-meets-fang.rpy index 2d29243..e544229 100644 --- a/game/script/1.first-two-days-anon-meets-fang.rpy +++ b/game/script/1.first-two-days-anon-meets-fang.rpy @@ -3663,4 +3663,4 @@ label chapter_1: window auto pause 1.5 - return + $ next_story_chapter() diff --git a/game/script/10.an-excellent-reason-to-start-abusing-mod-powers.rpy b/game/script/10.an-excellent-reason-to-start-abusing-mod-powers.rpy index eed95dc..e525e4e 100644 --- a/game/script/10.an-excellent-reason-to-start-abusing-mod-powers.rpy +++ b/game/script/10.an-excellent-reason-to-start-abusing-mod-powers.rpy @@ -550,4 +550,4 @@ label chapter_10: window auto pause 1 - return + $ next_story_chapter() diff --git a/game/script/11.school-assignment-and-route-lock.rpy b/game/script/11.school-assignment-and-route-lock.rpy index ad78761..2b47b73 100644 --- a/game/script/11.school-assignment-and-route-lock.rpy +++ b/game/script/11.school-assignment-and-route-lock.rpy @@ -588,7 +588,7 @@ label chapter_11: if ending_score == 4: # Golden jump lSortingThings - elif _return == 3: # tradwife + elif ending_score == 3: # tradwife jump lMendingThings else: jump lBreakingThings # All else fails, go to shooter. @@ -5468,7 +5468,7 @@ label chapter_11: # skip this segment if we're doing ending 1 if ending_score == 1: #shooter - return + $ next_story_chapter() # the following segment makes sense in the context of 11B+11C+11D window hide @@ -5564,4 +5564,4 @@ label chapter_11: A "Anyways, where were we?" - return + $ next_story_chapter() diff --git a/game/script/2.fourth-day-of-school.rpy b/game/script/2.fourth-day-of-school.rpy index e5294d1..a3b192f 100644 --- a/game/script/2.fourth-day-of-school.rpy +++ b/game/script/2.fourth-day-of-school.rpy @@ -2604,4 +2604,4 @@ label chapter_2: "{cps=*.05}...{/cps}" pause .5 - return + $ next_story_chapter() diff --git a/game/script/3.showing-up-at-band-practice-and-giving-feedback.rpy b/game/script/3.showing-up-at-band-practice-and-giving-feedback.rpy index 51a28d8..695f311 100644 --- a/game/script/3.showing-up-at-band-practice-and-giving-feedback.rpy +++ b/game/script/3.showing-up-at-band-practice-and-giving-feedback.rpy @@ -2291,4 +2291,4 @@ label chapter_3: "{cps=*.1}...{/cps}" - return + $ next_story_chapter() diff --git a/game/script/4.anon-needs-help-during-music-period.rpy b/game/script/4.anon-needs-help-during-music-period.rpy index cf2c459..a6533a1 100644 --- a/game/script/4.anon-needs-help-during-music-period.rpy +++ b/game/script/4.anon-needs-help-during-music-period.rpy @@ -1422,4 +1422,4 @@ label chapter_4: window auto pause .5 - return + $ next_story_chapter() diff --git a/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy b/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy index 3345a24..1057c59 100644 --- a/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy +++ b/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy @@ -4665,7 +4665,7 @@ label chapter_5: window auto pause 1 - return + $ next_story_chapter() # I'm guessing this is for the gallery? label fang_movie: diff --git a/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy b/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy index 74e31a7..87ccb2f 100644 --- a/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy +++ b/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy @@ -4677,4 +4677,4 @@ label chapter_6: window auto pause 1 - return + $ next_story_chapter() diff --git a/game/script/7.concert-day.rpy b/game/script/7.concert-day.rpy index 5d65fae..a974a75 100644 --- a/game/script/7.concert-day.rpy +++ b/game/script/7.concert-day.rpy @@ -1736,4 +1736,4 @@ label chapter_7: "{cps=*.1}...{/cps}" pause 0.5 - return + $ next_story_chapter() diff --git a/game/script/8.anon-and-fang-study-together.rpy b/game/script/8.anon-and-fang-study-together.rpy index 75c26ae..030dbcf 100644 --- a/game/script/8.anon-and-fang-study-together.rpy +++ b/game/script/8.anon-and-fang-study-together.rpy @@ -1567,7 +1567,7 @@ label chapter_8: window hide window auto - return + $ next_story_chapter() label lGetStartedOnStudy: pause 0.5 @@ -2156,4 +2156,5 @@ label chapter_8: "{cps=*.1}...{/cps}" window hide window auto - return + + $ next_story_chapter() diff --git a/game/script/9.anons'-dirty-laundry-gets-put-up-to-air.rpy b/game/script/9.anons'-dirty-laundry-gets-put-up-to-air.rpy index 1a88615..6e52427 100644 --- a/game/script/9.anons'-dirty-laundry-gets-put-up-to-air.rpy +++ b/game/script/9.anons'-dirty-laundry-gets-put-up-to-air.rpy @@ -2171,4 +2171,4 @@ label chapter_9: window auto pause .5 - return + $ next_story_chapter() From c68090bf588382cabaa44955c7ff1b77f282d85f Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 8 Aug 2024 22:31:18 -0300 Subject: [PATCH 007/105] Replace return calls in ending chapters --- game/script/11A.fang-desperately-wants-to-win-prom-night.rpy | 2 +- ...non-gets-fangs'-pronouns-right,-and-she's-smug-about-it.rpy | 2 +- ...,-but-she-tells-him-she's-okay-with-being-called-a-girl.rpy | 2 +- ...-teases-him-while-carrying-herself-with-more-confidence.rpy | 2 +- game/script/12.5C.prom-night-intro.rpy | 2 +- game/script/12.5D.prom-night-intro.rpy | 2 +- game/script/12A.music-museum-date.rpy | 2 +- game/script/12B.band-fang-likes-concert.rpy | 2 +- game/script/12C.anon-fang-lovey-dovey.rpy | 2 +- game/script/12D.aquarium.rpy | 2 +- game/script/13A.fang-loses-it-after-losing-prom-queen.rpy | 2 +- game/script/13B.fang-breaks-up-with-anon.rpy | 2 +- game/script/13C.fang-and-anon-go-to-beach-and-prom.rpy | 2 +- ...lks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy | 2 +- game/script/14A.KO_OP-ending.rpy | 3 ++- game/script/14B.bad-ending.rpy | 2 +- game/script/14C.good-ending.rpy | 3 ++- game/script/14D.gold-ending.rpy | 3 ++- 18 files changed, 21 insertions(+), 18 deletions(-) diff --git a/game/script/11A.fang-desperately-wants-to-win-prom-night.rpy b/game/script/11A.fang-desperately-wants-to-win-prom-night.rpy index 8f0f0f2..3b038d8 100644 --- a/game/script/11A.fang-desperately-wants-to-win-prom-night.rpy +++ b/game/script/11A.fang-desperately-wants-to-win-prom-night.rpy @@ -158,4 +158,4 @@ label chapter_11A: window auto pause .5 - return \ No newline at end of file + $ next_ending_chapter() \ No newline at end of file diff --git a/game/script/11B.anon-gets-fangs'-pronouns-right,-and-she's-smug-about-it.rpy b/game/script/11B.anon-gets-fangs'-pronouns-right,-and-she's-smug-about-it.rpy index 52fb41d..897c1e1 100644 --- a/game/script/11B.anon-gets-fangs'-pronouns-right,-and-she's-smug-about-it.rpy +++ b/game/script/11B.anon-gets-fangs'-pronouns-right,-and-she's-smug-about-it.rpy @@ -173,4 +173,4 @@ label chapter_11B: window auto pause 1 - return \ No newline at end of file + $ next_ending_chapter() \ No newline at end of file diff --git a/game/script/11C.anon-gets-fangs'-pronouns-right,-but-she-tells-him-she's-okay-with-being-called-a-girl.rpy b/game/script/11C.anon-gets-fangs'-pronouns-right,-but-she-tells-him-she's-okay-with-being-called-a-girl.rpy index 12ecc7a..f4730a3 100644 --- a/game/script/11C.anon-gets-fangs'-pronouns-right,-but-she-tells-him-she's-okay-with-being-called-a-girl.rpy +++ b/game/script/11C.anon-gets-fangs'-pronouns-right,-but-she-tells-him-she's-okay-with-being-called-a-girl.rpy @@ -302,4 +302,4 @@ label chapter_11C: "{cps=*.1}...{/cps}" pause .5 - return \ No newline at end of file + $ next_ending_chapter() \ No newline at end of file diff --git a/game/script/11D.anon-gets-fangs'-pronouns-right-and-she-teases-him-while-carrying-herself-with-more-confidence.rpy b/game/script/11D.anon-gets-fangs'-pronouns-right-and-she-teases-him-while-carrying-herself-with-more-confidence.rpy index d0ab3a3..bc58908 100644 --- a/game/script/11D.anon-gets-fangs'-pronouns-right-and-she-teases-him-while-carrying-herself-with-more-confidence.rpy +++ b/game/script/11D.anon-gets-fangs'-pronouns-right-and-she-teases-him-while-carrying-herself-with-more-confidence.rpy @@ -392,4 +392,4 @@ label chapter_11D: "{cps=*.1}...{/cps}" pause .5 - return + $ next_ending_chapter() diff --git a/game/script/12.5C.prom-night-intro.rpy b/game/script/12.5C.prom-night-intro.rpy index 8757fac..7bfe9a9 100644 --- a/game/script/12.5C.prom-night-intro.rpy +++ b/game/script/12.5C.prom-night-intro.rpy @@ -445,4 +445,4 @@ label chapter_12_5C: window hide window auto - return + $ next_ending_chapter() diff --git a/game/script/12.5D.prom-night-intro.rpy b/game/script/12.5D.prom-night-intro.rpy index 1206149..2105f36 100644 --- a/game/script/12.5D.prom-night-intro.rpy +++ b/game/script/12.5D.prom-night-intro.rpy @@ -443,4 +443,4 @@ label chapter_12_5D: F "Oh, Anon, you’re already here!" - return + $ next_ending_chapter() diff --git a/game/script/12A.music-museum-date.rpy b/game/script/12A.music-museum-date.rpy index 765d6f1..6229286 100644 --- a/game/script/12A.music-museum-date.rpy +++ b/game/script/12A.music-museum-date.rpy @@ -1034,4 +1034,4 @@ label chapter_12A: window hide window auto - return + $ next_ending_chapter() diff --git a/game/script/12B.band-fang-likes-concert.rpy b/game/script/12B.band-fang-likes-concert.rpy index 2c78e29..e6d547f 100644 --- a/game/script/12B.band-fang-likes-concert.rpy +++ b/game/script/12B.band-fang-likes-concert.rpy @@ -591,4 +591,4 @@ label chapter_12B: window auto pause 1 - return + $ next_ending_chapter() diff --git a/game/script/12C.anon-fang-lovey-dovey.rpy b/game/script/12C.anon-fang-lovey-dovey.rpy index 5f6b649..ff31a67 100644 --- a/game/script/12C.anon-fang-lovey-dovey.rpy +++ b/game/script/12C.anon-fang-lovey-dovey.rpy @@ -901,4 +901,4 @@ label chapter_12C: window auto pause 1 - return + $ next_ending_chapter() diff --git a/game/script/12D.aquarium.rpy b/game/script/12D.aquarium.rpy index 910333b..54907e6 100644 --- a/game/script/12D.aquarium.rpy +++ b/game/script/12D.aquarium.rpy @@ -781,4 +781,4 @@ label chapter_12D: "{cps=*0.1}...{/cps}" - return + $ next_ending_chapter() diff --git a/game/script/13A.fang-loses-it-after-losing-prom-queen.rpy b/game/script/13A.fang-loses-it-after-losing-prom-queen.rpy index 13b957f..24123a3 100644 --- a/game/script/13A.fang-loses-it-after-losing-prom-queen.rpy +++ b/game/script/13A.fang-loses-it-after-losing-prom-queen.rpy @@ -1797,4 +1797,4 @@ label chapter_13A: window auto pause 1 - return + $ next_ending_chapter() diff --git a/game/script/13B.fang-breaks-up-with-anon.rpy b/game/script/13B.fang-breaks-up-with-anon.rpy index 25dc559..b084ea4 100644 --- a/game/script/13B.fang-breaks-up-with-anon.rpy +++ b/game/script/13B.fang-breaks-up-with-anon.rpy @@ -1048,4 +1048,4 @@ label chapter_13B: window auto pause 1 - return + $ next_ending_chapter() diff --git a/game/script/13C.fang-and-anon-go-to-beach-and-prom.rpy b/game/script/13C.fang-and-anon-go-to-beach-and-prom.rpy index a650d2f..b51c233 100644 --- a/game/script/13C.fang-and-anon-go-to-beach-and-prom.rpy +++ b/game/script/13C.fang-and-anon-go-to-beach-and-prom.rpy @@ -4604,4 +4604,4 @@ label chapter_13C: #end of new stuff - return \ No newline at end of file + $ next_ending_chapter() \ No newline at end of file diff --git a/game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy b/game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy index 077017c..c70627c 100644 --- a/game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy +++ b/game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy @@ -4053,4 +4053,4 @@ label chapter_13D: "{cps=*.1}...{/cps}" pause 0.5 - return + $ next_ending_chapter() diff --git a/game/script/14A.KO_OP-ending.rpy b/game/script/14A.KO_OP-ending.rpy index 529280c..5b9e2d5 100644 --- a/game/script/14A.KO_OP-ending.rpy +++ b/game/script/14A.KO_OP-ending.rpy @@ -1442,4 +1442,5 @@ label chapter_14A: pause 5 $ renpy.music.set_volume(1, 0, 'ambient') - return + + $ next_ending_chapter() diff --git a/game/script/14B.bad-ending.rpy b/game/script/14B.bad-ending.rpy index 512c844..e3a1be0 100644 --- a/game/script/14B.bad-ending.rpy +++ b/game/script/14B.bad-ending.rpy @@ -350,4 +350,4 @@ label chapter_14B: scene black with Dissolve(3) pause 2 - return + $ next_ending_chapter() diff --git a/game/script/14C.good-ending.rpy b/game/script/14C.good-ending.rpy index bbfeb24..275af6d 100644 --- a/game/script/14C.good-ending.rpy +++ b/game/script/14C.good-ending.rpy @@ -1014,4 +1014,5 @@ label chapter_14C: pause 1.0 stop music $ renpy.music.set_volume(1, 0, 'music') - return + + $ next_ending_chapter() diff --git a/game/script/14D.gold-ending.rpy b/game/script/14D.gold-ending.rpy index 320f93e..0da03f0 100644 --- a/game/script/14D.gold-ending.rpy +++ b/game/script/14D.gold-ending.rpy @@ -898,4 +898,5 @@ label chapter_14D: pause 16 scene black with Dissolve(1.0) pause 1 - return + + $ next_ending_chapter() From 366c62d484354880b12a14fe514b3493db67a8f0 Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 8 Aug 2024 22:42:08 -0300 Subject: [PATCH 008/105] Comment out storyline and get_ending labels --- game/storyline.rpy | 84 +++++++++++++++++++++++----------------------- game/utility.rpy | 22 ++++++------ 2 files changed, 53 insertions(+), 53 deletions(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index 4014bbd..3833f93 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -78,45 +78,45 @@ init python: return -label storyline: - call chapter_1 from _call_chapter_1 - call chapter_2 from _call_chapter_2 - call chapter_3 from _call_chapter_3 - call chapter_4 from _call_chapter_4 - call chapter_5 from _call_chapter_5 - call chapter_6 from _call_chapter_6 - call chapter_7 from _call_chapter_7 - call chapter_8 from _call_chapter_8 - call chapter_9 from _call_chapter_9 - call chapter_10 from _call_chapter_10 - call chapter_11 from _call_chapter_11 - call get_ending from _call_get_ending_5 - if _return == 4: - call chapter_11D from _call_chapter_11D - call chapter_12D from _call_chapter_12D - call chapter_12_5D from _call_chapter_12_5D - call chapter_13D from _call_chapter_13D - call chapter_14D from _call_chapter_14D - elif _return == 3: - call chapter_11C from _call_chapter_11C - call chapter_12C from _call_chapter_12C - call chapter_12_5C from _call_chapter_12_5C - call chapter_13C from _call_chapter_13C - call chapter_14C from _call_chapter_14C - elif _return == 2: - call chapter_11B from _call_chapter_11B - call chapter_12B from _call_chapter_12B - # no chapter_13 here since the scene is different enough to the other routes for everything to go into 13C - call chapter_13B from _call_chapter_13B - call chapter_14B from _call_chapter_14B - else: # if all else fails, we just assume that we got Endings.Shooter - call chapter_11A from _call_chapter_11A - call chapter_12A from _call_chapter_12A - call chapter_12_5D from _call_chapter_12_5D_1 - call chapter_13A from _call_chapter_13A - call chapter_14A from _call_chapter_14A - $ ending_image() - $ renpy.quit() - $ ending_image() - call lending from _call_lending - return \ No newline at end of file +# label storyline: +# call chapter_1 from _call_chapter_1 +# call chapter_2 from _call_chapter_2 +# call chapter_3 from _call_chapter_3 +# call chapter_4 from _call_chapter_4 +# call chapter_5 from _call_chapter_5 +# call chapter_6 from _call_chapter_6 +# call chapter_7 from _call_chapter_7 +# call chapter_8 from _call_chapter_8 +# call chapter_9 from _call_chapter_9 +# call chapter_10 from _call_chapter_10 +# call chapter_11 from _call_chapter_11 +# call get_ending from _call_get_ending_5 +# if _return == 4: +# call chapter_11D from _call_chapter_11D +# call chapter_12D from _call_chapter_12D +# call chapter_12_5D from _call_chapter_12_5D +# call chapter_13D from _call_chapter_13D +# call chapter_14D from _call_chapter_14D +# elif _return == 3: +# call chapter_11C from _call_chapter_11C +# call chapter_12C from _call_chapter_12C +# call chapter_12_5C from _call_chapter_12_5C +# call chapter_13C from _call_chapter_13C +# call chapter_14C from _call_chapter_14C +# elif _return == 2: +# call chapter_11B from _call_chapter_11B +# call chapter_12B from _call_chapter_12B +# # no chapter_13 here since the scene is different enough to the other routes for everything to go into 13C +# call chapter_13B from _call_chapter_13B +# call chapter_14B from _call_chapter_14B +# else: # if all else fails, we just assume that we got Endings.Shooter +# call chapter_11A from _call_chapter_11A +# call chapter_12A from _call_chapter_12A +# call chapter_12_5D from _call_chapter_12_5D_1 +# call chapter_13A from _call_chapter_13A +# call chapter_14A from _call_chapter_14A +# $ ending_image() +# $ renpy.quit() +# $ ending_image() +# call lending from _call_lending +# return \ No newline at end of file diff --git a/game/utility.rpy b/game/utility.rpy index ce4bf65..06abf1c 100644 --- a/game/utility.rpy +++ b/game/utility.rpy @@ -9,17 +9,17 @@ label initstats(anon=0, fang=0): $ fangscore = fang return -label get_ending: - # To check what ending we're getting, call this label and then check the value of _return - # Sensible to have this logic defined in only one place for consistency - if anonscore >= 4 and fangscore >= 4 and wingStory: - return(4) # Golden - elif anonscore >= 3 and fangscore <=4: - return(3) # Tradwife - elif anonscore <= 3 and fangscore >=3: - return(2) # Doomer - else: - return(1) # Shooter +# label get_ending: +# # To check what ending we're getting, call this label and then check the value of _return +# # Sensible to have this logic defined in only one place for consistency +# if anonscore >= 4 and fangscore >= 4 and wingStory: +# return(4) # Golden +# elif anonscore >= 3 and fangscore <=4: +# return(3) # Tradwife +# elif anonscore <= 3 and fangscore >=3: +# return(2) # Doomer +# else: +# return(1) # Shooter init python: From 6a32d84d2400249e39c47b37056285e5ef45174d Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 11 Aug 2024 23:13:20 -0300 Subject: [PATCH 009/105] Add missing logic to 'next_story_chapter' function Modify define statements --- game/storyline.rpy | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index 3833f93..143e344 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -14,16 +14,15 @@ define ending_routes = { 1: ["chapter_11A", "chapter_12A", "chapter_12_5D", "chapter_13A", "chapter_14A"] } -# Index number for the current position of the general chapters array -define chapter_index = 0 - -# This will store the name of the label as a string -define current_chapter = None default chapters_array_length = len(general_chapters) - 1 -define ending_route_number = None -define ending_chapter_index = 0 +default chapter_index = 0 # Index number for the current position of the general chapters array + +default current_chapter = general_chapters[chapter_index] # This stores the name of the label as a string + +default ending_route_number = None +default ending_chapter_index = 0 init -1 python: @@ -51,6 +50,11 @@ init python: next_ending_chapter() return + chapter_index += 1 + current_chapter = general_chapters[chapter_index] + + renpy.call(current_chapter) + def is_end_of_chapters(): return chapter_index >= chapters_array_length From 0a4ab9609ab200923f0101892e690c8bc8544994 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 11 Aug 2024 23:15:13 -0300 Subject: [PATCH 010/105] Implement use of 'initstats' label during start --- game/script.rpy | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/game/script.rpy b/game/script.rpy index 465c647..c09df6d 100644 --- a/game/script.rpy +++ b/game/script.rpy @@ -322,9 +322,8 @@ transform scloserleft: label start: - $ fangscore = 0 - $ anonscore = 0 - $ wingStory = False + + call initstats(anon = 0, fang = 0) from _call_initstats pause 1.0 From afb67298ecc0d197a5ac511265a9bfaa6a3284d2 Mon Sep 17 00:00:00 2001 From: Iggy Date: Wed, 14 Aug 2024 22:25:47 -0300 Subject: [PATCH 011/105] Implement updated way of playing movies --- ....fang-and-anon-cut-class-to-talk-on-the-roof.rpy | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy b/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy index 1057c59..6e55222 100644 --- a/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy +++ b/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy @@ -7,6 +7,8 @@ init python: renpy.play('audio/effects/carKick2.ogg', channel='audio') # renpy.play('audio/effects/carSuspension1.ogg', channel='audio') +image fang_tail_movie = Movie(channel="movie_dp", loop=True, play="images/animations/fang tail.webm") # New way of playing movies as of Renpy 8.1 + label chapter_5: # Gardening Club @@ -551,7 +553,7 @@ label chapter_5: show anon: easein_back 0.5 xalign 0.2 - label movie: + # label movie: play sound 'audio/effects/slapstickPunch.ogg' A "FANG!" with vpunch @@ -559,7 +561,8 @@ label chapter_5: play ambient 'audio/effects/clipLoop.ogg' fadein 1 play ambient1 'audio/effects/outdoorNatureLoop.ogg' fadein 1 - scene fang tail with Dissolve(1) + # scene fang tail with Dissolve(1) + show fang_tail_movie with Dissolve(1) # change how the movie is played "Through my blurred vision I can make out Fang’s tail, slowly shifting side to side." @@ -4668,6 +4671,6 @@ label chapter_5: $ next_story_chapter() # I'm guessing this is for the gallery? -label fang_movie: - scene fang tail with fade - "" +# label fang_movie: +# scene fang tail with fade +# "" From 88279e9601e601771d4977cf7b6d4df766ab82cd Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 16 Aug 2024 20:56:58 -0300 Subject: [PATCH 012/105] - Implement debug_story_variables function - Modify initstats label to handle debugging and wingStory variable --- game/options.rpy | 5 +++++ game/screens.rpy | 13 +++++++++++++ game/utility.rpy | 24 ++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/game/options.rpy b/game/options.rpy index 36fe2ea..a75d0cf 100644 --- a/game/options.rpy +++ b/game/options.rpy @@ -133,6 +133,11 @@ default preferences.text_cps = 50 default preferences.afm_time = 15 +init -999 python: + config.developer = "auto" + +default persistent.enable_debug_scores = config.developer + ##Default Audio is not ear rape define config.default_music_volume = 0.48 define config.default_sfx_volume = 0.80 diff --git a/game/screens.rpy b/game/screens.rpy index fd0019d..6da6f53 100644 --- a/game/screens.rpy +++ b/game/screens.rpy @@ -992,6 +992,19 @@ screen preferences(): textbutton _("After Choices") action [Function(onclick_audio, preferences.skip_after_choices), ToggleVariable("preferences.skip_after_choices", True, False)] textbutton _("Transitions") action [Function(onclick_audio, preferences.transitions, True), ToggleVariable("preferences.transitions", 0, 2)] + if config.developer: + vbox: + style_prefix "check" + label _("Developer Tools") + textbutton _("Enable Debug Scores") action ToggleVariable("persistent.enable_debug_scores", True, False) + + if not main_menu: + if config.developer and persistent.enable_debug_scores: + $ debug_story_variables(False) + $ debug_story_variables(True) + else: + $ debug_story_variables(False) + vbox: xsize 676 style_prefix "check" diff --git a/game/utility.rpy b/game/utility.rpy index 06abf1c..4c76e2f 100644 --- a/game/utility.rpy +++ b/game/utility.rpy @@ -7,6 +7,12 @@ label initstats(anon=0, fang=0): # :param bool trad: Tradwife ending flag $ anonscore = anon $ fangscore = fang + $ wingStory = False + + if persistent.enable_debug_scores: + $ debug_story_variables(False) + $ debug_story_variables(True) + return # label get_ending: @@ -32,3 +38,21 @@ init python: return 2 # Doomer else: return 1 # Shooter + + + def debug_story_variables(toggle=True, use_ending_chapter=False): + var_list = [ + "anonscore", + "fangscore", + "current_general_chapter" if not use_ending_chapter else "current_ending_chapter", + "chapter_index", + "ending_route_number", + "ending_chapter_index" + ] + + for item in var_list: + if toggle: + renpy.watch(item) + else: + renpy.unwatch(item) + From 4a2a62478dd0b3eb280b67eab3ac8383ef1e12d5 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 16 Aug 2024 20:58:32 -0300 Subject: [PATCH 013/105] Call main menu after credits --- game/src/credits.rpy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/game/src/credits.rpy b/game/src/credits.rpy index ab68d72..4a7afd7 100644 --- a/game/src/credits.rpy +++ b/game/src/credits.rpy @@ -314,4 +314,5 @@ label lending: pause 20 scene black with Dissolve(2) pause 1 - return + + $ MainMenu(confirm=False)() # Exits to the main menu From 14b7d1a6ea134c84d22a650376f0f7a49d3535a6 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 16 Aug 2024 21:01:55 -0300 Subject: [PATCH 014/105] Storyline optimizations and fixes --- game/storyline.rpy | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index 143e344..c3bdede 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -19,9 +19,12 @@ default chapters_array_length = len(general_chapters) - 1 default chapter_index = 0 # Index number for the current position of the general chapters array -default current_chapter = general_chapters[chapter_index] # This stores the name of the label as a string +# This stores the name of the label as a string +# When starting a new game, it takes the first element of the general_chapters array +default current_general_chapter = general_chapters[chapter_index] default ending_route_number = None +default current_ending_chapter = None default ending_chapter_index = 0 @@ -42,18 +45,18 @@ init python: def next_story_chapter(): global chapter_index - global current_chapter + global current_general_chapter global ending_route_number if is_end_of_chapters(): ending_route_number = get_ending() next_ending_chapter() - return + # return chapter_index += 1 - current_chapter = general_chapters[chapter_index] + current_general_chapter = general_chapters[chapter_index] - renpy.call(current_chapter) + renpy.call(current_general_chapter) def is_end_of_chapters(): @@ -61,27 +64,42 @@ init python: def next_ending_chapter(): - global ending_route_number, ending_chapter_index + global ending_route_number + global ending_chapter_index + global current_ending_chapter if ending_route_number in ending_routes: # Save the ending chapters array from # the ending_routes dictionary - current_ending_list = ending_routes[ending_route_number] + current_ending_list: list[str] = ending_routes[ending_route_number] + + reset_debug_scores() if ending_chapter_index < len(current_ending_list): # Stores the label name from the current_ending_list array in the item variable - item = current_ending_list[ending_chapter_index] + current_ending_chapter = current_ending_list[ending_chapter_index] + # The item is assigned first and then increase the ending_chapter_index as it can't be done after using renpy.jump() + # Increases the index and jumps to the label ending_chapter_index += 1 - renpy.jump(item) + renpy.jump(current_ending_chapter) else: # We've reached the end of the final chapters ending_image() renpy.call("lending") - return else: return + def reset_debug_scores(): + global current_general_chapter + + current_general_chapter = None + + if config.developer and persistent.enable_debug_scores: + debug_story_variables(False) + debug_story_variables(True, True) + + # label storyline: # call chapter_1 from _call_chapter_1 # call chapter_2 from _call_chapter_2 From e4d7b18bf24b2a2fa06ab53f52155e3781b92117 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sat, 17 Aug 2024 12:07:11 -0300 Subject: [PATCH 015/105] Chapter 8 choices formatting --- game/script/8.anon-and-fang-study-together.rpy | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/game/script/8.anon-and-fang-study-together.rpy b/game/script/8.anon-and-fang-study-together.rpy index 030dbcf..95695f0 100644 --- a/game/script/8.anon-and-fang-study-together.rpy +++ b/game/script/8.anon-and-fang-study-together.rpy @@ -622,8 +622,10 @@ label chapter_8: pause .5 python: - choices = [(_('Play The Guitar'), 'lLetFangPlayGuit'), - (_('Get to Studying'), 'lGetStartedOnStudy')] + choices = [ + (_('Play The Guitar'), 'lLetFangPlayGuit'), + (_('Get to Studying'), 'lGetStartedOnStudy')] + renpy.jump(renpy.display_menu(randomize_choices(choices))) From fc903d08fbc0081cbcfb652861c3da716ce6dc53 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sat, 17 Aug 2024 13:24:22 -0300 Subject: [PATCH 016/105] Modify debug_story_variables to append or remove elements accordingly --- game/utility.rpy | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/game/utility.rpy b/game/utility.rpy index 4c76e2f..06a7ece 100644 --- a/game/utility.rpy +++ b/game/utility.rpy @@ -44,11 +44,16 @@ init python: var_list = [ "anonscore", "fangscore", - "current_general_chapter" if not use_ending_chapter else "current_ending_chapter", "chapter_index", "ending_route_number", "ending_chapter_index" ] + + if use_ending_chapter: + var_list.remove("chapter_index") + var_list.append("current_ending_chapter") + else: + var_list.append("current_general_chapter") for item in var_list: if toggle: @@ -56,3 +61,4 @@ init python: else: renpy.unwatch(item) + From f8aa9d04594ee9d2132b0cd3101f8919d8e5430c Mon Sep 17 00:00:00 2001 From: Iggy Date: Sat, 17 Aug 2024 13:25:05 -0300 Subject: [PATCH 017/105] Change call order for reset_debug_scores function --- game/storyline.rpy | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index c3bdede..8caf4aa 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -50,6 +50,7 @@ init python: if is_end_of_chapters(): ending_route_number = get_ending() + reset_debug_scores() next_ending_chapter() # return @@ -73,8 +74,6 @@ init python: # the ending_routes dictionary current_ending_list: list[str] = ending_routes[ending_route_number] - reset_debug_scores() - if ending_chapter_index < len(current_ending_list): # Stores the label name from the current_ending_list array in the item variable current_ending_chapter = current_ending_list[ending_chapter_index] @@ -91,10 +90,6 @@ init python: def reset_debug_scores(): - global current_general_chapter - - current_general_chapter = None - if config.developer and persistent.enable_debug_scores: debug_story_variables(False) debug_story_variables(True, True) From 1864a917dc3628d42dbc56381b2135bff47efd65 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sat, 17 Aug 2024 13:26:00 -0300 Subject: [PATCH 018/105] get_ending formatting --- game/utility.rpy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game/utility.rpy b/game/utility.rpy index 06a7ece..85a905f 100644 --- a/game/utility.rpy +++ b/game/utility.rpy @@ -32,9 +32,9 @@ init python: def get_ending(): if anonscore >= 4 and fangscore >= 4 and wingStory: return 4 # Golden - elif anonscore >= 3 and fangscore <=4: + elif anonscore >= 3 and fangscore <= 4: return 3 # Tradwife - elif anonscore <= 3 and fangscore >=3: + elif anonscore <= 3 and fangscore >= 3: return 2 # Doomer else: return 1 # Shooter From 97cc4252d50a13d405a22822b914285f7d6578bf Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 18 Aug 2024 12:41:03 -0300 Subject: [PATCH 019/105] Update FallingSky font to fix issue with words containing 'ft' --- game/gui/FallingSky.otf | Bin 106680 -> 148816 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/game/gui/FallingSky.otf b/game/gui/FallingSky.otf index 3405a8e61d08704a1257fcfb2ce0e365e37d751f..0fa43fccd7efe6070a883653e3dd744509d348ce 100644 GIT binary patch literal 148816 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%0D97vJ#Z~ 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
    `1G=SI<1h<-u-+ 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’@Pz%yO2uoi!HwN{w^ynZZ*`8k?3$VwzjJ43ypL~a zguj1cM2ZQ(lqGKpmb`=Z$gNi2R#LUu4vn%iDZSB(RTXxrl=)+MR~U3CfR8HJ6XpVW z%1;&Ss~124=~Yh}5f`H<8xe__FM-Me*_wS9VA>0 ze-fkz8<8d{Y}Z7De{CPWu6YTtPvO9dKiF;!qjW7FXHj-DZ=fAa!KojK)aRP?D>%Su zlnEHc?X-HXYEo74f>icwE{Wnl~W7gA14i?z}O#b0ju z3mTS{X)Ulp1^b5TWH8a${FUna4IOjSL;!e=8yF2y`KMMhQZX#_#%L;=(b8fV zLAfjhnnSs)*|{rJrn+@0$MuMET-Pbb^@t9euhU78M|2Y8I_0#EyqflUJ@Iwh!v9_eu0v1+6wUN#*K9ZcEy%?YVt~(64J+;NesHU84_A zJ_Y$JdGm%yZOQfM(?NT&p}VI|08R_6A4n5rMlj;lwUpYqo4JSRyvs>Fvg96M*}@*m z7K7Ye)-{tc|8WYlwDPkEV}*e~Ne0Q`$k9JdT6Mjq{Fzex1E{9iBblyEhd?8zWD^vd zWPWhx=I%JNWd)_2+o@oG2UcB5JFPYTI{HBlAZ8E9`Ib3^y+<`9(-Ce8J@Eyh|E8he z)6jnx5Smp5rU{=HJbmAi==&#?JScdKTtGo^ES1u2f%@UyN)j$Iwlv&{p^3nPY@`Ba zTP99i3yY4Uyq=9r0Mc2;T#3q3?*pO(zCar8GoTG;nMFw}f26vp?=w&-HuNW$&QgWM z4L;yhtYa|{-m5vj+Lp$KmC%R{W*VEVjjAQDA{^p+FCB#pl4|*d-f|S%KW$0=Kw-==gGvI#qjx1|G+pySD%#H}t8e>&#f7N{wWU$^oyN0}vhNFW5ef5mI?BDPKJ%e>J^#XddG^r3HdmkxZlK

    FP?_RD_s)J*s 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 Date: Sun, 18 Aug 2024 12:44:54 -0300 Subject: [PATCH 020/105] Remove init -999 python block for config.developer --- game/options.rpy | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/game/options.rpy b/game/options.rpy index a75d0cf..bbbe1f9 100644 --- a/game/options.rpy +++ b/game/options.rpy @@ -133,8 +133,7 @@ default preferences.text_cps = 50 default preferences.afm_time = 15 -init -999 python: - config.developer = "auto" +define config.developer = "auto" default persistent.enable_debug_scores = config.developer From 66d4b308af0517193bee68073cf2d5e756e8c4d3 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 18 Aug 2024 12:46:40 -0300 Subject: [PATCH 021/105] Delete commented lines from the storyline label --- game/storyline.rpy | 44 -------------------------------------------- 1 file changed, 44 deletions(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index 8caf4aa..0b2e4b5 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -93,47 +93,3 @@ init python: if config.developer and persistent.enable_debug_scores: debug_story_variables(False) debug_story_variables(True, True) - - -# label storyline: -# call chapter_1 from _call_chapter_1 -# call chapter_2 from _call_chapter_2 -# call chapter_3 from _call_chapter_3 -# call chapter_4 from _call_chapter_4 -# call chapter_5 from _call_chapter_5 -# call chapter_6 from _call_chapter_6 -# call chapter_7 from _call_chapter_7 -# call chapter_8 from _call_chapter_8 -# call chapter_9 from _call_chapter_9 -# call chapter_10 from _call_chapter_10 -# call chapter_11 from _call_chapter_11 -# call get_ending from _call_get_ending_5 -# if _return == 4: -# call chapter_11D from _call_chapter_11D -# call chapter_12D from _call_chapter_12D -# call chapter_12_5D from _call_chapter_12_5D -# call chapter_13D from _call_chapter_13D -# call chapter_14D from _call_chapter_14D -# elif _return == 3: -# call chapter_11C from _call_chapter_11C -# call chapter_12C from _call_chapter_12C -# call chapter_12_5C from _call_chapter_12_5C -# call chapter_13C from _call_chapter_13C -# call chapter_14C from _call_chapter_14C -# elif _return == 2: -# call chapter_11B from _call_chapter_11B -# call chapter_12B from _call_chapter_12B -# # no chapter_13 here since the scene is different enough to the other routes for everything to go into 13C -# call chapter_13B from _call_chapter_13B -# call chapter_14B from _call_chapter_14B -# else: # if all else fails, we just assume that we got Endings.Shooter -# call chapter_11A from _call_chapter_11A -# call chapter_12A from _call_chapter_12A -# call chapter_12_5D from _call_chapter_12_5D_1 -# call chapter_13A from _call_chapter_13A -# call chapter_14A from _call_chapter_14A -# $ ending_image() -# $ renpy.quit() -# $ ending_image() -# call lending from _call_lending -# return \ No newline at end of file From 01e9ababa229e5e469c0f36f5e215a833d3b81a4 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 18 Aug 2024 12:48:53 -0300 Subject: [PATCH 022/105] Delete commented lines from label get_ending --- game/utility.rpy | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/game/utility.rpy b/game/utility.rpy index 85a905f..850a522 100644 --- a/game/utility.rpy +++ b/game/utility.rpy @@ -15,18 +15,6 @@ label initstats(anon=0, fang=0): return -# label get_ending: -# # To check what ending we're getting, call this label and then check the value of _return -# # Sensible to have this logic defined in only one place for consistency -# if anonscore >= 4 and fangscore >= 4 and wingStory: -# return(4) # Golden -# elif anonscore >= 3 and fangscore <=4: -# return(3) # Tradwife -# elif anonscore <= 3 and fangscore >=3: -# return(2) # Doomer -# else: -# return(1) # Shooter - init python: def get_ending(): From ba0024f2514a2f3229c717ff0fe13b1fe5622ea9 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 18 Aug 2024 21:06:13 -0300 Subject: [PATCH 023/105] Modify storyline to extend the chapters array once the common chapters are finished --- game/storyline.rpy | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index 0b2e4b5..b72c40f 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -27,6 +27,8 @@ default ending_route_number = None default current_ending_chapter = None default ending_chapter_index = 0 +default is_end_reached = False + init -1 python: def ending_image(): @@ -47,23 +49,37 @@ init python: global chapter_index global current_general_chapter global ending_route_number + global is_end_reached - if is_end_of_chapters(): + if not is_end_reached and is_end_of_chapters(): ending_route_number = get_ending() - reset_debug_scores() - next_ending_chapter() - # return - - chapter_index += 1 - current_general_chapter = general_chapters[chapter_index] - - renpy.call(current_general_chapter) - + add_ending_chapters() + is_end_reached = True + + if chapter_index < chapters_array_length: + chapter_index += 1 + current_general_chapter = general_chapters[chapter_index] + renpy.call(current_general_chapter) + else: + ending_image() + renpy.call("lending") + def is_end_of_chapters(): return chapter_index >= chapters_array_length + def add_ending_chapters(): + global general_chapters + global chapters_array_length + + if ending_route_number in ending_routes: + general_chapters.extend(ending_routes[ending_route_number]) + chapters_array_length = len(general_chapters) - 1 + # renpy.block_rollback() BLOQUEAR O CAMBIARLO A TUPLE + general_chapters = tuple(general_chapters) + + def next_ending_chapter(): global ending_route_number global ending_chapter_index @@ -88,8 +104,3 @@ init python: else: return - - def reset_debug_scores(): - if config.developer and persistent.enable_debug_scores: - debug_story_variables(False) - debug_story_variables(True, True) From 70844519868b272cd0c497cc3a4a128ae087d4e9 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 18 Aug 2024 21:08:07 -0300 Subject: [PATCH 024/105] Modify ending chapters to use the next_story_chapter function --- game/script/11A.fang-desperately-wants-to-win-prom-night.rpy | 2 +- ...anon-gets-fangs'-pronouns-right,-and-she's-smug-about-it.rpy | 2 +- ...t,-but-she-tells-him-she's-okay-with-being-called-a-girl.rpy | 2 +- ...e-teases-him-while-carrying-herself-with-more-confidence.rpy | 2 +- game/script/12.5C.prom-night-intro.rpy | 2 +- game/script/12.5D.prom-night-intro.rpy | 2 +- game/script/12A.music-museum-date.rpy | 2 +- game/script/12B.band-fang-likes-concert.rpy | 2 +- game/script/12C.anon-fang-lovey-dovey.rpy | 2 +- game/script/12D.aquarium.rpy | 2 +- game/script/13A.fang-loses-it-after-losing-prom-queen.rpy | 2 +- game/script/13B.fang-breaks-up-with-anon.rpy | 2 +- game/script/13C.fang-and-anon-go-to-beach-and-prom.rpy | 2 +- ...alks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy | 2 +- game/script/14A.KO_OP-ending.rpy | 2 +- game/script/14B.bad-ending.rpy | 2 +- game/script/14C.good-ending.rpy | 2 +- game/script/14D.gold-ending.rpy | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/game/script/11A.fang-desperately-wants-to-win-prom-night.rpy b/game/script/11A.fang-desperately-wants-to-win-prom-night.rpy index 3b038d8..a71f117 100644 --- a/game/script/11A.fang-desperately-wants-to-win-prom-night.rpy +++ b/game/script/11A.fang-desperately-wants-to-win-prom-night.rpy @@ -158,4 +158,4 @@ label chapter_11A: window auto pause .5 - $ next_ending_chapter() \ No newline at end of file + $ next_story_chapter() \ No newline at end of file diff --git a/game/script/11B.anon-gets-fangs'-pronouns-right,-and-she's-smug-about-it.rpy b/game/script/11B.anon-gets-fangs'-pronouns-right,-and-she's-smug-about-it.rpy index 897c1e1..f701a78 100644 --- a/game/script/11B.anon-gets-fangs'-pronouns-right,-and-she's-smug-about-it.rpy +++ b/game/script/11B.anon-gets-fangs'-pronouns-right,-and-she's-smug-about-it.rpy @@ -173,4 +173,4 @@ label chapter_11B: window auto pause 1 - $ next_ending_chapter() \ No newline at end of file + $ next_story_chapter() \ No newline at end of file diff --git a/game/script/11C.anon-gets-fangs'-pronouns-right,-but-she-tells-him-she's-okay-with-being-called-a-girl.rpy b/game/script/11C.anon-gets-fangs'-pronouns-right,-but-she-tells-him-she's-okay-with-being-called-a-girl.rpy index f4730a3..3cb63f0 100644 --- a/game/script/11C.anon-gets-fangs'-pronouns-right,-but-she-tells-him-she's-okay-with-being-called-a-girl.rpy +++ b/game/script/11C.anon-gets-fangs'-pronouns-right,-but-she-tells-him-she's-okay-with-being-called-a-girl.rpy @@ -302,4 +302,4 @@ label chapter_11C: "{cps=*.1}...{/cps}" pause .5 - $ next_ending_chapter() \ No newline at end of file + $ next_story_chapter() \ No newline at end of file diff --git a/game/script/11D.anon-gets-fangs'-pronouns-right-and-she-teases-him-while-carrying-herself-with-more-confidence.rpy b/game/script/11D.anon-gets-fangs'-pronouns-right-and-she-teases-him-while-carrying-herself-with-more-confidence.rpy index bc58908..ec1a1c7 100644 --- a/game/script/11D.anon-gets-fangs'-pronouns-right-and-she-teases-him-while-carrying-herself-with-more-confidence.rpy +++ b/game/script/11D.anon-gets-fangs'-pronouns-right-and-she-teases-him-while-carrying-herself-with-more-confidence.rpy @@ -392,4 +392,4 @@ label chapter_11D: "{cps=*.1}...{/cps}" pause .5 - $ next_ending_chapter() + $ next_story_chapter() diff --git a/game/script/12.5C.prom-night-intro.rpy b/game/script/12.5C.prom-night-intro.rpy index 7bfe9a9..0fd96b8 100644 --- a/game/script/12.5C.prom-night-intro.rpy +++ b/game/script/12.5C.prom-night-intro.rpy @@ -445,4 +445,4 @@ label chapter_12_5C: window hide window auto - $ next_ending_chapter() + $ next_story_chapter() diff --git a/game/script/12.5D.prom-night-intro.rpy b/game/script/12.5D.prom-night-intro.rpy index 2105f36..3783289 100644 --- a/game/script/12.5D.prom-night-intro.rpy +++ b/game/script/12.5D.prom-night-intro.rpy @@ -443,4 +443,4 @@ label chapter_12_5D: F "Oh, Anon, you’re already here!" - $ next_ending_chapter() + $ next_story_chapter() diff --git a/game/script/12A.music-museum-date.rpy b/game/script/12A.music-museum-date.rpy index 6229286..72c1587 100644 --- a/game/script/12A.music-museum-date.rpy +++ b/game/script/12A.music-museum-date.rpy @@ -1034,4 +1034,4 @@ label chapter_12A: window hide window auto - $ next_ending_chapter() + $ next_story_chapter() diff --git a/game/script/12B.band-fang-likes-concert.rpy b/game/script/12B.band-fang-likes-concert.rpy index e6d547f..cfbb6b1 100644 --- a/game/script/12B.band-fang-likes-concert.rpy +++ b/game/script/12B.band-fang-likes-concert.rpy @@ -591,4 +591,4 @@ label chapter_12B: window auto pause 1 - $ next_ending_chapter() + $ next_story_chapter() diff --git a/game/script/12C.anon-fang-lovey-dovey.rpy b/game/script/12C.anon-fang-lovey-dovey.rpy index ff31a67..7d7f994 100644 --- a/game/script/12C.anon-fang-lovey-dovey.rpy +++ b/game/script/12C.anon-fang-lovey-dovey.rpy @@ -901,4 +901,4 @@ label chapter_12C: window auto pause 1 - $ next_ending_chapter() + $ next_story_chapter() diff --git a/game/script/12D.aquarium.rpy b/game/script/12D.aquarium.rpy index 54907e6..94fe2b9 100644 --- a/game/script/12D.aquarium.rpy +++ b/game/script/12D.aquarium.rpy @@ -781,4 +781,4 @@ label chapter_12D: "{cps=*0.1}...{/cps}" - $ next_ending_chapter() + $ next_story_chapter() diff --git a/game/script/13A.fang-loses-it-after-losing-prom-queen.rpy b/game/script/13A.fang-loses-it-after-losing-prom-queen.rpy index 24123a3..50d96ab 100644 --- a/game/script/13A.fang-loses-it-after-losing-prom-queen.rpy +++ b/game/script/13A.fang-loses-it-after-losing-prom-queen.rpy @@ -1797,4 +1797,4 @@ label chapter_13A: window auto pause 1 - $ next_ending_chapter() + $ next_story_chapter() diff --git a/game/script/13B.fang-breaks-up-with-anon.rpy b/game/script/13B.fang-breaks-up-with-anon.rpy index b084ea4..17f7bcf 100644 --- a/game/script/13B.fang-breaks-up-with-anon.rpy +++ b/game/script/13B.fang-breaks-up-with-anon.rpy @@ -1048,4 +1048,4 @@ label chapter_13B: window auto pause 1 - $ next_ending_chapter() + $ next_story_chapter() diff --git a/game/script/13C.fang-and-anon-go-to-beach-and-prom.rpy b/game/script/13C.fang-and-anon-go-to-beach-and-prom.rpy index b51c233..4b1afd6 100644 --- a/game/script/13C.fang-and-anon-go-to-beach-and-prom.rpy +++ b/game/script/13C.fang-and-anon-go-to-beach-and-prom.rpy @@ -4604,4 +4604,4 @@ label chapter_13C: #end of new stuff - $ next_ending_chapter() \ No newline at end of file + $ next_story_chapter() \ No newline at end of file diff --git a/game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy b/game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy index c70627c..f4349e6 100644 --- a/game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy +++ b/game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy @@ -4053,4 +4053,4 @@ label chapter_13D: "{cps=*.1}...{/cps}" pause 0.5 - $ next_ending_chapter() + $ next_story_chapter() diff --git a/game/script/14A.KO_OP-ending.rpy b/game/script/14A.KO_OP-ending.rpy index 5b9e2d5..d39362f 100644 --- a/game/script/14A.KO_OP-ending.rpy +++ b/game/script/14A.KO_OP-ending.rpy @@ -1443,4 +1443,4 @@ label chapter_14A: $ renpy.music.set_volume(1, 0, 'ambient') - $ next_ending_chapter() + $ next_story_chapter() diff --git a/game/script/14B.bad-ending.rpy b/game/script/14B.bad-ending.rpy index e3a1be0..d292f69 100644 --- a/game/script/14B.bad-ending.rpy +++ b/game/script/14B.bad-ending.rpy @@ -350,4 +350,4 @@ label chapter_14B: scene black with Dissolve(3) pause 2 - $ next_ending_chapter() + $ next_story_chapter() diff --git a/game/script/14C.good-ending.rpy b/game/script/14C.good-ending.rpy index 275af6d..fc4469d 100644 --- a/game/script/14C.good-ending.rpy +++ b/game/script/14C.good-ending.rpy @@ -1015,4 +1015,4 @@ label chapter_14C: stop music $ renpy.music.set_volume(1, 0, 'music') - $ next_ending_chapter() + $ next_story_chapter() diff --git a/game/script/14D.gold-ending.rpy b/game/script/14D.gold-ending.rpy index 0da03f0..54b0127 100644 --- a/game/script/14D.gold-ending.rpy +++ b/game/script/14D.gold-ending.rpy @@ -899,4 +899,4 @@ label chapter_14D: scene black with Dissolve(1.0) pause 1 - $ next_ending_chapter() + $ next_story_chapter() From 098c7dd02155773ee3ffd9d24a32e94ecf95f3f9 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 18 Aug 2024 21:10:30 -0300 Subject: [PATCH 025/105] storyline code cleanup --- game/storyline.rpy | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index b72c40f..9bb33ce 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -24,8 +24,6 @@ default chapter_index = 0 # Index number for the current position of the general default current_general_chapter = general_chapters[chapter_index] default ending_route_number = None -default current_ending_chapter = None -default ending_chapter_index = 0 default is_end_reached = False @@ -80,27 +78,4 @@ init python: general_chapters = tuple(general_chapters) - def next_ending_chapter(): - global ending_route_number - global ending_chapter_index - global current_ending_chapter - - if ending_route_number in ending_routes: - # Save the ending chapters array from - # the ending_routes dictionary - current_ending_list: list[str] = ending_routes[ending_route_number] - - if ending_chapter_index < len(current_ending_list): - # Stores the label name from the current_ending_list array in the item variable - current_ending_chapter = current_ending_list[ending_chapter_index] - # The item is assigned first and then increase the ending_chapter_index as it can't be done after using renpy.jump() - - # Increases the index and jumps to the label - ending_chapter_index += 1 - renpy.jump(current_ending_chapter) - else: # We've reached the end of the final chapters - ending_image() - renpy.call("lending") - else: - return From a0468969079da7286a52c15b596708942b3cf3e3 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 18 Aug 2024 21:13:45 -0300 Subject: [PATCH 026/105] Move persistent ending variables to screens.rpy --- game/screens.rpy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/game/screens.rpy b/game/screens.rpy index 6da6f53..02091fd 100644 --- a/game/screens.rpy +++ b/game/screens.rpy @@ -319,6 +319,8 @@ init python: config.overlay_screens.append("quick_menu") default quick_menu = True +default persistent.old_endings = None +default persistent.endings = None style quick_button is default style quick_button_text is button_text From 8b783f6838507d858513a6ac92f2c0514efc0aa8 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 18 Aug 2024 21:14:40 -0300 Subject: [PATCH 027/105] Delete persistent ending variables from storyline --- game/storyline.rpy | 3 --- 1 file changed, 3 deletions(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index 9bb33ce..5e5db3d 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -1,6 +1,3 @@ -default persistent.old_endings = None -default persistent.endings = None - # Store the general chapters inside an array for easy manipulation define general_chapters = [ "chapter_1", "chapter_2", "chapter_3", "chapter_4", "chapter_5", From 859610e3bdd95b55567936d40ab6d877ece44537 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 18 Aug 2024 22:25:53 -0300 Subject: [PATCH 028/105] storyline refactoring and improve function modularity --- game/storyline.rpy | 64 +++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index 5e5db3d..d7abd0a 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -1,5 +1,5 @@ # Store the general chapters inside an array for easy manipulation -define general_chapters = [ +default chapter_list = [ "chapter_1", "chapter_2", "chapter_3", "chapter_4", "chapter_5", "chapter_6", "chapter_7", "chapter_8", "chapter_9", "chapter_10", "chapter_11" ] @@ -12,16 +12,14 @@ define ending_routes = { } -default chapters_array_length = len(general_chapters) - 1 - -default chapter_index = 0 # Index number for the current position of the general chapters array +default chapter_list_length = len(chapter_list) - 1 +default chapter_list_index = 0 # Index number for the current position of the general chapters array # This stores the name of the label as a string -# When starting a new game, it takes the first element of the general_chapters array -default current_general_chapter = general_chapters[chapter_index] +# When starting a new game, it takes the first element of the chapter_list array +default current_chapter = chapter_list[chapter_list_index] default ending_route_number = None - default is_end_reached = False @@ -41,38 +39,50 @@ init -1 python: init python: def next_story_chapter(): - global chapter_index - global current_general_chapter - global ending_route_number - global is_end_reached + global chapter_list_index, current_chapter, ending_route_number + # Add check "is_end_reached" to have this if statement be executed only once when finishing the general chapters if not is_end_reached and is_end_of_chapters(): - ending_route_number = get_ending() - add_ending_chapters() - is_end_reached = True + process_ending() - if chapter_index < chapters_array_length: - chapter_index += 1 - current_general_chapter = general_chapters[chapter_index] - renpy.call(current_general_chapter) + if chapter_list_index < chapter_list_length: + chapter_list_index += 1 + current_chapter = chapter_list[chapter_list_index] + renpy.call(current_chapter) else: - ending_image() - renpy.call("lending") + end_story() def is_end_of_chapters(): - return chapter_index >= chapters_array_length + return chapter_list_index >= chapter_list_length + + + def process_ending(): + global ending_route_number + + ending_route_number = get_ending() + add_ending_chapters() + update_ending_variables() def add_ending_chapters(): - global general_chapters - global chapters_array_length + global chapter_list if ending_route_number in ending_routes: - general_chapters.extend(ending_routes[ending_route_number]) - chapters_array_length = len(general_chapters) - 1 - # renpy.block_rollback() BLOQUEAR O CAMBIARLO A TUPLE - general_chapters = tuple(general_chapters) + chapter_list.extend(ending_routes[ending_route_number]) + def update_ending_variables(): + global chapter_list_length + global is_end_reached + + # chapter_list_length is updated to reflect the addition to the chapter_list array + chapter_list_length = len(chapter_list) - 1 + is_end_reached = True + + + def end_story(): + ending_image() + renpy.call("lending") + From 806151f4302c1c43fc81fd808d8dabe55949335b Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 18 Aug 2024 22:29:50 -0300 Subject: [PATCH 029/105] Change start script to call the first chapter based on the "chapter_list_index" variable --- game/script.rpy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/script.rpy b/game/script.rpy index c09df6d..1ef0a57 100644 --- a/game/script.rpy +++ b/game/script.rpy @@ -327,4 +327,4 @@ label start: pause 1.0 - $ renpy.call(general_chapters[0]) # Call first element of the general_chapters array + $ renpy.call(chapter_list[chapter_list_index]) # Call first element of the chapter_list array From ce05fd5cdbbe1168720700f09890b59c8a6f5146 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 18 Aug 2024 22:45:14 -0300 Subject: [PATCH 030/105] Move story global variables initialization to the "initstats" label --- game/storyline.rpy | 11 ----------- game/utility.rpy | 24 ++++++++++++++---------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index d7abd0a..5b43f5b 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -12,17 +12,6 @@ define ending_routes = { } -default chapter_list_length = len(chapter_list) - 1 -default chapter_list_index = 0 # Index number for the current position of the general chapters array - -# This stores the name of the label as a string -# When starting a new game, it takes the first element of the chapter_list array -default current_chapter = chapter_list[chapter_list_index] - -default ending_route_number = None -default is_end_reached = False - - init -1 python: def ending_image(): #0b0000, DCBA, flash the bits with |=, check with & diff --git a/game/utility.rpy b/game/utility.rpy index 850a522..e7a1b6d 100644 --- a/game/utility.rpy +++ b/game/utility.rpy @@ -9,6 +9,15 @@ label initstats(anon=0, fang=0): $ fangscore = fang $ wingStory = False + # Chapter related variables + $ chapter_list_length = len(chapter_list) - 1 + $ chapter_list_index = 0 # Index number for the current position of the chapter_list array + $ current_chapter = chapter_list[chapter_list_index] # Store the name of the label as a string + + # Ending related variables + $ ending_route_number = None + $ is_end_reached = False + if persistent.enable_debug_scores: $ debug_story_variables(False) $ debug_story_variables(True) @@ -28,20 +37,15 @@ init python: return 1 # Shooter - def debug_story_variables(toggle=True, use_ending_chapter=False): + def debug_story_variables(toggle=True): var_list = [ "anonscore", "fangscore", - "chapter_index", - "ending_route_number", - "ending_chapter_index" + "current_chapter", + "chapter_list_length", + "chapter_list_index", + "ending_route_number" ] - - if use_ending_chapter: - var_list.remove("chapter_index") - var_list.append("current_ending_chapter") - else: - var_list.append("current_general_chapter") for item in var_list: if toggle: From b7da3f957eb79cb33f960f3de2ddaad452bab8b0 Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 19 Aug 2024 18:36:01 -0300 Subject: [PATCH 031/105] Test change --- game/storyline.rpy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index 5b43f5b..04a72c1 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -26,7 +26,7 @@ init -1 python: init python: - + # test comment def next_story_chapter(): global chapter_list_index, current_chapter, ending_route_number From 3e9ea5ddbcdc72463518b5da25aa1e4aabf6728b Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 19 Aug 2024 19:48:07 -0300 Subject: [PATCH 032/105] Add chapter_select file --- game/chapter_select.rpy | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 game/chapter_select.rpy diff --git a/game/chapter_select.rpy b/game/chapter_select.rpy new file mode 100644 index 0000000..e69de29 From 17cdc25bb16236a0258fd91c443375cdaabde038 Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 19 Aug 2024 20:21:23 -0300 Subject: [PATCH 033/105] Add chapter select to screens --- game/screens.rpy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/game/screens.rpy b/game/screens.rpy index 02091fd..fd84e64 100644 --- a/game/screens.rpy +++ b/game/screens.rpy @@ -999,6 +999,7 @@ screen preferences(): style_prefix "check" label _("Developer Tools") textbutton _("Enable Debug Scores") action ToggleVariable("persistent.enable_debug_scores", True, False) + textbutton _("Enable Chapter Select") action ToggleVariable("persistent.enable_chapter_select", True, False) if not main_menu: if config.developer and persistent.enable_debug_scores: @@ -1280,12 +1281,13 @@ screen extrasnavigation(): vbox: spacing 10 xpos 1885 - ypos 1130 + ypos (1269 if config.developer else 1130) use main_menu_buttons("gui/button/menubuttons/template_idle.png", [ [ _("Help"), ShowMenu("help") ], [ _("About"), ShowMenu("about") ], [ _("Gallery"), ShowMenu("cg_gallery") ], + *([(_("Chapter Select"), ShowMenu("label_selector"))] if persistent.enable_chapter_select else []), [ _("Mods"), ShowMenu("mod_menu") ], [ _("Return"), ShowMenu("main_menu") ] ] ) From a933c090e4a8e8bc334684d5e850324e20cb0a8c Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 19 Aug 2024 20:21:32 -0300 Subject: [PATCH 034/105] Add chapter_select file --- game/chapter_select.rpy | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/game/chapter_select.rpy b/game/chapter_select.rpy index e69de29..2277248 100644 --- a/game/chapter_select.rpy +++ b/game/chapter_select.rpy @@ -0,0 +1,12 @@ +screen label_selector(): + tag menu + + frame: + align (0.5, 0.5) + padding (20, 20) + vbox: + spacing 10 + text "Choose a Label:" + for label in chapter_list: + textbutton label: + action Call(label) From b34ad59fb49ac3705e06be0887877c0bb3194e09 Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 19 Aug 2024 20:21:49 -0300 Subject: [PATCH 035/105] Add setting to enable or disable chapter select --- game/options.rpy | 1 + 1 file changed, 1 insertion(+) diff --git a/game/options.rpy b/game/options.rpy index bbbe1f9..ffa6404 100644 --- a/game/options.rpy +++ b/game/options.rpy @@ -136,6 +136,7 @@ default preferences.afm_time = 15 define config.developer = "auto" default persistent.enable_debug_scores = config.developer +default persistent.enable_chapter_select = config.developer ##Default Audio is not ear rape define config.default_music_volume = 0.48 From 966fca9fc5594b320ffc226b402b8a1b2ce8ad05 Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 19 Aug 2024 20:36:09 -0300 Subject: [PATCH 036/105] Fix Chapter Select button yposition --- game/screens.rpy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/screens.rpy b/game/screens.rpy index fd84e64..a287464 100644 --- a/game/screens.rpy +++ b/game/screens.rpy @@ -1281,7 +1281,7 @@ screen extrasnavigation(): vbox: spacing 10 xpos 1885 - ypos (1269 if config.developer else 1130) + ypos (1269 if config.developer and persistent.enable_chapter_select else 1130) use main_menu_buttons("gui/button/menubuttons/template_idle.png", [ [ _("Help"), ShowMenu("help") ], From 72ea3dd640631401f3a8e5f2e63acaef829e0b32 Mon Sep 17 00:00:00 2001 From: Iggy Date: Tue, 20 Aug 2024 22:07:43 -0300 Subject: [PATCH 037/105] Add chapter_select --- game/chapter_select.rpy | 96 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 85 insertions(+), 11 deletions(-) diff --git a/game/chapter_select.rpy b/game/chapter_select.rpy index 2277248..b0a97dc 100644 --- a/game/chapter_select.rpy +++ b/game/chapter_select.rpy @@ -1,12 +1,86 @@ -screen label_selector(): - tag menu +define chapter_tuple_1 = [ + ("1", "chapter_1"), + ("2", "chapter_2"), + ("3", "chapter_3"), + ("4", "chapter_4"), + ("5", "chapter_5"), + ("6", "chapter_6") +] + +define chapter_tuple_2 = [ + ("7", "chapter_7"), + ("8", "chapter_8"), + ("9", "chapter_9"), + ("10", "chapter_10"), + ("11", "chapter_11") +] + +define tuples_index = [ + ("1-6", chapter_tuple_1), + ("7-11", chapter_tuple_2) +] + +default selected_tuple = None + + +init python: + + def select_chapter(): + global selected_tuple, current_chapter + + selected_tuple = renpy.display_menu(tuples_index) + current_chapter = renpy.display_menu(selected_tuple) + + set_stats() + + + def set_stats(): + global chapter_list_length, chapter_list_index, ending_route_number, is_end_reached + + chapter_list_length = len(chapter_list) - 1 + + find_chapter_in_array() + + renpy.call(current_chapter) + + + def find_chapter_in_array(): + global chapter_list_index, current_chapter + + try: + chapter_list_index = chapter_list.index(current_chapter) + except ValueError: + chapter_list_index = -1 + current_chapter = "" + + + + +label chapter_select: + scene black + stop sound + stop music + + menu: + "Initialize scores:" + + "Ending 1": + $ anon_score = 0 + $ fang_score = 0 + "Ending 2": + $ anon_score = 0 + $ fang_score = 4 + "Ending 3": + $ anon_score = 4 + $ fang_score = 0 + "Ending 4": + $ anon_score = 4 + $ fang_score = 4 + + $ lock_scores = True + call initstats(anon_score, fang_score) from _call_initstats_2 + + $ select_chapter() + + - frame: - align (0.5, 0.5) - padding (20, 20) - vbox: - spacing 10 - text "Choose a Label:" - for label in chapter_list: - textbutton label: - action Call(label) From fb64284d84d3a03a3dd10790d762736a38337b99 Mon Sep 17 00:00:00 2001 From: Iggy Date: Tue, 20 Aug 2024 22:08:08 -0300 Subject: [PATCH 038/105] Add chapter select buttons --- game/screens.rpy | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/game/screens.rpy b/game/screens.rpy index a287464..2ebb355 100644 --- a/game/screens.rpy +++ b/game/screens.rpy @@ -358,6 +358,10 @@ screen navigation(): textbutton _("Save") activate_sound "audio/ui/uiClick.wav" action ShowMenu("save") textbutton _("Load") activate_sound "audio/ui/uiClick.wav" action ShowMenu("load") textbutton _("Delete") activate_sound "audio/ui/uiClick.wav" action ShowMenu("delete") + + if config.developer and persistent.enable_chapter_select: + textbutton _("Chapter Select") activate_sound "audio/ui/uiClick.wav" action Start("chapter_select") + textbutton _("Options") activate_sound "audio/ui/uiClick.wav" action ShowMenu("preferences") #textbutton _("Extras") action ShowMenu("extras") textbutton _("Return") activate_sound "audio/ui/uiBack.wav" action Return() @@ -1287,7 +1291,7 @@ screen extrasnavigation(): [ _("Help"), ShowMenu("help") ], [ _("About"), ShowMenu("about") ], [ _("Gallery"), ShowMenu("cg_gallery") ], - *([(_("Chapter Select"), ShowMenu("label_selector"))] if persistent.enable_chapter_select else []), + *([(_("Chapter Select"), Start("chapter_select"))] if persistent.enable_chapter_select else []), [ _("Mods"), ShowMenu("mod_menu") ], [ _("Return"), ShowMenu("main_menu") ] ] ) From 2d793f86affcfe7057478326ad5e8a2043b80a48 Mon Sep 17 00:00:00 2001 From: Iggy Date: Tue, 20 Aug 2024 22:09:04 -0300 Subject: [PATCH 039/105] - Move variables out of utility - Add increase_points functions --- game/utility.rpy | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/game/utility.rpy b/game/utility.rpy index e7a1b6d..1d57ace 100644 --- a/game/utility.rpy +++ b/game/utility.rpy @@ -9,15 +9,6 @@ label initstats(anon=0, fang=0): $ fangscore = fang $ wingStory = False - # Chapter related variables - $ chapter_list_length = len(chapter_list) - 1 - $ chapter_list_index = 0 # Index number for the current position of the chapter_list array - $ current_chapter = chapter_list[chapter_list_index] # Store the name of the label as a string - - # Ending related variables - $ ending_route_number = None - $ is_end_reached = False - if persistent.enable_debug_scores: $ debug_story_variables(False) $ debug_story_variables(True) @@ -54,3 +45,17 @@ init python: renpy.unwatch(item) + def increase_anon_points(): + global anonscore, lock_scores + + if not lock_scores: + anonscore += 1 + + + def inscrease_fang_points(): + global fangscore, lock_scores + + if not lock_scores: + fangscore += 1 + + From afee5de501e24f76ce0923ad0d4fdd5054769425 Mon Sep 17 00:00:00 2001 From: Iggy Date: Tue, 20 Aug 2024 22:09:17 -0300 Subject: [PATCH 040/105] Move back global variables to storyline --- game/storyline.rpy | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/game/storyline.rpy b/game/storyline.rpy index 04a72c1..e6213d1 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -11,6 +11,15 @@ define ending_routes = { 1: ["chapter_11A", "chapter_12A", "chapter_12_5D", "chapter_13A", "chapter_14A"] } +# Chapter related variables +default chapter_list_length = len(chapter_list) - 1 +default chapter_list_index = 0 # Index number for the current position of the chapter_list array +default current_chapter = chapter_list[chapter_list_index] # Store the name of the label as a string + +# Ending related variables +default ending_route_number = None +default is_end_reached = False # consider moving variables out of here + init -1 python: def ending_image(): From 59c229db73fda4a04d7323c8367b16b248b9da4e Mon Sep 17 00:00:00 2001 From: Iggy Date: Wed, 21 Aug 2024 21:05:14 -0300 Subject: [PATCH 041/105] Add chapters description to selection --- game/chapter_select.rpy | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/game/chapter_select.rpy b/game/chapter_select.rpy index b0a97dc..dea62ec 100644 --- a/game/chapter_select.rpy +++ b/game/chapter_select.rpy @@ -1,23 +1,23 @@ define chapter_tuple_1 = [ - ("1", "chapter_1"), - ("2", "chapter_2"), - ("3", "chapter_3"), - ("4", "chapter_4"), - ("5", "chapter_5"), - ("6", "chapter_6") + ("1. Anon meets Fang.", "chapter_1"), + ("2. Fourth day of school.", "chapter_2"), + ("3. Showing up at band practice.", "chapter_3"), + ("4. Anon needs help during music period.", "chapter_4"), + ("5. Fang and Anon cut class to talk on the roof.", "chapter_5"), + ("6. Anon helps Fang find a venue for the band.", "chapter_6") ] define chapter_tuple_2 = [ - ("7", "chapter_7"), - ("8", "chapter_8"), - ("9", "chapter_9"), - ("10", "chapter_10"), - ("11", "chapter_11") + ("7. Concert day.", "chapter_7"), + ("8. Anon and Fang study together.", "chapter_8"), + ("9. Trish ridicules Anon in front of the school.", "chapter_9"), + ("10. Fang goes to Anon's apartment.", "chapter_10"), + ("11. School assignment and route lock.", "chapter_11") ] define tuples_index = [ - ("1-6", chapter_tuple_1), - ("7-11", chapter_tuple_2) + ("Chapters 1 to 6", chapter_tuple_1), + ("Chapters 7 to 11", chapter_tuple_2) ] default selected_tuple = None From 233a801aa5fa030a5756c3cc5a36142034507aec Mon Sep 17 00:00:00 2001 From: Iggy Date: Wed, 21 Aug 2024 21:25:09 -0300 Subject: [PATCH 042/105] select_chapter function improvements --- game/chapter_select.rpy | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/game/chapter_select.rpy b/game/chapter_select.rpy index dea62ec..1b3c3c0 100644 --- a/game/chapter_select.rpy +++ b/game/chapter_select.rpy @@ -28,8 +28,16 @@ init python: def select_chapter(): global selected_tuple, current_chapter - selected_tuple = renpy.display_menu(tuples_index) - current_chapter = renpy.display_menu(selected_tuple) + while True: + selected_tuple = renpy.display_menu(tuples_index + [("Go Back", "go_back")]) + if selected_tuple == "go_back": + renpy.jump("chapter_select") + + current_chapter = renpy.display_menu(selected_tuple + [("Go Back", "go_back")]) + if current_chapter == "go_back": + continue + else: + break set_stats() @@ -76,6 +84,8 @@ label chapter_select: "Ending 4": $ anon_score = 4 $ fang_score = 4 + "Exit to main menu": + return $ lock_scores = True call initstats(anon_score, fang_score) from _call_initstats_2 From 4d449593f540aa3cde4e0121a86ff37d52eae5b1 Mon Sep 17 00:00:00 2001 From: Iggy Date: Wed, 21 Aug 2024 21:32:15 -0300 Subject: [PATCH 043/105] Initialize ending_route_number when selecting an ending --- game/chapter_select.rpy | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/game/chapter_select.rpy b/game/chapter_select.rpy index 1b3c3c0..e305842 100644 --- a/game/chapter_select.rpy +++ b/game/chapter_select.rpy @@ -61,8 +61,6 @@ init python: chapter_list_index = -1 current_chapter = "" - - label chapter_select: scene black @@ -75,15 +73,19 @@ label chapter_select: "Ending 1": $ anon_score = 0 $ fang_score = 0 + $ ending_route_number = 1 "Ending 2": $ anon_score = 0 $ fang_score = 4 + $ ending_route_number = 2 "Ending 3": $ anon_score = 4 $ fang_score = 0 + $ ending_route_number = 3 "Ending 4": $ anon_score = 4 $ fang_score = 4 + $ ending_route_number = 4 "Exit to main menu": return From a65a5075fe694caec1ee6bf383fe3dae35dca7f5 Mon Sep 17 00:00:00 2001 From: Iggy Date: Wed, 21 Aug 2024 21:44:48 -0300 Subject: [PATCH 044/105] Implement functions to increase Anon and Fang scores --- .../3.showing-up-at-band-practice-and-giving-feedback.rpy | 2 +- game/script/4.anon-needs-help-during-music-period.rpy | 2 +- .../5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy | 6 +++--- game/script/6.anon-helps-fang-find-a-venue-for-band.rpy | 4 ++-- game/script/7.concert-day.rpy | 2 +- game/script/8.anon-and-fang-study-together.rpy | 2 +- game/script/9.anons'-dirty-laundry-gets-put-up-to-air.rpy | 2 +- game/utility.rpy | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/game/script/3.showing-up-at-band-practice-and-giving-feedback.rpy b/game/script/3.showing-up-at-band-practice-and-giving-feedback.rpy index 695f311..808d65e 100644 --- a/game/script/3.showing-up-at-band-practice-and-giving-feedback.rpy +++ b/game/script/3.showing-up-at-band-practice-and-giving-feedback.rpy @@ -1688,7 +1688,7 @@ label chapter_3: label GuitarQuestionSpeakUp: - $ fangscore += 1 + $ increase_fang_points() "Fang does seem very passionate about playing guitar." diff --git a/game/script/4.anon-needs-help-during-music-period.rpy b/game/script/4.anon-needs-help-during-music-period.rpy index a6533a1..ac0c756 100644 --- a/game/script/4.anon-needs-help-during-music-period.rpy +++ b/game/script/4.anon-needs-help-during-music-period.rpy @@ -654,7 +654,7 @@ label chapter_4: label lHeads: - $ fangscore += 1 + $ increase_fang_points() "Guess that’s that." diff --git a/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy b/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy index 6e55222..1d7c020 100644 --- a/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy +++ b/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy @@ -1193,7 +1193,7 @@ label chapter_5: label lbeHonest: - $ anonscore += 1 + $ increase_anon_points() "I guess honesty is the best policy." window hide @@ -3584,8 +3584,8 @@ label chapter_5: if _value != "Snot": renpy.jump(_value+chr(0x61+_tick)) - $ fangscore += 1 - $ anonscore += 1 + $ increase_fang_points() + $ increase_anon_points() $ wingStory = True A "{cps=*.1}...{/cps}" diff --git a/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy b/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy index 87ccb2f..4c38352 100644 --- a/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy +++ b/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy @@ -1918,7 +1918,7 @@ label chapter_6: label lAnonWaitsForFang: - $ anonscore += 1 + $ increase_anon_points() "{cps=*.1}...{/cps}No." @@ -2308,7 +2308,7 @@ label chapter_6: label lAskFang: - $ fangscore += 1 + $ increase_fang_points() A "Don’t worry about it." pause .5 diff --git a/game/script/7.concert-day.rpy b/game/script/7.concert-day.rpy index a974a75..96f6835 100644 --- a/game/script/7.concert-day.rpy +++ b/game/script/7.concert-day.rpy @@ -477,7 +477,7 @@ label chapter_7: renpy.jump(renpy.display_menu(randomize_choices(choices))) label LeaveStageAsIs: - $ anonscore += 1 + $ increase_anon_points() pause .5 "Reed may not understand cable management,{w=.4} but then again neither did I." diff --git a/game/script/8.anon-and-fang-study-together.rpy b/game/script/8.anon-and-fang-study-together.rpy index 95695f0..0bca172 100644 --- a/game/script/8.anon-and-fang-study-together.rpy +++ b/game/script/8.anon-and-fang-study-together.rpy @@ -630,7 +630,7 @@ label chapter_8: label lLetFangPlayGuit: - $ fangscore += 1 + $ increase_fang_points() pause .5 diff --git a/game/script/9.anons'-dirty-laundry-gets-put-up-to-air.rpy b/game/script/9.anons'-dirty-laundry-gets-put-up-to-air.rpy index 6e52427..a2dcde6 100644 --- a/game/script/9.anons'-dirty-laundry-gets-put-up-to-air.rpy +++ b/game/script/9.anons'-dirty-laundry-gets-put-up-to-air.rpy @@ -1297,7 +1297,7 @@ label chapter_9: jump lGoHomeEarly label lWaitForTrishToExit: - $ anonscore += 1 + $ increase_anon_points() #play music 'audio/OST/fighter.ogg' fadein 1.0 A "You worried about her, too?" diff --git a/game/utility.rpy b/game/utility.rpy index 1d57ace..8687947 100644 --- a/game/utility.rpy +++ b/game/utility.rpy @@ -52,7 +52,7 @@ init python: anonscore += 1 - def inscrease_fang_points(): + def increase_fang_points(): global fangscore, lock_scores if not lock_scores: From 993824e1524982db079f57eca81b4cdd93294570 Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 22 Aug 2024 19:27:44 -0300 Subject: [PATCH 045/105] Mode chapter_select into "src" folder --- game/{ => src}/chapter_select.rpy | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename game/{ => src}/chapter_select.rpy (100%) diff --git a/game/chapter_select.rpy b/game/src/chapter_select.rpy similarity index 100% rename from game/chapter_select.rpy rename to game/src/chapter_select.rpy From c5ea9c9cb52756b7a9e6674fa1231b7aa2f39c62 Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 22 Aug 2024 22:03:50 -0300 Subject: [PATCH 046/105] Move chapter related variables to new file --- game/chapter_variables.rpy | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 game/chapter_variables.rpy diff --git a/game/chapter_variables.rpy b/game/chapter_variables.rpy new file mode 100644 index 0000000..575db42 --- /dev/null +++ b/game/chapter_variables.rpy @@ -0,0 +1,27 @@ +# Store the general chapters inside an array for easy manipulation +default chapter_list = [ + "chapter_1", "chapter_2", "chapter_3", "chapter_4", "chapter_5", + "chapter_6", "chapter_7", "chapter_8", "chapter_9", "chapter_10", "chapter_11" +] + +define ending_routes = { + 4: ["chapter_11D", "chapter_12D", "chapter_12_5D", "chapter_13D", "chapter_14D"], + 3: ["chapter_11C", "chapter_12C", "chapter_12_5C", "chapter_13C", "chapter_14C"], + 2: ["chapter_11B", "chapter_12B", "chapter_13B", "chapter_14B"], + 1: ["chapter_11A", "chapter_12A", "chapter_12_5D", "chapter_13A", "chapter_14A"] +} + +# Anon/Fang +default anonscore = 0 +default fangscore = 0 +default wingStory = False +default lock_scores = False # Allows points to be increased + +# Chapter variables +default chapter_list_length = get_chapter_list_length() +default chapter_list_index = 0 # Index number for the current position of the chapter_list array +default current_chapter = chapter_list[chapter_list_index] # Store the name of the label as a string + +# Ending variables +default ending_route_number = None +default is_end_reached = False From b65ed32b14988991b63334d82da2e84553d828e1 Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 22 Aug 2024 22:04:44 -0300 Subject: [PATCH 047/105] Remove redundant 'initstats' label --- game/script.rpy | 2 +- game/utility.rpy | 25 ++++++++----------------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/game/script.rpy b/game/script.rpy index 1ef0a57..641af18 100644 --- a/game/script.rpy +++ b/game/script.rpy @@ -323,7 +323,7 @@ transform scloserleft: label start: - call initstats(anon = 0, fang = 0) from _call_initstats + $ toggle_debug() pause 1.0 diff --git a/game/utility.rpy b/game/utility.rpy index 8687947..313ab33 100644 --- a/game/utility.rpy +++ b/game/utility.rpy @@ -1,21 +1,5 @@ ## Utility functions for game setup, debugging etc. -label initstats(anon=0, fang=0): - # Sets various game-related global variables - # :param int anon: Anon's score - # :param int fang: Fang's score - # :param bool trad: Tradwife ending flag - $ anonscore = anon - $ fangscore = fang - $ wingStory = False - - if persistent.enable_debug_scores: - $ debug_story_variables(False) - $ debug_story_variables(True) - - return - - init python: def get_ending(): if anonscore >= 4 and fangscore >= 4 and wingStory: @@ -35,7 +19,8 @@ init python: "current_chapter", "chapter_list_length", "chapter_list_index", - "ending_route_number" + "ending_route_number", + "is_end_reached" ] for item in var_list: @@ -58,4 +43,10 @@ init python: if not lock_scores: fangscore += 1 + + def toggle_debug(): + if persistent.enable_debug_scores: + debug_story_variables(False) + debug_story_variables(True) + From 84ccfc1b135e2af2eb0f9c4643b2bb591cd186be Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 22 Aug 2024 22:13:00 -0300 Subject: [PATCH 048/105] Add improved chapter_selection --- game/src/chapter_select.rpy | 58 ++++++++++++++++++++++++------------- game/storyline.rpy | 34 +++++----------------- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/game/src/chapter_select.rpy b/game/src/chapter_select.rpy index e305842..242d545 100644 --- a/game/src/chapter_select.rpy +++ b/game/src/chapter_select.rpy @@ -26,7 +26,7 @@ default selected_tuple = None init python: def select_chapter(): - global selected_tuple, current_chapter + global selected_tuple, current_chapter, is_end_reached while True: selected_tuple = renpy.display_menu(tuples_index + [("Go Back", "go_back")]) @@ -39,17 +39,35 @@ init python: else: break + is_end_reached = False # Reset this for when the tool is used more than once + set_stats() + toggle_debug() + + renpy.call(current_chapter) def set_stats(): - global chapter_list_length, chapter_list_index, ending_route_number, is_end_reached + global chapter_list_length, ending_route_number, is_end_reached, lock_scores - chapter_list_length = len(chapter_list) - 1 + # chapter_list_length = get_chapter_list_length() + ending_route_number = get_ending() + + lock_scores = True # Prevents scores from increasing when using the chapter selection tool find_chapter_in_array() + + if not is_end_reached: + add_ending_chapters() # From storyline + + update_ending_variables() # From storyline - renpy.call(current_chapter) + + def set_scores(anon_score, fang_score): + global anonscore, fangscore + + anonscore = anon_score + fangscore = fang_score def find_chapter_in_array(): @@ -62,6 +80,14 @@ init python: current_chapter = "" +label reset_chapter_list: + $ chapter_list = [ + "chapter_1", "chapter_2", "chapter_3", "chapter_4", "chapter_5", + "chapter_6", "chapter_7", "chapter_8", "chapter_9", "chapter_10", "chapter_11" + ] + return + + label chapter_select: scene black stop sound @@ -71,27 +97,19 @@ label chapter_select: "Initialize scores:" "Ending 1": - $ anon_score = 0 - $ fang_score = 0 - $ ending_route_number = 1 + $ set_scores(0, 0) "Ending 2": - $ anon_score = 0 - $ fang_score = 4 - $ ending_route_number = 2 + $ set_scores(0, 4) "Ending 3": - $ anon_score = 4 - $ fang_score = 0 - $ ending_route_number = 3 + $ set_scores(4, 0) "Ending 4": - $ anon_score = 4 - $ fang_score = 4 - $ ending_route_number = 4 + $ set_scores(4, 4) "Exit to main menu": return - - $ lock_scores = True - call initstats(anon_score, fang_score) from _call_initstats_2 - + + if not is_end_reached: + call reset_chapter_list from _call_reset_chapter_list + $ select_chapter() diff --git a/game/storyline.rpy b/game/storyline.rpy index e6213d1..d1a55ca 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -1,26 +1,3 @@ -# Store the general chapters inside an array for easy manipulation -default chapter_list = [ - "chapter_1", "chapter_2", "chapter_3", "chapter_4", "chapter_5", - "chapter_6", "chapter_7", "chapter_8", "chapter_9", "chapter_10", "chapter_11" -] - -define ending_routes = { - 4: ["chapter_11D", "chapter_12D", "chapter_12_5D", "chapter_13D", "chapter_14D"], - 3: ["chapter_11C", "chapter_12C", "chapter_12_5C", "chapter_13C", "chapter_14C"], - 2: ["chapter_11B", "chapter_12B", "chapter_13B", "chapter_14B"], - 1: ["chapter_11A", "chapter_12A", "chapter_12_5D", "chapter_13A", "chapter_14A"] -} - -# Chapter related variables -default chapter_list_length = len(chapter_list) - 1 -default chapter_list_index = 0 # Index number for the current position of the chapter_list array -default current_chapter = chapter_list[chapter_list_index] # Store the name of the label as a string - -# Ending related variables -default ending_route_number = None -default is_end_reached = False # consider moving variables out of here - - init -1 python: def ending_image(): #0b0000, DCBA, flash the bits with |=, check with & @@ -35,7 +12,7 @@ init -1 python: init python: - # test comment + def next_story_chapter(): global chapter_list_index, current_chapter, ending_route_number @@ -67,7 +44,7 @@ init python: global chapter_list if ending_route_number in ending_routes: - chapter_list.extend(ending_routes[ending_route_number]) + chapter_list.extend(ending_routes[ending_route_number]) def update_ending_variables(): @@ -75,10 +52,15 @@ init python: global is_end_reached # chapter_list_length is updated to reflect the addition to the chapter_list array - chapter_list_length = len(chapter_list) - 1 + chapter_list_length = get_chapter_list_length() is_end_reached = True + def get_chapter_list_length(): + return len(chapter_list) - 1 + + + def end_story(): ending_image() renpy.call("lending") From 0fbff1b81bd3b78ef7783f26e88b4e1b287f3033 Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 22 Aug 2024 23:18:23 -0300 Subject: [PATCH 049/105] Code optimizations --- game/src/chapter_select.rpy | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/game/src/chapter_select.rpy b/game/src/chapter_select.rpy index 242d545..68fecf1 100644 --- a/game/src/chapter_select.rpy +++ b/game/src/chapter_select.rpy @@ -29,24 +29,26 @@ init python: global selected_tuple, current_chapter, is_end_reached while True: - selected_tuple = renpy.display_menu(tuples_index + [("Go Back", "go_back")]) + selected_tuple = display_tuple_menu(tuples_index) if selected_tuple == "go_back": renpy.jump("chapter_select") - current_chapter = renpy.display_menu(selected_tuple + [("Go Back", "go_back")]) + current_chapter = display_tuple_menu(selected_tuple) if current_chapter == "go_back": continue else: break - is_end_reached = False # Reset this for when the tool is used more than once - set_stats() toggle_debug() renpy.call(current_chapter) + def display_tuple_menu(options): + return renpy.display_menu(options + [("Go Back", "go_back")]) + + def set_stats(): global chapter_list_length, ending_route_number, is_end_reached, lock_scores @@ -89,9 +91,9 @@ label reset_chapter_list: label chapter_select: - scene black stop sound - stop music + stop music fadeout 2 + scene black with dissolve menu: "Initialize scores:" @@ -105,7 +107,12 @@ label chapter_select: "Ending 4": $ set_scores(4, 4) "Exit to main menu": + scene black with dissolve return + + $ is_end_reached = False # Reset this for when the tool is used more than once + + window hide if not is_end_reached: call reset_chapter_list from _call_reset_chapter_list From cee1984f4dafb2885d980f1b2718e202359b23cd Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 22 Aug 2024 23:26:33 -0300 Subject: [PATCH 050/105] Convert "selected_tuple" into local function variable --- game/src/chapter_select.rpy | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/game/src/chapter_select.rpy b/game/src/chapter_select.rpy index 68fecf1..033613f 100644 --- a/game/src/chapter_select.rpy +++ b/game/src/chapter_select.rpy @@ -20,13 +20,13 @@ define tuples_index = [ ("Chapters 7 to 11", chapter_tuple_2) ] -default selected_tuple = None - init python: def select_chapter(): - global selected_tuple, current_chapter, is_end_reached + global current_chapter, is_end_reached + + selected_tuple = () while True: selected_tuple = display_tuple_menu(tuples_index) From fef3b7beec2068ba858bd15bb686e72352aef133 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 23 Aug 2024 17:45:04 -0300 Subject: [PATCH 051/105] Hide quick_menu in chapter selection --- game/src/chapter_select.rpy | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/game/src/chapter_select.rpy b/game/src/chapter_select.rpy index 033613f..b29d3f7 100644 --- a/game/src/chapter_select.rpy +++ b/game/src/chapter_select.rpy @@ -24,7 +24,7 @@ define tuples_index = [ init python: def select_chapter(): - global current_chapter, is_end_reached + global current_chapter, is_end_reached, quick_menu selected_tuple = () @@ -41,6 +41,7 @@ init python: set_stats() toggle_debug() + quick_menu = True renpy.call(current_chapter) @@ -91,6 +92,8 @@ label reset_chapter_list: label chapter_select: + $ quick_menu = False + stop sound stop music fadeout 2 scene black with dissolve From df967527e4d89f1962c2b24aa1ce1fb2edfc55fb Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 23 Aug 2024 18:48:39 -0300 Subject: [PATCH 052/105] Update Renpy versions in woodpecker.yml and reconstruct.toml --- .woodpecker.yml | 6 +++--- renconstruct.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 98bd613..c5e62d9 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -25,7 +25,7 @@ steps: - event: cron build: - image: openjdk:8 + image: openjdk:21-jdk-bookworm commands: - apt update - apt install libgl1 -y @@ -76,6 +76,6 @@ steps: matrix: RenpyVersion: - - "8.0.3" + - "8.2.3" RenkitVersion: - - "3.3.1" + - "4.3.0" diff --git a/renconstruct.toml b/renconstruct.toml index eefa3e7..6fb084f 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -47,5 +47,5 @@ clear_output_dir = false # whether to clear the output directory on startup [renutil] - version = "8.0.3" # the Ren'Py version to use (required) + version = "8.2.3" # the Ren'Py version to use (required) registry = "tmp/cache" # the directory to store installation files in From 80bdae1d0873020b81e2dcafd6754803b116e0d1 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 23 Aug 2024 19:32:41 -0300 Subject: [PATCH 053/105] Add tasks.patch --- renconstruct.toml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/renconstruct.toml b/renconstruct.toml index 6fb084f..ea8af0e 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -1,3 +1,8 @@ +[tasks.patch] + type = "custom" + enabled = true + ver = "8.2.3" + [tasks.clean] enabled = false priorities = { post_build = 0 } # the priority that determines the orders tasks will run in, defaults to 0 From 351e433504744caf210899a3fe60caa39f8e38a5 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 23 Aug 2024 19:49:45 -0300 Subject: [PATCH 054/105] Upgrade Renkit version to 4.4.0 --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index c5e62d9..a60a6eb 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -78,4 +78,4 @@ matrix: RenpyVersion: - "8.2.3" RenkitVersion: - - "4.3.0" + - "4.4.0" From a75d26de8de02013aa101c3e3d5c4324e5db2d71 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 23 Aug 2024 19:58:07 -0300 Subject: [PATCH 055/105] Update Renkit url --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index a60a6eb..525f045 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -31,7 +31,7 @@ steps: - apt install libgl1 -y - sed -i -e "s/VERSION/${RenpyVersion}/g" game/options.rpy #Change the renpy version to the woodpecker reuqested one. #Get Renkit - - wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-linux-amd64.tar.gz" | tar xz --directory=/tmp/ + - wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-x86_64-unknown-linux-gnu.tar.xz" | tar xz --directory=/tmp/ # Url changed for version 4.4.0 - /tmp/renconstruct build -i "." -c "renconstruct.toml" -o dist/ - cd /tmp/ From dd6da86a8ca2701f93dec10c8cbf9e7bcfa86df6 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 23 Aug 2024 20:14:09 -0300 Subject: [PATCH 056/105] Change tar compression option --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 525f045..6fbafb6 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -31,7 +31,7 @@ steps: - apt install libgl1 -y - sed -i -e "s/VERSION/${RenpyVersion}/g" game/options.rpy #Change the renpy version to the woodpecker reuqested one. #Get Renkit - - wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-x86_64-unknown-linux-gnu.tar.xz" | tar xz --directory=/tmp/ # Url changed for version 4.4.0 + - wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-x86_64-unknown-linux-gnu.tar.xz" | tar xJ --directory=/tmp/ # Url changed for version 4.4.0 - /tmp/renconstruct build -i "." -c "renconstruct.toml" -o dist/ - cd /tmp/ From 84f6d467dd3a3170ecdc07dd1ff298b770c98268 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 23 Aug 2024 21:03:16 -0300 Subject: [PATCH 057/105] Update build commands --- .woodpecker.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 6fbafb6..a1d1f09 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -31,8 +31,10 @@ steps: - apt install libgl1 -y - sed -i -e "s/VERSION/${RenpyVersion}/g" game/options.rpy #Change the renpy version to the woodpecker reuqested one. #Get Renkit - - wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-x86_64-unknown-linux-gnu.tar.xz" | tar xJ --directory=/tmp/ # Url changed for version 4.4.0 - - /tmp/renconstruct build -i "." -c "renconstruct.toml" -o dist/ + - wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-x86_64-unknown-linux-gnu.tar.xz" | tar -Jax --directory=/tmp/ + - /tmp/renkit-x86_64-unknown-linux-gnu/renconstruct build "." dist/ + - mkdir "dist/android" + - mv dist/*.apk "dist/android" - cd /tmp/ archival-sha: From b048e9c32aba53e80782262434bc38aa2e3e3459 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 23 Aug 2024 21:25:02 -0300 Subject: [PATCH 058/105] Downgrade Renkit version --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index a1d1f09..5035cef 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -80,4 +80,4 @@ matrix: RenpyVersion: - "8.2.3" RenkitVersion: - - "4.4.0" + - "4.3.0" From a04c4e6912be7982d1a3ee70760b6b6315ca53fe Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 23 Aug 2024 21:34:24 -0300 Subject: [PATCH 059/105] Remove tasks.clean --- renconstruct.toml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/renconstruct.toml b/renconstruct.toml index ea8af0e..cf8da5f 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -3,11 +3,6 @@ enabled = true ver = "8.2.3" -[tasks.clean] - enabled = false - priorities = { post_build = 0 } # the priority that determines the orders tasks will run in, defaults to 0 - on_builds = ["pc", "win", "linux", "mac", "web", "steam", "market", "android_apk", "android_aab"] # builds this task should run for, defaults to all available builds - [tasks.notarize] # required if matching task is enabled enabled = false priorities = { post_build = 10 } # the priority that determines the orders tasks will run in, defaults to 10 From c0208478000c42a07e467be7fd05a8c521993a28 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 23 Aug 2024 21:43:41 -0300 Subject: [PATCH 060/105] Remove tasks.notarize --- renconstruct.toml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/renconstruct.toml b/renconstruct.toml index cf8da5f..d944cdb 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -3,16 +3,6 @@ enabled = true ver = "8.2.3" -[tasks.notarize] # required if matching task is enabled - enabled = false - priorities = { post_build = 10 } # the priority that determines the orders tasks will run in, defaults to 10 - on_builds = ["mac"] # builds this task should run for, defaults to "mac" - bundle_identifier = "com.my-game" # the bundle ID of your came, typically in reverse domain notation - key_file = "certificates/private-key.pem" # the path to the private key file generated during the provisioning process - cert_file = "certificates/developerID_application.cer" # the path to the Apple-generated certificate file generated during the provisioning process - app_store_key_file = "certificates/app-store-key.json" # the path to the combined App Store key file generated during the provisioning process - json_bundle_file = "certificates/renotize.json" # the path to the combined certificate file. replaces the key, cert and app store files above - [tasks.keystore] # required if matching task is enabled enabled = false priorities = { pre_build = 0 } # the priority that determines the orders tasks will run in, defaults to 0 From ae7454506e96831b40210a736db7cb298961e207 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 23 Aug 2024 21:56:48 -0300 Subject: [PATCH 061/105] Enable tasks.keystore --- renconstruct.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/renconstruct.toml b/renconstruct.toml index d944cdb..abb6886 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -4,7 +4,8 @@ ver = "8.2.3" [tasks.keystore] # required if matching task is enabled - enabled = false + enabled = true + type="keystore" priorities = { pre_build = 0 } # the priority that determines the orders tasks will run in, defaults to 0 on_builds = ["android_apk", "android_aab"] # builds this task should run for, defaults to all android builds keystore_apk = "" # the base-64 encoded binary keystore file for the APK bundles From 1f747f510155a90397d3ca1da3d521bc18eb4239 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sat, 24 Aug 2024 10:54:38 -0300 Subject: [PATCH 062/105] Remove tasks.convert_images Upgrade Renkit version --- .woodpecker.yml | 2 +- renconstruct.toml | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 5035cef..a1d1f09 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -80,4 +80,4 @@ matrix: RenpyVersion: - "8.2.3" RenkitVersion: - - "4.3.0" + - "4.4.0" diff --git a/renconstruct.toml b/renconstruct.toml index abb6886..b173c4c 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -11,18 +11,6 @@ keystore_apk = "" # the base-64 encoded binary keystore file for the APK bundles keystore_aab = "" # the base-64 encoded binary keystore file for the AAB bundles -[tasks.convert_images] - enabled = false - format = "webp" # webp or avif - priorities = { pre_build = 10 } # the priority that determines the orders tasks will run in, defaults to 10 - on_builds = ["pc", "win", "linux", "mac", "web", "steam", "market", "android_apk", "android_aab"] # builds this task should run for, defaults to all available builds - # extensions: a list of file extensions to convert - # recursive: scans directories recursively if enabled, otherwise only scans the immediate directory - # lossless: converts to lossless WebP if enabled, otherwise converts to lossy WebP - "game/images/cg" = { extensions = ["png", "jpg"], recursive = true, lossless = true } # default values - "game/images/bg" = { lossless = false } - "game/images" = { } # all parameters are optional - [build] # required, at least one item must be 'true' #pc = true # windows + linux win = true # windows From c06e73743aa1bd8a7cd269667e76ce37d984ea9c Mon Sep 17 00:00:00 2001 From: Ignacio Date: Sat, 24 Aug 2024 10:54:38 -0300 Subject: [PATCH 063/105] Remove tasks.convert_images Upgrade Renkit version --- .woodpecker.yml | 2 +- renconstruct.toml | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 5035cef..a1d1f09 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -80,4 +80,4 @@ matrix: RenpyVersion: - "8.2.3" RenkitVersion: - - "4.3.0" + - "4.4.0" diff --git a/renconstruct.toml b/renconstruct.toml index abb6886..b173c4c 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -11,18 +11,6 @@ keystore_apk = "" # the base-64 encoded binary keystore file for the APK bundles keystore_aab = "" # the base-64 encoded binary keystore file for the AAB bundles -[tasks.convert_images] - enabled = false - format = "webp" # webp or avif - priorities = { pre_build = 10 } # the priority that determines the orders tasks will run in, defaults to 10 - on_builds = ["pc", "win", "linux", "mac", "web", "steam", "market", "android_apk", "android_aab"] # builds this task should run for, defaults to all available builds - # extensions: a list of file extensions to convert - # recursive: scans directories recursively if enabled, otherwise only scans the immediate directory - # lossless: converts to lossless WebP if enabled, otherwise converts to lossy WebP - "game/images/cg" = { extensions = ["png", "jpg"], recursive = true, lossless = true } # default values - "game/images/bg" = { lossless = false } - "game/images" = { } # all parameters are optional - [build] # required, at least one item must be 'true' #pc = true # windows + linux win = true # windows From 949dfa4044ce35e7fcbd43f1752bef8445f2bfe9 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sat, 24 Aug 2024 11:18:20 -0300 Subject: [PATCH 064/105] Delete android from woodpecker.yml --- .woodpecker.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index a1d1f09..0fc86e0 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -33,8 +33,6 @@ steps: #Get Renkit - wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-x86_64-unknown-linux-gnu.tar.xz" | tar -Jax --directory=/tmp/ - /tmp/renkit-x86_64-unknown-linux-gnu/renconstruct build "." dist/ - - mkdir "dist/android" - - mv dist/*.apk "dist/android" - cd /tmp/ archival-sha: From 002e2b6a1321d80e3ef8491eaa156d798ea99859 Mon Sep 17 00:00:00 2001 From: Ignacio Date: Sat, 24 Aug 2024 11:18:20 -0300 Subject: [PATCH 065/105] Delete android from woodpecker.yml --- .woodpecker.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index a1d1f09..0fc86e0 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -33,8 +33,6 @@ steps: #Get Renkit - wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-x86_64-unknown-linux-gnu.tar.xz" | tar -Jax --directory=/tmp/ - /tmp/renkit-x86_64-unknown-linux-gnu/renconstruct build "." dist/ - - mkdir "dist/android" - - mv dist/*.apk "dist/android" - cd /tmp/ archival-sha: From 4f4956f2011d399526e0b933bbb132be6caf39fa Mon Sep 17 00:00:00 2001 From: Iggy Date: Sat, 24 Aug 2024 11:40:18 -0300 Subject: [PATCH 066/105] Add keystore keys from Wani --- .woodpecker.yml | 2 ++ renconstruct.toml | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 0fc86e0..a1d1f09 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -33,6 +33,8 @@ steps: #Get Renkit - wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-x86_64-unknown-linux-gnu.tar.xz" | tar -Jax --directory=/tmp/ - /tmp/renkit-x86_64-unknown-linux-gnu/renconstruct build "." dist/ + - mkdir "dist/android" + - mv dist/*.apk "dist/android" - cd /tmp/ archival-sha: diff --git a/renconstruct.toml b/renconstruct.toml index b173c4c..c5f5174 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -8,8 +8,8 @@ type="keystore" priorities = { pre_build = 0 } # the priority that determines the orders tasks will run in, defaults to 0 on_builds = ["android_apk", "android_aab"] # builds this task should run for, defaults to all android builds - keystore_apk = "" # the base-64 encoded binary keystore file for the APK bundles - keystore_aab = "" # the base-64 encoded binary keystore file for the AAB bundles + keystore_apk = "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" # the base-64 encoded binary keystore file for the APK bundles + keystore_aab = "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" # the base-64 encoded binary keystore file for the AAB bundles [build] # required, at least one item must be 'true' #pc = true # windows + linux From 9ef954bd9f0f082e444bebca66d79115946b45d5 Mon Sep 17 00:00:00 2001 From: Ignacio Date: Sat, 24 Aug 2024 11:40:18 -0300 Subject: [PATCH 067/105] Add keystore keys from Wani --- .woodpecker.yml | 2 ++ renconstruct.toml | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 0fc86e0..a1d1f09 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -33,6 +33,8 @@ steps: #Get Renkit - wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-x86_64-unknown-linux-gnu.tar.xz" | tar -Jax --directory=/tmp/ - /tmp/renkit-x86_64-unknown-linux-gnu/renconstruct build "." dist/ + - mkdir "dist/android" + - mv dist/*.apk "dist/android" - cd /tmp/ archival-sha: diff --git a/renconstruct.toml b/renconstruct.toml index b173c4c..c5f5174 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -8,8 +8,8 @@ type="keystore" priorities = { pre_build = 0 } # the priority that determines the orders tasks will run in, defaults to 0 on_builds = ["android_apk", "android_aab"] # builds this task should run for, defaults to all android builds - keystore_apk = "" # the base-64 encoded binary keystore file for the APK bundles - keystore_aab = "" # the base-64 encoded binary keystore file for the AAB bundles + keystore_apk = "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" # the base-64 encoded binary keystore file for the APK bundles + keystore_aab = "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" # the base-64 encoded binary keystore file for the AAB bundles [build] # required, at least one item must be 'true' #pc = true # windows + linux From fd7ac143af6963cc905c7832757d362a19d25f01 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sat, 24 Aug 2024 15:33:01 -0300 Subject: [PATCH 068/105] Add missing files to fix Woodpecker build --- android.json | 24 ++++++++++++++++++++++++ android.keystore | Bin 0 -> 2071 bytes bundle.keystore | Bin 0 -> 2072 bytes renconstruct.toml | 3 ++- update.pem | 5 +++++ 5 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 android.json create mode 100644 android.keystore create mode 100644 bundle.keystore create mode 100644 update.pem diff --git a/android.json b/android.json new file mode 100644 index 0000000..5167cf5 --- /dev/null +++ b/android.json @@ -0,0 +1,24 @@ +{ + "expansion": false, + "google_play_key": null, + "google_play_salt": null, + "heap_size": "3", + "icon_name": "Snoot Game", + "include_pil": false, + "include_sqlite": false, + "layout": null, + "name": "Snoot Game", + "numeric_version": 1, + "orientation": "sensorLandscape", + "package": "cavemanon.snootgame", + "permissions": [ + "VIBRATE", + "INTERNET" + ], + "source": false, + "store": "none", + "update_always": true, + "update_icons": true, + "update_keystores": true, + "version": "INTERNAL-BUILD" +} \ No newline at end of file diff --git a/android.keystore b/android.keystore new file mode 100644 index 0000000000000000000000000000000000000000..ab39a4531bbefd7ca09ffa3b335f4a645f5bf934 GIT binary patch literal 2071 zcmV+y2U@SctAoxZSatTbK+;b7dZ)^_WC9-r994 z$JmX&pcjnq@lL@#2r0*;wgK}=ncr?@gqplW>NlTZz5sK1=wPK?b0iUXhaqoW6!oZG zEjk}7q9`TP*22NmqS)^jnkwhsxc`cQ1QEJtwJ z!T9XbkDT!5QZo`^H-QzKF7V*bmqCjnnLqs@S+rp%%bMuI9^6RIeUnh6nb5vioH$`# zAZ)Ny0Atu3=u6aY3Xm#S(}{rmmEEd71<>2fE%@d{ya%v=-|ybze2j`+3E9pSeBd-}WVwv4ghrT$xQ<;IOK3H@a6_S=pmpU;M`Tm|QDR-i+f*R4qxdwp0BR1> zD9EaVh5g6Ua&L`k+UNix%lE8Tuq_!@m5?p?$L~fwW6l3Oq#Jt>O~E`-+>hyBXCfQY zsNU{909f6z9A{+?=XCtX*-1p)>v?m%IJMd8O+yZ)9D$I0pjA@eG3}G}_^F>&$-9F| zS{=z~(U;5@9@rp{RkON0eSpD+?kTua5Y1)LsqKNVc&-FWxZbUpmfTN9TZ54 z;i)0I%@qT3qG}7XJR5T7?e~KAG{w6m=Y>6kCC={@7HAy;XdGsQr;*2wPuaNR7u+>8 zW9zz^p1Jdz27y}BOXAF5ef=NyG`6cP7yi8tD=dk6)XPs;=+s`vCl%CpH$SG6>(1Q; zSK!4IT!ofh4gz4Dnx;a*;=L!II=9 zx&IMa2*x;m#Cq{h0E~05nrD;cY(@W~aJ&xa04YNDpj0ValEn83{Z>zDfV;qu=z0XT zbyI@CB{M=$j0Qy@odf48Yg_Om_J-FK)^*!`2yl?RRH>-d? zolLYs_jG{19T5-W0ZOLPQOJoW#d1XH({CVg8_LHGbd;dAjr>G@$qP{8Vw_nlt3B=- z4mE*-%%TD2?#Ky4I!u>@DN|sMisVzl+jm>ng%FY`hmT~1vA*5ufIXGxh}6c4hh|k% zLKV=xo9&XoCx(*Mro>pZTovw2F++Tnpxv;(+@-zybIW|@30b{P8&mt#$jbx6o=ji5 zZ{Ym!m(W=&V`#h`IA~J%z={jzl*S-8wHKXr<&Kzr*<(IfbsfD?lxWmRYjU684#lY^ zMcTUqXSnO(&^RU2iQ6S=A_82?p41?H!q};tmSY7nM&_p>L&apK{rzUoSe6fZn2%_2 z3Aa(6fqJo5C#KP1OpQZLt%DhZDDS2ZZLuY zA}|dG2`Yw2hW8Bt0RaU71A+k$05F093Ic)w0RV_rD0b18ZL!oh$0&$sNLFJL%?@Wi8+mZ2c zW8u3`Pb1QuG0czY8iFY7e7@Q;5Um0A5ALH~LQq%q9yUc!`H@iO?Q%p$f7t~_Q}X+; zrwl)gU!U|SA&cyc10mwErB@ar9xKQy{4rxanUpSFyyx6r6BTEktcYT-hNl8HQ;pyR zWNuE7fuI33oG6Mnk^XI?|A%10!vtGv9Dv5nG$5Ul#bU^SHid}g@`5FBU4u%8Bg{``xzD<8h9hm`gQ*#vF)#X4IdYT{m%je0RRD`Aut~>9R>qc9S#H*1QbhHjGi>G zRCKz{fjjfcn*TmtQfx2{1_>&LNQU|d|FcrcQ%ri(sjQmsspJIRx3-Z_$A zoas*6iwQPgV8ncNh?xxQ|3pYL&i~R2Gyz)v&Tu__PAPh=26@|hkSB6$%Y5rs9~CcO zinSXxkWqhY&>4Mj-g(2BqnQXnq}kU8fLEYjF#$vg$&|jkw_g|F)U*IS*p2 zAO%?!n9_6f<3Jh_mL<*9bZcHKNWJ-H9$eiV^YOLHXGT=EYYBtOHxQNe9VXjah0|p!c@m>vY z@f38m%@ol^2t4;~W+=2pu>Buc5Yl3cA0=wg%h20`2Hn=?x&ocJNmYY=d{6Hr5}5H) z3;@9QHBJYYzf2IE{^4P87DM(wRLZ%cDqhG%m7upVeMFFi$c(8ns`cUp^vb`FDDC+E zhM8I1PSfk~ct6gJ|A?&0bu>q!Ejt*CfkVrSIU>%Wf#;uyc?uB zHv|=aCG%YYTw${x&VQ+LkxuQ&MkDLny06*yG@OJVh95)PxP4C+2(gPf`SC8q? zEB6ZJtMyDti}f90rnV+l=VX@Qs2Cgc2BnYoEq9nzMd?ww$ezW)0S;YiI6B5U!S$S( zwZ>Gs6=SsWt3)50j;pcs`gC?<-{@7`pT;eRPB&v5;UF*VbO{zBaCO!8i`k>6-p68BYd1qlfqnBBMR=nGrKP^O9J#rwcPt)ZY}Hl6Cv&t&%A}o)^cimb zG9zmt+>G87xWX$28Dztvbm}Kwa91kl4kV-bT%Xh^k-E>_hfWeQ@OvBk6!GGryrIJ zvuls+L8WG*!5NQ6vb{wPB%alh=7}#LO%iVVFLnXGWYk^#r~*?z{;t{{t?Y4^km6Yq z9&`#1=2tH%GcM!#8H$8?!da!>^*sbnZ0$Tj$^cG`Rh0i4P99ts9Io7)){x}#x2VYv zTzFjm0fT}0w=f@v5yY0cDt1&ut(vJ5`cVWQ4sCmV5`G*NUHtsu&Vmp}8*$^+G_+CSsbEkB;B9)<@0tYGw$sdL|kO0hZYI?(ICpV$FTg3zhi?>9S7l*lk zrWGrqo9cD1%^%a#Q-a^PiPw*d`>A#6HZX|oUtBUe}li{5q*|4)Xffz1rsv7!wG;MwufV#HO;{YVe zkuA6|@viS(xja%%hu_LB{)yVH9c$O;f*j2Jau7|$cojluS1da`1D5ZFWwpVqh$e%A?BS*j;;g4>B+}H!(0UH83_aH8C+-FcdKoFc1a&LNQU=d0qv`mDS39cE5POMk=kp zyz5hvh=7C_+m;f5mOR8$Y>Q#u}&RNU^Jv+fuI(++J} zS}JQDu-UKmw`G4bH@IBuZ)ooBC5O8oX4F(A+hDe6@4FLfQ1potr0RaG9Mi?7j$MfTJR3Q7H`aCW9 z;A)rLYH|r1c9A4>LB#f`urKH-5#BCQFrKS8`AKdV$1;xGsNaIb33-@VJVf`eOE-KG z@Vzcllw)B{sDcsT1X0n?!wH^be46o@c5p0;VK`fAhm8*}AH?Sll86U){t7XJnT_tI zFItwm-`jYQ5rcPpFFR0x|tw4WrAqd2OAyU(RNv08U1AovG)JnZk!(K Date: Sat, 24 Aug 2024 15:33:01 -0300 Subject: [PATCH 069/105] Add missing files to fix Woodpecker build --- android.json | 24 ++++++++++++++++++++++++ android.keystore | Bin 0 -> 2071 bytes bundle.keystore | Bin 0 -> 2072 bytes renconstruct.toml | 3 ++- update.pem | 5 +++++ 5 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 android.json create mode 100644 android.keystore create mode 100644 bundle.keystore create mode 100644 update.pem diff --git a/android.json b/android.json new file mode 100644 index 0000000..5167cf5 --- /dev/null +++ b/android.json @@ -0,0 +1,24 @@ +{ + "expansion": false, + "google_play_key": null, + "google_play_salt": null, + "heap_size": "3", + "icon_name": "Snoot Game", + "include_pil": false, + "include_sqlite": false, + "layout": null, + "name": "Snoot Game", + "numeric_version": 1, + "orientation": "sensorLandscape", + "package": "cavemanon.snootgame", + "permissions": [ + "VIBRATE", + "INTERNET" + ], + "source": false, + "store": "none", + "update_always": true, + "update_icons": true, + "update_keystores": true, + "version": "INTERNAL-BUILD" +} \ No newline at end of file diff --git a/android.keystore b/android.keystore new file mode 100644 index 0000000000000000000000000000000000000000..ab39a4531bbefd7ca09ffa3b335f4a645f5bf934 GIT binary patch literal 2071 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 Date: Sat, 24 Aug 2024 15:52:23 -0300 Subject: [PATCH 070/105] Fix stuff --- renconstruct.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renconstruct.toml b/renconstruct.toml index 764598a..5e786f7 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -28,4 +28,4 @@ [renutil] version = "8.2.3" # the Ren'Py version to use (required) - registry = "/tmp/cache" # the directory to store installation files in + registry = "tmp/cache" # the directory to store installation files in From 01135c64b9bdb79a42bffacff568dd440e49ba83 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sat, 24 Aug 2024 19:03:23 -0300 Subject: [PATCH 071/105] Modify cache directory --- renconstruct.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renconstruct.toml b/renconstruct.toml index 764598a..5e786f7 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -28,4 +28,4 @@ [renutil] version = "8.2.3" # the Ren'Py version to use (required) - registry = "/tmp/cache" # the directory to store installation files in + registry = "tmp/cache" # the directory to store installation files in From 05b0525a3d987fdb40cb04b6e83a9a22ff3f7949 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sat, 24 Aug 2024 19:19:15 -0300 Subject: [PATCH 072/105] delete task_dir --- renconstruct.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/renconstruct.toml b/renconstruct.toml index 5e786f7..c5f5174 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -24,7 +24,6 @@ [options] clear_output_dir = false # whether to clear the output directory on startup - task_dir = "./build_patch/" [renutil] version = "8.2.3" # the Ren'Py version to use (required) From 8dd717abeb77c3f87e32600a27ba387fd8f026e3 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sat, 24 Aug 2024 19:40:26 -0300 Subject: [PATCH 073/105] Remove initial dot from android.json --- .woodpecker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index a1d1f09..e399a4b 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -11,7 +11,7 @@ steps: image: debian commands: - sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_TAG}/g" game/options.rpy #Change the internal build name to the tagged version - - sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_TAG}/g" .android.json + - sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_TAG}/g" android.json when: - event: tag @@ -19,7 +19,7 @@ steps: image: debian commands: - sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_SHA}/g" game/options.rpy #if no tag, make it the commit num - - sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_TAG}/g" .android.json + - sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_TAG}/g" android.json when: - event: cron From ac1c51543eb3edcad05eaabba3ea128795824e0c Mon Sep 17 00:00:00 2001 From: Iggy Date: Sat, 24 Aug 2024 22:17:42 -0300 Subject: [PATCH 074/105] Update renconstruct dir command --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index e399a4b..644ac29 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -32,7 +32,7 @@ steps: - sed -i -e "s/VERSION/${RenpyVersion}/g" game/options.rpy #Change the renpy version to the woodpecker reuqested one. #Get Renkit - wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-x86_64-unknown-linux-gnu.tar.xz" | tar -Jax --directory=/tmp/ - - /tmp/renkit-x86_64-unknown-linux-gnu/renconstruct build "." dist/ + - /tmp/renkit-x86_64-unknown-linux-gnu/renconstruct build -c "renconstruct.toml" dist/ - mkdir "dist/android" - mv dist/*.apk "dist/android" - cd /tmp/ From 9078bb8aa143a627df8dac604e3433b43563d3a5 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 25 Aug 2024 21:12:17 -0300 Subject: [PATCH 075/105] Moar possible fixes --- .woodpecker.yml | 4 ++-- renconstruct.toml | 54 +++++++++++++++++++++++++++++++++-------------- 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 644ac29..624a7a3 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -28,11 +28,11 @@ steps: image: openjdk:21-jdk-bookworm commands: - apt update - - apt install libgl1 -y + - apt install libgl1 patch -y - sed -i -e "s/VERSION/${RenpyVersion}/g" game/options.rpy #Change the renpy version to the woodpecker reuqested one. #Get Renkit - wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-x86_64-unknown-linux-gnu.tar.xz" | tar -Jax --directory=/tmp/ - - /tmp/renkit-x86_64-unknown-linux-gnu/renconstruct build -c "renconstruct.toml" dist/ + - /tmp/renkit-x86_64-unknown-linux-gnu/renconstruct build "." dist/ - mkdir "dist/android" - mv dist/*.apk "dist/android" - cd /tmp/ diff --git a/renconstruct.toml b/renconstruct.toml index c5f5174..1c4288b 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -1,30 +1,52 @@ -[tasks.patch] - type = "custom" - enabled = true - ver = "8.2.3" +[tasks.notarize] # required if matching task is enabled + type = "notarize" + enabled = false + priorities = { post_build = 10 } # the priority that determines the orders tasks will run in, defaults to 10 + on_builds = ["mac"] # builds this task should run for, defaults to "mac" + bundle_id = "com.my-game" # the bundle ID of your came, typically in reverse domain notation + key_file = "certificates/private-key.pem" # the path to the private key file generated during the provisioning process + cert_file = "certificates/developerID_application.cer" # the path to the Apple-generated certificate file generated during the provisioning process + app_store_key_file = "certificates/app-store-key.json" # the path to the combined App Store key file generated during the provisioning process [tasks.keystore] # required if matching task is enabled - enabled = true - type="keystore" + type = "keystore" + enabled = false priorities = { pre_build = 0 } # the priority that determines the orders tasks will run in, defaults to 0 on_builds = ["android_apk", "android_aab"] # builds this task should run for, defaults to all android builds keystore_apk = "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" # the base-64 encoded binary keystore file for the APK bundles keystore_aab = "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" # the base-64 encoded binary keystore file for the AAB bundles + alias = "" # the optional alias for both keystores + password = "" # the optional password for both keystores + +[tasks.convert_images] + type = "convert_images" + enabled = false + format = "webp" # webp or avif + priorities = { pre_build = 10 } # the priority that determines the orders tasks will run in, defaults to 10 + on_builds = ["pc", "win", "linux", "mac", "web", "steam", "market", "android_apk", "android_aab"] # builds this task should run for, defaults to all available builds + # extensions: a list of file extensions to convert + # recursive: scans directories recursively if enabled, otherwise only scans the immediate directory + # lossless: converts to lossless WebP if enabled, otherwise converts to lossy WebP + paths."game/images/cg" = { extensions = ["png", "jpg"], recursive = true, lossless = true } # default values + paths."game/images/bg" = { lossless = false } + paths."game/images" = { } # all parameters are optional [build] # required, at least one item must be 'true' - #pc = true # windows + linux - win = true # windows - linux = true # linux - mac = true # macos - #web = false # web - #steam = true # steam - #market = true # multiple markets (i.e. itch.io) - android_apk = true # Android Universal APK - #android_aab = false # Android Play Store Bundle + pc = true # Windows + Linux + win = true # Windows + linux = true # Linux + mac = false # macOS + web = false # Web + steam = false # Steam + market = false # Multiple Markets (i.e. Itch.io) + android_apk = false # Android Universal APK + android_aab = false # Android Play Store Bundle [options] + task_dir = "tasks" # optional path to a directory containing custom tasks clear_output_dir = false # whether to clear the output directory on startup [renutil] version = "8.2.3" # the Ren'Py version to use (required) - registry = "tmp/cache" # the directory to store installation files in + registry = "cache" # the directory to store installation files in + update_pickle = true # causes renutil to update the Pickle version from 2 to 5 for speed improvements at the cost of incompatiblity with Ren'Py 7.x files From 32894af0afac173d09e0b9d792c34b9e78704367 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 25 Aug 2024 21:43:52 -0300 Subject: [PATCH 076/105] Last try --- .woodpecker.yml | 9 +++++++-- renconstruct.toml | 21 ++++++++++++--------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 624a7a3..f9231e4 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,3 +1,9 @@ +clone: + git: + image: woodpeckerci/plugin-git + settings: + depth: 1 + steps: changelog: image: debian @@ -20,7 +26,6 @@ steps: commands: - sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_SHA}/g" game/options.rpy #if no tag, make it the commit num - sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_TAG}/g" android.json - when: - event: cron @@ -80,4 +85,4 @@ matrix: RenpyVersion: - "8.2.3" RenkitVersion: - - "4.4.0" + - "4.3.0" diff --git a/renconstruct.toml b/renconstruct.toml index 1c4288b..c0d5cfe 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -1,3 +1,8 @@ +[tasks.patch] + type = "custom" + enabled = true + ver = "8.2.3" + [tasks.notarize] # required if matching task is enabled type = "notarize" enabled = false @@ -32,21 +37,19 @@ paths."game/images" = { } # all parameters are optional [build] # required, at least one item must be 'true' - pc = true # Windows + Linux + # pc = true # Windows + Linux win = true # Windows linux = true # Linux - mac = false # macOS - web = false # Web - steam = false # Steam - market = false # Multiple Markets (i.e. Itch.io) - android_apk = false # Android Universal APK - android_aab = false # Android Play Store Bundle + mac = true # macOS + # web = false # Web + # steam = false # Steam + # market = false # Multiple Markets (i.e. Itch.io) + android_apk = true # Android Universal APK + # android_aab = false # Android Play Store Bundle [options] - task_dir = "tasks" # optional path to a directory containing custom tasks clear_output_dir = false # whether to clear the output directory on startup [renutil] version = "8.2.3" # the Ren'Py version to use (required) registry = "cache" # the directory to store installation files in - update_pickle = true # causes renutil to update the Pickle version from 2 to 5 for speed improvements at the cost of incompatiblity with Ren'Py 7.x files From 62ffab3bed9d44c3f37309df1d37a8036ab66560 Mon Sep 17 00:00:00 2001 From: Iggy Date: Sun, 25 Aug 2024 21:52:06 -0300 Subject: [PATCH 077/105] Enable keystore task --- renconstruct.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renconstruct.toml b/renconstruct.toml index c0d5cfe..46321af 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -15,7 +15,7 @@ [tasks.keystore] # required if matching task is enabled type = "keystore" - enabled = false + enabled = true priorities = { pre_build = 0 } # the priority that determines the orders tasks will run in, defaults to 0 on_builds = ["android_apk", "android_aab"] # builds this task should run for, defaults to all android builds keystore_apk = "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" # the base-64 encoded binary keystore file for the APK bundles From 7023a06020bff14cbf8504b5bf682f8f165f6153 Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 26 Aug 2024 15:29:04 -0300 Subject: [PATCH 078/105] Rename config.version --- game/options.rpy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/options.rpy b/game/options.rpy index ffa6404..11cfbe8 100644 --- a/game/options.rpy +++ b/game/options.rpy @@ -24,7 +24,7 @@ define gui.show_name = True ## The version of the game. -define config.version = _("INTERNAL-BUILD") +define config.version = "INTERNAL-BUILD" ## Text that is placed on the game's about screen. Place the text between the ## triple-quotes, and leave a blank line between paragraphs. From e060956d826a2d6ca82917de26a1ef4dab82386d Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 26 Aug 2024 15:40:20 -0300 Subject: [PATCH 079/105] Copy renconstruct.toml from Wani --- renconstruct.toml | 45 +++++++++++---------------------------------- 1 file changed, 11 insertions(+), 34 deletions(-) diff --git a/renconstruct.toml b/renconstruct.toml index 46321af..e3646c4 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -3,53 +3,30 @@ enabled = true ver = "8.2.3" -[tasks.notarize] # required if matching task is enabled - type = "notarize" - enabled = false - priorities = { post_build = 10 } # the priority that determines the orders tasks will run in, defaults to 10 - on_builds = ["mac"] # builds this task should run for, defaults to "mac" - bundle_id = "com.my-game" # the bundle ID of your came, typically in reverse domain notation - key_file = "certificates/private-key.pem" # the path to the private key file generated during the provisioning process - cert_file = "certificates/developerID_application.cer" # the path to the Apple-generated certificate file generated during the provisioning process - app_store_key_file = "certificates/app-store-key.json" # the path to the combined App Store key file generated during the provisioning process - [tasks.keystore] # required if matching task is enabled - type = "keystore" enabled = true + type="keystore" priorities = { pre_build = 0 } # the priority that determines the orders tasks will run in, defaults to 0 on_builds = ["android_apk", "android_aab"] # builds this task should run for, defaults to all android builds keystore_apk = "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" # the base-64 encoded binary keystore file for the APK bundles keystore_aab = "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" # the base-64 encoded binary keystore file for the AAB bundles - alias = "" # the optional alias for both keystores - password = "" # the optional password for both keystores -[tasks.convert_images] - type = "convert_images" - enabled = false - format = "webp" # webp or avif - priorities = { pre_build = 10 } # the priority that determines the orders tasks will run in, defaults to 10 - on_builds = ["pc", "win", "linux", "mac", "web", "steam", "market", "android_apk", "android_aab"] # builds this task should run for, defaults to all available builds - # extensions: a list of file extensions to convert - # recursive: scans directories recursively if enabled, otherwise only scans the immediate directory - # lossless: converts to lossless WebP if enabled, otherwise converts to lossy WebP - paths."game/images/cg" = { extensions = ["png", "jpg"], recursive = true, lossless = true } # default values - paths."game/images/bg" = { lossless = false } - paths."game/images" = { } # all parameters are optional [build] # required, at least one item must be 'true' - # pc = true # Windows + Linux - win = true # Windows - linux = true # Linux - mac = true # macOS - # web = false # Web - # steam = false # Steam - # market = false # Multiple Markets (i.e. Itch.io) + #pc = true # windows + linux + #win = true # windows + #linux = true # linux + #mac = true # macos + #web = false # web + steam = true # steam + market = true # multiple markets (i.e. itch.io) android_apk = true # Android Universal APK - # android_aab = false # Android Play Store Bundle + #android_aab = false # Android Play Store Bundle [options] clear_output_dir = false # whether to clear the output directory on startup + task_dir = "./build_patch/" [renutil] version = "8.2.3" # the Ren'Py version to use (required) - registry = "cache" # the directory to store installation files in + registry = "/tmp/cache" # the directory to store installation files in From fc3472692b56a57219552d1b042ca494f01c65b6 Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 26 Aug 2024 15:43:55 -0300 Subject: [PATCH 080/105] Remove task_dir --- renconstruct.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/renconstruct.toml b/renconstruct.toml index e3646c4..da3563c 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -25,7 +25,6 @@ [options] clear_output_dir = false # whether to clear the output directory on startup - task_dir = "./build_patch/" [renutil] version = "8.2.3" # the Ren'Py version to use (required) From 60f8efc6dfd652e3ae365d7c7a9b701f9e4f48db Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 26 Aug 2024 15:49:34 -0300 Subject: [PATCH 081/105] Add build_patch task --- build_patch/patch.diff | 29 +++++++++++++++++++++++++++++ build_patch/patch.py | 19 +++++++++++++++++++ renconstruct.toml | 1 + 3 files changed, 49 insertions(+) create mode 100644 build_patch/patch.diff create mode 100644 build_patch/patch.py diff --git a/build_patch/patch.diff b/build_patch/patch.diff new file mode 100644 index 0000000..c18a321 --- /dev/null +++ b/build_patch/patch.diff @@ -0,0 +1,29 @@ +233a234 +> import os # @UnresolvedImport +236a238,263 +> +> # MODS STUFF +> APP_ID = 1895350 +> +> if not renpy.android: +> try: # Android will try to run this for some reason and fail +> mod_paths = [ +> f"../../workshop/content/{APP_ID}/", +> f"/Users/{os.getlogin()}/Library/Application Support/Steam/steamapps/workshop/content/{APP_ID}/", +> os.path.expanduser(f"~/Library/Application Support/Steam/steamapps/workshop/content/{APP_ID}/") +> ] +> except: +> mod_paths = [] +> +> new_paths = [] +> for path in mod_paths: +> try: +> if os.path.exists(path): +> for name in os.listdir(path): +> full_path = os.path.join(path, name) +> if os.path.isdir(full_path): +> new_paths.append(full_path) +> except Exception as e: +> renpy.display.log.write(f"Error while adding mod search paths: {e}") +> +> searchpath += new_paths diff --git a/build_patch/patch.py b/build_patch/patch.py new file mode 100644 index 0000000..6015aa5 --- /dev/null +++ b/build_patch/patch.py @@ -0,0 +1,19 @@ +class PatchTask: + def __init__(self, config, input_dir, output_dir): + self.config = config + self.input_dir = input_dir + self.output_dir = output_dir + + def pre_build(self): + import subprocess + print("================Initiating patching==================") + + try: + subprocess.run(["patch", f"/tmp/cache/{self.config['ver']}/renpy.py", "./build_patch/patch.diff"]) + except Exception as e: + print(e) + raise e + print("================File Patched==================") + + def post_build(self): + pass diff --git a/renconstruct.toml b/renconstruct.toml index da3563c..e3646c4 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -25,6 +25,7 @@ [options] clear_output_dir = false # whether to clear the output directory on startup + task_dir = "./build_patch/" [renutil] version = "8.2.3" # the Ren'Py version to use (required) From 6d7f357dbbf1de89371273b8795816339e02ae74 Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 26 Aug 2024 15:55:19 -0300 Subject: [PATCH 082/105] Disable android build Add automated Woodpecker run --- .woodpecker/my-first-workflow.yaml | 15 +++++++++++++++ renconstruct.toml | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 .woodpecker/my-first-workflow.yaml diff --git a/.woodpecker/my-first-workflow.yaml b/.woodpecker/my-first-workflow.yaml new file mode 100644 index 0000000..faae0f8 --- /dev/null +++ b/.woodpecker/my-first-workflow.yaml @@ -0,0 +1,15 @@ +when: + - event: push + branch: master + +steps: + - name: build + image: debian + commands: + - echo "This is the build step" + - echo "binary-data-123" > executable + - name: a-test-step + image: golang:1.16 + commands: + - echo "Testing ..." + - ./executable \ No newline at end of file diff --git a/renconstruct.toml b/renconstruct.toml index e3646c4..a64b90f 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -4,7 +4,7 @@ ver = "8.2.3" [tasks.keystore] # required if matching task is enabled - enabled = true + enabled = false type="keystore" priorities = { pre_build = 0 } # the priority that determines the orders tasks will run in, defaults to 0 on_builds = ["android_apk", "android_aab"] # builds this task should run for, defaults to all android builds @@ -20,7 +20,7 @@ #web = false # web steam = true # steam market = true # multiple markets (i.e. itch.io) - android_apk = true # Android Universal APK + android_apk = false # Android Universal APK #android_aab = false # Android Play Store Bundle [options] From 331b628adf8575a153207691b6a3b7c9f7354977 Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 26 Aug 2024 15:59:21 -0300 Subject: [PATCH 083/105] Delete .woodpecker --- .woodpecker/my-first-workflow.yaml | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 .woodpecker/my-first-workflow.yaml diff --git a/.woodpecker/my-first-workflow.yaml b/.woodpecker/my-first-workflow.yaml deleted file mode 100644 index faae0f8..0000000 --- a/.woodpecker/my-first-workflow.yaml +++ /dev/null @@ -1,15 +0,0 @@ -when: - - event: push - branch: master - -steps: - - name: build - image: debian - commands: - - echo "This is the build step" - - echo "binary-data-123" > executable - - name: a-test-step - image: golang:1.16 - commands: - - echo "Testing ..." - - ./executable \ No newline at end of file From baad1afda7184a3fbc976a30d78289af5a969e14 Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 26 Aug 2024 16:06:35 -0300 Subject: [PATCH 084/105] Remove android mkdir --- .woodpecker.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index f9231e4..30a5450 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -25,7 +25,7 @@ steps: image: debian commands: - sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_SHA}/g" game/options.rpy #if no tag, make it the commit num - - sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_TAG}/g" android.json + - sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_SHA}/g" android.json when: - event: cron @@ -38,8 +38,6 @@ steps: #Get Renkit - wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-x86_64-unknown-linux-gnu.tar.xz" | tar -Jax --directory=/tmp/ - /tmp/renkit-x86_64-unknown-linux-gnu/renconstruct build "." dist/ - - mkdir "dist/android" - - mv dist/*.apk "dist/android" - cd /tmp/ archival-sha: From 41e73b07cf05651110ee847e19ea4a5beb85e0c1 Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 26 Aug 2024 16:16:09 -0300 Subject: [PATCH 085/105] Reenable apk build --- renconstruct.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/renconstruct.toml b/renconstruct.toml index a64b90f..e3646c4 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -4,7 +4,7 @@ ver = "8.2.3" [tasks.keystore] # required if matching task is enabled - enabled = false + enabled = true type="keystore" priorities = { pre_build = 0 } # the priority that determines the orders tasks will run in, defaults to 0 on_builds = ["android_apk", "android_aab"] # builds this task should run for, defaults to all android builds @@ -20,7 +20,7 @@ #web = false # web steam = true # steam market = true # multiple markets (i.e. itch.io) - android_apk = false # Android Universal APK + android_apk = true # Android Universal APK #android_aab = false # Android Play Store Bundle [options] From cacc68462abc32f32f78c72a29097c731af46486 Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 26 Aug 2024 16:28:30 -0300 Subject: [PATCH 086/105] - Add missing build.classify - Add android mkdir again --- .woodpecker.yml | 2 ++ game/options.rpy | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/.woodpecker.yml b/.woodpecker.yml index 30a5450..037a054 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -38,6 +38,8 @@ steps: #Get Renkit - wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-x86_64-unknown-linux-gnu.tar.xz" | tar -Jax --directory=/tmp/ - /tmp/renkit-x86_64-unknown-linux-gnu/renconstruct build "." dist/ + - mkdir "dist/android" + - mv dist/*.apk "dist/android" - cd /tmp/ archival-sha: diff --git a/game/options.rpy b/game/options.rpy index 11cfbe8..14b2312 100644 --- a/game/options.rpy +++ b/game/options.rpy @@ -201,6 +201,18 @@ init python: build.classify('game/mods_example/**', None) build.classify('game/mods_example/.**', None) + build.classify('README.md', None) + build.classify('renconstruct.toml', None) + build.classify('bundle.keystore', None) + build.classify('android.keystore', None) + build.classify('bundle.keystore.original', None) + build.classify('android.keystore.original', None) + build.classify('*dist/*', None) + + build.classify('game/dev/**', None) + build.classify('game/dev/.**', None) + build.classify('build_patch/*', None) + ## To archive files, classify them as 'archive'. From 0665ce7f03f1ca917f604dfae325d7617cce5442 Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 26 Aug 2024 16:43:46 -0300 Subject: [PATCH 087/105] Delete update.pem --- update.pem | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 update.pem diff --git a/update.pem b/update.pem deleted file mode 100644 index a771625..0000000 --- a/update.pem +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -MHcCAQEEINSQAh+PgeVP/oMJhal6a49nczZZ3PhYxJbthQPBJ3LpoAoGCCqGSM49 -AwEHoUQDQgAEtAHvD4UZVWu3kHFoXASyXV9Dc5ZKkqrFAHzVYE+W4Wz+ITDHAsuj -+ui1mjQLEYK5ozUT3YXpi5brKLJ09ubvjw== ------END EC PRIVATE KEY----- From 98cd25dc47f5776287261c050c71e73f1440b3aa Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 26 Aug 2024 17:02:38 -0300 Subject: [PATCH 088/105] Delete build.include_update --- game/options.rpy | 3 --- 1 file changed, 3 deletions(-) diff --git a/game/options.rpy b/game/options.rpy index 14b2312..6b341d8 100644 --- a/game/options.rpy +++ b/game/options.rpy @@ -237,6 +237,3 @@ init python: ## by a slash. # define build.itch_project = "renpytom/test-project" - -#RenPy updating from snootgame.xyz -define build.include_update = True From ee8f5b04b78bae08628898d74e62bf0fdcdc907a Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 26 Aug 2024 17:14:34 -0300 Subject: [PATCH 089/105] Update versions to latest and greatest --- .woodpecker.yml | 4 ++-- renconstruct.toml | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 037a054..194d8be 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -83,6 +83,6 @@ steps: matrix: RenpyVersion: - - "8.2.3" + - "8.3.0" RenkitVersion: - - "4.3.0" + - "4.4.0" diff --git a/renconstruct.toml b/renconstruct.toml index e3646c4..c2ff8ab 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -1,11 +1,11 @@ [tasks.patch] type = "custom" enabled = true - ver = "8.2.3" + ver = "8.3.0" [tasks.keystore] # required if matching task is enabled - enabled = true type="keystore" + enabled = true priorities = { pre_build = 0 } # the priority that determines the orders tasks will run in, defaults to 0 on_builds = ["android_apk", "android_aab"] # builds this task should run for, defaults to all android builds keystore_apk = "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" # the base-64 encoded binary keystore file for the APK bundles @@ -13,20 +13,20 @@ [build] # required, at least one item must be 'true' - #pc = true # windows + linux - #win = true # windows - #linux = true # linux - #mac = true # macos - #web = false # web - steam = true # steam - market = true # multiple markets (i.e. itch.io) + # pc = true # windows + linux + win = true # windows + linux = true # linux + mac = true # macos + # web = false # web + # steam = false # steam + # market = false # multiple markets (i.e. itch.io) android_apk = true # Android Universal APK - #android_aab = false # Android Play Store Bundle + # android_aab = false # Android Play Store Bundle [options] clear_output_dir = false # whether to clear the output directory on startup task_dir = "./build_patch/" [renutil] - version = "8.2.3" # the Ren'Py version to use (required) + version = "8.3.0" # the Ren'Py version to use (required) registry = "/tmp/cache" # the directory to store installation files in From 79dff8fcc90573c32d81006da10fef0691f05135 Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 26 Aug 2024 17:15:56 -0300 Subject: [PATCH 090/105] Remove tasks.patch --- build_patch/patch.diff | 29 ----------------------------- build_patch/patch.py | 19 ------------------- renconstruct.toml | 1 - 3 files changed, 49 deletions(-) delete mode 100644 build_patch/patch.diff delete mode 100644 build_patch/patch.py diff --git a/build_patch/patch.diff b/build_patch/patch.diff deleted file mode 100644 index c18a321..0000000 --- a/build_patch/patch.diff +++ /dev/null @@ -1,29 +0,0 @@ -233a234 -> import os # @UnresolvedImport -236a238,263 -> -> # MODS STUFF -> APP_ID = 1895350 -> -> if not renpy.android: -> try: # Android will try to run this for some reason and fail -> mod_paths = [ -> f"../../workshop/content/{APP_ID}/", -> f"/Users/{os.getlogin()}/Library/Application Support/Steam/steamapps/workshop/content/{APP_ID}/", -> os.path.expanduser(f"~/Library/Application Support/Steam/steamapps/workshop/content/{APP_ID}/") -> ] -> except: -> mod_paths = [] -> -> new_paths = [] -> for path in mod_paths: -> try: -> if os.path.exists(path): -> for name in os.listdir(path): -> full_path = os.path.join(path, name) -> if os.path.isdir(full_path): -> new_paths.append(full_path) -> except Exception as e: -> renpy.display.log.write(f"Error while adding mod search paths: {e}") -> -> searchpath += new_paths diff --git a/build_patch/patch.py b/build_patch/patch.py deleted file mode 100644 index 6015aa5..0000000 --- a/build_patch/patch.py +++ /dev/null @@ -1,19 +0,0 @@ -class PatchTask: - def __init__(self, config, input_dir, output_dir): - self.config = config - self.input_dir = input_dir - self.output_dir = output_dir - - def pre_build(self): - import subprocess - print("================Initiating patching==================") - - try: - subprocess.run(["patch", f"/tmp/cache/{self.config['ver']}/renpy.py", "./build_patch/patch.diff"]) - except Exception as e: - print(e) - raise e - print("================File Patched==================") - - def post_build(self): - pass diff --git a/renconstruct.toml b/renconstruct.toml index c2ff8ab..68d84d6 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -25,7 +25,6 @@ [options] clear_output_dir = false # whether to clear the output directory on startup - task_dir = "./build_patch/" [renutil] version = "8.3.0" # the Ren'Py version to use (required) From 9c3ddccbb5b09d4a4936dfc28d054a7a5654c1ef Mon Sep 17 00:00:00 2001 From: Iggy Date: Mon, 26 Aug 2024 17:30:35 -0300 Subject: [PATCH 091/105] Delete deprecated .android.json file --- .android.json | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .android.json diff --git a/.android.json b/.android.json deleted file mode 100644 index fba1690..0000000 --- a/.android.json +++ /dev/null @@ -1 +0,0 @@ -{"expansion": false, "heap_size": "3", "icon_name": "Snoot Game", "include_pil": false, "include_sqlite": false, "layout": null, "name": "Snoot Game", "numeric_version": 1, "orientation": "sensorLandscape", "package": "cavemanon.snootgame", "permissions": ["VIBRATE", "INTERNET"], "source": false, "store": "none", "update_always": true, "update_icons": true, "update_keystores": true, "version": "INTERNAL-BUILD"} From dcff088d112a4a30c1040285ce54ee091bdb709d Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 29 Aug 2024 14:07:05 -0300 Subject: [PATCH 092/105] Remove unused build.classify --- game/options.rpy | 3 --- 1 file changed, 3 deletions(-) diff --git a/game/options.rpy b/game/options.rpy index 6b341d8..e549fe1 100644 --- a/game/options.rpy +++ b/game/options.rpy @@ -206,10 +206,7 @@ init python: build.classify('bundle.keystore', None) build.classify('android.keystore', None) build.classify('bundle.keystore.original', None) - build.classify('android.keystore.original', None) - build.classify('*dist/*', None) - build.classify('game/dev/**', None) build.classify('game/dev/.**', None) build.classify('build_patch/*', None) From 76e61ee78e53d1b95afdb8c6e745b8e17f033c5a Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 29 Aug 2024 14:11:56 -0300 Subject: [PATCH 093/105] fix commit --- game/storyline.rpy | 1 - 1 file changed, 1 deletion(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index d1a55ca..991e14b 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -12,7 +12,6 @@ init -1 python: init python: - def next_story_chapter(): global chapter_list_index, current_chapter, ending_route_number From 908d8f62f7c991ae6fe6b454d062c30a2d523a35 Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 29 Aug 2024 18:07:30 -0300 Subject: [PATCH 094/105] Remove lock_scores logic and point-increasing functions --- game/chapter_variables.rpy | 1 - ...ing-up-at-band-practice-and-giving-feedback.rpy | 2 +- .../4.anon-needs-help-during-music-period.rpy | 2 +- ...fang-and-anon-cut-class-to-talk-on-the-roof.rpy | 6 +++--- .../6.anon-helps-fang-find-a-venue-for-band.rpy | 4 ++-- game/script/7.concert-day.rpy | 2 +- game/script/8.anon-and-fang-study-together.rpy | 2 +- .../9.anons'-dirty-laundry-gets-put-up-to-air.rpy | 2 +- game/src/chapter_select.rpy | 5 +---- game/utility.rpy | 14 -------------- 10 files changed, 11 insertions(+), 29 deletions(-) diff --git a/game/chapter_variables.rpy b/game/chapter_variables.rpy index 575db42..cf19dcc 100644 --- a/game/chapter_variables.rpy +++ b/game/chapter_variables.rpy @@ -15,7 +15,6 @@ define ending_routes = { default anonscore = 0 default fangscore = 0 default wingStory = False -default lock_scores = False # Allows points to be increased # Chapter variables default chapter_list_length = get_chapter_list_length() diff --git a/game/script/3.showing-up-at-band-practice-and-giving-feedback.rpy b/game/script/3.showing-up-at-band-practice-and-giving-feedback.rpy index 808d65e..695f311 100644 --- a/game/script/3.showing-up-at-band-practice-and-giving-feedback.rpy +++ b/game/script/3.showing-up-at-band-practice-and-giving-feedback.rpy @@ -1688,7 +1688,7 @@ label chapter_3: label GuitarQuestionSpeakUp: - $ increase_fang_points() + $ fangscore += 1 "Fang does seem very passionate about playing guitar." diff --git a/game/script/4.anon-needs-help-during-music-period.rpy b/game/script/4.anon-needs-help-during-music-period.rpy index ac0c756..a6533a1 100644 --- a/game/script/4.anon-needs-help-during-music-period.rpy +++ b/game/script/4.anon-needs-help-during-music-period.rpy @@ -654,7 +654,7 @@ label chapter_4: label lHeads: - $ increase_fang_points() + $ fangscore += 1 "Guess that’s that." diff --git a/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy b/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy index 1d7c020..6e55222 100644 --- a/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy +++ b/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy @@ -1193,7 +1193,7 @@ label chapter_5: label lbeHonest: - $ increase_anon_points() + $ anonscore += 1 "I guess honesty is the best policy." window hide @@ -3584,8 +3584,8 @@ label chapter_5: if _value != "Snot": renpy.jump(_value+chr(0x61+_tick)) - $ increase_fang_points() - $ increase_anon_points() + $ fangscore += 1 + $ anonscore += 1 $ wingStory = True A "{cps=*.1}...{/cps}" diff --git a/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy b/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy index 4c38352..87ccb2f 100644 --- a/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy +++ b/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy @@ -1918,7 +1918,7 @@ label chapter_6: label lAnonWaitsForFang: - $ increase_anon_points() + $ anonscore += 1 "{cps=*.1}...{/cps}No." @@ -2308,7 +2308,7 @@ label chapter_6: label lAskFang: - $ increase_fang_points() + $ fangscore += 1 A "Don’t worry about it." pause .5 diff --git a/game/script/7.concert-day.rpy b/game/script/7.concert-day.rpy index 96f6835..a974a75 100644 --- a/game/script/7.concert-day.rpy +++ b/game/script/7.concert-day.rpy @@ -477,7 +477,7 @@ label chapter_7: renpy.jump(renpy.display_menu(randomize_choices(choices))) label LeaveStageAsIs: - $ increase_anon_points() + $ anonscore += 1 pause .5 "Reed may not understand cable management,{w=.4} but then again neither did I." diff --git a/game/script/8.anon-and-fang-study-together.rpy b/game/script/8.anon-and-fang-study-together.rpy index 0bca172..95695f0 100644 --- a/game/script/8.anon-and-fang-study-together.rpy +++ b/game/script/8.anon-and-fang-study-together.rpy @@ -630,7 +630,7 @@ label chapter_8: label lLetFangPlayGuit: - $ increase_fang_points() + $ fangscore += 1 pause .5 diff --git a/game/script/9.anons'-dirty-laundry-gets-put-up-to-air.rpy b/game/script/9.anons'-dirty-laundry-gets-put-up-to-air.rpy index a2dcde6..50ba21b 100644 --- a/game/script/9.anons'-dirty-laundry-gets-put-up-to-air.rpy +++ b/game/script/9.anons'-dirty-laundry-gets-put-up-to-air.rpy @@ -1297,7 +1297,7 @@ label chapter_9: jump lGoHomeEarly label lWaitForTrishToExit: - $ increase_anon_points() + $ anonscore += 1 #play music 'audio/OST/fighter.ogg' fadein 1.0 A "You worried about her, too?" diff --git a/game/src/chapter_select.rpy b/game/src/chapter_select.rpy index b29d3f7..d9e2398 100644 --- a/game/src/chapter_select.rpy +++ b/game/src/chapter_select.rpy @@ -51,13 +51,10 @@ init python: def set_stats(): - global chapter_list_length, ending_route_number, is_end_reached, lock_scores + global chapter_list_length, ending_route_number, is_end_reached - # chapter_list_length = get_chapter_list_length() ending_route_number = get_ending() - lock_scores = True # Prevents scores from increasing when using the chapter selection tool - find_chapter_in_array() if not is_end_reached: diff --git a/game/utility.rpy b/game/utility.rpy index 313ab33..67ad7be 100644 --- a/game/utility.rpy +++ b/game/utility.rpy @@ -29,20 +29,6 @@ init python: else: renpy.unwatch(item) - - def increase_anon_points(): - global anonscore, lock_scores - - if not lock_scores: - anonscore += 1 - - - def increase_fang_points(): - global fangscore, lock_scores - - if not lock_scores: - fangscore += 1 - def toggle_debug(): if persistent.enable_debug_scores: From 7865a0164c62fabbbac773d3d8e52e0ea56a1e63 Mon Sep 17 00:00:00 2001 From: Iggy Date: Thu, 29 Aug 2024 18:23:32 -0300 Subject: [PATCH 095/105] Remove unused globals --- game/src/chapter_select.rpy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game/src/chapter_select.rpy b/game/src/chapter_select.rpy index d9e2398..5c007f7 100644 --- a/game/src/chapter_select.rpy +++ b/game/src/chapter_select.rpy @@ -24,7 +24,7 @@ define tuples_index = [ init python: def select_chapter(): - global current_chapter, is_end_reached, quick_menu + global current_chapter, quick_menu selected_tuple = () @@ -51,7 +51,7 @@ init python: def set_stats(): - global chapter_list_length, ending_route_number, is_end_reached + global ending_route_number, is_end_reached ending_route_number = get_ending() From f38c53776c21d9b5b033e7300355c18fd637bab4 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 30 Aug 2024 14:35:02 -0300 Subject: [PATCH 096/105] Remove tasks.patch --- renconstruct.toml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/renconstruct.toml b/renconstruct.toml index 68d84d6..96106cc 100644 --- a/renconstruct.toml +++ b/renconstruct.toml @@ -1,8 +1,3 @@ -[tasks.patch] - type = "custom" - enabled = true - ver = "8.3.0" - [tasks.keystore] # required if matching task is enabled type="keystore" enabled = true From 803e878c3fad6ef7cbb39d1de3bb4644118e1a1f Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 30 Aug 2024 14:40:28 -0300 Subject: [PATCH 097/105] Remove is_end_of_chapters function --- game/storyline.rpy | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index 991e14b..c213c99 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -16,7 +16,7 @@ init python: global chapter_list_index, current_chapter, ending_route_number # Add check "is_end_reached" to have this if statement be executed only once when finishing the general chapters - if not is_end_reached and is_end_of_chapters(): + if not is_end_reached and chapter_list_index >= chapter_list_length: process_ending() if chapter_list_index < chapter_list_length: @@ -25,10 +25,6 @@ init python: renpy.call(current_chapter) else: end_story() - - - def is_end_of_chapters(): - return chapter_list_index >= chapter_list_length def process_ending(): From a31fa50d8ae3906292710728e9866b607b5d76b6 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 30 Aug 2024 15:02:24 -0300 Subject: [PATCH 098/105] Functions refactoring --- game/src/chapter_select.rpy | 4 ++-- game/storyline.rpy | 13 ++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/game/src/chapter_select.rpy b/game/src/chapter_select.rpy index d9e2398..e442338 100644 --- a/game/src/chapter_select.rpy +++ b/game/src/chapter_select.rpy @@ -58,9 +58,9 @@ init python: find_chapter_in_array() if not is_end_reached: - add_ending_chapters() # From storyline + add_ending_chapters(ending_route_number) - update_ending_variables() # From storyline + update_ending_variables() # Updates variables for newly extended 'chapter_list' with ending chapters def set_scores(anon_score, fang_score): diff --git a/game/storyline.rpy b/game/storyline.rpy index c213c99..2452a39 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -13,7 +13,7 @@ init -1 python: init python: def next_story_chapter(): - global chapter_list_index, current_chapter, ending_route_number + global chapter_list_index, current_chapter # Add check "is_end_reached" to have this if statement be executed only once when finishing the general chapters if not is_end_reached and chapter_list_index >= chapter_list_length: @@ -31,15 +31,15 @@ init python: global ending_route_number ending_route_number = get_ending() - add_ending_chapters() - update_ending_variables() + add_ending_chapters(ending_route_number) + update_ending_variables() # Updates variables for newly extended 'chapter_list' with ending chapters - def add_ending_chapters(): + def add_ending_chapters(route_number): global chapter_list - if ending_route_number in ending_routes: - chapter_list.extend(ending_routes[ending_route_number]) + if route_number in ending_routes: + chapter_list.extend(ending_routes[route_number]) def update_ending_variables(): @@ -55,7 +55,6 @@ init python: return len(chapter_list) - 1 - def end_story(): ending_image() renpy.call("lending") From 719f08ba2433663df04234ba9f7fafe710e61ac7 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 30 Aug 2024 15:18:00 -0300 Subject: [PATCH 099/105] Make set_scores function more readable --- game/src/chapter_select.rpy | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/game/src/chapter_select.rpy b/game/src/chapter_select.rpy index e442338..1a2ace2 100644 --- a/game/src/chapter_select.rpy +++ b/game/src/chapter_select.rpy @@ -91,6 +91,9 @@ label reset_chapter_list: label chapter_select: $ quick_menu = False + $ anon_points = 0 + $ fang_points = 0 + stop sound stop music fadeout 2 scene black with dissolve @@ -99,17 +102,21 @@ label chapter_select: "Initialize scores:" "Ending 1": - $ set_scores(0, 0) + pass # Since points are already initialized at 0 "Ending 2": - $ set_scores(0, 4) + # anon 0 + $ fang_points = 4 "Ending 3": - $ set_scores(4, 0) + $ anon_points = 4 + # fang 0 "Ending 4": - $ set_scores(4, 4) + $ anon_points = 4 + $ fang_points = 4 "Exit to main menu": scene black with dissolve return - + + $ set_scores(anon_points, fang_points) $ is_end_reached = False # Reset this for when the tool is used more than once window hide From a787d1ceaf84a6531299b8991fb0ed486dc532d7 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 30 Aug 2024 17:33:26 -0300 Subject: [PATCH 100/105] Remove unused globals --- game/src/chapter_select.rpy | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/game/src/chapter_select.rpy b/game/src/chapter_select.rpy index 1a2ace2..ad7c639 100644 --- a/game/src/chapter_select.rpy +++ b/game/src/chapter_select.rpy @@ -24,7 +24,7 @@ define tuples_index = [ init python: def select_chapter(): - global current_chapter, is_end_reached, quick_menu + global current_chapter, quick_menu selected_tuple = () @@ -41,7 +41,7 @@ init python: set_stats() toggle_debug() - quick_menu = True + quick_menu = True # Restores the bottom quick menu UI renpy.call(current_chapter) @@ -51,7 +51,7 @@ init python: def set_stats(): - global chapter_list_length, ending_route_number, is_end_reached + global ending_route_number, is_end_reached ending_route_number = get_ending() @@ -89,7 +89,7 @@ label reset_chapter_list: label chapter_select: - $ quick_menu = False + $ quick_menu = False # Hides bottom quick menu UI $ anon_points = 0 $ fang_points = 0 @@ -126,5 +126,4 @@ label chapter_select: $ select_chapter() - From e0027f3c5d010a6939b4da27718b91d4b60d1c4c Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 30 Aug 2024 19:45:30 -0300 Subject: [PATCH 101/105] Add ending chapters to chapter-select tool --- game/src/chapter_select.rpy | 75 +++++++++++++++++++++++++++++-------- 1 file changed, 60 insertions(+), 15 deletions(-) diff --git a/game/src/chapter_select.rpy b/game/src/chapter_select.rpy index ad7c639..ca9f6ab 100644 --- a/game/src/chapter_select.rpy +++ b/game/src/chapter_select.rpy @@ -15,7 +15,38 @@ define chapter_tuple_2 = [ ("11. School assignment and route lock.", "chapter_11") ] -define tuples_index = [ +define ending_1_tuple = [ + ("11A. ", "chapter_11A"), + ("12A. ", "chapter_12A"), + ("12_5D. ", "chapter_12_5D"), + ("13A. ", "chapter_13A"), + ("14A. ", "chapter_14A") +] + +define ending_2_tuple = [ + ("11B. ", "chapter_11B"), + ("12B. ", "chapter_12B"), + ("13B. ", "chapter_13B"), + ("14B. ", "chapter_14B") +] + +define ending_3_tuple = [ + ("11C. ", "chapter_11C"), + ("12C. ", "chapter_12C"), + ("12_5C. ", "chapter_12_5C"), + ("13C. ", "chapter_13C"), + ("14C. ", "chapter_14C") +] + +define ending_4_tuple = [ + ("11D. ", "chapter_11D"), + ("12D. ", "chapter_12D"), + ("12_5D. ", "chapter_12_5D"), + ("13D. ", "chapter_13D"), + ("14D. ", "chapter_14D") +] + +default tuples_index = [ ("Chapters 1 to 6", chapter_tuple_1), ("Chapters 7 to 11", chapter_tuple_2) ] @@ -34,6 +65,7 @@ init python: renpy.jump("chapter_select") current_chapter = display_tuple_menu(selected_tuple) + find_chapter_in_array() if current_chapter == "go_back": continue else: @@ -46,20 +78,26 @@ init python: renpy.call(current_chapter) + def add_ending_tuple(ending_number): + global tuples_index + + ending_tuples = { + 1: ending_1_tuple, + 2: ending_2_tuple, + 3: ending_3_tuple, + 4: ending_4_tuple + } + + if ending_number in ending_tuples: + description = f"Ending {ending_number} chapters" + tuples_index.append((description, ending_tuples[ending_number])) + + def display_tuple_menu(options): return renpy.display_menu(options + [("Go Back", "go_back")]) def set_stats(): - global ending_route_number, is_end_reached - - ending_route_number = get_ending() - - find_chapter_in_array() - - if not is_end_reached: - add_ending_chapters(ending_route_number) - update_ending_variables() # Updates variables for newly extended 'chapter_list' with ending chapters @@ -77,7 +115,7 @@ init python: chapter_list_index = chapter_list.index(current_chapter) except ValueError: chapter_list_index = -1 - current_chapter = "" + current_chapter = "hola" label reset_chapter_list: @@ -85,11 +123,18 @@ label reset_chapter_list: "chapter_1", "chapter_2", "chapter_3", "chapter_4", "chapter_5", "chapter_6", "chapter_7", "chapter_8", "chapter_9", "chapter_10", "chapter_11" ] + + $ tuples_index = [ + ("Chapters 1 to 6", chapter_tuple_1), + ("Chapters 7 to 11", chapter_tuple_2) + ] + return label chapter_select: $ quick_menu = False # Hides bottom quick menu UI + call reset_chapter_list from _call_reset_chapter_list $ anon_points = 0 $ fang_points = 0 @@ -117,13 +162,13 @@ label chapter_select: return $ set_scores(anon_points, fang_points) - $ is_end_reached = False # Reset this for when the tool is used more than once + $ ending_route_number = get_ending() + + $ add_ending_chapters(ending_route_number) + $ add_ending_tuple(ending_route_number) window hide - if not is_end_reached: - call reset_chapter_list from _call_reset_chapter_list - $ select_chapter() From b1cc24fb2ef9760046eafd8d64b75168d44865bd Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 30 Aug 2024 20:03:19 -0300 Subject: [PATCH 102/105] chapter_select improvements --- game/src/chapter_select.rpy | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/game/src/chapter_select.rpy b/game/src/chapter_select.rpy index ca9f6ab..30040c7 100644 --- a/game/src/chapter_select.rpy +++ b/game/src/chapter_select.rpy @@ -65,13 +65,13 @@ init python: renpy.jump("chapter_select") current_chapter = display_tuple_menu(selected_tuple) - find_chapter_in_array() + if current_chapter == "go_back": continue else: + find_chapter_in_array(current_chapter) break - set_stats() toggle_debug() quick_menu = True # Restores the bottom quick menu UI @@ -97,10 +97,6 @@ init python: return renpy.display_menu(options + [("Go Back", "go_back")]) - def set_stats(): - update_ending_variables() # Updates variables for newly extended 'chapter_list' with ending chapters - - def set_scores(anon_score, fang_score): global anonscore, fangscore @@ -108,14 +104,14 @@ init python: fangscore = fang_score - def find_chapter_in_array(): - global chapter_list_index, current_chapter + def find_chapter_in_array(chapter): + global chapter_list_index try: - chapter_list_index = chapter_list.index(current_chapter) + chapter_list_index = chapter_list.index(chapter) except ValueError: chapter_list_index = -1 - current_chapter = "hola" + chapter = "" label reset_chapter_list: @@ -134,7 +130,7 @@ label reset_chapter_list: label chapter_select: $ quick_menu = False # Hides bottom quick menu UI - call reset_chapter_list from _call_reset_chapter_list + call reset_chapter_list from _call_reset_chapter_list # Reset every time the tool is called $ anon_points = 0 $ fang_points = 0 @@ -157,6 +153,7 @@ label chapter_select: "Ending 4": $ anon_points = 4 $ fang_points = 4 + $ wingStory = True "Exit to main menu": scene black with dissolve return @@ -166,6 +163,8 @@ label chapter_select: $ add_ending_chapters(ending_route_number) $ add_ending_tuple(ending_route_number) + + $ update_ending_variables() # Updates variables for newly extended 'chapter_list' with ending chapters window hide From aee5d8b610d6b97d559edf10722e6c0211d950b1 Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 30 Aug 2024 20:31:52 -0300 Subject: [PATCH 103/105] find_chapter_in_array now exits to the main menu in case of error --- game/src/chapter_select.rpy | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/game/src/chapter_select.rpy b/game/src/chapter_select.rpy index 30040c7..b1558f6 100644 --- a/game/src/chapter_select.rpy +++ b/game/src/chapter_select.rpy @@ -109,9 +109,8 @@ init python: try: chapter_list_index = chapter_list.index(chapter) - except ValueError: - chapter_list_index = -1 - chapter = "" + except ValueError: # This crashes the game otherwise since it wouldn't find the correct chapter + MainMenu(confirm=False) () # Exits to the main menu label reset_chapter_list: From 4d3801dd3dae6c89bc7720bd596f556a02f1d2da Mon Sep 17 00:00:00 2001 From: Iggy Date: Fri, 30 Aug 2024 20:35:22 -0300 Subject: [PATCH 104/105] fix commit --- game/src/credits.rpy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/src/credits.rpy b/game/src/credits.rpy index 4a7afd7..5b897e3 100644 --- a/game/src/credits.rpy +++ b/game/src/credits.rpy @@ -315,4 +315,4 @@ label lending: scene black with Dissolve(2) pause 1 - $ MainMenu(confirm=False)() # Exits to the main menu + $ MainMenu(confirm=False) () # Exits to the main menu From 92ee2a56f1c0d5ceb2855e9c2efc04732388fc05 Mon Sep 17 00:00:00 2001 From: Iggy Date: Wed, 18 Sep 2024 12:00:03 -0300 Subject: [PATCH 105/105] Add exit game after ending 1 --- game/storyline.rpy | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/game/storyline.rpy b/game/storyline.rpy index 2452a39..a204465 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -57,6 +57,10 @@ init python: def end_story(): ending_image() - renpy.call("lending") + + if ending_route_number == 1: + renpy.quit() + else: + renpy.call("lending")