"Tutorial_Lessons" { "Version" "1" ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// // TUTORIAL: MECHANICS 2 ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// "tutorial_m2" // wait here until we are ready to do actual setup { "advance_time" "0" "advance_event" "player_joined" "next_lesson" "tm2_player_setup" } "tm2_player_setup" { "convars" { "sv_pausable" "1" "dota_hud_healthbars" "1" "dota_tutorial_buddha" "1" "dota_tutorial_stop_daynightcycle" "1" "dota_tutorial_skip_pregame" "1" "dota_tutorial_state_change_delay" "0" "dota_tutorial_disable_goldtick" "1" "dota_creeps_no_spawning" "1" "dota_neutral_initial_spawn_delay" "2" "dota_companion_enable" "0" "dota_tutorial_disable_stash" "1" "dota_tutorial_disable_suggested_items" "1" "dota_tutorial_prevent_exp_gain" "2" "dota_tutorial_roquelaire_useperches" "0" "dota_tutorial_can_sell_items" "0" "dota_tutorial_can_disassemble_items" "0" "dota_tutorial_quick_buy" "0" "dota_tutorial_actionpanel" "1" "dota_tutorial_see_enemy" "0" "dota_tutorial_log_hero" "0" "dota_camera_disable_zoom" "1" "dota_bot_tutorial_boss" "1" "dota_tutorial_disable_item_drops" "1" } "precache" { "npc_dota_hero_sniper" "1" "npc_dota_hero_tidehunter" "1" } "whitelist_enable" "1" // enable ability to restrict store items using add_item_shop_whitelist and remove_item_shop_whitelist "set_tutorial_UI" "3" "advance_time" "0" "advance_event" "lesson_started" "next_lesson" "tm2_select_hero" } "tm2_select_hero" // setup the player { "player_team" "good" "player_hero" "npc_dota_hero_sniper" "player_set_gold" "2532" "advance_event" "lesson_started" "next_lesson" "tm2_setup_tide" } "tm2_setup_tide" // spawn tide now and set to idle { "trigger_logic_relay" "relay_r1_setup_tide" "advance_event" "lesson_started" "next_lesson" "tm2_upgrade_ability" } "tm2_upgrade_ability" // choose an ability as soon as our player is ready { "convars" { "dota_health_regen_disable" "1" } "player_upgrade_ability" "attribute_bonus" "set_npc_health" // lower player health for tango training { "npc" "npc_dota_hero_sniper" "health_pct" "45" } "hero_levelup" { "hero" "npc_dota_hero_tidehunter" "level" "7" "levelups" { "tidehunter_anchor_smash" "1" "tidehunter_gush" "1" "tidehunter_kraken_shell" "1" "tidehunter_kraken_shell" "1" "tidehunter_kraken_shell" "1" "tidehunter_ravage" "1" } } //"teleportcamera_to" "tgt_r1_tangoloc" "npc_set_buddha_on" "npc_dota_hero_tidehunter" "npc_set_buddha_on" "npc_dota_hero_sniper" "advance_time" "1.0" "advance_event" "lesson_started" "next_lesson" "tm2_r1_begin" } "tm2_r1_begin" { "fade_to" "0" "trigger_logic_relay" "relay_snd_tutorial_start" "npc_animation" // set tidehunter starting position, must be after short delay to allow spawn into world { "npc" "npc_dota_hero_tidehunter" "activity" "ACT_DOTA_INTRO_LOOP" "loop" "1" "use_modifier_for_anim" "0" } "npc_animation" // creep overlooking enemy creep { "npc" "ss_r1_friendly_creep_initial_2" "activity" "ACT_DOTA_IDLE_IMPATIENT_SWORD_TAP" "loop" "1" } "npc_animation" { "npc" "ss_r1_enemy_creep_asleep" "activity" "ACT_DOTA_SHARPEN_WEAPON" "loop" "1" } "npc_animation" // captured creep { "npc" "ss_r5_friendly_creep_camp_1a" "activity" "ACT_DOTA_CAGED_CREEP_RAGE" "loop" "1" } "npc_animation" // captured creep { "npc" "ss_r5_friendly_creep_camp_1b" "activity" "ACT_DOTA_CAGED_CREEP_SMASH" "loop" "1" } "npc_animation" { "npc" "npc_dota_hero_sniper" "activity" "ACT_DOTA_INTRO" "fire_once" "1" "use_modifier_for_anim" "1" } "advance_time" "2" "advance_event" "lesson_started" "next_lesson" "tm2_r1_intro" } "tm2_r1_sniper_test" { "npc_animation" { "npc" "npc_dota_hero_sniper" "activity" "ACT_DOTA_INTRO" "fire_once" "1" "use_modifier_for_anim" "1" } "advance_event" "task_completed" "next_lesson" "" } "tm2_r1_intro" { "convars" { "dota_tutorial_actionpanel" "1" } "hide_npc" "npc_dota_hero_tidehunter" "npc_animation" { "npc" "ss_roquelaire" "activity" "ACT_DOTA_INTRO" } "npc_speech" { "text" "#DOTA_Tutorial_M2_Intro" "npc" "ss_roquelaire" "allow_movement" "0" "duration" "10" } "npc_speech" { "text" "#DOTA_Tutorial_M2_CallOver" "npc" "ss_r1_friendly_creep_initial_1" "initial_delay" "10" } "npc_sleep" "ss_r1_enemy_creep_asleep" "advance_time" "2" "advance_event" "lesson_started" "next_lesson" "tm2_r1_givequest" } "tm2_r1_givequest" { "quest" { "name" "quest_m2_defeattide" "type" "0" // 0 = point, 1 = gold, 2 = sword, 3 = shield "title" "#DOTA_Quest_M2_DefeatTide" } "advance_event" "event_r1_tango" // walked towards creep "next_lesson" "tm2_r1_tangointro" } "tm2_r1_tangointro" { "stop_npc_speech" "ss_r1_friendly_creep_initial_1" "npc_speech" { "text" "#DOTA_Tutorial_M2_TangoIntro" "npc" "ss_r1_friendly_creep_initial_1" } "npc_animation" { "npc" "ss_r1_friendly_creep_initial_1" "activity" "ACT_DOTA_PRESENT_ITEM" "loop" "1" } "advance_time" "1" "advance_event" "lesson_started" "next_lesson" "tm2_r1_tangodisplay" } "tm2_r1_tangodisplay" { "ping_minimap" { "delay" "0" "entity_name" "tgt_r1_tangoloc" "repeat" "10" } "create_item_at_entity" { "entity_name" "tgt_r1_tangoloc" "item" "item_tango" } "advance_event" "lesson_started" "next_lesson" "tm2_r1_tangopickup" } "tm2_r1_tangopickup" { "stop_npc_animation" "ss_r1_friendly_creep_initial_1" "task_get_item_on_player" { "item_tango" "1" } "advance_event" "task_completed" "next_lesson" "tm2_r1_tangouse" } "tm2_r1_tangouse" { "ping_minimap_stop" "1" "npc_speech" { "text" "#DOTA_Tutorial_M2_TangoUse" "npc" "ss_r1_friendly_creep_initial_1" } "task_use_item" "item_tango" "advance_event" "task_completed" "next_lesson" "tm2_r1_tangouse_delay" } "tm2_r1_tangouse_delay" { "convars" { "dota_health_regen_disable" "0" } "advance_time" "1" "advance_event" "lesson_started" "next_lesson" "tm2_r1_tangocomplete" } "tm2_r1_tangocomplete" { "npc_speech" { "text" "#DOTA_Tutorial_M2_TangoRestore" "npc" "ss_r1_friendly_creep_initial_1" "duration" "10" } "trigger_logic_relay" "relay_r1_follow_begin" // creep moves to next waypoint, will advance lesson after 10s via logic trigger "advance_event" "event_r1_followtimer" // player triggered or time triggered "next_lesson" "tm2_r1_waitforplayer" } "tm2_r1_waitforplayer" // wait here for player to be in the desired area { "advance_event" "event_r1_atgate" "next_lesson" "tm2_r1_rangedmoved" } "tm2_r1_rangedmoved" { "stop_npc_speech" "ss_r1_friendly_creep_initial_1" "trigger_logic_relay" "relay_r1_patrol_begin" "advance_time" "3" "advance_event" "lesson_started" "next_lesson" "tm2_r1_rangedstopanim" } "tm2_r1_rangedstopanim" { "stop_npc_animation" "ss_r1_friendly_creep_initial_2" "npc_speech" { "text" "#DOTA_Tutorial_M2_RangedCreep" "npc" "ss_roquelaire" "allow_movement" "1" "initial_delay" "2" } "advance_event" "event_r1_patrol_dead" "next_lesson" "tm2_r1_rangedcontinued" } "tm2_r1_rangedcontinued" { "npc_speech" { "text" "#DOTA_Tutorial_M2_RangedLevelTwo" "npc" "ss_roquelaire" "duration" "10" } "quest" { "name" "quest_m2_leveltwo" "type" "2" // 0 = point, 1 = gold, 2 = sword, 3 = shield "title" "#DOTA_Quest_M2_LevelTwo" "subquest_player_stat" { "player_stat_type" "level" "player_stat_value" "2" } } "advance_event" "lesson_started" "next_lesson" "tm2_r1_spawncreeps" } "tm2_r1_spawncreeps" { "convars" { "dota_tutorial_roquelaire_useperches" "1" } "trigger_logic_relay" "relay_r1_spawn_wave_enable" "advance_on_quest" "quest_m2_leveltwo" "next_lesson" "tm2_r1_aoelearn" } "tm2_r1_aoelearn" { "convars" { "dota_tutorial_force_learn_ability" "0" } "trigger_logic_relay" "relay_r1_creep_level_end" // set respawn flags to false on spawners "npc_speech" { "text" "#DOTA_Tutorial_M2_AreaAssign" "npc" "ss_roquelaire" "allow_movement" "1" } "task_learn_ability" "sniper_shrapnel" "advance_event" "task_completed" "next_lesson" "tm2_r1_aoehowto" } "tm2_r1_aoehowto" { "npc_speech" { "text" "#DOTA_Tutorial_M2_AreaLearn" "npc" "ss_roquelaire" "allow_movement" "1" "duration" "8" } "trigger_logic_relay" "relay_r1_creep_aoe_wait" // waiting for next lesson. work around lesson_started not working in nested advance_event when paired with advance_time "task_use_ability" "sniper_shrapnel" "advance_event" { "tm2_event_aoe_wait" "tm2_r1_aoeuse" "task_completed" "tm2_r1_aoedamage" // player used ability early, skip ahead } } "tm2_r1_aoeuse" { "npc_speech" { "text" "#DOTA_Tutorial_M2_AreaIncoming" "npc" "ss_roquelaire" "allow_movement" "1" "duration" "4" } "reactive_tips" { "tip_useshrapnel" { "timer" "4" "repeat_count" "999" "remove_on_ability" "sniper_shrapnel" "npc_speech" { "text" "#DOTA_Tutorial_M2_AreaUse" "npc" "ss_r1_friendly_creep_1" "duration" "8" "allow_movement" "1" "find_nearest_friendly" "1" } } } "trigger_logic_relay" "relay_r1_creep_aoe_begin" "task_use_ability" "sniper_shrapnel" "advance_event" "task_completed" "next_lesson" "tm2_r1_aoedamage" } "tm2_r1_aoedamage" { "reactive_tip_stop" "tip_useshrapnel" "stop_npc_speech" "ss_r1_friendly_creep_1" "npc_speech" { "text" "#DOTA_Tutorial_M2_AreaFriendly" "npc" "ss_roquelaire" "allow_movement" "1" "initial_delay" "2" "duration" "6" } "trigger_logic_relay" "relay_r1_creep_aoe_end" "advance_event" "tm2_event_aoe_finished" "next_lesson" "tm2_r2_towerspawn" } "tm2_r2_towerspawn" // spawn creep early before npc_speech so that dialog attaches properly { "trigger_logic_relay" "relay_r2_tower_spawn" "advance_event" "lesson_started" "next_lesson" "tm2_r2_towerbegin" } "tm2_r2_towerbegin" { "convars" { "dota_tutorial_roquelaire_useperches" "0" } "npc_speech" { "text" "#DOTA_Tutorial_M2_TowerHelp" "npc" "ss_r2_friendly_creep_tower_1" "initial_delay" "4" "allow_movement" "1" } "trigger_logic_relay" "relay_r2_tower_begin" // enable trigger near creep after 10s "advance_time" "10" // must be lower than the logic_relay enable delay on relay_r2_tower_begin (10.5) "advance_event" "lesson_started" "next_lesson" "tm2_r2_towerapproach" } "tm2_r2_towerapproach" { "advance_event" "approached_creep" // wait for player to be near creep before next_lesson "next_lesson" "tm2_r2_mapintro" } "tm2_r2_mapintro" { "set_tutorial_UI" "6" "show_minimap_select_dialog" "1" "npc_speech" { "text" "#DOTA_Tutorial_M2_MapIntro" "npc" "ss_r2_friendly_creep_tower_1" } "npc_animation" { "npc" "ss_r2_friendly_creep_tower_1" "activity" "ACT_DOTA_PRESENT_ITEM" "loop" "1" } "advance_time" "6" "advance_event" "lesson_started" "next_lesson" "tm2_r2_mapexplain" } "tm2_r2_mapexplain" { "stop_npc_speech" "ss_r2_friendly_creep_tower_1" "stop_npc_animation" "ss_r2_friendly_creep_tower_1" "npc_speech" { "text" "#DOTA_Tutorial_M2_MapExplain" "npc" "ss_roquelaire" "allow_movement" "1" } "quest" { "name" "quest_m2_towerdefend" "type" "3" // 0 = point, 1 = gold, 2 = sword, 3 = shield "title" "#DOTA_Quest_M2_TowerDefend" } "advance_time" "10" "advance_event" "lesson_started" "next_lesson" "tm2_r2_towerfollow" } "tm2_r2_towerdebug" // debug { "convars" { "dota_tutorial_force_learn_ability" "-1" } "set_tutorial_UI" "6" "trigger_logic_relay" "relay_r2_tower_begin" "advance_event" "lesson_started" "next_lesson" "tm2_r2_towerfollow" } "tm2_r2_towerfollow" { "convars" { "dota_tutorial_roquelaire_useperches" "0" } "ping_minimap" { "delay" "3" "entity_name" "ping_tower_1" } "npc_speech" { "text" "#DOTA_Tutorial_M2_TowerGoTo" "npc" "ss_roquelaire" "allow_movement" "1" "duration" "4" } "trigger_logic_relay" "relay_r2_tower_set_wp" "advance_event" "tm2_r2_playerentered" "next_lesson" "tm2_r2_tidefight" } "tm2_r2_tidefight" { "reveal_npc" "npc_dota_hero_tidehunter" "npc_animation" { "npc" "npc_dota_hero_tidehunter" "activity" "ACT_DOTA_INTRO" "use_modifier_for_anim" "0" "fire_once" "1" } "npc_speech" // creep near tower calls for help { "text" "#DOTA_Tutorial_M2_TowerDefend" "npc" "ss_r2_friendly_creep_tower_def_1" "initial_delay" "6" "duration" "5" "find_nearest_friendly" "1" "allow_movement" "1" } "trigger_logic_relay" "relay_r2_tide_begin" // release tidehunter "trigger_logic_relay" "relay_snd_tide_appear" "advance_event" "event_r2_tide_teleport" "next_lesson" "tm2_r2_tidegone" } "tm2_r2_tidegone" { "convars" { "dota_tutorial_roquelaire_useperches" "1" "dota_tutorial_prevent_exp_gain" "4" "dota_tutorial_force_learn_ability" "1" } "quest" { "name" "quest_level3" "subquest_player_stat" { "player_stat_type" "level" "player_stat_value" "3" } } "advance_on_quest" "quest_level3" "next_lesson" "tm2_r2_towerlevel" } "tm2_r2_towerlevel" { "npc_speech" { "text" "#DOTA_Tutorial_M2_TowerLevel" "npc" "ss_roquelaire" "allow_movement" "1" } "trigger_logic_relay" "relay_r2_wave_1_end" "task_learn_ability" "sniper_headshot" "advance_event" "task_completed" "next_lesson" "tm2_r2_towercontinue" } "tm2_r2_towercontinue" { "convars" { "dota_tutorial_force_learn_ability" "-1" } "stop_npc_speech" "ss_roquelaire" "trigger_logic_relay" "relay_r2_tower_defend_wave_2" // begin wave 2 unless not ready, logic in map check if wave 1 complete then will fire when ready "advance_event" "lesson_started" "next_lesson" "tm2_r2_reachlevel" } "tm2_r2_reachlevel" { "npc_speech" { "text" "#DOTA_Tutorial_M2_TowerRetreat" "npc" "ss_roquelaire" "allow_movement" "1" "duration" "10" } "quest" { "name" "quest_level4" "subquest_player_stat" { "player_stat_type" "level" "player_stat_value" "4" } } "advance_on_quest" "quest_level4" "next_lesson" "tm2_r2_learnany" } "tm2_r2_learnany" { "trigger_logic_relay" "relay_r2_wave_2_end" "task_learn_ability" "" // empty, player can learn any available ability "advance_event" { "tower_defended" "tm2_r2_skillchoice" // player has not leveled up "task_completed" "tm2_r2_towerwait" // player leveled up before all creeps are dead } } "tm2_r2_towerwait" // player has chosen skill and is still fighting { "advance_event" "tower_defended" "next_lesson" "tm2_r2_towercomplete" } "tm2_r2_towercomplete" { "npc_speech" { "text" "#DOTA_Tutorial_M2_TowerThanks" "npc" "ss_r2_friendly_creep_tower_def_1" "duration" "10" "find_nearest_friendly" "1" } "quest_finish" "quest_m2_towerdefend" "advance_time" "10" "advance_event" "lesson_started" "next_lesson" "tm2_r2_towerexplain" } "tm2_r2_skillchoice" { "npc_speech" { "text" "#DOTA_Tutorial_M2_TowerThanks" "npc" "ss_r2_friendly_creep_tower_def_1" "duration" "8" "find_nearest_friendly" "1" } "quest_finish" "quest_m2_towerdefend" "npc_speech" { "text" "#DOTA_Tutorial_M2_TowerLevelAny" "npc" "ss_roquelaire" "initial_delay" "8" "allow_movement" "1" } "task_learn_ability" "" // empty, player can learn any available ability "advance_event" "task_completed" "next_lesson" "tm2_r2_towerexplain" } "tm2_r2_towerexplain" { "stop_npc_speech" "ss_roquelaire" // interrupt DOTA_Tutorial_M2_TowerLevelAny "npc_speech" { "text" "#DOTA_Tutorial_M2_TowerExplain" "npc" "ss_roquelaire" "allow_movement" "1" } "advance_time" "8" "advance_event" "lesson_started" "next_lesson" "tm2_r2_stashboots" // return to main lessons } "tm2_r2_stashboots" { "convars" { "dota_tutorial_disable_stash" "0" } //"player_set_gold" "775" "npc_speech" { "text" "#DOTA_Tutorial_M2_StashBuyBoots" "npc" "ss_roquelaire" "allow_movement" "1" } "add_item_shop_whitelist" "item_boots" "task_buy_items" { "item_boots" "1" } "advance_event" "task_completed" "next_lesson" "tm2_r2_mouseoverstash" } "tm2_r2_mouseoverstash" { "npc_speech" { "text" "#DOTA_Tutorial_M2_StashViewStash" "npc" "ss_roquelaire" "allow_movement" "1" } "remove_item_shop_whitelist" "item_boots" "task_mouseover_stash_item" "1" "advance_event" "task_completed" "next_lesson" "tm2_r2_mouseoverstash_postpause" } "tm2_r2_mouseoverstash_postpause" { "stop_npc_speech" "ss_roquelaire" "advance_time" "5" "advance_event" "lesson_started" "next_lesson" "tm2_r2_stashring" } "tm2_r2_stashring" { "npc_speech" { "text" "#DOTA_Tutorial_M2_StashBuyRing" "npc" "ss_roquelaire" "allow_movement" "1" } "add_item_shop_whitelist" "item_ring_of_protection" "task_buy_items" { "item_ring_of_protection" "1" } "advance_event" "task_completed" "next_lesson" "tm2_r2_stashgo" } "tm2_r2_stashgo" { "convars" { "dota_tutorial_roquelaire_useperches" "0" } "remove_item_shop_whitelist" "item_ring_of_protection" "npc_speech" { "text" "#DOTA_Tutorial_M2_StashGo" "npc" "ss_roquelaire" "duration" "4" } "trigger_logic_relay" "relay_town_begin" "advance_time" "1" "advance_event" "lesson_started" "next_lesson" "tm2_r2_stashquest" } "tm2_r2_stashquest" { "quest" { "name" "quest_m2_tobase" "type" "0" // 0 = point, 1 = gold, 2 = sword, 3 = shield "title" "#DOTA_Quest_M2_ReturnToBase" } "advance_event" "event_player_entered_base" "next_lesson" "tm2_r3_stashretrieve" } "tm2_r3_stashretrieve" { "npc_speech" { "text" "#DOTA_Tutorial_M2_StashRetrieve" "npc" "tgt_r3_shopspeech" } "quest_finish" "quest_m2_tobase" "task_progress_count" "2" "task_get_item_on_player" { "item_boots" "1" "item_ring_of_protection" "1" } "advance_event" "task_completed" "next_lesson" "tm2_r3_courierbuy" } "tm2_r3_courierbuy" { "npc_speech" { "text" "#DOTA_Tutorial_M2_CourierBuy" "npc" "tgt_r3_shopspeech" } "add_item_shop_whitelist" "item_courier" "task_buy_items" { "item_courier" "1" } "advance_event" "task_completed" "next_lesson" "tm2_r3_courierdeploy" } "tm2_r3_courierdeploy" { "npc_speech" { "text" "#DOTA_Tutorial_M2_CourierDeploy" "npc" "tgt_r3_shopspeech" } "remove_item_shop_whitelist" "item_courier" "task_use_item" "item_courier" "advance_event" "task_completed" "next_lesson" "tm2_r3_courierfinish" } "tm2_r3_courierfinish" { "npc_speech" { "text" "#DOTA_Tutorial_M2_CourierComplete" "npc" "tgt_r3_shopspeech" "duration" "8" } "advance_time" "8" "advance_event" "lesson_started" "next_lesson" "tm2_r3_levelup" } "tm2_r3_levelupdebug" // debug { "convars" { "dota_tutorial_disable_stash" "0" "dota_tutorial_force_learn_ability" "-1" } "stop_npc_animation" "npc_dota_hero_tidehunter" "reveal_npc" "npc_dota_hero_tidehunter" "set_tutorial_UI" "6" "advance_event" "lesson_started" "next_lesson" "tm2_r3_levelup" } "tm2_r3_levelup" { "convars" { "dota_tutorial_prevent_exp_gain" "6" } "trigger_logic_relay" "relay_r4_setup" // set up creep camps and enable triggers "npc_speech" { "text" "#DOTA_Tutorial_M2_LevelUp" "npc" "ss_roquelaire" "allow_movement" "1" } "quest" { "name" "quest_m2_levelult" "type" "0" // 0 = point, 1 = gold, 2 = sword, 3 = shield "title" "#DOTA_Quest_M2_Assassinate" } "advance_event" "player_exit_base" "next_lesson" "tm2_r3_levelgo" } "tm2_r3_levelgo" { "convars" { "dota_tutorial_roquelaire_useperches" "1" } "stop_npc_speech" "ss_roquelaire" "advance_event" "event_r4_player_near" "next_lesson" "tm2_r4_creephelp" } "tm2_r4_creephelp" { "convars" { "dota_tutorial_roquelaire_useperches" "0" } "npc_speech" { "text" "#DOTA_Tutorial_M2_BridgeSmoke" "npc" "ss_r2_friendly_creep_tower_def_1" "duration" "5" } "advance_event" "event_r4_player_at_stairs" "next_lesson" "tm2_r4_waitforplayer" } "tm2_r4_waitforplayer" { "npc_animation" { "npc" "npc_dota_hero_tidehunter" "activity" "ACT_DOTA_BRIDGE_THREAT" //"vo" "scenes/tidehunter/tidehunter_tide_death_01.vcd" "use_modifier_for_anim" "0" "fire_once" "1" } "trigger_logic_relay" "relay_snd_tide_escape" "advance_event" { "event_r4_player_climbed_stairs" "tm2_r4_tide_escape" // player climbed stairs, tidehunter flees immediately "event_r4_creeps_alldead" "tm2_r4_tide_escape_alldead" // or wait for all enemy creeps to be dead then flee } } "tm2_r4_tide_escape" // tidehunter flees and advances lesson on completion { "trigger_logic_relay" "relay_r4_tide_escape" "advance_event" "event_r4_tide_escape_complete" "next_lesson" "tm2_r4_bridgeout" } "tm2_r4_tide_escape_alldead" { "trigger_logic_relay" "relay_r4_tide_escape_alldead" "advance_event" "event_r4_tide_escape_complete" "next_lesson" "tm2_r4_bridgeout" } "tm2_r4_bridgeout" { "convars" { "dota_creeps_no_spawning" "0" } "npc_speech" { "text" "#DOTA_Tutorial_M2_BridgeOut" "npc" "ss_roquelaire" } "advance_time" "10" "advance_event" "lesson_started" "next_lesson" "tm2_r4_secretoverlookmove" } "tm2_r4_secretoverlookmove" { "stop_npc_speech" "ss_roquelaire" "npc_speech" { "text" "#DOTA_Tutorial_M2_SecretOverlook" "npc" "ss_roquelaire" "allow_movement" "1" "initial_delay" "2" // time to land at new perch } "trigger_logic_relay" "relay_r4_secret_setup" // move roq and enable event trigger "ping_minimap" { "delay" "2" "entity_name" "ping_secret_overlook" "repeat" "10" } "advance_event" "event_r4_at_overlook" "next_lesson" "tm2_r4_secretgo" } "tm2_r4_secretgo" { "ping_minimap_stop" "1" "npc_speech" { "text" "#DOTA_Tutorial_M2_SecretGo" "npc" "ss_roquelaire" "duration" "6" } "advance_event" "event_r4_secretreached" // player at secret shop "next_lesson" "tm2_r4_secretexplain" } "tm2_r4_secretexplain" { "npc_speech" { "text" "#DOTA_Tutorial_M2_SecretExplain" "npc" "tgt_r4_secretspeech" } "add_item_shop_whitelist" "item_energy_booster" "task_buy_items" { "item_energy_booster" "1" } "advance_event" "task_completed" "next_lesson" "tm2_r4_upgradeboots" } "tm2_r4_upgradeboots" { "npc_speech" { "text" "#DOTA_Tutorial_M2_UpgradeBoots" "npc" "tgt_r4_secretspeech" } "remove_item_shop_whitelist" "item_energy_booster" "task_use_item" "item_arcane_boots" "advance_event" "task_completed" "next_lesson" "tm2_r4_upgradecomplete" } "tm2_r4_upgradecomplete" { "npc_speech" { "text" "" "npc" "tgt_r4_secretspeech" } "npc_speech" { "text" "#DOTA_Tutorial_M2_UpgradeComplete" "npc" "ss_roquelaire" "duration" "6" } "trigger_logic_relay" "relay_r5_setup" "ping_minimap" { "delay" "4" "npc" "blocker_r5_gate_prop" "repeat" "10" } "advance_event" "event_r5_player_entered" "next_lesson" "tm2_r5_gate" } "tm2_r5_gate" { "npc_speech" { "text" "#DOTA_Tutorial_M2_LevelGraveyard" "npc" "ss_roquelaire" "duration" "4" "allow_movement" "1" } "ping_minimap_stop" "1" "advance_event" "event_pull_begin" "next_lesson" "tm2_r5_pullbegin" } "tm2_r5_pulldebug" // debug jump point { "convars" { "dota_tutorial_disable_stash" "0" "dota_tutorial_force_learn_ability" "-1" "dota_tutorial_roquelaire_useperches" "1" "dota_creeps_no_spawning" "0" } "set_tutorial_UI" "6" "advance_event" "event_pull_begin" "next_lesson" "tm2_r5_pullbegin" } "tm2_r5_pullbegin" { "npc_speech" { "text" "#DOTA_Tutorial_M2_PullBegin" "npc" "ss_roquelaire" "allow_movement" "1" } "ping_minimap" { "delay" "1" "entity_name" "wp_r5_neutral_camp" } "advance_event" "event_r4_pull_complete" "next_lesson" "tm2_r5_pullend" } "tm2_r5_pullend" { "stop_npc_speech" "ss_roquelaire" "advance_event" "event_r4_rescue_approach" "next_lesson" "tm2_r5_upgradebuyitem1" } "tm2_r5_upgradebuyitem1" { "npc_speech" { "text" "#DOTA_Tutorial_M2_CourierBuyItem1" "npc" "ss_roquelaire" } "add_item_shop_whitelist" "item_sobi_mask" "task_buy_items" { "item_sobi_mask" "1" } "advance_event" "task_completed" "next_lesson" "tm2_r5_courierretrieve" } "tm2_r5_courierretrieve" { "npc_speech" { "text" "#DOTA_Tutorial_M2_CourierRetrieve" "npc" "ss_roquelaire" } "highlight_hud" { "element" "inventory.courierState.deliverButton" "duration" "-1" // in seconds to auto-expire after a time. -1 to never expire } "remove_item_shop_whitelist" "item_sobi_mask" "task_courier_transfer_item" "1" "advance_event" "task_completed" "next_lesson" "tm2_r5_couriertravel" } "tm2_r5_couriertravel" { "npc_speech" { "text" "#DOTA_Tutorial_M2_CourierTravel" "npc" "ss_roquelaire" } "highlight_hud" { "element" "" } "ping_minimap" { "delay" "1.0" "npc" "npc_dota_courier" } "task_get_item_on_player" { "item_ring_of_basilius" "1" } "advance_event" "task_completed" "next_lesson" "tm2_r5_upgradefinished" } "tm2_r5_upgradefinished" { "npc_speech" { "text" "#DOTA_Tutorial_M2_RingUpgraded" "npc" "ss_roquelaire" } "task_use_item" "item_ring_of_basilius" "advance_event" "task_completed" "next_lesson" "tm2_r5_morexp" } "tm2_r5_morexp" // debug jump point { "convars" { "dota_tutorial_disable_stash" "0" // debug "dota_tutorial_force_learn_ability" "-1" // debug "dota_tutorial_roquelaire_useperches" "0" } "set_tutorial_UI" "6" // debug "npc_speech" { "text" "#DOTA_Tutorial_M2_LevelExperience" "npc" "ss_roquelaire" "duration" "8" } "quest" { "name" "quest_levelsix" "type" "0" // 0 = point, 1 = gold, 2 = sword, 3 = shield "title" "#DOTA_Quest_M2_LevelSix" "subquest_player_stat" { "player_stat_type" "level" "player_stat_value" "6" } } "trigger_logic_relay" "relay_r5_levelult" "advance_event" "event_r5_entering_arena" "next_lesson" "tm2_r5_reachsix" } "tm2_r5_reachsix" { "convars" { "dota_tutorial_roquelaire_useperches" "1" } "advance_on_quest" "quest_levelsix" "next_lesson" "tm2_r5_ultlearn" } "tm2_r5_ultlearn" { "convars" { "dota_tutorial_force_learn_ability" "3" } "trigger_logic_relay" "relay_r5_end" // reached level six, stop spawning "npc_speech" { "text" "#DOTA_Tutorial_M2_LevelUlt" "npc" "ss_roquelaire" "allow_movement" "1" } "task_learn_ability" "sniper_assassinate" "advance_event" "task_completed" "next_lesson" "tm2_r5_upgradecourier" } "tm2_r5_upgradecourier" // upgrade courier and buy teleport { "convars" { "dota_tutorial_disable_stash" "0" // debug "dota_tutorial_force_learn_ability" "-1" // debug "dota_tutorial_roquelaire_useperches" "1" // debug } "set_tutorial_UI" "6" // debug "quest_finish" "quest_m2_levelult" "trigger_logic_relay" "relay_r5_debug_teleport" // added for debug, only enables trigger around tower "npc_speech" { "text" "#DOTA_Tutorial_M2_TeleportBlock" "npc" "ss_roquelaire" "allow_movement" "1" } "quest_finish" "quest_levelult" "add_item_shop_whitelist" "item_flying_courier" "task_buy_items" { "item_flying_courier" "1" } "advance_event" "task_completed" "next_lesson" "tm2_r7_teleportbuy" } "tm2_r7_teleportbuy" { "npc_speech" { "text" "#DOTA_Tutorial_M2_TeleportBuy" "npc" "ss_roquelaire" "allow_movement" "1" } "remove_item_shop_whitelist" "item_flying_courier" "add_item_shop_whitelist" "item_tpscroll" "task_buy_items" { "item_tpscroll" "1" } "advance_event" "task_completed" "next_lesson" "tm2_r7_teleportcourier" } "tm2_r7_teleportcourier" { "npc_speech" { "text" "#DOTA_Tutorial_M2_TeleportCourier" "npc" "ss_roquelaire" "allow_movement" "1" } "remove_item_shop_whitelist" "item_tpscroll" "task_courier_transfer_item" "1" "highlight_hud" { "element" "inventory.courierState.deliverButton" "duration" "-1" // in seconds to auto-expire after a time. -1 to never expire } "advance_event" "task_completed" "next_lesson" "tm2_r7_teleportchannel" } "tm2_r7_teleportchannel" { "npc_speech" { "text" "#DOTA_Tutorial_M2_TeleportChannel" "npc" "ss_roquelaire" "allow_movement" "1" } "highlight_hud" // clear highlight { "element" "" } "advance_time" "1" "advance_event" "lesson_started" "next_lesson" "tm2_r7_teleportquest" } "tm2_r7_teleportquest" { "quest" { "name" "quest_teleport" "type" "0" // 0 = point, 1 = gold, 2 = sword, 3 = shield "title" "#DOTA_Quest_M2_Teleport" } "task_get_item_on_player" // item on player { "item_tpscroll" "1" } "advance_event" "task_completed" "next_lesson" "tm2_r7_teleportuse" } "tm2_r7_teleportdebug" { "convars" { "dota_tutorial_disable_stash" "0" "dota_tutorial_force_learn_ability" "-1" "dota_tutorial_roquelaire_useperches" "1" } "reveal_npc" "npc_dota_hero_tidehunter" "stop_npc_animation" "npc_dota_hero_tidehunter" "trigger_logic_relay" "relay_r5_teleport_debug" "set_tutorial_UI" "6" "advance_event" "lesson_started" "next_lesson" "tm2_r7_teleportuse" } "tm2_r7_teleportuse" // wait for player arrive at tower { "npc_speech" { "text" "#DOTA_Tutorial_M2_TeleportUse" "npc" "ss_roquelaire" "allow_movement" "1" } "ping_minimap" { "delay" "2.0" "npc" "ping_tower_1" "repeat" "10" } "advance_event" { "event_player_teleported" "tm2_r7_teleportdone" // successful teleport to desired location "cancelled_teleport" "tm2_r7_teleportcancel" // player cancelled teleport during channel, get a new tp scroll "wrong_area" "tm2_r7_teleportwrongloc" // location incorrect, bird says stuff, try again } } "tm2_r7_teleportdone" { "convars" { "dota_tutorial_roquelaire_useperches" "0" } "ping_minimap_stop" "1" "npc_speech" { "text" "#DOTA_Tutorial_M2_TeleportCenter" "npc" "ss_roquelaire" "duration" "8" } "quest_finish" "quest_teleport" "trigger_logic_relay" "relay_r5_teleport" // fires delayed advance_event via map logic to work around advance_time not working in this situation "task_double_tap" "1" "advance_event" { "task_completed" "tm2_r6_followplayer" // player centered early "event_r5_timeout" "tm2_r6_followplayer" // player waited, logic will fire in map to progress (advance_time does not work) } } "tm2_r7_teleportcancel" // teleport cancelled during channel { "npc_speech" { "text" "#DOTA_Tutorial_M2_TeleportCancel" "npc" "ss_roquelaire" } "ping_minimap_stop" "1" "add_item_shop_whitelist" "item_tpscroll" "player_set_gold" "600" "task_buy_items" { "item_tpscroll" "1" } "advance_event" "task_completed" "next_lesson" "tm2_r7_teleportpickedup" } "tm2_r7_teleportpickedup" { "remove_item_shop_whitelist" "item_tpscroll" "highlight_hud" { "element" "inventory.courierState.deliverButton" "duration" "-1" // in seconds to auto-expire after a time. -1 to never expire } "task_courier_transfer_item" "1" "advance_event" "task_completed" "next_lesson" "tm2_r7_teleportonplayer" } "tm2_r7_teleportonplayer" { "task_get_item_on_player" { "item_tpscroll" "1" } "highlight_hud" { "element" "" } "advance_event" "task_completed" "next_lesson" "tm2_r7_teleportuse" } "tm2_r7_teleportwrongloc" // chose wrong location on minimap or otherwise, deny teleport and reiterate correct location { "npc_speech" { "text" "#DOTA_Tutorial_M2_TeleportWrongLoc" "npc" "ss_roquelaire" } "ping_minimap" { "delay" "0" "npc" "ping_tower_1" } "advance_event" { "event_player_teleported" "tm2_r7_teleportdone" // successful teleport to desired location "cancelled_teleport" "tm2_r7_teleportcancel" // player cancelled teleport during channel, get a new tp scroll" "wrong_area" "tm2_r7_teleportwrongloc" // location incorrect, bird says stuff, try again } } "tm2_r6_followplayer" { "teleport_roq" "wp_r2_roquelaire_3" "trigger_logic_relay" "relay_r5_teleport_cancel_pending" // cancel the pending timer from the previous lesson "advance_time" "1" "advance_event" "lesson_started" "next_lesson" "tm2_r6_roqmeet" } "tm2_r6_roqmeet" { "npc_speech" { "text" "#DOTA_Tutorial_M2_TeleportHere" "npc" "ss_roquelaire" } "ping_minimap" { "delay" "5" "npc" "relay_r2_roqsetwaypoint" "repeat" "10" } "trigger_logic_relay" "relay_r2_roqsetwaypoint" "advance_event" "event_r6_player_at_roq" "next_lesson" "tm2_r6_roqarrived" } "tm2_r6_roqarrived" { "ping_minimap_stop" "1" "advance_event" "lesson_started" "next_lesson" "tm2_r6_killtide" } "tm2_r6_killtide" { "trigger_logic_relay" "relay_r6_tide" "ping_minimap" { "delay" "8" "entity_name" "wp_r4_tidehunter_wait" } "npc_speech" { "text" "#DOTA_Tutorial_M2_KillTide" "npc" "ss_roquelaire" "duration" "10" } "advance_event" "event_kill_tide" "next_lesson" "tm2_r6_assassinate" } "tm2_r6_tidedebug" // debug, used only from console { "convars" { "dota_tutorial_force_learn_ability" "-1" } "set_tutorial_UI" "6" "reveal_npc" "npc_dota_hero_tidehunter" "trigger_logic_relay" "relay_r6_tide_debug" "advance_event" "lesson_started" "next_lesson" "tm2_r6_assassinate" } "tm2_r6_assassinate" { "npc_set_buddha_off" "npc_dota_hero_tidehunter" "npc_animation" { "npc" "npc_dota_hero_tidehunter" "activity" "ACT_DOTA_DEATH_BY_SNIPER" "death" "1" // play when tidehunter dies "use_modifier_for_anim" "0" } "npc_speech" { "text" "#DOTA_Tutorial_M2_KillTideHow" "npc" "ss_roquelaire" "allow_movement" "1" } "trigger_logic_relay" "relay_snd_tide_death" "advance_event" "event_r6_tidekilled" "next_lesson" "tm2_r6_tidekilleddelay" } "tm2_r6_tidekilleddelay" { "advance_time" "1" "advance_event" "lesson_started" "next_lesson" "tm2_r6_assassinatecomplete" } "tm2_r6_assassinatecomplete" { "quest_finish" "quest_m2_defeattide" "advance_time" "2" "advance_event" "lesson_started" "next_lesson" "tm2_r6_assassinatecongrats" } "tm2_r6_assassinatecongrats" { "npc_speech" { "text" "#DOTA_Tutorial_M2_KillTideComplete" "npc" "ss_roquelaire" "allow_movement" "1" } "advance_time" "10" "advance_event" "lesson_started" "next_lesson" "tm2_end" } "tm2_end" { "stop_npc_speech" "ss_roquelaire" "trigger_logic_relay" "relay_snd_tutorial_end" "finish_text" "#DOTA_Tutorial_Finished_Tutorial02" "finish_tutorial" "1" } }