Skip to content

Commit 861b26b

Browse files
committed
Add a command to see available /benefits
Fixes #698
1 parent 7d7f217 commit 861b26b

File tree

7 files changed

+146
-39
lines changed

7 files changed

+146
-39
lines changed

javascript/features/collectables/achievements.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import { CollectableDatabase } from 'features/collectables/collectable_database.
1111

1212
// Spray Tag achievements: awarded when the player gathers { 10, 40, 90, 100 } spray tags.
1313
export const kAchievementSprayTagBronze = 1; // kBenefitBasicSprayQuickVehicleAccess
14-
export const kAchievementSprayTagSilver = 2;
15-
export const kAchievementSprayTagGold = 3; // kBenefitBombShop
14+
export const kAchievementSprayTagSilver = 2; // kBenefitBombShop
15+
export const kAchievementSprayTagGold = 3;
1616
export const kAchievementSprayTagPlatinum = 4; // kBenefitFullQuickVehicleAccess
1717

1818
// Red Barrel achievements: awarded when the player gathers { 10, 40, 90, 100 } red barrels.
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// Copyright 2020 Las Venturas Playground. All rights reserved.
2+
// Use of this source code is governed by the MIT license, a copy of which can
3+
// be found in the LICENSE file.
4+
5+
import * as achievements from 'features/collectables/achievements.js';
6+
7+
// Whether a player is able to use the quick vehicle commands. (/nrg & co.)
8+
export const kBenefitBasicSprayQuickVehicleAccess = 0;
9+
export const kBenefitBasicBarrelQuickVehicleAccess = 1;
10+
export const kBenefitFullQuickVehicleAccess = 2;
11+
12+
// Whether a player is able to use the bomb shop.
13+
export const kBenefitBombShop = 3;
14+
15+
// Whether a player can use the vehicle colour changing keys.
16+
export const kBenefitVehicleKeysColour = 4;
17+
18+
// Whether a player can use the vehicle jump keys outside of Las Venturas.
19+
export const kBenefitVehicleKeysJump = 5;
20+
21+
// Whether a player can use the vehicle nitro key outside of Las Venturas.
22+
export const kBenefitVehicleKeysNitro = 6;
23+
24+
// Whether a player can use the vehicle gravity key outside of Las Venturas.
25+
export const kBenefitVehicleKeysGravity = 7;
26+
27+
// Mapping of which benefits map to having to obtain which achievements.
28+
export const kBenefits = new Map([
29+
[
30+
kBenefitBasicSprayQuickVehicleAccess,
31+
{
32+
achievement: achievements.kAchievementSprayTagBronze,
33+
name: 'Spawn /pre and /sul vehicles',
34+
}
35+
],
36+
[
37+
kBenefitBasicBarrelQuickVehicleAccess,
38+
{
39+
achievement: achievements.kAchievementRedBarrelBronze,
40+
name: 'Spawn /ele and /tur vehicles',
41+
}
42+
],
43+
[
44+
kBenefitFullQuickVehicleAccess,
45+
{
46+
achievement: achievements.kAchievementSprayTagPlatinum,
47+
name: 'Spawn /inf and /nrg vehicles',
48+
}
49+
],
50+
[
51+
kBenefitBombShop,
52+
{
53+
achievement: achievements.kAchievementSprayTagSilver,
54+
name: 'Ability to use the Bomb Shop',
55+
}
56+
],
57+
[
58+
kBenefitVehicleKeysColour,
59+
{
60+
achievement: achievements.kAchievementRedBarrelSilver,
61+
name: `Vehicle Key to change colours`,
62+
}
63+
],
64+
[
65+
kBenefitVehicleKeysJump,
66+
{
67+
achievement: achievements.kAchievementRedBarrelPlatinum,
68+
name: `Vehicle Key to jump your vehicle`,
69+
}
70+
],
71+
[
72+
kBenefitVehicleKeysNitro,
73+
{
74+
achievement: achievements.kAchievementReactionTestSilver,
75+
name: `Vehicle Key to add nitro`,
76+
}
77+
],
78+
[
79+
kBenefitVehicleKeysGravity,
80+
{
81+
achievement: achievements.kAchievementTreasuresPlatinium,
82+
name: `Vehicle Key to invert gravity`,
83+
}
84+
]
85+
]);

javascript/features/collectables/collectable_benefits.js

Lines changed: 0 additions & 23 deletions
This file was deleted.

javascript/features/collectables/collectable_commands.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { Menu } from 'components/menu/menu.js';
99
import { Treasures } from 'features/collectables/treasures.js';
1010

1111
import { kAchievements } from 'features/collectables/achievements.js';
12+
import { kBenefits } from 'features/collectables/benefits.js';
1213

