// this script was compiled with wurst 1.7.0.0-jenkins-Wurst-597 globals integer AI_STATE_AGGRESSIVE=0 integer AI_STATE_RETREAT=0 integer AI_BEAST_ID=0 integer AI_THUNDER_CD=0 player AI_tempPlayer=null unit AI_tempUnit=null group AI_grp=null unit AI_hunterLeader=null real AI_CLOCK_PERIOD=0. player array AI_players integer AI_count=0 timer AI_clock=null real Basics_ANIMATION_PERIOD=0. string BeastAttack_FX=null string BeastAttack_BLOOD_FX=null string BeastAttack_THUNDER_FX_BIG=null string BeastAttack_THUNDER_FX=null integer BeastAttack_DOT_EXCLUSIVITY=0 integer BeastAttack_THUNDER_EXCLUSIVITY=0 integer BeastAttack_STUDDED_LEATHER_ID=0 real BeastAttack_BASE_DAMAGE=0. real BeastAttack_LEATHER_DAMAGE_REDUCTION=0. real BeastAttack_DAMAGE_PER_SECOND=0. real BeastAttack_DOT_DURATION=0. real BeastAttack_THUNDER_DURATION=0. real BeastAttack_THUNDER_BONUS_MULTIPLIER=0. real BinocularVision_CLOCK_PERIOD=0. real BinocularVision_OFFSET=0. real BinocularVision_RADIUS=0. fogmodifier array BinocularVision_lSight integer Blink_BLINK_ID=0 string CameraControl_FILTER_MASK=null timer CameraControl_hunterFadeContinueTimer=null timer CameraControl_hunterFadeFinishTimer=null timer CameraControl_beastFadeContinueTimer=null timer CameraControl_beastFadeFinishTimer=null string Cinematic_TIP_SOUND=null string Cinematic_START_SOUND=null string Cinematic_TITLE_ONE=null string Cinematic_TITLE_TWO=null string Cinematic_TITLE_THREE=null string Cinematic_TITLE_BEAST_ONE=null string Cinematic_TITLE_BEAST_TWO=null string Cinematic_TITLE_BEAST_THREE=null string Cinematic_HUMAN_INTRO_TEXT=null string Cinematic_FORTRESS_EXPOSITION=null string Cinematic_TOWNS_EXPOSITION=null string Cinematic_CLASS_DIVIDE_EXPOSITION=null string Cinematic_EXPOSITION_BEAST_SITUATION=null string Cinematic_HUNTERS_HALL_EXPOSITION=null string Cinematic_HUNTER_COMPARISON=null string Cinematic_RUNE_LOCATION_EXPOSITION=null string Cinematic_ROUND_OBJECTIVE_EXPLANATION=null string Cinematic_HUMAN_PROPERTIES=null string Cinematic_BEAST_TELEPATHY=null string Cinematic_HOW_TO_SHOOT=null real Cinematic_MINIMAP_X=0. real Cinematic_MINIMAP_Y=0. real Cinematic_MINIMAP_AOA=0. real Cinematic_MINIMAP_DISTANCE=0. real Cinematic_FARM_X=0. real Cinematic_FARM_Y=0. real Cinematic_FARM_AOA=0. real Cinematic_FARM_DISTANCE=0. real Cinematic_FARM_ROTATION=0. real Cinematic_FOREST_X=0. real Cinematic_FOREST_Y=0. real Cinematic_FOREST_AOA=0. real Cinematic_FOREST_DISTANCE=0. real Cinematic_CASTLE_X=0. real Cinematic_CASTLE_Y=0. real Cinematic_NORTH_X=0. real Cinematic_NORTH_Y=0. real Cinematic_SOUTH_X=0. real Cinematic_SOUTH_Y=0. real Cinematic_MTN_X=0. real Cinematic_MTN_Y=0. real Cinematic_HALL_X=0. real Cinematic_HALL_Y=0. real Cinematic_RED_X=0. real Cinematic_RED_Y=0. sound Cinematic_tipSound=null sound Cinematic_startSound=null timer Cinematic_humanClock=null timer Cinematic_beastClock=null unit Cinematic_farmer=null unit Cinematic_farmer2=null unit Cinematic_primative=null unit Cinematic_attackTarget=null unit Cinematic_hunter=null unit Cinematic_hunter2=null unit Cinematic_corpse=null unit Cinematic_beast=null item Cinematic_dummyItem=null unit Cinematic_gatherer=null unit Cinematic_gatherer2=null unit Cinematic_gatherer3=null destructable Cinematic_gatherTarget=null unit Cinematic_robed=null unit Cinematic_robed2=null unit Cinematic_deer=null unit Cinematic_coolBeast=null unit Cinematic_coolBeast2=null unit Cinematic_coolBeast3=null unit Cinematic_demoHunter=null unit Cinematic_demoHunter2=null integer Cinematic_stopwatch=0 integer Cinematic_stopwatch2=0 weathereffect Cinematic_wfx=null fogmodifier array Cinematic_fm boolean Cinematic_enabled=false boolean Cinematic_over=false integer Colors_decs=0 real DamageOverTime_CLOCK_PERIOD=0. integer DamageOverTime_FX_FLAG_ATTACH=0 integer DamageOverTime_FX_FLAG_COORDS=0 integer array DamageOverTime_dotDB integer DamageOverTime_dbIndex=0 timer DamageOverTime_time=null unit array DotData_source unit array DotData_target real array DotData_dps real array DotData_duration string array DotData_fx integer array DotData_fxFlag integer array DotData_exFlag boolean DamageType_USE_BONUS_CALCULATOR=false integer DamageType_DAMAGE_TYPE_CHECK_ID=0 integer DamageType_NULLED=0 integer DamageType_ATTACK=0 integer DamageType_SPELL=0 integer DamageType_CODE=0 attacktype DamageType_ATTACK_TYPE_UNIVERSAL=null real DamageType_DELAY_AMOUNT=0. integer DamageType_lastDamageType=0 unit array DelayDat_target unit array DelayDat_source real array DelayDat_damage integer DummyUnitStack_DUMMY_UNIT_ID=0 integer DummyUnitStack_MIN_PRELOAD_BLOCK_SIZE=0 integer DummyUnitStack_PRELOAD_INIT_COUNT=0 boolean DummyUnitStack_DO_PIC=false integer DummyUnitStack_DYNAMIC_DEFERRED_PRELOAD_COUNT=0 boolean DummyUnitStack_DO_DDPC=false integer DummyUnitStack_INITIAL_DEFERRED_PRELOAD_COUNT=0 boolean DummyUnitStack_DO_IDPC=false integer DummyUnitStack_MAX_PRELOADED_UNITS=0 boolean DummyUnitStack_DO_MPU=false real DummyUnitStack_SAFE_LOC_X=0. real DummyUnitStack_SAFE_LOC_Y=0. real DummyUnitStack_CLOCK_PERIOD=0. unit array DummyUnitStack_dummyStack integer DummyUnitStack_stackIndex=0 integer DummyUnitStack_deferredTodoCount=0 timer DummyUnitStack_clock=null unit array UnitAlloc_u integer ErrorHandling_MUTE_ERROR_DURATION=0 integer ErrorHandling_PRIMARY_ERROR_KEY=0 timer GameTimer_gameTimer=null real GameTimer_currentTime=0. string Game_WIN_SOUND=null string Game_DEF_SOUND=null string Game_BEAST_VICTORY=null string Game_HUNTER_VICTORY=null real Game_BEAST_PLACE_OFFSET=0. real Game_VICTORY_SOUND_DELAY=0. integer Game_TEAM_HUNTERS=0 integer Game_TEAM_BEASTS=0 real Game_POST_ROUND_DELAY=0. real Game_POST_GAME_DELAY=0. real Game_START_DELAY=0. integer Game_ROUND_DURATION=0 timer Game_postRoundTimer=null integer Game_roundsToWin=0 boolean array Game_escapesPressed boolean Game_singlePlayer=false boolean Game_roundEnabled=false integer HeroDeath_CONTRACT_ID=0 integer HeroDeath_GOLD_BONUS=0 integer HeroDeath_GOLD_BONUS_LESSER=0 integer HeroDeath_MAJOR_CONTRACT_BONUS=0 integer HeroDeath_MINOR_CONTRACT_BONUS=0 real HunterAttack_SPREAD_ARC=0. real HunterAttack_JITTER=0. real HunterAttack_SEPARATION_ARC=0. real HunterAttack_SEPARATION_RADIUS=0. real HunterAttack_AUTO_RATE=0. real HunterAttack_POST_BURST_DELAY=0. integer HunterAttack_BURST_ID=0 integer HunterAttack_logicalClock=0 unit array attacker real array AutoDat_uX real array AutoDat_uY real array AutoDat_tX real array AutoDat_tY unit array AutoDat_attacker integer array AutoDat_logicalSecret real HunterCamera_CLOCK_PERIOD=0. real HunterCamera_OFFSET_STATIC=0. real HunterCamera_OFFSET_JITTER=0. real HunterCamera_OFFSET_DYNAMIC=0. real HunterCamera_JITTER_THRESHOLD=0. integer HunterCamera_KERNEL_SIZE=0 real array HunterCamera_kernel integer array HunterCamera_kernelIndex string HunterToggle_TOGGLE_SOUND=null integer HunterToggle_TOGGLE_ID=0 integer HunterToggle_BURST_ID=0 integer HunterToggle_AUTO_ID=0 string Initialization_ORB_FX=null boolean Initialization_SINGLEPLAYER_ADD_AI=false integer Initialization_PILLAR_GROUP_COUNT=0 integer Initialization_PILLAR_GROUP_COUNT_BEAST_SPAWN=0 integer Initialization_PILLARS_PER_GROUP=0 integer Initialization_OBELISK_ID=0 integer Initialization_HUNTER_STARTING_GOLD=0 real Initialization_PHASE=0. real Initialization_OBELISK_FACING_PHASE=0. real Initialization_GROUP_SEPARATION_ANGLE=0. real Initialization_RADIUS=0. real Initialization_RADIUS2=0. real Initialization_OBELISK_PATH_RADIUS=0. real Initialization_PATH_ITERATE_SIZE=0. real Initialization_ORB_HEIGHT=0. group Initialization_grp=null real Initialization_tempX=0. real Initialization_tempY=0. trigger Initialization_diaClick=null dialog Initialization_dialo=null button array Initialization_btns timer Initialization_voteTimer=null integer Initialization_votesCounted=0 integer ItemFieldConditioningKit_DUST_ID=0 integer ItemFieldConditioningKit_COMBAT_TIME=0 integer ItemFieldConditioningKit_damageTimings=0 integer Knife_KNIFE_ID=0 string Knife_FX=null string Knife_FX_PROC=null string Knife_FX_EXPLODED=null string Knife_FX_PROC_ATTACH_POINT=null real Knife_OFFSET=0. real Knife_EFFECT_HEIGHT=0. real Knife_FX_DURATION=0. real Knife_RADIUS=0. real Knife_EXECUTE_MAX_HEALTH=0. real Knife_BASE_DAMAGE=0. real Knife_SHORT_COOLDOWN=0. group Knife_grp=null unit array DummyAlloc_u boolean MagicFunctions_compiletime=false real Math_DELTA=0. real Maths_PI=0. real MinimapVisionHints_CLOCK_PERIOD=0. real MinimapVisionHints_RADIUS=0. real MinimapVisionHints_CHECK_RADIUS=0. fogmodifier array MinimapVisionHints_hints multiboard MultiboardControl_mb=null timer MultiboardControl_time=null integer array Chord_first integer array Chord_last integer array Chord_next integer Muscii_dbIndex=0 integer array Muscii_first integer array Muscii_last integer array Muscii_iterator real array Muscii_tempo timer array Muscii_clock integer array Muscii_count integer array Muscii_queueCount integer array Muscii_cbf integer array Muscii_queued string array Note_path integer array Note_volume real array Note_pitch integer array Note_next string Music_HI_HAT_HIT_CLOSED=null string Music_TOM_1_HIT=null string Music_TOM_4_HIT=null integer Music_m=0 integer Music_v=0 string Net_NET_FX=null string Net_NET_MODEL=null integer Net_NET_ID=0 integer Net_NET_SLOW_ID=0 integer Net_EXCLUSIVITY_NET=0 real Net_RADIUS=0. real Net_CLOCK_PERIOD=0. real Net_NET_VELOCITY=0. real Net_COLLISION_RADIUS=0. real Net_MAX_DISTANCE=0. group Net_grp=null timer Net_clock=null integer array Net_dataDb integer Net_dbIndex=0 real array NetData_delX real array NetData_delY real array NetData_distance unit array NetData_dummy effect array NetData_attached player array NetData_caster string OrganicConcatenation_IMAGE_SOUND=null integer OrganicConcatenation_CONCATENATION_ID=0 integer OrganicConcatenation_BEAST_ILLUSION_ID=0 real OrganicConcatenation_DURATION=0. real OrganicConcatenation_RANGE=0. real OrganicConcatenation_PHASE_OFFSET=0. real OrganicConcatenation_CLOCK_PERIOD=0. integer array OrganicConcatenation_ddStack integer OrganicConcatenation_ddIndex=0 timer OrganicConcatenation_clock=null real array DuplicateDat_uX real array DuplicateDat_uY real array DuplicateDat_face real array DuplicateDat_f0 real array DuplicateDat_f1 real array DuplicateDat_timeLeft real array DuplicateDat_axis real array DuplicateDat_dist unit array DuplicateDat_image0 unit array DuplicateDat_image1 unit array DuplicateDat_image2 unit array DuplicateDat_image3 unit array DuplicateDat_tU unit array DuplicateDat_friend string OrganicHemisection_IMAGE_SOUND=null integer OrganicHemisection_HEMISECTION_ID=0 integer OrganicHemisection_BEAST_ILLUSION_ID=0 real OrganicHemisection_DURATION=0. real OrganicHemisection_OFFSET=0. real OrganicHemisection_PHASE_OFF=0. real OrganicHemisection_CLOCK_PERIOD=0. real OrganicHemisection_PHASE_MULTIPLIER=0. integer array OrganicHemisection_ddStack integer OrganicHemisection_ddIndex=0 timer OrganicHemisection_clock=null real array DuplicateDat_uX_2 real array DuplicateDat_uY_2 real array DuplicateDat_face_2 real array DuplicateDat_timeLeft_2 unit array DuplicateDat_image0_2 unit array DuplicateDat_image1_2 unit array DuplicateDat_image2_2 unit array DuplicateDat_tU_2 string PedestalReceive_DUMMY_MODEL=null string PedestalReceive_EFFECT_MODEL=null string PedestalReceive_RUNE_SECURED=null integer PedestalReceive_SPAWN_COUNT=0 real PedestalReceive_ENUM_EPSILON=0. real PedestalReceive_TARGET_PILLAR_LEFT_x=0. real PedestalReceive_TARGET_PILLAR_LEFT_y=0. real PedestalReceive_TARGET_PILLAR_LEFT_z=0. real PedestalReceive_TARGET_PILLAR_RIGHT_x=0. real PedestalReceive_TARGET_PILLAR_RIGHT_y=0. real PedestalReceive_TARGET_PILLAR_RIGHT_z=0. real PedestalReceive_ITEM_DROP_OFFS=0. real PedestalReceive_ITEM_SPAWN_HEIGHT=0. real PedestalReceive_SPAWN_PERIOD=0. real PedestalReceive_INITIAL_PITCH=0. real PedestalReceive_INITIAL_VELOCITY=0. real PedestalReceive_ACCELERATION=0. real PedestalReceive_CLOCK_PERIOD=0. real PedestalReceive_AIR_FRICTION=0. timer PedestalReceive_time=null timer PedestalReceive_time2=null group PedestalReceive_grp=null rect PedestalReceive_rctEpsilon=null item PedestalReceive_fakeRune=null integer PedestalReceive_spawnCount=0 integer PedestalReceive_effectIndex=0 integer array PedestalReceive_fxDb real array Effect_velocity real array Effect_velocity_2 real array Effect_velocity_3 real array Effect_target real array Effect_target_2 real array Effect_target_3 unit array Effect_dummy effect array Effect_attached integer Players_COUNT=0 integer Players_FIRST_HUNTER=0 integer Players_LAST_BEAST=0 integer Players_MARKERS=0 integer Players_PASSIVE=0 integer Players_FIRST_BEAST=0 player Players_locl=null boolean array Players_playing boolean array Players_aiControlled player array Players_fromId integer Players_aliveCount=0 integer Players_aiCount=0 integer Players_humanCount=0 integer Players_playingCount=0 integer Players_escapePressedCount=0 boolean array PrintingHelper_wantDebug real PrintingHelper_DEBUG_MSG_DURATION=0. unit array ProjectileDat_projectile unit array ProjectileDat_damageSource real array ProjectileDat_speed real array ProjectileDat_dx real array ProjectileDat_dy real array ProjectileDat_damage real array ProjectileDat_rangeLeft string ProjectileStack_DUST_FX=null string ProjectileStack_ERROR_NO_PROJECTILE=null string ProjectileStack_ERROR_NO_SPEED=null string ProjectileStack_ERROR_NO_DAMAGE=null real ProjectileStack_PROJECTILE_OFFSET=0. real ProjectileStack_DEFAULT_VELOCITY=0. real ProjectileStack_BULLET_ENUM_RADIUS=0. real ProjectileStack_PROJECTILE_VELOCITY=0. real ProjectileStack_PROJECTILE_DAMAGE=0. real ProjectileStack_DEFAULT_DAMAGE=0. real ProjectileStack_CLOCK_PERIOD=0. real ProjectileStack_FLY_HEIGHT=0. real ProjectileStack_RANGE=0. timer ProjectileStack_time=null integer array ProjectileStack_projectileDB integer ProjectileStack_dbIndex=0 group ProjectileStack_g=null string Quests_CREDITS_DESC=null string Quests_CREDITS_ICONPATH=null string Quests_CREDITS_TITLE=null string Quests_MODEL_CREDITS_DESC=null string Quests_MODEL_CREDITS_ICONPATH=null string Quests_MODEL_CREDITS_TITLE=null string Quests_HOWTO_HUNTER_DESC=null string Quests_HOWTO_BEAST_DESC=null string Quests_HOWTO_ICONPATH=null string Quests_HOWTO_TITLE=null string Quests_ABOUT_DESC=null string Quests_ABOUT_ICONPATH=null string Quests_ABOUT_TITLE=null trigger array RegisterPlayerUnitEvent_t sound SimError_error=null string array Slop_snd integer Statistics_roundEndTime=0 integer Statistics_secondsElapsed=0 integer Statistics_hunterWins=0 integer Statistics_beastWins=0 integer Statistics_huntersAlive=0 integer Statistics_beastsAlive=0 integer Statistics_hunterKills=0 integer Statistics_beastKills=0 string String_charset=null string String_numberset=null boolean StructuredDD_ADD_ALL_UNITS=false integer StructuredDD_BUCKET_SIZE=0 real StructuredDD_PER_CLEANUP_TIMEOUT=0. integer array Bucket_bucketIndex trigger array Bucket_trig boolexpr array StructuredDD_conditions integer array StructuredDD_bucketDB integer StructuredDD_conditionsIndex=0 integer StructuredDD_dbIndex=0 integer StructuredDD_maxDBIndex=0 hashtable Table_ht=null real TerrainData_HUNTER_SPAWN_X=0. real TerrainData_HUNTER_SPAWN_Y=0. real TerrainData_BEAST_SPAWN_X=0. real TerrainData_BEAST_SPAWN_Y=0. real TerrainData_HALL_MIN_X=0. real TerrainData_HALL_MAX_X=0. real TerrainData_HALL_MIN_Y=0. real TerrainData_HALL_MAX_Y=0. real TerrainData_RUNE_1_X=0. real TerrainData_RUNE_1_Y=0. real TerrainData_RUNE_2_X=0. real TerrainData_RUNE_2_Y=0. real TerrainData_RUNE_RETURN_X=0. real TerrainData_RUNE_RETURN_Y=0. real TerrainData_MIN_X=0. real TerrainData_MAX_X=0. real TerrainData_MIN_Y=0. real TerrainData_MAX_Y=0. real TerrainData_SAFE_X=0. real TerrainData_SAFE_Y=0. location TerrainData_loc=null integer Terrain_DUMMY_ITEM_ID=0 item Terrain_dItem=null texttag array TextTag_minimapLabels integer TextTag_labelIndex=0 integer Thunder_THUNDER_ID=0 string TimerUp_TIME_LIMIT_REACHED=null timer array TimerUtils_freeTimers integer TimerUtils_freeTimersCount=0 integer TimerUtils_timerData=0 integer TimerUtils_HELD=0 unit array BeastLightningDat_u integer array BeastLightningDat_ticksUntilNextCheck integer array BeastLightningDat_balls real array BeastLightningDat_phase integer array BeastLightningDat_ballHead integer array BeastLightningDat_typ integer array BeastLightningDat_prev integer array BeastLightningDat_next unit array LightningBallDat_u effect array LightningBallDat_fx integer array LightningBallDat_next string Units_LIGHTNING_BALL_FX=null real Units_CLOCK_PERIOD=0. real Units_LIGHTNING_CHECK_PERIOD=0. real Units_BALL_OFF=0. real Units_PHASE_ANGULAR_VELOCITY=0. real Units_EFFECT_SCALE=0. real Units_EFFECT_HEIGHT=0. integer Units_BLINK_PASSIVE_ID=0 integer Units_BLINK_ID=0 integer Units_HEMISECT_PASSIVE_ID=0 integer Units_HEMISECT_ID=0 integer Units_CONCAT_PASSIVE_ID=0 integer Units_CONCAT_ID=0 integer Units_HUNTER_ID=0 integer Units_BEAST_ID=0 integer Units_LESSER_BEAST_ID=0 integer Units_HUNTER_PROJECTILE_ID=0 integer Units_ARTIFACT_ID=0 integer Units_GAS_ACTION=0 integer Units_INITIAL_BALLS=0 integer Units_MAX_BALLS=0 integer Units_MAX_BALLS_LESSER=0 group Units_grp=null timer Units_clock=null integer Units_beastHead=0 integer Units_fromBeast=0 unit array Units_hero unit array Units_subHero integer Units_thunderCd=0 integer Units_thunderClock=0 integer Units_beastState=0 integer Units_sitePref=0 item Units_artifact=null item Units_artifact2=null integer array CallbackSingle_nextFree integer CallbackSingle_firstFree=0 integer CallbackSingle_maxIndex=0 integer array CallbackSingle_typeId integer array DotData_nextFree integer DotData_firstFree=0 integer DotData_maxIndex=0 integer array DotData_typeId integer array DelayDat_nextFree integer DelayDat_firstFree=0 integer DelayDat_maxIndex=0 integer array DelayDat_typeId integer array UnitAlloc_nextFree integer UnitAlloc_firstFree=0 integer UnitAlloc_maxIndex=0 integer array UnitAlloc_typeId integer array AutoDat_nextFree integer AutoDat_firstFree=0 integer AutoDat_maxIndex=0 integer array AutoDat_typeId integer array DummyAlloc_nextFree integer DummyAlloc_firstFree=0 integer DummyAlloc_maxIndex=0 integer array DummyAlloc_typeId integer array Chord_nextFree integer Chord_firstFree=0 integer Chord_maxIndex=0 integer array Chord_typeId integer array Muscii_nextFree integer Muscii_firstFree=0 integer Muscii_maxIndex=0 integer array Muscii_typeId integer array MyCallBackFunc_nextFree integer MyCallBackFunc_firstFree=0 integer MyCallBackFunc_maxIndex=0 integer array MyCallBackFunc_typeId integer array Note_nextFree integer Note_firstFree=0 integer Note_maxIndex=0 integer array Note_typeId integer array NetData_nextFree integer NetData_firstFree=0 integer NetData_maxIndex=0 integer array IdGenerator_nextFree integer IdGenerator_firstFree=0 integer IdGenerator_maxIndex=0 integer array DuplicateDat_nextFree integer DuplicateDat_firstFree=0 integer DuplicateDat_maxIndex=0 integer array DuplicateDat_typeId integer array DuplicateDat_nextFree_2 integer DuplicateDat_firstFree_2=0 integer DuplicateDat_maxIndex_2=0 integer array DuplicateDat_typeId_2 integer array Effect_nextFree integer Effect_firstFree=0 integer Effect_maxIndex=0 integer array Effect_typeId integer array ProjectileDat_nextFree integer ProjectileDat_firstFree=0 integer ProjectileDat_maxIndex=0 integer array ProjectileDat_typeId integer array Slop_nextFree integer Slop_firstFree=0 integer Slop_maxIndex=0 integer array Slop_typeId integer array Bucket_nextFree integer Bucket_firstFree=0 integer Bucket_maxIndex=0 integer array Bucket_typeId integer array Table_nextFree integer Table_firstFree=0 integer Table_maxIndex=0 integer array Table_typeId integer array BeastLightningDat_nextFree integer BeastLightningDat_firstFree=0 integer BeastLightningDat_maxIndex=0 integer array BeastLightningDat_typeId integer array LightningBallDat_nextFree integer LightningBallDat_firstFree=0 integer LightningBallDat_maxIndex=0 integer array LightningBallDat_typeId unit array Bucket_members_0 unit array Bucket_members_1 unit array Bucket_members_2 unit array Bucket_members_3 unit array Bucket_members_4 real vec3_op_minus_return_x=0. real vec3_op_minus_return_y=0. real vec3_op_minus_return_z=0. real vec3_norm_return_x=0. real vec3_norm_return_y=0. real vec3_norm_return_z=0. real real_op_mult_return_x=0. real real_op_mult_return_y=0. real real_op_mult_return_z=0. real vec3_op_plus_return_x=0. real vec3_op_plus_return_y=0. real vec3_op_plus_return_z=0. real vec3_op_mult_return_x=0. real vec3_op_mult_return_y=0. real vec3_op_mult_return_z=0. code ref_function_init_String=null code ref_function_init_Table=null code ref_function_init_Trigger=null code ref_function_init_Player=null code ref_function_init_PrintingHelper=null code ref_function_init_MagicFunctions=null code ref_function_init_Basics=null code ref_function_init_GameTimer=null code ref_function_init_ErrorHandling=null code ref_function_init_TimerUtils=null code ref_function_init_Maths=null code ref_function_init_Vectors=null code ref_function_init_TempGroups=null code ref_function_init_Colors=null code ref_function_init_Rect=null code ref_function_init_Terrain=null code ref_function_init_TypeCasting=null code ref_function_init_ObjectIds=null code ref_function_init_ObjectIdGenerator=null code ref_function_init_TerrainData=null code ref_function_init_Players=null code ref_function_init_DummyUnitStack=null code ref_function_init_Units=null code ref_function_init_Statistics=null code ref_function_init_AI=null code ref_function_init_AttackTeammate=null code ref_function_init_StructuredDD=null code ref_function_init_DamageType=null code ref_function_init_MultiboardControl=null code ref_function_init_CameraControl=null code ref_function_init_Game=null code ref_function_init_DamageOverTime=null code ref_function_init_TextTag=null code ref_function_init_ItemFieldConditioningKit=null code ref_function_init_BeastAttack=null code ref_function_init_Cinematic=null code ref_function_init_BinocularVision=null code ref_function_init_Blink=null code ref_function_init_Castle=null code ref_function_init_CastleSmall=null code ref_function_init_EscapeKey=null code ref_function_init_HeroDeath=null code ref_function_init_ProjectileStack=null code ref_function_init_HunterAttack=null code ref_function_init_Math=null code ref_function_init_HunterCamera=null code ref_function_init_HunterToggle=null code ref_function_init_HuntersHall=null code ref_function_init_Initialization=null code ref_function_init_KeepSmall=null code ref_function_init_Knife=null code ref_function_init_Marketplace=null code ref_function_init_MinimapVisionHints=null code ref_function_init_Muscii=null code ref_function_init_Music=null code ref_function_init_Net=null code ref_function_init_SimError=null code ref_function_init_NoItemDuplicates=null code ref_function_init_OrganicConcatenation=null code ref_function_init_OrganicHemisection=null code ref_function_init_Pedestal=null code ref_function_init_PedestalReceive=null code ref_function_init_PlayerLeaves=null code ref_function_init_Quests=null code ref_function_init_ScoutTower=null code ref_function_init_Thunder=null code ref_function_init_TimerUp=null code ref_function_AI_periodic=null code ref_function_act=null code ref_function_hand=null code ref_function_act_2=null code ref_function_act_3=null code ref_function_CameraControl_endFadeHunter=null code ref_function_CameraControl_endFadeBeast=null code ref_function_Cinematic_cleanup=null code ref_function_Cinematic_endCinematic=null code ref_function_Cinematic_human24=null code ref_function_Cinematic_human23=null code ref_function_Cinematic_human22=null code ref_function_Cinematic_human21=null code ref_function_Cinematic_human20=null code ref_function_Cinematic_human19=null code ref_function_Cinematic_human18=null code ref_function_Cinematic_human17=null code ref_function_Cinematic_human16=null code ref_function_Cinematic_human15=null code ref_function_Cinematic_human14c=null code ref_function_Cinematic_human14b=null code ref_function_Cinematic_human14a=null code ref_function_Cinematic_human14=null code ref_function_Cinematic_human13=null code ref_function_Cinematic_human12a=null code ref_function_Cinematic_human12=null code ref_function_Cinematic_human11=null code ref_function_Cinematic_human10=null code ref_function_Cinematic_human9=null code ref_function_Cinematic_human8b=null code ref_function_Cinematic_human8=null code ref_function_Cinematic_human7=null code ref_function_Cinematic_human6=null code ref_function_Cinematic_human5=null code ref_function_Cinematic_human4=null code ref_function_Cinematic_human3=null code ref_function_Cinematic_human2=null code ref_function_Cinematic_human1=null code ref_function_Cinematic_beast35=null code ref_function_Cinematic_beast34=null code ref_function_Cinematic_beast33b=null code ref_function_Cinematic_beast33a=null code ref_function_Cinematic_beast33=null code ref_function_Cinematic_beast32=null code ref_function_Cinematic_beast31b=null code ref_function_Cinematic_beast31a=null code ref_function_Cinematic_beast31=null code ref_function_Cinematic_beast30=null code ref_function_Cinematic_beast28=null code ref_function_Cinematic_beast29=null code ref_function_Cinematic_beast26=null code ref_function_Cinematic_beast25=null code ref_function_Cinematic_beast23=null code ref_function_Cinematic_beast23b=null code ref_function_Cinematic_beast24=null code ref_function_Cinematic_beast22=null code ref_function_Cinematic_beast21=null code ref_function_Cinematic_beast20=null code ref_function_Cinematic_beast19=null code ref_function_Cinematic_beast18=null code ref_function_Cinematic_beast17=null code ref_function_Cinematic_beast16=null code ref_function_Cinematic_beast15=null code ref_function_Cinematic_beast14=null code ref_function_Cinematic_beast13=null code ref_function_Cinematic_beast12=null code ref_function_Cinematic_beast11b=null code ref_function_Cinematic_beast11a=null code ref_function_Cinematic_beast11=null code ref_function_Cinematic_beast10=null code ref_function_Cinematic_beast9=null code ref_function_Cinematic_beast8=null code ref_function_Cinematic_beast7=null code ref_function_Cinematic_beast6=null code ref_function_Cinematic_beast5=null code ref_function_Cinematic_beast4=null code ref_function_Cinematic_beast3=null code ref_function_Cinematic_beast2=null code ref_function_Cinematic_beast1=null code ref_function_Cinematic_human0=null code ref_function_Cinematic_beast0=null code ref_function_Cinematic_neutral2=null code ref_function_Cinematic_neutral1=null code ref_function_CallbackSingle_staticCallback=null code ref_function_DamageOverTime_damageTick=null code ref_function_DamageType_c=null code ref_function_DamageType_handler=null code ref_function_DamageType_after=null code ref_function_DummyUnitStack_deferredPreloader=null code ref_function_DummyUnitStack_afterDelay=null code ref_function_c=null code ref_function_GameTimer_closure_impl=null code ref_function_Game_countSeconds=null code ref_function_Game_gameOver2=null code ref_function_Game_hunterVictorySound=null code ref_function_Game_gameOver=null code ref_function_Game_roundStart=null code ref_function_Game_beastVictorySound=null code ref_function_a=null code ref_function_autoTick=null code ref_function_act_4=null code ref_function_act_5=null code ref_function_act_6=null code ref_function_startC=null code ref_function_endVotes=null code ref_function_diaA=null code ref_function_afterDelay=null code ref_function_checkCombatDuration=null code ref_function_releaseDummy=null code ref_function_resetCooldown=null code ref_function_act_7=null code ref_function_update=null code ref_function_periodic=null code ref_function_act_8=null code ref_function_Muscii_p=null code ref_function_pauseForGameMusic=null code ref_function_periodic_2=null code ref_function_act_9=null code ref_function_act_10=null code ref_function_ddPeriodic=null code ref_function_act_11=null code ref_function_ddPeriodic_2=null code ref_function_act_12=null code ref_function_fxSpawn3=null code ref_function_fxSpawn2=null code ref_function_act_13=null code ref_function_cond=null code ref_function_switchDebug=null code ref_function_ProjectileStack_bulletTick=null code ref_function_SoundControl_preloadAfter=null code ref_function_StructuredDD_autoAddC=null code ref_function_StructuredDD_perCleanup=null code ref_function_act_14=null code ref_function_checkRoundSeconds=null code ref_function_Units_beastLightningTick=null code ref_function_Units_filterItems=null unit DummyUnitStack_gettempReturn=null unit ProjectileStack_getUnitProjectiletempReturn=null unit ProjectileStack_getUnitProjectiletempReturn_2=null quest addQuesttempReturn=null texttag TextTag_minimapLabeltempReturn=null timer getTimertempReturn=null unit Bucket_members_gettempReturn=null endglobals native UnitAlive takes unit id returns boolean function TerrainData_distanceBetweenXY takes real x1, real x2, real y1, real y2 returns real return SquareRoot((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) endfunction function TerrainData_radiansBetweenXY takes real x1, real x2, real y1, real y2 returns real return Atan2(y2 - y1, x2 - x1) endfunction function hashtable_hasInt takes hashtable this, integer parentKey, integer childKey returns boolean return HaveSavedInteger(this, parentKey, childKey) endfunction function Table_hasInt takes integer this, integer parentKey returns boolean return hashtable_hasInt(Table_ht, this, parentKey) endfunction function hashtable_hasBoolean takes hashtable this, integer parentKey, integer childKey returns boolean return HaveSavedBoolean(this, parentKey, childKey) endfunction function hashtable_loadBoolean takes hashtable this, integer parentKey, integer childKey returns boolean return LoadBoolean(this, parentKey, childKey) endfunction function hashtable_loadInt takes hashtable this, integer parentKey, integer childKey returns integer return LoadInteger(this, parentKey, childKey) endfunction function hashtable_saveBoolean takes hashtable this, integer parentKey, integer childKey, boolean value returns nothing call SaveBoolean(this, parentKey, childKey, value) endfunction function hashtable_saveInt takes hashtable this, integer parentKey, integer childKey, integer value returns nothing call SaveInteger(this, parentKey, childKey, value) endfunction function print takes string msg returns nothing call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., PrintingHelper_DEBUG_MSG_DURATION, msg) endfunction function real_toInt takes real this returns integer return R2I(this) endfunction function error takes string msg returns nothing local integer hash = StringHash(msg) if hashtable_hasInt(Table_ht, ErrorHandling_PRIMARY_ERROR_KEY, hash) then if hashtable_loadInt(Table_ht, ErrorHandling_PRIMARY_ERROR_KEY, hash) + ErrorHandling_MUTE_ERROR_DURATION < GameTimer_currentTime then call print("|cffFF3A29Error:|r " + msg + "") call hashtable_saveInt(Table_ht, ErrorHandling_PRIMARY_ERROR_KEY, hash, real_toInt(GameTimer_currentTime)) call hashtable_saveBoolean(Table_ht, ErrorHandling_PRIMARY_ERROR_KEY, hash, false) elseif hashtable_hasBoolean(Table_ht, ErrorHandling_PRIMARY_ERROR_KEY, hash) then if not hashtable_loadBoolean(Table_ht, ErrorHandling_PRIMARY_ERROR_KEY, hash) then call print("|cffFF3A29Excessive repeating errors are being omitted") call hashtable_saveBoolean(Table_ht, ErrorHandling_PRIMARY_ERROR_KEY, hash, true) endif else call print("|cffFF3A29Excessive repeating errors are being omitted") call hashtable_saveBoolean(Table_ht, ErrorHandling_PRIMARY_ERROR_KEY, hash, true) endif else call hashtable_saveInt(Table_ht, ErrorHandling_PRIMARY_ERROR_KEY, hash, real_toInt(GameTimer_currentTime)) call print("|cffFF3A29Error:|r " + msg + "") endif call I2S(1 / 0) endfunction function dispatch_Table_Table_Table_hasInt takes integer this, integer parentKey returns boolean local boolean Table_Table_hasInt_result if Table_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Table.Table_Table_hasInt") else call error("Called Table.Table_Table_hasInt on invalid object.") endif endif set Table_Table_hasInt_result = Table_hasInt(this, parentKey) return Table_Table_hasInt_result endfunction function Table_loadInt takes integer this, integer parentKey returns integer return hashtable_loadInt(Table_ht, this, parentKey) endfunction function dispatch_Table_Table_Table_loadInt takes integer this, integer parentKey returns integer local integer Table_Table_loadInt_result if Table_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Table.Table_Table_loadInt") else call error("Called Table.Table_Table_loadInt on invalid object.") endif endif set Table_Table_loadInt_result = Table_loadInt(this, parentKey) return Table_Table_loadInt_result endfunction function handle_getHandleId takes handle this returns integer return GetHandleId(this) endfunction function Units_countBalls takes unit u returns integer local integer ua if dispatch_Table_Table_Table_hasInt(Units_fromBeast, handle_getHandleId(u)) then set ua = dispatch_Table_Table_Table_loadInt(Units_fromBeast, handle_getHandleId(u)) return BeastLightningDat_balls[ua] endif call BJDebugMsg("Units.countBalls: Tried to count balls on unindexed unit") return -1 endfunction function Table_saveInt takes integer this, integer parentKey, integer value returns nothing call hashtable_saveInt(Table_ht, this, parentKey, value) endfunction function dispatch_Table_Table_Table_saveInt takes integer this, integer parentKey, integer value returns nothing if Table_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Table.Table_Table_saveInt") else call error("Called Table.Table_Table_saveInt on invalid object.") endif endif call Table_saveInt(this, parentKey, value) endfunction function parseBeast takes nothing returns nothing local real d = 99999999. local unit selected = null local unit iter local real safeX local real safeY local real ang call GroupEnumUnitsInRect(AI_grp, bj_mapInitialPlayableArea, null) loop set iter = FirstOfGroup(AI_grp) exitwhen iter == null if IsUnitEnemy(iter, AI_tempPlayer) and UnitAlive(iter) and IsUnitInRangeXY(iter, GetUnitX(AI_tempUnit), GetUnitY(AI_tempUnit), d) and GetUnitAbilityLevel(iter, 1114205814) < 1 then set selected = iter set d = TerrainData_distanceBetweenXY(GetUnitX(iter), GetUnitX(AI_tempUnit), GetUnitY(iter), GetUnitY(AI_tempUnit)) endif call GroupRemoveUnit(AI_grp, iter) endloop if dispatch_Table_Table_Table_loadInt(Units_beastState, handle_getHandleId(AI_tempUnit)) == AI_STATE_AGGRESSIVE then if GetWidgetLife(AI_tempUnit) < GetUnitState(AI_tempUnit, UNIT_STATE_MAX_LIFE) * .5 then call dispatch_Table_Table_Table_saveInt(Units_beastState, handle_getHandleId(AI_tempUnit), AI_STATE_RETREAT) endif if Units_countBalls(AI_tempUnit) < 2 and IsUnitInRange(AI_tempUnit, selected, 1200.) then call dispatch_Table_Table_Table_saveInt(Units_beastState, handle_getHandleId(AI_tempUnit), AI_STATE_RETREAT) endif if selected != null and GetUnitCurrentOrder(AI_tempUnit) != OrderId("attack") then if IsUnitInRange(AI_tempUnit, selected, 140.) and Statistics_secondsElapsed - dispatch_Table_Table_Table_loadInt(Units_thunderCd, handle_getHandleId(AI_tempUnit)) > AI_THUNDER_CD then call IssueImmediateOrder(AI_tempUnit, "berserk") call dispatch_Table_Table_Table_saveInt(Units_thunderCd, handle_getHandleId(AI_tempUnit), Statistics_secondsElapsed) else call IssueTargetOrder(AI_tempUnit, "attack", selected) endif endif else if GetWidgetLife(AI_tempUnit) > GetUnitState(AI_tempUnit, UNIT_STATE_MAX_LIFE) * .8 then call dispatch_Table_Table_Table_saveInt(Units_beastState, handle_getHandleId(AI_tempUnit), AI_STATE_AGGRESSIVE) endif if GetItemX(Units_artifact) > 0. and GetItemY(Units_artifact) < 0. then set safeX = 3350. set safeY = - 3700. else set safeX = - 2150. set safeY = 3180. endif if selected != null and IsUnitInRange(AI_tempUnit, selected, 1200.) then set ang = TerrainData_radiansBetweenXY(GetUnitX(selected), safeX, GetUnitY(selected), safeY) call IssuePointOrder(AI_tempUnit, "move", GetUnitX(selected) + 1400. * Cos(ang), GetUnitY(selected) + 1400. * Sin(ang)) else call SetUnitFacingTimed(AI_tempUnit, GetUnitFacing(AI_tempUnit) + 90., 1.) endif endif set iter = null set selected = null endfunction function hunterElection takes nothing returns nothing local integer index = 0 loop exitwhen index >= Players_FIRST_BEAST if UnitAlive(Units_hero[index]) and ( not Players_aiControlled[index]) then set AI_hunterLeader = Units_hero[index] return endif set index = index + 1 endloop set index = 0 loop exitwhen index >= Players_FIRST_BEAST if UnitAlive(Units_hero[index]) then set AI_hunterLeader = Units_hero[index] return endif set index = index + 1 endloop endfunction function player_getId takes player this returns integer return GetPlayerId(this) endfunction function item_getX takes item this returns real return GetItemX(this) endfunction function item_getY takes item this returns real return GetItemY(this) endfunction function unit_getOwner takes unit this returns player return GetOwningPlayer(this) endfunction function proceedObjective takes nothing returns nothing local item artifact local integer objective if UnitHasItem(AI_tempUnit, Units_artifact) then call IssuePointOrder(AI_tempUnit, "move", TerrainData_RUNE_RETURN_X, TerrainData_RUNE_RETURN_Y) else set objective = dispatch_Table_Table_Table_loadInt(Units_sitePref, handle_getHandleId(Units_hero[player_getId(unit_getOwner(AI_tempUnit))])) if objective == 0 then set artifact = Units_artifact else set artifact = Units_artifact2 endif if IsUnitInRangeXY(AI_tempUnit, GetItemX(artifact), GetItemY(artifact), 200.) then call IssueTargetOrder(AI_tempUnit, "smart", artifact) else call IssuePointOrder(AI_tempUnit, "move", item_getX(artifact), item_getY(artifact)) endif endif set artifact = null endfunction function unit_issuePointOrder takes unit this, string order, real target_x, real target_y returns nothing call IssuePointOrder(this, order, target_x, target_y) endfunction function parseHunter takes nothing returns nothing local real d = 1200. local unit selected = null local player owner = GetOwningPlayer(AI_tempUnit) local unit iter local real hunterX local real hunterY local real tempD local real ang if not UnitAlive(AI_hunterLeader) then call hunterElection() endif set hunterX = GetUnitX(AI_tempUnit) set hunterY = GetUnitY(AI_tempUnit) call GroupEnumUnitsInRange(AI_grp, GetUnitX(AI_tempUnit), GetUnitY(AI_tempUnit), d, null) loop set iter = FirstOfGroup(AI_grp) exitwhen iter == null if UnitAlive(iter) and IsUnitInRange(iter, AI_tempUnit, d) and IsUnitEnemy(iter, owner) and IsUnitVisible(iter, owner) then set selected = iter set d = TerrainData_distanceBetweenXY(GetUnitX(iter), hunterX, GetUnitY(iter), hunterY) endif call GroupRemoveUnit(AI_grp, iter) endloop if selected != null then if IsUnitInRange(AI_tempUnit, selected, 900.) then call unit_issuePointOrder(AI_tempUnit, "channel", GetUnitX(selected), GetUnitY(selected)) else call IssuePointOrder(AI_tempUnit, "move", GetUnitX(selected), GetUnitY(selected)) endif elseif AI_tempUnit == AI_hunterLeader then call GroupEnumUnitsInRange(AI_grp, GetUnitX(AI_tempUnit), GetUnitY(AI_tempUnit), 1400., null) set d = 0. loop set iter = FirstOfGroup(AI_grp) exitwhen iter == null set tempD = TerrainData_distanceBetweenXY(GetUnitX(iter), hunterX, GetUnitY(iter), hunterY) if UnitAlive(iter) and player_getId(unit_getOwner(iter)) < Players_FIRST_BEAST and tempD > d then set d = tempD endif call GroupRemoveUnit(AI_grp, iter) endloop if d > 1000. then call IssueImmediateOrder(AI_tempUnit, "stop") call SetUnitFacingTimed(AI_tempUnit, GetUnitFacing(AI_tempUnit) - 90., 1.25) else call ExecuteFunc("proceedObjective") endif else set ang = TerrainData_radiansBetweenXY(hunterX, GetUnitX(AI_hunterLeader), hunterY, GetUnitY(AI_hunterLeader)) + bj_PI call IssuePointOrder(AI_tempUnit, "move", GetUnitX(AI_hunterLeader) + 200. * Cos(ang), GetUnitY(AI_hunterLeader) + 200. * Sin(ang)) endif set iter = null set selected = null set owner = null endfunction function parsePlayer takes nothing returns nothing local unit hero = Units_hero[GetPlayerId(AI_tempPlayer)] set AI_tempUnit = hero if not UnitAlive(hero) then set hero = null return endif if GetUnitTypeId(hero) == AI_BEAST_ID then call ExecuteFunc("parseBeast") else call ExecuteFunc("parseHunter") endif set hero = null endfunction function AI_periodic takes nothing returns nothing local integer index = 0 loop exitwhen index > AI_count set AI_tempPlayer = AI_players[index] call ExecuteFunc("parsePlayer") set index = index + 1 endloop endfunction function HunterAttack_closure_impl takes integer this returns nothing call IssueImmediateOrder(attacker[this], "stop") endfunction function dispatch_CallbackSingle_ClosureTimers_CallbackSingle_call takes integer this returns nothing if CallbackSingle_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling CallbackSingle.ClosureTimers_CallbackSingle_call") else call error("Called CallbackSingle.ClosureTimers_CallbackSingle_call on invalid object.") endif endif call HunterAttack_closure_impl(this) endfunction function CallbackSingle_onDestroy takes integer this returns nothing endfunction function dealloc_CallbackSingle takes integer obj returns nothing if CallbackSingle_typeId[obj] == 0 then call error("Double free: object of type CallbackSingle") else set CallbackSingle_nextFree[CallbackSingle_firstFree] = obj set CallbackSingle_firstFree = CallbackSingle_firstFree + 1 set CallbackSingle_typeId[obj] = 0 endif endfunction function destroyCallbackSingle takes integer this returns nothing call CallbackSingle_onDestroy(this) call dealloc_CallbackSingle(this) endfunction function dispatch_CallbackSingle_destroyCallbackSingle takes integer this returns nothing if CallbackSingle_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling CallbackSingle.destroyCallbackSingle") else call error("Called CallbackSingle.destroyCallbackSingle on invalid object.") endif endif call destroyCallbackSingle(this) endfunction function timer_getData takes timer this returns integer return dispatch_Table_Table_Table_loadInt(TimerUtils_timerData, GetHandleId(this)) endfunction function timer_pause takes timer this returns nothing call PauseTimer(this) endfunction function timer_setData takes timer this, integer data returns nothing call dispatch_Table_Table_Table_saveInt(TimerUtils_timerData, GetHandleId(this), data) endfunction function timer_release takes timer this returns nothing if this == null then call error("Trying to release a null timer") return endif if timer_getData(this) == TimerUtils_HELD then call error("ReleaseTimer: Double free!") return endif call timer_setData(this, TimerUtils_HELD) call timer_pause(this) set TimerUtils_freeTimers[TimerUtils_freeTimersCount] = this set TimerUtils_freeTimersCount = TimerUtils_freeTimersCount + 1 endfunction function CallbackSingle_staticCallback takes nothing returns nothing local timer t = GetExpiredTimer() local integer cb = timer_getData(t) call dispatch_CallbackSingle_ClosureTimers_CallbackSingle_call(cb) call dispatch_CallbackSingle_destroyCallbackSingle(cb) call timer_release(t) set t = null endfunction function CameraControl_endFadeBeast takes nothing returns nothing call DestroyTimer(CameraControl_beastFadeFinishTimer) set CameraControl_beastFadeFinishTimer = null if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call DisplayCineFilter(false) call EnableUserUI(true) endif endfunction function CameraControl_endFadeHunter takes nothing returns nothing call DestroyTimer(CameraControl_hunterFadeFinishTimer) set CameraControl_hunterFadeFinishTimer = null if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call DisplayCineFilter(false) call EnableUserUI(true) endif endfunction function CameraControl_fadeInBeast takes real duration returns nothing if CameraControl_beastFadeContinueTimer != null then call DestroyTimer(CameraControl_beastFadeContinueTimer) endif if CameraControl_beastFadeFinishTimer != null then call DestroyTimer(CameraControl_beastFadeFinishTimer) endif if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call EnableUserUI(false) call SetCineFilterTexture(CameraControl_FILTER_MASK) call SetCineFilterBlendMode(BLEND_MODE_BLEND) call SetCineFilterTexMapFlags(TEXMAP_FLAG_NONE) call SetCineFilterStartUV(0., 0., 1., 1.) call SetCineFilterEndUV(0., 0., 1., 1.) call SetCineFilterStartColor(0, 0, 0, 255) call SetCineFilterEndColor(0, 0, 0, 0) call SetCineFilterDuration(duration) call DisplayCineFilter(true) endif set CameraControl_beastFadeFinishTimer = CreateTimer() call TimerStart(CameraControl_beastFadeFinishTimer, duration, false, ref_function_CameraControl_endFadeBeast) endfunction function CameraControl_panAoaBeast takes real aoa, real duration returns nothing if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK, aoa, duration) endif endfunction function CameraControl_panBeast takes real x, real y, real duration returns nothing if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call PanCameraToTimed(x, y, duration) endif endfunction function CameraControl_panDistanceBeast takes real dist, real duration returns nothing if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, dist, duration) endif endfunction function CameraControl_snapAoaBeast takes real aoa returns nothing if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK, aoa, 0.) endif endfunction function CameraControl_snapBeast takes real x, real y returns nothing if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call PanCameraToTimed(x, y, 0.) endif endfunction function CameraControl_snapDistanceBeast takes real d returns nothing if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, d, 0.) endif endfunction function Cinematic_clearTextBeast takes nothing returns nothing if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call ClearTextMessages() endif endfunction function Cinematic_conditionalScene takes real sleep, code next returns nothing if Players_escapePressedCount < Players_humanCount then call TimerStart(Cinematic_beastClock, sleep, false, next) endif endfunction function DummyUnitStack_add takes boolean preloading returns unit set bj_lastCreatedUnit = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), DummyUnitStack_DUMMY_UNIT_ID, DummyUnitStack_SAFE_LOC_X, DummyUnitStack_SAFE_LOC_Y, 0.) call UnitAddAbility(bj_lastCreatedUnit, 1097625443) call UnitAddAbility(bj_lastCreatedUnit, 1098015094) if preloading then set DummyUnitStack_stackIndex = DummyUnitStack_stackIndex + 1 set DummyUnitStack_dummyStack[DummyUnitStack_stackIndex] = bj_lastCreatedUnit else return bj_lastCreatedUnit endif return null endfunction function DummyUnitStack_get takes nothing returns unit local unit result if DummyUnitStack_stackIndex != -1 then set DummyUnitStack_stackIndex = DummyUnitStack_stackIndex - 1 set result = DummyUnitStack_dummyStack[DummyUnitStack_stackIndex + 1] else set result = DummyUnitStack_add(false) endif if DummyUnitStack_DO_DDPC then if DummyUnitStack_stackIndex < DummyUnitStack_DYNAMIC_DEFERRED_PRELOAD_COUNT - 1 and DummyUnitStack_deferredTodoCount < 1 then set DummyUnitStack_deferredTodoCount = DummyUnitStack_MIN_PRELOAD_BLOCK_SIZE call TimerStart(DummyUnitStack_clock, DummyUnitStack_CLOCK_PERIOD, true, ref_function_DummyUnitStack_deferredPreloader) endif endif set DummyUnitStack_gettempReturn = result set result = null return DummyUnitStack_gettempReturn endfunction function alloc_LightningBallDat takes nothing returns integer local integer this if LightningBallDat_firstFree == 0 then if LightningBallDat_maxIndex < 8191 then set LightningBallDat_maxIndex = LightningBallDat_maxIndex + 1 set this = LightningBallDat_maxIndex set LightningBallDat_typeId[this] = 56 else call error("Out of memory: Could not create LightningBallDat.") set this = 0 endif else set LightningBallDat_firstFree = LightningBallDat_firstFree - 1 set this = LightningBallDat_nextFree[LightningBallDat_firstFree] set LightningBallDat_typeId[this] = 56 endif return this endfunction function construct_LightningBallDat takes integer this returns nothing set LightningBallDat_next[this] = 0 endfunction function new_LightningBallDat takes nothing returns integer local integer this = alloc_LightningBallDat() call construct_LightningBallDat(this) return this endfunction function Units_pushBall takes unit u returns nothing local string fxString = Units_LIGHTNING_BALL_FX local integer ua = dispatch_Table_Table_Table_loadInt(Units_fromBeast, handle_getHandleId(u)) local integer lbd = new_LightningBallDat() local integer swap set LightningBallDat_u[lbd] = DummyUnitStack_get() call SetUnitFlyHeight(LightningBallDat_u[lbd], Units_EFFECT_HEIGHT, 0.) call SetUnitScale(LightningBallDat_u[lbd], Units_EFFECT_SCALE, Units_EFFECT_SCALE, Units_EFFECT_SCALE) if Players_locl != GetOwningPlayer(u) then set fxString = "" endif set LightningBallDat_fx[lbd] = AddSpecialEffectTarget(fxString, LightningBallDat_u[lbd], "origin") set BeastLightningDat_balls[ua] = BeastLightningDat_balls[ua] + 1 if BeastLightningDat_balls[ua] == 1 then call UnitRemoveAbility(BeastLightningDat_u[ua], Units_BLINK_PASSIVE_ID) call UnitAddAbility(BeastLightningDat_u[ua], Units_BLINK_ID) elseif BeastLightningDat_balls[ua] == 3 and BeastLightningDat_typ[ua] == Units_BEAST_ID then call UnitRemoveAbility(BeastLightningDat_u[ua], Units_HEMISECT_PASSIVE_ID) call UnitAddAbility(BeastLightningDat_u[ua], Units_HEMISECT_ID) elseif BeastLightningDat_balls[ua] == 3 and BeastLightningDat_typ[ua] == Units_LESSER_BEAST_ID then call UnitRemoveAbility(BeastLightningDat_u[ua], Units_CONCAT_PASSIVE_ID) call UnitAddAbility(BeastLightningDat_u[ua], Units_CONCAT_ID) endif if BeastLightningDat_ballHead[ua] == 0 then set BeastLightningDat_ballHead[ua] = lbd else set swap = BeastLightningDat_ballHead[ua] set LightningBallDat_next[lbd] = swap set BeastLightningDat_ballHead[ua] = lbd endif endfunction function alloc_BeastLightningDat takes nothing returns integer local integer this if BeastLightningDat_firstFree == 0 then if BeastLightningDat_maxIndex < 8191 then set BeastLightningDat_maxIndex = BeastLightningDat_maxIndex + 1 set this = BeastLightningDat_maxIndex set BeastLightningDat_typeId[this] = 55 else call error("Out of memory: Could not create BeastLightningDat.") set this = 0 endif else set BeastLightningDat_firstFree = BeastLightningDat_firstFree - 1 set this = BeastLightningDat_nextFree[BeastLightningDat_firstFree] set BeastLightningDat_typeId[this] = 55 endif return this endfunction function construct_BeastLightningDat takes integer this returns nothing set BeastLightningDat_phase[this] = 0. set BeastLightningDat_ballHead[this] = 0 set BeastLightningDat_prev[this] = 0 set BeastLightningDat_next[this] = 0 endfunction function new_BeastLightningDat takes nothing returns integer local integer this = alloc_BeastLightningDat() call construct_BeastLightningDat(this) return this endfunction function Units_initializeBeast takes unit u returns nothing local integer ua = new_BeastLightningDat() local integer index = 0 local integer id = GetUnitTypeId(u) local integer swap set BeastLightningDat_typ[ua] = id set BeastLightningDat_u[ua] = u set BeastLightningDat_ticksUntilNextCheck[ua] = R2I(Units_LIGHTNING_CHECK_PERIOD / Units_CLOCK_PERIOD) set BeastLightningDat_balls[ua] = 0 loop exitwhen index >= Units_INITIAL_BALLS call Units_pushBall(u) set index = index + 1 endloop call dispatch_Table_Table_Table_saveInt(Units_fromBeast, handle_getHandleId(u), ua) if Units_beastHead == 0 then set Units_beastHead = ua call TimerStart(Units_clock, Units_CLOCK_PERIOD, true, ref_function_Units_beastLightningTick) else set swap = Units_beastHead set BeastLightningDat_prev[swap] = ua set BeastLightningDat_next[ua] = swap set Units_beastHead = ua endif endfunction function Cinematic_beast0 takes nothing returns nothing call Cinematic_clearTextBeast() set Cinematic_demoHunter = CreateUnit(Players_fromId[0], Units_HUNTER_ID, 2650., - 3290., 30.) set Cinematic_coolBeast = CreateUnit(Players_fromId[Players_FIRST_BEAST], Units_BEAST_ID, 3237., - 3220., 30. + 90.) set Cinematic_coolBeast2 = CreateUnit(Players_fromId[Players_FIRST_BEAST + 1], Units_BEAST_ID, 3237. + 128. * Cos(bj_PI / 6.), ( - 3220.) + 128. * Sin(bj_PI / 6.), 30. + 90.) set Cinematic_coolBeast3 = CreateUnit(Players_fromId[Players_FIRST_BEAST + 2], Units_BEAST_ID, 3237. - 128. * Cos(bj_PI / 6.), ( - 3220.) - 128. * Sin(bj_PI / 6.), 30. + 90.) call UnitRemoveAbility(Cinematic_coolBeast, 1096905835) call UnitRemoveAbility(Cinematic_coolBeast2, 1096905835) call UnitRemoveAbility(Cinematic_coolBeast3, 1096905835) call Units_initializeBeast(Cinematic_coolBeast) call Units_initializeBeast(Cinematic_coolBeast2) call Units_initializeBeast(Cinematic_coolBeast3) call CameraControl_snapBeast(2964.77, 635.94) call CameraControl_snapAoaBeast(291.17) call CameraControl_snapDistanceBeast(1126.97) call CameraControl_panBeast(2964.77 + 64., 635.94 - 64., 7.) call CameraControl_panAoaBeast(291.17 + 10., 8.) call CameraControl_panDistanceBeast(1126.97 - 100., 7.) call CameraControl_fadeInBeast(.5) call Cinematic_conditionalScene(1.5, ref_function_Cinematic_beast1) endfunction function Cinematic_titleTextBeast takes string text returns nothing if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call DisplayTimedTextToPlayer(Players_locl, .1, 0., 3., text) endif endfunction function Cinematic_beast1 takes nothing returns nothing call Cinematic_titleTextBeast(Cinematic_TITLE_BEAST_ONE) call Cinematic_conditionalScene(5., ref_function_Cinematic_beast2) endfunction function Cinematic_beast10 takes nothing returns nothing call RemoveDestructable(Cinematic_gatherTarget) call IssueImmediateOrder(Cinematic_gatherer, "stop") call SetUnitX(Cinematic_gatherer, ( - 4235.) - 64.) call SetUnitY(Cinematic_gatherer, ( - 5180.) + 64.) call SetUnitFacing(Cinematic_gatherer, 180.) call SetUnitPathing(Cinematic_gatherer, false) call IssueImmediateOrder(Cinematic_gatherer2, "stop") call SetUnitX(Cinematic_gatherer2, ( - 4235.) + 32.) call SetUnitY(Cinematic_gatherer2, ( - 5180.) + 64.) call SetUnitFacing(Cinematic_gatherer2, 180.) call SetUnitPathing(Cinematic_gatherer2, false) call IssueImmediateOrder(Cinematic_gatherer3, "stop") call SetUnitX(Cinematic_gatherer3, ( - 4235.) + 128.) call SetUnitY(Cinematic_gatherer3, ( - 5180.) + 64.) call SetUnitFacing(Cinematic_gatherer3, 180.) call SetUnitPathing(Cinematic_gatherer3, false) call Cinematic_conditionalScene(2., ref_function_Cinematic_beast11) endfunction function Cinematic_beast11 takes nothing returns nothing call IssuePointOrder(Cinematic_gatherer, "move", - 5317., - 5101.) call IssuePointOrder(Cinematic_gatherer2, "move", ( - 5317.) + 64., - 5101.) call IssuePointOrder(Cinematic_gatherer3, "move", ( - 5317.) + 128., - 5101.) call Cinematic_conditionalScene(4., ref_function_Cinematic_beast11a) endfunction function Cinematic_beast11a takes nothing returns nothing call SetUnitFacingTimed(Cinematic_robed2, 45. + 180. - 30., 2.) call SetUnitPosition(Cinematic_gatherer, GetUnitX(Cinematic_gatherer), GetUnitY(Cinematic_gatherer)) call SetUnitPosition(Cinematic_gatherer2, GetUnitX(Cinematic_gatherer2), GetUnitY(Cinematic_gatherer2)) call SetUnitPosition(Cinematic_gatherer3, GetUnitX(Cinematic_gatherer3), GetUnitY(Cinematic_gatherer3)) call IssuePointOrder(Cinematic_gatherer, "move", - 5317., - 5101.) call IssuePointOrder(Cinematic_gatherer2, "move", ( - 5317.) + 64., - 5101.) call IssuePointOrder(Cinematic_gatherer3, "move", ( - 5317.) + 128., - 5101.) call Cinematic_conditionalScene(4., ref_function_Cinematic_beast11b) endfunction function Cinematic_beast11b takes nothing returns nothing call SetUnitFacingTimed(Cinematic_robed, 45. - 15., 2.1) call SetUnitPosition(Cinematic_gatherer, GetUnitX(Cinematic_gatherer), GetUnitY(Cinematic_gatherer)) call SetUnitPosition(Cinematic_gatherer2, GetUnitX(Cinematic_gatherer2), GetUnitY(Cinematic_gatherer2)) call SetUnitPosition(Cinematic_gatherer3, GetUnitX(Cinematic_gatherer3), GetUnitY(Cinematic_gatherer3)) call IssuePointOrder(Cinematic_gatherer, "move", - 5317., - 5101.) call IssuePointOrder(Cinematic_gatherer2, "move", ( - 5317.) + 64., - 5101.) call IssuePointOrder(Cinematic_gatherer3, "move", ( - 5317.) + 128., - 5101.) call Cinematic_conditionalScene(4., ref_function_Cinematic_beast12) endfunction function CameraControl_fadeOutBeast takes real duration returns nothing if CameraControl_beastFadeContinueTimer != null then call DestroyTimer(CameraControl_beastFadeContinueTimer) endif if CameraControl_beastFadeFinishTimer != null then call DestroyTimer(CameraControl_beastFadeFinishTimer) endif if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call EnableUserUI(false) call SetCineFilterTexture(CameraControl_FILTER_MASK) call SetCineFilterBlendMode(BLEND_MODE_BLEND) call SetCineFilterTexMapFlags(TEXMAP_FLAG_NONE) call SetCineFilterStartUV(0., 0., 1., 1.) call SetCineFilterEndUV(0., 0., 1., 1.) call SetCineFilterStartColor(0, 0, 0, 0) call SetCineFilterEndColor(0, 0, 0, 255) call SetCineFilterDuration(duration) call DisplayCineFilter(true) endif endfunction function Cinematic_beast12 takes nothing returns nothing call CameraControl_fadeOutBeast(.5) call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast13) endfunction function Cinematic_transmissionBeast takes real duration, string text returns nothing if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call SetCinematicScene(0, PLAYER_COLOR_LIGHT_BLUE, "", text, duration, duration) endif endfunction function Cinematic_beast13 takes nothing returns nothing call RemoveUnit(Cinematic_gatherer) call RemoveUnit(Cinematic_gatherer2) call RemoveUnit(Cinematic_gatherer3) call RemoveUnit(Cinematic_robed) call RemoveUnit(Cinematic_robed2) call SetUnitTimeScale(Cinematic_coolBeast, .91) call SetUnitTimeScale(Cinematic_coolBeast2, .87) call SetUnitTimeScale(Cinematic_coolBeast3, .94) call CameraControl_fadeInBeast(.5) call CameraControl_snapBeast(3230.75, - 3202.29) call CameraControl_snapDistanceBeast(931.38) call CameraControl_snapAoaBeast(304.) call CameraControl_panBeast(3146.62, - 3045.61, 13.) call CameraControl_panAoaBeast(310., 13.) call CameraControl_panDistanceBeast(1024.52, 13.) call Cinematic_transmissionBeast(13., "Thus, the source of |cffffcc00Beasts|r power " + "is revealed. Humans, tolerant of the energy, evolved very slowly, but Beasts, having acquired the rune, are sensitive. " + "The effects make Beasts hyperperceptive of their environment, and " + "generate |cffffcc00lightning charge|r as an ability resource.") call Cinematic_conditionalScene(8., ref_function_Cinematic_beast14) endfunction function Cinematic_beast14 takes nothing returns nothing call IssuePointOrder(Cinematic_demoHunter, "channel", 3220., - 3220.) call Cinematic_conditionalScene(.35, ref_function_Cinematic_beast15) endfunction function Cinematic_beast15 takes nothing returns nothing call IssuePointOrder(Cinematic_coolBeast3, "blink", GetUnitX(Cinematic_coolBeast3) + 208. * Cos(bj_PI * 2. / 3.), GetUnitY(Cinematic_coolBeast3) + 208. * Sin(bj_PI * 2. / 3.)) call Cinematic_conditionalScene(.1, ref_function_Cinematic_beast16) endfunction function Cinematic_beast16 takes nothing returns nothing call IssuePointOrder(Cinematic_coolBeast, "blink", GetUnitX(Cinematic_coolBeast) + 178. * Cos(bj_PI * 2. / 3.), GetUnitY(Cinematic_coolBeast) + 178. * Sin(bj_PI * 2. / 3.)) call Cinematic_conditionalScene(.12, ref_function_Cinematic_beast17) endfunction function Cinematic_beast17 takes nothing returns nothing call IssuePointOrder(Cinematic_coolBeast2, "blink", GetUnitX(Cinematic_coolBeast2) + 298. * Cos(bj_PI * 2. / 3.), GetUnitY(Cinematic_coolBeast2) + 298. * Sin(bj_PI * 2. / 3.)) call Cinematic_conditionalScene(4.8, ref_function_Cinematic_beast18) endfunction function Cinematic_beast18 takes nothing returns nothing call CameraControl_fadeOutBeast(.5) call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast19) endfunction function Cinematic_beast19 takes nothing returns nothing call RemoveUnit(Cinematic_coolBeast) call RemoveUnit(Cinematic_coolBeast3) call RemoveUnit(Cinematic_coolBeast2) call RemoveUnit(Cinematic_demoHunter) call Cinematic_titleTextBeast(Cinematic_TITLE_BEAST_TWO) call Cinematic_conditionalScene(1., ref_function_Cinematic_beast20) endfunction function Cinematic_beast2 takes nothing returns nothing call CameraControl_fadeOutBeast(.5) call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast3) endfunction function CameraControl_snapRotationBeast takes real r returns nothing if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call SetCameraField(CAMERA_FIELD_ROTATION, r, 0.) endif endfunction function Cinematic_beast20 takes nothing returns nothing set Cinematic_demoHunter = CreateUnit(Players_fromId[0], Units_HUNTER_ID, - 3235., - 3652., 270.) call SetUnitMoveSpeed(Cinematic_demoHunter, 160.) set Cinematic_coolBeast = CreateUnit(Players_fromId[Players_FIRST_BEAST], Units_BEAST_ID, - 2810., - 5070., 90.) call Units_initializeBeast(Cinematic_coolBeast) call CameraControl_snapBeast( - 2489.45, - 4247.05) call CameraControl_snapAoaBeast(319.76) call CameraControl_snapDistanceBeast(1650.) call CameraControl_snapRotationBeast(97.14) call Cinematic_conditionalScene(4., ref_function_Cinematic_beast21) endfunction function Cinematic_beast21 takes nothing returns nothing call IssuePointOrder(Cinematic_demoHunter, "move", 3575., - 4185.) call CameraControl_fadeInBeast(.5) call CameraControl_panBeast(( - 2489.45) - 256., ( - 4247.05) + 256., 13.) set Cinematic_stopwatch = Statistics_secondsElapsed call Cinematic_transmissionBeast(12., "A group of |cffffcc00Hunters|r have located the " + "rune, and are trying to retrieve it. Use guerilla warfare to harass them and " + "slow their pace. Beasts regenerate health continuously.") call Cinematic_conditionalScene(4., ref_function_Cinematic_beast22) endfunction function Cinematic_beast22 takes nothing returns nothing local real x local real y local real ang if GetWidgetLife(Cinematic_demoHunter) > .9 * GetUnitState(Cinematic_demoHunter, UNIT_STATE_MAX_LIFE) then if IsUnitInRange(Cinematic_demoHunter, Cinematic_coolBeast, 200.) then call IssueTargetOrder(Cinematic_coolBeast, "attack", Cinematic_demoHunter) elseif IsUnitInRange(Cinematic_demoHunter, Cinematic_coolBeast, 625.) then set ang = TerrainData_radiansBetweenXY(GetUnitX(Cinematic_demoHunter), GetUnitX(Cinematic_coolBeast), GetUnitY(Cinematic_demoHunter), GetUnitY(Cinematic_coolBeast)) set x = GetUnitX(Cinematic_demoHunter) + 100. * Cos(ang) set y = GetUnitY(Cinematic_demoHunter) + 100. * Sin(ang) call IssuePointOrder(Cinematic_coolBeast, "blink", x, y) else call IssueTargetOrder(Cinematic_coolBeast, "attack", Cinematic_demoHunter) endif call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast22) else set Cinematic_stopwatch2 = Statistics_secondsElapsed call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast23) endif endfunction function Cinematic_beast23 takes nothing returns nothing call IssuePointOrder(Cinematic_coolBeast, "move", - 2150., 3180.) if Statistics_secondsElapsed - Cinematic_stopwatch < 12 then if Statistics_secondsElapsed - Cinematic_stopwatch2 < 3 then call IssuePointOrder(Cinematic_demoHunter, "move", - 2150., 3180.) call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast23) else call IssueTargetOrder(Cinematic_demoHunter, "channel", Cinematic_coolBeast) set Cinematic_stopwatch2 = Statistics_secondsElapsed call Cinematic_conditionalScene(.4, ref_function_Cinematic_beast23b) endif else call Cinematic_conditionalScene(.1, ref_function_Cinematic_beast24) endif endfunction function Cinematic_beast23b takes nothing returns nothing local real ang = GetUnitFacing(Cinematic_coolBeast) * bj_DEGTORAD + bj_PI / 6. local real x = GetUnitX(Cinematic_coolBeast) + 400. * Cos(ang) local real y = GetUnitY(Cinematic_coolBeast) + 400. * Sin(ang) call IssuePointOrder(Cinematic_coolBeast, "blink", x, y) call Cinematic_conditionalScene(.7, ref_function_Cinematic_beast23) endfunction function Cinematic_beast24 takes nothing returns nothing call CameraControl_fadeOutBeast(.5) call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast25) endfunction function Cinematic_beast25 takes nothing returns nothing local item ite call RemoveUnit(Cinematic_coolBeast) call RemoveUnit(Cinematic_demoHunter) call CameraControl_snapBeast( - 348.54, 2149.71) call CameraControl_snapAoaBeast(311.61) call CameraControl_snapDistanceBeast(1239.67) call CameraControl_fadeInBeast(.5) set Cinematic_coolBeast = CreateUnit(Players_fromId[Players_FIRST_BEAST], Units_BEAST_ID, - 952., 3080., 0.) set Cinematic_demoHunter = CreateUnit(Players_fromId[0], Units_HUNTER_ID, - 203., 1440., 90.) set ite = CreateItem(Units_GAS_ACTION, - 203., 1440.) call UnitAddItem(Cinematic_demoHunter, ite) call UnitAddAbility(Cinematic_demoHunter, 1093677134) call SetUnitMoveSpeed(Cinematic_demoHunter, 180.) call SetUnitMoveSpeed(Cinematic_coolBeast, 160.) call SetWidgetLife(Cinematic_coolBeast, 100.) call IssueTargetOrder(Cinematic_coolBeast, "attack", Cinematic_demoHunter) set Cinematic_stopwatch = Statistics_secondsElapsed call Cinematic_transmissionBeast(12., "The round is won if you prevent the Hunters from " + "returning with the rune, or simply killing them all. But be warned, if care is " + "not taken, Hunters will usually win an outright fight.") call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast26) set ite = null endfunction function Cinematic_beast26 takes nothing returns nothing if IsUnitInRange(Cinematic_coolBeast, Cinematic_demoHunter, 900.) then call IssueTargetOrder(Cinematic_demoHunter, "channel", Cinematic_coolBeast) call Cinematic_conditionalScene(.75, ref_function_Cinematic_beast28) else call IssuePointOrder(Cinematic_demoHunter, "move", - 1715., 3570.) call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast26) endif endfunction function Cinematic_beast28 takes nothing returns nothing if UnitAlive(Cinematic_coolBeast) then call IssueTargetOrder(Cinematic_demoHunter, "channel", Cinematic_coolBeast) call Cinematic_conditionalScene(.75, ref_function_Cinematic_beast28) elseif Statistics_secondsElapsed - Cinematic_stopwatch < 13 then call IssuePointOrder(Cinematic_demoHunter, "move", - 1715., 3570.) call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast28) else call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast29) endif endfunction function Cinematic_beast29 takes nothing returns nothing call CameraControl_fadeOutBeast(.5) call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast30) endfunction function Cinematic_beast3 takes nothing returns nothing call CameraControl_snapBeast(939.02, - 2310.99) call CameraControl_snapAoaBeast(314.43) call CameraControl_snapDistanceBeast(1363.64) call CameraControl_snapRotationBeast(56.42) set Cinematic_deer = CreateUnit(Players_fromId[Players_PASSIVE], 1852073330, 967., - 2540., 140.) call UnitRemoveAbility(Cinematic_deer, 1098342766) call SetUnitTimeScale(Cinematic_deer, .77) call CameraControl_fadeInBeast(.5) call Cinematic_transmissionBeast(8., "This wilderness was once a utopia. There " + "was a perfect symbiotic relationship between plants and animals.") call Cinematic_conditionalScene(9., ref_function_Cinematic_beast4) endfunction function Cinematic_beast30 takes nothing returns nothing call RemoveUnit(Cinematic_coolBeast) call RemoveUnit(Cinematic_demoHunter) set Cinematic_coolBeast = CreateUnit(Players_fromId[Players_FIRST_BEAST], Units_BEAST_ID, - 3620., - 1430., 260.) set Cinematic_coolBeast2 = CreateUnit(Players_fromId[Players_FIRST_BEAST + 1], Units_BEAST_ID, - 3400., - 1675., 180.) call PauseUnit(Cinematic_coolBeast, true) call PauseUnit(Cinematic_coolBeast2, true) set Cinematic_demoHunter = CreateUnit(Players_fromId[0], Units_HUNTER_ID, - 3660., - 1660., 180. + 45.) set Cinematic_demoHunter2 = CreateUnit(Players_fromId[1], Units_HUNTER_ID, - 4032., - 1000., 180.) call SetUnitInvulnerable(Cinematic_demoHunter2, true) call Cinematic_titleTextBeast(Cinematic_TITLE_BEAST_THREE) call Cinematic_conditionalScene(5., ref_function_Cinematic_beast31) endfunction function CameraControl_snapFovBeast takes real aoa returns nothing if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call SetCameraField(CAMERA_FIELD_FIELD_OF_VIEW, aoa, 0.) endif endfunction function Cinematic_beast31 takes nothing returns nothing call CameraControl_snapBeast( - 3562.51, - 1391.11) call CameraControl_snapAoaBeast(270.) call CameraControl_snapDistanceBeast(3300.) call CameraControl_snapFovBeast(30.) call CameraControl_snapRotationBeast(90.) call CameraControl_fadeInBeast(.5) call Cinematic_transmissionBeast(12., "Humans have much poorer vision than Beasts. " + "They can't see well other than in the forwards direction, and can easily " + "lose track of their allies. Track your enemy and engage stragglers as a group.") call Cinematic_conditionalScene(13., ref_function_Cinematic_beast31a) endfunction function Cinematic_beast31a takes nothing returns nothing call Cinematic_transmissionBeast(12., "Your |cffffcc00Basic Attack|r deals " + "|cffffcc0050|r damage, and an additional |cffffcc0010|r " + "damage over |cffffcc005|r seconds. The damage-over-time component does not stack. " + "Use these values to help assess when to " + "fight and when to wait.") call Cinematic_conditionalScene(7.5, ref_function_Cinematic_beast31b) endfunction function Cinematic_beast31b takes nothing returns nothing call PauseUnit(Cinematic_coolBeast, false) call PauseUnit(Cinematic_coolBeast2, false) call Cinematic_conditionalScene(5.5, ref_function_Cinematic_beast32) endfunction function Cinematic_beast32 takes nothing returns nothing call CameraControl_fadeOutBeast(.5) call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast33) endfunction function CameraControl_resetBeast takes nothing returns nothing if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call ResetToGameCamera(0.) endif endfunction function Units_initializeBeastEx takes unit u, integer balls returns nothing local integer ua = new_BeastLightningDat() local integer index = 0 local integer id = GetUnitTypeId(u) local integer swap set BeastLightningDat_typ[ua] = id set BeastLightningDat_u[ua] = u set BeastLightningDat_ticksUntilNextCheck[ua] = R2I(Units_LIGHTNING_CHECK_PERIOD / Units_CLOCK_PERIOD) set BeastLightningDat_balls[ua] = 0 call dispatch_Table_Table_Table_saveInt(Units_fromBeast, handle_getHandleId(u), ua) if Units_beastHead == 0 then set Units_beastHead = ua call TimerStart(Units_clock, Units_CLOCK_PERIOD, true, ref_function_Units_beastLightningTick) else set swap = Units_beastHead set BeastLightningDat_prev[swap] = ua set BeastLightningDat_next[ua] = swap set Units_beastHead = ua endif loop exitwhen index >= balls call Units_pushBall(u) set index = index + 1 endloop endfunction function Cinematic_beast33 takes nothing returns nothing call CameraControl_resetBeast() call RemoveUnit(Cinematic_demoHunter) call RemoveUnit(Cinematic_demoHunter2) call RemoveUnit(Cinematic_coolBeast) call RemoveUnit(Cinematic_coolBeast2) set Cinematic_coolBeast = CreateUnit(Players_fromId[Players_FIRST_BEAST], Units_BEAST_ID, 3890., - 4278., 90.) call Units_initializeBeastEx(Cinematic_coolBeast, 5) call CameraControl_snapBeast(3637.79, - 4278.92) call CameraControl_panBeast(3596.14, - 3751.21, 13.) call CameraControl_panAoaBeast(309.43, 13.) call CameraControl_panDistanceBeast(2196.15, 13.) call CameraControl_fadeInBeast(.5) call Cinematic_transmissionBeast(12., "Use |cffffcc00Organic Hemisection|r to scout " + "the map and monitor the hunters before planning an engagement.") call Cinematic_conditionalScene(5., ref_function_Cinematic_beast33a) endfunction function Cinematic_beast33a takes nothing returns nothing call IssueImmediateOrder(Cinematic_coolBeast, "channel") call Cinematic_conditionalScene(1., ref_function_Cinematic_beast33b) endfunction function Cinematic_beast33b takes nothing returns nothing set Cinematic_coolBeast2 = Units_hero[Players_FIRST_BEAST] set Cinematic_coolBeast = Units_subHero[Players_FIRST_BEAST] call SetUnitMoveSpeed(Cinematic_coolBeast, 270. * .8) call IssuePointOrder(Cinematic_coolBeast, "move", 2867., - 2940.) call IssuePointOrder(Cinematic_coolBeast2, "move", 4200., - 2940.) call Cinematic_conditionalScene(7., ref_function_Cinematic_beast34) endfunction function Cinematic_beast34 takes nothing returns nothing call CameraControl_fadeOutBeast(.5) call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast35) endfunction function Cinematic_beast35 takes nothing returns nothing call CameraControl_resetBeast() call RemoveUnit(Cinematic_coolBeast) call RemoveUnit(Cinematic_coolBeast2) if GetPlayerId(Players_locl) >= Players_FIRST_BEAST then call DisplayTimedTextToPlayer(Players_locl, .1, 0., 1., "|cffffcc00Good Luck|r") endif endfunction function Cinematic_beast4 takes nothing returns nothing call CameraControl_fadeOutBeast(.5) call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast5) endfunction function Cinematic_beast5 takes nothing returns nothing call RemoveUnit(Cinematic_deer) call CameraControl_fadeInBeast(.5) call CameraControl_snapBeast( - 838.9, - 177.35) call CameraControl_snapRotationBeast(244.8) call CameraControl_snapAoaBeast(307.59) call CameraControl_snapDistanceBeast(1363.64) call Cinematic_transmissionBeast(8., "A |cffffcc00Rune|r was buried beneath these " + "mountains - it emanated power. The soil itself lent this life to its " + "surroundings.") call Cinematic_conditionalScene(9., ref_function_Cinematic_beast6) endfunction function Cinematic_beast6 takes nothing returns nothing call CameraControl_fadeOutBeast(.5) call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast7) endfunction function Cinematic_beast7 takes nothing returns nothing set Cinematic_primative = CreateUnit(Players_fromId[Players_FIRST_BEAST], 1747988553, 4732., 2748., 100.) set Cinematic_attackTarget = CreateUnit(Players_fromId[0], 1747988554, 4722., 2770., 0.) call SetUnitTimeScale(Cinematic_primative, .8) call IssueTargetOrder(Cinematic_primative, "attack", Cinematic_attackTarget) call CameraControl_snapBeast(4734.42, 2744.56) call CameraControl_snapRotationBeast(90.) call CameraControl_snapAoaBeast(304.) call CameraControl_snapDistanceBeast(636.15) call CameraControl_fadeInBeast(.5) call Cinematic_transmissionBeast(10., "Primative humans unearthed the rune by chance, and " + "received great intellectual growth, hence imperializing the region. They " + "worshipped the rune as their source of science, economics, and creativity.") call Cinematic_conditionalScene(11., ref_function_Cinematic_beast8) endfunction function Cinematic_beast8 takes nothing returns nothing call CameraControl_fadeOutBeast(.5) call Cinematic_conditionalScene(.5, ref_function_Cinematic_beast9) endfunction function Cinematic_beast9 takes nothing returns nothing call RemoveUnit(Cinematic_primative) call RemoveUnit(Cinematic_attackTarget) set Cinematic_robed = CreateUnit(Players_fromId[Players_PASSIVE], 1747988555, - 5039., - 4895., 45.) set Cinematic_robed2 = CreateUnit(Players_fromId[Players_PASSIVE], 1747988555, - 4993., - 4800., 45. + 180. + 25.) call SetUnitTimeScale(Cinematic_robed, .5) call SetUnitTimeScale(Cinematic_robed2, .61) set Cinematic_gatherTarget = CreateDestructable(1096053874, ( - 4235.) + 2000., - 5180., 270., 1., 0) set Cinematic_gatherer = CreateUnit(Players_fromId[Players_PASSIVE], 1752196449, ( - 4235.) + 2000. - 64., - 5180., 0.) set Cinematic_gatherer2 = CreateUnit(Players_fromId[Players_PASSIVE], 1752196449, ( - 4235.) + 2000., ( - 5180.) + 64., 270.) set Cinematic_gatherer3 = CreateUnit(Players_fromId[Players_PASSIVE], 1752196449, ( - 4235.) + 2000. + 64., - 5180., 180.) call IssueTargetOrder(Cinematic_gatherer, "smart", Cinematic_gatherTarget) call IssueTargetOrder(Cinematic_gatherer2, "smart", Cinematic_gatherTarget) call IssueTargetOrder(Cinematic_gatherer3, "smart", Cinematic_gatherTarget) call SetUnitMoveSpeed(Cinematic_gatherer, 90.) call SetUnitMoveSpeed(Cinematic_gatherer2, 83.) call SetUnitMoveSpeed(Cinematic_gatherer3, 80.) call CameraControl_snapBeast( - 4825.27, - 4901.36) call CameraControl_snapDistanceBeast(846.71) call CameraControl_snapAoaBeast(304.00) call CameraControl_fadeInBeast(.5) call Cinematic_transmissionBeast(14., "As the kingdom grew, a class divide became more " + "pronounced, and eventually a number of rebel groups banded together and rose " + "against imperialization. The rune was stolen, and the rebels were subsequently " + "annhialated, but the rune was never found.") call Cinematic_conditionalScene(1., ref_function_Cinematic_beast10) endfunction function Cinematic_cleanup takes nothing returns nothing local integer index = 0 call RemoveUnit(Cinematic_farmer) call RemoveUnit(Cinematic_farmer2) call RemoveUnit(Cinematic_primative) call RemoveUnit(Cinematic_attackTarget) call RemoveUnit(Cinematic_corpse) call RemoveItem(Cinematic_dummyItem) call RemoveUnit(Cinematic_deer) call RemoveUnit(Cinematic_gatherer) call RemoveUnit(Cinematic_gatherer2) call RemoveUnit(Cinematic_gatherer3) call RemoveUnit(Cinematic_robed) call RemoveUnit(Cinematic_robed2) call RemoveDestructable(Cinematic_gatherTarget) call RemoveUnit(Cinematic_coolBeast) call RemoveUnit(Cinematic_coolBeast2) call RemoveUnit(Cinematic_coolBeast3) call RemoveUnit(Cinematic_demoHunter) loop exitwhen index > 7 call FogModifierStop(Cinematic_fm[index]) call DestroyFogModifier(Cinematic_fm[index]) set index = index + 1 endloop call RemoveUnit(Cinematic_hunter) call RemoveUnit(Cinematic_hunter2) call RemoveUnit(Cinematic_beast) call RemoveUnit(Cinematic_demoHunter2) endfunction function CameraControl_fadeInHunter takes real duration returns nothing if CameraControl_hunterFadeContinueTimer != null then call DestroyTimer(CameraControl_hunterFadeContinueTimer) endif if CameraControl_hunterFadeFinishTimer != null then call DestroyTimer(CameraControl_hunterFadeFinishTimer) endif if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call EnableUserUI(false) call SetCineFilterTexture(CameraControl_FILTER_MASK) call SetCineFilterBlendMode(BLEND_MODE_BLEND) call SetCineFilterTexMapFlags(TEXMAP_FLAG_NONE) call SetCineFilterStartUV(0., 0., 1., 1.) call SetCineFilterEndUV(0., 0., 1., 1.) call SetCineFilterStartColor(0, 0, 0, 255) call SetCineFilterEndColor(0, 0, 0, 0) call SetCineFilterDuration(duration) call DisplayCineFilter(true) endif set CameraControl_hunterFadeFinishTimer = CreateTimer() call TimerStart(CameraControl_hunterFadeFinishTimer, duration, false, ref_function_CameraControl_endFadeHunter) endfunction function Cinematic_clearTextHuman takes nothing returns nothing if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call ClearTextMessages() endif endfunction function randomizeSitePreferences takes nothing returns nothing local integer index = 0 loop exitwhen index >= Players_FIRST_BEAST call dispatch_Table_Table_Table_saveInt(Units_sitePref, handle_getHandleId(Units_hero[index]), GetRandomInt(0, 1)) set index = index + 1 endloop endfunction function AI_resetState takes nothing returns nothing local integer index = Players_FIRST_BEAST call hunterElection() call randomizeSitePreferences() loop exitwhen index > Players_LAST_BEAST call dispatch_Table_Table_Table_saveInt(Units_beastState, handle_getHandleId(Units_hero[index]), AI_STATE_AGGRESSIVE) call dispatch_Table_Table_Table_saveInt(Units_thunderCd, handle_getHandleId(Units_hero[index]), 0) set index = index + 1 endloop endfunction function Units_clearExtraItems takes nothing returns nothing call EnumItemsInRect(bj_mapInitialPlayableArea, null, ref_function_Units_filterItems) endfunction function Units_clearNonHunters takes nothing returns nothing local integer index = 0 local unit iter loop exitwhen index > Players_LAST_BEAST call GroupEnumUnitsOfPlayer(Units_grp, Players_fromId[index], null) loop set iter = FirstOfGroup(Units_grp) exitwhen iter == null call GroupRemoveUnit(Units_grp, iter) if GetUnitTypeId(iter) != Units_HUNTER_ID or ( not UnitAlive(iter)) then call RemoveUnit(iter) endif endloop set index = index + 1 endloop set iter = null endfunction function showBoard takes nothing returns nothing call MultiboardDisplay(MultiboardControl_mb, true) endfunction function unit_addXp takes unit this, integer toAdd, boolean showEyeCandy returns nothing call AddHeroXP(this, toAdd, showEyeCandy) endfunction function unit_getState takes unit this, unitstate state returns real return GetUnitState(this, state) endfunction function unit_setX takes unit this, real x returns nothing call SetUnitX(this, x) endfunction function unit_setY takes unit this, real y returns nothing call SetUnitY(this, y) endfunction function unit_unpause takes unit this returns nothing call PauseUnit(this, false) endfunction function Game_roundStart takes nothing returns nothing local integer index = 0 local real offsX local real offsY local unit receiver local unit receiver_2 local unit receiver_3 call Units_clearNonHunters() call Units_clearExtraItems() set Statistics_roundEndTime = Statistics_secondsElapsed + Game_ROUND_DURATION set Game_roundEnabled = true set Statistics_huntersAlive = 0 set Statistics_beastsAlive = 0 call SetItemPosition(Units_artifact, TerrainData_RUNE_1_X, TerrainData_RUNE_1_Y) call SetItemPosition(Units_artifact2, TerrainData_RUNE_2_X, TerrainData_RUNE_2_Y) call ResetToGameCamera(0.) call FogEnable(true) loop exitwhen index >= Players_COUNT if index < Players_FIRST_BEAST then if Players_playing[index] then if UnitAlive(Units_hero[index]) then set receiver = Units_hero[index] call unit_setX(receiver, TerrainData_HUNTER_SPAWN_X) set receiver_2 = receiver call unit_setY(receiver_2, TerrainData_HUNTER_SPAWN_Y) set receiver_3 = receiver_2 call unit_unpause(receiver_3) call SetWidgetLife(Units_hero[index], unit_getState(Units_hero[index], UNIT_STATE_MAX_LIFE)) call SetUnitInvulnerable(Units_hero[index], false) else set Units_hero[index] = CreateUnit(Players_fromId[index], Units_HUNTER_ID, TerrainData_HUNTER_SPAWN_X, TerrainData_HUNTER_SPAWN_Y, 270.) endif set Statistics_huntersAlive = Statistics_huntersAlive + 1 endif if Players_locl == Players_fromId[index] then call PanCameraToTimed(TerrainData_HUNTER_SPAWN_X, TerrainData_HUNTER_SPAWN_Y, 0.) call SelectUnit(Units_hero[index], true) endif else if Players_playing[index] then set offsX = Game_BEAST_PLACE_OFFSET * Cos(index * 2. * bj_PI / (Players_COUNT * 1. / 2)) set offsY = Game_BEAST_PLACE_OFFSET * Sin(index * 2. * bj_PI / (Players_COUNT * 1. / 2)) set Units_hero[index] = CreateUnit(Players_fromId[index], Units_BEAST_ID, TerrainData_BEAST_SPAWN_X + offsX, TerrainData_BEAST_SPAWN_Y + offsY, 270.) call Units_initializeBeast(Units_hero[index]) call UnitAddAbility(Units_hero[index], 1098015094) call UnitRemoveAbility(Units_hero[index], 1098015094) set Statistics_beastsAlive = Statistics_beastsAlive + 1 endif if Players_locl == Players_fromId[index] then call PanCameraToTimed(TerrainData_BEAST_SPAWN_X, TerrainData_BEAST_SPAWN_Y, 0.) call SelectUnit(Units_hero[index], true) endif endif set Players_aliveCount = Players_aliveCount + 1 call unit_addXp(Units_hero[index], 1000, false) call IssueImmediateOrder(Units_hero[index], "stop") set index = index + 1 endloop call AI_resetState() call showBoard() set receiver = null set receiver_2 = null set receiver_3 = null endfunction function TextTag_resetMinimapLabels takes nothing returns nothing local integer index = 0 loop exitwhen index > TextTag_labelIndex call DestroyTextTag(TextTag_minimapLabels[index]) set index = index + 1 endloop set TextTag_labelIndex = -1 endfunction function Cinematic_endCinematic takes nothing returns nothing call TimerStart(Cinematic_humanClock, 0., false, ref_function_Cinematic_cleanup) call CameraControl_fadeInBeast(.5) call CameraControl_fadeInHunter(.5) call ShowInterface(true, .5) call StartSound(Cinematic_tipSound) call EnableUserUI(true) call EnableUserControl(true) set Cinematic_enabled = false set Cinematic_over = true call FogEnable(true) call FogMaskEnable(false) call ResetToGameCamera(0.) call TextTag_resetMinimapLabels() call Cinematic_clearTextHuman() call Cinematic_clearTextBeast() set Cinematic_wfx = AddWeatherEffect(bj_mapInitialPlayableArea, 1280470369) call EnableWeatherEffect(Cinematic_wfx, true) call Game_roundStart() endfunction function CameraControl_snapAoaHuman takes real aoa returns nothing if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK, aoa, 0.) endif endfunction function CameraControl_snapDistanceHuman takes real d returns nothing if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, d, 0.) endif endfunction function CameraControl_snapHuman takes real x, real y returns nothing if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call PanCameraToTimed(x, y, 0.) endif endfunction function Cinematic_biconditionalScene takes real sleep, code next returns nothing if Players_escapePressedCount >= Players_humanCount then call Cinematic_endCinematic() else call TimerStart(Cinematic_humanClock, sleep, false, next) endif endfunction function Cinematic_human0 takes nothing returns nothing call Cinematic_clearTextHuman() call CameraControl_snapHuman(Cinematic_MINIMAP_X, Cinematic_MINIMAP_Y) call CameraControl_snapAoaHuman(Cinematic_MINIMAP_AOA) call CameraControl_snapDistanceHuman(Cinematic_MINIMAP_DISTANCE) call CameraControl_fadeInHunter(.5) call Cinematic_biconditionalScene(1.5, ref_function_Cinematic_human1) endfunction function Cinematic_titleTextHuman takes string text returns nothing if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call DisplayTimedTextToPlayer(Players_locl, .1, 0., 3., text) endif endfunction function Cinematic_human1 takes nothing returns nothing call Cinematic_titleTextHuman(Cinematic_TITLE_ONE) call Cinematic_biconditionalScene(5., ref_function_Cinematic_human2) endfunction function CameraControl_panDistanceHuman takes real dist, real duration returns nothing if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, dist, duration) endif endfunction function CameraControl_panHuman takes real x, real y, real duration returns nothing if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call PanCameraToTimed(x, y, duration) endif endfunction function Cinematic_human10 takes nothing returns nothing call CameraControl_snapHuman(Cinematic_FOREST_X, Cinematic_FOREST_Y) call CameraControl_snapAoaHuman(Cinematic_FOREST_AOA) call CameraControl_snapDistanceHuman(Cinematic_FOREST_DISTANCE) call CameraControl_panHuman(Cinematic_FOREST_X + 128., Cinematic_FOREST_Y + 128., 7.) call CameraControl_panDistanceHuman(Cinematic_FOREST_DISTANCE * 1.1, 7.) call RemoveUnit(Cinematic_farmer) call RemoveUnit(Cinematic_farmer2) call SetUnitTimeScale(Cinematic_hunter, .5) call SetUnitTimeScale(Cinematic_hunter2, .44) call CameraControl_fadeInHunter(.5) call Cinematic_biconditionalScene(7., ref_function_Cinematic_human11) endfunction function CameraControl_fadeOutHunter takes real duration returns nothing if CameraControl_hunterFadeContinueTimer != null then call DestroyTimer(CameraControl_hunterFadeContinueTimer) endif if CameraControl_hunterFadeFinishTimer != null then call DestroyTimer(CameraControl_hunterFadeFinishTimer) endif if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call EnableUserUI(false) call SetCineFilterTexture(CameraControl_FILTER_MASK) call SetCineFilterBlendMode(BLEND_MODE_BLEND) call SetCineFilterTexMapFlags(TEXMAP_FLAG_NONE) call SetCineFilterStartUV(0., 0., 1., 1.) call SetCineFilterEndUV(0., 0., 1., 1.) call SetCineFilterStartColor(0, 0, 0, 0) call SetCineFilterEndColor(0, 0, 0, 255) call SetCineFilterDuration(duration) call DisplayCineFilter(true) endif endfunction function Cinematic_human11 takes nothing returns nothing call CameraControl_fadeOutHunter(.5) call Cinematic_biconditionalScene(.5, ref_function_Cinematic_human12) endfunction function CameraControl_resetHuman takes nothing returns nothing if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call ResetToGameCamera(0.) endif endfunction function Cinematic_transmissionHuman takes real duration, string text returns nothing if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call SetCinematicScene(0, PLAYER_COLOR_LIGHT_BLUE, "", text, duration, duration) endif endfunction function Cinematic_human12 takes nothing returns nothing call RemoveUnit(Cinematic_hunter) call RemoveUnit(Cinematic_hunter2) call RemoveUnit(Cinematic_corpse) call CameraControl_resetHuman() call CameraControl_snapHuman( - 528.62, 3954.2) call CameraControl_snapDistanceHuman(1239.67) set Cinematic_hunter = CreateUnit(Players_fromId[Players_PASSIVE], 1752196449, 209., 3900., 180.) call SetUnitMoveSpeed(Cinematic_hunter, 130.) call IssuePointOrder(Cinematic_hunter, "move", - 1200., 3830.) call CameraControl_fadeInHunter(.5) call Cinematic_transmissionHuman(8., Cinematic_HUNTER_COMPARISON) call Cinematic_biconditionalScene(9., ref_function_Cinematic_human12a) endfunction function Cinematic_human12a takes nothing returns nothing call CameraControl_fadeOutHunter(.5) call Cinematic_biconditionalScene(.5, ref_function_Cinematic_human13) endfunction function Cinematic_human13 takes nothing returns nothing call RemoveUnit(Cinematic_hunter) set Cinematic_hunter = CreateUnit(Players_fromId[0], Units_HUNTER_ID, 256., - 3196., 270.) call CameraControl_resetHuman() call CameraControl_snapHuman(TerrainData_RUNE_2_X, TerrainData_RUNE_2_Y) call Cinematic_titleTextHuman(Cinematic_TITLE_TWO) call Cinematic_biconditionalScene(5., ref_function_Cinematic_human14) endfunction function Cinematic_human14 takes nothing returns nothing call CameraControl_fadeInHunter(.5) call Cinematic_transmissionHuman(9., Cinematic_RUNE_LOCATION_EXPOSITION) call Cinematic_biconditionalScene(4., ref_function_Cinematic_human14a) endfunction function Cinematic_human14a takes nothing returns nothing call IssueTargetOrder(Cinematic_hunter, "smart", Units_artifact2) call Cinematic_biconditionalScene(4., ref_function_Cinematic_human14b) endfunction function Cinematic_human14b takes nothing returns nothing call CameraControl_fadeOutHunter(.5) call Cinematic_biconditionalScene(.5, ref_function_Cinematic_human14c) endfunction function Cinematic_human14c takes nothing returns nothing call SetItemPosition(Units_artifact2, 0., 0.) set Cinematic_dummyItem = CreateItem(1227894832, TerrainData_RUNE_2_X, TerrainData_RUNE_2_Y) call UnitAddItem(Cinematic_hunter, Cinematic_dummyItem) call SetUnitX(Cinematic_hunter, - 2150.) call SetUnitY(Cinematic_hunter, 3180.) call CameraControl_snapHuman( - 1715., 3630.) call CameraControl_snapAoaHuman(304.) call CameraControl_snapDistanceHuman(1127.) call CameraControl_fadeInHunter(.5) call UnitDropItemPoint(Cinematic_hunter, Cinematic_dummyItem, - 1622., 3660.) call Cinematic_biconditionalScene(2.5, ref_function_Cinematic_human15) endfunction function Cinematic_human15 takes nothing returns nothing call Cinematic_transmissionHuman(8., Cinematic_ROUND_OBJECTIVE_EXPLANATION) call Cinematic_biconditionalScene(9., ref_function_Cinematic_human16) endfunction function Cinematic_human16 takes nothing returns nothing call CameraControl_fadeOutHunter(.5) call Cinematic_biconditionalScene(1.5, ref_function_Cinematic_human17) endfunction function unit_getX takes unit this returns real return GetUnitX(this) endfunction function unit_getY takes unit this returns real return GetUnitY(this) endfunction function Cinematic_human17 takes nothing returns nothing local item ite call RemoveUnit(Cinematic_hunter) call RemoveItem(Cinematic_dummyItem) set Cinematic_hunter = CreateUnit(Players_fromId[0], Units_HUNTER_ID, - 5032., 5032., 90.) set Cinematic_hunter2 = CreateUnit(Players_fromId[Players_PASSIVE], Units_HUNTER_ID, ( - 647.) + 512. + 256. + 128. + 64., ( - 1559.) + 128., 90.) set ite = CreateItem(Units_GAS_ACTION, unit_getX(Cinematic_hunter), unit_getY(Cinematic_hunter)) call UnitAddItem(Cinematic_hunter, ite) call CameraControl_resetHuman() call Cinematic_titleTextHuman(Cinematic_TITLE_THREE) call Cinematic_biconditionalScene(5., ref_function_Cinematic_human18) set ite = null endfunction function Cinematic_human18 takes nothing returns nothing local integer index = 0 call FogEnable(true) call FogMaskEnable(true) call SetUnitX(Cinematic_hunter, - 647.) call SetUnitY(Cinematic_hunter, - 1559.) set Cinematic_beast = CreateUnit(Players_fromId[Players_FIRST_BEAST], Units_BEAST_ID, - 647., ( - 1559.) + 512., 90.) call PauseUnit(Cinematic_beast, true) call SetPlayerAlliance(Players_fromId[Players_PASSIVE], Players_fromId[Players_FIRST_BEAST], ALLIANCE_PASSIVE, false) call SetPlayerAlliance(Players_fromId[Players_FIRST_BEAST], Players_fromId[Players_PASSIVE], ALLIANCE_PASSIVE, false) set Cinematic_fm[0] = CreateFogModifierRadius(Players_fromId[1], FOG_OF_WAR_VISIBLE, - 647., - 1559., 500., false, false) set Cinematic_fm[1] = CreateFogModifierRadius(Players_fromId[2], FOG_OF_WAR_VISIBLE, - 647., - 1559., 500., false, false) set Cinematic_fm[2] = CreateFogModifierRadius(Players_fromId[0], FOG_OF_WAR_VISIBLE, - 647., ( - 1559.) + 500., 600., false, false) set Cinematic_fm[3] = CreateFogModifierRadius(Players_fromId[1], FOG_OF_WAR_VISIBLE, - 647., ( - 1559.) + 500., 600., false, false) set Cinematic_fm[4] = CreateFogModifierRadius(Players_fromId[2], FOG_OF_WAR_VISIBLE, - 647., ( - 1559.) + 500., 600., false, false) set Cinematic_fm[5] = CreateFogModifierRadius(Players_fromId[0], FOG_OF_WAR_VISIBLE, ( - 647.) + 512. + 256. + 128. + 64., ( - 1559.) + 128., 350., false, false) set Cinematic_fm[6] = CreateFogModifierRadius(Players_fromId[1], FOG_OF_WAR_VISIBLE, ( - 647.) + 512. + 256. + 128. + 64., ( - 1559.) + 128., 350., false, false) set Cinematic_fm[7] = CreateFogModifierRadius(Players_fromId[2], FOG_OF_WAR_VISIBLE, ( - 647.) + 512. + 256. + 128. + 64., ( - 1559.) + 128., 350., false, false) loop exitwhen index > 7 call FogModifierStart(Cinematic_fm[index]) set index = index + 1 endloop call CameraControl_snapHuman( - 179.14, - 1337.26) call CameraControl_snapDistanceHuman(1996.5) call CameraControl_fadeInHunter(.5) call Cinematic_transmissionHuman(8., Cinematic_HUMAN_PROPERTIES) call Cinematic_biconditionalScene(10., ref_function_Cinematic_human19) endfunction function Cinematic_human19 takes nothing returns nothing call Cinematic_transmissionHuman(8., Cinematic_BEAST_TELEPATHY) call Cinematic_biconditionalScene(3., ref_function_Cinematic_human20) endfunction function Cinematic_human2 takes nothing returns nothing call Cinematic_transmissionHuman(12., Cinematic_HUMAN_INTRO_TEXT) call Cinematic_biconditionalScene(13., ref_function_Cinematic_human3) endfunction function Cinematic_human20 takes nothing returns nothing call IssuePointOrder(Cinematic_hunter, "move", GetUnitX(Cinematic_hunter), GetUnitY(Cinematic_hunter) + 128. + 64.) call SetUnitFacingTimed(Cinematic_beast, 270., 1.) call Cinematic_biconditionalScene(7., ref_function_Cinematic_human21) endfunction function Cinematic_human21 takes nothing returns nothing call Cinematic_transmissionHuman(8., Cinematic_HOW_TO_SHOOT) call Cinematic_biconditionalScene(3., ref_function_Cinematic_human22) endfunction function Cinematic_human22 takes nothing returns nothing call IssuePointOrder(Cinematic_hunter, "channel", GetUnitX(Cinematic_beast), GetUnitY(Cinematic_beast)) call IssuePointOrder(Cinematic_hunter2, "channel", GetUnitX(Cinematic_beast) + 100., GetUnitY(Cinematic_beast) - 100.) call Cinematic_biconditionalScene(5., ref_function_Cinematic_human23) endfunction function Cinematic_human23 takes nothing returns nothing local integer index = 0 call CameraControl_fadeOutHunter(.5) call RemoveUnit(Cinematic_hunter) call RemoveUnit(Cinematic_hunter2) call RemoveUnit(Cinematic_beast) loop exitwhen index > 7 call FogModifierStop(Cinematic_fm[index]) call DestroyFogModifier(Cinematic_fm[index]) set index = index + 1 endloop call Cinematic_biconditionalScene(.5, ref_function_Cinematic_human24) endfunction function Cinematic_human24 takes nothing returns nothing if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call DisplayTimedTextToPlayer(Players_locl, .1, 0., 1., "|cffffcc00Good Luck|r") endif call Cinematic_biconditionalScene(3., ref_function_Cinematic_endCinematic) endfunction function TextTag_minimapLabel takes string s, real x, real y returns texttag local texttag tt = CreateTextTag() call SetTextTagPermanent(tt, true) call SetTextTagPos(tt, x - 10. * StringLength(s), y, 0.) call SetTextTagText(tt, s, 12. * .00225) call SetTextTagVisibility(tt, true) set TextTag_labelIndex = TextTag_labelIndex + 1 set TextTag_minimapLabels[TextTag_labelIndex] = tt set TextTag_minimapLabeltempReturn = tt set tt = null return TextTag_minimapLabeltempReturn endfunction function Cinematic_human3 takes nothing returns nothing local texttag tt = TextTag_minimapLabel("Uzapils", Cinematic_CASTLE_X, Cinematic_CASTLE_Y) call SetTextTagColor(tt, 255, 200, 0, 255) call Cinematic_transmissionHuman(8., Cinematic_FORTRESS_EXPOSITION) call Cinematic_biconditionalScene(9., ref_function_Cinematic_human4) set tt = null endfunction function Cinematic_human4 takes nothing returns nothing call TextTag_minimapLabel("Ziematerre", Cinematic_NORTH_X, Cinematic_NORTH_Y) call TextTag_minimapLabel("Forresthill", Cinematic_SOUTH_X, Cinematic_SOUTH_Y) call TextTag_minimapLabel("Cascade Peaks", Cinematic_MTN_X, Cinematic_MTN_Y) call TextTag_minimapLabel("Hunter's Hall", Cinematic_HALL_X, Cinematic_HALL_Y) call Cinematic_transmissionHuman(8., Cinematic_TOWNS_EXPOSITION) call Cinematic_biconditionalScene(9., ref_function_Cinematic_human5) endfunction function Cinematic_human5 takes nothing returns nothing local texttag tt = TextTag_minimapLabel("x", Cinematic_RED_X, Cinematic_RED_Y) call SetTextTagColor(tt, 255, 100, 100, 255) call Cinematic_transmissionHuman(13., Cinematic_CLASS_DIVIDE_EXPOSITION) call Cinematic_biconditionalScene(14., ref_function_Cinematic_human6) set tt = null endfunction function Cinematic_human6 takes nothing returns nothing local texttag tt call TextTag_resetMinimapLabels() call TextTag_minimapLabel("Hunter's Hall", Cinematic_HALL_X, Cinematic_HALL_Y) set tt = TextTag_minimapLabel("x", Cinematic_RED_X, Cinematic_RED_Y) call SetTextTagColor(tt, 255, 100, 100, 255) call Cinematic_transmissionHuman(9., Cinematic_EXPOSITION_BEAST_SITUATION) call Cinematic_biconditionalScene(10., ref_function_Cinematic_human7) set tt = null endfunction function Cinematic_human7 takes nothing returns nothing call CameraControl_fadeOutHunter(.5) call Cinematic_biconditionalScene(.5, ref_function_Cinematic_human8) endfunction function CameraControl_snapRotationHuman takes real r returns nothing if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call SetCameraField(CAMERA_FIELD_ROTATION, r, 0.) endif endfunction function Cinematic_human8 takes nothing returns nothing set Cinematic_farmer = CreateUnit(Players_fromId[Players_PASSIVE], 1752196449, Cinematic_FARM_X, Cinematic_FARM_Y, 360. * 7. / 8.) set Cinematic_farmer2 = CreateUnit(Players_fromId[Players_PASSIVE], 1752196449, Cinematic_FARM_X - 196., Cinematic_FARM_Y + 48., 360. * 3. / 8.) call TextTag_resetMinimapLabels() call SetUnitAnimation(Cinematic_farmer, "stand work") call SetUnitTimeScale(Cinematic_farmer, .5) call SetUnitAnimation(Cinematic_farmer2, "stand work") call SetUnitTimeScale(Cinematic_farmer2, .42) call SetUnitScale(Cinematic_farmer2, 1.1, 1.1, 1.1) call CameraControl_snapHuman(Cinematic_FARM_X, Cinematic_FARM_Y) call CameraControl_snapAoaHuman(Cinematic_FARM_AOA) call CameraControl_snapDistanceHuman(Cinematic_FARM_DISTANCE) call CameraControl_snapRotationHuman(Cinematic_FARM_ROTATION) call CameraControl_fadeInHunter(.5) call Cinematic_transmissionHuman(12.5, Cinematic_HUNTERS_HALL_EXPOSITION) call Cinematic_biconditionalScene(3., ref_function_Cinematic_human8b) endfunction function Cinematic_human8b takes nothing returns nothing call SetUnitTimeScale(Cinematic_farmer, .6) call SetUnitTimeScale(Cinematic_farmer2, .38) call Cinematic_biconditionalScene(3., ref_function_Cinematic_human9) endfunction function Cinematic_human9 takes nothing returns nothing set Cinematic_hunter = CreateUnit(Players_fromId[0], 1747988552, 4000., - 50., 45.) set Cinematic_hunter2 = CreateUnit(Players_fromId[1], Units_HUNTER_ID, 3980., 22., 45.) set Cinematic_corpse = CreateCorpse(Players_fromId[Players_PASSIVE], 1852073330, 4320., 350., 200.) call CameraControl_fadeOutHunter(.5) call Cinematic_biconditionalScene(.5, ref_function_Cinematic_human10) endfunction function Cinematic_neutral1 takes nothing returns nothing call ClearTextMessages() call DisplayTimedTextToPlayer(Players_locl, .2, 0., 2.5, " |cffffcc00Hunter's Hall|r") call DisplayTimedTextToPlayer(Players_locl, .2, 0., 2.5, "|cff999999A map by Cokemonkey11|r") call DisplayTimedTextToPlayer(Players_locl, .2, 0., 2.5, " ") call DisplayTimedTextToPlayer(Players_locl, .2, 0., 2.5, " ") call Cinematic_biconditionalScene(4.5, ref_function_Cinematic_neutral2) endfunction function Cinematic_neutral2 takes nothing returns nothing call ClearTextMessages() call DisplayTimedTextToPlayer(Players_locl, .2, 0., 5., " ") call DisplayTimedTextToPlayer(Players_locl, .2, 0., 5., " ") call DisplayTimedTextToPlayer(Players_locl, .2, 0., 5., "|cffeaeaea\"When in doubt, use brute force.\"|r") call DisplayTimedTextToPlayer(Players_locl, .2, 0., 5., " |cffc9c9c9-Ken Thompson|r") call StartSound(Cinematic_startSound) call Cinematic_biconditionalScene(7., ref_function_Cinematic_human0) call Cinematic_conditionalScene(7., ref_function_Cinematic_beast0) endfunction function DamageType_dealCodeDamage takes unit who, unit target, real damage returns nothing local integer prevType = DamageType_lastDamageType local real hp = GetWidgetLife(target) - .405 local real d = damage set DamageType_lastDamageType = DamageType_CODE if hp > d then call SetWidgetLife(target, hp - d + .405) call UnitDamageTarget(who, target, 0., true, false, DamageType_ATTACK_TYPE_UNIVERSAL, DAMAGE_TYPE_UNIVERSAL, null) else call UnitDamageTarget(who, target, 1000000. + d, true, false, DamageType_ATTACK_TYPE_UNIVERSAL, DAMAGE_TYPE_UNIVERSAL, null) call UnitDamageTarget(who, target, 1000000. + d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_UNIVERSAL, null) endif set DamageType_lastDamageType = prevType endfunction function DotData_onDestroy takes integer this returns nothing endfunction function dealloc_DotData takes integer obj returns nothing if DotData_typeId[obj] == 0 then call error("Double free: object of type DotData") else set DotData_nextFree[DotData_firstFree] = obj set DotData_firstFree = DotData_firstFree + 1 set DotData_typeId[obj] = 0 endif endfunction function destroyDotData takes integer this returns nothing call DotData_onDestroy(this) call dealloc_DotData(this) endfunction function dispatch_DotData_destroyDotData takes integer this returns nothing if DotData_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling DotData.destroyDotData") else call error("Called DotData.destroyDotData on invalid object.") endif endif call destroyDotData(this) endfunction function DamageOverTime_damageTick takes nothing returns nothing local integer index = 0 local integer tempDat loop exitwhen index > DamageOverTime_dbIndex set tempDat = DamageOverTime_dotDB[index] if DotData_fxFlag[tempDat] == DamageOverTime_FX_FLAG_COORDS then call DestroyEffect(AddSpecialEffect(DotData_fx[tempDat], GetUnitX(DotData_target[tempDat]), GetUnitY(DotData_target[tempDat]))) elseif DotData_fxFlag[tempDat] == DamageOverTime_FX_FLAG_ATTACH then call DestroyEffect(AddSpecialEffectTarget(DotData_fx[tempDat], DotData_target[tempDat], "origin")) else call BJDebugMsg("DamageOverTime.damageTick: Unrecognized fx flag received") endif call DamageType_dealCodeDamage(DotData_source[tempDat], DotData_target[tempDat], DotData_dps[tempDat] * DamageOverTime_CLOCK_PERIOD) set DotData_duration[tempDat] = DotData_duration[tempDat] - DamageOverTime_CLOCK_PERIOD if DotData_duration[tempDat] <= 0. or ( not UnitAlive(DotData_target[tempDat])) or ( not Game_roundEnabled) then call dispatch_DotData_destroyDotData(tempDat) set DamageOverTime_dotDB[index] = DamageOverTime_dotDB[DamageOverTime_dbIndex] set DamageOverTime_dbIndex = DamageOverTime_dbIndex - 1 set index = index - 1 if DamageOverTime_dbIndex == -1 then call PauseTimer(DamageOverTime_time) endif endif set index = index + 1 endloop endfunction function DelayDat_onDestroy takes integer this returns nothing endfunction function dealloc_DelayDat takes integer obj returns nothing if DelayDat_typeId[obj] == 0 then call error("Double free: object of type DelayDat") else set DelayDat_nextFree[DelayDat_firstFree] = obj set DelayDat_firstFree = DelayDat_firstFree + 1 set DelayDat_typeId[obj] = 0 endif endfunction function destroyDelayDat takes integer this returns nothing call DelayDat_onDestroy(this) call dealloc_DelayDat(this) endfunction function dispatch_DelayDat_destroyDelayDat takes integer this returns nothing if DelayDat_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling DelayDat.destroyDelayDat") else call error("Called DelayDat.destroyDelayDat on invalid object.") endif endif call destroyDelayDat(this) endfunction function DamageType_after takes nothing returns nothing local timer time = GetExpiredTimer() local integer tempDat = timer_getData(time) call DamageType_dealCodeDamage(DelayDat_source[tempDat], DelayDat_target[tempDat], DelayDat_damage[tempDat]) call dispatch_DelayDat_destroyDelayDat(tempDat) call DestroyTimer(time) set time = null endfunction function DamageType_c takes nothing returns boolean local unit tU = GetTriggerUnit() call UnitAddAbility(tU, DamageType_DAMAGE_TYPE_CHECK_ID) call UnitMakeAbilityPermanent(tU, true, DamageType_DAMAGE_TYPE_CHECK_ID) set tU = null return false endfunction function DamageType_get takes nothing returns integer local real sourceDamage = GetEventDamage() if DamageType_lastDamageType == DamageType_CODE then return DamageType_CODE elseif sourceDamage > 0. then return DamageType_ATTACK elseif sourceDamage < 0. then return DamageType_SPELL endif return DamageType_NULLED endfunction function DamageType_getUnitBonusSpellResistance takes unit u returns real local integer prevType = DamageType_lastDamageType local real life = GetWidgetLife(u) local real scale = GetUnitState(u, UNIT_STATE_MAX_LIFE) call SetWidgetLife(u, scale) set DamageType_lastDamageType = DamageType_CODE call UnitDamageTarget(u, u, - (scale / 2.), false, false, null, DAMAGE_TYPE_UNIVERSAL, null) set scale = 2. * (scale - GetWidgetLife(u)) / scale call SetWidgetLife(u, life) set DamageType_lastDamageType = prevType return scale endfunction function alloc_DelayDat takes nothing returns integer local integer this if DelayDat_firstFree == 0 then if DelayDat_maxIndex < 8191 then set DelayDat_maxIndex = DelayDat_maxIndex + 1 set this = DelayDat_maxIndex set DelayDat_typeId[this] = 11 else call error("Out of memory: Could not create DelayDat.") set this = 0 endif else set DelayDat_firstFree = DelayDat_firstFree - 1 set this = DelayDat_nextFree[DelayDat_firstFree] set DelayDat_typeId[this] = 11 endif return this endfunction function construct_DelayDat takes integer this returns nothing endfunction function new_DelayDat takes nothing returns integer local integer this = alloc_DelayDat() call construct_DelayDat(this) return this endfunction function DamageType_handler takes nothing returns boolean local real attemptedDamage = - GetEventDamage() local timer time local integer tempDat local unit tU local real sampledLife local real scale if DamageType_get() == DamageType_SPELL then set tU = GetTriggerUnit() if DamageType_USE_BONUS_CALCULATOR then set scale = DamageType_getUnitBonusSpellResistance(tU) if scale > 1. then set attemptedDamage = attemptedDamage * (scale + 1.) / 2. endif endif set sampledLife = GetWidgetLife(tU) - .405 if sampledLife >= attemptedDamage and sampledLife <= 2. * attemptedDamage then call SetWidgetLife(tU, sampledLife - attemptedDamage) set time = CreateTimer() set tempDat = new_DelayDat() set DelayDat_target[tempDat] = tU set DelayDat_source[tempDat] = GetEventDamageSource() set DelayDat_damage[tempDat] = attemptedDamage call timer_setData(time, tempDat) call TimerStart(time, DamageType_DELAY_AMOUNT, false, ref_function_DamageType_after) else call DamageType_dealCodeDamage(GetEventDamageSource(), tU, 2. * attemptedDamage) endif endif set time = null set tU = null return false endfunction function DummyUnitStack_release takes unit u returns nothing if DummyUnitStack_DO_MPU then if DummyUnitStack_stackIndex >= DummyUnitStack_MAX_PRELOADED_UNITS then call RemoveUnit(u) return endif endif call SetUnitFlyHeight(u, 0., 0.) call SetUnitScale(u, 1., 1., 1.) call SetUnitOwner(u, Player(PLAYER_NEUTRAL_PASSIVE), true) call SetUnitX(u, DummyUnitStack_SAFE_LOC_X) call SetUnitY(u, DummyUnitStack_SAFE_LOC_Y) set DummyUnitStack_stackIndex = DummyUnitStack_stackIndex + 1 set DummyUnitStack_dummyStack[DummyUnitStack_stackIndex] = u endfunction function UnitAlloc_onDestroy takes integer this returns nothing endfunction function dealloc_UnitAlloc takes integer obj returns nothing if UnitAlloc_typeId[obj] == 0 then call error("Double free: object of type UnitAlloc") else set UnitAlloc_nextFree[UnitAlloc_firstFree] = obj set UnitAlloc_firstFree = UnitAlloc_firstFree + 1 set UnitAlloc_typeId[obj] = 0 endif endfunction function destroyUnitAlloc takes integer this returns nothing call UnitAlloc_onDestroy(this) call dealloc_UnitAlloc(this) endfunction function dispatch_UnitAlloc_destroyUnitAlloc takes integer this returns nothing if UnitAlloc_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling UnitAlloc.destroyUnitAlloc") else call error("Called UnitAlloc.destroyUnitAlloc on invalid object.") endif endif call destroyUnitAlloc(this) endfunction function DummyUnitStack_afterDelay takes nothing returns nothing local timer tim = GetExpiredTimer() local integer u = timer_getData(tim) call DummyUnitStack_release(UnitAlloc_u[u]) call dispatch_UnitAlloc_destroyUnitAlloc(u) call DestroyTimer(tim) set tim = null endfunction function DummyUnitStack_deferredPreloader takes nothing returns nothing set DummyUnitStack_deferredTodoCount = DummyUnitStack_deferredTodoCount - 1 call DummyUnitStack_add(true) if DummyUnitStack_deferredTodoCount < 1 then call PauseTimer(DummyUnitStack_clock) endif endfunction function GameTimer_closure_impl takes nothing returns nothing set GameTimer_currentTime = GameTimer_currentTime + Basics_ANIMATION_PERIOD endfunction function SoundControl_play takes string str, real pitch, integer vol returns nothing local sound s = CreateSound(str, false, false, false, 12700, 12700, "") call SetSoundVolume(s, vol) call SetSoundPitch(s, pitch) call StartSound(s) call KillSoundWhenDone(s) set s = null endfunction function Game_beastVictorySound takes nothing returns nothing call DestroyTimer(GetExpiredTimer()) call SoundControl_play(Game_BEAST_VICTORY, 1., 127) endfunction function Game_countSeconds takes nothing returns nothing set Statistics_secondsElapsed = Statistics_secondsElapsed + 1 endfunction function Game_gameOver takes nothing returns nothing call EndGame(true) call TimerStart(Game_postRoundTimer, 1., true, ref_function_Game_gameOver2) endfunction function Game_gameOver2 takes nothing returns nothing call EndGame(true) endfunction function Game_hunterVictorySound takes nothing returns nothing call DestroyTimer(GetExpiredTimer()) call SoundControl_play(Game_HUNTER_VICTORY, 1., 127) endfunction function Note_play takes integer this returns nothing call SoundControl_play(Note_path[this], Note_pitch[this], Note_volume[this]) endfunction function dispatch_Note_Muscii_Note_play takes integer this returns nothing if Note_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Note.Muscii_Note_play") else call error("Called Note.Muscii_Note_play on invalid object.") endif endif call Note_play(this) endfunction function Chord_play takes integer this returns nothing local integer iterator = Chord_first[this] loop exitwhen iterator == 0 call dispatch_Note_Muscii_Note_play(iterator) set iterator = Note_next[iterator] endloop endfunction function dispatch_Chord_Muscii_Chord_play takes integer this returns nothing if Chord_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Chord.Muscii_Chord_play") else call error("Called Chord.Muscii_Chord_play on invalid object.") endif endif call Chord_play(this) endfunction function Muscii_playCounted takes integer this, integer count returns integer set Muscii_count[this] = count call TimerStart(Muscii_clock[this], 1. / (Muscii_tempo[this] / 60.), true, ref_function_Muscii_p) return this endfunction function dispatch_Muscii_Muscii_Muscii_playCounted takes integer this, integer count returns integer local integer Muscii_Muscii_playCounted_result if Muscii_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Muscii.Muscii_Muscii_playCounted") else call error("Called Muscii.Muscii_Muscii_playCounted on invalid object.") endif endif set Muscii_Muscii_playCounted_result = Muscii_playCounted(this, count) return Muscii_Muscii_playCounted_result endfunction function Muscii_stop takes integer this returns integer call PauseTimer(Muscii_clock[this]) set Muscii_iterator[this] = Muscii_first[this] return this endfunction function dispatch_Muscii_Muscii_Muscii_stop takes integer this returns integer local integer Muscii_Muscii_stop_result if Muscii_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Muscii.Muscii_Muscii_stop") else call error("Called Muscii.Muscii_Muscii_stop on invalid object.") endif endif set Muscii_Muscii_stop_result = Muscii_stop(this) return Muscii_Muscii_stop_result endfunction function alloc_Closure takes nothing returns integer local integer this if MyCallBackFunc_firstFree == 0 then if MyCallBackFunc_maxIndex < 8191 then set MyCallBackFunc_maxIndex = MyCallBackFunc_maxIndex + 1 set this = MyCallBackFunc_maxIndex set MyCallBackFunc_typeId[this] = 23 else call error("Out of memory: Could not create Closure.") set this = 0 endif else set MyCallBackFunc_firstFree = MyCallBackFunc_firstFree - 1 set this = MyCallBackFunc_nextFree[MyCallBackFunc_firstFree] set MyCallBackFunc_typeId[this] = 23 endif return this endfunction function Muscii_callback takes integer this, integer func returns integer set Muscii_cbf[this] = func return this endfunction function dispatch_Muscii_Muscii_Muscii_callback takes integer this, integer func returns integer local integer Muscii_Muscii_callback_result if Muscii_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Muscii.Muscii_Muscii_callback") else call error("Called Muscii.Muscii_Muscii_callback on invalid object.") endif endif set Muscii_Muscii_callback_result = Muscii_callback(this, func) return Muscii_Muscii_callback_result endfunction function playVoteMusic takes nothing returns nothing local integer clVar local integer temp if not Cinematic_over then set temp = dispatch_Muscii_Muscii_Muscii_playCounted(Music_v, 1) set clVar = alloc_Closure() call dispatch_Muscii_Muscii_Muscii_callback(temp, clVar) else call TimerStart(CreateTimer(), 0., false, ref_function_pauseForGameMusic) endif endfunction function Music_closure_impl takes integer this returns nothing call playVoteMusic() endfunction function alloc_Closure_2 takes nothing returns integer local integer this if MyCallBackFunc_firstFree == 0 then if MyCallBackFunc_maxIndex < 8191 then set MyCallBackFunc_maxIndex = MyCallBackFunc_maxIndex + 1 set this = MyCallBackFunc_maxIndex set MyCallBackFunc_typeId[this] = 24 else call error("Out of memory: Could not create Closure.") set this = 0 endif else set MyCallBackFunc_firstFree = MyCallBackFunc_firstFree - 1 set this = MyCallBackFunc_nextFree[MyCallBackFunc_firstFree] set MyCallBackFunc_typeId[this] = 24 endif return this endfunction function playGameMusic takes nothing returns nothing local integer temp = dispatch_Muscii_Muscii_Muscii_playCounted(Music_m, 8) local integer clVar = alloc_Closure_2() call dispatch_Muscii_Muscii_Muscii_callback(temp, clVar) endfunction function Music_closure_impl_2 takes integer this returns nothing call playGameMusic() endfunction function dispatch_MyCallBackFunc_Muscii_MyCallBackFunc_doCallback takes integer this returns nothing if MyCallBackFunc_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling MyCallBackFunc.Muscii_MyCallBackFunc_doCallback") else call error("Called MyCallBackFunc.Muscii_MyCallBackFunc_doCallback on invalid object.") endif endif if MyCallBackFunc_typeId[this] <= 23 then call Music_closure_impl(this) else call Music_closure_impl_2(this) endif endfunction function Muscii_p takes nothing returns nothing local integer m = timer_getData(GetExpiredTimer()) local integer now = Muscii_iterator[m] local integer next call dispatch_Chord_Muscii_Chord_play(now) if Chord_next[now] != 0 then set Muscii_iterator[m] = Chord_next[now] else set Muscii_iterator[m] = Muscii_first[m] if Muscii_count[m] > -1 then set Muscii_count[m] = Muscii_count[m] - 1 if Muscii_count[m] == -1 then call dispatch_Muscii_Muscii_Muscii_stop(m) set next = Muscii_queued[m] if next != 0 then call dispatch_Muscii_Muscii_Muscii_playCounted(next, Muscii_queueCount[m]) endif set Muscii_queued[m] = 0 if Muscii_cbf[m] != 0 then call dispatch_MyCallBackFunc_Muscii_MyCallBackFunc_doCallback(Muscii_cbf[m]) set Muscii_cbf[m] = 0 endif endif endif endif endfunction function TerrainData_getZ takes real x, real y returns real call MoveLocation(TerrainData_loc, x, y) return GetLocationZ(TerrainData_loc) endfunction function ProjectileDat_onDestroy takes integer this returns nothing endfunction function dealloc_ProjectileDat takes integer obj returns nothing if ProjectileDat_typeId[obj] == 0 then call error("Double free: object of type ProjectileDat") else set ProjectileDat_nextFree[ProjectileDat_firstFree] = obj set ProjectileDat_firstFree = ProjectileDat_firstFree + 1 set ProjectileDat_typeId[obj] = 0 endif endfunction function destroyProjectileDat takes integer this returns nothing call ProjectileDat_onDestroy(this) call dealloc_ProjectileDat(this) endfunction function dispatch_ProjectileDat_destroyProjectileDat takes integer this returns nothing if ProjectileDat_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling ProjectileDat.destroyProjectileDat") else call error("Called ProjectileDat.destroyProjectileDat on invalid object.") endif endif call destroyProjectileDat(this) endfunction function ProjectileStack_bulletTick takes nothing returns nothing local integer index = 0 local boolean killBullet = false local integer tempDat local real x local real y local real cz local real nz local unit iter loop exitwhen index > ProjectileStack_dbIndex set tempDat = ProjectileStack_projectileDB[index] set x = GetUnitX(ProjectileDat_projectile[tempDat]) + ProjectileDat_dx[tempDat] set y = GetUnitY(ProjectileDat_projectile[tempDat]) + ProjectileDat_dy[tempDat] set nz = TerrainData_getZ(x, y) set cz = TerrainData_getZ(GetUnitX(ProjectileDat_projectile[tempDat]), GetUnitY(ProjectileDat_projectile[tempDat])) set nz = nz - cz call SetUnitFlyHeight(ProjectileDat_projectile[tempDat], GetUnitFlyHeight(ProjectileDat_projectile[tempDat]) - nz, 0.) call SetUnitX(ProjectileDat_projectile[tempDat], x) call SetUnitY(ProjectileDat_projectile[tempDat], y) set ProjectileDat_rangeLeft[tempDat] = ProjectileDat_rangeLeft[tempDat] - ProjectileDat_speed[tempDat] if ProjectileDat_rangeLeft[tempDat] <= 0. then set killBullet = true endif call GroupEnumUnitsInRange(ProjectileStack_g, x, y, ProjectileStack_BULLET_ENUM_RADIUS, null) loop set iter = FirstOfGroup(ProjectileStack_g) exitwhen iter == null if IsUnitEnemy(ProjectileDat_projectile[tempDat], GetOwningPlayer(iter)) and UnitAlive(iter) then call DamageType_dealCodeDamage(ProjectileDat_damageSource[tempDat], iter, ProjectileDat_damage[tempDat]) set killBullet = true endif call GroupRemoveUnit(ProjectileStack_g, iter) endloop if GetUnitX(ProjectileDat_projectile[tempDat]) > TerrainData_MAX_X or GetUnitX(ProjectileDat_projectile[tempDat]) < TerrainData_MIN_X or GetUnitY(ProjectileDat_projectile[tempDat]) > TerrainData_MAX_Y or GetUnitY(ProjectileDat_projectile[tempDat]) < TerrainData_MIN_Y then set killBullet = true endif if GetUnitFlyHeight(ProjectileDat_projectile[tempDat]) < 1. then call DestroyEffect(AddSpecialEffect(ProjectileStack_DUST_FX, x, y)) set killBullet = true endif if killBullet then call KillUnit(ProjectileDat_projectile[tempDat]) call dispatch_ProjectileDat_destroyProjectileDat(tempDat) set ProjectileStack_projectileDB[index] = ProjectileStack_projectileDB[ProjectileStack_dbIndex] set ProjectileStack_dbIndex = ProjectileStack_dbIndex - 1 if ProjectileStack_dbIndex == -1 then call PauseTimer(ProjectileStack_time) endif set killBullet = false set index = index - 1 endif set index = index + 1 endloop set iter = null endfunction function Slop_onDestroy takes integer this returns nothing endfunction function dealloc_Slop takes integer obj returns nothing if Slop_typeId[obj] == 0 then call error("Double free: object of type Slop") else set Slop_nextFree[Slop_firstFree] = obj set Slop_firstFree = Slop_firstFree + 1 set Slop_typeId[obj] = 0 endif endfunction function destroySlop takes integer this returns nothing call Slop_onDestroy(this) call dealloc_Slop(this) endfunction function dispatch_Slop_destroySlop takes integer this returns nothing if Slop_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Slop.destroySlop") else call error("Called Slop.destroySlop on invalid object.") endif endif call destroySlop(this) endfunction function SoundControl_preloadAfter takes nothing returns nothing local timer time = GetExpiredTimer() local integer s = timer_getData(time) local sound sd = CreateSound(Slop_snd[s], false, false, false, 12700, 12700, "") call SetSoundVolume(sd, 1) call StartSound(sd) call KillSoundWhenDone(sd) call dispatch_Slop_destroySlop(s) call DestroyTimer(time) set time = null set sd = null endfunction function Bucket_members_set takes integer instanceId, integer arrayIndex, unit value returns nothing if arrayIndex < 0 or arrayIndex >= 5 then call error("Index out of Bounds") elseif arrayIndex <= 2 then if arrayIndex <= 1 then if arrayIndex <= 0 then set Bucket_members_0[instanceId] = value else set Bucket_members_1[instanceId] = value endif else set Bucket_members_2[instanceId] = value endif elseif arrayIndex <= 3 then set Bucket_members_3[instanceId] = value else set Bucket_members_4[instanceId] = value endif endfunction function alloc_Bucket takes nothing returns integer local integer this if Bucket_firstFree == 0 then if Bucket_maxIndex < 8191 then set Bucket_maxIndex = Bucket_maxIndex + 1 set this = Bucket_maxIndex set Bucket_typeId[this] = 43 else call error("Out of memory: Could not create Bucket.") set this = 0 endif else set Bucket_firstFree = Bucket_firstFree - 1 set this = Bucket_nextFree[Bucket_firstFree] set Bucket_typeId[this] = 43 endif return this endfunction function construct_Bucket takes integer this returns nothing set Bucket_bucketIndex[this] = 0 set Bucket_trig[this] = CreateTrigger() endfunction function new_Bucket takes nothing returns integer local integer this = alloc_Bucket() call construct_Bucket(this) return this endfunction function StructuredDD_getBucket takes nothing returns integer local integer index = 0 local integer tempDat if StructuredDD_dbIndex != -1 and Bucket_bucketIndex[StructuredDD_bucketDB[StructuredDD_dbIndex]] < StructuredDD_BUCKET_SIZE then return StructuredDD_dbIndex else set StructuredDD_maxDBIndex = StructuredDD_maxDBIndex + 1 set StructuredDD_dbIndex = StructuredDD_maxDBIndex set tempDat = new_Bucket() set StructuredDD_bucketDB[StructuredDD_maxDBIndex] = tempDat loop exitwhen index > StructuredDD_conditionsIndex call TriggerAddCondition(Bucket_trig[tempDat], StructuredDD_conditions[index]) set index = index + 1 endloop return StructuredDD_dbIndex endif endfunction function StructuredDD_add takes unit member returns nothing local integer whichBucket = StructuredDD_getBucket() local integer tempDat = StructuredDD_bucketDB[whichBucket] call Bucket_members_set(tempDat, Bucket_bucketIndex[tempDat], member) set Bucket_bucketIndex[tempDat] = Bucket_bucketIndex[tempDat] + 1 call TriggerRegisterUnitEvent(Bucket_trig[tempDat], member, EVENT_UNIT_DAMAGED) endfunction function StructuredDD_autoAddC takes nothing returns boolean call StructuredDD_add(GetTriggerUnit()) return false endfunction function Bucket_members_get takes integer index1, integer index2 returns unit local unit returnVal if index2 < 0 or index2 >= 5 then call error("Index out of Bounds") elseif index2 <= 2 then if index2 <= 1 then if index2 <= 0 then set returnVal = Bucket_members_0[index1] else set returnVal = Bucket_members_1[index1] endif else set returnVal = Bucket_members_2[index1] endif elseif index2 <= 3 then set returnVal = Bucket_members_3[index1] else set returnVal = Bucket_members_4[index1] endif set Bucket_members_gettempReturn = returnVal set returnVal = null return Bucket_members_gettempReturn endfunction function StructuredDD_bucketIsEmpty takes integer which returns boolean local integer tempDat = StructuredDD_bucketDB[which] local integer index = 0 loop exitwhen index == StructuredDD_BUCKET_SIZE if GetUnitTypeId(Bucket_members_get(tempDat, index)) != 0 then return false endif set index = index + 1 endloop return true endfunction function Bucket_onDestroy takes integer this returns nothing endfunction function dealloc_Bucket takes integer obj returns nothing if Bucket_typeId[obj] == 0 then call error("Double free: object of type Bucket") else set Bucket_nextFree[Bucket_firstFree] = obj set Bucket_firstFree = Bucket_firstFree + 1 set Bucket_typeId[obj] = 0 endif endfunction function destroyBucket takes integer this returns nothing call Bucket_onDestroy(this) call dealloc_Bucket(this) endfunction function dispatch_Bucket_destroyBucket takes integer this returns nothing if Bucket_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Bucket.destroyBucket") else call error("Called Bucket.destroyBucket on invalid object.") endif endif call destroyBucket(this) endfunction function StructuredDD_perCleanup takes nothing returns nothing local integer index = 0 loop exitwhen index > StructuredDD_maxDBIndex if index != StructuredDD_dbIndex and StructuredDD_bucketIsEmpty(index) then call DestroyTrigger(Bucket_trig[StructuredDD_bucketDB[index]]) call dispatch_Bucket_destroyBucket(StructuredDD_bucketDB[index]) set StructuredDD_bucketDB[index] = StructuredDD_bucketDB[StructuredDD_maxDBIndex] set StructuredDD_maxDBIndex = StructuredDD_maxDBIndex - 1 if StructuredDD_maxDBIndex == StructuredDD_dbIndex then set StructuredDD_dbIndex = index endif set index = index - 1 endif set index = index + 1 endloop endfunction function BeastLightningDat_onDestroy takes integer this returns nothing endfunction function dealloc_BeastLightningDat takes integer obj returns nothing if BeastLightningDat_typeId[obj] == 0 then call error("Double free: object of type BeastLightningDat") else set BeastLightningDat_nextFree[BeastLightningDat_firstFree] = obj set BeastLightningDat_firstFree = BeastLightningDat_firstFree + 1 set BeastLightningDat_typeId[obj] = 0 endif endfunction function destroyBeastLightningDat takes integer this returns nothing call BeastLightningDat_onDestroy(this) call dealloc_BeastLightningDat(this) endfunction function dispatch_BeastLightningDat_destroyBeastLightningDat takes integer this returns nothing if BeastLightningDat_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling BeastLightningDat.destroyBeastLightningDat") else call error("Called BeastLightningDat.destroyBeastLightningDat on invalid object.") endif endif call destroyBeastLightningDat(this) endfunction function LightningBallDat_onDestroy takes integer this returns nothing endfunction function dealloc_LightningBallDat takes integer obj returns nothing if LightningBallDat_typeId[obj] == 0 then call error("Double free: object of type LightningBallDat") else set LightningBallDat_nextFree[LightningBallDat_firstFree] = obj set LightningBallDat_firstFree = LightningBallDat_firstFree + 1 set LightningBallDat_typeId[obj] = 0 endif endfunction function destroyLightningBallDat takes integer this returns nothing call LightningBallDat_onDestroy(this) call dealloc_LightningBallDat(this) endfunction function dispatch_LightningBallDat_destroyLightningBallDat takes integer this returns nothing if LightningBallDat_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling LightningBallDat.destroyLightningBallDat") else call error("Called LightningBallDat.destroyLightningBallDat on invalid object.") endif endif call destroyLightningBallDat(this) endfunction function Units_beastLightningTick takes nothing returns nothing local integer ua = Units_beastHead local integer uaSwap local integer lbd local integer swap local integer index local real facing loop exitwhen ua == 0 set BeastLightningDat_ticksUntilNextCheck[ua] = BeastLightningDat_ticksUntilNextCheck[ua] - 1 set facing = GetUnitFacing(BeastLightningDat_u[ua]) * bj_DEGTORAD set BeastLightningDat_phase[ua] = BeastLightningDat_phase[ua] + Units_PHASE_ANGULAR_VELOCITY if BeastLightningDat_ticksUntilNextCheck[ua] <= 0 then if BeastLightningDat_balls[ua] < Units_MAX_BALLS and BeastLightningDat_typ[ua] == Units_BEAST_ID then call Units_pushBall(BeastLightningDat_u[ua]) elseif BeastLightningDat_balls[ua] < Units_MAX_BALLS_LESSER and BeastLightningDat_typ[ua] == Units_LESSER_BEAST_ID then call Units_pushBall(BeastLightningDat_u[ua]) endif set BeastLightningDat_ticksUntilNextCheck[ua] = R2I(Units_LIGHTNING_CHECK_PERIOD / Units_CLOCK_PERIOD) endif set index = 0 set lbd = BeastLightningDat_ballHead[ua] loop exitwhen index >= BeastLightningDat_balls[ua] call SetUnitX(LightningBallDat_u[lbd], GetUnitX(BeastLightningDat_u[ua]) + Units_BALL_OFF * Cos(facing + BeastLightningDat_phase[ua] + index * 2. * bj_PI / BeastLightningDat_balls[ua])) call SetUnitY(LightningBallDat_u[lbd], GetUnitY(BeastLightningDat_u[ua]) + Units_BALL_OFF * Sin(facing + BeastLightningDat_phase[ua] + index * 2. * bj_PI / BeastLightningDat_balls[ua])) set lbd = LightningBallDat_next[lbd] set index = index + 1 endloop if not (UnitAlive(BeastLightningDat_u[ua]) and GetUnitTypeId(BeastLightningDat_u[ua]) > 0) then set lbd = BeastLightningDat_ballHead[ua] loop exitwhen lbd == 0 set swap = LightningBallDat_next[lbd] call DestroyEffect(LightningBallDat_fx[lbd]) call DummyUnitStack_release(LightningBallDat_u[lbd]) call dispatch_LightningBallDat_destroyLightningBallDat(lbd) set lbd = swap endloop if BeastLightningDat_prev[ua] != 0 then set uaSwap = BeastLightningDat_prev[ua] set BeastLightningDat_next[uaSwap] = BeastLightningDat_next[ua] else set Units_beastHead = BeastLightningDat_next[ua] if BeastLightningDat_next[ua] == 0 then call PauseTimer(Units_clock) endif endif if BeastLightningDat_next[ua] != 0 then set uaSwap = BeastLightningDat_next[ua] set BeastLightningDat_prev[uaSwap] = BeastLightningDat_prev[ua] endif call dispatch_BeastLightningDat_destroyBeastLightningDat(ua) endif set ua = BeastLightningDat_next[ua] endloop endfunction function Units_filterItems takes nothing returns nothing local item f = GetEnumItem() if GetItemTypeId(f) != Units_ARTIFACT_ID then call RemoveItem(f) endif set f = null endfunction function SoundControl_playForPlayer takes string str, real pitch, player who returns nothing local sound s = CreateSound(str, false, false, false, 12700, 12700, "") if GetLocalPlayer() == who then call SetSoundVolume(s, 127) else call SetSoundVolume(s, 0) endif call SetSoundPitch(s, pitch) call StartSound(s) call KillSoundWhenDone(s) set s = null endfunction function Game_defeatTeam takes integer team returns nothing if team == Game_TEAM_BEASTS then call RemovePlayer(Players_fromId[0], PLAYER_GAME_RESULT_VICTORY) call RemovePlayer(Players_fromId[1], PLAYER_GAME_RESULT_VICTORY) call RemovePlayer(Players_fromId[2], PLAYER_GAME_RESULT_VICTORY) call RemovePlayer(Players_fromId[3], PLAYER_GAME_RESULT_DEFEAT) call RemovePlayer(Players_fromId[4], PLAYER_GAME_RESULT_DEFEAT) call RemovePlayer(Players_fromId[5], PLAYER_GAME_RESULT_DEFEAT) call SoundControl_playForPlayer(Game_WIN_SOUND, 1., Players_fromId[0]) call SoundControl_playForPlayer(Game_WIN_SOUND, 1., Players_fromId[1]) call SoundControl_playForPlayer(Game_WIN_SOUND, 1., Players_fromId[2]) call SoundControl_playForPlayer(Game_DEF_SOUND, 1., Players_fromId[3]) call SoundControl_playForPlayer(Game_DEF_SOUND, 1., Players_fromId[4]) call SoundControl_playForPlayer(Game_DEF_SOUND, 1., Players_fromId[5]) else call RemovePlayer(Players_fromId[0], PLAYER_GAME_RESULT_DEFEAT) call RemovePlayer(Players_fromId[1], PLAYER_GAME_RESULT_DEFEAT) call RemovePlayer(Players_fromId[2], PLAYER_GAME_RESULT_DEFEAT) call RemovePlayer(Players_fromId[3], PLAYER_GAME_RESULT_VICTORY) call RemovePlayer(Players_fromId[4], PLAYER_GAME_RESULT_VICTORY) call RemovePlayer(Players_fromId[5], PLAYER_GAME_RESULT_VICTORY) call SoundControl_playForPlayer(Game_DEF_SOUND, 1., Players_fromId[0]) call SoundControl_playForPlayer(Game_DEF_SOUND, 1., Players_fromId[1]) call SoundControl_playForPlayer(Game_DEF_SOUND, 1., Players_fromId[2]) call SoundControl_playForPlayer(Game_WIN_SOUND, 1., Players_fromId[3]) call SoundControl_playForPlayer(Game_WIN_SOUND, 1., Players_fromId[4]) call SoundControl_playForPlayer(Game_WIN_SOUND, 1., Players_fromId[5]) endif endfunction function Units_endRoundVfx takes nothing returns nothing local unit iter call GroupEnumUnitsInRect(Units_grp, bj_mapInitialPlayableArea, null) loop set iter = FirstOfGroup(Units_grp) exitwhen iter == null if GetPlayerId(GetOwningPlayer(iter)) <= Players_LAST_BEAST then call PauseUnit(iter, true) call SetUnitInvulnerable(iter, true) endif call GroupRemoveUnit(Units_grp, iter) endloop set iter = null endfunction function Game_beastWin takes nothing returns nothing set Statistics_beastWins = Statistics_beastWins + 1 set Game_roundEnabled = false call Units_endRoundVfx() call TimerStart(CreateTimer(), Game_VICTORY_SOUND_DELAY, false, ref_function_Game_beastVictorySound) if Statistics_beastWins >= Game_roundsToWin then call Game_defeatTeam(Game_TEAM_HUNTERS) call DisplayTextToPlayer(Players_locl, 0., 0., "The |cff411d0aBeasts|r have won the round and the |cffffcc00best of " + I2S(Game_roundsToWin * 2 - 1) + "|r!") call DisplayTextToPlayer(Players_locl, 0., 0., "|cff999999The game will end momentarily.|r") call CameraControl_fadeOutHunter(Game_POST_GAME_DELAY) call CameraControl_fadeOutBeast(Game_POST_GAME_DELAY) call TimerStart(Game_postRoundTimer, Game_POST_GAME_DELAY, false, ref_function_Game_gameOver) else call DisplayTextToPlayer(Players_locl, 0., 0., "The |cff411d0aBeasts|r won the round. Round |cffffcc00" + I2S(Statistics_hunterWins + Statistics_beastWins + 1) + "|r will begin soon!") call TimerStart(Game_postRoundTimer, Game_POST_ROUND_DELAY, false, ref_function_Game_roundStart) endif endfunction function Game_hunterWin takes nothing returns nothing set Statistics_hunterWins = Statistics_hunterWins + 1 set Game_roundEnabled = false call Units_endRoundVfx() call TimerStart(CreateTimer(), Game_VICTORY_SOUND_DELAY, false, ref_function_Game_hunterVictorySound) if Statistics_hunterWins >= Game_roundsToWin then call Game_defeatTeam(Game_TEAM_BEASTS) call DisplayTextToPlayer(Players_locl, 0., 0., "The |cff999999Hunters|r have won the round and the |cffffcc00best of " + I2S(Game_roundsToWin * 2 - 1) + "|r!") call DisplayTextToPlayer(Players_locl, 0., 0., "|cff999999The game will end momentarily.|r") call CameraControl_fadeOutHunter(Game_POST_GAME_DELAY) call CameraControl_fadeOutBeast(Game_POST_GAME_DELAY) call TimerStart(Game_postRoundTimer, Game_POST_GAME_DELAY, false, ref_function_Game_gameOver) else call DisplayTextToPlayer(Players_locl, 0., 0., "The |cff999999Hunters|r won the round. Round |cffffcc00" + I2S(Statistics_hunterWins + Statistics_beastWins + 1) + "|r will begin soon!") call TimerStart(Game_postRoundTimer, Game_POST_ROUND_DELAY, false, ref_function_Game_roundStart) endif endfunction function TextTag_bounty takes real x, real y, integer val, player whom returns nothing local texttag t = CreateTextTag() call SetTextTagColor(t, 255, R2I(255 * 12 * 1. / 15), 0, 255) call SetTextTagLifespan(t, 2.) call SetTextTagFadepoint(t, 1.) call SetTextTagPermanent(t, false) call SetTextTagPos(t, x, y, 25.) call SetTextTagText(t, "+" + I2S(val), 12. * .0023) call SetTextTagVelocity(t, 100. * Cos(Maths_PI / 2.) * .071 / 128., 100. * Sin(Maths_PI / 2.) * .071 / 128.) call SetTextTagVisibility(t, false) if Players_locl == whom then call SetTextTagVisibility(t, true) endif set t = null endfunction function noMoreUnits takes integer id returns boolean return not (UnitAlive(Units_hero[id]) or UnitAlive(Units_subHero[id])) endfunction function a takes nothing returns nothing local unit u = GetTriggerUnit() local player p = GetOwningPlayer(u) local integer id = GetPlayerId(p) local unit k local player o local integer t local integer bounty if ( not Cinematic_enabled) and u == Units_hero[id] or u == Units_subHero[id] and Game_roundEnabled then if id >= Players_FIRST_BEAST then set Statistics_hunterKills = Statistics_hunterKills + 1 set Statistics_beastsAlive = Statistics_beastsAlive - 1 set k = GetKillingUnit() set o = unit_getOwner(k) set t = GetUnitTypeId(u) set bounty = 0 if t == Units_BEAST_ID then set bounty = bounty + HeroDeath_GOLD_BONUS if UnitHasItemOfTypeBJ(k, HeroDeath_CONTRACT_ID) then set bounty = bounty + HeroDeath_MAJOR_CONTRACT_BONUS endif elseif t == Units_LESSER_BEAST_ID then set bounty = bounty + HeroDeath_GOLD_BONUS_LESSER if UnitHasItemOfTypeBJ(k, HeroDeath_CONTRACT_ID) then set bounty = bounty + HeroDeath_MINOR_CONTRACT_BONUS endif endif call SetPlayerState(o, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(o, PLAYER_STATE_RESOURCE_GOLD) + bounty) call TextTag_bounty(unit_getX(u), unit_getY(u), bounty, o) if Statistics_beastsAlive < 1 then call PanCameraToTimed(GetUnitX(u), GetUnitY(u), 0.) call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, 1024., 0.) call Game_hunterWin() elseif noMoreUnits(id) then call DisplayTextToPlayer(p, 0., 0., "|cffffcc00[Game]|r You have been slain! You will revive in the next round.") endif else set Statistics_beastKills = Statistics_beastKills + 1 set Statistics_huntersAlive = Statistics_huntersAlive - 1 if Statistics_huntersAlive < 1 then call PanCameraToTimed(GetUnitX(u), GetUnitY(u), 0.) call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, 1024., 0.) call Game_beastWin() else call DisplayTextToPlayer(p, 0., 0., "|cffffcc00[Game]|r You have been slain! You will revive in the next round.") endif endif endif set u = null set p = null set k = null set o = null endfunction function Units_dischargeBall takes unit u returns nothing local integer ua = dispatch_Table_Table_Table_loadInt(Units_fromBeast, handle_getHandleId(u)) local integer lbd = BeastLightningDat_ballHead[ua] local integer swap call DestroyEffect(LightningBallDat_fx[lbd]) call DummyUnitStack_release(LightningBallDat_u[lbd]) set swap = LightningBallDat_next[lbd] call dispatch_LightningBallDat_destroyLightningBallDat(lbd) set BeastLightningDat_ballHead[ua] = swap set BeastLightningDat_balls[ua] = BeastLightningDat_balls[ua] - 1 if BeastLightningDat_balls[ua] == 2 and BeastLightningDat_typ[ua] == Units_BEAST_ID then call UnitRemoveAbility(BeastLightningDat_u[ua], Units_HEMISECT_ID) call UnitAddAbility(BeastLightningDat_u[ua], Units_HEMISECT_PASSIVE_ID) elseif BeastLightningDat_balls[ua] == 2 and BeastLightningDat_typ[ua] == Units_LESSER_BEAST_ID then call UnitRemoveAbility(BeastLightningDat_u[ua], Units_CONCAT_ID) call UnitAddAbility(BeastLightningDat_u[ua], Units_CONCAT_PASSIVE_ID) endif if swap == 0 then call UnitRemoveAbility(BeastLightningDat_u[ua], Units_BLINK_ID) call UnitAddAbility(BeastLightningDat_u[ua], Units_BLINK_PASSIVE_ID) endif endfunction function act takes nothing returns nothing if GetSpellAbilityId() == Blink_BLINK_ID then call Units_dischargeBall(GetTriggerUnit()) endif endfunction function alloc_NetData takes nothing returns integer local integer this if NetData_firstFree == 0 then if NetData_maxIndex < 8191 then set NetData_maxIndex = NetData_maxIndex + 1 set this = NetData_maxIndex else call error("Out of memory: Could not create NetData.") set this = 0 endif else set NetData_firstFree = NetData_firstFree - 1 set this = NetData_nextFree[NetData_firstFree] endif return this endfunction function construct_NetData takes integer this returns nothing endfunction function new_NetData takes nothing returns integer local integer this = alloc_NetData() call construct_NetData(this) return this endfunction function unit_setOwner takes unit this, player p, boolean changeColor returns nothing call SetUnitOwner(this, p, changeColor) endfunction function act_2 takes nothing returns nothing local integer nd local unit tU local real uX local real uY local real ang local unit receiver local unit receiver_2 local unit receiver_3 if GetSpellAbilityId() == Net_NET_ID then set tU = GetTriggerUnit() set uX = GetUnitX(tU) set uY = GetUnitY(tU) set ang = Atan2(GetSpellTargetY() - uY, GetSpellTargetX() - uX) set nd = new_NetData() set NetData_delX[nd] = Net_NET_VELOCITY * Cos(ang) * Net_CLOCK_PERIOD set NetData_delY[nd] = Net_NET_VELOCITY * Sin(ang) * Net_CLOCK_PERIOD set NetData_caster[nd] = GetOwningPlayer(tU) set NetData_distance[nd] = Net_MAX_DISTANCE set NetData_dummy[nd] = DummyUnitStack_get() set NetData_attached[nd] = AddSpecialEffectTarget(Net_NET_MODEL, NetData_dummy[nd], "origin") set receiver = NetData_dummy[nd] call unit_setX(receiver, uX) set receiver_2 = receiver call unit_setY(receiver_2, uY) set receiver_3 = receiver_2 call unit_setOwner(receiver_3, NetData_caster[nd], true) set Net_dbIndex = Net_dbIndex + 1 set Net_dataDb[Net_dbIndex] = nd if Net_dbIndex == 0 then call TimerStart(Net_clock, Net_CLOCK_PERIOD, true, ref_function_periodic_2) endif endif set tU = null set receiver = null set receiver_2 = null set receiver_3 = null endfunction function Math_maxReal takes real a_2, real b returns real return RMaxBJ(a_2, b) endfunction function Math_minReal takes real a_2, real b returns real return RMinBJ(a_2, b) endfunction function Math_radiansNormalizeHalfModulo takes real n returns real return ModuloReal(n, 2. * bj_PI - Math_DELTA) endfunction function Math_radiansNormalizeHalf takes real n returns real set n = Math_radiansNormalizeHalfModulo(n) if n > bj_PI then return n - 2. * bj_PI endif return n endfunction function kernelApply takes integer index, real facing returns real local real min = bj_PI local real max = - (1. * bj_PI) local integer i = 0 set facing = Math_radiansNormalizeHalf(facing) set HunterCamera_kernel[index * HunterCamera_KERNEL_SIZE + HunterCamera_kernelIndex[index]] = facing loop exitwhen i >= HunterCamera_KERNEL_SIZE if i != index then set min = Math_minReal(min, Math_radiansNormalizeHalf(facing - HunterCamera_kernel[index * HunterCamera_KERNEL_SIZE + i])) set max = Math_maxReal(max, Math_radiansNormalizeHalf(facing - HunterCamera_kernel[index * HunterCamera_KERNEL_SIZE + i])) endif set i = i + 1 endloop set HunterCamera_kernelIndex[index] = HunterCamera_kernelIndex[index] + 1 set HunterCamera_kernelIndex[index] = ModuloInteger(HunterCamera_kernelIndex[index], HunterCamera_KERNEL_SIZE) return Math_radiansNormalizeHalfModulo(max - min) endfunction function act_3 takes nothing returns nothing local integer index = 0 local real offset = HunterCamera_OFFSET_STATIC local real facing local real minimax if Game_roundEnabled then loop exitwhen index >= Players_FIRST_BEAST if UnitAlive(Units_hero[index]) then set facing = GetUnitFacing(Units_hero[index]) * bj_DEGTORAD set minimax = kernelApply(index, facing) if minimax > HunterCamera_JITTER_THRESHOLD then set offset = HunterCamera_OFFSET_JITTER elseif GetUnitCurrentOrder(Units_hero[index]) == OrderId("smart") then set offset = HunterCamera_OFFSET_DYNAMIC endif if Players_locl == Players_fromId[index] then call PanCameraToTimed(GetUnitX(Units_hero[index]) + offset * Cos(facing), GetUnitY(Units_hero[index]) + offset * Sin(facing), HunterCamera_CLOCK_PERIOD * 2.) endif endif set index = index + 1 endloop endif endfunction function SoundControl_play3D takes string str, real pitch, real x, real y, real z returns nothing local sound s = CreateSound(str, false, true, true, 12700, 12700, "") call SetSoundPosition(s, x, y, z) call SetSoundVolume(s, 127) call SetSoundPitch(s, pitch) call StartSound(s) call KillSoundWhenDone(s) set s = null endfunction function act_4 takes nothing returns nothing local unit tU if GetSpellAbilityId() == HunterToggle_TOGGLE_ID then set tU = GetTriggerUnit() call SoundControl_play3D(HunterToggle_TOGGLE_SOUND, 2., GetUnitX(tU), GetUnitY(tU), 0.) if GetUnitAbilityLevel(tU, HunterToggle_BURST_ID) > 0 then call UnitRemoveAbility(tU, HunterToggle_BURST_ID) call UnitAddAbility(tU, HunterToggle_AUTO_ID) else call UnitRemoveAbility(tU, HunterToggle_AUTO_ID) call UnitAddAbility(tU, HunterToggle_BURST_ID) endif endif set tU = null endfunction function act_5 takes nothing returns nothing local unit tU if GetSpellAbilityId() == Thunder_THUNDER_ID then set tU = GetTriggerUnit() call dispatch_Table_Table_Table_saveInt(Units_thunderClock, handle_getHandleId(tU), Statistics_secondsElapsed) endif set tU = null endfunction function ProjectileStack_getProjectileSpeed takes unit u returns real local integer uType = GetUnitTypeId(u) if uType == Units_HUNTER_PROJECTILE_ID then return ProjectileStack_PROJECTILE_VELOCITY endif call DisplayTextToPlayer(Players_locl, 0., 0., ProjectileStack_ERROR_NO_SPEED) return ProjectileStack_DEFAULT_VELOCITY endfunction function ProjectileStack_getUnitDamage takes unit u returns real local integer uType = GetUnitTypeId(u) if uType == Units_HUNTER_ID then return ProjectileStack_PROJECTILE_DAMAGE endif call DisplayTextToPlayer(Players_locl, 0., 0., ProjectileStack_ERROR_NO_DAMAGE) return ProjectileStack_DEFAULT_DAMAGE endfunction function ProjectileStack_getUnitProjectile takes unit u, real sX, real sY, real tX, real tY returns unit local integer uType = GetUnitTypeId(u) local real facing = TerrainData_radiansBetweenXY(sX, tX, sY, tY) local real x = sX + ProjectileStack_PROJECTILE_OFFSET * Cos(facing) local real y = sY + ProjectileStack_PROJECTILE_OFFSET * Sin(facing) local unit returnedUnit if uType == Units_HUNTER_ID then set returnedUnit = CreateUnit(GetOwningPlayer(u), Units_HUNTER_PROJECTILE_ID, 0., 0., facing * bj_RADTODEG) call SetUnitX(returnedUnit, x) call SetUnitY(returnedUnit, y) set ProjectileStack_getUnitProjectiletempReturn = returnedUnit set returnedUnit = null return ProjectileStack_getUnitProjectiletempReturn endif call DisplayTextToPlayer(Players_locl, 0., 0., ProjectileStack_ERROR_NO_PROJECTILE) set returnedUnit = CreateUnit(GetOwningPlayer(u), Units_HUNTER_PROJECTILE_ID, 0., 0., GetUnitFacing(u)) call SetUnitX(returnedUnit, x) call SetUnitY(returnedUnit, y) set ProjectileStack_getUnitProjectiletempReturn_2 = returnedUnit set returnedUnit = null return ProjectileStack_getUnitProjectiletempReturn_2 endfunction function alloc_ProjectileDat takes nothing returns integer local integer this if ProjectileDat_firstFree == 0 then if ProjectileDat_maxIndex < 8191 then set ProjectileDat_maxIndex = ProjectileDat_maxIndex + 1 set this = ProjectileDat_maxIndex set ProjectileDat_typeId[this] = 36 else call error("Out of memory: Could not create ProjectileDat.") set this = 0 endif else set ProjectileDat_firstFree = ProjectileDat_firstFree - 1 set this = ProjectileDat_nextFree[ProjectileDat_firstFree] set ProjectileDat_typeId[this] = 36 endif return this endfunction function construct_ProjectileDat takes integer this returns nothing endfunction function new_ProjectileDat takes nothing returns integer local integer this = alloc_ProjectileDat() call construct_ProjectileDat(this) return this endfunction function ProjectileStack_add takes unit u, real sX, real sY, real tX, real tY, real offset returns nothing local integer tempDat = new_ProjectileDat() local real rad set ProjectileDat_projectile[tempDat] = ProjectileStack_getUnitProjectile(u, sX, sY, tX, tY) set ProjectileDat_damageSource[tempDat] = u set ProjectileDat_speed[tempDat] = ProjectileStack_getProjectileSpeed(ProjectileDat_projectile[tempDat]) set rad = TerrainData_radiansBetweenXY(sX, tX, sY, tY) + offset set ProjectileDat_dx[tempDat] = ProjectileDat_speed[tempDat] * Cos(rad) set ProjectileDat_dy[tempDat] = ProjectileDat_speed[tempDat] * Sin(rad) set ProjectileDat_damage[tempDat] = ProjectileStack_getUnitDamage(u) set ProjectileDat_rangeLeft[tempDat] = ProjectileStack_RANGE call SetUnitFlyHeight(ProjectileDat_projectile[tempDat], ProjectileStack_FLY_HEIGHT, 0.) set ProjectileStack_dbIndex = ProjectileStack_dbIndex + 1 set ProjectileStack_projectileDB[ProjectileStack_dbIndex] = tempDat if ProjectileStack_dbIndex == 0 then call TimerStart(ProjectileStack_time, ProjectileStack_CLOCK_PERIOD, true, ref_function_ProjectileStack_bulletTick) endif endfunction function alloc_Closure_3 takes nothing returns integer local integer this if CallbackSingle_firstFree == 0 then if CallbackSingle_maxIndex < 8191 then set CallbackSingle_maxIndex = CallbackSingle_maxIndex + 1 set this = CallbackSingle_maxIndex set CallbackSingle_typeId[this] = 7 else call error("Out of memory: Could not create Closure.") set this = 0 endif else set CallbackSingle_firstFree = CallbackSingle_firstFree - 1 set this = CallbackSingle_nextFree[CallbackSingle_firstFree] set CallbackSingle_typeId[this] = 7 endif return this endfunction function construct_CallbackSingle takes integer this returns nothing endfunction function getTimer takes nothing returns timer local timer receiver if TimerUtils_freeTimersCount > 0 then set TimerUtils_freeTimersCount = TimerUtils_freeTimersCount - 1 call timer_setData(TimerUtils_freeTimers[TimerUtils_freeTimersCount], 0) set receiver = null return TimerUtils_freeTimers[TimerUtils_freeTimersCount] else set receiver = CreateTimer() call timer_setData(receiver, 0) set getTimertempReturn = receiver set receiver = null return getTimertempReturn endif endfunction function timer_start takes timer this, real time, code timerCallBack returns nothing call TimerStart(this, time, false, timerCallBack) endfunction function CallbackSingle_start takes integer this, real time returns nothing local timer receiver = getTimer() local timer receiver_2 call timer_setData(receiver, this) set receiver_2 = receiver call timer_start(receiver_2, time, ref_function_CallbackSingle_staticCallback) set receiver = null set receiver_2 = null endfunction function dispatch_CallbackSingle_ClosureTimers_CallbackSingle_start takes integer this, real time returns nothing if CallbackSingle_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling CallbackSingle.ClosureTimers_CallbackSingle_start") else call error("Called CallbackSingle.ClosureTimers_CallbackSingle_start on invalid object.") endif endif call CallbackSingle_start(this, time) endfunction function doAfter takes real timeToWait, integer cb returns nothing call dispatch_CallbackSingle_ClosureTimers_CallbackSingle_start(cb, timeToWait) endfunction function alloc_AutoDat takes nothing returns integer local integer this if AutoDat_firstFree == 0 then if AutoDat_maxIndex < 8191 then set AutoDat_maxIndex = AutoDat_maxIndex + 1 set this = AutoDat_maxIndex set AutoDat_typeId[this] = 16 else call error("Out of memory: Could not create AutoDat.") set this = 0 endif else set AutoDat_firstFree = AutoDat_firstFree - 1 set this = AutoDat_nextFree[AutoDat_firstFree] set AutoDat_typeId[this] = 16 endif return this endfunction function construct_AutoDat takes integer this returns nothing endfunction function new_AutoDat takes nothing returns integer local integer this = alloc_AutoDat() call construct_AutoDat(this) return this endfunction function act_6 takes nothing returns nothing local integer id = GetSpellAbilityId() local unit attacker_2 local real jitter local real tX local real tY local real uX local real uY local real sepAngle local real offsetX local real offsetY local real angle local integer ad local timer clock local boolean haveAuto local integer clVar local real temp if id == HunterAttack_BURST_ID then set attacker_2 = GetTriggerUnit() set uX = GetUnitX(attacker_2) set uY = GetUnitY(attacker_2) set tX = GetSpellTargetX() set tY = GetSpellTargetY() set haveAuto = UnitHasItemOfTypeBJ(attacker_2, Units_GAS_ACTION) if not haveAuto then set jitter = GetRandomReal(0., HunterAttack_JITTER) - HunterAttack_JITTER / 2. set sepAngle = GetRandomReal(0., HunterAttack_SEPARATION_ARC) - HunterAttack_SEPARATION_ARC / 2. set angle = TerrainData_radiansBetweenXY(uX, tX, uY, tY) if sepAngle < 0. then set offsetX = HunterAttack_SEPARATION_RADIUS * Cos(angle + sepAngle) set offsetY = HunterAttack_SEPARATION_RADIUS * Sin(angle + sepAngle) call ProjectileStack_add(attacker_2, uX + offsetX, uY + offsetY, tX + offsetX, tY + offsetY, jitter - HunterAttack_SPREAD_ARC) set offsetX = HunterAttack_SEPARATION_RADIUS * Cos(angle + sepAngle + bj_PI) set offsetY = HunterAttack_SEPARATION_RADIUS * Sin(angle + sepAngle + bj_PI) call ProjectileStack_add(attacker_2, uX + offsetX, uY + offsetY, tX + offsetX, tY + offsetY, jitter + HunterAttack_SPREAD_ARC) else set offsetX = HunterAttack_SEPARATION_RADIUS * Cos(angle + sepAngle) set offsetY = HunterAttack_SEPARATION_RADIUS * Sin(angle + sepAngle) call ProjectileStack_add(attacker_2, uX + offsetX, uY + offsetY, tX + offsetX, tY + offsetY, jitter + HunterAttack_SPREAD_ARC) set offsetX = HunterAttack_SEPARATION_RADIUS * Cos(angle + sepAngle + bj_PI) set offsetY = HunterAttack_SEPARATION_RADIUS * Sin(angle + sepAngle + bj_PI) call ProjectileStack_add(attacker_2, uX + offsetX, uY + offsetY, tX + offsetX, tY + offsetY, jitter - HunterAttack_SPREAD_ARC) endif call ProjectileStack_add(attacker_2, uX, uY, tX, tY, jitter) set temp = HunterAttack_POST_BURST_DELAY set clVar = alloc_Closure_3() call construct_CallbackSingle(clVar) set attacker[clVar] = attacker_2 call doAfter(temp, clVar) else set jitter = GetRandomReal(HunterAttack_JITTER * ( - (1. / 2.)), HunterAttack_JITTER / 2.) call ProjectileStack_add(attacker_2, uX, uY, tX, tY, jitter) if dispatch_Table_Table_Table_hasInt(HunterAttack_logicalClock, handle_getHandleId(attacker_2)) then call dispatch_Table_Table_Table_saveInt(HunterAttack_logicalClock, handle_getHandleId(attacker_2), dispatch_Table_Table_Table_loadInt(HunterAttack_logicalClock, handle_getHandleId(attacker_2)) + 1) else call dispatch_Table_Table_Table_saveInt(HunterAttack_logicalClock, handle_getHandleId(attacker_2), 0) endif set ad = new_AutoDat() set AutoDat_attacker[ad] = attacker_2 set AutoDat_logicalSecret[ad] = dispatch_Table_Table_Table_loadInt(HunterAttack_logicalClock, handle_getHandleId(attacker_2)) set AutoDat_uX[ad] = uX set AutoDat_uY[ad] = uY set AutoDat_tX[ad] = tX set AutoDat_tY[ad] = tY set clock = CreateTimer() call timer_setData(clock, ad) call TimerStart(clock, HunterAttack_AUTO_RATE, true, ref_function_autoTick) endif endif set attacker_2 = null set clock = null endfunction function alloc_DuplicateDat takes nothing returns integer local integer this if DuplicateDat_firstFree == 0 then if DuplicateDat_maxIndex < 8191 then set DuplicateDat_maxIndex = DuplicateDat_maxIndex + 1 set this = DuplicateDat_maxIndex set DuplicateDat_typeId[this] = 32 else call error("Out of memory: Could not create DuplicateDat.") set this = 0 endif else set DuplicateDat_firstFree = DuplicateDat_firstFree - 1 set this = DuplicateDat_nextFree[DuplicateDat_firstFree] set DuplicateDat_typeId[this] = 32 endif return this endfunction function construct_DuplicateDat takes integer this returns nothing endfunction function new_DuplicateDat takes nothing returns integer local integer this = alloc_DuplicateDat() call construct_DuplicateDat(this) return this endfunction function simError takes player forPlayer, string msg returns nothing set msg = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n|cffffcc00" + msg + "|r" if GetLocalPlayer() == forPlayer then call ClearTextMessages() call DisplayTimedTextToPlayer(forPlayer, 0.52, 0.96, 2.00, msg) call StartSound(SimError_error) endif endfunction function act_7 takes nothing returns nothing local integer dd local player owner local integer id local real x1 local real y1 local real x2 local real y2 local real fDiff if GetSpellAbilityId() == OrganicConcatenation_CONCATENATION_ID then set id = GetPlayerId(GetOwningPlayer(GetTriggerUnit())) if not (IsUnitInRange(Units_hero[id], Units_subHero[id], OrganicConcatenation_RANGE) and UnitAlive(Units_hero[id]) and UnitAlive(Units_subHero[id]) and Units_countBalls(Units_hero[id]) > 2 and Units_countBalls(Units_subHero[id]) > 2) then call simError(Players_fromId[id], "No suitable unit in range for concatenation") set owner = null return endif set dd = new_DuplicateDat() set DuplicateDat_tU[dd] = Units_hero[id] set DuplicateDat_friend[dd] = Units_subHero[id] set DuplicateDat_timeLeft[dd] = OrganicConcatenation_DURATION set owner = GetOwningPlayer(DuplicateDat_tU[dd]) set x1 = GetUnitX(DuplicateDat_tU[dd]) set x2 = GetUnitX(DuplicateDat_friend[dd]) set y1 = GetUnitY(DuplicateDat_tU[dd]) set y2 = GetUnitY(DuplicateDat_friend[dd]) set DuplicateDat_dist[dd] = TerrainData_distanceBetweenXY(x1, x2, y1, y2) set DuplicateDat_uX[dd] = (x1 + x2) / 2. set DuplicateDat_uY[dd] = (y1 + y2) / 2. set DuplicateDat_f0[dd] = GetUnitFacing(DuplicateDat_tU[dd]) * bj_DEGTORAD set DuplicateDat_f1[dd] = GetUnitFacing(DuplicateDat_friend[dd]) * bj_DEGTORAD set fDiff = Math_radiansNormalizeHalf(DuplicateDat_f1[dd] - DuplicateDat_f0[dd]) set DuplicateDat_face[dd] = Math_radiansNormalizeHalfModulo(DuplicateDat_f0[dd] - fDiff / 2.) set DuplicateDat_axis[dd] = TerrainData_radiansBetweenXY(x1, x2, y1, y2) set DuplicateDat_image0[dd] = CreateUnit(owner, OrganicConcatenation_BEAST_ILLUSION_ID, DuplicateDat_uX[dd] + 2. * DuplicateDat_dist[dd] / 6. * Cos(DuplicateDat_axis[dd]), DuplicateDat_uY[dd] + 2. * DuplicateDat_dist[dd] / 6. * Sin(DuplicateDat_axis[dd]), DuplicateDat_f0[dd] + 4. * fDiff / 5.) set DuplicateDat_image1[dd] = CreateUnit(owner, OrganicConcatenation_BEAST_ILLUSION_ID, DuplicateDat_uX[dd] + 1. * DuplicateDat_dist[dd] / 6. * Cos(DuplicateDat_axis[dd]), DuplicateDat_uY[dd] + 1. * DuplicateDat_dist[dd] / 6. * Sin(DuplicateDat_axis[dd]), DuplicateDat_f0[dd] + 3. * fDiff / 5.) set DuplicateDat_image2[dd] = CreateUnit(owner, OrganicConcatenation_BEAST_ILLUSION_ID, DuplicateDat_uX[dd] - 1. * DuplicateDat_dist[dd] / 6. * Cos(DuplicateDat_axis[dd]), DuplicateDat_uY[dd] - 1. * DuplicateDat_dist[dd] / 6. * Sin(DuplicateDat_axis[dd]), DuplicateDat_f0[dd] + 2. * fDiff / 5.) set DuplicateDat_image3[dd] = CreateUnit(owner, OrganicConcatenation_BEAST_ILLUSION_ID, DuplicateDat_uX[dd] - 2. * DuplicateDat_dist[dd] / 6. * Cos(DuplicateDat_axis[dd]), DuplicateDat_uY[dd] - 2. * DuplicateDat_dist[dd] / 6. * Sin(DuplicateDat_axis[dd]), DuplicateDat_f0[dd] + 1. * fDiff / 5.) call SoundControl_play3D(OrganicConcatenation_IMAGE_SOUND, 1., DuplicateDat_uX[dd], DuplicateDat_uY[dd], 0.) call SetUnitVertexColor(DuplicateDat_image0[dd], 255, 255, 255, 128) call SetUnitVertexColor(DuplicateDat_image1[dd], 255, 255, 255, 128) call SetUnitVertexColor(DuplicateDat_image2[dd], 255, 255, 255, 128) call SetUnitVertexColor(DuplicateDat_image3[dd], 255, 255, 255, 128) call SetUnitTimeScale(DuplicateDat_image0[dd], 0.) call SetUnitTimeScale(DuplicateDat_image1[dd], 0.) call SetUnitTimeScale(DuplicateDat_image2[dd], 0.) call SetUnitTimeScale(DuplicateDat_image3[dd], 0.) call Units_dischargeBall(DuplicateDat_tU[dd]) call Units_dischargeBall(DuplicateDat_tU[dd]) call Units_dischargeBall(DuplicateDat_tU[dd]) call Units_dischargeBall(DuplicateDat_friend[dd]) call Units_dischargeBall(DuplicateDat_friend[dd]) call Units_dischargeBall(DuplicateDat_friend[dd]) call SetUnitFlyHeight(DuplicateDat_tU[dd], 1000., 0.) call SetUnitVertexColor(DuplicateDat_tU[dd], 0, 0, 0, 0) call PauseUnit(DuplicateDat_tU[dd], true) call SetUnitFlyHeight(DuplicateDat_friend[dd], 1000., 0.) call SetUnitVertexColor(DuplicateDat_friend[dd], 0, 0, 0, 0) call PauseUnit(DuplicateDat_friend[dd], true) set OrganicConcatenation_ddIndex = OrganicConcatenation_ddIndex + 1 set OrganicConcatenation_ddStack[OrganicConcatenation_ddIndex] = dd if OrganicConcatenation_ddIndex == 0 then call TimerStart(OrganicConcatenation_clock, OrganicConcatenation_CLOCK_PERIOD, true, ref_function_ddPeriodic) endif endif set owner = null endfunction function act_8 takes nothing returns nothing call DestroyTimer(GetExpiredTimer()) set MultiboardControl_mb = CreateMultiboard() call MultiboardSetColumnCount(MultiboardControl_mb, 2) call MultiboardSetRowCount(MultiboardControl_mb, 1) call MultiboardSetItemsStyle(MultiboardControl_mb, true, false) call MultiboardSetItemWidth(MultiboardGetItem(MultiboardControl_mb, 0, 0), .09) call MultiboardSetItemWidth(MultiboardGetItem(MultiboardControl_mb, 0, 1), .04) call MultiboardSetTitleText(MultiboardControl_mb, "|cff999999Hunters|r 0 - 0 |cff411d0aBeasts|r") call MultiboardSetItemValue(MultiboardGetItem(MultiboardControl_mb, 0, 0), "|cffffcc00Round Time:|r") call MultiboardSetItemValue(MultiboardGetItem(MultiboardControl_mb, 0, 1), "0:00") call TimerStart(MultiboardControl_time, 1., true, ref_function_periodic) endfunction function act_9 takes nothing returns nothing local integer index = 0 local real face if not Cinematic_enabled then loop exitwhen index > Players_FIRST_BEAST call FogModifierStop(BinocularVision_lSight[index]) call DestroyFogModifier(BinocularVision_lSight[index]) if GetUnitTypeId(Units_hero[index]) == Units_HUNTER_ID and UnitAlive(Units_hero[index]) then set face = GetUnitFacing(Units_hero[index]) * bj_DEGTORAD set BinocularVision_lSight[index] = CreateFogModifierRadius(Players_fromId[index], FOG_OF_WAR_VISIBLE, GetUnitX(Units_hero[index]) + BinocularVision_OFFSET * Cos(face), GetUnitY(Units_hero[index]) + BinocularVision_OFFSET * Sin(face), BinocularVision_RADIUS, false, true) call FogModifierStart(BinocularVision_lSight[index]) endif set index = index + 1 endloop endif endfunction function alloc_DummyAlloc takes nothing returns integer local integer this if DummyAlloc_firstFree == 0 then if DummyAlloc_maxIndex < 8191 then set DummyAlloc_maxIndex = DummyAlloc_maxIndex + 1 set this = DummyAlloc_maxIndex set DummyAlloc_typeId[this] = 18 else call error("Out of memory: Could not create DummyAlloc.") set this = 0 endif else set DummyAlloc_firstFree = DummyAlloc_firstFree - 1 set this = DummyAlloc_nextFree[DummyAlloc_firstFree] set DummyAlloc_typeId[this] = 18 endif return this endfunction function construct_DummyAlloc takes integer this returns nothing endfunction function new_DummyAlloc takes nothing returns integer local integer this = alloc_DummyAlloc() call construct_DummyAlloc(this) return this endfunction function act_10 takes nothing returns nothing local unit selected = null local real selectedRange = 2. * Knife_RADIUS local unit tU local unit iter local player p local real facing local real x local real y local unit dum local timer tim local timer cdTim local integer d if GetSpellAbilityId() == Knife_KNIFE_ID then set tU = GetTriggerUnit() set p = GetOwningPlayer(tU) set facing = GetUnitFacing(tU) * bj_DEGTORAD set x = GetUnitX(tU) + Knife_OFFSET * Cos(facing) set y = GetUnitY(tU) + Knife_OFFSET * Sin(facing) set dum = DummyUnitStack_get() call SetUnitX(dum, x) call SetUnitY(dum, y) call SetUnitFlyHeight(dum, Knife_EFFECT_HEIGHT, 0.) call DestroyEffect(AddSpecialEffectTarget(Knife_FX, dum, "origin")) set tim = CreateTimer() set d = new_DummyAlloc() set DummyAlloc_u[d] = dum call timer_setData(tim, d) call TimerStart(tim, Knife_FX_DURATION, false, ref_function_releaseDummy) call GroupEnumUnitsInRange(Knife_grp, x, y, Knife_RADIUS, null) loop set iter = FirstOfGroup(Knife_grp) exitwhen iter == null if IsUnitEnemy(iter, p) and UnitAlive(iter) and IsUnitInRangeXY(iter, x, y, selectedRange) then set selected = iter set selectedRange = TerrainData_distanceBetweenXY(GetUnitX(iter), x, GetUnitY(iter), y) endif call GroupRemoveUnit(Knife_grp, iter) endloop if selected != null then call DestroyEffect(AddSpecialEffectTarget(Knife_FX_PROC, selected, Knife_FX_PROC_ATTACH_POINT)) if GetWidgetLife(selected) <= Knife_EXECUTE_MAX_HEALTH then call DestroyEffect(AddSpecialEffectTarget(Knife_FX_EXPLODED, selected, "origin")) call DamageType_dealCodeDamage(tU, selected, 2. * Knife_EXECUTE_MAX_HEALTH) set cdTim = CreateTimer() set d = new_DummyAlloc() set DummyAlloc_u[d] = tU call timer_setData(cdTim, d) call TimerStart(cdTim, Knife_SHORT_COOLDOWN, false, ref_function_resetCooldown) else call DamageType_dealCodeDamage(tU, selected, Knife_BASE_DAMAGE) endif endif endif set tU = null set iter = null set selected = null set p = null set dum = null set tim = null set cdTim = null endfunction function alloc_DuplicateDat_2 takes nothing returns integer local integer this if DuplicateDat_firstFree_2 == 0 then if DuplicateDat_maxIndex_2 < 8191 then set DuplicateDat_maxIndex_2 = DuplicateDat_maxIndex_2 + 1 set this = DuplicateDat_maxIndex_2 set DuplicateDat_typeId_2[this] = 33 else call error("Out of memory: Could not create DuplicateDat.") set this = 0 endif else set DuplicateDat_firstFree_2 = DuplicateDat_firstFree_2 - 1 set this = DuplicateDat_nextFree_2[DuplicateDat_firstFree_2] set DuplicateDat_typeId_2[this] = 33 endif return this endfunction function construct_DuplicateDat_2 takes integer this returns nothing endfunction function new_DuplicateDat_2 takes nothing returns integer local integer this = alloc_DuplicateDat_2() call construct_DuplicateDat_2(this) return this endfunction function act_11 takes nothing returns nothing local integer dd local player owner if GetSpellAbilityId() == OrganicHemisection_HEMISECTION_ID then set dd = new_DuplicateDat_2() set DuplicateDat_tU_2[dd] = GetTriggerUnit() set DuplicateDat_timeLeft_2[dd] = OrganicHemisection_DURATION set owner = GetOwningPlayer(DuplicateDat_tU_2[dd]) set DuplicateDat_uX_2[dd] = GetUnitX(DuplicateDat_tU_2[dd]) set DuplicateDat_uY_2[dd] = GetUnitY(DuplicateDat_tU_2[dd]) set DuplicateDat_face_2[dd] = GetUnitFacing(DuplicateDat_tU_2[dd]) set DuplicateDat_image0_2[dd] = CreateUnit(owner, OrganicHemisection_BEAST_ILLUSION_ID, DuplicateDat_uX_2[dd] + OrganicHemisection_OFFSET / 2. * Cos(DuplicateDat_face_2[dd] * bj_DEGTORAD - bj_PI / 2.), DuplicateDat_uY_2[dd] + OrganicHemisection_OFFSET / 2. * Sin(DuplicateDat_face_2[dd] * bj_DEGTORAD - bj_PI / 2.), DuplicateDat_face_2[dd]) set DuplicateDat_image1_2[dd] = CreateUnit(owner, OrganicHemisection_BEAST_ILLUSION_ID, DuplicateDat_uX_2[dd], DuplicateDat_uY_2[dd], DuplicateDat_face_2[dd]) set DuplicateDat_image2_2[dd] = CreateUnit(owner, OrganicHemisection_BEAST_ILLUSION_ID, DuplicateDat_uX_2[dd] + OrganicHemisection_OFFSET / 2. * Cos(DuplicateDat_face_2[dd] * bj_DEGTORAD + bj_PI / 2.), DuplicateDat_uY_2[dd] + OrganicHemisection_OFFSET / 2. * Sin(DuplicateDat_face_2[dd] * bj_DEGTORAD + bj_PI / 2.), DuplicateDat_face_2[dd]) call SoundControl_play3D(OrganicHemisection_IMAGE_SOUND, 1., DuplicateDat_uX_2[dd], DuplicateDat_uY_2[dd], 0.) call SetUnitVertexColor(DuplicateDat_image0_2[dd], 255, 255, 255, 128) call SetUnitVertexColor(DuplicateDat_image1_2[dd], 255, 255, 255, 128) call SetUnitVertexColor(DuplicateDat_image2_2[dd], 255, 255, 255, 128) call SetUnitTimeScale(DuplicateDat_image0_2[dd], 0.) call SetUnitTimeScale(DuplicateDat_image1_2[dd], 0.) call SetUnitTimeScale(DuplicateDat_image2_2[dd], 0.) call Units_dischargeBall(DuplicateDat_tU_2[dd]) call Units_dischargeBall(DuplicateDat_tU_2[dd]) call Units_dischargeBall(DuplicateDat_tU_2[dd]) call SetUnitFlyHeight(DuplicateDat_tU_2[dd], 1000., 0.) call SetUnitVertexColor(DuplicateDat_tU_2[dd], 0, 0, 0, 0) call PauseUnit(DuplicateDat_tU_2[dd], true) set OrganicHemisection_ddIndex = OrganicHemisection_ddIndex + 1 set OrganicHemisection_ddStack[OrganicHemisection_ddIndex] = dd if OrganicHemisection_ddIndex == 0 then call TimerStart(OrganicHemisection_clock, OrganicHemisection_CLOCK_PERIOD, true, ref_function_ddPeriodic_2) endif endif set owner = null endfunction function countItems takes unit u, item i returns integer local integer typ = GetItemTypeId(i) local integer index = 0 local integer count = 0 loop exitwhen index > 5 if GetItemTypeId(UnitItemInSlot(u, index)) == typ then set count = count + 1 endif set index = index + 1 endloop return count endfunction function act_12 takes nothing returns boolean local unit t = GetTriggerUnit() local item i = GetManipulatedItem() if countItems(t, i) > 1 then call UnitDropItemPoint(t, i, unit_getX(t), unit_getY(t)) call simError(unit_getOwner(t), "You can't carry two of the same item.") endif set t = null set i = null return false endfunction function act_13 takes nothing returns nothing if IsUnitAlly(GetTriggerUnit(), GetOwningPlayer(GetAttacker())) then call IssueImmediateOrder(GetAttacker(), "stop") endif endfunction function item_setPos takes item this, real x, real y returns nothing call SetItemPosition(this, x, y) endfunction function fxSpawn takes unit u, real facing returns nothing call item_setPos(PedestalReceive_fakeRune, GetUnitX(u) + PedestalReceive_ITEM_DROP_OFFS * Cos(facing), GetUnitY(u) + PedestalReceive_ITEM_DROP_OFFS * Sin(facing)) set PedestalReceive_spawnCount = PedestalReceive_SPAWN_COUNT call TimerStart(PedestalReceive_time, PedestalReceive_SPAWN_PERIOD, true, ref_function_fxSpawn2) endfunction function unit_getFacing takes unit this returns real return GetUnitFacing(this) endfunction function act_14 takes nothing returns nothing local unit iter call GroupEnumUnitsInRect(PedestalReceive_grp, PedestalReceive_rctEpsilon, null) loop set iter = FirstOfGroup(PedestalReceive_grp) exitwhen iter == null if UnitHasItem(iter, Units_artifact) or UnitHasItem(iter, Units_artifact2) and Game_roundEnabled then call SoundControl_play(PedestalReceive_RUNE_SECURED, 1., 127) call FogEnable(false) call PanCameraToTimed(GetUnitX(iter), GetUnitY(iter), 0.) call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, 1024., 0.) call fxSpawn(iter, unit_getFacing(iter)) call Game_hunterWin() call SetItemPosition(Units_artifact, TerrainData_SAFE_X, TerrainData_SAFE_Y) call SetItemPosition(Units_artifact2, TerrainData_SAFE_X, TerrainData_SAFE_Y) exitwhen true endif call GroupRemoveUnit(PedestalReceive_grp, iter) endloop set iter = null endfunction function afterDelay takes nothing returns nothing local integer index = 0 call DialogClear(Initialization_dialo) call DialogSetMessage(Initialization_dialo, "Round wins required for victory") set Initialization_btns[0] = DialogAddButton(Initialization_dialo, "3", 51) set Initialization_btns[1] = DialogAddButton(Initialization_dialo, "5", 53) set Initialization_btns[2] = DialogAddButton(Initialization_dialo, "7", 55) set Initialization_btns[3] = DialogAddButton(Initialization_dialo, "9", 57) call TriggerRegisterDialogEvent(Initialization_diaClick, Initialization_dialo) call DisplayTextToPlayer(Players_locl, 0., 0., "|cffffcc00[Voting]|r Please wait up to |cffffcc0010|r seconds while players vote for round count.") call TimerStart(Initialization_voteTimer, 10., false, ref_function_endVotes) loop exitwhen index > Players_LAST_BEAST call DialogDisplay(Players_fromId[index], Initialization_dialo, true) set index = index + 1 endloop endfunction function AutoDat_onDestroy takes integer this returns nothing endfunction function dealloc_AutoDat takes integer obj returns nothing if AutoDat_typeId[obj] == 0 then call error("Double free: object of type AutoDat") else set AutoDat_nextFree[AutoDat_firstFree] = obj set AutoDat_firstFree = AutoDat_firstFree + 1 set AutoDat_typeId[obj] = 0 endif endfunction function destroyAutoDat takes integer this returns nothing call AutoDat_onDestroy(this) call dealloc_AutoDat(this) endfunction function dispatch_AutoDat_destroyAutoDat takes integer this returns nothing if AutoDat_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling AutoDat.destroyAutoDat") else call error("Called AutoDat.destroyAutoDat on invalid object.") endif endif call destroyAutoDat(this) endfunction function autoTick takes nothing returns nothing local timer clock = GetExpiredTimer() local integer ad = timer_getData(clock) local real jitter if GetUnitCurrentOrder(AutoDat_attacker[ad]) == OrderId("channel") and dispatch_Table_Table_Table_loadInt(HunterAttack_logicalClock, handle_getHandleId(AutoDat_attacker[ad])) == AutoDat_logicalSecret[ad] then set jitter = GetRandomReal(HunterAttack_JITTER * ( - (1. / 2.)), HunterAttack_JITTER / 2.) call ProjectileStack_add(AutoDat_attacker[ad], AutoDat_uX[ad], AutoDat_uY[ad], AutoDat_tX[ad], AutoDat_tY[ad], jitter) else call DestroyTimer(clock) call dispatch_AutoDat_destroyAutoDat(ad) endif set clock = null endfunction function Cinematic_interrupt takes nothing returns nothing call PauseTimer(Cinematic_humanClock) call PauseTimer(Cinematic_beastClock) call Cinematic_endCinematic() endfunction function c takes nothing returns boolean local integer id = GetPlayerId(GetTriggerPlayer()) if Game_singlePlayer and Cinematic_over then call FogEnable(false) call DisplayTextToPlayer(Players_locl, 0., 0., "|cffffcc00[Singleplayer]|r Fog Disabled!") endif if Cinematic_enabled and ( not Game_escapesPressed[id]) then set Game_escapesPressed[id] = true set Players_escapePressedCount = Players_escapePressedCount + 1 if Players_escapePressedCount >= Players_humanCount then call Cinematic_interrupt() call DisplayTextToPlayer(Players_locl, 0., 0., "|cffffcc00[Notice]|r The cinematic was skipped due to popular vote.") else call DisplayTextToPlayer(GetTriggerPlayer(), 0., 0., "|cffffcc00[Notice]|r Your cinematic skip request has been registered.") endif endif return false endfunction function TextTag_regeneration takes real x, real y, player whom returns nothing local texttag t = CreateTextTag() call SetTextTagColor(t, 33, 120, 68, R2I(255 * 3 * 1. / 4)) call SetTextTagLifespan(t, 2.) call SetTextTagFadepoint(t, 1.) call SetTextTagPermanent(t, false) call SetTextTagPos(t, x, y, 25.) call SetTextTagText(t, "+1", 10. * .0023) call SetTextTagVelocity(t, 50. * Cos(Maths_PI / 2.) * .071 / 128., 50. * Sin(Maths_PI / 2.) * .071 / 128.) call SetTextTagVisibility(t, false) if Players_locl == whom then call SetTextTagVisibility(t, true) endif set t = null endfunction function checkCombatDuration takes nothing returns nothing local integer index = 0 local real life loop exitwhen index >= Players_FIRST_BEAST if UnitAlive(Units_hero[index]) and UnitHasItemOfTypeBJ(Units_hero[index], ItemFieldConditioningKit_DUST_ID) then set life = GetWidgetLife(Units_hero[index]) if not dispatch_Table_Table_Table_hasInt(ItemFieldConditioningKit_damageTimings, handle_getHandleId(Units_hero[index])) then call dispatch_Table_Table_Table_saveInt(ItemFieldConditioningKit_damageTimings, handle_getHandleId(Units_hero[index]), Statistics_secondsElapsed) elseif Statistics_secondsElapsed - dispatch_Table_Table_Table_loadInt(ItemFieldConditioningKit_damageTimings, handle_getHandleId(Units_hero[index])) > ItemFieldConditioningKit_COMBAT_TIME and life < GetUnitState(Units_hero[index], UNIT_STATE_MAX_LIFE) then call SetWidgetLife(Units_hero[index], life + 1.) call TextTag_regeneration(unit_getX(Units_hero[index]), unit_getY(Units_hero[index]), unit_getOwner(Units_hero[index])) endif endif set index = index + 1 endloop endfunction function checkRoundSeconds takes nothing returns nothing if Game_roundEnabled and Statistics_roundEndTime - Statistics_secondsElapsed <= 0 then call FogEnable(false) call SoundControl_play(TimerUp_TIME_LIMIT_REACHED, 1., 127) call Game_beastWin() endif endfunction function AI_addPlayer takes player p returns nothing set AI_count = AI_count + 1 set AI_players[AI_count] = p if AI_count == 0 then call TimerStart(AI_clock, AI_CLOCK_PERIOD, true, ref_function_AI_periodic) endif endfunction function cond takes nothing returns boolean local player tp = GetTriggerPlayer() local integer id = GetPlayerId(tp) call DisplayTimedTextToPlayer(Players_locl, 0., 0., 5., "|cffffcc00" + GetPlayerName(tp) + "|r left the game and replaced by AI.") call AI_addPlayer(tp) set Players_aiControlled[id] = true set Players_aiCount = Players_aiCount + 1 set Players_humanCount = Players_humanCount - 1 set tp = null return false endfunction function DuplicateDat_onDestroy takes integer this returns nothing endfunction function dealloc_DuplicateDat takes integer obj returns nothing if DuplicateDat_typeId_2[obj] == 0 then call error("Double free: object of type DuplicateDat") else set DuplicateDat_nextFree_2[DuplicateDat_firstFree_2] = obj set DuplicateDat_firstFree_2 = DuplicateDat_firstFree_2 + 1 set DuplicateDat_typeId_2[obj] = 0 endif endfunction function destroyDuplicateDat takes integer this returns nothing call DuplicateDat_onDestroy(this) call dealloc_DuplicateDat(this) endfunction function dispatch_DuplicateDat_destroyDuplicateDat takes integer this returns nothing if DuplicateDat_typeId_2[this] == 0 then if this == 0 then call error("Nullpointer exception when calling DuplicateDat.destroyDuplicateDat") else call error("Called DuplicateDat.destroyDuplicateDat on invalid object.") endif endif call destroyDuplicateDat(this) endfunction function ddPeriodic takes nothing returns nothing local integer index = 0 local integer id local player owner local integer tempDat local real phaseOffset local real angle local real life loop exitwhen index > OrganicHemisection_ddIndex set tempDat = OrganicHemisection_ddStack[index] set phaseOffset = OrganicHemisection_PHASE_OFF * Cos(DuplicateDat_timeLeft_2[tempDat] * OrganicHemisection_PHASE_MULTIPLIER) set angle = DuplicateDat_face_2[tempDat] * bj_DEGTORAD + bj_PI / 2. call SetUnitX(DuplicateDat_image0_2[tempDat], DuplicateDat_uX_2[tempDat] + (OrganicHemisection_OFFSET / 2. + phaseOffset) * Cos(angle)) call SetUnitX(DuplicateDat_image1_2[tempDat], DuplicateDat_uX_2[tempDat] + phaseOffset * Cos(angle)) call SetUnitX(DuplicateDat_image2_2[tempDat], DuplicateDat_uX_2[tempDat] + (OrganicHemisection_OFFSET / ( - 2.) + phaseOffset) * Cos(angle)) call SetUnitY(DuplicateDat_image0_2[tempDat], DuplicateDat_uY_2[tempDat] + (OrganicHemisection_OFFSET / 2. + phaseOffset) * Sin(angle)) call SetUnitY(DuplicateDat_image1_2[tempDat], DuplicateDat_uY_2[tempDat] + phaseOffset * Sin(angle)) call SetUnitY(DuplicateDat_image2_2[tempDat], DuplicateDat_uY_2[tempDat] + (OrganicHemisection_OFFSET / ( - 2.) + phaseOffset) * Sin(angle)) set DuplicateDat_timeLeft_2[tempDat] = DuplicateDat_timeLeft_2[tempDat] - OrganicHemisection_CLOCK_PERIOD if DuplicateDat_timeLeft_2[tempDat] <= 0. then call RemoveUnit(DuplicateDat_image0_2[tempDat]) call RemoveUnit(DuplicateDat_image1_2[tempDat]) call RemoveUnit(DuplicateDat_image2_2[tempDat]) set Statistics_beastsAlive = Statistics_beastsAlive + 1 set owner = GetOwningPlayer(DuplicateDat_tU_2[tempDat]) set id = GetPlayerId(owner) set Units_hero[id] = CreateUnit(owner, Units_LESSER_BEAST_ID, DuplicateDat_uX_2[tempDat] + OrganicHemisection_OFFSET * Cos(DuplicateDat_face_2[tempDat] * bj_DEGTORAD - bj_PI / 2.), DuplicateDat_uY_2[tempDat] + OrganicHemisection_OFFSET * Sin(DuplicateDat_face_2[tempDat] * bj_DEGTORAD - bj_PI / 2.), DuplicateDat_face_2[tempDat]) set Units_subHero[id] = CreateUnit(owner, Units_LESSER_BEAST_ID, DuplicateDat_uX_2[tempDat] + OrganicHemisection_OFFSET * Cos(DuplicateDat_face_2[tempDat] * bj_DEGTORAD + bj_PI / 2.), DuplicateDat_uY_2[tempDat] + OrganicHemisection_OFFSET * Sin(DuplicateDat_face_2[tempDat] * bj_DEGTORAD + bj_PI / 2.), DuplicateDat_face_2[tempDat]) call Units_initializeBeast(Units_hero[id]) call Units_initializeBeast(Units_subHero[id]) if Players_locl == owner and ( not Cinematic_enabled) then call SelectUnit(Units_hero[id], true) call SelectUnit(Units_subHero[id], true) endif set life = GetWidgetLife(DuplicateDat_tU_2[tempDat]) / 2. call SetWidgetLife(Units_hero[id], life) call SetWidgetLife(Units_subHero[id], life) call RemoveUnit(DuplicateDat_tU_2[tempDat]) call dispatch_DuplicateDat_destroyDuplicateDat(tempDat) set OrganicHemisection_ddStack[index] = OrganicHemisection_ddStack[OrganicHemisection_ddIndex] set OrganicHemisection_ddIndex = OrganicHemisection_ddIndex - 1 set index = index - 1 if OrganicHemisection_ddIndex == -1 then call PauseTimer(OrganicHemisection_clock) endif endif set index = index + 1 endloop set owner = null endfunction function DuplicateDat_onDestroy_2 takes integer this returns nothing endfunction function dealloc_DuplicateDat_2 takes integer obj returns nothing if DuplicateDat_typeId[obj] == 0 then call error("Double free: object of type DuplicateDat") else set DuplicateDat_nextFree[DuplicateDat_firstFree] = obj set DuplicateDat_firstFree = DuplicateDat_firstFree + 1 set DuplicateDat_typeId[obj] = 0 endif endfunction function destroyDuplicateDat_2 takes integer this returns nothing call DuplicateDat_onDestroy_2(this) call dealloc_DuplicateDat_2(this) endfunction function dispatch_DuplicateDat_destroyDuplicateDat_2 takes integer this returns nothing if DuplicateDat_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling DuplicateDat.destroyDuplicateDat") else call error("Called DuplicateDat.destroyDuplicateDat on invalid object.") endif endif call destroyDuplicateDat_2(this) endfunction function ddPeriodic_2 takes nothing returns nothing local integer index = 0 local integer id local player owner local integer tempDat loop exitwhen index > OrganicConcatenation_ddIndex set tempDat = OrganicConcatenation_ddStack[index] call SetUnitX(DuplicateDat_image0[tempDat], DuplicateDat_uX[tempDat] + (2. * DuplicateDat_dist[tempDat] / 6. + OrganicConcatenation_PHASE_OFFSET) * Cos(DuplicateDat_axis[tempDat])) call SetUnitX(DuplicateDat_image1[tempDat], DuplicateDat_uX[tempDat] + (1. * DuplicateDat_dist[tempDat] / 6. + OrganicConcatenation_PHASE_OFFSET) * Cos(DuplicateDat_axis[tempDat])) call SetUnitX(DuplicateDat_image2[tempDat], DuplicateDat_uX[tempDat] - (1. * DuplicateDat_dist[tempDat] / 6. + OrganicConcatenation_PHASE_OFFSET) * Cos(DuplicateDat_axis[tempDat])) call SetUnitX(DuplicateDat_image3[tempDat], DuplicateDat_uX[tempDat] - (2. * DuplicateDat_dist[tempDat] / 6. + OrganicConcatenation_PHASE_OFFSET) * Cos(DuplicateDat_axis[tempDat])) call SetUnitY(DuplicateDat_image0[tempDat], DuplicateDat_uY[tempDat] + (2. * DuplicateDat_dist[tempDat] / 6. + OrganicConcatenation_PHASE_OFFSET) * Sin(DuplicateDat_axis[tempDat])) call SetUnitY(DuplicateDat_image1[tempDat], DuplicateDat_uY[tempDat] + (1. * DuplicateDat_dist[tempDat] / 6. + OrganicConcatenation_PHASE_OFFSET) * Sin(DuplicateDat_axis[tempDat])) call SetUnitY(DuplicateDat_image2[tempDat], DuplicateDat_uY[tempDat] - (1. * DuplicateDat_dist[tempDat] / 6. + OrganicConcatenation_PHASE_OFFSET) * Sin(DuplicateDat_axis[tempDat])) call SetUnitY(DuplicateDat_image3[tempDat], DuplicateDat_uY[tempDat] - (2. * DuplicateDat_dist[tempDat] / 6. + OrganicConcatenation_PHASE_OFFSET) * Sin(DuplicateDat_axis[tempDat])) set DuplicateDat_timeLeft[tempDat] = DuplicateDat_timeLeft[tempDat] - OrganicConcatenation_CLOCK_PERIOD if DuplicateDat_timeLeft[tempDat] <= 0. then call RemoveUnit(DuplicateDat_image0[tempDat]) call RemoveUnit(DuplicateDat_image1[tempDat]) call RemoveUnit(DuplicateDat_image2[tempDat]) call RemoveUnit(DuplicateDat_image3[tempDat]) set Statistics_beastsAlive = Statistics_beastsAlive - 1 set owner = GetOwningPlayer(DuplicateDat_tU[tempDat]) set id = GetPlayerId(owner) set Units_hero[id] = CreateUnit(owner, Units_BEAST_ID, DuplicateDat_uX[tempDat], DuplicateDat_uY[tempDat], DuplicateDat_face[tempDat]) set Units_subHero[id] = null call Units_initializeBeast(Units_hero[id]) call SetWidgetLife(Units_hero[id], GetWidgetLife(DuplicateDat_tU[tempDat]) + GetWidgetLife(DuplicateDat_friend[tempDat])) if Players_locl == owner then call SelectUnit(Units_hero[id], true) endif call RemoveUnit(DuplicateDat_tU[tempDat]) call RemoveUnit(DuplicateDat_friend[tempDat]) call dispatch_DuplicateDat_destroyDuplicateDat_2(tempDat) set OrganicConcatenation_ddStack[index] = OrganicConcatenation_ddStack[OrganicConcatenation_ddIndex] set OrganicConcatenation_ddIndex = OrganicConcatenation_ddIndex - 1 set index = index - 1 if OrganicConcatenation_ddIndex == -1 then call PauseTimer(OrganicConcatenation_clock) endif endif set index = index + 1 endloop set owner = null endfunction function endVotes takes nothing returns nothing local integer n call ClearTextMessages() if Game_roundsToWin == 0 then call DisplayTextToPlayer(Players_locl, 0., 0., "|cffffcc00[Voting]|r No votes registered, reverting to |cffffcc004|r rounds to win (Best-of-7)") set Game_roundsToWin = 4 else set n = R2I(I2R(Game_roundsToWin) / I2R(Initialization_votesCounted) + .5) set Game_roundsToWin = n call DisplayTextToPlayer(Players_locl, 0., 0., "|cffffcc00[Voting]|r Voting finished; |cffffcc00" + I2S(n) + "|r rounds to win (Best-of-" + I2S(n * 2 - 1) + ")") endif call TimerStart(Initialization_voteTimer, 3., false, ref_function_startC) endfunction function diaA takes nothing returns nothing local integer index = 0 local integer btnVal = 0 local button b = GetClickedButton() if b == Initialization_btns[0] then set btnVal = 3 elseif b == Initialization_btns[1] then set btnVal = 5 elseif b == Initialization_btns[2] then set btnVal = 7 elseif b == Initialization_btns[3] then set btnVal = 9 endif set Initialization_votesCounted = Initialization_votesCounted + 1 set Game_roundsToWin = Game_roundsToWin + btnVal if Initialization_votesCounted >= Players_humanCount then call PauseTimer(Initialization_voteTimer) loop exitwhen index > Players_LAST_BEAST call DialogDisplay(Players_fromId[index], Initialization_dialo, false) set index = index + 1 endloop call endVotes() endif set b = null endfunction function alloc_Effect takes nothing returns integer local integer this if Effect_firstFree == 0 then if Effect_maxIndex < 8191 then set Effect_maxIndex = Effect_maxIndex + 1 set this = Effect_maxIndex set Effect_typeId[this] = 34 else call error("Out of memory: Could not create Effect.") set this = 0 endif else set Effect_firstFree = Effect_firstFree - 1 set this = Effect_nextFree[Effect_firstFree] set Effect_typeId[this] = 34 endif return this endfunction function construct_Effect takes integer this returns nothing endfunction function new_Effect takes nothing returns integer local integer this = alloc_Effect() call construct_Effect(this) return this endfunction function timer_startPeriodic takes timer this, real time, code timerCallBack returns nothing call TimerStart(this, time, true, timerCallBack) endfunction function unit_setFlyHeight takes unit this, real height, real rate returns nothing call SetUnitFlyHeight(this, height, rate) endfunction function unit_setPos takes unit this, real x, real y returns nothing call SetUnitPosition(this, x, y) endfunction function fxSpawn2 takes nothing returns nothing local real randTarget = GetRandomReal(0., 1.) local real randAng = GetRandomReal(0., 2. * Maths_PI) local integer fx local integer tempIndex local integer tempIndex_2 local integer tempIndex_3 if PedestalReceive_spawnCount > 0 and ( not Game_roundEnabled) then set fx = new_Effect() set tempIndex = fx set Effect_velocity[tempIndex] = PedestalReceive_INITIAL_VELOCITY * PedestalReceive_CLOCK_PERIOD * Cos(PedestalReceive_INITIAL_PITCH) * Cos(randAng) set Effect_velocity_2[tempIndex] = PedestalReceive_INITIAL_VELOCITY * PedestalReceive_CLOCK_PERIOD * Cos(PedestalReceive_INITIAL_PITCH) * Sin(randAng) set Effect_velocity_3[tempIndex] = PedestalReceive_INITIAL_VELOCITY * PedestalReceive_CLOCK_PERIOD * Sin(PedestalReceive_INITIAL_PITCH) set Effect_dummy[fx] = DummyUnitStack_get() set Effect_attached[fx] = AddSpecialEffectTarget(PedestalReceive_DUMMY_MODEL, Effect_dummy[fx], "origin") call unit_setFlyHeight(Effect_dummy[fx], PedestalReceive_ITEM_SPAWN_HEIGHT, 0.) call unit_setPos(Effect_dummy[fx], GetItemX(PedestalReceive_fakeRune), GetItemY(PedestalReceive_fakeRune)) if randTarget < .5 then set tempIndex_2 = fx set Effect_target[tempIndex_2] = PedestalReceive_TARGET_PILLAR_LEFT_x set Effect_target_2[tempIndex_2] = PedestalReceive_TARGET_PILLAR_LEFT_y set Effect_target_3[tempIndex_2] = PedestalReceive_TARGET_PILLAR_LEFT_z else set tempIndex_3 = fx set Effect_target[tempIndex_3] = PedestalReceive_TARGET_PILLAR_RIGHT_x set Effect_target_2[tempIndex_3] = PedestalReceive_TARGET_PILLAR_RIGHT_y set Effect_target_3[tempIndex_3] = PedestalReceive_TARGET_PILLAR_RIGHT_z endif set PedestalReceive_effectIndex = PedestalReceive_effectIndex + 1 set PedestalReceive_fxDb[PedestalReceive_effectIndex] = fx if PedestalReceive_effectIndex == 0 then call timer_startPeriodic(PedestalReceive_time2, PedestalReceive_CLOCK_PERIOD, ref_function_fxSpawn3) endif set PedestalReceive_spawnCount = PedestalReceive_spawnCount - 1 else call timer_pause(PedestalReceive_time) call item_setPos(PedestalReceive_fakeRune, TerrainData_SAFE_X, TerrainData_SAFE_Y) endif endfunction function alloc_UnitAlloc takes nothing returns integer local integer this if UnitAlloc_firstFree == 0 then if UnitAlloc_maxIndex < 8191 then set UnitAlloc_maxIndex = UnitAlloc_maxIndex + 1 set this = UnitAlloc_maxIndex set UnitAlloc_typeId[this] = 13 else call error("Out of memory: Could not create UnitAlloc.") set this = 0 endif else set UnitAlloc_firstFree = UnitAlloc_firstFree - 1 set this = UnitAlloc_nextFree[UnitAlloc_firstFree] set UnitAlloc_typeId[this] = 13 endif return this endfunction function construct_UnitAlloc takes integer this returns nothing endfunction function new_UnitAlloc takes nothing returns integer local integer this = alloc_UnitAlloc() call construct_UnitAlloc(this) return this endfunction function DummyUnitStack_delayedRelease takes unit u, real delay returns nothing local integer ua = new_UnitAlloc() local timer tim = CreateTimer() set UnitAlloc_u[ua] = u call timer_setData(tim, ua) call TimerStart(tim, delay, false, ref_function_DummyUnitStack_afterDelay) set tim = null endfunction function Effect_onDestroy takes integer this returns nothing endfunction function dealloc_Effect takes integer obj returns nothing if Effect_typeId[obj] == 0 then call error("Double free: object of type Effect") else set Effect_nextFree[Effect_firstFree] = obj set Effect_firstFree = Effect_firstFree + 1 set Effect_typeId[obj] = 0 endif endfunction function destroyEffect takes integer this returns nothing call Effect_onDestroy(this) call dealloc_Effect(this) endfunction function dispatch_Effect_destroyEffect takes integer this returns nothing if Effect_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Effect.destroyEffect") else call error("Called Effect.destroyEffect on invalid object.") endif endif call destroyEffect(this) endfunction function effect_destr takes effect this returns nothing call DestroyEffect(this) endfunction function real_op_mult takes real this, real v_x, real v_y, real v_z returns real set real_op_mult_return_x = v_x * this set real_op_mult_return_y = v_y * this set real_op_mult_return_z = v_z * this return real_op_mult_return_x endfunction function unit_getFlyHeight takes unit this returns real return GetUnitFlyHeight(this) endfunction function real_squared takes real this returns real return this * this endfunction function vec3_distToVec takes real this_x, real this_y, real this_z, real v_x, real v_y, real v_z returns real return SquareRoot(real_squared(v_x - this_x) + real_squared(v_y - this_y) + real_squared(v_z - this_z)) endfunction function vec3_length takes real this_x, real this_y, real this_z returns real return SquareRoot(this_x * this_x + this_y * this_y + this_z * this_z) endfunction function vec3_norm takes real this_x, real this_y, real this_z returns real local real len = vec3_length(this_x, this_y, this_z) local real x = 0. local real y = 0. local real z = 0. if len != 0.0 then set x = this_x / len set y = this_y / len set z = this_z / len endif set vec3_norm_return_x = x set vec3_norm_return_y = y set vec3_norm_return_z = z return vec3_norm_return_x endfunction function vec3_op_minus takes real this_x, real this_y, real this_z, real v_x, real v_y, real v_z returns real set vec3_op_minus_return_x = this_x - v_x set vec3_op_minus_return_y = this_y - v_y set vec3_op_minus_return_z = this_z - v_z return vec3_op_minus_return_x endfunction function vec3_op_mult takes real this_x, real this_y, real this_z, real factor returns real set vec3_op_mult_return_x = this_x * factor set vec3_op_mult_return_y = this_y * factor set vec3_op_mult_return_z = this_z * factor return vec3_op_mult_return_x endfunction function vec3_op_plus takes real this_x, real this_y, real this_z, real v_x, real v_y, real v_z returns real set vec3_op_plus_return_x = this_x + v_x set vec3_op_plus_return_y = this_y + v_y set vec3_op_plus_return_z = this_z + v_z return vec3_op_plus_return_x endfunction function fxSpawn3 takes nothing returns nothing local integer index = 0 local integer iter local real diff_x local real diff_y local real diff_z local real dX local real dY local real dH local integer tempIndex local real temp_diff_x local real temp_diff_y local real temp_diff_z local integer tempIndex_2 local integer tempIndex_3 local integer tempIndex_4 local integer tempIndex_5 local integer tempIndex_6 local real tempTupleSelectionResult_1 local real temp_tempTupleSelectionResult_1 local integer tempIndex_7 local real tempTupleSelectionResult_2 local real temp_tempTupleSelectionResult_2 local integer tempIndex_8 local real tempTupleSelectionResult_3 local real temp_tempTupleSelectionResult_3 local integer tempIndex_9 local real tempTupleSelectionResult_1_2 local real temp_tempTupleSelectionResult_1_2 local integer tempIndex_10 local real tempTupleSelectionResult_2_2 local real temp_tempTupleSelectionResult_2_2 local integer tempIndex_11 local real tempTupleSelectionResult_3_2 local real temp_tempTupleSelectionResult_3_2 local integer tempIndex_12 local integer tempIndex_13 local integer tempIndex_14 local real tempTupleSelectionResult_1_3 local real temp_tempTupleSelectionResult_1_3 local integer tempIndex_15 local real tempTupleSelectionResult_2_3 local real temp_tempTupleSelectionResult_2_3 local integer tempIndex_16 local real tempTupleSelectionResult_3_3 local real temp_tempTupleSelectionResult_3_3 local integer temp local integer temp_2 local real temp_3 local unit temp_4 local real temp_5 local unit temp_6 local real temp_7 local unit temp_8 local real temp_9 local real temp_10 local real temp_11 local real temp_12 local real temp_13 local real temp_14 local real temp_15 local boolean andLeft local unit temp_16 local unit temp_17 local unit temp_18 loop exitwhen index > PedestalReceive_effectIndex set iter = PedestalReceive_fxDb[index] set dX = unit_getX(Effect_dummy[iter]) set dY = unit_getY(Effect_dummy[iter]) set dH = unit_getFlyHeight(Effect_dummy[iter]) set tempIndex = iter set temp_diff_x = vec3_op_minus(Effect_target[tempIndex], Effect_target_2[tempIndex], Effect_target_3[tempIndex], dX, dY, dH) set temp_diff_y = vec3_op_minus_return_y set temp_diff_z = vec3_op_minus_return_z set diff_x = temp_diff_x set diff_y = temp_diff_y set diff_z = temp_diff_z set tempIndex_2 = iter set temp = tempIndex_2 set tempIndex_3 = iter set Effect_velocity[temp] = vec3_op_plus(Effect_velocity[tempIndex_3], Effect_velocity_2[tempIndex_3], Effect_velocity_3[tempIndex_3], real_op_mult(PedestalReceive_ACCELERATION * PedestalReceive_CLOCK_PERIOD, vec3_norm(diff_x, diff_y, diff_z), vec3_norm_return_y, vec3_norm_return_z), real_op_mult_return_y, real_op_mult_return_z) set Effect_velocity_2[tempIndex_2] = vec3_op_plus_return_y set Effect_velocity_3[tempIndex_2] = vec3_op_plus_return_z set tempIndex_4 = iter set temp_2 = tempIndex_4 set tempIndex_5 = iter set Effect_velocity[temp_2] = vec3_op_mult(Effect_velocity[tempIndex_5], Effect_velocity_2[tempIndex_5], Effect_velocity_3[tempIndex_5], 1. - PedestalReceive_AIR_FRICTION) set Effect_velocity_2[tempIndex_4] = vec3_op_mult_return_y set Effect_velocity_3[tempIndex_4] = vec3_op_mult_return_z set temp_4 = Effect_dummy[iter] set temp_3 = dX set tempIndex_6 = iter set temp_tempTupleSelectionResult_1 = Effect_velocity[tempIndex_6] set tempTupleSelectionResult_1 = temp_tempTupleSelectionResult_1 call unit_setX(temp_4, temp_3 + tempTupleSelectionResult_1) set temp_6 = Effect_dummy[iter] set temp_5 = dY set tempIndex_7 = iter set temp_tempTupleSelectionResult_2 = Effect_velocity_2[tempIndex_7] set tempTupleSelectionResult_2 = temp_tempTupleSelectionResult_2 call unit_setY(temp_6, temp_5 + tempTupleSelectionResult_2) set temp_8 = Effect_dummy[iter] set temp_7 = dH set tempIndex_8 = iter set temp_tempTupleSelectionResult_3 = Effect_velocity_3[tempIndex_8] set tempTupleSelectionResult_3 = temp_tempTupleSelectionResult_3 call unit_setFlyHeight(temp_8, temp_7 + tempTupleSelectionResult_3, 0.) if Game_roundEnabled then set andLeft = true else set temp_9 = dX set tempIndex_9 = iter set temp_tempTupleSelectionResult_1_2 = Effect_velocity[tempIndex_9] set tempTupleSelectionResult_1_2 = temp_tempTupleSelectionResult_1_2 set temp_12 = temp_9 + tempTupleSelectionResult_1_2 set temp_10 = dY set tempIndex_10 = iter set temp_tempTupleSelectionResult_2_2 = Effect_velocity_2[tempIndex_10] set tempTupleSelectionResult_2_2 = temp_tempTupleSelectionResult_2_2 set temp_13 = temp_10 + tempTupleSelectionResult_2_2 set temp_11 = dH set tempIndex_11 = iter set temp_tempTupleSelectionResult_3_2 = Effect_velocity_3[tempIndex_11] set tempTupleSelectionResult_3_2 = temp_tempTupleSelectionResult_3_2 set temp_14 = temp_11 + tempTupleSelectionResult_3_2 set tempIndex_12 = iter set temp_15 = vec3_distToVec(temp_12, temp_13, temp_14, Effect_target[tempIndex_12], Effect_target_2[tempIndex_12], Effect_target_3[tempIndex_12]) set tempIndex_13 = iter set andLeft = temp_15 < 2. * vec3_length(Effect_velocity[tempIndex_13], Effect_velocity_2[tempIndex_13], Effect_velocity_3[tempIndex_13]) endif if andLeft then call effect_destr(Effect_attached[iter]) set temp_16 = Effect_dummy[iter] set tempIndex_14 = iter set temp_tempTupleSelectionResult_1_3 = Effect_target[tempIndex_14] set tempTupleSelectionResult_1_3 = temp_tempTupleSelectionResult_1_3 call unit_setX(temp_16, tempTupleSelectionResult_1_3) set temp_17 = Effect_dummy[iter] set tempIndex_15 = iter set temp_tempTupleSelectionResult_2_3 = Effect_target_2[tempIndex_15] set tempTupleSelectionResult_2_3 = temp_tempTupleSelectionResult_2_3 call unit_setY(temp_17, tempTupleSelectionResult_2_3) set temp_18 = Effect_dummy[iter] set tempIndex_16 = iter set temp_tempTupleSelectionResult_3_3 = Effect_target_3[tempIndex_16] set tempTupleSelectionResult_3_3 = temp_tempTupleSelectionResult_3_3 call unit_setFlyHeight(temp_18, tempTupleSelectionResult_3_3, 0.) call effect_destr(AddSpecialEffectTarget(PedestalReceive_EFFECT_MODEL, Effect_dummy[iter], "origin")) call DummyUnitStack_delayedRelease(Effect_dummy[iter], 1.) call dispatch_Effect_destroyEffect(iter) set PedestalReceive_fxDb[index] = PedestalReceive_fxDb[PedestalReceive_effectIndex] set PedestalReceive_effectIndex = PedestalReceive_effectIndex - 1 set index = index - 1 if PedestalReceive_effectIndex == -1 then call timer_pause(PedestalReceive_time2) endif endif set index = index + 1 endloop set temp_4 = null set temp_6 = null set temp_8 = null set temp_16 = null set temp_17 = null set temp_18 = null endfunction function DamageOverTime_unitHasFlag takes unit u, integer flag returns boolean local integer index = 0 local integer iterator loop exitwhen index > DamageOverTime_dbIndex set iterator = DamageOverTime_dotDB[index] if DotData_target[iterator] == u and DotData_exFlag[iterator] == flag then return true endif set index = index + 1 endloop return false endfunction function alloc_DotData takes nothing returns integer local integer this if DotData_firstFree == 0 then if DotData_maxIndex < 8191 then set DotData_maxIndex = DotData_maxIndex + 1 set this = DotData_maxIndex set DotData_typeId[this] = 9 else call error("Out of memory: Could not create DotData.") set this = 0 endif else set DotData_firstFree = DotData_firstFree - 1 set this = DotData_nextFree[DotData_firstFree] set DotData_typeId[this] = 9 endif return this endfunction function construct_DotData takes integer this returns nothing set DotData_source[this] = null set DotData_target[this] = null set DotData_dps[this] = 0. set DotData_duration[this] = 1. set DotData_fx[this] = "" set DotData_fxFlag[this] = 0 set DotData_exFlag[this] = 0 endfunction function new_DotData takes nothing returns integer local integer this = alloc_DotData() call construct_DotData(this) return this endfunction function DamageOverTime_add takes unit source, unit target, real dps, real duration, string fx, integer fxFlag, integer exclusivityFlag returns nothing local integer tempDat if exclusivityFlag > 0 and DamageOverTime_unitHasFlag(target, exclusivityFlag) then return endif set tempDat = new_DotData() set DotData_source[tempDat] = source set DotData_target[tempDat] = target set DotData_dps[tempDat] = dps set DotData_duration[tempDat] = duration set DotData_fx[tempDat] = fx set DotData_fxFlag[tempDat] = fxFlag set DotData_exFlag[tempDat] = exclusivityFlag set DamageOverTime_dbIndex = DamageOverTime_dbIndex + 1 set DamageOverTime_dotDB[DamageOverTime_dbIndex] = tempDat if DamageOverTime_dbIndex == 0 then call TimerStart(DamageOverTime_time, DamageOverTime_CLOCK_PERIOD, true, ref_function_DamageOverTime_damageTick) endif endfunction function hand takes nothing returns nothing local unit eS = GetEventDamageSource() local unit tU = GetTriggerUnit() local integer id = GetUnitTypeId(eS) local real bd = BeastAttack_BASE_DAMAGE if dispatch_Table_Table_Table_hasInt(ItemFieldConditioningKit_damageTimings, handle_getHandleId(tU)) then call dispatch_Table_Table_Table_saveInt(ItemFieldConditioningKit_damageTimings, handle_getHandleId(tU), Statistics_secondsElapsed) endif if id == Units_BEAST_ID or id == Units_LESSER_BEAST_ID and DamageType_get() == DamageType_NULLED then if UnitHasItemOfTypeBJ(tU, BeastAttack_STUDDED_LEATHER_ID) then set bd = bd - BeastAttack_LEATHER_DAMAGE_REDUCTION endif if dispatch_Table_Table_Table_hasInt(Units_thunderClock, handle_getHandleId(eS)) and Statistics_secondsElapsed - dispatch_Table_Table_Table_loadInt(Units_thunderClock, handle_getHandleId(eS)) < BeastAttack_THUNDER_DURATION then set bd = bd + GetUnitState(tU, UNIT_STATE_MAX_LIFE) * BeastAttack_THUNDER_BONUS_MULTIPLIER call dispatch_Table_Table_Table_saveInt(Units_thunderClock, handle_getHandleId(eS), 0) call DestroyEffect(AddSpecialEffectTarget(BeastAttack_THUNDER_FX_BIG, tU, "origin")) call DamageOverTime_add(eS, tU, 0., 2., BeastAttack_THUNDER_FX, DamageOverTime_FX_FLAG_COORDS, BeastAttack_THUNDER_EXCLUSIVITY) endif call DestroyEffect(AddSpecialEffectTarget(BeastAttack_FX, tU, "origin")) call DamageType_dealCodeDamage(eS, tU, bd) call DamageOverTime_add(eS, tU, BeastAttack_DAMAGE_PER_SECOND, BeastAttack_DOT_DURATION, BeastAttack_BLOOD_FX, DamageOverTime_FX_FLAG_ATTACH, BeastAttack_DOT_EXCLUSIVITY) endif set eS = null set tU = null endfunction function init_AI takes nothing returns boolean set AI_STATE_AGGRESSIVE = 0 set AI_STATE_RETREAT = 1 set AI_BEAST_ID = 1747988530 set AI_THUNDER_CD = 10 set AI_grp = CreateGroup() set AI_hunterLeader = null set AI_CLOCK_PERIOD = 1. / 2. set AI_count = -1 set AI_clock = CreateTimer() return true endfunction function registerPlayerUnitEvent takes playerunitevent p, code c_2 returns nothing local integer i = GetHandleId(p) local integer k = 15 if RegisterPlayerUnitEvent_t[i] == null then set RegisterPlayerUnitEvent_t[i] = CreateTrigger() loop call TriggerRegisterPlayerUnitEvent(RegisterPlayerUnitEvent_t[i], Player(k), p, null) exitwhen k == 0 set k = k - 1 endloop endif call TriggerAddCondition(RegisterPlayerUnitEvent_t[i], Filter(c_2)) endfunction function init takes nothing returns nothing call registerPlayerUnitEvent(EVENT_PLAYER_UNIT_ATTACKED, ref_function_act) endfunction function init_AttackTeammate takes nothing returns boolean call init() return true endfunction function init_Basics takes nothing returns boolean set Basics_ANIMATION_PERIOD = 0.03 call Player(15) call Player(12) return true endfunction function StructuredDD_addHandler takes code func returns nothing local integer index = 0 local integer tempDat set StructuredDD_conditionsIndex = StructuredDD_conditionsIndex + 1 set StructuredDD_conditions[StructuredDD_conditionsIndex] = Condition(func) loop exitwhen index > StructuredDD_maxDBIndex set tempDat = StructuredDD_bucketDB[index] call TriggerAddCondition(Bucket_trig[tempDat], StructuredDD_conditions[StructuredDD_conditionsIndex]) set index = index + 1 endloop endfunction function ini takes nothing returns nothing call StructuredDD_addHandler(ref_function_hand) endfunction function init_BeastAttack takes nothing returns boolean set BeastAttack_FX = "Objects\\Spawnmodels\\NightElf\\EntBirthTarget\\EntBirthTarget.mdl" set BeastAttack_BLOOD_FX = "Objects\\Spawnmodels\\Other\\HumanBloodCinematicEffect\\HumanBloodCinematicEffect.mdl" set BeastAttack_THUNDER_FX_BIG = "Abilities\\Weapons\\Bolt\\BoltImpact.mdl" set BeastAttack_THUNDER_FX = "Abilities\\Weapons\\FarseerMissile\\FarseerMissile.mdl" set BeastAttack_DOT_EXCLUSIVITY = 1650553963 set BeastAttack_THUNDER_EXCLUSIVITY = 1651799147 set BeastAttack_STUDDED_LEATHER_ID = 1227894833 set BeastAttack_BASE_DAMAGE = 50. set BeastAttack_LEATHER_DAMAGE_REDUCTION = 10. set BeastAttack_DAMAGE_PER_SECOND = 2. set BeastAttack_DOT_DURATION = 5. set BeastAttack_THUNDER_DURATION = 5. set BeastAttack_THUNDER_BONUS_MULTIPLIER = .2 call ini() return true endfunction function init_2 takes nothing returns nothing call TimerStart(CreateTimer(), BinocularVision_CLOCK_PERIOD, true, ref_function_act_2) endfunction function init_BinocularVision takes nothing returns boolean set BinocularVision_CLOCK_PERIOD = 1. / 4. set BinocularVision_OFFSET = 500. set BinocularVision_RADIUS = 600. call init_2() return true endfunction function init_3 takes nothing returns nothing call registerPlayerUnitEvent(EVENT_PLAYER_UNIT_SPELL_EFFECT, ref_function_act_3) endfunction function init_Blink takes nothing returns boolean set Blink_BLINK_ID = 1093677105 call init_3() return true endfunction function init_CameraControl takes nothing returns boolean set CameraControl_FILTER_MASK = "ReplaceableTextures\\CameraMasks\\White_mask.blp" set CameraControl_hunterFadeContinueTimer = null set CameraControl_hunterFadeFinishTimer = null set CameraControl_beastFadeContinueTimer = null set CameraControl_beastFadeFinishTimer = null return true endfunction function ObjectDefinition_setInt takes integer this_key, string modification, integer value returns nothing endfunction function ObjectDefinition_setReal takes integer this_key, string modification, real value returns nothing endfunction function ObjectDefinition_setString takes integer this_key, string modification, string value returns nothing endfunction function ObjectDefinition_setUnreal takes integer this_key, string modification, real value returns nothing endfunction function createObjectDefinition takes string fileType, integer newId, integer deriveFrom returns integer return 0 endfunction function create_w3u_h008 takes nothing returns nothing local integer u_key if MagicFunctions_compiletime then set u_key = createObjectDefinition("w3u", 1747988536, 1752659063) call ObjectDefinition_setString(u_key, "uabi", "Aloc") call ObjectDefinition_setReal(u_key, "usca", 1.3) call ObjectDefinition_setString(u_key, "upat", "") call ObjectDefinition_setString(u_key, "upap", "") call ObjectDefinition_setString(u_key, "uubs", "") call ObjectDefinition_setString(u_key, "umdl", "buildings\\human\\TownHall\\TownHall.mdl") call ObjectDefinition_setString(u_key, "uani", "upgrade,second") call ObjectDefinition_setString(u_key, "unam", "Castle") call ObjectDefinition_setString(u_key, "utar", "none") call ObjectDefinition_setInt(u_key, "ubdg", 0) call ObjectDefinition_setUnreal(u_key, "ucol", 0.0) call ObjectDefinition_setInt(u_key, "uhom", 1) else call CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 1747988536, - 1672.4, 2578.0, 230.626) endif endfunction function init_4 takes nothing returns nothing call create_w3u_h008() endfunction function init_Castle takes nothing returns boolean call init_4() return true endfunction function create_w3u_h00F takes nothing returns nothing local integer u_key if MagicFunctions_compiletime then set u_key = createObjectDefinition("w3u", 1747988550, 1752659063) call ObjectDefinition_setString(u_key, "uabi", "Aloc") call ObjectDefinition_setReal(u_key, "usca", 0.6) call ObjectDefinition_setString(u_key, "upat", "") call ObjectDefinition_setString(u_key, "upap", "") call ObjectDefinition_setString(u_key, "uubs", "") call ObjectDefinition_setString(u_key, "umdl", "buildings\\human\\TownHall\\TownHall.mdl") call ObjectDefinition_setString(u_key, "uani", "upgrade,second") call ObjectDefinition_setString(u_key, "unam", "Castle Small") call ObjectDefinition_setString(u_key, "utar", "none") call ObjectDefinition_setInt(u_key, "ubdg", 0) call ObjectDefinition_setUnreal(u_key, "ucol", 0.0) call ObjectDefinition_setInt(u_key, "uhom", 1) else call CreateUnit(Player(9), 1747988550, 3263.5, 4431.8, 206.900) endif endfunction function init_5 takes nothing returns nothing call create_w3u_h00F() endfunction function init_CastleSmall takes nothing returns boolean call init_5() return true endfunction function alloc_Slop takes nothing returns integer local integer this if Slop_firstFree == 0 then if Slop_maxIndex < 8191 then set Slop_maxIndex = Slop_maxIndex + 1 set this = Slop_maxIndex set Slop_typeId[this] = 38 else call error("Out of memory: Could not create Slop.") set this = 0 endif else set Slop_firstFree = Slop_firstFree - 1 set this = Slop_nextFree[Slop_firstFree] set Slop_typeId[this] = 38 endif return this endfunction function construct_Slop takes integer this returns nothing endfunction function new_Slop takes nothing returns integer local integer this = alloc_Slop() call construct_Slop(this) return this endfunction function SoundControl_preload takes string str returns nothing local timer time = CreateTimer() local integer s = new_Slop() set Slop_snd[s] = str call timer_setData(time, s) call TimerStart(time, .01, false, ref_function_SoundControl_preloadAfter) set time = null endfunction function ini_2 takes nothing returns nothing call SoundControl_preload(Cinematic_TIP_SOUND) call SoundControl_preload(Cinematic_START_SOUND) endfunction function init_Cinematic takes nothing returns boolean set Cinematic_TIP_SOUND = "Sound\\Interface\\SecretFound.wav" set Cinematic_START_SOUND = "Sound\\Interface\\QuestNew.wav" set Cinematic_TITLE_ONE = "|cffffcc00Uzapils Kingdom|r" set Cinematic_TITLE_TWO = "|cffffcc00Game Objective|r" set Cinematic_TITLE_THREE = "|cffffcc00Hunter Properties|r" set Cinematic_TITLE_BEAST_ONE = "|cffffcc00The Wilderness|r" set Cinematic_TITLE_BEAST_TWO = "|cffffcc00Game Objective|r" set Cinematic_TITLE_BEAST_THREE = "|cffffcc00Beast Properties|r" set Cinematic_HUMAN_INTRO_TEXT = "Sixty years ago, a rapid " + "human expansion occured: technology insights provided a " + "booming population. Humans developed, spreading out a kingdom, and " + "leaving gaps of wilderness. This sprawling empire made a peaceful relation " + "with the land." set Cinematic_FORTRESS_EXPOSITION = "The |cffffcc00Uzapils Fortress|r " + "is guarded by the royal military - two platoons of over six hundred inactive " + "militia, none of which have ever been in a real battle." set Cinematic_TOWNS_EXPOSITION = "A number of smaller towns dot " + "the landscape, with various populations and military capacities." set Cinematic_CLASS_DIVIDE_EXPOSITION = "A class divide caused strife within the kingdom. A group of rebels " + "stole an artifact, the |cffffcc00Rune of Imperialization|r. The " + "rebel group was terminated, but the rune hasn't been recovered." set Cinematic_EXPOSITION_BEAST_SITUATION = "A new species of |cffffcc00beast|r has began " + "attacking the kingdom, and with great success. The origin of " + "these beast uprisings seems to be nearest to |cffffcc00Hunter's Hall|r, a " + "rather unusual military situation." set Cinematic_HUNTERS_HALL_EXPOSITION = "The Hunter's Hall is a village " + "with a population of less than fifty. Most of these villagers are farmers and " + "merchants, but historically the town was founded by |cffffcc00Hunters|r - " + "survivalists accustomed to living on the land." set Cinematic_HUNTER_COMPARISON = "Hunters aren't as properly " + "equipped as the royal militia, but they can still stand their ground. Survival " + "isn't likely, but with some tactical planning, perhaps the Kingdom can be saved." set Cinematic_RUNE_LOCATION_EXPOSITION = "Our scouts inform us that " + "the Beasts are in possession of the |cffffcc00Rune of Imperialization|r. " + "We believe this is their source of power. Thus, reclaiming it will guarantee " + "hunter victory." set Cinematic_ROUND_OBJECTIVE_EXPLANATION = "Each battle is split into rounds " + "of four and a half minutes. If you slaughter all beasts, or reclaim the rune of " + "imperialization in time, the round is a hunter victory." set Cinematic_HUMAN_PROPERTIES = "You are a |cffffcc00Human|r - " + "humans can't see far away, and can only see allies who are nearby. Your vision is " + "greatly increased in the forward-facing direction." set Cinematic_BEAST_TELEPATHY = "Beasts, however, are telepathic, " + "and can sense you from all directions - you can't sneak up on them." set Cinematic_HOW_TO_SHOOT = "To shoot, use the " + "|cffffcc00A|rttack ability. Some weapon modes provide a " + "|cffffcc00channeling|r attack." set Cinematic_MINIMAP_X = 3805.65 set Cinematic_MINIMAP_Y = 4150.56 set Cinematic_MINIMAP_AOA = 275.20 set Cinematic_MINIMAP_DISTANCE = 1996.5 set Cinematic_FARM_X = 1384.73 set Cinematic_FARM_Y = 2189.64 set Cinematic_FARM_AOA = 320.63 set Cinematic_FARM_DISTANCE = 1024.52 set Cinematic_FARM_ROTATION = 58.39 set Cinematic_FOREST_X = 4165.56 set Cinematic_FOREST_Y = 87.24 set Cinematic_FOREST_AOA = 310.20 set Cinematic_FOREST_DISTANCE = 931.38 set Cinematic_CASTLE_X = 3250. set Cinematic_CASTLE_Y = 4420. set Cinematic_NORTH_X = 4050. set Cinematic_NORTH_Y = 4660. set Cinematic_SOUTH_X = 3180. set Cinematic_SOUTH_Y = 3700. set Cinematic_MTN_X = 3730. set Cinematic_MTN_Y = 3940. set Cinematic_HALL_X = 4320. set Cinematic_HALL_Y = 4170. set Cinematic_RED_X = 4630. set Cinematic_RED_Y = 3750. set Cinematic_tipSound = CreateSound(Cinematic_TIP_SOUND, false, false, false, 255, 255, "") set Cinematic_startSound = CreateSound(Cinematic_START_SOUND, false, false, false, 255, 255, "") set Cinematic_humanClock = CreateTimer() set Cinematic_beastClock = CreateTimer() set Cinematic_enabled = false set Cinematic_over = false call ini_2() return true endfunction function int_toString takes integer this returns string return I2S(this) endfunction function alloc_Table takes nothing returns integer local integer this if Table_firstFree == 0 then if Table_maxIndex < 8191 then set Table_maxIndex = Table_maxIndex + 1 set this = Table_maxIndex set Table_typeId[this] = 45 else call error("Out of memory: Could not create Table.") set this = 0 endif else set Table_firstFree = Table_firstFree - 1 set this = Table_nextFree[Table_firstFree] set Table_typeId[this] = 45 endif return this endfunction function construct_Table takes integer this returns nothing endfunction function new_Table takes nothing returns integer local integer this = alloc_Table() call construct_Table(this) return this endfunction function init_Colors takes nothing returns boolean local integer i = 0 local integer i2 loop exitwhen i > 9 call int_toString(i) set i = i + 1 endloop set Colors_decs = new_Table() set i2 = 0 loop exitwhen i2 > 9 call dispatch_Table_Table_Table_saveInt(Colors_decs, StringHash(int_toString(i2)), i2) set i2 = i2 + 1 endloop call dispatch_Table_Table_Table_saveInt(Colors_decs, StringHash("A"), 10) call dispatch_Table_Table_Table_saveInt(Colors_decs, StringHash("B"), 11) call dispatch_Table_Table_Table_saveInt(Colors_decs, StringHash("C"), 12) call dispatch_Table_Table_Table_saveInt(Colors_decs, StringHash("D"), 13) call dispatch_Table_Table_Table_saveInt(Colors_decs, StringHash("E"), 14) call dispatch_Table_Table_Table_saveInt(Colors_decs, StringHash("F"), 15) return true endfunction function init_DamageOverTime takes nothing returns boolean set DamageOverTime_CLOCK_PERIOD = .5 set DamageOverTime_FX_FLAG_ATTACH = 0 set DamageOverTime_FX_FLAG_COORDS = 1 set DamageOverTime_dbIndex = -1 set DamageOverTime_time = CreateTimer() return true endfunction function ini_3 takes nothing returns nothing local group grp = CreateGroup() local region reg = CreateRegion() local trigger addBracer = CreateTrigger() local unit iter call RegionAddRect(reg, bj_mapInitialPlayableArea) call TriggerRegisterEnterRegion(addBracer, reg, null) call TriggerAddCondition(addBracer, Condition(ref_function_DamageType_c)) call StructuredDD_addHandler(ref_function_DamageType_handler) call GroupEnumUnitsInRect(grp, bj_mapInitialPlayableArea, null) loop set iter = FirstOfGroup(grp) exitwhen iter == null call UnitAddAbility(iter, DamageType_DAMAGE_TYPE_CHECK_ID) call UnitMakeAbilityPermanent(iter, true, DamageType_DAMAGE_TYPE_CHECK_ID) call GroupRemoveUnit(grp, iter) endloop call DestroyGroup(grp) set grp = null set reg = null set addBracer = null set iter = null endfunction function init_DamageType takes nothing returns boolean set DamageType_USE_BONUS_CALCULATOR = false set DamageType_DAMAGE_TYPE_CHECK_ID = 1093677112 set DamageType_NULLED = -1 set DamageType_ATTACK = 0 set DamageType_SPELL = 1 set DamageType_CODE = 2 set DamageType_ATTACK_TYPE_UNIVERSAL = ConvertAttackType(7) set DamageType_DELAY_AMOUNT = 0. set DamageType_lastDamageType = DamageType_NULLED call ini_3() return true endfunction function ini_4 takes nothing returns nothing local integer index = 1 if DummyUnitStack_DO_PIC then loop exitwhen index > DummyUnitStack_PRELOAD_INIT_COUNT call DummyUnitStack_add(true) set index = index + 1 endloop endif if DummyUnitStack_DO_IDPC then set DummyUnitStack_deferredTodoCount = DummyUnitStack_INITIAL_DEFERRED_PRELOAD_COUNT call TimerStart(DummyUnitStack_clock, DummyUnitStack_CLOCK_PERIOD, true, ref_function_DummyUnitStack_deferredPreloader) endif endfunction function init_DummyUnitStack takes nothing returns boolean set DummyUnitStack_DUMMY_UNIT_ID = 1966092336 set DummyUnitStack_MIN_PRELOAD_BLOCK_SIZE = 10 set DummyUnitStack_PRELOAD_INIT_COUNT = 200 set DummyUnitStack_DO_PIC = true set DummyUnitStack_DYNAMIC_DEFERRED_PRELOAD_COUNT = 10 set DummyUnitStack_DO_DDPC = true set DummyUnitStack_INITIAL_DEFERRED_PRELOAD_COUNT = 20 set DummyUnitStack_DO_IDPC = false set DummyUnitStack_MAX_PRELOADED_UNITS = 5000 set DummyUnitStack_DO_MPU = true set DummyUnitStack_SAFE_LOC_X = - 5650. set DummyUnitStack_SAFE_LOC_Y = 5565. set DummyUnitStack_CLOCK_PERIOD = 1. / 60. set DummyUnitStack_stackIndex = -1 set DummyUnitStack_deferredTodoCount = 0 set DummyUnitStack_clock = CreateTimer() call ini_4() return true endfunction function init_ErrorHandling takes nothing returns boolean set ErrorHandling_MUTE_ERROR_DURATION = 60 set ErrorHandling_PRIMARY_ERROR_KEY = -1 return true endfunction function init_6 takes nothing returns nothing local trigger t = CreateTrigger() local integer index = 0 loop exitwhen index >= Players_COUNT call TriggerRegisterPlayerEvent(t, Players_fromId[index], EVENT_PLAYER_END_CINEMATIC) set index = index + 1 endloop call TriggerAddCondition(t, Condition(ref_function_c)) set t = null endfunction function init_EscapeKey takes nothing returns boolean call init_6() return true endfunction function ini_5 takes nothing returns nothing local integer index = 0 call TimerStart(CreateTimer(), 1., true, ref_function_Game_countSeconds) loop exitwhen index >= Players_COUNT set Game_escapesPressed[index] = false set index = index + 1 endloop call SoundControl_preload(Game_WIN_SOUND) call SoundControl_preload(Game_DEF_SOUND) call SoundControl_preload(Game_BEAST_VICTORY) call SoundControl_preload(Game_HUNTER_VICTORY) endfunction function init_Game takes nothing returns boolean set Game_WIN_SOUND = "Sound\\Interface\\ClanInvitation.wav" set Game_DEF_SOUND = "Sound\\Interface\\QuestFailed.wav" set Game_BEAST_VICTORY = "beast-victory.mp3" set Game_HUNTER_VICTORY = "hunter-victory.mp3" set Game_BEAST_PLACE_OFFSET = 300. set Game_VICTORY_SOUND_DELAY = 2. set Game_TEAM_HUNTERS = 0 set Game_TEAM_BEASTS = 1 set Game_POST_ROUND_DELAY = 5. set Game_POST_GAME_DELAY = 10. set Game_START_DELAY = .5 set Game_ROUND_DURATION = R2I(60. * 4.5) set Game_postRoundTimer = CreateTimer() set Game_roundsToWin = 0 set Game_singlePlayer = false set Game_roundEnabled = false call ini_5() return true endfunction function init_GameTimer takes nothing returns boolean set GameTimer_gameTimer = CreateTimer() call timer_start(GameTimer_gameTimer, 100000., null) call timer_startPeriodic(CreateTimer(), Basics_ANIMATION_PERIOD, ref_function_GameTimer_closure_impl) return true endfunction function i takes nothing returns nothing call registerPlayerUnitEvent(EVENT_PLAYER_UNIT_DEATH, ref_function_a) endfunction function init_HeroDeath takes nothing returns boolean set HeroDeath_CONTRACT_ID = 1227894834 set HeroDeath_GOLD_BONUS = 30 set HeroDeath_GOLD_BONUS_LESSER = 15 set HeroDeath_MAJOR_CONTRACT_BONUS = 50 set HeroDeath_MINOR_CONTRACT_BONUS = 25 call CreateTimer() call i() return true endfunction function init_7 takes nothing returns nothing call registerPlayerUnitEvent(EVENT_PLAYER_UNIT_SPELL_EFFECT, ref_function_act_4) endfunction function init_HunterAttack takes nothing returns boolean set HunterAttack_SPREAD_ARC = bj_PI / 48. set HunterAttack_JITTER = bj_PI / 24. set HunterAttack_SEPARATION_ARC = bj_PI / 8. set HunterAttack_SEPARATION_RADIUS = 32. set HunterAttack_AUTO_RATE = 1. / 4. set HunterAttack_POST_BURST_DELAY = 1. / 4. set HunterAttack_BURST_ID = 1093677122 set HunterAttack_logicalClock = new_Table() call init_7() return true endfunction function HunterCamera_resetKernel takes nothing returns nothing local integer index = 0 local integer j loop exitwhen index >= Players_COUNT set HunterCamera_kernelIndex[index] = 0 set j = 0 loop exitwhen j >= HunterCamera_KERNEL_SIZE set HunterCamera_kernel[index * HunterCamera_KERNEL_SIZE + j] = 270. set j = j + 1 endloop set index = index + 1 endloop endfunction function ini_6 takes nothing returns nothing call TimerStart(CreateTimer(), HunterCamera_CLOCK_PERIOD, true, ref_function_act_5) call HunterCamera_resetKernel() endfunction function init_HunterCamera takes nothing returns boolean set HunterCamera_CLOCK_PERIOD = 1. / 3. set HunterCamera_OFFSET_STATIC = 300. set HunterCamera_OFFSET_JITTER = 80. set HunterCamera_OFFSET_DYNAMIC = 400. set HunterCamera_JITTER_THRESHOLD = bj_PI / 3. set HunterCamera_KERNEL_SIZE = 4 call ini_6() return true endfunction function init_8 takes nothing returns nothing call registerPlayerUnitEvent(EVENT_PLAYER_UNIT_SPELL_EFFECT, ref_function_act_6) call SoundControl_preload(HunterToggle_TOGGLE_SOUND) endfunction function init_HunterToggle takes nothing returns boolean set HunterToggle_TOGGLE_SOUND = "Abilities\\Spells\\Human\\Defend\\DefendCaster.wav" set HunterToggle_TOGGLE_ID = 1093677124 set HunterToggle_BURST_ID = 1093677122 set HunterToggle_AUTO_ID = 1093677123 call init_8() return true endfunction function create_w3u_h00B takes nothing returns nothing local integer u_key if MagicFunctions_compiletime then set u_key = createObjectDefinition("w3u", 1747988546, 1752659063) call ObjectDefinition_setString(u_key, "uabi", "Aloc") call ObjectDefinition_setReal(u_key, "usca", 1.45) call ObjectDefinition_setString(u_key, "upat", "") call ObjectDefinition_setString(u_key, "upap", "") call ObjectDefinition_setString(u_key, "uubs", "") call ObjectDefinition_setString(u_key, "umdl", "buildings\\nightelf\\HuntersHall\\HuntersHall.mdl") call ObjectDefinition_setString(u_key, "uani", "upgrade,second") call ObjectDefinition_setString(u_key, "unam", "Hunter's Hall") call ObjectDefinition_setString(u_key, "utar", "none") call ObjectDefinition_setInt(u_key, "ubdg", 0) call ObjectDefinition_setUnreal(u_key, "ucol", 0.0) call ObjectDefinition_setInt(u_key, "uhom", 1) else call CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 1747988546, - 1449.8, 3809.9, 257.457) endif endfunction function init_9 takes nothing returns nothing call create_w3u_h00B() endfunction function init_HuntersHall takes nothing returns boolean call init_9() return true endfunction function removeWalkability takes nothing returns nothing local real i_2 = Initialization_tempX - Initialization_OBELISK_PATH_RADIUS local real j loop exitwhen i_2 > Initialization_tempX + Initialization_OBELISK_PATH_RADIUS set j = Initialization_tempY - Initialization_OBELISK_PATH_RADIUS loop exitwhen j > Initialization_tempY + Initialization_OBELISK_PATH_RADIUS if TerrainData_distanceBetweenXY(Initialization_tempX, i_2, Initialization_tempY, j) <= Initialization_OBELISK_PATH_RADIUS then call SetTerrainPathable(i_2, j, PATHING_TYPE_WALKABILITY, false) endif set j = j + Initialization_PATH_ITERATE_SIZE endloop set i_2 = i_2 + Initialization_PATH_ITERATE_SIZE endloop endfunction function ini_7 takes nothing returns nothing local integer i_2 local integer j local unit iter local unit dum local real ang set Initialization_diaClick = CreateTrigger() set Initialization_dialo = DialogCreate() call TriggerAddAction(Initialization_diaClick, ref_function_diaA) call SetTimeOfDayScale(0.) call TimerStart(CreateTimer(), Game_START_DELAY, false, ref_function_afterDelay) call GroupEnumUnitsOfPlayer(Initialization_grp, Players_fromId[Players_MARKERS], null) loop set iter = FirstOfGroup(Initialization_grp) exitwhen iter == null call RemoveUnit(iter) call GroupRemoveUnit(Initialization_grp, iter) endloop if Players_playingCount - Players_aiCount == 1 then set Game_singlePlayer = true endif if Players_playingCount == 1 and Initialization_SINGLEPLAYER_ADD_AI then if Players_playing[0] or Players_playing[1] or Players_playing[2] then call AI_addPlayer(Players_fromId[Players_FIRST_BEAST]) set Players_playing[Players_FIRST_BEAST] = true else call AI_addPlayer(Players_fromId[Players_FIRST_HUNTER]) set Players_playing[Players_FIRST_HUNTER] = true endif endif set i_2 = 0 loop exitwhen i_2 >= Initialization_PILLAR_GROUP_COUNT set j = 0 loop exitwhen j >= Initialization_PILLARS_PER_GROUP set ang = Initialization_PHASE + 2. * bj_PI * i_2 / Initialization_PILLAR_GROUP_COUNT - Initialization_GROUP_SEPARATION_ANGLE + j * Initialization_GROUP_SEPARATION_ANGLE set Initialization_tempX = TerrainData_RUNE_1_X + Initialization_RADIUS * Cos(ang) set Initialization_tempY = TerrainData_RUNE_1_Y + Initialization_RADIUS * Sin(ang) call CreateUnit(Players_fromId[Players_PASSIVE], Initialization_OBELISK_ID, Initialization_tempX, Initialization_tempY, (ang + Initialization_OBELISK_FACING_PHASE) * bj_RADTODEG) if j == R2I(Initialization_PILLARS_PER_GROUP * 1. / 2) then set dum = DummyUnitStack_get() call SetUnitX(dum, Initialization_tempX) call SetUnitY(dum, Initialization_tempY) call SetUnitFlyHeight(dum, Initialization_ORB_HEIGHT, 0.) call AddSpecialEffectTarget(Initialization_ORB_FX, dum, "overhead") endif call ExecuteFunc("removeWalkability") set j = j + 1 endloop set i_2 = i_2 + 1 endloop set i_2 = 0 loop exitwhen i_2 >= Initialization_PILLAR_GROUP_COUNT set j = 0 loop exitwhen j >= Initialization_PILLARS_PER_GROUP set ang = Initialization_PHASE + 2. * bj_PI * i_2 / Initialization_PILLAR_GROUP_COUNT - Initialization_GROUP_SEPARATION_ANGLE + j * Initialization_GROUP_SEPARATION_ANGLE set Initialization_tempX = TerrainData_RUNE_2_X + Initialization_RADIUS2 * Cos(ang) set Initialization_tempY = TerrainData_RUNE_2_Y + Initialization_RADIUS2 * Sin(ang) call CreateUnit(Players_fromId[Players_PASSIVE], Initialization_OBELISK_ID, Initialization_tempX, Initialization_tempY, (ang + Initialization_OBELISK_FACING_PHASE) * bj_RADTODEG) if j == R2I(Initialization_PILLARS_PER_GROUP * 1. / 2) then set dum = DummyUnitStack_get() call SetUnitX(dum, Initialization_tempX) call SetUnitY(dum, Initialization_tempY) call SetUnitFlyHeight(dum, Initialization_ORB_HEIGHT, 0.) call AddSpecialEffectTarget(Initialization_ORB_FX, dum, "overhead") endif call ExecuteFunc("removeWalkability") set j = j + 1 endloop set i_2 = i_2 + 1 endloop set i_2 = 0 loop exitwhen i_2 >= Initialization_PILLAR_GROUP_COUNT_BEAST_SPAWN set j = 0 loop exitwhen j >= Initialization_PILLARS_PER_GROUP set ang = Initialization_PHASE + 2. * bj_PI * i_2 / Initialization_PILLAR_GROUP_COUNT_BEAST_SPAWN - Initialization_GROUP_SEPARATION_ANGLE + j * Initialization_GROUP_SEPARATION_ANGLE set Initialization_tempX = TerrainData_BEAST_SPAWN_X + Initialization_RADIUS * Cos(ang) set Initialization_tempY = TerrainData_BEAST_SPAWN_Y + Initialization_RADIUS * Sin(ang) call CreateUnit(Players_fromId[Players_PASSIVE], Initialization_OBELISK_ID, Initialization_tempX, Initialization_tempY, (ang + Initialization_OBELISK_FACING_PHASE) * bj_RADTODEG) if j == R2I(Initialization_PILLARS_PER_GROUP * 1. / 2) then set dum = DummyUnitStack_get() call SetUnitX(dum, Initialization_tempX) call SetUnitY(dum, Initialization_tempY) call SetUnitFlyHeight(dum, Initialization_ORB_HEIGHT, 0.) call AddSpecialEffectTarget(Initialization_ORB_FX, dum, "overhead") endif call ExecuteFunc("removeWalkability") set j = j + 1 endloop set i_2 = i_2 + 1 endloop set Units_artifact = CreateItem(Units_ARTIFACT_ID, TerrainData_RUNE_1_X, TerrainData_RUNE_1_Y) set Units_artifact2 = CreateItem(Units_ARTIFACT_ID, TerrainData_RUNE_2_X, TerrainData_RUNE_2_Y) set i_2 = 0 loop exitwhen i_2 >= Players_COUNT if Players_aiControlled[i_2] then call AI_addPlayer(Players_fromId[i_2]) endif set i_2 = i_2 + 1 endloop set i_2 = 0 loop exitwhen i_2 >= Players_FIRST_BEAST call SetPlayerState(Players_fromId[i_2], PLAYER_STATE_RESOURCE_GOLD, Initialization_HUNTER_STARTING_GOLD) set i_2 = i_2 + 1 endloop set iter = null set dum = null endfunction function init_Initialization takes nothing returns boolean set Initialization_ORB_FX = "Abilities\\Weapons\\ChimaeraAcidMissile\\ChimaeraAcidMissile.mdl" set Initialization_SINGLEPLAYER_ADD_AI = true set Initialization_PILLAR_GROUP_COUNT = 7 set Initialization_PILLAR_GROUP_COUNT_BEAST_SPAWN = 5 set Initialization_PILLARS_PER_GROUP = 3 set Initialization_OBELISK_ID = 1747988535 set Initialization_HUNTER_STARTING_GOLD = 1000 set Initialization_PHASE = - (1. * bj_PI / 2.) set Initialization_OBELISK_FACING_PHASE = bj_PI / 4. set Initialization_GROUP_SEPARATION_ANGLE = bj_PI / 24. set Initialization_RADIUS = 550. set Initialization_RADIUS2 = 450. set Initialization_OBELISK_PATH_RADIUS = 32. set Initialization_PATH_ITERATE_SIZE = 8. set Initialization_ORB_HEIGHT = 100. set Initialization_grp = CreateGroup() set Initialization_voteTimer = CreateTimer() set Initialization_votesCounted = 0 call ini_7() return true endfunction function init_10 takes nothing returns nothing call TimerStart(CreateTimer(), 1., true, ref_function_checkCombatDuration) endfunction function init_ItemFieldConditioningKit takes nothing returns boolean set ItemFieldConditioningKit_DUST_ID = 1227894836 set ItemFieldConditioningKit_COMBAT_TIME = 5 call CreateTimer() set ItemFieldConditioningKit_damageTimings = new_Table() call init_10() return true endfunction function create_w3u_h00G takes nothing returns nothing local integer u_key if MagicFunctions_compiletime then set u_key = createObjectDefinition("w3u", 1747988551, 1752659063) call ObjectDefinition_setString(u_key, "uabi", "Aloc") call ObjectDefinition_setReal(u_key, "usca", 0.5) call ObjectDefinition_setString(u_key, "upat", "") call ObjectDefinition_setString(u_key, "upap", "") call ObjectDefinition_setString(u_key, "uubs", "") call ObjectDefinition_setString(u_key, "umdl", "buildings\\human\\TownHall\\TownHall.mdl") call ObjectDefinition_setString(u_key, "uani", "upgrade,first") call ObjectDefinition_setString(u_key, "unam", "Keep Small") call ObjectDefinition_setString(u_key, "utar", "none") call ObjectDefinition_setInt(u_key, "ubdg", 0) call ObjectDefinition_setUnreal(u_key, "ucol", 0.0) call ObjectDefinition_setInt(u_key, "uhom", 1) else call CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 1747988551, 4054.6, 4663.3, 329.050) call CreateUnit(Player(8), 1747988551, 3745.4, 3938.7, 232.990) endif endfunction function init_11 takes nothing returns nothing call create_w3u_h00G() endfunction function init_KeepSmall takes nothing returns boolean call init_11() return true endfunction function init_12 takes nothing returns nothing call registerPlayerUnitEvent(EVENT_PLAYER_UNIT_SPELL_EFFECT, ref_function_act_7) endfunction function init_Knife takes nothing returns boolean set Knife_KNIFE_ID = 1093677106 set Knife_FX = "Abilities\\Weapons\\ShadowHunterMissile\\ShadowHunterMissile.mdl" set Knife_FX_PROC = "Abilities\\Weapons\\HydraliskImpact\\HydraliskImpact.mdl" set Knife_FX_EXPLODED = "Objects\\Spawnmodels\\Human\\HumanLargeDeathExplode\\HumanLargeDeathExplode.mdl" set Knife_FX_PROC_ATTACH_POINT = "chest" set Knife_OFFSET = 70. set Knife_EFFECT_HEIGHT = 50. set Knife_FX_DURATION = 1.6 set Knife_RADIUS = 75. set Knife_EXECUTE_MAX_HEALTH = 60. set Knife_BASE_DAMAGE = 35. set Knife_SHORT_COOLDOWN = 5. set Knife_grp = CreateGroup() call init_12() return true endfunction function init_MagicFunctions takes nothing returns boolean set MagicFunctions_compiletime = false return true endfunction function create_w3u_h00A takes nothing returns nothing local integer u_key if MagicFunctions_compiletime then set u_key = createObjectDefinition("w3u", 1747988545, 1752659063) call ObjectDefinition_setReal(u_key, "usca", 0.9) call ObjectDefinition_setString(u_key, "upat", "") call ObjectDefinition_setString(u_key, "upap", "") call ObjectDefinition_setString(u_key, "uubs", "") call ObjectDefinition_setString(u_key, "umdl", "buildings\\other\\Marketplace\\Marketplace.mdl") call ObjectDefinition_setString(u_key, "unam", "Market") call ObjectDefinition_setUnreal(u_key, "ucol", 0.0) call ObjectDefinition_setString(u_key, "uabi", "Ane2,Avul") call ObjectDefinition_setInt(u_key, "uhpm", 1000000000) call ObjectDefinition_setString(u_key, "urac", "other") call ObjectDefinition_setString(u_key, "utyp", "mechanical,neutral") call ObjectDefinition_setInt(u_key, "unbm", 1) call ObjectDefinition_setString(u_key, "usei", "I001,I004,I003,I002") call ObjectDefinition_setString(u_key, "usnd", "Marketplace") else call CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 1747988545, - 2610.4, 2967.1, 205.869) endif endfunction function init_13 takes nothing returns nothing call create_w3u_h00A() endfunction function init_Marketplace takes nothing returns boolean call init_13() return true endfunction function init_Math takes nothing returns boolean set Math_DELTA = .0001 return true endfunction function init_Maths takes nothing returns boolean set Maths_PI = 3.141592654 return true endfunction function init_14 takes nothing returns nothing call TimerStart(CreateTimer(), MinimapVisionHints_CLOCK_PERIOD, true, ref_function_update) endfunction function init_MinimapVisionHints takes nothing returns boolean set MinimapVisionHints_CLOCK_PERIOD = 1. / 4. set MinimapVisionHints_RADIUS = 350. set MinimapVisionHints_CHECK_RADIUS = 2500. call init_14() return true endfunction function init_15 takes nothing returns nothing call TimerStart(CreateTimer(), 0., false, ref_function_act_8) endfunction function init_MultiboardControl takes nothing returns boolean set MultiboardControl_time = CreateTimer() call init_15() return true endfunction function init_Muscii takes nothing returns boolean set Muscii_dbIndex = -1 return true endfunction function alloc_Note takes nothing returns integer local integer this if Note_firstFree == 0 then if Note_maxIndex < 8191 then set Note_maxIndex = Note_maxIndex + 1 set this = Note_maxIndex set Note_typeId[this] = 25 else call error("Out of memory: Could not create Note.") set this = 0 endif else set Note_firstFree = Note_firstFree - 1 set this = Note_nextFree[Note_firstFree] set Note_typeId[this] = 25 endif return this endfunction function construct_Note takes integer this returns nothing endfunction function new_Note takes nothing returns integer local integer this = alloc_Note() call construct_Note(this) return this endfunction function Note_create takes string path, integer volume, real pitch returns integer local integer t = new_Note() set Note_path[t] = path set Note_volume[t] = volume set Note_pitch[t] = pitch set Note_next[t] = 0 return t endfunction function alloc_Chord takes nothing returns integer local integer this if Chord_firstFree == 0 then if Chord_maxIndex < 8191 then set Chord_maxIndex = Chord_maxIndex + 1 set this = Chord_maxIndex set Chord_typeId[this] = 20 else call error("Out of memory: Could not create Chord.") set this = 0 endif else set Chord_firstFree = Chord_firstFree - 1 set this = Chord_nextFree[Chord_firstFree] set Chord_typeId[this] = 20 endif return this endfunction function construct_Chord takes integer this returns nothing endfunction function new_Chord takes nothing returns integer local integer this = alloc_Chord() call construct_Chord(this) return this endfunction function Chord_create takes integer n returns integer local integer q = Note_create(Note_path[n], Note_volume[n], Note_pitch[n]) local integer c_2 = new_Chord() set Chord_next[c_2] = 0 set Chord_first[c_2] = q set Chord_last[c_2] = q return c_2 endfunction function Note_copy takes integer this returns integer return Note_create(Note_path[this], Note_volume[this], Note_pitch[this]) endfunction function dispatch_Note_Muscii_Note_copy takes integer this returns integer local integer Muscii_Note_copy_result if Note_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Note.Muscii_Note_copy") else call error("Called Note.Muscii_Note_copy on invalid object.") endif endif set Muscii_Note_copy_result = Note_copy(this) return Muscii_Note_copy_result endfunction function Chord_addNote takes integer this, integer n returns integer local integer copy = dispatch_Note_Muscii_Note_copy(n) local integer temp = Chord_last[this] set Note_next[temp] = copy return this endfunction function dispatch_Chord_Muscii_Chord_addNote takes integer this, integer n returns integer local integer Muscii_Chord_addNote_result if Chord_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Chord.Muscii_Chord_addNote") else call error("Called Chord.Muscii_Chord_addNote on invalid object.") endif endif set Muscii_Chord_addNote_result = Chord_addNote(this, n) return Muscii_Chord_addNote_result endfunction function Chord_copy takes integer this returns integer local integer iterator = Chord_first[this] local integer new = Chord_create(iterator) loop set iterator = Note_next[iterator] exitwhen iterator == 0 call dispatch_Chord_Muscii_Chord_addNote(new, iterator) endloop return new endfunction function dispatch_Chord_Muscii_Chord_copy takes integer this returns integer local integer Muscii_Chord_copy_result if Chord_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Chord.Muscii_Chord_copy") else call error("Called Chord.Muscii_Chord_copy on invalid object.") endif endif set Muscii_Chord_copy_result = Chord_copy(this) return Muscii_Chord_copy_result endfunction function alloc_Muscii takes nothing returns integer local integer this if Muscii_firstFree == 0 then if Muscii_maxIndex < 8191 then set Muscii_maxIndex = Muscii_maxIndex + 1 set this = Muscii_maxIndex set Muscii_typeId[this] = 21 else call error("Out of memory: Could not create Muscii.") set this = 0 endif else set Muscii_firstFree = Muscii_firstFree - 1 set this = Muscii_nextFree[Muscii_firstFree] set Muscii_typeId[this] = 21 endif return this endfunction function construct_Muscii takes integer this returns nothing endfunction function new_Muscii takes nothing returns integer local integer this = alloc_Muscii() call construct_Muscii(this) return this endfunction function Muscii_create takes integer c_2, real tempo returns integer local integer m = new_Muscii() local integer cop = dispatch_Chord_Muscii_Chord_copy(c_2) set Muscii_first[m] = cop set Muscii_last[m] = cop set Muscii_iterator[m] = cop set Muscii_tempo[m] = tempo set Muscii_clock[m] = CreateTimer() set Muscii_queued[m] = 0 set Muscii_cbf[m] = 0 call timer_setData(Muscii_clock[m], m) set Muscii_dbIndex = Muscii_dbIndex + 1 return m endfunction function Muscii_addChord takes integer this, integer c_2 returns integer local integer q = Muscii_last[this] local integer copy = dispatch_Chord_Muscii_Chord_copy(c_2) set Chord_next[q] = copy set Muscii_last[this] = copy return this endfunction function dispatch_Muscii_Muscii_Muscii_addChord takes integer this, integer c_2 returns integer local integer Muscii_Muscii_addChord_result if Muscii_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling Muscii.Muscii_Muscii_addChord") else call error("Called Muscii.Muscii_Muscii_addChord on invalid object.") endif endif set Muscii_Muscii_addChord_result = Muscii_addChord(this, c_2) return Muscii_Muscii_addChord_result endfunction function initializeGameMusic takes nothing returns nothing local integer hat = Note_create(Music_HI_HAT_HIT_CLOSED, 90, 1.) local integer nul = Note_create(Music_HI_HAT_HIT_CLOSED, 0, 1.) local integer tm1 = Note_create(Music_TOM_1_HIT, 110, 1.) local integer tm4 = Note_create(Music_TOM_4_HIT, 110, 1.) local integer t1 = Chord_create(tm1) local integer t4 = Chord_create(tm4) local integer z = Chord_create(nul) local integer h = Chord_create(hat) set Music_m = Muscii_create(t1, 240.) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t1) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, h) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t4) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t4) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, h) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t1) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t1) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, h) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t4) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t4) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t1) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t1) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t1) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t4) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t4) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t4) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t1) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t1) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, h) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t4) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, t4) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, h) call dispatch_Muscii_Muscii_Muscii_addChord(Music_m, z) endfunction function initializeVoteMusic takes nothing returns nothing local integer tm4 = Note_create(Music_TOM_4_HIT, 80, 1.) local integer tm1 = Note_create(Music_TOM_1_HIT, 80, 1.) local integer nul = Note_create(Music_HI_HAT_HIT_CLOSED, 0, 1.) local integer t4 = Chord_create(tm4) local integer t1 = Chord_create(tm1) local integer z = Chord_create(nul) set Music_v = Muscii_create(t4, 120.) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, t1) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, t4) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, t4) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, t1) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, t4) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, t1) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, z) call dispatch_Muscii_Muscii_Muscii_addChord(Music_v, z) endfunction function i_2 takes nothing returns nothing call initializeVoteMusic() call initializeGameMusic() call playVoteMusic() call SoundControl_preload(Music_HI_HAT_HIT_CLOSED) call SoundControl_preload(Music_TOM_1_HIT) call SoundControl_preload(Music_TOM_4_HIT) endfunction function init_Music takes nothing returns boolean set Music_HI_HAT_HIT_CLOSED = "musRad-khatClosed.mp3" set Music_TOM_1_HIT = "musRad-tom1.mp3" set Music_TOM_4_HIT = "musRad-tom4.mp3" call i_2() return true endfunction function init_16 takes nothing returns nothing call registerPlayerUnitEvent(EVENT_PLAYER_UNIT_SPELL_EFFECT, ref_function_act_9) endfunction function init_Net takes nothing returns boolean set Net_NET_FX = "Abilities\\Spells\\Orc\\Ensnare\\ensnareTarget.mdl" set Net_NET_MODEL = "Abilities\\Spells\\Orc\\Ensnare\\EnsnareMissile.mdl" set Net_NET_ID = 1093677110 set Net_NET_SLOW_ID = 1093677109 set Net_EXCLUSIVITY_NET = 1752065396 set Net_RADIUS = 200. set Net_CLOCK_PERIOD = 1. / 30. set Net_NET_VELOCITY = 600. set Net_COLLISION_RADIUS = 80. set Net_MAX_DISTANCE = 500. set Net_grp = CreateGroup() set Net_clock = CreateTimer() set Net_dbIndex = -1 call init_16() return true endfunction function trigger_addCondition takes trigger this, boolexpr condition returns nothing call TriggerAddCondition(this, condition) endfunction function trigger_registerAnyUnitEvent takes trigger this, playerunitevent whichEvent returns nothing call TriggerRegisterAnyUnitEventBJ(this, whichEvent) endfunction function init_17 takes nothing returns nothing local trigger trig = CreateTrigger() local trigger receiver = trig local trigger receiver_2 call trigger_registerAnyUnitEvent(receiver, EVENT_PLAYER_UNIT_PICKUP_ITEM) set receiver_2 = receiver call trigger_addCondition(receiver_2, Condition(ref_function_act_10)) set trig = null set receiver = null set receiver_2 = null endfunction function init_NoItemDuplicates takes nothing returns boolean call init_17() return true endfunction function alloc_IdGenerator takes nothing returns integer local integer this if IdGenerator_firstFree == 0 then if IdGenerator_maxIndex < 8191 then set IdGenerator_maxIndex = IdGenerator_maxIndex + 1 set this = IdGenerator_maxIndex else call error("Out of memory: Could not create IdGenerator.") set this = 0 endif else set IdGenerator_firstFree = IdGenerator_firstFree - 1 set this = IdGenerator_nextFree[IdGenerator_firstFree] endif return this endfunction function construct_IdGenerator takes integer this, integer start returns nothing endfunction function new_IdGenerator takes integer start returns integer local integer this = alloc_IdGenerator() call construct_IdGenerator(this, start) return this endfunction function init_ObjectIdGenerator takes nothing returns boolean call new_IdGenerator(1932537904) call new_IdGenerator(1261449264) call new_IdGenerator(1098395696) call new_IdGenerator(1177563184) call new_IdGenerator(1328558128) return true endfunction function init_ObjectIds takes nothing returns boolean return true endfunction function init_18 takes nothing returns nothing call registerPlayerUnitEvent(EVENT_PLAYER_UNIT_SPELL_EFFECT, ref_function_act_11) endfunction function init_OrganicConcatenation takes nothing returns boolean set OrganicConcatenation_IMAGE_SOUND = "Abilities\\Spells\\Orc\\MirrorImage\\MirrorImage.wav" set OrganicConcatenation_CONCATENATION_ID = 1093677131 set OrganicConcatenation_BEAST_ILLUSION_ID = 1747988549 set OrganicConcatenation_DURATION = .5 set OrganicConcatenation_RANGE = 300. set OrganicConcatenation_PHASE_OFFSET = 16. set OrganicConcatenation_CLOCK_PERIOD = 1. / 30. set OrganicConcatenation_ddIndex = -1 set OrganicConcatenation_clock = CreateTimer() call init_18() return true endfunction function init_19 takes nothing returns nothing call registerPlayerUnitEvent(EVENT_PLAYER_UNIT_SPELL_EFFECT, ref_function_act_12) call SoundControl_preload(OrganicHemisection_IMAGE_SOUND) endfunction function init_OrganicHemisection takes nothing returns boolean set OrganicHemisection_IMAGE_SOUND = "Abilities\\Spells\\Orc\\MirrorImage\\MirrorImage.wav" set OrganicHemisection_HEMISECTION_ID = 1093677127 set OrganicHemisection_BEAST_ILLUSION_ID = 1747988549 set OrganicHemisection_DURATION = .5 set OrganicHemisection_OFFSET = 64. set OrganicHemisection_PHASE_OFF = 16. set OrganicHemisection_CLOCK_PERIOD = 1. / 30. set OrganicHemisection_PHASE_MULTIPLIER = 16. * bj_PI set OrganicHemisection_ddIndex = -1 set OrganicHemisection_clock = CreateTimer() call init_19() return true endfunction function create_w3u_h003 takes nothing returns nothing local integer u_key if MagicFunctions_compiletime then set u_key = createObjectDefinition("w3u", 1747988531, 1752659063) call ObjectDefinition_setString(u_key, "uabi", "Aloc,Avul,A000") call ObjectDefinition_setString(u_key, "upat", "") call ObjectDefinition_setString(u_key, "upap", "") call ObjectDefinition_setString(u_key, "uubs", "") call ObjectDefinition_setString(u_key, "umdl", "buildings\\other\\BookOfSummoning\\BookOfSummoning.mdl") call ObjectDefinition_setString(u_key, "uani", "upgrade,second") call ObjectDefinition_setString(u_key, "unam", "Pedestal") call ObjectDefinition_setString(u_key, "utar", "ground") call ObjectDefinition_setInt(u_key, "ubdg", 0) call ObjectDefinition_setUnreal(u_key, "ucol", 0.0) call ObjectDefinition_setInt(u_key, "uhom", 1) call ObjectDefinition_setString(u_key, "utyp", "") call ObjectDefinition_setReal(u_key, "ussc", 1.35) call ObjectDefinition_setInt(u_key, "uhpm", 1000000000) call ObjectDefinition_setInt(u_key, "uuch", 1) call ObjectDefinition_setString(u_key, "udty", "fort") else call CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 1747988531, - 1472.1, 3637.6, 221.417) call CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 1747988531, - 1627.9, 3787.0, 312.910) endif endfunction function init_20 takes nothing returns nothing call create_w3u_h003() endfunction function init_Pedestal takes nothing returns boolean call init_20() return true endfunction function init_21 takes nothing returns nothing local trigger trig = CreateTrigger() local rect rct = Rect(TerrainData_HALL_MIN_X, TerrainData_HALL_MIN_Y, TerrainData_HALL_MAX_X, TerrainData_HALL_MAX_Y) local region reg = CreateRegion() call RegionAddRect(reg, rct) set PedestalReceive_rctEpsilon = Rect(TerrainData_HALL_MIN_X - PedestalReceive_ENUM_EPSILON, TerrainData_HALL_MIN_Y - PedestalReceive_ENUM_EPSILON, TerrainData_HALL_MAX_X + PedestalReceive_ENUM_EPSILON, TerrainData_HALL_MAX_Y + PedestalReceive_ENUM_EPSILON) call registerPlayerUnitEvent(EVENT_PLAYER_UNIT_PICKUP_ITEM, ref_function_act_13) call TriggerRegisterEnterRegion(trig, reg, null) call TriggerAddAction(trig, ref_function_act_13) call SoundControl_preload(PedestalReceive_RUNE_SECURED) call RemoveRect(rct) set trig = null set rct = null set reg = null endfunction function init_PedestalReceive takes nothing returns boolean local real temp_PedestalReceive_TARGET_PILLAR_LEFT_x local real temp_PedestalReceive_TARGET_PILLAR_LEFT_y local real temp_PedestalReceive_TARGET_PILLAR_LEFT_z local real temp_PedestalReceive_TARGET_PILLAR_RIGHT_x local real temp_PedestalReceive_TARGET_PILLAR_RIGHT_y local real temp_PedestalReceive_TARGET_PILLAR_RIGHT_z set PedestalReceive_DUMMY_MODEL = "Abilities\\Weapons\\FaerieDragonMissile\\FaerieDragonMissile.mdl" set PedestalReceive_EFFECT_MODEL = "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl" set PedestalReceive_RUNE_SECURED = "rune-secured.mp3" set PedestalReceive_SPAWN_COUNT = 20 set PedestalReceive_ENUM_EPSILON = 32. set temp_PedestalReceive_TARGET_PILLAR_LEFT_x = - 1630. set temp_PedestalReceive_TARGET_PILLAR_LEFT_y = 3798. set temp_PedestalReceive_TARGET_PILLAR_LEFT_z = 100. set PedestalReceive_TARGET_PILLAR_LEFT_x = temp_PedestalReceive_TARGET_PILLAR_LEFT_x set PedestalReceive_TARGET_PILLAR_LEFT_y = temp_PedestalReceive_TARGET_PILLAR_LEFT_y set PedestalReceive_TARGET_PILLAR_LEFT_z = temp_PedestalReceive_TARGET_PILLAR_LEFT_z set temp_PedestalReceive_TARGET_PILLAR_RIGHT_x = - 1470. set temp_PedestalReceive_TARGET_PILLAR_RIGHT_y = 3644. set temp_PedestalReceive_TARGET_PILLAR_RIGHT_z = 100. set PedestalReceive_TARGET_PILLAR_RIGHT_x = temp_PedestalReceive_TARGET_PILLAR_RIGHT_x set PedestalReceive_TARGET_PILLAR_RIGHT_y = temp_PedestalReceive_TARGET_PILLAR_RIGHT_y set PedestalReceive_TARGET_PILLAR_RIGHT_z = temp_PedestalReceive_TARGET_PILLAR_RIGHT_z set PedestalReceive_ITEM_DROP_OFFS = 100. set PedestalReceive_ITEM_SPAWN_HEIGHT = 40. set PedestalReceive_SPAWN_PERIOD = 1. / 10. set PedestalReceive_INITIAL_PITCH = 13. * Maths_PI / 32. set PedestalReceive_INITIAL_VELOCITY = 500. set PedestalReceive_ACCELERATION = 80. set PedestalReceive_CLOCK_PERIOD = 1. / 30. set PedestalReceive_AIR_FRICTION = PedestalReceive_CLOCK_PERIOD * 7. / 5. set PedestalReceive_time = CreateTimer() set PedestalReceive_time2 = CreateTimer() set PedestalReceive_grp = CreateGroup() set PedestalReceive_fakeRune = CreateItem(1227894832, TerrainData_SAFE_X, TerrainData_SAFE_Y) set PedestalReceive_effectIndex = -1 call init_21() return true endfunction function init_Player takes nothing returns boolean local integer i_3 = 0 local integer temp = bj_MAX_PLAYER_SLOTS - 1 loop exitwhen i_3 > temp call Player(i_3) set i_3 = i_3 + 1 endloop return true endfunction function init_22 takes nothing returns nothing local integer index = 0 local trigger t = CreateTrigger() loop exitwhen index >= Players_COUNT call TriggerRegisterPlayerEvent(t, Players_fromId[index], EVENT_PLAYER_LEAVE) set index = index + 1 endloop call TriggerAddCondition(t, Condition(ref_function_cond)) set t = null endfunction function init_PlayerLeaves takes nothing returns boolean call init_22() return true endfunction function ini_8 takes nothing returns nothing local integer index = 0 set Players_locl = GetLocalPlayer() set Players_fromId[Players_MARKERS] = Player(Players_MARKERS) set Players_fromId[Players_PASSIVE] = Player(Players_PASSIVE) loop exitwhen index > Players_COUNT - 1 set Players_fromId[index] = Player(index) set Players_playing[index] = GetPlayerSlotState(Players_fromId[index]) == PLAYER_SLOT_STATE_PLAYING or GetPlayerController(Players_fromId[index]) == MAP_CONTROL_COMPUTER set Players_aiControlled[index] = GetPlayerController(Players_fromId[index]) == MAP_CONTROL_COMPUTER and GetPlayerController(Players_fromId[index]) != MAP_CONTROL_USER if Players_playing[index] then set Players_playingCount = Players_playingCount + 1 endif if Players_playing[index] and ( not Players_aiControlled[index]) then set Players_humanCount = Players_humanCount + 1 endif if Players_aiControlled[index] then set Players_aiCount = Players_aiCount + 1 endif set index = index + 1 endloop endfunction function init_Players takes nothing returns boolean set Players_COUNT = 12 set Players_FIRST_HUNTER = 0 set Players_LAST_BEAST = 11 set Players_MARKERS = 11 set Players_PASSIVE = 15 set Players_FIRST_BEAST = 6 set Players_aliveCount = 0 set Players_aiCount = 0 set Players_humanCount = 0 set Players_playingCount = 0 set Players_escapePressedCount = 0 call ini_8() return true endfunction function trigger_addAction takes trigger this, code actionFunc returns nothing call TriggerAddAction(this, actionFunc) endfunction function trigger_registerPlayerChatEvent takes trigger this, player whichPlayer, string chatMessageToDetect, boolean exactMatchOnly returns nothing call TriggerRegisterPlayerChatEvent(this, whichPlayer, chatMessageToDetect, exactMatchOnly) endfunction function init_PrintingHelper takes nothing returns boolean local trigger t local integer i_3 set PrintingHelper_DEBUG_MSG_DURATION = 45. set t = CreateTrigger() call trigger_addAction(t, ref_function_switchDebug) set i_3 = 0 loop exitwhen i_3 > 11 set PrintingHelper_wantDebug[i_3] = false call trigger_registerPlayerChatEvent(t, Player(i_3), "-d", true) set i_3 = i_3 + 1 endloop set t = null return true endfunction function init_ProjectileStack takes nothing returns boolean set ProjectileStack_DUST_FX = "Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl" set ProjectileStack_ERROR_NO_PROJECTILE = "Error: projectile was not found for attacking unit! Reverting to Hunter projectile." set ProjectileStack_ERROR_NO_SPEED = "Error: projectile speed was not found! Reverting to 20." set ProjectileStack_ERROR_NO_DAMAGE = "Error: projectile damage was not found! Reverting to 10." set ProjectileStack_PROJECTILE_OFFSET = 50. set ProjectileStack_DEFAULT_VELOCITY = 20. set ProjectileStack_BULLET_ENUM_RADIUS = 75. set ProjectileStack_PROJECTILE_VELOCITY = 25. set ProjectileStack_PROJECTILE_DAMAGE = 30. set ProjectileStack_DEFAULT_DAMAGE = 10. set ProjectileStack_CLOCK_PERIOD = 1. / 30. set ProjectileStack_FLY_HEIGHT = 60. set ProjectileStack_RANGE = 1200. set ProjectileStack_time = CreateTimer() set ProjectileStack_dbIndex = -1 set ProjectileStack_g = CreateGroup() return true endfunction function addQuest takes string desc, string iconPath, boolean required, string title returns quest local quest q = CreateQuest() call QuestSetCompleted(q, false) call QuestSetDescription(q, desc) call QuestSetDiscovered(q, true) call QuestSetEnabled(q, true) call QuestSetIconPath(q, iconPath) call QuestSetRequired(q, required) call QuestSetTitle(q, title) set addQuesttempReturn = q set q = null return addQuesttempReturn endfunction function init_23 takes nothing returns nothing call addQuest(Quests_ABOUT_DESC, Quests_ABOUT_ICONPATH, false, Quests_ABOUT_TITLE) call addQuest(Quests_MODEL_CREDITS_DESC, Quests_MODEL_CREDITS_ICONPATH, false, Quests_MODEL_CREDITS_TITLE) call addQuest(Quests_CREDITS_DESC, Quests_CREDITS_ICONPATH, false, Quests_CREDITS_TITLE) if GetPlayerId(Players_locl) < Players_FIRST_BEAST then call addQuest(Quests_HOWTO_HUNTER_DESC, Quests_HOWTO_ICONPATH, true, Quests_HOWTO_TITLE) else call addQuest(Quests_HOWTO_BEAST_DESC, Quests_HOWTO_ICONPATH, true, Quests_HOWTO_TITLE) endif endfunction function init_Quests takes nothing returns boolean set Quests_CREDITS_DESC = "|n|cff999999Vexorian, Pitzermike, lookingforhelp|r, among others who contributed to Jass Newgen Pack." + "|n|cff999999Shadow Daemon|r for the Button Manager tool, used to generate icons." + "|n|cff999999Kiesman at DeviantArt, and Magic the Gathering|r for the image used in the map preview." + "|n|cff999999sigelang|r for the cats eye icon." + "|n|cff999999-Berz-|r for the Nether Bolt icon." + "|n|cff999999JollyD|r for the Treant Hide icon." + "|n|cff999999The Panda|r for the Electric Charge icon." + "|n|cff999999NFWar|r for the SandalZ2 and Rifle01 icons." + "|n|cff999999bigapple90|r for the Sharp Blades 2 icon." + "|n|cff999999Charlie Cleveland|r, of Unknown Worlds Entertainment, for the production of Natural Selection, by which this map is heavily influenced." + "|n|cff999999Blizzard|r, who provide this wonderful world editor." set Quests_CREDITS_ICONPATH = "ReplaceableTextures\\CommandButtons\\BTNBookOfTheDead.blp" set Quests_CREDITS_TITLE = "Other Credits" set Quests_MODEL_CREDITS_DESC = "Special thanks to |cff999999DTuGuR|r for the Wall model." + "|n|cff999999assasin_lord|r for the hero glow model." + "|n|cff999999Fingolfin|r for the Oak (variation 3) model." + "|n|cff999999Fingolfin|r for the Birch (variation 3) model." + "|n|cff999999PROXY|r for the Pickaxe + Item model." + "|n|cff999999Aquis|r for the Villager Man model." + "|n|cff999999imforfun|r for the Bench Long and Bench Bend models." + "|n|cff999999.KC and diosilva16|r for the Villager in robe model." set Quests_MODEL_CREDITS_ICONPATH = "ReplaceableTextures\\CommandButtons\\BTNTomeBrown.blp" set Quests_MODEL_CREDITS_TITLE = "Model Credits" set Quests_HOWTO_HUNTER_DESC = "|cffffcc00-|r Search for and kill all the beasts to win the round.|n" + "|cffffcc00-|r Use teamwork and organization to overwhelm the beasts with a barrage of fire.|n" + "|cffffcc00-|r The beasts have stolen an ancient artifact from your kingdom. It emanates power and boosts their strength. Secure it before the time runs out." set Quests_HOWTO_BEAST_DESC = "|cffffcc00-|r Search for and kill all the hunters to win the round.|n" + "|cffffcc00-|r Use guerilla tactics, health regeneration, and your sight range advantage to outsmart the hunters.|n" + "|cffffcc00-|r Your source of power is the ancient artifact. All is lost if the hunters secure it before the time runs out." set Quests_HOWTO_ICONPATH = "ReplaceableTextures\\CommandButtons\\BTNTomeRed.blp" set Quests_HOWTO_TITLE = "|cff999999How to Play|r" set Quests_ABOUT_DESC = "This map is made by |cffffcc00Cokemonkey11|r." set Quests_ABOUT_ICONPATH = "ReplaceableTextures\\CommandButtons\\BTNTomeOfRetraining.blp" set Quests_ABOUT_TITLE = "About" call init_23() return true endfunction function init_Rect takes nothing returns boolean call new_Table() return true endfunction function create_w3u_h006 takes nothing returns nothing local integer u_key if MagicFunctions_compiletime then set u_key = createObjectDefinition("w3u", 1747988534, 1752659063) call ObjectDefinition_setString(u_key, "uabi", "Aloc") call ObjectDefinition_setReal(u_key, "usca", 1.5) call ObjectDefinition_setString(u_key, "upat", "") call ObjectDefinition_setString(u_key, "upap", "") call ObjectDefinition_setString(u_key, "uubs", "") call ObjectDefinition_setString(u_key, "utar", "none") call ObjectDefinition_setInt(u_key, "uhom", 1) else call CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 1747988534, - 1280.0, 3200.0, 270.000) call CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 1747988534, - 1280.0, 2752.0, 270.000) call CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 1747988534, - 2432.0, 2176.0, 270.000) call CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 1747988534, - 2048.0, 2176.0, 270.000) endif endfunction function init_24 takes nothing returns nothing call create_w3u_h006() endfunction function init_ScoutTower takes nothing returns boolean call init_24() return true endfunction function init_25 takes nothing returns nothing set SimError_error = CreateSoundFromLabel("InterfaceError", false, false, false, 10, 10) endfunction function init_SimError takes nothing returns boolean call init_25() return true endfunction function init_Statistics takes nothing returns boolean set Statistics_roundEndTime = 0 set Statistics_secondsElapsed = 0 set Statistics_hunterWins = 0 set Statistics_beastWins = 0 set Statistics_huntersAlive = 0 set Statistics_beastsAlive = 0 set Statistics_hunterKills = 0 set Statistics_beastKills = 0 return true endfunction function string_length takes string this returns integer return StringLength(this) endfunction function init_String takes nothing returns boolean set String_charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" set String_numberset = "0123456789" call string_length(String_numberset) call string_length(String_charset) return true endfunction function ini_9 takes nothing returns nothing local group grp local region reg local trigger autoAddUnits local timer perCleanup local unit iter if StructuredDD_ADD_ALL_UNITS then set grp = CreateGroup() call GroupEnumUnitsInRect(grp, bj_mapInitialPlayableArea, null) loop set iter = FirstOfGroup(grp) exitwhen iter == null call StructuredDD_add(iter) call GroupRemoveUnit(grp, iter) endloop set autoAddUnits = CreateTrigger() set reg = CreateRegion() call RegionAddRect(reg, bj_mapInitialPlayableArea) call TriggerRegisterEnterRegion(autoAddUnits, reg, null) call TriggerAddCondition(autoAddUnits, Condition(ref_function_StructuredDD_autoAddC)) endif set perCleanup = CreateTimer() call TimerStart(perCleanup, StructuredDD_PER_CLEANUP_TIMEOUT, true, ref_function_StructuredDD_perCleanup) set grp = null set reg = null set autoAddUnits = null set perCleanup = null set iter = null endfunction function init_StructuredDD takes nothing returns boolean set StructuredDD_ADD_ALL_UNITS = true set StructuredDD_BUCKET_SIZE = 5 set StructuredDD_PER_CLEANUP_TIMEOUT = 60. set StructuredDD_conditionsIndex = -1 set StructuredDD_dbIndex = -1 set StructuredDD_maxDBIndex = -1 call ini_9() return true endfunction function init_Table takes nothing returns boolean set Table_ht = InitHashtable() return true endfunction function init_TempGroups takes nothing returns boolean call CreateGroup() return true endfunction function init_Terrain takes nothing returns boolean set Terrain_DUMMY_ITEM_ID = 2003790951 call Location(0., 0.) set Terrain_dItem = null call Rect(0., 0., 128., 128.) set Terrain_dItem = CreateItem(Terrain_DUMMY_ITEM_ID, 0., 0.) call SetItemVisible(Terrain_dItem, false) return true endfunction function init_TerrainData takes nothing returns boolean set TerrainData_HUNTER_SPAWN_X = - 1710. set TerrainData_HUNTER_SPAWN_Y = 3570. set TerrainData_BEAST_SPAWN_X = 3584. set TerrainData_BEAST_SPAWN_Y = - 4240. set TerrainData_HALL_MIN_X = - 1820. set TerrainData_HALL_MAX_X = - 1290. set TerrainData_HALL_MIN_Y = 3460. set TerrainData_HALL_MAX_Y = 3970. set TerrainData_RUNE_1_X = 3906. set TerrainData_RUNE_1_Y = - 1018. set TerrainData_RUNE_2_X = - 327. set TerrainData_RUNE_2_Y = - 4093. set TerrainData_RUNE_RETURN_X = - 1625. set TerrainData_RUNE_RETURN_Y = 3660. set TerrainData_MIN_X = - 5580. set TerrainData_MAX_X = 5390. set TerrainData_MIN_Y = - 5620. set TerrainData_MAX_Y = 5270. set TerrainData_SAFE_X = - 5030. set TerrainData_SAFE_Y = 5030. set TerrainData_loc = Location(0., 0.) return true endfunction function init_TextTag takes nothing returns boolean set TextTag_labelIndex = -1 return true endfunction function init_26 takes nothing returns nothing call registerPlayerUnitEvent(EVENT_PLAYER_UNIT_SPELL_EFFECT, ref_function_act_14) endfunction function init_Thunder takes nothing returns boolean set Thunder_THUNDER_ID = 1093677135 call init_26() return true endfunction function init_27 takes nothing returns nothing call TimerStart(CreateTimer(), 1., true, ref_function_checkRoundSeconds) call SoundControl_preload(TimerUp_TIME_LIMIT_REACHED) endfunction function init_TimerUp takes nothing returns boolean set TimerUp_TIME_LIMIT_REACHED = "time-limit-reached.mp3" call CreateTimer() call init_27() return true endfunction function init_TimerUtils takes nothing returns boolean set TimerUtils_freeTimersCount = 0 set TimerUtils_timerData = new_Table() set TimerUtils_HELD = 679645218 return true endfunction function init_Trigger takes nothing returns boolean call new_Table() return true endfunction function init_TypeCasting takes nothing returns boolean call new_Table() return true endfunction function ini_10 takes nothing returns nothing local integer index = 0 loop exitwhen index >= Players_COUNT set Units_subHero[index] = null set index = index + 1 endloop endfunction function init_Units takes nothing returns boolean set Units_LIGHTNING_BALL_FX = "Abilities\\Weapons\\FarseerMissile\\FarseerMissile.mdl" set Units_CLOCK_PERIOD = 1. / 30. set Units_LIGHTNING_CHECK_PERIOD = 5. set Units_BALL_OFF = 64. set Units_PHASE_ANGULAR_VELOCITY = bj_PI / 8. * Units_CLOCK_PERIOD set Units_EFFECT_SCALE = .5 set Units_EFFECT_HEIGHT = 60. set Units_BLINK_PASSIVE_ID = 1093677125 set Units_BLINK_ID = 1093677105 set Units_HEMISECT_PASSIVE_ID = 1093677128 set Units_HEMISECT_ID = 1093677127 set Units_CONCAT_PASSIVE_ID = 1093677130 set Units_CONCAT_ID = 1093677131 set Units_HUNTER_ID = 1211117644 set Units_BEAST_ID = 1211117645 set Units_LESSER_BEAST_ID = 1211117617 set Units_HUNTER_PROJECTILE_ID = 1747988528 set Units_ARTIFACT_ID = 1227894832 set Units_GAS_ACTION = 1227894835 set Units_INITIAL_BALLS = 0 set Units_MAX_BALLS = 5 set Units_MAX_BALLS_LESSER = 3 set Units_grp = CreateGroup() set Units_clock = CreateTimer() set Units_beastHead = 0 set Units_fromBeast = new_Table() set Units_thunderCd = new_Table() set Units_thunderClock = new_Table() set Units_beastState = new_Table() set Units_sitePref = new_Table() call ini_10() return true endfunction function init_Vectors takes nothing returns boolean return true endfunction function pauseForGameMusic takes nothing returns nothing call DestroyTimer(GetExpiredTimer()) call playGameMusic() endfunction function periodic takes nothing returns nothing local string colorCode = "|cffffffff" local integer secondsLeft = Statistics_roundEndTime - Statistics_secondsElapsed local string seconds = "0" local string minutes = " " local integer minutesLeft if secondsLeft < 0 then set secondsLeft = 0 endif set minutesLeft = R2I(secondsLeft * 1. / 60) set secondsLeft = ModuloInteger(secondsLeft, 60) if secondsLeft < 10 then set seconds = seconds + I2S(secondsLeft) else set seconds = I2S(secondsLeft) endif if minutesLeft > 0 then set minutes = I2S(minutesLeft) elseif secondsLeft <= 0 then set colorCode = "|cff444444" elseif secondsLeft < 10 and ModuloInteger(secondsLeft, 2) == 0 then set colorCode = "|cffee0000" elseif secondsLeft < 30 and ModuloInteger(secondsLeft, 2) == 0 then set colorCode = "|cff999999" endif call MultiboardSetTitleText(MultiboardControl_mb, "|cff999999Hunters|r " + I2S(Statistics_hunterWins) + " - " + I2S(Statistics_beastWins) + " |cff411d0aBeasts|r") call MultiboardSetItemValue(MultiboardGetItem(MultiboardControl_mb, 0, 1), colorCode + minutes + "|r:" + colorCode + seconds + "|r") endfunction function strikeUnits takes real x, real y, player caster returns nothing local unit iter local unit dummy call GroupEnumUnitsInRange(Net_grp, x, y, Net_RADIUS, null) loop set iter = FirstOfGroup(Net_grp) exitwhen iter == null if IsUnitEnemy(iter, caster) and UnitAlive(iter) then set dummy = DummyUnitStack_get() call SetUnitX(dummy, GetUnitX(iter)) call SetUnitY(dummy, GetUnitY(iter)) call UnitAddAbility(dummy, Net_NET_SLOW_ID) call IssueTargetOrder(dummy, "slow", iter) call DamageOverTime_add(null, iter, 0., 9., Net_NET_FX, DamageOverTime_FX_FLAG_COORDS, Net_EXCLUSIVITY_NET) call DummyUnitStack_delayedRelease(dummy, 3.) endif call GroupRemoveUnit(Net_grp, iter) endloop set iter = null set dummy = null endfunction function periodic_2 takes nothing returns nothing local integer index = 0 local integer tempDat local unit iter local real dX local real dY local boolean hit local unit receiver local unit receiver_2 local unit receiver_3 loop exitwhen index > Net_dbIndex set tempDat = Net_dataDb[index] set dX = unit_getX(NetData_dummy[tempDat]) set dY = unit_getY(NetData_dummy[tempDat]) set hit = false set receiver = NetData_dummy[tempDat] call unit_setX(receiver, dX + NetData_delX[tempDat]) set receiver_2 = receiver call unit_setY(receiver_2, dY + NetData_delY[tempDat]) set receiver_3 = receiver_2 call unit_setFlyHeight(receiver_3, 50., 0.) set NetData_distance[tempDat] = NetData_distance[tempDat] - Net_NET_VELOCITY * Net_CLOCK_PERIOD call GroupEnumUnitsInRange(Net_grp, dX, dY, Net_COLLISION_RADIUS, null) loop set iter = FirstOfGroup(Net_grp) exitwhen iter == null if IsUnitEnemy(iter, NetData_caster[tempDat]) and UnitAlive(iter) then set hit = true exitwhen true endif call GroupRemoveUnit(Net_grp, iter) endloop if hit or NetData_distance[tempDat] < 0. then call strikeUnits(dX, dY, NetData_caster[tempDat]) call effect_destr(NetData_attached[tempDat]) call DummyUnitStack_delayedRelease(NetData_dummy[tempDat], 3.) set Net_dataDb[index] = Net_dataDb[Net_dbIndex] set Net_dbIndex = Net_dbIndex - 1 set index = index - 1 if Net_dbIndex == -1 then call PauseTimer(Net_clock) endif endif set index = index + 1 endloop set iter = null set receiver = null set receiver_2 = null set receiver_3 = null endfunction function DummyAlloc_onDestroy takes integer this returns nothing endfunction function dealloc_DummyAlloc takes integer obj returns nothing if DummyAlloc_typeId[obj] == 0 then call error("Double free: object of type DummyAlloc") else set DummyAlloc_nextFree[DummyAlloc_firstFree] = obj set DummyAlloc_firstFree = DummyAlloc_firstFree + 1 set DummyAlloc_typeId[obj] = 0 endif endfunction function destroyDummyAlloc takes integer this returns nothing call DummyAlloc_onDestroy(this) call dealloc_DummyAlloc(this) endfunction function dispatch_DummyAlloc_destroyDummyAlloc takes integer this returns nothing if DummyAlloc_typeId[this] == 0 then if this == 0 then call error("Nullpointer exception when calling DummyAlloc.destroyDummyAlloc") else call error("Called DummyAlloc.destroyDummyAlloc on invalid object.") endif endif call destroyDummyAlloc(this) endfunction function releaseDummy takes nothing returns nothing local timer tim = GetExpiredTimer() local integer d = timer_getData(tim) call DummyUnitStack_release(DummyAlloc_u[d]) call dispatch_DummyAlloc_destroyDummyAlloc(d) call DestroyTimer(tim) set tim = null endfunction function resetCooldown takes nothing returns nothing local timer tim = GetExpiredTimer() local integer d = timer_getData(tim) call UnitRemoveAbility(DummyAlloc_u[d], Knife_KNIFE_ID) call UnitAddAbility(DummyAlloc_u[d], Knife_KNIFE_ID) call dispatch_DummyAlloc_destroyDummyAlloc(d) call DestroyTimer(tim) set tim = null endfunction function Cinematic_neutral0 takes nothing returns nothing call DisplayTimedTextToPlayer(Players_locl, .2, 0., 3., " |cffffcc00Hunter's Hall|r") call DisplayTimedTextToPlayer(Players_locl, .2, 0., 3., " ") call DisplayTimedTextToPlayer(Players_locl, .2, 0., 3., " ") call DisplayTimedTextToPlayer(Players_locl, .2, 0., 3., " ") call Cinematic_biconditionalScene(2., ref_function_Cinematic_neutral1) endfunction function Units_clearAll takes nothing returns nothing local integer index = 0 local unit iter loop exitwhen index > Players_LAST_BEAST call GroupEnumUnitsOfPlayer(Units_grp, Players_fromId[index], null) loop set iter = FirstOfGroup(Units_grp) exitwhen iter == null call GroupRemoveUnit(Units_grp, iter) call RemoveUnit(iter) endloop set index = index + 1 endloop set iter = null endfunction function Cinematic_start takes nothing returns nothing call Units_clearAll() set Cinematic_enabled = true call FogMaskEnable(false) call FogEnable(false) call CameraControl_fadeOutHunter(.01) call CameraControl_fadeOutBeast(.01) call EnableUserUI(false) call EnableUserControl(false) call ShowInterface(false, 0.) call Cinematic_neutral0() endfunction function startC takes nothing returns boolean call ClearTextMessages() call Cinematic_start() return false endfunction function switchDebug takes nothing returns nothing local player p = GetTriggerPlayer() local integer id = player_getId(p) if PrintingHelper_wantDebug[id] then set PrintingHelper_wantDebug[id] = false call DisplayTimedTextToPlayer(p, 0., 0., 20., "|cff9C9C9CDEBUG-View|r |cffB55208deactivated") else set PrintingHelper_wantDebug[id] = true call DisplayTimedTextToPlayer(p, 0., 0., 20., "|cff9C9C9CDEBUG-View|r |cff3AAD42activated") endif set p = null endfunction function update takes nothing returns nothing local integer index = 0 local integer j if not Cinematic_enabled then loop exitwhen index >= Players_FIRST_BEAST set j = 0 loop exitwhen j >= Players_FIRST_BEAST if j != index then call FogModifierStop(MinimapVisionHints_hints[index * Players_FIRST_BEAST + j]) call DestroyFogModifier(MinimapVisionHints_hints[index * Players_FIRST_BEAST + j]) if (UnitAlive(Units_hero[index]) and UnitAlive(Units_hero[j]) and IsUnitInRange(Units_hero[index], Units_hero[j], MinimapVisionHints_CHECK_RADIUS)) or (( not UnitAlive(Units_hero[index])) and UnitAlive(Units_hero[j])) then set MinimapVisionHints_hints[index * Players_FIRST_BEAST + j] = CreateFogModifierRadius(Players_fromId[index], FOG_OF_WAR_VISIBLE, GetUnitX(Units_hero[j]), GetUnitY(Units_hero[j]), MinimapVisionHints_RADIUS, false, true) call FogModifierStart(MinimapVisionHints_hints[index * Players_FIRST_BEAST + j]) endif endif set j = j + 1 endloop set index = index + 1 endloop endif endfunction function initGlobals takes nothing returns nothing set CallbackSingle_firstFree = 0 set CallbackSingle_maxIndex = 0 set DotData_firstFree = 0 set DotData_maxIndex = 0 set DelayDat_firstFree = 0 set DelayDat_maxIndex = 0 set UnitAlloc_firstFree = 0 set UnitAlloc_maxIndex = 0 set AutoDat_firstFree = 0 set AutoDat_maxIndex = 0 set DummyAlloc_firstFree = 0 set DummyAlloc_maxIndex = 0 set Chord_firstFree = 0 set Chord_maxIndex = 0 set Muscii_firstFree = 0 set Muscii_maxIndex = 0 set MyCallBackFunc_firstFree = 0 set MyCallBackFunc_maxIndex = 0 set Note_firstFree = 0 set Note_maxIndex = 0 set NetData_firstFree = 0 set NetData_maxIndex = 0 set IdGenerator_firstFree = 0 set IdGenerator_maxIndex = 0 set DuplicateDat_firstFree = 0 set DuplicateDat_maxIndex = 0 set DuplicateDat_firstFree_2 = 0 set DuplicateDat_maxIndex_2 = 0 set Effect_firstFree = 0 set Effect_maxIndex = 0 set ProjectileDat_firstFree = 0 set ProjectileDat_maxIndex = 0 set Slop_firstFree = 0 set Slop_maxIndex = 0 set Bucket_firstFree = 0 set Bucket_maxIndex = 0 set Table_firstFree = 0 set Table_maxIndex = 0 set BeastLightningDat_firstFree = 0 set BeastLightningDat_maxIndex = 0 set LightningBallDat_firstFree = 0 set LightningBallDat_maxIndex = 0 set ref_function_init_String = function init_String set ref_function_init_Table = function init_Table set ref_function_init_Trigger = function init_Trigger set ref_function_init_Player = function init_Player set ref_function_init_PrintingHelper = function init_PrintingHelper set ref_function_init_MagicFunctions = function init_MagicFunctions set ref_function_init_Basics = function init_Basics set ref_function_init_GameTimer = function init_GameTimer set ref_function_init_ErrorHandling = function init_ErrorHandling set ref_function_init_TimerUtils = function init_TimerUtils set ref_function_init_Maths = function init_Maths set ref_function_init_Vectors = function init_Vectors set ref_function_init_TempGroups = function init_TempGroups set ref_function_init_Colors = function init_Colors set ref_function_init_Rect = function init_Rect set ref_function_init_Terrain = function init_Terrain set ref_function_init_TypeCasting = function init_TypeCasting set ref_function_init_ObjectIds = function init_ObjectIds set ref_function_init_ObjectIdGenerator = function init_ObjectIdGenerator set ref_function_init_TerrainData = function init_TerrainData set ref_function_init_Players = function init_Players set ref_function_init_DummyUnitStack = function init_DummyUnitStack set ref_function_init_Units = function init_Units set ref_function_init_Statistics = function init_Statistics set ref_function_init_AI = function init_AI set ref_function_init_AttackTeammate = function init_AttackTeammate set ref_function_init_StructuredDD = function init_StructuredDD set ref_function_init_DamageType = function init_DamageType set ref_function_init_MultiboardControl = function init_MultiboardControl set ref_function_init_CameraControl = function init_CameraControl set ref_function_init_Game = function init_Game set ref_function_init_DamageOverTime = function init_DamageOverTime set ref_function_init_TextTag = function init_TextTag set ref_function_init_ItemFieldConditioningKit = function init_ItemFieldConditioningKit set ref_function_init_BeastAttack = function init_BeastAttack set ref_function_init_Cinematic = function init_Cinematic set ref_function_init_BinocularVision = function init_BinocularVision set ref_function_init_Blink = function init_Blink set ref_function_init_Castle = function init_Castle set ref_function_init_CastleSmall = function init_CastleSmall set ref_function_init_EscapeKey = function init_EscapeKey set ref_function_init_HeroDeath = function init_HeroDeath set ref_function_init_ProjectileStack = function init_ProjectileStack set ref_function_init_HunterAttack = function init_HunterAttack set ref_function_init_Math = function init_Math set ref_function_init_HunterCamera = function init_HunterCamera set ref_function_init_HunterToggle = function init_HunterToggle set ref_function_init_HuntersHall = function init_HuntersHall set ref_function_init_Initialization = function init_Initialization set ref_function_init_KeepSmall = function init_KeepSmall set ref_function_init_Knife = function init_Knife set ref_function_init_Marketplace = function init_Marketplace set ref_function_init_MinimapVisionHints = function init_MinimapVisionHints set ref_function_init_Muscii = function init_Muscii set ref_function_init_Music = function init_Music set ref_function_init_Net = function init_Net set ref_function_init_SimError = function init_SimError set ref_function_init_NoItemDuplicates = function init_NoItemDuplicates set ref_function_init_OrganicConcatenation = function init_OrganicConcatenation set ref_function_init_OrganicHemisection = function init_OrganicHemisection set ref_function_init_Pedestal = function init_Pedestal set ref_function_init_PedestalReceive = function init_PedestalReceive set ref_function_init_PlayerLeaves = function init_PlayerLeaves set ref_function_init_Quests = function init_Quests set ref_function_init_ScoutTower = function init_ScoutTower set ref_function_init_Thunder = function init_Thunder set ref_function_init_TimerUp = function init_TimerUp set ref_function_AI_periodic = function AI_periodic set ref_function_act = function act_13 set ref_function_hand = function hand set ref_function_act_2 = function act_9 set ref_function_act_3 = function act set ref_function_CameraControl_endFadeHunter = function CameraControl_endFadeHunter set ref_function_CameraControl_endFadeBeast = function CameraControl_endFadeBeast set ref_function_Cinematic_cleanup = function Cinematic_cleanup set ref_function_Cinematic_endCinematic = function Cinematic_endCinematic set ref_function_Cinematic_human24 = function Cinematic_human24 set ref_function_Cinematic_human23 = function Cinematic_human23 set ref_function_Cinematic_human22 = function Cinematic_human22 set ref_function_Cinematic_human21 = function Cinematic_human21 set ref_function_Cinematic_human20 = function Cinematic_human20 set ref_function_Cinematic_human19 = function Cinematic_human19 set ref_function_Cinematic_human18 = function Cinematic_human18 set ref_function_Cinematic_human17 = function Cinematic_human17 set ref_function_Cinematic_human16 = function Cinematic_human16 set ref_function_Cinematic_human15 = function Cinematic_human15 set ref_function_Cinematic_human14c = function Cinematic_human14c set ref_function_Cinematic_human14b = function Cinematic_human14b set ref_function_Cinematic_human14a = function Cinematic_human14a set ref_function_Cinematic_human14 = function Cinematic_human14 set ref_function_Cinematic_human13 = function Cinematic_human13 set ref_function_Cinematic_human12a = function Cinematic_human12a set ref_function_Cinematic_human12 = function Cinematic_human12 set ref_function_Cinematic_human11 = function Cinematic_human11 set ref_function_Cinematic_human10 = function Cinematic_human10 set ref_function_Cinematic_human9 = function Cinematic_human9 set ref_function_Cinematic_human8b = function Cinematic_human8b set ref_function_Cinematic_human8 = function Cinematic_human8 set ref_function_Cinematic_human7 = function Cinematic_human7 set ref_function_Cinematic_human6 = function Cinematic_human6 set ref_function_Cinematic_human5 = function Cinematic_human5 set ref_function_Cinematic_human4 = function Cinematic_human4 set ref_function_Cinematic_human3 = function Cinematic_human3 set ref_function_Cinematic_human2 = function Cinematic_human2 set ref_function_Cinematic_human1 = function Cinematic_human1 set ref_function_Cinematic_beast35 = function Cinematic_beast35 set ref_function_Cinematic_beast34 = function Cinematic_beast34 set ref_function_Cinematic_beast33b = function Cinematic_beast33b set ref_function_Cinematic_beast33a = function Cinematic_beast33a set ref_function_Cinematic_beast33 = function Cinematic_beast33 set ref_function_Cinematic_beast32 = function Cinematic_beast32 set ref_function_Cinematic_beast31b = function Cinematic_beast31b set ref_function_Cinematic_beast31a = function Cinematic_beast31a set ref_function_Cinematic_beast31 = function Cinematic_beast31 set ref_function_Cinematic_beast30 = function Cinematic_beast30 set ref_function_Cinematic_beast28 = function Cinematic_beast28 set ref_function_Cinematic_beast29 = function Cinematic_beast29 set ref_function_Cinematic_beast26 = function Cinematic_beast26 set ref_function_Cinematic_beast25 = function Cinematic_beast25 set ref_function_Cinematic_beast23 = function Cinematic_beast23 set ref_function_Cinematic_beast23b = function Cinematic_beast23b set ref_function_Cinematic_beast24 = function Cinematic_beast24 set ref_function_Cinematic_beast22 = function Cinematic_beast22 set ref_function_Cinematic_beast21 = function Cinematic_beast21 set ref_function_Cinematic_beast20 = function Cinematic_beast20 set ref_function_Cinematic_beast19 = function Cinematic_beast19 set ref_function_Cinematic_beast18 = function Cinematic_beast18 set ref_function_Cinematic_beast17 = function Cinematic_beast17 set ref_function_Cinematic_beast16 = function Cinematic_beast16 set ref_function_Cinematic_beast15 = function Cinematic_beast15 set ref_function_Cinematic_beast14 = function Cinematic_beast14 set ref_function_Cinematic_beast13 = function Cinematic_beast13 set ref_function_Cinematic_beast12 = function Cinematic_beast12 set ref_function_Cinematic_beast11b = function Cinematic_beast11b set ref_function_Cinematic_beast11a = function Cinematic_beast11a set ref_function_Cinematic_beast11 = function Cinematic_beast11 set ref_function_Cinematic_beast10 = function Cinematic_beast10 set ref_function_Cinematic_beast9 = function Cinematic_beast9 set ref_function_Cinematic_beast8 = function Cinematic_beast8 set ref_function_Cinematic_beast7 = function Cinematic_beast7 set ref_function_Cinematic_beast6 = function Cinematic_beast6 set ref_function_Cinematic_beast5 = function Cinematic_beast5 set ref_function_Cinematic_beast4 = function Cinematic_beast4 set ref_function_Cinematic_beast3 = function Cinematic_beast3 set ref_function_Cinematic_beast2 = function Cinematic_beast2 set ref_function_Cinematic_beast1 = function Cinematic_beast1 set ref_function_Cinematic_human0 = function Cinematic_human0 set ref_function_Cinematic_beast0 = function Cinematic_beast0 set ref_function_Cinematic_neutral2 = function Cinematic_neutral2 set ref_function_Cinematic_neutral1 = function Cinematic_neutral1 set ref_function_CallbackSingle_staticCallback = function CallbackSingle_staticCallback set ref_function_DamageOverTime_damageTick = function DamageOverTime_damageTick set ref_function_DamageType_c = function DamageType_c set ref_function_DamageType_handler = function DamageType_handler set ref_function_DamageType_after = function DamageType_after set ref_function_DummyUnitStack_deferredPreloader = function DummyUnitStack_deferredPreloader set ref_function_DummyUnitStack_afterDelay = function DummyUnitStack_afterDelay set ref_function_c = function c set ref_function_GameTimer_closure_impl = function GameTimer_closure_impl set ref_function_Game_countSeconds = function Game_countSeconds set ref_function_Game_gameOver2 = function Game_gameOver2 set ref_function_Game_hunterVictorySound = function Game_hunterVictorySound set ref_function_Game_gameOver = function Game_gameOver set ref_function_Game_roundStart = function Game_roundStart set ref_function_Game_beastVictorySound = function Game_beastVictorySound set ref_function_a = function a set ref_function_autoTick = function autoTick set ref_function_act_4 = function act_6 set ref_function_act_5 = function act_3 set ref_function_act_6 = function act_4 set ref_function_startC = function startC set ref_function_endVotes = function endVotes set ref_function_diaA = function diaA set ref_function_afterDelay = function afterDelay set ref_function_checkCombatDuration = function checkCombatDuration set ref_function_releaseDummy = function releaseDummy set ref_function_resetCooldown = function resetCooldown set ref_function_act_7 = function act_10 set ref_function_update = function update set ref_function_periodic = function periodic set ref_function_act_8 = function act_8 set ref_function_Muscii_p = function Muscii_p set ref_function_pauseForGameMusic = function pauseForGameMusic set ref_function_periodic_2 = function periodic_2 set ref_function_act_9 = function act_2 set ref_function_act_10 = function act_12 set ref_function_ddPeriodic = function ddPeriodic_2 set ref_function_act_11 = function act_7 set ref_function_ddPeriodic_2 = function ddPeriodic set ref_function_act_12 = function act_11 set ref_function_fxSpawn3 = function fxSpawn3 set ref_function_fxSpawn2 = function fxSpawn2 set ref_function_act_13 = function act_14 set ref_function_cond = function cond set ref_function_switchDebug = function switchDebug set ref_function_ProjectileStack_bulletTick = function ProjectileStack_bulletTick set ref_function_SoundControl_preloadAfter = function SoundControl_preloadAfter set ref_function_StructuredDD_autoAddC = function StructuredDD_autoAddC set ref_function_StructuredDD_perCleanup = function StructuredDD_perCleanup set ref_function_act_14 = function act_5 set ref_function_checkRoundSeconds = function checkRoundSeconds set ref_function_Units_beastLightningTick = function Units_beastLightningTick set ref_function_Units_filterItems = function Units_filterItems endfunction function main takes nothing returns nothing local trigger initTrig call initGlobals() set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_String)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package String.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Table)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Table.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Trigger)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Trigger.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Player)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Player.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_PrintingHelper)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package PrintingHelper.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_MagicFunctions)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package MagicFunctions.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Basics)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Basics.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_GameTimer)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package GameTimer.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_ErrorHandling)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package ErrorHandling.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_TimerUtils)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package TimerUtils.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Maths)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Maths.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Vectors)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Vectors.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_TempGroups)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package TempGroups.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Colors)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Colors.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Rect)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Rect.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Terrain)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Terrain.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_TypeCasting)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package TypeCasting.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_ObjectIds)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package ObjectIds.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_ObjectIdGenerator)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package ObjectIdGenerator.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_TerrainData)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package TerrainData.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Players)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Players.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_DummyUnitStack)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package DummyUnitStack.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Units)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Units.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Statistics)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Statistics.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_AI)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package AI.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_AttackTeammate)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package AttackTeammate.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_StructuredDD)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package StructuredDD.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_DamageType)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package DamageType.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_MultiboardControl)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package MultiboardControl.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_CameraControl)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package CameraControl.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Game)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Game.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_DamageOverTime)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package DamageOverTime.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_TextTag)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package TextTag.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_ItemFieldConditioningKit)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package ItemFieldConditioningKit.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_BeastAttack)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package BeastAttack.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Cinematic)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Cinematic.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_BinocularVision)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package BinocularVision.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Blink)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Blink.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Castle)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Castle.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_CastleSmall)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package CastleSmall.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_EscapeKey)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package EscapeKey.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_HeroDeath)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package HeroDeath.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_ProjectileStack)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package ProjectileStack.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_HunterAttack)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package HunterAttack.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Math)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Math.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_HunterCamera)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package HunterCamera.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_HunterToggle)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package HunterToggle.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_HuntersHall)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package HuntersHall.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Initialization)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Initialization.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_KeepSmall)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package KeepSmall.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Knife)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Knife.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Marketplace)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Marketplace.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_MinimapVisionHints)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package MinimapVisionHints.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Muscii)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Muscii.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Music)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Music.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Net)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Net.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_SimError)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package SimError.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_NoItemDuplicates)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package NoItemDuplicates.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_OrganicConcatenation)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package OrganicConcatenation.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_OrganicHemisection)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package OrganicHemisection.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Pedestal)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Pedestal.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_PedestalReceive)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package PedestalReceive.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_PlayerLeaves)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package PlayerLeaves.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Quests)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Quests.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_ScoutTower)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package ScoutTower.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_Thunder)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package Thunder.") endif call DestroyTrigger(initTrig) set initTrig = CreateTrigger() call TriggerAddCondition(initTrig, Condition(ref_function_init_TimerUp)) if not TriggerEvaluate(initTrig) then call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 45., "Could not initialize package TimerUp.") endif call DestroyTrigger(initTrig) set initTrig = null endfunction function config takes nothing returns nothing endfunction