Source code for simfantasy.common_math

from typing import Dict, List

from simfantasy.enum import Attribute, Job, Race, Resource

main_stat_per_level: List[int] = [
    None, 20, 21, 22, 24, 26, 27, 29, 31, 33, 35, 36, 38, 41, 44, 46, 49, 52, 54, 57, 60, 63, 67,
    71, 74, 78, 81, 85, 89, 92, 97, 101, 106, 110, 115, 119, 124, 128, 134, 139, 144, 150, 155, 161,
    166, 171, 177, 183, 189, 196, 202, 204, 205, 207, 209, 210, 212, 214, 215, 217, 218, 224, 228,
    236, 244, 252, 260, 268, 276, 284, 292
]
"""Base amount for primary stats per level."""

sub_stat_per_level: List[int] = [
    None, 56, 57, 60, 62, 65, 68, 70, 73, 76, 78, 82, 85, 89, 93, 96, 100, 104, 109, 113, 116, 122,
    127, 133, 138, 144, 150, 155, 162, 168, 173, 181, 188, 194, 202, 209, 215, 223, 229, 236, 244,
    253, 263, 272, 283, 292, 302, 311, 322, 331, 341, 342, 344, 345, 346, 347, 349, 350, 351, 352,
    354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364,
]
"""Base amount for secondary stats per level."""

divisor_per_level: List[int] = [
    None, 56, 57, 60, 62, 65, 68, 70, 73, 76, 78, 82, 85, 89, 93, 96, 100, 104, 109, 113, 116, 122,
    127, 133, 138, 144, 150, 155, 162, 168, 173, 181, 188, 194, 202, 209, 215, 223, 229, 236, 244,
    253, 263, 272, 283, 292, 302, 311, 322, 331, 341, 393, 444, 496, 548, 600, 651, 703, 755, 806,
    858, 941, 1032, 1133, 1243, 1364, 1497, 1643, 1802, 1978, 2170,
]
"""Divisor for multiple calculations per level."""

piety_per_level: List[int] = [
    None, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145,
    150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 225, 230, 235, 240,
    245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 300, 315, 330, 360, 390, 420, 450, 480, 510,
    540, 620, 650, 680, 710, 740, 770, 800, 830, 860, 890, 890
]

mp_per_level: List[int] = [
    None, 104, 114, 123, 133, 142, 152, 161, 171, 180, 190, 209, 228, 247, 266, 285, 304, 323, 342,
    361, 380, 418, 456, 494, 532, 570, 608, 646, 684, 722, 760, 826, 893, 959, 1026, 1092, 1159,
    1225, 1292, 1358, 1425, 1548, 1672, 1795, 1919, 2042, 2166, 2289, 2413, 2536, 2660, 3000, 3380,
    3810, 4300, 4850, 5470, 6170, 6950, 7840, 8840, 8980, 9150, 9350, 9590, 9870, 10190, 10560,
    10980, 11450, 12000
]


