Merge branch 'develop' into classes

Conflicts:
	public/css/index.styl
	src/models/user.js
	views/options/profile.jade
	views/shared/header/avatar.jade
	views/shared/tasks/lists.jade
	views/shared/tasks/task.jade
This commit is contained in:
Tyler Renelle
2013-12-01 19:51:36 -07:00
81 changed files with 1369 additions and 397 deletions

14
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,14 @@
# Reporting Bugs
1. Go to the [issue queue](https://github.com/lefnire/habitrpg/issues?state=open), and
1. check first that a ticket doesn't already exist, using the [search bar](https://www.evernote.com/shard/s17/sh/4a159680-a709-4949-9805-d849bc124c1d/6276f24fb1dce8985eec7d5b021edd9c).
1. If one hasn't been submitted, [create a new ticket](https://github.com/lefnire/habitrpg/issues/new). If at all possible, please include your browser, [user ID](http://habitrpg.wikia.com/wiki/API#UserID) and **most importantly** any JavaScript errors that may be being thrown (see [Chrome Console instructions](https://developers.google.com/chrome-developer-tools/docs/console#opening_the_console) for how to do that).
# Requesting a feature
HabitRPG uses [Trello](https://trello.com/b/EpoYEYod/habitrpg) to track feature requests. [Read more](https://trello.com/c/8gzGlle8/142-how-to-submit-a-new-request).
# Contributing Code
* See [Contributing to HabitRPG](http://habitrpg.wikia.com/wiki/Contributing_to_HabitRPG)
* See [Tips](http://habitrpg.wikia.com/wiki/Tips)

View File

@@ -99,6 +99,7 @@ module.exports = function(grunt) {
}); });
}); });
grunt.config.set('uglify.build.files', uglify); grunt.config.set('uglify.build.files', uglify);
grunt.config.set('uglify.build.options', {compress: false})
grunt.config.set('cssmin.build.files', cssmin); grunt.config.set('cssmin.build.files', cssmin);
}); });

View File

@@ -17,14 +17,15 @@
"jquery": "~2.0.3", "jquery": "~2.0.3",
"jquery.cookie": "~1.4.0", "jquery.cookie": "~1.4.0",
"jquery-ui": "~1.10.3", "jquery-ui": "~1.10.3",
"angular": "1.2.0-rc.3", "angular": "~1.2.1",
"angular-sanitize": "1.2.0-rc.3", "angular-sanitize": "~1.2.1",
"angular-resource": "1.2.0-rc.3", "angular-resource": "~1.2.1",
"angular-ui": "~0.4.0", "angular-ui": "~0.4.0",
"angular-ui-utils": "~0.0.4", "angular-ui-utils": "~0.0.4",
"angular-bootstrap": "~0.5.0", "angular-bootstrap": "~0.5.0",
"angular-ui-router": "ca3b4777a603df8f86cfd653c8f6c38b2ae05d89", "angular-ui-router": "ca3b4777a603df8f86cfd653c8f6c38b2ae05d89",
"angular-loading-bar": "~0.0.5", "angular-loading-bar": "~0.0.5",
"angular-bindonce": "~0.2.1",
"bootstrap": "v2.3.2", "bootstrap": "v2.3.2",
"bootstrap-datepicker": "~1.2.0", "bootstrap-datepicker": "~1.2.0",
"bootstrap-tour": "0.5.0", "bootstrap-tour": "0.5.0",
@@ -34,14 +35,16 @@
"github-buttons": "git://github.com/mdo/github-buttons.git", "github-buttons": "git://github.com/mdo/github-buttons.git",
"marked": "~0.2.9", "marked": "~0.2.9",
"JavaScriptButtons": "git://github.com/paypal/JavaScriptButtons.git#master", "JavaScriptButtons": "git://github.com/paypal/JavaScriptButtons.git#master",
"Angular-At-Directive": "git://github.com/snicker/Angular-At-Directive#master" "Angular-At-Directive": "git://github.com/snicker/Angular-At-Directive#master",
"js-emoji": "git://github.com/snicker/js-emoji#master",
"gemoji": "git://github.com/github/gemoji"
}, },
"resolutions": { "resolutions": {
"jquery": "~2.0.3", "jquery": "~2.0.3",
"bootstrap": "v2.3.2", "bootstrap": "v2.3.2",
"angular": "1.2.0-rc.3" "angular": "~1.2.1"
}, },
"devDependencies": { "devDependencies": {
"angular-mocks": "1.2.0-rc.3" "angular-mocks": "~1.2.1"
} }
} }

View File