1314
import { alert } from 'components/dialogs/alert.js';
1415
import { confirm } from 'components/dialogs/confirm.js';
@@ -51,6 +52,15 @@ export class CollectableCommands {
5152
.description('Status and hints for collecting Red Barrels.')
5253
.build(CollectableCommands.prototype.onSpecificSeriesCommand.bind(this, 'barrels'));
5354

55+
// /benefits [player]?
56+
server.commandManager.buildCommand('benefits')
57+
.description('Displays the available benefits you can collect.')
58+
.sub(CommandBuilder.kTypePlayer, 'player')
59+
.description('Displays information about benefits available to another player.')
60+
.restrict(Player.LEVEL_ADMINISTRATOR)
61+
.build(CollectableCommands.prototype.onBenefitsCommand.bind(this))
62+
.build(CollectableCommands.prototype.onBenefitsCommand.bind(this));
63+
5464
// /collectables
5565
server.commandManager.buildCommand('collectables')
5666
.description('Status and hints for all available collectables.')
@@ -96,6 +106,39 @@ export class CollectableCommands {
96106

97107
// ---------------------------------------------------------------------------------------------
98108

109+
// /benefits [player]?
110+
//
111+
// Displays information about the benefits that are available on the server, and which of the
112+
// achievements are able to unlock them. Will highlight benefits already obtained.
113+
async onBenefitsCommand(currentPlayer, targetPlayer) {
114+
const player = targetPlayer || currentPlayer;
115+
const dialog = new Menu('Benefits', [
116+
'Name',
117+
'Description',
118+
119+
], { pageSize: 25 });
120+
121+
const achievements = this.manager_.getDelegate(CollectableDatabase.kAchievement);
122+
const benefits = [ ...kBenefits ];
123+
124+
// Sort the |benefits| alphabetically by their name, to have a point of recognition.
125+
benefits.sort((lhs, rhs) => lhs[1].name.localeCompare(rhs[1].name));
126+
127+
for (const [ benefit, info ] of benefits) {
128+
const achievement = kAchievements.get(info.achievement);
129+
const achieved =
130+
achievements.hasAchievement(player, info.achievement, /* round= */ false);
131+
132+
const colour = achieved ? '{FFFF00}' : '{CCCCCC}';
133+
134+
dialog.addItem(colour + info.name, colour + achievement.text);
135+
}
136+
137+
await dialog.displayForPlayer(currentPlayer);
138+
}
139+
140+
// ---------------------------------------------------------------------------------------------
141+
99142
// /collectables
100143
//
101144
// Shows players the base of the /collectables command, which displays a dialog with options
@@ -410,6 +453,7 @@ export class CollectableCommands {
410453
dispose() {
411454
server.commandManager.removeCommand('treasures');
412455
server.commandManager.removeCommand('tags');
456+
server.commandManager.removeCommand('benefits');
413457
server.commandManager.removeCommand('barrels');
414458

415459
server.commandManager.removeCommand('collectables');

javascript/features/collectables/collectable_commands.test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,16 @@ describe('CollectableCommands', (it, beforeEach) => {
6363
assert.deepEqual(gunther.getLastDialogAsTable(), directResult);
6464
});
6565

66+
it('should be able to display the available benefits', async (assert) => {
67+
// (1) Executing the /benefits command.
68+
gunther.respondToDialog({ response: 0 /* Dismiss */ });
69+
70+
assert.isTrue(await gunther.issueCommand('/benefits'));
71+
console.log(gunther.getLastDialogAsTable());
72+
73+
assert.isTrue(false);
74+
});
75+
6676
it('should enable players to read the instructions for a series', async (assert) => {
6777
gunther.respondToDialog({ listitem: 1 /* Red Barrels */ }).then(
6878
() => gunther.respondToDialog({ listitem: 0 /* Instructions */ })).then(

javascript/features/collectables/collectables.js

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,7 @@ import { CollectableDatabase } from 'features/collectables/collectable_database.
77
import { CollectableManager } from 'features/collectables/collectable_manager.js';
88
import { Feature } from 'components/feature_manager/feature.js';
99

10-
import * as achievements from 'features/collectables/achievements.js';
11-
import * as benefits from 'features/collectables/collectable_benefits.js';
12-
13-
// Mapping of which benefits map to having to obtain which achievements.
14-
const kBenefitMapping = new Map([
15-
[ benefits.kBenefitBasicSprayQuickVehicleAccess, achievements.kAchievementSprayTagBronze ],
16-
[ benefits.kBenefitBasicBarrelQuickVehicleAccess, achievements.kAchievementRedBarrelBronze ],
17-
[ benefits.kBenefitFullQuickVehicleAccess, achievements.kAchievementSprayTagPlatinum ],
18-
[ benefits.kBenefitBombShop, achievements.kAchievementSprayTagSilver ],
19-
[ benefits.kBenefitVehicleKeysColour, achievements.kAchievementRedBarrelSilver ],
20-
[ benefits.kBenefitVehicleKeysJump, achievements.kAchievementRedBarrelPlatinum ],
21-
]);
10+
import { kBenefits } from 'features/collectables/benefits.js';
2211

2312
// Implementation of the Red Barrels feature, which scatters a series of barrels throughout San
2413
// Andreas that players can "collect" by blowing them up.
@@ -86,7 +75,9 @@ export default class Collectables extends Feature {
8675
// tied to a particular achievement that can be awarded to the |player|. This method is the
8776
// canonical place for such associations to live, used by both JavaScript and Pawn code.
8877
isPlayerEligibleForBenefit(player, benefit) {
89-
const requiredAchievement = kBenefitMapping.get(benefit);
78+
const mapping = kBenefits.get(benefit);
79+
const requiredAchievement = mapping?.achievement;
80+
9081
const achievements = this.manager_.getDelegate(CollectableDatabase.kAchievement);
9182

9283
// Allow the |benefit| if the requirements are not known, otherwise it's unachievable.

javascript/features/vehicles/vehicle_commands.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { CommandBuilder } from 'components/commands/command_builder.js';
66
import { Menu } from 'components/menu/menu.js';
77
import { VehicleModel } from 'entities/vehicle_model.js';
88

9-
import * as benefits from 'features/collectables/collectable_benefits.js';
9+
import * as benefits from 'features/collectables/benefits.js';
1010
import { toSafeInteger } from 'base/string_util.js';
1111
import { Message } from 'base/message.js';
1212

0 commit comments

Comments
 (0)