Merge branch 'master' into dev

This commit is contained in:
Ben C 2022-04-03 17:30:07 -04:00
commit 10304765b5
6 changed files with 363 additions and 114 deletions

View File

@ -25,16 +25,6 @@ jobs:
if: ${{ needs.pre_job.outputs.should_skip != 'true' }}
runs-on: windows-latest
steps:
# Replace / with _ in ref name so that it can be used in a filename
- uses: mad9000/actions-find-and-replace-string@2
id: sanitizeRef
with:
source: ${{ github.ref_name }}
find: '/'
replace: '_'
# Get short-sha so that it can be used in a filename
- uses: benjlevesque/short-sha@v1.2
id: short-sha
- uses: actions/checkout@v2
@ -53,12 +43,20 @@ jobs:
$data = $data.Replace("<OuterWildsModsDirectory>`$(AppData)\OuterWildsModManager\OWML\Mods</OuterWildsModsDirectory>", "<OuterWildsModsDirectory>.</OuterWildsModsDirectory>")
$data | Out-File -encoding ASCII NewHorizons/NewHorizons.csproj.user
# Set to Release if we're in master, otherwise keep us in Debug
- name: Set Release
if: github.ref == 'refs/heads/master'
run: echo "BUILD_TYPE=Release" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append
- name: Set Debug
if: github.ref != 'refs/heads/master'
run: echo "BUILD_TYPE=Debug" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append
- uses: actions/setup-dotnet@v1
with:
dotnet-version: "5.0.x"
- run: dotnet build -c Release -o .\NewHorizons\Bin\Release
- run: tree
- run: dotnet build -c $Env:BUILD_TYPE -o .\NewHorizons\Bin\$Env:BUILD_TYPE
- uses: actions/upload-artifact@v2
with:
name: NewHorizons-${{ steps.sanitizeRef.outputs.value }}-${{ steps.short-sha.outputs.sha }}
path: .\NewHorizons\Bin\Release
name: NewHorizons-${{ env.BUILD_TYPE }}
path: .\NewHorizons\Bin\${{ env.BUILD_TYPE }}

View File

@ -6,6 +6,7 @@ on:
paths:
- docs/**
- NewHorizons/*schema*.json
- NewHorizons/*.xsd
pull_request:
paths:
@ -23,6 +24,7 @@ on:
env:
OUT_DIR: ${{ github.events.inputs.relative_path }}
BASE_URL: https://nh.outerwildsmods.com/
PIPENV_VENV_IN_PROJECT: enabled
jobs:
build:
@ -37,6 +39,15 @@ jobs:
run: |
echo "OUT_DIR=/" >> $GITHUB_ENV
- name: Cache Dependencies
uses: actions/cache@v2
id: cache-dependencies
with:
path: ./.venv
key: ${{ runner.os }}-pip-${{ hashFiles('**/Pipfile.lock') }}
restore-keys: |
${{ runner.os }}-pipenv
- name: Install dependecies
uses: VaultVulp/action-pipenv@v2.0.1
with:

View File

