Pyhtohon3 compatible. Various cleanup/fixes.

This commit is contained in:
oddluck 2019-12-09 15:32:53 +00:00
parent bc8f82a602
commit 13c46bed1e
12 changed files with 176 additions and 146 deletions

View File

@ -35,29 +35,32 @@ here. This should describe *what* the plugin does.
import supybot import supybot
import supybot.world as world import supybot.world as world
import importlib
# Use this for the version of this plugin. You may wish to put a CVS keyword # Use this for the version of this plugin. You may wish to put a CVS keyword
# in here if you're keeping the plugin in CVS or some similar system. # in here if you're keeping the plugin in CVS or some similar system.
__version__ = "" __version__ = ""
# XXX Replace this with an appropriate author or supybot.Author instance. # XXX Replace this with an appropriate author or supybot.Author instance.
__author__ = supybot.authors.unknown __author__ = supybot.Author('Anthiny Boot', 'antb', '')
__maintainer__ = getattr(supybot.authors, 'oddluck',
supybot.Author('oddluck', 'oddluck', 'oddluck@riseup.net'))
# This is a dictionary mapping supybot.Author instances to lists of # This is a dictionary mapping supybot.Author instances to lists of
# contributions. # contributions.
__contributors__ = {} __contributors__ = {}
# This is a url where the most recent plugin package can be downloaded. # This is a url where the most recent plugin package can be downloaded.
__url__ = '' # 'http://supybot.com/Members/yourname/Rpg/download' __url__ = 'https://github.com/oddluck/limnoria-plugins/'
import config from . import config
import plugin from . import plugin
reload(plugin) # In case we're being reloaded. importlib.reload(plugin) # In case we're being reloaded.
# Add more reloads here if you add third-party modules and want them to be # Add more reloads here if you add third-party modules and want them to be
# reloaded when this plugin is reloaded. Don't forget to import them as well! # reloaded when this plugin is reloaded. Don't forget to import them as well!
if world.testing: if world.testing:
import test from . import test
Class = plugin.Class Class = plugin.Class
configure = config.configure configure = config.configure

66
RPG/__init__.py.bak Normal file
View File

@ -0,0 +1,66 @@
###
# Copyright (c) 2011, Anthony Boot
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the author of this software nor the name of
# contributors to this software may be used to endorse or promote products
# derived from this software without specific prior written consent.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
###
"""
Add a description of the plugin (to be presented to the user inside the wizard)
here. This should describe *what* the plugin does.
"""
import supybot
import supybot.world as world
# Use this for the version of this plugin. You may wish to put a CVS keyword
# in here if you're keeping the plugin in CVS or some similar system.
__version__ = ""
# XXX Replace this with an appropriate author or supybot.Author instance.
__author__ = supybot.authors.unknown
# This is a dictionary mapping supybot.Author instances to lists of
# contributions.
__contributors__ = {}
# This is a url where the most recent plugin package can be downloaded.
__url__ = '' # 'http://supybot.com/Members/yourname/Rpg/download'
import config
import plugin
reload(plugin) # In case we're being reloaded.
# Add more reloads here if you add third-party modules and want them to be
# reloaded when this plugin is reloaded. Don't forget to import them as well!
if world.testing:
import test
Class = plugin.Class
configure = config.configure
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79:

Binary file not shown.

Binary file not shown.

View File

@ -37,10 +37,10 @@ def configure(advanced):
# user or not. You should effect your configuration by manipulating the # user or not. You should effect your configuration by manipulating the
# registry as appropriate. # registry as appropriate.
from supybot.questions import expect, anything, something, yn from supybot.questions import expect, anything, something, yn
conf.registerPlugin('Rpg', True) conf.registerPlugin('RPG', True)
Rpg = conf.registerPlugin('Rpg') Rpg = conf.registerPlugin('RPG')
# This is where your configuration variables (if any) should go. For example: # This is where your configuration variables (if any) should go. For example:
# conf.registerGlobalValue(Rpg, 'someConfigVariableName', # conf.registerGlobalValue(Rpg, 'someConfigVariableName',
# registry.Boolean(False, """Help for someConfigVariableName.""")) # registry.Boolean(False, """Help for someConfigVariableName."""))

View File

