Paste #15800: quest manager

Date: 2015/05/14 16:42:24 UTC-07:00
Type: Denizen Script

View Raw Paste Download This Paste
Copy Link


questmanager:
  type: world
  events:
    on server starts:
      - inject locally loadYAML 'def:quests|quests
    on player clicks sign:
      - define quest '<c.location.sign_contents.get[1]>'
      - if <yaml[quests].read[quests.%quest%.trigger.location]>.is[==].to[<c.location>]> {
        - if <player.has_flag[%quest%_complete]> {
          - narrate "<green>you have completed %quest% quest"
          - foreach <yaml[quests].list_keys[quests.%quest%.reward]> {
            - define reward <yaml[quests].list_keys[quest.%quest%.reward.%value%]>
            - if %value% == 'drpg_xp' {
              - flag player drpg_xp:++:%reward%
              - queue clear
              }
            - if %value% == 'gold' {
              - flag player drpg_gold:++:%reward%
              - queue clear
              }
            - narrate "here is %reward% %value% as a reward"
            - give %value% qty:%reward%
            }
          - flag player active_quests:<-:%quest%
          - flag player %quest%_complete:!
          - flag player %quest%_wait duration:24h
          - queue clear
          }
        - if <player.has_flag[%quest%_wait]> {
          - narrate "you can repeat this quest in <player.flag[%quest%_wait].expiration>"
          - queue clear
          }
        - if <player.flag[active_quests].contains[%quest%]> {
          - narrate "you already have this quest"
          - queue clear
          }
        - if !<player.has_flag[%quest%_confirm]> {
          - narrate "click again to accept the %quest% quest"
          - flag player %quest%_confirm duration:120
          - queue clear
          }
        - flag player %quest%_confirm:!
        - inject locally start_quest
        }
    on player kills entity:
      - if !<player.has_flag[active_quests]> {
        - queue clear
        }
      - define entity <c.entity>
      - foreach <player.flag[active_quests]> {
        - define possible_flag '%value%_%entity%_count'
        - if !<player.has_flag[%possible_flag%]> {
          - foreach next
          }
        - define flag '%value%_%entity%_count'
        - player flag %flag%:++:1
        - if <player.flag[%flag%].is[>=].to[quests.%value%.type.kill_list.%entity%]> {
          - flag player %flag%:!
          - if <yaml[quests].read[quests.%value%.type.return]> {
              - if <yaml[quests].read[quests.%value%.trigger.is[==].to[quest_sign]> {
                - define msg 'the quest_sign'
                }
              - if <yaml[quests].read[quests.%value%.trigger].is[==].to[npc]> {
                - define msg '<yaml[quests].read[quests.%value%.trigger.npc].name>'
                }
              - narrate "go back to %msg% to get your reward"
              - flag player %1%_complete
              }
              else {
              - define quest '%value%'
              - foreach <yaml[quests].list_keys[quests.%quest%.reward]> {
                - define reward <yaml[quests].list_keys[quest.%quest%.reward.%value%]>
                - if %value% == 'drpg_xp' {
                  - flag player drpg_xp:++:%reward%
                  - queue clear
                  }
                - if %value% == 'gold' {
                  - flag player drpg_gold:++:%reward%
                  - queue clear
                  }
                - narrate "here is %reward% %value% as a reward"
                - give %value% qty:%reward%
                }
              }
          }
        }
    on player picks up item:
      - if !<player.has_flag[active_quests]> {
        - queue clear
        }
      - define item <c.item>
      - foreach <player.flag[active_quests]> {
        - define possible_flag '%value%_%item%_count'
        - if !<player.has_flag[%possible_flag%]> {
          - foreach next
          }
        - define flag '%value%_%item%_count'
        - player flag %flag%:++:1
        - if <player.flag[%flag%].is[>=].to[quests.%value%.type.gather_list.%item%]> {
          - flag player %flag%:!
          - if <yaml[quests].read[quests.%value%.type.return]> {
              - if <yaml[quests].read[quests.%value%.trigger.is[==].to[quest_sign]> {
                - define msg 'the quest_sign'
                }
              - if <yaml[quests].read[quests.%value%.trigger].is[==].to[npc]> {
                - define msg '<yaml[quests].read[quests.%value%.trigger.npc].name>'
                }
              - narrate "go back to %msg% to get your reward"
              - flag player %1%_complete
              }
              else {
              - define quest '%value%'
              - foreach <yaml[quests].list_keys[quests.%quest%.reward]> {
                - define reward <yaml[quests].list_keys[quest.%quest%.reward.%value%]>
                - if %value% == 'drpg_xp' {
                  - flag player drpg_xp:++:%reward%
                  - queue clear
                  }
                - if %value% == 'gold' {
                  - flag player drpg_gold:++:%reward%
                  - queue clear
                  }
                - narrate "here is %reward% %value% as a reward"
                - give %value% qty:%reward%
                }
              }
          }
        }
    on player enters notable cuboid:
      - if !<player.has_flag[active_quests]> {
        - queue clear
        }
      - define cuboid '<context.cuboids>'
      - foreach <player.flag[active_quests]> {
        - if !<player.has_flag[%value%]> {
          - foreach next
          }
        - define flag '%value%'
        - if <player.flag[%flag%].is[==].to[%cuboid%]>
        - player flag %flag%:!
        - if <yaml[quests].read[quests.%value%.type.return]> {
          - if <yaml[quests].read[quests.%value%.trigger.is[==].to[quest_sign]> {
            - define msg 'the quest_sign'
            }
          - if <yaml[quests].read[quests.%value%.trigger].is[==].to[npc]> {
            - define msg '<yaml[quests].read[quests.%value%.trigger.npc].name>'
            }
          - narrate "go back to %msg% to get your reward"
          - flag player %1%_complete
          }
          else {
          - define quest '%value%'
          - foreach <yaml[quests].list_keys[quests.%quest%.reward]> {
            - define reward <yaml[quests].list_keys[quest.%quest%.reward.%value%]>
            - if %value% == 'drpg_xp' {
              - flag player drpg_xp:++:%reward%
              - queue clear
              }
            - if %value% == 'gold' {
              - flag player drpg_gold:++:%reward%
              - queue clear
              }
            - narrate "here is %reward% %value% as a reward"
            - give %value% qty:%reward%
            }
          }
        }
    on player flag cleared:
      - define flag '<c.name>'
      - foreach <yaml[quests].list_keys[quests]> {
        - if <yaml[quests].read[quests.%value%.trigger]>.is[==].to[auto]> {
          - if <yaml[quests].read[quests.%value%.trigger.previous_quest].is[==].to[<def[flag].split[_].get[1]>]> {
            - inject locally start_quest
            }
          }
        }
  start_quest:
    - flag player active_quests:->:%quest%
    - define type <yaml[quests].read[quests.%quest%.type]>
    - if %type% == goto {
      - define loc '<yaml[quests].read[quests.%quest%.type.location]>'
      - note cu@<def[loc].add[-5,-5,-5]>|<def[loc].add[5,5,5]> 'as:%quest%_cu'
      - flag player %quest%:'%quest%_cu'
      - queue clear
      }
    - foreach <yaml[quests].list_keys[quests.%quest%.type.%type%_list]> {
      - flag player %quest%_%value%_count:0
      }
  loadYAML:
    - if !<yaml.list.contains[quests]> {
      - if !<server.has_file[drpg/quests/quests.yml]> {
        - yaml create 'id:quests'
        - yaml 'savefile:drpg/quests/quests.yml' 'id:quests'
        }
        else {
        - yaml 'load:drpg/quests/quests.yml' 'id:quests'
        }
      }