@ -5,8 +5,20 @@
<xs:element name="DialogueTree">
<xs:complexType>
<xs:sequence>
<xs:element name="NameField" type="xs:string"/>
<xs:element name="DialogueNode" type="DialogueNode" maxOccurs="unbounded"/>
<xs:element name="NameField" type="xs:string">
<xs:annotation>
<xs:documentation>
The name of the dialogue tree
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="DialogueNode" type="DialogueNode" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>
The different nodes of this dialogue tree
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
@ -14,42 +26,121 @@
<!-- Dialogue Node Info -->
<xs:complexType name="DialogueNode">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="EntryCondition" type="xs:string" minOccurs="0"/>
<xs:element name="Dialogue" type="Dialogue"/>
<xs:element name="RevealFacts" type="RevealFacts" minOccurs="0"/>
<xs:element name="DialogueOptionsList" type="DialogueOptionsList" minOccurs="0"/>
<xs:element name="Name" type="xs:string">
<xs:annotation>
<xs:documentation>
The name of this dialogue node
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="EntryCondition" type="xs:string" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>
The condition that needs to be met in order to get to this node
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="DialogueTargetShipLogCondition" type="xs:string" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>
A ship log fact that must be revealed in order to get to this node
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Dialogue" type="Dialogue">
<xs:annotation>
<xs:documentation>
The dialogue to show to the player
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="RevealFacts" type="RevealFacts" minOccurs="0">
<xs:annotation>
<xs:documentation>
Facts to reveal when the player sees this dialogue node
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="DialogueOptionsList" type="DialogueOptionsList" minOccurs="0">
<xs:annotation>
<xs:documentation>
A list of options to show to the player once the character is one talking
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
<!-- Dialogue Info -->
<xs:complexType name="Dialogue">
<xs:sequence>
<xs:element name="Page" type="xs:string" maxOccurs="unbounded"/>
<xs:element name="Page" type="xs:string" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>
A page of dialogue to show to the player
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
<!-- Reveal Facts Info -->
<xs:complexType name="RevealFacts">
<xs:sequence>
<xs:element name="FactID" type="xs:string" maxOccurs="unbounded"/>
<xs:element name="FactID" type="xs:string" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>
The ID of a fact to reveal
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
<!-- Dialogue Options List Info -->
<xs:complexType name="DialogueOptionsList">
<xs:sequence>
<xs:element name="DialogueOption" type="DialogueOption" maxOccurs="unbounded"/>
<xs:element name="DialogueOption" type="DialogueOption" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>
Options the player can select from
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
<!-- Dialogue Option Info -->
<xs:complexType name="DialogueOption">
<xs:sequence>
<xs:element name="RequiredPersistentCondition" type="xs:string" minOccurs="0"/>
<xs:element name="CancelledPersistentCondition" type="xs:string" minOccurs="0"/>
<xs:element name="Text" type="xs:string"/>
<xs:element name="DialogueTarget" type="xs:string"/>
<xs:element name="RequiredPersistentCondition" type="xs:string" minOccurs="0">
<xs:annotation>
<xs:documentation>
Require a prior condition to be met to show this option
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="CancelledPersistentCondition" type="xs:string" minOccurs="0">
<xs:annotation>
<xs:documentation>
Hide this option if a condition has been met
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Text" type="xs:string">
<xs:annotation>
<xs:documentation>
The text to show for this option
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="DialogueTarget" type="xs:string">
<xs:annotation>
<xs:documentation>
The name of the DialogueNode to go to when this option is selected
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>

View File

