-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathLSEL.P
973 lines (700 loc) · 15.4 KB
/
LSEL.P
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
//#define MASTER
#ifndef MASTER
#define DEBUG
#else
#endif
//#define NTSC
//#define TRUE -1
//#define FALSE 0
#define _K *1024
#define _L <<16
#define BIT(n) (1<<n)
#define ABS(v) v>0?v:-v
/* ot size
bits entries
0 0
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
10 1024
11 2048
12 4096
13 8192
14 16384
*/
//#define OT_SIZE 9
//#define OT_SHIFT ( 15 - OT_SIZE )
//#define ORDERING_TABLE_SIZE ( 1 << OT_SIZE )
//#define NEAREST_DEPTH 1
//#define FURTHEST_DEPTH ORDERING_TABLE_SIZE-1
#ifdef NTSC
#define SCREEN_HEIGHT 240
#define VIDEO_MODE 0
#define DEFAULT_SCREEN_X_OFFSET 0
#define DEFAULT_SCREEN_Y_OFFSET 0
#else
#define SCREEN_HEIGHT 256
#define VIDEO_MODE 1
#define DEFAULT_SCREEN_X_OFFSET 0
#define DEFAULT_SCREEN_Y_OFFSET 16
#endif
#define FB1X 0
#define FB1Y 0
#define FB2X 0
#define FB2Y 256
#define SCREEN_WIDTH 512
//#define SCREEN_Z ( SCREEN_WIDTH >> 1 )
#define MAX_INPUT_HOLES 2
#define MAX_PADS_PER_MULTITAP 4
#define TOTAL_PADS ( MAX_INPUT_HOLES * MAX_PADS_PER_MULTITAP )
#define MISSING_TAP_0 BIT(0)
#define MISSING_TAP_1 BIT(1)
#define MISSING_PAD BIT(0)
#define IN_TAP BIT(1)
#define PADOUT BIT(0)
/************************************************************/
/* pad equates */
/************************************************************/
#define PAD_UP PAD_LU
#define PAD_DOWN PAD_LD
#define PAD_LEFT PAD_LL
#define PAD_RIGHT PAD_LR
#define PAD_TRIANGLE PAD_RU
#define PAD_CROSS PAD_RD
#define PAD_SQUARE PAD_RL
#define PAD_CIRCLE PAD_RR
#define PAD_PAUSE PAD_SEL
#define PAD_SELECT PAD_SEL
#define PAD_TR PAD_FRT
#define PAD_TR2 PAD_FRB
#define PAD_TL PAD_FLT
#define PAD_TL2 PAD_FLB
#define PAD_PLAY PAD_START
#define ANYBUTTON (PAD_TRIANGLE|PAD_CROSS|PAD_SQUARE|PAD_CIRCLE|PAD_START)
#define PAD_RESET (PAD_TL|PAD_TL2|PAD_TR|PAD_TR2|PAD_UP|PAD_TRIANGLE)
#define ANY_PAD_DIRECTION ( PAD_UP|PAD_RIGHT|PAD_DOWN|PAD_LEFT )
#define ANY_PAD_BUTTON ( PAD_TRIANGLE|PAD_CIRCLE|PAD_CROSS|PAD_SQUARE )
#define ANY_PAD_SHOULDER_BUTTON ( PAD_TL|PAD_TR|PAD_TL2|PAD_TR2 )
#define ANY_PAD_ACTIVITY ( ANY_PAD_DIRECTION|ANY_PAD_BUTTON )
#define BACK PAD_TRIANGLE
#define SELECT PAD_CROSS
#define TOGGLE 1
#define Set_rgb(s,red,green,blue)\
s.r=red;\
s.g=green;\
s.b=blue;
#define MAX_OBJECTS 20
#define OBJ_STANDBY BIT(0)
#define OBJ_FREE BIT(1)
#define OBJ_DISPLAY BIT(2)
#define OBJ_TRACEGRID BIT(3)
#define OBJ_FAR BIT(4)
#define OBJ_ONSCREEN BIT(5)
#define OBJ_SHADOW BIT(6)
#define OBJ_MAT3 BIT(7)
#define OBJ_CHILD BIT(8)
#define OBJ_WHEEL BIT(9)
#define OBJ_HOST BIT(10)
#define OBJ_BUGGY BIT(11)
#define OBJ_NOCOLLISION BIT(12)
#define OBJ_ROTVECTOR BIT(13)
#define OBJ_NOLOD BIT(14)
#define PRIM_SETUP BIT(0)
#define PRIM_ALLOC BIT(1)
#define PRIM_DEALLOC BIT(2)
#define MAX_TRI 1300
#define MAX_QUAD 100
#define MAX_VERTEX 1300
#define MAX_CHILDREN 4
#define MAX_FAST_COLLISION_POINTS 12
#define MAX_COLLISION_POINTS 100
/********************************************************************/
/* file control flags */
/********************************************************************/
#define READ 0
#define WRITE 1
#define READ_WRITE 2
#define FROM_START 0
#define FROM_CURRENT 1
#define FROM_END 2
#define FILE_READ_ERROR 0
#define FILE_TOO_BIG 2
#define NORMAL 0
#define BAG 1
#define PAD_SIZE 2048
#define Sector(s) ((s+PAD_SIZE-1)/PAD_SIZE)
enum {
ROOT_DIR=0,
GFX_DIR,
SFX_DIR,
MODEL_DIR };
#define OK 1
#define NOT_OK 0
#define M_IDENTITY {{{4096,0,0},{0,4096,0},{0,0,4096}},{0,0,0}}
#define M_CLEAR {{{0,0,0},{0,0,0},{0,0,0}},{0,0,0}}
/*********************************************************/
/* timebar defs */
/*********************************************************/
#define TB_ACTIVE 1
#define FRAMES_PER_UPDATE 2
#define CALIBRATE 1
#define dot(a,b) (((a).vx * (b).vx) + ((a).vy * (b).vy) + ((a).vz * (b).vz))
#define VECTOR_SET(v,x,y,z) (v)->vx=x;(v)->vy=y;(v)->vz=z
#define PHYSICS(n,obj) (*physics[n])(obj)
/************************************************************/
/* */
/* physics defs */
/* */
/************************************************************/
#define PI (3.141592654)
#define ANGULAR_VELOCITY_DAMP 98.5 // % angular velocity damping
#define VRES_SHIFT 8 // velocity fraction bits
#define AVRES_SHIFT 12 // angular velocity fraction bits
#define MOMENT_SHIFT 8 // moment of inertia shift
#define MASS_SHIFT 8 // mass fraction bits
#define VRES (1<<VRES_SHIFT) // velocity fraction bits
#define AVRES (1<<AVRES_SHIFT) // velocity fraction bits
#define GRAVITY (VRES * 1)
#define MASS (1<<MASS_SHIFT)
#define MOMENT (1 << MOMENT_SHIFT)
#define AV_PRESCALE (ONE/(2*PI))
#define MAX_WAVES 64
typedef struct
{
float x,y,z;
}VECTORF;
typedef struct
{
VECTOR k;
VECTOR damper;
}Vspring;
typedef struct
{
LONG k;
LONG damper;
}Spring;
typedef struct
{
WORD x,y,z;
}Maxis;
typedef struct
{
Maxis xaxis;
Maxis yaxis;
Maxis zaxis;
}Rotation;
typedef struct
{
Rotation rotate;
VECTOR translate;
}RT;
typedef union
{
MATRIX pmat;
RT rmat;
}Matrix;
typedef struct
{
WORD x, y;
}Xy;
typedef struct
{
LONG type;
WORD width,height;
WORD clut[1];
}Image_data;
typedef struct
{
UBYTE name[16];
Image_data image;
}Gfx_header;
typedef struct
{
LONG status;
WORD tapslot;
WORD tap;
}Missing_pad;
typedef struct
{
WORD tap;
Missing_pad pad[ TOTAL_PADS ];
}Controller_gone;
typedef struct
{
WORD pad;
WORD debounce;
WORD status;
WORD refresh_status;
}Pad;
typedef struct
{
ControllerPacket pad_buffer[2];
LONG current_setup;
LONG original_setup;
LONG eh;
Pad pad[8];
Pad all;
void (*task)(void);
}Player_input;
typedef struct
{
WORD r;
WORD g;
WORD b;
}Rgb;
typedef struct
{
LONG offset;
LONG size;
}Bag_file;
typedef struct
{
WORD x,y;
}Screen_coord;
typedef struct
{
VECTOR pos;
VECTOR target;
SVECTOR i,j,k;
LONG control;
} Camera;
/******************************************************/
/* linked list */
/******************************************************/
typedef struct Link
{
struct Link *next;
struct Link *next_active;
struct Link *prev_active;
}Link;
typedef struct
{
Link *base_chain;
Link *free_chain;
Link *active_chain;
LONG size;
LONG many;
}Chain;
/******************************************************/
/* primitive */
/******************************************************/
typedef union
{
POLY_GT4 gt4;
POLY_G4 g4;
LINE_F4 lf4;
LINE_G4 lg4;
POLY_F4 f4;
}Quad_prim;
typedef union
{
POLY_GT3 gt3;
POLY_G3 g3;
LINE_F3 lf3;
LINE_G3 lg3;
POLY_F3 f3;
}Tri_prim;
typedef struct Quad
{
Link link;
Quad_prim prim[2]; // biggest quad primitive
}Quad;
typedef struct Tri
{
Link link;
Tri_prim prim[2]; // biggest tri primitive
}Tri;
typedef union
{
Tri *tri_ptr;
Quad *quad_ptr;
}Prim_ptr;
typedef struct
{
WORD u,v;
}Uv;
typedef struct
{
UBYTE u,v;
}Buv;
typedef struct
{
WORD v1,v2,v3,v4;
// SVECTOR n0,n1,n2;
// CVECTOR c0,c1,c2,c3;
}G4_prim;
typedef struct
{
WORD v1,v2,v3, pad;
SVECTOR n0,n1,n2;
// CVECTOR c0,c1,c2;
}G3_prim;
typedef struct
{
WORD v1,v2,v3,v4;
// CVECTOR c0,c1,c2,c3;
Uv uv0,uv1,uv2,uv3;
SVECTOR n0,n1,n2,n3;
}GT4_prim;
typedef struct
{
SVECTOR a,b,c;
}UVMat;
typedef struct
{
WORD v1,v2,v3;
Buv uv0,uv1,uv2;
SVECTOR n0,n1,n2;
}GT3_prim;
typedef struct
{
WORD v1,v2,v3;
Buv uv0,uv1,uv2;
UVMat bm0,bm1,bm2;
}GT3B_prim;
typedef struct
{
WORD v1,v2,v3;
Buv uv0,uv1,uv2;
UVMat bm0,bm1,bm2;
}GT3RB_prim;
typedef struct
{
SVECTOR n0,n1,n2;
WORD v1,v2,v3, pad;
}GT3C_prim;
typedef struct
{
SVECTOR n0,n1,n2;
WORD v1,v2,v3,pad;
}GT3G_prim;
typedef struct
{
SVECTOR v;
// CVECTOR c;
// SVECTOR n;
// Xy t;
}Point;
typedef struct test_model
{
UBYTE name[16];
WORD vertex_count;
WORD g4_count;
WORD g3_count;
WORD gt4_count;
WORD gt3_count;
WORD gt3b_count;
WORD gt3r_count;
WORD gt3br_count;
WORD gt3c_count;
WORD gt3g_count;
WORD gt3rb_count;
WORD gt3pad_count;
SVECTOR bound[9];
Point *point_list;
G4_prim *g4_prim;
G3_prim *g3_prim;
GT4_prim *gt4_prim;
GT3_prim *gt3_prim;
GT3B_prim *gt3b_prim;
GT3_prim *gt3r_prim;
GT3C_prim *gt3c_prim;
GT3G_prim *gt3g_prim;
GT3RB_prim *gt3rb_prim;
// SVECTOR vlist[1];
Point vlist[1];
}Model_info;
typedef struct
{
Model_info *detail;
}Lod;
typedef struct
{
SVECTOR i,j,k;
}Axis;
typedef union
{
G4_prim *g4_prim;
G3_prim *g3_prim;
GT4_prim *gt4_prim;
GT3_prim *gt3_prim;
GT3B_prim *gt3b_prim;
GT3_prim *gt3r_prim;
GT3C_prim *gt3c_prim;
GT3G_prim *gt3g_prim;
GT3RB_prim *gt3rb_prim;
}Mprim;
typedef struct
{
WORD setup;
WORD count;
Mprim mprim;
}Pinfo;
typedef struct
{
Model_info *model_info;
WORD set;
WORD vertex_count;
WORD g4_setup;
WORD g4_count;
WORD gt3r_setup;
WORD gt3c_setup;
WORD gt3g_setup;
WORD gt3rb_setup;
WORD gt3pad_setup;
WORD pad;
Pinfo g3_pinfo;
Pinfo gt3b_pinfo;
Point *point_list;
G4_prim *g4_prim;
GT4_prim *gt4_prim;
GT3_prim *gt3_prim;
GT3_prim *gt3r_prim;
GT3C_prim *gt3c_prim;
GT3G_prim *gt3g_prim;
GT3RB_prim *gt3rb_prim;
// Quad *quad_g4;
// Quad *quad_last_g4;
// Quad *quad_gt4;
// Quad *quad_last_gt4;
// Quad *quad_lg4;
// Quad *quad_last_lg4;
Tri *tri_g3;
Tri *tri_last_g3;
Tri *tri_gt3b;
Tri *tri_last_gt3b;
Tri *tri_gt3ba;
Tri *tri_last_gt3ba;
Tri *tri_gt3bs;
Tri *tri_last_gt3bs;
}Model_stack;
typedef struct
{
VECTOR velocity;
VECTOR position;
VECTOR offset;
VECTOR last_bottom_offset;
VECTOR last_top_offset;
LONG last_springforce;
LONG springforce;
LONG compression;
Spring *spring;
}Wheel;
typedef struct
{
struct Object* wheels[4];
LONG steer;
}Chassis;
typedef union
{
Chassis chassis;
Wheel wheel;
}Object_pocket;
typedef struct Object
{
Link link;
LONG control;
LONG z;
LONG distance_from_camera;
WORD current_lod;
WORD last_lod;
struct Object *pop;
void (*task)( struct Object * );
Model_info **lod;
struct Object *children[4];
struct Object *obj_ptr;
LONG mass;
VECTOR moment;
RT axis;
SVECTOR rotvector;
VECTOR angular_velocity;
VECTOR acceleration;
VECTOR velocity;
LONG sliding;
LONG static_friction;
LONG kinetic_friction;
Object_pocket pocket;
Model_stack model_stack;
LONG timer;
}Object;
typedef struct
{
Model_info **details;
void (*task)(Object *obj );
}Object_def;
typedef struct
{
// CVECTOR c;
WORD x,y;
LONG z;
// Xy t;
// LONG z;
}Xformed;
typedef struct
{
SVECTOR coord;
SVECTOR colour;
}Omnilight;
typedef struct
{
LONG control;
WORD x,y,h,width;
CVECTOR bar_col;
CVECTOR back_col;
LONG usage;
LONG max;
LONG val;
POLY_F4 poly[2];
POLY_F4 outline[2];
}Timebar;
typedef struct
{
LONG flag;
LONG frames_per_update;
void (*vbl)( void );
void (*drawback)( void );
LONG vstart;
LONG vend;
LONG dstart;
LONG dend;
LONG last_update;
volatile LONG frame_counter, vsync_counter,
calibrate, calibrate_base;
volatile LONG draw_counter;
}Time_pocket;
typedef struct
{
WORD width;
WORD height;
WORD size;
LONG max, min;
LONG x_offset, z_offset;
WORD *grid;
Quad *first, *last;
}Level;
typedef struct
{
UBYTE string[64];
LONG timer;
LONG control;
}Event;
typedef struct
{
WORD r,g,b;
WORD speed;
CVECTOR col;
}Wave;
typedef struct
{
LONG *image_vlc; // bitstream encoded image
WORD colour_depth; // 16 or 24
WORD x,y;
WORD image_width, image_height;
WORD screen_xres, screen_yres;
}Bs_image;
typedef struct
{
WORD tpage;
WORD bump_tpage, bump_tpage_a, bump_tpage_s;
WORD ref_tpage, ref_tpage_a, ref_tpage_s, ref_tpage_g, ref_tpage_a2;
WORD clut,bump_clut,ref_clut;
}Gfx_vram;
#define FRAME_RATE 1
#define ASPECT 15 // aspec ratio * 10
void rob_move_camera( void );
void point_camera_by_vector(void);
void point_cam_z( void );
WORD fade( WORD *c, WORD speed, WORD max, WORD min );
void rob_make_random_number( void );
void process_waves( void );
void init_waves( void );
void control( void );
void reset_free_mem( void );
void vram_peek( void );
//void setup_screens( Db *db );
void wait_vbl( void );
void vblank( void );
void task_planet( Object *obj );
void zero( UBYTE *s, LONG many );
void get_to_v( VECTOR *t, VECTOR *s, LONG shift, LONG speed );
void get_to_sv( SVECTOR *t, SVECTOR *s, LONG shift, WORD speed );
LONG minmax( LONG v, LONG min, LONG max );
void rv_axis_set( WORD x, WORD y, WORD z, RT *m1 );
void identity( RT *m );
void render( Object *obj, MATRIX *local );
void draw_objects( void );
void draw_obj( Object *obj, MATRIX *real, MATRIX *light_mat );
void create_obj_axis_yz( Object *obj, MATRIX *dest );
void create_obj_axis( Object *obj, MATRIX *dest );
void draw_shadow_gt3( Object *obj, Xformed *xlist );
WORD xform_shadow_vertex( Object *obj, MATRIX *m, Xformed *x1 );
LONG distance( VECTOR *p1, MATRIX *p2 );
void alloc_prim( void );
Object *spawn_object( Object_def *def, WORD set );
void do_test( void );
WORD alloc_g4( Object *obj );
void draw_g4( Object * );
void install_vram_image( void );
WORD alloc_gt4( Object *obj );
void draw_gt4( Object *obj );
WORD alloc_gt3( Object *obj );
void boxtask( Object *obj );
void testup( Object *obj );
LONG fastdst( LONG xdist, LONG zdist );
void boxtask2( Object *obj );
Object *get_object( void );
WORD dealloc_gt3( Object *obj );
void bound( Object *obj );
WORD bung_image( Gfx_header *g, RECT *r );
WORD bung_clut( Gfx_header *g, RECT *r );
void initialise_model( Object_def *def );
void initialise_model_info( Model_info *mi, LONG detail );
WORD xform_vertex( Object *obj, MATRIX *m, Xformed *x1 );
void bump_mat( SVECTOR *magic, UVMat *bm, SVECTOR *v );
void show_matrix( MATRIX *m );
WORD alloc_gt3b( Object *obj );
WORD dealloc_gt3b( Object *obj );
void draw_set_gt3b( Object *obj, Xformed *xlist );
void draw_gt3b( Object *obj, Xformed *xlist );
void draw_set_gt3( Object *obj, Xformed *xlist );
void draw_gt3( Object *obj, Xformed *xlist );
WORD alloc_gt3r( Object *obj );
WORD dealloc_gt3r( Object *obj );
void draw_set_gt3r( Object *obj, Xformed *xlist );
void draw_gt3r( Object *obj, Xformed *xlist );
void getuv3( SVECTOR *n, POLY_GT3 *gt3 );
WORD alloc_gt3c( Object *obj );
WORD dealloc_gt3c( Object *obj );
void draw_set_gt3c( Object *obj, Xformed *xlist );
void draw_gt3c( Object *obj, Xformed *xlist);
WORD alloc_gt3g( Object *obj );
WORD dealloc_gt3g( Object *obj );
void draw_set_gt3g( Object *obj, Xformed *xlist );
void draw_gt3g( Object *obj, Xformed *xlist );
WORD alloc_gt3rb( Object *obj );
WORD dealloc_gt3rb( Object *obj );
void getuv3b( GT3RB_prim *p, POLY_GT3 *gt3 );
void draw_gt3rb( Object *obj, Xformed *xlist );
void draw_set_gt3rb( Object *obj, Xformed *xlist );
void draw_set_g3( Object *obj, Xformed *xlist );
void draw_g3( Object *obj, Xformed *xlist );
WORD dealloc_g3( Object *obj );
WORD alloc_g3( Object *obj );
LONG asf( LONG *a );
void cap( WORD *v, WORD top, WORD bot );
void install_gfx( Gfx_header *gfx, Gfx_header *bump, WORD no );
void process_objects( void );
Object *get_free_object( Object *obj );
void dmode_line( Object *obj );
void dmode_line_gt4( Object *obj );
void dmode_line_gt3( Object *obj );
void initialise_objects( void );
void check_lod( Object *obj );
void language_select_exec( void );