@@ -16,6 +16,7 @@ module.exports = function(config) {
'public/bower_components/angular-resource/angular-resource.min.js', 'public/bower_components/angular-resource/angular-resource.min.js',
'public/bower_components/angular-mocks/angular-mocks.js', 'public/bower_components/angular-mocks/angular-mocks.js',
'public/bower_components/marked/lib/marked.js', 'public/bower_components/marked/lib/marked.js',
'public/bower_components/js-emoji/emoji.js',
'public/bower_components/habitrpg-shared/dist/habitrpg-shared.js', 'public/bower_components/habitrpg-shared/dist/habitrpg-shared.js',
'public/js/*.js', 'public/js/*.js',
'public/js/**/*.js', 'public/js/**/*.js',

View File

@@ -130,6 +130,10 @@
"hair": "Hair", "hair": "Hair",
"skin": "Skin", "skin": "Skin",
"clothing" : "Clothing", "clothing" : "Clothing",
"showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "Photo Url", "photoUrl": "Photo Url",
"fullName": "Full Name", "fullName": "Full Name",
"blurb": "Blurb", "blurb": "Blurb",

View File

@@ -131,6 +131,10 @@
"hair": "Hair", "hair": "Hair",
"skin": "Skin", "skin": "Skin",
"clothing" : "Clothing", "clothing" : "Clothing",
"showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "Photo Url", "photoUrl": "Photo Url",
"fullName": "Full Name", "fullName": "Full Name",
"blurb": "Blurb", "blurb": "Blurb",

View File

@@ -132,6 +132,10 @@
"hair": "Hair", "hair": "Hair",
"skin": "Skin", "skin": "Skin",
"clothing" : "Clothing", "clothing" : "Clothing",
"showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "Photo Url", "photoUrl": "Photo Url",
"fullName": "Full Name", "fullName": "Full Name",
"blurb": "Blurb", "blurb": "Blurb",

View File

@@ -131,6 +131,10 @@
"hair": "Haare", "hair": "Haare",
"skin": "Haut", "skin": "Haut",
"clothing" : "Kleidung", "clothing" : "Kleidung",
"showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "Bild-Url", "photoUrl": "Bild-Url",
"fullName": "Name", "fullName": "Name",
"blurb": "über dich", "blurb": "über dich",

View File

@@ -135,6 +135,10 @@
"hair": "Μαλλιά", "hair": "Μαλλιά",
"skin": "Δέρμα", "skin": "Δέρμα",
"clothing" : "Ρούχα", "clothing" : "Ρούχα",
"showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "Url Φωτογραφίας", "photoUrl": "Url Φωτογραφίας",
"fullName": "Πλήρες Όνομα", "fullName": "Πλήρες Όνομα",
"blurb": "Κείμενο", "blurb": "Κείμενο",

View File

@@ -47,7 +47,7 @@
"reward1" : "1 Episode of Game of Thrones", "reward1" : "1 Episode of Game of Thrones",
"reward1comment": "-- Rewards: Treat Yourself! -- As you complete goals, you earn gold to buy rewards. Buy them liberally - rewards are integral in forming good habits.", "reward1comment": "-- Rewards: Treat Yourself! -- As you complete goals, you earn gold to buy rewards. Buy them liberally - rewards are integral in forming good habits.",
"reward2" : "Cake", "reward2" : "Cake",
"reward2comment" : "But only buy if you have enough gold - you lose HP otherwise.", "reward2comment" : "But only buy if you have enough gold!",
"_commentdefaulttags" : "DEFAULT TAGS", "_commentdefaulttags" : "DEFAULT TAGS",
"morning" : "morning", "morning" : "morning",
@@ -104,7 +104,7 @@
"S": "S", "S": "S",
"todos": "To-Dos", "todos": "To-Dos",
"Todos": "To-Dos", "Todos": "To-Dos",
"newTodo": "New Todo", "newTodo": "New To-Do",
"dueDate": "Due Date", "dueDate": "Due Date",
"remaining": "Remaining", "remaining": "Remaining",
"complete": "Complete", "complete": "Complete",
@@ -124,7 +124,7 @@
"dropsEnabled" : "Drops Enabled!", "dropsEnabled" : "Drops Enabled!",
"dropsEnabledText1" : "You've unlocked the Drop System! Now when you complete tasks, you have a small chance of finding an item. And guess what, you just found a", "dropsEnabledText1" : "You've unlocked the Drop System! Now when you complete tasks, you have a small chance of finding an item. And guess what, you just found a",
"dropsEnabledText2" : "egg", "dropsEnabledText2" : "egg",
"itemDropped" : "An items has dropped", "itemDropped" : "An item has dropped",
@@ -137,6 +137,10 @@
"hair": "Hair", "hair": "Hair",
"skin": "Skin", "skin": "Skin",
"clothing" : "Clothing", "clothing" : "Clothing",
"showWeapon": "Show Weapon",
"other" : "Other",
"showShield": "Show Shield",
"showArmor": "Show Armor",
"photoUrl": "Photo Url", "photoUrl": "Photo Url",
"fullName": "Full Name", "fullName": "Full Name",
"blurb": "Blurb", "blurb": "Blurb",
@@ -353,7 +357,7 @@
"_commentdeathstuff" : "DEATH", "_commentdeathstuff" : "DEATH",
"deathTitle" : "You Died!", "deathTitle" : "You Died!",
"deathText" : "You've lost your GP, 1 level and 1 gear piece. Be sure to complete your dailies to prevent this from happening again!", "deathText" : "You've lost your Gold, 1 Level, and 1 piece of Equipment. Be sure to complete your Dailies to prevent this from happening again!",
"_commentgems" : "GEMS", "_commentgems" : "GEMS",
"gems" : "Gems", "gems" : "Gems",
@@ -375,7 +379,7 @@
"legalTerms" : "Terms", "legalTerms" : "Terms",
"footerCommunity" : "Community", "footerCommunity" : "Community",
"communityBugs" : "Submit Bugs", "communityBugs" : "Submit Bugs",
"communityFeatures" : "Request Feautres", "communityFeatures" : "Request Features",
"communityExtensions" : "Add-ons / Extensions", "communityExtensions" : "Add-ons / Extensions",
"communityForum" : "Community Forum", "communityForum" : "Community Forum",
"footerSocial" : "Social", "footerSocial" : "Social",

View File

@@ -3,49 +3,49 @@
"_commentfrontpage":"HABITRPG PORTADA", "_commentfrontpage":"HABITRPG PORTADA",
"synopsis" : "Un programa para construir hábitos que convierte tu vida en un Juego de Rol. Aumenta de nivel a medida que triunfas, pierde HP al fracasar, gana dinero para comprar armas y armaduras.", "synopsis" : "Un programa para construir hábitos que convierte tu vida en un juego de rol. Aumenta de nivel a medida que triunfas, pierde HP al fracasar, gana dinero para comprar armas y armaduras.",
"playButton" : "Jugar", "playButton" : "Jugar",
"_commenttut": "TUTORIAL/VISITA", "_commenttut": "TUTORIAL/VISITA",
"endTourButton": "Finalizar visita", "endTourButton": "Finalizar tour",
"nextButton" : "Siguiente", "nextButton" : "Siguiente",
"prevButton" : "Volver", "prevButton" : "Volver",
"tour1Title" : "Bienvenido a HabitRPG", "tour1Title" : "Bienvenido a HabitRPG",
"tour1Text" : "Bienvenido a HabitRPG, un seguidor de hábitos que convierte tus objetivos en un Juego de Rol.", "tour1Text" : "Bienvenido a HabitRPG, un seguidor de hábitos que convierte tus objetivos en un juego de rol.",
"tour2Title" : "Hábitos", "tour2Title" : "Hábitos",
"tour2Text" : "Los hábitos son objetivos buenos o malos de los que estás pendiente constantemente.", "tour2Text" : "Los hábitos son objetivos buenos o malos de los que estás pendiente constantemente.",
"tour3Title" : "Diarios", "tour3Title" : "Diarios",
"tour3Text" : "Los diarios son objetivos que quieres completar una vez al día.", "tour3Text" : "Los diarios son objetivos que quieres completar una vez al día.",
"tour4Title" : "Quehaceres", "tour4Title" : "Quehaceres",
"tour4Text" : "Los quehaceres son objetivos únicos que deben ser completados en algún momento.", "tour4Text" : "Los quehaceres son objetivos únicos que deben ser completados en algún momento.",
"tour5Title" : "Premios", "tour5Title" : "Recompensas",
"tour5Text" : "Al completar objetivos, ganas dinero para comprar premios. Cómpralos generosamente - las recompensas son fundamentales para formar buenos hábitos. ", "tour5Text" : "Al completar objetivos, ganas dinero para comprar recompensas. Cómpralas generosamente - las recompensas son fundamentales para formar buenos hábitos. ",
"tour6Title" : "Sitúa el cursor sobre los comentarios", "tour6Title" : "Sitúa el cursor sobre los comentarios",
"tour6Text" : "Diferentes tipos de tareas tienen propiedades especiales. Mueve el cursor sobre el comentario de cada tarea para más información. Cuando estés listo para empezar, borra las tareas existentes y agrega las tuyas.", "tour6Text" : "Diferentes tipos de tareas tienen propiedades especiales. Mueve el cursor sobre el comentario de cada tarea para más información. Cuando estés listo para empezar, borra las tareas existentes y agrega las tuyas.",
"_commentdefaulttasks":"TAREAS POR DEFECTO", "_commentdefaulttasks":"TAREAS POR DEFECTO",
"habit1" : "1h de Trabajo Productivo", "habit1" : "1h de trabajo productivo",
"habit1comment": "-- Hábitos: Sigue Constantemente -- Para algunos Hábitos, sólo tiene sentido *ganar* puntos (como éste)", "habit1comment": "-- Hábitos: Sigue Constantemente -- Para algunos hábitos, sólo tiene sentido *ganar* puntos (como éste)",
"habit2" : "Comer Comida Basura", "habit2" : "Comer comida basura",
"habit2comment" : "Para otros, sólo tiene sentido *perder* puntos", "habit2comment" : "Para otros, sólo tiene sentido *perder* puntos",
"habit3" : "Usar las Escaleras", "habit3" : "Usar las escaleras",
"habit3comment" : "Para el resto, tanto + como - tiene sentido (escaleras = ganar, elevador = perder)", "habit3comment" : "Para el resto, tanto + como - tiene sentido (escaleras = ganar, elevador = perder)",
"daily1" : "1h de Proyecto Personal", "daily1" : "1h de proyecto personal",
"daily1comment" : "-- Diarios: Completa Una Vez al Día -- Al final de cada día, los Diarios no cumplidos te descuentan puntos.", "daily1comment" : "-- Diarios: Completa Una Vez al Día -- Al final de cada día, los diarios sin completar te descuentan puntos.",
"daily2" : "Hacer Ejercicio", "daily2" : "Hacer Ejercicio",
"daily2comment" : "Si te está yendo bien, se vuelven verdes y son menos valiosos (experiencia, oro) y menos dañinos (PV). Esto significa que puedes darte un descanso de ellos por un rato.", "daily2comment" : "Si te está yendo bien, se vuelven verdes y son menos valiosos (experiencia, oro) y menos dañinos (HP). Esto significa que puedes darte un descanso de ellos por un rato.",
"daily3" : "45m de Lectura", "daily3" : "45m de lectura",
"daily3comment" : "Pero si te está yendo mal, se vuelven rojos. Peor te va, más valiosos (experiencia, oro) y más dañinos (PV) se vuelven estos objetivos. Esto te alienta a enfocarte en tus fallas, los rojos.", "daily3comment" : "Pero si te está yendo mal, se vuelven rojos. Peor te va, más valiosos (experiencia, oro) y más dañinos (HP) se vuelven estos objetivos. Esto te alienta a enfocarte en tus fallas, los rojos.",
"todo1" : "Llamar a Mamá", "todo1" : "Llamar a mamá",
"todo1comment" : "-- Quehaceres: Completa en Algún Momento -- Los Quehaceres no cumplidos no te harán daño, pero se volverán más valiosos con el tiempo. Esto te alentará a completar los Quehaceres obsoletos.", "todo1comment" : "-- Quehaceres: Completa en Algún Momento -- Los quehaceres sin completar no te harán daño, pero se volverán más valiosos con el tiempo. Esto te alentará a completar los quehaceres obsoletos.",
"reward1" : "1 Episodio de Game of Thrones", "reward1" : "1 Episodio de Juego de Tronos",
"reward1comment": "-- Premios: Hazte Un Obsequio! -- Al completar objetivos, ganas dinero para comprar premios. Cómpralos generosamente - las recompensas son fundamentales para formar buenos hábitos.", "reward1comment": "-- Recompensas: Hazte Un Obsequio! -- Al completar objetivos, ganas dinero para comprar recompensas. Cómpralas generosamente - las recompensas son fundamentales para formar buenos hábitos.",
"reward2" : "Torta", "reward2" : "Torta",
"reward2comment" : "Pero sólo compra si tienes suficiente oro - de lo contrario perderás PV.", "reward2comment" : "Pero sólo compra si tienes suficiente oro - de lo contrario perderás HP.",
"_commentdefaulttags" : "ETIQUETA DE DEFECTO", "_commentdefaulttags" : "ETIQUETA DE DEFECTO",
"morning" : "mañana", "morning" : "mañana",
@@ -53,7 +53,7 @@
"evening" : "noche", "evening" : "noche",
"_commenthead": "ENCABEZAMIENTO", "_commenthead": "ENCABEZAMIENTO",
"health": "Vida", "health": "Salud",
"experience": "Experiencia", "experience": "Experiencia",
"history": "Historial", "history": "Historial",
"anonymous": "Anónimo", "anonymous": "Anónimo",
@@ -81,7 +81,7 @@
"advancedOptions": "Opciones Avanzadas", "advancedOptions": "Opciones Avanzadas",
"difficulty": "Dificultad", "difficulty": "Dificultad",
"difficultyHelpTitle": "¿Qué tan difícil es esta tarea?", "difficultyHelpTitle": "¿Qué tan difícil es esta tarea?",
"difficultyHelpContent": "Esto multiplica su valor respecto al puntaje. Úsalo con moderación y depende más bien de nuestros algoritmos orgánicos de ajuste de valor. Pero algunas tareas son extremadamente más valiosas (Escribir una Tesis vs. Lavarme los Dientes). Haz clic para más información.", "difficultyHelpContent": "Esto multiplica su valor respecto al puntaje. Úsalo con moderación; en lugar de eso depende de nuestros algoritmos orgánicos de ajuste de valor. Pero algunas tareas son extremadamente más valiosas (Escribir una tesis vs. Lavarme los dientes). Haz clic para más información.",
"easy": "Fácil", "easy": "Fácil",
"medium": "Medio", "medium": "Medio",
"hard": "Difícil", "hard": "Difícil",
@@ -103,10 +103,10 @@
"dueDate": "Fecha de Vencimiento", "dueDate": "Fecha de Vencimiento",
"remaining": "Pendientes", "remaining": "Pendientes",
"complete": "Completos", "complete": "Completos",
"rewards": "Premios", "rewards": "Recompensas",
"gold": "Oro", "gold": "Oro",
"silver": "Plata", "silver": "Plata",
"newReward": "Nuevo Premio", "newReward": "Nueva Recompensa",
"price": "Precio", "price": "Precio",
"tags" : "Etiquetas", "tags" : "Etiquetas",
"editTags" : "Editar Etiquetas", "editTags" : "Editar Etiquetas",
@@ -115,8 +115,8 @@
"_commentdrops" : "SYSTEMA DE DROPS", "_commentdrops" : "SYSTEMA DE DROPS",
"dropsEnabled" : Drops Habilitados!", "dropsEnabled" : Caídas Habilitadas!",
"dropsEnabledText1" : "¡Has activado el Sistema de drops! Ahora cuando completas tareas, tienes una pequeña azar de encontrar un ítem. Y adivina qué, has encontrado un", "dropsEnabledText1" : "¡Has desbloqueado el Sistema de Caídas! Ahora cuando completas tareas, tienes una pequeña chance de encontrar un ítem. Y adivina qué, has encontrado un",
"dropsEnabledText2" : "huevo", "dropsEnabledText2" : "huevo",
"itemDropped" : "Ha caído un ítem", "itemDropped" : "Ha caído un ítem",
@@ -131,7 +131,11 @@
"hair": "Cabello", "hair": "Cabello",
"skin": "Piel", "skin": "Piel",
"clothing" : "Ropa", "clothing" : "Ropa",
"photoUrl": "Url de la Imagen", "showArmor": "Mostrar Armadura",
"other": "Más",
"showWeapon": "Mostrar Arma",
"showShield": "Mostrar Escudo",
"photoUrl": "Url de Imagen",
"fullName": "Nombre Completo", "fullName": "Nombre Completo",
"blurb": "Descripción", "blurb": "Descripción",
"websites": "Sitios Web", "websites": "Sitios Web",
@@ -151,10 +155,10 @@
"party": "Grupo", "party": "Grupo",
"createAParty":"Crear un Grupo", "createAParty":"Crear un Grupo",
"noPartyText": "No estás en un grupo. Puedes crear uno e invitar amigos, o si te quieres incorporarse a un grupo existente, haz que ingresen:", "noPartyText": "No estás en un grupo. Puedes crear uno e invitar amigos, o si te quieres unir a un grupo existente, haz que ingresen:",
"partyName": "Nombre del Grupo", "partyName": "Nombre del Grupo",
"create":"Crear", "create":"Crear",
"userId":"Id del Usuario", "userId":"Id de Usuario",
"invite":"Invitar", "invite":"Invitar",
"leave": "Salir", "leave": "Salir",
"invitedTo" : "Estás Invitado A", "invitedTo" : "Estás Invitado A",
@@ -177,12 +181,12 @@
"rarePets": "Mascotas Raras", "rarePets": "Mascotas Raras",
"tavern": "Taberna", "tavern": "Taberna",
"restButton":"Descansar En La Posada", "restButton":"Descansar en la Posada",
"checkoutButton": "Salir De La Posada", "checkoutButton": "Salir de la Posada",
"tavernTalkTitle":"Charla de Taberna & Busqueda de grupos", "tavernTalkTitle":"Charla de Taberna & Búsqueda de Grupos",
"tavernRestingInfo" : "Mientras descansas, tus Diarios son guardados y no son afectados por el cambio de día. Salgas mañana de la posada o en una semana, continuarás en el mismo estado en que estabas cuando entraste.", "tavernRestingInfo" : "Mientras descansas, tus diarios son guardados y no son afectados por el cambio de día. Salgas mañana de la posada o en una semana, continuarás en el mismo estado en que estabas cuando entraste.",
"resources" : "Recursos", "resources" : "Recursos",
"LFGPosts" : "Publicaciones de busca de grupos", "LFGPosts" : "Publicaciones de búsqueda de grupos",
"tutorials" : "Tutoriales", "tutorials" : "Tutoriales",
"achievements":"Logros", "achievements":"Logros",
@@ -195,7 +199,7 @@
"kickstartText" : "Apoyó el proyecto en Kickstarter", "kickstartText" : "Apoyó el proyecto en Kickstarter",
"streakName" : " Logro(s) en Cadena", "streakName" : " Logro(s) en Cadena",
"streakText1" : "Ha completado ", "streakText1" : "Ha completado ",
"stureakText2" : "Diarios durante 21 días consecutivos", "stureakText2" : "diarios durante 21 días consecutivos",
"origUserName" : "Usuario Original", "origUserName" : "Usuario Original",
"origUserText" : "Se remonta a los antiguos días de Habit (¡benditos sean por lidiar con los errores!)", "origUserText" : "Se remonta a los antiguos días de Habit (¡benditos sean por lidiar con los errores!)",
"ultimGearName" : "Máximo Equipamiento", "ultimGearName" : "Máximo Equipamiento",
@@ -208,7 +212,7 @@
"settings":"Configuración", "settings":"Configuración",
"customDayStart":"Personalizar Inicio del Día", "customDayStart":"Personalizar Inicio del Día",
"24HrClock": "Reloj 24h", "24HrClock": "Reloj 24h",
"clockInfo":"Por defecto HabitRPG chequea y reinicia tus Diarios cada día a medianoche. Puedes personalizar esto aquí (Ingresa un número entre 0 y 24).", "clockInfo":"Por defecto HabitRPG chequea y reinicia tus diarios cada día a medianoche. Puedes personalizar esto aquí (Ingresa un número entre 0 y 24).",
"misc":"Miscelánea", "misc":"Miscelánea",
"hideHeader":"Ocultar Encabezado", "hideHeader":"Ocultar Encabezado",
"showHeader":"Mostrar Encabezado", "showHeader":"Mostrar Encabezado",
@@ -227,7 +231,7 @@
"delete":"Eliminar", "delete":"Eliminar",
"deleteAltText":"Eliminar tu cuenta", "deleteAltText":"Eliminar tu cuenta",
"deleteHeader" : "Eliminar Cuenta", "deleteHeader" : "Eliminar Cuenta",
"deleteText1":"¡Woa woa woa! ¿Estás seguro? Esto realmente eliminará tu cuenta para siempre, y nunca podrá ser recuperada. Si estás absolutamente seguro, escribe", "deleteText1":"¡Wow wow wow! ¿Estás seguro? Esto realmente eliminará tu cuenta para siempre, y nunca podrá ser recuperada. Si estás absolutamente seguro, escribe",
"deleteText2":" DELETE ", "deleteText2":" DELETE ",
"deleteText3":"en el cuadro de texto", "deleteText3":"en el cuadro de texto",
"API":"API", "API":"API",
@@ -284,7 +288,7 @@
"sheild1Text": "Reduce la pérdida de HP en un 3%", "sheild1Text": "Reduce la pérdida de HP en un 3%",
"sheild2Name" : "Broquel", "sheild2Name" : "Broquel",
"sheild2Text": "Reduce la pérdida de HP en un 4%", "sheild2Text": "Reduce la pérdida de HP en un 4%",
"sheild3Name" : "Escudo Fuerte", "sheild3Name" : "Escudo Reforzado",
"sheild3Text": "Reduce la pérdida de HP en un 5%", "sheild3Text": "Reduce la pérdida de HP en un 5%",
"sheild4Name" : "Escudo Rojo", "sheild4Name" : "Escudo Rojo",
"sheild4Text": "Reduce la pérdida de HP en un 7%", "sheild4Text": "Reduce la pérdida de HP en un 7%",
@@ -343,21 +347,21 @@
"NPCAugustinText1" : "¡Bienvenido al Mercado! Soy el comerciante;", "NPCAugustinText1" : "¡Bienvenido al Mercado! Soy el comerciante;",
"NPCAugustinText2" : "¿Mueres por conseguir esa mascota particular que buscas, pero no quieres esperar que caiga? ¡Cómprala aquí!", "NPCAugustinText2" : "¿Mueres por conseguir esa mascota particular que buscas, pero no quieres esperar que caiga? ¡Cómprala aquí!",
"NPCJohanssonText1" : "¡Bienvenido a la Taberna! Soy", "NPCJohanssonText1" : "¡Bienvenido a la Taberna! Soy",
"NPCJohanssonText2": "el camarero. Si quieres descansar por un tiempo (¿te vas de vacaciones? ¿enfermedad repentina?), te instalaré en la posada - los Diarios no te dañarán mientras descansas. Quédate por un tiempo y conoce a los lugareños.", "NPCJohanssonText2": "el camarero. Si quieres descansar por un tiempo (¿te vas de vacaciones? ¿enfermedad repentina?), te instalaré en la posada - los diarios no te dañarán mientras descansas. Quédate por un tiempo y conoce a los lugareños.",
"NPCMelchiorText1" : "", "NPCMelchiorText1" : "",
"NPCBowenText1" : "", "NPCBowenText1" : "",
"NPCBochText1" : "", "NPCBochText1" : "",
"_commentdeathstuff" : "DEATH", "_commentdeathstuff" : "DEATH",
"deathTitle" : "¡Has Muerto!", "deathTitle" : "¡Has Muerto!",
"deathText" : "Has perdido tu oro, 1 nivel y 1 pieza de equipamiento. ¡Asegúrate de completar tus Diarios para prevenir que esto pase de nuevo!", "deathText" : "Has perdido tu oro, 1 nivel y 1 pieza de equipamiento. ¡Asegúrate de completar tus diarios para prevenir que esto pase de nuevo!",
"_commentgems" : "GEMS", "_commentgems" : "GEMS",
"gems" : "Gemas", "gems" : "Gemas",
"outOfGems" : "Sin Gemas", "outOfGems" : "Sin Gemas",
"buyMoreGems" : "Compra Más Gemas", "buyMoreGems" : "Compra Más Gemas",
"notEnoughGems" : "No hay suficientes Gemas", "notEnoughGems" : "No hay suficientes Gemas",
"petsOutOfGems" : Oops, te has quedado sin Gemas, las cuales sirven para comprar ítems especiales! Habit es un proyecto de código abierto, y le viene bien toda la ayuda que pueda conseguir - compra más Gemas para recibir esta mascota, y considéralo como una donación a los colaboradores", "petsOutOfGems" : Ups, te has quedado sin Gemas, las cuales sirven para comprar ítems especiales! Habit es un proyecto de código abierto, y le viene bien toda la ayuda que pueda conseguir - compra más Gemas para recibir esta mascota, y considéralo como una donación a los colaboradores",
"gemsWhatFor" : "Se usan para comprar ítems especiales (reroll, huevos, pociones eclosionadoras, etc). Necesitarás desbloquear estas características para poder usar Gemas.", "gemsWhatFor" : "Se usan para comprar ítems especiales (reroll, huevos, pociones eclosionadoras, etc). Necesitarás desbloquear estas características para poder usar Gemas.",
"_commentfooter": "FOOTER", "_commentfooter": "FOOTER",

View File

@@ -128,10 +128,14 @@
"avatar": "Avatar", "avatar": "Avatar",
"head": "Tête", "head": "Tête",
"showHelm": "Afficher le casque", "showHelm": "Montrer le casque",
"hair": "Cheveux", "hair": "Cheveux",
"skin": "Peau", "skin": "Peau",
"clothing" : "Vêtements", "clothing" : "Vêtements",
"showArmor": "Montrer l'armure",
"other": "Autres",
"showWeapon": "Montrer l'arme",
"showShield": "Montrer le bouclier",
"photoUrl": "Lien vers la photo", "photoUrl": "Lien vers la photo",
"fullName": "Nom complet", "fullName": "Nom complet",
"blurb": "Bio", "blurb": "Bio",

View File

@@ -1,98 +1,98 @@
{ {
"languageName": "Hebrew", "languageName": "עברית",
"_commentfrontpage":"HABITRPG FRONT PAGE", "_commentfrontpage":"HABITRPG עמוד ראשי",
"synopsis" : "תוכנית שמהפך את ההיים שלך למשחק תפקידים. ההצלחה מעלה את המדרגה, הכשלון מונע את נקודות החיים, תרוויחו כסף לאסף נשקת שריון ופריטים.", "synopsis" : "תוכנה לפיתוח הרגלים שמתייחסת לחיים כמו משחק תפקידים. עלה שלב בהצלחות, הפסד בריאות בכשלונות, הרווח כסף לרכישת נשק ושריון.",
"playButton" : "שחק", "playButton" : "שחק",
"_commenttut": "TUTORIAL/TOUR", "_commenttut": "הדרכה/סיור",
"endTourButton": "גמר הסיור", "endTourButton": "סיים סיור",
"nextButton" : "הבא", "nextButton" : "הבא",
"prevButton" : "אחרון", "prevButton" : "הקודם",
"tour1Title" : "ברוכים הבאים ל-HabitRPG", "tour1Title" : "ברוכים הבאים ל-HabitRPG",
"tour1Text" : "ברוכים הבאים ל-HabitRPG, גשש הרגלים שמטפל בך כאילו היית דמות במשחק תפקידים.", "tour1Text" : "ברוכים הבאים ל-HabitRPG, מתעד-ההרגלים שמטפל בך כאילו היית דמות במשחק תפקידים.",
"tour2Title" : "הרגלים", "tour2Title" : "הרגלים",
"tour2Text" : "הרגלים הם מידות או מטרות לטוב או לרע שאתם גוששים.", "tour2Text" : "הרגלים יכולים להיות מטרות טובות או רעות אחריהם אתם עוקבים ברציפות.",
"tour3Title" : "יומיומיות", "tour3Title" : "יומיות",
"tour3Text" : "יומיומיות הן מטלות שרוצים למלאות בקצב יומיומי.", "tour3Text" : "יומיות הן מטרות שרוצים להשיג פעם ביום.",
"tour4Title" : "מטלות", "tour4Title" : "מטלות",
"tour4Text" : "מטלות הם משימות חד-פעמיות שצריכים למלאות באיזה זמן. ", "tour4Text" : "מטלות הן משימות חד-פעמיות שיש להשלים מתישהו.",
"tour5Title" : "פרסים", "tour5Title" : "פרסים",
"tour5Text" : "כשתמלאו המטרות, תרוויחו זהב לקנות פרסים. קנו אותם חופשי - חייבים פרסים כדי לבנות הרגלים טובים ומידות טובות. ", "tour5Text" : "עם השגת המטרות, תרוויחו זהב שישמש אתכם לרכישת פרסים. רכשו פרסים בחופשיות - תמריצים חיוביים הם חיוניים לביסוס הרגלים טובים.",
"tour6Title" : "העבר את העכבר על הערות", "tour6Title" : "עבור על ההערות",
"tour6Text" : "יש לסוגי המטרות השונות מאפיינים שונים. העבר את העכבר על הערה של כל מטרה לצפייה במידע מושלמת. כשאתם מוכניםת מחקו את המטרות המחדלים וקדימה!.", "tour6Text" : "למטרות מסוגים שונים יש מאפיינים מיוחדים. הצביעו עם העכבר על סמל ההערה של כל מטרה למידע נוסף. כשאתם מוכנים, מחקו את המטרות הקיימות והוסיפו את שלכם.",
"_commentdefaulttasks":"DEFAULT TASKS", "_commentdefaulttasks":"משימות ברירת מחדל",
"habit1" : "1h Productive Work", "habit1" : "שעת עבודה פרודוקטיבית",
"habit1comment": "-- Habits: Constantly Track -- For some habits, it only makes sense to *gain* points (like this one)", "habit1comment": "-- הרגלים: במעקב רציף -- עבור הרגלים מסויימים, הגיוני רק *לצבור* נקודות (כמו זה) --",
"habit2" : "Eat Junk Food", "habit2" : "לאכול ג'אנק פוד",
"habit2comment" : "For others, it only makes sense to *lose* points", "habit2comment" : "עבור אחרים, זה רק הגיוני *להפסיד* נקודות",
"habit3" : "Take The Stairs", "habit3" : "עלה במדרגות",
"habit3comment" : "For the rest, both + and - make sense (stairs = gain, elevator = lose)", "habit3comment" : "עבור השאר, גם + וגם - הגיוניים (מדרגות = צבירה, מעלית = הפסד)",
"daily1" : "1h Personal Project", "daily1" : "שעה פרוייקט אישי",
"daily1comment" : "-- Dailies: Complete Once a Day -- At the end of each day, non-completed Dailies dock you points.", "daily1comment" : "יומיות: השלימו אחת ליום -- בסוף כל יום, יומיות שלא הושלמו מעכבות את קצב צבירת הנקודות שלך.",
"daily2" : "Exercise", "daily2" : "אימון כושר",
"daily2comment" : "If you are doing well, they turn green and are less valuable (experience, gold) and less damaging (HP). This means you can ease up on them for a bit.", "daily2comment" : "אם אתם עומדים ביעדים, הם הופכים לירוקים ושווים פחות (נסיון, זהב) ופחות מזיקים (בריאות). זה אומר שאתם יכולים להתייחס אליהם יותר בקלות.",
"daily3" : "45m Reading", "daily3" : "45 דקות קריאה",
"daily3comment" : "But if you are doing poorly, they turn red. The worse you do, the more valuable (exp, gold) and more damaging (HP) these goals become. This encourages you to focus on your shortcomings, the reds.", "daily3comment" : "אבל אם אתם לא עומדים בקצב, הם נהיים אדומים. ככל שתכשלו יותר, ערכם (נסיון, זהב) יעלה והם יעלו לכם ביותר בריאות. זה יעודד אתכם להתמקד במכשולים שלכם, הצבועים באדום.",
"todo1" : "Call Mom", "todo1" : "להתקשר לאמא",
"todo1comment" : "-- Todos: Complete Eventually -- Non-completed Todos won't hurt you, but they will become more valuable over time. This will encourage you to wrap up stale Todos.", "todo1comment" : "מטלות: להשלים מתישהו -- מטלות שלא הושלמו לא יפגעו בך, אבל ערכן יגדל עם הזמן. זה יעודד אתכם להשלים מטלות מעוכבות.",
"reward1" : "1 Episode of Game of Thrones", "reward1" : "פרק אחד של משחקי הכס",
"reward1comment": "-- Rewards: Treat Yourself! -- As you complete goals, you earn gold to buy rewards. Buy them liberally - rewards are integral in forming good habits.", "reward1comment": "פרסים: פנקו את עצמכם! -- ככל שתשיגו יעדים, תרוויחו זהב לרכוש פרסים. ריכשו אותם בנדיבות - תמריצים חיוביים חיוניים לאימוץ הרגלים טובים.",
"reward2" : "Cake", "reward2" : "עוגה",
"reward2comment" : "But only buy if you have enough gold - you lose HP otherwise.", "reward2comment" : "אבל ריכשו אותם רק אם יש לכם מספיק זהב - אחרת תאבדו נקודות בריאות.",
"_commentdefaulttags" : "DEFAULT TAGS", "_commentdefaulttags" : "תגיות ברירת מחדל",
"morning" : "בוקר", "morning" : "בוקר",
"afternoon" : "אחה״צ", "afternoon" : "צהריים",
"evening" : "ערב", "evening" : "ערב",
"_commenthead": "HEADER", "_commenthead": "כותרת",
"health": "בריאות", "health": "בריאות",
"experience": "נסיון", "experience": "נסיון",
"history": "היסטוריה", "history": "היסטוריה",
"anonymous": "אלמוני", "anonymous": "אלמוני",
"level": "דרגה", "level": "שלב",
"tasks": "משימות", "tasks": "משימות",
"loginAndReg" : "כניסה / הרשמה", "loginAndReg" : "כניסה / הרשמה",
"loginFacebookAlt" : "כניסה / הרשמה דרך פייסבוק", "loginFacebookAlt" : "כניסה / הרשמה דרך פייסבוק",
"login" : ביסה", "login" : ניסה",
"register" : "הרשמה", "register" : "הרשמה",
"options": "אפשרויות", "options": "אפשרויות",
"logout": "יציאה", "logout": "יציאה",
"_commentnotifcations" : "NOTIFICATIONS", "_commentnotifcations" : "עדכונים",
"partyNotification" : ודעות חברה חדשות", "partyNotification" : צעת חברות חדשה",
"_commenttaskview": "TASK VIEW", "_commenttaskview": "תצוגת משימה",
"habits": "הרגלים", "habits": "הרגלים",
"Habits": "הרגלים", "Habits": "הרגלים",
"newHabit": "הרגל חדש", "newHabit": "הרגל חדש",
"edit": "ערך", "edit": "ערוך",
"text": "טקסט", "text": "טקסט",
"extraNotes": "הארות", "extraNotes": "הארות",
"directions/Actions": "כיוון/פעולות", "directions/Actions": "כיוון/פעולות",
"advancedOptions": "אפשרויות מתקדמות", "advancedOptions": "אפשרויות מתקדמות",
"difficulty": "קושי", "difficulty": "קושי",
"difficultyHelpTitle": "כמה קשה המשימה הזאת?", "difficultyHelpTitle": "כמה קשה המשימה הזאת?",
"difficultyHelpContent": את מכפילה את ערך המשימה. תשתמשו בזאת מעטת אלא סמכו על אלגוריתם הההתאמה האורגני. אבל כמה משימות ערכן משונה באופן משמעותי כמו ציחצוח שניים מול כתיבת התזה. תלחצו למידע מושלמת.", "difficultyHelpContent": ה מכפיל את ערך הנקודות. השתמשו בחסכנות, עדיף כמובן שתסמכו על אלגוריתם שקלול הערך האורגני שלנו, אבל לפעמים מטלות מסויימות שוות יותר (לכתוב תזה מול להשתמש בחוט דנטלי). לחצו למידע נוסף",
"easy": "קל", "easy": "קל",
"medium": "בינוני", "medium": "בינוני",
"hard": "קשה", "hard": "קשה",
"delete": "מחוק", "delete": "מחיקה",
"progress": "פרוגרס", "progress": "התקדמות",
"score": "ציון", "score": "ניקוד",
"dailies": "יומיומיות", "dailies": "יומיות",
"Dailies": "יומיומיות", "Dailies": "יומיות",
"newDaily": "יומיומית חדשה", "newDaily": "יומית חדשה",
"repeat": "חזרה", "repeat": "חזרה",
"Su": "א'", "Su": "א'",
"M": "ב'", "M": "ב'",
@@ -105,159 +105,163 @@
"Todos": "מטלות", "Todos": "מטלות",
"newTodo": "מטלה חדשה", "newTodo": "מטלה חדשה",
"dueDate": "תעריך יעד", "dueDate": "תעריך יעד",
"remaining": "נשארות", "remaining": "נשאר",
"complete": "נשלמות", "complete": "הושלם",
"rewards": "פרסים", "rewards": "פרסים",
"Rewards": "פרסים", "Rewards": "פרסים",
"gold": "זהב", "gold": "זהב",
"silver": "כסף", "silver": "כסף",
"newReward": "פרס חדש", "newReward": "פרס חדש",
"price": כיר", "price": חיר",
"tags" : "תגים", "tags" : "תגיות",
"editTags" : "ערוך תגים", "editTags" : "ערוך תגיות",
"newTag" : "תג חדש", "newTag" : "תגית חדשה",
"clearFilters" : "מחוק מסננות", "clearFilters" : "נקה סינון",
"_commentdrops" : "DROP SYSTEM", "_commentdrops" : "מערכת הליקוט",
"dropsEnabled" : "ירידות מופעלות!", "dropsEnabled" : "ליקוט מופעל!",
"dropsEnabledText1" : "פתחת מערכת הירידות! עכשיו, כשתגמרו משימות, יש לכם צ׳נס קטן למצוא משהו יפה. מאמינים? בדיוק מצאתם", "dropsEnabledText1" : "שחררתם את מערכת הליקוט! מעתה כשתשלימו משימות, יש סיכוי קטן שתמצאו משהו מעניין. ונחשו מה, בדיוק מצאתם",
"dropsEnabledText2" : "ביצה", "dropsEnabledText2" : "ביצה",
"itemDropped" : "ירד פריט!!", "itemDropped" : "הפריט לוקט!!",
"_commentoptionsview": "OPTIONS VIEW", "_commentoptionsview": "תצוגת אפשרויות",
"profile": "פרופיל", "profile": "פרופיל",
"avatar": "אוואתר", "avatar": "דמות",
"head": "ראש", "head": "ראש",
"showHelm": "הראה קסדה", "showHelm": "הראה קסדה",
"hair": "שער", "hair": יער",
"skin": "עור", "skin": "עור",
"clothing" : "לבוש", "clothing" : "לבוש",
"photoUrl": "URL תמונה", "showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "כתובת תמונה",
"fullName": "שם מלא", "fullName": "שם מלא",
"blurb": "קצת על עצמך", "blurb": "קצת על עצמך",
"websites": "אתרי אינטרנט", "websites": "אתרי אינטרנט",
"addWebsites": "הוסיף אתרים", "addWebsites": "הוסף אתרים",
"items" : "פריטים", "items" : "פריטים",
"weapon" : "נשק", "weapon" : "נשק",
"armor" : "שריון", "armor" : "שריון",
"helm" : "קסדה", "helm" : "קסדה",
"shield" : "מגן", "shield" : "מגן",
"stats" : "סטטיסטיקות", "stats" : "נתונים",
"strength" : "עוצמה", "strength" : "עוצמה",
"defense" : "הגנה", "defense" : "הגנה",
"totalStrength" : "סך עוצמה", "totalStrength" : "סך עוצמה",
"totalDefense" : "סך הגנה", "totalDefense" : "סך הגנה",
"party": "Party", "party": "חמולה",
"createAParty":"יצר מפלגה", "createAParty":"צור חמולה",
"noPartyText": תה לא במפלגה. או שאתה יכול ליצור אותו ולהזמין את החברים, או אם אתה רוצה להצטרף למפלגה קיימת, יש להם להכניס:", "noPartyText": ינכם בחמולה. באפשרותכם ליצור חמולה ולהזמין חברים, או על מנת להצטרף לחמולה קיימת, עליהם להכניס:",
"partyName": "שם מפלגה", "partyName": "שם החמולה",
"create":"יצר", "create":ור",
"userId":"מספר משתמש", "userId":"מספר משתמש",
"invite":"הזמין", "invite":"הזמן",
"leave": "יצא", "leave": "עזוב",
"invitedTo" : "אתם מוזמנים ל-", "invitedTo" : "אתם מוזמנים ל-",
"chat": "שיחה", "chat": "שיחה",
"inventory": "מלאי", "inventory": "מלאי",
"eggs": "ביצים", "eggs": "ביצים",
"noEggs": "אין לך ביצים במלאי שלך", "noEggs": "אין לך ביצים במלאי",
"hatchingPotions": "שיקויי בקיעה", "hatchingPotions": "שיקויים",
"noHatchingPotions": "עדיין אין לך שיקויי בקיעה", "noHatchingPotions": "עדיין אין לך שיקוי",
"hatchYourEgg" : "בוקע את הביצה שלך", "hatchYourEgg" : "הפוך ביצה לחיית מחמד",
"whichHatchingPotion1" : "איזה שיקוי בקיעה לשפוך על ביצת ה", "whichHatchingPotion1" : "איזה שיקוי לשפוך על ביצת ה",
"whichHatchingPotion2" : "שלך?", "whichHatchingPotion2" : "שלך?",
"pour" : "שפוך", "pour" : "שפוך",
"rarePets" : "חיות נדירות", "rarePets" : "חיות נדירות",
"market": "השוק", "market": "שוק",
"stable": "אורוה", "stable": "אורווה",
"petsFound":"חיות שנמצאות", "petsFound":"חיות שנמצאות",
"rarePets": "חיות נדירות", "rarePets": "חיות נדירות",
"tavern": "בית מרזח", "tavern": "טברנה",
"restButton":"תנוח בבית מלון", "restButton":"נוח בצימר",
"checkoutButton": "יציאה מהמלון", "checkoutButton": "צא מהצימר",
"tavernTalkTitle":"שיחה ו-LFG בבית המרזח", "tavernTalkTitle":"שיח בטברנה",
"tavernRestingInfo" : "תוך כדי לינה היומימיות שלך נשמרות ואין הליכת הזמן מפריע לנקודות שלך. מתי שאתם רוצים, תצאו מהמלון והדמות שלכם יהיה בדיוק כמו ששמתם פה.", "tavernRestingInfo" : "כל עוד הדמות שלכם לנה בצימר היומיות שלכם נשמרות והזמן שחולף לא מוריד נקודות. כשתרצו, צאו מהצימר והדמות שלכם תשוב בדיוק פי שהייתה כשבאה.",
"resources" : "משאבים", "resources" : "משאבים",
"LFGPosts" : "הודעות LGF", "LFGPosts" : "הודעות",
"tutorials" : "הדרכות", "tutorials" : "הדרכות",
"achievements":"Achievements", "achievements":"הישגים",
"achievementUnlocked" : "השג פתוח!", "achievementUnlocked" : ישג שוחרר!",
"npcText" : "תמך בפרוייקט ה-Kickstarter ברמה הגבוהה ביותר", "npcText" : "תמך בפרוייקט ה-Kickstarter ברמה הגבוהה ביותר",
"contribName" : "מתנדב", "contribName" : "מתנדב",
"contribText" : "התנדב ל-HabitRPG (קוד, עיצוב, אומנות, עצה חוקי, משמכים, וכו׳). רוצה? תקן משהו!", "contribText" : "תרמו ל-HabitRPG (קוד, עיצוב, אומנות, יעוץ משפטי, כתיבה, וכו׳). רוצים? תקנו משהו!",
"kickstartName1" : "תומך Kickstarter - ", "kickstartName1" : "תומך Kickstarter - ",
"kickstartName2" : "מדרגה", "kickstartName2" : "מדרגה",
"kickstartText" : "תמך בפרוייקט ה-Kickstarter", "kickstartText" : "תמך בפרוייקט ה-Kickstarter",
"streakName" : "השגות התמדה", "streakName" : ישג רצף התמדה",
"streakText1" : "התמד", "streakText1" : "התמיד",
"stureakText2" : "פעמים של 21 ימים ביומיומיות", "stureakText2" : "פעמים 21 ימים ברצף ביומיות",
"origUserName" : "משתמש מקורי", "origUserName" : "משתמש מקורי",
"origUserText" : "היו היה פעם שכל אחד לחם בבאגים. איך שעשו חיל!", "origUserText" : "היו היה פעם שכל אחד לחם בבאגים. איך שעשו חיל!",
"ultimGearName" : "סוף הציוד", "ultimGearName" : "מעצמה צבאית",
"ultimGearText" : "השג סט השיון וכלי זיין המקסימלי", "ultimGearText" : "השיג את כל כלי השריון והנשק",
"ultimGearUnlocked" : "השגת השג 'סוף הציוד' שקנית הציוד המקסימלי", "ultimGearUnlocked" : "השגת סטטוס 'מעצמה צבאית' - יש לך את כל כלי השריון והנשק",
"beastMastName" : "בעל החייות", "beastMastName" : "מלך החיות",
"beastMastText" : "מצא כל 90 חיות. קשה נורה! תנו כבוד!", "beastMastText" : "מצא את כל 90 החיות. קשה נורא! תנו כבוד!",
"beastMastUnlocked" : "השגת השג 'בעל החיות' שמצאת כל החיות!", "beastMastUnlocked" : "השגת את סטטוס 'מלך החיות' על שמצאת כל החיות!",
"settings":"Settings", "settings":"הגדרות",
"customDayStart":"Custom Day Start", "customDayStart":"שעת תחילת יום",
"24HrClock": "24Hr Clock", "24HrClock": "שעון 24 שעות",
"clockInfo":"HabitRPG defaults to check and reset your dailies at midnight each day. You can customize that here (Enter number between 0 and 24).", "clockInfo":"HabitRPG מעדכן את הנתונים שלך בחצות כל יום כברירת מחדל. תוכלו להתאים אישית כאן את השעה (הזינו מספר בין 0 ל24)",
"misc":"Misc", "misc":"שונות",
"hideHeader":"Hide Header", "hideHeader":"הסתר כותרת",
"showHeader":"Show Header", "showHeader":"הצג כותרת",
"changePass":"Change Password", "changePass":"שינוי סיסמה",
"oldPass":"Old Password", "oldPass":"סיסמה ישנה",
"newPass":"New Password", "newPass":"סיסמה חדשה",
"confirmPass":"Confirm New Password", "confirmPass":"אשר סיסמה חדשה",
"dangerZone": "Danger Zone", "dangerZone": "איזור סכנה",
"reset":"Reset", "reset":"איפוס",
"resetAltText":"Resets your entire account (dangerous)", "resetAltText":"איפוס כל החשבון (מסוכן)",
"resetText1":"This resets your entire account - your tasks will be deleted and your character will start over.", "resetText1":"זה מאפס את כל החשבון - המטלות שלך ימחקו והדמות תתחיל מחדש. ",
"resetText2":"This is highly discouraged because you'll lose historical data, which is useful for graphing your progress over time. However, some people find it useful in the beginning after playing with the app for a while.", "resetText2":"זה מאוד לא מומלץ כי תאבדו מידע היסטורי ששימושי מאוד להציג את התקדמותכם לאורך זמן. עם זאת, אנשים מסויימים מעוניינים באפשרות זו בהתחלה לאחר ששיחקו קצת בתוכנה. ",
"restore":"Restore", "restore":"שחזר",
"restoreAltText":"Restores attributes to your character", "restoreAltText":"שחזר מאפיינים של הדמות",
"restoreText1":"HabitRPG is quite Beta-quality at present, and many find they need to restore character attributes as a result. Enter your numbers here and it will be applied automatically to your character. This will be removed once Habit is more stable.", "restoreText1":"HabitRPG is quite Beta-quality at present, and many find they need to restore character attributes as a result. Enter your numbers here and it will be applied automatically to your character. This will be removed once Habit is more stable.",
"delete":"Delete", "delete":"מחיקה",
"deleteAltText":"Delete your account", "deleteAltText":"מחק את החשבון",
"deleteHeader" : "Delete Account", "deleteHeader" : "מחק חשבון",
"deleteText1":"Woa woa woa! Are you sure? This will seriously delete your account forever, and it can never be restored. If you're absolutely certain, type", "deleteText1":"ווא ווא ווי ווא! בטוחים? רוצים לחשוב על זה לשניה? זה לגמרי ברצינות ימחק את החשבון שלכם לתמיד, אף פעם לא תוכלו לשחזר אותו. אם אתם בטוחים לגמרי, הקלידו",
"deleteText2":" DELETE ", "deleteText2":" DELETE ",
"deleteText3":"into the text-box", "deleteText3":"לתוך תיבת הטקסט",
"API":"API", "API":"API",
"APIText":"Copy these for use in third party applications.", "APIText":"העתיקו את אלה לשימוש באפליקציות צד-ג.",
"APIToken":"Api Token", "APIToken":"Api Token",
"_commentitems": "ITEMS", "_commentitems": "פריטים",
"_commentitemsweps": "WEAPONS", "_commentitemsweps": "כלי נשק",
"sword0name" : "חרב תרגיל", "sword0name" : "חרב אימון",
"sword1Name" : "חרב", "sword1Name" : "חרב",
"sword1Text" : "מגדיל את רווח ניסיון של 3%.", "sword1Text" : "מגדיל את רווח ניסיון של 3%.",
"sword2Name" : "גרזן", "sword2Name" : "גרזן",
"sword2Text" : "מגדיל את רווח ניסיון של 6%.", "sword2Text" : "מגדיל את רווח ניסיון של 6%.",
"sword3Name" : "כוכב השחר", "sword3Name" : "כוכב השחר",
"sword3Text" : "מגדיל את רווח ניסיון של 9%.", "sword3Text" : "מגדיל את רווח ניסיון של 9%.",
"sword4Name" : "חרב כחול", "sword4Name" : "חרב כחולה",
"sword4Text" : "מגדיל את רווח ניסיון של 12%.", "sword4Text" : "מגדיל את רווח ניסיון של 12%.",
"sword5Name" : "חרב אדום", "sword5Name" : "חרב אדומה",
"sword5Text" : "מגדיל את רווח ניסיון של 15%.", "sword5Text" : "מגדיל את רווח ניסיון של 15%.",
"sword6Name" : "חרב זהב", "sword6Name" : "חרב זהב",
"sword6Text" : "מגדיל את רווח ניסיון של 18%.", "sword6Text" : "מגדיל את רווח ניסיון של 18%.",
"_commentitemsarmor": "ARMOR", "_commentitemsarmor": "שריון",
"armor0Name" : "שריון בד", "armor0Name" : "שריון בד",
"armor1Name" : "שריון עור" , "armor1Name" : "שריון עור" ,
"armor1Text": "מקטין הפסד של HP ב -4%", "armor1Text": "מקטין הפסד של HP ב -4%",
@@ -270,7 +274,7 @@
"armor5Name" : "שריון זהב", "armor5Name" : "שריון זהב",
"armor5Text": "מקטין הפסד של HP ב -10%", "armor5Text": "מקטין הפסד של HP ב -10%",
"_commentitemshead" : "HEADGEAR", "_commentitemshead" : "קסדה",
"head0Name" : "בלי קסדה", "head0Name" : "בלי קסדה",
"head1Name" : "קסדת עור" , "head1Name" : "קסדת עור" ,
"head1Text": "מקטין הפסד של HP ב-2%", "head1Text": "מקטין הפסד של HP ב-2%",
@@ -283,7 +287,7 @@
"head5Name" : "קסדת זהב", "head5Name" : "קסדת זהב",
"head5Text": "מקטין הפסד של HP ב-6%", "head5Text": "מקטין הפסד של HP ב-6%",
"_commentitemsshield" : "SHIELDS", "_commentitemsshield" : "מגנים",
"sheild0Name" : "בלי מגן", "sheild0Name" : "בלי מגן",
"sheild1Name" : "מגן עץ", "sheild1Name" : "מגן עץ",
"sheild1Text": "מקטין הפסד של HP ב-3%", "sheild1Text": "מקטין הפסד של HP ב-3%",
@@ -296,8 +300,8 @@
"sheild5Name" : "מגן זהב", "sheild5Name" : "מגן זהב",
"sheild5Text": "מקטין הפסד של HP ב-8%", "sheild5Text": "מקטין הפסד של HP ב-8%",
"_commentitemsother" : "OTHER ITEMS", "_commentitemsother" : "פריטים אחרים",
"healthPotionName" : "שקוי בריאות", "healthPotionName" : יקוי בריאות",
"healthPotionNotes" : "לשחזר 15 HP באופן מיידי", "healthPotionNotes" : "לשחזר 15 HP באופן מיידי",
"rerollName" : "אתחול", "rerollName" : "אתחול",
"rerollNotes" : "מאפס את ערכי המשימות שלך לצהוב. טוב כשאתה באדום וקשה להשתייר בחיים.", "rerollNotes" : "מאפס את ערכי המשימות שלך לצהוב. טוב כשאתה באדום וקשה להשתייר בחיים.",
@@ -306,7 +310,7 @@
"rerollModelText2" : "קרא יותר", "rerollModelText2" : "קרא יותר",
"rerollModelText3" : "אמנם, הכרחי אחרי תקופות ממושכות של הרגלים רעים.", "rerollModelText3" : "אמנם, הכרחי אחרי תקופות ממושכות של הרגלים רעים.",
"_commentitemspeteggs": "PET EGGS", "_commentitemspeteggs": "ביצי חיות מחמד",
"wolfEgg": "גור זאב", "wolfEgg": "גור זאב",
"tigerEgg": "גור נמרים", "tigerEgg": "גור נמרים",
"pandaEgg": "גור פנדה", "pandaEgg": "גור פנדה",
@@ -318,7 +322,7 @@
"bearEgg": "גור דובים", "bearEgg": "גור דובים",
"wolfEgg": "גור זאב", "wolfEgg": "גור זאב",
"_commentitemshatchingpotions": "HATCHING POTIONS", "_commentitemshatchingpotions": "שיקויים",
"basePotName": "בסיסי", "basePotName": "בסיסי",
"basePotText" : ".בוקעים חיית המחמד שלך לצורתה הבסיסי", "basePotText" : ".בוקעים חיית המחמד שלך לצורתה הבסיסי",
"whitePotName": "לבן", "whitePotName": "לבן",
@@ -353,7 +357,7 @@
"NPCBowenText1" : "", "NPCBowenText1" : "",
"NPCBochText1" : "", "NPCBochText1" : "",
"_commentdeathstuff" : "DEATH", "_commentdeathstuff" : "מוות",
"deathTitle" : "אתה מת!", "deathTitle" : "אתה מת!",
"deathText" : "הפסדת כל הכסף, מדרגה אחד וכלי אחת. הקפד להשלים את היומונים שלך כדי למנוע את זה מלקרות שוב!", "deathText" : "הפסדת כל הכסף, מדרגה אחד וכלי אחת. הקפד להשלים את היומונים שלך כדי למנוע את זה מלקרות שוב!",
@@ -385,22 +389,22 @@
"_commentmisc": "MISC & GLOBAL", "_commentmisc": "MISC & GLOBAL",
"removeAds": "הסרת פרסומים", "removeAds": "הסרת פרסומות",
"whyAds": "למה פירסומים?", "whyAds": "למה פרסומות?",
"whyAdsContent1": "Habit היא פרויקט Open Source, וזקוק לכל עזרה - רואים את זה כתרומה למפתחים. גם מקבלים 20 אבני חן כדי לקנות פריטים מיוחדים.", "whyAdsContent1": "Habit היא פרויקט Open Source, וזקוק לכל עזרה - רואים את זה כתרומה למפתחים. גם מקבלים 20 אבני חן כדי לקנות פריטים מיוחדים.",
"whyAdsContent2": "'היי, אני תמכתי ה-Kickstarter!' - עקוב אחרי", "whyAdsContent2": "'היי, אני תמכתי ה-Kickstarter!' - עקוב אחרי",
"whyAdsContent3": "ההוראות הבאות", "whyAdsContent3": "ההוראות הבאות",
"_commentbuttons": "BUTTONS", "_commentbuttons": "כפתורים",
"submit":"שלח", "submit":"שלח",
"close":"סגור", "close":"סגור",
"saveAndClose": "שמור וסגור", "saveAndClose": "שמור וסגור",
"cancel":"בטל", "cancel":"בטל",
"ok" : "בסדר", "ok" : "בסדר",
"add" : "הוסיף", "add" : "הוסף",
"undo" : "החזר", "undo" : "החזר",
"continue" : "המשך", "continue" : "המשך",
"accept" : "קבל", "accept" : "קבל",
"reject" : וחה", "reject" : "דחה",
"or" : "או", "or" : "או",
"_commenttimestamps":"TIME STAMPS", "_commenttimestamps":"TIME STAMPS",
"justNow":"בדיוק עכשיו", "justNow":"בדיוק עכשיו",

View File

@@ -132,6 +132,10 @@
"hair": "Hair", "hair": "Hair",
"skin": "Skin", "skin": "Skin",
"clothing" : "Clothing", "clothing" : "Clothing",
"showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "Photo Url", "photoUrl": "Photo Url",
"fullName": "Full Name", "fullName": "Full Name",
"blurb": "Blurb", "blurb": "Blurb",

View File

@@ -4,7 +4,7 @@
"_commentfrontpage":"HABITRPG FRONT PAGE", "_commentfrontpage":"HABITRPG FRONT PAGE",
"synopsis" : "Un programma per trattare le proprie abitudini come in un Gioco di Ruolo. Sali di livello se ci riesci, perdi HP se fallisci, guadagna soldi per comprare armi ed armature.", "synopsis" : "Un programma per gestire le proprie abitudini come in un Gioco di Ruolo. Sali di livello se ci riesci, perdi HP se fallisci, guadagna soldi per comprare armi ed armature.",
"playButton" : "Gioca", "playButton" : "Gioca",
@@ -20,11 +20,11 @@
"tour3Title" : "Dailies", "tour3Title" : "Dailies",
"tour3Text" : "Le Dailies sono le attività che vuoi completare una volta al giorno.", "tour3Text" : "Le Dailies sono le attività che vuoi completare una volta al giorno.",
"tour4Title" : "Todos", "tour4Title" : "Todos",
"tour4Text" : "I Todos sono obiettivi unici che devono essere completati alla fine.", "tour4Text" : "I Todos sono gli obiettivi personali che vuoi completare.",
"tour5Title" : "Ricompense", "tour5Title" : "Ricompense",
"tour5Text" : "Quando completi i tuoi obiettivi, guadagni oro per comprare ricompense. Comprale liberamente - le ricompense sono fondamentali per formare buone abitudini.", "tour5Text" : "Quando completi i tuoi obiettivi, guadagni oro per comprare ricompense. Comprale liberamente - le ricompense sono fondamentali per formare buone abitudini.",
"tour6Title" : "Passa il mouse sopra i commenti", "tour6Title" : "Passa il mouse sopra i commenti",
"tour6Text" : "Diversi tipi di attività hanno proprietà sperciali. Passa il mouse sopra i commenti per maggiori informazioni. Quando sei pronto per cominciare, cancella le attività esistenti ed aggiungine di nuove.", "tour6Text" : "Diversi tipi di attività hanno proprietà speciali. Passa il mouse sopra i commenti per maggiori informazioni. Quando sei pronto per cominciare, cancella le attività esistenti ed aggiungine di nuove.",
@@ -132,6 +132,10 @@
"hair": "Capelli", "hair": "Capelli",
"skin": "Pelle", "skin": "Pelle",
"clothing" : "Abbigliamento", "clothing" : "Abbigliamento",
"showArmor": "Mostra Armatura",
"other": "Altro",
"showWeapon": "Mostra Arma",
"showShield": "Mostra Scudo",
"photoUrl": "Url Foto", "photoUrl": "Url Foto",
"fullName": "Nome Completo", "fullName": "Nome Completo",
"blurb": "Firma", "blurb": "Firma",
@@ -183,7 +187,7 @@
"tavernTalkTitle":"Chiacchiera nella Taverna & LFG", "tavernTalkTitle":"Chiacchiera nella Taverna & LFG",
"tavernRestingInfo" : "Mentre riposi le tue dailies sono salvate e non verranno modificate dal cambio di giorno. Puoi tornare domani o in una settimana, troverai tutto come l'hai lasciato.", "tavernRestingInfo" : "Mentre riposi le tue dailies sono salvate e non verranno modificate dal cambio di giorno. Puoi tornare domani o in una settimana, troverai tutto come l'hai lasciato.",
"resources" : "Risorse", "resources" : "Risorse",
"LFGPosts" : "Messaggi LGF", "LFGPosts" : "Messaggi LFG",
"tutorials" : "Tutorials", "tutorials" : "Tutorials",
"achievements":"Obiettivi", "achievements":"Obiettivi",
@@ -280,7 +284,7 @@
"head5Text": "Riduce gli HP persi del 6%", "head5Text": "Riduce gli HP persi del 6%",
"_commentitemsshield" : "SHIELDS", "_commentitemsshield" : "SHIELDS",
"sheild0Name" : "Nessuno Scuso", "sheild0Name" : "Nessuno Scudo",
"sheild1Name" : "Scudo di Legno", "sheild1Name" : "Scudo di Legno",
"sheild1Text": "Riduce gli HP persi del 3%", "sheild1Text": "Riduce gli HP persi del 3%",
"sheild2Name" : "Brocchiero", "sheild2Name" : "Brocchiero",
@@ -344,7 +348,7 @@
"NPCAugustinText1" : "Benvenuti al mercato! Io sono il mercante;", "NPCAugustinText1" : "Benvenuti al mercato! Io sono il mercante;",
"NPCAugustinText2" : "Morite dalla voglia di avere quel particolare animale, ma non volete aspettare di trovarlo ? Compratelo qui!", "NPCAugustinText2" : "Morite dalla voglia di avere quel particolare animale, ma non volete aspettare di trovarlo ? Compratelo qui!",
"NPCJohanssonText1" : "Benvenuti alla Locanda! Io sono", "NPCJohanssonText1" : "Benvenuti alla Locanda! Io sono",
"NPCJohanssonText2": "l'oste. Se vuoi riposare per un po' (vai in vacanca? malattia improvvisa?), ti sistemo in locanda - le dailies non ti faranno male mentre riposi. Rimani un po' & incontra la gente del posto.", "NPCJohanssonText2": "l'oste. Se vuoi riposare per un po' (vai in vacanca? malattia improvvisa?), ti sistemo in locanda - le dailies non ti faranno male mentre riposi. Rimani un po' e incontra la gente del posto.",
"NPCMelchiorText1" : "", "NPCMelchiorText1" : "",
"NPCBowenText1" : "", "NPCBowenText1" : "",
"NPCBochText1" : "", "NPCBochText1" : "",
@@ -384,7 +388,7 @@
"removeAds": "Rimuovi gli Ads", "removeAds": "Rimuovi gli Ads",
"whyAds": "Perché gli Ads?", "whyAds": "Perché gli Ads?",
"whyAdsContent1": "Habit è un progetto open source, e può usare tutto l'aiuto che può ottenere - considerala una donazione ai collaboratori. Riceverai anche 20 Gemme dall'acquisto, con le quali puoi comprare oggetti speciali.", "whyAdsContent1": "Habit è un progetto open source, e può usare tutto l'aiuto che può ottenere - considerala una donazione ai collaboratori. Riceverai anche 20 Gemme dall'acquisto, con le quali puoi comprare oggetti speciali.",
"whyAdsContent2": "'Hey, Ho sostenuto il progetto su Kickstarter!' - segui", "whyAdsContent2": "'Hey, ho sostenuto il progetto su Kickstarter!' - segui",
"whyAdsContent3": "queste istruzioni", "whyAdsContent3": "queste istruzioni",
"_commentbuttons": "BUTTONS", "_commentbuttons": "BUTTONS",
"submit":"Invia", "submit":"Invia",

View File

@@ -80,7 +80,7 @@
"extraNotes": "Extra Notes", "extraNotes": "Extra Notes",
"directions/Actions": "Directions/Actions", "directions/Actions": "Directions/Actions",
"advancedOptions": "Advanced Options", "advancedOptions": "Advanced Options",
"difficulty": "Difficulty", "difficulty": "難易度",
"difficultyHelpTitle": "How difficult is this task?", "difficultyHelpTitle": "How difficult is this task?",
"difficultyHelpContent": "This multiplies its point value. Use sparingly, rely instead on our organic value-adjustment algorithms. But some tasks are grossly more valuable (Write Thesis vs Floss Teeth). Click for more info.", "difficultyHelpContent": "This multiplies its point value. Use sparingly, rely instead on our organic value-adjustment algorithms. But some tasks are grossly more valuable (Write Thesis vs Floss Teeth). Click for more info.",
"easy": "簡単", "easy": "簡単",
@@ -129,9 +129,13 @@
"head": "頭", "head": "頭",
"showHelm": "Show 兜", "showHelm": "Show 兜",
"hair": "Hair", "hair": "",
"skin": "皮膚", "skin": "皮膚",
"clothing" : "衣料", "clothing" : "衣料",
"showArmor": "Show Armor",
"other": "他の",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "写真 URL", "photoUrl": "写真 URL",
"fullName": "名前", "fullName": "名前",
"blurb": "自己紹介", "blurb": "自己紹介",
@@ -171,13 +175,13 @@
"whichHatchingPotion2" : "卵?", "whichHatchingPotion2" : "卵?",
"pour" : "pour", "pour" : "pour",
"rarePets" : "Rare Pets", "rarePets" : "Rare Pets",
"market": "Market", "market": "マーケット",
"stable": "Stable", "stable": "Stable",
"petsFound":"Pets Found", "petsFound":"Pets Found",
"rarePets": "Rare Pets", "rarePets": "Rare Pets",
"tavern": "Tavern", "tavern": "居酒屋",
"restButton":"Rest In The Inn", "restButton":"Rest In The Inn",
"checkoutButton": "Check Out Of Inn", "checkoutButton": "Check Out Of Inn",
"tavernTalkTitle":"Tavern Talk & LFG", "tavernTalkTitle":"Tavern Talk & LFG",
@@ -186,7 +190,7 @@
"LFGPosts" : "LGF Posts", "LFGPosts" : "LGF Posts",
"tutorials" : "チュートリアル", "tutorials" : "チュートリアル",
"achievements":"Achievements", "achievements":"功績",
"achievementUnlocked" : "Achievement Unlocked!", "achievementUnlocked" : "Achievement Unlocked!",
"npcText" : "Backed the Kickstarter project at the maximum level!", "npcText" : "Backed the Kickstarter project at the maximum level!",
"contribName" : "Contributor", "contribName" : "Contributor",
@@ -353,7 +357,7 @@
"deathText" : "You've lost your GP, 1 level and 1 gear piece. Be sure to complete your dailies to prevent this from happening again!", "deathText" : "You've lost your GP, 1 level and 1 gear piece. Be sure to complete your dailies to prevent this from happening again!",
"_commentgems" : "GEMS", "_commentgems" : "GEMS",
"gems" : "Gems", "gems" : "宝石",
"outOfGems" : "Out Of Gems", "outOfGems" : "Out Of Gems",
"buyMoreGems" : "Buy More Gems", "buyMoreGems" : "Buy More Gems",
"notEnoughGems" : "Not enough Gems", "notEnoughGems" : "Not enough Gems",
@@ -390,7 +394,7 @@
"close":"締める", "close":"締める",
"saveAndClose": "保存して閉じる", "saveAndClose": "保存して閉じる",
"cancel":"キャンセル", "cancel":"キャンセル",
"ok" : "Ok", "ok" : "はい",
"add" : "加える", "add" : "加える",
"undo" : "キャンセル", "undo" : "キャンセル",
"continue" : "続ける", "continue" : "続ける",

View File

@@ -132,6 +132,10 @@
"hair": "Haar", "hair": "Haar",
"skin": "Huid", "skin": "Huid",
"clothing" : "Kleding", "clothing" : "Kleding",
"showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "Foto URL", "photoUrl": "Foto URL",
"fullName": "Volledige Naam", "fullName": "Volledige Naam",
"blurb": "Blurp", "blurb": "Blurp",

View File

@@ -137,6 +137,10 @@
"skin": "Hudfarge", "skin": "Hudfarge",
"clothing" : "Klær", "clothing" : "Klær",
"photoUrl": "Bilde-URL", "photoUrl": "Bilde-URL",
"showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"fullName": "Fullt navn", "fullName": "Fullt navn",
"blurb": "Kort om deg", "blurb": "Kort om deg",
"websites": "Nettsider", "websites": "Nettsider",

View File

@@ -132,6 +132,10 @@
"hair": "Włosy", "hair": "Włosy",
"skin": "Karnacja", "skin": "Karnacja",
"clothing" : "Ubranie", "clothing" : "Ubranie",
"showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "URL obrazka", "photoUrl": "URL obrazka",
"fullName": "Imię i nazwisko", "fullName": "Imię i nazwisko",
"blurb": "Krótki opis", "blurb": "Krótki opis",

View File

@@ -132,6 +132,10 @@
"hair": "Cabelo", "hair": "Cabelo",
"skin": "Pele", "skin": "Pele",
"clothing" : "Vestimentas", "clothing" : "Vestimentas",
"showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "Url da Foto", "photoUrl": "Url da Foto",
"fullName": "Nome Completo", "fullName": "Nome Completo",
"blurb": "Sinopse", "blurb": "Sinopse",

View File

@@ -132,6 +132,10 @@
"hair": "Волосы", "hair": "Волосы",
"skin": "Кожа", "skin": "Кожа",
"clothing" : "Одежда", "clothing" : "Одежда",
"showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "Ссылка на фото", "photoUrl": "Ссылка на фото",
"fullName": "Полное имя", "fullName": "Полное имя",
"blurb": "О себе", "blurb": "О себе",

417
locales/sl/app.json Normal file
View File

@@ -0,0 +1,417 @@
{
"languageName": "Slovene",
"stringNotFound": "String not found.",
"_commentfrontpage":"HABITRPG FRONT PAGE",
"synopsis" : "Program za pridobivanje navad, s katerim tvoje življenje postane igra igranja vlog. Z uspehi tvoj lik raste, z neuspehi izgubi del zdravja, s prisluženim denarjem pa lahko kupiš orožje in oklep.",
"playButton" : "Igraj",
"_commenttut": "TUTORIAL/TOUR",
"endTourButton": "Končaj predstavitev",
"nextButton" : "Naprej",
"prevButton" : "Nazaj",
"tour1Title" : "Dobrodošel pri HabitRPG",
"tour1Text" : "Dobrodošel pri HabitRPG, programu, ki spremlja tvoje navade v stilu igre igranja vlog.",
"tour2Title" : "Navade",
"tour2Text" : "S programom ves čas spremljaš dobre in slabe navade.",
"tour3Title" : "Dnevne naloge",
"tour3Text" : "Dnevne naloge moraš opraviti vsak dan enkrat.",
"tour4Title" : "Opravki",
"tour4Text" : "Opravki so naloge, ki jih moraš opraviti samo enkrat. ",
"tour5Title" : "Nagrade",
"tour5Text" : "Z opravljenimi nalogami si prislužiš zlato, s katerim lahko kupiš nagrade. Kupuj jih pogosto, saj so pomembne pri pridobivanju novih navad. ",
"tour6Title" : "Poglej komentarje",
"tour6Text" : "Določene vrste nalog imajo posebne lastnosti. Ogledaš si jih tako, da kazalec miške postaviš nad njihov komentar. Ko želiš začeti, izbriši obstoječe naloge in dodaj svoje.",
"_commentdefaulttasks":"DEFAULT TASKS",
"habit1" : "1h produktivno delo",
"habit1comment": "-- Navade program spremlja ves čas -- Pri določenih nalogah je smiselno samo *pridobivanje* točk (kot pri tej)",
"habit2" : "Jedel nezdravo hrano",
"habit2comment" : "Pri drugih je smiselno samo *izgubljanje* točk",
"habit3" : "Šel po stopnicah",
"habit3comment" : "Pri ostalih lahko uporabiš tako + kot tudi - (stopnice = pridobiš, dvigalo = izgubiš)",
"daily1" : "1h osebni projekt",
"daily1comment" : "-- Dnevne naloge je treba opraviti enkrat na dan -- Ko se dan konča, izgubiš točke za vse neopravljene dnevne naloge.",
"daily2" : "Telovadba",
"daily2comment" : "Če jih opravljaš vestno, postanejo zelene, prinesejo manj denarja in izkušenj ter odvzamejo manj zdravja, ko jih ne opraviš.",
"daily3" : "45min branje",
"daily3comment" : "Če pa jih opravljaš neredno, postanejo rdeče. Čim manjkrat jih opraviš, tem več zlata in izkušenj prinesejo, vendar pa so tudi bolj nevarne za zdravje lika. To te spodbudi, da jih opravljaš bolj redno.",
"todo1" : "Pokliči mamo",
"todo1comment" : "-- Opravke je treba opraviti enkrat -- Neopravljeni opravki ne škodujejo zdravju lika, sčasoma pa postanejo vredni vedno več, kar te spodbudi, da opraviš te zapoznele naloge.",
"reward1" : "1 epizoda Igre prestolov",
"reward1comment": "-- Privošči si nagrado! -- Z opravljenimi nalogami si prislužiš zlato, s katerim lahko kupiš nagrade. Kupuj jih pogosto, saj so pomembne pri pridobivanju novih navad.",
"reward2" : "Torta",
"reward2comment" : "Ampak samo, če imaš dovolj zlata, saj boš drugače izgubil točke pri zdravju.",
"_commentdefaulttags" : "DEFAULT TAGS",
"morning" : "jutro",
"afternoon" : "popoldne",
"evening" : "večer",
"_commenthead": "HEADER",
"health": "Zdravje",
"experience": "Izkušnje",
"history": "Zgodovina",
"anonymous": "Neimenovan",
"level": "Level",
"tasks": "Naloge",
"loginAndReg" : "Prijava / Registracija",
"loginFacebookAlt" : "Prijava / Registracija preko Facebooka",
"login" : "Prijava",
"register" : "Registracija",
"options": "Možnosti",
"logout": "Odjava",
"_commentnotifcations" : "NOTIFICATIONS",
"partyNotification" : "Novo sporočilo skupine",
"_commenttaskview": "TASK VIEW",
"habits": "Navade",
"Habits": "Navade",
"newHabit": "Nova navada",
"edit": "Uredi",
"text": "Besedilo",
"extraNotes": "Opomba",
"directions/Actions": "Navodilo/Dejanje",
"advancedOptions": "Dodatne možnosti",
"difficulty": "Težavnost",
"difficultyHelpTitle": "Kako težavna je naloga?",
"difficultyHelpContent": "Težavnost pomnoži osnovno vrednost. Priporočamo, da večinoma uporabljaš vgrajeni algoritem, ki prilagodi vrednost. A nekatere naloge so veliko pomembnejše od drugih (pisanje diplome proti nitkanju zob). Klikni za več informacij.",
"easy": "Enostavno",
"medium": "Srednje",
"hard": "Težko",
"delete": "Zbriši",
"progress": "Napredek",
"score": "Točke",
"dailies": "Dnevne naloge",
"Dailies": "Dnevne naloge",
"newDaily": "Nova dnevna naloga",
"repeat": "Ponovi",
"Su": "Ne",
"M": "Po",
"T": "To",
"We": "Sr",
"Th": "Če",
"F": "Pe",
"S": "So",
"todos": "Opravki",
"Todos": "Opravki",
"newTodo": "Nov opravek",
"dueDate": "Opraviti do",
"remaining": "Preostalo",
"complete": "Opravljeno",
"rewards": "Nagrade",
"Rewards": "Nagrade",
"gold": "Zlato",
"silver": "Srebro",
"newReward": "Nova nagrada",
"price": "Cena",
"tags" : "Oznake",
"editTags" : "Uredi oznake",
"newTag" : "Nova oznaka",
"clearFilters" : "Počisti filtre",
"_commentdrops" : "DROP SYSTEM",
"dropsEnabled" : "Najdbe vključene!",
"dropsEnabledText1" : "Odklenil si sistem najdb! Ko zdaj opraviš nalogo, imaš majhno možnost, da naletiš na najdbo. Ne boš verjel, ravnokar si našel",
"dropsEnabledText2" : "jajce",
"itemDropped" : "Nova najdba",
"_commentoptionsview": "OPTIONS VIEW",
"profile": "Profil",
"avatar": "Avatar",
"head": "Glava",
"showHelm": "Pokaži čelado",
"hair": "Lasje",
"skin": "Polt",
"clothing" : "OblaËila",
"showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "Spletni naslov slike",
"fullName": "Polno ime",
"blurb": "O tebi",
"items" : "Oprema",
"weapon" : "Orožje",
"armor" : "Oklep",
"helm" : "Čelada",
"shield" : "Ščit",
"stats" : "Podatki",
"strength" : "Moč",
"defense" : "Obramba",
"totalStrength" : "Skupna moč",
"totalDefense" : "Skupna obramba",
"party": "Skupina",
"createAParty":"Ustvari skupino",
"noPartyText": "Nisi del skupine. Lahko ustvariš svojo in povabiš prijatelje ali pa se pridružiš že obstoječi skupini. Naj uporabijo to številko:",
"partyName": "Ime skupine",
"create":"Ustvari",
"userId":"Številka uporabnika",
"invite":"Povabi",
"leave": "Zapusti",
"invitedTo" : "Povabljen si k skupini",
"chat": "Klepet",
"inventory": "Inventar",
"eggs": "Jajca",
"noEggs": "Našel nisi še nobenega jajca.",
"hatchingPotions": "Valilni napoji",
"noHatchingPotions": "Našel nisi še nobenega valilnega napoja.",
"hatchYourEgg" : "Naj se zverinica izvali",
"whichHatchingPotion1" : "Kateri valilni napoj želiš politi po",
"whichHatchingPotion2" : "jajcu?",
"pour" : "polij",
"rarePets" : "Redke zverinice",
"market": "Trgovina",
"stable": "Hlev",
"petsFound":"najdenih zverinic",
"rarePets": "Redke zverinice",
"tavern": "Gostilna",
"restButton":"Počivaj v gostilni",
"checkoutButton": "Odjavi se iz gostilne",
"tavernTalkTitle":"Gostilniški klepet in iskanje skupin",
"tavernRestingInfo" : "Medtem ko počivaš, se dnevne naloge shranijo in ne škodujejo zdravju lika. Lahko se odjaviš jutri ali čez en teden in lik bo v istem stanju kot na začetku počitka.",
"resources" : "Viri",
"LFGPosts" : "Objave glede iskanja skupin",
"tutorials" : "Vodiči",
"achievements":"Dosežki",
"achievementUnlocked" : "Nov dosežek!",
"npcText" : "Med največjimi podporniki pri Kickstarter projektu!",
"contribName" : "Sodelavec",
"contribText" : "Prispeval k razvoju HabitRPG-ja (programiranje, dizajn, pikslaste grafike, pravni nasveti, dokumenti itd.). Želiš to značko? Popravi kakšnega hrošča",
"kickstartName1" : "Podpornik pri Kickstarterju - ",
"kickstartName2" : "donacije",
"kickstartText" : "Podprl Kickstarter projekt",
"streakName" : " Niz(i) uspehov",
"streakText1" : "Dosegel ",
"stureakText2" : " 21-dnevnih nizov uspehov pri dnevnih nalogah",
"origUserName" : "Prvotni uporabnik",
"origUserText" : "Bil z nami od samega začetka HabitRPG-ja (kapo dol za uspešno prebijanje skozi te hroščaste čase!)",
"ultimGearName" : "Vrhunska oprema",
"ultimGearText" : "Prišel do najboljšega orožja in oklepa",
"ultimGearUnlocked" : "Dobil si značko 'Vrhunska oprema', saj imaš najboljšo opremo, kar jo lahko kupi zlato!",
"beastMastName" : "Šef zverinjaka",
"beastMastText" : "Našel si vseh 90 zverinic (kar je izjemno težko, vsa čast!)",
"beastMastUnlocked" : "Dobil si značko 'Šef zverinjaka', saj si našel vse zverinice!",
"settings":"Nastavitve",
"customDayStart":"Določi začetek dneva",
"24HrClock": "24-urni način",
"clockInfo":"HabitRPG preveri in ponastavi tvoje dnevne naloge vsak dan opolnoči. To uro lahko spremeniš tukaj (vpiši številko med 0 in 24).",
"misc":"Ostalo",
"hideHeader":"Skrij glavo",
"showHeader":"Pokaži glavo",
"changePass":"Sprememba gesla",
"oldPass":"Staro geslo",
"newPass":"Novo geslo",
"confirmPass":"Potrditev novega gesla",
"dangerZone": "Nevarno območje",
"reset":"Ponastavitev",
"resetAltText":"Ponastavitev tvojega računa (nevarno)",
"resetText1":"S tem gumbom ponastaviš celoten račun - naloge bodo izbrisane, tvoj lik pa bo moral začeti znova.",
"resetText2":"Tega ne priporočamo, saj boš izgubil pretekle informacije, ki ti lahko pomagajo pri spremljanju napredka. Izbris računa je uporaben predvsem za ljudi, ki želijo program najprej preizkusiti, potem pa začeti na novo.",
"restore":"Povrnitev",
"restoreAltText":"Povrne liku podatke",
"restoreText1":"HabitRPG je še v fazi razvoja, zato bodo nekateri uporabniki morda primorani liku povrniti podatke. Tukaj vpiši podatke in avtomatično bodo dodani tvojemu liku. Ko bo program bolj stabilen, bo ta funkcija odstranjena.",
"delete":"Brisanje",
"deleteAltText":"Brisanje računa",
"deleteHeader" : "Izbriši račun",
"deleteText1":"Počasi! Si prepričan? S tem boš za vedno izbrisal račun in ne bo se ga dalo povrniti. Če si popolnoma prepričan, vpiši",
"deleteText2":" IZBRIŠI ",
"deleteText3":"v okence",
"API":"API",
"APIText":"Kopiraj te podatke za uporabo pri aplikacijah drugih proizvajalcev.",
"APIToken":"Api žeton",
"_commentitems": "ITEMS",
"_commentitemsweps": "WEAPONS",
"sword0name" : "Vadbeni meč",
"sword1Name" : "Meč",
"sword1Text" : "Poveča pridobivanje izkušenj za 3%.",
"sword2Name" : "Sekira",
"sword2Text" : "Poveča pridobivanje izkušenj za 6%.",
"sword3Name" : "Buzdovan",
"sword3Text" : "Poveča pridobivanje izkušenj za 9%.",
"sword4Name" : "Modri meč",
"sword4Text" : "Poveča pridobivanje izkušenj za 12%.",
"sword5Name" : "Rdeči meč",
"sword5Text" : "Poveča pridobivanje izkušenj za 15%.",
"sword6Name" : "Zlati meč",
"sword6Text" : "Poveča pridobivanje izkušenj za 18%.",
"_commentitemsarmor": "ARMOR",
"armor0Name" : "Oklep iz blaga",
"armor1Name" : "Usnjeni oklep" ,
"armor1Text": "Zmanjša izgubo zdravja za 4%",
"armor2Name" : "Verižna srajca",
"armor2Text": "Zmanjša izgubo zdravja za 6%",
"armor3Name" : "Ploščni oklep",
"armor3Text": "Zmanjša izgubo zdravja za 7%",
"armor4Name" : "Rdeči oklep",
"armor4Text": "Zmanjša izgubo zdravja za 8%",
"armor5Name" : "Zlati oklep",
"armor5Text": "manjša izgubo zdravja za 10%",
"_commentitemshead" : "HEADGEAR",
"head0Name" : "Brez čelade",
"head1Name" : "Usnjena čelada" ,
"head1Text": "Zmanjša izgubo zdravja za 2%",
"head2Name" : "Verižna kapuca",
"head2Text": "Zmanjša izgubo zdravja za 3%",
"head3Name" : "Ploščna čelada",
"head3Text": "Zmanjša izgubo zdravja za 4%",
"head4Name" : "Rdeča čelada",
"head4Text": "Zmanjša izgubo zdravja za 5%",
"head5Name" : "Zlata čelada",
"head5Text": "Zmanjša izgubo zdravja za 6%",
"_commentitemsshield" : "SHIELDS",
"sheild0Name" : "Brez ščita",
"sheild1Name" : "Leseni ščit",
"sheild1Text": "Zmanjša izgubo zdravja za 3%",
"sheild2Name" : "Mali ščit",
"sheild2Text": "Zmanjša izgubo zdravja za 4%",
"sheild3Name" : "Okrepljeni ščit",
"sheild3Text": "Zmanjša izgubo zdravja za 5%",
"sheild4Name" : "Rdeči ščit",
"sheild4Text": "Zmanjša izgubo zdravja za 7%",
"sheild5Name" : "Zlati ščit",
"sheild5Text": "Zmanjša izgubo zdravja za 8%",
"_commentitemsother" : "OTHER ITEMS",
"healthPotionName" : "Zdravilni napoj",
"healthPotionNotes" : "Takoj povrne 15 točk pri zdravju",
"rerollName" : "Ponastavitev nalog",
"rerollNotes" : "Naloge spet postanejo rumene. To je uporabno, ko so vse naloge rdeče in je težko ostati živ.",
"rerollModelHeader" : "Ponastavi naloge",
"rerollModelText1" : "To močno odsvetujemo, saj rdeče naloge spodbujajo k izboljšavanju",
"rerollModelText2" : "beri naprej",
"rerollModelText3" : "Vendar pa to postane nujno po daljšem obdobju slabih navad.",
"_commentitemspeteggs": "PET EGGS",
"wolfEgg": "Mladi volk",
"tigerEgg": "Mladi tiger",
"pandaEgg": "Mladi panda",
"lionEgg": "Mladi lev",
"foxEgg": "Lisjak",
"pigEgg": "Leteči pujs",
"dragonEgg": "Zmaj",
"cactusEgg": "Kaktus",
"bearEgg": "Mladi medved",
"_commentitemshatchingpotions": "HATCHING POTIONS",
"basePotName": "Osnovni",
"basePotText" : "Iz jajca se izvali osnovna zverinica.",
"whitePotName": "Beli",
"whitePotText" : "Iz jajca se izvali bela zverinica.",
"desertPotName": "Puščavski",
"desertPotText" : "Iz jajca se izvali puščavska zverinica.",
"redPotName": "Rdeči",
"redPotText" : "Iz jajca se izvali rdeča zverinica.",
"shadePotName": "Senčni",
"shadePotText" : "Iz jajca se izvali senčna zverinica.",
"skeletonPotName": "Skeletni",
"skeletonPotText" : "Iz jajca se izvali skeletna zverinica.",
"zombiePotName": "Zombijski",
"zombiePotText" : "Iz jajca se izvali zombijska zverinica.",
"cottonPinkPotName": "Svetlo roza",
"cottonPinkPotText" : "Iz jajca se izvali svetlo roza zverinica.",
"cottonBluePotName": "Svetlo modri",
"cottonBluePotText" : "Iz jajca se izvali svetlo modra zverinica.",
"goldenPotName": "Zlati",
"goldenPotText" : "Iz jajca se izvali zlata zverinica.",
"_commentnpcsandchars": "NPCS & CHARACTERS",
"_commentNPCS" : "NPCS",
"NPCBaileyText1" : "mestna klicarka tukaj! Oznanjam nekaj novosti!",
"NPCAugustinText1" : "Dobrodošel v trgovini! Jaz sem trgovec;",
"NPCAugustinText2" : "Če si neznansko želiš neke zverinice, a nočeš čakati, da jo najdeš, jo lahko kupiš tukaj.",
"NPCJohanssonText1" : "Dobrodošel v gostilni! Jaz sem",
"NPCJohanssonText2": "točaj. Če hočeš malo počiti (Greš na počitnice? Si zbolel?), ti bom pripravil posteljo - v tem času ti neopravljene dnevne naloge ne bodo škodovale. Usedi se in spoznaj domačine.",
"NPCMelchiorText1" : "",
"NPCBowenText1" : "",
"NPCBochText1" : "",
"_commentdeathstuff" : "DEATH",
"deathTitle" : "Umrl si!",
"deathText" : "Izgubil si vso zlato, en level in en kos opreme. Pridno opravljaj dnevne naloge, da se to ne bo ponovilo!",
"_commentgems" : "GEMS",
"gems" : "Dragulji",
"outOfGems" : "Zmanjkalo dragljev",
"buyMoreGems" : "Kupi več draguljev",
"notEnoughGems" : "Nimaš dovolj draguljev",
"petsOutOfGems" : "Zmanjkalo ti je draguljev, s katerimi lahko kupiš posebne predmete! HabitRPG je odprtokodni projekt in tvoja pomoč je zelo dobrodošla - kupi več draguljev, da lahko dobiš to zverinico, s tem pa tudi pomagaš ustvarjalcem",
"gemsWhatFor" : "Z njimi lahko kupiš posebne predmete (ponastavitev nalog, jajca, valilni napoji itd.). Vendar pa moraš te funkcije najprej odkleniti.",
"_commentfooter": "FOOTER",
"footerCompany" : "Podjetje",
"companyAbout" : "O nas",
"companyBlog" : "Blog",
"companyTeam" : "Ekipa",
"companyExtensions" : "Podaljški",
"companyFAQ" : "Pogosta vprašanja",
"footerLegal" : "Pravno obvestilo",
"legalPrivacy" : "Varovanje podatkov",
"legalTerms" : "Pravni pogoji",
"footerCommunity" : "Skupnost",
"communityBugs" : "Oddaj poročilo o hrošču",
"communityFeatures" : "Zahtevaj novo funkcijo",
"communityExtensions" : "Dodatki / Podaljški",
"communityForum" : "Forum",
"footerSocial" : "Družbena omrežja",
"_commentmisc": "MISC & GLOBAL",
"removeAds": "Odstrani reklame",
"whyAds": "Zakaj reklame?",
"whyAdsContent1": "HabitRPG je odprtokodni projekt in tvoja pomoč je zelo dobrodošla - z donacijo pomagaš ustvarjalcem, prejmeš pa tudi 20 draguljev, s katerimi lahko kupiš posebne predmete.",
"whyAdsContent2": "'Podprl sem vas pri Kickstarterju!' - sledi",
"whyAdsContent3": "tem navodilom",
"_commentbuttons": "BUTTONS",
"submit":"Pošlji",
"close":"Zapri",
"saveAndClose": "Shrani in zapri",
"cancel":"Prekliči",
"ok" : "V redu",
"add" : "Dodaj",
"undo" : "Razveljavi",
"continue" : "Nadaljuj",
"accept" : "Sprejmi",
"reject" : "Prekliči",
"or" : "Ali",
"_commenttimestamps":"TIME STAMPS",
"justNow":"Pravkar",
"aMinuteAgo":"Pred eno minuto",
"minutesAgo":"minut nazaj",
"anHourAgo": "Pred eno uro",
"hoursAgo": "ur nazaj",
"yesterday":"Včeraj",
"daysAgo":"dni nazaj"
}

View File

@@ -132,6 +132,10 @@
"hair": "Волосся", "hair": "Волосся",
"skin": "Кожа", "skin": "Кожа",
"clothing" : "Одяг", "clothing" : "Одяг",
"showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "Посилання на фото", "photoUrl": "Посилання на фото",
"fullName": "Повне ім'я", "fullName": "Повне ім'я",
"blurb": "Про себе", "blurb": "Про себе",

View File

@@ -131,6 +131,10 @@
"hair": "بال", "hair": "بال",
"skin": "Skin", "skin": "Skin",
"clothing" : "Clothing", "clothing" : "Clothing",
"showArmor": "Show Armor",
"other": "Other",
"showWeapon": "Show Weapon",
"showShield": "Show Shield",
"photoUrl": "Photo Url", "photoUrl": "Photo Url",
"fullName": "Full Name", "fullName": "Full Name",
"blurb": "Blurb", "blurb": "Blurb",

View File

@@ -1,31 +1,36 @@
db.users.find({},{backer: 1, items:1}).forEach(function(user){ db.users.find(
user.items = { {$where: "Array.isArray(this.items.pets) || Array.isArray(this.items.eggs) || Array.isArray(this.items.hatchingPotions)"},
armor: +user.items.armor || 0, {backer: 1, items:1}
weapon: +user.items.weapon || 0, ).forEach(function(user){
head: +user.items.head || 0,
shield: +user.items.shield || 0,
pets: _.reduce(user.items.pets, function(m,v){ m[v] = 5; return m;}, {}), if (_.isArray(user.items.pets)) {
currentPet: user.items.currentPet ? user.items.currentPet.str : '', user.items.pets = _.reduce(user.items.pets, function(m,v){ m[v] = 5; return m;}, {});
eggs: _.reduce(user.items.eggs, function(m,v){ }
if (!_.isString(user.items.currentPet)) {
user.items.currentPet = user.items.currentPet ? user.items.currentPet.str : '';
}
if (_.isArray(user.items.eggs)) {
user.items.eggs = _.reduce(user.items.eggs, function(m,v){
if (!m[v.name]) m[v.name] = 0; if (!m[v.name]) m[v.name] = 0;
m[v.name]++; m[v.name]++;
return m; return m;
}, {}), }, {});
}
hatchingPotions: _.reduce(user.items.hatchingPotions, function(m,v){ if (_.isArray(user.items.hatchingPotions)) {
user.items.hatchingPotions = _.reduce(user.items.hatchingPotions, function(m,v){
if (!m[v]) m[v] = 0; if (!m[v]) m[v] = 0;
m[v]++; m[v]++;
return m; return m;
}, {}), }, {});
}
food: {}, user.items.food = {};
user.items.mounts = {};
user.items.currentMount = '';
mounts: {},
currentMount: '',
lastDrop: user.items.lastDrop || {date: new Date(), count: 0}
};
if (user.backer && user.backer.tier && user.backer.tier >= 90) { if (user.backer && user.backer.tier && user.backer.tier >= 90) {
user.items.mounts['LionCub-Ethereal'] = true; user.items.mounts['LionCub-Ethereal'] = true;
} }

View File

@@ -0,0 +1,10 @@
//Add defaults to show gears in all users
db.users.update(
{},
{$set:{
'preferences.showWeapon': true,
'preferences.showShield': true,
'preferences.showArmor': true,
}},
{multi:true}
)

View File

@@ -0,0 +1,18 @@
// TODO figure out why this is happening in the first place
db.users.find({},{habits:1, dailys:1, todos:1, rewards:1}).forEach(function(user){
_.each(user.habits, function(task){
task.type = 'habit';
})
_.each(user.dailys, function(task){
task.type = 'daily';
})
_.each(user.todos, function(task){
task.type = 'todo';
})
_.each(user.rewards, function(task){
task.type = 'reward';
})
db.users.update({_id:user._id}, {$set:{habits: user.habits, dailys: user.dailys, todos: user.todos, rewards: user.rewards}});
});

View File

@@ -0,0 +1,12 @@
// once and for all!
db.users.find({'items.pets':{$exists:1}},{'items.pets':1}).forEach(function(user){
_.reduce(user.items.pets, function(m,v,k){
if (!k.indexOf('undefined')) m.push(k);
return m;
}, []).forEach(function(key){
delete user.items.pets[key];
})
db.users.update({_id:user._id}, { $set:{'items.pets':user.items.pets} });
});

View File

@@ -0,0 +1,13 @@
// Cleanup broken tags
// -------------------------
db.users.find().forEach(function(user){
var tasks = user.habits.concat(user.dailys).concat(user.todos).concat(user.rewards);
_.each(tasks, function(task){
_.each(task.tags, function(value, key){ //value is true, key is tag.id
if (!_.find(user.tags,{id:key})) delete task.tags[key];
});
});
db.users.update({_id:user._id}, user);
});

View File

@@ -0,0 +1,8 @@
//Add default to randomize party members list
db.users.update(
{},
{$set:{
'party.order': 'random',
}},
{multi:true}
)

View File

@@ -0,0 +1,5 @@
db.users.find({'preferences.dayStart':{$exists:1}},{'preferences.dayStart':1}).forEach(function(user){
var dayStart = +user.preferences.dayStart;
dayStart = (_.isNaN(dayStart) || dayStart < 0 || dayStart > 24) ? 0 : dayStart;
db.users.update({_id:user._id}, {$set:{'preferences.dayStart':dayStart}});
});

View File

@@ -0,0 +1 @@
db.users.update({},{$set:{'items.pets.Turkey-Base':5, 'flags.newStuff':true}}, {multi:true});

View File

@@ -0,0 +1,32 @@
// node .migrations/20131127_restore_dayStart.js
var mongo = require('mongoskin');
var _ = require('lodash');
var backupUsers = mongo.db('localhost:27017/habitrpg_old?auto_reconnect').collection('users');
var liveUsers = mongo.db('localhost:27017/habitrpg_new?auto_reconnect').collection('users');
var query = {'preferences.dayStart':{$exists:1,$ne:0}};
var select = {'preferences.dayStart': 1};
backupUsers.count(query, function(err, count){
if (err) return console.error(err);
backupUsers.findEach(query, select, {batchSize:20}, function(err, before){
if (err) return console.error(err);
if (!before) { count--; return console.log('!before'); }
liveUsers.findById(before._id, function(err, after){
if (err) return console.error(err);
if (!after) { count--; return console.log(before._id + ' deleted?'); }
var dayStart = +before.preferences.dayStart;
if (after.preferences.dayStart == 0 && dayStart != 0){
dayStart = (_.isNaN(dayStart) || dayStart < 0 || dayStart > 24) ? 0 : dayStart;
} else {
dayStart = after.preferences.dayStart;
}
liveUsers.update({_id:after._id}, {$inc:{_v:1}, $set:{'preferences.dayStart':dayStart}});
if (--count <= 0) console.log("DONE!");
})
});
});

View File

@@ -11,7 +11,7 @@
"express": "*", "express": "*",
"gzippo": "*", "gzippo": "*",
"guid": "*", "guid": "*",
"moment": "*", "moment": "~2.4.0",
"stripe": "*", "stripe": "*",
"coffee-script": "*", "coffee-script": "*",
"nconf": "*", "nconf": "*",
@@ -19,7 +19,6 @@
"superagent": "~0.12.4", "superagent": "~0.12.4",
"resolve": "~0.2.3", "resolve": "~0.2.3",
"expect.js": "~0.2.0", "expect.js": "~0.2.0",
"relative-date": "~1.1.1",
"lodash": "~2.2.1", "lodash": "~2.2.1",
"async": "~0.2.9", "async": "~0.2.9",
"optimist": "~0.5.2", "optimist": "~0.5.2",
@@ -43,7 +42,9 @@
"nodemailer": "~0.5.2", "nodemailer": "~0.5.2",
"grunt-cli": "~0.1.9", "grunt-cli": "~0.1.9",
"paypal-ipn": "~1.0.1", "paypal-ipn": "~1.0.1",
"express-csv": "~0.6.0" "express-csv": "~0.6.0",
"pretty-data": "git://github.com/vkiryukhin/pretty-data#master",
"js2xmlparser": "~0.1.2"
}, },
"private": true, "private": true,
"subdomain": "habitrpg", "subdomain": "habitrpg",
@@ -76,6 +77,7 @@
"karma-chai-plugins": "~0.1.0", "karma-chai-plugins": "~0.1.0",
"mocha": "~1.12.1", "mocha": "~1.12.1",
"karma-mocha": "~0.1.0", "karma-mocha": "~0.1.0",
"csv": "~0.3.6" "csv": "~0.3.6",
"mongoskin": "~0.6.1"
} }
} }

View File

@@ -91,3 +91,6 @@ future re: pets and whatnot, this is just temporary.
.character-sprites span, .pet .character-sprites span, .pet
position: absolute position: absolute
.herobox.isLeader
background: $better

View File

@@ -22,7 +22,7 @@ menu
line-height: 2 line-height: 2
.customize-option .customize-option
border: 1px solid grey; border: 0px solid grey;
background-color: hsl(0, 0%, 93%); background-color: hsl(0, 0%, 93%);
margin-bottom: 10px margin-bottom: 10px

View File

@@ -23,3 +23,14 @@
.tag-editing .tag-editing-pill .tag-editing .tag-editing-pill
height:auto height:auto
.tag-list
overflow-y: auto
white-space: nowrap
.nav-pills
height: 43px
li
display: inline-block
float: none

View File

@@ -12,6 +12,10 @@
position relative position relative
height 250px height 250px
.chat-form
position: relative
z-index: 10
.tavern-chat, .party-chat .tavern-chat, .party-chat
li li
@@ -19,6 +23,7 @@
padding-bottom:15px padding-bottom:15px
border-bottom 1px solid #ddd border-bottom 1px solid #ddd
word-wrap:break-word word-wrap:break-word
position:relative
&.highlight &.highlight
background #EEE background #EEE
@@ -26,10 +31,43 @@
label label
margin-right:5px margin-right:5px
.float-label
float:left
position:absolute
top:17px;
.hidden-label
visibility:hidden
.scrollable-message
max-height:80px
overflow-y:auto
.expander
float: right
position: absolute
bottom: 18px
right: 20px
background: white
max-width: 20px
max-height: 20px
width: 100%
height: 100%
text-align: center
.own-message .own-message
border-left: 4px solid #333 border-left: 4px solid #333
padding-left: 2px padding-left: 2px
markdown
p:first-child
display:inline
img
max-height:50px
vertical-align:top
// Name tags // Name tags
.label-contributor-1, .label-contributor-2 .label-contributor-1, .label-contributor-2
background-color: #333; background-color: #333;

View File

@@ -7,6 +7,7 @@
@import "../bower_components/bootstrap/docs/assets/css/bootstrap-responsive.css" @import "../bower_components/bootstrap/docs/assets/css/bootstrap-responsive.css"
@import "../bower_components/bootstrap-tour/build/css/bootstrap-tour.min.css" @import "../bower_components/bootstrap-tour/build/css/bootstrap-tour.min.css"
@import "../bower_components/angular-loading-bar/build/loading-bar.css" @import "../bower_components/angular-loading-bar/build/loading-bar.css"
@import "../bower_components/js-emoji/emoji.css"
// Custom includes // Custom includes
@import "./tasks.styl" @import "./tasks.styl"
@@ -66,6 +67,11 @@ hr
margin-right: 10px; margin-right: 10px;
} }
/* Bootstrap overrides */
div.tooltip-inner {
max-width: 300px;
}
/* Customizations to make footer sticky */ /* Customizations to make footer sticky */
/*html, body {height: 100%;}*/ /*html, body {height: 100%;}*/
#wrap #wrap
@@ -159,7 +165,6 @@ hr
position absolute position absolute
bottom 0px bottom 0px
right 0px right 0px
background-color #dfe9ea
padding 1px 3px 1px 3px padding 1px 3px 1px 3px
a a

