/* * $Header: /HexenWorld/Siege/warhorse.hc 3 5/25/98 1:39p Mgummelt $ */ /* ============================================================================== Q:\art\models\monsters\RdrWar\Horse\Final\warhorse.hc ============================================================================== */ // For building the model $cd Q:\art\models\monsters\RdrWar\Horse\Final $origin 0 0 0 $base base skin $skin skin $flags 0 // Horse frames $frame HaxeD1 HaxeD2 HaxeD3 HaxeD4 HaxeD5 $frame HaxeD6 HaxeD7 HaxeD8 HaxeD9 HaxeD10 $frame HaxeD11 HaxeD12 HaxeD13 HaxeD14 HaxeD15 // $frame HgallA1 HgallA2 HgallA3 HgallA4 HgallA5 $frame HgallA6 HgallA7 HgallA8 HgallA9 HgallA10 $frame HgallA11 HgallA12 // $frame HgallB1 HgallB2 HgallB3 HgallB4 HgallB5 $frame HgallB6 HgallB7 HgallB8 HgallB9 HgallB10 $frame HgallB11 HgallB12 HgallB13 HgallB14 HgallB15 $frame HgallB16 // $frame HgallC1 HgallC2 HgallC3 HgallC4 HgallC5 $frame HgallC6 HgallC7 HgallC8 HgallC9 HgallC10 $frame HgallC11 HgallC12 HgallC13 HgallC14 HgallC15 $frame HgallC16 HgallC17 HgallC18 HgallC19 HgallC20 // $frame Hrear1 Hrear2 Hrear3 Hrear4 Hrear5 $frame Hrear6 Hrear7 Hrear8 Hrear9 Hrear10 $frame Hrear11 Hrear12 Hrear13 Hrear14 Hrear15 $frame Hrear16 Hrear17 Hrear18 Hrear19 Hrear20 $frame Hrear21 Hrear22 Hrear23 Hrear24 Hrear25 $frame Hrear26 Hrear27 Hrear28 Hrear29 Hrear30 $frame Hrear31 Hrear32 Hrear33 Hrear34 Hrear35 $frame Hrear36 Hrear37 Hrear38 Hrear39 Hrear40 // $frame HtranA1 HtranA2 HtranA3 HtranA4 HtranA5 $frame HtranA6 HtranA7 HtranA8 HtranA9 HtranA10 $frame HtranA11 HtranA12 HtranA13 HtranA14 HtranA15 $frame HtranA16 // $frame HtranB1 HtranB2 HtranB3 HtranB4 HtranB5 $frame HtranB6 HtranB7 HtranB8 HtranB9 HtranB10 $frame HtranB11 HtranB12 $framevalue 0 // Rider Frames $frame RaxeA1 RaxeA2 RaxeA3 RaxeA4 RaxeA5 $frame RaxeA6 RaxeA7 RaxeA8 RaxeA9 RaxeA10 $frame RaxeA11 RaxeA12 // $frame RaxeB1 RaxeB2 RaxeB3 RaxeB4 RaxeB5 $frame RaxeB6 RaxeB7 RaxeB8 RaxeB9 RaxeB10 $frame RaxeB11 RaxeB12 RaxeB13 RaxeB14 RaxeB15 $frame RaxeB16 // $frame RaxeC1 RaxeC2 RaxeC3 RaxeC4 RaxeC5 $frame RaxeC6 RaxeC7 RaxeC8 RaxeC9 RaxeC10 $frame RaxeC11 RaxeC12 RaxeC13 RaxeC14 RaxeC15 $frame RaxeC16 RaxeC17 RaxeC18 RaxeC19 RaxeC20 // $frame RaxeD1 RaxeD2 RaxeD3 RaxeD4 RaxeD5 $frame RaxeD6 RaxeD7 RaxeD8 RaxeD9 RaxeD10 $frame RaxeD11 RaxeD12 RaxeD13 RaxeD14 RaxeD15 // $frame RgallA1 RgallA2 RgallA3 RgallA4 RgallA5 $frame RgallA6 RgallA7 RgallA8 RgallA9 RgallA10 $frame RgallA11 RgallA12 // $frame RgallB1 RgallB2 RgallB3 RgallB4 RgallB5 $frame RgallB6 RgallB7 RgallB8 RgallB9 RgallB10 $frame RgallB11 RgallB12 RgallB13 RgallB14 RgallB15 $frame RgallB16 // $frame RgallC1 RgallC2 RgallC3 RgallC4 RgallC5 $frame RgallC6 RgallC7 RgallC8 RgallC9 RgallC10 $frame RgallC11 RgallC12 RgallC13 RgallC14 RgallC15 $frame RgallC16 RgallC17 RgallC18 RgallC19 RgallC20 // $frame Rrear1 Rrear2 Rrear3 Rrear4 Rrear5 $frame Rrear6 Rrear7 Rrear8 Rrear9 Rrear10 $frame Rrear11 Rrear12 Rrear13 Rrear14 Rrear15 $frame Rrear16 Rrear17 Rrear18 Rrear19 Rrear20 $frame Rrear21 Rrear22 Rrear23 Rrear24 Rrear25 $frame Rrear26 Rrear27 Rrear28 Rrear29 Rrear30 $frame Rrear31 Rrear32 Rrear33 Rrear34 Rrear35 $frame Rrear36 Rrear37 Rrear38 Rrear39 Rrear40 // $frame RtranA1 RtranA2 RtranA3 RtranA4 RtranA5 $frame RtranA6 RtranA7 RtranA8 RtranA9 RtranA10 $frame RtranA11 RtranA12 RtranA13 RtranA14 RtranA15 $frame RtranA16 // $frame RtranB1 RtranB2 RtranB3 RtranB4 RtranB5 $frame RtranB6 RtranB7 RtranB8 RtranB9 RtranB10 $frame RtranB11 RtranB12 void death_missile_2(float dir); float war_start[3] = { $HgallA1, $HgallB1, $HgallC1 }; float war_end[3] = { $HgallA12, $HgallB16, $HgallC20 }; float war_speed[3] = { 12, 10, 6 }; // Array to align frames float WarRiderFrames[23] = { $RgallA1, // Animation for fast gallop $RgallB1, // Animation for medium gallop $RgallC1, // Animation for slow gallop $RtranA1, // Animation for start of rear $Rrear1, // Animation for rear $RtranB1, // Animation for end of rear $RaxeA1, // Animation for attack #1 $RaxeA8, // Attack Frame 1 $RaxeA9, // Attack Frame 2 $Rrear39, // Attack Frame 1 $RaxeD1, // Standing / Attack $RaxeD9, // Attack Frame 1 $RaxeD10, // Attack Frame 2 $RaxeD13, // Attack Frame 3 $RaxeB1, // Animation for attack #2 $RaxeB10, // Attack Frame 1 $RaxeB12, // Attack Frame 2 $RaxeB13, // Attack Frame 3 $RaxeC1, // Animation for attack #3 $RaxeC12, // Attack Frame 1 $RaxeC13, // Attack Frame 2 $RaxeC14, // Attack Frame 3 $RaxeC15 // Attack Frame 4 }; float WH_STAGE_NORMAL = 0; float WH_STAGE_BEGIN_REAR = 1; float WH_STAGE_MIDDLE_REAR = 2; float WH_STAGE_END_REAR = 3; float WH_STAGE_ATTACK = 4; float WH_STAGE_STANDING = 5; // Frame Code void waraxe_touch(void) { if (other.health) { if(other.thingtype==THINGTYPE_FLESH) { sound(other,CHAN_AUTO,"weapons/slash.wav",1,ATTN_NORM); MeatChunks (self.origin,randomv('-100 -100 100','100 100 300'), 2,other); } if(other.health0) // warhorse_gain(hp_save);//He gets your health? } remove(self); } void waraxe_move(void) { vector vec; // vector v2,v3; // float neg_offset; thinktime self : 0.1; if (!self.owner.flags2 & FL_ALIVE) { self.velocity_z -= 20; return; } if (self.lifetime < time) { self.velocity_z -= 20; return; } if (self.enemy.health > 0) { HomeThink(); vec = vectoangles(self.velocity); if (self.waraxe_horizontal) { self.angles_y = vec_y + 40; self.angles_x = vec_x + self.cnt; } else { self.angles_y = vec_y + self.cnt; } } } void waraxe(entity new_target, vector offset, float horizontal) { entity axe; vector vec; if(horizontal&&random()<0.3+skill/10) return; axe = spawn(); axe.movetype = MOVETYPE_FLYMISSILE; axe.solid = SOLID_BBOX; setmodel (axe, "models/boss/waraxe.mdl"); axe.skin = 0; setsize (axe, '0 0 0', '0 0 0'); axe.lockentity = axe.enemy = new_target; axe.owner = self; makevectors(self.angles); setorigin (axe, self.origin + offset_x*v_right + offset_y*v_forward + offset_z*v_up); sound(axe,CHAN_WEAPON,"war/fire.wav",1,ATTN_NORM); axe.waraxe_horizontal = horizontal; axe.th_die=SUB_Remove; vec = offset_x*v_right + offset_y*v_forward; vec = normalize(vec); axe.speed=random(500,600); axe.velocity = vec*axe.speed; axe.angles = vectoangles(axe.velocity); if (axe.waraxe_horizontal) { axe.angles_y += 40; if (random() < 0.5) axe.cnt = random(65,80); else axe.cnt = random(100,115); axe.angles_x += axe.cnt; axe.avelocity = '0 0 800'; axe.turn_time=2; //Lower the number, tighter the turn axe.skin = 0; axe.dmg=random(20,30); } else { axe.angles_x = random(-10,10); if (random() < 0.5) axe.cnt = random(70,80); else axe.cnt = random(100,110); axe.angles_y += axe.cnt; axe.angles_z = -90; axe.avelocity = '0 0 800'; axe.turn_time=1; //Lower the number, tighter the turn // 0.5 - 1 axe.skin = 1; axe.dmg=random(60,80); } axe.drawflags = MLS_ABSLIGHT; axe.abslight = 0.5; axe.think = waraxe_move; axe.touch = waraxe_touch; thinktime axe : HX_FRAME_TIME; axe.lifetime = time + 5; } void war_pain () { if(self.pain_finished>time) return; sound(self,CHAN_VOICE,"war/laugh_sm.wav",1,ATTN_NONE); self.pain_finished=time + 5; } void create_warrider(entity horse) { entity rider; rider = spawn(); rider.solid = SOLID_NOT; rider.movetype = MOVETYPE_NOCLIP; rider.origin = horse.origin; rider.angles = self.angles; setmodel (rider, "models/boss/warrider.mdl"); setsize(rider,'0 0 0','0 0 0'); rider.skin = 0; horse.movechain = rider; rider.flags (+) FL_MOVECHAIN_ANGLE; } void warhorse_move(void); void warhorse_rear(void) { float retval; thinktime self : HX_FRAME_TIME; if (self.monster_stage == WH_STAGE_BEGIN_REAR) { self.speed = self.speed / 1.2; riderpath_move(self.speed); retval = AdvanceFrame($HtranA1,$HtranA16); if(self.frame==$HtranA8) sound(self,CHAN_ITEM,"war/whinbig.wav",1,ATTN_NORM); if (retval == AF_END) { sound(self,CHAN_VOICE,"war/fire_big.wav",1,ATTN_NORM); self.monster_stage = WH_STAGE_MIDDLE_REAR; } self.movechain.frame = WarRiderFrames[3] + (self.frame - $HtranA1); } else if (self.monster_stage == WH_STAGE_MIDDLE_REAR) { retval = AdvanceFrame($Hrear1,$Hrear40); if (retval == AF_END) { if (self.enemy != world && random() < 0.7) self.monster_stage = WH_STAGE_STANDING; else self.monster_stage = WH_STAGE_END_REAR; } self.movechain.frame = WarRiderFrames[4] + (self.frame - $Hrear1); if (self.movechain.frame == WarRiderFrames[9]) { if (!self.enemy) LocateTarget(); if (self.enemy) waraxe(self.enemy,'1 2 70',0); } } else if (self.monster_stage == WH_STAGE_STANDING) { retval = AdvanceFrame($HaxeD1,$HaxeD15); if (retval == AF_END) { if (random() < 0.5) self.monster_stage = WH_STAGE_END_REAR; } self.movechain.frame = WarRiderFrames[10] + (self.frame - $HaxeD1); if (!self.enemy) LocateTarget(); if (self.enemy) { if (self.movechain.frame == WarRiderFrames[11]) waraxe(self.enemy,'3 3 82',1); else if (self.movechain.frame == WarRiderFrames[12]) waraxe(self.enemy,'-3 3 70',1); else if (self.movechain.frame == WarRiderFrames[13]) waraxe(self.enemy,'-1 3 75',1); } } else if (self.monster_stage == WH_STAGE_END_REAR) { retval = AdvanceFrame($HtranB1,$HtranB12); if (self.frame == $HtranB4) sound (self, CHAN_BODY, "boss/wartrot3.wav", 1, ATTN_NORM); if (retval == AF_END) { self.think = warhorse_move; self.monster_stage = WH_STAGE_NORMAL; self.speed = war_speed[self.rider_gallop_mode]; } else self.speed = self.speed * 1.3; riderpath_move(self.speed); self.movechain.frame = WarRiderFrames[5] + (self.frame - $HtranB1); } } void warhorse_move(void) { float retval; if(!self.enemy.flags2&FL_ALIVE&&self.enemy!=world) { self.enemy=world; sound(self,CHAN_VOICE,"war/laugh.wav",1,ATTN_NONE); } self.think = warhorse_move; thinktime self : HX_FRAME_TIME; self.movechain.angles_x = self.angles_x = 0; self.movechain.angles_z = self.angles_z = 0; retval = AdvanceFrame(war_start[self.rider_gallop_mode],war_end[self.rider_gallop_mode]); if (!self.path_current) { riderpath_init(); } if(random(100)==1) sound(self,CHAN_ITEM,"war/whinny.wav",1,ATTN_NORM); riderpath_move(self.speed); if (retval == AF_BEGINNING) { retval = fabs(self.rider_y_change); if (retval >= 15) { if (self.rider_gallop_mode >= 1) self.rider_gallop_mode = 2; else self.rider_gallop_mode = 1; } else { if (self.rider_gallop_mode <= 1) self.rider_gallop_mode = 0; else self.rider_gallop_mode = 1; } // Force a new gallop frame in self.frame = war_start[self.rider_gallop_mode]; if (retval < 1 && random() < 0.1) { self.think = warhorse_rear; self.monster_stage = WH_STAGE_BEGIN_REAR; } else if (self.rider_gallop_mode == 0) { if (!self.enemy) LocateTarget(); if (self.enemy) { self.monster_stage = WH_STAGE_ATTACK; } } else if (self.rider_gallop_mode == 1) { if (!self.enemy) LocateTarget(); if (self.enemy) { self.monster_stage = WH_STAGE_ATTACK; } } else if (self.rider_gallop_mode == 2) { if (!self.enemy) LocateTarget(); if (self.enemy) { self.monster_stage = WH_STAGE_ATTACK; } } if (self.monster_stage != WH_STAGE_BEGIN_REAR) { if (self.rider_gallop_mode == 0) sound (self, CHAN_BODY, "boss/wartrot1.wav", 1, ATTN_NORM); else if (self.rider_gallop_mode == 0) sound (self, CHAN_BODY, "boss/wartrot2.wav", 1, ATTN_NORM); else sound (self, CHAN_BODY, "boss/wartrot3.wav", 1, ATTN_NORM); } } if (self.monster_stage == WH_STAGE_ATTACK) { if (self.rider_gallop_mode == 0) { self.movechain.frame = WarRiderFrames[6] + (self.frame - war_start[self.rider_gallop_mode]); if (self.movechain.frame == WarRiderFrames[7]) waraxe(self.enemy,'3 3 82',1); else if (self.movechain.frame == WarRiderFrames[8]) { waraxe(self.enemy,'-3 3 70',1); //waraxe(self.enemy,'0 3 70',1); } } else if (self.rider_gallop_mode == 1) { self.movechain.frame = WarRiderFrames[14] + (self.frame - war_start[self.rider_gallop_mode]); if (self.movechain.frame == WarRiderFrames[15]) waraxe(self.enemy,'3 3 82',1); else if (self.movechain.frame == WarRiderFrames[16]) { waraxe(self.enemy,'-3 3 70',1); } else if (self.movechain.frame == WarRiderFrames[17]) { waraxe(self.enemy,'0 3 70',1); } } else if (self.rider_gallop_mode == 2) { self.movechain.frame = WarRiderFrames[18] + (self.frame - war_start[self.rider_gallop_mode]); if (self.movechain.frame == WarRiderFrames[19]) waraxe(self.enemy,'3 3 82',1); else if (self.movechain.frame == WarRiderFrames[20]) { waraxe(self.enemy,'2 3 78',1); } else if (self.movechain.frame == WarRiderFrames[21]) { waraxe(self.enemy,'0 3 74',1); } else if (self.movechain.frame == WarRiderFrames[22]) { waraxe(self.enemy,'-3 3 70',1); } } } else { self.movechain.frame = WarRiderFrames[self.rider_gallop_mode] + (self.frame - war_start[self.rider_gallop_mode]); } // make sure we use the last attack frame before we go out of the mode if (retval == AF_END) { self.monster_stage = WH_STAGE_NORMAL; } if (fabs(war_speed[self.rider_gallop_mode] - self.speed) < 0.2) self.speed = war_speed[self.rider_gallop_mode]; else if (war_speed[self.rider_gallop_mode] > self.speed) self.speed += 0.2; else self.speed -= 0.2; } void war_wait() { self.think = warhorse_move; thinktime self : 1; } /*QUAKED rider_war (1 0 0) (-50 -50 -24) (50 50 100) TRIGGER_WAIT War rider monster. You must place rider_path entites on the map. The rider will first proceed to the rider_path point with a path_id of 1. -------------------------FIELDS------------------------- map: next map to go to when you kill the rider target: start spot on the next map -------------------------------------------------------- */ void rider_war(void) { if (deathmatch) { remove(self); return; } precache_model2 ("models/boss/warhorse.mdl"); precache_model2 ("models/boss/warrider.mdl"); precache_model2 ("models/boss/waraxe.mdl"); precache_sound2 ("war/fire_big.wav"); precache_sound2 ("war/die.wav"); precache_sound2 ("war/laugh.wav"); precache_sound2 ("war/laugh_sm.wav"); precache_sound2 ("war/fire.wav"); precache_sound2 ("war/whinny.wav"); precache_sound2 ("war/whinbig.wav"); precache_sound2 ("boss/wartrot1.wav"); precache_sound2 ("boss/wartrot2.wav"); precache_sound2 ("boss/wartrot3.wav"); rider_init(); self.noise="war/die.wav"; self.solid = SOLID_SLIDEBOX; self.movetype = MOVETYPE_STEP; self.thingtype = THINGTYPE_FLESH; self.monsterclass = CLASS_BOSS; self.yaw_speed = 2; self.experience_value = 2000; setmodel (self, "models/boss/warhorse.mdl"); self.skin = 0; self.flags (+) FL_MONSTER; self.flags2(+) FL_ALIVE; setsize (self, '-50 -50 0', '50 50 124'); self.hull = HULL_POINT; self.health = 6000; self.rider_gallop_mode = 2; self.speed = war_speed[self.rider_gallop_mode]; self.rider_path_distance = 200; self.monster_stage = WH_STAGE_NORMAL; self.mass = 30000; self.use = war_wait; self.th_pain=war_pain; create_warrider(self); self.th_save = SUB_Null; self.think = multiplayer_health; thinktime self : 1; //war_wait(); } void rider_quake_touch(void) { // if (other.flags & FL_JUMPRELEASED) other.flags -= FL_JUMPRELEASED; other.flags (-) FL_ONGROUND; other.adjust_velocity_z = random(80,230); other.punchangle_x = random(-4,4); other.punchangle_y = random(-4,4); other.punchangle_z = random(-4,4); } void rider_quake_think(void) { if (self.wrq_count <= 0) { self.think = self.touch = SUB_Null; return; } thinktime self : HX_FRAME_TIME; self.ltime = time; // self.origin_z = random(-1,1); self.velocity_z = random(-30,30); if (self.origin_z - self.oldorigin_z > 5) self.velocity_z = random(-15,-5); else if (self.origin_z - self.oldorigin_z < -5) self.velocity_z = random(5,15); /* self.avelocity_x = random(-5,5); if (self.angles_x > 3) self.avelocity_x = random(-30,-10); if (self.angles_x < -3) self.avelocity_x = random(10,30); self.avelocity_y = random(-5,5); if (self.angles_y > 3) self.avelocity_y = random(-30,-10); if (self.angles_y < -3) self.avelocity_y = random(10,30); self.avelocity_z = random(-5,5); if (self.angles_z > 3) self.avelocity_z = random(-30,-10); if (self.angles_z < -3) self.avelocity_z = random(10,30);*/ } /*QUAKED rider_quake (1 0 0) ? -------------------------FIELDS------------------------- -------------------------------------------------------- */ void rider_quake(void) { self.solid = SOLID_BSP; self.movetype = MOVETYPE_PUSH; setorigin (self, self.origin); setmodel (self, self.model); self.oldorigin = self.origin; self.wrq_count = 0; if (self.abslight) self.drawflags (+) MLS_ABSLIGHT; } void rider_quake_center_think(void) { entity item; endeffect(MSG_ALL, self.wrq_effect_id); item = findradius(self.origin, self.wrq_radius); while (item) { if (item.classname == "rider_quake") { item.wrq_count -= 1; } item = item.chain; } self.think = SUB_Null; } void rider_quake_center_use(void) { entity item; vector real_origin; return; if (self.think != SUB_Null) return; self.think = rider_quake_center_think; thinktime self : random(7,22); self.wrq_radius = 500; // real_origin_x = self.absmin_x + ((self.absmax_x - self.absmin_x) / 2); // real_origin_y = self.absmin_y + ((self.absmax_y - self.absmin_y) / 2); // real_origin_z = self.absmin_z + ((self.absmax_z - self.absmin_z) / 2); real_origin = self.origin; self.wrq_effect_id = starteffect(CE_QUAKE, real_origin, (self.wrq_radius/3)); item = findradius(self.origin, self.wrq_radius); while (item) { if (item.classname == "rider_quake") { item.think = rider_quake_think; thinktime item : HX_FRAME_TIME; item.ltime = time; item.touch = rider_quake_touch; item.wrq_count += 1; } item = item.chain; } } /*QUAKED rider_quake_center (1 0 0) (-8 -8 -8) (8 8 8) -------------------------FIELDS------------------------- -------------------------------------------------------- */ void rider_quake_center(void) { setorigin (self, self.origin); setmodel (self, "models/null.spr"); self.use = rider_quake_center_use; self.think = SUB_Null; }