import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { NbDialogService } from '@nebular/theme';
import { first } from 'rxjs/operators';
import { DropDownOption } from '../../../entity/dropDownOption';
import { FileService } from '../../../services/file.service';
import { MD2MobService } from '../../../services/MD2/md2-mob.service';
import { MD2Service } from '../../../services/MD2/md2.service';
import { MsgBoxService } from '../../../services/msg-box.service';
import { StateService } from '../../../services/state.service';
import { ADIcon } from '../../../ui/alert-dlg/alert-dlg.model';
import { NumberUtils } from '../../../utilities/number-utils';
import { StringUtils } from '../../../utilities/string-utils';
import { CoreGameMobFactories } from '../factorys/mobs/CoreGame';
import { CoreGameRMFactories } from '../factorys/roamingMonsters/CoreGame';
import { DrawingBag, DrawingItem, MD2Icon, MobDlgType, MobInfo, TreasureType } from '../massive-darkness2.model';
import { MD2Base, MD2ComponentBase } from '../MD2Base';
import { SpawnMobDlgComponent } from './spawn-mob-dlg/spawn-mob-dlg.component';
@Component({
selector: 'md2-mobs',
templateUrl: './mobs.component.html',
styleUrls: ['./mobs.component.scss']
})
export class MobsComponent extends MD2ComponentBase implements OnInit {
MobDlgType = MobDlgType;
isRoamingMonster: boolean = false;
attacking: boolean = false;
attackingAllExp: number = 0;
attackingAttackerExp: number = 0;
attackingAttackerReward: string = '';
showRoundMessage: boolean = false;
@Input("isRoamingMonster")
public set input_isRoamingMonster(value) {
this.isRoamingMonster = typeof value !== "undefined" && value !== false;
}
constructor(
private fileService: FileService,
private msgBoxService: MsgBoxService,
private dlgService: NbDialogService,
private mobService: MD2MobService,
public md2Service: MD2Service,
protected stateService: StateService,
protected route: ActivatedRoute,
protected cdRef: ChangeDetectorRef,
) {
super(md2Service, stateService, route, cdRef);
}
ngOnInit(): void {
this.initMobDecks();
super.ngOnInit();
}
public get mobs(): MobInfo[] {
return this.isRoamingMonster ? this.md2Service.roamingMonsters : this.md2Service.mobs;
}
public set mobs(v: MobInfo[]) {
if (this.isRoamingMonster) {
this.md2Service.info.roamingMonsters = v;
} else {
this.md2Service.info.mobs = v;
}
}
initMobDecks() {
this.mobs = [];
this.cdRef.detectChanges();
let spawn$ = this.isRoamingMonster ? this.md2Service.darknessPhaseRule.spawnRoamingMonster : this.md2Service.darknessPhaseRule.spawnMob;
spawn$.subscribe(result => {
this.showRoundMessage = true;
this.spawnMob();
});
}
spawnMob() {
let result = this.md2Service.spawnMob(this.isRoamingMonster);
let titleText = result.exitingMob == null ? `${result.mob.description} Shows Up` : `${result.mob.description} Activate One Action Now!`;
let actType = result.exitingMob == null ? MobDlgType.Spawn : MobDlgType.Activating;
let mob = result.exitingMob == null ? result.mob : result.exitingMob;
this.dlgService.open(SpawnMobDlgComponent, { context: { title: titleText, mode: actType, mob: mob } })
.onClose.pipe(first()).subscribe(result => {
this.afterSpawn();
});
this.cdRef.detectChanges();
}
spawnSpecificMob() {
let mobOptions = this.isRoamingMonster ? CoreGameRMFactories.map(f => new DropDownOption(f.mobName, f.mobName)) : CoreGameMobFactories.map(f => new DropDownOption(f.mobName, f.mobName));
this.msgBoxService.showInputbox('Spawn', '', { inputType: 'dropdown', dropDownOptions: mobOptions }).pipe(first()).subscribe(mobName => {
if (mobName) {
let result = this.md2Service.spawnMob(this.isRoamingMonster, mobName);
let titleText = result.exitingMob == null ? `${result.mob.description} Shows Up` : `${result.mob.description} Activate One Action Now!`;
let actType = result.exitingMob == null ? MobDlgType.Spawn : MobDlgType.Activating;
let mob = result.exitingMob == null ? result.mob : result.exitingMob;
this.dlgService.open(SpawnMobDlgComponent, { context: { title: titleText, mode: actType, mob: mob } })
.onClose.pipe(first()).subscribe(result => {
this.afterSpawn();
});
this.cdRef.detectChanges();
}
});
}
afterSpawn() {
this.cdRef.detectChanges();
this.md2Service.broadcastService.broadcastMobsInfo();
if (this.showRoundMessage) {
this.msgBoxService.show(`${NumberUtils.Ordinal(this.md2Service.info.round)} Hero Phase`, { icon: ADIcon.INFO });
}
this.showRoundMessage = false;
}
adjustUnitHp(mob: MobInfo, adding: boolean) {
if (adding) {
if (mob.unitRemainHp < mob.hp) {
mob.unitRemainHp++;
}
} else {
if (mob.unitRemainHp > 1) {
mob.unitRemainHp--;
}
}
this.cdRef.detectChanges();
}
killOneUnit(mob: MobInfo) {
let attacker = this.md2Service.currentActivateHero;
if (mob.mobAmount > 1) {
mob.mobAmount--;
mob.unitRemainHp = mob.hp;
if (this.attacking) {
this.attackingAttackerExp += 1;
} else {
if (attacker) {
attacker.exp += 1;
this.msgBoxService.show(`${attacker.heroFullName} Gain 1 Exp`, { icon: ADIcon.INFO }).pipe(first()).subscribe(result => {
this.md2Service.broadcastService.broadcastHeroInfoToOwner(attacker);
});
}
}
} else {
this.mobs.splice(this.mobs.indexOf(mob), 1);
mob.mobAmount = 0;
if (this.attacking) {
this.attackingAllExp += mob.leaderExp;
this.attackingAttackerExp += 1;
this.attackingAttackerReward = `
and gains ${mob.carriedTreasureHtml}`;
} else {
let messageText = '';
if (attacker) {
messageText = `${attacker.heroFullName} Gain 1 Extra Exp.
and gains ${mob.carriedTreasureHtml}`;
}
this.msgBoxService.show(`All Hero Gain ${mob.leaderExp} Exp`, { text: messageText, icon: ADIcon.INFO }).pipe(first()).subscribe(result => {
});
}
this.md2Service.mobBeenKilledSubject.next(mob);
}
this.cdRef.detectChanges();
}
addOneUnit(mob: MobInfo) {
if (!this.isRoamingMonster) {
mob.mobAmount++;
mob.unitRemainHp = 1;
this.cdRef.detectChanges();
}
}
attackMob(mob: MobInfo) {
this.attacking = true;
this.attackingAllExp = 0;
this.attackingAttackerExp = 0;
this.attackingAttackerReward = '';
this.dlgService.open(SpawnMobDlgComponent, { context: { title: `Attack ${mob.description}`, mode: MobDlgType.BeenAttacked, mob: mob } })
.onClose.pipe(first()).subscribe(mobResult => {
if (mobResult) {
let attackDamage = mobResult.uiWounds;
this.mobService.attackMob(mobResult, attackDamage);
}
});
}
mobHpChanged(mob: MobInfo, newHp: number) {
console.log(newHp);
mob.unitRemainHp = newHp;
this.cdRef.detectChanges();
}
public getMobImageUrl(mob: MobInfo): string {
if (StringUtils.isNullOrWhitespace(mob.leaderImgUrl)) {
return mob.imageUrl;
} else {
return mob.leaderImgUrl;
}
}
showMobImage(mob: MobInfo) {
this.dlgService.open(SpawnMobDlgComponent, { context: { title: `${mob.description}`, mode: MobDlgType.PreView, mob: mob } })
.onClose.pipe(first()).subscribe(result => {
});
}
weaponHtml(mob: MobInfo) {
let html = '
';
mob.attackInfos.forEach(attackInfo => {
html += this.iconHtml((attackInfo.type), 'mr-2');
if (attackInfo.yellow > 0) {
html += this.iconHtml(MD2Icon.YellowDice) + ` x ${attackInfo.yellow}`
}
if (attackInfo.orange > 0) {
html += this.iconHtml(MD2Icon.OrangeDice) + ` x ${attackInfo.orange}`
}
html += "
";
});
return html;
}
}