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

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

?? m_tank.c

?? 著名游戲quake2原代碼最新版本(vc6.0可以編譯的)
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
Copyright (C) 1997-2001 Id Software, Inc.

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 2
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, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/
/*
==============================================================================

TANK

==============================================================================
*/

#include "g_local.h"
#include "m_tank.h"


void tank_refire_rocket (edict_t *self);
void tank_doattack_rocket (edict_t *self);
void tank_reattack_blaster (edict_t *self);

static int	sound_thud;
static int	sound_pain;
static int	sound_idle;
static int	sound_die;
static int	sound_step;
static int	sound_sight;
static int	sound_windup;
static int	sound_strike;

//
// misc
//

void tank_sight (edict_t *self, edict_t *other)
{
	gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
}


void tank_footstep (edict_t *self)
{
	gi.sound (self, CHAN_BODY, sound_step, 1, ATTN_NORM, 0);
}

void tank_thud (edict_t *self)
{
	gi.sound (self, CHAN_BODY, sound_thud, 1, ATTN_NORM, 0);
}

void tank_windup (edict_t *self)
{
	gi.sound (self, CHAN_WEAPON, sound_windup, 1, ATTN_NORM, 0);
}

void tank_idle (edict_t *self)
{
	gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0);
}


//
// stand
//

mframe_t tank_frames_stand []=
{
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL,
	ai_stand, 0, NULL
};
mmove_t	tank_move_stand = {FRAME_stand01, FRAME_stand30, tank_frames_stand, NULL};
	
void tank_stand (edict_t *self)
{
	self->monsterinfo.currentmove = &tank_move_stand;
}


//
// walk
//

void tank_walk (edict_t *self);

mframe_t tank_frames_start_walk [] =
{
	ai_walk,  0, NULL,
	ai_walk,  6, NULL,
	ai_walk,  6, NULL,
	ai_walk, 11, tank_footstep
};
mmove_t	tank_move_start_walk = {FRAME_walk01, FRAME_walk04, tank_frames_start_walk, tank_walk};

mframe_t tank_frames_walk [] =
{
	ai_walk, 4,	NULL,
	ai_walk, 5,	NULL,
	ai_walk, 3,	NULL,
	ai_walk, 2,	NULL,
	ai_walk, 5,	NULL,
	ai_walk, 5,	NULL,
	ai_walk, 4,	NULL,
	ai_walk, 4,	tank_footstep,
	ai_walk, 3,	NULL,
	ai_walk, 5,	NULL,
	ai_walk, 4,	NULL,
	ai_walk, 5,	NULL,
	ai_walk, 7,	NULL,
	ai_walk, 7,	NULL,
	ai_walk, 6,	NULL,
	ai_walk, 6,	tank_footstep
};
mmove_t	tank_move_walk = {FRAME_walk05, FRAME_walk20, tank_frames_walk, NULL};

mframe_t tank_frames_stop_walk [] =
{
	ai_walk,  3, NULL,
	ai_walk,  3, NULL,
	ai_walk,  2, NULL,
	ai_walk,  2, NULL,
	ai_walk,  4, tank_footstep
};
mmove_t	tank_move_stop_walk = {FRAME_walk21, FRAME_walk25, tank_frames_stop_walk, tank_stand};

void tank_walk (edict_t *self)
{
		self->monsterinfo.currentmove = &tank_move_walk;
}


//
// run
//

void tank_run (edict_t *self);

mframe_t tank_frames_start_run [] =
{
	ai_run,  0, NULL,
	ai_run,  6, NULL,
	ai_run,  6, NULL,
	ai_run, 11, tank_footstep
};
mmove_t	tank_move_start_run = {FRAME_walk01, FRAME_walk04, tank_frames_start_run, tank_run};

mframe_t tank_frames_run [] =
{
	ai_run, 4,	NULL,
	ai_run, 5,	NULL,
	ai_run, 3,	NULL,
	ai_run, 2,	NULL,
	ai_run, 5,	NULL,
	ai_run, 5,	NULL,
	ai_run, 4,	NULL,
	ai_run, 4,	tank_footstep,
	ai_run, 3,	NULL,
	ai_run, 5,	NULL,
	ai_run, 4,	NULL,
	ai_run, 5,	NULL,
	ai_run, 7,	NULL,
	ai_run, 7,	NULL,
	ai_run, 6,	NULL,
	ai_run, 6,	tank_footstep
};
mmove_t	tank_move_run = {FRAME_walk05, FRAME_walk20, tank_frames_run, NULL};

mframe_t tank_frames_stop_run [] =
{
	ai_run,  3, NULL,
	ai_run,  3, NULL,
	ai_run,  2, NULL,
	ai_run,  2, NULL,
	ai_run,  4, tank_footstep
};
mmove_t	tank_move_stop_run = {FRAME_walk21, FRAME_walk25, tank_frames_stop_run, tank_walk};

void tank_run (edict_t *self)
{
	if (self->enemy && self->enemy->client)
		self->monsterinfo.aiflags |= AI_BRUTAL;
	else
		self->monsterinfo.aiflags &= ~AI_BRUTAL;

	if (self->monsterinfo.aiflags & AI_STAND_GROUND)
	{
		self->monsterinfo.currentmove = &tank_move_stand;
		return;
	}

	if (self->monsterinfo.currentmove == &tank_move_walk ||
		self->monsterinfo.currentmove == &tank_move_start_run)
	{
		self->monsterinfo.currentmove = &tank_move_run;
	}
	else
	{
		self->monsterinfo.currentmove = &tank_move_start_run;
	}
}

//
// pain
//

mframe_t tank_frames_pain1 [] =
{
	ai_move, 0, NULL,
	ai_move, 0, NULL,
	ai_move, 0, NULL,
	ai_move, 0, NULL
};
mmove_t tank_move_pain1 = {FRAME_pain101, FRAME_pain104, tank_frames_pain1, tank_run};

mframe_t tank_frames_pain2 [] =
{
	ai_move, 0, NULL,
	ai_move, 0, NULL,
	ai_move, 0, NULL,
	ai_move, 0, NULL,
	ai_move, 0, NULL
};
mmove_t tank_move_pain2 = {FRAME_pain201, FRAME_pain205, tank_frames_pain2, tank_run};

mframe_t tank_frames_pain3 [] =
{
	ai_move, -7, NULL,
	ai_move, 0,  NULL,
	ai_move, 0,  NULL,
	ai_move, 0,  NULL,
	ai_move, 2,  NULL,
	ai_move, 0,  NULL,
	ai_move, 0,  NULL,
	ai_move, 3,  NULL,
	ai_move, 0,  NULL,
	ai_move, 2,  NULL,
	ai_move, 0,  NULL,
	ai_move, 0,  NULL,
	ai_move, 0,  NULL,
	ai_move, 0,  NULL,
	ai_move, 0,  NULL,
	ai_move, 0,  tank_footstep
};
mmove_t	tank_move_pain3 = {FRAME_pain301, FRAME_pain316, tank_frames_pain3, tank_run};


void tank_pain (edict_t *self, edict_t *other, float kick, int damage)
{
	if (self->health < (self->max_health / 2))
			self->s.skinnum |= 1;

	if (damage <= 10)
		return;

	if (level.time < self->pain_debounce_time)
			return;

	if (damage <= 30)
		if (random() > 0.2)
			return;
	
	// If hard or nightmare, don't go into pain while attacking
	if ( skill->value >= 2)
	{
		if ( (self->s.frame >= FRAME_attak301) && (self->s.frame <= FRAME_attak330) )
			return;
		if ( (self->s.frame >= FRAME_attak101) && (self->s.frame <= FRAME_attak116) )
			return;
	}

	self->pain_debounce_time = level.time + 3;
	gi.sound (self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0);

	if (skill->value == 3)
		return;		// no pain anims in nightmare

	if (damage <= 30)
		self->monsterinfo.currentmove = &tank_move_pain1;
	else if (damage <= 60)
		self->monsterinfo.currentmove = &tank_move_pain2;
	else
		self->monsterinfo.currentmove = &tank_move_pain3;
};


//
// attacks
//

void TankBlaster (edict_t *self)
{
	vec3_t	forward, right;
	vec3_t	start;
	vec3_t	end;
	vec3_t	dir;
	int		flash_number;

	if (self->s.frame == FRAME_attak110)
		flash_number = MZ2_TANK_BLASTER_1;
	else if (self->s.frame == FRAME_attak113)
		flash_number = MZ2_TANK_BLASTER_2;
	else // (self->s.frame == FRAME_attak116)
		flash_number = MZ2_TANK_BLASTER_3;

	AngleVectors (self->s.angles, forward, right, NULL);
	G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);

	VectorCopy (self->enemy->s.origin, end);
	end[2] += self->enemy->viewheight;
	VectorSubtract (end, start, dir);

	monster_fire_blaster (self, start, dir, 30, 800, flash_number, EF_BLASTER);
}	

void TankStrike (edict_t *self)
{
	gi.sound (self, CHAN_WEAPON, sound_strike, 1, ATTN_NORM, 0);
}	

void TankRocket (edict_t *self)
{
	vec3_t	forward, right;
	vec3_t	start;
	vec3_t	dir;
	vec3_t	vec;
	int		flash_number;

	if (self->s.frame == FRAME_attak324)
		flash_number = MZ2_TANK_ROCKET_1;
	else if (self->s.frame == FRAME_attak327)
		flash_number = MZ2_TANK_ROCKET_2;
	else // (self->s.frame == FRAME_attak330)
		flash_number = MZ2_TANK_ROCKET_3;

	AngleVectors (self->s.angles, forward, right, NULL);
	G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);

	VectorCopy (self->enemy->s.origin, vec);
	vec[2] += self->enemy->viewheight;
	VectorSubtract (vec, start, dir);
	VectorNormalize (dir);

	monster_fire_rocket (self, start, dir, 50, 550, flash_number);
}	

void TankMachineGun (edict_t *self)
{
	vec3_t	dir;
	vec3_t	vec;
	vec3_t	start;
	vec3_t	forward, right;
	int		flash_number;

	flash_number = MZ2_TANK_MACHINEGUN_1 + (self->s.frame - FRAME_attak406);

	AngleVectors (self->s.angles, forward, right, NULL);
	G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);

	if (self->enemy)
	{
		VectorCopy (self->enemy->s.origin, vec);
		vec[2] += self->enemy->viewheight;
		VectorSubtract (vec, start, vec);
		vectoangles (vec, vec);
		dir[0] = vec[0];
	}
	else
	{
		dir[0] = 0;
	}
	if (self->s.frame <= FRAME_attak415)
		dir[1] = self->s.angles[1] - 8 * (self->s.frame - FRAME_attak411);
	else
		dir[1] = self->s.angles[1] + 8 * (self->s.frame - FRAME_attak419);
	dir[2] = 0;

	AngleVectors (dir, forward, NULL, NULL);

	monster_fire_bullet (self, start, forward, 20, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, flash_number);
}	


