ChurchAngular/src/app/games/massive-darkness2/massive-darkness2.component.ts
2025-11-03 15:35:52 -08:00

163 lines
5.6 KiB
TypeScript

import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';
import { FileService } from '../../services/file.service';
import { MsgBoxService } from '../../services/msg-box.service';
import { ArrayUtils } from '../../utilities/array-utils';
import { ObjectUtils } from '../../utilities/object-utils';
import { first, map, take, takeUntil } from 'rxjs/operators';
import { TreasureType, DrawingBag, DrawingItem, HeroClass, MD2HeroInfo, RoundPhase, MobInfo, MobDlgType } from './massive-darkness2.model';
import { MD2Service } from '../../services/MD2/md2.service';
import { GameRoomService } from '../../services/game-room.service';
import { MD2Base } from './MD2Base';
import { StateService } from '../../services/state.service';
import { ActivatedRoute } from '@angular/router';
import { QRCodeService } from '../../services/qrcode.service';
import { StringUtils } from '../../utilities/string-utils';
import { SpawnMobDlgComponent } from './mobs/spawn-mob-dlg/spawn-mob-dlg.component';
import { BossMicheal } from './massive-darkness2.model.boss';
import { MD2InitService } from '../../services/MD2/md2-init.service';
import { NumberUtils } from '../../utilities/number-utils';
@Component({
selector: 'ngx-massive-darkness2',
templateUrl: './massive-darkness2.component.html',
styleUrls: ['./massive-darkness2.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class MassiveDarkness2Component extends MD2Base implements OnInit {
HeroClass = HeroClass;
constructor(
private fileService: FileService,
private initService: MD2InitService,
private msgBoxService: MsgBoxService,
private qrCodeService: QRCodeService,
public gameRoomService: GameRoomService,
public md2Service: MD2Service,
protected stateService: StateService,
protected route: ActivatedRoute,
protected cdRef: ChangeDetectorRef,
) {
super(md2Service, stateService, route, cdRef);
}
ngOnInit(): void {
super.ngOnInit();
this.md2Service.enemyPhaseSubject.pipe(takeUntil(this.destroy$)).subscribe(result => {
this.showEnemyPhaseAction(0);
});
this.initService.initMobDecks();
this.initService.initTreasureBag();
}
override signalRInitialized() {
}
showQrCode() {
if (this.md2Service.initialized == false) {
this.gameRoomService.createGameRoom('MD2');
this.md2Service.initialized = true;
}
let initUrl = `${window.location.origin}/games/MD2_Hero/${this.gameRoomService.gameRoomId}`;
this.msgBoxService.show("Scan To Join", { text: `<img src='${this.qrCodeService.QRCodeUrl(initUrl, 5)}'><br><a href='${initUrl}' target='_blank'>Link</a>` });
}
refreshUI() {
console.log('Dashboard RefreshUI');
}
heroClassName(heroInfo: MD2HeroInfo) {
return HeroClass[heroInfo.class];
}
showEnemyPhaseAction(index: number) {
let mob = this.md2Service.enemyPhaseMobs[index];
let enemyInfo = `<img src="${mob.imageUrl}" class='g-height-70vh'><br>`;
let extraRule = '';
// switch (Math.random() * 3) {
// case 1:
// break;
// case 2:
// break;
// case 3:
// break;
// case 0:
// default:
// break;
// }
this.msgBoxService.dlgService.open(SpawnMobDlgComponent, {
context: {
title: `Enemy Phase(${(index + 1)}/${this.md2Service.enemyPhaseMobs.length})`,
mode: MobDlgType.Activating,
mob: mob
}
})
.onClose.pipe(first()).subscribe(result => {
index++;
if (index < this.md2Service.enemyPhaseMobs.length) {
this.showEnemyPhaseAction(index);
} else {
this.md2Service.runNextPhase();
}
});
// return this.msgBoxService.show(`Enemy Phase(${(this.enemyPhaseMobs.indexOf(mob) + 1)}/${this.enemyPhaseMobs.length})`, {
// text: enemyInfo,
// confirmButtonText: 'Next', buttons: ADButtons.OK
// }).pipe(first()).subscribe(result => {
// if ((this.enemyPhaseMobs.indexOf(mob) + 1) < this.enemyPhaseMobs.length) {
// this.showEnemyPhaseAction(this.enemyPhaseMobs[this.enemyPhaseMobs.indexOf(mob) + 1]);
// }
// });
}
public get roundPhase(): string {
switch (this.md2Service.info.roundPhase) {
case RoundPhase.HeroPhase:
return StringUtils.getHtmlBadge("Hero Action Phase", "primary")
case RoundPhase.EnemyPhase:
return StringUtils.getHtmlBadge("Enemy Action Phase", "danger")
case RoundPhase.LevelUpPhase:
return StringUtils.getHtmlBadge("Level Up Phase", "success")
case RoundPhase.DarknessPhase:
return StringUtils.getHtmlBadge("Darkness Phase", "dark")
default: break;
}
}
public get anyHeroRemainAction(): boolean {
return this.md2Service.heros.some(h => h.remainActions > 0);
}
heroAction(hero: MD2HeroInfo, action: string) {
}
enterBossFight() {
this.md2Service.enterBossFight();
}
accessHealFountain() {
this.md2Service.drawingHealFountain();
}
broadcastHeros() {
this.md2Service.heros.forEach(hero => {
hero.uiShowAttackBtn = this.md2Service.mobs.length > 0 || this.md2Service.roamingMonsters.length > 0 || this.md2Service.info.isBossFight;
});
this.md2Service.broadcastService.broadcastAllHeroInfoToAll();
}
removeHero(hero) {
this.md2Service.info.heros.splice(this.md2Service.info.heros.indexOf(hero));
}
public get round(): string {
if (this.md2Service.info.isBossFight) {
return `Boss Fight ${NumberUtils.Ordinal(this.md2Service.info.boss.rounds)} Round`;
} else {
return NumberUtils.Ordinal(this.md2Service.info.round) + ' Round';
}
}
}