summaryrefslogtreecommitdiffstats
path: root/src/object/object.h
blob: 9283c9bd3dc431c69e20e00467b701be990467f8 (plain)
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
/*
 * This file is part of the Colobot: Gold Edition source code
 * Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam
 * http://epsiteс.ch; http://colobot.info; http://github.com/colobot
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see http://gnu.org/licenses
 */

/**
 * \file object/object.h
 * \brief CObject - base class for all game objects
 */

#pragma once


#include "graphics/engine/engine.h"
#include "graphics/engine/camera.h"

#include "sound/sound.h"


class CApplication;
class CPhysics;
class CBrain;
class CMotion;
class CAuto;
class CDisplayText;
class CRobotMain;
class CBotVar;
class CScript;


/**
 * \enum ObjectType
 * \brief Type of game object
 */
enum ObjectType
{
    OBJECT_NULL             = 0,    //! < object destroyed
    OBJECT_FIX              = 1,    //! < stationary scenery
    OBJECT_PORTICO          = 2,    //! < Portico
    OBJECT_BASE             = 3,    //! < SpaceShip
    OBJECT_DERRICK          = 4,    //! < Derrick
    OBJECT_FACTORY          = 5,    //! < BotFactory
    OBJECT_STATION          = 6,    //! < PowerStation
    OBJECT_CONVERT          = 7,    //! < Converter
    OBJECT_REPAIR           = 8,    //! < RepairStation
    OBJECT_TOWER            = 9,    //! < DefenseTower
    OBJECT_NEST             = 10,   //! < AlienNest
    OBJECT_RESEARCH         = 11,   //! < ResearchCenter
    OBJECT_RADAR            = 12,   //! < RadarStation
    OBJECT_ENERGY           = 13,   //! < PowerPlant
    OBJECT_LABO             = 14,   //! < AutoLab
    OBJECT_NUCLEAR          = 15,   //! < NuclearPlant
    OBJECT_START            = 16,   //! < StartArea
    OBJECT_END              = 17,   //! < EndArea
    OBJECT_INFO             = 18,   //! < ExchangePost
    OBJECT_PARA             = 19,   //! < PowerCaptor
    OBJECT_TARGET1          = 20,   //! < Target1 (gate)
    OBJECT_TARGET2          = 21,   //! < Target2 (center)
    OBJECT_SAFE             = 22,   //! < Vault
    OBJECT_HUSTON           = 23,   //! < Houston
    OBJECT_DESTROYER        = 24,   //! < Destroyer
    OBJECT_FRET             = 30,   //! < transportable (unused)
    OBJECT_STONE            = 31,   //! < TitaniumOre
    OBJECT_URANIUM          = 32,   //! < UraniumOre
    OBJECT_METAL            = 33,   //! < Titanium
    OBJECT_POWER            = 34,   //! < PowerCell
    OBJECT_ATOMIC           = 35,   //! < NuclearCell
    OBJECT_BULLET           = 36,   //! < OrgaMatter
    OBJECT_BBOX             = 37,   //! < BlackBox
    OBJECT_TNT              = 38,   //! < TNT
    OBJECT_SCRAP1           = 40,   //! < Scrap1 (metal)
    OBJECT_SCRAP2           = 41,   //! < Scrap2 (metal)
    OBJECT_SCRAP3           = 42,   //! < Scrap3 (metal)
    OBJECT_SCRAP4           = 43,   //! < Scrap4 (plastic)
    OBJECT_SCRAP5           = 44,   //! < Scrap5 (plastic)
    OBJECT_MARKPOWER        = 50,   //! < PowerSpot
    OBJECT_MARKSTONE        = 51,   //! < TitaniumSpot
    OBJECT_MARKURANIUM      = 52,   //! < UraniumSpot
    OBJECT_MARKKEYa         = 53,   //! < KeyASpot
    OBJECT_MARKKEYb         = 54,   //! < KeyBSpot
    OBJECT_MARKKEYc         = 55,   //! < KeyCSpot
    OBJECT_MARKKEYd         = 56,   //! < KeyDSpot
    OBJECT_BOMB             = 60,   //! < Mine
    OBJECT_WINFIRE          = 61,   //! < Firework
    OBJECT_SHOW             = 62,   //! < arrow above object (Visit)
    OBJECT_BAG              = 63,   //! < Bag
    OBJECT_PLANT0           = 70,   //! < Greenery0
    OBJECT_PLANT1           = 71,   //! < Greenery1
    OBJECT_PLANT2           = 72,   //! < Greenery2
    OBJECT_PLANT3           = 73,   //! < Greenery3
    OBJECT_PLANT4           = 74,   //! < Greenery4
    OBJECT_PLANT5           = 75,   //! < Greenery5
    OBJECT_PLANT6           = 76,   //! < Greenery6
    OBJECT_PLANT7           = 77,   //! < Greenery7
    OBJECT_PLANT8           = 78,   //! < Greenery8
    OBJECT_PLANT9           = 79,   //! < Greenery9
    OBJECT_PLANT10          = 80,   //! < Greenery10
    OBJECT_PLANT11          = 81,   //! < Greenery11
    OBJECT_PLANT12          = 82,   //! < Greenery12
    OBJECT_PLANT13          = 83,   //! < Greenery13
    OBJECT_PLANT14          = 84,   //! < Greenery14
    OBJECT_PLANT15          = 85,   //! < Greenery15
    OBJECT_PLANT16          = 86,   //! < Greenery16
    OBJECT_PLANT17          = 87,   //! < Greenery17
    OBJECT_PLANT18          = 88,   //! < Greenery18
    OBJECT_PLANT19          = 89,   //! < Greenery19
    OBJECT_TREE0            = 90,   //! < Tree0
    OBJECT_TREE1            = 91,   //! < Tree1
    OBJECT_TREE2            = 92,   //! < Tree2
    OBJECT_TREE3            = 93,   //! < Tree3
    OBJECT_TREE4            = 94,   //! < Tree4
    OBJECT_TREE5            = 95,   //! < Tree5
    OBJECT_MOBILEwt         = 100,  //! < PracticeBot
    OBJECT_MOBILEtt         = 101,  //! < track-trainer (unused)
    OBJECT_MOBILEft         = 102,  //! < fly-trainer (unused)
    OBJECT_MOBILEit         = 103,  //! < insect-trainer (unused)
    OBJECT_MOBILEwa         = 110,  //! < WheeledGrabber
    OBJECT_MOBILEta         = 111,  //! < TrackedGrabber
    OBJECT_MOBILEfa         = 112,  //! < WingedGrabber
    OBJECT_MOBILEia         = 113,  //! < LeggedGrabber
    OBJECT_MOBILEwc         = 120,  //! < WheeledShooter
    OBJECT_MOBILEtc         = 121,  //! < TrackedShooter
    OBJECT_MOBILEfc         = 122,  //! < WingedShooter
    OBJECT_MOBILEic         = 123,  //! < LeggedShooter
    OBJECT_MOBILEwi         = 130,  //! < WheeledOrgaShooter
    OBJECT_MOBILEti         = 131,  //! < TrackedOrgaShooter
    OBJECT_MOBILEfi         = 132,  //! < WingedOrgaShooter
    OBJECT_MOBILEii         = 133,  //! < LeggedOrgaShooter
    OBJECT_MOBILEws         = 140,  //! < WheeledSniffer
    OBJECT_MOBILEts         = 141,  //! < TrackedSniffer
    OBJECT_MOBILEfs         = 142,  //! < WingedSniffer
    OBJECT_MOBILEis         = 143,  //! < LeggedSniffer
    OBJECT_MOBILErt         = 200,  //! < Thumper
    OBJECT_MOBILErc         = 201,  //! < PhazerShooter
    OBJECT_MOBILErr         = 202,  //! < Recycler
    OBJECT_MOBILErs         = 203,  //! < Shielder
    OBJECT_MOBILEsa         = 210,  //! < Subber
    OBJECT_MOBILEtg         = 211,  //! < TargetBot
    OBJECT_MOBILEdr         = 212,  //! < Scribbler
    OBJECT_CONTROLLER       = 213,  //! < MissionController
    OBJECT_WAYPOINT         = 250,  //! < WayPoint
    OBJECT_FLAGb            = 260,  //! < BlueFlag
    OBJECT_FLAGr            = 261,  //! < RedFlag
    OBJECT_FLAGg            = 262,  //! < GreenFlag
    OBJECT_FLAGy            = 263,  //! < YellowFlag
    OBJECT_FLAGv            = 264,  //! < VioletFlag
    OBJECT_KEYa             = 270,  //! < KeyA
    OBJECT_KEYb             = 271,  //! < KeyB
    OBJECT_KEYc             = 272,  //! < KeyC
    OBJECT_KEYd             = 273,  //! < KeyD
    OBJECT_HUMAN            = 300,  //! < Me
    OBJECT_TOTO             = 301,  //! < Robby (toto)
    OBJECT_TECH             = 302,  //! < Tech
    OBJECT_BARRIER0         = 400,  //! < Barrier0
    OBJECT_BARRIER1         = 401,  //! < Barrier1
    OBJECT_BARRIER2         = 402,  //! < Barrier2
    OBJECT_BARRIER3         = 403,  //! < Barrier3
    OBJECT_MOTHER           = 500,  //! < AlienQueen
    OBJECT_EGG              = 501,  //! < AlienEgg
    OBJECT_ANT              = 502,  //! < AlienAnt
    OBJECT_SPIDER           = 503,  //! < AlienSpider
    OBJECT_BEE              = 504,  //! < AlienWasp
    OBJECT_WORM             = 505,  //! < AlienWorm
    OBJECT_RUINmobilew1     = 600,  //! < WreckBotw1
    OBJECT_RUINmobilew2     = 601,  //! < WreckBotw2
    OBJECT_RUINmobilet1     = 602,  //! < WreckBott1
    OBJECT_RUINmobilet2     = 603,  //! < WreckBott2
    OBJECT_RUINmobiler1     = 604,  //! < WreckBotr1
    OBJECT_RUINmobiler2     = 605,  //! < WreckBotr2
    OBJECT_RUINfactory      = 606,  //! < RuinBotFactory
    OBJECT_RUINdoor         = 607,  //! < RuinDoor
    OBJECT_RUINsupport      = 608,  //! < RuinSupport
    OBJECT_RUINradar        = 609,  //! < RuinRadar
    OBJECT_RUINconvert      = 610,  //! < RuinConvert
    OBJECT_RUINbase         = 611,  //! < RuinBaseCamp
    OBJECT_RUINhead         = 612,  //! < RuinHeadCamp
    OBJECT_TEEN0            = 620,  //! < Teen0
    OBJECT_TEEN1            = 621,  //! < Teen1
    OBJECT_TEEN2            = 622,  //! < Teen2
    OBJECT_TEEN3            = 623,  //! < Teen3
    OBJECT_TEEN4            = 624,  //! < Teen4
    OBJECT_TEEN5            = 625,  //! < Teen5
    OBJECT_TEEN6            = 626,  //! < Teen6
    OBJECT_TEEN7            = 627,  //! < Teen7
    OBJECT_TEEN8            = 628,  //! < Teen8
    OBJECT_TEEN9            = 629,  //! < Teen9
    OBJECT_TEEN10           = 630,  //! < Teen10
    OBJECT_TEEN11           = 631,  //! < Teen11
    OBJECT_TEEN12           = 632,  //! < Teen12
    OBJECT_TEEN13           = 633,  //! < Teen13
    OBJECT_TEEN14           = 634,  //! < Teen14
    OBJECT_TEEN15           = 635,  //! < Teen15
    OBJECT_TEEN16           = 636,  //! < Teen16
    OBJECT_TEEN17           = 637,  //! < Teen17
    OBJECT_TEEN18           = 638,  //! < Teen18
    OBJECT_TEEN19           = 639,  //! < Teen19
    OBJECT_TEEN20           = 640,  //! < Teen20
    OBJECT_TEEN21           = 641,  //! < Teen21
    OBJECT_TEEN22           = 642,  //! < Teen22
    OBJECT_TEEN23           = 643,  //! < Teen23
    OBJECT_TEEN24           = 644,  //! < Teen24
    OBJECT_TEEN25           = 645,  //! < Teen25
    OBJECT_TEEN26           = 646,  //! < Teen26
    OBJECT_TEEN27           = 647,  //! < Teen27
    OBJECT_TEEN28           = 648,  //! < Teen28
    OBJECT_TEEN29           = 649,  //! < Teen29
    OBJECT_TEEN30           = 650,  //! < Teen30
    OBJECT_TEEN31           = 651,  //! < Teen31
    OBJECT_TEEN32           = 652,  //! < Teen32
    OBJECT_TEEN33           = 653,  //! < Teen33
    OBJECT_TEEN34           = 654,  //! < Stone (Teen34)
    OBJECT_TEEN35           = 655,  //! < Teen35
    OBJECT_TEEN36           = 656,  //! < Teen36
    OBJECT_TEEN37           = 657,  //! < Teen37
    OBJECT_TEEN38           = 658,  //! < Teen38
    OBJECT_TEEN39           = 659,  //! < Teen39
    OBJECT_TEEN40           = 660,  //! < Teen40
    OBJECT_TEEN41           = 661,  //! < Teen41
    OBJECT_TEEN42           = 662,  //! < Teen42
    OBJECT_TEEN43           = 663,  //! < Teen43
    OBJECT_TEEN44           = 664,  //! < Teen44
    OBJECT_QUARTZ0          = 700,  //! < Quartz0
    OBJECT_QUARTZ1          = 701,  //! < Quartz1
    OBJECT_QUARTZ2          = 702,  //! < Quartz2
    OBJECT_QUARTZ3          = 703,  //! < Quartz3
    OBJECT_ROOT0            = 710,  //! < MegaStalk0
    OBJECT_ROOT1            = 711,  //! < MegaStalk1
    OBJECT_ROOT2            = 712,  //! < MegaStalk2
    OBJECT_ROOT3            = 713,  //! < MegaStalk3
    OBJECT_ROOT4            = 714,  //! < MegaStalk4
    OBJECT_ROOT5            = 715,  //! < MegaStalk5
    OBJECT_MUSHROOM1        = 731,  //! < Mushroom1
    OBJECT_MUSHROOM2        = 732,  //! < Mushroom2
    OBJECT_APOLLO1          = 900,  //! < ApolloLEM
    OBJECT_APOLLO2          = 901,  //! < ApolloJeep
    OBJECT_APOLLO3          = 902,  //! < ApolloFlag
    OBJECT_APOLLO4          = 903,  //! < ApolloModule
    OBJECT_APOLLO5          = 904,  //! < ApolloAntenna
    OBJECT_HOME1            = 910,  //! < Home

