您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Turns the condition code in the skill overview into something more readable.
// ==UserScript== // @name Gametora Umamusume Skill Condition Explainer // @namespace http://tampermonkey.net/ // @version 2025-10-04--05 // @description Turns the condition code in the skill overview into something more readable. // @author ividyon // @match https://gametora.com/umamusume/* // @icon https://www.google.com/s2/favicons?sz=64&domain=gametora.com // @grant none // @license MIT // ==/UserScript== function capitalizeFirstLetter(val) { return String(val).charAt(0).toUpperCase() + String(val).slice(1); } function charaIdFormat(val) { switch (val) { // NYI } return `Umamusume ID #${val}`; } function skillIdFormat(val) { switch (val) { // NYI } return `ID #${val}`; } function trackIdFormat(val) { switch (val) { case "10001": return "Sapporo"; case "10002": return "Hakodate"; case "10003": return "Niigata"; case "10004": return "Fukushima"; case "10005": return "Nakayama"; case "10006": return "Tokyo"; case "10007": return "Chukyo"; case "10008": return "Kyoto"; case "10009": return "Hanshin"; case "10010": return "Kokura"; case "10101": return "Oi"; case "10103": return "Kawasaki"; case "10104": return "Funabashi"; case "10105": return "Morioka"; } return `ID #${val}`; } function indexFormat(val) { switch (val) { case "1": return "1st"; case "2": return "2nd"; case "3": return "3rd"; case "4": return "4th"; } } function moodFormat(val) { switch (val) { case "1": return "Awful"; case "2": return "Bad"; case "3": return "Normal"; case "4": return "Good"; case "5": return "Great"; } } function distanceTypeFormat(val) { switch (val) { case "1": return "Sprint"; case "2": return "Mile"; case "3": return "Medium"; case "4": return "Long"; } } function phaseFormat(val) { switch (val) { case "0": return "Early-Race"; case "1": return "Mid-Race"; case "2": return "Late-Race"; case "3": return "Last Spurt"; } } function rotationFormat(val) { switch (val) { case "1": return "right-handed"; case "2": return "left-handed"; } } function daytimeFormat(val) { switch (val) { case "0": return "any"; case "1": return "Morning"; case "2": return "Day"; case "3": return "Evening"; case "4": return "Night"; } } function weatherFormat(val) { switch (val) { case "1": return "Sunny"; case "2": return "Cloudy"; case "3": return "Rainy"; case "4": return "Snowy"; } } function runningStyleFormat(val) { switch (val) { case "1": return "Front Runner"; case "2": return "Pace Chaser"; case "3": return "Late Surger"; case "4": return "End Closer"; } } function seasonFormat(val) { switch (val) { case "1": return "Spring (Early)"; case "2": return "Summer"; case "3": return "Fall"; case "4": return "Winter"; case "5": return "Spring (Late, Cherry Blossom)"; } } function groundConditionFormat(val) { switch (val) { case "1": return "Firm"; case "2": return "Good"; case "3": return "Soft"; case "4": return "Heavy"; } } function trackTypeFormat(val) { switch (val) { case "1": return "Turf"; case "2": return "Dirt"; } } function gradeFormat(val) { switch (val) { case "100": return "G1"; case "200": return "G2"; case "300": return "G3"; case "400": return "OP"; case "700": return "Pre-OP"; case "800": return "Maiden"; case "900": return "Make Debut"; case "999": return "Daily"; } } function countFormat(op, val, prefix = "", preposition = "") { if (prefix != "") prefix = `${prefix} `; if (preposition != "") preposition = `${preposition} `; switch (op) { case "!=": if (preposition.startsWith("has") || preposition.startsWith("had")) return `${preposition.replace("has ","does not have ").replace("had ","does not have ")}${prefix}${val}`; return `not ${preposition}${prefix}${val}`; case "==": return `${preposition}${prefix}${val}`; case ">=": return `${preposition}at least ${prefix}${val}`; case "<=": return `${preposition}${prefix}${val} or less`; case ">": return `${preposition}${prefix}over ${val}`; case "<": return `${preposition}${prefix}under ${val}`; } } function countUpDownFormat(op, val, prefix = "", preposition = "") { if (prefix != "") prefix = `${prefix} `; if (preposition != "") preposition = `${preposition} `; switch (op) { case "!=": if (preposition.startsWith("has") || preposition.startsWith("had")) return `${preposition.replace("has ","does not have ").replace("had ","does not have ")}${prefix}${val}`; return `not ${preposition}${prefix}${val}`; case "==": return `${preposition}${prefix}${val}`; case ">=": return `${preposition}${prefix}${val} or higher`; case "<=": return `${preposition}${prefix}${val} or lower`; case ">": return `${preposition}higher than ${prefix}${val}`; case "<": return `${preposition}lower than ${prefix}${val}`; } } function countRatingFormat(op, val, prefix = "", preposition = "") { if (prefix != "") prefix = `${prefix} `; if (preposition != "") preposition = `${preposition} `; switch (op) { case "!=": if (preposition.startsWith("has") || preposition.startsWith("had")) return `${preposition.replace("has ","does not have ").replace("had ","does not have ")}${prefix}${val}`; return `not ${preposition}${prefix}${val}`; case "==": return `${preposition}${prefix}${val}`; case ">=": return `${preposition}at least ${prefix}${val}`; case "<=": return `${preposition}${prefix}${val} or worse`; case ">": return `${preposition}better than ${prefix}${val}`; case "<": return `${preposition}worse than ${prefix}${val}`; } } function countTimeFormat(op, val, prefix = "", preposition = "") { if (prefix != "") prefix = `${prefix} `; if (preposition != "") preposition = `${preposition} `; switch (op) { case "!=": if (preposition.startsWith("has") || preposition.startsWith("had")) return `${preposition.replace("has ","does not have ").replace("had ","does not have ")}${prefix}${val}`; return `not ${preposition}${prefix}${val}`; case "==": return `${preposition}${prefix}${val}`; case ">=": return `${preposition}${prefix}${val} or later`; case "<=": return `${preposition}${prefix}${val} or earlier`; case ">": return `${preposition}later than ${prefix}${val}`; case "<": return `${preposition}earlier than ${prefix}${val}`; } } function countRatingInvertedFormat(op, val, prefix = "", preposition = "") { if (prefix != "") prefix = `${prefix} `; if (preposition != "") preposition = `${preposition} `; switch (op) { case "!=": if (preposition.startsWith("has") || preposition.startsWith("had")) return `${preposition.replace("has ","does not have ").replace("had ","does not have ")}${prefix}${val}`; return `not ${preposition}${prefix}${val}`; case "==": return `${preposition}${prefix}${val}`; case ">=": return `${preposition}${prefix}${val} or worse`; case "<=": return `${preposition}at least ${prefix}${val}`; case ">": return `${preposition}worse than ${prefix}${val}`; case "<": return `${preposition}better than ${prefix}${val}`; } } function timeOnOpFormat(op) { switch (op) { case "!=": return `not on`; case "==": return `on`; case ">=": return `on or after`; case "<=": return `on or before`; case ">": return `after`; case "<": return `before`; } } function timeInOpFormat(op) { switch (op) { case "!=": return `not in`; case "==": return `in`; case ">=": return `in or after`; case "<=": return `in or before`; case ">": return `after`; case "<": return `before`; } } (async function() { 'use strict'; let stopped = false const observer = new MutationObserver(records => { for (const record of records) { if (record.type != "childList") continue; for (const addedElement of [...record.addedNodes].filter((node) => node instanceof Element)) { for (const conditionContainer of [...addedElement.querySelectorAll('.tooltips_tooltip_line__OStyx')] .filter((elm) => elm.firstElementChild.textContent == "Conditions:")) { const conditionElm = conditionContainer.children.item(1); if (conditionElm == null) continue; console.debug("ivi tooltip was added!!"); let splitByOr = conditionElm.textContent.replace('\n', '').split('@'); splitByOr = splitByOr.map((orPart) => { const conditions = orPart.split('&').map((condition) => { console.debug(condition); const operatorMatch = condition.match(/(.*?)(!=|==|<=|>=|<|>)(.*)/); console.debug(operatorMatch); const cond = operatorMatch[1]; const op = operatorMatch[2]; const val = operatorMatch[3]; let fullRewrite = false; let prettyCond = cond; let prettyOp = op; let prettyVal = val; switch (op) { case "!=": prettyOp = "is not"; break; case "==": prettyOp = "is"; break; case ">=": prettyOp = "is greater or equal than" break; case "<=": prettyOp = "is less or equal than" break; case ">": prettyOp = "is greater than" break; case "<": prettyOp = "is less than" break; } if (cond == "accumulatetime") { return `Race ongoing for ${countFormat(op, val)} sec.`; } else if (cond == "activate_count_all") { return `Activated ${countFormat(op, val)} skills total`; } else if (cond == "activate_count_all_team") { return `Team activated ${countFormat(op, val)} skills total`; } else if (cond == "activate_count_end_after") { return `Activated ${countFormat(op, val)} skills in Late-Race or Last Spurt`; } else if (cond == "activate_count_heal") { return `Activated ${countFormat(op, val)} recovery skills`; } else if (cond == "activate_count_later_half") { return `Activated ${countFormat(op, val)} skills in 2nd half of race`; } else if (cond == "activate_count_middle") { return `Activated ${countFormat(op, val)} skills in Mid-Race`; } else if (cond == "activate_count_start") { return `Activated ${countFormat(op, val)} skills in Early-Race`; } else if (cond == "all_corner_random") { return `At random in any corner`; } else if (cond == "always") { return `Always`; } else if (cond == "base_guts") { return `Has ${countFormat(op, val)} Guts`; } else if (cond == "base_power") { return `Has ${countFormat(op, val)} Power`; } else if (cond == "base_speed") { return `Has ${countFormat(op, val)} Speed`; } else if (cond == "base_stamina") { return `Has ${countFormat(op, val)} Stamina`; } else if (cond == "base_wiz") { return `Has ${countFormat(op, val)} Wits`; } else if (cond == "bashin_diff_behind") { let noun = "lengths"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) noun = "length"; return `${capitalizeFirstLetter(countFormat(op, val))} ${noun} between you and runner behind`; } else if (cond == "bashin_diff_infront") { let noun = "lengths"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) noun = "length"; return `${capitalizeFirstLetter(countFormat(op, val))} ${noun} between you and runner ahead`; } else if (cond == "behind_near_lane_time") { return `${capitalizeFirstLetter(countFormat(op, val, "", "has an runner right behind for"))} sec.`; } else if (cond == "behind_near_lane_time_set1") { return `${capitalizeFirstLetter(countFormat(op, val, "", "has an runner behind for"))} sec.`; } else if (cond == "blocked_all_continuetime") { return `${capitalizeFirstLetter(countFormat(op, val, "", "blocked on the front and side for"))} sec.`; } else if (cond == "blocked_front") { return `Blocked on the front`; } else if (cond == "blocked_front_continuetime") { return `${capitalizeFirstLetter(countFormat(op, val, "", "blocked on the front for"))} sec.`; } else if (cond == "blocked_side_continuetime") { return `${capitalizeFirstLetter(countFormat(op, val, "", "blocked on the side for"))} sec.`; } else if (cond == "change_order_onetime") { if ( op==">" ) return `Just got passed by another runner`; return `Just passed another runner`; } else if (cond == "change_order_up_end_after") { return `Overtook an runner since entering Late-Race ${countFormat(op, val)} times`; } else if (cond == "change_order_up_finalcorner_after") { return `Overtook an runner since entering Final Corner ${countFormat(op, val)} times`; } else if (cond == "change_order_up_middle") { return `Passed an runner during Mid-Race ${countFormat(op, val)} times`; } if (cond == "compete_fight_count") { return `Had a showdown with an runner in the Final Straight ${countFormat(op, val)} times`; } else if (cond == "corner") { if (op == "!=" && val == "0") return `Is in any corner`; if (op == "==" && val == "0") return `Is not in a corner`; switch (op) { case "!=": return `Is not in the ${indexFormat(val)} corner`; case "==": return `Is in the ${indexFormat(val)} corner`; case ">=": return `Is in a corner no earlier than the ${indexFormat(val)}`; case "<=": return `Is in a corner no later than the ${indexFormat(val)}`; case ">": return `Is in a corner after the ${indexFormat(val)}`; case "<": return `Is in a corner before ${indexFormat(val)}`; } return `Is ${timeOpFormat(op)} the ${indexedCornerToString(val)}`; } else if (cond == "corner_count") { // NYI } else if (cond == "corner_random") { return `At a random point in the ${indexFormat(val)} corner`; } else if (cond == "course_distance") { return `Total race length is ${countFormat(op, val)}m`; } else if (cond == "distance_diff_rate") { switch (op) { case "!=": return `Currently not at the exact ${val}% of the pack (by distance)`; case "==": return `Currently at the exact ${val}% of the pack (by distance)`; case ">=": return `Currently in the last ${100 - parseInt(val)}% of the pack (by distance)`; case "<=": return `Currently in the leading ${val}% of the pack (by distance)`; case ">": return `Currently in the last ${100 - parseInt(val)}% of the pack (by distance)`; case "<": return `Currently in the leading ${val}% of the pack (by distance)`; } } else if (cond == "distance_diff_top") { return `Is ${countFormat(op, val / 10)}m from the leading runner`; } else if (cond == "distance_diff_top_float") { return `Is ${countFormat(op, val / 10)}m from the leading runner`; } else if (cond == "distance_rate") { return `Race progress is ${countFormat(op, val, "at")}%`; } else if (cond == "distance_rate_after_random") { return `At random time after ${val}% of race progression`; } else if (cond == "distance_type") { return `${capitalizeFirstLetter(countFormat(op, distanceTypeFormat(val), "a", "in"))} race`; } else if (cond == "down_slope_random") { return `At a random point on a downhill`; } else if (cond == "furlong") { // NYI } else if (cond == "grade") { return `${capitalizeFirstLetter(countFormat(op, gradeFormat(val), "a", "in"))} race`; } else if (cond == "ground_condition") { return `Ground condition is ${countFormat(op, groundConditionFormat(val))}`; } else if (cond == "ground_type") { return `${capitalizeFirstLetter(countFormat(op, trackTypeFormat(val), "a", "on"))} race track`; } else if (cond == "hp_per") { prettyCond = "Remaining Endurance"; prettyVal = `${val}%`; } else if (cond == "infront_near_lane_time") { return `${capitalizeFirstLetter(countFormat(op, val, "", "has an runner in front for"))} sec.`; } else if (cond == "is_activate_any_skill") { return `Just activated any other skill`; } else if (cond == "is_activate_heal_skill") { // NYI } else if (cond == "is_badstart") { if (val == 0) return `Did not have a late start`; return `Had a late start`; } else if (cond == "is_basis_distance") { if (val == 0) return `On a Non-Standard Distance race track (not multiple of 400m)`; return `On a Standard Distance track (multiple of 400m)`; } else if (cond == "is_behind_in") { if (val == 0) return `Closer to inside fence than runner behind`; return `Further from inside fence than runner behind`; } else if (cond == "is_dirtgrade") { if (val == 0) return `On a Central (not local) race track`; return `On a local/regional race track`; } else if (cond == "is_exist_chara_id") { return `${charaIdFormat(val)} is participating in the race (any outfit)`; } else if (cond == "is_exist_skill_id") { // NYI } else if (cond == "is_finalcorner") { if (val == 1) return `In the final corner or the straight after`; return `Not yet reached the final corner`; } else if (cond == "is_finalcorner_laterhalf") { if (val == 1) return `In the 2nd half of the final corner`; return `Not yet reached the 2nd half of the final corner`; } else if (cond == "is_finalcorner_random") { return `At a random point on the final corner`; } else if (cond == "is_hp_empty_onetime") { if (val == 1) return `Has fully exhausted endurance at least once`; return `Has not yet fully exhausted endurance`; } else if (cond == "is_last_straight") { if (val == 1) return `On the last (or only) straight`; return `Before the last straight`; } else if (cond == "is_last_straight_onetime") { return `Just entered the last straight`; } else if (cond == "is_lastspurt") { if (val == 1) return `In "last spurt" mode in the Late-Race`; return `Not in "last spurt" mode`; } else if (cond == "is_move_lane") { if (val == 1) return `Just moved lanes towards the inside`; return `Just moved lanes towards the outside`; } else if (cond == "is_other_character_activate_advantage_skill") { return `Another runner just activated a ${advantageSkillFormat(val)} skill`; } else if (cond == "is_overtake") { if (val == 1) return `Has a target runner ahead to attempt to pass`; return `Does not have a target runner ahead to attempt to pass`; } else if (cond == "is_surrounded") { if (val == 1) return `Currently surrounded by other runners`; return `Not currently surrounded by other runners`; } else if (cond == "is_temptation") { if (val == 1) return `Currently in "Rushed" state`; return `Not currently in "Rushed" state`; } else if (cond == "is_used_skill_id") { return `Activated the skill ${skillIdFormat(val)} at least once during the race`; } else if (cond == "lane_type") { let laneVal; if (val <= 0.2) laneVal = "on an inside lane"; else if (val <= 0.4) laneVal = "on a middle lane"; else if (val <= 0.6) laneVal = "on an outer lane"; else laneVal = "on the outside"; switch (op) { case "!=": return `Is not ${laneVal}`; case "==": return `Is ${laneVal}`; case ">=": if (val > 0.6) return `Is on the outside`; return `Is ${laneVal} or further outside`; case "<=": return `Is ${laneVal} or further inside`; case ">": return `Is ${laneVal.replace("on ","beyond ")}`; case "<": return `Is ${laneVal.replace("on ","closer inside than ")}`; } } else if (cond == "last_straight_random") { return `At a random point on the final straight`; } else if (cond == "lastspurt") { if (val == 1) return `Lacks the endurance to finish the race's last spurt at maximum speed`; if (val == 2) return `Has the endurance to finish the race's last spurt at maximum speed`; return `Lacks the endurance to finish the race's last spurt at base speed`; } else if (cond == "motivation") { return `Mood is ${countRatingFormat(op, moodFormat(val))}`; } else if (cond == "near_count") { let noun = "runners"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) noun = "runner"; return `${capitalizeFirstLetter(countFormat(op, val, "", "has"))} ${noun} nearby`; } else if (cond == "near_infront_count") { // NYI } else if (cond == "order") { return `Currently ranked ${countRatingFormat(op, `#${val}`)} in the race`; } else if (cond == "order_rate") { switch (op) { case "!=": return `Currently not at the exact ${val}% of the pack (by ranking)`; case "==": return `Currently at the exact ${val}% of the pack (by ranking)`; case ">=": return `Currently in the last ${100 - parseInt(val)}% of the pack (by ranking)`; case "<=": return `Currently in the leading ${val}% of the pack (by ranking)`; case ">": return `Currently in the last ${100 - parseInt(val)}% of the pack (by ranking)`; case "<": return `Currently in the leading ${val}% of the pack (by ranking)`; } } else if (cond == "order_rate_in20_continue") { if (val == 1) return `Has been in the top 20% of the ranking since the start`; return `Dipped below the top 20% of the ranking at some point`; } else if (cond == "order_rate_in40_continue") { if (val == 1) return `Has been in the top 40% of the ranking since the start`; return `Dipped below the top 40% of the ranking at some point`; } else if (cond == "order_rate_in50_continue") { if (val == 1) return `Has been in the top 50% of the ranking since the start`; return `Dipped below the top 50% of the ranking at some point`; } else if (cond == "order_rate_in80_continue") { if (val == 1) return `Has been in the top 80% of the ranking since the start`; return `Dipped below the top 80% of the ranking at some point`; } else if (cond == "order_rate_out20_continue") { if (val == 1) return `Stayed in the bottom 20% of the ranking since the start`; return `Left the bottom 20% of the ranking at some point`; } else if (cond == "order_rate_out40_continue") { if (val == 1) return `Stayed in the bottom 40% of the ranking since the start`; return `Left the bottom 40% of the ranking at some point`; } else if (cond == "order_rate_out50_continue") { if (val == 1) return `Stayed in the bottom 50% of the ranking since the start`; return `Left the bottom 50% of the ranking at some point`; } else if (cond == "order_rate_out70_continue") { if (val == 1) return `Never reached the top 30% of the ranking`; return `Reached the top 30% of the ranking at some point`; } else if (cond == "overtake_target_no_order_up_time") { return `Had a target runner ahead to attempt to pass for ${countFormat(op, val)} sec.` } else if (cond == "overtake_target_time") { return `${capitalizeFirstLetter(countFormat(op, val, "", "has been an target for another runner to attempt to pass for"))} sec.` } else if (cond == "phase") { return `${capitalizeFirstLetter(countTimeFormat(op, phaseFormat(val), "", "currently"))}` } else if (cond == "phase_corner_random") { return `At a random point on a corner during the ${phaseFormat(val)}`; } else if (cond == "phase_first_half_straight_random") { // NYI } else if (cond == "phase_firsthalf") { // NYI } else if (cond == "phase_firsthalf_random") { return `At a random point in the first half of the ${phaseFormat(val)}`; } else if (cond == "phase_firstquarter") { // NYI } else if (cond == "phase_firstquarter_random") { return `At a random point in the first quarter of the ${phaseFormat(val)}`; } else if (cond == "phase_laterhalf") { // NYI } else if (cond == "phase_laterhalf_random") { return `At a random point in the second half of the ${phaseFormat(val)}`; } else if (cond == "phase_latter_half_straight_random") { // NYI } else if (cond == "phase_random") { return `At a random point during the ${phaseFormat(val)}`; } else if (cond == "phase_straight_random") { // NYI } else if (cond == "popularity") { return `Popularity is ${countRatingInvertedFormat(op, `#${val}`)}`; } else if (cond == "post_number") { return `Positioned in starting gate bracket (not individual gate) ${countUpDownFormat(op, val)}`; } else if (cond == "random_lot") { return `${val}% chance to activate` } else if (cond == "remain_distance") { return `Remaining distance is ${countFormat(op, val)}m`; } else if (cond == "remain_distance_viewer_id") { return `Remaining distance for any non-NPC runner is ${countFormat(op, val)}m`; } else if (cond == "rotation") { return `${capitalizeFirstLetter(countFormat(op, rotationFormat(val), "a", "on"))} race track`; } else if (cond == "running_style") { return `Using ${countFormat(op, runningStyleFormat(val))} strategy`; } else if (cond == "running_style_count_nige_otherself") { let verb = "are"; let noun = "Front Runners"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "Front Runner" } return `${capitalizeFirstLetter(countFormat(op, val, "", `there ${verb}`))} ${noun} in the race (except you)`; } else if (cond == "running_style_count_oikomi_otherself") { let verb = "are"; let noun = "End Closers"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "End Closer" } return `${capitalizeFirstLetter(countFormat(op, val, "", `there ${verb}`))} ${noun} in the race (except you)`; } else if (cond == "running_style_count_sashi_otherself") { let verb = "are"; let noun = "Late Surgers"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "Late Surger" } return `${capitalizeFirstLetter(countFormat(op, val, "", `there ${verb}`))} ${noun} in the race (except you)`; } else if (cond == "running_style_count_senko_otherself") { let verb = "are"; let noun = "Pace Chasers"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "Pace Chaser" } return `${capitalizeFirstLetter(countFormat(op, val, "", `there ${verb}`))} ${noun} in the race (except you)`; } else if (cond == "running_style_count_same") { let verb = "are"; let noun = "runners"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "runner" } return `There ${verb} ${countFormat(op, parseInt(val) - 1)} other ${noun} in the race sharing your running style`; } else if (cond == "running_style_count_same_rate") { return `${capitalizeFirstLetter(countFormat(op, parseInt(val) - 1))}% of runners in the race share your running style`; } else if (cond == "running_style_equal_popularity_one") { if (val == 1) return `The #1 most popular runner shares your running style`; return `The #1 most popular runner does not share your running style`; } else if (cond == "running_style_temptation_count_nige") { let verb = "are"; let noun = "Front Runners"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "Front Runner" } return `${capitalizeFirstLetter(countFormat(op, val))} ${noun} ${verb} currently Rushed (including you)`; } else if (cond == "running_style_temptation_count_oikomi") { let verb = "are"; let noun = "End Closers"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "End Closer" } return `${capitalizeFirstLetter(countFormat(op, val))} ${noun} ${verb} currently Rushed (including you)`; } else if (cond == "running_style_temptation_count_sashi") { let verb = "are"; let noun = "Late Surgers"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "Late Surger" } return `${capitalizeFirstLetter(countFormat(op, val))} ${noun} ${verb} currently Rushed (including you)`; } else if (cond == "running_style_temptation_count_senko") { let verb = "are"; let noun = "Pace Chasers"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "Pace Chaser" } return `${capitalizeFirstLetter(countFormat(op, val))} ${noun} ${verb} currently Rushed (including you)`; } else if (cond == "running_style_temptation_opponent_count_nige") { let verb = "are"; let noun = "Front Runners"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "Front Runner" } return `${capitalizeFirstLetter(countFormat(op, val))} opponent ${noun} ${verb} currently Rushed`; } else if (cond == "running_style_temptation_opponent_count_oikomi") { let verb = "are"; let noun = "End Closers"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "End Closer" } return `${capitalizeFirstLetter(countFormat(op, val))} opponent ${noun} ${verb} currently Rushed`; } else if (cond == "running_style_temptation_opponent_count_sashi") { let verb = "are"; let noun = "Late Surgers"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "Late Surger" } return `${capitalizeFirstLetter(countFormat(op, val))} opponent ${noun} ${verb} currently Rushed`; } else if (cond == "running_style_temptation_opponent_count_senko") { let verb = "are"; let noun = "Pace Chasers"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "Pace Chaser" } return `${capitalizeFirstLetter(countFormat(op, val))} enemy ${noun} ${verb} currently Rushed)`; } else if (cond == "same_skill_horse_count") { let verb = "own"; let noun = "runners"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "owns"; noun = "runner" } return `${capitalizeFirstLetter(countFormat(op, val))} ${noun} in the race ${verb} the same skill (including you)`; } else if (cond == "season") { return `The season is ${countTimeFormat(op, seasonFormat(val))}`; } else if (cond == "slope") { if (val == 1) return `Currently running uphill`; if (val == 2) return `Currently running downhill`; return `Currently not on a slope`; } else if (cond == "straight_front_type") { if (val == 1) return `Currently on the homestretch`; if (val == 2) return `Currently on the backstretch`; } else if (cond == "straight_random") { return `At a random point on any straight`; } else if (cond == "temptation_count") { return `Became Rushed during the race ${countFormat(op, val)} times`; } else if (cond == "temptation_count_behind") { let verb = "are"; let noun = "runners"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "runner" } return `${capitalizeFirstLetter(countFormat(op, val))} ${noun} behind ${verb} currently Rushed`; } else if (cond == "temptation_count_infront") { let verb = "are"; let noun = "runners"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "runner" } return `${capitalizeFirstLetter(countFormat(op, val))} ${noun} ahead ${verb} currently Rushed`; } else if (cond == "temptation_opponent_count_behind") { let verb = "are"; let noun = "runners"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "runner" } return `${capitalizeFirstLetter(countFormat(op, val))} opponent ${noun} behind ${verb} currently Rushed`; } else if (cond == "temptation_opponent_count_infront") { let verb = "are"; let noun = "runners"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "runner" } return `${capitalizeFirstLetter(countFormat(op, val))} opponent ${noun} behind ${verb} currently Rushed`; } else if (cond == "time") { return `The time of day is ${countTimeFormat(op, daytimeFormat(val))}`; } else if (cond == "track_id") { return `${capitalizeFirstLetter(countFormat(op, trackIdFormat(val), "a", "on"))} race track`; } else if (cond == "up_slope_random") { return `At a random point on an uphill`; } else if (cond == "up_slope_random_later_half") { // NYI } else if (cond == "visiblehorse") { let verb = "are"; let noun = "runners"; if (val == "1" && (op == "==" || op == "!=" || op == ">=")) { verb = "is"; noun = "runner" } return `${capitalizeFirstLetter(countFormat(op, val))} ${noun} ${verb} currently in line of sight`; } else if (cond == "weather") { return `The weather is ${countTimeFormat(op, weatherFormat(val))}`; } return `${prettyCond} ${prettyOp} ${prettyVal}`; }); return `<ul style="line-height: 1.5;margin: 0.5em 0;padding-left: 1.5em;white-space:normal;">${conditions.map((c) => `<li>${c}</li>`).join('\n')}</ul>`; }); conditionElm.innerHTML = splitByOr.join("<div>- OR -</div>"); } } } }); observer.observe(document.body, { childList: true, subtree: true }); })();