View File

@@ -109,6 +109,8 @@ menu button[class*="Pet_Food_"]
// This adds feeding progress bars to pets. If we have any issues with `menu.pets > button`, revisit // This adds feeding progress bars to pets. If we have any issues with `menu.pets > button`, revisit
menu.pets .customize-menu menu.pets .customize-menu
width: 100%
button button
position: relative position: relative
.progress .progress

View File

@@ -14,8 +14,8 @@
height: 72px height: 72px
float:left float:left
.NPC-Bailey-Head .NPC-Bailey-Head
background-position: -168px -42px background-position: -162px -42px
width: 54px width: 60px
height: 30px height: 30px
position: absolute position: absolute
top: 117px // 147 (header-height) - 30 (bailey height) top: 117px // 147 (header-height) - 30 (bailey height)

View File

@@ -2,6 +2,15 @@
window.env = window.env || {}; //FIX tests window.env = window.env || {}; //FIX tests
if(window.env.language && window.env.language.momentLang && window.env.language.momentLangCode){
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.text = window.env.language.momentLang;
head.appendChild(script);
moment.lang(window.env.language.momentLangCode);
}
window.env.t = function(string){ window.env.t = function(string){
return (window.env.translations[string] || window.env.translations.stringNotFound); return (window.env.translations[string] || window.env.translations.stringNotFound);
} }
@@ -9,7 +18,7 @@ window.env.t = function(string){
window.habitrpg = angular.module('habitrpg', window.habitrpg = angular.module('habitrpg',
['ngResource', 'ngSanitize', 'userServices', 'groupServices', 'memberServices', 'challengeServices', ['ngResource', 'ngSanitize', 'userServices', 'groupServices', 'memberServices', 'challengeServices',
'sharedServices', 'authServices', 'notificationServices', 'guideServices', 'sharedServices', 'authServices', 'notificationServices', 'guideServices',
'ui.bootstrap', 'ui.keypress', 'ui.router', 'chieffancypants.loadingBar', 'At']) 'ui.bootstrap', 'ui.keypress', 'ui.router', 'chieffancypants.loadingBar', 'At', 'pasvaz.bindonce'])
// @see https://github.com/angular-ui/ui-router/issues/110 and https://github.com/HabitRPG/habitrpg/issues/1705 // @see https://github.com/angular-ui/ui-router/issues/110 and https://github.com/HabitRPG/habitrpg/issues/1705
// temporary hack until they have a better solution // temporary hack until they have a better solution

View File

@@ -65,6 +65,8 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A
} }
// We watch Members.selectedMember because it's asynchronously set, so would be a hassle to handle updates here // We watch Members.selectedMember because it's asynchronously set, so would be a hassle to handle updates here
$scope.$watch( function() { return Members.selectedMember; }, function (member) { $scope.$watch( function() { return Members.selectedMember; }, function (member) {
if(member)
member.petCount = window.habitrpgShared.helpers.countPets(null, member.items.pets);
$scope.profile = member; $scope.profile = member;
}); });
} }
@@ -129,6 +131,24 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A
$scope.message = {content:''}; $scope.message = {content:''};
$scope._sending = false; $scope._sending = false;
$scope.isUserMentioned = function(user, message) {
if(message.hasOwnProperty("highlight"))
return message.highlight;
message.highlight = false;
var messagetext = message.text.toLowerCase();
var username = user.profile.name;
var mentioned = messagetext.indexOf(username.toLowerCase());
var pattern = username+"([^\w]|$){1}";
if(mentioned > -1) {
var preceedingchar = messagetext.substring(mentioned-1,mentioned);
if(mentioned == 0 || preceedingchar.trim() == '' || preceedingchar == '@'){
var regex = new RegExp(pattern,'i');
message.highlight = regex.test(messagetext);
}
}
return message.highlight;
}
$scope.postChat = function(group, message){ $scope.postChat = function(group, message){
if (_.isEmpty(message) || $scope._sending) return; if (_.isEmpty(message) || $scope._sending) return;
$scope._sending = true; $scope._sending = true;
@@ -162,6 +182,14 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A
group.$get(); group.$get();
} }
// List of Ordering options for the party members list
$scope.partyOrderChoices = {
'level': 'Sort by Level',
'random': 'Sort randomly',
'pets': 'Sort by number of pets',
'party_date_joined': 'Sort by Party date joined',
};
}]) }])
.controller("GuildsCtrl", ['$scope', 'Groups', 'User', '$rootScope', '$state', '$location', .controller("GuildsCtrl", ['$scope', 'Groups', 'User', '$rootScope', '$state', '$location',
@@ -172,8 +200,10 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A
} }
$scope.type = 'guild'; $scope.type = 'guild';
$scope.text = 'Guild'; $scope.text = 'Guild';
$scope.newGroup = new Groups.Group({type:'guild', privacy:'private', leader: User.user._id, members: [User.user._id]}); var newGroup = function(){
return new Groups.Group({type:'guild', privacy:'private', leader: User.user._id, members: [User.user._id]});
}
$scope.newGroup = newGroup()
$scope.create = function(group){ $scope.create = function(group){
if (User.user.balance < 1) return $rootScope.modals.buyGems = true; if (User.user.balance < 1) return $rootScope.modals.buyGems = true;
@@ -183,6 +213,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Groups', '$http', 'A
$scope.groups.guilds.push(saved); $scope.groups.guilds.push(saved);
if(saved.privacy === 'public') $scope.groups.public.push(saved); if(saved.privacy === 'public') $scope.groups.public.push(saved);
$state.go('options.social.guilds.detail', {gid: saved._id}); $state.go('options.social.guilds.detail', {gid: saved._id});
$scope.newGroup = newGroup();
}); });
} }
} }

