亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? player.cpp

?? quake 游戲原代碼
?? CPP
字號:
#include "ray.h"
#include "globals.h"
#include "rayspr.h"
#include "rayfile.h"
#include "sprfunc.h"
#include "sfvars.h"
#include "defobj.h"
#include "playint.h"
#include "keyinfo.h"
#include "sprtypes.h"
#include "voxinter.h"
#include "message.h"
#include "classes.h"
#include "quit.h"
#include "inventor.h"
#include "tags.h"
#include "shot.h"

#define GUN_HEIGHT cur_obj->type->eye_height-20
#define MAX_TIME_TO_GUN 5
#define MAX_FALL_PER_UPDATE 8
#define NO_INPUT 0

short default_input[MAX_TRACKED_INPUTS]={0,0,0,0,0,0,0};
PSHORT cur_input_buffer=default_input;

typedef struct PLAYER_INFO * pplayer_info;
typedef struct PLAYER_INFO {
   PSHORT input_buffer;
   SHORT tracked_inputs[MAX_TRACKED_INPUTS];
   BOOL fly_mode;
   MYFIXED base_fixed_z, cur_fixed_z;
   angle_type z_move_angle;
   SHORT dis_to_fall;
   LONG time_to_gun;
   angle_type vert_angle;
   pobject_node inventory;
} player_info;

void Setup_Player_Inputs(pplayer_info cur_extra);
void Player_Update(pobject cur_obj, long update_num);
void Player_Update_Z(pobject cur_obj, psector new_sec);
void Player_Load(pobject cur_obj, long offset);
void Z_Correct_Move(pobject cur_obj);
void Reset_Player_Z(pplayer_info cur_extra);
pobject Scan_Inventory(pobject_node inventory, ULONG search_class);
ULONG Player_Message(pobject send_obj, pobject receive_obj, ULONG message, pdata extra_data);

void Init_Player_Obj(func_index index)
{
update_funcs[index]=Player_Update;
update_z_funcs[index]=Player_Update_Z;
load_extra_funcs[index]=Player_Load;
message_funcs[index]=Player_Message;
}

void Player_Load(pobject cur_obj, long offset)
{

   pplayer_info new_info;
   new_info=(pplayer_info)NewPtr(sizeof(player_info));

   for (short cur_input=0; cur_input < MAX_TRACKED_INPUTS; cur_input++) {
      new_info->tracked_inputs[cur_input]=0;
   }
   new_info->fly_mode=FALSE;
   new_info->base_fixed_z=cur_obj->z << SHIFT;
   new_info->cur_fixed_z=new_info->base_fixed_z;
   new_info->z_move_angle=ANGLE_0;
   new_info->dis_to_fall=0;
   new_info->input_buffer=cur_input_buffer;
   new_info->vert_angle=ANGLE_0;
   new_info->inventory=NULL;
   cur_obj->extra_data=new_info;
 
}

void Player_Update_Z(pobject cur_obj, psector new_sec)
{
   pplayer_info cur_extra=(pplayer_info)cur_obj->extra_data;
   short height_dif;

   if (!(new_sec->flags & VOXEL_SECTOR)) {
      height_dif=cur_obj->cur_sec->floor_height-new_sec->floor_height;
   } else {
      height_dif=cur_obj->cur_sec->floor_height-
        Get_Voxel_Alt((PUCHAR)new_sec->extra_data, cur_obj->x, cur_obj->y);
   }

   // if in fly mode, changing sectors has no effect on overall z, so we must alter
   // z for difference in floor height
   if (cur_extra->fly_mode) {
      cur_obj->z+=height_dif;
      cur_extra->base_fixed_z=cur_obj->z<<SHIFT;
      cur_extra->cur_fixed_z=cur_extra->base_fixed_z;
   } else {
      if (height_dif>0) {
         cur_obj->z+=height_dif;
         cur_extra->base_fixed_z+=(height_dif<<SHIFT);
         cur_extra->cur_fixed_z+=(height_dif<<SHIFT);
         cur_extra->dis_to_fall+=height_dif;
      } else {
         if (cur_extra->dis_to_fall>0) {
           cur_obj->z-=cur_extra->dis_to_fall;
           cur_extra->base_fixed_z-=(cur_extra->dis_to_fall << SHIFT);
           cur_extra->cur_fixed_z-=(cur_extra->dis_to_fall << SHIFT);
           cur_extra->dis_to_fall=0;
         }
      }
   } /* endif */
}