@ -507,65 +507,65 @@
"type": "object",
"properties": {
"scatter": {
"type": "array",
"items": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"path": {
"type": "string",
"description": "Either the path in the scene hierarchy of the item to copy or the path to the object in the supplied asset bundle"
},
"assetBundle": {
"type": "string",
"description": "Relative filepath to an asset-bundle"
},
"offset": {
"$ref": "#/$defs/vector3"
},
"rotation": {
"$ref": "#/$defs/vector3",
"description": "Euler angle degrees"
},
"scale": {
"type": "number",
"default": 1,
"description" : "How many props to scatter around the planet."
"type": "array",
"items": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"path": {
"type": "string",
"description": "Either the path in the scene hierarchy of the item to copy or the path to the object in the supplied asset bundle"
},
"assetBundle": {
"type": "string",
"description": "Relative filepath to an asset-bundle"
},
"offset": {
"$ref": "#/$defs/vector3"
},
"rotation": {
"$ref": "#/$defs/vector3",
"description": "Euler angle degrees"
},
"scale": {
"type": "number",
"default": 1,
"description": "How many props to scatter around the planet."
}
}
}
}
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "Either the path in the scene hierarchy of the item to copy or the path to the object in the supplied asset bundle"
},
"assetBundle": {
"type": "string",
"description": "Relative filepath to an asset-bundle"
},
"position": {
"$ref": "#/$defs/vector3"
},
"rotation": {
"$ref": "#/$defs/vector3",
"description": "Euler angle degrees"
},
"scale": {
"type": "number",
"default": 1
},
"alignToNormal": {
"type": "boolean",
"description": "Do we override rotation and try to automatically align this object to stand upright on the body's surface?",
"default": false
}
"type": "array",
"items": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "Either the path in the scene hierarchy of the item to copy or the path to the object in the supplied asset bundle"
},
"assetBundle": {
"type": "string",
"description": "Relative filepath to an asset-bundle"
},
"position": {
"$ref": "#/$defs/vector3"
},
"rotation": {
"$ref": "#/$defs/vector3",
"description": "Euler angle degrees"
},
"scale": {
"type": "number",
"default": 1
},
"alignToNormal": {
"type": "boolean",
"description": "Do we override rotation and try to automatically align this object to stand upright on the body's surface?",
"default": false
}
},
"scale": {
"type": "number",
@ -580,20 +580,20 @@
"properties": {
"position": {
"$ref": "#/$defs/vector3",
"description" : "When you enter into dialogue, you will look here."
"description": "When you enter into dialogue, you will look here."
},
"radius": {
"type": "number",
"default": 0,
"description" : "Radius of the spherical collision volume where you get the \"talk to\" prompt when looking at. If you use a remoteTriggerPosition, this will instead be the size of the volume that will trigger the dialogue when you enter it."
"description": "Radius of the spherical collision volume where you get the \"talk to\" prompt when looking at. If you use a remoteTriggerPosition, this will instead be the size of the volume that will trigger the dialogue when you enter it."
},
"xmlFile": {
"type": "string",
"description" : "Relative path to the xml file defining the dialogue."
"description": "Relative path to the xml file defining the dialogue."
},
"remoteTriggerPosition": {
"$ref": "#/$defs/vector3",
"description" : "Allows you to trigger dialogue from a distance when you walk into an area."
"description": "Allows you to trigger dialogue from a distance when you walk into an area."
}
}
}
@ -606,7 +606,7 @@
"properties": {
"revealOn": {
"type": "string",
"enum": ["enter", "observe", "snapshot"],
"enum": [ "enter", "observe", "snapshot" ],
"description": "'enter', 'observe', or 'snapshot' what needs to be done to the volume to unlock the facts"
},
"reveals": {
@ -658,6 +658,19 @@
}
}
}
},
"geysers": {
"type": "array",
"description": "A set of geysers",
"items": {
"type": "object",
"properties": {
"position": {
"$ref": "#/$defs/vector3",
"description": "The position of this geyser"
}
}
}
}
}
},

View File