@ -1 +1,2 @@
{"modifiers": [["AntB", 150, 200, 2], ["Catelite", 75, 150, 5], ["Frankbro", 75, 150, 5], ["Simon", 100, 150, 2], ["cracker64", 64, 64, 15], ["RedFlash", 50, 70, 20], ["Magical", 50, 65, 22], ["QRTZ", 50, 60, 25], ["DMND", 45, 55, 30], ["CLNE", 40, 50, 40], ["INSL", 35, 45, 50], ["Fine", 5, 15, 60], ["Cold-proof", 5, 10, 65], ["Fire-proof", 5, 12, 65], ["Polished", 5, 7, 65], ["Azure", 2, 5, 70], [["Crude", 1, 3, 80]], [["Damaged", 1, 2, 90]], ["", 0, 0, 100], ["Doxin", 60, 80, 7]], "swords": [["Sharpened Wooden", 1, 5, 90], ["Short Sword", 1, 10, 80], ["Gladius", 4, 13, 70], ["Dagger", 7, 13, 60], ["", 6, 15, 50], ["Cutlass", 5, 15, 40], ["Katana", 8, 15, 30], ["Bastard", 10, 17, 20], ["Weighted", 15, 20, 10], ["Whip", 17, 30, 5]], "defence": [["Tin", 1, 5, 90], ["Aluminium", 3, 8, 80], ["Iron", 6, 11, 70], ["Bronze", 9, 14, 60], ["Steel", 12, 17, 50], ["Reinforced", 15, 40], ["Hoylian", 18, 23, 30], ["Mirrored", 21, 26, 20], ["Reforged Steel", 24, 29, 10], ["Tower", 27, 32, 5]]} {"modifiers": [["Legendary", 150, 200, 2], ["Sensational", 75, 150, 5], ["Rare", 75, 150, 5], ["Lucky", 100, 150, 2], ["Diamond", 64, 64, 15], ["Magical", 50, 70, 20], ["Strengthened", 50, 65, 22], ["Quartz", 50, 60, 25], ["Diamond", 45, 55, 30], ["Enchanted", 40, 50, 40], ["Improved", 35, 45, 50], ["Fine", 5, 15, 60], ["Cold-proof", 5, 10, 65], ["Fire-proof", 5, 12, 65], ["Polished", 5, 7, 65], ["Makeshift", 2, 5, 70], [["Crude", 1, 3, 80]], [["Damaged", 1, 2, 90]], ["", 0, 0, 100]], "swords": [["Wooden Sword", 1, 5, 90], ["Short Sword", 1, 10, 80], ["Longsword", 4, 13, 70], ["Dagger", 7, 13, 60], ["Broadsword", 6, 15, 50], ["Cutlass", 5, 15, 40], ["Katana", 8, 15, 30], ["Bastard", 10, 17, 20], ["Weighted", 15, 20, 10], ["Samurai", 17, 30, 5]], "defence": [["Tin", 1, 5, 90], ["Aluminium", 3, 8, 80], ["Iron", 6, 11, 70], ["Bronze", 9, 14, 60], ["Iron", 12, 17, 50], ["Steel", 15, 40], ["Reinforced", 18, 23, 30], ["Mirrored", 21, 26, 20], ["Titanium", 24, 29, 10], ["Meteorite", 27, 32, 5]]}

View File

@ -1,51 +1,53 @@
################################################### #####################################################
#.........#...##..#............#..................# #......:...................~......#.....#...##......#
#.......~............~.......~...............#....# #.#......#....#..........~..............#~.......#..#
#...................#..........#....#....##......## #...........#...........#.........................:.#
#....#.#................#...........~....#.......## #.....##.....#........#..##.#..#..................###
#.............#....#.#.......#.......#..........~.# #..#...#...#..........#.........#....~.~..#.........#
#...........#.............#..~....................# #...:.##....#....#...#..~.........:....#.#..........#
#...#...:.~......#.#.............#.....#.....#...## #...#.....#..#.....#........:.....#...............#.#
#................#..#........:.#...:..#...~.:...#.# #.................#..........#....................#.#
#....................#.........................#.## #....................#....#.............#...........#
#............#..#........##.........:#..........#.# #..#...#...:.......................:.#....##........#
#...#....#.......#.............#..................# #........#...#..#:..........#...................#...#
#............#.....................#........#.....# #............................#.....:##:...#.#......##
#.~#.................~....~......:..........:.....# #:..~...........................:......#....#......##
#..........:..:.::.............#..............#...# #....:...#...........#.:.....~.#....................#
##.........:...#....#..#.#....#..#.....#..........# #.....#....:..#....:......#.....#:......#.....#.....#
#.#........................:....#....~....~.#~#...# #....................##......##.#.....~..#..#.#...#.#
##..#.....................................#...#...# #.....#..........~.........##....#...##..........##.#
###.......#...:.....~..............#.#.#..........# #.#......#...........#..........##..................#
#....:...#................:........:.........#....# #..............#........#...........#...............#
#..#.~.......#................#.........#..:......# #.....###....#...~......#......:..##.#..............#
#...:.............~#.......##.........:..........## #..#.....:.............#...#.............#....:.....#
#...~...#..#.##.#....#.............#......#.......# #..............#.:..#..#..~:....:.............:.#...#
#........:.#..##.....:..#.............:.....#.....# #...................#.......................#.......#
#..#..#...:......#........:#.~....................# #..........#.............................#..........#
#~.......#.....#~#.......@...:...........~........# #.............#...................#..#..:~.......:..#
#...................#...:.....:.....#.....#.#..#..# #......:..#....#..##......@#...............#........#
#...#.............#......#......................#.# #.#...##...#............##......#....#....#.........#
#.....#~......##.........................#........# #.##...#.............~.##.~......#.#.........#......#
#....#....#.....................~:...#..~....#..#.# #........#............#......#........~..#.....##.#.#
#..#......#............#........#..#.~...........~# #.#.#..........#........~.................:...#.:.#.#
#.........:......#.............~....#.............# #...........#.................................#.....#
##~...:.........:#...#..#....:...............#....# #......#..:..................#.............~~.......#
#...#..:.#..:.......~#................#~.........## #.................~......:.....#..#.....:...........#
#...:...#..#....#..#..............:#..#...........# #.....#...#........#......:.#.............:......:..#
#.....................~.:......#...~#....#........# #.......:#.........#..........:.~...#..~.#...#....#.#
#.#.....~............#.................~..:.......# #................................##..............#..#
##..........................:.......#.....#.......# #............#.....~..........#.......#...........#.#
#............##.....#..#......#.........#........:# #~#.........#..#...#.........##...........#....:.#..#
#..#:..~....#.........#...~..#.#........#...~.....# #...................:......##..........#............#
#.........:........#......:......:.........#...#.~# #...............#.....#............#........~.#:....#
#...............:......:...........~.....#..#.....# #.........#...#.........#...:..#..#.....#.#......#..#
#...~...#....................................#...:# #.....##....#...............#..#..........~..##.....#
#..#:.................#...........................# #..............#.........#..................#....##.#
#....#...#................#.#.:........#.....#....# #..................:#.#........................#....#
#...~.......~......#........~....#~...............# #..........#.........................#........###:..#
#.~....~.................:.........#...........#..# #..........#..:........##......#...........#.......##
#.........##.......#.............................## #.......::.....................##~#.....~...........#
###..#:................##....#.....#...#..........# #:.......:.....##...........#......~...........#....#
#.........#............~#..#......##:....:........# #............~.:...#.#:.....................#.....#.#
################################################### ##..#...#...#.......................................#
#........#..#...##.#...............:.......#........#
#####################################################

View File

@ -1 +1 @@
{"homeX": 25, "homeY": 25, "height": 50, "width": 50, "homeLoc": 1325, "desc": "Random Generation."} {"width": 52, "height": 52, "homeY": 26.0, "homeX": 26, "homeLoc": 1430, "desc": "Random Generation."}

View File

@ -1 +1 @@
{"monsters": ["Photons", "Trolls", "Moderators", "Basement Cat", "Internet Explorers", "Fired Fox", "Cereal Guys", "Opera Singers", "Justin Beiber Impersonators", "Twilight Fans", "Harry Potter Fans", "The Invisible Man", "Swimming Trunks", "Guko", "Paranoid Parrots", "Stickmen", "8-Bit Shades", "Insanity Wolf", "Emo kids", "Psychosociables", "Guitar Heroes", "Balloon Bombers", "Mad Motorist", "Crazy Hobo", "Radioactive Aardvarks", "Rouge Banhammers"], "boss": {"pen": [{"luc": [50, 100]}, {"atk": [100, 10]}, {"def": [50, 5]}, {"atk": [5, 100]}], "names": ["Mortvert", "cctvdude99", "Nibble", "Stewie", "HK6", "Frankomisko"]}} {"monsters": ["Ruthless Doom Panther", "Primeval Frost Gorilla", "Elusive Corpse Leopard", "Blight Hog", "Electric Nether Wolf", "Savage Spite Owl", "Rabid Grief Frog", "Putrid Bulge Hound", "Howling Murder Yak", "Raging Ghost Spider"], "boss": {"pen": [{"luc": [50, 100]}, {"atk": [100, 10]}, {"def": [50, 5]}, {"atk": [5, 100]}], "names": ["Vexspawn", "Dreadtooth", "Thunderscream", "Doomfoot", "Germclaw", "Cinderface"]}}

View File

@ -1 +1 @@
{"AntB": {"Loc": 1277, "force": false, "Deaths": 0, "HP": 1500, "Atk": 144, "Item": {"rArm": {"Name": "AntB's BanBlade", "Power": 200}, "Head": {"Name": "AntB's Customised", "Power": 0}, "Torso": {"Name": "AntB's Anti-Troll", "Power": 200}, "lArm": {"Name": "AntB's Magnet", "Power": 90}}, "Luc": 91, "MHP": 1512, "Exp": 8231, "Lvl": 107, "Spd": 116, "Def": 231}, "desred3": {"Loc": 912, "force": false, "Deaths": 4, "HP": 30, "Atk": 4, "Item": {"rArm": {"Name": "Wooden", "Power": 1}, "Head": {"Name": "Cloth", "Power": 1}, "Torso": {"Name": "Cloth", "Power": 1}, "lArm": {"Name": "Wooden", "Power": 1}}, "Luc": 1, "MHP": 30, "Exp": 1, "Lvl": 1, "Spd": 4, "Def": 5}, "InsanityPrawnBoy": {"Loc": 1325, "force": false, "Deaths": 1, "HP": 22, "Atk": 4, "Item": {"Torso": {"Name": "Cloth", "Power": 2}, "Head": {"Name": "Cloth", "Power": 2}, "rArm": {"Name": "Wooden", "Power": 2}, "lArm": {"Name": "Wooden", "Power": 2}}, "Luc": 1, "Def": 4, "Exp": 0, "Lvl": 1, "Spd": 2, "MHP": 22}, "supertanno": {"Loc": 1167, "force": false, "Deaths": 0, "HP": 25, "Atk": 5, "Item": {"Torso": {"Name": "Cloth", "Power": 1}, "Head": {"Name": "Cloth", "Power": 2}, "rArm": {"Name": "Wooden", "Power": 1}, "lArm": {"Name": "Wooden", "Power": 2}}, "Luc": 1, "Def": 4, "Exp": 0, "Lvl": 1, "Spd": 2, "MHP": 25}} {"AntB": {"Loc": 1430.0, "force": false, "Deaths": 0, "HP": 1500, "Atk": 144, "Item": {"rArm": {"Name": "AntB's BanBlade", "Power": 200}, "Head": {"Name": "AntB's Customised", "Power": 0}, "Torso": {"Name": "AntB's Anti-Troll", "Power": 200}, "lArm": {"Name": "AntB's Magnet", "Power": 90}}, "Luc": 91, "MHP": 1512, "Exp": 8231, "Lvl": 107, "Spd": 116, "Def": 231}, "desred3": {"Loc": 1430.0, "force": false, "Deaths": 4, "HP": 30, "Atk": 4, "Item": {"rArm": {"Name": "Wooden", "Power": 1}, "Head": {"Name": "Cloth", "Power": 1}, "Torso": {"Name": "Cloth", "Power": 1}, "lArm": {"Name": "Wooden", "Power": 1}}, "Luc": 1, "MHP": 30, "Exp": 1, "Lvl": 1, "Spd": 4, "Def": 5}, "InsanityPrawnBoy": {"Loc": 1430.0, "force": false, "Deaths": 1, "HP": 22, "Atk": 4, "Item": {"Torso": {"Name": "Cloth", "Power": 2}, "Head": {"Name": "Cloth", "Power": 2}, "rArm": {"Name": "Wooden", "Power": 2}, "lArm": {"Name": "Wooden", "Power": 2}}, "Luc": 1, "Def": 4, "Exp": 0, "Lvl": 1, "Spd": 2, "MHP": 22}, "supertanno": {"Loc": 1430.0, "force": false, "Deaths": 0, "HP": 25, "Atk": 5, "Item": {"Torso": {"Name": "Cloth", "Power": 1}, "Head": {"Name": "Cloth", "Power": 2}, "rArm": {"Name": "Wooden", "Power": 1}, "lArm": {"Name": "Wooden", "Power": 2}}, "Luc": 1, "Def": 4, "Exp": 0, "Lvl": 1, "Spd": 2, "MHP": 25}, "oddluck": {"Lvl": 1, "Exp": 0, "MHP": 19, "HP": 19, "Atk": 1, "Def": 2, "Spd": 1, "Luc": 1, "Item": {"Head": {"Name": "Cloth", "Power": 0}, "Torso": {"Name": "Cloth", "Power": 0}, "lArm": {"Name": "Wooden", "Power": 0}, "rArm": {"Name": "Wooden", "Power": 0}}, "Deaths": 0, "Loc": 1430, "force": false}}

View File