[docs]def get_racial_attribute_bonuses(race: Race) -> Dict[Attribute, int]: """ Get main stat bonuses by clan. :param race: Clan. :return: Dictionary mapping :class:`~simfantasy.enums.Attribute` to integer bonus values. """ if race is Race.WILDWOOD: return { Attribute.STRENGTH: 0, Attribute.DEXTERITY: 3, Attribute.VITALITY: -1, Attribute.INTELLIGENCE: 2, Attribute.MIND: -1 } elif race is Race.DUSKWIGHT: return { Attribute.STRENGTH: 0, Attribute.DEXTERITY: 0, Attribute.VITALITY: -1, Attribute.INTELLIGENCE: 3, Attribute.MIND: 1 } elif race is Race.MIDLANDER: return { Attribute.STRENGTH: 2, Attribute.DEXTERITY: -1, Attribute.VITALITY: 0, Attribute.INTELLIGENCE: 3, Attribute.MIND: -1 } elif race is Race.HIGHLANDER: return { Attribute.STRENGTH: 3, Attribute.DEXTERITY: 0, Attribute.VITALITY: 2, Attribute.INTELLIGENCE: -2, Attribute.MIND: 0 } elif race is Race.PLAINSFOLK: return { Attribute.STRENGTH: -1, Attribute.DEXTERITY: 3, Attribute.VITALITY: -1, Attribute.INTELLIGENCE: 2, Attribute.MIND: 0 } elif race is Race.DUNESFOLK: return { Attribute.STRENGTH: -1, Attribute.DEXTERITY: 1, Attribute.VITALITY: -2, Attribute.INTELLIGENCE: 2, Attribute.MIND: 3 } elif race is Race.SEEKER_OF_THE_SUN: return { Attribute.STRENGTH: 2, Attribute.DEXTERITY: 3, Attribute.VITALITY: 0, Attribute.INTELLIGENCE: -1, Attribute.MIND: -1 } elif race is Race.KEEPER_OF_THE_MOON: return { Attribute.STRENGTH: -1, Attribute.DEXTERITY: 2, Attribute.VITALITY: -2, Attribute.INTELLIGENCE: 1, Attribute.MIND: 3 } elif race is Race.SEA_WOLF: return { Attribute.STRENGTH: 2, Attribute.DEXTERITY: -1, Attribute.VITALITY: 3, Attribute.INTELLIGENCE: -2, Attribute.MIND: 1 } elif race is Race.HELLSGUARD: return { Attribute.STRENGTH: 0, Attribute.DEXTERITY: -3, Attribute.VITALITY: 3, Attribute.INTELLIGENCE: 0, Attribute.MIND: 2 } elif race is Race.RAEN: return { Attribute.STRENGTH: -1, Attribute.DEXTERITY: -2, Attribute.VITALITY: -1, Attribute.INTELLIGENCE: 0, Attribute.MIND: 3 } elif race is Race.XAELA: return { Attribute.STRENGTH: 3, Attribute.DEXTERITY: 0, Attribute.VITALITY: 2, Attribute.INTELLIGENCE: 0, Attribute.MIND: -2 } else: return { Attribute.STRENGTH: 0, Attribute.DEXTERITY: 0, Attribute.VITALITY: 0, Attribute.INTELLIGENCE: 0, Attribute.MIND: 0 }
[docs]def get_base_stats_by_job(job: Job) -> Dict[Attribute, int]: """ Get base main stats by job. :param job: Job. :return: Dictionary mapping :class:`~simfantasy.enums.Attribute` to integer bonus values. """ if job is Job.GLADIATOR: return { Attribute.STRENGTH: 95, Attribute.DEXTERITY: 90, Attribute.VITALITY: 100, Attribute.INTELLIGENCE: 50, Attribute.MIND: 95 } elif job is Job.PUGILIST: return { Attribute.STRENGTH: 100, Attribute.DEXTERITY: 100, Attribute.VITALITY: 95, Attribute.INTELLIGENCE: 45, Attribute.MIND: 85 } elif job is Job.MARAUDER: return { Attribute.STRENGTH: 100, Attribute.DEXTERITY: 90, Attribute.VITALITY: 100, Attribute.INTELLIGENCE: 30, Attribute.MIND: 50 } elif job is Job.LANCER: return { Attribute.STRENGTH: 105, Attribute.DEXTERITY: 95, Attribute.VITALITY: 100, Attribute.INTELLIGENCE: 40, Attribute.MIND: 60 } elif job is Job.ARCHER: return { Attribute.STRENGTH: 85, Attribute.DEXTERITY: 105, Attribute.VITALITY: 95, Attribute.INTELLIGENCE: 80, Attribute.MIND: 75 } elif job is Job.CONJURER: return { Attribute.STRENGTH: 50, Attribute.DEXTERITY: 100, Attribute.VITALITY: 95, Attribute.INTELLIGENCE: 100, Attribute.MIND: 105 } elif job is Job.THAUMATURGE: return { Attribute.STRENGTH: 40, Attribute.DEXTERITY: 95, Attribute.VITALITY: 95, Attribute.INTELLIGENCE: 105, Attribute.MIND: 70 } elif job is Job.PALADIN: return { Attribute.STRENGTH: 100, Attribute.DEXTERITY: 95, Attribute.VITALITY: 110, Attribute.INTELLIGENCE: 60, Attribute.MIND: 100 } elif job is Job.MONK: return { Attribute.STRENGTH: 110, Attribute.DEXTERITY: 105, Attribute.VITALITY: 100, Attribute.INTELLIGENCE: 50, Attribute.MIND: 90 } elif job is Job.WARRIOR: return { Attribute.STRENGTH: 105, Attribute.DEXTERITY: 95, Attribute.VITALITY: 110, Attribute.INTELLIGENCE: 40, Attribute.MIND: 55 } elif job is Job.DRAGOON: return { Attribute.STRENGTH: 115, Attribute.DEXTERITY: 100, Attribute.VITALITY: 105, Attribute.INTELLIGENCE: 45, Attribute.MIND: 65 } elif job is Job.BARD: return { Attribute.STRENGTH: 90, Attribute.DEXTERITY: 115, Attribute.VITALITY: 100, Attribute.INTELLIGENCE: 85, Attribute.MIND: 80 } elif job is Job.WHITE_MAGE: return { Attribute.STRENGTH: 55, Attribute.DEXTERITY: 105, Attribute.VITALITY: 100, Attribute.INTELLIGENCE: 105, Attribute.MIND: 115 } elif job is Job.BLACK_MAGE: return { Attribute.STRENGTH: 45, Attribute.DEXTERITY: 100, Attribute.VITALITY: 100, Attribute.INTELLIGENCE: 115, Attribute.MIND: 75 } elif job is Job.ARCANIST: return { Attribute.STRENGTH: 85, Attribute.DEXTERITY: 95, Attribute.VITALITY: 95, Attribute.INTELLIGENCE: 105, Attribute.MIND: 75 } elif job is Job.SUMMONER: return { Attribute.STRENGTH: 90, Attribute.DEXTERITY: 100, Attribute.VITALITY: 100, Attribute.INTELLIGENCE: 115, Attribute.MIND: 80 } elif job is Job.SCHOLAR: return { Attribute.STRENGTH: 90, Attribute.DEXTERITY: 100, Attribute.VITALITY: 100, Attribute.INTELLIGENCE: 105, Attribute.MIND: 115 } elif job is Job.ROGUE: return { Attribute.STRENGTH: 80, Attribute.DEXTERITY: 100, Attribute.VITALITY: 95, Attribute.INTELLIGENCE: 60, Attribute.MIND: 70 } elif job is Job.NINJA: return { Attribute.STRENGTH: 85, Attribute.DEXTERITY: 110, Attribute.VITALITY: 100, Attribute.INTELLIGENCE: 65, Attribute.MIND: 75 } elif job is Job.MACHINIST: return { Attribute.STRENGTH: 85, Attribute.DEXTERITY: 115, Attribute.VITALITY: 100, Attribute.INTELLIGENCE: 80, Attribute.MIND: 85 } elif job is Job.DARK_KNIGHT: return { Attribute.STRENGTH: 105, Attribute.DEXTERITY: 95, Attribute.VITALITY: 110, Attribute.INTELLIGENCE: 60, Attribute.MIND: 40 } elif job is Job.ASTROLOGIAN: return { Attribute.STRENGTH: 50, Attribute.DEXTERITY: 100, Attribute.VITALITY: 100, Attribute.INTELLIGENCE: 105, Attribute.MIND: 115 } elif job is Job.SAMURAI: return { Attribute.STRENGTH: 112, Attribute.DEXTERITY: 108, Attribute.VITALITY: 100, Attribute.INTELLIGENCE: 60, Attribute.MIND: 50 } elif job is Job.RED_MAGE: return { Attribute.STRENGTH: 55, Attribute.DEXTERITY: 105, Attribute.VITALITY: 100, Attribute.INTELLIGENCE: 115, Attribute.MIND: 110 } else: return { Attribute.STRENGTH: 0, Attribute.DEXTERITY: 0, Attribute.VITALITY: 0, Attribute.INTELLIGENCE: 0, Attribute.MIND: 0 }
[docs]def get_base_resources_by_job(job: Job) -> Dict[Resource, int]: """ Get base main stats by job. :param job: Job. :return: Dictionary mapping :class:`~simfantasy.enums.Attribute` to integer bonus values. """ if job is Job.GLADIATOR: return { Resource.HP: 110, Resource.MP: 49, } elif job is Job.PUGILIST: return { Resource.HP: 105, Resource.MP: 34, } elif job is Job.MARAUDER: return { Resource.HP: 115, Resource.MP: 28, } elif job is Job.LANCER: return { Resource.HP: 110, Resource.MP: 39, } elif job is Job.ARCHER: return { Resource.HP: 100, Resource.MP: 69, } elif job is Job.CONJURER: return { Resource.HP: 100, Resource.MP: 117, } elif job is Job.THAUMATURGE: return { Resource.HP: 100, Resource.MP: 123, } elif job is Job.PALADIN: return { Resource.HP: 120, Resource.MP: 59, } elif job is Job.MONK: return { Resource.HP: 110, Resource.MP: 43, } elif job is Job.WARRIOR: return { Resource.HP: 125, Resource.MP: 38, } elif job is Job.DRAGOON: return { Resource.HP: 115, Resource.MP: 49, } elif job is Job.BARD: return { Resource.HP: 105, Resource.MP: 79, } elif job is Job.WHITE_MAGE: return { Resource.HP: 105, Resource.MP: 124, } elif job is Job.BLACK_MAGE: return { Resource.HP: 105, Resource.MP: 129, } elif job is Job.ARCANIST: return { Resource.HP: 100, Resource.MP: 110, } elif job is Job.SUMMONER: return { Resource.HP: 105, Resource.MP: 111, } elif job is Job.SCHOLAR: return { Resource.HP: 105, Resource.MP: 119, } elif job is Job.ROGUE: return { Resource.HP: 103, Resource.MP: 38, } elif job is Job.NINJA: return { Resource.HP: 108, Resource.MP: 48, } elif job is Job.MACHINIST: return { Resource.HP: 105, Resource.MP: 79, } elif job is Job.DARK_KNIGHT: return { Resource.HP: 120, Resource.MP: 79, } elif job is Job.ASTROLOGIAN: return { Resource.HP: 105, Resource.MP: 124, } elif job is Job.SAMURAI: return { Resource.HP: 109, Resource.MP: 40, } elif job is Job.RED_MAGE: return { Resource.HP: 105, Resource.MP: 120, } else: return { Resource.HP: 0, Resource.MP: 0, }