@ -5,8 +5,20 @@
<xs:element name="AstroObjectEntry">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:string"/>
<xs:element name="Entry" type="Entry" maxOccurs="unbounded"/>
<xs:element name="ID" type="xs:string">
<xs:annotation>
<xs:documentation>
ID of the planet these entries are for
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Entry" type="Entry" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>
A set of entries that belong to this planet
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
@ -17,27 +29,117 @@
<!-- Entry Info -->
<xs:complexType name="Entry">
<xs:sequence>
<xs:element name="ID" type="xs:string"/>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Curiosity" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="IsCuriosity" type="empty" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="IgnoreMoreToExplore" type="empty" minOccurs="0"/>
<xs:element name="IgnoreMoreToExploreCondition" type="xs:string" minOccurs="0"/>
<xs:element name="AltPhotoCondition" type="xs:string" minOccurs="0"/>
<xs:element name="RumorFact" type="RumorFact" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="ExploreFact" type="ExploreFact" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="Entry" type="Entry" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="ID" type="xs:string">
<xs:annotation>
<xs:documentation>
The ID of this entry
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Name" type="xs:string">
<xs:annotation>
<xs:documentation>
Name of this entry
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Curiosity" type="xs:string" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>
The curiosity this entry belongs to
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="IsCuriosity" type="empty" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>
Whether this entry is a curiosity
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="IgnoreMoreToExplore" type="empty" minOccurs="0">
<xs:annotation>
<xs:documentation>
Whether to hide the "More To Explore" text on this entry
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="IgnoreMoreToExploreCondition" type="xs:string" minOccurs="0">
<xs:annotation>
<xs:documentation>
Ignore more to explore if a fact is known
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="AltPhotoCondition" type="xs:string" minOccurs="0">
<xs:annotation>
<xs:documentation>
If this fact is revealed, show the Alt picture
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="RumorFact" type="RumorFact" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>
Rumor facts for this entry
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ExploreFact" type="ExploreFact" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>
Explore facts for this entry
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Entry" type="Entry" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>
Child entires within this entry
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
<!-- Rumor Fact Info -->
<xs:complexType name="RumorFact">
<xs:sequence>
<xs:element name="ID" type="xs:string"/>
<xs:element name="SourceID" type="xs:string" minOccurs="0"/>
<xs:element name="RumorName" type="xs:string" minOccurs="0"/>
<xs:element name="RumorNamePriority" type="xs:int" minOccurs="0"/>
<xs:element name="IgnoreMoreToExplore" type="empty" minOccurs="0"/>
<xs:element name="ID" type="xs:string">
<xs:annotation>
<xs:documentation>
The ID of this rumor fact
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="SourceID" type="xs:string" minOccurs="0">
<xs:annotation>
<xs:documentation>
The source of this rumor, this draws a line in detective mode
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="RumorName" type="xs:string" minOccurs="0">
<xs:annotation>
<xs:documentation>
Displays on the card in detective mode if no ExploreFacts have been revealed on the parent entry
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="RumorNamePriority" type="xs:int" minOccurs="0">
<xs:annotation>
<xs:documentation>
Priority over other RumorFacts to appear as the entry card's title
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="IgnoreMoreToExplore" type="empty" minOccurs="0">
<xs:annotation>
<xs:documentation>
Whether to hide the "More to explore" on this rumor fact
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:group ref="TextData"/>
</xs:sequence>
</xs:complexType>
@ -45,8 +147,20 @@
<!-- Explore Fact Info -->
<xs:complexType name="ExploreFact">
<xs:sequence>
<xs:element name="ID" type="xs:string"/>
<xs:element name="IgnoreMoreToExplore" type="empty" minOccurs="0"/>
<xs:element name="ID" type="xs:string">
<xs:annotation>
<xs:documentation>
The ID of this explore fact
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="IgnoreMoreToExplore" type="empty" minOccurs="0">
<xs:annotation>
<xs:documentation>
Whether to hide the "More to explore" text for this fact
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:group ref="TextData"/>
</xs:sequence>
</xs:complexType>
@ -54,12 +168,35 @@
<!-- Text Data Group -->
<xs:group name="TextData">
<xs:sequence>
<xs:element name="Text" type="xs:string"/>
<xs:element name="Text" type="xs:string">
<xs:annotation>
<xs:documentation>
The text content for this fact
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="AltText" minOccurs="0">
<xs:annotation>
<xs:documentation>
Display alt-text given a certain fact is revealed
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Text" type="xs:string"/>
<xs:element name="Condition" type="xs:string"/>
<xs:element name="Text" type="xs:string">
<xs:annotation>
<xs:documentation>
The text to display if the condition is met
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Condition" type="xs:string">
<xs:annotation>
<xs:documentation>
The condition that needs to be fulfilled to have the alt text be displayed
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>

View File

@ -15,6 +15,8 @@ A custom world creation tool for Outer Wilds.
You can view the addons creators have made (or upload one yourself) [here](https://outerwildsmods.com/custom-worlds)!
If you want to see examples of what NH can do check out the [examples add-on](https://github.com/xen-42/ow-new-horizons-examples) or [real solar system add-on](https://github.com/xen-42/outer-wilds-real-solar-system).
Check the ship's log for how to use your warp drive to travel between star systems!
<!-- TOC -->
@ -36,7 +38,7 @@ Check the ship's log for how to use your warp drive to travel between star syste
- Separate solar system scenes accessible via wormhole OR via the ship's new warp drive feature accessible via the ship's log
- Remove existing planets
- Create basic planets from heightmaps/texturemaps
- Stars, comets, asteroid belts, satellites
- Stars, comets, asteroid belts, satellites, geysers, cloak fields
- Binary orbits
- Signalscope signals and custom frequencies
- Surface scatter: rocks, trees, etc, using in-game models, or custom ones
@ -52,14 +54,11 @@ Check the ship's log for how to use your warp drive to travel between star syste
- Implement all planet features:
- Tornados + floating islands
- Let any star go supernova
- Geysers
- Meteors
- Pocket dimensions
- Timed position/velocity changes
- Implement custom Nomai scrolls
- Implement custom translatable writing
- Destroy planets that fall into a star
- Add cloaking volumes
## Contact
Join the [Outer Wilds Modding Discord](https://discord.gg/MvbCbBz6Q6) if you have any questions or just want to chat about modding! Theres a New Horizons category there dedicated to discussion of this mod.