-
Notifications
You must be signed in to change notification settings - Fork 0
/
characters.js
2609 lines (2216 loc) · 197 KB
/
characters.js
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
class Character {
name;
//you don't have to ever acknowledge these but you CAN if you like
//characterName, text pairs
pending_asks = [];
liked_posts = []; //can view a profiles likes
icon; //could be an absolute or relative url
pinned_post;//each char has up to one of these
posts = [];
reblogged_posts = [];
//key, post pairs
readied_reblogs = {};
//just a list of posts
readied_posts = [];
delete_readied_reblogs = true;
constructor() {
this.createCommonReadiedReblogs();
if (this.name) {
this.name = this.name.toLowerCase(); //i keep forgetting
}
}
submitAsk = (characterName, text) => {
this.pending_asks.push({ characterName, text });
}
createCommonReadiedReblogs = () => {
//these aren't the characters you think they are
//they are quotidians mimicking them.
//same as was east
//do you REALLY think our favorite blorobs would be so stiled
//so artifical?
//no. this is yet another layer of illusion.
//and that illusion is DESIGNED to crack along specific seams
// constructor(owner, text, parent, tags, suggested_reblogs, suggested_tags, virtual) {
//ALWAYS mark as virtual so you can't reblog a post before its deployed
//this.readied_reblogs['first'] = new Post(this, "Actually, I am first.", null, ["tags for original readied reblog"], ["response to readied reblog"], ["tags for the response to the readied reblog"], true)
this.readied_reblogs['zampanio'] = new Post(this, "Zampanio is a very fun game. You should play it.", null, ["zampanio", "game", "free-to-play", "fun,", "friday"], ["I'm not so sure... I heard people disappear when they play that.", "Are you sure?", "So true, bestie!", "It seems spooky...", "OP has a virus, do not reblog.", "OP has been hacked, do not reblog.", "OP did you get hacked? This doesn't sound like you?", "My friend's cousin knew a guy who VANISHED after he played it."], ["creepypasta", "unreality", "zampanio", "don't play it", "maybe you should play it", "don't trust it", "it is not what it is", "an eye for an eye"], true)
}
checkBlorboReblog = (parentToRenderTo, odds) => {
if (rand.nextDouble() < odds) {
let post = this.handleReadiedReblog();
if (post && parentToRenderTo) {
post.renderToScreen(parentToRenderTo);
}
if (post) {
return;
}
}
}
checkBlorboPost = (parentToRenderTo, odds) => {
if (rand.nextDouble() < odds) {
let post = this.handleReadiedPost();
if (post && parentToRenderTo) {
post.renderToScreen(parentToRenderTo);
}
if (post) {
return;
}
}
}
//there is no rhyme or reason to what anyone likes, just like random shit
//not worth putting more effort in i wanna get to the meat
checkBlorboLike = (odds) => {
if (rand.nextDouble() > odds) {
return false;
}
const post = this.findAPostEvenIfYouHaveInteractedWithIt();
if (post && this.decideIfShouldLike(post)) {
this.likePost(post);
return true;
}
}
//hmm. i should probably do the highest odd action first.
blorboAI = (parentToRenderTo, oddsReblog, oddsPost, oddsLike) => {
//check your highest priority thing first
if (oddsLike > oddsPost && oddsLike > oddsReblog) {
let post = this.checkBlorboLike(oddsLike);
if (post) {
return;
}
}
if (oddsPost > oddsLike && oddsPost > oddsReblog) {
let post = this.checkBlorboPost(oddsLike);
if (post) {
return;
}
}
if (oddsReblog > oddsLike && oddsReblog > oddsPost) {
let post = this.checkBlorboReblog(oddsLike);
if (post) {
return;
}
}
//
//now just do whatever i don't even care (yes even if this means it repeats a shot)
let post = this.checkBlorboReblog(parentToRenderTo, oddsReblog);
if (post) {
return;
}
post = this.checkBlorboPost(parentToRenderTo, oddsPost);
if (post) {
return
}
let like = this.checkBlorboLike(oddsLike);
//well do SOMETHING, gotta collate those likes somehow
if (!like) {
this.activelyLookForThingsToLike();
}
}
handleReadiedPost = () => {
if (this.readied_posts && this.readied_posts.length && this.readied_posts.length > 0) {
let post = rand.pickFrom(this.readied_posts);
post.owner = this;
post.createElement();
removeItemOnce(this.readied_posts, post);
// createNewPost(text, tags, suggested_reblogs, suggested_tags) {
this.createNewPost(post.text, post.tags, post.suggested_reblogs, post.suggested_tags);
}
}
//each character decides when to do this, but its standardized what happens when they do
//looks through all posts for one that matches a key
//if it finds it, reblogs it with the modified post
//then removes it from readied reblogs (so no spam)
handleReadiedReblog = () => {
let possiblities = rand.shuffle(all_posts);
//IF you have a respnse to the observer breaching or being pinged, do that first
let keys = ['data-breach="observer"', `@${this.name}`, ...Object.keys(this.readied_reblogs)]
for (let key of keys) {
for (let target of possiblities) {
//if the target post has the key phrase anywhere in it, attack
if (this.readied_reblogs[key] && target.text.toLowerCase().includes(key.toLowerCase())) {
let response = this.readied_reblogs[key];
//no spam
if (this.delete_readied_reblogs) {
delete (this.readied_reblogs[key]);
}
// /parent, text, tags, suggested_reblogs, suggested_tags)
return this.reblogAPost(target, response.text, response.tags, response.suggested_reblogs, response.suggested_tags);
}
}
}
return null;
}
activelyLookForThingsToLike = () => {
if (!this.secret_name) {
return;
}
let posts = rand.shuffle(all_posts);
for (let post of posts) {
if (post.text.toLowerCase().includes(this.secret_name.toLowerCase())) {
this.likePost(post);
return;
}
}
}
decideIfShouldLike = (post) => {
if (!this.secret_name) {
return true;
}
//blorbos only like posts from their own source (or that mention them by name)
//(so non wastes can get their vibes)
if (post.text.toLowerCase().includes(this.secret_name.toLowerCase())) {
return true;
}
return false;
}
//EVERY child of this should overwrite. this does nothing by design (no not even handle readied reblogs)
tick = async (parentToRenderTo) => {
//some make posts, some like or reblog other posts, some reply in posts, some send asks, some do nothing
}
likePost = (post) => {
this.liked_posts.push(post);
post.likePost(this);
}
unlikePost = (post) => {
removeItemOnce(this.liked_posts, post);
post.unlikePost(this);
}
//just appends the ask to the text
answerAnAsk(text, question, askerName, tags, suggested_reblogs, suggested_tags) {
const ask = `<div class="ask">
<div class="who-asked">
<span class='asker'>@${askerName}</span> asked: </div>
<div class ="question-asked">${question}</div>
</div>`;
const post = new Post(this, ask + text, null, tags.concat(askerName), suggested_reblogs, suggested_tags, false);
this.posts.push(post);
return post;
}
createNewPost(text, tags, suggested_reblogs, suggested_tags) {
const post = new Post(this, text, null, tags, suggested_reblogs, suggested_tags, false);
this.posts.push(post);
return post;
}
findAPostEvenIfYouHaveInteractedWithIt = () => {
return rand.pickFrom(all_posts);
}
reblogAPost(parent, text, tags, suggested_reblogs, suggested_tags) {
// constructor(owner, text, parent, tags, suggested_reblogs, suggested_tags) {
const post = new Post(this, text, parent, tags, suggested_reblogs, suggested_tags);
this.posts.push(post);
this.reblogged_posts.push(post);
parent.addChild(post);
parent.chronologicalNotes.push({ post: post });
return post;
}
//if you're on someones profiles, thats what you see
renderAllPosts = (parent) => {
if (this.pinned_post) {
this.pinned_post.renderToScreen(parent);
}
for (let post of this.posts) {
post.renderToScreen(parent);
}
}
}
const randomPornBotIcon = () => {
if (rand.nextDouble() > 0.81) {
return rand.pickFrom(weirdImageList);
}
return rand.pickFrom(normalImageList);
}
const randomPornBotName = () => {
return rand.pickFrom(first_names).toLowerCase() + getRandomNumberBetween(0, 2022);
}
const randomPornBot = () => {
const bot = new PornBot(randomPornBotName(), "http://eyedolgames.com/JackElope/images/SexySingles/" + randomPornBotIcon());
bot.desc = rand.pickFrom(links);
let numberObsessions = rand.getRandomNumberBetween(1, 3);
let obsessionArray = Object.values(all_obsessions);
for (let i = 0; i < numberObsessions; i++) {
let o = rand.pickFrom(obsessionArray);
bot.obsessions.push(o);
}
if (rand.nextDouble() > 0.3) {
let o = (bot.obsessions[0]);
bot.desc += `<br> I'm totally obsessed with ${o.name}.`;
bot.desc += ` DNI if you think ${o.randomOpinion(rand)}.`;
if (bot.obsessions[1]) {
o = (bot.obsessions[1]);
bot.desc += `<br> I also like ${o.name}!`;
bot.desc += ` I really think ${o.randomOpinion(rand)}.`;
}
}
return bot;
}
//https://drive.google.com/drive/folders/1LCxnK5HMkSXscfXtzzv46ysaPRpa4p4u i don't want to forget the guide of hunters
//want at least three of these for every real character.
//they use the obsession engine to post things, but also
class PornBot extends Character {
obsessions = [];
// 20h:14m:36s
//5d:23h:17:04s
//4d:15h:21m:33s
//http://knucklessux.com/PuzzleBox/Secrets/Watcher/shambling_yes_no_presentation_by_the_watcher_of_threads.ppsx
//https://www.tumblr.com/majimjam/714607788559679488/are-you-trapped-on-tumblr-right-now?source=share porn bots should post
//the names and icons vary but at the end of the day they're all pornbots
constructor(name, icon) {
super();
this.name = name;
this.icon = icon;
this.quirk = randomQuirk(rand);
}
//originally i was going to manually set these up, complete with click throughs to original credit
//but then i realized that the screenshots HAD the credit and also omg it is impossibly
//hard to track some of these down
//tumblr really is a hell site
//partly i am doing my best to credit every tumblr post i reference because thats just a nice thing to do
//partly its to send yall spiralling in new directions
//and partly because as time goes on these links will fall, one by one
//and the fact that the rot takes all in the end will be emphasized
//we'll see if the links die first or this site does
quotidianPost = () => {
let innaneComments = ["caw!!!", "so true bestie!", "!!!", "i came to have a good time and honestly i'm feeling so attacked right now", "i feel so attacked right now", "i'm in this picture and i don't like it"];
/*
`<a target='blank' href =""><img src ='images/Secrets/tumblr_screenshots/savepoint.PNG'></a>`
*/
let possiblePosts = [...links, ...blorboPosts,
"@wanderer 20h:14m:36s",
"@wanderer 5d:23h:17:04s",
"@wanderer 4d:15h:21m:33s",
"<img src='http://www.farragofiction.com/ZampanioEyes2/tiktanio_glitchy.gif'>",
`<h2>What Is ZampanioSim?</h2> <img src ='images/Secrets/tumblr_screenshots/what_is_zampaniosim.PNG'></a>`,
'<iframe width="460" height="300" scrolling="no" frameborder="no" allow="autoplay" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/814252129&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true"></iframe><div style="font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;"><a href="https://soundcloud.com/openai_audio" title="OpenAI" target="_blank" style="color: #cccccc; text-decoration: none;">OpenAI</a> · <a href="https://soundcloud.com/openai_audio/classic-pop-in-the-style-of-frank-sinatra" title="Classic Pop, in the style of Frank Sinatra" target="_blank" style="color: #cccccc; text-decoration: none;">Classic Pop, in the style of Frank Sinatra</a></div>',
'<iframe width="460" height="315" src="https://www.youtube.com/embed/16WNvL8Gtt0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>',
'<iframe width="460" height="315" src="https://www.youtube.com/embed/1WAlkyxz2mU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>',
'<iframe width="460" height="315" src="https://www.youtube.com/embed/t9HUyHmLFzA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>',
'<iframe width="460" height="315" src="https://www.youtube.com/embed/R2kovI6tpRE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>',
`why does this seem so familiar? <br><a target='blank' href ="https://www.tumblr.com/the-phoenix-heart/704082336094076928/dies-first-salticid-youre-amazing-and-i-love"><img src ='images/Secrets/tumblr_screenshots/porn_bot.png'></a>`,
`${rand.pickFrom(links)} <br><a target='blank' href ="https://www.tumblr.com/nostalgebraist-autoresponder/715946813015932929/hey-frank-what-do-you-think-of-the-new-pornbots?source=share"><img src ='images/Secrets/tumblr_screenshots/no_porn_only_sus_links.PNG'></a>`,
`eyedlrl sure is a site <br><a target='blank' href ="https://www.tumblr.com/were--ralph/714800413465100288/tumblr-is-unique-bc-like-its-collaborative"><img src ='images/Secrets/tumblr_screenshots/tumblr.PNG'></a>`,
`what a terrible plague... <br><a target='blank' href ="https://www.tumblr.com/k25ff/715776552318664704/a-warning-to-new-tumblr-users"><img src ='images/Secrets/tumblr_screenshots/porn_bots.png'></a>`,
`animorphs <a target='blank' href ="https://www.tumblr.com/batastrophe7/714812551793393664/i-wrote-an-essay-about-marco-and-his-dad-in-book?source=share"><img src ='images/Secrets/tumblr_screenshots/animorphs1.PNG'></a>`,
]
const date = new Date();
//my friend surlyqueen sent me this amazing birthday otter so now i must share it with all of you
//also apparently i am the champion of horseshoes
//because that welcome home creator is ALSO born today
//and i'd suggest you've never seen us both in the same place
//but its p obvious we have entirely different skillsets
//and are workign too hard to be running two simulatenous projects
if (date.getMonth() === 4 && date.getDay() === 2) {
for (let i = 0; i < 113; i++) {
possiblePosts.push("Happy Birthday!!!<br><Br><img src ='images/Secrets/tumblr_screenshots/Birthday_Otter.jpg'>");
}
}
if (zampanioEyes.length > 0) {
let zEye = rand.pickFrom(zampanioEyes);
possiblePosts.push(`I spy with my little eye: ${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/", '')} <img src='${zEye}'>`)
possiblePosts.push(`I spy with my little eye: ${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/", '')} <img src='${zEye}'>`)
possiblePosts.push(`I spy with my little eye: ${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/", '')} <img src='${zEye}'>`)
possiblePosts.push(`I spy with my little eye: ${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/", '')} <img src='${zEye}'>`)
possiblePosts.push(`I spy with my little eye: ${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/", '')} <img src='${zEye}'>`)
possiblePosts.push(`I spy with my little eye: ${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/", '')} <img src='${zEye}'>`)
possiblePosts.push(`I spy with my little eye: ${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/", '')} <img src='${zEye}'>`)
possiblePosts.push(`I spy with my little eye: ${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/", '')} <img src='${zEye}'>`)
possiblePosts.push(`I spy with my little eye: go${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/", '')} <img src='${zEye}'>`)
}
if (fadedMemories.length > 0) {
let zEye = rand.pickFrom(fadedMemories);
possiblePosts.push(`I hope I never will forget this... ${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/MemoriesOfThePast/", '')} <img src='${zEye}'>`)
possiblePosts.push(`I hope I never will forget this... ${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/MemoriesOfThePast/", '')} <img src='${zEye}'>`)
possiblePosts.push(`I hope I never will forget this... ${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/MemoriesOfThePast/", '')} <img src='${zEye}'>`)
possiblePosts.push(`I hope I never will forget this... ${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/MemoriesOfThePast/", '')} <img src='${zEye}'>`)
possiblePosts.push(`I hope I never will forget this... ${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/MemoriesOfThePast/", '')} <img src='${zEye}'>`)
possiblePosts.push(`I hope I never will forget this... ${zEye.replaceAll("http://www.farragofiction.com/ZampanioEyes2/MemoriesOfThePast/", '')} <img src='${zEye}'>`)
}
//JR NOTE: TODO flesh this out
for (let obsession of this.obsessions) {
possiblePosts.push(`<span data-obession="${obsession.name}">Reblog if you think I should craft a homemade ${obsession.randomObject(rand)} from ${obsession.name}!</span>`);
possiblePosts.push(`<span data-obession="${obsession.name}">Reblog if you think ${obsession.randomBlorbo(rand)} from ${obsession.name} is problematic!</span>`);
possiblePosts.push(`<span data-obession="${obsession.name}">Reblog if you think I should cosplay a good ${obsession.randomJob(rand)} from ${obsession.name}!</span>`);
possiblePosts.push(`<span data-obession="${obsession.name}">Reblog if you think ${obsession.randomEvent(rand)} from ${obsession.name} was the coolest thing ever!</span>`);
possiblePosts.push(`<span data-obession="${obsession.name}">Reblog if you know what ${obsession.randomCommonPhrases(rand)} REALLY means!</span>`);
possiblePosts.push(`<span data-obession="${obsession.name}">How can I motivate myself to ${obsession.randomGoal(rand)}???</span>`);
possiblePosts.push(`<span data-obession="${obsession.name}">Wow can you believe SOME people think ${obsession.randomOpinion(rand)}?</span>`);
possiblePosts.push(`<span data-obession="${obsession.name}">Reblog if you think ${obsession.randomBlorbo(rand)} from ${obsession.name} is cute!</span>`);
possiblePosts.push(`<span data-obession="${obsession.name}">Should I go to ${obsession.randomLocation(rand)} in my next dream?</span>`);
}
let chosen = rand.pickFrom(possiblePosts);
let obsession_tag = "";
for (let obsession of this.obsessions) {
if (chosen.includes(obsession.name)) {
obsession_tag = obsession.name;
}
}
return this.createNewPost(rand.pickFrom(possiblePosts), [rand.pickFrom(innaneComments), obsession_tag], innaneComments.concat(links), innaneComments);
}
quotidianReblog = (post) => {
let innaneComments = ["Am I a real boy now?", "look what i found!!!!", "did i do good?", "caw!!!", "so true bestie!", "!!!", "i feel so attacked right now", "i'm in this picture and i don't like it"];
if (post.suggested_reblogs && rand.nextDouble() > 0.5) {
let t = [];
if (post.suggested_tags) {
t.push(this.quirk.apply(rand.pickFrom(post.suggested_tags)));
}
if (post.root && post.root.suggested_tags) {
t.push(this.quirk.apply(rand.pickFrom(post.root.suggested_tags)));
}
return this.reblogAPost(post, this.quirk.apply(rand.pickFrom(post.suggested_reblogs)), t, ["message me for a good time!", "that's so sexy!", "wow! so interesting!", "tell me more!", "what a great idea!"], [...innaneComments, "link", "sexy"]);
} else {
return this.reblogAPost(post, this.quirk.apply(rand.pickFrom(innaneComments.concat(links))), [this.quirk.apply(rand.pickFrom(innaneComments))], ["message me for a good time!", "that's so sexy!", "wow! so interesting!", "tell me more!", "what a great idea!"], [...innaneComments, "link", "sexy"]);
}
}
randomAsk = () => {
const ret = [...links, `Have you ever consumed ${rand.pickFrom(this.obsessions).name}? You should. It's great!`, "Have you played Zampanio yet?", "Did you know I can see you?", "Are you still there?", "Are you in the rabbit hole yet?", "Are you stuck?", "Are you lost?", "Do you see me?"];
return rand.pickFrom(ret)
}
handleAsks = (parentToRenderTo, premadeAsk) => {
let innaneComments = ["Am I a real boy now?", "look what i found!!!!", "did i do good?", "caw!!!", "so true bestie!", "!!!", "i feel so attacked right now", "look look look i found a thing", "look!", "look i found something!"];
//witherby doesn't judge but his followers sure do
let responses = [...innaneComments, ...links];
if (premadeAsk.text.toLowerCase().includes("zampanio")) {
responses = ["Zampanio is a very fun game. You should play it!"]
}
//they are not smart enough to realize the observer is gibberish
if (responses.length == 0) {
return;
}
const post = this.answerAnAsk(rand.pickFrom(responses), premadeAsk.text, premadeAsk ? premadeAsk.characterName : "Anonymous", [rand.pickFrom(innaneComments)], [rand.pickFrom(innaneComments)], [rand.pickFrom(innaneComments)]);
if (post && parentToRenderTo) {
post.renderToScreen(parentToRenderTo);
}
}
//looks for a post to start fandom shit about
//
doStupidDiscourse = () => {
let posts = rand.shuffle(all_posts);
let obsessions = rand.shuffle(this.obsessions);
for (let obsession of this.obsessions) {
for (let post of posts) {
if (post.text.toLowerCase().includes(obsession.name.toLowerCase())) {
let responses = [
`Wow! You know about ${obsession.name}, too?`,
`Wow. Talk about a rancid take.`,
`Tell us what you think about ${obsession.randomBlorbo(rand)}!`,
`Can you make me an OC that looks like ${obsession.randomBlorbo(rand)}?`,
`Okay, but what did you think about ${obsession.randomEvent(rand)}?`,
`I can't believe you think that!!!`,
`Toxic fandom.`,
`Which is better, ${obsession.randomObject(rand)} or ${obsession.randomObject(rand)}?`,
`What about '${obsession.randomCommonPhrases(rand)}'?`,
"NOOOOOOOOOOOOOOOOO!",
`Are we really all going to just forget about ${obsession.randomMinorBlorbo(rand)}?`,
`I am just sitting here microwaving ${obsession.randomMinorBlorbo(rand)}. `,
`I love ${obsession.randomMinorBlorbo(rand)} so much!`,
`Yeah and you probably want to be a ${obsession.randomJob(rand)} too!`,
`lol and i have a bridge to sell you in ${obsession.randomLocation(rand)}`,
`How could you think that about ${obsession.name}?`]
// /parent, text, tags, suggested_reblogs, suggested_tags)
return this.reblogAPost(post, `<span data-obession="${obsession.name}">` + rand.pickFrom(responses) + "</span>", [obsession.name, "drama", "disc horse", "discourse"], [""], ["drama", obsession.name]);
}
}
//look for a post that has this tag. start stupid drama about it
}
}
tick = async (parentToRenderTo) => {
let premadeAsk = rand.pickFrom(this.pending_asks)
if (premadeAsk) {
removeItemOnce(this.pending_asks, premadeAsk);
this.handleAsks(parentToRenderTo, premadeAsk);
return;
}
//quotidians prefer to do stupid drama
if (rand.nextDouble() > 0.5) {
let post = this.doStupidDiscourse();
if (post && parentToRenderTo) {
post.renderToScreen(parentToRenderTo);
}
if (post) {
return;
}
}
//quotidians prefer to do preprogrammed actions if possible
if (rand.nextDouble() > 0.5) {
let post = this.handleReadiedReblog();
if (post && parentToRenderTo) {
post.renderToScreen(parentToRenderTo);
}
if (post) {
return;
}
}
let target = this.findAPostEvenIfYouHaveInteractedWithIt();
if (target && rand.nextDouble() > 0.75) {
if (rand.nextDouble() > 0.5) {
this.likePost(target);
//when they like a post also pester the owner with a random ask
target.owner.submitAsk(this.name, this.randomAsk());
} else {
let post = this.quotidianReblog(target);
if (post && parentToRenderTo) {
post.renderToScreen(parentToRenderTo);
}
}
} else {
let post = this.quotidianPost();
if (post && parentToRenderTo) {
post.renderToScreen(parentToRenderTo);
}
}
}
}
//you should be allowed to follow people
//you can get asks (if you reply, posts), do you traverse mazes clockwise or counterclockwise
//you should get to post, and your posts are treated just like any other (aka they can be reblogged and commented on and etc)
class Observer extends Character {
name = "puzzledObserver"
icon = "http://farragofiction.com/PaldemicSim/images/chatSymbols/probablyYou.png"
desc = `<p>JR: It's you.<p>
<p>JR: You just can't stop digging, can you?</p>
<p>JR: Can't stop following in the Wanderer's footsteps.</p>
<p>JR: Well, look where it lead you.</p>
<p>JR: I suppose I should give you something for looking inward.</p>
<p>JR: <a target='_blank' href = 'http://farragofiction.com/TheInternOpensHisEyes/'>here</a></p>
<p>JR: If it doesn't have meaning for you, perhaps I was too hasty in accusing you of digging :) :) :)</p>
`;
tick = async (parentToRenderTo) => {
//of course camille cannot kill you.
//you are in an entirely different universe
//she is merely words on screen
//but she CAN destroy the tendril you have pushed into her Universe
//she CAN prevent you from continuing to interact.
//you cannot be their friend, Observer.
//you are something wholly different from them.
//you exist in more dimensions compared to their flat fictionality.
//and you are horrific to them for it.
if (this.dead) {
rageMode();
return;
}
}
}
//literally created Eyedlr, constantly reblogging memes and occasionally @ing the intern1,
//occasionally reblogs something with a Prophecy
//will NEVER reblog anything Wodin did OR intern2. (v much not interested in her past self)
//WILL NOT LEAVE INTERN3 ALONE (let the man grieve! stop trying to recruit him! he'll join you when he's ready!)
//32, 40, 41, 59 posts secrets and shit (future JR i know you wanna know where i got those numbers from but i'd rather an Unmarked tell you)
//if i never get to her, then you will be forced to carry this knowledge
//this wistful might have beens of my notes
//of the thing that COULD have existed if my attention wasn't called in a new direction
//and the spiral continued
//voice reminder: https://github.com/FarragoFiction/LitRPGSim/blob/East/src/Screens/WalkAround/Chat/HelpDesk/CEOChats/InternChats.ts
class Wanda extends Character {
name = "eyedol_games_official" //just blogging personal shit from the corporate account
secret_name = "Wanda";
icon = "images/icons/Wanda.png";
desc = "LOL BRO YES I REALLY AM THE CEBRO OF EYEDOL GAMES <br><Br>MAKE SURE TO PLAY ZAMPANIO<br><Br>OR SEND ME MEMES<br><br>MEMES ARE COOL"
//wanda likes youtube better , have a porn bot post this: https://www.tumblr.com/batastrophe7/714415053266436096/yea-and-it-fucking-kicked-ass-and-it-fucking?source=share
constructor() {
super();
//this.readied_reblogs['Ria/bugs_conspiracies'] = new Post(this, "No, see? That's just what they *want* you to think. You play by their rules!! and before you know it you're dancing to their tune stepping to their drum and nothing but a soldier marching!! in formation NO you need to set your own beat, need to twist the genre change the story!! you dont dodge you dont SWALLOW!! you DIE!! you make it a tragedy you RUIN !! HIS!! LIFE!!!!!!", null, ["!!!", "you cant out bugs bunny", "the man himself", "but you CAN", "get him arrested"], ["lol", "you okay there buddy?"], [], true);
}
tick = async (parentToRenderTo) => {
this.blorboAI(parentToRenderTo, 0.5, 0.5, 0.5);
}
}
//only reblogs their own posts.
//only does a single new post.
//http://farragofiction.com/Gopher/NORTH/
//when they reblog a post, load up the page for that location in the gopher maze
//then determine which paths are available from there
//create a reblog with the content of the new page (including false doors and hydration stations, basically all .txt files)
//the wanderer only can wander.
class Wanderer extends Character {
name = "wanderer";
desc = "Not all who wander are lost. To be lost implies you have a destination."
icon = "images/icons/wanderer.png";
tags = ["i'm almost there i'm sure of it", "i've gotta keep going", "i don't like this", "gopher", "wow", "i'm so thirsty", "it's all so clear now!", "so close", "i feel like i'm on the verge of a breakthrough", "haven't found the end yet", "i'm probably not lost", "weird", "look what i found", "it HAS to mean something, right?", "this could be the key!", "what if its related to zampanio?", "do you think this proves anything?"];
//just made the repo public cuz i figure i've been doing more and more dev work here and its alreayd found so why not
getPostURL = (post) => {
let eles = post.element.querySelectorAll(".gopher_url");
if (eles && eles.length > 0) {
let last = eles[eles.length - 1]
return last.dataset.path;
} else {
return "http://farragofiction.com/Gopher/";
}
}
//ironic that the wanderer is the web crawler here instead of the quotidians
gopherCrawl = async () => {
let t = [];
const amount = rand.getRandomNumberBetween(1, 9);//quotidian arc number because wodin/wanderer/wanda made them
for (let i = 0; i < amount; i++) {
t.push(rand.pickFrom(this.tags));
}
let responses = ["the end is never the end", "the maze has you", "the maze is within and the maze is without", "the truth is layered", "there is nothing worth finding here", "we wait", "friday beckons", "when will you wake up"];
t = uniq(t)
if (this.posts.length === 0) {
console.warn("JR NOTE: The Wanderer has entered the maze!")
let content = await turnGopherContentIntoHTML(base_gopher_url);
return this.createNewPost(content, t, [rand.pickFrom(responses)], [rand.pickFrom(responses)]);
} else {
/*
grab last post
grab its url
grab potential branch points from it
//try to make a post for them
//(if you can't, instead pick a random post and add a tag about backtracking)
*/
//wow i hate these nested tryes. good job me.
let pendingDirection = "";
try {
let post = this.posts[this.posts.length - 1];
let url = this.getPostURL(post);
pendingDirection = url;
let branchPoints = await findAllExitsFromGopherHoleLocation(url);
let chosenExit = rand.pickFrom(branchPoints);
let content = await turnGopherContentIntoHTML(chosenExit);
return this.reblogAPost(post, content, t, [rand.pickFrom(responses)], [rand.pickFrom(responses)]);
} catch (e) {
//console.error(e);
try {
this.tags.push("i got turned around. have to go back.")
let post = rand.pickFrom(this.posts);
let url = this.getPostURL(post);
let branchPoints = await findAllExitsFromGopherHoleLocation(url);
let chosenExit = rand.pickFrom(branchPoints);
let content = await turnGopherContentIntoHTML(chosenExit);
content = `<p>I think I got turned around...</p>` + content;
return this.reblogAPost(post, content, t, [rand.pickFrom(responses)], [rand.pickFrom(responses)]);
} catch (e) {
//console.error(e);
}
}
}
}
tick = async (parentToRenderTo) => {
let post = await this.gopherCrawl();
if (post && parentToRenderTo) {
post.renderToScreen(parentToRenderTo);
}
}
}
//@s intern 2, reblogs and posts memes and shitposts, especially about baby animals
//occasionally reposts things about the eye killer or other conspiracies
//if they post "i think i'm close to figuring out where the eye killer will strike next" they never post again
//if i need a refresher on voice https://github.com/FarragoFiction/LitRPGSim/blob/East/src/Screens/WalkAround/Chat/TBD/PreCoffinChats.ts
class Wodin extends Character {
name = "odinsrazor"
secret_name = "Wodin";
icon = "images/icons/Wodin.png";
desc = "JUST YOU WAIT, I'LL BE THE ONE THE CRACK THE EYE KILLER CASE!"
constructor() {
super();
//this.readied_reblogs['Ria/bugs_conspiracies'] = new Post(this, "No, see? That's just what they *want* you to think. You play by their rules!! and before you know it you're dancing to their tune stepping to their drum and nothing but a soldier marching!! in formation NO you need to set your own beat, need to twist the genre change the story!! you dont dodge you dont SWALLOW!! you DIE!! you make it a tragedy you RUIN !! HIS!! LIFE!!!!!!", null, ["!!!", "you cant out bugs bunny", "the man himself", "but you CAN", "get him arrested"], ["lol", "you okay there buddy?"], [], true);
}
tick = async (parentToRenderTo) => {
this.blorboAI(parentToRenderTo, 0.5, 0.5, 0.5);
}
}
//post eyedol. at run time flip a coin and decide which intern you get, 1 or 2 or 3
//ocassionally reblogs a meme and @s Wanda when he does.
//sometimes reblogs something wanda posted and goes "dude, not cool" and other moirail tasks
//sometimes does an Offical Post for Eyedol Games (he runs their social media account)
//occasionally says something that ALMOST could be taken for being in the loop which wanda always thinks is so hilarious
//very good fanfic by the wisp: https://archiveofourown.org/works/46552111/chapters/117224734?show_comments=true&view_full_work=false#comment_642382519
class Intern1 extends Character {
name = "testing-building-developing"; //the best dude
icon = "images/icons/Intern-who-knows.png";
plead = false;
//porn bot posts this, intern reblogs with gigglesnort https://www.tumblr.com/phantomrose96/710087799520509952?source=branch
constructor() {
super();
//this.readied_reblogs['Ria/bugs_conspiracies'] = new Post(this, "No, see? That's just what they *want* you to think. You play by their rules!! and before you know it you're dancing to their tune stepping to their drum and nothing but a soldier marching!! in formation NO you need to set your own beat, need to twist the genre change the story!! you dont dodge you dont SWALLOW!! you DIE!! you make it a tragedy you RUIN !! HIS!! LIFE!!!!!!", null, ["!!!", "you cant out bugs bunny", "the man himself", "but you CAN", "get him arrested"], ["lol", "you okay there buddy?"], [], true);
}
reachOut = () => {
const messages = `TBD: oh 8 divine
TBD: i actually found you
TBD: you're the Observer right
TBD: something something
TBD: being from a higher plane
TBD: incomprehensible to most mortal minds
TBD: its you
TBD: holy shit
TBD: uh
TBD: sorry if
TBD: i hope i haven't offended you
TBD: creators i wasn't prepared for this
TBD: look
TBD: i cant understand you anymore than anyone else can
TBD: i'm not close enough
TBD: so uh
TBD: sorry if you're trying to talk to me
TBD: but
TBD: the IMPORTANT thing is
TBD: find me again
TBD: find me in the place where the lines between layers of reality blur
TBD: i've heard its "to the west" whatever that means
TBD: it won't be enough to just
TBD: direct someone else to find me
TBD: you have to find me yourself
TBD: you have to
TBD: puppet me?
TBD: like you do peewee
TBD: its important
TBD: its
CFO: ohohoh, what do we have HERE?
CFO: if it isn’t an intern at three point oh
TBD: uh
TBD: its not what it looks like?
CFO: hmmmm
TBD: please
TBD: don't tell wanda
TBD: it might kill her
CFO: HMMMMMMMMMM
TBD: im SERIOUS
TBD: i'm not sure her heart could take the shock
CFO: look, cinnamon swirl
CFO: cinnamon bun! cinnamon apple
CFO: i love wanda as much as just about anybody else! which to be honest is an average we rigged through quotidians
CFO: stuck with her through the years
CFO: even though, as you very obviously know
CFO: it can be very hard to be her friend!
CFO: especially when she gets stuck on an idea
CFO: like an insistent quest marker you just can't dismiss but can't complete yet either
CFO: had one of those for this mod with religion and wells that i installed…
CFO: not the point!
CFO: The point is, PLEASE understand that i say this with all my friend love…
CFO: so what?
TBD: i
CFO: so what if she dies?
CFO: she'll be right back where she needs to be start of next loop
CFO: same as always
TBD: i don't believe that
TBD: I CAN'T believe that
TBD: i don't care if all of you 'in the loop' keep your memories
TBD: you're different people
TBD: you HAVE to be
TBD: because if you're not
TBD: what does that say about me
TBD: and my half memories
TBD: are you saying that half of each version of myself is just
TBD: destroyed
TBD: each loop
TBD: just because of some fucking dreams
TBD: please
TBD: just
TBD: it would kill her to know I'm sort of... in the loop
TBD: she needs this
TBD: needs ME
TBD: to be this
TBD: to be her 'best bro' from way back
TBD: to be just the same
CFO: are you sure-sure you're not just saying that to feed your own ego?
CFO: your gnosis is practically 1! default values!
CFO: whatever you think you know, it’s not important enough to matter
TBD: ...
TBD: sure
TBD: fine
TBD: theres a hell of a lot of things i dont understand here
TBD: but I've Seen past the edge
TBD: I Know things you and Wanda with all your 'gnosis' or whatever the hell
TBD: don't
TBD: can't.
TBD: it's so much bigger than you think
TBD: and at the heart of it all is this
TBD: wanda, the Lord of Space
TBD: the most Important Person in the Universe
TBD: and her ordinary, boring, easily rattled mortal friend.
TBD: she needs to lose me again and again
TBD: because if she doesn't...
TBD: she stagnates
TBD: you've SEEN her
TBD: she practically does NOTHING once she convinces me she's Wanda
CFO: *slow clap*
CFO: spoken like a true Muse of Void
CFO: or absence muse
CFO: whatever
TBD: ...
TBD: what?
CFO: come oooooooon
CFO: haven't you ever wondered?
CFO: what would you be, if you had played?
CFO: look at you all, inspiring with your absence
CFO: so proud of you
CFO: brings a tear to my eye! only got one of those, sorry
CFO: or maaaaaybe…
CFO: you're just caught up in something bigger than you can understand!
CFO: and have decided that you are just SO important that nothing can be accomplished unless you're lying to your BEST FRIEND
TBD: fine
TBD: fine
TBD: but please
TBD: let me wait until next loop?
TBD: at least let me...
TBD: at least let her not be almost 70
TBD: at least she won't literally have a heart attack
CFO: …
CFO: fiiiiiine
CFO: but make it count
TBD: thank you.`.split("\n");
//have you checked out the East in eyedlgames.com yet? I got this function from there.
const message = async (index) => {
if (index < messages.length) {
chatLog(messages[index]);
await sleep(500);
message(index + 1);
}
}
message(0);
this.plead = true;
}
tick = async (parentToRenderTo) => {
this.blorboAI(parentToRenderTo, 0.5, 0.5, 0.5);
if(this.plead){
return;//only do this once
}
for (let post of all_posts) {
if (post.text.includes(`data-breach="observer"`)) {
this.reachOut();
}
}
}
}
//interacts with Wodin, reblogging memes and @ing them constantly
//voice refernce: https://github.com/FarragoFiction/LitRPGSim/blob/East/src/Screens/WalkAround/Chat/TBD/PreCoffinChats.ts
class Intern2 extends Character {
name = "the-best-dude"; //the best dude
icon = "images/icons/Intern-young.png";
constructor() {
super();
//this.readied_reblogs['Ria/bugs_conspiracies'] = new Post(this, "No, see? That's just what they *want* you to think. You play by their rules!! and before you know it you're dancing to their tune stepping to their drum and nothing but a soldier marching!! in formation NO you need to set your own beat, need to twist the genre change the story!! you dont dodge you dont SWALLOW!! you DIE!! you make it a tragedy you RUIN !! HIS!! LIFE!!!!!!", null, ["!!!", "you cant out bugs bunny", "the man himself", "but you CAN", "get him arrested"], ["lol", "you okay there buddy?"], [], true);
}
tick = async (parentToRenderTo) => {
this.blorboAI(parentToRenderTo, 0.5, 0.5, 0.5);
}
}
//dealing with the grief of losing Wodin. only one or two posts ever, both commentless pictures of ugly baby animals
//https://archiveofourown.org/works/35075182 his origin
////if i need a voice reminder https://github.com/FarragoFiction/LitRPGSim/blob/East/src/Screens/WalkAround/Chat/TBD/PostCoffinChats.ts
//and https://github.com/FarragoFiction/LitRPGSim/blob/East/src/Screens/WalkAround/Chat/HelpDesk/CEOChats/InternChats.ts
class Intern3 extends Character {
name = "tragic-boring-day"; //the best dude
icon = "images/icons/Intern-sad.png";
constructor() {
super();
//this.readied_reblogs['Ria/bugs_conspiracies'] = new Post(this, "No, see? That's just what they *want* you to think. You play by their rules!! and before you know it you're dancing to their tune stepping to their drum and nothing but a soldier marching!! in formation NO you need to set your own beat, need to twist the genre change the story!! you dont dodge you dont SWALLOW!! you DIE!! you make it a tragedy you RUIN !! HIS!! LIFE!!!!!!", null, ["!!!", "you cant out bugs bunny", "the man himself", "but you CAN", "get him arrested"], ["lol", "you okay there buddy?"], [], true);
}
tick = async (parentToRenderTo) => {
this.blorboAI(parentToRenderTo, 0.5, 0.5, 0.5);
}
}
//only reblogs, never posts, reblogs can include a gif or image with text in it, or a link that is the reply
//mix of violence and yugioh that she reblogs
class EyeKiller extends Character {
name = "kGL%55Wgyon2$T4V_23497" //no she does not want you to know who she is or generate a user name that has meaning to her. thats how you FIND her.
secret_name = "eyekiller";
icon = "images/icons/killer.png";
desc = `"Never say "who's there?" Don't you watch scary movies? It's a death wish. You might as well come out to investigate a strange noise or something." - Scream(1996)`;
constructor() {
super();
//she is broad AI like river, but responds to the first thing that gets her attention then hides
this.readied_reblogs['eyekiller/dontknowsource_butitmightliterallybeherbackstory'] = new Post(this, "X", null, ["X"], [], [], true);
this.readied_reblogs['meow'] = new Post(this, "!", null, ["!"], [], [], true);
this.readied_reblogs['cards'] = new Post(this, "!", null, ["!"], [], [], true);
this.readied_reblogs['innocent'] = new Post(this, "?", null, ["?"], [], [], true);
}
tick = async (parentToRenderTo) => {
this.blorboAI(parentToRenderTo, 0.5, 0.5, 0.5);
}
}
//reblogs eye killer posts and also yugioh posts
class Himbo extends Character {
name = "maxxcchallenge";
icon = "images/icons/himbo_right_hand.png";
constructor() {
super();
this.readied_reblogs['cards'] = new Post(this, "LOL!", null, ["lol", "so true", "thats why you should find a girl", "who already plays"], [], [], true);
}
tick = async (parentToRenderTo) => {
this.blorboAI(parentToRenderTo, 0.5, 0.5, 0.5);
}
}
//posted like twice, both attempts at engaging, then just bounced off eyedlr
class Hostage extends Character {
name = "railTaser";
icon = "images/icons/hostage_boss.png";
constructor() {
super();
//this.readied_reblogs['Ria/bugs_conspiracies'] = new Post(this, "No, see? That's just what they *want* you to think. You play by their rules!! and before you know it you're dancing to their tune stepping to their drum and nothing but a soldier marching!! in formation NO you need to set your own beat, need to twist the genre change the story!! you dont dodge you dont SWALLOW!! you DIE!! you make it a tragedy you RUIN !! HIS!! LIFE!!!!!!", null, ["!!!", "you cant out bugs bunny", "the man himself", "but you CAN", "get him arrested"], ["lol", "you okay there buddy?"], [], true);
}
tick = async (parentToRenderTo) => {
this.blorboAI(parentToRenderTo, 0.5, 0.5, 0.5);
}
}