/* * $Header: /H3/game/hcode/sunstaff.hc 54 9/07/97 9:42a Mgummelt $ */ /* ============================================================================== Q:\art\models\weapons\sunstaff\final\newfinal\sunstaff.hc MG ============================================================================== */ // For building the model $cd Q:\art\models\weapons\sunstaff\final\newfinal $origin 0 0 0 $base BASE skin $skin skin $flags 0 // $frame fircyc1 fircyc2 fircyc3 fircyc4 fircyc5 $frame fircyc6 fircyc7 fircyc8 fircyc9 fircyc10 // $frame fire1 fire2 fire3 fire4 // $frame idle1 idle2 idle3 idle4 idle5 $frame idle6 idle7 idle8 idle9 idle10 $frame idle11 idle12 idle13 idle14 idle15 $frame idle16 idle17 idle18 idle19 idle20 $frame idle21 idle22 idle23 idle24 idle25 $frame idle26 idle27 idle28 idle29 idle30 $frame idle31 // $frame select1 select2 select3 select4 select5 $frame select6 select7 select8 select9 select10 $frame select11 select12 select13 select14 // $frame settle1 settle2 settle3 settle4 settle5 void FireSunstaff (vector dir, float ofs) { vector org1,org2, vec, dir, endspot,endplane; float remainder, reflect_count,damg; //Draw a larger pulsating transparent yellow beam, //rotating, with a smaller solid white beam in the //center. Player casts brightlight while using it. //each point reflection has a double-sphere similar //to the beam. Each reflection does 3/4 less damage. //primary damage = 37? if(self.attack_finished>time) return; if(self.t_width0&&reflect_count<2) { org1 = endspot; dir +=2*endplane; vec = org1 + normalize(dir)*remainder; //FIXME: what about reflective triggers? traceline (org1,vec,TRUE,self); endspot=trace_endpos; endplane=trace_plane_normal; remainder-=remainder*trace_fraction; reflect_count+=1; WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); WriteByte (MSG_BROADCAST, TE_STREAM_SUNSTAFF1); WriteEntity (MSG_BROADCAST, self); WriteByte (MSG_BROADCAST, ofs+reflect_count); WriteByte (MSG_BROADCAST, 2); WriteCoord (MSG_BROADCAST, org1_x); WriteCoord (MSG_BROADCAST, org1_y); WriteCoord (MSG_BROADCAST, org1_z); WriteCoord (MSG_BROADCAST, trace_endpos_x); WriteCoord (MSG_BROADCAST, trace_endpos_y); WriteCoord (MSG_BROADCAST, trace_endpos_z); LightningDamage (org1, trace_endpos+normalize(dir)*7, self, damg/2,"sunbeam"); } } void() FireSunstaffPower = { /* Will fire a main thick beam that will reflect off walls and cut through stuff. Two beams on side will waver a bit and track at + & - 45 degrees. If the main beam hits something, the two secondary beams will pull forward and lock on as well. */ vector dir1,dir2; makevectors(self.v_angle); //NOTE: Maybe extra beams cycle around- rotate around 1st beam. dir1=(v_forward+v_right)*0.5; dir2=(v_forward+(v_right*-1))*0.5; FireSunstaff(normalize(v_forward),0); FireSunstaff(dir1,4); FireSunstaff(dir2,8); }; void()sunstaff_ready_loop; void() Cru_Sun_Fire; void sunstaff_fire_settle () { self.wfs = advanceweaponframe($settle1,$settle5); self.th_weapon=sunstaff_fire_settle; if(self.wfs==WF_CYCLE_WRAPPED) { self.effects(-)EF_BRIGHTLIGHT; self.last_attack=time; sunstaff_ready_loop(); } } void sunstaff_fire_loop () { self.wfs = advanceweaponframe($fircyc1,$fircyc10); self.th_weapon=sunstaff_fire_loop; if(self.attack_finished<=time&&self.button0&&self.greenmana>=2&&self.bluemana>=2) { if(self.artifact_active&ART_TOMEOFPOWER) { FireSunstaffPower(); self.greenmana-=2; self.bluemana-=2; } else { makevectors(self.v_angle); FireSunstaff(v_forward,0); self.greenmana-=0.35; self.bluemana-=0.35; } self.attack_finished=time + 0.05; } if(self.wfs==WF_CYCLE_WRAPPED&&(!self.button0||self.greenmana<2||self.bluemana<2)) { self.effects(-)EF_BRIGHTLIGHT; sunstaff_fire_settle(); } } void sunstaff_fire (void) { self.wfs = advanceweaponframe($fire1,$fire4); self.th_weapon=sunstaff_fire; if(self.wfs==WF_CYCLE_WRAPPED) sunstaff_fire_loop(); } void() Cru_Sun_Fire = { if(self.weaponframe<$idle1 || self.weaponframe>$idle31) return; sound (self, CHAN_AUTO, "crusader/sunstart.wav", 1, ATTN_NORM); self.th_weapon=sunstaff_fire; thinktime self : 0; }; void sunstaff_ready_loop (void) { self.wfs = advanceweaponframe($idle1,$idle31); self.th_weapon=sunstaff_ready_loop; } void sunstaff_select (void) { //go to ready loop, not relaxed? self.wfs = advanceweaponframe($select1,$select14); self.weaponmodel = "models/sunstaff.mdl"; self.th_weapon=sunstaff_select; self.last_attack=time; if(self.wfs==WF_CYCLE_WRAPPED) { self.attack_finished = time - 1; sunstaff_ready_loop(); } } void sunstaff_deselect (void) { //go to ready loop, not relaxed? self.wfs = advanceweaponframe($select14,$select1); self.th_weapon=sunstaff_deselect; if(self.wfs==WF_CYCLE_WRAPPED) W_SetCurrentAmmo(); }