Compare commits

..

2 Commits

Author SHA1 Message Date
e41a07411e
Adding advanced announcement selection logic
All checks were successful
Jenkins Production Deployment
2022-09-14 19:00:23 +02:00
cd5154a07a
Add text that tells the players exactly why the total points are wrong 2022-09-10 22:36:21 +02:00
2 changed files with 128 additions and 13 deletions

View File

@ -43,8 +43,8 @@
<td><input type="number" [(ngModel)]="this.actualPlayers[3].finalCardScore"/></td> <td><input type="number" [(ngModel)]="this.actualPlayers[3].finalCardScore"/></td>
</tr> </tr>
</table> </table>
<p id="score-warn" *ngIf="!totalScoreValid()">Total score doesn't add up!</p> <p id="score-warn" *ngIf="calculatePointSum() !== 240">Total score doesn't add up ({{getScoreDifferenceText()}})</p>
<button (click)="switchToNextPage()" [disabled]="!totalScoreValid()">Next</button> <button (click)="switchToNextPage()" [disabled]="!calculatePointSum()">Next</button>
</div> </div>
<div id="which-solo" class="visible-{{this.currentPage === 4}}"> <div id="which-solo" class="visible-{{this.currentPage === 4}}">

View File

@ -1,6 +1,6 @@
import {Component, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {Player} from '../../models/doppelkopf/player'; import {Player} from '../../models/doppelkopf/player';
import * as Announcement from '../../models/doppelkopf/enums/announcement'; import * as announcements from '../../models/doppelkopf/enums/announcement';
import {Team} from '../../models/doppelkopf/enums/team'; import {Team} from '../../models/doppelkopf/enums/team';
@Component({ @Component({
@ -12,7 +12,7 @@ export class AddGameComponent implements OnInit {
potentialPlayers: Player[] = []; potentialPlayers: Player[] = [];
actualPlayers: Player[] = []; actualPlayers: Player[] = [];
selectedAnnouncements: Announcement.Announcement[] = []; selectedAnnouncements: announcements.Announcement[] = [];
currentPage: number = 0; currentPage: number = 0;
@ -127,15 +127,116 @@ export class AddGameComponent implements OnInit {
*/ */
/** /**
* Toggles the activity status for the given announcement * Toggles the activity status for the given announcement and also activates / deactivates other announcements
* to conform to the rules.
* @param announcement The announcement to toggle activity for * @param announcement The announcement to toggle activity for
*/ */
toggleAnnouncement(announcement: Announcement.Announcement): void { toggleAnnouncement(announcement: announcements.Announcement): void {
let index = this.selectedAnnouncements.indexOf(announcement); let index = this.selectedAnnouncements.indexOf(announcement);
if (index !== -1) { if (index !== -1) {
this.selectedAnnouncements.splice(index, 1); this.selectedAnnouncements.splice(index, 1);
this.deactivateLowerAnnouncements(announcement);
} else { } else {
this.selectedAnnouncements.push(announcement); this.selectedAnnouncements.push(announcement);
this.activateHigherAnnouncements(announcement);
}
}
/**
* Deactivates all lower announcements. E.g.: When RE is deactivated, RE_NO_NINETY and all lower also get deactivated
* @param announcement The announcement that has been deactivated
*/
deactivateLowerAnnouncements(announcement: announcements.Announcement) {
// First for RE
switch(announcement) {
case announcements.Announcement.RE:
this.deactivateAnnouncement(announcements.Announcement.RE_NO_NINETY);
this.deactivateAnnouncement(announcements.Announcement.RE_NO_SIXTY);
this.deactivateAnnouncement(announcements.Announcement.RE_NO_THIRTY);
break;
case announcements.Announcement.RE_NO_NINETY:
this.deactivateAnnouncement(announcements.Announcement.RE_NO_SIXTY);
this.deactivateAnnouncement(announcements.Announcement.RE_NO_THIRTY);
break;
case announcements.Announcement.RE_NO_SIXTY:
this.deactivateAnnouncement(announcements.Announcement.RE_NO_THIRTY);
break;
}
// Now for CONTRA
switch(announcement) {
case announcements.Announcement.CONTRA:
this.deactivateAnnouncement(announcements.Announcement.CONTRA_NO_NINETY);
this.deactivateAnnouncement(announcements.Announcement.CONTRA_NO_SIXTY);
this.deactivateAnnouncement(announcements.Announcement.CONTRA_NO_THIRTY);
break;
case announcements.Announcement.CONTRA_NO_NINETY:
this.deactivateAnnouncement(announcements.Announcement.CONTRA_NO_SIXTY);
this.deactivateAnnouncement(announcements.Announcement.CONTRA_NO_THIRTY);
break;
case announcements.Announcement.CONTRA_NO_SIXTY:
this.deactivateAnnouncement(announcements.Announcement.CONTRA_NO_THIRTY);
break;
}
}
/**
* Deactivates the given announcement if it is active
* @param announcement The announcement to deactivate
*/
deactivateAnnouncement(announcement: announcements.Announcement) {
let index = this.selectedAnnouncements.indexOf(announcement);
if (index !== -1) {
this.selectedAnnouncements.splice(index, 1);
}
}
/**
* Activates all higher announcements. E.g.: When RE_NO_NINETY is activated, RE also gets activated
* @param announcement The announcement that has been activated
*/
activateHigherAnnouncements(announcement: announcements.Announcement) {
// First for RE
switch(announcement) {
case announcements.Announcement.RE_NO_THIRTY:
this.activateAnnouncement(announcements.Announcement.RE_NO_SIXTY);
this.activateAnnouncement(announcements.Announcement.RE_NO_NINETY);
this.activateAnnouncement(announcements.Announcement.RE);
break;
case announcements.Announcement.RE_NO_SIXTY:
this.activateAnnouncement(announcements.Announcement.RE_NO_NINETY);
this.activateAnnouncement(announcements.Announcement.RE);
break;
case announcements.Announcement.RE_NO_NINETY:
this.activateAnnouncement(announcements.Announcement.RE);
break;
}
// Now for CONTRA
switch(announcement) {
case announcements.Announcement.CONTRA_NO_THIRTY:
this.activateAnnouncement(announcements.Announcement.CONTRA_NO_SIXTY);
this.activateAnnouncement(announcements.Announcement.CONTRA_NO_NINETY);
this.activateAnnouncement(announcements.Announcement.CONTRA);
break;
case announcements.Announcement.CONTRA_NO_SIXTY:
this.activateAnnouncement(announcements.Announcement.CONTRA_NO_NINETY);
this.activateAnnouncement(announcements.Announcement.CONTRA);
break;
case announcements.Announcement.CONTRA_NO_NINETY:
this.activateAnnouncement(announcements.Announcement.CONTRA);
break;
}
}
/**
* Activates the given announcement if it is inactive
* @param announcement The announcement to activate
*/
activateAnnouncement(announcement: announcements.Announcement) {
let index = this.selectedAnnouncements.indexOf(announcement);
if (index === -1) {
this.selectedAnnouncements.push(announcement);
} }
} }
@ -143,26 +244,26 @@ export class AddGameComponent implements OnInit {
* Checks if the given announcement is already marked as selected * Checks if the given announcement is already marked as selected
* @param announcement The announcement to check the status for * @param announcement The announcement to check the status for
*/ */
isAnnouncementActive(announcement: Announcement.Announcement): boolean { isAnnouncementActive(announcement: announcements.Announcement): boolean {
return this.selectedAnnouncements.indexOf(announcement) !== -1; return this.selectedAnnouncements.indexOf(announcement) !== -1;
} }
/** /**
* Returns a list of all possible announcements * Returns a list of all possible announcements
*/ */
getAllPossibleAnnouncements(): Announcement.Announcement[] { getAllPossibleAnnouncements(): announcements.Announcement[] {
return Announcement.getAllAnnouncementValues(); return announcements.getAllAnnouncementValues();
} }
/** /**
* Checks, if the currently selected announcements are a valid set of announcements * Checks, if the currently selected announcements are a valid set of announcements
*/ */
checkAnnouncementsValid(): boolean { checkAnnouncementsValid(): boolean {
return Announcement.checkValidity(this.selectedAnnouncements); return announcements.checkValidity(this.selectedAnnouncements);
} }
getHighestAnnouncements(): string { getHighestAnnouncements(): string {
return Announcement.returnTwoHighestAnnouncements(this.selectedAnnouncements); return announcements.returnTwoHighestAnnouncements(this.selectedAnnouncements);
} }
/** /**
@ -218,13 +319,27 @@ export class AddGameComponent implements OnInit {
/** /**
* Checks if the sum of all points is exactly 240 * Checks if the sum of all points is exactly 240
*/ */
totalScoreValid(): boolean { calculatePointSum(): number {
let totalScore: number = 0; let totalScore: number = 0;
for (let player of this.actualPlayers) { for (let player of this.actualPlayers) {
totalScore += player.finalCardScore ?? 0; totalScore += player.finalCardScore ?? 0;
} }
return totalScore === 240; return totalScore;
}
/**
* Generates a string that explains if the total point sum is too low / too high
*/
getScoreDifferenceText(): string {
let difference = this.calculatePointSum() - 240;
if(difference > 0) {
return difference + ' more than expected';
} else {
difference *= -1;
return difference + ' less than expected';
}
} }
/** /**