Initial commit

This commit is contained in:
Rares Bozga
2025-11-29 22:53:32 +02:00
parent e9fa13dbd3
commit 461e95114c
157 changed files with 7597 additions and 1 deletions

View File

@@ -0,0 +1,238 @@
ch1_1_preassign:
debug: false
type: world
events:
on player joins:
- if <proc[storyboard_player_state_get].context[<player>|preassign]> == null:
- run storyboard_npc_memalloc "def:<player>|marie|player|<location[-4,2,-15,world]>|Marie Ayashibayomi|true|<script[storyboard_skin_dump].data_key[marie].get[a]>"
- run storyboard_npc_set_assignment def.player:<player> def.name:marie def.assignment:ch1_1_marie_assign
- run storyboard_player_state_set def.player:<player> def.key:preassign def.value:true
ch1_1_marie_assign:
debug: false
type: assignment
actions:
on assignment:
- trigger name:click state:true
interact scripts:
- ch1_1_marie_interact
# TODO: this seems like the wrong place
ch1_1_define_phone:
debug: false
type: task
script:
- define phone <item[glistering_melon_slice]>
- adjust def:phone "display:<&e>Flip Phone"
- adjust def:phone custom_model_data:2
- flag <[phone]> phones:true
- determine <[phone]>
ch1_1_marie_interact:
debug: false
type: interact
steps:
1:
click trigger:
script:
- if <player.flag[textbox_state].if_null[null]> != null:
- stop
- engage player duration:999999s
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Hey there, <proc[storyboard_character_first_name].context[<player>]>!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I'm so happy to see ya!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- definemap choices:
left:
text: Likewise
right:
text: My name?
- ~run textbox_choice def.player:<player> def.queue:<queue> def.choices:<[choices]> save:result
- define choice <entry[result].created_queue.determination.get[1]>
- if <[choice]> == right:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Oh, right." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[sweat]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Let's just say a little bird$$nltold me it, wink wink!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* So, what do you think?$$nlThis town's looking neat, no?" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- definemap choices:
left:
text: Yeah
right:
text: Don't know
- ~run textbox_choice def.player:<player> def.queue:<queue> def.choices:<[choices]> save:result
- define choice <entry[result].created_queue.determination.get[1]>
- if <[choice]> == left:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Right???$$nlOh man." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Golly me! I just love$$nlit here." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- else:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* That's alright, you got this!$$nlYou'll fit right in, I'm sure of it." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[sweat]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I'm actually really fond of this$$nltown, although it's a little small." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You're new anyway, you probably need$$nlsomebody to show you around a little,$$nlno?" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- definemap choices:
top:
text: It would help
bottom:
text: You talk a lot
- ~run textbox_choice def.player:<player> def.queue:<queue> def.choices:<[choices]> save:result
- define choice <entry[result].created_queue.determination.get[1]>
- define displeased false
- if <[choice]> == top:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Oh welp, I had a feeling." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Don't worry dearie, I've gotcha$$nlaaaall covered!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I'll be in front of the Academy." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You know, like... the big building." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* The one with the big gates." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You cannot miss it!$$nlSee you there!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- else:
- define displeased true
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Oh.." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[ummm]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Um.." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[neutral]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Yeah, I, uh.." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[neutral]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Actually.." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[neutral]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I'll be in front of the Academy." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[oof]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Sorry." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[oof]>
- run storyboard_player_freeze def.player:<player>
- ~walk <npc> <location[-4,2,-33,world]>
- run storyboard_npc_movement_commit def.player:<player> def.name:marie def.new_location:<location[-5,2,-78,world]>
- run storyboard_player_unfreeze def.player:<player>
- if !<[displeased]>:
- run storyboard_npc_state_set def.player:<player> def.name:marie def.key:opinion def.value:1
- else:
- run storyboard_npc_state_set def.player:<player> def.name:marie def.key:opinion def.value:-1
- zap 2
- disengage player
2:
click trigger:
script:
- if <player.flag[textbox_state].if_null[null]> != null:
- stop
- engage player duration:999999s
- define displeased false
- define opinion <proc[storyboard_npc_state_get].context[<player>|marie|opinion]>
- ~run ch1_1_define_phone save:result
- define phone <entry[result].created_queue.determination.get[1]>
- if <[opinion]> == null:
- define opinion 1
- if <[opinion]> == 1:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Alrighty, here we are!!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Sorry, sorry." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[sweat]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I'll calm myself down now." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[oof]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I've got to show ya things$$nland I can't be all jumpy!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- else:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Oh. Hey." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Need something?" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- definemap choices:
left:
text: I'm sorry
right:
text: No, bye
- ~run textbox_choice def.player:<player> def.queue:<queue> def.choices:<[choices]> save:result
- define choice <entry[result].created_queue.determination.get[1]>
- if <[choice]> == right:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Mkay." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- wait 1s
- disengage player
- stop
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Hm. Are you now?" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You know, that was kind of$$nlmean of you." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Why should I help you, anyway?" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- definemap choices:
top:
text: I'll change my ways
bottom:
text: You're right, I'm pretending
- ~run textbox_choice def.player:<player> def.queue:<queue> def.choices:<[choices]> save:result
- define choice <entry[result].created_queue.determination.get[1]>
- if <[choice]> == top:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Well." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* . . ." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[neutral]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Okay, look, if you insist." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[oof]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I'll try to pretend that$$nlnever happened." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[neutral]>
- else:
- define displeased true
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Well." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[ugh]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I should've guessed." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* So look, I'll cut it short." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I was going to show you around$$nland then give you a flip phone." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* But honestly, I don't care$$nlabout that anymore, so why don't$$nlyou just take the phone instead?" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Makes things easier." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:$$nl(You got the flip phone.)"
- give <[phone]>
- run storyboard_player_freeze def.player:<player>
- ~walk <npc> <location[-6,2,-83,world]>
- run storyboard_npc_memfree def.player:<player> def.name:marie
- run storyboard_player_unfreeze def.player:<player>
- goto done
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* As promised, I'll show you around." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[neutral]>
- if <[opinion]> == 1:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You should pay attention$$nlbecause it's going to help you out!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I hope so at least!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- else:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You can pay attention, but$$nlhonestly I don't care." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[neutral]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Anyway, follow me." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~walk <npc> <location[2,2,-130,world]> speed:1
- ~run storyboard_waituntil_safe def.player:<player> def.queue:<queue> def.condition:[player].location.distance_squared[<location[2,2,-130,world]>].is_less_than[10]
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* So this is the academy." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Really big place." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Nobody really likes the <&4><&l>dean<&0><&l>, or$$nlwell, so I hear." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[neutral]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Grumpy, rich... You get the idea." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[neutral]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Although, they did something right." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Behind this building, there are$$nlsome <&o>sport fields." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* A lot of people really enjoy them." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I'll take you there soon, but$$nllet's walk through the academy a bit." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~walk <npc> <location[23,2,-174,world]> speed:1
- ~walk <npc> <location[2,2,-197,world]> speed:1
- ~walk <npc> <location[2,5,-225,world]> speed:1
- ~run storyboard_waituntil_safe def.player:<player> def.queue:<queue> def.condition:[player].location.distance_squared[<location[2,5,-225,world]>].is_less_than[10]
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* So, anyway, the <&4><&l>dean<&0><&l> really went$$nlextra with this." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* No, but really...$$nlA decorative garden at the$$nlentrance...?" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[surprised]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Anyway, let's keep going." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~walk <npc> <location[12,5,-240,world]> speed:1
- ~walk <npc> <location[2,5,-254,world]> speed:1
- ~walk <npc> <location[2,4,-314,world]> speed:1
- ~run storyboard_waituntil_safe def.player:<player> def.queue:<queue> def.condition:[player].location.distance_squared[<location[2,4,-314,world]>].is_less_than[10]
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* It is pretty, is it not?" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Maybe they had a point." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[surprised]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Though I think people would appreciate$$nlit if they stopped being as snarky." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Not everyone in this town is kind and$$nlnice to you, you know?" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[neutral]>
- if <[opinion]> != 1:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* <&o>I can think of one, at least." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[upset]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* So it's best you are careful." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You never know who you'll run into." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~walk <npc> <location[2,2,-333,world]> speed:1
- ~walk <npc> <location[-34,2,-359,world]> speed:1
- ~walk <npc> <location[-24,2,-398,world]> speed:1
- ~walk <npc> <location[2,2,-419,world]> speed:1
- ~run storyboard_waituntil_safe def.player:<player> def.queue:<queue> def.condition:[player].location.distance_squared[<location[2,2,-419,world]>].is_less_than[10]
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Well, here are the sport fields." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I heard they're quite fun to play at!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Though I suppose you'll need a friend,$$nlso maybe go together with someone!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[neutral]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I'm sure you can call someone on$$nlthe phone!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- define should_give_phone <player.inventory.map_slots.values.filter[has_flag[phones]].is_empty>
- if <[should_give_phone]>:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* ..." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[ummm]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* What?!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[ummm]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You don't have a phone?" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[ummm]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Hey, I know." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I'll just give you a flip phone!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You can call, text, play music..." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Give it a try!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:$$nl(You got the flip phone.)"
- fakeitem <[phone]> slot:hand
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Oh, and..." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* We can continue at the Central Park." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I hear it's really easy to get there!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:$$nl(You remember something about /spawn)"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Well then, toodles!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[marie].get[happy]>
- run storyboard_player_freeze def.player:<player>
- ~walk <npc> <location[-44,2,-378,world]> speed:2
- run storyboard_player_unfreeze def.player:<player>
- run storyboard_npc_movement_commit def.player:<player> def.name:marie def.new_location:<location[-4,2,-15,world]>
- inventory update
- if <[should_give_phone]>:
- give <[phone]>
- mark done
- if !<[displeased]>:
- run storyboard_npc_state_set def.player:<player> def.name:marie def.key:opinion def.value:<[opinion].add[1]>
- else:
- run storyboard_npc_state_set def.player:<player> def.name:marie def.key:opinion def.value:<[opinion].sub[1]>
- inventory update
- zap 3
- disengage player

