|
@@ -1,8 +1,8 @@
|
|
class ContentDescription {
|
|
class ContentDescription {
|
|
public name : string;
|
|
public name : string;
|
|
public group : ContentUnit | ContentGroup;
|
|
public group : ContentUnit | ContentGroup;
|
|
- public description : Say | ((description : ContentDescription, group : ContentUnit | ContentGroup) => Say);
|
|
|
|
- private saidCount = 0;
|
|
|
|
|
|
+ public description : Say | ((description : ContentDescription, group : ContentUnit | ContentGroup) => Say);
|
|
|
|
+ private saidCount = 0;
|
|
|
|
|
|
public constructor (name : string, group : ContentUnit | ContentGroup) {
|
|
public constructor (name : string, group : ContentUnit | ContentGroup) {
|
|
this.name = name;
|
|
this.name = name;
|
|
@@ -10,37 +10,37 @@ class ContentDescription {
|
|
}
|
|
}
|
|
|
|
|
|
public getScore () {
|
|
public getScore () {
|
|
- return (this.group).getScore();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public getDescription (group : ContentUnit | ContentGroup) : Say {
|
|
|
|
- this.saidCount++;
|
|
|
|
- if (typeof this.description == "function") {
|
|
|
|
- return this.description(this, group);
|
|
|
|
|
|
+ return (this.group).getScore();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public getDescription (group : ContentUnit | ContentGroup) : Say {
|
|
|
|
+ this.saidCount++;
|
|
|
|
+ if (typeof this.description == "function") {
|
|
|
|
+ return this.description(this, group);
|
|
|
|
+ }
|
|
|
|
+ return this.description;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public setDescription (description : Say | string | ((description : ContentDescription, group : ContentUnit | ContentGroup) => Say) ) {
|
|
|
|
+ if (!(description instanceof Say)) {
|
|
|
|
+ this.description = new Say(description);
|
|
|
|
+ } else {
|
|
|
|
+ this.description = description;
|
|
}
|
|
}
|
|
- return this.description;
|
|
|
|
- }
|
|
|
|
|
|
+ return this;
|
|
|
|
+ }
|
|
|
|
|
|
- public setDescription (description : Say | string | ((description : ContentDescription, group : ContentUnit | ContentGroup) => Say) ) {
|
|
|
|
- if (!(description instanceof Say)) {
|
|
|
|
- this.description = new Say(description);
|
|
|
|
- } else {
|
|
|
|
- this.description = description;
|
|
|
|
- }
|
|
|
|
- return this;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public static pickDescriptions (cda : Array<ContentDescription>, target : ContentGroup | ContentUnit) : Array<Say> {
|
|
|
|
- let a = cda.slice();
|
|
|
|
- let groups = [];
|
|
|
|
- for (let i = 0; i < a.length; i++) {
|
|
|
|
|
|
+ public static pickDescriptions (cda : Array<ContentDescription>, target : ContentGroup | ContentUnit) : Array<Say> {
|
|
|
|
+ let a = cda.slice();
|
|
|
|
+ let groups = [];
|
|
|
|
+ for (let i = 0; i < a.length; i++) {
|
|
let randomIndex = Math.floor(Math.random() * (a.length - i)) + i;
|
|
let randomIndex = Math.floor(Math.random() * (a.length - i)) + i;
|
|
let temp = a[i];
|
|
let temp = a[i];
|
|
a[i] = a[randomIndex];
|
|
a[i] = a[randomIndex];
|
|
a[randomIndex] = temp;
|
|
a[randomIndex] = temp;
|
|
}
|
|
}
|
|
-
|
|
|
|
- // After shuffling the list, descriptions with the highest scores go at the top, and between those the ones with the lowest saidCounts go first
|
|
|
|
|
|
+
|
|
|
|
+ // After shuffling the list, descriptions with the highest scores go at the top, and between those the ones with the lowest saidCounts go first
|
|
// If multiple descriptions have the same score/saidCount, they are picked randomly due to the previous shuffling.
|
|
// If multiple descriptions have the same score/saidCount, they are picked randomly due to the previous shuffling.
|
|
a.sort((a : ContentDescription, b : ContentDescription) => {
|
|
a.sort((a : ContentDescription, b : ContentDescription) => {
|
|
let scoreA = a.getScore() / (a.saidCount + 1);
|
|
let scoreA = a.getScore() / (a.saidCount + 1);
|
|
@@ -49,21 +49,21 @@ class ContentDescription {
|
|
return 0;
|
|
return 0;
|
|
});
|
|
});
|
|
|
|
|
|
- a.forEach(description => {
|
|
|
|
- groups.push(description.group);
|
|
|
|
- });
|
|
|
|
|
|
+ a.forEach(description => {
|
|
|
|
+ groups.push(description.group);
|
|
|
|
+ });
|
|
|
|
|
|
let matches = (<any> target).matchAgainst(<any> groups);
|
|
let matches = (<any> target).matchAgainst(<any> groups);
|
|
if (matches != undefined) {
|
|
if (matches != undefined) {
|
|
- let result = [];
|
|
|
|
- matches.forEach(i => {
|
|
|
|
- result.push(a[i].getDescription(target));
|
|
|
|
- result.push(new Say(" "));
|
|
|
|
- });
|
|
|
|
- return result;
|
|
|
|
- } else {
|
|
|
|
- console.warn("No description available for", target);
|
|
|
|
- return [new Say("Warning: No description available for the current situation. Please report so it can be corrected.")];
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ let result = [];
|
|
|
|
+ matches.forEach(i => {
|
|
|
|
+ result.push(a[i].getDescription(target));
|
|
|
|
+ result.push(new Say(" "));
|
|
|
|
+ });
|
|
|
|
+ return result;
|
|
|
|
+ } else {
|
|
|
|
+ console.warn("No description available for", target);
|
|
|
|
+ return [new Say("Warning: No description available for the current situation. Please report so it can be corrected.")];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|