diff --git a/public/images/events/banner.png b/public/images/events/banner.png new file mode 100644 index 00000000000..25fdc0c1ab5 Binary files /dev/null and b/public/images/events/banner.png differ diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 0a5e0a6a991..5520d0c0b96 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -48,6 +48,7 @@ import { BerryType } from '../data/berry'; import i18next from '../plugins/i18n'; import { speciesEggMoves } from '../data/egg-moves'; import { ModifierTier } from '../modifier/modifier-tier'; +import { TimedEventManager } from '#app/timed-event-manager.js'; export enum FieldPosition { CENTER, @@ -1096,9 +1097,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { let shinyThreshold = new Utils.IntegerHolder(32); if (thresholdOverride === undefined) { + const eventManager = new TimedEventManager() if (!this.hasTrainer()) { - if (new Date() < new Date('2024-05-21')) - shinyThreshold.value *= 3; + if (eventManager.isEventActive()) + shinyThreshold.value *= eventManager.getShinyMultiplier(); this.scene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold); } } else diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 56d0ab47f13..a3d89113ea5 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -9,6 +9,7 @@ import { WindowVariant, getWindowVariantSuffix } from "./ui/ui-theme"; import { isMobile } from "./touch-controls"; import * as Utils from "./utils"; import { initI18n } from "./plugins/i18n"; +import { TimedEventManager } from "./timed-event-manager"; export class LoadingScene extends SceneBase { constructor() { @@ -29,6 +30,9 @@ export class LoadingScene extends SceneBase { // Load menu images this.loadAtlas('bg', 'ui'); + if (new TimedEventManager().isEventActive()) { + this.loadImage('banner', 'events') + } this.loadImage('command_fight_labels', 'ui'); this.loadAtlas('prompt', 'ui'); this.loadImage('candy', 'ui'); @@ -209,9 +213,6 @@ export class LoadingScene extends SceneBase { this.loadImage('egg_list_bg', 'ui'); - this.loadImage('end_m', 'cg'); - this.loadImage('end_f', 'cg'); - for (let i = 0; i < 10; i++) { this.loadAtlas(`pokemon_icons_${i}`, ''); if (i) diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts new file mode 100644 index 00000000000..3c56422af45 --- /dev/null +++ b/src/timed-event-manager.ts @@ -0,0 +1,41 @@ +interface TimedEvent { + name: string; + eventType: string; + value: number; + startDate: string; + endDate: string; +} + +const timedEvents: TimedEvent[] = [ + {"name": "3x Shiny Weekend", "eventType": "shiny", "value": 3, + "startDate": "2024-05-18", "endDate": "2024-05-21"}, +]; + +export class TimedEventManager { + constructor() {} + + isEventActive(): boolean { + for (const timedEvent of timedEvents) { + const eventStart = new Date(timedEvent.startDate); + const now = new Date(); + const eventEnd = new Date(timedEvent.endDate); + + if (eventStart < now && now < eventEnd) { + return true; + } + } + return false; + } + + getShinyMultiplier(): number { + let multiplier = 1; + for (const timedEvent of timedEvents) { + if (timedEvent.eventType === 'shiny' && + new Date(timedEvent.startDate) < new Date() && + new Date() < new Date(timedEvent.endDate)) { + multiplier *= timedEvent.value; + } + } + return multiplier; + } +} diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index 4da4f189f6b..9c690d3a053 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -6,6 +6,7 @@ import * as Utils from "../utils"; import { TextStyle, addTextObject } from "./text"; import { getBattleCountSplashMessage, getSplashMessages } from "../data/splash-messages"; import i18next from "i18next"; +import { TimedEventManager } from "#app/timed-event-manager.js"; export default class TitleUiHandler extends OptionSelectUiHandler { private titleContainer: Phaser.GameObjects.Container; @@ -31,7 +32,18 @@ export default class TitleUiHandler extends OptionSelectUiHandler { const logo = this.scene.add.image((this.scene.game.canvas.width / 6) / 2, 8, 'logo'); logo.setOrigin(0.5, 0); + this.titleContainer.add(logo); + + if (new TimedEventManager().isEventActive()) { + const banner = this.scene.add.image((this.scene.game.canvas.width / 6.5) / 2, (this.scene.game.canvas.height / 4.65) / 2, 'banner'); + banner.displayWidth = this.scene.game.canvas.width / 18.33 + banner.displayHeight = banner.displayWidth / 3 + banner.setOrigin(0.315, -0.8); + + + this.titleContainer.add(banner); + } this.dailyRunScoreboard = new DailyRunScoreboard(this.scene, 1, 44); this.dailyRunScoreboard.setup();