    OBJECT_MAX              = 1000  //! < number of values
};



// The father of all parts must always be the part number zero!

const int OBJECTMAXPART         = 40;
const int MAXCRASHSPHERE        = 40;
const int OBJECTMAXDESELLIST    = 10;
const int OBJECTMAXINFO         = 10;
const int OBJECTMAXCMDLINE      = 20;


enum ObjectMaterial
{
    OM_METAL   = 0,    // metal
    OM_PLASTIC = 1,    // plastic
    OM_HUMAN   = 2,    // cosmonaut
    OM_ANIMAL  = 3,    // insect
    OM_VEGETAL = 4,    // plant
    OM_MINERAL = 5,    // stone
};

enum DriveType
{
    DRIVE_OTHER = 0,
    DRIVE_WHEELED,
    DRIVE_TRACKED,
    DRIVE_WINGED,
    DRIVE_LEGGED,
};

enum ToolType
{
    TOOL_OTHER = 0,
    TOOL_GRABBER,
    TOOL_SNIFFER,
    TOOL_SHOOTER,
    TOOL_ORGASHOOTER,
};

struct ObjectPart
{
    char         bUsed;
    int          object;         // number of the object in CEngine
    int          parentPart;     // number of father part
    int          masterParti;        // master canal of the particle
    Math::Vector position;
    Math::Vector angle;
    Math::Vector zoom;
    char         bTranslate;
    char         bRotate;
    char         bZoom;
    Math::Matrix matTranslate;
    Math::Matrix matRotate;
    Math::Matrix matTransform;
    Math::Matrix matWorld;
};

