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+ }
0 commit comments