hi
MisterMaya, here is my technical bugs report for s2 ep1 (based on Ep4_v1) there is a lot to say for a single update
note: i dont always look at the script and only play a couple of paths, so consider i may omit stuff myself
the import script is unreliable
couldn't import my save from s1 due to KeyError raised by this line from values_s1.rpy:
Python:
c1_e1_d5_miranda_dm_answer4 = mp_imported_script_variables['c1_e1_d5_miranda_dm_answer4']
ive checked the game script from s1, that var is only sets in "facegram/Facegram_dms/facegram_dms_miranda.rpy" (phone stuff)
but its not defined and because im fully dodging that character the var obviously does not exist in my legit exported save
(other similar cases are possible)
need to replace all the UNSAFE dict's indexation in "values_s1.rpy, label mp_assign_variables" by using get() with the appropriate default value
python's docs -> Mapping Types — dict said:
get(key, default=None, /)
Return the value for key if key is in the dictionary, else default. If default is not given, it defaults to None, so that this method never raises a KeyError.
cf:
Python:
c1_e1_d5_miranda_dm_answer4 = mp_imported_script_variables.get('c1_e1_d5_miranda_dm_answer4', False)
afaik no score were used in s1 (besides lana points in ep1) you're literally importing zeros here:
Python:
score_taylor = mp_imported_script_variables['score_taylor']
score_miranda = mp_imported_script_variables['score_miranda']
score_rose = mp_imported_script_variables['score_rose']
score_danielle = mp_imported_script_variables['score_danielle']
score_aurora = mp_imported_script_variables['score_aurora']
score_sana = mp_imported_script_variables['score_sana']
score_olive = mp_imported_script_variables['score_olive']
score_samara = mp_imported_script_variables['score_samara']
score_elsa = mp_imported_script_variables['score_elsa']
also:
Python:
$ persistent.mp_context_bridge = {} # Clear out the bridge for next runs
if you meant to clean up the now useless big temp vars, thats how its done:
Python:
$ del mp_imported_script_variables, persistent.mp_context_bridge
and from screens.rpy l:2580 there is no reason to ever define them as they are always assigned to a new dict object on each use:
Python:
default mp_imported_script_variables = {} # The Dict that the variables of the imported slot will be stored into
default persistent.mp_context_bridge = {} # Used internally
TLDR:
Python:
start_scratch = mp_imported_script_variables.get('start_scratch', False)
altruistic_choices = mp_imported_script_variables.get('altruistic_choices', 0)
...
custom preferences & some derived stuff
you're using regular vars from the global store (quick_menu, textbox_bg_option, hide_shortcut_music) instead of using persistent vars:
so either these options should only show up when the game is running with the user's save loaded,
or you should move them into the persistent store like any other prefs
note that the replays are executed out of context and thus these regular vars will always use the default values and never save there
also the game use MC/surname -> the replays are looking for the persistent equivalent which aren't settable anywhere, so you end up with the default name in replay
the MC character object is redefined by the MC str name object (same identifier ffs), so i guess all the say statements parse the mc name into a default character or something
-> the defined mc character has a
orange-ish #ED422E color unlike the default
red-purple-ish #cc0066 color that match 'style.say_label.color' (same color when i use the console to say whatever as whoever)
this bug is probably here since ep1
save name pref not implemented
the option does toggle 'persistent.saveName' but the var is not actually in use, replace this from screens.rpy l:1502:
Python:
action If(renpy.get_screen("save"), true=Show("savegameName", accept=FileSave(slot)), false=FileLoad(slot))
by this:
Python:
action If(renpy.get_screen("save"),
If(persistent.saveName,
Show("savegameName", accept=FileSave(slot)),
FileSave(slot)
),
FileLoad(slot)
)
kwargs are scrapped because unnecessary here, except the one forced for multiple bad reason by your scr definition savegameName (accept)
the second problem is with the save name option:
Python:
textbutton _("Save Names") action [SetVariable("persistent.saveName", not persistent.saveName), SetVariable("store.save_name", "" if not persistent.saveName else "Un-Named")] selected persistent.saveName
i know by experience with the renpy menus that the first var sets here is not yet updated for the change to be checked from within the very same action sequence, meaning that you need to do the opposite logic for save_name (i know this sounds absurd)
-> i put toggle in second just in case my theory doesn't always apply (afaik it does but better safe than sorry anyway)
Python:
textbutton _("Save Names") action [SetVariable("save_name", "" if persistent.saveName else "Un-Named"), ToggleField(persistent, "saveName")] selected persistent.saveName
using a toggle as 'persistent.saveName' is a proper bool,
ToggleVariable("persistent.saveName") would work too (this used to be a wrapper for ToggleField prior to renpy 8.2/7.7 but not anymore so use whatever)
closing phone bug
the phone is "showed" as a regular screen not as a menu nor "called" and in phone_navigation/phone_navigation.rpy l:276,
the close button is wrongly doing a Return() on top of Hide() -> you should never do both once you grasp which kind of scr you deal with and in what context
Python:
action [Hide("phone_navigation"), Show("game_buttons"), Return()]
as the result, every time you close the phone, Return is basically pushing the next interaction (ergo this auto-advances one dialog line or pause)
id say its good practice to put the current screen to hide last in the sequence if possible:
Python:
action [Show("game_buttons"), Hide("phone_navigation")]
diary mistake
these 2 following entries are reversed from phone_navigation/diary_navigation.rpy -> c2_e4_diarytracker_8:
Python:
(c2_e4_d3_danielle_selena, _("You told Danielle you cared about her")),
(c2_e4_d3_danielle_danielle, _("You told Danielle you cared about Selena")),
and probably also miss an entry for this var: c2_e4_d3_danielle_curious (see the choices at script_ep4.rpy l:5948)
note: this diary entry only unlocks after the extended scene with danielle on the selfish path
failed var assignments
script_ep4.rpy @ line:4286 $ c2_e4_d2_elsa_calm
script_ep4.rpy @ line:6682 $ c2_e4_d3_mcjob_kiss
script_ep4.rpy @ line:6688 $ c2_e4_d3_mcjob_nokiss
script_ep4.rpy @ line:7424 $ c2_e4_d3_date_askokay
script_ep4.rpy @ line:7429 $ c2_e4_d3_date_noaskokay
script_ep4.rpy @ line:8504 $ c2_e4_d3_taylorlewd_seeokay
script_ep4.rpy @ line:8517 $ c2_e4_d3_taylorlewd_seenookay
script_ep4.rpy @ line:12282 $ c2_e4_d4_sanalunch_lipath
script_ep4.rpy @ line:12863 $ c2_e4_d4_samara_suspicious -> bugged/unreachable*
script_ep4.rpy @ line:12955 $ c2_e4_d4_samara_disappointed -> bugged/unreachable*
script_ep4.rpy @ line:13138 $ c2_e4_d4_samara_poke = False -> as you can guess this should set True
script_ep4.rpy @ line:15021 $ c2_e4_d5_sana_truth
all those python statements were meant to assign the related bool to True but do nothing
none of these are retro-fixable, ppl will have to rollback or use the console to set the appropriate value themselves
(i may make a script asking to set those properly when ive time)
*
not sure whats up in this label l:12736 (second scene with samara):
Python:
label c2_e4_d4_samara_part2:
$ c2_e4_d1_samara_taylormaybe = True
that taylormaybe var is originally sets by the last choice from the first scene with samara,
-> i suspect the assignment here was the dev testing something but then they forget to remove it afterward
because this remove half the dialog possibilities of the scene _part2 (on & off taylor path)