mirror of
https://github.com/2006-Scape/apollo.git
synced 2026-07-03 08:39:11 +00:00
Finished Runescape Guide, add partial Survival Expert support in Tutorial Island plugin.
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user