View File

@@ -0,0 +1,24 @@
storyboard_skin_dump:
debug: false
type: data
marie:
a: ewogICJ0aW1lc3RhbXAiIDogMTcwNjgwNTQ4MjM3OSwKICAicHJvZmlsZUlkIiA6ICJhODJkZTliNjZhYjE0OGZhOTQ3OGY0OWJiZjg5OTk1YyIsCiAgInByb2ZpbGVOYW1lIiA6ICJmdWhyM3JibDRiIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2Q5OTI3MTA4ZDI4MmQ0NTYxMmM5YWZmZGQ4NDA2ODAzYWNjYmY5ZWY5N2MyMzA4NDgwNGQ3YzYwNjAyNTlkZGMiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==;to+5mawLkRklTI+r+N5HE/aMJPRtBYAzccTCAWfDhcH/6qpV3t25tsokGhZIfwyzn34ckycN0+Qo/HwIHpK4BYljf4TfnEI1/zLoH7V4oPnVjlwOuZuFT30OVlTo6z2vaWm3ZvhzAYsW6prt51CBZY2sGu76cBtbck7qOVUCdVzo+998dXWz19NF6mfZk11wKEsMeTWId9xB6KsNhZeqYrUr1R+PTzLl9fgsexPJ2WqZFpk1sGVzxdsxdjDxB4tDin9hulfnCq3Ar4xP+N8d1k6DMeudFaD6HltNRyfRr5nxIq7IyBU4dLG/aakUyasgVsU00v68+yzTA90sga8NSv9b1C0YTv91HcCIGbwmAoqGxuDibafkDTpEMfLAjRSIA4lxzJqZXCXssuTCzWnQVgS4OCm+MAwB08uX6uPMdL0EJwX3vMeiajQrX4P0oViKO4H0KwQnMXMOx5PqLDdFtWiBOE0NGTdJ1BqBfNbg4h3tNIv08y3hqUgUj/owfRnJ9X5EXibH2qk5+p4pHa15oDgM2Q6mSn4tkofR5nymvV8/YhtQLG9LJgeHsn6gY4ndWWk3zM3Gx3TOsDozrYs0hIfBSdLo6FJ0+7I2N/ga1Zj3Rj40d8EwGzrJrIY7v5Cz3zLnH8b70eUdAtGwW67/Qx1x/tmykKS1nfS9CGQW91M=;Marie
storyboard_avatar_dump:
debug: false
type: data
marie:
normal: 錁
neutral: 錂
happy: 錃
upset: 錄
surprised: 錅
ummm: 錆
sweat: 錇
ugh: 錈
oof: 錉
emika:
normal: 錑
smirk: 錒
smile: 錓
unimpressed: 錔

