diff --git a/crates/workshop-rs/src/catalog/data/catalog.json b/crates/workshop-rs/src/catalog/data/catalog.json index 608b93f7..2b5a7e8b 100644 --- a/crates/workshop-rs/src/catalog/data/catalog.json +++ b/crates/workshop-rs/src/catalog/data/catalog.json @@ -366,7 +366,7 @@ "name" ], "paramTypes": [ - "Player|Array", + "Player|Array|EntityId", "String" ], "params": [ @@ -1987,10 +1987,7 @@ "paramCoercions": [ null, null, - { - "falseAsNumber": true, - "trueAsNumber": true - }, + null, { "nullVectorAsNull": true }, @@ -2008,7 +2005,7 @@ "paramTypes": [ "Hero|Array", "Team", - "Number", + "Number|Boolean", "Vector", "Vector" ], @@ -5256,7 +5253,7 @@ ] } ], - "digest": "d25c1099ed1f23b50612406ea7ff767ba785117a36794f1c45c4d01cd4e0ce29", + "digest": "29346860dce77a49f75ad9b4e5f230f91460f2b4c391e2c6fff26e082ac29bdd", "enums": [ { "domain": "Impulse", @@ -12361,7 +12358,7 @@ "array" ], "paramTypes": [ - "Array" + "Array|EntityId" ], "params": [ "Array" @@ -12393,7 +12390,7 @@ "paramTypes": [ "String|Array", "String|Array", - "String|Array" + "String|Array|EntityId" ], "params": [ "String", @@ -12423,7 +12420,7 @@ "paramTypes": [ "String", "Number", - "Number" + "Number|Boolean" ], "params": [ "String", @@ -12442,16 +12439,14 @@ { "emptyArrayAsString": true }, - { - "emptyArrayAsString": true - } + null ], "paramNames": [ "string", "separator" ], "paramTypes": [ - "String|Array", + "String|Array|EntityId", "String|Array" ], "params": [ diff --git a/crates/workshop-rs/tests/contextual_semantics.rs b/crates/workshop-rs/tests/contextual_semantics.rs index f56a34be..d7cbe2d1 100644 --- a/crates/workshop-rs/tests/contextual_semantics.rs +++ b/crates/workshop-rs/tests/contextual_semantics.rs @@ -99,6 +99,19 @@ fn one_sided_contextual_aliases_reject_the_other_boolean() { assert!(format!("{error:?}").contains("semantic type")); } +#[test] +fn entity_ids_and_boolean_string_slice_counts_match_workshop_contract() { + let setup = program( + "Create Dummy Bot(All Heroes, Team 1, False, Null, Null); Start Forcing Dummy Bot Name(Last Created Entity, Custom String(\"x\"));", + ); + validate_program(&setup); + + let derived = program( + "Set Global Variable(probe, String Slice(String Replace(Custom String(\"x\"), String Split(Custom String(\"x\"), Empty Array), First Of(Last Created Entity)), 126, True)); Set Global Variable(parts, String Split(First Of(Last Created Entity), Empty Array));", + ); + validate_program(&derived); +} + #[test] fn wait_until_keeps_numeric_exception_without_global_truthiness() { let numeric = program("Wait Until(1, 2);"); diff --git a/crates/workshop-rs/tests/identity.rs b/crates/workshop-rs/tests/identity.rs index e4bf6aa2..feb33dea 100644 --- a/crates/workshop-rs/tests/identity.rs +++ b/crates/workshop-rs/tests/identity.rs @@ -12,7 +12,7 @@ use workshop_rs::catalog::{Catalog, Locale}; /// (`workshop-catalog-gen build`) recomputes it and the pin is updated /// deliberately together with the data. const PINNED_CATALOG_DIGEST: &str = - "d25c1099ed1f23b50612406ea7ff767ba785117a36794f1c45c4d01cd4e0ce29"; + "29346860dce77a49f75ad9b4e5f230f91460f2b4c391e2c6fff26e082ac29bdd"; #[test] fn committed_catalog_digest_is_pinned() { diff --git a/crates/workshop-rs/tests/language_conformance.rs b/crates/workshop-rs/tests/language_conformance.rs index 303ac491..3c041e46 100644 --- a/crates/workshop-rs/tests/language_conformance.rs +++ b/crates/workshop-rs/tests/language_conformance.rs @@ -727,9 +727,13 @@ fn sample_argument(catalog: &Catalog, parameter_type: &str) -> String { "Boolean" => "True".to_string(), "Number" | "Number|Boolean" | "Boolean|Number" | "Boolean|Number|Vector" => "1".to_string(), "Vector" | "Vector|Player" | "Vector|Player|Array" => "Vector(0, 0, 0)".to_string(), - "String" | "String|Array" | "Object|String" => "Custom String(\"probe\")".to_string(), - "Array" => "All Players(All Teams)".to_string(), - "Player" | "Player|Array" | "Player|EntityId" => "Event Player".to_string(), + "String" | "String|Array" | "String|Array|EntityId" | "Object|String" => { + "Custom String(\"probe\")".to_string() + } + "Array" | "Array|EntityId" => "All Players(All Teams)".to_string(), + "Player" | "Player|Array" | "Player|Array|EntityId" | "Player|EntityId" => { + "Event Player".to_string() + } "Object" | "Object|Array" | "Boolean|Number|Object|Array" => "Event Player".to_string(), "Hero|Array" => "D.Va".to_string(), "Operation" => "Add".to_string(), diff --git a/docs/language-support/actions.md b/docs/language-support/actions.md index b9c1c81d..af666666 100644 --- a/docs/language-support/actions.md +++ b/docs/language-support/actions.md @@ -25,7 +25,7 @@ This document inventories the canonical Workshop actions supported by `workshop- | `Communicate` | ✅ Supported | Parameters: (Object: Player|Array, Comms: Comms). | | `Continue` | ✅ Supported | No parameters. | | `Create Beam Effect` | ✅ Supported | Parameters: (VisibleTo: Player|Array, Type: Beam, StartPosition: Vector, EndPosition: Vector, Color: Color, Reevaluation: EffectReeval). | -| `Create Dummy Bot` | ✅ Supported | Parameters: (Hero: Hero|Array, Team: Team, Slot: Number, Position: Vector, Direction: Vector). | +| `Create Dummy Bot` | ✅ Supported | Parameters: (Hero: Hero|Array, Team: Team, Slot: Number|Boolean, Position: Vector, Direction: Vector). | | `Create Effect` | ✅ Supported | Parameters: (VisibleTo: Player|Array, Type: Effect, Color: Color, Position: Vector|Player, Radius: Number, Reevaluation: EffectReeval). | | `Create HUD Text` | ✅ Supported | Parameters: (VisibleTo: Player|Array, Header: Object|String, Subheader: Object|String, Text: Object|String, Location: HudPosition, SortOrder: Number|Boolean, HeaderColor: Color, SubheaderColor: Color, TextColor: Color, Reevaluation: HudReeval, Spectators: SpecVisibility). | | `Create Homing Projectile` | ✅ Supported | Parameters: (Projectile: Projectile, Object: Player|Array, Position: Vector, Direction: Vector, Relativity: Relativity, ModifyHealth: ModifyHealth, Team: Team, Number: Number, Number: Number, Number: Number, DynamicEffect: DynamicEffect, DynamicEffect: DynamicEffect, Number: Number, Number: Number, Number: Number, Number: Number, Player: Player, Number: Number). | @@ -176,7 +176,7 @@ This document inventories the canonical Workshop actions supported by `workshop- | `Start Damage Modification` | ✅ Supported | Parameters: (Object: Player|Array, Object: Player|Array, Number: Number, DamageReeval: DamageReeval). | | `Start Damage Over Time` | ✅ Supported | Parameters: (Object: Player|Array, Player: Player, Number: Number, Number: Number). | | `Start Facing` | ✅ Supported | Parameters: (Player: Player|Array, Direction: Vector, Turn Rate: Number, Relativity: Relativity, Reevaluation: FacingReeval). | -| `Start Forcing Dummy Bot Name` | ✅ Supported | Parameters: (Object: Player|Array, String: String). | +| `Start Forcing Dummy Bot Name` | ✅ Supported | Parameters: (Object: Player|Array|EntityId, String: String). | | `Start Forcing Player Outlines` | ✅ Supported | Parameters: (ViewedPlayers: Player|Array, ViewingPlayers: Player|Array, Visible: Boolean, Color: Color, Visibility: OutlineVisibility). | | `Start Forcing Player Position` | ✅ Supported | Parameters: (Player: Player, Position: Vector, Boolean: Boolean). | | `Start Forcing Player To Be Hero` | ✅ Supported | Parameters: (Object: Player|Array, Hero: Hero). | diff --git a/docs/language-support/values.md b/docs/language-support/values.md index e78e0e57..124cb714 100644 --- a/docs/language-support/values.md +++ b/docs/language-support/values.md @@ -80,7 +80,7 @@ This document inventories canonical Workshop values and expressions in `workshop | `Farthest Player From` | ✅ Supported | Returns: `Player`; Parameters: (Position: Vector, Team: Team). | | `False` | ✅ Supported | Returns: `BoolLiteral`. | | `Filtered Array` | ✅ Supported | Returns: `Array`; Parameters: (Array: Array, Condition: Boolean). | -| `First Of` | ✅ Supported | Returns: `Object|Array`; Parameters: (Array: Array). | +| `First Of` | ✅ Supported | Returns: `Object|Array`; Parameters: (Array: Array|EntityId). | | `Flag Position` | ✅ Supported | Returns: `Vector`; Parameters: (Team: Team). | | `Forward` | ✅ Supported | Returns: `Array`. | | `Game Mode` | ✅ Supported | Returns: `Gamemode`; Parameters: (Gamemode: Gamemode). | @@ -232,9 +232,9 @@ This document inventories canonical Workshop values and expressions in `workshop | `String` | ✅ Supported | Returns: `String`; Parameters: (String: String, {0}: Object|Array, {1}: Object|Array, {2}: Object|Array). `Custom String` remains supported. | | `String Contains` | ✅ Supported | Returns: `Boolean`; Parameters: (String: String, String: String). | | `String Length` | ✅ Supported | Returns: `Number`; Parameters: (String: String). | -| `String Replace` | ✅ Supported | Returns: `String`; Parameters: (String: String|Array, Search: String|Array, Replacement: String|Array). | -| `String Slice` | ✅ Supported | Returns: `String`; Parameters: (String: String, Start Index: Number, Count: Number). | -| `String Split` | ✅ Supported | Returns: `Array`; Parameters: (String: String|Array, Separator: String|Array). | +| `String Replace` | ✅ Supported | Returns: `String`; Parameters: (String: String|Array, Search: String|Array, Replacement: String|Array|EntityId). | +| `String Slice` | ✅ Supported | Returns: `String`; Parameters: (String: String, Start Index: Number, Count: Number|Boolean). | +| `String Split` | ✅ Supported | Returns: `Array`; Parameters: (String: String|Array|EntityId, Separator: String|Array). | | `Subtract` | ✅ Supported | Returns: `Number|Vector`; Parameters: (a: Number|Boolean|Vector, b: Number|Boolean|Vector). | | `Tangent From Degrees` | ✅ Supported | Returns: `Number`; Parameters: (Number: Number). | | `Tangent From Radians` | ✅ Supported | Returns: `Number`; Parameters: (Number: Number). |