Skip to content

Instantly share code, notes, and snippets.

@xSke
Created March 15, 2022 15:33
Show Gist options
  • Select an option

  • Save xSke/979dabd395c39eff36bcaccf87d66a3e to your computer and use it in GitHub Desktop.

Select an option

Save xSke/979dabd395c39eff36bcaccf87d66a3e to your computer and use it in GitHub Desktop.
from amiibo import AmiiboDump, AmiiboMasterKey
from bitstring import BitString
import sys
import json
with open("unfixed-info.bin", "rb") as fp_d, open("locked-secret.bin", "rb") as fp_t:
master_keys = AmiiboMasterKey.from_separate_bin(fp_d.read(), fp_t.read())
with open("personality_data.json", "r") as fp:
groups_data = json.load(fp)
param_defs = [
("near", 7),
("offensive", 7),
("grounded", 7),
("attack_out_cliff", 6),
("dash", 7),
("return_to_cliff", 6),
("air_offensive", 6),
("cliffer", 6),
("feint_master", 7),
("feint_counter", 7),
("feint_shooter", 7),
("catcher", 7),
("_100_attacker", 6),
("_100_keeper", 6),
("attack_cancel", 6),
("smash_holder", 7),
("dash_attacker", 7),
("critical_hitter", 6),
("meteor_master", 6),
("shield_master", 7),
("just_shield_master", 6),
("shield_catch_master", 6),
("item_collector", 5),
("item_throw_to_target", 5),
("dragoon_collector", 4),
("smashball_collector", 4),
("hammer_collector", 4),
("special_flagger", 4),
("item_swinger", 5),
("homerun_batter", 4),
("club_swinger", 4),
("death_swinger", 4),
("item_shooter", 5),
("carrier_broker", 5),
("charger", 5),
("appeal", 5),
# the ones below here are unused for personality calculations but still useful for the parser
("fighter_01", 7),
("fighter_02", 7),
("fighter_03", 7),
("fighter_04", 7),
("fighter_05", 7),
("advantagious_fighter", 7),
("weaken_fighter", 7),
("revenge", 7),
("attack_s", 10),
("attack_hi", 10),
("attack_lw", 10),
("smash_s", 10),
("smash_hi", 10),
("smash_lw", 10),
("special_n", 10),
("special_s", 10),
("special_hi", 10),
("special_lw", 10),
("attack_air_f", 9),
("attack_air_b", 9),
("attack_air_hi", 9),
("attack_air_lw", 9),
("special_air_n", 9),
("special_air_s", 9),
("special_air_hi", 9),
("special_air_lw", 9),
("escape_air_forward", 8),
("escape_air_backward", 8),
("appeal_hi", 7),
("appeal_lw", 7),
]
personality_names = [
"Normal",
# def
"Cautious",
"Realistic",
"Unflappable",
# agl
"Light",
"Quick",
"Lightning Fast",
# ofn
"Enthusiastic",
"Aggressive",
"Offensive",
# rsk
"Reckless",
"Thrill Seeker",
"Daredevil",
# gen
"Versatile",
"Tricky",
"Technician",
# ent
"Show-Off",
"Flashy",
"Entertainer",
# cau
"Cool",
"Logical",
"Sly",
# dyn
"Laid Back",
"Wild",
"Lively",
]
def decode_behavior_params(dump: AmiiboDump):
params = {}
# This data gets a lot simpler to read if you treat it as a bitstream
# and then read it "in reverse" (flip the bytes, then read bits back to front = no byte swap issues)
behavior_data = dump.data[0x1BC:0x1F6]
bits = BitString(behavior_data[::-1])
for name, size in param_defs[::-1]:
val = bits.read("uint:{}".format(size))
# even the game internals work with "out of 100" values so we'll keep doing that here
val_max = (1 << size) - 1
params[name] = val / val_max * 100
return params
def scale_value(param, value, flip):
# the original code actually defines a default of 0 for "appeal", and then divides by it
# on ARM this just results in 0, anywhere else it'll blow up ;)
if param == "appeal":
return 0
# some of the "directional weight" parameters have different defaults defined in the code but none of them are ever used here so lol
default = 50
if flip:
scaled = (default - value) / default
else:
scaled = (value - default) / default
# since we rescale to range from -1.0 to 1.0, this means values below halfway are meaningless lol
return max(0, min(1, scaled))
def calculate_group_score(params, group):
score = 0
for param_data in group["scores"]:
name = param_data["param"]
value = scale_value(name, params[name], param_data["flip"])
if value >= param_data["min_1"]:
score += param_data["point_1"]
if value >= param_data["min_2"]:
score += param_data["point_2"]
return score
def meets_group_necessary_requirements(params, group):
name = group["necessary_param"]
if not name:
return True
value = scale_value(name, params[name], group["necessary_flip"])
return value >= group["necessary_min"]
def get_personality_tier(group, score):
winner = 0 # default is Normal
for tier in group["tiers"]:
if score >= tier["points"]:
winner = tier["personality"]
return winner
def calculate_personality(params):
group_scores = []
for group_id, group_data in groups_data.items():
if not meets_group_necessary_requirements(params, group_data):
continue
score = calculate_group_score(params, group_data)
# using numeric index as a tiebreaker here
key = (score, group_data["index"])
group_scores.append((key, group_data))
print("{}: {} pts".format(group_id, score))
if not group_scores:
# if no groups are eligible, we're Normal
return 0
# find the best group!
(winner_score, _), winner_group = max(group_scores)
return get_personality_tier(winner_group, winner_score)
if __name__ == "__main__":
with open(sys.argv[1], "rb") as fp:
dump = AmiiboDump(master_keys, fp.read())
dump.unlock()
params = decode_behavior_params(dump)
personality = calculate_personality(params)
print("final personality: {}".format(personality_names[personality]))
{
"def": {
"index": 1,
"scores": [
{
"param": "offensive",
"min_1": 0.26,
"point_1": 18,
"min_2": 0.76,
"point_2": 20,
"flip": true
},
{
"param": "grounded",
"min_1": 0.25,
"point_1": 18,
"min_2": 0.76,
"point_2": 18,
"flip": false
},
{
"param": "attack_out_cliff",
"min_1": 0.26,
"point_1": 10,
"min_2": 0.51,
"point_2": 15,
"flip": true
},
{
"param": "dash",
"min_1": 0.51,
"point_1": 18,
"min_2": 0.76,
"point_2": 25,
"flip": true
},
{
"param": "cliffer",
"min_1": 0.26,
"point_1": 15,
"min_2": 0.51,
"point_2": 20,
"flip": true
},
{
"param": "shield_master",
"min_1": 0.25,
"point_1": 38,
"min_2": 0.76,
"point_2": 42,
"flip": false
},
{
"param": "shield_catch_master",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.51,
"point_2": 5,
"flip": false
},
{
"param": "item_throw_to_target",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.51,
"point_2": 4,
"flip": true
},
{
"param": "dragoon_collector",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.51,
"point_2": 4,
"flip": true
},
{
"param": "smashball_collector",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.51,
"point_2": 4,
"flip": true
},
{
"param": "hammer_collector",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.51,
"point_2": 4,
"flip": true
},
{
"param": "special_flagger",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.51,
"point_2": 4,
"flip": true
}
],
"tiers": [
{
"points": 100,
"personality": 1
},
{
"points": 180,
"personality": 2
},
{
"points": 240,
"personality": 3
}
],
"necessary_param": "offensive",
"necessary_min": 0.26,
"necessary_flip": true
},
"agl": {
"index": 2,
"scores": [
{
"param": "offensive",
"min_1": 0.25,
"point_1": 11,
"min_2": 0.51,
"point_2": 24,
"flip": false
},
{
"param": "dash",
"min_1": 0.25,
"point_1": 16,
"min_2": 0.76,
"point_2": 40,
"flip": false
},
{
"param": "air_offensive",
"min_1": 0.26,
"point_1": 5,
"min_2": 0.76,
"point_2": 15,
"flip": true
},
{
"param": "smash_holder",
"min_1": 0.26,
"point_1": 11,
"min_2": 0.51,
"point_2": 22,
"flip": true
},
{
"param": "dash_attacker",
"min_1": 0.25,
"point_1": 13,
"min_2": 0.51,
"point_2": 22,
"flip": false
},
{
"param": "critical_hitter",
"min_1": 0.26,
"point_1": 8,
"min_2": 0.76,
"point_2": 15,
"flip": true
},
{
"param": "shield_master",
"min_1": 0.26,
"point_1": 13,
"min_2": 0.76,
"point_2": 30,
"flip": true
},
{
"param": "item_collector",
"min_1": 0.22,
"point_1": 11,
"min_2": 0.48,
"point_2": 15,
"flip": false
},
{
"param": "hammer_collector",
"min_1": 0.26,
"point_1": 2,
"min_2": 0.51,
"point_2": 3,
"flip": true
},
{
"param": "special_flagger",
"min_1": 0.26,
"point_1": 2,
"min_2": 0.51,
"point_2": 3,
"flip": true
},
{
"param": "homerun_batter",
"min_1": 0.26,
"point_1": 2,
"min_2": 0.51,
"point_2": 3,
"flip": true
},
{
"param": "club_swinger",
"min_1": 0.26,
"point_1": 2,
"min_2": 0.51,
"point_2": 3,
"flip": true
},
{
"param": "carrier_broker",
"min_1": 0.22,
"point_1": 2,
"min_2": 0.48,
"point_2": 3,
"flip": false
},
{
"param": "charger",
"min_1": 0.26,
"point_1": 2,
"min_2": 0.51,
"point_2": 2,
"flip": true
}
],
"tiers": [
{
"points": 100,
"personality": 4
},
{
"points": 170,
"personality": 5
},
{
"points": 225,
"personality": 6
}
],
"necessary_param": "dash",
"necessary_min": 0.25,
"necessary_flip": false
},
"ofn": {
"index": 3,
"scores": [
{
"param": "near",
"min_1": 0.25,
"point_1": 15,
"min_2": 0.76,
"point_2": 22,
"flip": false
},
{
"param": "offensive",
"min_1": 0.25,
"point_1": 21,
"min_2": 0.76,
"point_2": 30,
"flip": false
},
{
"param": "attack_out_cliff",
"min_1": 0.26,
"point_1": 13,
"min_2": 0.51,
"point_2": 20,
"flip": false
},
{
"param": "dash",
"min_1": 0.25,
"point_1": 11,
"min_2": 0.51,
"point_2": 13,
"flip": false
},
{
"param": "air_offensive",
"min_1": 0.26,
"point_1": 10,
"min_2": 0.76,
"point_2": 18,
"flip": false
},
{
"param": "feint_shooter",
"min_1": 0.26,
"point_1": 7,
"min_2": 0.76,
"point_2": 8,
"flip": true
},
{
"param": "dash_attacker",
"min_1": 0.25,
"point_1": 10,
"min_2": 0.51,
"point_2": 18,
"flip": false
},
{
"param": "meteor_master",
"min_1": 0.26,
"point_1": 10,
"min_2": 0.51,
"point_2": 28,
"flip": false
},
{
"param": "item_collector",
"min_1": 0.26,
"point_1": 2,
"min_2": 0.51,
"point_2": 4,
"flip": true
},
{
"param": "item_throw_to_target",
"min_1": 0.48,
"point_1": 4,
"min_2": 0.74,
"point_2": 8,
"flip": false
},
{
"param": "dragoon_collector",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.51,
"point_2": 4,
"flip": true
},
{
"param": "smashball_collector",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.51,
"point_2": 4,
"flip": true
},
{
"param": "hammer_collector",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.51,
"point_2": 4,
"flip": true
},
{
"param": "special_flagger",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.76,
"point_2": 4,
"flip": true
}
],
"tiers": [
{
"points": 100,
"personality": 7
},
{
"points": 180,
"personality": 8
},
{
"points": 235,
"personality": 9
}
],
"necessary_param": "near",
"necessary_min": 0.25,
"necessary_flip": false
},
"rsk": {
"index": 4,
"scores": [
{
"param": "near",
"min_1": 0.25,
"point_1": 15,
"min_2": 0.51,
"point_2": 22,
"flip": false
},
{
"param": "offensive",
"min_1": 0.25,
"point_1": 11,
"min_2": 0.76,
"point_2": 16,
"flip": false
},
{
"param": "grounded",
"min_1": 0.26,
"point_1": 5,
"min_2": 0.51,
"point_2": 10,
"flip": true
},
{
"param": "attack_out_cliff",
"min_1": 0.26,
"point_1": 24,
"min_2": 0.76,
"point_2": 28,
"flip": false
},
{
"param": "air_offensive",
"min_1": 0.26,
"point_1": 8,
"min_2": 0.76,
"point_2": 13,
"flip": false
},
{
"param": "cliffer",
"min_1": 0.51,
"point_1": 5,
"min_2": 0.76,
"point_2": 8,
"flip": false
},
{
"param": "feint_master",
"min_1": 0.25,
"point_1": 3,
"min_2": 0.76,
"point_2": 5,
"flip": false
},
{
"param": "feint_counter",
"min_1": 0.25,
"point_1": 3,
"min_2": 0.51,
"point_2": 5,
"flip": false
},
{
"param": "feint_shooter",
"min_1": 0.26,
"point_1": 2,
"min_2": 0.51,
"point_2": 3,
"flip": true
},
{
"param": "dash_attacker",
"min_1": 0.25,
"point_1": 10,
"min_2": 0.51,
"point_2": 16,
"flip": false
},
{
"param": "critical_hitter",
"min_1": 0.26,
"point_1": 4,
"min_2": 0.51,
"point_2": 8,
"flip": false
},
{
"param": "meteor_master",
"min_1": 0.26,
"point_1": 12,
"min_2": 0.51,
"point_2": 30,
"flip": false
},
{
"param": "just_shield_master",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.51,
"point_2": 6,
"flip": false
},
{
"param": "hammer_collector",
"min_1": 0.2,
"point_1": 5,
"min_2": 0.73,
"point_2": 8,
"flip": false
},
{
"param": "special_flagger",
"min_1": 0.2,
"point_1": 2,
"min_2": 0.46,
"point_2": 5,
"flip": false
},
{
"param": "carrier_broker",
"min_1": 0.22,
"point_1": 2,
"min_2": 0.74,
"point_2": 3,
"flip": false
}
],
"tiers": [
{
"points": 80,
"personality": 10
},
{
"points": 160,
"personality": 11
},
{
"points": 220,
"personality": 12
}
],
"necessary_param": "attack_out_cliff",
"necessary_min": 0.26,
"necessary_flip": false
},
"gen": {
"index": 5,
"scores": [
{
"param": "attack_out_cliff",
"min_1": 0.26,
"point_1": 7,
"min_2": 0.76,
"point_2": 7,
"flip": false
},
{
"param": "air_offensive",
"min_1": 0.26,
"point_1": 5,
"min_2": 0.76,
"point_2": 7,
"flip": true
},
{
"param": "feint_master",
"min_1": 0.25,
"point_1": 8,
"min_2": 0.76,
"point_2": 13,
"flip": false
},
{
"param": "feint_counter",
"min_1": 0.25,
"point_1": 8,
"min_2": 0.76,
"point_2": 13,
"flip": false
},
{
"param": "feint_shooter",
"min_1": 0.25,
"point_1": 8,
"min_2": 0.76,
"point_2": 13,
"flip": false
},
{
"param": "catcher",
"min_1": 0.25,
"point_1": 7,
"min_2": 0.76,
"point_2": 9,
"flip": false
},
{
"param": "attack_cancel",
"min_1": 0.26,
"point_1": 5,
"min_2": 0.76,
"point_2": 5,
"flip": false
},
{
"param": "meteor_master",
"min_1": 0.26,
"point_1": 4,
"min_2": 0.76,
"point_2": 15,
"flip": false
},
{
"param": "shield_master",
"min_1": 0.25,
"point_1": 4,
"min_2": 0.76,
"point_2": 10,
"flip": false
},
{
"param": "just_shield_master",
"min_1": 0.26,
"point_1": 23,
"min_2": 0.76,
"point_2": 35,
"flip": false
},
{
"param": "shield_catch_master",
"min_1": 0.26,
"point_1": 5,
"min_2": 0.46,
"point_2": 9,
"flip": false
},
{
"param": "item_collector",
"min_1": 0.22,
"point_1": 3,
"min_2": 0.76,
"point_2": 8,
"flip": false
},
{
"param": "item_throw_to_target",
"min_1": 0.22,
"point_1": 3,
"min_2": 0.48,
"point_2": 4,
"flip": false
},
{
"param": "dragoon_collector",
"min_1": 0.2,
"point_1": 3,
"min_2": 0.46,
"point_2": 7,
"flip": false
},
{
"param": "smashball_collector",
"min_1": 0.2,
"point_1": 3,
"min_2": 0.76,
"point_2": 5,
"flip": false
},
{
"param": "item_swinger",
"min_1": 0.22,
"point_1": 2,
"min_2": 0.46,
"point_2": 3,
"flip": false
},
{
"param": "homerun_batter",
"min_1": 0.2,
"point_1": 4,
"min_2": 0.76,
"point_2": 4,
"flip": false
},
{
"param": "club_swinger",
"min_1": 0.2,
"point_1": 4,
"min_2": 0.76,
"point_2": 4,
"flip": false
},
{
"param": "death_swinger",
"min_1": 0.2,
"point_1": 4,
"min_2": 0.46,
"point_2": 4,
"flip": false
},
{
"param": "item_shooter",
"min_1": 0.22,
"point_1": 3,
"min_2": 0.76,
"point_2": 4,
"flip": false
},
{
"param": "carrier_broker",
"min_1": 0.26,
"point_1": 4,
"min_2": 0.76,
"point_2": 4,
"flip": true
}
],
"tiers": [
{
"points": 80,
"personality": 13
},
{
"points": 120,
"personality": 14
},
{
"points": 150,
"personality": 15
}
],
"necessary_param": "just_shield_master",
"necessary_min": 0.26,
"necessary_flip": false
},
"ent": {
"index": 6,
"scores": [
{
"param": "attack_out_cliff",
"min_1": 0.26,
"point_1": 8,
"min_2": 0.76,
"point_2": 12,
"flip": false
},
{
"param": "_100_keeper",
"min_1": 0.26,
"point_1": 2,
"min_2": 0.51,
"point_2": 4,
"flip": true
},
{
"param": "smash_holder",
"min_1": 0.25,
"point_1": 2,
"min_2": 0.51,
"point_2": 3,
"flip": false
},
{
"param": "critical_hitter",
"min_1": 0.26,
"point_1": 2,
"min_2": 0.76,
"point_2": 3,
"flip": false
},
{
"param": "meteor_master",
"min_1": 0.26,
"point_1": 7,
"min_2": 0.76,
"point_2": 11,
"flip": false
},
{
"param": "just_shield_master",
"min_1": 0.26,
"point_1": 8,
"min_2": 0.76,
"point_2": 12,
"flip": false
},
{
"param": "item_throw_to_target",
"min_1": 0.26,
"point_1": 5,
"min_2": 0.51,
"point_2": 13,
"flip": true
},
{
"param": "dragoon_collector",
"min_1": 0.2,
"point_1": 8,
"min_2": 0.46,
"point_2": 13,
"flip": false
},
{
"param": "smashball_collector",
"min_1": 0.2,
"point_1": 8,
"min_2": 0.46,
"point_2": 13,
"flip": false
},
{
"param": "hammer_collector",
"min_1": 0.2,
"point_1": 8,
"min_2": 0.46,
"point_2": 14,
"flip": false
},
{
"param": "special_flagger",
"min_1": 0.2,
"point_1": 13,
"min_2": 0.73,
"point_2": 17,
"flip": false
},
{
"param": "homerun_batter",
"min_1": 0.2,
"point_1": 8,
"min_2": 0.73,
"point_2": 12,
"flip": false
},
{
"param": "club_swinger",
"min_1": 0.2,
"point_1": 5,
"min_2": 0.46,
"point_2": 13,
"flip": false
},
{
"param": "death_swinger",
"min_1": 0.2,
"point_1": 5,
"min_2": 0.46,
"point_2": 14,
"flip": false
},
{
"param": "charger",
"min_1": 0.22,
"point_1": 2,
"min_2": 0.48,
"point_2": 3,
"flip": false
},
{
"param": "appeal",
"min_1": 0.25,
"point_1": 18,
"min_2": 0.76,
"point_2": 34,
"flip": false
}
],
"tiers": [
{
"points": 90,
"personality": 16
},
{
"points": 170,
"personality": 17
},
{
"points": 230,
"personality": 18
}
],
"necessary_param": "appeal",
"necessary_min": 0.25,
"necessary_flip": false
},
"cau": {
"index": 7,
"scores": [
{
"param": "near",
"min_1": 0.26,
"point_1": 5,
"min_2": 0.51,
"point_2": 10,
"flip": true
},
{
"param": "offensive",
"min_1": 0.26,
"point_1": 6,
"min_2": 0.51,
"point_2": 12,
"flip": true
},
{
"param": "grounded",
"min_1": 0.25,
"point_1": 7,
"min_2": 0.51,
"point_2": 12,
"flip": false
},
{
"param": "attack_out_cliff",
"min_1": 0.26,
"point_1": 7,
"min_2": 0.51,
"point_2": 12,
"flip": true
},
{
"param": "dash",
"min_1": 0.26,
"point_1": 7,
"min_2": 0.51,
"point_2": 12,
"flip": true
},
{
"param": "air_offensive",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.76,
"point_2": 6,
"flip": true
},
{
"param": "cliffer",
"min_1": 0.26,
"point_1": 8,
"min_2": 0.76,
"point_2": 10,
"flip": true
},
{
"param": "feint_master",
"min_1": 0.25,
"point_1": 3,
"min_2": 0.76,
"point_2": 4,
"flip": false
},
{
"param": "feint_counter",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.51,
"point_2": 5,
"flip": true
},
{
"param": "feint_shooter",
"min_1": 0.25,
"point_1": 3,
"min_2": 0.76,
"point_2": 6,
"flip": false
},
{
"param": "smash_holder",
"min_1": 0.51,
"point_1": 3,
"min_2": 0.76,
"point_2": 6,
"flip": true
},
{
"param": "dash_attacker",
"min_1": 0.51,
"point_1": 4,
"min_2": 0.76,
"point_2": 6,
"flip": true
},
{
"param": "critical_hitter",
"min_1": 0.26,
"point_1": 4,
"min_2": 0.76,
"point_2": 6,
"flip": true
},
{
"param": "meteor_master",
"min_1": 0.26,
"point_1": 4,
"min_2": 0.76,
"point_2": 5,
"flip": true
},
{
"param": "shield_master",
"min_1": 0.26,
"point_1": 29,
"min_2": 0.76,
"point_2": 42,
"flip": true
},
{
"param": "just_shield_master",
"min_1": 0.26,
"point_1": 5,
"min_2": 0.76,
"point_2": 5,
"flip": true
},
{
"param": "hammer_collector",
"min_1": 0.26,
"point_1": 4,
"min_2": 0.51,
"point_2": 10,
"flip": true
},
{
"param": "special_flagger",
"min_1": 0.26,
"point_1": 6,
"min_2": 0.51,
"point_2": 12,
"flip": true
},
{
"param": "charger",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.76,
"point_2": 5,
"flip": true
}
],
"tiers": [
{
"points": 80,
"personality": 19
},
{
"points": 160,
"personality": 20
},
{
"points": 215,
"personality": 21
}
],
"necessary_param": "shield_master",
"necessary_min": 0.26,
"necessary_flip": true
},
"dyn": {
"index": 8,
"scores": [
{
"param": "offensive",
"min_1": 0.25,
"point_1": 5,
"min_2": 0.76,
"point_2": 7,
"flip": false
},
{
"param": "attack_out_cliff",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.51,
"point_2": 5,
"flip": false
},
{
"param": "air_offensive",
"min_1": 0.26,
"point_1": 7,
"min_2": 0.76,
"point_2": 10,
"flip": false
},
{
"param": "catcher",
"min_1": 0.26,
"point_1": 3,
"min_2": 0.51,
"point_2": 3,
"flip": true
},
{
"param": "attack_cancel",
"min_1": 0.26,
"point_1": 2,
"min_2": 0.51,
"point_2": 2,
"flip": true
},
{
"param": "smash_holder",
"min_1": 0.25,
"point_1": 7,
"min_2": 0.76,
"point_2": 9,
"flip": false
},
{
"param": "dash_attacker",
"min_1": 0.25,
"point_1": 6,
"min_2": 0.76,
"point_2": 7,
"flip": false
},
{
"param": "critical_hitter",
"min_1": 0.26,
"point_1": 12,
"min_2": 0.76,
"point_2": 15,
"flip": false
},
{
"param": "meteor_master",
"min_1": 0.26,
"point_1": 11,
"min_2": 0.51,
"point_2": 12,
"flip": false
},
{
"param": "shield_master",
"min_1": 0.25,
"point_1": 11,
"min_2": 0.76,
"point_2": 12,
"flip": false
},
{
"param": "just_shield_master",
"min_1": 0.26,
"point_1": 7,
"min_2": 0.76,
"point_2": 8,
"flip": true
},
{
"param": "item_throw_to_target",
"min_1": 0.26,
"point_1": 2,
"min_2": 0.76,
"point_2": 3,
"flip": true
},
{
"param": "dragoon_collector",
"min_1": 0.2,
"point_1": 3,
"min_2": 0.46,
"point_2": 5,
"flip": false
},
{
"param": "smashball_collector",
"min_1": 0.2,
"point_1": 3,
"min_2": 0.46,
"point_2": 7,
"flip": false
},
{
"param": "hammer_collector",
"min_1": 0.2,
"point_1": 3,
"min_2": 0.46,
"point_2": 7,
"flip": false
},
{
"param": "special_flagger",
"min_1": 0.2,
"point_1": 5,
"min_2": 0.46,
"point_2": 10,
"flip": false
},
{
"param": "item_swinger",
"min_1": 0.26,
"point_1": 6,
"min_2": 0.51,
"point_2": 8,
"flip": true
},
{
"param": "homerun_batter",
"min_1": 0.46,
"point_1": 9,
"min_2": 0.71,
"point_2": 10,
"flip": false
},
{
"param": "club_swinger",
"min_1": 0.46,
"point_1": 9,
"min_2": 0.71,
"point_2": 10,
"flip": false
},
{
"param": "death_swinger",
"min_1": 0.46,
"point_1": 9,
"min_2": 0.71,
"point_2": 10,
"flip": false
},
{
"param": "item_shooter",
"min_1": 0.51,
"point_1": 2,
"min_2": 0.74,
"point_2": 1,
"flip": true
},
{
"param": "carrier_broker",
"min_1": 0.48,
"point_1": 2,
"min_2": 0.71,
"point_2": 1,
"flip": false
},
{
"param": "charger",
"min_1": 0.22,
"point_1": 5,
"min_2": 0.74,
"point_2": 6,
"flip": false
}
],
"tiers": [
{
"points": 80,
"personality": 22
},
{
"points": 160,
"personality": 23
},
{
"points": 210,
"personality": 24
}
],
"necessary_param": null,
"necessary_min": 0,
"necessary_flip": false
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment