diff --git a/apps/client/src/app/core/is-task-done.ts b/apps/client/src/app/core/is-task-done.ts index 0b41abdf..13ac7331 100644 --- a/apps/client/src/app/core/is-task-done.ts +++ b/apps/client/src/app/core/is-task-done.ts @@ -1,12 +1,12 @@ -import { LostarkTask } from "../model/lostark-task"; -import { Character } from "../model/character/character"; -import { Completion } from "../model/completion"; -import { subDays, subHours } from "date-fns"; -import { getCompletionEntry } from "./get-completion-entry-key"; -import { TaskFrequency } from "../model/task-frequency"; -import { TaskScope } from "../model/task-scope"; - -export function isTaskDone(task: LostarkTask, character: Character, completion: Completion, dailyReset: number, weeklyReset: number, biWeeklyReset: number, lazyTracking: Record): number { +import { LostarkTask } from '../model/lostark-task'; +import { Character } from '../model/character/character'; +import { Completion } from '../model/completion'; +import { subDays, subHours } from 'date-fns'; +import { getCompletionEntry } from './get-completion-entry-key'; +import { TaskFrequency } from '../model/task-frequency'; +import { TaskScope } from '../model/task-scope'; + +export function isTaskDone(task: LostarkTask, character: Character, completion: Completion, dailyReset: number, weeklyReset: number, biWeeklyReset: number, theamineReset: number, lazyTracking: Record): number { if (character.lazy && task.scope !== TaskScope.ROSTER) { const lazyTrackingFlag = lazyTracking && lazyTracking[`${character.name}:${task.$key}`]; if (lazyTrackingFlag === undefined || lazyTrackingFlag) { @@ -18,7 +18,8 @@ export function isTaskDone(task: LostarkTask, character: Character, completion: const reset = { [TaskFrequency.DAILY]: dailyReset, [TaskFrequency.WEEKLY]: weeklyReset, - [TaskFrequency.BIWEEKLY]: biWeeklyReset + [TaskFrequency.BIWEEKLY]: biWeeklyReset, + [TaskFrequency.BIWEEKLY_OFFSET]: theamineReset, }[task.frequency]; if (!completionFlag) { diff --git a/apps/client/src/app/core/tasks.ts b/apps/client/src/app/core/tasks.ts index 75353231..b81dc8ac 100644 --- a/apps/client/src/app/core/tasks.ts +++ b/apps/client/src/app/core/tasks.ts @@ -116,6 +116,14 @@ export const tasks = [ shared: true, partySize: 4 }), + createTask(`Theamine`, 1610, TaskFrequency.WEEKLY, TaskScope.CHARACTER, 3, 9999, "legion_raid.png", { + shared: true, + partySize: 8 + }), + createTask(`Theamine G4`, 1630, TaskFrequency.BIWEEKLY_OFFSET, TaskScope.CHARACTER, 1, 9999, "legion_raid.png", { + shared: true, + partySize: 8 + }), // Weekly Roster createTask(`South Vern Chaos Line Dungeon`, 1340, TaskFrequency.WEEKLY, TaskScope.ROSTER, 2, 9999, "dungeon.webp"), diff --git a/apps/client/src/app/core/time.service.ts b/apps/client/src/app/core/time.service.ts index bc1d82d9..96b73367 100644 --- a/apps/client/src/app/core/time.service.ts +++ b/apps/client/src/app/core/time.service.ts @@ -66,4 +66,21 @@ export class TimeService { }), distinctUntilChanged() ); + + /** + * Used for Theamine reset + */ + public lastBiWeeklyOffsetReset$ = this.lastWeeklyReset$.pipe( + map((timestamp) => { + const reset = new Date(timestamp); + // BiWeekly reset happens every odd week # + const week = getWeek(reset); + if (week % 2 === 0) { + return timestamp; + } else { + return addWeeks(reset, -1).getTime(); + } + }), + distinctUntilChanged() + ); } diff --git a/apps/client/src/app/model/lostark-task.ts b/apps/client/src/app/model/lostark-task.ts index a97dbae4..ee817177 100644 --- a/apps/client/src/app/model/lostark-task.ts +++ b/apps/client/src/app/model/lostark-task.ts @@ -2,7 +2,7 @@ import { TaskFrequency } from "./task-frequency"; import { TaskScope } from "./task-scope"; import { DataModel } from "../core/database/data-model"; -export const TASKS_VERSION = 46; +export const TASKS_VERSION = 47; export interface LostarkTask extends DataModel { authorId?: string; diff --git a/apps/client/src/app/model/task-frequency.ts b/apps/client/src/app/model/task-frequency.ts index 552e1f17..b48034fb 100644 --- a/apps/client/src/app/model/task-frequency.ts +++ b/apps/client/src/app/model/task-frequency.ts @@ -2,5 +2,6 @@ export enum TaskFrequency { DAILY, WEEKLY, ONE_TIME, - BIWEEKLY + BIWEEKLY, + BIWEEKLY_OFFSET, } diff --git a/apps/client/src/app/pages/checklist/checklist/checklist.component.html b/apps/client/src/app/pages/checklist/checklist/checklist.component.html index 9f5c668e..e43043a2 100644 --- a/apps/client/src/app/pages/checklist/checklist/checklist.component.html +++ b/apps/client/src/app/pages/checklist/checklist/checklist.component.html @@ -13,6 +13,7 @@ + diff --git a/apps/client/src/app/pages/checklist/checklist/checklist.component.ts b/apps/client/src/app/pages/checklist/checklist/checklist.component.ts index c7e0ce3c..f858053f 100644 --- a/apps/client/src/app/pages/checklist/checklist/checklist.component.ts +++ b/apps/client/src/app/pages/checklist/checklist/checklist.component.ts @@ -1,32 +1,32 @@ -import { Component, HostListener } from "@angular/core"; -import { BehaviorSubject, combineLatest, map, Observable, pluck, startWith } from "rxjs"; -import { LostarkTask } from "../../../model/lostark-task"; -import { TaskFrequency } from "../../../model/task-frequency"; -import { TaskScope } from "../../../model/task-scope"; -import { Completion } from "../../../model/completion"; -import { Energy } from "../../../model/energy"; -import { getCompletionEntry, getCompletionEntryKey, setCompletionEntry } from "../../../core/get-completion-entry-key"; -import { RosterService } from "../../../core/database/services/roster.service"; -import { SettingsService } from "../../../core/database/services/settings.service"; -import { EnergyService } from "../../../core/database/services/energy.service"; -import { TimeService } from "../../../core/time.service"; -import { CompletionService } from "../../../core/database/services/completion.service"; -import { TasksService } from "../../../core/database/services/tasks.service"; -import { isTaskAvailable, isTaskDone } from "../../../core/is-task-done"; -import { Roster } from "../../../model/roster"; -import { LocalStorageBehaviorSubject } from "../../../core/local-storage-behavior-subject"; -import { Character } from "../../../model/character/character"; -import { tickets } from "../../../data/tickets"; -import { addWeeks, getWeek } from "date-fns"; +import { Component, HostListener } from '@angular/core'; +import { BehaviorSubject, combineLatest, map, Observable, pluck, startWith } from 'rxjs'; +import { LostarkTask } from '../../../model/lostark-task'; +import { TaskFrequency } from '../../../model/task-frequency'; +import { TaskScope } from '../../../model/task-scope'; +import { Completion } from '../../../model/completion'; +import { Energy } from '../../../model/energy'; +import { getCompletionEntry, getCompletionEntryKey, setCompletionEntry } from '../../../core/get-completion-entry-key'; +import { RosterService } from '../../../core/database/services/roster.service'; +import { SettingsService } from '../../../core/database/services/settings.service'; +import { EnergyService } from '../../../core/database/services/energy.service'; +import { TimeService } from '../../../core/time.service'; +import { CompletionService } from '../../../core/database/services/completion.service'; +import { TasksService } from '../../../core/database/services/tasks.service'; +import { isTaskAvailable, isTaskDone } from '../../../core/is-task-done'; +import { Roster } from '../../../model/roster'; +import { LocalStorageBehaviorSubject } from '../../../core/local-storage-behavior-subject'; +import { Character } from '../../../model/character/character'; +import { tickets } from '../../../data/tickets'; +import { addWeeks, getWeek } from 'date-fns'; export interface TaskCharacter extends Character { done?: boolean; } @Component({ - selector: "lostark-helper-checklist", - templateUrl: "./checklist.component.html", - styleUrls: ["./checklist.component.less"] + selector: 'lostark-helper-checklist', + templateUrl: './checklist.component.html', + styleUrls: ['./checklist.component.less'] }) export class ChecklistComponent { @@ -43,10 +43,10 @@ export class ChecklistComponent { dailyRoster: boolean, weeklyRoster: boolean, biWeeklyRoster: boolean, - }>("checklist:displayed", { dailyCharacter: true, weeklyCharacter: true, biWeeklyCharacter: true, dailyRoster: true, weeklyRoster: true, biWeeklyRoster: true }); + }>('checklist:displayed', { dailyCharacter: true, weeklyCharacter: true, biWeeklyCharacter: true, dailyRoster: true, weeklyRoster: true, biWeeklyRoster: true }); public roster$: Observable = this.rawRoster$.pipe( - pluck("characters") + pluck('characters') ); public tiersAvailability$ = this.roster$.pipe( @@ -63,7 +63,7 @@ export class ChecklistComponent { map(tiersAvailability => tickets.filter(t => !t.tier || tiersAvailability[`t${t.tier}`])) ); - public ticketsTrackingOpened = localStorage.getItem("checklist:tickets-opened") === "true"; + public ticketsTrackingOpened = localStorage.getItem('checklist:tickets-opened') === 'true'; public completion$: Observable = this.completionService.completion$; @@ -72,6 +72,7 @@ export class ChecklistComponent { public lastDailyReset$ = this.timeService.lastDailyReset$; public lastWeeklyReset$ = this.timeService.lastWeeklyReset$; public lastBiWeeklyReset$ = this.timeService.lastBiWeeklyReset$; + public lastBiWeeklyOffsetReset$ = this.timeService.lastBiWeeklyOffsetReset$; public nextDailyReset$ = this.lastDailyReset$.pipe( map(reset => reset + 86400000) @@ -89,6 +90,14 @@ export class ChecklistComponent { }) ); + public nextBiWeeklyOffsetReset$ = this.lastBiWeeklyOffsetReset$.pipe( + map(reset => { + const date = new Date(reset); + // If we're on an odd week, it means that reset is in one week, else it's in two + return addWeeks(reset, getWeek(date) % 2 === 0 ? 2 : 1).getTime(); + }) + ); + public tasks$: Observable = combineLatest([ this.rawRoster$, this.tasksService.tasks$ @@ -108,6 +117,7 @@ export class ChecklistComponent { this.lastDailyReset$, this.lastWeeklyReset$, this.lastBiWeeklyReset$, + this.lastBiWeeklyOffsetReset$, this.settings.settings$.pipe( map(settings => ({ lazytracking: settings.lazytracking, @@ -117,33 +127,34 @@ export class ChecklistComponent { this.energy$, this.forceShowHiddenCharacter$ ]).pipe( - map(([roster, tasks, completion, dailyReset, weeklyReset, biWeeklyReset, settings, energy, showHidden]) => { + map(([roster, tasks, completion, dailyReset, weeklyReset, biWeeklyReset, biWeeklyOffsetReset, settings, energy, showHidden]) => { const data = tasks .map(task => { const lazyTracking = settings.lazytracking; const available = isTaskAvailable(task); - const editDisabled = task.canEditDaysFilter === false; + const editDisabled = !task.canEditDaysFilter; const visible = available || editDisabled; // We always display tasks that can't be edited with "Not available today" flag const forceDone = (!available && visible); // If task is not available but is visible, we marked it as done const completionData = roster.characters .filter(c => showHidden || !c.isHide) .map(character => { - return { - done: Math.min(isTaskDone( - task, - character, - completion, - dailyReset, - weeklyReset, - biWeeklyReset, - lazyTracking - ), task.amount), - tracked: getCompletionEntry(roster.trackedTasks, character, task, true) !== false, - doable: character.ilvl >= (task.minIlvl || 0) && character.ilvl < (task.maxIlvl || Infinity), - energy: getCompletionEntry(energy.data, character, task) || 0 - }; - }); + return { + done: Math.min(isTaskDone( + task, + character, + completion, + dailyReset, + weeklyReset, + biWeeklyReset, + biWeeklyOffsetReset, + lazyTracking + ), task.amount), + tracked: getCompletionEntry(roster.trackedTasks, character, task, true) !== false, + doable: character.ilvl >= (task.minIlvl || 0) && character.ilvl < (task.maxIlvl || Infinity), + energy: getCompletionEntry(energy.data, character, task) || 0 + }; + }); const allDone = forceDone || completionData.every( ({ doable, done, tracked }) => !tracked || !doable || done >= task.amount @@ -151,7 +162,7 @@ export class ChecklistComponent { return { task, - hasEnergy: ["Una", "Guardian", "Chaos"].some(n => task.label?.startsWith(n)), + hasEnergy: ['Una', 'Guardian', 'Chaos'].some(n => task.label?.startsWith(n)), completion: completionData.map(row => row.done), energy: completionData.map(row => row.energy), completionData, @@ -166,12 +177,13 @@ export class ChecklistComponent { }) .reduce((acc, row) => { const frequencyKey = { - [TaskFrequency.DAILY]: "daily", - [TaskFrequency.WEEKLY]: "weekly", - [TaskFrequency.BIWEEKLY]: "biWeekly", - [TaskFrequency.ONE_TIME]: "oneTime" + [TaskFrequency.DAILY]: 'daily', + [TaskFrequency.WEEKLY]: 'weekly', + [TaskFrequency.BIWEEKLY]: 'biWeekly', + [TaskFrequency.BIWEEKLY_OFFSET]: 'biWeekly', + [TaskFrequency.ONE_TIME]: 'oneTime' }[row.task.frequency]; - const scopeKey = row.task.scope === TaskScope.CHARACTER ? "Character" : "Roster"; + const scopeKey = row.task.scope === TaskScope.CHARACTER ? 'Character' : 'Roster'; const data = [ ...acc[`${frequencyKey}${scopeKey}`].data, row @@ -259,7 +271,7 @@ export class ChecklistComponent { this.setTableHeight(); } - @HostListener("window:resize") + @HostListener('window:resize') setTableHeight(): void { this.windowResize$.next(); } @@ -269,7 +281,7 @@ export class ChecklistComponent { } public ticketsTrackingOpenedChange(opened: boolean): void { - localStorage.setItem("checklist:tickets-opened", opened.toString()); + localStorage.setItem('checklist:tickets-opened', opened.toString()); this.ticketsTrackingOpened = opened; } @@ -299,7 +311,7 @@ export class ChecklistComponent { }); if (task.scope === TaskScope.CHARACTER && task.frequency === TaskFrequency.DAILY - && ["Chaos", "Guardian", "Una"].some(n => task.label?.startsWith(n))) { + && ['Chaos', 'Guardian', 'Una'].some(n => task.label?.startsWith(n))) { const energyEntry = getCompletionEntry(energy.data, character, task) || { amount: 0 }; if (energyEntry.amount >= 20) { energyEntry.amount = Math.max(energyEntry.amount - (20 * (setAllDone ? task.amount : 1)), 0); diff --git a/apps/client/src/app/pages/gold-planner/gold-tasks.ts b/apps/client/src/app/pages/gold-planner/gold-tasks.ts index ace06c9a..2a0d5301 100644 --- a/apps/client/src/app/pages/gold-planner/gold-tasks.ts +++ b/apps/client/src/app/pages/gold-planner/gold-tasks.ts @@ -209,27 +209,27 @@ export const goldTasks: GoldTask[] = [ }, { name: "Kakul-Saydon Gate 1", - goldReward: 1000, + goldReward: 600, taskName: "Kakul-Saydon", - chestPrice: 800, + chestPrice: 300, completionId: "T3.L3.1", chestId: "Kakul1", overrideMinIlvl: 1475 }, { name: "Kakul-Saydon Gate 2", - goldReward: 1000, + goldReward: 900, taskName: "Kakul-Saydon", - chestPrice: 1000, + chestPrice: 500, completionId: "T3.L3.2", chestId: "Kakul2", overrideMinIlvl: 1475 }, { name: "Kakul-Saydon Gate 3", - goldReward: 2500, + goldReward: 1500, taskName: "Kakul-Saydon", - chestPrice: 1300, + chestPrice: 700, completionId: "T3.L3.3", chestId: "Kakul3", overrideMinIlvl: 1475 @@ -499,6 +499,72 @@ export const goldTasks: GoldTask[] = [ completionId: "T3.L11.4", chestId: "IvoryTowerH4", overrideMinIlvl: 1620 +}, +{ + name: "Theamine Normal Gate 1", + goldReward: 3500, + taskName: "Theamine", + chestPrice: 1500, + completionId: "T3.L12.1", + chestId: "TheamineN1", + overrideMinIlvl: 1610, + overrideMaxIlvl: 1630 +}, +{ + name: "Theamine Normal Gate 2", + goldReward: 4000, + taskName: "Theamine", + chestPrice: 1800, + completionId: "T3.L12.2", + chestId: "TheamineN2", + overrideMinIlvl: 1610, + overrideMaxIlvl: 1630 +}, +{ + name: "Theamine Normal Gate 3", + goldReward: 5500, + taskName: "Theamine", + chestPrice: 2500, + completionId: "T3.L12.3", + chestId: "TheamineN3", + overrideMinIlvl: 1610, + overrideMaxIlvl: 1630 +}, +{ + name: "Theamine Hard Gate 1", + goldReward: 5000, + taskName: "Theamine", + chestPrice: 2000, + completionId: "T3.L13.1", + chestId: "TheamineH1", + overrideMinIlvl: 1630 +}, +{ + name: "Theamine Hard Gate 2", + goldReward: 6000, + taskName: "Theamine", + chestPrice: 2400, + completionId: "T3.L13.2", + chestId: "TheamineH2", + overrideMinIlvl: 1630 +}, +{ + name: "Theamine Hard Gate 3", + goldReward: 9000, + taskName: "Theamine", + chestPrice: 2800, + completionId: "T3.L13.3", + chestId: "TheamineH3", + overrideMinIlvl: 1630 +}, +{ + name: "Theamine Hard Gate 4", + goldReward: 21000, + taskName: "Theamine G4", + chestPrice: 3600, + completionId: "T3.L13.4", + chestId: "TheamineH4", + overrideMinIlvl: 1630 } ]; diff --git a/apps/client/src/app/pages/party-planner/party-planner/party-planner.component.ts b/apps/client/src/app/pages/party-planner/party-planner/party-planner.component.ts index f189e16b..2d129f09 100644 --- a/apps/client/src/app/pages/party-planner/party-planner/party-planner.component.ts +++ b/apps/client/src/app/pages/party-planner/party-planner/party-planner.component.ts @@ -1,24 +1,24 @@ -import { Component, HostListener } from "@angular/core"; -import { UserService } from "../../../core/database/services/user.service"; -import { RosterService } from "../../../core/database/services/roster.service"; -import { CompletionService } from "../../../core/database/services/completion.service"; -import { TasksService } from "../../../core/database/services/tasks.service"; -import { BehaviorSubject, combineLatest, first, map, of, pluck, switchMap } from "rxjs"; -import { TimeService } from "../../../core/time.service"; -import { isTaskDone } from "../../../core/is-task-done"; -import { SettingsService } from "../../../core/database/services/settings.service"; -import { TaskFrequency } from "../../../model/task-frequency"; -import { TaskScope } from "../../../model/task-scope"; -import { LostarkTask } from "../../../model/lostark-task"; -import { subtasks } from "../subtasks"; -import { LostarkTaskWithSubtask } from "../../../model/lostark-task-with-subtask"; -import { tickets } from "../../../data/tickets"; -import { LocalStorageBehaviorSubject } from "../../../core/local-storage-behavior-subject"; +import { Component, HostListener } from '@angular/core'; +import { UserService } from '../../../core/database/services/user.service'; +import { RosterService } from '../../../core/database/services/roster.service'; +import { CompletionService } from '../../../core/database/services/completion.service'; +import { TasksService } from '../../../core/database/services/tasks.service'; +import { BehaviorSubject, combineLatest, first, map, of, pluck, switchMap } from 'rxjs'; +import { TimeService } from '../../../core/time.service'; +import { isTaskDone } from '../../../core/is-task-done'; +import { SettingsService } from '../../../core/database/services/settings.service'; +import { TaskFrequency } from '../../../model/task-frequency'; +import { TaskScope } from '../../../model/task-scope'; +import { LostarkTask } from '../../../model/lostark-task'; +import { subtasks } from '../subtasks'; +import { LostarkTaskWithSubtask } from '../../../model/lostark-task-with-subtask'; +import { tickets } from '../../../data/tickets'; +import { LocalStorageBehaviorSubject } from '../../../core/local-storage-behavior-subject'; @Component({ - selector: "lostark-helper-party-planner", - templateUrl: "./party-planner.component.html", - styleUrls: ["./party-planner.component.less"] + selector: 'lostark-helper-party-planner', + templateUrl: './party-planner.component.html', + styleUrls: ['./party-planner.component.less'] }) export class PartyPlannerComponent { public TaskFrequency = TaskFrequency; @@ -28,8 +28,8 @@ export class PartyPlannerComponent { public friendIds$ = this.userService.friendIds$; - public ignoredFriends$ = new LocalStorageBehaviorSubject("party-planner:ignored-friends", []); - public includeTickets$ = new LocalStorageBehaviorSubject("party-planner:include-tickets", true); + public ignoredFriends$ = new LocalStorageBehaviorSubject('party-planner:ignored-friends', []); + public includeTickets$ = new LocalStorageBehaviorSubject('party-planner:include-tickets', true); public tasks$ = combineLatest([ this.tasksService.tasks$, @@ -77,9 +77,10 @@ export class PartyPlannerComponent { this.timeService.lastDailyReset$, this.timeService.lastWeeklyReset$, this.timeService.lastBiWeeklyReset$, - this.settings.settings$.pipe(pluck("lazytracking")) + this.timeService.lastBiWeeklyOffsetReset$, + this.settings.settings$.pipe(pluck('lazytracking')) ]).pipe( - switchMap(([tasks, roster, completion, dailyReset, weeklyReset, biWeeklyReset, lazyTracking]) => { + switchMap(([tasks, roster, completion, dailyReset, weeklyReset, biWeeklyReset, biWeeklyOffsetReset, lazyTracking]) => { return this.friendIdsToConsider$.pipe( switchMap(friendIds => { if (friendIds.length === 0) { @@ -146,7 +147,7 @@ export class PartyPlannerComponent { task, data: roster.characters .map(character => { - const done = isTaskDone(task, character, completion, dailyReset, weeklyReset, biWeeklyReset, lazyTracking); + const done = isTaskDone(task, character, completion, dailyReset, weeklyReset, biWeeklyReset, biWeeklyOffsetReset, lazyTracking); const canDo = character.ilvl >= (task.minIlvl || 0) && character.ilvl < (task.maxIlvl || Infinity); if (done === -1 || done >= task.amount || !canDo) { return { @@ -171,7 +172,7 @@ export class PartyPlannerComponent { characters: (friendRoster.characters || []) .filter(c => !c.isPrivate) .filter(fChar => { - const fDone = isTaskDone(friendTask, fChar, friendCompletion, dailyReset, weeklyReset, biWeeklyReset, {}); + const fDone = isTaskDone(friendTask, fChar, friendCompletion, dailyReset, weeklyReset, biWeeklyReset, biWeeklyOffsetReset, {}); return fDone >= 0 && fDone < task.amount && fChar.ilvl >= (task.minIlvl || 0) @@ -180,7 +181,7 @@ export class PartyPlannerComponent { .map(c => { return { doable: Math.min( - task.amount - isTaskDone(friendTask, c, friendCompletion, dailyReset, weeklyReset, biWeeklyReset, {}), + task.amount - isTaskDone(friendTask, c, friendCompletion, dailyReset, weeklyReset, biWeeklyReset, biWeeklyOffsetReset, {}), task.amount - done ), c @@ -204,11 +205,12 @@ export class PartyPlannerComponent { }) .reduce((acc, row) => { const frequencyKey = { - [TaskFrequency.DAILY]: "daily", - [TaskFrequency.WEEKLY]: "weekly", - [TaskFrequency.BIWEEKLY]: "biWeekly" + [TaskFrequency.DAILY]: 'daily', + [TaskFrequency.WEEKLY]: 'weekly', + [TaskFrequency.BIWEEKLY]: 'biWeekly', + [TaskFrequency.BIWEEKLY_OFFSET]: 'biWeekly' }[row.task.frequency]; - const scopeKey = row.task.scope === TaskScope.CHARACTER ? "Character" : "Roster"; + const scopeKey = row.task.scope === TaskScope.CHARACTER ? 'Character' : 'Roster'; return { ...acc, [`${frequencyKey}${scopeKey}`]: [ @@ -246,7 +248,7 @@ export class PartyPlannerComponent { this.setTableHeight(); } - @HostListener("window:resize") + @HostListener('window:resize') setTableHeight(): void { this.windowResized$.next(); } diff --git a/apps/client/src/app/pages/party-planner/subtasks.ts b/apps/client/src/app/pages/party-planner/subtasks.ts index b80b293c..19b485bf 100644 --- a/apps/client/src/app/pages/party-planner/subtasks.ts +++ b/apps/client/src/app/pages/party-planner/subtasks.ts @@ -65,7 +65,12 @@ export const subtasks: Subtask[] = [ { id: `akkan-normal`, name: `Akkan Normal`, parentName: "Akkan", minIlvl: 1580 }, { id: `akkan-hard`, name: `Akkan Hard`, parentName: "Akkan", minIlvl: 1600 }, - //Ivory Tower Difficulties - { id: `ivory-tower-normal`, name: `Ivory Tower Normal`, parentName: "Ivory Tower", minIlvl: 1600 }, - { id: `ivory-tower-hard`, name: `Ivory Tower Hard`, parentName: "Ivory Tower", minIlvl: 1620 }, + //Ivory Tower Difficulties + { id: `ivory-tower-normal`, name: `Ivory Tower Normal`, parentName: "Ivory Tower", minIlvl: 1600 }, + { id: `ivory-tower-hard`, name: `Ivory Tower Hard`, parentName: "Ivory Tower", minIlvl: 1620 }, + + //Theamine Difficulties + { id: `theamine-normal`, name: `Theamine Normal`, parentName: "Theamine", minIlvl: 1610 }, + { id: `theamine-hard`, name: `Theamine Hard`, parentName: "Theamine G4", minIlvl: 1630 }, + ]; diff --git a/apps/client/src/app/pages/tasks/tasks/tasks.component.html b/apps/client/src/app/pages/tasks/tasks/tasks.component.html index 527f5889..b1b5dad0 100644 --- a/apps/client/src/app/pages/tasks/tasks/tasks.component.html +++ b/apps/client/src/app/pages/tasks/tasks/tasks.component.html @@ -58,6 +58,7 @@ +