Finished Runescape Guide, add partial Survival Expert support in Tutorial Island plugin.

This commit is contained in:
Major-
2015-03-02 08:55:28 +00:00
parent e73c4e150e
commit dea1ab1198
7 changed files with 401 additions and 3 deletions
@@ -0,0 +1,119 @@
require 'java'
java_import 'org.apollo.game.message.impl.HintIconMessage'
java_import 'org.apollo.game.message.impl.SwitchTabInterfaceMessage'
private
# The ids of tabs that are displayed when the player has yet to start the tutorial.
INITIAL_TABS = [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2449, 904, -1, -1 ]
# The character design interface id.
CHARACTER_DESIGN = 3559
# The Runescape guide Npc
@runescape_guide = spawn_npc :name => :runescape_guide, :x => 3093, :y => 3107
# Sends the appropriate data to the client when the player logs in to the game.
on :login do |event, player|
if player.in_tutorial_island
TutorialInstructions::show_instruction(player)
# INITIAL_TABS.each_with_index { |tab, index| player.send(SwitchTabInterfaceMessage.new(index, tab)) } # This is commented so the lame hack works
if (player.tutorial_island_progress == :not_started)
show_hint_icon(player)
player.interface_set.open_window(CHARACTER_DESIGN)
end
end
end
## TODO lame hack to get round the lack of door support - must remove
on :message, :fifth_item_option do |ctx, player, message|
player.teleport(Position.new(3100, 3107)) if message.id == 1
player.tutorial_island_progress = :moving_around
player.interface_set.open_dialogue_overlay(-1)
end
on :login do |event, player|
player.inventory.add(1)
end
## END lame hack
# The conversation with the Runescape Guide, when on tutorial island.
conversation :tutorial_runescape_guide do
# The first dialogue of the Runescape Guide, greeting the Player.
dialogue :greetings do
type :npc_speech
npc :runescape_guide
precondition { |player| player.tutorial_island_progress == :not_started }
text "Greetings! I see you are a new arrival to this land. My job is to welcome all new visitors. So welcome!"
continue :dialogue => :go_through_door do |player|
player.tutorial_island_progress = :talk_to_people
end
end
# The Guide welcomes back the Player if they speak to him after they have already gone through the conversation once.
dialogue :welcome_back do
type :npc_speech
npc :runescape_guide
precondition { |player| player.tutorial_island_progress != :not_started }
text "Welcome back."
continue :dialogue => :talk_to_people
end
# The Guide tells Players to speak to people in order to succeed.
dialogue :talk_to_people do
type :npc_speech
npc :runescape_guide
text "You have already learned the first thing you need to succeed in this world: talking to people!",
"You will find many inhabitants of this world have useful things to say to you. By clicking on them with your mouse you can talk to them.",
"I would also suggest reading through some of the supporting information on the website. There you can find maps, a bestiary, and much more."
continue :dialogue => :go_through_door
end
# The Guide tells Players to go through the door, advancing the tutorial progress if this is the first time the Player has heard this.
dialogue :go_through_door do
type :npc_speech
npc :runescape_guide
text "To continue the tutorial go through that door over there, and speak to your first instructor."
continue :close => true do |player|
if (player.tutorial_island_progress == :not_started)
reset_hint_icon(player)
# TODO door hint icon
player.tutorial_island_progress = :runescape_guide_finished
end
TutorialInstructions.show_instruction(player)
end
end
end
# Enables the hint icon above the Runescape guide.
def show_hint_icon(player)
player.send(HintIconMessage.for_npc(@runescape_guide.index))
end
# Resets the hint icon.
def reset_hint_icon(player)
player.send(HintIconMessage.reset_npc())
end
@@ -0,0 +1,119 @@
# TODO update the status to :moving_around when the door is opened
# Contains members related to the instructions issues during tutorial island.
module TutorialInstructions
# Sends the appropriate instruction to the player.
def self.show_instruction(player)
instructions = CONVERSATIONS[:tutorial_island_instructions]
name = case player.tutorial_island_progress
# The Runescape Guide instructions.
when :not_started then :getting_started
when :runescape_guide_finished then :scenery
when :moving_around then :moving_around
# The Survival Guide instructions.
when :given_axe then :viewing_items
when :cut_tree then :cut_tree
when :cutting_tree then :please_wait
end
dialogue = instructions.part(name)
send_dialogue(player, dialogue)
end
# The one-sided 'conversation' of instruction instructions.
conversation :tutorial_island_instructions do
# The initial instruction displayed when the player logs in, before they have spoken to the guide.
dialogue :getting_started do
type :text
title "Getting started"
text "To start the tutorial, use your left mouse button to click on the Runescape Guide in this room. He is indicated by "\
"a flashing yellow arrow above his head. If you can't see him, use your keyboard's arrow keys to rotate the view."
end
# The instruction displayed after the player has spoken to the Runescape Guide.
dialogue :scenery do
type :text
title "Interacting with scenery"
text "You can interact with many items of the scenery by simply clicking on them. Right clicking will also give more options. "\
"Click on the door indicated with the yellow arrow to go through to the next area and speak with your next instructor."
end
## TODO !! When we have door support, the player's tutorial island progress needs to be set to :moving_around when they walk through the door !!
# The instruction displayed after the player has left the initial building.
dialogue :moving_around do
type :text
title "Moving around"
text "Follow the path to find the next instructor. Clicking on the ground will walk you to that point. Talk to the survival expert "\
"by the pond to continue the tutorial. Remember you can rotate the view by pressing the arrow keys."
end
# The instruction displayed after the player has been given the tinderbox and bronze axe by the Survival Guide.
dialogue :viewing_items do
type :text
title "Viewing the items you were given"
text "Click on the flashing backpack icon to the right side of the main window to view your inventory. Your inventory is a list of "\
"everything you have in your backpack."
end
# The instruction displayed before the player has begun to cut the tree.
dialogue :cut_tree do
type :text
title "Cut down a tree"
text "You can click on the backpack icon at any time to view the items that you currently have in your inventory. You will see that you "\
"now have an axe in your inventory. Use this to get some logs by clicking on the indicated tree."
end
# The instruction displayed when the player begins to cut the tree.
dialogue :please_wait do
type :text
title "Please wait..."
text "Your character is now attempting to cut down the tree. Sit back for a moment whilst he does all the hard work." # TODO she instead of he if applicable
end
# The instruction displayed after the player has successfully cut logs from the tree.
dialogue :make_a_fire do
type :text
title "Making a fire"
text "Well done! You managed to cut some logs from the tree! Next, use the tinderbox in your inventory to light the logs. First click on the "\
"tinderbox to 'use' it. Then click on the logs in your inventory to light them."
end
# The instruction displayed when the player begins to light the fire.
dialogue :lighting_fire do
type :text
title "Please wait..."
text "Your character is now attempting to light the logs. Sit back for a moment whilst he does all the hard work." # TODO she instead of he if applicable
end
# The instruction displayed when the has lit the logs.
dialogue :gained_experience do
type :text
text "You gained some experience."\
"Click on the flashing bar graph icon near the inventory button to see your skill stats."
end
# The dialogue displayed when the Player has clicked the flashing skill tab icon.
dialogue :skill_stats do
type :text
title "Your skill stats."
text "" # TODO !!
end
end
end
@@ -16,8 +16,6 @@
# 'Above-ground' npcs
spawn_npc :name => :runescape_guide, :x => 3093, :y => 3107
spawn_npc :name => :survival_expert, :x => 3104, :y => 3095, :face => :north
spawn_npc :name => :master_chef, :x => 3076, :y => 3085
spawn_npc :name => :quest_guide, :x => 3086, :y => 3122, :face => :north
spawn_npc :name => :financial_advisor, :x => 3127, :y => 3124, :face => :west
@@ -3,14 +3,21 @@
<id>location-tutorial-island</id>
<version>0.1</version>
<name>Tutorial Island</name>
<description>Adds funtionality to Tutorial island.</description>
<description>Adds functionality to Tutorial island.</description>
<authors>
<author>Major</author>
</authors>
<scripts>
<script>instructions.rb</script>
<script>guide.rb</script>
<script>npcs.rb</script>
<script>stages.rb</script>
<script>survival.rb</script>
<script>utils.rb</script>
</scripts>
<dependencies>
<dependency>dialogue</dependency>
<dependency>entity-spawning</dependency>
<dependency>quest</dependency>
</dependencies>
</plugin>
@@ -0,0 +1,13 @@
private
# The array of stages in tutorial island.
STAGES = []
# The stages that are used when interacting with the Runescape Guide.
STAGES << RUNESCAPE_GUIDE = [ :not_started, :talk_to_people, :go_through_door, :runescape_guide_finished, :moving_around ]
# The stages that are used when interacting with the Survival Expert.
STAGES << SURVIVAL_EXPERT = [ :given_axe, :cut_tree, :cutting_tree, ]
quest :tutorial_island, STAGES
@@ -0,0 +1,108 @@
require 'java'
java_import 'org.apollo.game.message.impl.FlashTabInterfaceMessage'
java_import 'org.apollo.game.message.impl.FlashingTabClickedMessage'
java_import 'org.apollo.game.message.impl.SwitchTabInterfaceMessage'
private
# The Survival Expert Npc.
@survival_expert = spawn_npc :name => :survival_expert, :x => 3104, :y => 3095, :face => :north
# The inventory tab index.
INVENTORY_TAB_INDEX = 3
# The inventory tab id.
INVENTORY_TAB_ID = 3213
# The id of the tree the Player will cut down.
TREE_ID = 3033
# TODO prevent axe equipping
# The conversation with the Survival Expert, when on tutorial island.
conversation :tutorial_surivival_expert do
dialogue :introduction do
type :npc_speech
npc :survival_expert
precondition { |player| player.tutorial_island_progress == :moving_around }
text "Hello there, newcomer. My name is Brynna. My job is to teach you a few survival tips and tricks. First off we're "\
"going to start with the most basic survival skill of all: making a fire."
continue :dialogue => :items
end
dialogue :hello_again do
type :npc_speech
npc :survival_expert
precondition { |player| player.tutorial_island_progress == :moving_around }
text "Hello again. I'm here to teach you a few survival tips and tricks. First off we're going to start with the most "\
"basic survival skill of all: making a fire."
continue :close => true, &:add_survival_items
end
# The dialogue displayed when the Survival Guide hands both a bronze axe and a tinderbox to the player.
dialogue :items do
type :message_with_item
item :bronze_axe, 200 # TODO the tinderbox is also displayed - find this dialogue id. Scale looks like the default http://i.imgur.com/i1abN5X.png
text "The Survival Guide gives you a tinderbox and a bronze axe!"
continue :close => true do |player|
if (player.tutorial_island_progress != :given_axe)
player.tutorial_island_progress = :given_axe
player.send(SwitchTabInterfaceMessage.new(INVENTORY_TAB_INDEX, INVENTORY_TAB_ID))
player.send(FlashTabInterfaceMessage.new(INVENTORY_TAB_INDEX))
end
add_survival_items(player)
end
end
# The dialogue displayed when the player has succesfully cut down a tree.
dialogue :get_logs do
type :message_with_item
item :logs
text "You get some logs."
continue :close => true do |player|
TutorialInstructions.show_instruction(player)
end
end
end
# The id of the bronze axe.
BRONZE_AXE = lookup_item(:bronze_axe)
# The id of the tinderbox.
TINDERBOX = lookup_item(:tinderbox)
# Add the survival items (bronze axe and tinderbox) to the inventory of the player, if they do not already have them.
def add_survival_items(player)
inventory = player.inventory
[ BRONZE_AXE, TINDERBOX ].each { |item| inventory.add(item) unless inventory.contains(item) }
TutorialInstructions.show_instruction(player)
end
on :message, :first_object_action do |ctx, player, message|
# TODO display "You cannot cut down this tree; you must first follow the guide's instructions." if the player has yet to get the axe
if (player.in_tutorial_island && player.tutorial_island_progress == :cut_tree && message.id == TREE_ID)
player.tutorial_island_progress = :cutting_tree # Don't break the chain, so that the Woodcutting event actually happens.
end
end
# Intercept the FlashingTabClickedMessage to update the player's progress, if applicable.
on :message, :flashing_tab_clicked do |ctx, player, message|
if (player.in_tutorial_island && message.tab == INVENTORY_TAB_INDEX)
player.tutorial_island_progress = :cut_tree
ctx.break_handler_chain()
end
end
@@ -0,0 +1,34 @@
require 'java'
java_import 'org.apollo.game.model.entity.Player'
# Declare the tutorial island progress attribute.
declare_attribute(:tutorial_island_progress, :not_started, :persistent)
# The existing player class.
class Player
# Returns whether or not this Player is currently on tutorial island.
def in_tutorial_island
x, y = self.position.x, self.position.y
return above_ground(x, y) || below_ground(x, y)
end
end
private
# Returns whether or not the specified coordinate pair is above ground on tutorial island.
def above_ground(x, y)
return (x >= 3053 && x <= 3156 && y >= 3056 && y <= 3136)
end
# Returns whether or not the specified coordinate pair is 'below' ground on tutorial island.
def below_ground(x, y)
return (x >= 3072 && x <= 3118 && y >= 9492 && y <= 9535)
end