Skip to content
This repository was archived by the owner on Aug 11, 2021. It is now read-only.

Commit acd1c8a

Browse files
committed
Merge branch 'release/2.1.0'
2 parents 0f37a93 + df94a68 commit acd1c8a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1741
-996
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Metroid Prime Randomizer
22

3-
This application is an item randomizer for the video game Metroid Prime, powered by [Angular](https://angular.io), [TypeScript](https://www.typescriptlang.org), [Node.js](https://nodejs.org) and [Electron](https://electronjs.org).
3+
This application is an item randomizer for the video game Metroid Prime, powered by the [randomprime patcher](https://github.com/aprilwade/randomprime), [Angular](https://angular.io), [TypeScript](https://www.typescriptlang.org), [Node.js](https://nodejs.org) and [Electron](https://electronjs.org).
44

55
[Visit website](https://randomizer.metroidprime.run)
66

package-lock.json

Lines changed: 642 additions & 499 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "metroid-prime-randomizer",
3-
"version": "2.0.0",
3+
"version": "2.1.0",
44
"description": "Metroid Prime Randomizer",
55
"homepage": "https://github.com/etaylor8086/metroid-prime-randomizer",
66
"contributors": [
@@ -67,8 +67,8 @@
6767
"@fortawesome/angular-fontawesome": "^0.5.0",
6868
"@fortawesome/fontawesome": "^1.1.8",
6969
"@fortawesome/fontawesome-free-brands": "^5.0.13",
70-
"@fortawesome/fontawesome-svg-core": "^1.2.27",
71-
"@fortawesome/free-solid-svg-icons": "^5.12.1",
70+
"@fortawesome/fontawesome-svg-core": "^1.2.28",
71+
"@fortawesome/free-solid-svg-icons": "^5.13.0",
7272
"big-integer": "^1.6.48",
7373
"bulma": "^0.7.5",
7474
"bulma-checkradio": "^1.1.1",
@@ -80,15 +80,15 @@
8080
"ngx-toastr": "^11.3.3",
8181
"node-addon-api": "1.5.0",
8282
"primeicons": "^2.0.0",
83-
"primeng": "^9.0.0",
83+
"primeng": "^9.0.6",
8484
"rxjs": "~6.4.0",
8585
"tslib": "^1.11.1",
8686
"uuid": "^3.4.0",
8787
"zone.js": "~0.9.1"
8888
},
8989
"devDependencies": {
90-
"@angular-devkit/build-angular": "^0.803.25",
91-
"@angular/cli": "^8.3.25",
90+
"@angular-devkit/build-angular": "^0.803.26",
91+
"@angular/cli": "^8.3.26",
9292
"@angular/compiler-cli": "^8.2.14",
9393
"@angular/language-service": "^8.2.14",
9494
"@ngx-translate/core": "11.0.1",
@@ -97,11 +97,11 @@
9797
"@types/jasmine": "~3.3.8",
9898
"@types/jasminewd2": "^2.0.8",
9999
"@types/mocha": "^5.2.7",
100-
"@types/node": "^12.12.30",
101-
"@types/uuid": "^3.4.8",
102-
"@types/webpack-env": "^1.15.1",
100+
"@types/node": "^12.12.37",
101+
"@types/uuid": "^3.4.9",
102+
"@types/webpack-env": "^1.15.2",
103103
"chai": "^4.2.0",
104-
"codelyzer": "^5.2.1",
104+
"codelyzer": "^5.2.2",
105105
"conventional-changelog-cli": "2.0.11",
106106
"core-js": "~2.5.7",
107107
"electron": "6.0.10",
@@ -113,18 +113,18 @@
113113
"karma-chrome-launcher": "~2.2.0",
114114
"karma-coverage-istanbul-reporter": "~2.0.1",
115115
"karma-jasmine": "~2.0.1",
116-
"karma-jasmine-html-reporter": "^1.5.2",
117-
"mocha": "^6.2.2",
116+
"karma-jasmine-html-reporter": "^1.5.3",
117+
"mocha": "^6.2.3",
118118
"npm-run-all": "4.1.5",
119-
"protractor": "^5.4.3",
120-
"terser-webpack-plugin": "^2.3.5",
121-
"ts-loader": "^6.2.1",
119+
"protractor": "^5.4.4",
120+
"terser-webpack-plugin": "^2.3.6",
121+
"ts-loader": "^6.2.2",
122122
"ts-node": "~7.0.0",
123123
"tslint": "~5.15.0",
124124
"typescript": "~3.5.3",
125125
"wait-on": "3.2.0",
126126
"webdriver-manager": "12.1.0",
127-
"webpack": "^4.42.0",
127+
"webpack": "^4.43.0",
128128
"webpack-cli": "^3.3.11",
129129
"webpack-node-externals": "^1.7.2"
130130
}

src/client/src/app/generate-game/generate-game.component.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,9 @@ export class GenerateGameComponent implements OnInit {
192192
}
193193

194194
generateSeed(spoiler: boolean) {
195-
this.generatorService.generateGame(this.form.value, spoiler);
195+
if (this.form.valid) {
196+
this.generatorService.generateGame(this.form.value, spoiler);
197+
}
196198
}
197199

198200
importPreset(): void {

src/client/src/app/item-overrides/item-overrides.component.html

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
<div [formGroup]="getFormGroup()">
2+
<div clas="field" style="margin-bottom: 0.5rem;">
3+
<div class="control">Item Pool: <span [ngClass]="itemPoolTextStyling">{{ getItemPoolSize() }}</span> /
4+
{{ ITEM_POOL_MAX_SIZE }}</div>
5+
</div>
26
<div class="field is-grouped">
37
<div class="control">
48
<div class="select is-small" style="margin-right: 0.5rem;" *ngIf="getAvailableItems().length">
@@ -24,7 +28,8 @@
2428
</header>
2529
<div class="card-content">
2630
<div class="field" *ngIf="getItem(override.value.name).experimental">
27-
<p class="has-text-danger">EXPERIMENTAL - You are not guaranteed to finish the game if you change this item's behavior.</p>
31+
<p class="has-text-danger">EXPERIMENTAL - You are not guaranteed to finish the game if you change this
32+
item's behavior.</p>
2833
</div>
2934
<div class="field">
3035
<label class="label is-small">State</label>

src/client/src/app/item-overrides/item-overrides.component.ts

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ interface Item {
2323
export class ItemOverridesComponent extends SettingsSection implements OnInit {
2424
selectedAvailableItem: Item;
2525
private formArray: FormArray;
26+
private globalFormGroup: FormGroup;
2627
private fb: FormBuilder = new FormBuilder();
2728
private items: Item[] = [
2829
{ name: PrimeItem.MISSILE_LAUNCHER, maximum: 1 },
@@ -41,23 +42,27 @@ export class ItemOverridesComponent extends SettingsSection implements OnInit {
4142
{ name: PrimeItem.GRAVITY_SUIT, maximum: 1 },
4243
{ name: PrimeItem.PHAZON_SUIT, maximum: 1 },
4344
{ name: PrimeItem.GRAPPLE_BEAM, maximum: 1 },
44-
{ name: PrimeItem.SCAN_VISOR, maximum: 1, exclude: [ItemOverrides.STATES.vanilla], experimental: true },
45+
{ name: PrimeItem.SCAN_VISOR, maximum: 1, exclude: [ItemOverrides.STATES.vanilla] },
4546
{ name: PrimeItem.THERMAL_VISOR, maximum: 1 },
4647
{ name: PrimeItem.XRAY_VISOR, maximum: 1 },
4748
{ name: PrimeItem.WAVEBUSTER, maximum: 1 },
4849
{ name: PrimeItem.ICE_SPREADER, maximum: 1 },
4950
{ name: PrimeItem.FLAMETHROWER, maximum: 1 },
5051
{ name: PrimeItem.ENERGY_TANK, maximum: 14, isExpansion: true, exclude: [ItemOverrides.STATES.vanilla] },
5152
{ name: PrimeItem.MISSILE_EXPANSION, maximum: 49, isExpansion: true, exclude: [ItemOverrides.STATES.vanilla] },
52-
{ name: PrimeItem.POWER_BOMB_EXPANSION, maximum: 4 , isExpansion: true, exclude: [ItemOverrides.STATES.vanilla] }
53+
{ name: PrimeItem.POWER_BOMB_EXPANSION, maximum: 4, isExpansion: true, exclude: [ItemOverrides.STATES.vanilla] }
5354
];
5455

56+
// Constants
57+
readonly ITEM_POOL_MAX_SIZE = 100;
58+
5559
constructor(private controlContainer: ControlContainer, protected randomizerService: RandomizerService) {
5660
super(randomizerService);
5761
}
5862

5963
ngOnInit() {
6064
this.formArray = this.controlContainer.control.get('itemOverrides') as FormArray;
65+
this.globalFormGroup = this.controlContainer.control as FormGroup;
6166
this.assignFirstAvailableItem();
6267
}
6368

@@ -131,6 +136,41 @@ export class ItemOverridesComponent extends SettingsSection implements OnInit {
131136
return true;
132137
}
133138

139+
getItemPoolSize(): number {
140+
const activeOverrides = this.formArray.value as ItemOverride[];
141+
let itemPoolSize = 0;
142+
143+
// Everything is shuffled except for scan visor
144+
for (let item of this.items) {
145+
const override = activeOverrides.find(overrideItem => overrideItem.name === item.name);
146+
147+
if (override && override.state === ItemOverrides.STATES.shuffled) {
148+
itemPoolSize += override.count;
149+
} else if (!override && item.name !== PrimeItem.SCAN_VISOR) {
150+
itemPoolSize += item.maximum;
151+
}
152+
}
153+
154+
// Handle artifacts
155+
const artifactChoices = this.getChoices('goal');
156+
switch (this.globalFormGroup.get('rules').get('goal').value) {
157+
case 'artifact-collection':
158+
itemPoolSize += this.globalFormGroup.get('rules').get('goalArtifacts').value;
159+
break;
160+
case 'all-bosses':
161+
itemPoolSize += 3;
162+
break;
163+
}
164+
165+
return itemPoolSize;
166+
}
167+
168+
get itemPoolTextStyling(): object {
169+
return {
170+
'has-text-danger': this.getItemPoolSize() > this.ITEM_POOL_MAX_SIZE
171+
};
172+
}
173+
134174
private assignFirstAvailableItem(): void {
135175
const availableItems = this.getAvailableItems();
136176

src/client/src/app/services/generator.service.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ export class GeneratorService {
4848
value: currentGeneration.seeds.length,
4949
label: (currentGeneration.seeds.length + 1) + ' / ' + currentGeneration.total + ':'
5050
});
51-
this.progressService.setMessage('Generating world...');
5251
this.progressService.setProgressBars(currentProgressBars);
5352

5453
this.currentGeneration$.next(currentGeneration);
@@ -74,6 +73,7 @@ export class GeneratorService {
7473

7574
this.electronService.ipcRenderer.on('importSeedResponse', (event, generatedSeed: GeneratedSeed, spoiler: boolean) => {
7675
this.ngZone.run(() => {
76+
this.progressService.setOpen(false);
7777
this.spoiler$.next(spoiler);
7878
this.generatedSeeds$.next([generatedSeed]);
7979
this.toastrService.success('Imported the permalink successfully.');
@@ -100,7 +100,7 @@ export class GeneratorService {
100100
});
101101

102102
this.progressService.setTitle('Generating Seed');
103-
this.progressService.setMessage('Starting generator.');
103+
this.progressService.setMessage('Generating world...');
104104
this.progressService.setProgressBars([
105105
{
106106
total: generationCount,
@@ -129,6 +129,18 @@ export class GeneratorService {
129129

130130
if (decodedItems) {
131131
this.lastSettingsUsed$.next(PrimeRandomizerSettings.fromSettingsString(decodedItems.settingsString).toRandomizerForm());
132+
133+
this.progressService.setTitle('Importing Permalink');
134+
this.progressService.setMessage('Generating world...');
135+
this.progressService.setProgressBars([
136+
{
137+
total: 1,
138+
value: null,
139+
label: '1 / 1:'
140+
}
141+
]);
142+
143+
this.progressService.setOpen(true);
132144
this.electronService.ipcRenderer.send('importSeed', decodedItems.seed, decodedItems.settingsString);
133145
}
134146
}

src/client/src/app/services/randomizer.service.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ export class RandomizerService {
2828
romSettings: fb.group({
2929
skipFrigate: [this.DEFAULT_SETTINGS.skipFrigate],
3030
skipHudPopups: [this.DEFAULT_SETTINGS.skipHudPopups],
31-
hideItemModels: [this.DEFAULT_SETTINGS.hideItemModels]
31+
hideItemModels: [this.DEFAULT_SETTINGS.hideItemModels],
32+
enableMainPlazaLedgeDoor: [this.DEFAULT_SETTINGS.enableMainPlazaLedgeDoor]
3233
}),
3334
rules: fb.group({
3435
goal: [this.DEFAULT_SETTINGS.goal],

src/client/src/app/settings/read-only-settings-container/read-only-settings-container.component.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ <h1 class="title has-bottom-border">ROM Settings</h1>
1313
<p class="heading">{{ getDisplayName('hideItemModels') }}</p>
1414
<p>{{ getValue('hideItemModels', 'romSettings') }}</p>
1515
</div>
16+
<div class="field">
17+
<p class="heading">{{ getDisplayName('enableMainPlazaLedgeDoor') }}</p>
18+
<p>{{ getValue('enableMainPlazaLedgeDoor', 'romSettings') }}</p>
19+
</div>
1620
</div>
1721
<div class="column">
1822
<h1 class="title has-bottom-border">Rules</h1>

src/client/src/app/settings/rom-settings/rom-settings.component.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,12 @@
2121
[pTooltip]="DETAILS.hideItemModels.description">{{ getDisplayName('hideItemModels') }}</label>
2222
</div>
2323
</div>
24+
<div class="column is-one-third">
25+
<div class="field">
26+
<input class="is-checkradio" id="enableMainPlazaLedgeDoor" type="checkbox" formControlName="enableMainPlazaLedgeDoor">
27+
<label for="enableMainPlazaLedgeDoor"
28+
[pTooltip]="DETAILS.enableMainPlazaLedgeDoor.description">{{ getDisplayName('enableMainPlazaLedgeDoor') }}</label>
29+
</div>
30+
</div>
2431
</div>
2532
</form>

src/client/src/app/settings/rules/rules.component.html

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,18 +113,26 @@
113113
<div formGroupName="randomStartingItems">
114114
<label class="label is-small" [pTooltip]="DETAILS.randomStartingItems.description">Randomized Starting
115115
Items</label>
116-
<div class="field is-spaced-field is-inline-block-tablet">
116+
<div class="field">
117117
<label class="label is-small">Minimum</label>
118118
<div class="control">
119119
<input class="input has-width-auto is-small" type="number" formControlName="minimum"
120120
[pTooltip]="DETAILS.randomStartingItems.items.minimum.description">
121+
<div *ngIf="getFormGroup().controls.randomStartingItems.controls.minimum.errors">
122+
<p class="help is-danger" *ngIf="getFormGroup().controls.randomStartingItems.controls.minimum.errors.min">Minimum count is 0.</p>
123+
<p class="help is-danger" *ngIf="getFormGroup().controls.randomStartingItems.controls.minimum.errors.max">Maximum count is 25.</p>
124+
</div>
121125
</div>
122126
</div>
123-
<div class="field is-spaced-field is-inline-block-tablet">
127+
<div class="field">
124128
<label class="label is-small">Maximum</label>
125129
<div class="control">
126130
<input class="input has-width-auto is-small" type="number" formControlName="maximum"
127131
[pTooltip]="DETAILS.randomStartingItems.items.maximum.description">
132+
<div *ngIf="getFormGroup().controls.randomStartingItems.controls.maximum.errors">
133+
<p class="help is-danger" *ngIf="getFormGroup().controls.randomStartingItems.controls.maximum.errors.min">Minimum count is 0.</p>
134+
<p class="help is-danger" *ngIf="getFormGroup().controls.randomStartingItems.controls.maximum.errors.max">Maximum count is 25.</p>
135+
</div>
128136
</div>
129137
</div>
130138
</div>

src/client/src/app/settings/tricks/tricks.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ export class TricksComponent extends PicklistFormComponent implements OnInit {
2929
Difficulty.EASY,
3030
Difficulty.NORMAL,
3131
Difficulty.HARD,
32-
Difficulty.INSANE
32+
Difficulty.INSANE,
33+
Difficulty.OOB
3334
];
3435
readonly FILTERS: string[] = [
3536
this.NONE_FILTER,

0 commit comments

Comments
 (0)