struct Character
{
    float        wheelFront;     // position X of the front wheels
    float        wheelBack;      // position X of the back wheels
    float        wheelLeft;      // position Z of the left wheels
    float        wheelRight;     // position Z of the right wheels
    float        height;         // normal height on top of ground
    Math::Vector posPower;       // position of the battery
};

struct Info
{
    char  name[20];       // name of the information
    float value;          // value of the information
};

enum ExploType
{
    EXPLO_BOUM  = 1,
    EXPLO_BURN  = 2,
    EXPLO_WATER = 3,
};

enum ResetCap
{
    RESET_NONE   = 0,
    RESET_MOVE   = 1,
    RESET_DELETE = 2,
};

enum RadarFilter
{
    FILTER_NONE        = 0,
    FILTER_ONLYLANDING = 1,
    FILTER_ONLYFLYING  = 2,
};




class CObject
{
public:
    CObject();
    ~CObject();

    void        DeleteObject(bool bAll=false);
    void        Simplify();
    bool        ExploObject(ExploType type, float force, float decay=1.0f);

    bool        EventProcess(const Event &event);
    void        UpdateMapping();

    int         CreatePart();
    void        DeletePart(int part);
    void        SetObjectRank(int part, int objRank);
    int         GetObjectRank(int part);
    void        SetObjectParent(int part, int parent);
    void        SetType(ObjectType type);
    ObjectType  GetType();
    char*       GetName();
    void        SetOption(int option);
    int         GetOption();

