mirror of
https://github.com/xivapi/ffxiv-datamining.git
synced 2026-07-24 02:49:10 +00:00
96 lines
3.4 KiB
Markdown
96 lines
3.4 KiB
Markdown
|
|
# Workshop Exploratory Ventures
|
|||
|
|
|
|||
|
|
Both airships and submarines use essentially the same formulae, with slightly different coefficients.
|
|||
|
|
There are two main segments: the duration to destination, and the duration of survey, which gives you the trip total.
|
|||
|
|
While these functions are newly discovered, they haven't changed since 4.0 at the latest.
|
|||
|
|
|
|||
|
|
The way venture duration functions work is somewhat awkward, but effectively it’s a 12 hour baseline with survey duration and travel duration added to it.
|
|||
|
|
These are themselves based on a distance calculation relative to the map.
|
|||
|
|
Survey time is static, but travel time is separate for airships and submarines.
|
|||
|
|
Exploration is a placeholder, the action sheets are AirshipExploration and SubmarineExploration respectively.
|
|||
|
|
Note that the survey duration field is in minutes, not seconds, hence the multiplication by 60.
|
|||
|
|
Speed in this case is the speed stat of your ship.
|
|||
|
|
|
|||
|
|
### General functions
|
|||
|
|
|
|||
|
|
`var surveyTime = 60 × floor(7000 × Exploration.SurveyDuration<min> / Speed × 100)`
|
|||
|
|
`var voyageDuration = 12 * 60 * 60 + voyageTime + surveyTime`
|
|||
|
|
|
|||
|
|
### Airships
|
|||
|
|
|
|||
|
|
Start node is row 127
|
|||
|
|
`var voyageSpan = round(sqrt((cur.x - next.x)^2 + (cur.y - next.y)^2))`
|
|||
|
|
`var voyageTime = 60 * floor(7000 * floor(855 * voyageSpan / 1000) / floor(100 * Speed))`
|
|||
|
|
`var voyageDistance = floor(52 * voyageSpan / 1000)`
|
|||
|
|
|
|||
|
|
### Submarines
|
|||
|
|
|
|||
|
|
Start node is the first row of the map
|
|||
|
|
`var voyageSpan = sqrt((cur.x - next.x)^2 + (cur.y - next.y)^2 + (cur.z - next.z)^2)`
|
|||
|
|
`var voyageTime = 60 * floor(3990 * voyageSpan / (Speed * 100))`
|
|||
|
|
`var voyageDistance = floor(0.035 * voyageSpan)`
|
|||
|
|
|
|||
|
|
#### Code example
|
|||
|
|
|
|||
|
|
```ts
|
|||
|
|
export class WorkshopData {
|
|||
|
|
x: number;
|
|||
|
|
y: number;
|
|||
|
|
surveyDistance: number;
|
|||
|
|
scalar = 1;
|
|||
|
|
|
|||
|
|
getTime(next: WorkshopData, speed: number): { voyageTime: number, voyageDistance: number, surveyTime: number } {
|
|||
|
|
var voyageTime = 60 * (this.voyageDistanceInter(next, speed));
|
|||
|
|
var voyageDistance = Math.trunc((this.scalar * Math.trunc(this.distance(next)) / 1000));
|
|||
|
|
var surveyTime = Math.trunc((next.surveyDistance * 7000) / (100 * speed)) * 60;
|
|||
|
|
return { voyageDistance, voyageTime, surveyTime };
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
distance(next: WorkshopData): number {
|
|||
|
|
throw "Abstract method triggered";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
voyageDistanceInter(next: WorkshopData, speed: number): number {
|
|||
|
|
throw "Abstract method triggered";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export class AirshipData extends WorkshopData {
|
|||
|
|
scalar = 52;
|
|||
|
|
constructor(data: any) {
|
|||
|
|
super();
|
|||
|
|
this.x = data.x;
|
|||
|
|
this.y = data.y;
|
|||
|
|
this.surveyDistance = data.surveyDistance;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
distance(next: WorkshopData): number {
|
|||
|
|
return Math.round(Math.sqrt(Math.pow(this.x - next.x, 2) + Math.pow(this.y - next.y, 2)));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
voyageDistanceInter(next: WorkshopData, speed: number): number {
|
|||
|
|
return Math.trunc(7000 * Math.trunc(855 * Math.trunc(this.distance(next)) / 1000) / (100 * speed))
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export class SubmarineData extends WorkshopData {
|
|||
|
|
z: number;
|
|||
|
|
scalar = 35;
|
|||
|
|
|
|||
|
|
constructor(data: any) {
|
|||
|
|
super();
|
|||
|
|
this.x = data.x;
|
|||
|
|
this.y = data.y;
|
|||
|
|
this.z = data.z;
|
|||
|
|
this.surveyDistance = data.surveyDistance;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
distance(next: SubmarineData): number {
|
|||
|
|
return Math.sqrt(Math.pow(this.x - next.x, 2) + Math.pow(this.y - next.y, 2) + Math.pow(this.z - next.z, 2));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
voyageDistanceInter(next: SubmarineData, speed: number): number {
|
|||
|
|
return Math.trunc(3990 * this.distance(next) / (100 * speed))
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|