void Player_Update(pobject cur_obj, long update_num) {
     MYFIXED dx, dy;
     vector2 delta_vec;
     SHORT amount_up, amount_down, amount_left, amount_right, amount_look_up, 
        amount_look_down, raw_input, gun_shot;

     pplayer_info cur_extra=(pplayer_info)cur_obj->extra_data;
     Setup_Player_Inputs(cur_extra);     
     amount_up=cur_extra->tracked_inputs[INDEX_UP];
     amount_down=cur_extra->tracked_inputs[INDEX_DOWN];
     amount_left=cur_extra->tracked_inputs[INDEX_LEFT];
     amount_right=cur_extra->tracked_inputs[INDEX_RIGHT];
     amount_look_up=cur_extra->tracked_inputs[LOOK_UP];
     amount_look_down=cur_extra->tracked_inputs[LOOK_DOWN];
     gun_shot=cur_extra->tracked_inputs[INDEX_GUN];
     raw_input=cur_extra->tracked_inputs[RAW_INPUT];

     cur_extra->time_to_gun--;
     // do gravity for sector change
     if (cur_extra->dis_to_fall>0) {
        if (cur_extra->dis_to_fall>MAX_FALL_PER_UPDATE) {
           cur_extra->dis_to_fall-=MAX_FALL_PER_UPDATE;
           cur_obj->z-=MAX_FALL_PER_UPDATE;
           cur_extra->base_fixed_z-=(MAX_FALL_PER_UPDATE << SHIFT);
           cur_extra->cur_fixed_z-=(MAX_FALL_PER_UPDATE << SHIFT);
        } else {
           cur_obj->z-=cur_extra->dis_to_fall;
           cur_extra->base_fixed_z-=(cur_extra->dis_to_fall << SHIFT);
           cur_extra->cur_fixed_z-=(cur_extra->dis_to_fall << SHIFT);
           cur_extra->dis_to_fall=0;
        }
     }

        // reset deltas

        dx=dy=0;

        // what is user doing

        if (amount_right)
           {
           // rotate player right

           cur_obj->angle=Get_Angle_Difference(cur_obj->angle, amount_right);

           } // end if right
        else
        if (amount_left)
           {
           // rotate player to left

           cur_obj->angle=Get_Angle_Sum(cur_obj->angle, amount_left);

           } // end if left

        if (amount_up)
           {
           // move player along view vector foward

           dx=(rcos_table[cur_obj->angle] * amount_up);
           dy=(rsin_table[cur_obj->angle] * amount_up);

           if (cur_extra->fly_mode) {

              // move player z based on vertical view angle

              cur_extra->base_fixed_z+=(tan_table[cur_extra->vert_angle]*amount_up);
              cur_extra->cur_fixed_z=cur_extra->base_fixed_z;

              Z_Correct_Move(cur_obj);
           } else {

              if (cur_obj->cur_sec->flags & VOXEL_SECTOR) {
                 if (!cur_extra->fly_mode) {
                    Reset_Player_Z(cur_extra);
                 }
              } else {

                 // Adjust player z position along a sin wave to simulate walking motion

                 cur_extra->z_move_angle=Get_Angle_Sum(cur_extra->z_move_angle, Z_ANGLE_INC);     
                 cur_extra->cur_fixed_z=(cur_extra->base_fixed_z+(rsin_table[cur_extra->z_move_angle]*Z_MOVE_MAX));

              } /* endif */

           } /* endif */

           } // end if up
        else
        if (amount_down)
           {
           // move player along view vector backward

            dx=(-rcos_table[cur_obj->angle]* amount_down);
            dy=(-rsin_table[cur_obj->angle] * amount_down);

            if (cur_extra->fly_mode) {

               // Move player z base on his vertical view angle

               cur_extra->base_fixed_z-=(tan_table[cur_extra->vert_angle]* amount_down);
               cur_extra->cur_fixed_z=cur_extra->base_fixed_z;

               Z_Correct_Move(cur_obj);
            } else {

              if (cur_obj->cur_sec->flags & VOXEL_SECTOR) {
                 if (!cur_extra->fly_mode) {
                    Reset_Player_Z(cur_extra);
                 }
              } else {

                 // Adjust player z position along a sin wave to simulate walking motion

                 cur_extra->z_move_angle=Get_Angle_Difference(cur_extra->z_move_angle, Z_ANGLE_INC);     
                 cur_extra->cur_fixed_z=(cur_extra->base_fixed_z+(rsin_table[cur_extra->z_move_angle]*Z_MOVE_MAX));

              } /* endif */

            } /* endif */

           } // end if down
       else
          {
             if (!cur_extra->fly_mode) {
                Reset_Player_Z(cur_extra);
             }
          }

        if (gun_shot) {
           if (cur_extra->time_to_gun<=0) {
           Create_Object(cur_obj->x, cur_obj->y, GUN_HEIGHT+cur_obj->z, cur_obj->angle, BULLET_TYPE, cur_obj, cur_obj->team);
           cur_extra->time_to_gun=MAX_TIME_TO_GUN;
           }
        }

        // move player
        delta_vec.x=dx;
        delta_vec.y=dy;
        Move_Object_Vec(cur_obj, &delta_vec);

        // check change in vertical angle
        cur_extra->vert_angle=Get_Angle_Sum(cur_extra->vert_angle, amount_look_up);
        cur_extra->vert_angle=Get_Angle_Difference(cur_extra->vert_angle, amount_look_down);

        switch (raw_input) {
        case U_KEY:
           cur_extra->base_fixed_z+=ONE;
           cur_extra->cur_fixed_z+=ONE;
           Z_Correct_Move(cur_obj);
           break;
        case D_KEY:
           cur_extra->base_fixed_z-=ONE;
           cur_extra->cur_fixed_z-=ONE;
           Z_Correct_Move(cur_obj);
           break;
        case F_KEY:
           cur_extra->fly_mode=(cur_extra->fly_mode == TRUE ? FALSE : TRUE);
           cur_extra->z_move_angle=ANGLE_0;
           cur_extra->cur_fixed_z=cur_extra->base_fixed_z;
           break;
        default: 
           break;
        }
        
        // test non-motion keys

if ( (cur_obj->cur_sec->tag == (HOME_SECTOR+cur_obj->team)) && 
      (Scan_Inventory(cur_extra->inventory, FLAG_CLASS)!=NULL) ) {
         Post_Quit(WINNING_GAME);

}

cur_obj->z=cur_extra->cur_fixed_z>>SHIFT;
}

