Initial commit version 0.1.0

This commit is contained in:
2025-06-04 22:11:31 -04:00
commit f5fd13eb8a
45 changed files with 2575 additions and 0 deletions

9
CHANGELOG.md Normal file
View File

@@ -0,0 +1,9 @@
# Changelog
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## 0.1.0
- Initial Release

189
Docs/Manual.xml Normal file
View File

@@ -0,0 +1,189 @@
<div align="center"><font face=1><br>
<br>
<br>
THE MARINER'S GUIDE TO ENCHANTED VESSELS<br>
<br>
A Complete Guide to Rowboat Operation<br>
<br>
<br>
<font face=5>Being a comprehensive manual for the proper use and maintenance of enchanted watercraft, as approved by the Imperial Maritime Guild<br>
<hr>
<div align="center"><font face=1>Forward<br>
<br>
<div align="left">Congratulations on your acquisition of a genuine Cyrodiilian rowboat! Whether you seek the tranquil waters of Lake Rumare for an afternoon's fishing, or dare to brave the treacherous channels of the Niben Bay, this sturdy vessel shall serve as your faithful companion upon Tamriel's waterways.<br>
<br>
This manual, penned by the master shipwrights of the Imperial City, contains all knowledge necessary for the proper operation of your enchanted craft. Study it well, for the waters of Cyrodiil can be as unforgiving as they are beautiful.<br>
<hr>
<div align="center">Chapter I: Basic Operation<br>
<br>
<div align="left">Your rowboat has been imbued with minor enchantments that respond to both physical and magical commands. There exist two primary methods of propulsion:<br>
<br>
The Art of Rowing<br>
<br>
The most traditional method employs the "Row" spell, which you discover upon touching your vessel for the first time. When cast, this spell channels your stamina into forward momentum, as if you were pulling mighty oars through the water. Should you wish to reverse direction, simply adopt a crouched stance while casting - the enchantment will understand your intent and propel the craft backward. Those of hearty constitution may maintain the spell's casting for extended periods, though take care not to exhaust yourself completely whilst far from shore!<br>
<br>
Enchanted Propulsion<br>
<br>
For those who prefer to conserve their strength, your boat responds to verbal commands. Simply touch the vessel's hull and speak your intent - whether to "row forward" or "row backward" - and the boat's enchantments will maintain steady progress without further effort on your part.<br>
<hr>
<div align="center">Chapter II: Navigation and Steering<br>
<br>
<div align="left">The boat's enchantments are attuned to your gaze and intent. When standing upon the deck, simply look in your desired direction of travel, and the vessel will gradually turn to match your heading.<br>
<br>
<font face=5>Note from the Enchanter's Guild: Those who favor the perspective of eagles - viewing themselves from above - must physically orient their body in the desired direction, as the enchantment cannot divine intent from such a vantage.<br>
<br>
<font face=1>Maintaining Course<br>
<br>
Should you wish to observe the scenery whilst maintaining your present heading, touch the hull and speak the command to "lock heading." The boat will then maintain its course regardless of where you turn your gaze. To restore normal steering, simply command it to "unlock heading."<br>
<hr>
<div align="center">Chapter III: Overland Transport<br>
<br>
<div align="left">Through clever application of levitation enchantments, your boat may be transported across dry land - though not without considerable effort! To engage this feature, touch the hull and express your desire to "drag the boat." You may also trigger this enchantment through casting the row spell while near the boat.<br>
<br>
Be warned: the boat's full weight of two hundred pounds will rest upon your shoulders during transport. Many a sailor has found themselves caught by bandits or wild beasts whilst so encumbered! You may release the boat at any time by dropping it from your pack or touching the hull once more.<br>
<hr>
<div align="center">Chapter IV: Summoning Your Vessel<br>
<br>
<div align="left">Through the application of advanced translocation magics, your boat may be called to your location from great distances. This enchantment proves invaluable when your vessel becomes lodged amongst rocks or when you simply cannot recall where you moored it last evening.<br>
<br>
Standard Summoning<br>
<br>
The primary summoning ritual calls your boat to the most suitable location before you. The enchantment's intelligence will seek solid ground or calm water, avoiding obstacles that might damage the hull. Simply speak the summoning command when not upon the boat, and it shall appear at a safe distance ahead.<br>
<br>
Direct Placement<br>
<br>
For those situations requiring precise positioning, a secondary command exists to place the boat directly before you. Be warned - this method bypasses the enchantment's safety measures! Your boat may manifest suspended in mid-air or partially merged with solid objects. Use this method only when the standard summoning proves inadequate.<br>
<br>
<font face=5>A word of caution: The translocation process requires several moments to complete. Do not attempt to board your vessel until it has fully materialized and settled into position.<br>
<hr>
<div align="center"><font face=1>Chapter V: Maritime Enhancements<br>
<br>
<div align="left">Master Sergius Verus of Three Brothers Trade Goods in the Imperial City's Market District offers several improvements for the discerning mariner:<br>
<br>
Rowboat Storage Chest<br>
<br>
A waterproof strongbox enchanted with preservation magics. Any items stored within shall remain safe from both thieves and the ravages of time. Unlike common containers, this chest will never mysteriously empty itself of your possessions.<br>
<br>
Rowboat Lamp<br>
<br>
A specially crafted lamp that provides illumination during night voyages. It may be lit or extinguished by touch, through the boat's command system, or by application of fire and frost magics respectively. Let flame kindle the wick, or frost snuff it out!<br>
<br>
Rowboat Rope Ladder<br>
<br>
A rope ladder imbued with protective enchantments. Should you fall overboard whilst the boat moves through open water, this ladder will automatically deploy, allowing you to regain the deck. A wise investment for those prone to maritime mishaps!<br>
<hr>
<div align="center">Chapter VI: Safety and Maintenance<br>
<br>
<div align="left">General Precautions<br>
<br>
Always ensure you are within reasonable distance of your vessel when attempting to row. The enchantments cannot reach beyond approximately three hundred feet.<br>
<br>
Your boat will cease all movement should you find yourself overboard, save for when the safety ladder deploys.<br>
<br>
Take care when navigating shallow waters or near shorelines - your boat may become grounded upon rocks or sand.<br>
<br>
The boat's enchantments prevent operation whilst seated in meditation or rest. Stand ready at the helm!<br>
<br>
Collision Detection Peculiarities<br>
<br>
The protective enchantments that prevent your boat from merging with solid matter can occasionally prove... temperamental. You may find your vessel suddenly "grounded" whilst in open water - fear not! This is merely the enchantment being overly cautious. Simply continue rowing and the boat will free itself.<br>
<br>
Conversely, these same protections may sometimes slumber when most needed, allowing your boat to become lodged within cliff faces or other obstacles. Should this occur, employ the summoning ritual to recall your vessel to a clear location.<br>
<br>
Navigation and Location<br>
<br>
Fear not losing track of your vessel! The boat bears a minor cartographic enchantment that marks its position upon your map whenever it comes to rest. Look for its marker when you need to retrieve your craft.<br>
<br>
Boarding Your Vessel<br>
<br>
The standard boarding command attempts to place you atop the deck, though the enchantment sometimes miscalculates, depositing you in the water instead.<br>
<br>
A more reliable method involves using the boat's seat - this forcibly positions you aboard, though in a seated position.<br>
<br>
Those who have invested in the safety ladder may activate it whilst the boat is stationary for the same reliable boarding as the seat.<br>
<br>
Choose your method based on circumstances and how wet you're willing to become!<br>
<br>
Interior Waterways<br>
<br>
Be especially cautious when navigating caves, grottos, and other enclosed spaces with water. The boat's water-level detection enchantments can become confused by the conflicting magical auras common to such places. Your vessel may behave erratically, believing itself to be on dry land whilst clearly afloat, or vice versa.<br>
<br>
A Final Word of Wisdom<br>
<br>
Should you encounter any behavior not described in this manual, remember that your boat is a complex marriage of carpentry and enchantment. Like any magical artifact, it may occasionally surprise even its creators. When in doubt, disembark, summon the vessel anew, and approach with patience and good humor.<br>
<hr>
<div align="center">Appendix: Advanced Enchantment Modifications<br>
<br>
<div align="left"><font face=5>The following section is intended only for those versed in the highest arts of maritime enchantment. Improper modification may result in unstable or dangerous vessel behavior.<br>
<br>
<font face=1>For those brave souls who would tune their vessel's enchantments, speak the ancient console invocation (`) and recite:<br>
<br>
ObvConsole set RYB.ENCHANTMENT to VALUE<br>
<br>
Movement Enchantments:<br>
BoatMaxVelocity (6) - Maximum speed attainable<br>
BaseRowForce (0.05) - Force applied when rowing<br>
BaseTurnRate (0.4) - Base turning speed<br>
TurnDeadzone (10) - Degrees before turning begins<br>
VelocityDecayLnRetentionFactor (-0.01005) - Speed depletion rate<br>
TurnRateAcceleration (0.15) - Turn start speed<br>
TurnRateDeceleration (0.92) - Turn stop speed<br>
<br>
Dragging Enchantments:<br>
DragRopeLength (250) - Distance before boat follows<br>
DragMaxVelocity (4.0) - Maximum dragging speed<br>
DragFriction (0.85) - Resistance when dragging<br>
DragZInterpolationRate (0.1) - Speed of height adjustment<br>
DragBaseTurnRate (0.1) - How quickly boat turns<br>
DragMaxTurnPerFrame (2.0) - Max speed of boat turns<br>
DragTurnDeadzone (5) - Degrees of diversion before boat turns<br>
DragLandPlayerZOffset (30) - Height of boat off ground<br>
DragTurnRateAcceleration (0.15) - Turn start speed<br>
DragTurnRateDeceleration (0.92) - Turn stop speed<br>
DragPathSlopeFactor (0.7) - Tilt angle sensitivity<br>
DragPathSlopeDeadzone (2) - Minimum slope of land to tilt<br>
DragMaxPitchAngle (45) - Maximum tilt angle on slopes<br>
DragPitchSmoothingFactor (0.15) - Smoothness of tilting<br>
DragPathMinDistance (50) - Distance to drag before adjusting tilt<br>
DragUphillZAdjustmentFactor (6) - Amount to lower boat dragging uphill<br>
DragDownhillZAdjustmentFactor (6) - Amount to raise boat dragging downhill<br>
<br>
Wave Simulation Enchantments:<br>
RockingEnabled (1) - Enable water motion effects<br>
RockAmplitudeZ (0.8) - Vertical rocking magnitude<br>
RockAmplitudePitch (2.0) - Forward/back tilt magnitude<br>
RockAmplitudeRoll (3.0) - Side-to-side tilt magnitude<br>
RockFrequency (30.0) - Primary rocking speed<br>
RockFrequency2 (30.0) - Secondary rocking speed<br>
RockFrequency3 (30.0) - Tertiary rocking (roll) speed<br>
RockWeatherFactor (0.5) - Weather influence multiplier<br>
RockSpeedFactor (0.25) - Boat speed influence multiplier<br>
RockDistanceThreshold (3000) - Distance from boat rocking ceases<br>
RockSmoothingFactor (0.1) - Smoothness of rocking<br>
<br>
Weight Distribution Enchantments:<br>
PlayerWeightEnabled (1) - Enable weight effects<br>
PlayerWeightPitchFactor (0.15) - Forward/back tilt from position<br>
PlayerWeightRollFactor (0.12) - Side tilt from position<br>
PlayerWeightSmoothingFactor (0.2) - How fast tilt changes<br>
PlayerWeightMaxDistanceForward (240) - Distance lengthwise effect applies<br>
PlayerWeightMaxDistanceSide (100) - Distance sideways effect applies<br>
PlayerWeightMaxDistanceVertical (60) - Distance upwards effect applies<br>
<br>
Collision Detection Enchantments:<br>
CollisionDetectDelay (2) - Delay before checking obstacles<br>
CollisionDetectZThreshold (10) - Height threshold for collision<br>
ColliderOffset (300) - Distance forward from center for detection<br>
ColliderOffsetReverse (350) - Distance backward from center for detection<br>
ColliderMoveFreq (0.05) - How often to move collider<br>
OverboardDistance (300) - Distance before "overboard" triggers<br>
<br>
Miscellaneous Enchantments:<br>
SummonDistance (350) - Distance boat appears when summoned<br>
LandZThreshold (10) - Height above water considered "on land"<br>
WaterLevelZ (0) - Base water level<br>
DeltaSmoothingFactor (0.1) - Sensitivity of frame rate compensation<br>
<br>
<font face=5>May fair winds and following seas guide your journeys across Cyrodiil's waters!<br>
<br>
Published by the Imperial Maritime Guild Third Edition, 3E 433<br>

