Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/playability/src/world_entities/space_ships/space_ship.cc @ 10306

Last change on this file since 10306 was 10306, checked in by muellmic, 17 years ago

the percentage of the width of the screen, that the player can use for his movement can now correctly been handled by the spaceship, also within the script. the value is called 'actionWidthPercentage' btw. (yeah i know the name is horrible ). anyway it also changes the width of the hud-sidebars. its still a bit buggy tough, how it places the hud-elements with a too-small sidebar. i have to find a new solution for this.

File size: 34.8 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11### File Specific:
12   main-programmer: Benjamin Knecht
13   co-programmer: Silvan Nellen
14
15*/
16
17#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD_ENTITY
18
19#include "executor/executor.h"
20#include "space_ship.h"
21
22#include "util/loading/resource_manager.h"
23
24#include "weapons/test_gun.h"
25#include "weapons/light_blaster.h"
26#include "weapons/medium_blaster.h"
27#include "weapons/heavy_blaster.h"
28#include "weapons/swarm_launcher.h"
29#include "weapons/spike_launcher.h"
30#include "weapons/spike_thrower.h"
31#include "weapons/acid_launcher.h"
32#include "weapons/boomerang_gun.h"
33#include "weapons/turret.h"
34#include "weapons/cannon.h"
35
36#include "elements/glgui_energywidgetvertical.h"
37#include "glgui_bar.h"
38
39#include "particles/dot_emitter.h"
40#include "particles/emitter_node.h"
41#include "particles/sprite_particles.h"
42#include "effects/trail.h"
43
44#include "effects/wobblegrid.h"
45
46#include "util/loading/factory.h"
47#include "key_mapper.h"
48
49#include "network_game_manager.h"
50#include "shared_network_data.h"
51
52#include "power_ups/weapon_power_up.h"
53#include "power_ups/param_power_up.h"
54
55#include "graphics_engine.h"
56
57#include "plane.h"
58
59#include "state.h"
60#include "player.h"
61#include "camera.h"
62
63
64#include "util/loading/load_param.h"
65#include "time.h"
66
67#include "track/track.h"
68#include "math.h"
69
70
71// #include "lib/gui/gl_gui/glgui_bar.h"
72// #include "lib/gui/gl_gui/glgui_pushbutton.h"
73
74
75#include "class_id_DEPRECATED.h"
76ObjectListDefinitionID(SpaceShip, CL_SPACE_SHIP);
77CREATE_FACTORY(SpaceShip);
78
79#include "script_class.h"
80CREATE_SCRIPTABLE_CLASS(SpaceShip,
81                        addMethod("hasPlayer", Executor0ret<Playable, lua_State*,bool>(&Playable::hasPlayer))
82                        ->addMethod("fire", Executor1<Playable, lua_State*, bool>(&Playable::fire))
83                        ->addMethod("loadModel", Executor2<WorldEntity, lua_State*,const std::string& ,float>(&WorldEntity::loadModel2))
84                        ->addMethod("setName", Executor1<BaseObject, lua_State*,const std::string&>(&BaseObject::setName))
85                        ->addMethod("hide", Executor0<WorldEntity, lua_State*>(&WorldEntity::hide))
86                        ->addMethod("unhide", Executor0<WorldEntity, lua_State*>(&WorldEntity::unhide))
87                        //Coordinates
88                        ->addMethod("setAbsCoor", Executor3<PNode, lua_State*,float,float,float>(&PNode::setAbsCoor))
89                        ->addMethod("getAbsCoorX", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorX))
90                        ->addMethod("getAbsCoorY", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorY))
91                        ->addMethod("getAbsCoorZ", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorZ))
92                        //->addMethod("setCameraSpeed", Executor1<SpaceShip, lua_State*, float>(&SpaceShip::setCameraSpeed))
93                       );
94
95/**
96 *  destructs the spaceship, deletes alocated memory
97 */
98SpaceShip::~SpaceShip ()
99{
100  this->setPlayer(NULL);
101}
102
103/**
104 * loads a Spaceships information from a specified file.
105 * @param fileName the name of the File to load the spaceship from (absolute path)
106 */
107SpaceShip::SpaceShip(const std::string& fileName)
108    : secWeaponMan(this) //,
109    //supportedPlaymodes(Playable::Vertical) ,
110    //playmode(Playable::Vertical)
111{
112  this->init();
113  TiXmlDocument doc(fileName);
114
115  if(!doc.LoadFile())
116  {
117    PRINTF(2)("Loading file %s failed for spaceship.\n", fileName.c_str());
118    return;
119  }
120
121  this->loadParams(doc.RootElement());
122}
123
124/**
125 *  creates a new Spaceship from Xml Data
126 * @param root the xml element containing spaceship data
127
128   @todo add more parameters to load
129*/
130SpaceShip::SpaceShip(const TiXmlElement* root)
131    : secWeaponMan(this) //,
132    //supportedPlaymodes(Playable::Vertical) ,
133    //playmode(Playable::Vertical)
134{
135  this->init();
136  //this->setParentMode(PNODE_REPARENT_DELETE_CHILDREN);
137  if (root != NULL)
138    this->loadParams(root);
139
140}
141
142
143/**
144 * initializes a Spaceship
145 */
146void SpaceShip::init()
147{
148
149  srand(time(0));   //initialize Random Nomber Generator
150
151  //  this->setRelDir(Quaternion(M_PI, Vector(1,0,0)));
152  this->registerObject(this, SpaceShip::_objectList);
153  PRINTF(4)("SPACESHIP INIT\n");
154  this->weaponMan.setParentEntity( this);
155  //weapons:
156 
157  Weapon* wpRight1 = new LightBlaster ();
158  wpRight1->setName( "LightBlaster");
159  Weapon* wpLeft1 = new LightBlaster ();
160  wpLeft1->setName( "LightBlaster");
161
162  Weapon* wpRight2 = new MediumBlaster ();
163  wpRight2->setName( "MediumBlaster");
164  Weapon* wpLeft2 = new MediumBlaster ();
165  wpLeft2->setName( "MediumBlaster");
166
167  Weapon* wpRight3 = new HeavyBlaster (1);
168  wpRight3->setName( "HeavyBlaster");
169  Weapon* wpLeft3 = new HeavyBlaster (0);
170  wpLeft3->setName( "HeavyBlaster");
171
172  Weapon* cannon = new SwarmLauncher();
173  cannon->setName( "SwarmLauncher");
174
175  Weapon* spike = new SpikeThrower();
176  spike->setName( "SpikeThrower" );
177
178//  Weapon* spike2 = new SpikeLauncher();
179//  spike2->setName( "SpikeLauncher" );
180
181  Weapon* acid0 = new AcidLauncher();
182  acid0->setName( "AcidSplasher" );
183
184  Weapon* acid1 = new AcidLauncher();
185  acid1->setName( "AcidSplasher" );
186
187  this->weaponMan.addWeapon( wpLeft1, 0, 0);
188  this->weaponMan.addWeapon( wpRight1, 0, 1);
189
190  this->weaponMan.addWeapon( wpLeft2, 1, 2);
191  this->weaponMan.addWeapon( wpRight2, 1, 3);
192
193  this->weaponMan.addWeapon( wpLeft3, 2, 4);
194  this->weaponMan.addWeapon( wpRight3, 2, 5);
195
196  this->weaponMan.addWeapon( wpLeft1, 3, 0);
197  this->weaponMan.addWeapon( wpRight1, 3, 1);
198
199  this->weaponMan.addWeapon( wpLeft2, 3, 2);
200  this->weaponMan.addWeapon( wpRight2, 3, 3);
201
202  this->weaponMan.addWeapon( wpLeft3, 3, 4);
203  this->weaponMan.addWeapon( wpRight3, 3, 5);
204
205  this->weaponMan.addWeapon( acid0, 0, 6);
206  this->weaponMan.addWeapon( acid1, 0, 7);
207
208  this->secWeaponMan.addWeapon( cannon, 0, 2);
209  this->secWeaponMan.addWeapon( spike, 1, 3);
210//   this->secWeaponMan.addWeapon( acid0, 2, 2);
211//   this->secWeaponMan.addWeapon( acid1, 2, 3);
212
213
214  this->weaponMan.changeWeaponConfig(0);
215  this->secWeaponMan.changeWeaponConfig(1);
216
217  curWeaponPrimary    = 3;
218  curWeaponSecondary  = 0;
219
220  Playable::weaponConfigChanged();
221
222  reactorOutput     = 10;
223
224  weaponEnergyRegen = 10;       // 10 einheiten pro Sekunde
225  engineSpeedBase   = 5;
226  shieldRegen       = 2;
227
228  shieldEnergyShare = 0.3;
229  weaponEnergyShare = 0.3;
230  engineEnergyShare = 0.4;
231
232  shieldCur         = 20;
233  shieldMax         = 100;
234  shieldTH          = .2 * shieldMax;   // shield power must be 20% before shield kicks in again
235
236  this->setHealth( 20);
237  this->setHealthMax( 100);
238
239  electronicCur = 50;
240  electronicMax = 50;
241  electronicRegen   = 3;
242  electronicTH      = .7 * electronicMax; // 30% of eDamage can be handled by the ship
243
244
245  this->loadModel("models/ships/mantawing.obj");
246  //this->setVisibiliy(false);
247
248  bForward = bBackward = bLeft = bRight = bAscend = bDescend = bRollL = bRollR = bFire = bSecFire = false;
249
250  this->setHealthMax(shieldMax);
251  this->setHealth(shieldCur);
252
253  this->travelNode = new PNode();
254
255  // camera - issue
256  this->cameraNode.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
257  this->cameraNode.addNodeFlags(PNODE_PROHIBIT_CHILD_DELETE);
258
259  // widget handling
260  /*
261  this->electronicWidget = new OrxGui::GLGuiEnergyWidgetVertical();
262  this->electronicWidget->setDisplayedName(std::string(this->getClassName()) + " Electronics:");
263  this->electronicWidget->setSize2D(30,400);
264  this->electronicWidget->setAbsCoor2D(150,200);
265  this->electronicWidget->shiftDir2D(270);
266  this->updateElectronicWidget();
267  this->shieldWidget = new OrxGui::GLGuiEnergyWidgetVertical();
268  this->shieldWidget->setDisplayedName(std::string(this->getClassName()) + " Shield:");
269  this->shieldWidget->setSize2D(30,400);
270  this->shieldWidget->setAbsCoor2D(200,200);
271  this->shieldWidget->shiftDir2D(270);
272  this->updateShieldWidget();
273  if (this->hasPlayer())
274  {
275    State::getPlayer()->hud().setShiledWidget(this->shieldWidget);
276    State::getPlayer()->hud().setEnergyWidget(this->electronicWidget);
277  }
278  */
279  this->electronicWidget = NULL;
280  this->shieldWidget = NULL;
281
282  //add events to the eventlist
283  registerEvent(KeyMapper::PEV_FORWARD);
284  registerEvent(KeyMapper::PEV_BACKWARD);
285  registerEvent(KeyMapper::PEV_LEFT);
286  registerEvent(KeyMapper::PEV_RIGHT);
287  //registerEvent(SDLK_q);
288  //registerEvent(SDLK_e);
289  registerEvent(KeyMapper::PEV_FIRE1);
290  registerEvent(KeyMapper::PEV_FIRE2);                  // Added for secondary weapon support
291  registerEvent(KeyMapper::PEV_NEXT_WEAPON);
292  registerEvent(KeyMapper::PEV_PREVIOUS_WEAPON);
293  //registerEvent(SDLK_PAGEUP);
294  //registerEvent(SDLK_PAGEDOWN);
295  registerEvent(EV_MOUSE_MOTION);
296
297  this->weaponMan.setParentEntity( this);
298  this->secWeaponMan.setParentEntity( this);
299
300  this->weaponMan.setSlotCount(8);
301
302  this->weaponMan.setSlotPosition(0, Vector(0.0, 0, -3.0));
303  this->weaponMan.setSlotCapability(0, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
304
305  this->weaponMan.setSlotPosition(1, Vector(0.0, 0, 3.0));
306  this->weaponMan.setSlotCapability(1, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
307
308  this->weaponMan.setSlotPosition(2, Vector(1.0, 0, -1.5));
309  this->weaponMan.setSlotDirection(2, Quaternion(-M_PI_4*.5, Vector(1,0,0)));
310
311  this->weaponMan.setSlotPosition(3, Vector(1.0, 0, 1.5));
312  this->weaponMan.setSlotDirection(3, Quaternion(M_PI_4*.5, Vector(1,0,0)));
313
314  this->weaponMan.setSlotPosition(4, Vector(1.5, 0, .5));
315  this->weaponMan.setSlotDirection(4, Quaternion(-M_PI_4*.5+M_PI, Vector(1,0,0)));
316
317  this->weaponMan.setSlotPosition(5, Vector(1.5, 0, -.5));
318  this->weaponMan.setSlotDirection(5, Quaternion(+M_PI_4*.5-M_PI, Vector(1,0,0)));
319
320  this->weaponMan.setSlotPosition(6, Vector(0.5, 0, 2.5));
321  this->weaponMan.setSlotDirection(6, Quaternion(-M_PI_4*.5+M_PI, Vector(1,0,0)));
322
323  this->weaponMan.setSlotPosition(7, Vector(0.5, 0, -2.5));
324  this->weaponMan.setSlotDirection(7, Quaternion(+M_PI_4*.5-M_PI, Vector(1,0,0)));
325
326  this->secWeaponMan.setSlotCount(6);
327
328  this->secWeaponMan.setSlotPosition(0, Vector(1.5, 0, 0));
329  this->secWeaponMan.setSlotCapability(0, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
330
331  this->secWeaponMan.setSlotPosition(1, Vector(2.6, 0, 3.0));
332  this->secWeaponMan.setSlotCapability(1, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
333
334  this->secWeaponMan.setSlotPosition(2, Vector(1.5, 0, -.5));
335  this->secWeaponMan.setSlotDirection(2, Quaternion(-M_PI_4*.5, Vector(1,0,0)));
336
337  this->secWeaponMan.setSlotPosition(3, Vector(1.5, 0, .5));
338  this->secWeaponMan.setSlotDirection(3, Quaternion(M_PI_4*.5, Vector(1,0,0)));
339
340  this->secWeaponMan.setSlotPosition(4, Vector(1.5, 0, .5));
341  this->secWeaponMan.setSlotDirection(4, Quaternion(-M_PI_4*.5+M_PI, Vector(1,0,0)));
342
343  this->secWeaponMan.setSlotPosition(5, Vector(1.5, 0, -.5));
344  this->secWeaponMan.setSlotDirection(5, Quaternion(+M_PI_4*.5-M_PI, Vector(1,0,0)));
345
346
347  this->weaponMan.getFixedTarget()->setParent(this);
348  this->weaponMan.getFixedTarget()->setRelCoor(100000,0,0);
349
350 
351  this->secWeaponMan.getFixedTarget()->setParent(this);
352  this->secWeaponMan.getFixedTarget()->setRelCoor(100000,0,0);
353  this->secWeaponMan.setRotationSpeed(0);
354
355  dynamic_cast<Element2D*>(this->weaponMan.getFixedTarget())->setVisibility( false);
356
357
358  registerVar( new SynchronizeableBool( &bForward, &bForward, "bForward", PERMISSION_OWNER ) );
359  registerVar( new SynchronizeableBool( &bBackward, &bBackward, "bBackward", PERMISSION_OWNER ) );
360  registerVar( new SynchronizeableBool( &bLeft, &bLeft, "bLeft", PERMISSION_OWNER ) );
361  registerVar( new SynchronizeableBool( &bRight, &bRight, "bRight", PERMISSION_OWNER ) );
362  registerVar( new SynchronizeableFloat( &cameraLook, &cameraLook, "cameraLook", PERMISSION_OWNER ) );
363  registerVar( new SynchronizeableFloat( &rotation, &rotation, "rotation", PERMISSION_OWNER ) );
364  registerVar( new SynchronizeableBool( &bFire, &bFire, "bSecFire", PERMISSION_OWNER));
365  registerVar( new SynchronizeableVector( &velocity, &velocity, "velocity", PERMISSION_MASTER_SERVER ) );
366
367  //this->airFriction = 0.5f;
368  //this->travelDistancePlus = Vector2D(38.0, 43.0);
369  //this->travelDistanceMinus = Vector2D(-38.0, -43.0);
370  this->travelDistancePlus = Vector2D(0,0);
371  this->travelDistancePlus = Vector2D(0,0);
372  this->isTravelDistanceInit = false;
373  this->actionWidthPercentage = 1;
374
375  this->cameraSpeed = 40;
376  this->cameraLook = 0.0f;
377  //this->airFriction = 0.0f;
378
379  srand(time(0));  //initaialize RNG
380
381  this->travelNode->debugDraw();
382
383  this->setSupportedPlaymodes(Playable::Horizontal | Playable::Vertical);
384
385  /// FIXME
386  this->trail = new Trail( 5, 10, .2, this);
387  this->trail->setTexture( "maps/engine.png");
388
389  this->trailL = new Trail( 5, 10, .2, this);
390  this->trailL->setTexture( "maps/engine.png");
391
392  this->trailR = new Trail( 5, 10, .2, this);
393  this->trailR->setTexture( "maps/engine.png");
394
395
396  this->toList(OM_GROUP_00);
397
398  //FIXME Just testaddition to show the wobblegrid
399/*
400  this->test  = new Wobblegrid(5);
401  test->setTexture("maps/blub.png");
402 
403  test->setAbsCoor( this->getAbsCoor() + Vector(0, 2, 0));
404  test->setParent( this);
405*/
406 
407}
408
409
410/**
411 * loads the Settings of a SpaceShip from an XML-element.
412 * @param root the XML-element to load the Spaceship's properties from
413 */
414void SpaceShip::loadParams(const TiXmlElement* root)
415{
416  Playable::loadParams(root);
417
418  LoadParam(root, "playmode", this, SpaceShip, setPlaymodeXML);
419  LoadParam(root, "cameraDistance", this, SpaceShip, setCameraDistance);
420  LoadParam(root, "cameraFovy", this, SpaceShip, setCameraFovy);
421  LoadParam(root, "actionWidthPercentage", this, SpaceShip, setActionWidthPercentage);
422
423  State::getCamera()->setViewMode(Camera::ViewTop);
424}
425
426
427void SpaceShip::setPlayDirection(const Quaternion& rot, float speed)
428{
429  //this->direction = Quaternion (rot.getHeading(), Vector(0,1,0));
430}
431
432void SpaceShip::reset()
433{
434  bForward = bBackward = bLeft = bRight = bAscend = bDescend = bRollL = bRollR = bFire = bSecFire = false;
435
436  //xMouse = yMouse = 0;
437
438  this->setHealth(80);
439  this->velocity = Vector(0.0, 0.0, 0.0);
440}
441
442
443void SpaceShip::enter()
444{
445  this->secWeaponMan.showCrosshair();
446  this->toList( OM_GROUP_01 );
447  State::getPlayer()->hud().setRadarCenterNode(this->travelNode);
448  State::getPlayer()->hud().setOverlayActive(true);
449  //dynamic_cast <OrxGui::GLGuiEnergyWidgetVertical*> (State::getPlayer()->hud().getArmorWidget())->setDisplayedName("Armor");
450  //dynamic_cast<Element2D*>(this->secWeaponMan.getFixedTarget())->setVisibility( true);
451  //this->attachCamera();
452 // this->setPlaymode(Playable::Horizontal);
453}
454
455void SpaceShip::leave()
456{
457  this->secWeaponMan.hideCrosshair();
458  this->toList( OM_GROUP_00);
459  State::getPlayer()->hud().setOverlayActive(false);
460  State::getCamera()->setEventHandling(true);
461  State::getPlayer()->hud().setRadarCenterNode(NULL);
462  //dynamic_cast<Element2D*>(this->secWeaponMan.getFixedTarget())->setVisibility( false);
463  //this->detachCamera();
464}
465
466
467/**
468 *  effect that occurs after the SpaceShip is spawned
469*/
470void SpaceShip::postSpawn ()
471{
472  if(this->hasPlayer())
473    Playable::postSpawn();
474
475  //setCollision(new CollisionCluster(1.0, Vector(0,0,0)));
476}
477
478/**
479 *  the action occuring if the spaceship left the game
480*/
481void SpaceShip::leftWorld ()
482{
483
484}
485
486WorldEntity* ref = NULL;
487
488/**
489 *  draws the spaceship after transforming it.
490*/
491void SpaceShip::draw () const
492{
493  WorldEntity::draw();
494
495  glMatrixMode(GL_MODELVIEW);
496  glPushMatrix();
497
498  float matrix[4][4];
499  glTranslatef (this->getAbsCoor ().x-1, this->getAbsCoor ().y-.2, this->getAbsCoor ().z);
500  this->getAbsDir().matrix (matrix);
501  glMultMatrixf((float*)matrix);
502  //glScalef(2.0, 2.0, 2.0);  // no double rescale
503        // FIXME
504  this->trail->draw();
505 
506  glTranslatef(0,0,-.5);
507  this->trailL->draw();
508
509  glTranslatef(0,0,1);
510  this->trailR->draw();
511
512  glPopMatrix();
513  //this->debug(0);
514}
515
516/**
517 *  the function called for each passing timeSnap
518 * @param time The timespan passed since last update
519*/
520void SpaceShip::tick (float time)
521{
522  // Playable::tick(time);
523
524 // this->test->tick(time);
525
526  // Own Tick Setup, as a different fire routine is used on the weapon manager
527  this->weaponMan.tick(time);
528  this->secWeaponMan.tick(time);
529
530  if( this->systemFailure() )
531    bFire = bSecFire = false;
532
533  // fire reqeust/release for primary weapons
534  if( this->bFire)
535    this->weaponMan.fire();
536  else
537    this->weaponMan.releaseFire();
538
539  // fire reqeust/release for secondary weapons
540  if( this->bSecFire)
541    this->secWeaponMan.fire();
542  else
543    this->secWeaponMan.releaseFire();
544   
545  // Tracktick
546  if(this->entityTrack)
547    this->entityTrack->tick(time);
548
549
550  // Shield Regeneration and other regular calculations on the ship
551  this->regen(time);
552
553  // Weapon Regeneration and other regular calculations on the ship
554  this->weaponRegen(time);
555
556  // current engine speed output
557  this->engineSpeedCur = this->engineSpeedBase + this->reactorOutput * this->engineEnergyShare;
558
559  // calculation of maxSpeed and acceleration:
560  this->travelSpeed = this->engineSpeedCur * 5;
561  this->acceleration = this->travelSpeed * 2;
562
563  this->movement(time);
564
565   // TRYING TO FIX PNode.
566  this->cameraNode.setAbsCoorSoft(this->getAbsCoor() + Vector(0.0f, 5.0f, 0.0f), 30.0f);
567  this->cameraNode.setRelDirSoft(this->getAbsDir(), 30.0f);
568
569 
570  this->velocity  = (this->getAbsCoor() - this->oldPos) / time;
571  this->oldPos    = this->getAbsCoor();
572
573//FIXME
574  this->trail->tick(time);
575  this->trailL->tick(time);
576  this->trailR->tick(time);
577
578  if (!this->isTravelDistanceInit)
579  {
580    this->updateTravelDistance();
581    //this->isTravelDistanceInit = true;
582  }
583
584  //orient the spaceship in direction of the mouse
585  /*
586  rotQuat = Quaternion::quatSlerp( this->getAbsDir(), mouseDir, 0.5);//fabsf(time)*shipInertia);
587  if (this->getAbsDir().distance(rotQuat) > 0.00000000000001)
588    this->setAbsDir( rotQuat);
589  //this->setAbsDirSoft(mouseDir,5);
590  */
591  /*
592  this->shiftCoor(move);
593  */
594
595  //   PRINTF(0)("id of %s is: %i\n", this->getName(), this->getOMListNumber());
596
597}
598
599/**
600 * @todo switch statement ??
601 */
602void SpaceShip::process(const Event &event)
603{
604  //Playable::process(event);
605 
606  if( event.type == KeyMapper::PEV_LEFT)
607    this->bLeft = event.bPressed;
608  else if( event.type == KeyMapper::PEV_RIGHT)
609  {
610    this->bRight = event.bPressed;
611    printf("ShipCoorX: %f \n", this->getRelCoor().x);
612  }
613  else if( event.type == KeyMapper::PEV_FORWARD)
614  {
615    this->bForward = event.bPressed; //this->shiftCoor(0,.1,0);
616   
617  }
618  else if( event.type == KeyMapper::PEV_BACKWARD)
619    this->bBackward = event.bPressed; //this->shiftCoor(0,-.1,0);
620  else if( event.type == KeyMapper::PEV_FIRE2)
621    this->bSecFire = event.bPressed;
622  else if( event.type == KeyMapper::PEV_FIRE1)
623    this->bFire = event.bPressed;
624  else if( event.type == KeyMapper::PEV_NEXT_WEAPON && event.bPressed)
625  {
626    this->nextWeaponConfig();
627  }
628  else if ( event.type == KeyMapper::PEV_PREVIOUS_WEAPON && event.bPressed)
629    this->previousWeaponConfig();
630
631  if (!(State::getCamera()->getEventHandling()))
632  {
633    if( event.type == KeyMapper::PEV_VIEW0)
634    {
635      State::getCamera()->setViewMode(Camera::ViewNormal);
636      State::getCameraTargetNode()->setParent(this);
637      State::getCamera()->setParent(this);
638    }
639    else if( event.type == KeyMapper::PEV_VIEW1)
640    {
641      State::getCamera()->setViewMode(Camera::ViewBehind);
642      State::getCameraTargetNode()->setParent(this);
643      State::getCamera()->setParent(this);
644    }
645    else if( event.type == KeyMapper::PEV_VIEW2)
646    {
647      State::getCamera()->setViewMode(Camera::ViewFront);
648      State::getCameraTargetNode()->setParent(this);
649      State::getCamera()->setParent(this);
650    }
651    else if( event.type == KeyMapper::PEV_VIEW3)
652    {
653      State::getCamera()->setViewMode(Camera::ViewLeft);
654      State::getCameraTargetNode()->setParent(this);
655      State::getCamera()->setParent(this);
656    }
657    else if( event.type == KeyMapper::PEV_VIEW4)
658    {
659      State::getCamera()->setViewMode(Camera::ViewRight);
660      State::getCameraTargetNode()->setParent(this);
661      State::getCamera()->setParent(this);
662    }
663    else if( event.type == KeyMapper::PEV_VIEW5)
664    {
665      State::getCamera()->setViewMode(Camera::ViewTop);
666      State::getCameraTargetNode()->setParent(this->travelNode);
667      State::getCamera()->setParent(this->travelNode);
668    }
669  }
670
671
672  /*
673  else if( event.type == EV_MOUSE_MOTION)
674  {
675
676    this->xMouse += event.xRel;
677    this->yMouse += event.yRel;
678  }
679  */
680}
681
682void SpaceShip::destroy( WorldEntity* killer )
683{
684  if(this->hasPlayer())
685    Playable::destroy( killer);
686
687  PRINTF(5)("spaceship destroy\n");
688
689  EmitterNode* node  = NULL;
690  DotEmitter* emitter = NULL;
691  SpriteParticles*  explosionParticles  = NULL;
692
693  explosionParticles = new SpriteParticles(200);
694  explosionParticles->setName("SpaceShipExplosionParticles");
695  explosionParticles->setLifeSpan(.2, .3);
696  explosionParticles->setRadius(0.0, 10.0);
697  explosionParticles->setRadius(.5, 6.0);
698  explosionParticles->setRadius(1.0, 3.0);
699  explosionParticles->setColor(0.0, 1,1,1,.9);
700  explosionParticles->setColor(0.1,  1,1,0,.9);
701  explosionParticles->setColor(0.5, .8,.4,0,.5);
702  explosionParticles->setColor(1.0, .2,.2,.2,.5);
703
704 
705  emitter = new DotEmitter( 2000, 70, 360);
706  //emitter->setSpread( 0, M_2_PI);
707  emitter->setEmissionRate( 200.0);
708  //emitter->setEmissionVelocity( 200.0);
709  //emitter->setSystem( explosionParticles);
710  //emitter->setAbsCoor( this->getAbsCoor());
711
712  node  = new EmitterNode( .1f);
713  node->setupParticle( emitter, explosionParticles);
714  node->setAbsDir( this->getAbsDir());
715  node->setVelocity( this->getVelocity() * .9f);
716  node->setAbsCoor( this->getAbsCoor());
717  if( !node->start())
718    PRINTF(0)("Explosion node not correctly started!");
719/*
720  PNode* node          = new PNode();
721  node->setAbsCoor(this->getAbsCoor());
722  Explosion* explosion = new Explosion();
723  explosion->explode( node, Vector(5,5,5));
724*/
725/*
726  if( this->hasPlayer())
727  {
728        this->setAbsCoor(Vector(-10000,10000,10000));
729        this->hide();
730  }
731  else
732  {*/
733    this->setAbsCoor( this->getAbsCoor() + Vector(100,0,0) + Vector(1,0,0) * VECTOR_RAND(150).dot(Vector(1,0,0)));
734  //}
735
736}
737
738void SpaceShip::respawn( )
739{
740  Playable::respawn();
741}
742
743
744void SpaceShip::damage(float pDamage, float eDamage){
745  PRINTF(5)("ship hit for (%f,%f) \n",pDamage,eDamage);
746
747  if( this->shieldActive) {
748    if( this->shieldCur > pDamage) {
749      this->shieldCur = this->shieldCur - pDamage;
750    }
751    else { // shield <= pDamage
752      this->shieldCur -=pDamage;
753      this->shieldActive = false; //shield collapses
754      pDamage += this->shieldCur;
755      if( !this->shieldActive) {
756        this->armorCur -= pDamage / 2; // remaining damages hits armor at half rate
757        this->electronicCur -= eDamage;
758      }
759    }
760  }
761  else {
762    this->armorCur = this->armorCur - pDamage;
763    this->electronicCur = this->electronicCur - eDamage;
764  }
765  if( this->armorCur <= 0) { /* FIXME implement shipcrash*/ }
766    this->destroy(this);
767
768  updateElectronicWidget();
769  updateShieldWidget();
770
771  this->setHealth( this->armorCur);
772}
773
774
775void SpaceShip::regen(float time){
776  float tmp;
777  if (this->armorCur != this->armorMax || this->armorRegen != 0){
778    tmp = this->armorCur + this->armorRegen * time;
779    if ( tmp > electronicMax)
780      this->armorCur = this->armorMax;
781    else
782      this->armorCur = tmp;
783  }
784  if (this->shieldCur != this->shieldMax || this->shieldRegen != 0){
785    tmp =  this->shieldCur + (this->shieldRegen + this->reactorOutput * this->shieldEnergyShare) * time;
786    if( tmp > shieldMax)
787      this->shieldCur = this->shieldMax;
788    else
789      this->shieldCur = tmp;
790    this->shieldActive = ( this->shieldActive || this->shieldCur > shieldTH);
791
792    updateShieldWidget();
793  }
794
795  this->setHealth( this->shieldCur);      // FIXME currently just to test share system
796
797  if (this->electronicCur != this->electronicMax || this->electronicRegen != 0){
798    tmp = this->electronicCur + this->electronicRegen * time;
799    if ( tmp > electronicMax)
800      this->electronicCur = this->electronicMax;
801    else
802      this->electronicCur = tmp;
803
804    updateElectronicWidget();
805  }
806
807}
808
809
810/**
811 * Weapon regeneration
812 * does not use any reactor capacity, as it wouldn't work in a consistent way.
813 */
814void SpaceShip::weaponRegen(float time)
815{
816  float energy  = ( this->reactorOutput * this->weaponEnergyShare + this->weaponEnergyRegen) * time;
817  Weapon* weapon;
818  for( unsigned int i=0; i < this->weaponMan.getSlotCount(); i++)
819  {
820    weapon = this->weaponMan.getWeapon(i);
821    if( weapon != NULL && weapon->isActive())
822    {
823      weapon->increaseEnergy( energy);
824    }
825
826  }
827  // weaponMan.increaseAmmunition( weapon, energy);
828}
829
830
831void SpaceShip::enterPlaymode(Playable::Playmode playmode)
832{
833  switch(playmode)
834  {
835    case Playable::Full3D:
836      /*
837      if (State::getCameraNode != NULL)
838      {
839        Vector absCoor = this->getAbsCoor();
840        this->setParent(PNode::getNullParent());
841        this->setAbsCoor(absCoor);
842        State::getCameraNode()->setParentSoft(&this->cameraNode);
843        State::getCameraNode()->setRelCoorSoft(-10, 0,0);
844        State::getCameraTargetNode()->setParentSoft(&this->cameraNode);
845        State::getCameraTargetNode()->setRelCoorSoft(100, 0,0);
846
847      }
848      */
849      //break;
850
851      break;
852    case Playable::Horizontal:
853      if (State::getCameraNode != NULL)
854      {
855        this->debugNode(1);
856        this->travelNode->debugNode(1);
857
858        this->travelNode->setAbsCoor(this->getAbsCoor());
859        this->travelNode->updateNode(0.01f);
860        this->isTravelDistanceInit = false;
861       
862        if(this->entityTrack)
863           this->travelNode->setParent(this->entityTrack->getTrackNode());
864
865        this->setParent(this->travelNode);
866        this->setRelCoor(0,0,0);
867
868        State::getCameraNode()->setParentSoft(this->travelNode);
869        //State::getCameraNode()->setParentSoft(this);
870        //State::getCameraNode()->setRelCoorSoft(-0.01, 40, 0);
871        State::getCameraTargetNode()->setParentSoft(this->travelNode);
872        //State::getCameraTargetNode()->setParentSoft(this);
873        //State::getCameraTargetNode()->setRelCoorSoft(0,0,0);
874        this->setCameraMode(Camera::ViewTop);
875        State::getCamera()->setEventHandling(false);
876        registerEvent(KeyMapper::PEV_VIEW0);
877        registerEvent(KeyMapper::PEV_VIEW1);
878        registerEvent(KeyMapper::PEV_VIEW2);
879        registerEvent(KeyMapper::PEV_VIEW3);
880        registerEvent(KeyMapper::PEV_VIEW4);
881        registerEvent(KeyMapper::PEV_VIEW5);
882
883        State::getCamera()->setParentMode(PNODE_MOVEMENT);
884
885        //this->updateTravelDistance();
886
887        this->debugNode(1);
888        this->travelNode->debugNode(1);
889      }
890      break;
891
892    default:
893      PRINTF(2)("Playmode %s Not Implemented in %s\n", Playable::playmodeToString(this->getPlaymode()).c_str(), this->getClassCName());
894  }
895}
896
897/**
898 * @brief calculate the velocity
899 * @param time the timeslice since the last frame
900*/
901
902void SpaceShip::movement (float dt)
903{
904  //by releasing the buttons, the velocity decreases with airCoeff*Acceleration. Should be strong enough so
905  //the ship doesn't slide too much.
906  float airCoeff = 2.5;
907  float pi = 3.14;
908
909  switch(this->getPlaymode())
910  {
911    case Playable::Horizontal:
912    {
913      // these routines will change the travel movement into zero in a short amout of time, if the player
914      // doesn't press any buttons.
915      if (this->travelVelocity.x >= 0)
916      {
917        if (this->travelVelocity.x > airCoeff*this->acceleration * dt)
918          this->travelVelocity.x -= airCoeff* this->acceleration * dt;
919        else
920          this->travelVelocity.x = 0;
921      }
922      else
923      {
924        if (this->travelVelocity.x < -airCoeff*this->acceleration * dt)
925          this->travelVelocity.x += airCoeff* this->acceleration * dt;
926        else
927          this->travelVelocity.x = 0;
928      }
929      if (this->travelVelocity.z >= 0)
930      {
931        if (this->travelVelocity.z > airCoeff*this->acceleration * dt)
932          this->travelVelocity.z -= airCoeff* this->acceleration * dt;
933        else
934          this->travelVelocity.z = 0;
935      }
936      else
937      {
938        if (this->travelVelocity.z < -airCoeff*this->acceleration * dt)
939          this->travelVelocity.z += airCoeff* this->acceleration * dt;
940        else
941          this->travelVelocity.z = 0;
942      }
943   
944      // this will evite, that the ship moves outside the travelDistance- borders,when the player releases all buttons
945      // and its continuing to slide a bit.
946      Vector oldCoor = this->getRelCoor();
947      if (this->getRelCoor().x > this->travelDistancePlus.x) this->setRelCoor(this->travelDistancePlus.x, oldCoor.y, oldCoor.z);
948      if (this->getRelCoor().x < this->travelDistanceMinus.x) this->setRelCoor(this->travelDistanceMinus.x, oldCoor.y, oldCoor.z);
949      if (this->getRelCoor().z > this->travelDistancePlus.y) this->setRelCoor(oldCoor.x, oldCoor.y, this->travelDistancePlus.y);
950      if (this->getRelCoor().z < this->travelDistanceMinus.y) this->setRelCoor(oldCoor.x, oldCoor.y, this->travelDistanceMinus.y);
951   
952      if( this->systemFailure() )
953        bForward = bBackward = bLeft = bRight = false;
954   
955      if( this->bForward )
956      {
957        //printf("ShipCoorX: %f \n", this->getRelCoor().x);
958        if(this->getRelCoor().x < this->travelDistancePlus.x)
959        {
960          if (this->travelVelocity.x < this->travelSpeed)
961          {
962            this->travelVelocity.x += (airCoeff + 1.0)*this->acceleration*dt;
963          }
964          else
965          {
966            this->travelVelocity.x = this->travelSpeed;
967          }
968        }
969        else
970        {
971          this->travelVelocity.x = 0.0f;
972        }
973      }
974   
975      if( this->bBackward )
976      {
977        if(this->getRelCoor().x > this->travelDistanceMinus.x)
978        {
979          if (this->travelVelocity.x > -this->travelSpeed)
980          {
981            this->travelVelocity.x -= (airCoeff + 1.0)*this->acceleration*dt;
982          }
983          else
984          {
985            this->travelVelocity.x = -this->travelSpeed;
986          }
987        }
988        else
989        {
990          this->travelVelocity.x = 0.0f;
991        }
992      }
993   
994      if( this->bLeft)
995      {
996        if(this->getRelCoor().z > this->travelDistanceMinus.y)
997        {
998          if (this->travelVelocity.z > -this->travelSpeed)
999          {
1000            this->travelVelocity.z -= (airCoeff + 1.0)*this->acceleration*dt;
1001          }
1002          else
1003          {
1004            this->travelVelocity.z = -this->travelSpeed;
1005          }
1006        }
1007        else
1008        {
1009          this->travelVelocity.z = 0.0f;
1010        }
1011        this->setRelDirSoft(Quaternion(-pi/6, Vector(1,0,0)), 6);
1012      }
1013   
1014      if( this->bRight)
1015      {
1016        //printf("ShipCoorZ: %f \n", this->getRelCoor().z);
1017        if(this->getRelCoor().z < this->travelDistancePlus.y)
1018        {
1019          if (this->travelVelocity.z < this->travelSpeed)
1020          {
1021            this->travelVelocity.z += (airCoeff + 1.0)*this->acceleration*dt;
1022          }
1023          else
1024          {
1025            this->travelVelocity.z = this->travelSpeed;
1026          }
1027        }
1028        else
1029        {
1030          this->travelVelocity.z = 0.0f;
1031        }
1032        this->setRelDirSoft(Quaternion(pi/6, Vector(1,0,0)), 6);
1033      }
1034      if (!this->bRight && !this->bLeft)
1035      {
1036        this->setRelDirSoft(Quaternion(0, Vector(1,0,0)), 6);
1037      }
1038
1039    //normalisation of the vectors (vector sum must be <= travelspeed)
1040    float xzNorm = sqrt(pow(this->travelVelocity.x, 2) + pow(this->travelVelocity.z, 2));
1041    if (xzNorm > this->travelSpeed)
1042    {
1043      this->travelVelocity.x = this->travelVelocity.x/xzNorm * this->travelSpeed;
1044      this->travelVelocity.z = this->travelVelocity.z/xzNorm * this->travelSpeed;
1045    }
1046
1047    //this moves camera and ship along the travel path.
1048    if(!this->entityTrack) 
1049       this->travelNode->shiftCoor(Vector(this->cameraSpeed * dt, 0, 0));
1050
1051    break;
1052    }
1053    case Playable::Vertical:
1054      break;
1055    default:
1056      PRINTF(4)("Playmode %s Not Implemented in %s\n", Playable::playmodeToString(this->getPlaymode()).c_str(), this->getClassCName());
1057  }
1058   //set new coordinates calculated through key- events.
1059  this->shiftCoor (this->travelVelocity * dt);
1060}
1061
1062void SpaceShip::setPlaymodeXML(const std::string& playmode)
1063{
1064  this->setPlaymode(Playable::stringToPlaymode(playmode));
1065}
1066
1067/**
1068 * @brief jumps to the next WeaponConfiguration
1069 */
1070void SpaceShip::nextWeaponConfig()
1071{
1072  PRINTF(0)("Requested next weapon config!\n");
1073  this->weaponMan.nextWeaponConfig();
1074  Playable::weaponConfigChanged();
1075}
1076
1077/**
1078 * @brief moves to the last WeaponConfiguration
1079 */
1080void SpaceShip::previousWeaponConfig()
1081{
1082  this->curWeaponPrimary    = (this->curWeaponPrimary + 1) % 3;
1083  this->weaponMan.changeWeaponConfig(this->curWeaponPrimary);
1084  Playable::weaponConfigChanged();
1085}
1086
1087void SpaceShip::hit( float damage, WorldEntity* killer)
1088{
1089  this->damage(killer->getDamage(),0);
1090}
1091
1092void SpaceShip::updateElectronicWidget()
1093{
1094  if (this->electronicWidget != NULL)
1095  { //if it exists already: update it
1096     this->electronicWidget->setMaximum(this->electronicMax);
1097     this->electronicWidget->setValue(this->electronicCur);
1098  }
1099  else
1100  { //create the widget
1101    this->electronicWidget = new OrxGui::GLGuiEnergyWidgetVertical();
1102    this->electronicWidget->getBarWidget()->setChangedValueColor(Color(1,0,0,1));
1103    //this->electronicWidget->setDisplayedName("Electronics:");
1104    //this->electronicWidget->setSize2D(100,20);
1105    //this->electronicWidget->setAbsCoor2D(150,200);
1106    this->updateElectronicWidget();
1107    if (this->hasPlayer())
1108      State::getPlayer()->hud().setEnergyWidget(this->electronicWidget);
1109  }
1110}
1111
1112void SpaceShip::updateShieldWidget()
1113{
1114  if (this->shieldWidget != NULL)
1115  { 
1116    this->shieldWidget->setMaximum(this->shieldMax);
1117    this->shieldWidget->setValue(this->shieldCur);;
1118  }
1119  else
1120  {
1121    this->shieldWidget = new OrxGui::GLGuiEnergyWidgetVertical();
1122    this->shieldWidget->getBarWidget()->setChangedValueColor(Color(1,0,0,1));
1123    //this->shieldWidget->setDisplayedName("Shield:");
1124    //his->shieldWidget->setSize2D(100,20);
1125    //this->shieldWidget->setAbsCoor2D(200,200);
1126    this->updateShieldWidget();
1127    if (this->hasPlayer())
1128      State::getPlayer()->hud().setShiledWidget(this->shieldWidget);
1129  }
1130}
1131
1132void SpaceShip::setCameraDistance(float dist)
1133{
1134  State::getCamera()->setViewTopDistance(dist);
1135}
1136
1137void SpaceShip::setCameraFovy(float fovy)
1138{
1139  State::getCamera()->setViewTopFovy(fovy);
1140}
1141
1142void SpaceShip::updateTravelDistance()
1143{
1144  float x = 1.25 * this->actionWidthPercentage * fabsf(State::getCamera()->getAbsCoor().y) * tan(State::getCamera()->getFovy()*M_PI /360.0);
1145  float y = x / State::getCamera()->getAspectRatio() / this->actionWidthPercentage;
1146  //State::getCamera()->setAbsCoor(-5, 1000, 0);
1147
1148
1149  //State::getCamera()->getAbsCoor().print();
1150  //printf("CameraRelCoorY: %f \n", State::getCamera()->getRelCoor().y);
1151
1152  //printf("x: %f, y: %f \n", x, y);
1153  this->travelDistancePlus = Vector2D(y, x);
1154  this->travelDistanceMinus = Vector2D(-y, -x);
1155
1156  State::getPlayer()->hud().setOverlayPercentage(100-int(100*this->actionWidthPercentage));
1157  PRINTF(0)("TravelDistance has been updated\n");
1158  this->isTravelDistanceInit = true;
1159}
1160
1161void SpaceShip::setActionWidthPercentage(int i) 
1162{
1163  if (i>100) i=100;
1164  if (i<0) i=0;
1165  this->actionWidthPercentage = i/100.0;
1166  //State::getPlayer()->hud().setOverlayPercentage(100-i);
1167  //updateTravelDistance();
1168  this->isTravelDistanceInit = false;
1169};
Note: See TracBrowser for help on using the repository browser.