View File

@@ -0,0 +1,47 @@
dialogue_npc_kobayashi_assign:
debug: false
type: assignment
actions:
on assignment:
- trigger name:click state:true
interact scripts:
- dialogue_npc_kobayashi
dialogue_npc_kobayashi:
debug: false
type: interact
steps:
1:
click trigger:
script:
- if <player.flag[textbox_state].if_null[null]> != null:
- stop
- engage player
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Heya, sorry luv."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:We're currently under renovations, luv."
- definemap choices:
left:
text: Why?
right:
text: Unfortunate
- ~run textbox_choice def.player:<player> def.queue:<queue> def.choices:<[choices]> save:result
- define choice <entry[result].created_queue.determination.get[1]>
- if <[choice]> == left:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:What?$$nlWhy?"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Well, look, I can't tell you that, luv.$$nl It's against Hospital Policy."
- definemap choices:
left:
text: Sorry
right:
text: Don't care
- ~run textbox_choice def.player:<player> def.queue:<queue> def.choices:<[choices]> save:result
- define choice <entry[result].created_queue.determination.get[1]>
- if <[choice]> == left:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:No worries, luv!"
- else:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:What?$$nlYou don't care?"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:I'm afraid I can't treat that, luv."
- else:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Indeed, luv."
- wait 1s
- disengage player

View File

@@ -0,0 +1,25 @@
dialogue_npc_patchouli_assign:
debug: false
type: assignment
actions:
on assignment:
- trigger name:click state:true
interact scripts:
- dialogue_npc_patchouli
dialogue_npc_patchouli:
debug: false
type: interact
steps:
1:
click trigger:
script:
- if <player.flag[textbox_state].if_null[null]> != null:
- stop
- engage player
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:. . ."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:. . ."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:She is fast asleep."
- wait 1s
- disengage player
- ratelimit <player> 10t

View File