@ -33,7 +33,7 @@ from supybot.commands import *
import supybot.plugins as plugins import supybot.plugins as plugins
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
import os
import supybot.ircmsgs as ircmsgs import supybot.ircmsgs as ircmsgs
import supybot.ircdb as ircdb import supybot.ircdb as ircdb
import random import random
@ -42,23 +42,20 @@ try:
except: except:
import json as simplejson import json as simplejson
class Rpg(callbacks.Plugin): class RPG(callbacks.Plugin):
'''A text based RPG for IRC channels. Requires the user to be registered '''A text based RPG for IRC channels. Requires the user to be registered
with supybot to use it. all commands are prefixed with rpg. Command list: with supybot to use it. all commands are prefixed with rpg. Command list:
rpgmove rpgstats rpgrun rpgnew rpgloc rpgviewarea''' rpgmove rpgstats rpgrun rpgnew rpgloc rpgviewarea'''
threaded = True threaded = True
class rpg(callbacks.Commands):
gameChannel='##TPTRPG'
playerData=mapData=mapInfo=monsterData=itemData={} playerData=mapData=mapInfo=monsterData=itemData={}
consolechannel = '##sgoutput' consolechannel = None
filepath = '/home/antb/StewieGriffin/plugins/Rpg/' filepath = "{0}/".format(os.path.dirname(os.path.abspath(__file__)))
######################### #########################
### Game Commands ### ### Game Commands ###
######################### #########################
def rpgReloadData(self,irc,msg,args): def reloaddata(self,irc,msg,args):
"""Reload RPG data. """
if not ircdb.users.getUser(msg.prefix)._checkCapability('admin'): if not ircdb.users.getUser(msg.prefix)._checkCapability('admin'):
irc.error('Only people with \'Admin\' can do that.') irc.error('Only people with \'Admin\' can do that.')
return return
@ -70,9 +67,10 @@ class Rpg(callbacks.Plugin):
self.monsterData = simplejson.load(f) self.monsterData = simplejson.load(f)
self._getItemsFile() self._getItemsFile()
irc.replySuccess() irc.replySuccess()
reloaddata = wrap(rpgReloadData) reloaddata = wrap(reloaddata)
def rpgGenMap(self,irc,msg,args,width,height): def genmap(self,irc,msg,args,width,height):
"""Generate map."""
if not ircdb.users.getUser(msg.prefix)._checkCapability('owner'): if not ircdb.users.getUser(msg.prefix)._checkCapability('owner'):
irc.error('Only people with \'Admin\' can do that.') irc.error('Only people with \'Admin\' can do that.')
return return
@ -86,7 +84,6 @@ class Rpg(callbacks.Plugin):
except: except:
irc.error('Invalid arguments given.') irc.error('Invalid arguments given.')
return return
random.seed() random.seed()
seed=random.random() seed=random.random()
random.seed(seed) random.seed(seed)
@ -95,9 +92,7 @@ class Rpg(callbacks.Plugin):
# # is wall : is boss ~ is item . is nothing. # # is wall : is boss ~ is item . is nothing.
rand = {} rand = {}
terrainmap = '' terrainmap = ''
self._sendDbg(irc,'Generating new usermap..') self._sendDbg(irc,'Generating new usermap..')
x = -1 x = -1
while x < width: while x < width:
terrainline='' terrainline=''
@ -124,31 +119,24 @@ class Rpg(callbacks.Plugin):
else: else:
terrainline+=terrain[rand[4]] terrainline+=terrain[rand[4]]
terrainmap+=terrainline+'\n' terrainmap+=terrainline+'\n'
data = {'width':width,'height':height,'homeY':(height/2),'homeX':int(width/2),'homeLoc':int((height/2)+((width/2)*(width+2))),'desc':'Random Generation.'} data = {'width':width,'height':height,'homeY':(height/2),'homeX':int(width/2),'homeLoc':int((height/2)+((width/2)*(width+2))),'desc':'Random Generation.'}
with open(self.filepath+'mapData.txt','w') as f: with open(self.filepath+'mapData.txt','w') as f:
simplejson.dump(data,f) simplejson.dump(data,f)
self._saveMapData(terrainmap) self._saveMapData(terrainmap)
irc.replySuccess('Map regeneration') irc.replySuccess('Map regeneration')
self._sendDbg(irc,'Map created and saved to map.txt, info saved to mapData.txt') self._sendDbg(irc,'Map created and saved to map.txt, info saved to mapData.txt')
playerData=self.playerData playerData=self.playerData
for player in playerData: for player in playerData:
playerData[player]['Loc']=(height/2)+((width/2)*(width+2)) playerData[player]['Loc']=(height/2)+((width/2)*(width+2))
self._savePlayerData(playerData) self._savePlayerData(playerData)
self._sendDbg(irc,'Players relocated successfully.') self._sendDbg(irc,'Players relocated successfully.')
irc.replySuccess('Players Relocated to Home') irc.replySuccess('Players Relocated to Home')
genmap = wrap(genmap,[optional('somethingWithoutSpaces'),optional('somethingWithoutSpaces')])
# if (self.serverUrl) def stats(self,irc,msg,args):
# submit = utils.web.getUrl(self.serverUrl+"?m=%s&w=%i&h=%&hm=%i&hy=%i """Get player stats."""
genmap = wrap(rpgGenMap,[optional('somethingWithoutSpaces'),optional('somethingWithoutSpaces')])
def rpgStats(self,irc,msg,args):
player = self._checkPlayer(irc,msg) player = self._checkPlayer(irc,msg)
playerData = self.playerData[player] playerData = self.playerData[player]
level = playerData['Lvl'] level = playerData['Lvl']
exp = playerData['Exp'] exp = playerData['Exp']
next = self._getNextLevelXp(player) next = self._getNextLevelXp(player)
@ -161,23 +149,21 @@ class Rpg(callbacks.Plugin):
deaths = playerData['Deaths'] deaths = playerData['Deaths']
hp = playerData['HP'] hp = playerData['HP']
mhp = playerData['MHP'] mhp = playerData['MHP']
weapon = playerData['Item']['rArm']['Name'] weapon = playerData['Item']['rArm']['Name']
helmet = playerData['Item']['Head']['Name'] helmet = playerData['Item']['Head']['Name']
shield = playerData['Item']['lArm']['Name'] shield = playerData['Item']['lArm']['Name']
armour = playerData['Item']['Torso']['Name'] armour = playerData['Item']['Torso']['Name']
irc.reply('%s is at Level %i with %i experience; %i is \ irc.reply('%s is at Level %i with %i experience; %i is \
needed for the next level. You have %i/%i HP. \ needed for the next level. You have %i/%i HP. \
Your base attack is %i and is boosted to %i by your %s Sword. Your base \ Your base attack is %i and is boosted to %i by your %s Sword. Your base \
defence is %i, boosted to %i with your %s Helmet and %s Armour. Your %s \ defence is %i, boosted to %i with your %s Helmet and %s Armour. Your %s \
Shield gives you a %i%s chance to block attacks. Your Luck \ Shield gives you a %i%s chance to block attacks. Your Luck \
rating is %i. You have died %i times.\ rating is %i. You have died %i times.\
'%(player,level,exp,next,hp,mhp,baseAtk,totalAtk,weapon,baseDef,totalDef,helmet,armour,shield,block,'%',luck,deaths) '%(player,level,exp,next,hp,mhp,baseAtk,totalAtk,weapon,baseDef,totalDef,helmet,armour,shield,block,'%',luck,deaths) )
) stats = wrap(stats)
stats = wrap(rpgStats)
def rpgNew(self,irc,msg,args): def newplayer(self,irc,msg,args):
"""Create new RPG player."""
player = self._checkPlayer(irc,msg,1) player = self._checkPlayer(irc,msg,1)
playerData = self.playerData playerData = self.playerData
@ -198,17 +184,16 @@ rating is %i. You have died %i times.\
playerData[player]['Deaths'] = 0 playerData[player]['Deaths'] = 0
playerData[player]['Loc']=self.mapInfo['homeLoc'] playerData[player]['Loc']=self.mapInfo['homeLoc']
playerData[player]['force']=False playerData[player]['force']=False
self._sendDbg(irc,player+' has been reset/created') self._sendDbg(irc,player+' has been reset/created')
self._savePlayerData(playerData) self._savePlayerData(playerData)
self.rpgStats(irc,msg,args) self.stats(irc,msg,args)
new = wrap(rpgNew) newplayer = wrap(newplayer)
def rpgLocation(self,irc,msg,args): def location(self,irc,msg,args):
"""Get player location"""
player = self._checkPlayer(irc,msg) player = self._checkPlayer(irc,msg)
location = self.playerData[player]['Loc'] location = self.playerData[player]['Loc']
mapInfo = self.mapInfo mapInfo = self.mapInfo
x=0 x=0
while True: while True:
if location > mapInfo['width']: if location > mapInfo['width']:
@ -218,14 +203,14 @@ rating is %i. You have died %i times.\
break break
y = location y = location
irc.reply('You are located at (%i,%i). Home is at (%i,%i)'%(x,y,self.mapInfo['homeX'],self.mapInfo['homeY'])) irc.reply('You are located at (%i,%i). Home is at (%i,%i)'%(x,y,self.mapInfo['homeX'],self.mapInfo['homeY']))
loc = wrap(rpgLocation) location = wrap(location)
def rpgViewArea(self,irc,msg,args): def look(self,irc,msg,args):
"""Look aroun."""
player = self._checkPlayer(irc,msg) player = self._checkPlayer(irc,msg)
location = self.playerData[player]['Loc'] location = self.playerData[player]['Loc']
mapData = self.mapData mapData = self.mapData
mapInfo = self.mapInfo mapInfo = self.mapInfo
area = [] area = []
area += mapData[location-(mapInfo['width']+3)] area += mapData[location-(mapInfo['width']+3)]
area += mapData[location-(mapInfo['width']+2)] area += mapData[location-(mapInfo['width']+2)]
@ -235,7 +220,6 @@ rating is %i. You have died %i times.\
area += mapData[location+(mapInfo['width']+1)] area += mapData[location+(mapInfo['width']+1)]
area += mapData[location+(mapInfo['width']+2)] area += mapData[location+(mapInfo['width']+2)]
area += mapData[location+(mapInfo['width']+3)] area += mapData[location+(mapInfo['width']+3)]
for x in area: for x in area:
line = area.index(x) line = area.index(x)
if x is '.': if x is '.':
@ -248,13 +232,13 @@ rating is %i. You have died %i times.\
area[line]='Boss' area[line]='Boss'
elif x is '@': elif x is '@':
area[line]='Home' area[line]='Home'
irc.reply('NW: %s - N: %s - NE: %s - W: %s - E: %s - SW: %s - S: %s - SE: %s\ irc.reply('NW: %s - N: %s - NE: %s - W: %s - E: %s - SW: %s - S: %s - SE: %s\
'%(area[0],area[1],area[2],area[3],area[4],area[5],area[6],area[7]) '%(area[0],area[1],area[2],area[3],area[4],area[5],area[6],area[7])
) )
viewarea=wrap(rpgViewArea) look=wrap(look)
def rpgforcebattle(self,irc,msg,args): def forcebattle(self,irc,msg,args):
"""Force battle nex turn."""
player=self._checkPlayer(irc,msg) player=self._checkPlayer(irc,msg)
if self.playerData[player]['force']: if self.playerData[player]['force']:
self.playerData[player]['force']=False self.playerData[player]['force']=False
@ -262,19 +246,20 @@ rating is %i. You have died %i times.\
else: else:
self.playerData[player]['force']=True self.playerData[player]['force']=True
irc.reply('%s will enter a monster battle on their next turn.'%player.capitalize(),prefixNick=False) irc.reply('%s will enter a monster battle on their next turn.'%player.capitalize(),prefixNick=False)
forcebattle=wrap(rpgforcebattle) forcebattle=wrap(forcebattle)
def rpgmove(self,irc,msg,args,direction,number): def move(self,irc,msg,args,direction,number):
"""[direction] [number]
Move [direction] [number].
"""
player = self._checkPlayer(irc,msg) player = self._checkPlayer(irc,msg)
playerData = self.playerData playerData = self.playerData
mapData = self.mapData mapData = self.mapData
mapInfo = self.mapInfo mapInfo = self.mapInfo
direction = direction.upper() direction = direction.upper()
try: number = int(number) try: number = int(number)
except: number = 1 except: number = 1
if number == 0: number=1 if number == 0: number=1
x = 0 x = 0
while x < number: while x < number:
if direction == 'NW': if direction == 'NW':
@ -335,15 +320,12 @@ rating is %i. You have died %i times.\
self._savePlayerData(playerData) self._savePlayerData(playerData)
else: else:
irc.error("Move failed. you gave %s as a direction. %s"%(direction,str(type(direction)))) irc.error("Move failed. you gave %s as a direction. %s"%(direction,str(type(direction))))
if mapData[playerData[player]['Loc']] is '~': if mapData[playerData[player]['Loc']] is '~':
self._genItem(player,2) self._genItem(player,2)
# mapData[playerData[player]['Loc']]='.' # mapData[playerData[player]['Loc']]='.'
self._saveMapData() self._saveMapData()
elif mapData[playerData[player]['Loc']] is ':': elif mapData[playerData[player]['Loc']] is ':':
self._doBattle(irc,player,2,msg.nick) self._doBattle(irc,player,2,msg.nick)
elif mapData[playerData[player]['Loc']] is '.': elif mapData[playerData[player]['Loc']] is '.':
if playerData[player]['force'] is True: if playerData[player]['force'] is True:
self._sendDbg(irc,"Battle Forced") self._sendDbg(irc,"Battle Forced")
@ -352,35 +334,23 @@ rating is %i. You have died %i times.\
self._savePlayerData(playerData) self._savePlayerData(playerData)
elif int(random.random()*100) < 5: elif int(random.random()*100) < 5:
self._doBattle(irc,player,1,msg.nick) self._doBattle(irc,player,1,msg.nick)
elif mapData[playerData[player]['Loc']] is '@': elif mapData[playerData[player]['Loc']] is '@':
playerData[player]['HP']=playerData[player]['MHP'] playerData[player]['HP']=playerData[player]['MHP']
# irc.reply("Your health has been restored.") # irc.reply("Your health has been restored.")
irc.queueMsg(ircmsgs.IrcMsg('NOTICE {0} :Your health has been restored.'.format(msg.nick))) irc.queueMsg(ircmsgs.IrcMsg('NOTICE {0} :Your health has been restored.'.format(msg.nick)))
self._savePlayerData(playerData) self._savePlayerData(playerData)
x+=1 x+=1
move = wrap(move,['somethingWithoutSpaces',optional('int')])
move = wrap(rpgmove,['somethingWithoutSpaces',optional('int')])
############################ ############################
### Engine functions ### ### Engine functions ###
############################ ############################
def _checkPlayer(self,irc,msg,new=0): def _checkPlayer(self,irc,msg,new=0):
if (msg.args[0] != self.gameChannel):
if msg.nick in irc.state.channels[self.gameChannel].users:
irc.error('That command cannot be sent in this channel. Please try again in %s'%self.gameChannel)
else:
irc.error('You need to join %s and use that command there.'%self.gameChannel)
irc.queueMsg(ircmsgs.invite(msg.nick, self.gameChannel))
return None
try: try:
player = str(ircdb.users.getUser(msg.prefix)) player = str(ircdb.users.getUser(msg.prefix))
player = player.split('name=\"')[1].split('\",')[0] player = player.split('name=\"')[1].split('\",')[0]
except KeyError: except KeyError:
irc.errorNotRegistered() irc.errorNotRegistered()
try: try:
test=self.playerData[player] test=self.playerData[player]
except: except:
@ -410,7 +380,7 @@ rating is %i. You have died %i times.\
def _getMapInfo(self): def _getMapInfo(self):
with open(self.filepath+'mapData.txt','r') as f: with open(self.filepath+'mapData.txt','r') as f:
self.mapInfo = simplejson.load(f) self.mapInfo = simplejson.load(f)
def _getItemsFile(self): def _getItemsFile(self):
with open(self.filepath+'items.txt','r') as f: with open(self.filepath+'items.txt','r') as f:
self.itemData = simplejson.load(f) self.itemData = simplejson.load(f)
@ -459,7 +429,6 @@ rating is %i. You have died %i times.\
monster['HP']-=playerAtk monster['HP']-=playerAtk
if monster['HP'] <=0: if monster['HP'] <=0:
return player return player
winner = None winner = None
while winner is None: while winner is None:
battleData['rounds']+=1 battleData['rounds']+=1
@ -471,20 +440,15 @@ rating is %i. You have died %i times.\
winner = _doPlayer() winner = _doPlayer()
if winner is None: if winner is None:
winner = _doMonster() winner = _doMonster()
if winner is player: if winner is player:
self._playerWin(irc,player,monster,playerData) self._playerWin(irc,player,monster,playerData)
else: else:
self._playerDead(irc,player,monster,playerData) self._playerDead(irc,player,monster,playerData)
bDataString='Battle lasted %i rounds, you scored %i hits, %i were critical and %i were evaded attacks. %s made %i attacks, %i were critical and %i were blocked.\ bDataString='Battle lasted %i rounds, you scored %i hits, %i were critical and %i were evaded attacks. %s made %i attacks, %i were critical and %i were blocked.\
'%(battleData['rounds'],battleData['player']['atks'],battleData['player']['crits'],battleData['monster']['evades'],monster['Name'],battleData['monster']['atks'],battleData['monster']['crits'],battleData['player']['blocks']) '%(battleData['rounds'],battleData['player']['atks'],battleData['player']['crits'],battleData['monster']['evades'],monster['Name'],battleData['monster']['atks'],battleData['monster']['crits'],battleData['player']['blocks'])
irc.queueMsg(ircmsgs.IrcMsg('NOTICE {0} :{1}'.format(nick,bDataString))) irc.queueMsg(ircmsgs.IrcMsg('NOTICE {0} :{1}'.format(nick,bDataString)))
# irc.reply(bDataString,prefixNick=False) # irc.reply(bDataString,prefixNick=False)
def _playerDead(self,irc,player,monster,playerData): def _playerDead(self,irc,player,monster,playerData):
#irc.reply('OOOOOOH YOU JUST GOT PWNT! - You\'ve been sent back home and fully healed. Luckily theres no penalties for dying.') #irc.reply('OOOOOOH YOU JUST GOT PWNT! - You\'ve been sent back home and fully healed. Luckily theres no penalties for dying.')
irc.queueMsg(ircmsgs.IrcMsg('NOTICE {0}: OOOOOOH YOU JUST GOT PWNT! - You\'ve been sent back home and fully healed. Luckily theres no penalties for dying.'.format(msg.nick))) irc.queueMsg(ircmsgs.IrcMsg('NOTICE {0}: OOOOOOH YOU JUST GOT PWNT! - You\'ve been sent back home and fully healed. Luckily theres no penalties for dying.'.format(msg.nick)))
@ -529,7 +493,6 @@ rating is %i. You have died %i times.\
playerData[player]['Torso']['Power']=itemWon['power'] playerData[player]['Torso']['Power']=itemWon['power']
playerData[player]['Torso']['Name']=itemWon['name'] playerData[player]['Torso']['Name']=itemWon['name']
better = True better = True
if better: if better:
winString+=' its better than your old %s %s, so you discard it and equip the %s %s\ winString+=' its better than your old %s %s, so you discard it and equip the %s %s\
'%(oldEquip['Name'],itemWon['item'].capitalize(),itemWon['name'],itemWon['item'].capitalize()) '%(oldEquip['Name'],itemWon['item'].capitalize(),itemWon['name'],itemWon['item'].capitalize())
@ -539,17 +502,14 @@ rating is %i. You have died %i times.\
self._savePlayerData(playerData) self._savePlayerData(playerData)
irc.reply(winString,prefixNick=False) irc.reply(winString,prefixNick=False)
def _genItem(self,player,level=1): def _genItem(self,player,level=1):
playerData = self.playerData playerData = self.playerData
itemData = self.itemData itemData = self.itemData
genChance=(100-playerData[player]['Luc'])/(level+1) genChance=(100-playerData[player]['Luc'])/(level+1)
itemType=int(random.random()*3) itemType=int(random.random()*3)
itemToReturn = possibleItem = {} itemToReturn = possibleItem = {}
if itemType is 0: #Sword if itemType is 0: #Sword
possibleItem['item']='sword' possibleItem['item']='sword'
itemBase = False itemBase = False
while itemBase is False: while itemBase is False:
possibleItem=itemData['swords'][int(random.random()*len(itemData['swords']))] possibleItem=itemData['swords'][int(random.random()*len(itemData['swords']))]
@ -564,7 +524,6 @@ rating is %i. You have died %i times.\
possibleItem['item']='helmet' possibleItem['item']='helmet'
elif itemType is 3: #Torso elif itemType is 3: #Torso
possibleItem['item']='armour' possibleItem['item']='armour'
itemBase = False itemBase = False
while itemBase is False: while itemBase is False:
possibleItem=itemData['defence'][int(random.random()*len(itemData['defence']))] possibleItem=itemData['defence'][int(random.random()*len(itemData['defence']))]
@ -572,16 +531,14 @@ rating is %i. You have died %i times.\
itemBase=possibleItem itemBase=possibleItem
itemToReturn['name']=possibleItem[0] itemToReturn['name']=possibleItem[0]
itemToReturn['power']=int((random.random()*(possibleItem[2]-possibleItem[1]))+possibleItem[1]) itemToReturn['power']=int((random.random()*(possibleItem[2]-possibleItem[1]))+possibleItem[1])
itemBoost = False itemBoost = False
while itemBoost is False: while itemBoost is False:
booster = itemData['modifiers'][random.randint(0,len(itemData['modifiers'])-1)] booster = itemData['modifiers'][random.randint(0,len(itemData['modifiers'])-1)]
print booster print(booster)
if genChance < booster: if genChance < booster:
itemBoost = booster; itemBoost = booster;
itemToReturn['name']='%s %s'%(booster[0],itemToReturn['name']) itemToReturn['name']='%s %s'%(booster[0],itemToReturn['name'])
itemToReturn['power']=itemToReturn['power']*(random.random()*(booster[2]-booster[1]))+booster[1] itemToReturn['power']=itemToReturn['power']*(random.random()*(booster[2]-booster[1]))+booster[1]
return itemToReturn return itemToReturn
def _genMonster(self,player): def _genMonster(self,player):
@ -629,6 +586,7 @@ rating is %i. You have died %i times.\
pLvl = self.playerData[player]['Lvl'] pLvl = self.playerData[player]['Lvl']
return (levelBaseXp*pLvl)+((levelBaseXp*pLvl)/2) return (levelBaseXp*pLvl)+((levelBaseXp*pLvl)/2)
Class = Rpg Class = RPG
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -31,7 +31,7 @@
from supybot.test import * from supybot.test import *
class RpgTestCase(PluginTestCase): class RpgTestCase(PluginTestCase):
plugins = ('Rpg',) plugins = ('RPG',)
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: