Files
factorio-scenario-ExpCluster/exp_scenario/seed.ts
T
bbassieandClaude Fable 5.1 51786c5df9 Export messages and controller types from exp_roles and exp_groups
exp_scenario reached into @expcluster/roles/dist/node/* for the message
classes and the controller plugin type. The package index now re-exports
messages and the ControllerPlugin type, so consumers import from the
package name like they do with @clusterio/lib. The controller export is
type only, which keeps node code out of the web bundle. The test still
requires the controller classes from dist since they cannot be
re-exported at runtime.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-09 17:31:31 +00:00

344 lines
9.3 KiB
TypeScript

import { RoleColor } from "@expcluster/roles";
/**
* A role created by the seed, as the scenario defined it before roles moved to
* the controller. `parent` stands in for the inheritance
* the old config had and is flattened by the seed. The default and admin roles
* already exist, so those entries only provide the in game properties.
*/
export interface SeedRole {
name: string;
shortHand: string;
color: RoleColor | null;
priority?: number;
autoAssignHours?: number;
blockAutoAssign?: boolean;
/** Uses the controller's default role rather than creating one. */
isDefault?: boolean;
/** Uses the controller's admin role rather than creating one. */
isAdmin?: boolean;
/** Name of the role whose permissions are also granted, applied recursively. */
parent?: string;
permissions: string[];
/**
* Name of the seed group holders are placed in by their highest role.
* Without one the holders stay in Factorio's Default group.
*/
group?: string;
}
/**
* A Factorio permission group created by the seed, as the scenario defined it
* before groups moved to the controller.
*/
export interface SeedGroup {
name: string;
/** When true the input actions are the only ones disallowed, otherwise the only ones allowed. */
isBlacklist: boolean;
inputActions: string[];
}
export const seedRoles: SeedRole[] = [
{
name: "System",
shortHand: "SYS",
color: null,
isAdmin: true,
permissions: [],
},
{
name: "Senior Administrator",
group: "Admin",
shortHand: "SAdmin",
color: new RoleColor(233, 63, 233),
parent: "Administrator",
permissions: [
"exp_scenario.command._rcon",
"exp_scenario.command.debug",
"exp_scenario.command.set_cheat_mode",
"exp_scenario.command.research_all",
],
},
{
name: "Administrator",
group: "Admin",
shortHand: "Admin",
color: new RoleColor(233, 63, 233),
parent: "Moderator",
permissions: [
"exp_scenario.gui.warp_list.bypass_proximity",
"exp_scenario.gui.warp_list.bypass_cooldown",
"exp_scenario.command.connect_all",
],
},
{
name: "Moderator",
group: "Admin",
shortHand: "Mod",
color: new RoleColor(0, 170, 0),
parent: "Trainee",
permissions: [
"exp_scenario.player.instant_respawn",
"exp_scenario.command.assign_role",
"exp_scenario.command.unassign_role",
"exp_scenario.command.repair",
"exp_scenario.command.kill.always",
"exp_scenario.command.tag_clear.always",
"exp_scenario.command.spawn.always",
"exp_scenario.command.clear_reports",
"exp_scenario.command.clear_inventory",
"exp_scenario.command.kill_enemies",
"exp_scenario.command.remove_enemies",
"exp_scenario.command.home",
"exp_scenario.command.set_home",
"exp_scenario.command.get_home",
"exp_scenario.command.return",
"exp_scenario.command.connect_player",
"exp_scenario.command.set_bot_queue",
"exp_scenario.command.set_game_speed",
"exp_scenario.command.set_friendly_fire",
"exp_scenario.command.set_always_day",
"exp_scenario.command.set_pollution_enabled",
"exp_scenario.command.clear_pollution",
"exp_scenario.gui.rocket_info.toggle_active",
"exp_scenario.gui.rocket_info.remote_launch",
"exp_scenario.gui.bonus",
"exp_scenario.decon.fast_trees",
],
},
{
name: "Trainee",
group: "Admin",
shortHand: "TrMod",
color: new RoleColor(0, 170, 0),
parent: "Veteran",
permissions: [
"exp_scenario.player.admin",
"exp_scenario.player.spectator",
"exp_scenario.bypass.reports",
"exp_scenario.command.admin_chat",
"exp_scenario.command.goto",
"exp_scenario.command.teleport",
"exp_scenario.command.bring",
"exp_scenario.command.get_reports",
"exp_scenario.command.protect_entity",
"exp_scenario.command.protect_area",
"exp_scenario.command.protect_tag",
"exp_scenario.command.jail",
"exp_scenario.command.unjail",
"exp_scenario.gui.player_list.kick",
"exp_scenario.gui.player_list.ban",
"exp_scenario.command.spectate",
"exp_scenario.command.follow",
"exp_scenario.command.search",
"exp_scenario.command.search_online",
"exp_scenario.command.search_amount",
"exp_scenario.command.search_recent",
"exp_scenario.command.clear_blueprints_surface",
"exp_scenario.gui.playerdata",
],
},
{
name: "Board Member",
group: "Trusted",
shortHand: "Board",
color: new RoleColor(247, 246, 54),
parent: "Sponsor",
permissions: [
"exp_scenario.command.goto",
"exp_scenario.command.repair",
"exp_scenario.command.spectate",
"exp_scenario.command.follow",
"exp_scenario.gui.playerdata",
],
},
{
name: "Senior Backer",
group: "Trusted",
shortHand: "Backer",
color: new RoleColor(238, 172, 44),
parent: "Sponsor",
permissions: [],
},
{
name: "Sponsor",
group: "Trusted",
shortHand: "Spon",
color: new RoleColor(238, 172, 44),
parent: "Supporter",
permissions: [
"exp_scenario.bypass.reports",
"exp_scenario.player.instant_respawn",
"exp_scenario.gui.rocket_info.toggle_active",
"exp_scenario.gui.rocket_info.remote_launch",
"exp_scenario.gui.bonus",
"exp_scenario.command.home",
"exp_scenario.command.set_home",
"exp_scenario.command.get_home",
"exp_scenario.command.return",
"exp_scenario.decon.fast_trees",
],
},
{
name: "Supporter",
group: "Trusted",
shortHand: "Sup",
color: new RoleColor(230, 99, 34),
parent: "Veteran",
permissions: [
"exp_scenario.player.spectator",
"exp_scenario.command.tag_color",
"exp_scenario.command.jail",
"exp_scenario.command.unjail",
"exp_scenario.command.set_join_message",
"exp_scenario.command.remove_join_message",
],
},
{
name: "Partner",
group: "Trusted",
shortHand: "Part",
color: new RoleColor(140, 120, 200),
parent: "Veteran",
permissions: [
"exp_scenario.player.spectator",
"exp_scenario.command.jail",
"exp_scenario.command.unjail",
],
},
{
name: "Veteran",
group: "Trusted",
shortHand: "Vet",
color: new RoleColor(140, 120, 200),
parent: "Member",
autoAssignHours: 10,
permissions: [
"exp_scenario.chat.commands",
"exp_scenario.command.clear_ground_items",
"exp_scenario.command.clear_blueprints",
"exp_scenario.command.set_trains_to_automatic",
],
},
{
name: "Member",
group: "Standard",
shortHand: "Mem",
color: new RoleColor(24, 172, 188),
parent: "Regular",
permissions: [
"exp_scenario.bypass.deconstruction_log",
"exp_scenario.gui.task_list.add",
"exp_scenario.gui.task_list.edit",
"exp_scenario.gui.warp_list.add",
"exp_scenario.gui.warp_list.edit",
"exp_scenario.gui.surveillance",
"exp_scenario.gui.vlayer_edit",
"exp_scenario.gui.tool",
"exp_scenario.command.save_quickbar",
"exp_scenario.command.vlayer_info",
"exp_scenario.command.lawnmower",
"exp_scenario.command.waterfill",
"exp_scenario.command.artillery",
],
},
{
name: "Regular",
group: "Standard",
shortHand: "Reg",
color: new RoleColor(79, 155, 163),
autoAssignHours: 3,
permissions: [
"exp_scenario.command.kill",
"exp_scenario.command.rainbow",
"exp_scenario.command.spawn",
"exp_scenario.command.me",
"exp_scenario.decon.standard",
"exp_scenario.bypass.entity_protection",
"exp_scenario.bypass.nuke_protection",
],
},
{
name: "Jail",
group: "Restricted",
shortHand: "Jail",
color: new RoleColor(50, 50, 50),
priority: 1,
blockAutoAssign: true,
permissions: [],
},
{
name: "Guest",
group: "Guest",
shortHand: "",
color: new RoleColor(185, 187, 160),
isDefault: true,
permissions: [],
},
];
const adminDisallowed = [
"add_permission_group",
"delete_permission_group",
"edit_permission_group",
"import_permissions_string",
"map_editor_action",
"toggle_map_editor",
"change_multiplayer_config",
"set_heat_interface_mode",
"set_heat_interface_temperature",
"set_infinity_container_filter_item",
"set_infinity_container_remove_unfiltered_items",
"set_infinity_pipe_filter",
];
const trustedDisallowed = [
...adminDisallowed,
"admin_action",
];
const standardDisallowed = [
...trustedDisallowed,
"change_programmable_speaker_alert_parameters",
"drop_item",
"open_new_platform_button_from_rocket_silo",
"set_rocket_silo_send_to_orbit_automated_mode",
];
const guestDisallowed = [
...standardDisallowed,
"change_programmable_speaker_parameters",
"change_train_stop_station",
"remove_cables",
"remove_train_station",
"reset_assembling_machine",
"rotate_entity",
"launch_rocket",
"cancel_research",
"flush_opened_entity_fluid",
"flush_opened_entity_specific_fluid",
];
export const seedGroups: SeedGroup[] = [
{ name: "Admin", isBlacklist: true, inputActions: adminDisallowed },
{ name: "Trusted", isBlacklist: true, inputActions: trustedDisallowed },
{ name: "Standard", isBlacklist: true, inputActions: standardDisallowed },
{ name: "Guest", isBlacklist: true, inputActions: guestDisallowed },
{ name: "Restricted", isBlacklist: false, inputActions: ["write_to_console"] },
];
/** The permissions a seed role grants, including those of its parents. */
export function flattenSeedPermissions(role: SeedRole, roles = seedRoles) {
const permissions = new Set<string>();
const seen = new Set<string>();
let current: SeedRole | undefined = role;
while (current && !seen.has(current.name)) {
seen.add(current.name);
for (const permission of current.permissions) {
permissions.add(permission);
}
current = roles.find(other => other.name === current!.parent);
}
return permissions;
}