343 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			343 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
"""
 | 
						|
Script for paying Guild Dues, and to handle Jack in the mainfloor.
 | 
						|
#
 | 
						|
# This program is free software; you can redistribute it and/or modify
 | 
						|
# it under the terms of the GNU General Public License as published by
 | 
						|
# the Free Software Foundation; either version 2 of the License, or
 | 
						|
# (at your option) any later version.
 | 
						|
#
 | 
						|
# This program 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 General Public License for more details.
 | 
						|
#
 | 
						|
# You should have received a copy of the GNU General Public License
 | 
						|
# along with this program; if not, write to the Free Software
 | 
						|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
						|
#
 | 
						|
# author:Avion temitchell@sourceforge.net
 | 
						|
#
 | 
						|
# Heavily modified by Nicolas Weeger, 2010-11-14
 | 
						|
"""
 | 
						|
 | 
						|
import Crossfire
 | 
						|
import CFGuilds
 | 
						|
import CFItemBroker
 | 
						|
import random
 | 
						|
import CFBank
 | 
						|
import CFLog
 | 
						|
from CFGuildClearance import CheckClearance
 | 
						|
 | 
						|
# List of amounts a player can pay
 | 
						|
CoinTypes={
 | 
						|
    "SILVER":1,
 | 
						|
    "GOLD":10,
 | 
						|
    "PLATINUM":50,
 | 
						|
    "JADE":5000,
 | 
						|
    "AMBERIUM":500000,
 | 
						|
    "IMPERIAL NOTE":10000,
 | 
						|
    "TEN IMPERIAL NOTE":100000,
 | 
						|
    "ONE HUNDRED IMPERIAL NOTE":1000000 }
 | 
						|
 | 
						|
# Archetypes for the 'withdraw' command
 | 
						|
ArchType={"SILVER":"silvercoin","GOLD":"goldcoin","PLATINUM":"platinacoin","JADE":"jadecoin","AMBERIUM":"ambercoin", "IMPERIAL NOTE":"imperial","TEN IMPERIAL NOTE":"imperial10","ONE HUNDRED IMPERIAL NOTE":"imperial100"}
 | 
						|
 | 
						|
# Filename for the bank
 | 
						|
bankdatabase = "ImperialBank_DB"
 | 
						|
 | 
						|
remarklist = ['Excellent','Thank You','Thank You','Thank You', 'Thank You', 'Great', 'OK', 'Wonderful', 'Swell', 'Dude', 'Big Spender']
 | 
						|
exclaimlist = ['Hey','Hey','Hey','Hey', 'Now just a minute', 'AHEM', 'OK...Wait a minute', 'Look chowderhead']
 | 
						|
buddylist =   ['buddy','buddy','buddy','buddy','pal','friend','friend','friend','friend','dude','chum', 'sweetie']
 | 
						|
whoami=Crossfire.WhoAmI()
 | 
						|
activator = Crossfire.WhoIsActivator()
 | 
						|
 | 
						|
def formatted_amount(amount):
 | 
						|
    """ Format a price as a string, giving full coin descriptions. Returns 'no money' if amount is 0. """
 | 
						|
    if amount == 0:
 | 
						|
        return 'no money'
 | 
						|
    
 | 
						|
    return Crossfire.CostStringFromValue(amount)
 | 
						|
 | 
						|
def find_mailbox(object):
 | 
						|
    while (object.Name != 'mailbox'):
 | 
						|
        object = object.Above
 | 
						|
        if not object:
 | 
						|
                return 0
 | 
						|
    return object
 | 
						|
def FindCoin(object):
 | 
						|
    while (object.Name.find('silver coin')==-1):
 | 
						|
        object = object.Above
 | 
						|
        if not object:
 | 
						|
                return 0
 | 
						|
    return object
 | 
						|
 | 
						|
