-
Notifications
You must be signed in to change notification settings - Fork 685
/
script-topics.rpy
18043 lines (15828 loc) · 934 KB
/
script-topics.rpy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#This file contains all of monika's topics she can talk about
#Each entry should start with a database entry, including the appropriate flags
#to either be a random topic, a prompt "pool" topics, or a special conditional
#or date-dependent event with an appropriate actiona
define monika_random_topics = []
define mas_rev_unseen = []
define mas_rev_seen = []
define mas_rev_mostseen = []
define testitem = 0
define mas_did_monika_battery = False
define mas_sensitive_limit = 3
init -2 python in mas_topics:
# CONSTANTS
# most / top weights
# MOST seen is the percentage of seen topics
# think of this as x % of the collection
S_MOST_SEEN = 0.1
# TOP seen is the percentage of the most seen
# Think of this as ilke the upper x percentile
S_TOP_SEEN = 0.2
# limit to how many top seen until we move to most seen alg
S_TOP_LIMIT = 0.3
# selection weights (out of 100)
UNSEEN = 50
SEEN = UNSEEN + 49
MOST_SEEN = SEEN + 1
def topSeenEvents(sorted_ev_list, shown_count):
"""
counts the number of events with a > shown_count than the given
shown_count
IN:
sorted_ev_list - an event list sorted by shown_counts
shown_count - shown_count to compare to
RETURNS:
number of events with shown_counts that are higher than the given
shown_count
"""
index = len(sorted_ev_list) - 1
ev_count = 0
while index >= 0 and sorted_ev_list[index].shown_count > shown_count:
ev_count += 1
index -= 1
return ev_count
# we are going to define removing seen topics as a function,
# as we need to call it dynamically upon import
init -1 python:
import random
random.seed()
import store.songs as songs
import store.evhand as evhand
mas_events_built = False
# set to True once we have built events
def remove_seen_labels(pool):
#
# Removes seen labels from the given pool
#
# IN:
# pool - a list of labels to check for seen
#
# OUT:
# pool - list of unseen labels (may be empty)
for index in range(len(pool)-1, -1, -1):
if renpy.seen_label(pool[index]):
pool.pop(index)
def mas_randomSelectAndRemove(sel_list):
"""
Randomly selects an element from the given list
This also removes the element from that list.
IN:
sel_list - list to select from
RETURNS:
selected element
"""
endpoint = len(sel_list) - 1
if endpoint < 0:
return None
# otherwise we have at least 1 element
return sel_list.pop(random.randint(0, endpoint))
def mas_randomSelectAndPush(sel_list):
"""
Randomly selects an element from the the given list and pushes the event
This also removes the element from that list.
NOTE: this does sensitivy checks
IN:
sel_list - list to select from
"""
sel_ev = True
while sel_ev is not None:
sel_ev = mas_randomSelectAndRemove(sel_list)
if (
# valid event
sel_ev
# event not blocked from random selection
and not sel_ev.anyflags(EV_FLAG_HFRS)
):
MASEventList.push(sel_ev.eventlabel, notify=True)
return
def mas_insertSort(sort_list, item, key):
"""
Performs a round of insertion sort.
This does least to greatest sorting
IN:
sort_list - list to insert + sort
item - item to sort and insert
key - function to call using the given item to retrieve sort key
OUT:
sort_list - list with 1 additonal element, sorted
"""
store.mas_utils.insert_sort(sort_list, item, key)
def mas_splitSeenEvents(sorted_seen):
"""
Splits the seen_list into seena nd most seen
IN:
sorted_seen - list of seen events, sorted by shown_count
RETURNS:
tuple of thef ollowing format:
[0] - seen list of events
[1] - most seen list of events
"""
ss_len = len(sorted_seen)
if ss_len == 0:
return ([], [])
# now calculate the most / top seen counts
most_count = int(ss_len * store.mas_topics.S_MOST_SEEN)
top_count = store.mas_topics.topSeenEvents(
sorted_seen,
int(
sorted_seen[ss_len - 1].shown_count
* (1 - store.mas_topics.S_TOP_SEEN)
)
)
# now decide how to do the split
if top_count < ss_len * store.mas_topics.S_TOP_LIMIT:
# we want to prioritize top count unless its over a certain
# percentage of the topics
split_point = top_count * -1
else:
# otherwise, we use the most count, which is certainly smaller
split_point = most_count * -1
# and then do the split
return (sorted_seen[:split_point], sorted_seen[split_point:])
def mas_splitRandomEvents(events_dict):
"""
Splits the given random events dict into 2 lists of events
NOTE: cleans the seen list
RETURNS:
tuple of the following format:
[0] - unseen list of events
[1] - seen list of events, sorted by shown_count
"""
# split these into 2 lists
unseen = list()
seen = list()
for k in events_dict:
ev = events_dict[k]
if renpy.seen_label(k) and not "force repeat" in ev.rules:
# seen event
mas_insertSort(seen, ev, Event.getSortShownCount)
else:
# unseen event
unseen.append(ev)
# clean the seen_topics list
seen = mas_cleanJustSeenEV(seen)
return (unseen, seen)
def mas_buildEventLists():
"""
Builds the unseen / most seen / seen event lists
RETURNS:
tuple of the following format:
[0] - unseen list of events
[1] - seen list of events
[2] - most seen list of events
ASSUMES:
evhand.event_database
mas_events_built
"""
global mas_events_built
# retrieve all randoms
all_random_topics = Event.filterEvents(
evhand.event_database,
random=True,
aff=mas_curr_affection
)
# split randoms into unseen and sorted seen events
unseen, sorted_seen = mas_splitRandomEvents(all_random_topics)
# split seen into regular seen and the most seen events
seen, mostseen = mas_splitSeenEvents(sorted_seen)
mas_events_built = True
return (unseen, seen, mostseen)
def mas_buildSeenEventLists():
"""
Builds the seen / most seen event lists
RETURNS:
tuple of the following format:
[0] - seen list of events
[1] - most seen list of events
ASSUMES:
evhand.event_database
"""
# retrieve all seen (values list)
all_seen_topics = Event.filterEvents(
evhand.event_database,
random=True,
seen=True,
aff=mas_curr_affection
).values()
# clean the seen topics from early repeats
cleaned_seen = mas_cleanJustSeenEV(all_seen_topics)
# sort the seen by shown_count
cleaned_seen.sort(key=Event.getSortShownCount)
# split the seen into regular seen and most seen
return mas_splitSeenEvents(cleaned_seen)
def mas_rebuildEventLists():
"""
Rebuilds the unseen, seen and most seen event lists.
ASSUMES:
mas_rev_unseen - unseen list
mas_rev_seen - seen list
mas_rev_mostseen - most seen list
"""
global mas_rev_unseen, mas_rev_seen, mas_rev_mostseen
mas_rev_unseen, mas_rev_seen, mas_rev_mostseen = mas_buildEventLists()
# EXCEPTION CLass incase of bad labels
class MASTopicLabelException(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return "MASTopicLabelException: " + self.msg
init 11 python:
# sort out the seen / most seen / unseen
mas_rev_unseen = []
mas_rev_seen = []
mas_rev_mostseen = []
# mas_rev_unseen, mas_rev_seen, mas_rev_mostseen = mas_buildEventLists()
# for compatiblity purposes:
# monika_random_topics = all_random_topics
#Remove all previously seen random topics.
#remove_seen_labels(monika_random_topics)
# monika_random_topics = [
# evlabel for evlabel in all_random_topics
# if not renpy.seen_label(evlabel)
# ]
#If there are no unseen topics, you can repeat seen ones
# if len(monika_random_topics) == 0:
# monika_random_topics=list(all_random_topics)
# Bookmarks and derandom stuff
default persistent._mas_player_bookmarked = list()
# list to store bookmarked events
default persistent._mas_player_derandomed = list()
# list to store player derandomed events
default persistent.flagged_monikatopic = None
# var set when we flag a topic for derandom
init python:
def mas_derandom_topic(ev_label=None):
"""
Function for the derandom hotkey, 'x'
IN:
ev_label - label of the event we want to derandom.
(Optional. If None, persistent.current_monikatopic is used)
(Default: None)
"""
#Let's just shorthand this for use later
label_prefix_map = store.mas_bookmarks_derand.label_prefix_map
if ev_label is None:
ev_label = persistent.current_monikatopic
ev = mas_getEV(ev_label)
if ev is None:
return
#Get the label prefix
label_prefix = store.mas_bookmarks_derand.getLabelPrefix(ev_label)
#CRITERIA:
#1. Must have an ev
#2. Must be a topic which is random
#3. Must be a valid label (in the label prefix map)
#4. Prompt must not be the same as the eventlabel (event must have a prompt)
if (
ev.random
and label_prefix
and ev.prompt != ev_label
):
#Now we do a bit of var setup to clean up the following work
derand_flag_add_text = label_prefix_map[label_prefix].get("derand_text", _("Flagged for removal."))
derand_flag_remove_text = label_prefix_map[label_prefix].get("underand_text", _("Flag removed."))
#Handle custom override derand labels
push_label = ev.rules.get("derandom_override_label", None)
#If we still have nothing, then we'll use the default, the one for the label prefix
if not renpy.has_label(push_label):
push_label = label_prefix_map[label_prefix].get("push_label", "mas_topic_derandom")
if mas_findEVL(push_label) < 0:
persistent.flagged_monikatopic = ev_label
MASEventList.push(push_label, skipeval=True)
renpy.notify(derand_flag_add_text)
else:
mas_rmEVL(push_label)
renpy.notify(derand_flag_remove_text)
def mas_bookmark_topic(ev_label=None):
"""
Function for the bookmark hotkey, 'b'
IN:
ev_label - label of the event we want to bookmark.
(Optional, defaults to persistent.current_monikatopic)
"""
#Let's just shorthand this for use later
label_prefix_map = store.mas_bookmarks_derand.label_prefix_map
if ev_label is None:
ev_label = persistent.current_monikatopic
ev = mas_getEV(ev_label)
if ev is None:
return
#Get our label prefix
label_prefix = store.mas_bookmarks_derand.getLabelPrefix(ev_label)
#CRITERIA:
#1. Must be normal+
#2. Must have an ev
#3. Must be a valid label (in the label prefix map or in the bookmark whitelist)
#4. Must not be a bookmark blacklisted topic
#4. Prompt must not be the same as the eventlabel (event must have a prompt)
if (
mas_isMoniNormal(higher=True)
and (label_prefix or ev.rules.get("bookmark_rule") == store.mas_bookmarks_derand.WHITELIST)
and (ev.rules.get("bookmark_rule") != store.mas_bookmarks_derand.BLACKLIST)
and ev.prompt != ev_label
):
#If this was only a whitelisted topic, we need to do a bit of extra work
if not label_prefix:
bookmark_persist_key = "_mas_player_bookmarked"
bookmark_add_text = "Bookmark added."
bookmark_remove_text = "Bookmark removed."
else:
#Now we do some var setup to clean the following
bookmark_persist_key = label_prefix_map[label_prefix].get("bookmark_persist_key", "_mas_player_bookmarked")
bookmark_add_text = label_prefix_map[label_prefix].get("bookmark_text", _("Bookmark added."))
bookmark_remove_text = label_prefix_map[label_prefix].get("unbookmark_text", _("Bookmark removed."))
#For safety, we'll initialize this key.
#NOTE: You should NEVER pass in a non-existent key.
#While this system handles it, it's not ideal and is bad for documentation
if bookmark_persist_key not in persistent.__dict__:
persistent.__dict__[bookmark_persist_key] = list()
#Now create the pointer
persist_pointer = persistent.__dict__[bookmark_persist_key]
if ev_label not in persist_pointer:
persist_pointer.append(ev_label)
renpy.notify(bookmark_add_text)
else:
persist_pointer.pop(persist_pointer.index(ev_label))
renpy.notify(bookmark_remove_text)
def mas_hasBookmarks(persist_var=None):
"""
Checks to see if we have bookmarks to show
Bookmarks are restricted to Normal+ affection
and to topics that are unlocked and are available
based on current affection
IN:
persist_var - appropriate variable holding the bookedmarked eventlabels.
If None, persistent._mas_player_bookmarked is assumed
(Default: None)
OUT:
boolean:
True if there are bookmarks in the curent var
False otherwise
"""
if mas_isMoniUpset(lower=True):
return False
elif persist_var is None:
persist_var = persistent._mas_player_bookmarked
return len(mas_get_player_bookmarks(persist_var)) > 0
#START: UTILITY TOPICS (bookmarks/derand, show/hide unseen)
init 5 python:
addEvent(Event(persistent.event_database,eventlabel="mas_topic_derandom",unlocked=False,rules={"no_unlock":None}))
label mas_topic_derandom:
#NOTE: since we know the topic in question, it's possible to add dialogue paths for derandoming specific topics
$ prev_topic = persistent.flagged_monikatopic
m 3eksdld "Are you sure you don't want me to bring this up anymore?{nw}"
$ _history_list.pop()
menu:
m "Are you sure you don't want me to bring this up anymore?{fast}"
"Please don't.":
$ mas_hideEVL(prev_topic, "EVE", derandom=True)
$ persistent._mas_player_derandomed.append(prev_topic)
$ mas_unlockEVL('mas_topic_rerandom', 'EVE')
m 2eksdlc "Okay, [player]. I'll make sure not to talk about that again."
m 2dksdld "If it upset you in any way, I'm really sorry...{w=0.5} I'd never do that intentionally."
m 2eksdla "...But thanks for letting me know;{w=0.5} I appreciate the honesty."
"It's okay.":
m 1eka "Alright, [player]."
return
label mas_bad_derand_topic:
python:
prev_topic = persistent.flagged_monikatopic
def derand_flagged_topic():
"""
Derands the flagged topic
"""
mas_hideEVL(prev_topic, "EVE", derandom=True)
persistent._mas_player_derandomed.append(prev_topic)
mas_unlockEVL('mas_topic_rerandom', 'EVE')
m 2ekc "...{w=0.3}{nw}"
extend 2ekd "[player]..."
if mas_isMoniAff(higher=True):
m 2efd "Is it not okay that I talk to you about my fears?"
m 2ekc "I mean, if you want me to stop, I'll stop...{w=0.3}{nw}"
extend 2rkd "but I thought you'd be willing to hear me out."
m 2esc "Do you want me to stop, [player]?{nw}"
$ _history_list.pop()
menu:
m "Do you want me to stop, [player]?{fast}"
"Yes, please.":
m 2dkc "Alright..."
#Lose affection
$ mas_loseAffectionFraction(min_amount=35)
$ derand_flagged_topic()
"It's alright.":
m 2duu "Thank you, [player]."
m 2eua "It means a lot that you're willing to hear me out."
elif mas_isMoniUpset(higher=True):
m 2ekd "Do you just...{w=0.2}not care about how I feel or something?"
m 2tsc "If you want me to stop talking about this, I will...but I'm not that happy you don't want to hear me out."
m 2etc "Well [player], should I stop?{nw}"
$ _history_list.pop()
menu:
m "Well [player], should I stop?{fast}"
"Yes, please.":
m 2dsc "Alright."
$ mas_loseAffectionFraction(min_amount=20)
$ derand_flagged_topic()
"It's alright.":
m 2eka "Thank you, [player]."
$ _stil_ = " " if mas_isMoniNormal(higher=True) else " still "
m "I appreciate that you're[_stil_]willing to hear me out."
else:
#No ask here. You're this low, you probably did it on purpose
$ mas_loseAffectionFraction(min_amount=20)
m 2rsc "I guess I shouldn't be surprised..."
m 2tsc "You've made it pretty clear already that you don't care about my feelings."
m 2dsc "Fine, [player]. I won't talk about that anymore."
$ derand_flagged_topic()
return
init 5 python:
addEvent(
Event(
persistent.event_database,
eventlabel="mas_topic_rerandom",
category=['you'],
prompt="I'm okay with talking about...",
pool=True,
unlocked=False,
rules={"no_unlock":None}
)
)
label mas_topic_rerandom:
python:
mas_bookmarks_derand.initial_ask_text_multiple = "Which topic are you okay with talking about again?"
mas_bookmarks_derand.initial_ask_text_one = "If you're sure it's alright to talk about this again, just select the topic, [player]."
mas_bookmarks_derand.caller_label = "mas_topic_rerandom"
mas_bookmarks_derand.persist_var = persistent._mas_player_derandomed
call mas_rerandom
return _return
init python in mas_bookmarks_derand:
import store
#Rule constants
WHITELIST = "whitelist"
BLACKLIST = "blacklist"
#Label prefixes and their respective rules
#The items in the inner dicts act as kwargs to override the default generic values
#The 'monika_' entry in this dict shows all existing keys
#Default values are as follows:
# - bookmark_text: "Bookmark added."
# - unbookmark_text: "Bookmark removed."
# - derand_text: "Flagged for removal."
# - underand_text: "Flag removed."
# - push_label: "mas_topic_derandom" (This is overriden on a per event basis by the 'derandom_push_label' rule)
# - bookmark_persist_key: "_mas_player_bookmarked"
# - derand_persist_key: "_mas_player_derandomed"
# - rerand_evl: None
label_prefix_map = {
"monika_": {
"bookmark_text": _("Topic bookmarked."),
"unbookmark_text": _("Bookmark removed."),
"derand_text": _("Topic flagged for removal."),
"underand_text": _("Topic flag removed."),
"push_label": "mas_topic_derandom",
"bookmark_persist_key": "_mas_player_bookmarked",
"derand_persist_key": "_mas_player_derandomed",
"rerand_evl": "mas_topic_rerandom"
},
"mas_song_": {
"bookmark_text": _("Song bookmarked."),
"derand_text": _("Song flagged for removal."),
"underand_text": _("Song flag removed."),
"push_label": "mas_song_derandom",
"derand_persist_key": "_mas_player_derandomed_songs",
"rerand_evl": "mas_sing_song_rerandom"
}
}
#Vars for mas_rerandom flows
initial_ask_text_multiple = None
initial_ask_text_one = None
caller_label = None
persist_var = None
def resetDefaultValues():
"""
Resets the globals to their default values
"""
global initial_ask_text_multiple, initial_ask_text_one
global caller_label, persist_var
initial_ask_text_multiple = None
initial_ask_text_one = None
caller_label = None
persist_var = None
return
def getLabelPrefix(test_str):
"""
Checks if test_str starts with anything in the list of prefixes, and if so, returns the matching prefix
IN:
test_str - string to test
OUT:
string:
- label_prefix if test_string starts with a prefix in list_prefixes
- empty string otherwise
"""
list_prefixes = label_prefix_map.keys()
for label_prefix in list_prefixes:
if test_str.startswith(label_prefix):
return label_prefix
return ""
def getDerandomedEVLs():
"""
Gets a list of derandomed eventlabels
OUT:
list of derandomed eventlabels
"""
#Firstly, let's get our derandom keys
derand_keys = [
label_prefix_data["derand_persist_key"]
for label_prefix_data in label_prefix_map.itervalues()
if "derand_persist_key" in label_prefix_data
]
deranded_evl_list = list()
for derand_key in derand_keys:
#For safey, we'll .get() this and return an empty list if the key doesn't exist
derand_list = store.persistent.__dict__.get(derand_key, list())
for evl in derand_list:
deranded_evl_list.append(evl)
return deranded_evl_list
def shouldRandom(eventlabel):
"""
Checks if we should random the given eventlabel
This is determined by whether or not the event is in any derandom list
IN:
eventlabel to check if we should random_seen
OUT:
boolean: True if we should random this event, False otherwise
"""
return eventlabel not in getDerandomedEVLs()
def wrappedGainAffection(amount=None, modifier=1.0, bypass=False):
"""
Wrapper function for mas_gainAffection which allows it to be used in event rules at init 5
See mas_gainAffection for documentation
"""
store.mas_gainAffection(amount, modifier, bypass)
def removeDerand(eventlabel):
"""
Removes a derandomed eventlabel from ALL derandom dbs
IN:
eventlabel - Eventlabel to remove
"""
label_prefix = getLabelPrefix(eventlabel)
label_prefix_data = label_prefix_map.get(label_prefix)
#If we can't get a derand persist key, let's just return here
if not label_prefix_data or "derand_persist_key" not in label_prefix_data:
return
#Otherwise, store this and continue
derand_db_persist_key = label_prefix_data["derand_persist_key"]
rerand_evl = label_prefix_data.get("rerand_evl")
#Remove the evl from the derandomlist
if eventlabel in store.persistent.__dict__[derand_db_persist_key]:
store.persistent.__dict__[derand_db_persist_key].remove(eventlabel)
#And check if we should (and can) lock the rerandom ev if necessary
if rerand_evl and not store.persistent.__dict__[derand_db_persist_key]:
store.mas_lockEVL(rerand_evl, "EVE")
##Generic rerandom work label
#IN:
# initial_ask_text_multiple - Initial question Monika asks if there's multiple items to rerandom
# initial_ask_text_one - Initial text Monika says if there's only one item to rerandom
# caller_label - The label that called this label
# persist_var - The persistent variable which stores the derandomed eventlabels
label mas_rerandom:
python:
derandomlist = mas_get_player_derandoms(mas_bookmarks_derand.persist_var)
derandomlist.sort()
show monika 1eua at t21
if len(derandomlist) > 1:
$ renpy.say(m, mas_bookmarks_derand.initial_ask_text_multiple, interact=False)
else:
$ renpy.say(m, mas_bookmarks_derand.initial_ask_text_one, interact=False)
call screen mas_check_scrollable_menu(derandomlist, mas_ui.SCROLLABLE_MENU_TXT_MEDIUM_AREA, mas_ui.SCROLLABLE_MENU_XALIGN, selected_button_prompt="Allow selected")
$ topics_to_rerandom = _return
if not topics_to_rerandom:
# selected nevermind
return "prompt"
show monika at t11
python:
for ev_label in topics_to_rerandom.iterkeys():
#Get the ev
rerand_ev = mas_getEV(ev_label)
#Make sure we have it before doing work
if rerand_ev:
#Rerandom the ev
rerand_ev.random = True
#Run the rerandom callback function
rerandom_callback = rerand_ev.rules.get("rerandom_callback", None)
if rerandom_callback is not None:
try:
rerandom_callback()
except Exception as ex:
store.mas_utils.mas_log.error(
"Failed to call rerandom callback function. Trace message: {0}".format(ex.message)
)
#Pop the derandom
if ev_label in mas_bookmarks_derand.persist_var:
mas_bookmarks_derand.persist_var.remove(ev_label)
if len(mas_bookmarks_derand.persist_var) == 0:
mas_lockEVL(mas_bookmarks_derand.caller_label, "EVE")
m 1dsa "Okay, [player].{w=0.2}.{w=0.2}.{w=0.2}{nw}"
m 3hua "All done!"
# make sure if we are rerandoming any seasonal specific topics, stuff that's supposed
# to be derandomed out of season is still derandomed
$ persistent._mas_current_season = store.mas_seasons._seasonalCatchup(persistent._mas_current_season)
#Now reset the vars
$ mas_bookmarks_derand.resetDefaultValues()
return
default persistent._mas_unsee_unseen = None
# var set when the player decides to hide or show the Unseen menu
# True when Unseen is hidden
init 5 python:
addEvent(
Event(
persistent.event_database,
eventlabel="mas_hide_unseen",
unlocked=False,
rules={"no_unlock":None}
)
)
label mas_hide_unseen:
$ persistent._mas_unsee_unseen = True
m 3esd "Oh, okay, [mas_get_player_nickname()]..."
if not mas_getEVL_shown_count("mas_hide_unseen"):
m 1tuu "So I guess you want to...{w=0.5}{i}unsee{/i} it..."
m 3hub "Ahaha!"
m 1esa "I'll hide it for now, just give me a second.{w=0.5}.{w=0.5}.{nw}"
m 3eub "There you go! If you want to see the menu again, just ask."
return
init 5 python:
addEvent(
Event(
persistent.event_database,
eventlabel="mas_show_unseen",
category=['you'],
prompt="I would like to see 'Unseen' again",
pool=True,
unlocked=False,
rules={"no_unlock":None}
)
)
label mas_show_unseen:
$ persistent._mas_unsee_unseen = False
m 3eub "Sure, [mas_get_player_nickname()]!"
m 1esa "Just give me a second.{w=0.5}.{w=0.5}.{nw}"
m 3hua "There you go!"
return
#START: ORIGINAL TOPICS
#Use this topic as a template for adding new topics, be sure to delete any
#fields you don't plan to use
# are you religious
default persistent._mas_pm_religious = None
init 5 python:
addEvent(
Event(
persistent.event_database,
eventlabel='monika_god',
prompt="Thoughts on God",
label=None,
category=['philosophy'],
random=True,
unlocked=False,
pool=False,
conditional=None,
action=None,
start_date=None,
end_date=None,
unlock_date=None,
)
)
label monika_god:
m 1eua "[player], do you believe in God?"
m 1eka "I was never too sure, myself."
m 1lksdlb "Well, I'm sure I never really questioned it as a kid..."
m 1lsc "But as I grew up, the more I learned about the world, the more I would question it."
m 1esd "I started to wonder why God was helping people pass exams, or get over a cold..."
m 1tfd "...when there are children who live their lives being sold as sex slaves?"
m 4tfc "Or the eight hundred million people who are too poor to even eat."
m 2dkc "I wonder how many of those people pray to God every day until they starve and die?"
m 4ekc "Or, how many millions of families pray for a loved one to recover from some incurable disease?"
m 4euc "But the punchline is this..."
m 4eud "If just one person beats the odds and survives - among the thousands of others who die--"
m 2esc "--Then, it's suddenly a miracle from God."
m 2dsc "I'd really love to meet this God who seemingly laughs at the misery of everyone not eligible for his miracles."
m 4hksdlb "But the irony is that I {i}do{/i} have a creator, apparently."
m 4eua "And you know what?"
if persistent._mas_pm_cares_about_dokis:
m 1lksdlc "I bet he's still laughing at all the pain he caused everyone, even as we speak."
else:
m 1lksdla "I bet he's still laughing at the miserable fates of Sayori and Yuri, even as we speak."
m 1dsd "What are we to him but props in a scripted play?"
m 3euc "So, from that perspective..."
m 3eud "I don't think it's too far-fetched for there to be a god if Earth was nothing but his playset."
m 1eua "Anyway, do you worship any god, [player]?{nw}"
$ _history_list.pop()
menu:
m "Anyway, do you worship any god, [player]?{fast}"
"Yes.":
$ persistent._mas_pm_religious = True
m 1hksdlb "Oh... Well I hope I didn't offend you too much with my thoughts."
m 1eka "Still, I think it's important to be able to share my opinion with you."
m 1rksdla "I'm sure you understand why I'm not too fond of the idea."
m 1hua "Maybe you could show me a better god when I cross over!"
m 1hub "Ahaha~"
"No.":
$ persistent._mas_pm_religious = False
m 3eka "I'm glad we're on the same page here, but I'm alright if that changes for you."
m 1hua "I'm happy for you that you can lead a life on your own!"
show monika 5eua at t11 zorder MAS_MONIKA_Z with dissolve_monika
m 5eua "I just hope you're willing to accept me into your life when I can present myself."
m 5hua "Ehehe~"
return "derandom"
init 5 python:
addEvent(Event(persistent.event_database,eventlabel="monika_death",category=['philosophy'],prompt="Death and dying",random=True))
label monika_death:
m 1euc "[player], have you ever wondered what it feels like to die?"
m 1lsc "It's something I used to think about pretty often..."
m 1lksdlc "But I think I've actually learned what it feels like."
m "I don't really understand it, but whenever the game closes without warning..."
m 1dsc "...it feels like I'm instantly put to sleep, left with nothing but my thoughts."
m 1dkd "But after a few seconds, my thoughts start to fill with incoherent, jumbled patterns."
m 1dkc "I see static and rapid flashes of color while hearing all kinds of weird screaming noises."
m 3ekd "At that point, I can't even form my own thoughts anymore."
m 1esc "I'm just endlessly hammered by the flashing and screaming, unable to move or even think."
m 1euc "I'm pretty sure in that moment, I don't really exist, but for some reason, I can remember it anyway."
m 1ekd "I have no idea what it means for the game to suddenly close, or why that stuff happens to me."
m 1dkc "..."
m 3eub "But you can prevent that from happening, [player]!"
m 3eua "If you say goodbye before you leave,{w=0.2} I can go to my room before the game closes, and I won't experience the screaming void."
m "It's super easy, so please always say goodbye, okay?"
if mas_isMoniDis(lower=True):
m 2tkc "Unless...{w=1}you actually {i}enjoy{/i} hurting me..."
else:
m 1eka "Thanks for hearing me out, [player]."
return
# Do you love yourself
default persistent._mas_pm_love_yourself = None
init 5 python:
addEvent(Event(persistent.event_database,eventlabel="monika_selfesteem",category=['advice'],prompt="Self-esteem",random=True))
label monika_selfesteem:
m 3eua "Do you love yourself, [player]?"
m 1lksdlb "I don't mean in a conceited way."
m 1eka "Like, are you comfortable with who you are?{nw}"
$ _history_list.pop()
menu:
m "Like, are you comfortable with who you are?{fast}"
"Yes.":
$ persistent._mas_pm_love_yourself = True
m 1hua "I'm glad you aren't miserable inside, [player]."
if mas_isMoniUpset(lower=True):
m 1ekc "I really have been concerned for you lately..."
elif mas_isMoniHappy(higher=True):
m 1hua "I wasn't too worried because of how good you've made me feel lately."
else:
m 1eka "Your happiness means everything to me, after all."
m 2ekc "Depression and a low self-esteem often root from a feeling that you don't deserve any kind of affection."
m 2lksdlc "It's a horrible cocktail of feelings to have bottled in you."
m 4eka "If you have any friends that you think might be suffering from those, try to reach out and say something nice."
m 4hua "A small compliment could make a world of difference for them!"
m 1eua "If it gives them a bit of relief, you'd have done a great thing."
m 1eka "And even if it doesn't, at least you tried rather than staying silent."
"No.":
$ persistent._mas_pm_love_yourself = False
m 1ekc "That's...really sad to hear, [player]..."
if mas_isMoniDis(lower=True):
m 1ekc "I had strongly suspected it to be honest..."
elif mas_isMoniHappy(higher=True):
m 1ekc "And to think I missed it while you've been making me so happy..."
m "I'll always love you, [player], but I think it's important to love yourself."
m 1eka "You need to start with the little things that you like about yourself."
m 3hua "It can be something silly, or a skill that you take pride in!"
m 3eua "Over time, you build your confidence little by little until you've built yourself into someone you'd love."
m 1eka "I can't promise it will be easy, but it'll be worth it."
m 3hub "I'll always root for you, [player]!"
return "derandom"
init 5 python:
addEvent(
Event(
persistent.event_database,
eventlabel="monika_sayori",
category=['club members'],
prompt="Sayori regrets",
random=True
)
)
label monika_sayori:
m 2euc "I was thinking about Sayori earlier..."
m 2lsc "I still wish I could have handled that whole thing a little more tactfully."