Skip to content

Commit

Permalink
Merge pull request #551 from hymccord/sunken-city-stager
Browse files Browse the repository at this point in the history
Convert Sunken City stager
  • Loading branch information
AardWolf authored Apr 23, 2024
2 parents e319d2c + 399cef0 commit 08bdac7
Show file tree
Hide file tree
Showing 8 changed files with 108 additions and 30 deletions.
1 change: 0 additions & 1 deletion src/scripts/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -1183,7 +1183,6 @@ import * as detailingFuncs from './modules/details/legacy';
"Festive Comet": stagingFuncs.addFestiveCometStage,
"Frozen Vacant Lot": stagingFuncs.addFestiveCometStage,
"Gnawnian Express Station": stagingFuncs.addTrainStage,
"Sunken City": stagingFuncs.addSunkenCityStage,
};

/** @type {Object<string, import("./modules/stages/stages.types").IStager>} */
Expand Down
34 changes: 34 additions & 0 deletions src/scripts/modules/stages/environments/sunkenCity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import {type User} from '@scripts/types/hg';
import {type IntakeMessage} from '@scripts/types/mhct';
import {type IStager} from '../stages.types';

export class SunkenCityStager implements IStager {
readonly environment: string = 'Sunken City';

addStage(message: IntakeMessage, userPre: User, userPost: User, journal: unknown): void {
const quest = userPre.quests.QuestSunkenCity;

if (!quest) {
throw new Error('QuestSunkenCity is undefined');
}

if (!quest.is_diving) {
message.stage = "Docked";
return;
}

const depth = quest.distance;
message.stage = quest.zone_name;
if (depth < 2000) {
message.stage += " 0-2km";
} else if (depth < 10000) {
message.stage += " 2-10km";
} else if (depth < 15000) {
message.stage += " 10-15km";
} else if (depth < 25000) {
message.stage += " 15-25km";
} else if (depth >= 25000) {
message.stage += " 25km+";
}
}
}
4 changes: 4 additions & 0 deletions src/scripts/modules/stages/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@ import {MousoleumStager} from './environments/mousoleum';
import {MuridaeMarketStager} from './environments/muridaeMarket';
import {QuesoGeyserStager} from './environments/quesoGeyser';
import {SandDunesStager} from './environments/sandDunes';
import {SchoolOfSorceryStager} from './environments/schoolOfSorcery';
import {SeasonalGardenStager} from './environments/seasonalGarden';
import {SlushyShorelineStager} from './environments/slushyShoreline';
import {SunkenCityStager} from './environments/sunkenCity';
import {SuperBrieFactoryStager} from './environments/superBrieFactory';
import {TableOfContentsStager} from './environments/tableOfContents';
import {ToxicSpillStager} from './environments/toxicSpill';
Expand Down Expand Up @@ -58,8 +60,10 @@ const stageModules: IStager[] = [
new MuridaeMarketStager(),
new QuesoGeyserStager(),
new SandDunesStager(),
new SchoolOfSorceryStager(),
new SeasonalGardenStager(),
new SlushyShorelineStager(),
new SunkenCityStager(),
new SuperBrieFactoryStager(),
new TableOfContentsStager(),
new ToxicSpillStager(),
Expand Down
28 changes: 0 additions & 28 deletions src/scripts/modules/stages/legacy.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,34 +29,6 @@ export function addFestiveCometStage(message, user, user_post, hunt) {
}

/**
* Report the zone and depth, if any.
* @param {Object <string, any>} message The message to be sent.
* @param {Object <string, any>} user The user state object, when the hunt was invoked (pre-hunt).
* @param {Object <string, any>} user_post The user state object, after the hunt.
* @param {Object <string, any>} hunt The journal entry corresponding to the active hunt.
*/
export function addSunkenCityStage(message, user, user_post, hunt) {
const quest = user.quests.QuestSunkenCity;
if (!quest.is_diving) {
message.stage = "Docked";
return;
}

const depth = quest.distance;
message.stage = quest.zone_name;
if (depth < 2000) {
message.stage += " 0-2km";
} else if (depth < 10000) {
message.stage += " 2-10km";
} else if (depth < 15000) {
message.stage += " 10-15km";
} else if (depth < 25000) {
message.stage += " 15-25km";
} else if (depth >= 25000) {
message.stage += " 25km+";
}
}

/**
* Report on the unique minigames in each sub-location. Reject hunts for which the train
* moved / updated / departed, as the hunt stage is ambiguous.
Expand Down
2 changes: 1 addition & 1 deletion src/scripts/types/hg.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ export interface Quests {
QuestRiftValour?: quests.QuestRiftValour
QuestSandDunes?: quests.QuestSandDunes
QuestSchoolOfSorcery?: quests.QuestSchoolOfSorcery
QuestSunkenCity?: unknown
QuestSunkenCity?: quests.QuestSunkenCity
QuestSuperBrieFactory?: quests.QuestSuperBrieFactory
QuestSpringHunt?: quests.QuestSpringHunt
QuestTableOfContents?: quests.QuestTableOfContents
Expand Down
1 change: 1 addition & 0 deletions src/scripts/types/quests/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export * from '@scripts/types/quests/mousoleum';
export * from '@scripts/types/quests/moussuPicchu';
export * from '@scripts/types/quests/quesoGeyser';
export * from '@scripts/types/quests/sandDunes';
export * from '@scripts/types/quests/sunkenCity';
export * from '@scripts/types/quests/superBrieFactory';
export * from '@scripts/types/quests/tableOfContents';
export * from '@scripts/types/quests/schoolOfSorcery';
Expand Down
5 changes: 5 additions & 0 deletions src/scripts/types/quests/sunkenCity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export interface QuestSunkenCity {
is_diving: boolean;
distance: number;
zone_name: string;
}
63 changes: 63 additions & 0 deletions tests/scripts/modules/stages/environments/sunkenCity.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import {SunkenCityStager} from "@scripts/modules/stages/environments/sunkenCity";
import {User} from "@scripts/types/hg";
import {IntakeMessage} from "@scripts/types/mhct";

describe('Sunken City stages', () => {
it('should be for the "Sunken City" environment', () => {
const stager = new SunkenCityStager();
expect(stager.environment).toBe('Sunken City');
});

it('should set stage to "Docked" if user is not diving', () => {
const stager = new SunkenCityStager();
const message = {} as IntakeMessage;
const preUser = {quests: {QuestSunkenCity: {
is_diving: false,
}}} as User;
const postUser = {} as User;
const journal = {};

stager.addStage(message, preUser, postUser, journal);

expect(message.stage).toBe('Docked');
});

it.each`
distance | expected
${0} | ${'0-2km'}
${1990} | ${'0-2km'}
${2000} | ${'2-10km'}
${9990} | ${'2-10km'}
${10000} | ${'10-15km'}
${14990} | ${'10-15km'}
${15000} | ${'15-25km'}
${24990} | ${'15-25km'}
${25000} | ${'25km+'}
${100000} | ${'25km+'}
`('should append "$expected" to zone name when depth is $distance', ({distance, expected}) => {
const stager = new SunkenCityStager();
const message = {} as IntakeMessage;
const preUser = {quests: {QuestSunkenCity: {
is_diving: true,
distance: distance,
zone_name: 'Test Zone',
}}} as User;
const postUser = {} as User;
const journal = {};

stager.addStage(message, preUser, postUser, journal);

expect(message.stage).toBe(`Test Zone ${expected}`);
});

it.each([undefined, null])('should throw when QuestSunken city is %p', (state) => {
const stager = new SunkenCityStager();
const message = {} as IntakeMessage;
const preUser = {quests: {QuestSunkenCity: state}} as User;
const postUser = {} as User;
const journal = {};

expect(() => stager.addStage(message, preUser, postUser, journal))
.toThrow('QuestSunkenCity is undefined');
});
});

0 comments on commit 08bdac7

Please sign in to comment.