void Reset_Player_Z(pplayer_info cur_extra)
{
   // reset player z if they aren't moving
   if ((cur_extra->z_move_angle % ANGLE_180) >= Z_ANGLE_DELTA) {

      if (cur_extra->z_move_angle % ANGLE_180 < ANGLE_90) {

         cur_extra->z_move_angle=
            Get_Angle_Difference(cur_extra->z_move_angle, Z_ANGLE_INC);

      } else {

         cur_extra->z_move_angle=
            Get_Angle_Sum(cur_extra->z_move_angle, Z_ANGLE_INC);

      } /* endif */

      cur_extra->cur_fixed_z=(cur_extra->base_fixed_z+
         (rsin_table[cur_extra->z_move_angle]*Z_MOVE_MAX));

   } /* endif */
}

void Z_Correct_Move(pobject cur_obj)
{
  pplayer_info cur_extra=(pplayer_info)cur_obj->extra_data;
  if (cur_extra->base_fixed_z < (STEP_LENGTH<<SHIFT) ) {
    cur_extra->base_fixed_z=STEP_LENGTH<<SHIFT;
    cur_extra->cur_fixed_z=cur_extra->base_fixed_z;
    }
  long sec_height=cur_obj->cur_sec->ceil_height-cur_obj->cur_sec->floor_height;
  MYFIXED max_height=(sec_height-STEP_LENGTH)<<SHIFT;
  if (cur_extra->base_fixed_z > max_height) {
     cur_extra->base_fixed_z=max_height;
     cur_extra->cur_fixed_z=cur_extra->base_fixed_z;
  }
}

void Setup_Player_Inputs(pplayer_info cur_extra)
{
memcpy(cur_extra->tracked_inputs, cur_extra->input_buffer, MAX_TRACKED_INPUTS * sizeof(short));
}