mframe_t tank_frames_attack_blast [] =
{
	ai_charge, 0,	NULL,
	ai_charge, 0,	NULL,
	ai_charge, 0,	NULL,
	ai_charge, 0,	NULL,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区在线看麻豆| 亚洲美女屁股眼交3| 欧美久久久影院| 色综合久久天天| 日本大香伊一区二区三区| 不卡一区二区在线| 一本久久精品一区二区| 99久免费精品视频在线观看| 不卡的av在线播放| 欧美中文字幕一区二区三区| 欧美日韩在线播放三区四区| 欧美精品1区2区3区| 欧美成人vr18sexvr| 国产日韩欧美制服另类| 国产精品美女久久久久久久久 | 亚洲卡通欧美制服中文| 国产精品高清亚洲| 亚洲最新视频在线观看| 日韩电影在线看| 国产在线不卡一区| 91在线观看美女| 欧美日韩不卡在线| 26uuu精品一区二区在线观看| 国产精品无码永久免费888| 一区二区三区四区视频精品免费| 亚洲国产日韩精品| 国产一区二区91| 91丨九色porny丨蝌蚪| 欧美精品九九99久久| 国产亚洲综合av| 夜夜嗨av一区二区三区网页| 免费在线观看视频一区| 成人免费视频一区二区| 欧美人与z0zoxxxx视频| 国产农村妇女精品| 亚洲1区2区3区4区| 成人综合婷婷国产精品久久蜜臀| 欧美午夜精品久久久久久超碰 | 日本va欧美va欧美va精品| 国产一区二区三区日韩| 99精品久久只有精品| 91精品欧美久久久久久动漫| 久久久久久综合| 亚洲精品国产一区二区精华液| 亚洲精品在线一区二区| 一区二区三区在线免费| 日韩一区精品字幕| 色视频一区二区| 欧美激情一区二区三区在线| 青青草97国产精品免费观看无弹窗版| 99精品在线免费| 国产日韩视频一区二区三区| 丝袜诱惑制服诱惑色一区在线观看| 国产电影精品久久禁18| 欧美成人伊人久久综合网| 亚洲激情自拍偷拍| 波多野结衣的一区二区三区| 精品1区2区在线观看| 日韩激情av在线| 欧美日韩在线精品一区二区三区激情 | 亚洲黄色片在线观看| 91在线免费视频观看| 国产精品久久久久久久久久免费看 | 一本一道波多野结衣一区二区 | 国产高清精品网站| 777欧美精品| 亚洲最大的成人av| 成人av影院在线| 久久久精品黄色| 狠狠色狠狠色合久久伊人| 欧美日韩国产大片| 五月婷婷激情综合| 欧美三级午夜理伦三级中视频| 日韩理论片在线| 精品一二三四区| 777久久久精品| 麻豆国产精品一区二区三区 | 欧美一级艳片视频免费观看| 亚洲成人av一区| 这里只有精品99re| 青草av.久久免费一区| 日韩亚洲欧美在线| 国产揄拍国内精品对白| 国产欧美精品在线观看| 国产a级毛片一区| 日本一区二区三区视频视频| 99久久国产综合色|国产精品| 最新不卡av在线| 欧美日韩国产综合视频在线观看| 日韩综合小视频| 国产日韩欧美精品电影三级在线| 国产精品资源网| 亚洲人123区| 这里只有精品电影| 懂色av中文一区二区三区| 亚洲欧洲av在线| 欧美日韩亚洲国产综合| 另类综合日韩欧美亚洲| 国产日韩欧美精品在线| 91蜜桃免费观看视频| 亚洲一区二区三区不卡国产欧美| 在线亚洲+欧美+日本专区| 午夜精品久久一牛影视| 精品久久久三级丝袜| 激情图片小说一区| **网站欧美大片在线观看| 在线播放国产精品二区一二区四区| 蜜臀av性久久久久蜜臀aⅴ| 中文字幕在线不卡| 3751色影院一区二区三区| 国产一区二区免费看| 亚洲人精品午夜| 欧美日韩高清影院| 国产九色精品成人porny| 亚洲精品国产成人久久av盗摄| 在线免费观看视频一区| 午夜精彩视频在线观看不卡| 国产日韩欧美a| 欧美一区二区三区四区高清| 91在线视频观看| 国产精品亚洲第一区在线暖暖韩国| 亚洲夂夂婷婷色拍ww47| 国产欧美一区二区三区网站| 欧美日韩国产综合一区二区| 99精品视频在线免费观看| 激情深爱一区二区| 三级久久三级久久| 亚洲综合在线第一页| 国产精品久久久久久久久久久免费看| 日韩一本二本av| 欧美情侣在线播放| 91福利在线播放| 色综合一个色综合| 国产成人自拍在线| 国产一区二区女| 国产一区二区三区精品视频| 亚洲成人免费av| 一区二区三区中文在线观看| 亚洲国产电影在线观看| 26uuu精品一区二区| 日韩午夜在线观看视频| 欧美顶级少妇做爰| 欧美精品精品一区| 91麻豆精品国产91久久久久久 | 国产一区视频网站| 韩国精品免费视频| 国内精品国产成人国产三级粉色| 亚洲一区中文在线| 亚洲激情第一区| 亚洲一区二区影院| 亚洲成av人片在线观看| 亚洲网友自拍偷拍| 香蕉久久一区二区不卡无毒影院| 亚洲一区二区三区四区的| 亚洲一区二区四区蜜桃| 亚洲主播在线观看| 亚洲动漫第一页| 午夜精品成人在线| 秋霞国产午夜精品免费视频| 蜜桃视频在线观看一区二区| 人人狠狠综合久久亚洲| 精品一区二区精品| 成人晚上爱看视频| 色久优优欧美色久优优| 欧美日韩高清不卡| 久久综合狠狠综合久久综合88| 久久久久久久久久久电影| 国产日产亚洲精品系列| 亚洲欧洲国产日韩| 午夜私人影院久久久久| 美国毛片一区二区三区| 国产酒店精品激情| 91最新地址在线播放| 在线观看一区二区视频| 日韩欧美中文一区二区| 国产农村妇女毛片精品久久麻豆| 国产精品久久久久久久久免费桃花 | 成人黄色免费短视频| 欧美性猛交xxxx黑人交| 欧美成人一区二区三区 | 99re成人在线| 555www色欧美视频| 国产欧美精品国产国产专区| 亚洲欧美日韩在线播放| 蜜臀久久久久久久| 丰满少妇久久久久久久| 欧美丝袜自拍制服另类| 精品国产乱码91久久久久久网站| 国产精品国产三级国产aⅴ中文| 午夜日韩在线观看| 成人综合在线观看| 欧美一区二区三区视频在线观看| 国产精品色在线| 日韩中文欧美在线| 99久久99久久精品国产片果冻| 日韩欧美一区中文| 一区二区三区免费网站| 国产精品亚洲а∨天堂免在线| 欧美伊人精品成人久久综合97| 久久精品亚洲精品国产欧美kt∨ |