    void        SetID(int id);
    int         GetID();

    bool        Write(char *line);
    bool        Read(char *line);

    void        SetDrawWorld(bool bDraw);
    void        SetDrawFront(bool bDraw);

    bool        CreateVehicle(Math::Vector pos, float angle, ObjectType type, float power, bool bTrainer, bool bToy);
    bool        CreateInsect(Math::Vector pos, float angle, ObjectType type);
    bool        CreateBuilding(Math::Vector pos, float angle, float height, ObjectType type, float power=1.0f);
    bool        CreateResource(Math::Vector pos, float angle, ObjectType type, float power=1.0f);
    bool        CreateFlag(Math::Vector pos, float angle, ObjectType type);
    bool        CreateBarrier(Math::Vector pos, float angle, float height, ObjectType type);
    bool        CreatePlant(Math::Vector pos, float angle, float height, ObjectType type);
    bool        CreateMushroom(Math::Vector pos, float angle, float height, ObjectType type);
    bool        CreateTeen(Math::Vector pos, float angle, float zoom, float height, ObjectType type);
    bool        CreateQuartz(Math::Vector pos, float angle, float height, ObjectType type);
    bool        CreateRoot(Math::Vector pos, float angle, float height, ObjectType type);
    bool        CreateHome(Math::Vector pos, float angle, float height, ObjectType type);
    bool        CreateRuin(Math::Vector pos, float angle, float height, ObjectType type);
    bool        CreateApollo(Math::Vector pos, float angle, ObjectType type);