void Set_Player_Input_Buffer(PSHORT input_buffer)
{
  cur_input_buffer=input_buffer;
}

angle_type Get_Player_Vert_Angle(pobject cur_obj)
{
   return ((pplayer_info)cur_obj->extra_data)->vert_angle;
}

BOOL Is_Flying(pobject test_obj) {
   return ((pplayer_info)test_obj->extra_data)->fly_mode;
}

ULONG Player_Message(pobject send_obj, pobject receive_obj, ULONG message, pdata extra_data) {

   pplayer_info player_data=(pplayer_info)receive_obj->extra_data;

   switch (message) {
   case HIT_OBJ:
   case HIT_BY_OBJ:
         if ((send_obj->type->obj_class==FLAG_CLASS)&&(send_obj->team!=receive_obj->team)) {
            pobject_node new_node=(pobject_node)NewPtr(sizeof(object_node));
            new_node->data=send_obj;
            new_node->back=NULL;
            new_node->front=NULL;
            OL_Push_Node(new_node, player_data->inventory);
            Create_Inventory_Object(send_obj, receive_obj);
            Do_Shot("flag.pcx", "groovy.wav", 20, TRUE);
         }
         break;
   default: 
      break;
   } /* endswitch */
   return Default_Message(send_obj, receive_obj, message, extra_data);
}

