void MainLogicLoop(){ //TODO lock the camera //lockCamera(&processHandle); //read the data at these pointers, now that offsets have been added and we have a static address ReadPlayer(&Enemy, processHandle, EnemyId); ReadPlayer(&Player, processHandle, PlayerId); //log distance in memory AppendDistance(distance(&Player, &Enemy)); //start the neural network threads WakeThread(defense_mind_input); WakeThread(attack_mind_input); ResetVJoyController(); //begin reading enemy state, and handle w logic and subroutines char attackImminent = EnemyStateProcessing(&Player, &Enemy); WaitForThread(defense_mind_input); guiPrint(LocationDetection",1:Defense Neural Network detected %d, and Attack %d", DefenseChoice, AttackChoice); #if DebuggingPacifyDef DefenseChoice = 0; #endif //defense mind makes choice to defend or not(ex backstab metagame decisions). //handles actually backstab checks, plus looks at info from obveous direct attacks from aboutToBeHit if (attackImminent == ImminentHit || inActiveDodgeSubroutine() || (DefenseChoice>0)){ dodge(&Player, &Enemy, &iReport, attackImminent, DefenseChoice); } WaitForThread(attack_mind_input); guiPrint(LocationDetection",2:Attack Neural Network decided %d", AttackChoice); #if DebuggingPacifyAtk AttackChoice = 0; #endif //attack mind make choice about IF to attack or not, and how to attack //enter when we either have a Attack neural net action or a attackImminent action if (inActiveAttackSubroutine() || attackImminent != ImminentHit || (AttackChoice && DefenseChoice<=0)){ attack(&Player, &Enemy, &iReport, attackImminent, AttackChoice); } //unset neural network desisions DefenseChoice = 0; AttackChoice = 0; //handle subroutine safe exits SafelyExitSubroutines(); guiPrint(LocationDetection",5:Current Subroutine States ={%d,%d,%d,%d}", subroutine_states[0], subroutine_states[1], subroutine_states[2], subroutine_states[3]); //send this struct to the driver (only 1 call for setting all controls, much faster) guiPrint(LocationJoystick",0:AxisX:%d\nAxisY:%d\nButtons:0x%x", iReport.wAxisX, iReport.wAxisY, iReport.lButtons); UpdateVJD(iInterface, (PVOID)&iReport); //SetForegroundWindow(h); //SetFocus(h); }
void ReadPlayer(Character * c, HANDLE * processHandle, int characterId){ HANDLE processHandle_nonPoint = *processHandle; //TODO read large block that contains all data, then parse in process //read x location ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->location_x_address), &(c->loc_x), 4, 0); guiPrint("%d,0:X:%f", characterId, c->loc_x); //read y location ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->location_y_address), &(c->loc_y), 4, 0); guiPrint("%d,1:Y:%f", characterId, c->loc_y); //read rotation of player ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->rotation_address), &(c->rotation), 4, 0); //Player rotation is pi. 0 to pi,-pi to 0. Same as atan2 //convert to radians, then to degrees c->rotation = (c->rotation + PI) * (180.0 / PI); guiPrint("%d,2:Rotation:%f", characterId, c->rotation); //read current animation type ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->animationType_address), &(c->animationType_id), 2, 0); guiPrint("%d,3:Animation Type:%d", characterId, c->animationType_id); //read hp ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->hp_address), &(c->hp), 4, 0); //read stamina if (c->stamina_address){ ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->stamina_address), &(c->stamina), 4, 0); guiPrint("%d,4:Stamina:%d", characterId, c->stamina); } //read what weapon they currently have in right hand ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->r_weapon_address), &(c->r_weapon_id), 4, 0); guiPrint("%d,5:R Weapon:%d", characterId, c->r_weapon_id); //read what weapon they currently have in left hand ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->l_weapon_address), &(c->l_weapon_id), 4, 0); guiPrint("%d,6:L Weapon:%d", characterId, c->l_weapon_id); //read if hurtbox is active on enemy weapon if (c->hurtboxActive_address){ unsigned char hurtboxActiveState; ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->hurtboxActive_address), &hurtboxActiveState, 1, 0); if (hurtboxActiveState){ c->subanimation = AttackSubanimationActiveDuringHurtbox; } } int animationid; ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->animationId_address), &animationid, 4, 0); //need a second one b/c the game has a second one. the game has a second one b/c two animations can overlap. int animationid2; ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->animationId2_address), &animationid2, 4, 0); //keep track of enemy animations in memory bool newAid = false; if (characterId == LocationMemoryEnemy){ if (animationid){ newAid = AppendLastAnimationIdEnemy(animationid); } else { newAid = AppendLastAnimationIdEnemy(animationid2); } } guiPrint("%d,7:Animation Id 1/2:%d/%d", characterId, animationid, animationid2); unsigned char attackAnimationInfo = isAttackAnimation(c->animationType_id); //---any subanimation that is based purely off animation id should be prioritized in subanimation state setting--- if (isVulnerableAnimation(animationid)) { c->subanimation = AttackSubanimationActiveHurtboxOver; } else if (animationid >= 2000 && animationid <= 2056){//animation states for poise breaks, knockdowns, launches, staggers c->subanimation = PoiseBrokenSubanimation; } //---subanimations based on animation type--- else if (isDodgeAnimation(c->animationType_id)){ c->subanimation = LockInSubanimation; } //read how long the animation has been active, check with current animation, see if hurtbox is about to activate //what i want is a countdown till hurtbox is active //cant be much higher b/c need spell attack timings //also check that this is an attack that involves subanimation else if (attackAnimationInfo == 2 || attackAnimationInfo == 4){ int curAnimationTimer_address = 0; int curAnimationid = 0; //need a second one b/c the game has a second one. the game has a second one b/c two animations can overlap. if (animationid2 > 1000){ curAnimationTimer_address = c->animationTimer2_address; curAnimationid = animationid2; } else if (animationid > 1000){ //if kick or parry (aid ends in 100), use catch all aid if (animationid % 1000 == 100){ curAnimationid = 100; } else{ curAnimationid = animationid; } curAnimationTimer_address = c->animationTimer_address; } else{ guiPrint(LocationDetection",3:ALERT: Animation type found but not animation ids"); } if (curAnimationid){ float animationTimer; ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(curAnimationTimer_address), &animationTimer, 4, 0); //handle the timer not being reset to 0 as soon as a new animation starts if (newAid){ animationTimer = 0.0; } //sometimes, due to lag, dark souls cuts one animation short and makes the next's hurtbox timing later. handle this for the animations that do it. if (CombineLastAnimation(curAnimationid)){ float animationTimer2; ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->animationTimer2_address), &animationTimer2, 4, 0); animationTimer += animationTimer2; } float dodgeTimer = dodgeTimings(curAnimationid); float timeDelta = dodgeTimer - animationTimer; c->dodgeTimeRemaining = timeDelta;//TODO this is only ever used with the enemy guiPrint("%d,8:Animation Timer:%f\nDodge Time:%f", characterId, animationTimer, dodgeTimer); if (timeDelta >= 1.0){ c->subanimation = SubanimationNeutral; } else if (timeDelta < 1.0 && timeDelta > 0.45){ c->subanimation = AttackSubanimationWindup; } //between 0.45 and 0.15 sec b4 hurtbox. If we have less that 0.15 we can't dodge. else if (timeDelta <= 0.45 && timeDelta >= 0.15){ c->subanimation = AttackSubanimationWindupClosing; } //just treat this as the hurtbox is activated else if (timeDelta < 0.15 && timeDelta >= 0){ c->subanimation = AttackSubanimationActiveDuringHurtbox; } else if (timeDelta < 0){ c->subanimation = AttackSubanimationActiveHurtboxOver; } // time before the windup ends where we can still alter rotation (only for player) if (timeDelta < WeaponGhostHitTime && timeDelta >= -0.3 && characterId == LocationMemoryPlayer){ c->subanimation = AttackSubanimationWindupGhostHit; } } } else if (attackAnimationInfo == 1){ c->subanimation = AttackSubanimationWindup; } else if (attackAnimationInfo == 3){ c->subanimation = AttackSubanimationActiveDuringHurtbox; } else{ //else if (c->animationType_id == 0){//0 when running, walking, standing. all animation can immediatly transition to new animation c->subanimation = SubanimationNeutral; } //read if in ready state(can transition to another animation) if (c->readyState_address){ unsigned char readyState; ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->readyState_address), &readyState, 1, 0); if(readyState){ c->subanimation = SubanimationRecover; } /*else{ Not adding this now because it would lock out subanimations every time i move c->subanimation = LockInSubanimation; }*/ } guiPrint("%d,9:Subanimation:%d", characterId, c->subanimation); //read the current velocity //player doesnt use this, and wont have the address set. enemy will if (c->velocity_address){ ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->velocity_address), &(c->velocity), 4, 0); guiPrint("%d,10:Velocity:%f", characterId, c->velocity); } //read if the player is locked on if (c->locked_on_address){ ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->locked_on_address), &(c->locked_on), 1, 0); guiPrint("%d,11:Locked On:%d", characterId, c->locked_on); } //read two handed state of player if (c->twoHanding_address){ ReadProcessMemory(processHandle_nonPoint, (LPCVOID)(c->twoHanding_address), &(c->twoHanding), 1, 0); guiPrint("%d,12:Two Handing:%d", characterId, c->twoHanding); } }
/*determine what type of action the animation id is. i cant seem to find a pattern in the ids, so this is just a big switch statement ranged attacks use a different format: they have a specific animation for windup,recover, and hurtbox creation; while others rely on a subanimation id to determine windup, hurtbox, and recovery. because of this, have to specify if we need to look at subanimation 0 is not attack animation, 1 is windup to attack, 2 is attack id but must check subanimation(hurtbox not instantly generated), 3 is hurtbox is created, 4 is same as 2 but override behind enemy safety*/ unsigned char isAttackAnimation(unsigned char animationType_id){ switch (animationType_id){ //nothing //case 0: // return 0; //could not use //case 21: // return 0; //1h rolling attack case 41: return 2; //sheild poke case 45: return 2; //1h r1 case 46: return 2; //1h r1 swing 2 case 48: return 2; //1h r1 swing 3 case 49: return 2; //1h kick or kick special attack case 52: return 2; //jumping 1 hand case 53: return 2; //left hand attack case 55: return 2; //backstep attack 1h case 59: return 2; //backstep attack 2h case 60: return 2; //crossbow/bow windup 2h case 65: return 0; //bow hold case 66: return 0; //crossbow/bow attack 2h case 67: return 3; //crossbow recover 2h //case 68: // return 0; //crossbow windup 1h case 69: return 0; //crossbow attack 1h case 70: return 3; //crossbow recover 1h //case 71: // return 0; //shield raise while walking //case 75: //shield raise //case 76: // return 0; //shield up //case 77: // return 0; //shied lower //case 78: // return 0; //lower shield while walking //case 79: //start walking w shield //case 80: //walking w shield //case 81: //parry //case 86: // return 0; //1h r1 into r2 combo case 88: return 2; //1h r2 case 89: return 2; //1h r2 combo case 90: return 2; //rolling attack 2h case 103: return 2; //2h r1 case 107: return 2; //2h r1 bounce back case 108: return 2;//uh, i saw this be a normal attack once //2h r1 combo case 109: return 2; //2h r1 combo case 110: return 2; //2h kick replacement case 112: return 2; //jumping 2 hand case 113: return 2; //2h r1 into r2 combo case 114: return 2; //2h r2 case 115: return 2; //2h r2 combo case 116: return 2; //fire surge windup case 135: return 0; //fire surge cast //since this has no windup after the first cast, treat as instant case 136: return 3; //fire surge recover case 137: return 0; //miricle projectile windup case 143: return 0; //miricle projectile cast case 144: return 2; //miricle AOE windup (treat this as real attack, because actual is too fast) case 145: return 4; //miricle AOE cast case 146: return 0; //miricle ground attack windup case 155: return 0; //miricle ground attack cast case 156: return 3; //magic cast windup //TODO includes all dark magic casts and normal magic casts, + homing soul masses case 157: return 0; //magic cast fire case 158: return 3; //homing dark magic windup case 159: return 0; //homing dark magic ready //TODO this is not fire! case 160: return 3; //fire whip windup case 161: return 0; //fire whip cast case 162: return 2; //firestorm windup case 163: return 0;//is a windup, but want to attack during it //firstorm case 164: return 3; //combustion windup (treat this as real attack, because actual is too fast) case 167: return 2; //combustion attack case 168: return 0; //pyro ball windup case 173: return 1; //pyro ball throw case 174: return 3; //1 hand weapon //case 185: // return 0; //1 hand weapon //case 188: // return 0; //2 hand weapon //case 199: // return 0; //2 hand weapon //case 203: // return 0; //weapon switch r //case 209: // return 0; //weapon switch r //case 213: // return 0; //weapon switch l //case 217: // return 0; //weapon switch l //case 221: // return 0; //backstab //case 225: // return 0; default: guiPrint(LocationDetection",3:unknown animation type %d", animationType_id); return 0; } }
float dodgeTimings(int animation_id){ switch (animation_id){ case 100: return 0.5;//catch all for all kicks case 6407: return 0.65;//this animation actually never goes past 0.5, but lie to account for .15 of next animation case 6507: return 0.65;//rhand version of above case 6222: return 0.63;//this animation actually never goes past 0.33, but lie to account for .3 of next animation case 6517: return 1.1; case 6522: return 0.3; case 203000: return 0.25; case 203001: return 0.229667; case 203002: return 0.324; case 203300: return 0.427; case 203310: return 0.426; case 203500: return 0.529; case 203900: return 0.2; case 204000: return 0.3; case 204001: return 0.222; case 204002: return 0.324; case 204300: return 0.392; case 204310: return 0.409; case 204500: return 0.528; case 204900: return 0.133; case 233000: return 0.51; case 233001: return 0.442; case 233002: return 0.442; case 233300: return 0.714; case 233301: return 0.720937; case 233310: return 0.34; case 233500: return 0.51; case 233900: return 2.494666; case 234000: return 0.529333; case 234001: return 0.476; case 234002: return 0.51; case 234300: return 0.578; case 234310: return 0.51; case 234500: return 0.544; case 234900: return 0.23; case 253000: return 0.648; case 253001: return 0.588; case 253002: return 0.652; case 253300: return 0.896; case 253310: return 0.796; case 253500: return 0.588; case 253600: return 1; case 253900: return 0.43; case 254000: return 0.588; case 254001: return 0.632; case 254002: return 0.592; case 254100: return 3.332664; case 254300: return 0.732; case 254310: return 0.896; case 254500: return 0.592; case 254600: return 1; case 254900: return 0.5; case 263000: return 0.956; case 263001: return 0.864; case 263002: return 0.96; case 263300: return 0.912; case 263301: return 0.91175; case 263310: return 0.912; case 263500: return 0.648; case 263900: return 2.999999; case 264000: return 0.744; case 264001: return 0.744; case 264002: return 0.744; case 264300: return 0.912; case 264301: return 0.9135; case 264310: return 0.912; case 264500: return 0.696; case 264900: return 0.55; case 273000: return 0.450292; case 273001: return 0.383688; case 273002: return 0.384479; case 273010: return 0.354604; case 273300: return 0.550417; case 273301: return 0.551042; case 273310: return 0.483938; case 273900: return 0.283646; case 274000: return 0.450688; case 274001: return 0.383771; case 274002: return 0.450625; case 274300: return 0.550542; case 274301: return 0.550583; case 274310: return 0.550583; case 274900: return 0.250375; case 283000: return 0.450458; case 283001: return 0.417208; case 283002: return 0.450229; case 283300: return 1.0185; case 283301: return 1.017417; case 283310: return 0.68375; case 283500: return 0.483813; case 283900: return 0.383917; case 284000: return 0.35075; case 284001: return 0.316938; case 284002: return 0.350521; case 284300: return 0.852125; case 284301: return 0.851313; case 284310: return 0.550521; case 284500: return 0.484021; case 284900: return 0.416896; case 293000: return 0.418792; case 293001: return 0.483833; case 293002: return 0.417313; case 293300: return 0.784125; case 293301: return 0.784625; case 293310: return 0.784375; case 293500: return 0.417063; case 293900: return 0.216833; case 294000: return 0.417438; case 294001: return 0.484417; case 294002: return 0.41725; case 294300: return 1.018042; case 294301: return 1.018271; case 294310: return 1.017812; case 294500: return 0.4; case 294900: return 0.250146; case 303000: return 0.617792; case 303001: return 0.617708; case 303002: return 0.617333; case 303040: return 0.701208; case 303041: return 0.701042; case 303042: return 0.700667; case 303300: return 0.817458; case 303301: return 0.817708; case 303310: return 0.850416; case 303500: return 0.617; case 303540: return 0.700333; case 303900: return 0.485209; case 304000: return 0.617917; case 304001: return 0.617708; case 304002: return 0.617708; case 304040: return 0.701417; case 304041: return 0.701125; case 304042: return 0.701333; case 304300: return 0.818542; case 304301: return 0.818542; case 304310: return 0.751167; case 304500: return 0.617458; case 304900: return 0.484084; case 323000: return 0.851458; case 323001: return 0.85175; case 323002: return 0.852666; case 323300: return 1.186041; case 323301: return 1.186416; case 323310: return 1.1855; case 323500: return 0.78425; case 323900: return 0.585625; case 324000: return 0.851542; case 324001: return 0.851; case 324002: return 0.851167; case 324300: return 1.18525; case 324301: return 1.185541; case 324310: return 1.186166; case 324500: return 0.78475; case 324900: return 0.584792; case 333000: return 0.618; case 333001: return 0.617917; case 333002: return 0.651208; case 333310: return 0.819917; case 333500: return 0.617417; case 333900: return 0.484625; case 334000: return 0.617458; case 334001: return 0.617667; case 334002: return 0.617833; case 334310: return 0.851708; case 334500: return 0.61825; case 334900: return 0.484792; case 353000: return 0.986291; case 353001: return 0.987875; case 353002: return 0.985792; case 353300: return 1.252708; case 353301: return 1.254833; case 353310: return 1.2535; case 353500: return 0.785875; case 353900: return 0.584083; case 354000: return 0.81875; case 354001: return 0.820375; case 354002: return 0.82; case 354300: return 1.254833; case 354301: return 1.252958; case 354310: return 1.254375; case 354500: return 0.787375; case 363000: return 0.46; case 363001: return 0.554833; case 363002: return 0.555583; case 363010: return 0.425125; case 363300: return 0.759166; case 363301: return 0.75675; case 363310: return 0.756; case 363500: return 0.487167; case 363900: return 0.38675; case 364000: return 0.521417; case 364001: return 0.521167; case 364002: return 0.520917; case 364300: return 0.755667; case 364301: return 0.756333; case 364310: return 0.75525; case 364500: return 0.487333; case 364900: return 0.386667; case 383000: return 0.553333; case 383001: return 0.723167; case 383002: return 0.654333; case 383041: return 0.773917; case 383300: return 0.8565; case 383301: return 0.855917; case 383310: return 0.890083; case 383500: return 0.05025; case 383900: return 0.389167; case 384000: return 0.521167; case 384001: return 0.687583; case 384002: return 0.687667; case 384300: return 1.223833; case 384301: return 1.226999; case 384310: return 1.225749; case 384500: return 0.05025; case 384900: return 0.386833; case 423000: return 0.587917; case 423001: return 0.385833; case 423002: return 0.319583; case 423300: return 0.621583; case 423301: return 0.620167; case 423310: return 0.688083; case 423500: return 0.621417; case 423900: return 0.217917; case 503000: return 0.720833; case 503001: return 0.721666; case 503002: return 0.720667; case 503300: return 0.754917; case 503301: return 0.7555; case 503310: return 0.55325; case 503500: return 0.622083; case 503900: return 0.4865; case 504000: return 0.720833; case 504001: return 0.75525; case 504002: return 0.723083; case 504300: return 0.755; case 504301: return 0.755083; case 504310: return 0.587833; case 504600: return 1.0; case 504900: return 0.319083; case 513000: return 0.717354; case 513001: return 0.718188; case 513002: return 0.717896; case 513300: return 1.117979; case 513301: return 1.119812; case 513310: return 0.817563; case 513900: return 0.485; case 514000: return 0.717646; case 514001: return 0.750771; case 514002: return 0.717375; case 514300: return 1.017729; case 514301: return 1.018083; case 514310: return 0.8175; case 514900: return 0.483771; case 533300: return 0.578; case 533301: return 0.590938; case 533310: return 0.646; case 534300: return 0.578; case 534310: return 0.51; case 534900: return 2.312; case 543310: return 0.51; case 544300: return 0.68; case 544310: return 0.51; case 553300: return 0.646; case 553310: return 0.442; case 554300: return 0.646; case 554310: return 0.476; case 563000: return 0.450438; case 563001: return 0.417438; case 563002: return 0.450354; case 563300: return 0.750979; case 563301: return 0.751396; case 563310: return 0.752083; case 563500: return 0.484313; case 563900: return 0.384104; case 564000: return 0.351542; case 564001: return 0.317813; case 564002: return 0.351479; case 564300: return 0.750917; case 564301: return 0.752938; case 564310: return 0.785917; case 564500: return 0.484729; case 564900: return 0.417354; case 573300: return 0.68; case 573310: return 0.612; case 574300: return 0.68; case 574310: return 0.51; case 583300: return 0.577333; case 583310: return 0.646; case 584300: return 1.122; case 584315: return 1.123333; case 584900: return 2.32; case 593300: return 0.920083; case 593301: return 0.918125; case 593310: return 0.951291; case 594300: return 0.918291; case 594301: return 0.918541; case 594310: return 0.95125; case 603300: return 0.818416; case 603301: return 0.818125; case 603310: return 0.717792; case 604300: return 0.717792; case 604301: return 0.727375; case 604310: return 0.685; case 613300: return 1.12125; case 613301: return 1.118208; case 613310: return 1.118666; case 614300: return 0.985125; case 614301: return 0.992625; case 614310: return 0.984833; case 623300: return 1.252708; case 623301: return 1.262916; case 623310: return 1.253583; case 633300: return 0.892917; case 633301: return 0.89125; case 633310: return 0.6885; case 634300: return 0.757833; case 634301: return 0.757083; case 634310: return 0.856917; case 643300: return 1.832082; case 643301: return 1.831165; case 643310: return 1.832415; case 644300: return 1.831665; case 644301: return 1.830375; case 644310: return 1.832749; case 653300: return 0.790083; case 653301: return 0.790083; case 653310: return 0.789583; case 663300: return 1.05875; case 663301: return 1.05875; case 663310: return 1.025583; case 664300: return 0.788917; case 664301: return 0.790333; case 664310: return 0.790083; case 673300: return 1.0925; case 673301: return 1.09225; case 673310: return 1.091666; case 673500: return 1.026167; case 674300: return 1.0245; case 674301: return 1.025; case 674310: return 1.025583; case 674500: return 1.058416; case 683300: return 1.157833; case 683301: return 1.16025; case 683310: return 1.161583; case 684300: return 0.82225; case 684301: return 0.822333; case 684310: return 1.628832; case 703300: return 1.933082; case 703301: return 1.919999; case 703310: return 1.917999; case 704300: return 2.23; case 723300: return 0.529; case 723301: return 0.524437; case 723310: return 0.461; case 724300: return 0.584; case 724310: return 0.426; case 733300: return 0.442; case 733310: return 0.85; case 734300: return 0.544; case 734310: return 0.681333; case 743300: return 0.752; case 743310: return 0.792; case 744300: return 0.732; case 744310: return 0.896; case 744900: return 0.4; case 753300: return 0.764; case 753310: return 0.728; case 754300: return 0.716; case 754310: return 0.728667; case 773300: return 0.792; case 773310: return 0.588; case 783300: return 1.931999; case 783301: return 1.91475; case 784300: return 2.095999; case 793300: return 1.12; case 793305: return 1.12; case 794300: return 1.26; case 794305: return 1.264; case 803300: return 1.715999; case 804300: return 1.691999; case 863300: return 0.788167; case 863301: return 0.789333; case 863310: return 0.51975; case 863900: return 0.486917; case 873300: return 1.829082; case 873301: return 1.827832; case 873310: return 1.827748; case 893300: return 0.683979; case 893301: return 0.684542; case 893310: return 0.686083; case 894300: return 1.085; case 894301: return 1.085646; case 894310: return 1.084333; case 903300: return 1.351666; case 903301: return 1.351458; case 903310: return 1.354187; case 904300: return 1.452396; case 904301: return 1.451958; case 904310: return 1.451146; case 953300: return 1.056; case 953310: return 1.056; case 954300: return 1.056; case 954310: return 1.056; case 963300: return 1.896001; case 963301: return 1.897438; case 964301: return 1.851072; case 964310: return 1.85053; case 973300: return 1.651999; case 973301: return 1.653063; case 974300: return 1.651999; case 983300: return 0.917354; case 983301: return 0.917646; case 983310: return 0.917979; case 984300: return 0.917458; case 984301: return 0.919396; case 984310: return 0.91725; case 993300: return 0.550521; case 993301: return 0.550896; case 993310: return 0.517813; case 994300: return 0.550646; case 994301: return 0.5505; case 994310: return 0.517833; case 1003300: return 1.218375; case 1003301: return 1.20175; case 1003310: return 2.186249; case 1004300: return 1.218166; case 1004301: return 1.21825; case 1004310: return 1.985687; case 1013300: return 1.218083; case 1013301: return 1.219812; case 1013310: return 1.518166; case 1014300: return 1.151396; case 1014301: return 1.151188; case 1014310: return 1.618812; case 1023000: return 0.3835; case 1023001: return 0.283417; case 1023002: return 0.383583; case 1023300: return 0.617292; case 1023301: return 0.617167; case 1023310: return 0.617292; case 1023340: return 0.700625; case 1023341: return 0.7005; case 1023350: return 0.700625; case 1024000: return 0.383833; case 1024001: return 0.317208; case 1024002: return 0.383667; case 1024300: return 0.616917; case 1024301: return 0.618; case 1024310: return 0.616917; case 1024340: return 0.700417; case 1024341: return 0.701333; case 1024350: return 0.700333; case 1033300: return 0.817833; case 1033301: return 0.819167; case 1033310: return 0.818167; case 1034300: return 1.085208; case 1034301: return 1.085333; case 1034310: return 1.552999; case 1043300: return 1.05225; case 1043301: return 1.051291; case 1043310: return 1.051541; case 1044300: return 0.986125; case 1044301: return 0.979; case 1044310: return 0.985; case 1053300: return 1.286124; case 1053301: return 1.286541; case 1053310: return 0.717875; case 1054300: return 1.553624; case 1054301: return 1.552916; case 1054310: return 1.551999; case 1064300: return 1.392374; case 1064301: return 1.386666; case 1064310: return 1.386541; case 1073000: return 0.684542; case 1073001: return 0.650917; case 1073002: return 0.684667; case 1073300: return 1.620291; case 1073301: return 1.618957; case 1073310: return 1.619291; case 1074000: return 0.517334; case 1074001: return 0.617667; case 1074002: return 0.5175; case 1074300: return 1.752916; case 1074301: return 1.752291; case 1074310: return 1.753708; case 1083000: return 0.55425; case 1083001: return 0.55525; case 1083002: return 0.554417; case 1084000: return 0.553583; case 1084001: return 0.554333; case 1084002: return 0.554833; case 1093000: return 0.722333; case 1093001: return 0.78975; case 1093002: return 0.788583; case 1094000: return 0.790166; case 1094001: return 0.7895; case 1094002: return 0.78975; case 1103300: return 1.091916; case 1103301: return 1.091166; case 1103310: return 1.097083; case 1104300: return 1.092; case 1104301: return 1.090833; case 1104310: return 1.0925; case 1123300: return 1.395749; case 1123301: return 1.392749; case 1123310: return 1.392166; case 1124300: return 1.190583; case 1124301: return 1.18375; case 1124310: return 1.194; case 1133300: return 0.617; case 1133301: return 0.61725; case 1133310: return 0.583917; case 1134300: return 0.583792; case 1134301: return 0.583959; case 1134310: return 0.584458; case 1143300: return 0.817625; case 1143301: return 0.817167; case 1143310: return 0.617417; case 1144300: return 0.850833; case 1144301: return 0.850875; case 1144310: return 0.717375; case 1153300: return 1.017375; case 1153301: return 1.018041; case 1153310: return 0.917583; case 1154300: return 0.817583; case 1154301: return 0.817208; case 1154310: return 1.051; case 1163000: return 0.717688; case 1163001: return 0.718; case 1163002: return 0.717667; case 1163300: return 0.917688; case 1163301: return 0.9185; case 1163310: return 0.917729; case 1163900: return 0.484021; case 1164000: return 0.717604; case 1164001: return 0.751021; case 1164002: return 0.717271; case 1164300: return 0.851292; case 1164301: return 0.852417; case 1164310: return 0.850875; case 1164900: return 0.483667; case 1183000: return 0.618708; case 1183001: return 0.617333; case 1183002: return 0.617833; case 1183040: return 0.70225; case 1183041: return 0.70075; case 1183042: return 0.701375; case 1183300: return 0.81825; case 1183301: return 0.818208; case 1183310: return 0.851583; case 1183500: return 0.617417; case 1183540: return 0.700833; case 1183900: return 0.484167; case 1184000: return 0.617708; case 1184001: return 0.617708; case 1184002: return 0.617625; case 1184040: return 0.70125; case 1184041: return 0.701292; case 1184042: return 0.701042; case 1184300: return 0.817875; case 1184301: return 0.817917; case 1184310: return 0.751292; case 1184500: return 0.617542; case 1184900: return 0.484208; case 1193300: return 0.583896; case 1193301: return 0.584604; case 1193310: return 0.584229; case 1194300: return 0.750896; case 1194301: return 0.751146; case 1194310: return 0.750729; case 1203300: return 0.699; case 1243300: return 1.052083; case 1243301: return 1.051625; case 1243310: return 0.685208; case 1244300: return 1.254166; case 1244301: return 1.249875; case 1244310: return 1.25325; case 1253300: return 1.185333; case 1253301: return 1.186166; case 1253310: return 1.185125; case 1254300: return 1.085666; case 1254301: return 1.085041; case 1254310: return 1.0855; case 1283300: return 1.650728; case 1283301: return 1.650437; case 1283310: return 1.652853; case 1284301: return 1.684958; case 1284310: return 1.686708; case 1303000: return 0.306; case 1303001: return 0.238; case 1303002: return 0.306; case 1303300: return 0.578; case 1303310: return 0.578; case 1303500: return 0.51; case 1303900: return 1.598001; case 1304000: return 0.306; case 1304001: return 0.238; case 1304002: return 0.306; case 1304300: return 0.748; case 1304310: return 0.748; case 1304500: return 0.51; case 1304900: return 1.598001; case 1314300: return 1.627999; case 1323000: return 0.450979; case 1323001: return 0.41725; case 1323002: return 0.451229; case 1323300: return 1.18475; case 1323301: return 1.184729; case 1323310: return 1.452146; case 1323500: return 0.484; case 1323900: return 0.383583; case 1324000: return 0.350333; case 1324001: return 0.317208; case 1324002: return 0.350854; case 1324301: return 1.485104; case 1324310: return 1.651958; case 1324500: return 0.483792; case 1324900: return 0.416979; case 1333300: return 1.084958; case 1333301: return 1.084875; case 1333310: return 1.085333; case 1334300: return 1.152416; case 1334301: return 1.15225; case 1344300: return 0.788833; case 1344301: return 0.790667; case 1344310: return 0.79; case 1354300: return 1.791999; default: guiPrint(LocationDetection",4:ALERT: %d animation id not found", animation_id); return 0.21; } }