class GuildDues:
 | 
						|
    def __init__(self):
 | 
						|
        '''Standard constructor'''
 | 
						|
        self.guildname = Crossfire.ScriptParameters()
 | 
						|
 | 
						|
    def do_help(self):
 | 
						|
        '''Handle the 'help' and 'yes' commands.'''
 | 
						|
        gm = ''
 | 
						|
 | 
						|
        if CheckClearance([self.guildname, "GuildMaster"], activator):
 | 
						|
            gm = 'You can purchase guild extensions or new desks with the "buy" word.\n'
 | 
						|
 | 
						|
        whoami.Say('Let me know how much you want to pay. Say pay <amount> <cointype>'
 | 
						|
        + '\n\tValid coin types are '
 | 
						|
        + ', '.join(CoinTypes)
 | 
						|
        + '.\nYou can check the balance by saying "balance".\n'
 | 
						|
        + gm
 | 
						|
        + 'I also provide mailscrolls at 10 platinum each, use "mailscroll".')
 | 
						|
 | 
						|
    def do_buy(self, text):
 | 
						|
        '''Handles buying a guild extension'''
 | 
						|
 | 
						|
        if (not CheckClearance([self.guildname, "GuildMaster"], activator)):
 | 
						|
                whoami.Say("Only guild masters and GMs can buy extensions or new desks for the guild.")
 | 
						|
                return
 | 
						|
 | 
						|
        # This lists all items that can be bought, extensions or new desks
 | 
						|
        Items = {
 | 
						|
            'Stove':5000*12,
 | 
						|
            'Cauldron':5000*12,
 | 
						|
            "TanningDesk":5000*12,
 | 
						|
            "ThaumaturgyDesk":5000*12,
 | 
						|
            "JewelersBench":5000*24,
 | 
						|
            "BowyerBench":5000*10,
 | 
						|
            "Forge":5000*10,
 | 
						|
 | 
						|
            'BBQ':500000*12,
 | 
						|
            'AlchemyLab':500000*24,
 | 
						|
            "CrystalRoom":500000*12,
 | 
						|
            "Tannery":500000*12,
 | 
						|
            "JewelersRoom":500000*24,
 | 
						|
            "ThaumaturgyRoom":500000*12,
 | 
						|
            "Bowyer":500000*12,
 | 
						|
            "Smithy":500000*12}
 | 
						|
 | 
						|
        # This is the list of cards to buy new desks
 | 
						|
        Cards = ["Stove", "Cauldron", "TanningDesk", "ThaumaturgyDesk", "JewelersBench", "BowyerBench", "Forge"]
 | 
						|
 | 
						|
        mymap = whoami.Map
 | 
						|
        path = mymap.Path
 | 
						|
        path = path.replace("mainfloor", "")
 | 
						|
        SecondFloor = Crossfire.ReadyMap(path + 'secondfloor')
 | 
						|
        ToolShed = Crossfire.ReadyMap(path + "guild_toolshed")
 | 
						|
 | 
						|
        # This is the list of guild extensions, and the coordinates of the activation button
 | 
						|
        Rooms = {
 | 
						|
            "BBQ": (mymap, 40, 25),
 | 
						|
            "AlchemyLab": (SecondFloor, 22, 12),
 | 
						|
            "CrystalRoom": (SecondFloor, 22, 13),
 | 
						|
            "Tannery": (SecondFloor, 22, 14),
 | 
						|
            "ThaumaturgyRoom": (SecondFloor, 21, 13),
 | 
						|
            "JewelersRoom": (SecondFloor, 21, 14),
 | 
						|
            "Bowyer": (ToolShed, 22, 16),
 | 
						|
            "Smithy": (ToolShed, 23, 16) }
 | 
						|
 | 
						|
        if len(text) == 1:
 | 
						|
            help = "Buy what?\nYou can buy:\n"
 | 
						|
 | 
						|
            for i in Items:
 | 
						|
                if i in Cards:
 | 
						|
                    help += " - " + i + " (card): " + formatted_amount(Items[i]) + "\n"
 | 
						|
                else:
 | 
						|
                    Loc = Rooms.get(i)
 | 
						|
                    coin = Loc[0].ObjectAt(Loc[1], Loc[2])
 | 
						|
                    coin = FindCoin(coin)
 | 
						|
 | 
						|
                    if coin != 0:
 | 
						|
                        continue
 | 
						|
 | 
						|
                    help += " - " + i + " (extension): " + formatted_amount(Items[i]) + "\n"
 | 
						|
 | 
						|
            whoami.Say(help)
 | 
						|
            return
 | 
						|
 | 
						|
        item = text[1]
 | 
						|
        if not item in Items.keys():
 | 
						|
            whoami.Say("I don't know that item, sorry")
 | 
						|
            return
 | 
						|
 | 
						|
        Price = Items.get(item)
 | 
						|
        bank = CFBank.CFBank(bankdatabase)
 | 
						|
        balance = bank.getbalance(self.accountname)
 | 
						|
        if Price > balance:
 | 
						|
            whoami.Say("The guild does not have sufficient funds.")
 | 
						|
            return
 | 
						|
 | 
						|
        if item in Cards:
 | 
						|
                card = activator.CreateObject('diploma')
 | 
						|
                card.Name = item
 | 
						|
                card.Message = 'This enables you to buy a new ' + item + ' for your guild.'
 | 
						|
                card.Value = 0
 | 
						|
                bank.withdraw(self.accountname, Price)
 | 
						|
                whoami.Say("Here is your card\nThe guild now has %s on account." %(formatted_amount(bank.getbalance(self.accountname))))
 | 
						|
 | 
						|
                return
 | 
						|
 | 
						|
        Loc = Rooms.get(item)
 | 
						|
        coin = Loc[0].ObjectAt(Loc[1], Loc[2])
 | 
						|
        coin = FindCoin(coin)
 | 
						|
 | 
						|
        if coin != 0:
 | 
						|
            whoami.Say("The guild already has this expansion!")
 | 
						|
            return
 | 
						|
 | 
						|
        coin = mymap.CreateObject('silvercoin',40,29)
 | 
						|
        coin.Teleport(Loc[0] ,Loc[1], Loc[2])
 | 
						|
 | 
						|
        bank.withdraw(self.accountname, Price)
 | 
						|
        whoami.Say("The new room has been unlocked.\n"
 | 
						|
        + "The guild now has %s on account." %(formatted_amount(bank.getbalance(self.accountname))))
 | 
						|
 | 
						|
    def do_mailscroll(self, text):
 | 
						|
        '''Handle getting a mailscroll for a friend.'''
 | 
						|
        if len(text) == 1:
 | 
						|
            whoami.Say('Usage "mailscroll <friend>"')
 | 
						|
            return
 | 
						|
 | 
						|
        log = CFLog.CFLog()
 | 
						|
 | 
						|
        if not log.info(text[1]):
 | 
						|
            whoami.Say('I don\'t know %s'%text[1])
 | 
						|
            return
 | 
						|
 | 
						|
        priceMailScroll = 5
 | 
						|
        priceFactor = 50	# platinum to silver conversion
 | 
						|
 | 
						|
        if activator.PayAmount(priceMailScroll*priceFactor):
 | 
						|
                whoami.Say('Here is your mailscroll to %s'%text[1])
 | 
						|
                id = activator.CreateObject('scroll')
 | 
						|
                id.Name = 'mailscroll T: '+text[1]+' F: '+activator.Name
 | 
						|
                id.NamePl = 'mailscrolls T: '+text[1]+' F: '+activator.Name
 | 
						|
                id.Value = 0
 | 
						|
        else:
 | 
						|
                whoami.Say('You need %s platinum for a mailscroll'%priceMailScroll)
 | 
						|
 | 
						|
    def do_balance(self):
 | 
						|
        '''Handle the display of the guild's balance.'''
 | 
						|
        bank = CFBank.CFBank(bankdatabase)
 | 
						|
        balance = bank.getbalance(self.accountname)
 | 
						|
        whoami.Say("The guild currently has %s on account." %(formatted_amount(balance)))
 | 
						|
 | 
						|
    def do_pay(self, text):
 | 
						|
        '''Handle player paying dues to the guild.'''
 | 
						|
        if len(text) < 2:
 | 
						|
            whoami.Say("How much ya wanna pay %s?\nYou can specify amounts in "%(random.choice(buddylist)) +
 | 
						|
            ', '.join(i.lower() for i in CoinTypes.keys()))
 | 
						|
            return
 | 
						|
 | 
						|
        cost = text[1]
 | 
						|
        type = ' '.join(text[2:])
 | 
						|
        utype = type.upper()
 | 
						|
        if not utype in CoinTypes.keys():
 | 
						|
            whoami.Say("Sorry, I don't know what are %s"%type)
 | 
						|
            return
 | 
						|
 | 
						|
        conversionfactor = CoinTypes.get(utype)
 | 
						|
        total = int(cost)*conversionfactor
 | 
						|
        if activator.PayAmount(total):
 | 
						|
            guild = CFGuilds.CFGuild(self.guildname)
 | 
						|
            guild.pay_dues(activator.Name,total)
 | 
						|
            whoami.Say("%s, %s %s paid to the guild." %(random.choice(remarklist), cost, type))
 | 
						|
            bank = CFBank.CFBank(bankdatabase)
 | 
						|
            bank.deposit(self.accountname, total)
 | 
						|
        else:
 | 
						|
            if cost > 1:
 | 
						|
                whoami.Say("%s, you don't have %s %ss." %(random.choice(exclaimlist), cost, type))
 | 
						|
            else:
 | 
						|
                whoami.Say("You don't have any %s, %s." %(type, random.choice(buddylist)))
 | 
						|
 | 
						|
    def do_withdraw(self, text):
 | 
						|
        if (not activator.DungeonMaster==1 and not CheckClearance([self.guildname,"Master"],activator)):
 | 
						|
            whoami.Say("Only guild masters, masters, and DMs can withdraw funds from the guild.")
 | 
						|
            return
 | 
						|
 | 
						|
        try:
 | 
						|
            Amount=int(text[1])
 | 
						|
        except:
 | 
						|
            whoami.Say("Usage: withdraw <quantity> {cointype=silver}")
 | 
						|
            return
 | 
						|
 | 
						|
        bank = CFBank.CFBank(bankdatabase)
 | 
						|
        balance = bank.getbalance(self.accountname)
 | 
						|
 | 
						|
        if len(text) > 2:
 | 
						|
            Type = ' '.join(text[2:])
 | 
						|
        else:
 | 
						|
            Type = "silver"
 | 
						|
 | 
						|
        if not Type.upper() in CoinTypes.keys():
 | 
						|
            whoami.Say("Sorry, I have no clue what %s are"%Type)
 | 
						|
            return
 | 
						|
 | 
						|
        Value = CoinTypes.get(Type.upper())
 | 
						|
 | 
						|
        if Amount*Value <= balance:
 | 
						|
                message = (str(Amount))
 | 
						|
                message +=" " + Type + " withdrawn.\nYour new present balance is "
 | 
						|
 | 
						|
                id = activator.CreateObject(ArchType.get(Type.upper()))
 | 
						|
                CFItemBroker.Item(id).add(Amount)
 | 
						|
                bank.withdraw(self.accountname, Amount*Value)
 | 
						|
                message += formatted_amount(bank.getbalance(self.accountname))+"."
 | 
						|
                whoami.Say(message)
 | 
						|
        else:
 | 
						|
                message="You only have " + formatted_amount(bank.getbalance(self.accountname))+" on your account."
 | 
						|
                whoami.Say(message)
 | 
						|
 | 
						|
    def handle_jack(self):
 | 
						|
        '''Handle Jack, the guild helper'''
 | 
						|
 | 
						|
        text = Crossfire.WhatIsMessage().split()
 | 
						|
        command = text[0].lower()
 | 
						|
 | 
						|
        if command == 'buy':
 | 
						|
            self.do_buy(text)
 | 
						|
            return
 | 
						|
 | 
						|
        if command == 'mailscroll':
 | 
						|
            self.do_mailscroll(text)
 | 
						|
            return
 | 
						|
 | 
						|
        if command == 'balance':
 | 
						|
            self.do_balance()
 | 
						|
            return
 | 
						|
 | 
						|
        if command == 'pay':
 | 
						|
            self.do_pay(text)
 | 
						|
            return
 | 
						|
 | 
						|
        if command == 'withdraw':
 | 
						|
            self.do_withdraw(text)
 | 
						|
            return
 | 
						|
 | 
						|
        if command == 'help' or command == 'yes':
 | 
						|
            self.do_help()
 | 
						|
            return
 | 
						|
 | 
						|
        message = "Howdy %s, paying some guild dues today?" %(random.choice(buddylist))
 | 
						|
        whoami.Say(message)
 | 
						|
 | 
						|
 | 
						|
    def handle(self):
 | 
						|
        '''Main handling function'''
 | 
						|
        if not self.guildname:
 | 
						|
            activator.Write('dues error, please notify a DM')
 | 
						|
            return
 | 
						|
 | 
						|
        bank = CFBank.CFBank(bankdatabase)
 | 
						|
        self.accountname = self.guildname + str(self.guildname.__hash__())
 | 
						|
 | 
						|
        if whoami.Name == 'Jack':
 | 
						|
            self.handle_jack()
 | 
						|
            return
 | 
						|
 | 
						|
        amount = Crossfire.WhoIsOther().Value * Crossfire.WhoIsOther().Quantity
 | 
						|
        bank.deposit(self.accountname, amount)
 | 
						|
 | 
						|
dues = GuildDues()
 | 
						|
dues.handle()
 |