OpenXcom Forum

Modding => Tools => Topic started by: SupSuper on August 30, 2018, 02:54:16 am

Title: Ruleset Validator for VSCode v0.9.36
Post by: SupSuper on August 30, 2018, 02:54:16 am
I made an extension for Visual Studio Code that checks your rulesets for syntax errors so you can catch them as you type instead of having to wait for OpenXcom to crash/spew nonsense/do nothing when you make a typo. It looks like this:

(https://i.imgur.com/Cgjd8k0.gif)

I figured it was more useful to extend a familiar text editor than trying to make an entirely separate tool. If this is worth developing further let me know.

Installation Instructions
1. Install Visual Studio Code (https://code.visualstudio.com/) if you don't already have it.
2. Install the OpenXcom Ruleset Tools extension (https://marketplace.visualstudio.com/items?itemName=openxcom.ruleset-tools) and follow the instructions.
3. Just open any .rul file and edit away.

Recommended Usage:
- Use File > Open Folder (or Open With Code in explorer) to open an entire mod at a time, so your workspace is preserved per mod.
- Open the View > Problems window to get a listing of all the errors in the currently open files.
- Use Trim Trailing Whitespace to fix tab errors (this can be done automatically in the Preferences).

What's Visual Studio Code? Isn't that some kind of IDE?
Despite the name, VSCode (for short) is just a fancy text editor in the vein of Notepad++/Sublime/Atom/etc. It's not related to Visual Studio (the IDE) which we use for developing OpenXcom.
It can be extended to be very powerful, but you don't need to be a programmer to use it. I know we've always recommended Notepad++ for YAML, but it's become kinda lackluster over the years.

Why not <insert your favorite editor>?
VSCode is free, cross-platform, and honestly it was the easiest to extend. It already had a powerful YAML extension available so I just had to build on that. If you'd rather port it to <insert your favorite editor> the source is here: https://github.com/OpenXcom/vscode-ruleset
Title: Re: Ruleset Validator for VSCode
Post by: The Reaver of Darkness on August 30, 2018, 02:32:30 pm
Very cool! I just use Notepad++ though. It doesn't do all that, but it does some of it at least.

I wonder if one could use this to scan for new rules they didn't know about?
Title: Re: Ruleset Validator for VSCode
Post by: davide on August 30, 2018, 03:11:31 pm
+100
Title: Re: Ruleset Validator for VSCode
Post by: Finnik on December 02, 2018, 04:13:12 pm
Its totally great! im using it full time for modding. one question - is there any way to add custom commands? as it counts all OXCE syntax as an errors.
Title: Re: Ruleset Validator for VSCode
Post by: Yankes on December 02, 2018, 08:20:01 pm
Yes it should allow as SupSuper careate it anybody can alter it to fit it goals.

btw SupSuper maybe add this file to `docs` folder in oxc repo? This could be source of truth for ruleset available for users.
When someone add new ruleset he need update this file, some thing like this I did for oxce documentation.
Title: Re: Ruleset Validator for VSCode
Post by: SupSuper on December 05, 2018, 08:51:07 pm
Yes it should allow as SupSuper careate it anybody can alter it to fit it goals.

btw SupSuper maybe add this file to `docs` folder in oxc repo? This could be source of truth for ruleset available for users.
When someone add new ruleset he need update this file, some thing like this I did for oxce documentation.
Arguably you could count this as the "source of truth": https://github.com/OpenXcom/vscode-ruleset/tree/master/schemas
Though it's already out-of-date :( I'm trying to figure out a way of having versioning and OXC/OXCE without making a mess of things.
Title: Re: Ruleset Validator for VSCode
Post by: Yankes on December 05, 2018, 10:49:44 pm
To reduce my work needed for describing every possible script function and its parameters I made hack, hole metadata need to parse string can be dump in semi human readable format. Something similar could be done for ruleset.

This probably would need some metaprograming or warper that will at once describe format and load data.

e.g.
Code: [Select]
void generateSchema()
{
  _schema = Schema<T>();
  _schema.field(&T::_id, "id of something");
  _schema.field(&T::_type, "type");
  _schema.field(&T::_weapon, "default weapon");
}
void load(Yaml::node& n)
{
   _schema.load(this, n);
}
Yaml::node save() //if we expand this do saves too
{
   return _schema.save(this);
}
std::string dump()
{
  return _schema.dump();
}

And then source of truth will be `oxc.exe --dump=filename.json`

[ps]

`dump()`  probably should dump YAML too, because it will be more compossible.
Title: Re: Ruleset Validator for VSCode
Post by: luke83 on December 18, 2018, 07:11:54 am
Trying this out tonight, i am making HEAPS of errors in my first Ruleset so i need all the help i can get :)

I have installed VS2017 Community edition, i have also followed the link but the Download Buttone does nothing, how do i install and Use this, is there a video tutorial? OK, trying CSCODE instead. :P

I have found and fixed more errors tonight since installing this ruleset checker than i have in the last 2 weeks combined, this is GREAT!!!!!!!

SupSUper - Question, does this only know about Vanilla commands? I noticed the AllowKneel command from OXCE is marked as a issue, i have ignored it for now.
Title: Re: Ruleset Validator for VSCode
Post by: Yankes on December 18, 2018, 01:36:15 pm
When I find some time I will fork this validator and add OXCE specific properties.
Title: Re: Ruleset Validator for VSCode
Post by: SupSuper on January 04, 2019, 12:25:03 am
OpenXcom Extended support is here! It's a Christmas New Years miracle! After updating the extension (should happen automatically next time you run VSCode) just go into your Settings and pick your preferred version. If you run into any bugs let me know.

(https://i.imgur.com/AauJnNp.gif)
Title: Re: Ruleset Validator for VSCode v0.9.4
Post by: Thermite on April 14, 2020, 08:48:56 pm
randomProducedItems, refund and other OXCE .rul properties aren't accepted by the ruleset tools.
Title: Re: Ruleset Validator for VSCode v0.9.4
Post by: Meridian on April 14, 2020, 09:13:22 pm
Two posts above is a visual guide how to switch between OXC validation and OXCE validation.
Title: Re: Ruleset Validator for VSCode v0.9.4
Post by: Thermite on April 15, 2020, 01:09:38 am
Two posts above is a visual guide how to switch between OXC validation and OXCE validation.
Still doesn't work. keeps highlighting those as invalid
Title: Re: Ruleset Validator for VSCode v0.9.4
Post by: Meridian on April 15, 2020, 09:45:07 am
.
Title: Re: Ruleset Validator for VSCode v0.9.4
Post by: Thermite on April 15, 2020, 11:39:10 pm
What the heck?
It just works now?
Did the configuration change take forever to take place?
Title: Re: Ruleset Validator for VSCode v0.9.4
Post by: Nord on April 24, 2020, 05:55:03 pm
Looks like "refNode" still not supported.
Title: Re: Ruleset Validator for VSCode v0.9.11
Post by: Buscher on April 04, 2022, 10:40:19 pm
No clue if this is the right spot. I would like to report a few false positives shown by the OpenXcom Ruleset Tools (https://marketplace.visualstudio.com/items?itemName=openxcom.ruleset-tools). Some of these are related to how mod: - index: are handled as well as a list being allowed for customArmorPreviewIndex.

Code: [Select]
items:
  - type: STR_SOME_ITEM
    vaporColorSurface: {mod: 40k, index: 2} # Warning: Expected Integer # Works fine in Extended 7.5.8

armors:
  - type: STR_SOME_ARMOR
    moveSound: {mod: 40k, index: 700} # Warning: Expected Integer # Works fine in Extended 7.5.8
    customArmorPreviewIndex: [{mod: 40k, index: 560}, {mod: 40k, index: 561}, {mod: 40k, index: 562}] # Warning: Expected Integer # Works fine in Extended 7.5.8
    layersDefaultPrefix: 20 # Warning: Expected string # The value 20 is not nice but works in Extended 7.5.8

Also if one changes the accuracyMultiplier as a script and it's not part of scripts: and doesn't use the normal syntax, f. ex.
Code: [Select]
items:
# No Warning here
  - type: STR_SOME_ITEM
    accuracyMultiplier:
      firing: 1

accuracyMultiplier: | probably needs extra handling.

Code: [Select]
items:
# Warning: Use syntax from the code field above
  - type: STR_SOMETHING
    accuracyMultiplier: | # Works fine in Extended 7.5.8
      return bonus;
Title: Re: Ruleset Validator for VSCode v0.9.11
Post by: Meridian on April 04, 2022, 10:47:50 pm
Yes, this is the right spot.

Thanks for the report.
I'll fix it before the next release.
Title: Re: Ruleset Validator for VSCode v0.9.11
Post by: The Offensive Lemon on April 29, 2022, 07:51:18 pm
It appears moveCost for armors isn't supported.
Title: Re: Ruleset Validator for VSCode v0.9.11
Post by: Meridian on April 29, 2022, 09:41:59 pm
It appears moveCost for armors isn't supported.

Of course.
moveCost is not an officially released feature yet.
Title: Re: Ruleset Validator for VSCode v0.9.11
Post by: The Offensive Lemon on April 29, 2022, 10:48:50 pm
Of course.
moveCost is not an officially released feature yet.

Oh.  I was not aware of that.
Title: Re: Ruleset Validator for VSCode v0.9.11
Post by: Buscher on December 21, 2024, 10:51:34 pm
Hi,
I have been trying to create a github workflow for linting rul files and I don't get how some particular details work for the OpenXcom Ruleset Tools (vscode ruleset yaml validator) (https://github.com/OpenXcom/vscode-ruleset).

For the purpose of creating said workflow I am using Spectral (https://www.npmjs.com/package/@stoplight/spectral-cli) which gave the best results so far. Except that it can't deal with the recursive bits in the json files (vscode-ruleset/schemas). As a consequence it will create false positives as described below.

So far I understood that I need to merge the oxc bits into oxce-merge. That works well enough with the JSON merger (https://www.npmjs.com/package/json-merger).
Code: [Select]
// merger.js
// put it in vscode-ruleset/schemas/oxce-merge
// run with: node merger.js

const jsonMerger = require("json-merger");
const fs = require("fs");

var result = jsonMerger.mergeFiles(["AlienRace.json", "../oxc/AlienRace.json"]);
fs.writeFileSync("AlienRace.json", JSON.stringify(result, null, 2));

Inside the AlienRace.json there is a setting retaliationMissionWeights
Code: [Select]
//AlienRace.json > properties > retaliationMissionWeights
    "retaliationMissionWeights": {
      "$ref": "WeightedOptions.json#/definitions/Map"

and for WeightedOptions.json
Code: [Select]
{
  "$id": "https://openxcom.org/schemas/oxc/WeightedOptions.json",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "additionalProperties": {
    "type": "integer"
  },
  "definitions": {
    "Map": {
      "patternProperties": {
        "^\\d+$": {
          "$ref": "#" // <-------------- is this a circular reference to WeightedOptions.json ?????
        }
      },
      "additionalProperties": false,
      "type": "object"
    }
  }
}

When I use bundle or dereference of the node package @apidevtools/json-schema-ref-parser (https://www.npmjs.com/package/@apidevtools/json-schema-ref-parser), the circular reference is either adapted with bundle in such a way that it persists and therefore Spectral ignores it or the dereference deletes the entry for retaliationMissionWeights altogether meaning that Spectral will try to use a standard value (string) to lint retaliationMissionWeights creating a false positive.

Is there something I am missing or do you have different ideas what I could try?
Title: Re: Ruleset Validator for VSCode v0.9.11
Post by: Buscher on December 25, 2024, 08:34:56 pm
Different topic:

While linting ROSIGMA with yamllint I got to have a deeper look in the validation results produced by OpenXcom Ruleset Tools v0.9.35 (https://marketplace.visualstudio.com/items?itemName=openxcom.ruleset-tools)

There are results for four kinds of validations that seem to produce false positives
First three:
Code: [Select]
vaporColorSurface: {mod: 40k, index: 3}
vaporColor: {mod: 40k, index: 1}
moveSound: {mod: 40k, index: 828}
VS Code Result: Incorrect type. Expected "integer".
The reference (https://www.ufopaedia.org/index.php/Ruleset_Reference_Nightly_(OpenXcom)#Items#) says that this should be possible and the game works as expected.

Fourth:
Code: [Select]
customArmorPreviewIndex: {mod: 40k, index: 52}
VS Code Result: Incorrect type. Expected one of array, integer.

This can be an integer or an array for normal values. This works in the game as expected.

Would be great if those false positives could be looked at. Thanks.
Title: Re: Ruleset Validator for VSCode v0.9.36
Post by: Meridian on December 26, 2024, 10:54:32 am
Is there something I am missing or do you have different ideas what I could try?

Try asking SupSuper, probably best on Discord.

Would be great if those false positives could be looked at. Thanks.

Fixed in v0.9.36: https://github.com/OpenXcom/vscode-ruleset/commit/33984cd00d4d97a36b750579fbd511d821e80706
Title: Re: Ruleset Validator for VSCode v0.9.36
Post by: Buscher on December 26, 2024, 02:16:46 pm
Thanks for fixing them  :). I ran ROSIGMA through it and deleted all invalid rul syntax already.

As for the above I will try to take another poke at it later and ask Supsuper if I am not getting anywhere. For the curious I found that Spectral assumes a bit too much how yaml has to look (it takes JSON as a reference), so Parsing Options (incompatibleValues) (https://github.com/stoplightio/spectral/blob/develop/docs/guides/4-custom-rulesets.md) need to be added to the bundled/dereferenced ruleset file to avoid some false positives.
Title: Re: Ruleset Validator for VSCode v0.9.36
Post by: mikKoi on January 26, 2025, 10:06:34 am
Hellow, I think I have a false positive in eventScripts
Code: [Select]
xcomBaseInRegionTriggers: [STR_LIST]
Expected "object"

Absolute great tool, thanks
Title: Re: Ruleset Validator for VSCode v0.9.36
Post by: CrazedHarpooner on January 26, 2025, 12:08:48 pm
Hellow, I think I have a false positive in eventScripts
Code: [Select]
xcomBaseInRegionTriggers: [STR_LIST]
Expected "object"

Absolute great tool, thanks

That's because that property is not really a list by yaml standards, it's what I believe is called an associative array (I could be wrong), but many people would probably get confused by that term. So here is what it should look like:
Code: [Select]
    xcomBaseInRegionTriggers:
      STR_REGION_1: true
      STR_REGION_2: false
and no, these cannot be defined within square brackets. You can specify as many regions with either true or false as per your needs.
If you still want it in a single line, I belive this should work for your example:
Code: [Select]
    xcomBaseInRegionTriggers: {STR_LIST: true}
Title: Re: Ruleset Validator for VSCode v0.9.36
Post by: mikKoi on January 26, 2025, 12:26:43 pm
Thank you very much! Mine seemed to work, but my fantasy world mod only has one region at the moment :P

..the example below throws an error in VS btw
Title: Re: Ruleset Validator for VSCode v0.9.36
Post by: CrazedHarpooner on January 26, 2025, 12:50:51 pm
It might work, but probably because the property is considered empty for not having at least 1 key:falue pair in it and thus ignored in-game

Not sure why you're getting an error with the 2nd example, as I've tried it in VSC before even suggesting it and tested in-game too.
Title: Re: Ruleset Validator for VSCode v0.9.36
Post by: mikKoi on January 26, 2025, 01:19:55 pm
Yes, it works fine. I wrote it wrong.

I just read the online references a little more carefully and it is explained well above in researchTrigger. I had skipped over it. Sorry, the posts could be deleted and I should always give more time to research. This is a good example.