ItsDeltin / Overwatch-Script-To-Workshop

Converts scripts to Overwatch workshops.
207 stars 24 forks source link

[BUG] Switch statement utilizing Enum values broken by 520c266 #486

Closed CactusPuppy closed 1 month ago

CactusPuppy commented 1 month ago

git bisect is blaming a recent regression with the following OSTW code on commit 520c266:

enum PowerupType {
  NONE,
  DOUBLE_JUMP,
  SPEED_BOOST,
  JUMP_BOOST,
  SHIELD
}

rule: "When player spawns, give them a new powerup."
Event.OngoingPlayer
if (HasSpawned())
if (IsAlive())
{
  PowerupType powerup = PowerupType.NONE;
  Number random = RandomInteger(0, 4);
  if (random == 0)
  {
    powerup = PowerupType.DOUBLE_JUMP;
  }
  else if (random == 1)
  {
    powerup = PowerupType.SPEED_BOOST;
  }
  else if (random == 2)
  {
    powerup = PowerupType.JUMP_BOOST;
  }
  else if (random == 3)
  {
    powerup = PowerupType.SHIELD;
  }
  switch (powerup) {
    case PowerupType.DOUBLE_JUMP:
      LogToInspector("TODO: Double Jump");
      break;
  }
}

(yes it's not the prettiest code, I just had Copilot spit something out really quick for demonstration purposes)

Expected output:

variables
{
    player:
        0: powerup
        1: random
}

rule("When player spawns, give them a new powerup.")
{

    event
    {
        Ongoing - Each Player;
        All;
        All;
    }

    conditions
    {
        Has Spawned(Event Player) == True;
        Is Alive(Event Player) == True;
    }

    // Action count: 13
    actions
    {
        Set Player Variable(Event Player, powerup, 0);
        Set Player Variable(Event Player, random, Random Integer(0, 4));
        If(Compare(Player Variable(Event Player, random), ==, 0));
            Set Player Variable(Event Player, powerup, 1);
        Else If(Compare(Player Variable(Event Player, random), ==, 1));
            Set Player Variable(Event Player, powerup, 2);
        Else If(Compare(Player Variable(Event Player, random), ==, 2));
            Set Player Variable(Event Player, powerup, 3);
        Else If(Compare(Player Variable(Event Player, random), ==, 3));
            Set Player Variable(Event Player, powerup, 4);
        End;
        Skip(Value In Array(Array(1, 0), Add(Index Of Array Value(Array(1), Player Variable(Event Player, powerup)), 1)));
        Log To Inspector(Custom String("TODO: Double Jump"));
    }
}

Actual output:

An exception was thrown while translating to workshop.
System.NullReferenceException: Object reference not set to an instance of an object.
   at Deltin.Deltinteger.Parse.BlockAction.Translate(ActionSet actionSet) in D:\Projects_Local\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Block.cs:line 42
   at Deltin.Deltinteger.Parse.ActionSet.CompileStatement(IStatement statement) in D:\Projects_Local\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\TranslateRule.cs:line 317
   at Deltin.Deltinteger.Parse.SwitchAction.Translate(ActionSet actionSet) in D:\Projects_Local\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Switch.cs:line 141
   at Deltin.Deltinteger.Parse.ActionSet.CompileStatement(IStatement statement) in D:\Projects_Local\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\TranslateRule.cs:line 317
   at Deltin.Deltinteger.Parse.BlockAction.Translate(ActionSet actionSet) in D:\Projects_Local\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Block.cs:line 42
   at Deltin.Deltinteger.Parse.ActionSet.CompileStatement(IStatement statement) in D:\Projects_Local\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\TranslateRule.cs:line 317
   at Deltin.Deltinteger.Parse.TranslateRule..ctor(DeltinScript deltinScript, RuleAction ruleAction) in D:\Projects_Local\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\TranslateRule.cs:line 46
   at Deltin.Deltinteger.Parse.DeltinScript.<ToWorkshop>b__96_2(RuleAction ostwRule) in D:\Projects_Local\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Translate.cs:line 397
   at Deltin.Deltinteger.Model.Variant`2.Match(Action`1 onA, Action`1 onB) in D:\Projects_Local\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Model\Variant.cs:line 26
   at Deltin.Deltinteger.Parse.DeltinScript.ToWorkshop(Func`2 addRules) in D:\Projects_Local\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Translate.cs:line 393
   at Deltin.Deltinteger.Parse.DeltinScript..ctor(TranslateSettings translateSettings) in D:\Projects_Local\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Translate.cs:line 79
CactusPuppy commented 1 month ago

Note that commenting out the case statement in the switch statement causes the code to compile without issue.