View File

@@ -2,10 +2,31 @@
habitrpg.controller("HeaderCtrl", ['$scope', 'Groups', 'User', habitrpg.controller("HeaderCtrl", ['$scope', 'Groups', 'User',
function($scope, Groups, User) { function($scope, Groups, User) {
$scope.party = Groups.party(function(){ $scope.party = Groups.party(function(){
$scope.partyMinusSelf = _.filter($scope.party.members, function(member){ $scope.partyMinusSelf = _.sortBy(
_.filter($scope.party.members, function(member){
return member._id !== User.user._id; return member._id !== User.user._id;
}); }),
function (member) {
switch(User.user.party.order)
{
case 'level':
return member.stats.lvl;
break;
case 'random':
return Math.random();
break;
case 'pets':
return member.items.pets.length;
break;
default:
// party date joined
return true;
}
}
).reverse()
}); });
} }
]); ]);

View File

@@ -7,13 +7,11 @@ habitrpg.controller("InventoryCtrl", ['$rootScope', '$scope', 'User', 'API_URL',
$scope.selectedEgg = null; // {index: 1, name: "Tiger", value: 5} $scope.selectedEgg = null; // {index: 1, name: "Tiger", value: 5}
$scope.selectedPotion = null; // {index: 5, name: "Red", value: 3} $scope.selectedPotion = null; // {index: 5, name: "Red", value: 3}
$scope.petCount = _.size(User.user.items.pets);
$scope.totalPets = _.size($scope.Items.eggs) * _.size($scope.Items.hatchingPotions); $scope.totalPets = _.size($scope.Items.eggs) * _.size($scope.Items.hatchingPotions);
// count egg, food, hatchingPotion stack totals // count egg, food, hatchingPotion stack totals
var countStacks = function(items) { return _.reduce(items,function(m,v){return m+v;},0);} var countStacks = function(items) { return _.reduce(items,function(m,v){return m+v;},0);}
$scope.$watch('user.items.pets', function(pets){ $scope.petCount = $rootScope.countExists(pets); }, true);
$scope.$watch('user.items.mounts', function(mounts){ $scope.mountCount = $rootScope.countExists(mounts); }, true); $scope.$watch('user.items.mounts', function(mounts){ $scope.mountCount = $rootScope.countExists(mounts); }, true);
$scope.$watch('user.items.eggs', function(eggs){ $scope.eggCount = countStacks(eggs); }, true); $scope.$watch('user.items.eggs', function(eggs){ $scope.eggCount = countStacks(eggs); }, true);
$scope.$watch('user.items.hatchingPotions', function(pots){ $scope.potCount = countStacks(pots); }, true); $scope.$watch('user.items.hatchingPotions', function(pots){ $scope.potCount = countStacks(pots); }, true);

View File

@@ -29,7 +29,13 @@ habitrpg.controller('NotificationCtrl',
}); });
$rootScope.$watch('user._tmp.drop', function(after, before){ $rootScope.$watch('user._tmp.drop', function(after, before){
// won't work when getting the same item twice?
if (after == before || !after) return; if (after == before || !after) return;
var type = after.type === 'HatchingPotion' ? 'hatchingPotions' : (after.type.toLowerCase() + 's')
if(!User.user.items[type][after.name]){
User.user.items[type][after.name] = 0;
}
User.user.items[type][after.name]++;
$rootScope.modals.drop = true; $rootScope.modals.drop = true;
}); });
@@ -44,10 +50,11 @@ habitrpg.controller('NotificationCtrl',
}); });
$rootScope.$watch('user.items.pets', function(after, before){ $rootScope.$watch('user.items.pets', function(after, before){
if(_.size(after) === _.size(before) || _.size(after) < 90) return; if(_.size(after) === _.size(before) ||
window.habitrpgShared.helpers.countPets(null, after) < 90) return;
User.user.achievements.beastMaster = true; User.user.achievements.beastMaster = true;
$rootScope.modals.achievements.beastMaster = true; $rootScope.modals.achievements.beastMaster = true;
}) }, true);
/*_.each(['weapon', 'head', 'chest', 'shield'], function(watched){ /*_.each(['weapon', 'head', 'chest', 'shield'], function(watched){
$rootScope.$watch('user.items.' + watched, function(before, after){ $rootScope.$watch('user.items.' + watched, function(before, after){

View File

@@ -21,9 +21,25 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$
return haystack && ~haystack.indexOf(needle); return haystack && ~haystack.indexOf(needle);
} }
// styling helpers
$scope.userLevelStyle = function(user,style){
style = style || '';
if(user && user.backer && user.backer.npc)
style += ' label-npc';
if(user && user.contributor && user.contributor.level)
style += ' label-contributor-'+user.contributor.level;
return style;
}
// count pets, mounts collected totals, etc // count pets, mounts collected totals, etc
$rootScope.countExists = function(items) {return _.reduce(items,function(m,v){return m+(v?1:0)},0)} $rootScope.countExists = function(items) {return _.reduce(items,function(m,v){return m+(v?1:0)},0)}
$rootScope.petCount = window.habitrpgShared.helpers.countPets(null, User.user.items.pets);
$rootScope.$watch('user.items.pets', function(pets){
$rootScope.petCount = window.habitrpgShared.helpers.countPets($rootScope.countExists(pets), User.user.items.pets);
}, true);
$scope.safeApply = function(fn) { $scope.safeApply = function(fn) {
var phase = this.$root.$$phase; var phase = this.$root.$$phase;
if(phase == '$apply' || phase == '$digest') { if(phase == '$apply' || phase == '$digest') {

View File

@@ -27,10 +27,11 @@ habitrpg.controller('SettingsCtrl',
$scope.saveDayStart = function(){ $scope.saveDayStart = function(){
var dayStart = +User.user.preferences.dayStart; var dayStart = +User.user.preferences.dayStart;
if (dayStart < 0 || dayStart > 24) { if (_.isNaN(dayStart) || dayStart < 0 || dayStart > 24) {
dayStart = 0; dayStart = 0;
return alert('Please enter a number between 0 and 24');
} }
User.log({'op':'set', data:{'preferences.dayStart': dayStart}}); User.set('preferences.dayStart', dayStart);
} }
$scope.language = window.env.language; $scope.language = window.env.language;
@@ -40,7 +41,7 @@ habitrpg.controller('SettingsCtrl',
$rootScope.$on('userSynced', function(){ $rootScope.$on('userSynced', function(){
location.reload(); location.reload();
}); });
User.set('preferences.language', $scope.language); User.set('preferences.language', $scope.language.code);
} }
$scope.reroll = function(){ $scope.reroll = function(){

View File

@@ -6,7 +6,7 @@ habitrpg.controller("TasksCtrl", ['$scope', '$rootScope', '$location', 'User', '
$scope.score = function(task, direction) { $scope.score = function(task, direction) {
if (task.type === "reward" && User.user.stats.gp < task.value){ if (task.type === "reward" && User.user.stats.gp < task.value){
return Notification.text('Not enough GP.'); return Notification.text('Not enough Gold!');
} }
Algos.score(User.user, task, direction); Algos.score(User.user, task, direction);
User.log({op: "score",data: task, dir: direction}); User.log({op: "score",data: task, dir: direction});
@@ -120,7 +120,7 @@ habitrpg.controller("TasksCtrl", ['$scope', '$rootScope', '$location', 'User', '
Notification.text("Item purchased."); Notification.text("Item purchased.");
updateStore(); updateStore();
} else { } else {
Notification.text("Not enough GP."); Notification.text("Not enough Gold!");
} }
}; };

View File

@@ -6,9 +6,6 @@ habitrpg.controller("UserCtrl", ['$rootScope', '$scope', '$location', 'User', '$
$scope.hideUserAvatar = function() { $scope.hideUserAvatar = function() {
$(".userAvatar").hide(); $(".userAvatar").hide();
}; };
$scope.toggleHelm = function(val){
User.log({op:'set', data:{'preferences.showHelm':val}});
}
$scope.$watch('_editing.profile', function(value){ $scope.$watch('_editing.profile', function(value){
if(value === true) $scope.editingProfile = angular.copy(User.user.profile); if(value === true) $scope.editingProfile = angular.copy(User.user.profile);

View File

@@ -82,13 +82,64 @@ habitrpg.directive('habitrpgSortable', ['User', function(User) {
// } // }
}); });
emoji.img_path = 'bower_components/habitrpg-shared/img/emoji/unicode/';
var toHtml = function (markdown) { var toHtml = function (markdown) {
if (markdown == undefined) if (markdown == undefined)
return ''; return '';
return marked(markdown); markdown = marked(markdown);
markdown = emoji.replace_colons(markdown);
markdown = emoji.replace_unified(markdown);
return markdown;
}; };
// [nickgordon20131123] this hacky override wraps images with a link to the image in a new window, and also adds some classes in case we want to style
marked.InlineLexer.prototype.outputLink = function(cap, link) {
var escape = function(html, encode) {
return html
.replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#39;');
};
if (cap[0].charAt(0) !== '!') {
return '<a class="markdown-link" href="'
+ escape(link.href)
+ '"'
+ (link.title
? ' title="'
+ escape(link.title)
+ '"'
: '')
+ '>'
+ this.output(cap[1])
+ '</a>';
} else {
return '<a class="markdown-img-link" href="'
+ escape(link.href)
+ '"'
+ (link.title
? ' title="'
+ escape(link.title)
+ '"'
: '')
+ '><img class="markdown-img" src="'
+ escape(link.href)
+ '" alt="'
+ escape(cap[1])
+ '"'
+ (link.title
? ' title="'
+ escape(link.title)
+ '"'
: '')
+ '></a>';
}
}
//hljs.tabReplace = ' '; //hljs.tabReplace = ' ';
return { return {
@@ -102,7 +153,9 @@ habitrpg.directive('habitrpgSortable', ['User', function(User) {
link: function(scope, element, attrs) { link: function(scope, element, attrs) {
scope.$watch(attrs.ngModel, function(value, oldValue) { scope.$watch(attrs.ngModel, function(value, oldValue) {
var markdown = value; var markdown = value;
var linktarget = attrs.target || '_self';
var html = md.toHtml(markdown); var html = md.toHtml(markdown);
html = html.replace(' href','target="'+linktarget+'" href');
element.html(html); element.html(html);
}); });
} }
@@ -153,3 +206,16 @@ habitrpg
} }
}]); }]);
habitrpg.directive('fromNow', ['$interval', function($interval){
return function(scope, element, attr){
var updateText = function(){ element.text(moment(scope.message.timestamp).fromNow()) };
updateText();
// Update the counter every 60secs if was sent less than one hour ago otherwise every hour
// OPTIMIZATION, every time the interval is run, update the interval time
var intervalTime = moment().diff(scope.message.timestamp, 'minute') < 60 ? 60000 : 3600000;
var interval = $interval(function(){ updateText() }, intervalTime, false);
scope.$on('$destroy', function() {
$interval.cancel(interval);
});
}
}]);

View File

@@ -65,13 +65,14 @@ angular.module('userServices', []).
// the user has been modified from another application, sync up // the user has been modified from another application, sync up
if(data.wasModified) { if(data.wasModified) {
delete data.wasModified; delete data.wasModified;
_.extend(user, data);
$rootScope.$emit('userUpdated', user); $rootScope.$emit('userUpdated', user);
} }
// Update user
_.extend(user, data);
// Emit event when user is synced // Emit event when user is synced
$rootScope.$emit('userSynced'); $rootScope.$emit('userSynced');
user._v = data._v;
} }
sent.length = 0; sent.length = 0;
settings.fetching = false; settings.fetching = false;

View File

@@ -15,6 +15,8 @@
"bower_components/angular-loading-bar/build/loading-bar.js", "bower_components/angular-loading-bar/build/loading-bar.js",
"bower_components/Angular-At-Directive/src/at.js", "bower_components/Angular-At-Directive/src/at.js",
"bower_components/Angular-At-Directive/src/caret.js", "bower_components/Angular-At-Directive/src/caret.js",
"bower_components/angular-bindonce/bindonce.js",
"bower_components/js-emoji/emoji.js",
"bower_components/bootstrap/docs/assets/js/bootstrap.js", "bower_components/bootstrap/docs/assets/js/bootstrap.js",
"bower_components/angular-bootstrap/ui-bootstrap.js", "bower_components/angular-bootstrap/ui-bootstrap.js",

View File

@@ -1,8 +1,12 @@
var _ = require('lodash'); var _ = require('lodash');
var csv = require('express-csv'); var csv = require('express-csv');
var express = require('express');
var nconf = require('nconf'); var nconf = require('nconf');
var moment = require('moment'); var moment = require('moment');
var dataexport = module.exports; var dataexport = module.exports;
var js2xmlparser = require("js2xmlparser");
var pd = require('pretty-data').pd;
var User = require('../models/user').model;
/* /*
@@ -25,3 +29,58 @@ dataexport.history = function(req, res) {
}); });
return res.csv(output); return res.csv(output);
} }
var userdata = function(user) {
if(user.auth && user.auth.local) {
delete user.auth.local.salt;
delete user.auth.local.hashed_password;
}
return user;
}
dataexport.leanuser = function(req, res, next) {
var user = res.locals.user;
User.findOne({_id: user._id,}).lean().exec(function(err, user) {
if (err) return res.json(500, {err: err});
if (_.isEmpty(user)) return res.json(401, NO_USER_FOUND);
res.locals.user = user;
return next();
});
};
dataexport.userdata = {
xml: function(req, res) {
var user = userdata(res.locals.user);
return res.xml({data: JSON.stringify(user), rootname: 'user'});
},
json: function(req, res) {
var user = userdata(res.locals.user);
return res.jsonstring(user);
},
}
/*
------------------------------------------------------------------------
Express Extensions (should be refactored into a module)
------------------------------------------------------------------------
*/
var expressres = express.response || http.ServerResponse.prototype;
expressres.xml = function(obj, headers, status) {
var body = '';
this.charset = this.charset || 'utf-8';
this.header('Content-Type', 'text/xml');
this.header('Content-Disposition', 'attachment');
body = pd.xml(js2xmlparser(obj.rootname,obj.data));
return this.send(body, headers, status);
};
expressres.jsonstring = function(obj, headers, status) {
var body = '';
this.charset = this.charset || 'utf-8';
this.header('Content-Type', 'application/json');
this.header('Content-Disposition', 'attachment');
body = pd.json(JSON.stringify(obj));
return this.send(body, headers, status);
};