    bool        ReadProgram(int rank, const char* filename);
    bool        WriteProgram(int rank, char* filename);
    bool        RunProgram(int rank);

    int         GetShadowLight();
    int         GetEffectLight();

    void        FlushCrashShere();
    int         CreateCrashSphere(Math::Vector pos, float radius, Sound sound, float hardness=0.45f);
    int         GetCrashSphereTotal();
    bool        GetCrashSphere(int rank, Math::Vector &pos, float &radius);
    float       GetCrashSphereHardness(int rank);
    Sound       GetCrashSphereSound(int rank);
    void        DeleteCrashSphere(int rank);
    void        SetGlobalSphere(Math::Vector pos, float radius);
    void        GetGlobalSphere(Math::Vector &pos, float &radius);
    void        SetJotlerSphere(Math::Vector pos, float radius);
    void        GetJotlerSphere(Math::Vector &pos, float &radius);
    void        SetShieldRadius(float radius);
    float       GetShieldRadius();

    void        SetFloorHeight(float height);
    void        FloorAdjust();

    void        SetLinVibration(Math::Vector dir);
    Math::Vector    GetLinVibration();
    void        SetCirVibration(Math::Vector dir);
    Math::Vector    GetCirVibration();
    void        SetInclinaison(Math::Vector dir);
    Math::Vector    GetInclinaison();

