BULLET.CPP
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:3k
源码类别:

游戏

开发平台:

Visual C++

  1. #include "assert.h"
  2. #include "ray.h"
  3. #include "globals.h"
  4. #include "rayspr.h"
  5. #include "sprfunc.h"
  6. #include "sfvars.h"
  7. #include "maxmins.h"
  8. #include "sprinter.h"
  9. #include "fixed.h"
  10. #include "collisio.h"
  11. #include "sound.h"
  12. #include "voxinter.h"
  13. #include "ground.h"
  14. #include "sprtypes.h"
  15. #include "sprswtch.h"
  16. #include "message.h"
  17. #include "defobj.h"
  18. #include "objcol.h"
  19. #include "damage.h"
  20. #define BULLET_SPEED 20
  21. #define BULLET_DAMAGE 10
  22. long bmin_x, bmin_y, bmax_x, bmax_y;
  23. long sound_id;
  24. void Bullet_Create(pobject cur_object, long offset);
  25. void Bullet_Update(pobject cur_object, long update_num);
  26. void Bullet_Update_Z(pobject cur_object, psector new_sec);
  27. ULONG Bullet_Message(pobject send_obj, pobject receive_obj, ULONG message, pdata extra_data);
  28. void Init_Bullets(func_index index) {
  29.    sound_id=Load_Sound("shoot.wav");
  30.    update_funcs[index]=Bullet_Update;
  31.    update_z_funcs[index]=Bullet_Update_Z;
  32.    load_extra_funcs[index]=Bullet_Create;
  33.    message_funcs[index]=Bullet_Message;
  34.    bmin_x=0x7FFFFFFF;
  35. }
  36. BOOL Is_Hittable(pobject the_obj) {
  37. if (the_obj->stats.current_health>0) {
  38.    return TRUE;
  39. }  else {
  40.    return FALSE;
  41. }
  42. }
  43. void Bullet_Update(pobject cur_object, long update_num) {
  44.    long orig_alt;
  45.    pobject orig_obj;
  46.    orig_alt=cur_object->z+Ground_Height(cur_object);
  47.    Move_Object_Vec(cur_object, (pvector2)(cur_object->extra_data));
  48.    cur_object->z=orig_alt-Ground_Height(cur_object);
  49.    if (cur_object->z <= 0) {
  50.       Switch_Object_Types(cur_object, Obj_Type_List+EXPLOSION_TYPE);
  51.    }
  52. }
  53. void Bullet_Update_Z(pobject cur_object, psector new_sec) {
  54. }
  55. void Bullet_Create(pobject cur_object, long offset) {
  56.    Play_Sound(sound_id);
  57.    if (bmin_x==0x7FFFFFFF)
  58.       Get_Map_Max_Mins(bmin_x, bmin_y, bmax_x, bmax_y);
  59.    pvector2 delta_vec;
  60.    delta_vec=(pvector2)NewPtr(sizeof(vector2));
  61.    delta_vec->x=(rcos_table[cur_object->angle]*cur_object->type->stats.base_speed);
  62.    delta_vec->y=(rsin_table[cur_object->angle]*cur_object->type->stats.base_speed);
  63.    cur_object->extra_data=(pdata)delta_vec;
  64. }
  65. ULONG Bullet_Message(pobject send_obj, pobject receive_obj, ULONG message, pdata extra_data)
  66. {
  67.    switch (message) {
  68.       case WALL_SLIDE_CONFIRM:
  69.       if (*((BOOL *)extra_data)==TRUE) {
  70.          Switch_Object_Types(receive_obj, Obj_Type_List+EXPLOSION_TYPE);
  71.          return OPERATION_STOP;
  72.       } else {
  73.          return STOP_SLIDE;
  74.       }
  75.      case HIT_BY_OBJ:
  76.      case HIT_OBJ:
  77.          if (Is_Hittable(send_obj)&&(send_obj!=receive_obj->owner)) {
  78.             Stop_Obj(receive_obj, (pobj_collision)extra_data);
  79.             Switch_Object_Types(receive_obj, Obj_Type_List+EXPLOSION_TYPE);
  80.             Give_Damage(send_obj, BULLET_DAMAGE);
  81.             return OPERATION_STOP;
  82.          }
  83.          return NORMAL_MESSAGE;
  84.       default:
  85.          break;
  86.    }
  87. return Default_Message(send_obj, receive_obj, message, extra_data);
  88. }