#include animscripts\zombie_SetPoseMovement; #include animscripts\combat_utility; #include animscripts\debug; #include common_scripts\utility; #include maps\_utility; #using_animtree ("generic_human"); initAnimTree(animscript) { if ( isValidEnemy( self.a.personImMeleeing ) ) { ImNotMeleeing( self.a.personImMeleeing ); } self ClearAnim( %body, 0.2 ); if ( animscript != "pain" && animscript != "death" ) { self.a.special = "none"; } self.missedSightChecks = 0; IsInCombat(); assertEX( IsDefined( animscript ), "Animscript not specified in initAnimTree" ); self.a.script = animscript; [[self.a.StopCowering]](); } UpdateAnimPose() { assertEX( self.a.movement=="stop" || self.a.movement=="walk" || self.a.movement=="run", "UpdateAnimPose "+self.a.pose+" "+self.a.movement ); self.desired_anim_pose = undefined; } initialize( animscript ) { if ( IsDefined( self.longDeathStarting ) ) { if ( animscript != "pain" && animscript != "death" ) { self DoDamage( self.health + 100, self.origin ); } if ( animscript != "pain" ) { self.longDeathStarting = undefined; self notify( "kill_long_death" ); } } if ( IsDefined( self.a.mayOnlyDie ) && animscript != "death" ) { self DoDamage( self.health + 100, self.origin ); } if ( IsDefined( self.a.postScriptFunc ) ) { scriptFunc = self.a.postScriptFunc; self.a.postScriptFunc = undefined; [[scriptFunc]]( animscript ); } if ( animscript != "death" ) { self.a.nodeath = false; } if ( IsDefined( self.isHoldingGrenade ) && (animscript == "pain" || animscript == "death" || animscript == "flashed") ) { self dropGrenade(); } self.isHoldingGrenade = undefined; self.coverNode = undefined; self.changingCoverPos = false; self.a.scriptStartTime = GetTime(); self.a.atConcealmentNode = false; if ( IsDefined( self.node ) && (self.node.type == "Conceal Crouch" || self.node.type == "Conceal Stand") ) { self.a.atConcealmentNode = true; } initAnimTree( animscript ); UpdateAnimPose(); } should_find_a_new_node() { self.a.next_move_to_new_cover--; if ( self.a.next_move_to_new_cover > 0 ) { return false; } anim_set_next_move_to_new_cover(); return true; } badplacer(time, org, radius) { for (i=0;i GetTime() ); } GetNodeYawToOrigin(pos) { if (IsDefined (self.node)) { yaw = self.node.angles[1] - GetYaw(pos); } else { yaw = self.angles[1] - GetYaw(pos); } yaw = AngleClamp180( yaw ); return yaw; } GetNodeYawToEnemy() { pos = undefined; if ( isValidEnemy( self.enemy ) ) { pos = self.enemy.origin; } else { if (IsDefined (self.node)) { forward = AnglesToForward(self.node.angles); } else { forward = AnglesToForward(self.angles); } forward = vector_scale (forward, 150); pos = self.origin + forward; } if (IsDefined (self.node)) { yaw = self.node.angles[1] - GetYaw(pos); } else { yaw = self.angles[1] - GetYaw(pos); } yaw = AngleClamp180( yaw ); return yaw; } GetCoverNodeYawToEnemy() { pos = undefined; if ( isValidEnemy( self.enemy ) ) { pos = self.enemy.origin; } else { forward = AnglesToForward(self.coverNode.angles + self.animarray["angle_step_out"][self.a.cornerMode]); forward = vector_scale (forward, 150); pos = self.origin + forward; } yaw = self.CoverNode.angles[1] + self.animarray["angle_step_out"][self.a.cornerMode] - GetYaw(pos); yaw = AngleClamp180( yaw ); return yaw; } GetYawToSpot(spot) { pos = spot; yaw = self.angles[1] - GetYaw(pos); yaw = AngleClamp180( yaw ); return yaw; } GetYawToEnemy() { pos = undefined; if ( isValidEnemy( self.enemy ) ) { pos = self.enemy.origin; } else { forward = AnglesToForward(self.angles); forward = vector_scale (forward, 150); pos = self.origin + forward; } yaw = self.angles[1] - GetYaw(pos); yaw = AngleClamp180( yaw ); return yaw; } GetYaw(org) { angles = VectorToAngles(org-self.origin); return angles[1]; } GetYaw2d(org) { angles = VectorToAngles((org[0], org[1], 0)-(self.origin[0], self.origin[1], 0)); return angles[1]; } AbsYawToEnemy() { assert( isValidEnemy( self.enemy ) ); yaw = self.angles[1] - GetYaw(self.enemy.origin); yaw = AngleClamp180( yaw ); if (yaw < 0) { yaw = -1 * yaw; } return yaw; } AbsYawToEnemy2d() { assert( isValidEnemy( self.enemy ) ); yaw = self.angles[1] - GetYaw2d(self.enemy.origin); yaw = AngleClamp180( yaw ); if (yaw < 0) { yaw = -1 * yaw; } return yaw; } AbsYawToOrigin(org) { yaw = self.angles[1] - GetYaw(org); yaw = AngleClamp180( yaw ); if (yaw < 0) { yaw = -1 * yaw; } return yaw; } AbsYawToAngles(angles) { yaw = self.angles[1] - angles; yaw = AngleClamp180( yaw ); if (yaw < 0) { yaw = -1 * yaw; } return yaw; } GetYawFromOrigin(org, start) { angles = VectorToAngles(org-start); return angles[1]; } GetYawToTag(tag, org) { yaw = self GetTagAngles( tag )[1] - GetYawFromOrigin(org, self GetTagOrigin(tag)); yaw = AngleClamp180( yaw ); return yaw; } GetYawToOrigin(org) { yaw = self.angles[1] - GetYaw(org); yaw = AngleClamp180( yaw ); return yaw; } GetEyeYawToOrigin(org) { yaw = self GetTagAngles("TAG_EYE")[1] - GetYaw(org); yaw = AngleClamp180( yaw ); return yaw; } GetCoverNodeYawToOrigin(org) { yaw = self.coverNode.angles[1] + self.animarray["angle_step_out"][self.a.cornerMode] - GetYaw(org); yaw = AngleClamp180( yaw ); return yaw; } isStanceAllowedWrapper( stance ) { if ( IsDefined( self.coverNode ) ) { return self.coverNode doesNodeAllowStance( stance ); } return self IsStanceAllowed( stance ); } choosePose(preferredPose) { if ( !IsDefined( preferredPose ) ) { preferredPose = self.a.pose; } if ( EnemiesWithinStandingRange() ) { preferredPose = "stand"; } switch (preferredPose) { case "stand": if (self isStanceAllowedWrapper("stand")) { resultPose = "stand"; } else if (self isStanceAllowedWrapper("crouch")) { resultPose = "crouch"; } else { println ("No stance allowed! Remaining standing."); resultPose = "stand"; } break; case "crouch": if (self isStanceAllowedWrapper("crouch")) { resultPose = "crouch"; } else if (self isStanceAllowedWrapper("stand")) { resultPose = "stand"; } else { println ("No stance allowed! Remaining crouched."); resultPose = "crouch"; } break; default: println ("utility::choosePose, called in "+self.a.script+" script: Unhandled anim_pose "+self.a.pose+" - using stand."); resultPose = "stand"; break; } return resultPose; } okToMelee(person) { assert( IsDefined( person ) ); if (IsDefined(self.a.personImMeleeing)) { ImNotMeleeing(self.a.personImMeleeing); assert(!IsDefined(self.a.personImMeleeing)); } if (IsDefined(person.a.personMeleeingMe)) { oldAttacker = person.a.personMeleeingMe; if ( IsDefined(oldAttacker.a.personImMeleeing) && oldAttacker.a.personImMeleeing == person ) { return false; } println("okToMelee - Shouldn't get to here"); person.a.personMeleeingMe = undefined; assert(!IsDefined(self.a.personImMeleeing)); assert(!IsDefined(person.a.personMeleeingMe)); return true; } assert(!IsDefined(self.a.personImMeleeing)); assert(!IsDefined(person.a.personMeleeingMe)); return true; } IAmMeleeing(person) { assert(IsDefined(person)); assert(!IsDefined(person.a.personMeleeingMe)); assert(!IsDefined(self.a.personImMeleeing)); person.a.personMeleeingMe = self; self.a.personImMeleeing = person; } ImNotMeleeing(person) { if ( (IsDefined(person)) && (IsDefined(self.a.personImMeleeing)) && (self.a.personImMeleeing==person) ) { assert(IsDefined(person.a.personMeleeingMe)); assert(person.a.personMeleeingMe == self); } if (!IsDefined(person)) { self.a.personImMeleeing = undefined; } else if ( (IsDefined(person.a.personMeleeingMe)) && (person.a.personMeleeingMe==self) ) { person.a.personMeleeingMe = undefined; assert(self.a.personImMeleeing==person); self.a.personImMeleeing = undefined; } assert( !IsDefined(person) || !IsDefined(self.a.personImMeleeing) || (self.a.personImMeleeing!=person) ); assert( !IsDefined(person) || !IsDefined(person.a.personMeleeingMe) || (person.a.personMeleeingMe!=self) ); } GetClaimedNode() { myNode = self.node; if ( IsDefined(myNode) && (self nearNode(myNode) || (IsDefined( self.coverNode ) && myNode == self.coverNode)) ) { return myNode; } return undefined; } GetNodeType() { myNode = GetClaimedNode(); if (IsDefined(myNode)) { return myNode.type; } return "none"; } GetNodeDirection() { myNode = GetClaimedNode(); if (IsDefined(myNode)) { return myNode.angles[1]; } return self.desiredAngle; } GetNodeForward() { myNode = GetClaimedNode(); if (IsDefined(myNode)) { return AnglesToForward ( myNode.angles ); } return AnglesToForward( self.angles ); } GetNodeOrigin() { myNode = GetClaimedNode(); if (IsDefined(myNode)) { return myNode.origin; } return self.origin; } safemod(a,b) { result = int(a) % b; result += b; return result % b; } AngleClamp( angle ) { angleFrac = angle / 360.0; angle = (angleFrac - floor( angleFrac )) * 360.0; return angle; } QuadrantAnimWeights( yaw ) { forwardWeight = (90 - abs(yaw)) / 90; leftWeight = (90 - AbsAngleClamp180(abs(yaw-90))) / 90; result["front"] = 0; result["right"] = 0; result["back"] = 0; result["left"] = 0; if ( IsDefined( self.alwaysRunForward ) ) { assert( self.alwaysRunForward ); result["front"] = 1; return result; } useLeans = GetDvarInt( #"ai_useLeanRunAnimations"); if (forwardWeight > 0) { result["front"] = forwardWeight; if (leftWeight > 0) { result["left"] = leftWeight; } else { result["right"] = -1 * leftWeight; } } else if( useLeans ) { result["back"] = -1 * forwardWeight; if (leftWeight > 0) { result["left"] = leftWeight; } else { result["right"] = -1 * leftWeight; } } else { backWeight = -1 * forwardWeight; if ( leftWeight > backWeight ) { result["left"] = 1; } else if ( leftWeight < forwardWeight ) { result["right"] = 1; } else { result["back"] = 1; } } return result; } getQuadrant(angle) { angle = AngleClamp(angle); if (angle<45 || angle>315) { quadrant = "front"; } else if (angle<135) { quadrant = "left"; } else if (angle<225) { quadrant = "back"; } else { quadrant = "right"; } return quadrant; } IsInSet(input, set) { for (i = set.size - 1; i >= 0; i--) { if (input == set[i]) { return true; } } return false; } playAnim(animation) { if (IsDefined(animation)) { println ("NOW PLAYING: ",animation); self SetFlaggedAnimKnobAllRestart("playAnim", animation, %root, 1, .2, 1); timeToWait = getanimlength(animation); timeToWait = ( 3 * timeToWait ) + 1; self thread NotifyAfterTime("time is up", "time is up", timeToWait); self waittill ("time is up"); self notify("enddrawstring"); } } NotifyAfterTime(notifyString, killmestring, time) { self endon("death"); self endon(killmestring); wait time; self notify (notifyString); } drawString(stringtodraw) { self endon("killanimscript"); self endon("enddrawstring"); for (;;) { wait .05; Print3d ((self GetDebugEye()) + (0,0,8), stringtodraw, (1, 1, 1), 1, 0.2); } } drawStringTime(msg, org, color, timer) { maxtime = timer*20; for (i=0;i 45 ) { if ( IsDefined( atNode ) && atNode.type != "Cover Crouch" && atNode.type != "Conceal Crouch" ) { return false; } if ( pitch > 45 || pitch < anim.coverCrouchLeanPitch - 45 ) { return false; } } return true; } showLines(start, end, end2) { for (;;) { line(start, end, (1,0,0), 1); wait (0.05); line(start, end2, (0,0,1), 1); wait (0.05); } } anim_array(animArray, animWeights) { total_anims = animArray.size; idleanim = RandomInt(total_anims); assert (total_anims); assert (animArray.size == animWeights.size); if (total_anims == 1) { return animArray[0]; } weights = 0; total_weight = 0; for (i = 0; i < total_anims; i++) { total_weight += animWeights[i]; } anim_play = RandomFloat(total_weight); current_weight = 0; for (i = 0; i < total_anims; i++) { current_weight += animWeights[i]; if (anim_play >= current_weight) { continue; } idleanim = i; break; } return animArray[idleanim]; } notForcedCover() { return ((self.a.forced_cover == "none") || (self.a.forced_cover == "Show")); } forcedCover(msg) { return IsDefined(self.a.forced_cover) && (self.a.forced_cover == msg); } print3dtime(timer, org, msg, color, alpha, scale) { newtime = timer / 0.05; for (i=0;i 0); } scriptChange() { self.a.current_script = "none"; self notify (anim.scriptChange); } delayedScriptChange() { wait (0.05); scriptChange(); } getGrenadeModel() { return getWeaponModel(self.grenadeweapon); } sawEnemyMove(timer) { if (!IsDefined(timer)) { timer = 500; } return (GetTime() - self.personalSightTime < timer); } canThrowGrenade() { if (!self.grenadeAmmo) { return false; } if (self.script_forceGrenade) { return true; } return (IsPlayer(self.enemy)); } random_weight (array) { idleanim = RandomInt (array.size); if (array.size > 1) { anim_weight = 0; for (i=0;i 0; } animArrayPickRandom( animname ) { assert( IsDefined( self.a.array ) ); assert( self.a.array[animname].size > 0 ); if ( self.a.array[animname].size > 1 ) { index = RandomInt( self.a.array[animname].size ); } else { index = 0; } return self.a.array[animname][index]; } getAnimEndPos( theanim ) { moveDelta = getMoveDelta( theanim, 0, 1 ); return self localToWorldCoords( moveDelta ); } isValidEnemy( enemy ) { if ( !IsDefined( enemy ) ) { return false; } return true; } damageLocationIsAny( a, b, c, d, e, f, g, h, i, j, k, ovr ) { if ( !IsDefined( a ) ) return false; if ( self.damageLocation == a ) return true; if ( !IsDefined( b ) ) return false; if ( self.damageLocation == b ) return true; if ( !IsDefined( c ) ) return false; if ( self.damageLocation == c ) return true; if ( !IsDefined( d ) ) return false; if ( self.damageLocation == d ) return true; if ( !IsDefined( e ) ) return false; if ( self.damageLocation == e ) return true; if ( !IsDefined( f ) ) return false; if ( self.damageLocation == f ) return true; if ( !IsDefined( g ) ) return false; if ( self.damageLocation == g ) return true; if( !IsDefined( h ) ) return false; if( self.damageLocation == h ) return true; if( !IsDefined( i ) ) return false; if( self.damageLocation == i ) return true; if( !IsDefined( j ) ) return false; if( self.damageLocation == j ) return true; if( !IsDefined( k ) ) return false; if( self.damageLocation == k ) return true; assert(!IsDefined(ovr)); return false; } ragdollDeath( moveAnim ) { self endon ( "killanimscript" ); lastOrg = self.origin; moveVec = (0,0,0); for ( ;; ) { wait ( 0.05 ); force = distance( self.origin, lastOrg ); lastOrg = self.origin; if ( self.health == 1 ) { self.a.nodeath = true; self startRagdoll(); self ClearAnim( moveAnim, 0.1 ); wait ( 0.05 ); physicsExplosionSphere( lastOrg, 600, 0, force * 0.1 ); self notify ( "killanimscript" ); return; } } } isCQBWalking() { return IsDefined( self.cqbwalking ) && self.cqbwalking; } squared( value ) { return value * value; } randomizeIdleSet() { self.a.idleSet = RandomInt( 2 ); } getRandomIntFromSeed( intSeed, intMax ) { assert( intMax > 0 ); index = intSeed % anim.randomIntTableSize; return anim.randomIntTable[ index ] % intMax; } is_banzai() { return IsDefined( self.banzai ) && self.banzai; } is_heavy_machine_gun() { return IsDefined( self.heavy_machine_gunner ) && self.heavy_machine_gunner; } is_zombie() { if (IsDefined(self.is_zombie) && self.is_zombie) { return true; } return false; } is_civilian() { if (IsDefined(self.is_civilian) && self.is_civilian) { return true; } return false; } is_zombie_gibbed() { return ( self is_zombie() && self.gibbed ); } set_zombie_gibbed() { if ( self is_zombie() ) { self.gibbed = true; } } is_skeleton(skeleton) { if ((skeleton == "base") && IsSubStr(get_skeleton(), "scaled")) { return true; } return (get_skeleton() == skeleton); } get_skeleton() { if (IsDefined(self.skeleton)) { return self.skeleton; } else { return "base"; } } debug_anim_print( text ) { } debug_turn_print( text, line ) { }