    void        SetPosition(int part, const Math::Vector &pos);
    Math::Vector    GetPosition(int part);
    void        SetAngle(int part, const Math::Vector &angle);
    Math::Vector    GetAngle(int part);
    void        SetAngleY(int part, float angle);
    void        SetAngleX(int part, float angle);
    void        SetAngleZ(int part, float angle);
    float       GetAngleY(int part);
    float       GetAngleX(int part);
    float       GetAngleZ(int part);
    void        SetZoom(int part, float zoom);
    void        SetZoom(int part, Math::Vector zoom);
    Math::Vector    GetZoom(int part);
    void        SetZoomX(int part, float zoom);
    float       GetZoomX(int part);
    void        SetZoomY(int part, float zoom);
    float       GetZoomY(int part);
    void        SetZoomZ(int part, float zoom);
    float       GetZoomZ(int part);

    float       GetWaterLevel();

    void        SetTrainer(bool bEnable);
    bool        GetTrainer();

    void        SetToy(bool bEnable);
    bool        GetToy();

    void        SetManual(bool bManual);
    bool        GetManual();

    void        SetResetCap(ResetCap cap);
    ResetCap    GetResetCap();
    void        SetResetBusy(bool bBusy);
    bool        GetResetBusy();
    void        SetResetPosition(const Math::Vector &pos);
    Math::Vector    GetResetPosition();
    void        SetResetAngle(const Math::Vector &angle);
    Math::Vector    GetResetAngle();
    void        SetResetRun(int run);
    int         GetResetRun();

    void        SetMasterParticle(int part, int parti);
    int         GetMasterParticle(int part);

    void        SetPower(CObject* power);
    CObject*    GetPower();
    void        SetFret(CObject* fret);
    CObject*    GetFret();
    void        SetTruck(CObject* truck);
    CObject*    GetTruck();
    void        SetTruckPart(int part);
    int         GetTruckPart();

    void        InfoFlush();
    void        DeleteInfo(int rank);
    void        SetInfo(int rank, Info info);
    Info        GetInfo(int rank);
    int         GetInfoTotal();
    void        SetInfoReturn(float value);
    float       GetInfoReturn();
    void        SetInfoUpdate(bool bUpdate);
    bool        GetInfoUpdate();

    bool        SetCmdLine(int rank, float value);
    float       GetCmdLine(int rank);

    Math::Matrix*   GetRotateMatrix(int part);
    Math::Matrix*   GetTranslateMatrix(int part);
    Math::Matrix*   GetTransformMatrix(int part);
    Math::Matrix*   GetWorldMatrix(int part);

    void        SetViewFromHere(Math::Vector &eye, float &dirH, float &dirV,
                                Math::Vector &lookat, Math::Vector &upVec,
                                Gfx::CameraType type);

    void        SetCharacter(Character* character);
    void        GetCharacter(Character* character);
    Character*  GetCharacter();

    float       GetAbsTime();

    void        SetEnergy(float level);
    float       GetEnergy();

    void        SetCapacity(float capacity);
    float       GetCapacity();

    void        SetShield(float level);
    float       GetShield();

    void        SetRange(float delay);
    float       GetRange();

    void        SetTransparency(float value);
    float       GetTransparency();

    ObjectMaterial GetMaterial();

    void        SetGadget(bool bMode);
    bool        GetGadget();

    void        SetFixed(bool bFixed);
    bool        GetFixed();

    void        SetClip(bool bClip);
    bool        GetClip();

    bool        JostleObject(float force);

