home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / main / objphys.c < prev    next >
Text File  |  1998-06-08  |  4KB  |  130 lines

  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  12. */
  13.  
  14. void do_object_physics( object * obj )
  15. {
  16.     vms_angvec rotang;
  17.     vms_vector frame_vec;    //movement in this frame
  18.     vms_vector new_pos,ipos;        //position after this frame
  19.     int iseg;
  20.     int hit;
  21.     vms_matrix rotmat,new_pm;
  22.     int count=0;
  23.     short joy_x,joy_y,btns;
  24.     int joyx_moved,joyy_moved;
  25.     fix speed;
  26.     vms_vector *desired_upvec;
  27.     fixang delta_ang,roll_ang;
  28.     vms_vector forvec = {0,0,f1_0};
  29.     vms_matrix temp_matrix;
  30.  
  31.     //check keys
  32.  
  33.     rotang.pitch = ROT_SPEED * (key_down_time(KEY_UP) - key_down_time(KEY_DOWN));
  34.     rotang.head  = ROT_SPEED * (key_down_time(KEY_RIGHT) - key_down_time(KEY_LEFT));
  35.     rotang.bank = 0;
  36.  
  37.     //check for joystick movement
  38.  
  39.     joy_get_pos(&joy_x,&joy_y);
  40.     btns=joy_get_btns();
  41.  
  42.     joyx_moved = (abs(joy_x - _old_joy_x)>JOY_NULL);
  43.     joyy_moved = (abs(joy_y - _old_joy_y)>JOY_NULL);
  44.  
  45.     if (abs(joy_x) < JOY_NULL) joy_x = 0;
  46.     if (abs(joy_y) < JOY_NULL) joy_y = 0;
  47.  
  48.     if (!rotang.pitch) rotang.pitch = fixmul(-joy_y * 128,FrameTime);
  49.     if (!rotang.head) rotang.head = fixmul(joy_x * 128,FrameTime);
  50.     
  51.     if (joyx_moved) _old_joy_x = joy_x;
  52.     if (joyy_moved) _old_joy_y = joy_y;
  53.  
  54.     speed = ((btns&2) || keyd_pressed[KEY_A])?SLOW_SPEED*3:(keyd_pressed[KEY_Z]?SLOW_SPEED/2:SLOW_SPEED);
  55.  
  56.     //now build matrices, do rotations, etc., etc.
  57.  
  58.     vm_angles_2_matrix(&rotmat,&rotang);
  59.     vm_matrix_x_matrix(&new_pm,&obj->orient,&rotmat);
  60.     obj->orient = new_pm;
  61.  
  62.     //move player
  63.  
  64.     vm_vec_copy_scale(&obj->velocity,&obj->orient.fvec,speed);
  65.     vm_vec_copy_scale(&frame_vec,&obj->velocity,FrameTime);
  66.  
  67.     do {
  68.         fix wall_part;
  69.         vms_vector tvec;
  70.  
  71.         count++;
  72.  
  73.         vm_vec_add(&new_pos,&obj->pos,&frame_vec);
  74.  
  75.         hit = find_vector_intersection(&ipos,&iseg,&obj->pos,obj->seg_id,&new_pos,obj->size,-1);
  76.  
  77.         obj->seg_id = iseg;
  78.         obj->pos = ipos;
  79.  
  80.         //-FIXJOHN-if (hit==HIT_OBJECT) ExplodeObject(hit_objnum);
  81.  
  82.         if (hit==HIT_WALL) {
  83.             vm_vec_sub(&frame_vec,&new_pos,&obj->pos);    //part through wall
  84.             wall_part = vm_vec_dot(wall_norm,&frame_vec);
  85.             vm_vec_copy_scale(&tvec,wall_norm,wall_part);
  86.             if ((wall_part == 0) || (vm_vec_mag(&tvec) < 5)) Int3();
  87.             vm_vec_sub2(&frame_vec,&tvec);
  88.         }
  89.  
  90.     } while (hit == HIT_WALL);
  91.  
  92.     Assert(check_point_in_seg(&obj->pos,obj->seg_id,0).centermask==0);
  93.  
  94.     //now bank player according to segment orientation
  95.  
  96.     desired_upvec = &Segments[obj->seg_id].sides[3].faces[0].normal;
  97.  
  98.     if (labs(vm_vec_dot(desired_upvec,&obj->orient.fvec)) < f1_0/2) {
  99.  
  100.         vm_vector_2_matrix(&temp_matrix,&obj->orient.fvec,desired_upvec,NULL);
  101.  
  102.         delta_ang = vm_vec_delta_ang(&obj->orient.uvec,&temp_matrix.uvec,&obj->orient.fvec);
  103.  
  104.         if (rotang.head) delta_ang += (rotang.head<0)?TURNROLL_ANG:-TURNROLL_ANG;
  105.  
  106.         if (abs(delta_ang) > DAMP_ANG) {
  107.  
  108.             roll_ang = fixmul(FrameTime,ROLL_RATE);
  109.  
  110.             if (abs(delta_ang) < roll_ang) roll_ang = delta_ang;
  111.             else if (delta_ang<0) roll_ang = -roll_ang;
  112.  
  113.             vm_vec_ang_2_matrix(&rotmat,&forvec,roll_ang);
  114.  
  115.             vm_matrix_x_matrix(&new_pm,&obj->orient,&rotmat);
  116.             obj->orient = new_pm;
  117.         }
  118.     }
  119.  
  120. }
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129. 
  130.