Home | History | Annotate | Download | only in progs
      1 // button and multiple button
      2 
      3 void() button_wait;
      4 void() button_return;
      5 
      6 void() button_wait =
      7 {
      8 	self.state = STATE_TOP;
      9 	self.nextthink = self.ltime + self.wait;
     10 	self.think = button_return;
     11 	activator = self.enemy;
     12 	SUB_UseTargets();
     13 	self.frame = 1;			// use alternate textures
     14 };
     15 
     16 void() button_done =
     17 {
     18 	self.state = STATE_BOTTOM;
     19 };
     20 
     21 void() button_return =
     22 {
     23 	self.state = STATE_DOWN;
     24 	SUB_CalcMove (self.pos1, self.speed, button_done);
     25 	self.frame = 0;			// use normal textures
     26 	if (self.health)
     27 		self.takedamage = DAMAGE_YES;	// can be shot again
     28 };
     29 
     30 
     31 void() button_blocked =
     32 {	// do nothing, just don't ome all the way back out
     33 };
     34 
     35 
     36 void() button_fire =
     37 {
     38 	if (self.state == STATE_UP || self.state == STATE_TOP)
     39 		return;
     40 
     41 	sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
     42 
     43 	self.state = STATE_UP;
     44 	SUB_CalcMove (self.pos2, self.speed, button_wait);
     45 };
     46 
     47 
     48 void() button_use =
     49 {
     50 	self.enemy = activator;
     51 	button_fire ();
     52 };
     53 
     54 void() button_touch =
     55 {
     56 	if (other.classname != "player")
     57 		return;
     58 	self.enemy = other;
     59 	button_fire ();
     60 };
     61 
     62 void() button_killed =
     63 {
     64 	self.enemy = damage_attacker;
     65 	self.health = self.max_health;
     66 	self.takedamage = DAMAGE_NO;	// wil be reset upon return
     67 	button_fire ();
     68 };
     69 
     70 
     71 /*QUAKED func_button (0 .5 .8) ?
     72 When a button is touched, it moves some distance in the direction of it's angle, triggers all of it's targets, waits some time, then returns to it's original position where it can be triggered again.
     73 
     74 "angle"		determines the opening direction
     75 "target"	all entities with a matching targetname will be used
     76 "speed"		override the default 40 speed
     77 "wait"		override the default 1 second wait (-1 = never return)
     78 "lip"		override the default 4 pixel lip remaining at end of move
     79 "health"	if set, the button must be killed instead of touched
     80 "sounds"
     81 0) steam metal
     82 1) wooden clunk
     83 2) metallic click
     84 3) in-out
     85 */
     86 void() func_button =
     87 {
     88 local float		gtemp, ftemp;
     89 
     90 	if (self.sounds == 0)
     91 	{
     92 		precache_sound ("buttons/airbut1.wav");
     93 		self.noise = "buttons/airbut1.wav";
     94 	}
     95 	if (self.sounds == 1)
     96 	{
     97 		precache_sound ("buttons/switch21.wav");
     98 		self.noise = "buttons/switch21.wav";
     99 	}
    100 	if (self.sounds == 2)
    101 	{
    102 		precache_sound ("buttons/switch02.wav");
    103 		self.noise = "buttons/switch02.wav";
    104 	}
    105 	if (self.sounds == 3)
    106 	{
    107 		precache_sound ("buttons/switch04.wav");
    108 		self.noise = "buttons/switch04.wav";
    109 	}
    110 	
    111 	SetMovedir ();
    112 
    113 	self.movetype = MOVETYPE_PUSH;
    114 	self.solid = SOLID_BSP;
    115 	setmodel (self, self.model);
    116 
    117 	self.blocked = button_blocked;
    118 	self.use = button_use;
    119 
    120 	if (self.health)
    121 	{
    122 		self.max_health = self.health;
    123 		self.th_die = button_killed;
    124 		self.takedamage = DAMAGE_YES;
    125 	}
    126 	else
    127 		self.touch = button_touch;
    128 
    129 	if (!self.speed)
    130 		self.speed = 40;
    131 	if (!self.wait)
    132 		self.wait = 1;
    133 	if (!self.lip)
    134 		self.lip = 4;
    135 
    136 	self.state = STATE_BOTTOM;
    137 
    138 	self.pos1 = self.origin;
    139 	self.pos2 = self.pos1 + self.movedir*(fabs(self.movedir*self.size) - self.lip);
    140 };
    141 
    142