    void        StartDetectEffect(CObject *target, bool bFound);

    void        SetVirusMode(bool bEnable);
    bool        GetVirusMode();
    float       GetVirusTime();

    void        SetCameraType(Gfx::CameraType type);
    Gfx::CameraType  GetCameraType();
    void        SetCameraDist(float dist);
    float       GetCameraDist();
    void        SetCameraLock(bool bLock);
    bool        GetCameraLock();

    void        SetHilite(bool bMode);
    bool        GetHilite();

    void        SetSelect(bool bMode, bool bDisplayError=true);
    bool        GetSelect(bool bReal=false);

    void        SetSelectable(bool bMode);
    bool        GetSelectable();

    void        SetActivity(bool bMode);
    bool        GetActivity();

    void        SetVisible(bool bVisible);
    bool        GetVisible();

    void        SetEnable(bool bEnable);
    bool        GetEnable();

    void        SetCheckToken(bool bMode);
    bool        GetCheckToken();

    void        SetProxyActivate(bool bActivate);
    bool        GetProxyActivate();
    void        SetProxyDistance(float distance);
    float       GetProxyDistance();

    void        SetMagnifyDamage(float factor);
    float       GetMagnifyDamage();

    void        SetParam(float value);
    float       GetParam();
    
    void        SetIgnoreBuildCheck(bool bIgnoreBuildCheck);
    bool        GetIgnoreBuildCheck();

    void        SetExplo(bool bExplo);
    bool        GetExplo();
    void        SetLock(bool bLock);
    bool        GetLock();
    void        SetCargo(bool bCargo);
    bool        GetCargo();
    void        SetBurn(bool bBurn);
    bool        GetBurn();
    void        SetDead(bool bDead);
    bool        GetDead();
    bool        GetRuin();
    bool        GetActif();

    void        SetGunGoalV(float gunGoal);
    void        SetGunGoalH(float gunGoal);
    float       GetGunGoalV();
    float       GetGunGoalH();

    bool        StartShowLimit();
    void        StopShowLimit();

    bool        IsProgram();
    void        CreateSelectParticle();

    void        SetRunScript(CScript* script);
    CScript*    GetRunScript();
    CBotVar*    GetBotVar();
    CPhysics*   GetPhysics();
    CBrain*     GetBrain();
    CMotion*    GetMotion();
    CAuto*      GetAuto();
    void        SetAuto(CAuto* automat);

    void        SetDefRank(int rank);
    int         GetDefRank();

    bool        GetTooltipName(std::string& name);

    void        AddDeselList(CObject* pObj);
    CObject*    SubDeselList();
    void        DeleteDeselList(CObject* pObj);

    bool        CreateShadowCircle(float radius, float intensity, Gfx::EngineShadowType type = Gfx::ENG_SHADOW_NORM);
    bool        CreateShadowLight(float height, Gfx::Color color);
    bool        CreateEffectLight(float height, Gfx::Color color);

    void        FlatParent();

    bool        GetTraceDown();
    void        SetTraceDown(bool bDown);
    int         GetTraceColor();
    void        SetTraceColor(int color);
    float       GetTraceWidth();
    void        SetTraceWidth(float width);

    std::string GetModelDirName();
    
    static DriveType GetDriveFromObject(ObjectType type);
    static ToolType  GetToolFromObject(ObjectType type);

protected:
    bool        EventFrame(const Event &event);
    void        VirusFrame(float rTime);
    void        PartiFrame(float rTime);
    void        CreateOtherObject(ObjectType type);
    void        InitPart(int part);
    void        UpdateTotalPart();
    int         SearchDescendant(int parent, int n);
    void        UpdateEnergyMapping();
    bool        UpdateTransformObject(int part, bool bForceUpdate);
    bool        UpdateTransformObject();
    void        UpdateSelectParticle();

protected:
    CApplication*       m_app;
    Gfx::CEngine*       m_engine;
    Gfx::CLightManager* m_lightMan;
    Gfx::CTerrain*      m_terrain;
    Gfx::CWater*        m_water;
    Gfx::CCamera*       m_camera;
    Gfx::CParticle*     m_particle;
    CPhysics*           m_physics;
    CBrain*             m_brain;
    CMotion*            m_motion;
    CAuto*              m_auto;
    CRobotMain*         m_main;
    CSoundInterface*    m_sound;
    CBotVar*            m_botVar;
    CScript*            m_runScript;