View File

@@ -470,11 +470,13 @@ api.deleteTag = function(req, res){
delete task.tags[tag.id]; delete task.tags[tag.id];
}) })
}) })
user.markModified('habits');
user.markModified('dailys');
user.markModified('todos');
user.markModified('rewards');
user.save(function(err,saved){ user.save(function(err,saved){
if (err) return res.json(500, {err: err}); if (err) return res.json(500, {err: err});
// Need to use this until we found a way to update the ui for tasks when a tag is deleted res.send(204);
res.locals.wasModified = true;
res.send(200);
}); });
} else { } else {
res.json(400, {err:'Tag not found'}); res.json(400, {err:'Tag not found'});
@@ -628,10 +630,9 @@ api.batchUpdate = function(req, res, next) {
if (err) return res.json(500, {err: err}); if (err) return res.json(500, {err: err});
var response = user.toJSON(); var response = user.toJSON();
response.wasModified = res.locals.wasModified; response.wasModified = res.locals.wasModified;
if (response._tmp && response._tmp.drop) response.wasModified = true; if (response._tmp && response._tmp.drop){
res.json(200, {_tmp: {drop: response._tmp.drop}, _v: response._v});
// Send the response to the server }else if(response.wasModified){
if(response.wasModified){
res.json(200, response); res.json(200, response);
}else{ }else{
res.json(200, {_v: response._v}); res.json(200, {_v: response._v});

View File

@@ -106,6 +106,26 @@ var avalaibleLanguages = _.map(langCodes, function(langCode){
} }
}); });
// Load MomentJS localization files
var momentLangs = {};
// Handle different language codes from MomentJS and /locales
var momentLangsMapping = {
'en': 'en-gb',
'no': 'nn'
};
_.each(langCodes, function(code){
var lang = _.find(avalaibleLanguages, {code: code});
lang.momentLangCode = (momentLangsMapping[code] || code);
try{
var momentLang = momentLangsMapping[code] ? momentLangsMapping[code] : code;
// MomentJS lang files are JS files that has to be executed in the browser so we load them as plain text files
var f = fs.readFileSync(path.join(__dirname, '/../node_modules/moment/lang/' + lang.momentLangCode + '.js'), 'utf8');
lang.momentLang = f;
}catch (e){}
});
var getUserLanguage = function(req, callback){ var getUserLanguage = function(req, callback){
var getFromBrowser = function(){ var getFromBrowser = function(){
var acceptable = _(req.acceptedLanguages).map(function(lang){ var acceptable = _(req.acceptedLanguages).map(function(lang){

View File

@@ -21,6 +21,8 @@ var eggPotionMapping = _.transform(items.items.eggs, function(m, egg){
})); }));
}) })
var specialPetsMapping = items.items.specialPets; // may need to revisit if we add additional information about the special pets
var UserSchema = new Schema({ var UserSchema = new Schema({
// ### UUID and API Token // ### UUID and API Token
_id: { _id: {
@@ -121,7 +123,6 @@ var UserSchema = new Schema({
}, },
// -------------- Animals ------------------- // -------------- Animals -------------------
// Complex bit here. The result looks like: // Complex bit here. The result looks like:
// pets: { // pets: {
// 'Wolf-Desert': 0, // 0 means does not own // 'Wolf-Desert': 0, // 0 means does not own
@@ -133,11 +134,7 @@ var UserSchema = new Schema({
// First transform to a 1D eggs/potions mapping // First transform to a 1D eggs/potions mapping
_.transform(eggPotionMapping, function(m,v,k){ m[k] = Number; }), _.transform(eggPotionMapping, function(m,v,k){ m[k] = Number; }),
// Then add additional pets (backer, contributor) // Then add additional pets (backer, contributor)
{ _.transform(specialPetsMapping, function(m,v,k){ m[k] = Number; })
'Wolf-Veteran': Number,
'Wolf-Cerberus': Number,
'Dragon-Hydra': Number
}
), ),
currentPet: String, // Cactus-Desert currentPet: String, // Cactus-Desert
@@ -192,7 +189,8 @@ var UserSchema = new Schema({
current: String, // party._id current: String, // party._id
invitation: String, // party._id invitation: String, // party._id
lastMessageSeen: String, lastMessageSeen: String,
leader: Boolean leader: Boolean,
order: {type:String, 'default':'level'}
}, },
preferences: { preferences: {
armorSet: String, armorSet: String,
@@ -205,6 +203,9 @@ var UserSchema = new Schema({
}, },
hideHeader: {type:Boolean, 'default':false}, hideHeader: {type:Boolean, 'default':false},
showHelm: {type:Boolean, 'default':true}, showHelm: {type:Boolean, 'default':true},
showWeapon: {type:Boolean, 'default':true},
showShield: {type:Boolean, 'default':true},
showArmor: {type:Boolean, 'default':true},
skin: {type:String, 'default':'white'}, skin: {type:String, 'default':'white'},
timezoneOffset: Number, timezoneOffset: Number,
language: String, language: String,
@@ -286,6 +287,9 @@ UserSchema.virtual('tasks').get(function () {
UserSchema.pre('save', function(next) { UserSchema.pre('save', function(next) {
//this.markModified('tasks'); //this.markModified('tasks');
if (_.isNaN(this.preferences.dayStart) || this.preferences.dayStart < 0 || this.preferences.dayStart > 24) {
this.preferences.dayStart = 0;
}
if (!this.profile.name) { if (!this.profile.name) {
var fb = this.auth.facebook; var fb = this.auth.facebook;
@@ -299,7 +303,11 @@ UserSchema.pre('save', function(next) {
// Actually, can this be used as an attr default? (schema {type: ..., 'default': function(){}}) // Actually, can this be used as an attr default? (schema {type: ..., 'default': function(){}})
this.stats.points = this.stats.lvl - (this.stats.def + this.stats.str + this.stats.per + this.stats.int); this.stats.points = this.stats.lvl - (this.stats.def + this.stats.str + this.stats.per + this.stats.int);
var petCount = _.reduce(this.items.pets,function(m,v){return m+(v ? 1 : 0);},0); var petCount = helpers.countPets(_.reduce(this.items.pets,function(m,v){
//HOTFIX - Remove when solution is found, the first argument passed to reduce is a function
if(_.isFunction(v)) return m;
return m+(v?1:0)},0), this.items.pets);
this.achievements.beastMaster = petCount >= 90; this.achievements.beastMaster = petCount >= 90;
//our own version incrementer //our own version incrementer
@@ -316,7 +324,9 @@ UserSchema.methods.syncScoreToChallenge = function(task, delta){
var t = chal.tasks[task.id]; var t = chal.tasks[task.id];
if (!t) return chal.syncToUser(self); // this task was removed from the challenge, notify user if (!t) return chal.syncToUser(self); // this task was removed from the challenge, notify user
t.value += delta; t.value += delta;
if (t.type == 'habit' || t.type == 'daily') {
t.history.push({value: t.value, date: +new Date}); t.history.push({value: t.value, date: +new Date});
}
chal.save(); chal.save();
}); });
} }

View File

@@ -6,5 +6,7 @@ var nconf = require('nconf');
/* Data export */ /* Data export */
router.get('/history.csv',auth.authWithSession,dataexport.history); //[todo] encode data output options in the data controller and use these to build routes router.get('/history.csv',auth.authWithSession,dataexport.history); //[todo] encode data output options in the data controller and use these to build routes
router.get('/userdata.xml',auth.authWithSession,dataexport.leanuser,dataexport.userdata.xml);
router.get('/userdata.json',auth.authWithSession,dataexport.leanuser,dataexport.userdata.json);
module.exports = router; module.exports = router;

View File

@@ -5,7 +5,7 @@ html(ng-app="habitrpg", ng-controller="RootCtrl", ng-class='{"applying-action":a
title HabitRPG | Your Life The Role Playing Game title HabitRPG | Your Life The Role Playing Game
// ?v=1 needed to force refresh // ?v=1 needed to force refresh
link(rel='shortcut icon' href='#{env.getBuildUrl("favicon.ico")}?v=2') link(rel='shortcut icon', href='#{env.getBuildUrl("favicon.ico")}?v=2')
script(type='text/javascript'). script(type='text/javascript').
window.env = !{JSON.stringify(env)}; window.env = !{JSON.stringify(env)};

View File

@@ -1,18 +1,18 @@
.filters(ng-controller='FiltersCtrl') .filters.tag-list(ng-controller='FiltersCtrl')
.pull-left.filter-description .pull-left.filter-description
| Tags: | Tags:
ul.nav.nav-pills ul.nav.nav-pills
li li
a(rel='tooltip', title='Edit Tags', ng-click='saveOrEdit()') a(rel='tooltip', title='Edit Tags', ng-click='saveOrEdit()')
i(ng-class='{"icon-ok": _editing, "icon-pencil": !_editing}') i(ng-class='{"icon-ok": _editing, "icon-pencil": !_editing}')
li(ng-class='{active: user.filters[tag.id]}', ng-repeat='tag in user.tags', style='position: relative;') li(bindonce='user.tags', ng-class='{active: user.filters[tag.id]}', ng-repeat='tag in user.tags', style='position: relative;')
.input-append.option-group.tag-editing(ng-show='_editing') .input-append.option-group.tag-editing(ng-show='_editing')
input.input.input-small.option-content.tag-editing-pill(type='text', ng-model='tag.name') input.input.input-small.option-content.tag-editing-pill(type='text', ng-model='tag.name')
span.add-on.tag-editing-pill span.add-on.tag-editing-pill
a.pull-right(ng-click='delete(tag,$index)') a.pull-right(ng-click='delete(tag,$index)')
i.icon-trash i.icon-trash
a(ng-hide='_editing', ng-click='toggleFilter(tag)') a(ng-hide='_editing', ng-click='toggleFilter(tag)')
i.icon-bullhorn(ng-if="tag.challenge") i.icon-bullhorn(bo-if="tag.challenge")
| {{tag.name}} | {{tag.name}}
li li
form.form-inline(ng-show='_editing', ng-submit='createTag(_newTag)') form.form-inline(ng-show='_editing', ng-submit='createTag(_newTag)')

View File

@@ -12,7 +12,7 @@ script(type='text/ng-template', id='partials/options.inventory.inventory.html')
li.customize-menu li.customize-menu
menu.pets-menu(label='Eggs ({{eggCount}})') menu.pets-menu(label='Eggs ({{eggCount}})')
p(ng-show='eggCount < 1') You don't have any eggs yet. p(ng-show='eggCount < 1') You don't have any eggs.
div(ng-repeat='(egg,points) in ownedItems(user.items.eggs)') div(ng-repeat='(egg,points) in ownedItems(user.items.eggs)')
//TODO move positioning this styling to css //TODO move positioning this styling to css
button.customize-option(popover='{{Items.eggs[egg].notes}}', popover-title='{{Items.eggs[egg].text}} Egg', popover-trigger='mouseenter', popover-placement='right', ng-click='chooseEgg(egg)', class='Pet_Egg_{{egg}}', ng-class='{selectableInventory: selectedPotion && !user.items.pets[egg+"-"+selectedPotion.name]}') button.customize-option(popover='{{Items.eggs[egg].notes}}', popover-title='{{Items.eggs[egg].text}} Egg', popover-trigger='mouseenter', popover-placement='right', ng-click='chooseEgg(egg)', class='Pet_Egg_{{egg}}', ng-class='{selectableInventory: selectedPotion && !user.items.pets[egg+"-"+selectedPotion.name]}')
@@ -21,7 +21,7 @@ script(type='text/ng-template', id='partials/options.inventory.inventory.html')
li.customize-menu li.customize-menu
menu.hatchingPotion-menu(label='Hatching Potions ({{potCount}})') menu.hatchingPotion-menu(label='Hatching Potions ({{potCount}})')
p(ng-show='potCount < 1') You don't have any hatching potions yet. p(ng-show='potCount < 1') You don't have any hatching potions.
div(ng-repeat='(pot,points) in ownedItems(user.items.hatchingPotions)') div(ng-repeat='(pot,points) in ownedItems(user.items.hatchingPotions)')
button.customize-option(popover='{{Items.hatchingPotions[pot].notes}}', popover-title='{{Items.hatchingPotions[pot].text}} Potion', popover-trigger='mouseenter', popover-placement='right', ng-click='choosePotion(pot)', class='Pet_HatchingPotion_{{pot}}', ng-class='{selectableInventory: selectedEgg && !user.items.pets[selectedEgg.name+"-"+pot]}') button.customize-option(popover='{{Items.hatchingPotions[pot].notes}}', popover-title='{{Items.hatchingPotions[pot].text}} Potion', popover-trigger='mouseenter', popover-placement='right', ng-click='choosePotion(pot)', class='Pet_HatchingPotion_{{pot}}', ng-class='{selectableInventory: selectedEgg && !user.items.pets[selectedEgg.name+"-"+pot]}')
.badge.badge-info.stack-count {{points}} .badge.badge-info.stack-count {{points}}
@@ -29,7 +29,7 @@ script(type='text/ng-template', id='partials/options.inventory.inventory.html')
//-li.customize-menu //-li.customize-menu
menu.pets-menu(label='Food ({{foodCount}})') menu.pets-menu(label='Food ({{foodCount}})')
p(ng-show='foodCount < 1') You don't have any food yet. p(ng-show='foodCount < 1') You don't have any food.
div(ng-repeat='(food,points) in ownedItems(user.items.food)') div(ng-repeat='(food,points) in ownedItems(user.items.food)')
button.customize-option(popover='{{Items.food[food].notes}}', popover-title='{{Items.food[food].text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='chooseFood(food)', class='Pet_Food_{{food}}') button.customize-option(popover='{{Items.food[food].notes}}', popover-title='{{Items.food[food].text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='chooseFood(food)', class='Pet_Food_{{food}}')
.badge.badge-info.stack-count {{points}} .badge.badge-info.stack-count {{points}}
@@ -52,11 +52,11 @@ script(type='text/ng-template', id='partials/options.inventory.inventory.html')
| Welcome to the Market. Dying to get that particular pet you're after, but don't want to wait for it to drop? Buy it here! If you have unwanted drops, sell them to me. | Welcome to the Market. Dying to get that particular pet you're after, but don't want to wait for it to drop? Buy it here! If you have unwanted drops, sell them to me.
p p
button.btn.btn-primary(ng-show='selectedEgg', ng-click='sellInventory()') button.btn.btn-primary(ng-show='selectedEgg', ng-click='sellInventory()')
| Sell {{selectedEgg.name}} for {{selectedEgg.value}} GP | Sell {{selectedEgg.name}} for {{selectedEgg.value}} Gold
button.btn.btn-primary(ng-show='selectedPotion', ng-click='sellInventory()') button.btn.btn-primary(ng-show='selectedPotion', ng-click='sellInventory()')
| Sell {{selectedPotion.name}} for {{selectedPotion.value}} GP | Sell {{selectedPotion.name}} for {{selectedPotion.value}} Gold
button.btn.btn-primary(ng-show='selectedFood', ng-click='sellInventory()') button.btn.btn-primary(ng-show='selectedFood', ng-click='sellInventory()')
| Sell {{selectedFood.name}} for {{selectedFood.value}} GP | Sell {{selectedFood.name}} for {{selectedFood.value}} Gold
menu.inventory-list(type='list') menu.inventory-list(type='list')
li.customize-menu li.customize-menu

View File

@@ -67,7 +67,8 @@ script(type='text/ng-template', id='partials/options.inventory.stable.pets.html'
div div
button(ng-if='user.items.pets["Wolf-Veteran"]', class="pet-button Pet-Wolf-Veteran", ng-class='{active: user.items.currentPet == "Wolf-Veteran"}', ng-click='choosePet("Wolf", "Veteran")', popover='Veteran Wolf', popover-trigger='mouseenter', popover-placement='bottom') button(ng-if='user.items.pets["Wolf-Veteran"]', class="pet-button Pet-Wolf-Veteran", ng-class='{active: user.items.currentPet == "Wolf-Veteran"}', ng-click='choosePet("Wolf", "Veteran")', popover='Veteran Wolf', popover-trigger='mouseenter', popover-placement='bottom')
button(ng-if='user.items.pets["Wolf-Cerberus"]', class="pet-button Pet-Wolf-Cerberus", ng-class='{active: user.items.currentPet == "Wolf-Cerberus"}', ng-click='choosePet("Wolf", "Cerberus")', popover='Cerberus Pup', popover-trigger='mouseenter', popover-placement='bottom') button(ng-if='user.items.pets["Wolf-Cerberus"]', class="pet-button Pet-Wolf-Cerberus", ng-class='{active: user.items.currentPet == "Wolf-Cerberus"}', ng-click='choosePet("Wolf", "Cerberus")', popover='Cerberus Pup', popover-trigger='mouseenter', popover-placement='bottom')
button(ng-if='user.items.pets["Dragon-Hydra"]', class="pet-button Pet-Dragon-Hydra", ng-class='{active: user.items.currentPet == "Dragon-Hydra"}', ng-click='choosePet("Dragon", "Hydra")', popover='Hydra Pet', popover-trigger='mouseenter', popover-placement='bottom') button(ng-if='user.items.pets["Dragon-Hydra"]', class="pet-button Pet-Dragon-Hydra", ng-class='{active: user.items.currentPet == "Dragon-Hydra"}', ng-click='choosePet("Dragon", "Hydra")', popover='Hydra', popover-trigger='mouseenter', popover-placement='bottom')
button(ng-if='user.items.pets["Turkey-Base"]', class="pet-button Pet-Turkey-Base", ng-class='{active: user.items.currentPet == "Turkey-Base"}', ng-click='choosePet("Turkey", "Base")', popover='Turkey', popover-trigger='mouseenter', popover-placement='bottom')
a(target='_blank', href='http://habitrpg.wikia.com/wiki/Contributing_to_HabitRPG') a(target='_blank', href='http://habitrpg.wikia.com/wiki/Contributing_to_HabitRPG')
button(ng-if='!user.items.pets["Dragon-Hydra"]', class="pet-button pet-not-owned", popover-trigger='mouseenter', popover-placement='right', popover="Click the gold paw to learn more about how you can obtain this rare pet through contributing to HabitRPG!", popover-title='How to Get this Pet!') button(ng-if='!user.items.pets["Dragon-Hydra"]', class="pet-button pet-not-owned", popover-trigger='mouseenter', popover-placement='right', popover="Click the gold paw to learn more about how you can obtain this rare pet through contributing to HabitRPG!", popover-title='How to Get this Pet!')
img(src='/bower_components/habitrpg-shared/img/PixelPaw-Gold.png') img(src='/bower_components/habitrpg-shared/img/PixelPaw-Gold.png')

View File

@@ -9,14 +9,26 @@ script(id='partials/options.profile.avatar.html', type='text/ng-template')
button.m_head_0.customize-option(type='button', ng-click='set("preferences.gender","m")') button.m_head_0.customize-option(type='button', ng-click='set("preferences.gender","m")')
button.f_head_0.customize-option(type='button', ng-click='set("preferences.gender","f")') button.f_head_0.customize-option(type='button', ng-click='set("preferences.gender","f")')
label.checkbox label.checkbox
input(type='checkbox', ng-model='user.preferences.showHelm', ng-change='toggleHelm(user.preferences.showHelm)') input(type='checkbox', ng-model='user.preferences.showHelm', ng-change='set("preferences.showHelm", user.preferences.showHelm?true: false)')
| Show Helm | Show Helm
menu(type='list')
menu(ng-show='user.preferences.gender=="f"', type='list')
li.customize-menu li.customize-menu
menu(label='Clothing') menu(label='Clothing')
button.f_armor_0_v1.customize-option(type='button', ng-click='set("preferences.armorSet","v1")') button.f_armor_0_v1.customize-option(ng-show='user.preferences.gender=="f"', type='button', ng-click='set("preferences.armorSet","v1")')
button.f_armor_0_v2.customize-option(type='button', ng-click='set("preferences.armorSet","v2")') button.f_armor_0_v2.customize-option(ng-show='user.preferences.gender=="f"', type='button', ng-click='set("preferences.armorSet","v2")')
label.checkbox
input(type='checkbox', ng-model='user.preferences.showArmor', ng-change='set("preferences.showArmor", user.preferences.showArmor?true: false)')
| Show Armor
menu(type='list')
li.customize-menu
menu(label='Other')
label.checkbox
input(type='checkbox', ng-model='user.preferences.showWeapon', ng-change='set("preferences.showWeapon", user.preferences.showWeapon?true: false)')
| Show Weapon
label.checkbox
input(type='checkbox', ng-model='user.preferences.showShield', ng-change='set("preferences.showShield", user.preferences.showShield?true: false)')
| Show Shield
.span4 .span4
h3 Hair h3 Hair

View File

@@ -71,4 +71,9 @@ script(id='partials/options.settings.export.html', type="text/ng-template")
h2 Data Export h2 Data Export
small Here are a few options for saving your Habit data. small Here are a few options for saving your Habit data.
h4 Habit History h4 Habit History
a(href="/export/history.csv") Export History (CSV) Export History: &nbsp;
a(href="/export/history.csv") (CSV) &nbsp;
h4 User Data
Export User Data: &nbsp;
a(href="/export/userdata.xml") (XML) &nbsp;
a(href="/export/userdata.json") (JSON) &nbsp;

View File

@@ -5,7 +5,7 @@
| Challenges | Challenges
a.pull-right(target='_blank', href='https://trello.com/card/challenges-individual-party-guild-public/50e5d3684fe3a7266b0036d6/58') a.pull-right(target='_blank', href='https://trello.com/card/challenges-individual-party-guild-public/50e5d3684fe3a7266b0036d6/58')
i.icon-question-sign i.icon-question-sign
.modal-body .modal-body(bindonce='group.challenges')
div(ng-if='group.challenges.length > 0') div(ng-if='group.challenges.length > 0')
table.table.table-striped table.table.table-striped
tr(ng-repeat='challenge in group.challenges') tr(ng-repeat='challenge in group.challenges')

View File

@@ -18,7 +18,7 @@ script(type='text/ng-template', id='partials/options.social.challenges.detail.me
script(type='text/ng-template', id='partials/options.social.challenges.detail.html') script(type='text/ng-template', id='partials/options.social.challenges.detail.html')
// Edit button // Edit button
div(ng-if='challenge.leader==user._id') div(bindonce='challenge', ng-if='challenge.leader==user._id')
ul.unstyled ul.unstyled
li(ng-hide='challenge._locked==false') li(ng-hide='challenge._locked==false')
button.btn.btn-small.btn-default(ng-click='challenge._locked = false') Edit button.btn.btn-small.btn-default(ng-click='challenge._locked = false') Edit
@@ -35,12 +35,12 @@ script(type='text/ng-template', id='partials/options.social.challenges.detail.ht
textarea.option-content(cols='3', placeholder='Description', ng-model='challenge.description') textarea.option-content(cols='3', placeholder='Description', ng-model='challenge.description')
hr hr
.well(ng-if='challenge.description') {{challenge.description}} .well(bindonce='challenge', ng-if='challenge.description') {{challenge.description}}
i.icon-question-sign(popover="These are the challenge's tasks. As users participate, they will change color and gain graphs to show you the overall progress of the group.", popover-trigger='mouseenter', popover-placement='right') i.icon-question-sign(popover="These are the challenge's tasks. As users participate, they will change color and gain graphs to show you the overall progress of the group.", popover-trigger='mouseenter', popover-placement='right')
habitrpg-tasks(obj='challenge', main=false) habitrpg-tasks(obj='challenge', main=false)
// Member List // Member List
div(ng-if='challenge.members.length > 0') div(bindonce='challenge', ng-if='challenge.members.length > 0')
h3 How's Everyone Doing? h3 How's Everyone Doing?
menu menu
button.customize-option(ng-repeat='member in challenge.members', ng-click='toggleMember(challenge._id, member._id)') {{member.profile.name}} button.customize-option(ng-repeat='member in challenge.members', ng-click='toggleMember(challenge._id, member._id)') {{member.profile.name}}
@@ -49,7 +49,7 @@ script(type='text/ng-template', id='partials/options.social.challenges.detail.ht
// Accordion version if we choose that instead // Accordion version if we choose that instead
//- div(ng-if='challenge.members') //- div(ng-if='challenge.members')
h4 How's Everyone Doing? h4 How's Everyone Doing?
.accordion-group(ng-repeat='member in challenge.members') .accordion-group(bindonce='challenge.members', ng-repeat='member in challenge.members')
.accordion-heading .accordion-heading
a.accordion-toggle(ng-click='toggleMember(challenge._id, member._id)') {{member.profile.name}} a.accordion-toggle(ng-click='toggleMember(challenge._id, member._id)') {{member.profile.name}}
.accordion-body(ng-class='{collapse: $stateParams.uid != member._id}') .accordion-body(ng-class='{collapse: $stateParams.uid != member._id}')
@@ -92,7 +92,8 @@ script(type='text/ng-template', id='partials/options.social.challenges.html')
.option-medium .option-medium
input.option-content(type='text', minlength="3", maxlength="16", ng-model='newChallenge.shortName', placeholder='Tag Name', required) input.option-content(type='text', minlength="3", maxlength="16", ng-model='newChallenge.shortName', placeholder='Tag Name', required)
i.icon-question-sign(popover="Challenges appear on tag-lists & task-tooltips. So while you'll want a descriptive title above, you'll also need a 'short name'. Eg, 'Lose 10 pounds in 3 months' might become '-10lb'", popover-trigger='mouseenter', popover-placement='right') a(target='_blank', href='http://habitrpg.wikia.com/wiki/Tags')
i.icon-question-sign(popover="Challenges appear on tag-lists & task-tooltips. So while you'll want a descriptive title above, you'll also need a 'short name'. Eg, 'Lose 10 pounds in 3 months' might become '-10lb' (Click the '?' for more info).", popover-trigger='mouseenter', popover-placement='right')
textarea.option-content(cols='3', placeholder='Description', ng-model='newChallenge.description') textarea.option-content(cols='3', placeholder='Description', ng-model='newChallenge.description')

View File

@@ -1,11 +1,11 @@
form(ng-submit='postChat(group,message.content)') form.chat-form(ng-submit='postChat(group,message.content)')
.-options .-options
//FIXME ng-model makes this painfully slow! using jquery for now, which is really non-angular-like //FIXME ng-model makes this painfully slow! using jquery for now, which is really non-angular-like
.control-group.option-large(ng-controller='AutocompleteCtrl') .control-group.option-large(ng-controller='AutocompleteCtrl')
textarea.chat-textarea.option-content(style='height:6em;', ui-keypress='{13:"postChat(group,message.content)"}', ng-model='message.content', updateinterval='250', flag='@', at-user, auto-complete) textarea.chat-textarea.option-content(style='height:6em;', ui-keypress='{13:"postChat(group,message.content)"}', ng-model='message.content', updateinterval='250', flag='@', at-user, auto-complete)
span.user-list(ng-show='!isAtListHidden') span.user-list(ng-show='!isAtListHidden')
ul.list-at-user ul.list-at-user
li(ng-repeat='user in users | filter:query.text | limitTo: 5', ng-click='autoComplete(user)') li(bindonce='users', ng-repeat='user in users | filter:query.text | limitTo: 5', ng-click='autoComplete(user)')
span.username.label(class='label-contributor-{{user.contributor.level}}', ng-class='{"label-npc": user.backer.npc}') {{user.user}} span.username.label(class='label-contributor-{{user.contributor.level}}', ng-class='{"label-npc": user.backer.npc}') {{user.user}}
table.pull-right table.pull-right
tr tr

View File

@@ -1,10 +1,13 @@
li(ng-repeat='message in group.chat', ng-class='{highlight: indexOf(message.text.toLowerCase(), user.profile.name.toLowerCase()), "own-message": user._id == message.uuid}') li(bindonce='group.chat', ng-repeat='message in group.chat', bo-class='{highlight: isUserMentioned(user,message), "own-message": user._id == message.uuid}')
a.label.chat-message(class='label-contributor-{{message.contributor.level}}', ng-class='{"label-npc": message.backer.npc}', ng-click='clickMember(message.uuid, true)') div(class='scrollable-message')
span(tooltip='{{contribText(message.contributor, message.backer)}}') {{message.user}}&nbsp; a.label.chat-message(class='hidden-label')
span {{message.user}}&nbsp;
| &nbsp; | &nbsp;
span(ng-bind-html="message.text | linky:'_blank'") markdown(ng-model='message.text',target='_blank')
| &nbsp;-&nbsp; | &nbsp;-&nbsp;
span.muted.time span.muted.time(from-now='message.timestamp')
| {{relativeDate(message.timestamp, _currentTime) + ' '}} a(bo-show='user.contributor.admin || message.uuid == user.id', ng-click='deleteChatMessage(group, message)')
a(ng-show='user.contributor.admin || message.uuid == user.id', ng-click='deleteChatMessage(group, message)') |
i.icon-remove(tooltip='Delete') i.icon-remove(tooltip='Delete')
a.label.chat-message(class='float-label', bo-class='{"label-npc": message.backer.npc, "label-contributor-{{message.contributor.level}}":message.contributor.level}', ng-click='clickMember(message.uuid, true)')
span(tooltip='{{contribText(message.contributor, message.backer)}}') {{message.user}}&nbsp;

View File

@@ -8,7 +8,7 @@ a.pull-right.gem-wallet(popover-trigger='mouseenter', popover-title='Guild Bank'
// ------ Information ------- // ------ Information -------
.modal(style='position: relative;top: auto;left: auto;right: auto;margin: 0 auto 20px;z-index: 1;max-width: 100%;') .modal(style='position: relative;top: auto;left: auto;right: auto;margin: 0 auto 20px;z-index: 1;max-width: 100%;')
.modal-header .modal-header(bindonce='group')
span(ng-if='group.leader == user.id') span(ng-if='group.leader == user.id')
button.btn.btn-primary.pull-right(ng-click='save(group)', ng-show='group._editing') Save button.btn.btn-primary.pull-right(ng-click='save(group)', ng-show='group._editing') Save
button.btn.btn-default.pull-right(ng-click='group._editing = true', ng-hide='group._editing') Edit Group button.btn.btn-default.pull-right(ng-click='group._editing = true', ng-hide='group._editing') Edit Group
@@ -20,8 +20,7 @@ a.pull-right.gem-wallet(popover-trigger='mouseenter', popover-title='Guild Bank'
input.option-content(type='text', ng-model='group.name', placeholder='Group Name') input.option-content(type='text', ng-model='group.name', placeholder='Group Name')
.control-group.option-large .control-group.option-large
label.control-label Description label.control-label Description
textarea.option-content(style='height:15em;', placeholder='Description', ng-model='group.description') textarea.option-content(style='height:15em;', placeholder='Description shown in public Guilds list (Markdown OK)', ng-model='group.description')
include ../../shared/formatting-help
.control-group.option-large .control-group.option-large
label.control-label Logo URL label.control-label Logo URL
input.option-content(type='url', placeholder='Logo URL', ng-model='group.logo') input.option-content(type='url', placeholder='Logo URL', ng-model='group.logo')
@@ -40,7 +39,16 @@ a.pull-right.gem-wallet(popover-trigger='mouseenter', popover-title='Guild Bank'
.modal-header .modal-header
h3 Members h3 Members
.modal-body .modal-body
table.table.table-striped span
| Party Members list ordering
select#partyOrder(
style='width:140px',
ng-model='user.party.order',
ng-controller='ChatCtrl',
ng-options='k as v for (k , v) in partyOrderChoices',
ng-change='set("party.order", user.party.order)'
)
table.table.table-striped(bindonce='group')
tr(ng-repeat='member in group.members') tr(ng-repeat='member in group.members')
td td
// allow leaders to ban members // allow leaders to ban members
@@ -78,8 +86,7 @@ a.pull-right.gem-wallet(popover-trigger='mouseenter', popover-title='Guild Bank'
.span8 .span8
div.blah-options(ng-show='group._editing') div.blah-options(ng-show='group._editing')
.option-large .option-large
textarea.option-content(style='height:15em;', placeholder='Message from group leader', ng-model='group.leaderMessage') textarea.option-content(style='height:15em;', placeholder='Message from group leader (Markdown OK)', ng-model='group.leaderMessage')
include ../../shared/formatting-help
table(ng-show='group.leaderMessage') table(ng-show='group.leaderMessage')
tr tr
td td
@@ -91,6 +98,7 @@ a.pull-right.gem-wallet(popover-trigger='mouseenter', popover-title='Guild Bank'
div(ng-controller='ChatCtrl') div(ng-controller='ChatCtrl')
h3 Chat h3 Chat
include ./chat-box include ./chat-box
include ../../shared/formatting-help
ul.unstyled.tavern-chat ul.unstyled.tavern-chat
include ./chat-message include ./chat-message

View File

@@ -47,20 +47,22 @@
// Player Tiers // Player Tiers
.modal(style='position: relative;top: auto;left: auto;right: auto;margin: 0 auto 20px;z-index: 1;max-width: 100%;') .modal(style='position: relative;top: auto;left: auto;right: auto;margin: 0 auto 20px;z-index: 1;max-width: 100%;')
.modal-header .modal-header
h3 Player Tier Legend h3 Player Tiers
.modal-body .modal-body
small. small.
Click labels to expand. See <a href='http://habitrpg.wikia.com/wiki/Contributor_Rewards' target='_blank'>contribution details.</a> Click tier labels below for more information. <br />
<a href='http://habitrpg.wikia.com/wiki/Contributor_Rewards' target='_blank'>Learn more about contributor rewards</a> <br />
<a href='http://habitrpg.wikia.com/wiki/Contributing_to_HabitRPG' target='_blank'>Learn how to contribute to HabitRPG</a>
table.table.table-striped table.table.table-striped
tr tr
td td
a.label.label-contributor-1(ng-click='toggleUserTier($event)') Friend (1-2) a.label.label-contributor-1(ng-click='toggleUserTier($event)') Friend (1-2)
div(style='display:none;') div(style='display:none;')
p. p.
<span class='achievement achievement-firefox'></span> When your <strong>first</strong> submission is deployed, you will receive the HabitRPG Contributor's badge. Your name in Tavern chat will proudly display that you are a contributor. <span class='achievement achievement-firefox'></span> When your <strong>first</strong> submission is deployed, you will receive the HabitRPG Contributor's badge. Your name in Tavern chat will proudly display that you are a contributor. As a bounty for your work, you will also receive <strong>2 Gems</strong>.
hr hr
p. p.
<span class='shop_armor_7 shop-sprite item-img'></span> When your <strong>second</strong> submission is deployed, the <strong>Crystal Armor</strong> will be available for purchase in the Rewards shop after the Golden Armor. As a bounty for your great work, you will also receive <strong>2 Gems</strong>. <span class='shop_armor_7 shop-sprite item-img'></span> When your <strong>second</strong> submission is deployed, the <strong>Crystal Armor</strong> will be available for purchase in the Rewards shop after the Golden Armor. As a bounty for your continued work, you will also receive <strong>2 Gems</strong>.
tr tr
td td
a.label.label-contributor-3(ng-click='toggleUserTier($event)') Elite (3-4) a.label.label-contributor-3(ng-click='toggleUserTier($event)') Elite (3-4)
@@ -69,23 +71,23 @@
<span class='shop_head_7 shop-sprite item-img'></span> When your <strong>third</strong> submission is deployed, the <strong>Crystal Helmet</strong> will be available for purchase in the Rewards shop after the Golden Helmet. As a bounty for your great work, you will also receive <strong>2 Gems</strong>. <span class='shop_head_7 shop-sprite item-img'></span> When your <strong>third</strong> submission is deployed, the <strong>Crystal Helmet</strong> will be available for purchase in the Rewards shop after the Golden Helmet. As a bounty for your great work, you will also receive <strong>2 Gems</strong>.
hr hr
p. p.
<span class='shop_weapon_8 shop-sprite item-img'></span> When your <strong>fourth</strong> submission is deployed, the <strong>Crystal Sword</strong> will be available for purchase in the Rewards shop after the Golden Sword. As a bounty for your great work, you will also receive <strong>2 Gems</strong>. <span class='shop_weapon_8 shop-sprite item-img'></span> When your <strong>fourth</strong> submission is deployed, the <strong>Crystal Sword</strong> will be available for purchase in the Rewards shop after the Golden Sword. You will once again receive a bounty of <strong>2 Gems</strong>.
tr tr
td td
a.label.label-contributor-5(ng-click='toggleUserTier($event)') Champion (5-6) a.label.label-contributor-5(ng-click='toggleUserTier($event)') Champion (5-6)
div(style='display:none;') div(style='display:none;')
p. p.
<span class='shop_shield_7 shop-sprite item-img'></span> When your <em>fifth</em> submission is deployed, the <strong>Crystal Shield</strong> will be available for purchase in the Reward shop after the Golden Shield. As a bounty for your great work, you will also receive <strong>2 Gems</strong>. <span class='shop_shield_7 shop-sprite item-img'></span> When your <em>fifth</em> submission is deployed, the <strong>Crystal Shield</strong> will be available for purchase in the Reward shop after the Golden Shield. You will also receive <strong>2 Gems</strong>.
hr hr
p. p.
<div class='Pet-Dragon-Hydra pull-left'></div> When your <em>sixth</em> submission is deployed, you will receive a <strong>Hydra Pet</strong>. As a bounty for your great work, you will also receive <strong>2 Gems</strong>. <div class='Pet-Dragon-Hydra pull-left'></div> When your <em>sixth</em> submission is deployed, you will receive a <strong>Hydra Pet</strong>. You will also receive <strong>2 Gems</strong>.
tr tr
td td
a.label.label-contributor-7(ng-click='toggleUserTier($event)') Legendary (7) a.label.label-contributor-7(ng-click='toggleUserTier($event)') Legendary (7)
div(style='display:none;') div(style='display:none;')
p. p.
When your <em>seventh</em> submission is deployed, you will receive <strong>2 Gems</strong> and become a member of the honored Contributor's Guild and be privy to the behind-the-scenes details of HabitRPG! When your <em>seventh</em> submission is deployed, you will receive <strong>2 Gems</strong> and become a member of the honored Contributor's Guild and be privy to the behind-the-scenes details of HabitRPG! Further contributions do not increase your level, but you may continue to earn Gem bounties and titles.
tr tr
td td
a.label.label-contributor-8(ng-click='toggleUserTier($event)') Heroic a.label.label-contributor-8(ng-click='toggleUserTier($event)') Heroic
@@ -102,7 +104,9 @@
.span8(ng-controller='ChatCtrl') .span8(ng-controller='ChatCtrl')
h3 Tavern Talk h3 Tavern Talk
include ./chat-box include ./chat-box
small.alert.alert-info. small
Note: if you're reporting a bug, the developers won't see it here. <a href='http://community.habitrpg.com/node/280' target='_blank'>Follow these instructions</a> instead. include ../../shared/formatting-help
alert.alert-info.
Note: if you're reporting a bug, the developers won't see it here. Please <a href='https://github.com/HabitRPG/habitrpg/issues' target='_blank'>use Github instead</a>.
ul.unstyled.tavern-chat ul.unstyled.tavern-chat
include ./chat-message include ./chat-message

View File

@@ -32,7 +32,7 @@ footer.footer(ng-controller='FooterCtrl')
h4 Community h4 Community
ul.unstyled ul.unstyled
li li
a(target='_blank', href='https://github.com/lefnire/habitrpg/issues?state=open') Submit Bug a(target='_blank', href='https://github.com/HabitRPG/habitrpg/issues') Submit Bug
li li
a(target='_blank', href='https://trello.com/board/habitrpg/50e5d3684fe3a7266b0036d6') Request Feature a(target='_blank', href='https://trello.com/board/habitrpg/50e5d3684fe3a7266b0036d6') Request Feature
li li

View File

@@ -1,2 +1,2 @@
small small
a(target='_blank', href='http://daringfireball.net/projects/markdown/') Use Markdown form formatting a(target='_blank', href='http://habitrpg.wikia.com/wiki/Markdown_Cheat_Sheet') Markdown formatting allowed

View File

@@ -3,7 +3,7 @@
Removing it will remove the user's name, but will allow more room for mounts & helms. IMO this is the lesser of two evils, revisit Removing it will remove the user's name, but will allow more room for mounts & helms. IMO this is the lesser of two evils, revisit
//-figure.herobox(ng-click='clickMember(profile._id)', data-name='{{profile.profile.name}}', ng-class='{isUser: profile.id==user.id, hasPet: profile.items.currentPet}', data-level='{{profile.stats.lvl}}', data-uid='{{profile.id}}', rel='popover', data-placement='bottom', data-trigger='hover', data-html='true', data-content="<div ng-hide='profile.id == user.id'> <div class='progress progress-danger' style='height:5px;'> <div class='bar' style='height: 5px; width: {{percent(profile.stats.hp, 50)}}%;'></div> </div> <div class='progress progress-warning' style='height:5px;'> <div class='bar' style='height: 5px; width: {{percent(profile.stats.exp, tnl(profile.stats.lvl))}}%;'></div> </div> <div>Level: {{profile.stats.lvl}}</div> <div>GP: {{profile.stats.gp | number:0}}</div> <div>{{count(profile.items.pets)}} / 90 Pets Found</div> </div>") //-figure.herobox(ng-click='clickMember(profile._id)', data-name='{{profile.profile.name}}', ng-class='{isUser: profile.id==user.id, hasPet: profile.items.currentPet}', data-level='{{profile.stats.lvl}}', data-uid='{{profile.id}}', rel='popover', data-placement='bottom', data-trigger='hover', data-html='true', data-content="<div ng-hide='profile.id == user.id'> <div class='progress progress-danger' style='height:5px;'> <div class='bar' style='height: 5px; width: {{percent(profile.stats.hp, 50)}}%;'></div> </div> <div class='progress progress-warning' style='height:5px;'> <div class='bar' style='height: 5px; width: {{percent(profile.stats.exp, tnl(profile.stats.lvl))}}%;'></div> </div> <div>Level: {{profile.stats.lvl}}</div> <div>GP: {{profile.stats.gp | number:0}}</div> <div>{{count(profile.items.pets)}} / 90 Pets Found</div> </div>")
figure.herobox(ng-click='spell ? castEnd(profile, "user", $event) : clickMember(profile._id)', data-name='{{profile.profile.name}}', ng-class='{isUser: user._id==profile._id && !(user.items.currentMount && user.items.currentPet), hasPet: profile.items.currentPet && profile.items.currentMount, "cast-target": applyingAction}') figure.herobox(ng-click='spell ? castEnd(profile, "user", $event) : clickMember(profile._id)', data-name='{{profile.profile.name}}', ng-class='{isUser: user._id==profile._id && !(user.items.currentMount && user.items.currentPet), hasPet: profile.items.currentPet && profile.items.currentMount, "cast-target": applyingAction, isLeader: party.leader==profile._id}')
.character-sprites .character-sprites
// Mount Body // Mount Body
span(ng-if='profile.items.currentMount', class='Mount_Body_{{profile.items.currentMount}}') span(ng-if='profile.items.currentMount', class='Mount_Body_{{profile.items.currentMount}}')
@@ -22,10 +22,10 @@ figure.herobox(ng-click='spell ? castEnd(profile, "user", $event) : clickMember(
span(class='m_head_0') span(class='m_head_0')
span(class='m_hair_base_{{profile.preferences.hair.base}}_{{profile.preferences.hair.color}}') span(class='m_hair_base_{{profile.preferences.hair.base}}_{{profile.preferences.hair.color}}')
span(class='m_hair_bangs_{{profile.preferences.hair.bangs}}_{{profile.preferences.hair.color}}') span(class='m_hair_bangs_{{profile.preferences.hair.bangs}}_{{profile.preferences.hair.color}}')
span(class='m_{{profile.items.gear.current.armor}}') span(class='m_{{profile.items.gear.current.armor}}', ng-show='profile.preferences.showArmor')
span(class='m_{{profile.items.gear.current.head}}', ng-show='profile.preferences.showHelm') span(class='m_{{profile.items.gear.current.head}}', ng-show='profile.preferences.showHelm')
span(class='m_{{profile.items.gear.current.shield}}') span(class='m_{{profile.items.gear.current.shield}}', ng-show='profile.preferences.showShield')
span(class='m_{{profile.items.gear.current.weapon}}') span(class='m_{{profile.items.gear.current.weapon}}', ng-show='profile.preferences.showWeapon')
// Mount Head // Mount Head
span(ng-if='profile.items.currentMount', class='Mount_Head_{{profile.items.currentMount}}') span(ng-if='profile.items.currentMount', class='Mount_Head_{{profile.items.currentMount}}')
@@ -34,4 +34,5 @@ figure.herobox(ng-click='spell ? castEnd(profile, "user", $event) : clickMember(
span(ng-class='{zzz:profile.flags.rest}') span(ng-class='{zzz:profile.flags.rest}')
// FIXME handle @minimal, this might have to be a directive // FIXME handle @minimal, this might have to be a directive
span.current-pet(class='Pet-{{profile.items.currentPet}}', ng-show='profile.items.currentPet && !minimal') span.current-pet(class='Pet-{{profile.items.currentPet}}', ng-show='profile.items.currentPet && !minimal')
.avatar-level Lvl {{profile.stats.lvl}} .avatar-level(ng-class='userLevelStyle(profile,"label")')
| Lvl {{profile.stats.lvl}}

View File

@@ -19,7 +19,7 @@
.bar(style='width: {{percent(user.stats.exp,tnl(user.stats.lvl))}}%;') .bar(style='width: {{percent(user.stats.exp,tnl(user.stats.lvl))}}%;')
span.meter-text span.meter-text
i.icon-star i.icon-star
| {{user.stats.exp | number:0}} / {{tnl(user.stats.lvl)}} | {{user.stats.exp | number:0}} / {{tnl(user.stats.lvl) | number:0}}
// FIXME doesn't look great here, but the "Experience" CSS title rollover covers it where it was before // FIXME doesn't look great here, but the "Experience" CSS title rollover covers it where it was before
span(ng-show='user.history.exp') span(ng-show='user.history.exp')
a(ng-click='toggleChart("exp")', tooltip='Progress') a(ng-click='toggleChart("exp")', tooltip='Progress')

View File

@@ -12,4 +12,4 @@ div(modal='user.stats.hp <= 0', options='{backdrop:true, keyboard:false, backdro
a.btn.btn-danger.btn-large.notification-action(ng-click='User.revive()') Continue a.btn.btn-danger.btn-large.notification-action(ng-click='User.revive()') Continue
.span8 .span8
p p
| You've lost a level, all your gold, and a random piece of equipment. Arise, Habiteer, and try again! Curb those negative Habits, be vigilant in completion of Dailies, and hold death at arm's length with a Potion if you falter! | You've lost a Level, all your Gold, and a random piece of Equipment. Arise, Habiteer, and try again! Curb those negative Habits, be vigilant in completion of Dailies, and hold death at arm's length with a Health Potion if you falter!

View File

@@ -1,10 +1,10 @@
div(ng-controller='MemberModalCtrl') div(ng-controller='MemberModalCtrl')
#memberModal(modal='modals.member') #memberModal(modal='modals.member')
.modal-header .modal-header(bindonce='profile')
h3 h3
span {{profile.profile.name}} span {{profile.profile.name}}
span(ng-if='profile.contributor.level') - {{contribText(profile.contributor, profile.backer)}} span(ng-if='profile.contributor.level') - {{contribText(profile.contributor, profile.backer)}}
.modal-body .modal-body(bindonce='profile')
.row-fluid .row-fluid
.span6 .span6
img(ng-show='profile.profile.imageUrl', ng-src='{{profile.profile.imageUrl}}') img(ng-show='profile.profile.imageUrl', ng-src='{{profile.profile.imageUrl}}')

View File

@@ -12,25 +12,38 @@ div(modal='modals.newStuff')
h3.popover-title h3.popover-title
a(target='_blank', href='https://twitter.com/Mihakuu') Bailey a(target='_blank', href='https://twitter.com/Mihakuu') Bailey
.popover-content .popover-content
table table.table.table-striped
tr tr
td td
//ul.modal-indented-list h4 Turkey Event (by @lemoness)
h4 Contrib Gear p Say hi to our NPCs, dressed to impressed for Turkey day! Also - check your stable, you'll find a fun new pet.
p. tr
You can now unlock new a top-tier gear set and pet by contributing (code, art, docs, etc) to HabitRPG. <a href='http://habitrpg.wikia.com/wiki/Contributor_Rewards' target='_blank'>Read more</a>
small.muted 11/08/2013
td td
.herobox(style='background-color:transparent;') h4 Chat Enhancements (by @Nick Gordon)
.character-sprites p.
span.armor_7 Chat can now use markdown, Emoji, and @-tagging. Some pointers on using markdown & Emoji at <a href="http://habitrpg.wikia.com/wiki/Markdown_Cheat_Sheet" target="_blank">here</a>. To use @-tagging, simply type '@' in chat.
span.head_7 tr
span.shield_7 td
span.weapon_8 h4 Party Sorting (by @Fandekasp)
span.current-pet.Pet-Dragon-Hydra p.
You can now adjust the way you view your party members in the top bar. They can be sorted by level, number of pets, the date they joined the party, or just randomly. Also, level colors now reflect your contributor status.
tr
td
h4 Wiki Updates (by @bobbyroberts99)
p.
The <a href='http://habitrpg.wikia.com/wiki/HabitRPG_Wiki' target='_blank'>HabitRPG wiki</a> is being speedily updated. If youre confused about anything, go check it out - its a treasure trove.
small.muted 11/27/2013
hr hr
h5 11/08/2013
table.table.table-striped
tr
td.
Contrib Gear. You can now unlock new a top-tier gear set and pet by contributing (code, art, docs, etc) to HabitRPG. <a href='http://habitrpg.wikia.com/wiki/Contributor_Rewards' target='_blank'>Read more</a>
h5 11/01/2013 h5 11/01/2013
table.table.table-striped table.table.table-striped
tr tr

View File

@@ -27,7 +27,7 @@
span.label(ng-if='profile.contributor.level', class='label-contributor-{{profile.contributor.level}}') {{contribText(profile.contributor, profile.backer)}} span.label(ng-if='profile.contributor.level', class='label-contributor-{{profile.contributor.level}}') {{contribText(profile.contributor, profile.backer)}}
span.label(ng-if='!profile.contributor.level') Contributor span.label(ng-if='!profile.contributor.level') Contributor
small. small.
Has contributed to HabitRPG (code, design, pixel art, legal advice, docs, etc). Want this badge? Fix a bug :) Has contributed to HabitRPG (code, design, pixel art, legal advice, docs, etc). Want this badge? <a href='http://habitrpg.wikia.com/wiki/Contributing_to_HabitRPG' target='_blank'>Read more</a>.
hr hr
div(ng-if='profile.backer.tier') div(ng-if='profile.backer.tier')

View File

@@ -1,42 +1,47 @@
h4 Items h4 Equipment
p p
strong {{itemText('weapon',profile.items.weapon)}} strong {{itemText('weapon',profile.items.weapon)}}
| : {{itemStat('weapon',profile.items.weapon)}}% Exp gain | : {{itemStat('weapon',profile.items.weapon)}} Attack
p p
strong {{itemText('armor',profile.items.armor)}} strong {{itemText('armor',profile.items.armor)}}
| : {{itemStat('armor',profile.items.armor)}}% Defense | : {{itemStat('armor',profile.items.armor)}} Protection
p p
strong {{itemText('head',profile.items.head)}} strong {{itemText('head',profile.items.head)}}
| : {{itemStat('head',profile.items.head)}}% Defense | : {{itemStat('head',profile.items.head)}} Protection
p p
strong {{itemText('shield',profile.items.shield)}} strong {{itemText('shield',profile.items.shield)}}
| : {{itemStat('shield',profile.items.shield)}}% Defense | : {{itemStat('shield',profile.items.shield)}} Protection
h4 Stats h4 Stats
p p
strong HP strong Health
| : {{profile.stats.hp | number:0}} / 50 | : {{profile.stats.hp | number:0}} / 50
p p
strong GP strong Gold
| : {{profile.stats.gp | number:0}} | : {{profile.stats.gp | number:0}}
p p
strong Lvl strong Level
| : {{profile.stats.lvl}} | : {{profile.stats.lvl}}
p p
strong Exp strong Experience
| : {{profile.stats.exp | number:0}} / {{tnl(profile.stats.lvl)}} | : {{profile.stats.exp | number:0}} / {{tnl(profile.stats.lvl)}}
p p
strong Strength strong Strength
| : {{userStr(profile.stats.lvl)}} | :&nbsp;
span(popover-trigger='mouseenter', popover='(Level-1)/2') {{userStr(profile.stats.lvl)}}
p p
strong Defense strong Defense
| : {{userDef(profile.stats.lvl)}} | :&nbsp;
span(popover-trigger='mouseenter', popover='(Level-1)/2') {{userDef(profile.stats.lvl)}}
p p
strong Pets Found strong Pets Found
| : {{countExists(profile.items.pets)}} | : {{profile.petCount}}
hr hr
p p
strong Total Strength strong Total Experience Boost
| : {{totalStr(profile.stats.lvl, profile.items.weapon)}} % | :&nbsp;
span(popover-trigger='mouseenter', popover='Attack + Strength') {{totalStr(profile.stats.lvl, profile.items.weapon)}} %
p p
strong Total Defense strong Total Damage Reduction
| : {{totalDef(profile.stats.lvl, profile.items.armor, profile.items.head, profile.items.shield)}} % | :&nbsp;
span(popover-trigger='mouseenter', popover='Defense + Protection') {{totalDef(profile.stats.lvl, profile.items.armor, profile.items.head, profile.items.shield)}} %

View File

@@ -3,20 +3,20 @@
// started to get unwieldy // started to get unwieldy
script(id='templates/habitrpg-tasks.html', type="text/ng-template") script(id='templates/habitrpg-tasks.html', type="text/ng-template")
.grid .grid
.module(ng-repeat='list in lists', ng-class='{"rewards-module": list.type==="reward"}') .module(bindonce='lists', ng-repeat='list in lists', bo-class='{"rewards-module": list.type==="reward"}')
.task-column(class='{{list.type}}s') .task-column(class='{{list.type}}s')
// Todos export/graph options // Todos export/graph options
span.option-box.pull-right(ng-if='main && list.type=="todo"') span.option-box.pull-right(bo-if='main && list.type=="todo"')
a.option-action(ng-show='obj.history.todos', ng-click='toggleChart("todos")', tooltip='Progress') a.option-action(ng-show='obj.history.todos', ng-click='toggleChart("todos")', tooltip='Progress')
i.icon-signal i.icon-signal
//-a.option-action(ng-href='/v1/users/{{user.id}}/calendar.ics?apiToken={{user.apiToken}}', tooltip='iCal') //a.option-action(ng-href='/v1/users/{{user.id}}/calendar.ics?apiToken={{user.apiToken}}', tooltip='iCal')
a.option-action(ng-click='notPorted()', tooltip='iCal', ng-show='false') a.option-action(ng-click='notPorted()', tooltip='iCal', ng-show='false')
i.icon-calendar i.icon-calendar
// <a href="https://www.google.com/calendar/render?cid={{encodeiCalLink(_user.id, _user.apiToken)}}" rel=tooltip title="Google Calendar"><i class=icon-calendar></i></a> // <a href="https://www.google.com/calendar/render?cid={{encodeiCalLink(_user.id, _user.apiToken)}}" rel=tooltip title="Google Calendar"><i class=icon-calendar></i></a>
// Gold & Gems // Gold & Gems
span.option-box.pull-right.wallet(ng-if='main && list.type=="reward"') span.option-box.pull-right.wallet(bo-if='main && list.type=="reward"')
.money .money
| {{gold(user.stats.gp)}} | {{gold(user.stats.gp)}}
span.shop_gold(tooltip='Gold') span.shop_gold(tooltip='Gold')
@@ -28,7 +28,7 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template")
h2.task-column_title {{list.header}} h2.task-column_title {{list.header}}
// Todo Chart // Todo Chart
.todos-chart(ng-if='list.type == "todo"', ng-show='charts.todos') .todos-chart(bo-if='list.type == "todo"', ng-show='charts.todos')
// Add New // Add New
form.addtask-form.form-inline.new-task-form(name='new{{list.type}}form', ng-hide='obj._locked || (list.showCompleted && list.type=="todo")', ng-submit='addTask(obj[list.type+"s"],list)') form.addtask-form.form-inline.new-task-form(name='new{{list.type}}form', ng-hide='obj._locked || (list.showCompleted && list.type=="todo")', ng-submit='addTask(obj[list.type+"s"],list)')
@@ -45,7 +45,7 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template")
include ./task include ./task
// Static Rewards // Static Rewards
ul.items.rewards(ng-if='main && list.type=="reward" && user.flags.itemsEnabled') ul.items.rewards(bo-if='main && list.type=="reward" && user.flags.itemsEnabled')
li.task.reward-item(ng-hide='item.hide', ng-repeat='item in itemStore') li.task.reward-item(ng-hide='item.hide', ng-repeat='item in itemStore')
// right-hand side control buttons // right-hand side control buttons
.task-meta-controls .task-meta-controls
@@ -53,13 +53,13 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template")
i.icon-comment i.icon-comment
//left-hand size commands //left-hand size commands
.task-controls .task-controls
a.task-action-btn.btn-reroll(ng-if='item.type=="reroll"', ng-click='modals.reroll = true') a.task-action-btn.btn-reroll(bo-if='item.type=="reroll"', ng-click='modals.reroll = true')
i.icon-repeat i.icon-repeat
a.money.btn-buy.item-btn(ng-if='item.type!="reroll"', ng-click='buy(item.type)') a.money.btn-buy.item-btn(bo-if='item.type!="reroll"', ng-click='buy(item.type)')
span.reward-cost {{item.value}} span.reward-cost {{item.value}}
span.shop_gold span.shop_gold
// main content // main content
span(ng-class='{"shop_{{item.key}} shop-sprite item-img": true}') span(bo-class='{"shop_{{item.key}} shop-sprite item-img": true}')
p.task-text {{item.text}} p.task-text {{item.text}}
// Spells // Spells
@@ -81,7 +81,7 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template")
br br
// Ads // Ads
div(ng-if='main && !user.purchased.ads && list.type!="reward"') div(bo-if='main && !user.purchased.ads && list.type!="reward"')
span.pull-right span.pull-right
a(ng-click='modals.buyGems=true', tooltip=env.t('removeAds')) a(ng-click='modals.buyGems=true', tooltip=env.t('removeAds'))
i.icon-remove i.icon-remove
@@ -89,7 +89,7 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template")
ins.adsbygoogle(ng-init='initAds()', style='display: inline-block; width: 234px; height: 60px;', data-ad-client='ca-pub-3242350243827794', data-ad-slot='9529624576') ins.adsbygoogle(ng-init='initAds()', style='display: inline-block; width: 234px; height: 60px;', data-ad-client='ca-pub-3242350243827794', data-ad-slot='9529624576')
// Todo Tabs // Todo Tabs
div(ng-if='main && list.type=="todo"', ng-class='{"tabbable tabs-below": list.type=="todo"}') div(bo-if='main && list.type=="todo"', bo-class='{"tabbable tabs-below": list.type=="todo"}')
button.task-action-btn.tile.spacious.bright(ng-show='list.showCompleted', ng-click='clearCompleted()') Clear Completed button.task-action-btn.tile.spacious.bright(ng-show='list.showCompleted', ng-click='clearCompleted()') Clear Completed
// remaining/completed tabs // remaining/completed tabs
ul.nav.nav-tabs ul.nav.nav-tabs

View File

@@ -1,4 +1,4 @@
li(ng-repeat='task in obj[list.type+"s"]', class='task {{taskClasses(task, user.filters, user.preferences.dayStart, user.lastCron, list.showCompleted, main)}}', ng-click='spell && castEnd(task, "task", $event)', ng-class='{"cast-target":spell}') li(bindonce='list', ng-repeat='task in obj[list.type+"s"]', class='task {{taskClasses(task, user.filters, user.preferences.dayStart, user.lastCron, list.showCompleted, main)}}', ng-click='spell && castEnd(task, "task", $event)', ng-class='{"cast-target":spell}')
// right-hand side control buttons // right-hand side control buttons
.task-meta-controls .task-meta-controls
@@ -43,7 +43,7 @@ li(ng-repeat='task in obj[list.type+"s"]', class='task {{taskClasses(task, user.
.task-controls.task-primary .task-controls.task-primary
// Habits // Habits
span(ng-if='task.type=="habit"') span(bo-if='task.type=="habit"')
// score() is overridden in challengesCtrl to do nothing // score() is overridden in challengesCtrl to do nothing
a.task-action-btn(ng-if='task.up', ng-click='score(task,"up")') + a.task-action-btn(ng-if='task.up', ng-click='score(task,"up")') +
a.task-action-btn(ng-if='task.down', ng-click='score(task,"down")') - a.task-action-btn(ng-if='task.down', ng-click='score(task,"down")') -
@@ -55,7 +55,7 @@ li(ng-repeat='task in obj[list.type+"s"]', class='task {{taskClasses(task, user.
span.shop_gold span.shop_gold
// Daily & Todos // Daily & Todos
span.task-checker.action-yesno(ng-if='task.type=="daily" || task.type=="todo"') span.task-checker.action-yesno(bo-if='task.type=="daily" || task.type=="todo"')
input.visuallyhidden.focusable(ng-if='$state.includes("tasks")', id='box-{{obj._id}}_{{task.id}}', type='checkbox', ng-model='task.completed', ng-change='changeCheck(task)') input.visuallyhidden.focusable(ng-if='$state.includes("tasks")', id='box-{{obj._id}}_{{task.id}}', type='checkbox', ng-model='task.completed', ng-change='changeCheck(task)')
input.visuallyhidden.focusable(ng-if='!$state.includes("tasks")', id='box-{{obj._id}}_{{task.id}}', type='checkbox') input.visuallyhidden.focusable(ng-if='!$state.includes("tasks")', id='box-{{obj._id}}_{{task.id}}', type='checkbox')
label(for='box-{{obj._id}}_{{task.id}}') label(for='box-{{obj._id}}_{{task.id}}')
@@ -87,7 +87,7 @@ li(ng-repeat='task in obj[list.type+"s"]', class='task {{taskClasses(task, user.
a(ng-click='unlink(task, "keep-all")') Keep Them a(ng-click='unlink(task, "keep-all")') Keep Them
| &nbsp;|&nbsp; | &nbsp;|&nbsp;
a(ng-click='unlink(task, "remove-all")') Remove Them a(ng-click='unlink(task, "remove-all")') Remove Them
//-div(ng-if='task.challenge.broken=="UNSUBSCRIBED"') //div(ng-if='task.challenge.broken=="UNSUBSCRIBED"')
p Broken Challenge Link: this task was part of a challenge, but you have unsubscribed from the challenge. What to do with the orphan tasks? p Broken Challenge Link: this task was part of a challenge, but you have unsubscribed from the challenge. What to do with the orphan tasks?
p p
a(ng-click="unlink(task, 'keep-all')") Keep Them a(ng-click="unlink(task, 'keep-all')") Keep Them
@@ -114,17 +114,17 @@ li(ng-repeat='task in obj[list.type+"s"]', class='task {{taskClasses(task, user.
label(for='{{obj._id}}_{{task.id}}-option-minus') label(for='{{obj._id}}_{{task.id}}-option-minus')
// if Daily, calendar // if Daily, calendar
fieldset(ng-if='task.type=="daily"', class="option-group") fieldset(bo-if='task.type=="daily"', class="option-group")
legend.option-title Repeat legend.option-title Repeat
.task-controls.tile-group.repeat-days .task-controls.tile-group.repeat-days(bindonce)
// note, does not use data-toggle="buttons-checkbox" - it would interfere with our own click binding // note, does not use data-toggle="buttons-checkbox" - it would interfere with our own click binding
button.task-action-btn.tile(ng-class='{active: task.repeat.su}', type='button', data-day='su', ng-click='task.challenge.id || (task.repeat.su = !task.repeat.su)') Su button.task-action-btn.tile(ng-class='{active: task.repeat.su}', type='button', ng-click='task.challenge.id || (task.repeat.su = !task.repeat.su)' bo-text='moment.weekdaysMin(0)')
button.task-action-btn.tile(ng-class='{active: task.repeat.m}', type='button', data-day='m', ng-click='task.challenge.id || (task.repeat.m = !task.repeat.m)') M button.task-action-btn.tile(ng-class='{active: task.repeat.m}', type='button', ng-click='task.challenge.id || (task.repeat.m = !task.repeat.m)' bo-text='moment.weekdaysMin(1)')
button.task-action-btn.tile(ng-class='{active: task.repeat.t}', type='button', data-day='t', ng-click='task.challenge.id || (task.repeat.t = !task.repeat.t)') T button.task-action-btn.tile(ng-class='{active: task.repeat.t}', type='button', ng-click='task.challenge.id || (task.repeat.t = !task.repeat.t)' bo-text='moment.weekdaysMin(2)')
button.task-action-btn.tile(ng-class='{active: task.repeat.w}', type='button', data-day='w', ng-click='task.challenge.id || (task.repeat.w = !task.repeat.w)') W button.task-action-btn.tile(ng-class='{active: task.repeat.w}', type='button', ng-click='task.challenge.id || (task.repeat.w = !task.repeat.w)' bo-text='moment.weekdaysMin(3)')
button.task-action-btn.tile(ng-class='{active: task.repeat.th}', type='button', data-day='th', ng-click='task.challenge.id || (task.repeat.th = !task.repeat.th)') Th button.task-action-btn.tile(ng-class='{active: task.repeat.th}', type='button', ng-click='task.challenge.id || (task.repeat.th = !task.repeat.th)' bo-text='moment.weekdaysMin(4)')
button.task-action-btn.tile(ng-class='{active: task.repeat.f}', type='button', data-day='f', ng-click='task.challenge.id || (task.repeat.f= !task.repeat.f)') F button.task-action-btn.tile(ng-class='{active: task.repeat.f}', type='button', ng-click='task.challenge.id || (task.repeat.f= !task.repeat.f)' bo-text='moment.weekdaysMin(5)')
button.task-action-btn.tile(ng-class='{active: task.repeat.s}', type='button', data-day='s', ng-click='task.challenge.id || (task.repeat.s = !task.repeat.s)') S button.task-action-btn.tile(ng-class='{active: task.repeat.s}', type='button', ng-click='task.challenge.id || (task.repeat.s = !task.repeat.s)' bo-text='moment.weekdaysMin(6)')
// if Reward, pricing // if Reward, pricing
fieldset.option-group.option-short(ng-if='task.type=="reward" && !task.challenge.id') fieldset.option-group.option-short(ng-if='task.type=="reward" && !task.challenge.id')
@@ -145,7 +145,7 @@ li(ng-repeat='task in obj[list.type+"s"]', class='task {{taskClasses(task, user.
| {{tag.name}} | {{tag.name}}
// Advanced Options // Advanced Options
span(ng-if='task.type!="reward"') span(bo-if='task.type!="reward"')
p.option-title.mega(ng-click='task._advanced = !task._advanced') Advanced Options p.option-title.mega(ng-click='task._advanced = !task._advanced') Advanced Options
fieldset.option-group.advanced-option(ng-class="{visuallyhidden: !task._advanced}") fieldset.option-group.advanced-option(ng-class="{visuallyhidden: !task._advanced}")
legend.option-title legend.option-title
@@ -156,7 +156,8 @@ li(ng-repeat='task in obj[list.type+"s"]', class='task {{taskClasses(task, user.
button.task-action-btn.tile(type='button', ng-class='{active: task.priority=="!" || !task.priority}', ng-click='task.challenge.id || (task.priority="!")') Easy button.task-action-btn.tile(type='button', ng-class='{active: task.priority=="!" || !task.priority}', ng-click='task.challenge.id || (task.priority="!")') Easy
button.task-action-btn.tile(type='button', ng-class='{active: task.priority=="!!"}', ng-click='task.challenge.id || (task.priority="!!")') Medium button.task-action-btn.tile(type='button', ng-class='{active: task.priority=="!!"}', ng-click='task.challenge.id || (task.priority="!!")') Medium
button.task-action-btn.tile(type='button', ng-class='{active: task.priority=="!!!"}', ng-click='task.challenge.id || (task.priority="!!!")') Hard button.task-action-btn.tile(type='button', ng-class='{active: task.priority=="!!!"}', ng-click='task.challenge.id || (task.priority="!!!")') Hard
span(ng-if='task.type=="daily" && !task.challenge.id') //span(ng-if='task.type=="daily" && !task.challenge.id')
span(ng-if='task.type=="daily"')
legend.option-title Restore Streak legend.option-title Restore Streak
input.option-content(type='number', ng-model='task.streak') input.option-content(type='number', ng-model='task.streak')