pobject Scan_Inventory(pobject_node inventory, ULONG search_class) {
   pobject_node cur_node;
   cur_node=inventory;
   while (!OL_Empty_Node(cur_node)) {
      if ( ((pinventory_data)cur_node->data->extra_data)->old_type->obj_class==search_class) {
         return cur_node->data;
      }
      cur_node=OL_Next_Node(cur_node);
   }
   return NULL;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人免费视频| 久久精品一区四区| 26uuu久久天堂性欧美| 中文字幕色av一区二区三区| 欧美aa在线视频| 色综合久久久久久久| 精品福利在线导航| 五月综合激情日本mⅴ| 日本高清不卡视频| 国产精品三级久久久久三级| 久久精品72免费观看| 欧美精品久久久久久久多人混战 | 精品国产电影一区二区| 亚洲精品成人精品456| 国产成人免费在线视频| 精品噜噜噜噜久久久久久久久试看| 亚洲精品成人少妇| 激情文学综合插| 亚洲欧美日韩久久精品| 国产999精品久久| 久久精品日产第一区二区三区高清版| 亚洲成人激情社区| 欧美探花视频资源| 亚洲激情六月丁香| 91影视在线播放| 国产精品福利av | 亚洲一区二区三区四区在线观看| 不卡视频一二三| 国产精品你懂的在线欣赏| 国产精品亚洲第一| 久久精品人人爽人人爽| 国产一区二区三区黄视频| 日韩一区二区电影在线| 蜜桃精品在线观看| 欧美电视剧免费全集观看| 视频在线观看91| 欧美一级黄色大片| 久久99国内精品| 久久先锋影音av| 国产传媒欧美日韩成人| 国产喷白浆一区二区三区| 国产不卡视频在线播放| 国产精品久久久久婷婷| 94色蜜桃网一区二区三区| 亚洲狠狠丁香婷婷综合久久久| 色综合亚洲欧洲| 午夜亚洲福利老司机| 91精品国产日韩91久久久久久| 男女男精品视频| 国产日韩欧美综合一区| 99久久亚洲一区二区三区青草| 亚洲精品伦理在线| 欧美精品日日鲁夜夜添| 经典一区二区三区| 综合久久久久久| 911国产精品| 国产精品系列在线观看| 亚洲精品国产a久久久久久| 91精品国产色综合久久久蜜香臀| 韩国女主播一区二区三区| 亚洲国产高清不卡| 在线观看日韩电影| 精品一区免费av| 国产精品久久久久久亚洲毛片| 欧美在线不卡视频| 国产一区亚洲一区| 亚洲国产欧美另类丝袜| 久久亚洲精华国产精华液| 日本久久一区二区| 欧美日韩日日摸| 欧美在线free| 亚洲图片自拍偷拍| 91精品国产福利在线观看| 床上的激情91.| 天堂午夜影视日韩欧美一区二区| 精品福利二区三区| 在线免费观看日韩欧美| 国内精品国产三级国产a久久| 亚洲精品视频在线观看网站| 精品少妇一区二区三区视频免付费| 99麻豆久久久国产精品免费优播| 秋霞成人午夜伦在线观看| 亚洲欧洲日韩在线| 久久综合久久鬼色| 欧美丰满少妇xxxxx高潮对白 | 亚洲影院免费观看| 欧美精品一区二区三区高清aⅴ| 色噜噜狠狠色综合欧洲selulu| 国产一区二区三区免费观看| 五月婷婷久久丁香| 亚洲免费视频成人| 国产免费久久精品| 精品99久久久久久| 5858s免费视频成人| 欧美最猛黑人xxxxx猛交| 粉嫩高潮美女一区二区三区| 国内精品伊人久久久久av影院| 偷偷要91色婷婷| 亚洲国产综合在线| 亚洲精品日产精品乱码不卡| 中文字幕不卡在线| 日本一区二区三区四区在线视频| 日韩一区二区精品在线观看| 3d成人动漫网站| 精品污污网站免费看| 在线观看免费视频综合| 91麻豆国产精品久久| 97久久精品人人做人人爽| 国产99久久久久| 大陆成人av片| 国产999精品久久| 成人国产精品免费观看| 丁香六月综合激情| av激情成人网| 色欧美乱欧美15图片| 成人网页在线观看| 99久久er热在这里只有精品15| 懂色av中文字幕一区二区三区| 成人一区二区三区中文字幕| 成人一区二区三区视频在线观看| 国产成人三级在线观看| 成人午夜私人影院| 91美女在线视频| 欧美亚洲精品一区| 3d成人动漫网站| 久久亚洲精华国产精华液 | 欧美一区二区三区男人的天堂| 7777精品伊人久久久大香线蕉完整版 | 免费成人你懂的| 黄页网站大全一区二区| 高清在线成人网| 色婷婷综合久久| 欧美精品在线一区二区三区| 日韩欧美国产一区二区三区 | 亚洲免费观看在线观看| 亚洲一二三区不卡| 激情伊人五月天久久综合| 国产成人av影院| 色欧美88888久久久久久影院| 欧美日韩卡一卡二| 久久久777精品电影网影网 | 欧美亚洲国产一区二区三区va| 欧美私人免费视频| 久久新电视剧免费观看| 依依成人综合视频| 免费视频一区二区| 成人蜜臀av电影| 欧美性猛交xxxx乱大交退制版 | 黄色日韩网站视频| 99riav一区二区三区| 欧美日韩专区在线| 精品国产乱码久久久久久图片| 中文字幕一区二区三区色视频| 亚洲不卡一区二区三区| 国产成人自拍网| 欧美日韩久久不卡| 中国色在线观看另类| 五月综合激情网| 99久久国产综合色|国产精品| 欧美一区二区三区小说| 国产精品久久久久四虎| 久久99国产精品麻豆| 欧美色图免费看| 国产精品久久久久久久岛一牛影视 | 亚洲欧美激情在线| 狠狠色2019综合网| 欧美日韩成人一区| 亚洲免费毛片网站| 国产激情一区二区三区四区| 69av一区二区三区| 一区二区三区国产| av成人动漫在线观看| 欧美大尺度电影在线| 亚洲线精品一区二区三区八戒| www.在线成人| 久久综合九色综合欧美亚洲| 亚洲国产人成综合网站| 色婷婷久久99综合精品jk白丝| 久久综合久久99| 精品亚洲国产成人av制服丝袜| 欧美性色综合网| 亚洲综合一区二区三区| 成人91在线观看| 欧美激情综合在线| 韩国av一区二区| 久久午夜老司机| 国产麻豆视频一区二区| 日韩免费看网站| 日韩电影免费在线观看网站| 一本久道久久综合中文字幕 | 国产亚洲欧洲997久久综合 | 欧美色区777第一页| 亚洲激情综合网| 97精品超碰一区二区三区| 国产视频视频一区| 国产美女主播视频一区| 亚洲精品一区二区三区香蕉| 蜜臀精品久久久久久蜜臀| 91精品国产乱| 美日韩一级片在线观看|