diff --git a/src/app/games/massive-darkness2/mobs/spawn-mob-dlg/spawn-mob-dlg.component.ts b/src/app/games/massive-darkness2/mobs/spawn-mob-dlg/spawn-mob-dlg.component.ts
index e9419e9..32e0145 100644
--- a/src/app/games/massive-darkness2/mobs/spawn-mob-dlg/spawn-mob-dlg.component.ts
+++ b/src/app/games/massive-darkness2/mobs/spawn-mob-dlg/spawn-mob-dlg.component.ts
@@ -2,11 +2,11 @@ import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { NbDialogRef } from '@nebular/theme';
import { FileService } from '../../../../services/file.service';
-import { MD2Service } from '../../../../services/md2.service';
+import { MD2Service } from '../../../../services/MD2/md2.service';
import { MsgBoxService } from '../../../../services/msg-box.service';
import { StateService } from '../../../../services/state.service';
import { StringUtils } from '../../../../utilities/string-utils';
-import { AttackInfo, AttackTarget, AttackType, MD2HeroInfo, MD2Icon, MobDlgType, MobInfo } from '../../massive-darkness2.model';
+import { AttackInfo, AttackTarget, AttackType, MD2HeroInfo, MD2Icon, MobDlgType, MobInfo, MobType } from '../../massive-darkness2.model';
import { MD2ComponentBase } from '../../MD2Base';
@Component({
@@ -16,8 +16,9 @@ import { MD2ComponentBase } from '../../MD2Base';
})
export class SpawnMobDlgComponent extends MD2ComponentBase implements OnInit {
MobDlgType = MobDlgType;
+ MobType = MobType;
mode: MobDlgType;
-
+ cardTitle: string;
title: string;
titleHtml: string;
MD2Icon = MD2Icon;
@@ -38,28 +39,8 @@ export class SpawnMobDlgComponent extends MD2ComponentBase implements OnInit {
}
ngOnInit(): void {
//this.mob = new MobInfo(this.mob);
- if (this.mode == MobDlgType.Spawn) {
- this.mob.attackInfos = [
- {
- type: MD2Icon.Melee,
- red: 0,
- yellow: 0,
- orange: 0
- } as AttackInfo,
- {
- type: MD2Icon.Range,
- red: 0,
- yellow: 0,
- orange: 0
- } as AttackInfo,
- {
- type: MD2Icon.Magic,
- red: 0,
- yellow: 0,
- orange: 0
- } as AttackInfo
-
- ]
+ if (this.mode == MobDlgType.Spawn && this.mob.type == MobType.Mob) {
+ this.mob.attackInfos = [new AttackInfo(MD2Icon.Melee), new AttackInfo(MD2Icon.Range), new AttackInfo(MD2Icon.Magic)];
}
this.mob.uiWounds = 0;
this.mob.uiFrozenTokens = 0;
@@ -93,6 +74,9 @@ export class SpawnMobDlgComponent extends MD2ComponentBase implements OnInit {
this.dlgRef.close();
}
initTitleHtml() {
+
+ this.cardTitle = MobType[this.mob.type];
+
let htmlText = '';
if (this.mode == MobDlgType.Spawn) {
htmlText = `${this.mob.description} Shows Up`;
diff --git a/src/app/games/massive-darkness2/treasure-bag/treasure-bag.component.ts b/src/app/games/massive-darkness2/treasure-bag/treasure-bag.component.ts
index d0b9902..94a2dba 100644
--- a/src/app/games/massive-darkness2/treasure-bag/treasure-bag.component.ts
+++ b/src/app/games/massive-darkness2/treasure-bag/treasure-bag.component.ts
@@ -3,7 +3,7 @@ import { ActivatedRoute } from '@angular/router';
import { Subject } from 'rxjs-compat';
import { first, takeUntil } from 'rxjs/operators';
import { FileService } from '../../../services/file.service';
-import { MD2Service } from '../../../services/md2.service';
+import { MD2Service } from '../../../services/MD2/md2.service';
import { MsgBoxService } from '../../../services/msg-box.service';
import { StateService } from '../../../services/state.service';
import { ADButtons, ADIcon } from '../../../ui/alert-dlg/alert-dlg.model';
diff --git a/src/app/services/MD2/md2-broadcast.service.spec.ts b/src/app/services/MD2/md2-broadcast.service.spec.ts
new file mode 100644
index 0000000..6444968
--- /dev/null
+++ b/src/app/services/MD2/md2-broadcast.service.spec.ts
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { MD2BroadcastService } from './md2-broadcast.service';
+
+describe('MD2BroadcastService', () => {
+ let service: MD2BroadcastService;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({});
+ service = TestBed.inject(MD2BroadcastService);
+ });
+
+ it('should be created', () => {
+ expect(service).toBeTruthy();
+ });
+});
diff --git a/src/app/services/MD2/md2-broadcast.service.ts b/src/app/services/MD2/md2-broadcast.service.ts
new file mode 100644
index 0000000..b9a7264
--- /dev/null
+++ b/src/app/services/MD2/md2-broadcast.service.ts
@@ -0,0 +1,103 @@
+import { Injectable } from '@angular/core';
+import { NbDialogService } from '@nebular/theme';
+import { first } from 'rxjs/operators';
+import { MD2HeroInfo } from '../../games/massive-darkness2/massive-darkness2.model';
+import { FileService } from '../file.service';
+import { GameRoomService } from '../game-room.service';
+import { LoginUserService } from '../login-user.service';
+import { SignalRService, SignalRSession, SignalRMessage } from '../signal-r.service';
+import { MD2StateService } from './md2-state.service';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class MD2BroadcastService {
+
+ constructor(
+ public fileService: FileService,
+ private gameRoomService: GameRoomService,
+ private loginUserService: LoginUserService,
+ public stateService: MD2StateService,
+ public signalRService: SignalRService,
+ public dlgService: NbDialogService
+ ) { }
+
+ public get playerHero(): MD2HeroInfo {
+ return this.stateService.info.heros.find(h => h.playerInfo.signalRClientId == this.loginUserService.userAccess.signalRSessionId);
+ }
+ public broadcastAllHeroInfoToAll() {
+ this.stateService.info.heros.forEach(element => {
+ this.broadcastHeroInfoToAll(element);
+ });
+ }
+
+ public broadcastHeroAction(action: string, extraValue: any = null) {
+ let parameters = {};
+ parameters['tabId'] = this.loginUserService.sessionTabId;
+ parameters['extraValue'] = JSON.stringify(extraValue);
+ this.broadcastMessage('heroAction', action, parameters);
+ }
+
+ public broadcastHeroInfoToAll(hero: MD2HeroInfo) {
+ let message = {
+ receiver: { isGroup: true, sessionId: this.gameRoomService.gameRoomId } as SignalRSession,
+ from: { isGroup: false, sessionId: hero.playerInfo.signalRClientId },
+ actionType: 'hero',
+ actionName: 'update',
+ } as SignalRMessage;
+ message.parameters = { hero: JSON.stringify(hero) };
+ this.gameRoomService.sendMessage(message).pipe(first()).subscribe(result => {
+ });
+ }
+
+ public broadcastHeroInfoToOwner(hero: MD2HeroInfo) {
+ let message = {
+ receiver: { isGroup: false, sessionId: hero.playerInfo.signalRClientId } as SignalRSession,
+ from: { isGroup: true, sessionId: this.gameRoomService.gameRoomId },
+ actionType: 'hero',
+ actionName: 'update',
+ } as SignalRMessage;
+ message.parameters = { hero: JSON.stringify(hero) };
+ this.gameRoomService.sendMessage(message).pipe(first()).subscribe(result => {
+ });
+ }
+
+ /**
+ * `sessionId` = null means broadcast to all
+ */
+ public broadcastMessage(actionType: string,
+ actionName: string,
+ parameters: { [key: string]: string; } = {},
+ sessionId: string = null) {
+ let message = {
+ receiver: { isGroup: !sessionId, sessionId: sessionId } as SignalRSession,
+ from: { isGroup: false, sessionId: this.loginUserService.userAccess.signalRSessionId },
+ actionType: actionType,
+ actionName: actionName,
+ parameters: parameters
+ } as SignalRMessage;
+
+ if (sessionId == null) {
+ message.receiver = { isGroup: true, sessionId: this.gameRoomService.gameRoomId } as SignalRSession
+ } else {
+ message.receiver = { isGroup: false, sessionId: this.gameRoomService.gameRoomId } as SignalRSession
+ }
+ this.gameRoomService.sendMessage(message).pipe(first()).subscribe(result => {
+ });
+ }
+ public broadcastGameInfo() {
+ let parameters = {};
+ parameters['gameInfo'] = JSON.stringify(this.stateService.info);
+ this.broadcastMessage('GameRoom', 'update', parameters);
+ }
+ public broadcastMobsInfo() {
+ let parameters = {};
+ parameters['roamingMonsters'] = JSON.stringify(this.stateService.info.roamingMonsters);
+ parameters['mobs'] = JSON.stringify(this.stateService.info.mobs);
+ this.broadcastMessage('mobs', 'update', parameters);
+ }
+
+ public broadcastMyHeroInfo() {
+ this.broadcastHeroInfoToAll(this.playerHero);
+ }
+}
diff --git a/src/app/services/MD2/md2-state.service.spec.ts b/src/app/services/MD2/md2-state.service.spec.ts
new file mode 100644
index 0000000..a673746
--- /dev/null
+++ b/src/app/services/MD2/md2-state.service.spec.ts
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { MD2StateService } from './md2-state.service';
+
+describe('MD2StateService', () => {
+ let service: MD2StateService;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({});
+ service = TestBed.inject(MD2StateService);
+ });
+
+ it('should be created', () => {
+ expect(service).toBeTruthy();
+ });
+});
diff --git a/src/app/services/MD2/md2-state.service.ts b/src/app/services/MD2/md2-state.service.ts
new file mode 100644
index 0000000..840c6d6
--- /dev/null
+++ b/src/app/services/MD2/md2-state.service.ts
@@ -0,0 +1,38 @@
+import { Injectable } from '@angular/core';
+import { MD2Icon, TreasureType } from '../../games/massive-darkness2/massive-darkness2.model';
+import { FileService } from '../file.service';
+import { MD2GameInfo } from './md2.service';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class MD2StateService {
+
+ private _highestPlayerLevel: number = 1;
+ private _playerAmount: number = 2;
+
+ public info: MD2GameInfo;
+
+ constructor(
+ public fileService: FileService,
+ ) { }
+
+ public iconHtml(icon: MD2Icon, cssClass = '') {
+ if (icon < MD2Icon.RedDice) {
+ return `
${String.fromCharCode(65 + icon)}`
+ } else {
+ return `
`;
+ }
+ }
+
+ public imgHtml(imgPath: string, cssClass = 'g-height-25 mr-1') {
+ return `
})
`;
+ }
+
+ public imgUrl(imgPath: string) {
+ return this.fileService.ImageUrl('MD2/' + imgPath);
+ }
+ public treasureImage(type: TreasureType) {
+ return this.imgUrl(`TreasureToken/${TreasureType[type]}.png`);
+ }
+}
diff --git a/src/app/services/md2.service.spec.ts b/src/app/services/MD2/md2.service.spec.ts
similarity index 100%
rename from src/app/services/md2.service.spec.ts
rename to src/app/services/MD2/md2.service.spec.ts
diff --git a/src/app/services/md2.service.ts b/src/app/services/MD2/md2.service.ts
similarity index 55%
rename from src/app/services/md2.service.ts
rename to src/app/services/MD2/md2.service.ts
index e4d09a6..30b53cb 100644
--- a/src/app/services/md2.service.ts
+++ b/src/app/services/MD2/md2.service.ts
@@ -1,19 +1,21 @@
import { Injectable } from '@angular/core';
-import { AttackInfo, AttackTarget, CoreGameDarknessPhaseRule, DefenseInfo, DrawingBag, DrawingItem, HeroClass, IDarknessPhaseRule, MD2HeroInfo, MD2Icon, MD2Rules, MobInfo, RoundPhase, TreasureType } from '../games/massive-darkness2/massive-darkness2.model';
+import { AttackInfo, AttackTarget, CoreGameDarknessPhaseRule, DefenseInfo, DrawingBag, DrawingItem, HeroClass, IDarknessPhaseRule, MD2HeroInfo, MD2Icon, MD2Rules, MobInfo, MobType, RoundPhase, TreasureItem, TreasureType } from '../../games/massive-darkness2/massive-darkness2.model';
import { first, map, reduce } from "rxjs/operators";
-import { Subject } from 'rxjs';
-import { FileService } from './file.service';
-import { StringUtils } from '../utilities/string-utils';
-import { MsgBoxService } from './msg-box.service';
-import { ADButtons, ADIcon, MessageBoxConfig } from '../ui/alert-dlg/alert-dlg.model';
-import { GameRoomService } from './game-room.service';
-import { SignalRMessage, SignalRService, SignalRSession } from './signal-r.service';
-import { LoginUserService } from './login-user.service';
-import { NumberUtils } from '../utilities/number-utils';
-import { SpawnMobDlgComponent } from '../games/massive-darkness2/mobs/spawn-mob-dlg/spawn-mob-dlg.component';
-import { stringify } from 'querystring';
import { NbDialogService } from '@nebular/theme';
-import { IBossFight } from '../games/massive-darkness2/massive-darkness2.model.boss';
+import { Subject } from 'rxjs';
+import { IBossFight } from '../../games/massive-darkness2/massive-darkness2.model.boss';
+import { ADIcon, MessageBoxConfig } from '../../ui/alert-dlg/alert-dlg.model';
+import { NumberUtils } from '../../utilities/number-utils';
+import { StringUtils } from '../../utilities/string-utils';
+import { FileService } from '../file.service';
+import { GameRoomService } from '../game-room.service';
+import { LoginUserService } from '../login-user.service';
+import { MsgBoxService } from '../msg-box.service';
+import { SignalRService, SignalRSession, SignalRMessage } from '../signal-r.service';
+import { MD2StateService } from './md2-state.service';
+import { MD2BroadcastService } from './md2-broadcast.service';
+import { CoreGameMobFactories } from '../../games/massive-darkness2/factorys/mobs/CoreGame';
+
@Injectable({
providedIn: 'root'
@@ -21,11 +23,6 @@ import { IBossFight } from '../games/massive-darkness2/massive-darkness2.model.b
export class MD2Service {
// #region Properties (24)
- private _highestPlayerLevel: number = 1;
- private _playerAmount: number = 2;
-
- public info: MD2GameInfo;
-
public darknessPhaseRule: IDarknessPhaseRule;
public enemyPhaseMobs: MobInfo[];
public enemyPhaseSubject = new Subject
();
@@ -33,20 +30,28 @@ export class MD2Service {
public mobBeenKilledSubject = new Subject();
public mobDeck: DrawingBag;
public roamingMobDeck: DrawingBag;
- public treasureBag: DrawingBag = new DrawingBag();
+ public treasureBag: DrawingBag = new DrawingBag();
public refreshUI$: Subject = new Subject();
- public refreshTreasureBagSubject = new Subject>();
+ public refreshTreasureBagSubject = new Subject>();
public get heros() {
- return this.info.heros;
+ return this.stateService.info.heros;
}
public get roamingMonsters() {
- return this.info.roamingMonsters;
+ return this.stateService.info.roamingMonsters;
}
public get mobs() {
- return this.info.mobs;
+ return this.stateService.info.mobs;
+ }
+
+
+ public get info(): MD2GameInfo {
+ return this.stateService.info;
+ }
+ public set info(v: MD2GameInfo) {
+ this.stateService.info = v;
}
// #endregion Properties (24)
@@ -58,11 +63,13 @@ export class MD2Service {
public msgBoxService: MsgBoxService,
private gameRoomService: GameRoomService,
private loginUserService: LoginUserService,
+ public stateService: MD2StateService,
public signalRService: SignalRService,
- public dlgService: NbDialogService
+ public dlgService: NbDialogService,
+ public broadcastService: MD2BroadcastService
) {
this.darknessPhaseRule = new CoreGameDarknessPhaseRule();
- this.info = new MD2GameInfo();
+ this.stateService.info = new MD2GameInfo();
this.darknessPhaseRule.addTreasureToken.subscribe(treasureType => {
this.addTreasure(treasureType, 1);
});
@@ -71,56 +78,64 @@ export class MD2Service {
// #endregion Constructors (1)
private initCoreGameRoamingMonsters() {
let mobs = [];
- this.roamingMobDeck.AddItem(new MobInfo({ name: 'Andra', hp: 5, level: 1, rewardTokens: 2, isRoamingMonster: true, fixedCarriedTreasure: [this.getTreasureDrawingItem(TreasureType.Rare)] }));
- this.roamingMobDeck.AddItem(new MobInfo({ name: 'Andra', hp: 7, level: 3, rewardTokens: 2, isRoamingMonster: true, fixedCarriedTreasure: [this.getTreasureDrawingItem(TreasureType.Epic)] }));
- this.roamingMobDeck.AddItem(new MobInfo({ name: 'Andra', hp: 5, level: 5, rewardTokens: 0, isRoamingMonster: true, fixedCarriedTreasure: [this.getTreasureDrawingItem(TreasureType.Epic), this.getTreasureDrawingItem(TreasureType.Epic), this.getTreasureDrawingItem(TreasureType.Epic)] }));
+ this.roamingMobDeck.AddItem(new MobInfo({ name: 'Andra', hp: 5, level: 1, rewardTokens: 2, type: MobType.RoamingMonster, fixedCarriedTreasure: [new TreasureItem(TreasureType.Rare)] }));
+ this.roamingMobDeck.AddItem(new MobInfo({ name: 'Andra', hp: 7, level: 3, rewardTokens: 2, type: MobType.RoamingMonster, fixedCarriedTreasure: [new TreasureItem(TreasureType.Epic)] }));
+ this.roamingMobDeck.AddItem(new MobInfo({ name: 'Andra', hp: 5, level: 5, rewardTokens: 0, type: MobType.RoamingMonster, fixedCarriedTreasure: [new TreasureItem(TreasureType.Epic, 3)] }));
this.roamingMobDeck.AddItem(new MobInfo({
name: 'Ytheria, Undead Queen', hp: 4, level: 1, rewardTokens: 2,
attackInfos: [new AttackInfo(MD2Icon.Melee, 1), new AttackInfo(MD2Icon.Rage, 2, 0, 0, 1)],
- defenseInfos: new DefenseInfo(1, 1),
- isRoamingMonster: true, fixedCarriedTreasure: [this.getTreasureDrawingItem(TreasureType.Rare)]
+ defenseInfo: new DefenseInfo(1, 1),
+ type: MobType.RoamingMonster, fixedCarriedTreasure: [new TreasureItem(TreasureType.Rare)]
}));
this.roamingMobDeck.AddItem(new MobInfo({
name: 'Ytheria, Undead Queen', hp: 6, level: 3, rewardTokens: 2,
attackInfos: [new AttackInfo(MD2Icon.Melee, 0, 1), new AttackInfo(MD2Icon.Rage, 1, 1, 0, 1)],
- defenseInfos: new DefenseInfo(2, 1),
- isRoamingMonster: true, fixedCarriedTreasure: [this.getTreasureDrawingItem(TreasureType.Epic)]
+ defenseInfo: new DefenseInfo(2, 1),
+ type: MobType.RoamingMonster, fixedCarriedTreasure: [new TreasureItem(TreasureType.Epic)]
}));
this.roamingMobDeck.AddItem(new MobInfo({
name: 'Ytheria, Undead Queen', hp: 8, level: 5, rewardTokens: 0,
attackInfos: [new AttackInfo(MD2Icon.Melee, 2, 1), new AttackInfo(MD2Icon.Rage, 2, 1, 1, 1)],
- defenseInfos: new DefenseInfo(4, 1),
- isRoamingMonster: true, fixedCarriedTreasure: [this.getTreasureDrawingItem(TreasureType.Epic), this.getTreasureDrawingItem(TreasureType.Epic), this.getTreasureDrawingItem(TreasureType.Epic)]
+ defenseInfo: new DefenseInfo(4, 1),
+ type: MobType.RoamingMonster, fixedCarriedTreasure: [new TreasureItem(TreasureType.Epic, 3)]
}));
this.roamingMobDeck.AddItem(new MobInfo({
name: 'Lyidan, Incubus Lord', hp: 7, level: 1, rewardTokens: 2,
- isRoamingMonster: true, fixedCarriedTreasure: [this.getTreasureDrawingItem(TreasureType.Rare)]
+ type: MobType.RoamingMonster, fixedCarriedTreasure: [new TreasureItem(TreasureType.Rare)]
}));
this.roamingMobDeck.AddItem(new MobInfo({
name: 'Lyidan, Incubus Lord', hp: 10, level: 3, rewardTokens: 2,
- isRoamingMonster: true, fixedCarriedTreasure: [this.getTreasureDrawingItem(TreasureType.Epic)]
+ type: MobType.RoamingMonster, fixedCarriedTreasure: [new TreasureItem(TreasureType.Epic)]
}));
this.roamingMobDeck.AddItem(new MobInfo({
name: 'Lyidan, Incubus Lord', hp: 7, level: 5, rewardTokens: 0,
- isRoamingMonster: true, fixedCarriedTreasure: [this.getTreasureDrawingItem(TreasureType.Epic), this.getTreasureDrawingItem(TreasureType.Epic), this.getTreasureDrawingItem(TreasureType.Epic)]
+ type: MobType.RoamingMonster, fixedCarriedTreasure: [new TreasureItem(TreasureType.Epic, 3)]
}));
this.roamingMobDeck.AddItem(new MobInfo({
name: 'The Ghoul', hp: 5, level: 1, rewardTokens: 2,
- isRoamingMonster: true, fixedCarriedTreasure: [this.getTreasureDrawingItem(TreasureType.Rare)]
+ type: MobType.RoamingMonster, fixedCarriedTreasure: [new TreasureItem(TreasureType.Rare)]
}));
this.roamingMobDeck.AddItem(new MobInfo({
name: 'The Ghoul', hp: 8, level: 3, rewardTokens: 2,
- isRoamingMonster: true, fixedCarriedTreasure: [this.getTreasureDrawingItem(TreasureType.Epic)]
+ type: MobType.RoamingMonster, fixedCarriedTreasure: [new TreasureItem(TreasureType.Epic)]
}));
this.roamingMobDeck.AddItem(new MobInfo({
name: 'The Ghoul', hp: 5, level: 5, rewardTokens: 0,
- isRoamingMonster: true, fixedCarriedTreasure: [this.getTreasureDrawingItem(TreasureType.Epic), this.getTreasureDrawingItem(TreasureType.Epic), this.getTreasureDrawingItem(TreasureType.Epic)]
+ type: MobType.RoamingMonster, fixedCarriedTreasure: [new TreasureItem(TreasureType.Epic, 3)]
}));
+ }
+ private initCoreGameMobs() {
+ CoreGameMobFactories.forEach(factory => {
+ for (let i = 1; i <= 5; i++) {
+ this.mobDeck.AddItem(factory.generate(i));
+ i++;
+ }
+ });
}
// #region Public Getters And Setters (5)
@@ -128,26 +143,18 @@ export class MD2Service {
if (this.heros.length > 0) {
return Math.max(...this.heros.map(h => h.level));
} else {
- return this._highestPlayerLevel;
+ return 1;
}
}
- public set highestPlayerLevel(v: number) {
- this._highestPlayerLevel = v;
- }
-
public get playerAmount(): number {
if (this.heros.length > 0) {
return this.heros.length;
} else {
- return this._playerAmount;
+ return 1;
}
}
- public set playerAmount(v: number) {
- this._playerAmount = v;
- }
-
public get playerHero(): MD2HeroInfo {
return this.heros.find(h => h.playerInfo.signalRClientId == this.loginUserService.userAccess.signalRSessionId);
}
@@ -157,87 +164,10 @@ export class MD2Service {
// #region Public Methods (27)
public addTreasure(type: TreasureType, amount: number = 1) {
- let item = this.getTreasureDrawingItem(type, amount);
- this.treasureBag.AddItem(item);
+ this.treasureBag.AddItem(new TreasureItem(type, amount));
this.refreshTreasureBagSubject.next(this.treasureBag);
}
- public broadcastAllHeroInfoToAll() {
- this.heros.forEach(element => {
- this.broadcastHeroInfoToAll(element);
- });
- }
-
- public broadcastHeroAction(action: string, extraValue: any = null) {
- let parameters = {};
- parameters['tabId'] = this.loginUserService.sessionTabId;
- parameters['extraValue'] = JSON.stringify(extraValue);
- this.broadcastMessage('heroAction', action, parameters);
- }
-
- public broadcastHeroInfoToAll(hero: MD2HeroInfo) {
- let message = {
- receiver: { isGroup: true, sessionId: this.gameRoomService.gameRoomId } as SignalRSession,
- from: { isGroup: false, sessionId: hero.playerInfo.signalRClientId },
- actionType: 'hero',
- actionName: 'update',
- } as SignalRMessage;
- message.parameters = { hero: JSON.stringify(hero) };
- this.gameRoomService.sendMessage(message).pipe(first()).subscribe(result => {
- });
- }
-
- public broadcastHeroInfoToOwner(hero: MD2HeroInfo) {
- let message = {
- receiver: { isGroup: false, sessionId: hero.playerInfo.signalRClientId } as SignalRSession,
- from: { isGroup: true, sessionId: this.gameRoomService.gameRoomId },
- actionType: 'hero',
- actionName: 'update',
- } as SignalRMessage;
- message.parameters = { hero: JSON.stringify(hero) };
- this.gameRoomService.sendMessage(message).pipe(first()).subscribe(result => {
- });
- }
-
- /**
- * `sessionId` = null means broadcast to all
- */
- public broadcastMessage(actionType: string,
- actionName: string,
- parameters: { [key: string]: string; } = {},
- sessionId: string = null) {
- let message = {
- receiver: { isGroup: !sessionId, sessionId: sessionId } as SignalRSession,
- from: { isGroup: false, sessionId: this.loginUserService.userAccess.signalRSessionId },
- actionType: actionType,
- actionName: actionName,
- parameters: parameters
- } as SignalRMessage;
-
- if (sessionId == null) {
- message.receiver = { isGroup: true, sessionId: this.gameRoomService.gameRoomId } as SignalRSession
- } else {
- message.receiver = { isGroup: false, sessionId: this.gameRoomService.gameRoomId } as SignalRSession
- }
- this.gameRoomService.sendMessage(message).pipe(first()).subscribe(result => {
- });
- }
- public broadcastGameInfo() {
- let parameters = {};
- parameters['gameInfo'] = JSON.stringify(this.info);
- this.broadcastMessage('GameRoom', 'update', parameters);
- }
- public broadcastMobsInfo() {
- let parameters = {};
- parameters['roamingMonsters'] = JSON.stringify(this.roamingMonsters);
- parameters['mobs'] = JSON.stringify(this.mobs);
- this.broadcastMessage('mobs', 'update', parameters);
- }
-
- public broadcastMyHeroInfo() {
- this.broadcastHeroInfoToAll(this.playerHero);
- }
-
public darknessPhase() {
this.heros.forEach(hero => {
hero.remainActions = 3;
@@ -246,15 +176,15 @@ export class MD2Service {
hero.frozenToken = remainFrozenToken;
this.broadcastHeroInfoToOwner(hero);
});
- this.info.roundPhase = RoundPhase.HeroPhase;
- this.info.round++;
+ this.stateService.info.roundPhase = RoundPhase.HeroPhase;
+ this.stateService.info.round++;
if (this.darknessPhaseRule.runDarknessPhase()) {
- this.msgBoxService.show(`${NumberUtils.Ordinal(this.info.round)} Hero Phase`, { icon: ADIcon.INFO });
+ this.msgBoxService.show(`${NumberUtils.Ordinal(this.stateService.info.round)} Hero Phase`, { icon: ADIcon.INFO });
}
//this.runNextPhase();
}
- public drawMob(isRoamingMonster: boolean) {
+ public spawnMob(isRoamingMonster: boolean) {
let mobDeck = null as DrawingBag;
let level = 1;
if (this.highestPlayerLevel < 3) {
@@ -277,7 +207,7 @@ export class MD2Service {
let newSpawnMob = new MobInfo(mobDeck.DrawAndRemove(1, m => m.level == level)[0]);
if (isRoamingMonster) {
newSpawnMob.unitRemainHp = newSpawnMob.hp * this.playerAmount;
- newSpawnMob.mobAmount = 1;
+ newSpawnMob.mobAmount = 0;
} else {
newSpawnMob.mobAmount = this.playerAmount + 1;
}
@@ -292,6 +222,7 @@ export class MD2Service {
} else {
this.mobs.push(newSpawnMob);
newSpawnMob.carriedTreasure = this.treasureBag.DrawAndRemove(newSpawnMob.rewardTokens);
+ this.refreshTreasureBagSubject.next(this.treasureBag);
}
@@ -323,61 +254,16 @@ export class MD2Service {
return this.fileService.FileList('Images/MD2/' + folderPath);
}
- public getTreasureDrawingItem(type: TreasureType, amount: number = 1) {
- return new DrawingItem(`${TreasureType[type]} Treasure`, `It's a ${TreasureType[type]} Treasure!`, this.treasureImage(type), amount);
- }
-
public heroFullName(hero: MD2HeroInfo) {
if (!hero) return '';
return `${hero.playerInfo.name} (${HeroClass[hero.class]} - ${hero.name})`
}
- public iconHtml(icon: MD2Icon, cssClass = '') {
- if (icon < MD2Icon.RedDice) {
- return `${String.fromCharCode(65 + icon)}`
- } else {
- return ``;
- }
- }
-
- public imgHtml(imgPath: string, cssClass = 'g-height-25 mr-1') {
- return `
`;
- }
-
- public imgUrl(imgPath: string) {
- return this.fileService.ImageUrl('MD2/' + imgPath);
- }
-
public initMobDecks() {
this.mobDeck = new DrawingBag();
this.roamingMobDeck = new DrawingBag();
- this.mobDeck.AddItem(new MobInfo({ name: 'Gargoyles', hp: 2, level: 1, rewardTokens: 1 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Demons', hp: 3, level: 1, rewardTokens: 1 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Undead', hp: 4, level: 1, rewardTokens: 1 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Fire Entities', hp: 3, level: 1, rewardTokens: 1 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Fallen Angels', hp: 2, level: 1, rewardTokens: 1 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Infernal Imps', hp: 3, level: 1, rewardTokens: 1 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Skeletons', hp: 2, level: 1, rewardTokens: 1 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Satyrs', hp: 3, level: 1, rewardTokens: 1 }));
-
- this.mobDeck.AddItem(new MobInfo({ name: 'Gargoyles', hp: 3, level: 3, rewardTokens: 1 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Demons', hp: 4, level: 3, rewardTokens: 1 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Undead', hp: 5, level: 3, rewardTokens: 1 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Fire Entities', hp: 4, level: 3, rewardTokens: 1 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Fallen Angels', hp: 3, level: 3, rewardTokens: 1 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Infernal Imps', hp: 4, level: 3, rewardTokens: 1 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Skeletons', hp: 3, level: 3, rewardTokens: 1 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Satyrs', hp: 4, level: 3, rewardTokens: 1 }));
-
- this.mobDeck.AddItem(new MobInfo({ name: 'Gargoyles', hp: 6, level: 5, rewardTokens: 2 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Demons', hp: 6, level: 5, rewardTokens: 2 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Undead', hp: 8, level: 5, rewardTokens: 2 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Fire Entities', hp: 7, level: 5, rewardTokens: 2 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Fallen Angels', hp: 5, level: 5, rewardTokens: 2 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Infernal Imps', hp: 5, level: 5, rewardTokens: 2 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Skeletons', hp: 5, level: 5, rewardTokens: 2 }));
- this.mobDeck.AddItem(new MobInfo({ name: 'Satyrs', hp: 6, level: 5, rewardTokens: 2 }));
+ this.initCoreGameMobs();
this.initCoreGameRoamingMonsters();
}
@@ -398,7 +284,7 @@ export class MD2Service {
hero.mp += levelUpInfo.extraMp;
hero.mpMaximum += levelUpInfo.extraMp;
hero.exp = levelUpInfo.currentExp;
- this.broadcastHeroInfoToOwner(hero);
+ this.broadcastService.broadcastHeroInfoToOwner(hero);
this.sendMsgboxMsg(hero.playerInfo.signalRClientId, { title: 'Level Up', text: 'Please do a skill level up!', icon: ADIcon.INFO });
levelUpInfo = MD2Rules.checkCoreGameLevelup(hero.level, hero.exp);
}
@@ -416,9 +302,9 @@ export class MD2Service {
level = 3;
}
if (isRoamingMonsters) {
- return this.imgUrl(`Mobs/CoreGame/RoamingMonsters/${name}/${level}.png`);
+ return this.stateService.imgUrl(`Mobs/CoreGame/RoamingMonsters/${name}/${level}.png`);
} else {
- return this.imgUrl(`Mobs/CoreGame/Mobs/${name}/${level}.png`);
+ return this.stateService.imgUrl(`Mobs/CoreGame/Mobs/${name}/${level}.png`);
}
}
@@ -440,39 +326,17 @@ export class MD2Service {
});
}
- public rollBlackDice(times: number) {
- let wounds = 0;
- let claws = 0;
- //miss 33%
- //1 claw 33%
- //1 wound 17%
- //1 claw, 1 wound 17%
-
- for (let i = 0; i < times; i++) {
- let result = Math.random() * 100;
- if (result <= 33) {
- } else if (result <= 67) {
- claws += 1;
- } else if (result <= 83) {
- wounds += 1;
- } else {
- claws += 1;
- wounds += 1;
- }
- }
- return { claws, wounds };
- }
public runNextPhase() {
- this.info.roundPhase++;
- switch (this.info.roundPhase) {
+ this.stateService.info.roundPhase++;
+ switch (this.stateService.info.roundPhase) {
case RoundPhase.HeroPhase:
this.heros.forEach(hero => {
hero.remainActions = 3;
let remainFrozenToken = Math.max(0, hero.frozenToken - hero.remainActions);
hero.remainActions = Math.max(0, hero.remainActions - hero.frozenToken);
hero.frozenToken = remainFrozenToken;
- this.broadcastHeroInfoToOwner(hero);
+ this.broadcastService.broadcastHeroInfoToOwner(hero);
});
break;
case RoundPhase.EnemyPhase:
@@ -487,8 +351,8 @@ export class MD2Service {
default: break;
}
let parameters = {};
- parameters['phase'] = this.info.roundPhase;
- this.broadcastMessage('roundPhase', '', parameters);
+ parameters['phase'] = this.stateService.info.roundPhase;
+ this.broadcastService.broadcastMessage('roundPhase', '', parameters);
}
public sendMsgboxMsg(playerSessionId: string, msg: Partial) {
@@ -503,9 +367,6 @@ export class MD2Service {
});
}
- public treasureImage(type: TreasureType) {
- return this.imgUrl(`TreasureToken/${TreasureType[type]}.png`);
- }
public getTargetHerosByFilter(targetType: AttackTarget, onlyOne: boolean = false) {
let beenAttackedHero = [] as MD2HeroInfo[];
switch (targetType) {
diff --git a/src/app/services/MD2/md2.spawn.mob.service.ts b/src/app/services/MD2/md2.spawn.mob.service.ts
new file mode 100644
index 0000000..9926f09
--- /dev/null
+++ b/src/app/services/MD2/md2.spawn.mob.service.ts
@@ -0,0 +1,15 @@
+import { Injectable } from "@angular/core";
+import { MD2StateService } from "./md2-state.service";
+
+@Injectable({
+ providedIn: 'root'
+})
+export class MD2SpawnMobService {
+ /**
+ *
+ */
+ constructor(
+ public stateService: MD2StateService,) {
+
+ }
+}
\ No newline at end of file
diff --git a/src/assets/styles/md2.scss b/src/assets/styles/md2.scss
index f206297..00c4adc 100644
--- a/src/assets/styles/md2.scss
+++ b/src/assets/styles/md2.scss
@@ -19,10 +19,10 @@
font-family: "Massive Darkness 2", sans-serif !important;
//font-size: 50px;
- &.atk::before {
+ &.attack::before {
content: "A";
}
- &.def::before {
+ &.defense::before {
content: "B";
}
&.mana::before {
@@ -34,7 +34,7 @@
&.enemySkill::before {
content: "E";
}
- &.enemyAtk::before {
+ &.enemyAttack::before {
content: "F";
}
&.reroll::before {