diff options
Diffstat (limited to 'tavern.py')
-rw-r--r-- | tavern.py | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/tavern.py b/tavern.py new file mode 100644 index 0000000..bd0c6f4 --- /dev/null +++ b/tavern.py @@ -0,0 +1,136 @@ +######################################################################################## +# This file is part of Spheres. +# Copyright (C) 2019 Jesusalva + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +######################################################################################## +# Tavern Recruitment Module + +from utils import (stdout, dl_search, compress, allbars, Player) +from consts import (ERR_OK, ERR_BAD, ERR_INS, ERR_FULL, ST_TOWN) +from player import inventoryplace +import random, json + +def recruit(args, token): + # we have: args["tavern"] and args["amount"], besides Player[token] + try: + stdout("Recruit: %s" % args) + tv=json.loads(args) + stdout("JSON loaded") + # Validation + tmp=int(tv["amount"]) + tmp=int(tv["tavern"]) + # Load requested tavern + tavern=dl_search(allbars, "tavern_id", tmp) + if tavern == "ERROR": + stdout("Request for inexistent tavern id %d" % tmp) + raise Exception("Tavern not found") + # Tavern must be active + if not tavern["enabled"]: + stdout("Request for disabled tavern id %d" % tmp) + raise Exception("Tavern is not active") + # Currency must exist and be valid (actually our fault...) + tmp=int(Player[token][tavern["currency"]]) + except: + # Invalid data + return ERR_BAD + + # Configure tavern settings + price=tavern["price"] + poll=tavern["tavern_list"] + + # Check if you can recruit right now + if (Player[token]["status"] != ST_TOWN): + return ERR_BAD + + # Where we'll be saving your acquisitions + Result={"units": []} + Rarity=[] # <-- Internal control only + + # Main Loop + i=0 + while i < tv["amount"]: + i+=1 + # Not enough crystals/currency + if (Player[token][tavern["currency"]] < price): + Result["code"]=ERR_INS + break + + # Inventory is full (also, get IDX) + idx=inventoryplace(token) + if (idx == -1): + Result["code"]=ERR_FULL + break + + # Payment in specified currency... (Defaults to crystals) + Player[token][tavern["currency"]]-=price + + # Grab a random entry per groups + r=random.randint(0, 10000) + o=0 + for group in poll: + if (r < group["chance"]): + o=random.choice(group["units"]) + break + else: + # Adjust random seed so it is consistent + r-=group["chance"] + + # Maybe, just maybe, you have a warranted max-rarity card + if i % tavern["min_draws"] == 0: + ssr=0 + for ur in Rarity: + if ur in poll[0]["units"]: + ssr+=1 + if ssr < i / tavern["min_draws"]: + o=random.choice(poll[0]["units"]) + + # We don't want base id, we need unit id + o*=100 + + # Now we need to add it in a structured form + unit={ + "unit_id": o, + "level": 1, + "exp": 0 + } + + # Record the new unit + Result["units"].append(unit) + try: + Player[token]["inv"][idx]=unit + except: + Player[token]["inv"].append(unit) + print("\033[31mAn error happened in recruit (token: %s idx: %d unit: %s InvLen: %d)\033[0m" % (token, idx, str(unit), len(Player[token]["inv"]))) + + # We want to update Rarity Control + Rarity.append(o) + + # Feed back the currency data + Result["currency"]=(tavern["currency"], Player[token][tavern["currency"]]) + + # Shuffle Results to look more random + random.shuffle(Result["units"]) + + try: + stdout("Response: %d " % Result["code"]) + except: + Result["code"]=ERR_OK + + sjson=compress(Result) + #stdout("Reply: %s" % sjson) + return sjson + + |