diff --git a/public/css/game-pane.styl b/public/css/game-pane.styl index 8ccc3c211d..5f7216fff9 100644 --- a/public/css/game-pane.styl +++ b/public/css/game-pane.styl @@ -1,6 +1,9 @@ .border-right border-right 1px solid #ddd +.border-left + border-left 1px solid #ddd + .tab-notification color #fff background-color #51a351 diff --git a/public/css/shared.styl b/public/css/shared.styl index d05ebcbb95..50f270cc0c 100644 --- a/public/css/shared.styl +++ b/public/css/shared.styl @@ -38,6 +38,10 @@ a.hint:hover .vertical-20 vertical-align: 20% +.popover + hr + margin: 10px 0 + @media (max-width: 768px) .container-fluid padding-right: 5px diff --git a/public/css/tasks.styl b/public/css/tasks.styl index f12308bd82..44d89ac5b7 100644 --- a/public/css/tasks.styl +++ b/public/css/tasks.styl @@ -491,29 +491,38 @@ form // Habits – task button styles (+ -) .habits .task-actions - display: inline-block width: 3em height: 100% + a - display: table; + display: block width: 100% height: 100% + position: relative font-size: 0.8em + span - display: table-cell - text-align: center - vertical-align: middle - width: 100% - height: 100% + position: absolute + margin: auto + display: block + height: 1em + width: 1em + top: 0 + left: 0 + bottom: 0 + right: 0 + &:hover, &:focus color: #222 text-decoration: none + .habit-wide // When there are two buttons... min-height: 4.5em .task-actions a height: 50% + .habit-narrow // When there are no buttons... .task-actions @@ -604,4 +613,4 @@ form margin: auto .shop_gold + .reward-cost line-height: 1 - top: -0.1em + top: -0.1em diff --git a/public/js/controllers/footerCtrl.js b/public/js/controllers/footerCtrl.js index e704785f86..d250e72b6e 100644 --- a/public/js/controllers/footerCtrl.js +++ b/public/js/controllers/footerCtrl.js @@ -4,7 +4,7 @@ angular.module('habitrpg').controller("FooterCtrl", ['$scope', '$rootScope', 'User', '$http', 'Notification', 'ApiUrl', function($scope, $rootScope, User, $http, Notification, ApiUrl) { - if(typeof habitrpg === "undefined"){ + if(env.isStaticPage){ $scope.languages = env.avalaibleLanguages; $scope.selectedLanguage = _.find(env.avalaibleLanguages, {code: env.language.code}); diff --git a/public/js/controllers/inventoryCtrl.js b/public/js/controllers/inventoryCtrl.js index 20b1ffbe3c..219c8618e0 100644 --- a/public/js/controllers/inventoryCtrl.js +++ b/public/js/controllers/inventoryCtrl.js @@ -97,7 +97,7 @@ habitrpg.controller("InventoryCtrl", // Checks if Triad Bingo has been reached for the first time if(!User.user.achievements.triadBingo && $rootScope.mountCount >= 90 - && Shared.countTriad(User.user.items.pets)) { + && Shared.countTriad(User.user.items.pets) >= 90) { User.user.achievements.triadBingo = true; $rootScope.openModal('achievements/triadBingo'); } @@ -159,6 +159,33 @@ habitrpg.controller("InventoryCtrl", User.user.ops.equip({params:{type: 'mount', key: egg + '-' + potion}}); } + $scope.questPopover = function(quest) { + // The popover gets parsed as markdown (hence the double \n for line breaks + var text = ''; + if(quest.boss) { + text += '**' + window.env.t('bossHP') + ':** ' + quest.boss.hp + '\n\n'; + text += '**' + window.env.t('bossStrength') + ':** ' + quest.boss.str + '\n\n'; + } else if(quest.collect) { + var count = 0; + for (var key in quest.collect) { + text += '**' + window.env.t('collect') + ':** ' + quest.collect[key].count + ' ' + quest.collect[key].text() + '\n\n'; + } + } + text += '---\n\n'; + text += '**' + window.env.t('rewards') + ':**\n\n'; + if(quest.drop.items) { + for (var item in quest.drop.items) { + text += quest.drop.items[item].text() + '\n\n'; + } + } + if(quest.drop.exp) + text += quest.drop.exp + ' ' + window.env.t('experience') + '\n\n'; + if(quest.drop.gp) + text += quest.drop.gp + ' ' + window.env.t('gold') + '\n\n'; + + return text; + } + $scope.showQuest = function(quest) { var item = Content.quests[quest]; var completedPrevious = !item.previous || (User.user.achievements.quests && User.user.achievements.quests[item.previous]); diff --git a/views/options/inventory/inventory.jade b/views/options/inventory/inventory.jade index 39bed5cc49..5fc6dc9de5 100644 --- a/views/options/inventory/inventory.jade +++ b/views/options/inventory/inventory.jade @@ -2,13 +2,13 @@ script(type='text/ng-template', id='partials/options.inventory.equipment.html') .container-fluid .row .col-md-6.border-right - h3.equipment-title.hint(popover-trigger='mouseenter', popover-placement='top', popover=env.t('battleGearText'))=env.t('battleGear') + h3.equipment-title.hint(popover-trigger='mouseenter', popover-placement='top', popover-append-to-body='true', popover=env.t('battleGearText'))=env.t('battleGear') li.customize-menu.inventory-gear menu.pets-menu(label='{{::label}}', ng-repeat='(klass,label) in {warrior:env.t("warrior"), wizard:env.t("mage"), rogue:env.t("rogue"), healer:env.t("healer"), special:env.t("special"), mystery:env.t("mystery")}', ng-show='gear[klass]') div(ng-repeat='item in gear[klass]') - button.customize-option(popover='{{::item.notes()}}', popover-title='{{::item.text()}}', popover-trigger='mouseenter', popover-placement='right', ng-click='user.ops.equip({params:{key:item.key}})', class='shop_{{::item.key}}', ng-class='{selectableInventory: user.items.gear.equipped[item.type] == item.key}') + button.customize-option(popover='{{::item.notes()}}', popover-title='{{::item.text()}}', popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='user.ops.equip({params:{key:item.key}})', class='shop_{{::item.key}}', ng-class='{selectableInventory: user.items.gear.equipped[item.type] == item.key}') .col-md-6 - h3.equipment-title.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('costumeText'))=env.t('costume') + h3.equipment-title.hint(popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', popover=env.t('costumeText'))=env.t('costume') .checkbox.equipment-title label input(type="checkbox", ng-model="user.preferences.costume", ng-change='set({"preferences.costume":user.preferences.costume ? true : false})') @@ -17,7 +17,7 @@ script(type='text/ng-template', id='partials/options.inventory.equipment.html') li.customize-menu(ng-if='user.preferences.costume') menu.pets-menu(label='{{::label}}', ng-repeat='(klass,label) in {warrior:env.t("warrior"), wizard:env.t("mage"), rogue:env.t("rogue"), healer:env.t("healer"), special:env.t("special"), mystery:env.t("mystery")}', ng-show='gear[klass]') div(ng-repeat='item in gear[klass]') - button.customize-option(popover='{{::item.notes()}}', popover-title='{{::item.text()}}', popover-trigger='mouseenter', popover-placement='right', ng-click='user.ops.equip({params:{type:"costume", key:item.key}})', class='shop_{{::item.key}}', ng-class='{selectableInventory: user.items.gear.costume[item.type] == item.key}') + button.customize-option(popover='{{::item.notes()}}', popover-title='{{::item.text()}}', popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='user.ops.equip({params:{type:"costume", key:item.key}})', class='shop_{{::item.key}}', ng-class='{selectableInventory: user.items.gear.costume[item.type] == item.key}') script(type='text/ng-template', id='partials/options.inventory.seasonalshop.html') .container-fluid @@ -30,6 +30,8 @@ script(type='text/ng-template', id='partials/options.inventory.seasonalshop.html h3.popover-title!=env.t('seasonalShopTitle', {linkStart:"", linkEnd: ""}) .popover-content p!=env.t('seasonalShopText') + br + .well(ng-if='User.user.achievements.rebirths > 0')=env.t('seasonalShopRebirth') li.customize-menu.inventory-gear menu.pets-menu(label='{{::label}}', ng-repeat='(set,label) in ::{candycane:env.t("candycaneSet"), ski:env.t("skiSet"), snowflake:env.t("snowflakeSet"), yeti:env.t("yetiSet")}') // The `if true || false` conditional for applying the transparent class is necessary because @@ -37,24 +39,24 @@ script(type='text/ng-template', id='partials/options.inventory.seasonalshop.html // they have each have a value of false. The item can be purchased for gold in the rewards column, // not the seasonal shop. This makes that more clear. div(ng-repeat='item in ::getSeasonalShopArray(set)' ng-class="{transparent: user.items.gear.owned[item.key] === true ||user.items.gear.owned[item.key] === false}") - button.customize-option(popover='{{::item.notes()}}', popover-title='{{::item.text()}}', popover-trigger='mouseenter', popover-placement='right', ng-click='purchase(item.type,item)', class='shop_{{::item.key}}') + button.customize-option(popover='{{::item.notes()}}', popover-title='{{::item.text()}}', popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='purchase(item.type,item)', class='shop_{{::item.key}}') .text-center | {{((item.specialClass == "wizard") && (item.type == "weapon")) + 1}}  span.Pet_Currency_Gem1x.inline-gems menu.pets-menu(label=env.t('quests')) div(ng-repeat='quest in ::getSeasonalShopQuests()') - button.customize-option(popover="{{::quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes() | htmlDecode}}", popover-title='{{::quest.text()}}', popover-trigger='mouseenter', popover-placement='right', ng-click='buyQuest(quest.key)', ng-class='(quest.previous && !user.achievements.quests[quest.previous]) ? "inventory_quest_scroll_locked inventory_quest_scroll_{{::quest.key}}_locked locked" : "inventory_quest_scroll inventory_quest_scroll_{{::quest.key}}"') + button.customize-option(data-popover-html="{{::quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : questPopover(quest) | markdown}}", popover-append-to-body='true', popover-title='{{::quest.text()}}', popover-trigger='mouseenter', popover-placement='right', ng-click='buyQuest(quest.key)', ng-class='(quest.previous && !user.achievements.quests[quest.previous]) ? "inventory_quest_scroll_locked inventory_quest_scroll_{{::quest.key}}_locked locked" : "inventory_quest_scroll inventory_quest_scroll_{{::quest.key}}"') p | {{::quest.value}}  span.Pet_Currency_Gem1x.inline-gems menu.pets-menu(label=env.t('seasonalItems')) div - button.customize-option(popover='{{::Content.spells.special.snowball.notes()}}', popover-title='{{::Content.spells.special.snowball.text()}}', popover-trigger='mouseenter', popover-placement='right', ng-click='purchase("special", Content.spells.special.snowball)', class='inventory_special_snowball') + button.customize-option(popover='{{::Content.spells.special.snowball.notes()}}', popover-title='{{::Content.spells.special.snowball.text()}}', popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='purchase("special", Content.spells.special.snowball)', class='inventory_special_snowball') p | {{::Content.spells.special.snowball.value}} span(class='shop_gold') // div - button.customize-option(popover='{{::Content.spells.special.nye.notes()}}', popover-title='{{::Content.spells.special.nye.text()}}', popover-trigger='mouseenter', popover-placement='right', ng-click='castStart(Content.spells.special.nye)', class='inventory_special_nye') + button.customize-option(popover='{{::Content.spells.special.nye.notes()}}', popover-title='{{::Content.spells.special.nye.text()}}', popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='castStart(Content.spells.special.nye)', class='inventory_special_nye') p | {{Content.spells.special.nye.value}} span(class='shop_gold') @@ -87,12 +89,12 @@ script(type='text/ng-template', id='partials/options.inventory.timetravelers.htm li.customize-menu.inventory-gear menu.pets-menu(label='{{::set.text}}', ng-repeat='set in Content.timeTravelerStore(user.items.gear.owned)') div(ng-repeat='item in set.items') - button.customize-option(popover='{{::item.notes()}}', popover-title='{{::item.text()}}', popover-trigger='mouseenter', popover-placement='right', ng-click='user.ops.buyMysterySet({params:{key:set.key}})', class='shop_{{::item.key}}') + button.customize-option(popover='{{::item.notes()}}', popover-title='{{::item.text()}}', popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='user.ops.buyMysterySet({params:{key:set.key}})', class='shop_{{::item.key}}') script(type='text/ng-template', id='partials/options.inventory.drops.html') .container-fluid .row - .col-md-6.border-right + .col-md-6 h2=env.t('inventory') p.well=env.t('inventoryText') menu.inventory-list(type='list') @@ -102,7 +104,7 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') p.muted(ng-show='eggCount < 1')=env.t('noEggs') div(ng-repeat='(egg,points) in ownedItems(user.items.eggs)') //TODO move positioning this styling to css - button.customize-option(popover='{{::Content.eggs[egg].notes()}}', popover-title!=env.t("egg", {eggType: "{{::Content.eggs[egg].text()}}"}), popover-trigger='mouseenter', popover-placement='right', ng-click='chooseEgg(egg)', class='Pet_Egg_{{::egg}}', ng-class='{selectableInventory: selectedPotion && !(user.items.pets[egg+"-"+selectedPotion.key]>0)}') + button.customize-option(popover='{{::Content.eggs[egg].notes()}}', popover-title!=env.t("egg", {eggType: "{{::Content.eggs[egg].text()}}"}), popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='chooseEgg(egg)', class='Pet_Egg_{{::egg}}', ng-class='{selectableInventory: selectedPotion && !(user.items.pets[egg+"-"+selectedPotion.key]>0)}') .badge.badge-info.stack-count {{points}} //-p {{Content.eggs[egg].text()}} @@ -110,7 +112,7 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') menu.hatchingPotion-menu(label=(env.t('hatchingPotions') + ' ({{potCount}})')) p.muted(ng-show='potCount < 1')=env.t('noHatchingPotions') div(ng-repeat='(pot,points) in ownedItems(user.items.hatchingPotions)') - button.customize-option(popover='{{::Content.hatchingPotions[pot].notes()}}', popover-title!=env.t("potion", {potionType: "{{::Content.hatchingPotions[pot].text()}}"}), popover-trigger='mouseenter', popover-placement='right', ng-click='choosePotion(pot)', class='Pet_HatchingPotion_{{::pot}}', ng-class='{selectableInventory: selectedEgg && !(user.items.pets[selectedEgg.key+"-"+pot]>0)}') + button.customize-option(popover='{{::Content.hatchingPotions[pot].notes()}}', popover-title!=env.t("potion", {potionType: "{{::Content.hatchingPotions[pot].text()}}"}), popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='choosePotion(pot)', class='Pet_HatchingPotion_{{::pot}}', ng-class='{selectableInventory: selectedEgg && !(user.items.pets[selectedEgg.key+"-"+pot]>0)}') .badge.badge-info.stack-count {{points}} li.customize-menu @@ -118,14 +120,14 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') p.muted(ng-show='questCount < 1')=env.t('noScrolls') p.muted!=env.t('scrollsText1') + ' ' + env.t('scrollsText2') + '' div(ng-repeat='(quest_key,points) in ownedItems(user.items.quests)', ng-init='quest = Content.quests[quest_key]') - button.customize-option(popover="{{:: quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes() | htmlDecode}}", popover-title='{{::quest.text()}}', popover-trigger='mouseenter', popover-placement='right', ng-click='showQuest(quest_key)', ng-class='(quest.previous && !user.achievements.quests[quest.previous]) ? "inventory_quest_scroll_locked inventory_quest_scroll_{{::quest.key}}_locked locked" : "inventory_quest_scroll inventory_quest_scroll_{{::quest.key}}"') + button.customize-option(data-popover-html="{{:: quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : questPopover(quest) | markdown}}", popover-title='{{::quest.text()}}', popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='showQuest(quest_key)', ng-class='(quest.previous && !user.achievements.quests[quest.previous]) ? "inventory_quest_scroll_locked inventory_quest_scroll_{{::quest.key}}_locked locked" : "inventory_quest_scroll inventory_quest_scroll_{{::quest.key}}"') .badge.badge-info.stack-count {{points}} li.customize-menu menu.pets-menu(label=env.t('food') + ' ({{foodCount}})') p.muted(ng-show='foodCount < 1')=env.t('noFood') div(ng-repeat='(food,points) in ownedItems(user.items.food)') - button.customize-option(popover='{{::Content.food[food].notes()}}', popover-title='{{::Content.food[food].text()}}', popover-trigger='mouseenter', popover-placement='right', ng-click='chooseFood(food)', class='Pet_Food_{{::food}}') + button.customize-option(popover='{{::Content.food[food].notes()}}', popover-title='{{::Content.food[food].text()}}', popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='chooseFood(food)', class='Pet_Food_{{::food}}') .badge.badge-info.stack-count {{points}} @@ -133,28 +135,28 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') menu.pets-menu(label=env.t('special')) mixin specialItem(k) div(ng-if='user.items.special.#{k}') - button.customize-option(popover='{{::Content.special.#{k}.notes()}}', popover-title='{{::Content.special.#{k}.text()}}', popover-trigger='mouseenter', popover-placement='right', ng-click='castStart(Content.special.#{k})', class='inventory_special_#{k}') + button.customize-option(popover='{{::Content.special.#{k}.notes()}}', popover-title='{{::Content.special.#{k}.text()}}', popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='castStart(Content.special.#{k})', class='inventory_special_#{k}') .badge.badge-info.stack-count {{user.items.special.#{k}}} +specialItem('snowball') +specialItem('spookDust') div(ng-if='user.items.special.valentineReceived[0]') - button.customize-option(popover="Valentine's Day Card from {{User.user.items.special.valentineReceived[0]}}", popover-trigger='mouseenter', popover-placement='right', ng-click='openModal("valentine")', class='inventory_special_valentine') + button.customize-option(popover="Valentine's Day Card from {{User.user.items.special.valentineReceived[0]}}", popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='openModal("valentine")', class='inventory_special_valentine') .badge.badge-info.stack-count {{user.items.special.valentineReceived.length}} div(ng-if='user.purchased.plan.customerId || user.purchased.plan.mysteryItems.length') - button.customize-option(popover=env.t('subscriberItemText'), popover-trigger='mouseenter', popover-placement='right', class='inventory_present', ng-click="user.ops.openMysteryItem({})") + button.customize-option(popover=env.t('subscriberItemText'), popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', class='inventory_present', ng-click="user.ops.openMysteryItem({})") .badge.badge-info.stack-count {{user.purchased.plan.mysteryItems.length}} div(ng-if='user.purchased.plan.consecutive.trinkets') - button.customize-option(popover=env.t('mysticHourglassPopover'), popover-trigger='mouseenter', popover-placement='right', class='inventory_special_trinket', ng-click="$state.go('options.inventory.timetravelers')") + button.customize-option(popover=env.t('mysticHourglassPopover'), popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', class='inventory_special_trinket', ng-click="$state.go('options.inventory.timetravelers')") .badge.badge-info.stack-count {{user.purchased.plan.consecutive.trinkets}} div(ng-if='user.items.special.nyeReceived[0]') - button.customize-option(popover="New Year's Card from {{User.user.items.special.nyeReceived[0]}}", popover-trigger='mouseenter', popover-placement='right', ng-click='openModal("nye")', class='inventory_special_nye') + button.customize-option(popover="New Year's Card from {{User.user.items.special.nyeReceived[0]}}", popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', ng-click='openModal("nye")', class='inventory_special_nye') .badge.badge-info.stack-count {{user.items.special.nyeReceived.length}} - .col-md-6 + .col-md-6.border-left h2=env.t('market') .row-fluid table.npc_alex_container @@ -176,19 +178,19 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') li.customize-menu menu.pets-menu(label=env.t('eggs')) div(ng-repeat='egg in Content.eggs', ng-if='egg.canBuy') - button.customize-option(popover='{{::egg.notes()}}', popover-title!=env.t("egg", {eggType: "{{::egg.text()}}"}), popover-trigger='mouseenter', popover-placement='top', ng-click='purchase("eggs", egg)', class='Pet_Egg_{{::egg.key}}') + button.customize-option(popover='{{::egg.notes()}}', popover-title!=env.t("egg", {eggType: "{{::egg.text()}}"}), popover-trigger='mouseenter', popover-placement='top', popover-append-to-body='true', ng-click='purchase("eggs", egg)', class='Pet_Egg_{{::egg.key}}') p | {{::egg.value}}  span.Pet_Currency_Gem1x.inline-gems //- buyable quest eggs each egg,quest in {gryphon:'Gryphon',hedgehog:'Hedgehog',ghost_stag:'Deer',rat:'Rat',octopus:'Octopus',dilatory_derby:'Seahorse',harpy:'Parrot',rooster:'Rooster',spider:'Spider',owl:'Owl',penguin:'Penguin'} div(ng-show='user.achievements.quests.#{quest} > 1') - button.customize-option(popover='{{::Content.eggs.#{egg}.notes()}}', popover-title!=env.t("egg", {eggType: "{{::Content.eggs.#{egg}.text()}}"}), popover-trigger='mouseenter', popover-placement='top', ng-click='purchase("eggs", Content.eggs.#{egg})', class='Pet_Egg_#{egg}') + button.customize-option(popover='{{::Content.eggs.#{egg}.notes()}}', popover-title!=env.t("egg", {eggType: "{{::Content.eggs.#{egg}.text()}}"}), popover-trigger='mouseenter', popover-placement='top', popover-append-to-body='true', ng-click='purchase("eggs", Content.eggs.#{egg})', class='Pet_Egg_#{egg}') p | {{::Content.eggs.#{egg}.value}}  span.Pet_Currency_Gem1x.inline-gems div(ng-show='(user.achievements.quests.trex + user.achievements.quests.trex_undead) > 1') - button.customize-option(popover='{{::Content.eggs.TRex.notes()}}', popover-title!=env.t("egg", {eggType: "{{Content.eggs.TRex.text()}}"}), popover-trigger='mouseenter', popover-placement='top', ng-click='purchase("eggs", Content.eggs.TRex)', class='Pet_Egg_TRex') + button.customize-option(popover='{{::Content.eggs.TRex.notes()}}', popover-title!=env.t("egg", {eggType: "{{Content.eggs.TRex.text()}}"}), popover-trigger='mouseenter', popover-placement='top', popover-append-to-body='true', ng-click='purchase("eggs", Content.eggs.TRex)', class='Pet_Egg_TRex') p | {{::Content.eggs.TRex.value}}  span.Pet_Currency_Gem1x.inline-gems @@ -196,7 +198,7 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') li.customize-menu menu.pets-menu(label=env.t('hatchingPotions')) div(ng-repeat='pot in Content.hatchingPotions') - button.customize-option(popover='{{::pot.notes()}}', popover-title!=env.t("potion", {potionType: "{{::pot.text()}}"}), popover-trigger='mouseenter', popover-placement='top', ng-click='purchase("hatchingPotions", pot)', class='Pet_HatchingPotion_{{::pot.key}}') + button.customize-option(popover='{{::pot.notes()}}', popover-title!=env.t("potion", {potionType: "{{::pot.text()}}"}), popover-trigger='mouseenter', popover-placement='top', popover-append-to-body='true', ng-click='purchase("hatchingPotions", pot)', class='Pet_HatchingPotion_{{::pot.key}}') p | {{::pot.value}}  span.Pet_Currency_Gem1x.inline-gems @@ -204,7 +206,7 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') li.customize-menu menu.pets-menu(label=env.t('food')) div(ng-repeat='food in Content.food', ng-if='food.canBuy') - button.customize-option(popover='{{::food.notes()}}', popover-title='{{::food.text()}}', popover-trigger='mouseenter', popover-placement='top', ng-click='purchase("food", food)', class='Pet_Food_{{::food.key}}') + button.customize-option(popover='{{::food.notes()}}', popover-title='{{::food.text()}}', popover-trigger='mouseenter', popover-placement='top', popover-append-to-body='true', ng-click='purchase("food", food)', class='Pet_Food_{{::food.key}}') p | {{::food.value}}  span.Pet_Currency_Gem1x.inline-gems @@ -213,7 +215,7 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') menu.pets-menu(label=env.t('quests')) p.muted!=env.t('scrollsText1') + ' ' + env.t('scrollsText2') + '' div(ng-repeat='quest in Content.quests', ng-if='quest.canBuy') - button.customize-option(popover="{{::quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes() | htmlDecode}}", popover-title='{{::quest.text()}}', popover-trigger='mouseenter', popover-placement='top', ng-click='buyQuest(quest.key)', ng-class='(quest.previous && !user.achievements.quests[quest.previous]) ? "inventory_quest_scroll_locked inventory_quest_scroll_{{::quest.key}}_locked locked" : "inventory_quest_scroll inventory_quest_scroll_{{::quest.key}}"') + button.customize-option(data-popover-html="{{::quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : questPopover(quest) | markdown}}", popover-title='{{::quest.text()}}', popover-append-to-body="true", popover-trigger='mouseenter', ng-click='buyQuest(quest.key)', ng-class='(quest.previous && !user.achievements.quests[quest.previous]) ? "inventory_quest_scroll_locked inventory_quest_scroll_{{::quest.key}}_locked locked" : "inventory_quest_scroll inventory_quest_scroll_{{::quest.key}}"') p | {{::quest.value}}  span.Pet_Currency_Gem1x.inline-gems @@ -221,22 +223,22 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') li.customize-menu menu.pets-menu(label=env.t('special')) div - button.customize-option(popover=env.t('fortifyPop'), popover-title=env.t('fortifyName'), popover-trigger='mouseenter', popover-placement='top', ng-click='openModal("reroll")', class='inventory_special_fortify') + button.customize-option(popover=env.t('fortifyPop'), popover-title=env.t('fortifyName'), popover-trigger='mouseenter', popover-placement='top', popover-append-to-body='true', ng-click='openModal("reroll")', class='inventory_special_fortify') p | 4  span.Pet_Currency_Gem1x.inline-gems div(ng-show='user.flags.rebirthEnabled') - button.customize-option(popover=env.t('rebirthPop'), popover-title=env.t('rebirthName'), popover-trigger='mouseenter', popover-placement='top', ng-click='openModal("rebirth")', class='rebirth_orb') + button.customize-option(popover=env.t('rebirthPop'), popover-title=env.t('rebirthName'), popover-trigger='mouseenter', popover-placement='top', popover-append-to-body='true', ng-click='openModal("rebirth")', class='rebirth_orb') p(ng-show='user.stats.lvl < 100') | 8  span.Pet_Currency_Gem1x.inline-gems div(ng-show='petCount >= 90 || mountCount >= 90') - button.customize-option(popover=env.t('petKeyPop'), popover-title=env.t('petKeyName'), popover-trigger='mouseenter', popover-placement='top', ng-click='openModal("pet-key", {size:"lg"})', class='pet_key') + button.customize-option(popover=env.t('petKeyPop'), popover-title=env.t('petKeyName'), popover-trigger='mouseenter', popover-placement='top', popover-append-to-body='true', ng-click='openModal("pet-key", {size:"lg"})', class='pet_key') p | 4  span.Pet_Currency_Gem1x.inline-gems div(ng-if='user.purchased.plan.customerId', ng-class='::{transparent:(Shared.planGemLimits.convCap + User.user.purchased.plan.consecutive.gemCapExtra - User.user.purchased.plan.gemsBought) < 1}') - button.customize-option(popover=env.t('subGemPop'), popover-title=env.t('subGemName'), popover-trigger='mouseenter', popover-placement='top',ng-click='user.ops.purchase({params:{type:"gems",key:"gem"}})') + button.customize-option(popover=env.t('subGemPop'), popover-title=env.t('subGemName'), popover-trigger='mouseenter', popover-placement='top', popover-append-to-body='true', ng-click='user.ops.purchase({params:{type:"gems",key:"gem"}})') span.Pet_Currency_Gem.inline-gems .badge.badge-success.stack-count {{Shared.planGemLimits.convCap + User.user.purchased.plan.consecutive.gemCapExtra - User.user.purchased.plan.gemsBought}} p diff --git a/views/shared/modals/quests.jade b/views/shared/modals/quests.jade index 6ccf0dd06f..d0ec6ae203 100644 --- a/views/shared/modals/quests.jade +++ b/views/shared/modals/quests.jade @@ -5,7 +5,7 @@ script(type='text/ng-template', id='modals/questCompleted.html') h4 "{{::Content.quests[user.party.quest.completed].text()}}" =env.t('completed') .modal-body - div(ng-class='::Content.quests[user.party.quest.completed].completion() ? "pull-right-sm" : ""', class='col-centered quest_{{user.party.quest.completed}}') + .col-centered(ng-class='::Content.quests[user.party.quest.completed].completion() ? "pull-right-sm" : ""', class='quest_{{user.party.quest.completed}}') p(ng-bind-html='::Content.quests[user.party.quest.completed].completion()') quest-rewards(key='{{user.party.quest.completed}}', header=env.t('youReceived')) .modal-footer @@ -13,11 +13,25 @@ script(type='text/ng-template', id='modals/questCompleted.html') script(type='text/ng-template', id='modals/showQuest.html') .modal-header - h4 {{selectedQuest.text()}} + h4 {{::selectedQuest.text()}} .modal-body - .pull-right(class='quest_{{selectedQuest.key}}') - div(ng-bind-html='selectedQuest.notes()') - quest-rewards(key='{{selectedQuest.key}}') + .pull-right-sm.text-center + .col-centered(class='quest_{{::selectedQuest.key}}') + div(ng-if='::selectedQuest.boss') + h4 {{::selectedQuest.boss.name()}} + p + strong=env.t('bossHP') + ': ' + | {{::selectedQuest.boss.hp}} + p + strong=env.t('bossStrength') + ': ' + | {{::selectedQuest.boss.str}} + div(ng-if='::selectedQuest.collect') + p(ng-repeat='(k,v) in ::selectedQuest.collect') + strong=env.t('collect') + ': ' + | {{::selectedQuest.collect[k].count}} {{::selectedQuest.collect[k].text()}} + + div(ng-bind-html='::selectedQuest.notes()') + quest-rewards(key='{{::selectedQuest.key}}') hr .npc_ian.pull-left p=env.t('questSend') @@ -28,11 +42,24 @@ script(type='text/ng-template', id='modals/showQuest.html') script(type='text/ng-template', id='modals/buyQuest.html') .modal-header - h4 {{selectedQuest.text()}} + h4 {{::selectedQuest.text()}} .modal-body - .pull-right(class='quest_{{selectedQuest.key}}') - div(ng-bind-html='selectedQuest.notes()') - quest-rewards(key='{{selectedQuest.key}}') + .pull-right-sm.text-center + .col-centered(class='quest_{{::selectedQuest.key}}') + div(ng-if='::selectedQuest.boss') + h4 {{::selectedQuest.boss.name()}} + p + strong=env.t('bossHP') + ': ' + | {{::selectedQuest.boss.hp}} + p + strong=env.t('bossStrength') + ': ' + | {{::selectedQuest.boss.str}} + div(ng-if='::selectedQuest.collect') + p(ng-repeat='(k,v) in ::selectedQuest.collect') + strong=env.t('collect') + ': ' + | {{::selectedQuest.collect[k].count}} {{::selectedQuest.collect[k].text()}} + div(ng-bind-html='::selectedQuest.notes()') + quest-rewards(key='{{::selectedQuest.key}}') .modal-footer button.btn.btn-default(ng-click='closeQuest(); $close()')=env.t('neverMind') button.btn.btn-primary(ng-click='purchase("quests", quest); closeQuest(); $close()')=env.t('buyQuest') @@ -40,10 +67,24 @@ script(type='text/ng-template', id='modals/buyQuest.html') script(type='text/ng-template', id='modals/questInvitation.html') .modal-header h4=env.t('questInvitation') - | {{Content.quests[party.quest.key].text()}} + | {{::Content.quests[party.quest.key].text()}} .modal-body - div(ng-bind-html='Content.quests[party.quest.key].notes()') - quest-rewards(key='{{party.quest.key}}') + .pull-right-sm.text-center + .col-centered(class='quest_{{::Content.quests[party.quest.key].key}}') + div(ng-if='::Content.quests[party.quest.key].boss') + h4 {{::Content.quests[party.quest.key].boss.name()}} + p + strong=env.t('bossHP') + ': ' + | {{::Content.quests[party.quest.key].boss.hp}} + p + strong=env.t('bossStrength') + ': ' + | {{::Content.quests[party.quest.key].boss.str}} + div(ng-if='::Content.quests[party.quest.key].collect') + p(ng-repeat='(k,v) in ::Content.quests[party.quest.key].collect') + strong=env.t('collect') + ': ' + | {{::Content.quests[party.quest.key].collect[k].count}} {{::Content.quests[party.quest.key].collect[k].text()}} + div(ng-bind-html='::Content.quests[party.quest.key].notes()') + quest-rewards(key='{{::party.quest.key}}') .modal-footer button.btn.btn-default(ng-click='questHold = true; $close()')=env.t('askLater') button.btn.btn-default(ng-click='party.$questReject(); $close()')=env.t('reject') diff --git a/views/shared/tasks/task.jade b/views/shared/tasks/task.jade index 988402a6be..b50c04460c 100644 --- a/views/shared/tasks/task.jade +++ b/views/shared/tasks/task.jade @@ -1,4 +1,4 @@ -li(bindonce='list', bo-id='"task-"+task.id', ng-repeat='task in obj[list.type+"s"]', class='task {{Shared.taskClasses(task, user.filters, user.preferences.dayStart, user.lastCron, list.showCompleted, main)}}', ng-click='spell && (list.type != "reward") && castEnd(task, "task", $event)', ng-class='{"cast-target":spell && (list.type != "reward")}', popover-trigger='mouseenter', data-popover-html="{{task.notes | markdown}}", data-popover-placement="top", ng-show='shouldShow(task, list, user.preferences)') +li(bindonce='list', bo-id='"task-"+task.id', ng-repeat='task in obj[list.type+"s"]', class='task {{Shared.taskClasses(task, user.filters, user.preferences.dayStart, user.lastCron, list.showCompleted, main)}}', ng-click='spell && (list.type != "reward") && castEnd(task, "task", $event)', ng-class='{"cast-target":spell && (list.type != "reward")}', popover-trigger='mouseenter', data-popover-html="{{task.notes | markdown}}", popover-placement="top", popover-append-to-body='true', ng-show='shouldShow(task, list, user.preferences)') // right-hand side control buttons .task-meta-controls diff --git a/views/static/layout.jade b/views/static/layout.jade index 8744b06518..ae82efa1c8 100644 --- a/views/static/layout.jade +++ b/views/static/layout.jade @@ -15,6 +15,9 @@ html(ng-app='habitrpg') meta(charset='utf-8') meta(name='viewport', content='width=device-width, initial-scale=1.0') + + //FIXME for some reason this won't load when in footerCtrl.js#deferredScripts() + script(type="text/javascript", src="//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-5016f6cc44ad68a4", async="async") != env.getManifestFiles("static")