Skip to content

Commit

Permalink
chore(quest-preview-starters): add quest starters in the preview (#605)
Browse files Browse the repository at this point in the history
  • Loading branch information
Helias committed Apr 13, 2020
1 parent 5a4513b commit daf5c29
Show file tree
Hide file tree
Showing 7 changed files with 103 additions and 8 deletions.
29 changes: 29 additions & 0 deletions src/app/features/quest/quest-preview/quest-preview.component.html
Expand Up @@ -2,9 +2,38 @@
<perfect-scrollbar class="transparent">
<div class="preview-content quest-preview">
<h5 *ngIf="!!service.title">{{ service.title }}</h5>
<p *ngIf="!!service.level">Level: {{ service.level }}</p>
<p *ngIf="!!service.minLevel">Requires level: {{ service.minLevel }}</p>
<p *ngIf="!!service.side">Side: &nbsp;<span class="side {{ service.side.toLowerCase() }}"></span> {{ service.side }}</p>
<p *ngIf="!service.side && service.races">Races: {{ service.races }}</p>
<!-- Quest starter -->
<p *ngIf="service.questGivenByItem | async as qitem">
<img src="assets/img/quest/quest_start.gif">
Start:
<keira-icon [size]="'small'" [itemId]="qitem"></keira-icon>
<strong class="colored">{{ service.questStarterItem | async }}</strong>
</p>
<div *ngIf="service.creatureQueststarter.length > 0">
<p *ngFor="let q of service.creatureQueststarter">
<img src="assets/img/quest/quest_start.gif"> NPC Start: <strong class="colored">{{ service.mysqlQueryService.getCreatureNameById(q.id) | async }}</strong>
</p>
</div>
<div *ngIf="service.gameobjectQueststarter.length > 0">
<p *ngFor="let q of service.gameobjectQueststarter">
<img src="assets/img/quest/quest_start.gif"> GO Start: <strong class="colored">{{ service.mysqlQueryService.getGameObjectNameById(q.id) | async }}</strong>
</p>
</div>
<!-- Quest ender -->
<div *ngIf="service.creatureQuestender.length > 0">
<p *ngFor="let q of service.creatureQuestender">
<img src="assets/img/quest/quest_end.gif"> NPC End: <strong class="colored">{{ service.mysqlQueryService.getCreatureNameById(q.id) | async }}</strong>
</p>
</div>
<div *ngIf="service.gameobjectQuestender.length > 0">
<p *ngFor="let q of service.gameobjectQuestender">
<img src="assets/img/quest/quest_end.gif"> GO End: <strong class="colored">{{ service.mysqlQueryService.getGameObjectNameById(q.id) | async }}</strong>
</p>
</div>
<p>{{ service.sharable }}</p>
</div>
</perfect-scrollbar>
Expand Down
Expand Up @@ -11,6 +11,8 @@ import { GameobjectQuestenderService } from '../gameobject-questender/gameobject
import { CreatureQueststarterService } from '../creature-queststarter/creature-queststarter.service';
import { CreatureQuestenderService } from '../creature-questender/creature-questender.service';
import { QuestHandlerService } from '../quest-handler.service';
import { MysqlQueryService } from '@keira-shared/services/mysql-query.service';
import { of } from 'rxjs';

describe('QuestPreviewService', () => {

Expand All @@ -28,9 +30,10 @@ describe('QuestPreviewService', () => {

const setup = () => {
const service = TestBed.inject(QuestPreviewService);
const mysqlQueryService = TestBed.inject(MysqlQueryService);
const questTemplateService = TestBed.inject(QuestTemplateService);

return { service, questTemplateService };
return { service, mysqlQueryService, questTemplateService };
};

it('handle questTemplate values', () => {
Expand Down Expand Up @@ -63,6 +66,25 @@ describe('QuestPreviewService', () => {
expect(service.sharable).toBe('Not sharable');
});

it('mysqlQuery', async() => {
const { service, mysqlQueryService, questTemplateService } = setup();
const mockID = 123;
const mockItem = '1234';
const mockItemName = 'Helias Item';

spyOn(mysqlQueryService, 'getItemByStartQuest').and.callFake(i => of(mockItem).toPromise());
spyOn(mysqlQueryService, 'getItemNameByStartQuest').and.callFake(i => of(mockItemName).toPromise());
questTemplateService.form.controls.ID.setValue(mockID);

expect(await service.questGivenByItem).toBe(mockItem);
expect(await service.questStarterItem).toBe(mockItemName);

expect(mysqlQueryService.getItemByStartQuest).toHaveBeenCalledTimes(1);
expect(mysqlQueryService.getItemByStartQuest).toHaveBeenCalledWith(mockID);
expect(mysqlQueryService.getItemNameByStartQuest).toHaveBeenCalledTimes(1);
expect(mysqlQueryService.getItemNameByStartQuest).toHaveBeenCalledWith(mockID);
});

it('initializeService', () => {
const { service, questTemplateService } = setup();
const initServiceSpy: Spy = spyOn<any>(service, 'initService').and.callThrough();
Expand Down
31 changes: 24 additions & 7 deletions src/app/features/quest/quest-preview/quest-preview.service.ts
Expand Up @@ -9,8 +9,14 @@ import { CreatureQueststarterService } from '../creature-queststarter/creature-q
import { CreatureQuestenderService } from '../creature-questender/creature-questender.service';
import { PreviewHelperService } from '@keira-shared/services/preview-helper.service';
import { QUEST_FLAG_SHARABLE } from '@keira-shared/constants/flags/quest-flags';
import { MysqlQueryService } from '@keira-shared/services/mysql-query.service';
import { QuestTemplate } from '@keira-shared/types/quest-template.type';
import { CreatureQueststarter } from '@keira-shared/types/creature-queststarter.type';
import { EditorService } from '@keira-shared/abstract/service/editors/editor.service';
import { TableRow } from '@keira-types/general';
import { GameobjectQueststarter } from '@keira-shared/types/gameobject-queststarter.type';
import { CreatureQuestender } from '@keira-shared/types/creature-questender.type';
import { GameobjectQuestender } from '@keira-shared/types/gameobject-questender.type';

@Injectable()
export class QuestPreviewService {
Expand All @@ -26,16 +32,27 @@ export class QuestPreviewService {
private readonly gameobjectQuestenderService: GameobjectQuestenderService,
private readonly creatureQueststarterService: CreatureQueststarterService,
private readonly creatureQuestenderService: CreatureQuestenderService,
public readonly mysqlQueryService: MysqlQueryService,
) { }

private questTemplateForm = this.questTemplateService.form.controls;
// get QuestTemplate values
get title(): string { return this.questTemplate.LogTitle; }
get level(): string { return String(this.questTemplate.QuestLevel); }
get minLevel(): string { return String(this.questTemplate.MinLevel); }
get side(): string { return this.helperService.getFactionFromRace(this.questTemplate.AllowableRaces); }
get races(): string { return this.helperService.getRaceString(this.questTemplate.AllowableRaces)?.join(','); }
get sharable(): string { return this.questTemplate.Flags & QUEST_FLAG_SHARABLE ? 'Sharable' : 'Not sharable'; }

get title(): string { return this.questTemplateForm.LogTitle.value; }
get level(): string { return String(this.questTemplateForm.QuestLevel.value); }
get minLevel(): string { return String(this.questTemplateForm.MinLevel.value); }
get side(): string { return this.helperService.getFactionFromRace(this.questTemplateForm.AllowableRaces.value); }
get races(): string { return this.helperService.getRaceString(this.questTemplateForm.AllowableRaces.value)?.join(','); }
get sharable(): string { return this.questTemplateForm.Flags.value & QUEST_FLAG_SHARABLE ? 'Sharable' : 'Not sharable'; }
// get form value
get questTemplate(): QuestTemplate { return this.questTemplateService.form.getRawValue(); }
get creatureQueststarter(): CreatureQueststarter[] { return this.creatureQueststarterService.newRows; }
get creatureQuestender(): CreatureQuestender[] { return this.creatureQuestenderService.newRows; }
get gameobjectQueststarter(): GameobjectQueststarter[] { return this.gameobjectQueststarterService.newRows; }
get gameobjectQuestender(): GameobjectQuestender[] { return this.gameobjectQuestenderService.newRows; }

// Item Quest Starter
get questGivenByItem(): Promise<string> { return this.mysqlQueryService.getItemByStartQuest(this.questTemplate.ID); }
get questStarterItem(): Promise<string> { return this.mysqlQueryService.getItemNameByStartQuest(this.questTemplate.ID); }

initializeServices() {
this.initService(this.questTemplateService);
Expand Down
19 changes: 19 additions & 0 deletions src/app/shared/services/mysql-query.service.spec.ts
Expand Up @@ -922,5 +922,24 @@ describe('MysqlQueryService', () => {
'SELECT `LogTitle` AS "v" FROM `quest_template` WHERE (RequiredNpcOrGo1 = 1)'
);
});

it('getItemByStartQuest', async () => {
expect(await service.getItemByStartQuest(id)).toEqual(result);
expect(await service.getItemByStartQuest(id)).toEqual(result); // check cache
expect(service.queryValue).toHaveBeenCalledTimes(1); // check cache
expect(service.queryValue).toHaveBeenCalledWith(
`SELECT entry AS v FROM item_template WHERE startquest = ${id}`,
);
});

it('getItemNameByStartQuest', async () => {
expect(await service.getItemNameByStartQuest(id)).toEqual(result);
expect(await service.getItemNameByStartQuest(id)).toEqual(result); // check cache
expect(service.queryValue).toHaveBeenCalledTimes(1); // check cache
expect(service.queryValue).toHaveBeenCalledWith(
`SELECT name AS v FROM item_template WHERE startquest = ${id}`,
);
});

});
});
8 changes: 8 additions & 0 deletions src/app/shared/services/mysql-query.service.ts
Expand Up @@ -381,6 +381,14 @@ export class MysqlQueryService extends QueryService {
return this.queryValueToPromiseCached('getNextQuestById', String(id), `SELECT NextQuestID AS v FROM quest_template_addon WHERE id = ${id}`);
}

getItemByStartQuest(id: string|number): Promise<string> {
return this.queryValueToPromiseCached('getItemStartQuest', String(id), `SELECT entry AS v FROM item_template WHERE startquest = ${id}`);
}

getItemNameByStartQuest(id: string|number): Promise<string> {
return this.queryValueToPromiseCached('getItemNameByStartQuest', String(id), `SELECT name AS v FROM item_template WHERE startquest = ${id}`);
}

getItemNameById(id: string|number): Promise<string> {
return this.queryValueToPromiseCached('getItemNameById', String(id), `SELECT name AS v FROM item_template WHERE entry = ${id}`);
}
Expand Down
Binary file added src/assets/img/quest/quest_end.gif
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/img/quest/quest_start.gif
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit daf5c29

Please sign in to comment.