223
Docs/ModDesc.txt Normal file
View File

@@ -0,0 +1,223 @@
[size=5][youtube]SE55cqIZNp4[/youtube]
Features[/size]
[b]🚣 Movement & Navigation[/b]
[list]
[*]Cast the [b]Row spell[/b] to propel forward (or backward while sneaking) at the cost of fatigue
[*]Intuitive steering - boat automatically turns towards where you looking
[*]Toggle "Lock Heading" to maintain course while you look around freely
[*]Auto-row modes for hands-free forward or backward travel
[*]Multiple boarding options ensure you can always get back on deck
[/list]
[b]🌊 Immersive Physics & Realism[/b]
[list]
[*]Dynamic collision detection prevents merging with terrain and obstacles
[*]Realistic wave simulation rocks the boat based on speed and weather conditions
[*]Player position affects boat balance and tilt
[*]Smooth, frame rate-independent movement ensures consistent performance
[/list]
[b]🗺️ Convenience Features[/b]
[list]
[*]Drag the boat overland between bodies of water and it will naturally rest on terrain
[*]Summon your boat from anywhere inside or outside Tamriel
[*]Automatic map marker tracks your boat's location once stationary
[*]Interactive menu system for all boat commands and options
[*]Functional seat for fishing or enjoying the view while anchored
[/list]
[b]🛠️ Purchasable Upgrades[/b]
[list]
[*][b]Storage Chest[/b]: Secure, non-respawning container hidden beneath the seat
[*][b]Lamp[/b]: Toggleable bow-mounted lamp (also toggleable with fire/frost spells)
[*][b]Rope Ladder[/b]: Auto-deploys when you fall overboard for easy re-boarding
[/list]
[b]📚 Documentation & Customization[/b]
[list]
[*]Comprehensive in-game manual written in lore-friendly style
[*]Appendix of console commands for fine-tuning boat behavior
[*]Adjust everything from rowing speed to wave intensity
[*]Full compatibility with both vanilla and modded environments
[/list]
[b]WARNING: this mod is a script-heavy mod. You may experience some performance impact, especially with a weak CPU. This mod is pushing the limits of the script engine. Ive spent a lot of time to reduce the performance impact and minimize script execution when the boat is not in use. I personally dont notice an FPS impact but your mileage may vary.[/b]
[size=5]Installation[/size]
[size=4]Requirements[/size]
[list]
[*][url=https://www.nexusmods.com/oblivionremastered/mods/32]UE4SS[/url]: hard requirement. Requirement of UE4SS TESSyncMapInjector.
[*][url=https://www.nexusmods.com/oblivionremastered/mods/1272]UE4SS TesSyncMapInjector[/url]: hard requirement. The rowboat wont show up in-game without this.
[*][url=https://www.nexusmods.com/oblivionremastered/mods/1966]MagicLoader 2[/url]: soft requirement. Fixes the map marker and row spell effect showing up as `<MISSING STRING TABLE ENTRY>`
[*][url=https://www.nexusmods.com/oblivionremastered/mods/282]OBSE64[/url]: soft requirement. Needed for [font=Courier New][NL][/font] tag remover. I may use OBSE64 functions in the future as they become available.
[*][url=https://www.nexusmods.com/oblivionremastered/mods/473]NL-Tag Remover[/url]: soft requirement. Gets rid of ugly [font=Courier New][NL][/font] prefixes on all the text added by this mod.
[*][url=https://www.nexusmods.com/oblivionremastered/mods/145]Baka Achievement Enabler[/url]: optionally recommended. If you plan on tweaking the boats behavior it requires use of the console which would disable achievements without this mod.
[/list]
Please double check that you have set up TesSyncMapInjector correctly before posting a bug.
[size=4]Install
[/size]
Easiest method should be installing using a mod manager like Vortex which should automatically install files in the correct location.
If you are installing manually:
[list]
[*]Extract the contents of the ZIP file to [font=Courier New]<game folder>/OblivionRemastered/Content/Dev/ObvData/Data/[/font]
[*]Ensure that [font=Courier New]RowYourBoat.ini[/font] exists in [font=Courier New]Data/SyncMap[/font]
[*]Ensure that [font=Courier New]RowYourBoat.json[/font] exists in [font=Courier New]Data/MagicLoader[/font]
[*]Ensure that [font=Courier New]RowYourBoat.esp[/font] exists in [font=Courier New]Data/[/font]
[*]Add [font=Courier New]RowYourBoat.esp[/font] to your [font=Courier New]plugins.txt[/font] (also in the Data folder)
[*]Run MagicLoader 2
[*]Start the game with MagicLoader 2 or OBSE
[/list]
[size=5]Usage[/size]
Youll find the new rowboat right behind the Imperial City Waterfront Shack for sale in the water with a for sale sign posted nearby.
The boat can be purchased from Sergius Verus at The Three Brothers Trade Goods in the Imperial City Market District for 500 gold. He also sells all three upgrades to the rowboat (Storage Chest, Lamp, and Rope Ladder) for 100 gold each.
Once the boat is purchased, activate the boat to learn the Row spell and open the boat menu.
To move the boat you can either select “Auto-row Forward”/“Auto-row Backward” in the boat menu or cast the Row spell while standing on the boat. The Row spell costs 5 fatigue but 0 magicka. Cast it while sneaking to row backwards. Hold down the cast key to continuously move the boat.
The boat will automatically turn towards the direction you are looking in first-person mode or the direction your character is facing in third-person mode. This can be enabled/disabled with the “Lock Heading”/”Unlock Heading” toggle in the boat menu.
The boat will automatically detect it is about to collide with land or obstacles and stop the boat. The collision detection waits for 2 seconds at the start of rowing to allow you to clear the boat from any obstacles before starting detection again.
At any time you can cast the Row spell to summon the boat to your location with two methods: “Summon Boat” which tries to obey terrain and chooses the best location in front of you to place the boat. “Place Boat Right Here” will do exactly that and place the boat right in front of you even if that is inside a hill or floating in-air. It may take a second or two for the boat to appear, especially if you are far away from the boat.
When the boat is not moving you can select the “Drag Boat” option in the boat menu to drag the boat along with you over land or water. You are pulling all 200 pounds of the boat so be prepared to be encumbered or ready those feather effects. If you would like to stop dragging the boat you can either: activate the boat and select “Stop Dragging", cast the Row spell near the boat and select “Stop Dragging”, drop the Rowboat from your inventory. While dropping the boat from your inventory works, you should try to avoid doing it too much since it creates new references in the game and may lead to save game bloat.
If purchased, the chest can be used to store loot as you travel by boat. It is marked non-respawning so should be safe to store items long-term.
If purchased, the lamp can be turned on and off by either: interacting with the lamp, choosing the “Toggle Lamp” option in the boat menu, or casting a fire or frost spell on the lamp.
If purchased, the rope ladder will deploy when the boat is moving in the water and you fall overboard. Interact with it to sit down on the seat on the boat. Start rowing again to hide the ladder.
The seat on the boat which is included by default will only be operable when the boat is not moving.
Theres an in-game manual for the boat. At the end there is an appendix with instructions on how to tweak the boat parameters and a list of all the editable parameters. I've copied that section below here for reference within this spoiler tag:
[spoiler]
Appendix: Advanced Enchantment Modifications[i]
The following section is intended only for those versed in the highest arts of maritime enchantment. Improper modification may result in unstable or dangerous vessel behavior.
[/i]
For those brave souls who would tune their vessel's enchantments, speak the ancient console invocation (`) and recite:
[code]ObvConsole set RYB.<ENCHANTMENT> to <VALUE>[/code]
[b]Movement Enchantments:[/b]
BoatMaxVelocity (6) - Maximum speed attainable
BaseRowForce (0.05) - Force applied when rowing
BaseTurnRate (0.4) - Base turning speed
TurnDeadzone (10) - Degrees before turning begins
VelocityDecayLnRetentionFactor (-0.01005) - Speed depletion rate
TurnRateAcceleration (0.15) - Turn start speed
TurnRateDeceleration (0.92) - Turn stop speed
[b]
Dragging Enchantments:[/b]
DragRopeLength (250) - Distance before boat follows
DragMaxVelocity (4.0) - Maximum dragging speed
DragFriction (0.85) - Resistance when dragging
DragZInterpolationRate (0.1) - Speed of height adjustment
DragBaseTurnRate (0.1) - How quickly boat turns
DragMaxTurnPerFrame (2.0) - Max speed of boat turns
DragTurnDeadzone (5) - Degrees of diversion before boat turns
DragLandPlayerZOffset (30) - Height of boat off ground
DragTurnRateAcceleration (0.15) - Turn start speed
DragTurnRateDeceleration (0.92) - Turn stop speed
DragPathSlopeFactor (0.7) - Tilt angle sensitivity
DragPathSlopeDeadzone (2) - Minimum slope of land to tilt
DragMaxPitchAngle (45) - Maximum tilt angle on slopes
DragPitchSmoothingFactor (0.15) - Smoothness of tilting
DragPathMinDistance (50) - Distance to drag before adjusting tilt
DragUphillZAdjustmentFactor (6) - Amount to lower boat dragging uphill
DragDownhillZAdjustmentFactor (6) - Amount to raise boat dragging downhill
[b]Wave Simulation Enchantments:[/b]
RockingEnabled (1) - Enable water motion effects
RockAmplitudeZ (0.8) - Vertical rocking magnitude
RockAmplitudePitch (2.0) - Forward/back tilt magnitude
RockAmplitudeRoll (3.0) - Side-to-side tilt magnitude
RockFrequency (30.0) - Primary rocking speed
RockFrequency2 (30.0) - Secondary rocking speed
RockFrequency3 (30.0) - Tertiary rocking (roll) speed
RockWeatherFactor (0.5) - Weather influence multiplier
RockSpeedFactor (0.25) - Boat speed influence multiplier
RockDistanceThreshold (3000) - Distance from boat rocking ceases
RockSmoothingFactor (0.1) - Smoothness of rocking
[b]Weight Distribution Enchantments:[/b]
PlayerWeightEnabled (1) - Enable weight effects
PlayerWeightPitchFactor (0.15) - Forward/back tilt from position
PlayerWeightRollFactor (0.12) - Side tilt from position
PlayerWeightSmoothingFactor (0.2) - How fast tilt changes
PlayerWeightMaxDistanceForward (240) - Distance lengthwise effect applies
PlayerWeightMaxDistanceSide (100) - Distance sideways effect applies
PlayerWeightMaxDistanceVertical (60) - Distance upwards effect applies
[b]Collision Detection Enchantments:[/b]
CollisionDetectDelay (2) - Delay before checking obstacles
CollisionDetectZThreshold (10) - Height threshold for collision
ColliderOffset (300) - Distance forward from center for detection
ColliderOffsetReverse (350) - Distance backward from center for detection
ColliderMoveFreq (0.05) - How often to move collider
OverboardDistance (300) - Distance before "overboard" triggers
[b]Miscellaneous Enchantments:[/b]
SummonDistance (350) - Distance boat appears when summoned
LandZThreshold (10) - Height above water considered "on land"
WaterLevelZ (0) - Base water level
DeltaSmoothingFactor (0.1) - Sensitivity of frame rate compensation
[i]May fair winds and following seas guide your journeys across Cyrodiil's waters![/i]
[line][i]Published by the Imperial Maritime Guild [/i][i]Third Edition, 3E 433[/i]
[/spoiler]
[size=5]Known Issues / FAQ[/size]
[list]
[*][b]The collision detection sometimes triggers when you are in clear open water.[/b] Sometimes this can happen much more frequently in some problem locations (beneath some bridges) or at very low frame rates. There isnt much I can do about this, so just try rowing again until you clear the area.
[*][b]The collision detection sometimes fails to trigger when it should.[/b] Particularly when rowing into cliff faces or objects in the water. Youll likely get pushed overboard if this happens which stops the boat. If the boat gets lost in terrain, you can use the Row spell to summon it back at your location.
[*][b]Theres sometimes a weird splashing sound and visual effect around the boat when it is moving.[/b] Thats just the tiny invisible vampire that is preventing you from losing your boat in the terrain, dont worry about it 😉
[*][b]The row spell as a “DO NOT USE - Darkness” effect in addition to the script effect and damage fatigue effect.[/b] This is purely there to remove the annoying spell cast sound and visual effect when you are continuously casting it. It doesnt actually do anything in the game.
[*][b]The boat is floating above/below the water in interiors.[/b] Theres currently no way to fix this since we cant query a cells water level from scripts. Hopefully well eventually have an OBSE64 function to do this.
[*][b]Sometimes the boat doesnt appear when summoned.[/b] I noticed there are a few problem locations where this can happen more frequently. If it does, try switching to summoning with the “Place Boat Right Here” option instead.
[*][b]The “Get On Boat” menu option sometimes places you outside the boat.[/b] This seems to be a bug/quirk with the game engine where it just decides to place the player slightly off of the position requested. If this ever happens, use the “Sit Down” option or activate the rope ladder if you have purchased it which doesnt have this problem.
[*][b]The seat on the boat doesnt work when the boat is moving.[/b] The seat is intentionally disabled while the boat is moving because the game engine doesnt allow moving a player that is seated.
[*][b]Followers fall off the boat.[/b] It seems like the game engine is better about keeping the player on the boat than other actors. Im looking into better solutions for this.
[/list]
[size=5]Compatibility[/size]
This mod should be fully compatible most mods. Let me know if you find a mod that isnt compatible. In the future, this may need patches with any mods that modify:
[list]
[*]The area behind the IC Waterfront Shack where the rowboat is placed
[*]Sergius Verus or The Three Brothers Trade Goods
[*]Any model replacers for the rowboat, lower-class chest, lower-class stool, ship lamp, or rope ladder.
[*]The Darkness Spell Effect thats unused in vanilla oblivion
[*]The VampireRace thats unused in vanilla oblivion
[/list]
This mod was designed specifically with the [url=https://www.nexusmods.com/oblivionremastered/mods/2118]Lived In - Imperial Waterfront mod[/url] in mind, so it is compatible with that.
[size=5]Recommended Complementary Mods[/size]
[list]
[*][url=https://www.nexusmods.com/oblivionremastered/mods/3978]Simply swim up[/url]: makes swimming around the boat easier
[*][url=https://www.nexusmods.com/oblivionremastered/mods/2118]Lived In - Imperial Waterfront[/url]: fully-compatible, adds a dock for the rowboat
[*][url=https://www.nexusmods.com/oblivionremastered/mods/1790]Eli's Waterfront Shack Overhaul[/url]: fully-compatible, spruces up the exterior of the shack
[/list]
[size=5]Credits[/size]
[list]
[*]Jason1, Grumblepunk, and Dark Monk for the original inspiration and basis for the scripts in this mod.
[*]Thank you to all the editors of [url=https://cs.uesp.net/wiki/Main_Page]The Elder Scrolls Construction Set Wiki[/url]. All the knowledge there was invaluable to this project.
[*]Thanks to everyone that made guides or answered my questions in the [url=https://discord.gg/5tRCpemR]ORMC discord[/url].
[*]Thanks to everyone on the old Bethesda forums and [url=https://tesalliance.org/forums/index.php]TES Alliance[/url] for originally helping me learn how to mod Oblivion and putting up with me when I was an annoying teenager all those years ago.
[/list]

21
LICENSE.md Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 Tyler Hallada
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,6 @@
{
"NewStrings": {
"LOC_FN_RYBBoatMapMarkerName": "My Rowboat",
"LOC_FN_RYBRowSpellEffectName": "Row Your Boat"
}
}

27
README.md Normal file
View File

@@ -0,0 +1,27 @@
# Row Your Boat
Source code and files for the [Row Your Boat Oblivion Remastered
mod](https://www.nexusmods.com/oblivionremastered/mods/4273).
## Scripts
For convienence of editing and viewing. All scripts contained within `RowYourBoat.esp` have been extracted out into the
`Scripts` and `ResultScripts` folders. `Scripts` are top-level scripts attached to Objects, Quests, or Spell Effects
within the plugin, while `ResultScripts` are short snippets attached to specific stages in the `RYB` quest. The main
script `RYBQuestScript.psc` got too long and had to be split up, so I put common functions, initialization, and isolated
blocks of code into [Stage Functions](https://cs.uesp.net/wiki/Category:Stage_Functions) on the `RYB` quest. These need
to be kept quite short since result scripts have a small max limit.
I use the `.psc` extension for better code highlighting, but these technically aren't Papyrus files since these are
OBScript files.
## ESP
I'm checking in any changes I make to the `.esp` plugin here, but it's a binary format not easily readable on git
hosting sites. I eventually would like to setup [Spriggit](https://github.com/Mutagen-Modding/Spriggit) for this.
## Other files
- `SyncMap`: config for [UE4SS TesSyncMapInjector](https://www.nexusmods.com/oblivionremastered/mods/1272)
- `MagicLoader`: config for [MagicLoader 2](https://www.nexusmods.com/oblivionremastered/mods/1966)
- `Docs`: source for in-game manual and the Nexus Mods mod description

View File

@@ -0,0 +1,25 @@
; RYB Stage 10 DragTargetAngle atan2
; atan2 approximation in radians from https://math.stackexchange.com/a/1105038
if (RYB.dXAbs >= RYB.dYAbs)
set RYB.a to RYB.dYAbs / RYB.dXAbs
else
set RYB.a to RYB.dXAbs / RYB.dYAbs
endif
set RYB.s to RYB.a * RYB.a
set RYB.r to ((-0.0464964749 * RYB.s + 0.15931422) * RYB.s - 0.327622764) * RYB.s * RYB.a + RYB.a
if (RYB.dYAbs > RYB.dXAbs)
set RYB.r to RYB.halfPi - RYB.r
endif
if (RYB.dX < 0)
set RYB.r to RYB.pi - RYB.r
endif
if (RYB.dY < 0)
set RYB.r to -RYB.r
endif
set RYB.DragTargetAngle to RYB.r * RYB.radToDeg ; radians→deg
; convert mathematical angle → Oblivion heading: heading = (90 angle) mod 360
set RYB.DragTargetAngle to 90.0 - RYB.DragTargetAngle
if (RYB.DragTargetAngle < 0)
set RYB.DragTargetAngle to RYB.DragTargetAngle + 360
endif

View File

@@ -0,0 +1,13 @@
; RYB Quest Stage 11 Update Boat Position and Angle
set RYB.BoatX to RYBBoatRef.GetPos x
set RYB.BoatY to RYBBoatRef.GetPos y
set RYB.BoatZ to RYBBoatRef.GetPos z
set RYB.BoatZ to RYB.BoatZ - RYB.RockZOffset ; remove rocking offset from last frame to get "true" Z
set RYB.BoatAngle to RYBBoatRef.GetAngle z
set RYB.BoatAngle to RYB.BoatAngle - 90
if (RYB.BoatAngle < 0)
set RYB.BoatAngle to RYB.BoatAngle + 360
elseif (RYB.BoatAngle >= 360)
set RYB.BoatAngle to RYB.BoatAngle - 360
endif

View File

@@ -0,0 +1,16 @@
; RYB Quest Stage 12 Boat Yaw Angle Trigonometry (sin/cos/tan approximation)
; Script originally by Galsiah.
; See: https://cs.uesp.net/wiki/Trigonometry_Functions#Galsiah_Version
set RYB.ang to (RYB.ang * RYB.degToRad)
set RYB.n to 1
if (RYB.ang > 4.7123)
set RYB.ang to (RYB.ang - 6.2832)
elseif (RYB.ang > 1.5708)
set RYB.ang to (RYB.ang - 3.1416)
set RYB.n to -1
endif
set RYB.t2 to (RYB.ang * RYB.ang)
set RYB.sin to RYB.n*(RYB.ang*(1 - RYB.t2*0.16605 + 0.00761*RYB.t2*RYB.t2))
set RYB.cos to RYB.n*(1 - RYB.t2*0.4967 + 0.03705*RYB.t2*RYB.t2)
set RYB.tan to (RYB.sin/RYB.cos)

View File

@@ -0,0 +1,16 @@
; RYB Quest Stage 13 Boat Pitch Angle Trigonometry (sin/cos approximation)
; Script originally by Galsiah.
; See: https://cs.uesp.net/wiki/Trigonometry_Functions#Galsiah_Version
set RYB.PitchRadians to RYB.BoatPitchAngle * RYB.degToRad
set RYB.rockAng to RYB.PitchRadians
set RYB.rockN to 1
if (RYB.rockAng > 4.7123)
set RYB.rockAng to (RYB.rockAng - 6.2832)
elseif (RYB.rockAng > 1.5708)
set RYB.rockAng to (RYB.rockAng - 3.1416)
set RYB.rockN to -1
endif
set RYB.rockT2 to (RYB.rockAng * RYB.rockAng)
set RYB.SinPitch to RYB.rockN * (RYB.rockAng * (1 - RYB.rockT2 * 0.16605 + 0.00761 * RYB.rockT2 * RYB.rockT2))
set RYB.CosPitch to RYB.rockN * (1 - RYB.rockT2 * 0.4967 + 0.03705 * RYB.rockT2 * RYB.rockT2)

View File

@@ -0,0 +1,16 @@
; RYB Quest Stage 14 Roll Pitch Angle Trigonometry (sin/cos approximation)
; Script originally by Galsiah.
; See: https://cs.uesp.net/wiki/Trigonometry_Functions#Galsiah_Version
set RYB.RollRadians to RYB.BoatRollAngle * RYB.degToRad
set RYB.rockAng to RYB.RollRadians
set RYB.rockN to 1
if (RYB.rockAng > 4.7123)
set RYB.rockAng to (RYB.rockAng - 6.2832)
elseif (RYB.rockAng > 1.5708)
set RYB.rockAng to (RYB.rockAng - 3.1416)
set RYB.rockN to -1
endif
set RYB.rockT2 to (RYB.rockAng * RYB.rockAng)
set RYB.SinRoll to RYB.rockN * (RYB.rockAng * (1 - RYB.rockT2 * 0.16605 + 0.00761 * RYB.rockT2 * RYB.rockT2))
set RYB.CosRoll to RYB.rockN * (1 - RYB.rockT2 * 0.4967 + 0.03705 * RYB.rockT2 * RYB.rockT2)

View File

@@ -0,0 +1,14 @@
; RYB Quest Stage 15 Rocking Phase 1 (Primary) Angle Trigonometry (sin/cos approximation)
; Script originally by Galsiah.
; See: https://cs.uesp.net/wiki/Trigonometry_Functions#Galsiah_Version
set RYB.rockAng to RYB.RockPhase * RYB.degToRad
set RYB.rockN to 1
if (RYB.rockAng > 4.7123)
set RYB.rockAng to (RYB.rockAng - 6.2832)
elseif (RYB.rockAng > 1.5708)
set RYB.rockAng to (RYB.rockAng - 3.1416)
set RYB.rockN to -1
endif
set RYB.rockT2 to (RYB.rockAng * RYB.rockAng)
set RYB.rockSin to RYB.rockN * (RYB.rockAng * (1 - RYB.rockT2 * 0.16605 + 0.00761 * RYB.rockT2 * RYB.rockT2))

View File

@@ -0,0 +1,14 @@
; RYB Quest Stage 16 Rocking Phase 2 (Secondary) Angle Trigonometry (sin/cos approximation)
; Script originally by Galsiah.
; See: https://cs.uesp.net/wiki/Trigonometry_Functions#Galsiah_Version
set RYB.rockAng to RYB.RockPhase2 * RYB.degToRad
set RYB.rockN to 1
if (RYB.rockAng > 4.7123)
set RYB.rockAng to (RYB.rockAng - 6.2832)
elseif (RYB.rockAng > 1.5708)
set RYB.rockAng to (RYB.rockAng - 3.1416)
set RYB.rockN to -1
endif
set RYB.rockT2 to (RYB.rockAng * RYB.rockAng)
set RYB.rockSin2 to RYB.rockN * (RYB.rockAng * (1 - RYB.rockT2 * 0.16605 + 0.00761 * RYB.rockT2 * RYB.rockT2))

View File

@@ -0,0 +1,15 @@
; RYB Quest Stage 17 Rocking Phase 3 (Roll) Angle Trigonometry (sin/cos approximation)
; Script originally by Galsiah.
; See: https://cs.uesp.net/wiki/Trigonometry_Functions#Galsiah_Version
set RYB.rockAng to RYB.RockPhase3 * RYB.degToRad
set RYB.rockN to 1
if (RYB.rockAng > 4.7123)
set RYB.rockAng to (RYB.rockAng - 6.2832)
elseif (RYB.rockAng > 1.5708)
set RYB.rockAng to (RYB.rockAng - 3.1416)
set RYB.rockN to -1
endif
set RYB.rockT2 to (RYB.rockAng * RYB.rockAng)
set RYB.rockSin3 to RYB.rockN * (RYB.rockAng * (1 - RYB.rockT2 * 0.16605 + 0.00761 * RYB.rockT2 * RYB.rockT2))
set RYB.rockCos3 to RYB.rockN * (1 - RYB.rockT2 * 0.4967 + 0.03705 * RYB.rockT2 * RYB.rockT2)

View File

@@ -0,0 +1,15 @@
; RYB Quest Stage 18 Player Yaw Angle Trigonometry (sin/cos approximation)
; Script originally by Galsiah.
; See: https://cs.uesp.net/wiki/Trigonometry_Functions#Galsiah_Version
set RYB.ang to (RYB.ang * RYB.degToRad)
set RYB.n to 1
if (RYB.ang > 4.7123)
set RYB.ang to (RYB.ang - 6.2832)
elseif (RYB.ang > 1.5708)
set RYB.ang to (RYB.ang - 3.1416)
set RYB.n to -1
endif
set RYB.t2 to (RYB.ang * RYB.ang)
set RYB.PlayerSin to RYB.n*(RYB.ang*(1 - RYB.t2*0.16605 + 0.00761*RYB.t2*RYB.t2))
set RYB.PlayerCos to RYB.n*(1 - RYB.t2*0.4967 + 0.03705*RYB.t2*RYB.t2)

View File

@@ -0,0 +1,23 @@
; RYB Stage 1 Initialize Constants
set RYB.ModVersion to 0.1
set RYB.pi to 3.1415927
set RYB.halfPi to RYB.pi / 2
set RYB.radToDeg to 180.0/RYB.pi ; always multiply to convert
set RYB.degToRad to 1/RYB.radToDeg
set RYB.TargetDeltaTime to 0.0166
set RYB.DeltaSmoothingFactor to 0.1
set RYB.BoatMaxVelocity to 6.0
set RYB.VelocityDecayLnRetentionFactor to -0.01005 ; approx. natural log of the retention factor of 0.99
set RYB.BaseTurnRate to 0.4
set RYB.BaseRowForce to 0.05
set RYB.TurnDeadzone to 10
set RYB.RowSpellDuration to 1.5
set RYB.OverboardDistance to 300
set RYB.TurnRateAcceleration to 0.15
set RYB.TurnRateDeceleration to 0.92
set RYB.LandZThreshold to 10
set RYB.WaterLevelZ to 0
set RYB.HighUpdateRate to 0.0166
set RYB.MediumUpdateRate to 0.1
set RYB.LowUpdateRate to 0.5

View File

@@ -0,0 +1,15 @@
; RYB Stage 20 Enable and Position Collider
RYBColliderRef.Enable
RYBColliderRef.SetActorAlpha 0.0
RYBColliderRef.SetActorRefraction 10.0
RYBColliderRef.AddSpell MG14JskarInvis
RYBColliderRef.SetActorValue Aggression 0
RYBColliderRef.SetActorValue Blindness 100
RYBColliderRef.ModActorValue Sneak 0
RYBColliderRef.SetActorsAI 0
RYBColliderRef.MoveTo Player
RYBColliderRef.SetPos x, RYB.ColliderX
RYBColliderRef.SetPos y, RYB.ColliderY
RYBColliderRef.SetPos z, 0
RYBColliderRef.SetDestroyed 1

View File

@@ -0,0 +1,18 @@
; RYB Stage 21 Collider Collision
set RYB.BaseBoatVelocity to 0
set RYB.CurrentTurnRate to 0
set RYB.BoatMoving to 0
set RYB.AutoRowing to 0
set RYB.Rowing to 0
RYBColliderRef.Disable
RYBSeatRef.SetDestroyed 0
RYBBoatMapMarker.Enable
set RYB.CollisionDetectTimer to RYB.CollisionDetectDelay
if (RYB.BaseBoatVelocity > (RYB.BoatMaxVelocity * 0.9) || RYB.BaseBoatVelocity < -(RYB.BoatMaxVelocity * 0.9))
RYBBoatRef.PlaySound3D TRPImpactStone
else
RYBBoatRef.PlaySound3D TRPMineExplode
endif
set RYB.Grounded to 1
Message "The boat has grounded."

View File

@@ -0,0 +1,19 @@
; RYB Stage 2 Initialize References
set RYB.BoatRef to RYBBoatRef
set RYB.Seat to RYBSeatRef
set RYB.SeatForwardOffset to -187
set RYB.SeatZOffset to 21
set RYB.Chest to RYBChestRef
set RYB.ChestForwardOffset to -184
set RYB.ChestZOffset to 14
set RYB.ChestAngleOffset to -180
set RYB.BoatMarker to RYBBoatMapMarker
set RYB.BoatMarkerZOffset to 20
set RYB.Ladder to RYBLadderRef
set RYB.LadderZOffset to -28
set RYB.LadderForwardOffset to -213
set RYB.LampLit to RYBLampOnRef
set RYB.LampUnlit to RYBLampOffRef
set RYB.LampForwardOffset to 183
set RYB.LampZOffset to 86

View File

@@ -0,0 +1,20 @@
; RYB Stage 30 Seat Position Calculation
; yaw
set RYB.TempX to RYB.SeatSideOffset * RYB.cos + RYB.SeatForwardOffset * RYB.sin
set RYB.TempY to RYB.SeatForwardOffset * RYB.cos - RYB.SeatSideOffset * RYB.sin
set RYB.TempZ to RYB.SeatZOffset
; roll
set RYB.OrigX to RYB.TempX
set RYB.OrigZ to RYB.TempZ
set RYB.TempX to RYB.OrigX * RYB.CosRoll - RYB.OrigZ * RYB.SinRoll
set RYB.TempZ to RYB.OrigX * RYB.SinRoll + RYB.OrigZ * RYB.CosRoll
; pitch
set RYB.OrigY to RYB.TempY
set RYB.OrigZ to RYB.TempZ
set RYB.TempY to RYB.OrigY * RYB.CosPitch + RYB.OrigZ * RYB.SinPitch
set RYB.TempZ to -RYB.OrigY * RYB.SinPitch + RYB.OrigZ * RYB.CosPitch
; to world coords
set RYB.SeatX to RYB.BoatX + RYB.TempX
set RYB.SeatY to RYB.BoatY + RYB.TempY
set RYB.SeatZ to RYB.BoatZ + RYB.TempZ + RYB.RockZOffset

View File

@@ -0,0 +1,26 @@
; RYB Stage 31 Chest Position Calculation
; yaw
set RYB.TempX to RYB.ChestSideOffset * RYB.cos + RYB.ChestForwardOffset * RYB.sin
set RYB.TempY to RYB.ChestForwardOffset * RYB.cos - RYB.ChestSideOffset * RYB.sin
set RYB.TempZ to RYB.ChestZOffset
; roll
set RYB.OrigX to RYB.TempX
set RYB.OrigZ to RYB.TempZ
set RYB.TempX to RYB.OrigX * RYB.CosRoll - RYB.OrigZ * RYB.SinRoll
set RYB.TempZ to RYB.OrigX * RYB.SinRoll + RYB.OrigZ * RYB.CosRoll
; pitch
set RYB.OrigY to RYB.TempY
set RYB.OrigZ to RYB.TempZ
set RYB.TempY to RYB.OrigY * RYB.CosPitch + RYB.OrigZ * RYB.SinPitch
set RYB.TempZ to -RYB.OrigY * RYB.SinPitch + RYB.OrigZ * RYB.CosPitch
; to world coords
set RYB.ChestX to RYB.BoatX + RYB.TempX
set RYB.ChestY to RYB.BoatY + RYB.TempY
set RYB.ChestZ to RYB.BoatZ + RYB.TempZ + RYB.RockZOffset
set RYB.ChestAngle to RYB.BoatAngle - RYB.ChestAngleOffset
if (RYB.ChestAngle < 0)
set RYB.ChestAngle to RYB.ChestAngle + 360
elseif (RYB.ChestAngle >= 360)
set RYB.ChestAngle to RYB.ChestAngle - 360
endif

View File

@@ -0,0 +1,20 @@
; RYB Stage 32 Lamp Position Calculation
; yaw
set RYB.TempX to RYB.LampSideOffset * RYB.cos + RYB.LampForwardOffset * RYB.sin
set RYB.TempY to RYB.LampForwardOffset * RYB.cos - RYB.LampSideOffset * RYB.sin
set RYB.TempZ to RYB.LampZOffset
; roll
set RYB.OrigX to RYB.TempX
set RYB.OrigZ to RYB.TempZ
set RYB.TempX to RYB.OrigX * RYB.CosRoll - RYB.OrigZ * RYB.SinRoll
set RYB.TempZ to RYB.OrigX * RYB.SinRoll + RYB.OrigZ * RYB.CosRoll
; pitch
set RYB.OrigY to RYB.TempY
set RYB.OrigZ to RYB.TempZ
set RYB.TempY to RYB.OrigY * RYB.CosPitch + RYB.OrigZ * RYB.SinPitch
set RYB.TempZ to -RYB.OrigY * RYB.SinPitch + RYB.OrigZ * RYB.CosPitch
; to world coords
set RYB.LampX to RYB.BoatX + RYB.TempX
set RYB.LampY to RYB.BoatY + RYB.TempY
set RYB.LampZ to RYB.BoatZ + RYB.TempZ + RYB.RockZOffset

View File

@@ -0,0 +1,20 @@
; RYB Stage 33 Ladder Position Calculation
; yaw
set RYB.TempX to RYB.LadderSideOffset * RYB.cos + RYB.LadderForwardOffset * RYB.sin
set RYB.TempY to RYB.LadderForwardOffset * RYB.cos - RYB.LadderSideOffset * RYB.sin
set RYB.TempZ to RYB.LadderZOffset
; roll
set RYB.OrigX to RYB.TempX
set RYB.OrigZ to RYB.TempZ
set RYB.TempX to RYB.OrigX * RYB.CosRoll - RYB.OrigZ * RYB.SinRoll
set RYB.TempZ to RYB.OrigX * RYB.SinRoll + RYB.OrigZ * RYB.CosRoll
; pitch
set RYB.OrigY to RYB.TempY
set RYB.OrigZ to RYB.TempZ
set RYB.TempY to RYB.OrigY * RYB.CosPitch + RYB.OrigZ * RYB.SinPitch
set RYB.TempZ to -RYB.OrigY * RYB.SinPitch + RYB.OrigZ * RYB.CosPitch
; to world coords
set RYB.LadderX to RYB.BoatX + RYB.TempX
set RYB.LadderY to RYB.BoatY + RYB.TempY
set RYB.LadderZ to RYB.BoatZ + RYB.TempZ + RYB.RockZOffset

View File

@@ -0,0 +1,17 @@
; RYB Stage 3 Initialize Collider
set RYB.Collider to RYBColliderRef
set RYB.ColliderOffset to 300
set RYB.ColliderOffsetReverse to 350
set RYB.ColliderMoveFreq to 0.05
set RYB.ColliderZ to 1
RYBColliderRef.SetActorAlpha 0.0
RYBColliderRef.SetActorRefraction 10.0
RYBColliderRef.AddSpell MG14JskarInvis
RYBColliderRef.SetActorValue Aggression 0
RYBColliderRef.SetActorValue Blindness 100
RYBColliderRef.ModActorValue Sneak 0
RYBColliderRef.SetActorsAI 0
RYBColliderRef.SetDestroyed 1
set RYB.CollisionDetectDelay to 2
set RYB.CollisionDetectZThreshold to 10

View File

@@ -0,0 +1,13 @@
; RYB Stage 40 Seat Position Execution
if (RYB.Resetting == 2)
RYBSeatRef.MoveTo RYBBoatRef
else
RYBSeatRef.MoveTo Player
endif
RYBSeatRef.SetPos x, RYB.SeatX
RYBSeatRef.SetPos y, RYB.SeatY
RYBSeatRef.SetPos z, RYB.SeatZ
RYBSeatRef.SetAngle z, RYB.BoatAngle
RYBSeatRef.SetAngle x, RYB.BoatPitchAngle
RYBSeatRef.SetAngle y, RYB.BoatRollAngle

View File

@@ -0,0 +1,13 @@
; RYB Stage 41 Chest Position Execution
if (RYB.Resetting == 2)
RYBChestRef.MoveTo RYBBoatRef
else
RYBChestRef.MoveTo Player
endif
RYBChestRef.SetPos x, RYB.ChestX
RYBChestRef.SetPos y, RYB.ChestY
RYBChestRef.SetPos z, RYB.ChestZ
RYBChestRef.SetAngle z, RYB.ChestAngle
RYBChestRef.SetAngle x, RYB.BoatPitchAngle
RYBChestRef.SetAngle y, RYB.BoatRollAngle

View File

@@ -0,0 +1,26 @@
; RYB Stage 42 Lamp Position Execution
if (RYB.Resetting == 2)
RYBLampOffRef.MoveTo RYBBoatRef
else
RYBLampOffRef.MoveTo Player
endif
RYBLampOffRef.SetPos x, RYB.LampX
RYBLampOffRef.SetPos y, RYB.LampY
RYBLampOffRef.SetPos z, RYB.LampZ
RYBLampOffRef.SetAngle z, RYB.BoatAngle
RYBLampOffRef.SetAngle x, RYB.BoatPitchAngle
RYBLampOffRef.SetAngle y, RYB.BoatRollAngle
if (RYB.LampOn == 1)
if (RYB.Resetting == 2)
RYBLampOnRef.MoveTo RYBBoatRef
else
RYBLampOnRef.MoveTo Player
endif
RYBLampOnRef.SetPos x, RYB.LampX
RYBLampOnRef.SetPos y, RYB.LampY
RYBLampOnRef.SetPos z, RYB.LampZ
RYBLampOnRef.SetAngle z, RYB.BoatAngle
RYBLampOnRef.SetAngle x, RYB.BoatPitchAngle
RYBLampOnRef.SetAngle y, RYB.BoatRollAngle
endif

View File

@@ -0,0 +1,13 @@
; RYB Stage 43 Ladder Position Execution
if (RYB.Resetting == 2)
RYBLadderRef.MoveTo RYBBoatRef
else
RYBLadderRef.MoveTo Player
endif
RYBLadderRef.SetPos x, RYB.LadderX
RYBLadderRef.SetPos y, RYB.LadderY
RYBLadderRef.SetPos z, RYB.LadderZ
RYBLadderRef.SetAngle z, RYB.BoatAngle
RYBLadderRef.SetAngle x, RYB.BoatPitchAngle
RYBLadderRef.SetAngle y, RYB.BoatRollAngle

View File

@@ -0,0 +1,4 @@
; RYB Stage 4 Initialize Summoning
set RYB.SummonDistance to 400
set RYB.SummonTimerDelay to 0.5

View File

@@ -0,0 +1,25 @@
; RYB Stage 5 Initialize Dragging
set RYB.DragRopeLength to 250
set RYB.DragFriction to 0.85
set RYB.DragBaseTurnRate to 0.1
set RYB.DragPullStrength to 0.005
set RYB.DragMaxForce to 0.5
set RYB.DragMaxVelocity to 4.0
set RYB.DragZInterpolationRate to 0.1
set RYB.DragMaxTurnPerFrame to 1.0
set RYB.DragTurnDeadzone to 5
set RYB.DragLandPlayerZOffset to 30
set RYB.DragMaxZPerFrame to 2.0
set RYB.DragMaxPlayerDistance to RYB.OverboardDistance * 6
set RYB.DragTurnRateAcceleration to 0.15
set RYB.DragTurnRateDeceleration to 0.92
set RYB.DragMaxPitchAngle to 45
set RYB.DragPitchSmoothingFactor to 0.03
set RYB.DragPathMinDistance to 50
set RYB.DragPathSlopeFactor to 0.7
set RYB.DragPathSlopeDeadzone to 2
set RYB.DragTargetPitchMovingSmoothingFactor to 0.03
set RYB.DragTargetPitchStoppedSmoothingFactor to 0.02
set RYB.DragUphillZAdjustmentFactor to 6
set RYB.DragDownhillZAdjustmentFactor to 4.5

View File

@@ -0,0 +1,19 @@
; RYB Stage 6 Initialize Rocking
set RYB.RockingEnabled to 1
set RYB.RockAmplitudeZ to 0.8
set RYB.RockMaxAbsoluteZ to 3.0
set RYB.RockAmplitudePitch to 2.0
set RYB.RockAmplitudeRoll to 3.0
set RYB.RockFrequency to 30.0
set RYB.RockFrequency2 to 45.0
set RYB.RockFrequency3 to 25.0
set RYB.RockRandomInterval to 3.0
set RYB.RockSpeedFactor to 0.25
set RYB.RockDistanceThreshold to 3000
set RYB.RockSmoothingFactor to 0.1
set RYB.RockWeatherFactor to 0.5
set RYB.RockPhase to GetRandomPercent * 3.6
set RYB.RockPhase2 to GetRandomPercent * 3.6
set RYB.RockPhase3 to GetRandomPercent * 3.6
set RYB.RockRandomPhase to (GetRandomPercent - 50) * 0.02

View File

@@ -0,0 +1,9 @@
; RYB Stage 7 Initialize Player Weight
set RYB.PlayerWeightEnabled to 1
set RYB.PlayerWeightMaxDistanceForward to 240
set RYB.PlayerWeightMaxDistanceSide to 100
set RYB.PlayerWeightMaxDistanceVertical to 60
set RYB.PlayerWeightPitchFactor to 0.07 ; How much forward/back position affects pitch
set RYB.PlayerWeightRollFactor to 0.13 ; How much left/right position affects roll
set RYB.PlayerWeightSmoothingFactor to 0.2 ; How quickly the effect changes

BIN
RowYourBoat.esp Normal file

Binary file not shown.

View File

@@ -0,0 +1,14 @@
ScriptName RYBBoatReceiptScript
short DoOnce
begin OnAdd
if (DoOnce == 0)
SetItemValue 0
set RYB.BoatPurchased to 1
RYBForSaleSignRef.Disable
RYBBoatMapMarker.Enable
ShowMap RYBBoatMapMarker 1
set DoOnce to 1
endif
end

View File

@@ -0,0 +1,9 @@
ScriptName RYBBoatScript
begin OnActivate
if (RYB.BoatPurchased == 0)
MessageBox "There's a note attached to the rowboat that reads: 'Contact Sergius Verus at the Three Brothers Trade Goods in the Market District to purchase this boat.'" "Ok"
else
set RYBMenu.BoatActivated to 1
endif
end

View File

@@ -0,0 +1,13 @@
ScriptName RYBBoatTokenScript
begin OnDrop Player
Disable
PositionCell 0, 0, 0, 0, RYBCell
ResetInterior RYBCell ; don't think this deletes the reference but I have no other way to do it
set RYB.TriggerStopDragging to 1
end
begin OnSell Player
MessageBox "Gasp! How could you sell me? I thought we were friends!"
set RYB.TriggerStopDragging to 1
end

View File

@@ -0,0 +1,13 @@
ScriptName RYBChestReceiptScript
short DoOnce
begin OnAdd
if (DoOnce == 0)
SetItemValue 0
set RYB.ChestPurchased to 1
RYBChestRef.Enable
set RYB.Resetting to 2 ; trigger one-time boat position reset to make sure the chest is placed on the boat
set DoOnce to 1
endif
end

View File

@@ -0,0 +1,12 @@
ScriptName RYBLadderReceiptScript
short DoOnce
begin OnAdd
if (DoOnce == 0)
SetItemValue 0
set RYB.LadderPurchased to 1
set RYB.Resetting to 2 ; trigger one-time boat position reset to make sure the ladder is placed on the boat
set DoOnce to 1
endif
end

View File

@@ -0,0 +1,5 @@
ScriptName RYBLadderScript
begin OnActivate
set RYB.TriggerGetOnBoat to 2
end

View File

@@ -0,0 +1,13 @@
ScriptName RYBLampReceiptScript
short DoOnce
begin OnAdd
if (DoOnce == 0)
SetItemValue 0
set RYB.LampPurchased to 1
RYBLampOffRef.Enable
set RYB.Resetting to 2 ; trigger one-time boat position reset to make sure the lamp is placed on the boat
set DoOnce to 1
endif
end

17
Scripts/RYBLampScript.psc Normal file
View File

@@ -0,0 +1,17 @@
ScriptName RYBLampScript
begin OnActivate
if (RYB.LampOn == 0)
set RYB.LampOn to 1
else
set RYB.LampOn to 0
endif
end
begin OnMagicEffectHit FIDG
set RYB.LampOn to 1
end
begin OnMagicEffectHit FRDG
set RYB.LampOn to 0
end

235
Scripts/RYBMenuScript.psc Normal file
View File

@@ -0,0 +1,235 @@
ScriptName RYBMenuScript
float fQuestDelayTime ; controls script processing rate, see: https://cs.uesp.net/wiki/FQuestDelayTime
; Quest script states
short Initializing
; MessageBox states
short Choice
short ChoosingInit
short ChoosingEnroute
short ChoosingSummon
short ChoosingDrag
short ChoosingOnLand
short ChoosingSettings
short SettingDragMaxPitchAngle
short SettingDragPitchSmoothingFactor
; Triggers
short BoatActivated ; player activating the boat will set this to 1 and this script will handle it
; set after RYB handles player casting the row spell
; 3 to show not on boat messagebox, 4 = show dragging messagebox, 5 = show on land messagebox
short TriggerRowCast
begin GameMode
if (Initializing == 0)
Set Initializing to 1
set fQuestDelayTime to RYB.LowUpdateRate
endif
if (RYB.BoatPurchased == 0)
set fQuestDelayTime to RYB.MediumUpdateRate ; for faster menu responsiveness
endif
if (BoatActivated == 1)
set BoatActivated to 0
Player.AddSpell RYBRowSpell
if (RYB.BoatMoving >= 1)
set ChoosingEnroute to 1
if (RYB.AutoRowing == 0 && RYB.LockHeading == 0)
MessageBox "Boat is in motion.", "Auto-row Forward", "Auto-row Backward", "Lock Heading", "Toggle Lamp", "Cancel"
elseif (RYB.AutoRowing == 0 && RYB.LockHeading == 1)
MessageBox "Boat is in motion with heading locked.", "Auto-row Forward", "Auto-row Backward", "Unlock Heading", "Toggle Lamp", "Cancel"
elseif (RYB.AutoRowing == 1 && RYB.LockHeading == 0)
MessageBox "Auto-rowing forwards", "Stop Auto-rowing", "Auto-row Backward", "Lock Heading", "Toggle Lamp", "Cancel"
elseif (RYB.AutoRowing == 1 && RYB.LockHeading == 1)
MessageBox "Auto-rowing forwards with heading locked", "Stop Auto-rowing", "Auto-row Forward", "Unlock Heading", "Toggle Lamp", "Cancel"
elseif (RYB.AutoRowing == 2 && RYB.LockHeading == 0)
MessageBox "Auto-rowing backwards", "Stop Auto-rowing", "Auto-row Forward", "Lock Heading", "Toggle Lamp", "Cancel"
elseif (RYB.AutoRowing == 2 && RYB.LockHeading == 1)
MessageBox "Auto-rowing backwards with heading locked", "Stop Auto-rowing", "Auto-row Forward", "Unlock Heading", "Toggle Lamp", "Cancel"
endif
set Choice to GetButtonPressed
elseif (RYB.Dragging >= 1)
set ChoosingDrag to 1
MessageBox "Boat is being dragged.", "Stop Dragging", "Cancel"
set Choice to GetButtonPressed
elseif (RYB.OnLand == 0)
set ChoosingInit to 1
MessageBox "Cast Row spell or start auto rowing to start moving.", "Auto-row Forward", "Auto-row Backward", "Get On Boat", "Sit Down", "Toggle Lamp", "Drag Boat", "Settings", "Read Manual", "Cancel"
set Choice to GetButtonPressed
else
set ChoosingOnLand to 1
MessageBox "Boat is on land. Drag it into the water?", "Drag Boat", "Get On Boat", "Sit Down", "Toggle Lamp", "Settings", "Read Manual", "Cancel"
set Choice to GetButtonPressed
endif
endif
if (ChoosingInit == 1)
set Choice to GetButtonPressed
if (Choice == 0)
set ChoosingInit to 0
set RYB.TriggerAutoRow to 1
elseif (Choice == 1)
set ChoosingInit to 0
set RYB.TriggerAutoRow to 2
elseif (Choice == 2)
set ChoosingInit to 0
set RYB.TriggerGetOnBoat to 1
elseif (Choice == 3)
set ChoosingInit to 0
set RYB.TriggerGetOnBoat to 2
elseif (Choice == 4)
set ChoosingInit to 0
if (RYB.LampOn == 0)
set RYB.LampOn to 1
else
set RYB.LampOn to 0
endif
elseif (Choice == 5)
set ChoosingInit to 0
set RYB.TriggerStartDragging to 1
elseif (Choice == 6)
set ChoosingInit to 0
set ChoosingSettings to 1
MessageBox "Settings", "Toggle Rocking", "Toggle Player Weight", "Cancel"
set Choice to GetButtonPressed
elseif (Choice == 7)
set ChoosingInit to 0
RYBManualRef.Activate Player
elseif (Choice == 8)
set ChoosingInit to 0
endif
endif
if (ChoosingEnroute == 1)
set Choice to GetButtonPressed
if (Choice == 0)
set ChoosingEnroute to 0
if (RYB.AutoRowing == 0)
set RYB.AutoRowing to 1
else
set RYB.AutoRowing to 0
endif
elseif (Choice == 1)
set ChoosingEnroute to 0
if (RYB.AutoRowing == 1)
set RYB.AutoRowing to 2
elseif (RYB.AutoRowing == 2)
set RYB.AutoRowing to 1
endif
elseif (Choice == 2)
set ChoosingEnroute to 0
if (RYB.LockHeading == 0)
set RYB.LockHeading to 1
Message "Boat will maintain present heading."
else
set RYB.LockHeading to 0
Message "Boat can now turn."
endif
elseif (Choice == 3)
set ChoosingEnroute to 0
if (RYB.LampOn == 0)
set RYB.LampOn to 1
else
set RYB.LampOn to 0
endif
elseif (Choice == 4)
set ChoosingEnroute to 0
endif
endif
if (ChoosingSummon == 1)
set Choice to GetButtonPressed
if (Choice == 0)
set ChoosingSummon to 0
set RYB.TriggerSummonBoat to 1
elseif (Choice == 1)
set ChoosingSummon to 0
set RYB.TriggerSummonBoat to 2
elseif (Choice == 2)
set ChoosingSummon to 0
endif
endif
if (ChoosingDrag == 1)
set Choice to GetButtonPressed
if (Choice == 0)
set ChoosingDrag to 0
set RYB.TriggerStopDragging to 1
Message "You stop dragging the boat."
elseif (Choice == 1)
set ChoosingDrag to 0
endif
endif
if (ChoosingOnLand == 1)
set Choice to GetButtonPressed
if (Choice == 0)
set ChoosingOnLand to 0
set RYB.TriggerStartDragging to 1
elseif (Choice == 1)
set ChoosingOnLand to 0
set RYB.TriggerGetOnBoat to 1
elseif (Choice == 2)
set ChoosingOnLand to 0
set RYB.TriggerGetOnBoat to 2
elseif (Choice == 3)
set ChoosingOnLand to 0
if (RYB.LampOn == 0)
set RYB.LampOn to 1
else
set RYB.LampOn to 0
endif
elseif (Choice == 4)
set ChoosingOnLand to 0
set ChoosingSettings to 1
MessageBox "Settings", "Toggle Rocking", "Toggle Player Weight", "Cancel"
set Choice to GetButtonPressed
elseif (Choice == 5)
set ChoosingOnLand to 0
RYBManualRef.Activate Player
elseif (Choice == 6)
set ChoosingOnLand to 0
endif
endif
if (TriggerRowCast == 3)
set TriggerRowCast to 0
MessageBox "You're not on the boat." "Summon Boat" "Place Boat Right Here" "Cancel"
set Choice to GetButtonPressed
set ChoosingSummon to 1
elseif (TriggerRowCast == 4)
set TriggerRowCast to 0
set ChoosingDrag to 1
MessageBox "Boat is being dragged.", "Stop Dragging", "Cancel"
set Choice to GetButtonPressed
elseif (TriggerRowCast == 5)
set TriggerRowCast to 0
set ChoosingOnLand to 1
MessageBox "Boat is on land. Drag it into the water?", "Drag Boat", "Get On Boat", "Sit Down", "Toggle Lamp", "Settings", "Cancel"
set Choice to GetButtonPressed
endif
if (ChoosingSettings == 1)
set Choice to GetButtonPressed
if (Choice == 0)
set ChoosingSettings to 0
if (RYB.RockingEnabled == 0)
set RYB.RockingEnabled to 1
else
set RYB.RockingEnabled to 0
endif
elseif (Choice == 1)
set ChoosingSettings to 0
if (RYB.PlayerWeightEnabled == 0)
set RYB.PlayerWeightEnabled to 1
else
set RYB.PlayerWeightEnabled to 0
endif
elseif (Choice == 2)
set ChoosingSettings to 0
endif
endif
end

1300
Scripts/RYBQuestScript.psc Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
ScriptName RYBRowSpellScript
begin ScriptEffectStart
if (Player.IsSneaking)
set RYB.TriggerRowCast to 2
else
set RYB.TriggerRowCast to 1
endif
end

16
SyncMap/RowYourBoat.ini Normal file
View File

@@ -0,0 +1,16 @@
[Meshes]
000ed3=/Game/Forms/worldobjects/activator/MS08Rowboat.MS08Rowboat
0030fb=/Game/Forms/magic/spell/StandardShockDamageTouch1Novice.StandardShockDamageTouch1Novice
003eeb=/Game/Forms/actors/npc/TESTMarauder.TESTMarauder
005450=/Game/Forms/worldobjects/container/PCChestClutterLower01.PCChestClutterLower01
005b3a=/Game/Forms/worldobjects/activator/ShipLamp01.ShipLamp01
006920=/Game/Forms/worldobjects/door/RopeLadder01.RopeLadder01
00692b=/Game/Forms/worldobjects/activator/MS08Rowboat.MS08Rowboat
007dbd=/Game/Forms/worldobjects/light/ShipLamp300.ShipLamp300
008497=/Game/Forms/worldobjects/container/PCChestClutterLower01.PCChestClutterLower01
008493=/Game/Forms/items/book/HouseICStorageAreaReceipt.HouseICStorageAreaReceipt
008494=/Game/Forms/items/book/HouseICStorageAreaReceipt.HouseICStorageAreaReceipt
008495=/Game/Forms/items/book/HouseICStorageAreaReceipt.HouseICStorageAreaReceipt
008496=/Game/Forms/items/book/HouseICStorageAreaReceipt.HouseICStorageAreaReceipt
008b70=/Game/Forms/items/book/Book2CommonManualArmor.Book2CommonManualArmor
008b72=/Game/Forms/items/book/Book2CommonManualArmor.Book2CommonManualArmor