SIFTools/command_line/rankcalc.py
2016-03-05 21:18:47 -08:00

134 lines
No EOL
5.3 KiB
Python
Executable file

#!/usr/bin/env python
#
# Rank-up requirements (EXP) calculator
#
# Part of SIFTools <https://github.com/dburr/SIFTools/>
# By Donald Burr <dburr@DonaldBurr.com>
# Copyright (c) 2015 Donald Burr.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
import os
import sys
import getopt
from math import floor
# algorithm from: http://decaf.kouhi.me/lovelive/index.php?title=Gameplay#Ranks
def calc(game_version, starting_rank, starting_exp, desired_rank, half_exp):
required_exp = 0
for rank in range(starting_rank, desired_rank):
required_exp_for_next_rank = round(34.45 * rank - 551)
# account for half EXP on JP (only if rank < 100)
if half_exp and rank < 100:
required_exp_for_next_rank = required_exp_for_next_rank // 2
#print "AT RANK %d NEED %d EXP" % (rank, required_exp_for_next_rank)
required_exp = required_exp + required_exp_for_next_rank
# account for exp we already have
required_exp = required_exp - starting_exp
easy_count = (required_exp // 12) + 1
normal_count = (required_exp // 26) + 1
hard_count = (required_exp // 46) + 1
ex_count = (required_exp // 83) + 1
easy_3x_count = (required_exp // (12*3)) + 1
normal_3x_count = (required_exp // (26*3)) + 1
hard_3x_count = (required_exp // (46*3)) + 1
ex_3x_count = (required_exp // (83*3)) + 1
easy_3xb_count = (required_exp // (12*3)) + 1
normal_3xb_count = (required_exp // (26*3)) + 1
hard_3xb_count = (required_exp // (46*3)) + 1
ex_3xb_count = (required_exp // (83*3)) + 1
# calc LP
LP = 25 + floor(min(desired_rank, 300) / 2) + floor(max(desired_rank - 300, 0) / 3)
# calc friend slots
friend_slots = 10 + floor(min(desired_rank, 50) / 5) + floor(max(desired_rank - 50, 0) / 10)
# print the results
print "At rank %d you will have %d LP and %d friend slots." % (desired_rank, LP, friend_slots)
def usage():
print "Usage: %s [options]" % os.path.basename(__file__)
print "where [options] can be one or more of:"
print "[-H | --help] Print this help message"
print "[-g | --game-version] Game version (one of: EN, JP, default EN)"
print "[-r | --starting-rank] Starting rank (REQUIRED, must be >= 34)"
print "[-e | --starting-exp] Starting EXP (optional, defaults to 0)"
print "[-R | --desired-rank] Desired rank (REQUIRED, must be >= starting-rank)"
def main(argv):
rarity = None
game_version = "EN"
starting_rank = None
desired_rank = None
starting_exp = 0
try:
options, remainder = getopt.getopt(argv, "Hg:r:e:R:", ["help", "game-version=", "starting-rank=", "starting-exp=", "desired-rank="])
except getopt.GetoptError:
usage()
sys.exit(2)
for opt, arg in options:
if opt in ('-H', '--help'):
usage()
sys.exit(0)
elif opt in ('-g', '--game-version'):
game_version = arg
elif opt in ('-r', '--starting-rank'):
starting_rank = int(arg)
elif opt in ('-e', '--starting-exp'):
starting_exp = int(arg)
elif opt in ('-R', '--desired-rank'):
desired_rank = int(arg)
# first validate game version
# canonicalize it to uppercase
game_version = game_version.upper()
if game_version != "EN" and game_version != "JP":
print "Error: invalid game version (%s)" % game_version
usage()
sys.exit(1)
# now validate levels
if starting_rank is None:
print "Error: must specify starting rank"
usage()
sys.exit(1)
elif desired_rank is None:
print "Error: must specify desired rank"
usage()
sys.exit(1)
elif starting_rank < 34:
print "Error: starting rank must be greater than or equal to 34"
usage()
sys.exit(1)
elif desired_rank <= starting_rank:
print "Error: desired rank must be greater than starting rank"
usage()
sys.exit(1)
# now validate starting exp
if starting_exp < 0:
print "Error: invalid starting EXP (%d)" % starting_exp
usage()
sys.exit(1)
# all is well, go for it
calc(game_version, starting_rank, starting_exp, desired_rank)
### main script starts here
if __name__ == "__main__":
main(sys.argv[1:])