@@ -0,0 +1,31 @@
dialogue_npc_ryuko_assign:
debug: false
type: assignment
actions:
on assignment:
- trigger name:click state:true
interact scripts:
- dialogue_npc_ryuko
dialogue_npc_ryuko:
debug: false
type: interact
steps:
1:
click trigger:
script:
- if <player.flag[textbox_state].if_null[null]> != null:
- stop
- engage player
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Hey, what's up?!"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I hang out here a lot.$$nlI love to stay fit, be athletic."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Kicking balls is great!$$nl $$nl* uh.."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Anyway, the Academy sorta ran out of$$nlof tennis rackets."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Something about them being broken$$nland rusty, apparently."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* If you ask me, that's a bunch of crap!$$nlI think <&4><&l>the dean<&0><&l> is just no fun."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I think they don't want us playing.$$nlIt wouldn't be the first time."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I also haven't seen anyone play any$$nlbasketball recently, so I'm not sure$$nlwhat that's about."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* They should resolve this as soon as$$nlpossible before the students start a$$nlrebellion."
- wait 1s
- disengage player
- ratelimit <player> 10t

View File

@@ -0,0 +1,10 @@
intro_book:
debug: false
type: book
title: Intro Book
author: bqkitcat
signed: true
text:
- <bold>Welcome to SakuraFalls<n><n><reset>We encourage you to enable the resource pack for the best experience.<n><n>Please read the next page for more information.
- <bold>Tutorial<n><n><reset>You are going through the introductory tutorial. We will help you pick a character name and description, as well as your starting role.<n><n>Please read everything! It will help a lot.
- <bold>Questions<n><n><reset>Please type <bold>/ticket create<reset> in chat if you are having issues with the tutorial.<n><n>Send messages with <bold>/ooc (message)<reset> for everyone online.<n><n>You can also contact us on Discord, too, by <blue><underline><&click[https://discord.gg/bvDvQbT4s8].type[OPEN_URL]>clicking here<&end_click>

View File

@@ -0,0 +1,200 @@
# Posters
intro_interact_posters:
debug: false
type: world
events:
on player right clicks block:
- if !<context.location.note_name.if_null[null].starts_with[intro_interact_posters]>:
- stop
- determine cancelled passively
- if <player.has_flag[textbox_state]>:
- stop
- run intro_interact_posters_task
intro_interact_posters_task:
debug: false
type: task
script:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Book-related posters are on the wall."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:<&o><&dq>Screw that. I'm running away.<&dq>"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:<&o><&dq>Where?<&dq>"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:<&o><&dq>Dunno. Do you want to come?<&dq>"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:<&o><&dq>Yes,<&dq> I said without thinking."
# Cirno
intro_interact_cirno:
debug: false
type: world
events:
on player right clicks block:
- if !<context.location.note_name.if_null[null].starts_with[intro_interact_cirno]>:
- stop
- determine cancelled passively
- if <player.has_flag[textbox_state]>:
- stop
- run intro_interact_cirno_task
intro_interact_cirno_task:
debug: false
type: task
script:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:A quality, soft plushie of a beloved$$nlcharacter."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:It seems familiar, as if there are a$$nlsubstantial amount of images circulating$$nlaround with this character."
# Laptop
intro_interact_laptop:
debug: false
type: world
events:
on player right clicks block:
- if !<context.location.note_name.if_null[null].starts_with[intro_interact_laptop]>:
- stop
- determine cancelled passively
- if <player.has_flag[textbox_state]>:
- stop
- run intro_interact_laptop_task
intro_interact_laptop_task:
debug: false
type: task
script:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:It looks like a game is booted up.$$nlYou can see a city, and it looks like..."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:. . ."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:It's <bold>you!$$nl. . .$$nlWell, it's your character."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:You should give your character$$nla cool name, right?"
- waituntil <player.has_flag[textbox_state].not> max:5s
- ~run textbox_flush def.player:<player>
- run anvil_input def.player:<player> "def.prompt:Character Name" def.callback:intro_interact_laptop_task_name_callback
intro_interact_laptop_task_name_callback:
debug: false
type: task
definitions: player|input
script:
- define __player <[player]>
- define name <[input].substring[1,24]>
- execute as_player player:<[player]> "rpname <[name]>"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:<[name]>"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:How nice!"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Let's give them a description.$$nlDescribe their physical attributes."
- waituntil <player.has_flag[textbox_state].not> max:5s
- ~run textbox_flush def.player:<player>
- run anvil_input def.player:<player> "def.prompt:Description" def.callback:intro_interact_laptop_task_description_callback
intro_interact_laptop_task_description_callback:
debug: false
type: task
definitions: player|input
script:
- define __player <[player]>
- execute as_player player:<[player]> "setdesc <[input]>"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Great, your character's almost ready."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Lastly, your character can start$$nlout as a student or as$$nlan <bold>adult."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Both options are great, and it's$$nlmostly a matter of preference."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:For complete beginners, we recommend$$nlstarting out as a student."
- waituntil <player.has_flag[textbox_state].not> max:5s
- ~run textbox_flush def.player:<player>
- run intro_interact_laptop_task_role_menu def.player:<player>
intro_interact_laptop_task_role_menu:
debug: false
type: task
definitions: player
script:
- definemap contents:
1:
item: <item[paper[display=<&6><&l>» <&e>Choose your starting role;lore=<&7>Your role gives you different roleplay opportunities and gameplay.|<&7>You can make a new character after the tutorial if you are unsure.]]>
4:
item: <item[book[display=<&f>鐀;lore=<&7><&o>A new student at Tatsuru Academy, ready to learn|<&7><&o>and live a highschooler's life.]]>
script: intro_interact_laptop_task_role_callback
definitions:
player: <[player]>
input: no
6:
item: <item[book[display=<&f>鐃;lore=<&7><&o>Freshly moved into Atarashikibo, on your way to|<&7><&o>find a job and a meaning.]]>
script: intro_interact_laptop_task_role_callback
definitions:
player: <[player]>
input: yes
- run menu_open def.player:<[player]> "def.title:<&f>邑邑邑邑酐<&a><&sp><&b><&sp><&c><&sp>" def.size:9 def.contents:<[contents]>
intro_interact_laptop_task_role_callback:
debug: false
type: task
definitions: player|input
script:
- inventory close player:<[player]>
- define __player <[player]>
- define adult <[input].to_lowercase.trim.equals[yes]>
- if <[adult]>:
- execute as_server "lp user <player.name> parent add adult"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:An adult it shall be.$$nlIf this is wrong, let us know."
- else:
- execute as_server "lp user <player.name> parent add grade-10"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:A student it shall be.$$nlIf this is wrong, let us know."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:You should now be ready to start!"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Have fun!"
- waituntil <player.has_flag[textbox_state].not> max:5s
- cast BLINDNESS duration:infinite <player> no_ambient hide_particles no_icon
- wait 1s
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Though..." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I feel obligated to ask." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Have you heard of <&o>IC<&0><&l> and <&o>OOC<&0><&l>?" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[normal]>
- definemap choices:
left:
text: Not really
right:
text: Yeah
- ~run textbox_choice def.player:<player> def.queue:<queue> def.choices:<[choices]> save:result
- define choice <entry[result].created_queue.determination.get[1]>
- if <[choice]> == left:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Ah..." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You see, this WORLD..." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* This... <&o>representation<&0><&l>." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You exist beyond it." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I'm talking about you, <player.name>." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smirk]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Your character.$$nlYour VESSEL.$$nl<player.flag[character_rpname]>" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* They do not." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smirk]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You, <player.name>, are <&o>out of character<&0><&l>." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Your VESSEL...$$nl<player.flag[character_rpname]>$$nlThey are <&o>in character<&0><&l>." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* So, when your VESSEL speaks..." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* That is not <&o>you<&0><&l>." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Your VESSEL has different feelings,$$nlemotions, and experiences." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* What those are is for you to decide." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smirk]>
- else:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Ah..." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[unimpressed]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* So you know they stand for$$nl<&o>in character<&0><&l> and <&o>out of character." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You are probably familiar with$$nlthis WORLD." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* You are probably familiar with$$nlroleplaying, too." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I apologise for doubting you$$nllike that." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* . . ." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[unimpressed]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* In this world, we get to choose who$$nlwe are, at least sort of." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Maybe we cannot decide what the$$nloutcome will be, but we can try." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* <player.flag[character_rpname]>, I..." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[normal]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I think your choices are important,$$nlregardless." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I think you should try your best to$$nldo what your heart tells you." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Wouldn't you agree?" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- definemap choices:
left:
text: Correct
right:
text: ...
- ~run textbox_choice def.player:<player> def.queue:<queue> def.choices:<[choices]> save:result
- define choice <entry[result].created_queue.determination.get[1]>
- if <[choice]> == left:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I'm glad you understand." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- else:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Ah..." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[unimpressed]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I see." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smirk]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* Very well. You are truly ready." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* When you are finally linked to$$nlour WORLD, you will see <&o>Marie<&0><&l>." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* She has talked to many others just$$nllike you." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* So, you should probably talk to her." def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:* I'll be on my way.$$nlGood luck!" def.avatar_unicode:<script[storyboard_avatar_dump].data_key[emika].get[smile]>
- waituntil <player.has_flag[textbox_state].not> max:5s
- ~run textbox_flush def.player:<player>
- adjust <player> remove_effects
- adjust <player> show_to_players
- flag <player> intro:done
- execute as_player player:<player> "spawn"

View File

@@ -0,0 +1,18 @@
intro_world:
debug: false
type: world
events:
after player joins:
- define intro <player.flag[intro].if_null[null]>
- if <[intro]> != done:
- adjust <player> hide_from_players
- adjust <player> remove_effects
- run textbox_flush def.player:<player>
- if <[intro]> == null:
- teleport <player> <location[313.5,3,258.5,0,270,world]>
- flag <player> intro:progress
- adjust <player> show_book:intro_book
on player teleports bukkit_priority:lowest:
- if <player.flag[intro].if_null[null]> == progress:
- determine cancelled passively
- narrate "<&c>You may not teleport at this time."

View File

@@ -0,0 +1,255 @@
#
# Storyboard NPC Tasks
#
# Adds a complex set of per-player state managed NPC routines which
# allow for the creation of RPG-like stories, similar to Undertale.
#
# The routines and state system is also as memory efficient and lazy
# as possible. It utilizes Denizen and Citizens to their best, taking
# advantage of Denizen's innate scripting possibilites.
#
# Allocates an NPC with a given name at some location for the current player.
#
# Optionally, specify a display name, display name visibility, and a skin_blob.
# Generate Skin Blobs using https://mineskin.org - it cannot be done automatically
# at this time.
#
# If the NPC is reallocated from player state, it will try to re-fill these values.
# You can specify new values to change these.
# Note it will only try to fill these optional values, not "name", "type", and "at".
#
# The name of the NPC must be unique - this is not the same as the display
# name of the NPC; rather it is an internal name, so it's recommended to
# keep it lowercase.
#
# If the NPC is not allocated but was saved in the player's mem state, it
# will be created and its state will be restored.
# If the NPC is already allocated, it will simply teleport the NPC.
#
# All NPCs are memfree'd when a player leaves, which does not reduce storage
# overhead, but does greatly reduce overhead when hiding/showing per-player NPCs.
# They are automatically memalloc'ed when a player rejoins.
storyboard_npc_memalloc:
debug: false
type: task
definitions: player|name|type|at|display_name|show_name|skin_blob
script:
- define registry registry_<[player].uuid>
- define npc_id npc_<[player].uuid>_<[name]>
- if !<server.npcs[<[registry]>].if_null[<list[]>].contains[<[npc_id]>]>:
- define npcs <[player].flag[storyboard_state].get[npcs].if_null[<map[]>]>
- create <[type]> <[npc_id]> <[at]> registry:<[registry]> save:npc
- define npc <entry[npc].created_npc>
- define npc_state <map[]>
- define assignment null
- if <[npcs].contains[<[name]>]>:
- define npc_data <[npcs].get[<[name]>]>
- define npc_state <[npc_data].get[state]>
- if <[display_name].if_null[null]> == null:
- define display_name <[npc_data].get[display_name]>
- if <[show_name].if_null[null]> == null:
- define show_name <[npc_data].get[show_name]>
- if <[skin_blob].if_null[null]> == null:
- define skin_blob <[npc_data].get[skin_blob]>
- define assignment <[npc_data].get[assignment].if_null[null]>
- else:
- if <[display_name].if_null[null]> == null:
- define display_name <[display_name].if_null[<[name].to_sentence_case>]>
- if <[show_name].if_null[null]> == null:
- define show_name <[show_name].if_null[true]>
- if <[skin_blob].if_null[null]> == null:
- define skin_blob <[skin_blob].if_null[null]>
- definemap npc_data:
name: <[name]>
type: <[type]>
at: <[at]>
state: <[npc_state]>
display_name: <[display_name]>
show_name: <[show_name]>
skin_blob: <[skin_blob]>
allocated: true
assignment: <[assignment]>
- define npcs <[npcs].with[<[name]>].as[<[npc_data]>]>
- flag <[player]> storyboard_state:<[player].flag[storyboard_state].if_null[<map[]>].with[npcs].as[<[npcs]>]>
- adjust <[npc]> auto_update_skin:false
- adjust <[npc]> name_visible:false
- lookclose <[npc]> state:true range:4
- if !<[show_name]>:
- adjust <[npc]> hologram_lines:<list[]>
- else:
- adjust <[npc]> "hologram_lines:<&f>鐓 <[display_name]>"
- if <[skin_blob]> != null:
- adjust <[npc]> skin_blob:<[skin_blob]>
- if <[assignment]> != null:
- assignment set script:<[assignment]> to:<[npc]>
- wait 2t
- run storyboard_npc_internal_show_to_player def.player:<[player]> def.npc:<[npc]>
- else:
- define index <server.npcs[<[registry]>].find[<[npc_id]>]>
- define npc <npc[<[index]>,<[registry]>]>
- teleport <[npc]> <[at]>
# Retrieves an NPC from the player's unique NPC registry by name.
storyboard_npc_by_name:
debug: false
type: procedure
definitions: player|name
script:
- define registry registry_<[player].uuid>
- define npc_id npc_<[player].uuid>_<[name]>
- determine <server.npcs[<[registry]>].filter_tag[<[filter_value].name.equals[<[npc_id]>]>].get[1]>
# Frees an NPC from memory, but does not destroy its state.
#
# This is often done automatically when the player leaves the server, however it may
# be useful for programmers to manually call this routine for optimization purposes.
#
# If you don't want the server to reallocate the NPC on player join, provide
# the reallocate definition as 'reallocate' (or just don't provide it).
storyboard_npc_memfree:
debug: false
type: task
definitions: player|name|reallocate
script:
- define npc <proc[storyboard_npc_by_name].context[<[player]>|<[name]>]>
- define reallocate <[reallocate].if_null[false]>
- define npcs <[player].flag[storyboard_state].get[npcs].if_null[<map[]>]>
- define npc_data <[npcs].get[<[name]>]>
- define npc_data <[npc_data].with[allocated].as[<[reallocate]>]>
- define npcs <[npcs].with[<[name]>].as[<[npc_data]>]>
- flag <[player]> storyboard_state:<[player].flag[storyboard_state].if_null[<map[]>].with[npcs].as[<[npcs]>]>
- remove <[npc]>
# Destroys an NPC from memory, which destroys its state.
# Further memalloc's will re-create the NPC with new state data.
# Use this when you are 100% done with using an NPC.
# If you only want to remove an NPC until later, but keep its state,
# consider calling storyboard_npc_memfree instead.
storyboard_npc_memdestroy:
debug: false
type: task
definitions: player|name
script:
- define npcs <[player].flag[storyboard_state].get[npcs].if_null[<map[]>]>
- define npcs <[npcs].exclude[<[name]>]>
- flag <[player]> storyboard_state:<[player].flag[storyboard_state].if_null[<map[]>].with[npcs].as[<[npcs]>]>
- define npc <proc[storyboard_npc_by_name].context[<[player]>|<[name]>]>
- remove <[npc]>
# Flags the NPC by name, mapping the given key to the given value.
storyboard_npc_state_set:
debug: false
type: task
definitions: player|name|key|value
script:
- define npc <proc[storyboard_npc_by_name].context[<[player]>|<[name]>]>
- define npcs <[player].flag[storyboard_state].get[npcs].if_null[<map[]>]>
- define npc_data <[npcs].get[<[name]>]>
- define state <[npc_data].get[state].if_null[<map[]>]>
- define state <[state].with[<[key]>].as[<[value]>]>
- define npc_data <[npc_data].with[state].as[<[state]>]>
- define npcs <[npcs].with[<[name]>].as[<[npc_data]>]>
- flag <[player]> storyboard_state:<[player].flag[storyboard_state].if_null[<map[]>].with[npcs].as[<[npcs]>]>
# Gets a state value from the NPC by name and key; effectively like reading a flag.
# If the given key does not exist/is not set, determines null.
storyboard_npc_state_get:
debug: false
type: procedure
definitions: player|name|key
script:
- define npcs <[player].flag[storyboard_state].get[npcs].if_null[<map[]>]>
- define npc_data <[npcs].get[<[name]>]>
- define state <[npc_data].get[state].if_null[<map[]>]>
- determine <[state].get[<[key]>].if_null[null]>
# Deletes a flag from the NPC by name and key.
storyboard_npc_state_clear:
debug: false
type: task
definitions: player|name|key
script:
- define npc <proc[storyboard_npc_by_name].context[<[player]>|<[name]>]>
- define npcs <[player].flag[storyboard_state].get[npcs].if_null[<map[]>]>
- define npc_data <[npcs].get[<[name]>]>
- define state <[npc_data].get[state].if_null[<map[]>]>
- define state <[state].exclude[<[key]>]>
- define npc_data <[npc_data].with[state].as[<[state]>]>
- define npcs <[npcs].with[<[name]>].as[<[npc_data]>]>
- flag <[player]> storyboard_state:<[player].flag[storyboard_state].if_null[<map[]>].with[npcs].as[<[npcs]>]>
# Sets an NPCs assignment, which also persists across memfrees.
storyboard_npc_set_assignment:
debug: false
type: procedure
definitions: player|name|assignment
script:
- define npc <proc[storyboard_npc_by_name].context[<[player]>|<[name]>]>
- define npcs <[player].flag[storyboard_state].get[npcs].if_null[<map[]>]>
- define npc_data <[npcs].get[<[name]>]>
- define npc_data <[npc_data].with[assignment].as[<[assignment]>]>
- define npcs <[npcs].with[<[name]>].as[<[npc_data]>]>
- flag <[player]> storyboard_state:<[player].flag[storyboard_state].if_null[<map[]>].with[npcs].as[<[npcs]>]>
- assignment set script:<[assignment]> to:<[npc]>
# Moves an NPC to a new location, both physically, and in memory also.
# When an NPC is moved by normal teleports or the walk command, its location isn't stored.
# Use this to either commit its final position, or teleport it after a cutscene.
storyboard_npc_movement_commit:
debug: false
type: procedure
definitions: player|name|new_location
script:
- define npc <proc[storyboard_npc_by_name].context[<[player]>|<[name]>]>
- define npcs <[player].flag[storyboard_state].get[npcs].if_null[<map[]>]>
- define npc_data <[npcs].get[<[name]>]>
- define npc_data <[npc_data].with[at].as[<[new_location]>]>
- define npcs <[npcs].with[<[name]>].as[<[npc_data]>]>
- flag <[player]> storyboard_state:<[player].flag[storyboard_state].if_null[<map[]>].with[npcs].as[<[npcs]>]>
- teleport <[npc]> <[new_location]>
## Internal only!
storyboard_npc_internal_auto_memory_management:
debug: false
type: world
events:
after player joins:
- define npcs <player.flag[storyboard_state].get[npcs].if_null[<map[]>]>
- foreach <[npcs]> key:name as:data:
- if <[data].get[allocated]> == reallocate:
- define name <[data].get[name]>
- define type <[data].get[type]>
- define at <[data].get[at]>
- run storyboard_npc_memalloc def.player:<player> def.name:<[name]> def.type:<[type]> def.at:<[at]>
on player quits:
- define registry registry_<player.uuid>
- define npcs <server.npcs[<[registry]>].if_null[<list[]>]>
- define substr_length <element[npc_<player.uuid>_].length.add[1]>
- foreach <[npcs]> as:npc:
- define name <[npc].name.substring[<[substr_length]>]>
- run storyboard_npc_memfree def.player:<player> def.name:<[name]> def.reallocate:reallocate
storyboard_npc_internal_show_to_player:
debug: false
type: task
definitions: player|npc
script:
- adjust <[npc]> hide_from_players
- adjust <[player]> show_entity:<[npc]>
- foreach <[npc].hologram_npcs.if_null[<list[]>]> as:hologram:
- adjust <[hologram]> hide_from_players
- adjust <[player]> show_entity:<[hologram]>
storyboard_npc_internal_auto_display_entities:
debug: false
type: world
events:
on player joins bukkit_priority:high:
- foreach <server.online_players.exclude[<player>]> as:target:
- define registry registry_<[target].uuid>
- define npcs <server.npcs[<[registry]>].if_null[<list[]>]>
- foreach <[npcs]> as:npc:
- adjust <player> hide_entity:<[npc]>
- foreach <[npc].hologram_npcs.if_null[<list[]>]> as:hologram:
- adjust <player> hide_entity:<[hologram]>

View File

@@ -0,0 +1,70 @@
#
# Storyboard Player Tasks
#
# Adds a set of tasks for managing player storyboard state.
# Pretty common in use.
#
# Note: These actions are **committed** - so should be executed LAST in a script.
# This allows the actions to "rollback" in case the server crashes/player disconnects.
#
# Sets a named key to any value in the player state.
storyboard_player_state_set:
debug: false
type: task
definitions: player|key|value
script:
- define state <[player].flag[storyboard_state].get[state].if_null[<map[]>]>
- define state <[state].with[<[key]>].as[<[value]>]>
- flag <[player]> storyboard_state:<[player].flag[storyboard_state].if_null[<map[]>].with[state].as[<[state]>]>
# Removes a named key from player state.
# If the key doesn't exist, silently fails.
storyboard_player_state_clear:
debug: false
type: task
definitions: player|key
script:
- define state <[player].flag[storyboard_state].get[state].if_null[<map[]>]>
- define state <[state].exclude[<[key]>]>
- flag <[player]> storyboard_state:<[player].flag[storyboard_state].if_null[<map[]>].with[state].as[<[state]>]>
# Gets a named key from player state.
# If the key doesn't exist, "null" is returned.
storyboard_player_state_get:
debug: false
type: procedure
definitions: player|key
script:
- define state <[player].flag[storyboard_state].get[state].if_null[<map[]>]>
- determine <[state].get[<[key]>].if_null[null]>
# Freezes a player in place by setting their speed to 0.
# On relogs, automatically 'unfreezes' them.
# See the complementary task storyboard_player_unfreeze
storyboard_player_freeze:
debug: false
type: task
definitions: player
script:
- flag <player> storyboard_freeze_speed:<player.walk_speed>
- adjust <player> walk_speed:0
# Unfreezes a player. Always happens automatically on relogs.
# See the complementary task storyboard_player_freeze
storyboard_player_unfreeze:
debug: false
type: task
definitions: player
script:
- adjust <player> walk_speed:<player.flag[storyboard_freeze_speed]>
- flag <player> storyboard_freeze_speed:!
## Internal only!
storyboard_player_freeze_check:
debug: false
type: world
events:
on player joins:
- if <player.has_flag[storyboard_freeze_speed]>:
- run storyboard_player_unfreeze def.player:<player>

View File

@@ -0,0 +1,27 @@
#
# Storyboard Player Utils
# Various optional utils which tend to be pretty helpful.
#
# Gets the player character's first name (or what should be the first name).
storyboard_character_first_name:
debug: false
type: procedure
definitions: player
script:
- determine <[player].flag[character_rpname].split.first.to_sentence_case.if_null[<&lt>?<&gt>]>
# Effectively like a permanent waituntil, except checks if player's online, etc.; if not, kills the queue.
storyboard_waituntil_safe:
debug: false
type: task
definitions: player|queue|condition
script:
- while true:
- define condition_parsed <element[<&lt><[condition]><&gt>].parsed>
- if <[condition_parsed]> || !<[player].is_online>:
- while stop
- wait 10t
- if !<[player].is_online>:
- queue stop <[queue]>
- debug log "[Storyboard] Cancelled queue <[queue].numeric_id><&at><[queue].script.name> for <[player].name>; offline"