    ObjectType  m_type;             // OBJECT_*
    int     m_id;               // unique identifier
    char        m_name[50];         // name of the object
    Character   m_character;            // characteristic
    int     m_option;           // option
    int     m_partiReactor;         // number of the particle of the reactor
    int     m_shadowLight;          // number of light from the shadows
    float       m_shadowHeight;         // height of light from the shadows
    int     m_effectLight;          // number of light effects
    float       m_effectHeight;         // height of light effects
    Math::Vector    m_linVibration;         // linear vibration
    Math::Vector    m_cirVibration;         // circular vibration
    Math::Vector    m_inclinaison;          // tilt
    CObject*    m_power;            // battery used by the vehicle
    CObject*    m_fret;             // object transported
    CObject*    m_truck;            // object with the latter
    int     m_truckLink;            // part
    float       m_energy;           // energy contained (if battery)
    float       m_lastEnergy;
    float       m_capacity;         // capacity (if battery)
    float       m_shield;           // shield
    float       m_range;            // flight range
    float       m_transparency;         // transparency (0..1)
    int     m_material;         // matter(0..n)
    float       m_aTime;
    float       m_shotTime;         // time since last shot
    bool        m_bVirusMode;           // virus activated/triggered
    float       m_virusTime;            // lifetime of the virus
    float       m_lastVirusParticle;
    float       m_lastParticle;
    bool        m_bHilite;
    bool        m_bSelect;          // object selected
    bool        m_bSelectable;          // selectable object
    bool        m_bCheckToken;          // object with audited tokens
    bool        m_bVisible;         // object active but undetectable
    bool        m_bEnable;          // dead object
    bool        m_bProxyActivate;       // active object so close
    bool        m_bGadget;          // object nonessential
    bool        m_bLock;
    bool        m_bExplo;
    bool        m_bCargo;
    bool        m_bBurn;
    bool        m_bDead;
    bool        m_bFlat;
    bool        m_bTrainer;         // drive vehicle (without remote)
    bool        m_bToy;             // toy key
    bool        m_bManual;          // manual control (Scribbler)
    bool        m_bIgnoreBuildCheck;
    bool        m_bFixed;
    bool        m_bClip;
    bool        m_bShowLimit;
    float       m_showLimitRadius;
    float       m_gunGoalV;
    float       m_gunGoalH;
    Gfx::CameraType  m_cameraType;
    float       m_cameraDist;
    bool        m_bCameraLock;
    int         m_defRank;
    float       m_magnifyDamage;
    float       m_proxyDistance;
    float       m_param;

    int         m_crashSphereUsed;  // number of spheres used
    Math::Vector    m_crashSpherePos[MAXCRASHSPHERE];
    float       m_crashSphereRadius[MAXCRASHSPHERE];
    float       m_crashSphereHardness[MAXCRASHSPHERE];
    Sound       m_crashSphereSound[MAXCRASHSPHERE];
    Math::Vector    m_globalSpherePos;
    float       m_globalSphereRadius;
    Math::Vector    m_jotlerSpherePos;
    float       m_jotlerSphereRadius;
    float       m_shieldRadius;

    int         m_totalPart;
    ObjectPart  m_objectPart[OBJECTMAXPART];

    int         m_totalDesectList;
    CObject*    m_objectDeselectList[OBJECTMAXDESELLIST];

    int         m_partiSel[4];

    ResetCap    m_resetCap;
    bool        m_bResetBusy;
    Math::Vector    m_resetPosition;
    Math::Vector    m_resetAngle;
    int         m_resetRun;

    int         m_infoTotal;
    Info        m_info[OBJECTMAXINFO];
    float       m_infoReturn;
    bool        m_bInfoUpdate;

    float       m_cmdLine[OBJECTMAXCMDLINE];
};