Skip to content

Commit a58dbff

Browse files
committed
Add the entity viewer
1 parent 1948e15 commit a58dbff

File tree

2 files changed

+210
-0
lines changed

2 files changed

+210
-0
lines changed

src/entityViewer.ts

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
2+
namespace EntityViewer {
3+
4+
const WINDOW_CLASS = 'devtools.window.entityviewer';
5+
const TOOL_ID = 'devtools.tool.entityviewer';
6+
7+
var entityId: number;
8+
9+
export function register() {
10+
ui.registerMenuItem('Entity Viewer', () => {
11+
ui.activateTool({
12+
id: TOOL_ID,
13+
cursor: "cross_hair",
14+
onDown: e => {
15+
if (e.entityId) {
16+
getOrOpen(e.entityId);
17+
}
18+
}
19+
});
20+
});
21+
}
22+
23+
function getOrOpen(id: number) {
24+
entityId = id;
25+
const w = ui.getWindow(WINDOW_CLASS);
26+
if (w) {
27+
w.bringToFront();
28+
} else {
29+
open();
30+
}
31+
}
32+
33+
function open() {
34+
const window = ui.openWindow({
35+
classification: WINDOW_CLASS,
36+
title: '',
37+
width: 300,
38+
height: 500,
39+
minWidth: 300,
40+
minHeight: 300,
41+
maxWidth: 500,
42+
maxHeight: 1200,
43+
widgets: [
44+
{
45+
type: "listview",
46+
name: "rve-debug-list",
47+
scrollbars: "both",
48+
columns: [
49+
{
50+
width: 130
51+
},
52+
{
53+
}
54+
],
55+
isStriped: true,
56+
canSelect: true,
57+
x: 5,
58+
y: 20,
59+
width: 290,
60+
height: 575,
61+
onClick: (i, c) => console.log(`Clicked item ${i} in column ${c}`)
62+
}
63+
],
64+
onClose: () => onClose(),
65+
onUpdate: () => onUpdate()
66+
});
67+
68+
function onClose() {
69+
const tool = ui.tool;
70+
if (tool && tool.id == TOOL_ID) {
71+
tool.cancel();
72+
}
73+
}
74+
75+
function onUpdate() {
76+
updateInfo();
77+
}
78+
79+
function set(items: ListViewItem[]) {
80+
const list = window.findWidget<ListView>("rve-debug-list");
81+
list.width = window.width - 10;
82+
list.height = window.height - 36;
83+
list.items = items;
84+
}
85+
86+
function updateInfo() {
87+
window.title = `Entity Viewer: #${entityId}`;
88+
89+
const entity = map.getEntity(entityId);
90+
if (!entity) {
91+
set([["Entity does not exist anymore.", ""]]);
92+
return;
93+
}
94+
95+
const sep = (text: string) => <ListViewItemSeperator>{ type: 'seperator', text };
96+
97+
let data: ListViewItem[] = [
98+
sep('Entity'),
99+
["Id:", entity.id.toString()],
100+
["Type:", entity.type.toString()],
101+
["Position:", `${entity.x}, ${entity.y}, ${entity.z}`]
102+
];
103+
104+
switch (entity.type) {
105+
case "car":
106+
const car = entity as Car;
107+
data = data.concat([
108+
["", ""],
109+
sep('Car'),
110+
["Ride id", car.ride.toString()],
111+
["Ride object id", car.rideObject.toString()],
112+
["Vehicle object id", car.vehicleObject.toString()],
113+
["Sprite type", car.spriteType.toString()],
114+
["Num. of seats", car.numSeats.toString()],
115+
["Next car on train", car.nextCarOnTrain?.toString() ?? "null"],
116+
["Next car on ride", car.nextCarOnRide.toString()],
117+
["Previous car on ride", car.previousCarOnRide.toString()],
118+
["Current station", car.currentStation.toString()],
119+
["", ""],
120+
["Mass:", car.mass.toString()],
121+
["Acceleration:", car.acceleration.toString()],
122+
["Banking rotation:", car.bankRotation.toString()],
123+
["Colours", `body: ${car.colours.body}, trim: ${car.colours.trim}, ternary: ${car.colours.ternary}`],
124+
["Powered acceleration:", car.poweredAcceleration.toString()],
125+
["Powered max. speed:", car.poweredMaxSpeed.toString()],
126+
["Status:", car.status.toString()],
127+
["Peeps:", car.peeps.map(p => (p == null) ? "null" : p.toString()).toString()],
128+
["", ""],
129+
// @ts-expect-error
130+
["Track location", `${car.trackLocation.x}, ${car.trackLocation.y}, ${car.trackLocation.z}, dir: ${car.trackLocation.direction}`],
131+
["Track progress", car.trackProgress.toString()],
132+
["Remaining distance", car.remainingDistance.toString()],
133+
]);
134+
135+
136+
const rideObject = context.getObject("ride", car.rideObject);
137+
const vehicleObject = rideObject.vehicles[car.vehicleObject];
138+
139+
data = data.concat([
140+
["", ""],
141+
sep('VehicleObject'),
142+
["Rotation frame mask:", vehicleObject.rotationFrameMask.toString()],
143+
["Num. of vertical frames:", vehicleObject.numVerticalFrames.toString()],
144+
["Num. of horizontal frames:", vehicleObject.numHorizontalFrames.toString()],
145+
["Spacing:", vehicleObject.spacing.toString()],
146+
["Car mass:", vehicleObject.carMass.toString()],
147+
["Tab height:", vehicleObject.tabHeight.toString()],
148+
["Num. of seats:", vehicleObject.numSeats.toString()],
149+
["", ""],
150+
["Sprite flags:", vehicleObject.spriteFlags.toString()],
151+
["Sprite width:", vehicleObject.spriteWidth.toString()],
152+
["Sprite height:", vehicleObject.spriteHeightPositive.toString()],
153+
["Animation:", vehicleObject.animation.toString()],
154+
["Flags:", vehicleObject.flags.toString()],
155+
// Here are many image id properties not included.
156+
["", ""],
157+
["Num. of vehicle images:", vehicleObject.noVehicleImages.toString()],
158+
["Num. of seating rows:", vehicleObject.noSeatingRows.toString()],
159+
["Spinning inertia:", vehicleObject.spinningInertia.toString()],
160+
["Spinning friction:", vehicleObject.spinningFriction.toString()],
161+
["Friction sound id:", vehicleObject.frictionSoundId.toString()],
162+
["Logflume reverser vehicle:", vehicleObject.logFlumeReverserVehicleType.toString()],
163+
["Sound range:", vehicleObject.soundRange.toString()],
164+
["Double sound frequency:", vehicleObject.doubleSoundFrequency.toString()],
165+
["", ""],
166+
["Powered acceleration:", vehicleObject.poweredAcceleration.toString()],
167+
["Powered max speed:", vehicleObject.poweredMaxSpeed.toString()],
168+
["Car visual:", vehicleObject.carVisual.toString()],
169+
["Effect visual:", vehicleObject.effectVisual.toString()],
170+
["Draw order:", vehicleObject.drawOrder.toString()],
171+
]);
172+
173+
data = data.concat([
174+
["", ""],
175+
sep('RideObject'),
176+
["Type:", rideObject.type.toString()],
177+
["Index:", rideObject.index.toString()],
178+
["Identifier:", rideObject.identifier.toString()],
179+
["Legacy id:", rideObject.legacyIdentifier.toString()],
180+
["Name:", rideObject.name.toString()],
181+
["", ""],
182+
["Capacity:", rideObject.capacity.toString()],
183+
["Flags:", rideObject.flags.toString()],
184+
["Ride type:", rideObject.rideType.map(r => (r == null) ? "null" : r.toString()).toString()],
185+
["", ""],
186+
["Min. cars in train:", rideObject.minCarsInTrain.toString()],
187+
["Max. cars in train:", rideObject.maxCarsInTrain.toString()],
188+
["Cars per flatride:", rideObject.carsPerFlatRide.toString()],
189+
["Seatless cars:", rideObject.zeroCars.toString()],
190+
["", ""],
191+
["Tab vehicle:", rideObject.tabVehicle.toString()],
192+
["Default vehicle:", rideObject.defaultVehicle.toString()],
193+
["Front vehicle:", rideObject.frontVehicle.toString()],
194+
["Second vehicle:", rideObject.secondVehicle.toString()],
195+
["Third vehicle:", rideObject.thirdVehicle.toString()],
196+
["Rear vehicle:", rideObject.rearVehicle.toString()],
197+
["", ""],
198+
["Excitement multiplier:", rideObject.excitementMultiplier.toString()],
199+
["Intensity multiplier:", rideObject.intensityMultiplier.toString()],
200+
["Nausea multiplier:", rideObject.nauseaMultiplier.toString()],
201+
["Max height:", rideObject.maxHeight.toString()],
202+
["Shop items:", `${rideObject.shopItem}, ${rideObject.shopItemSecondary}`],
203+
]);
204+
}
205+
206+
set(data);
207+
}
208+
}
209+
}

src/main.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const main = () => {
66
return;
77
}
88

9+
EntityViewer.register();
910
NetworkMonitor.register();
1011

1112
if (DEBUG) {

0 commit comments

Comments
 (0)