diff plugins/xxheroinit.py @ 0:4385a7d0efd1 grumpy-goblin

Deleted and repushed it with the 'grumpy-goblin' branch. I forgot a y
author sirebral
date Tue, 14 Jul 2009 16:41:58 -0500
parents
children c54768cffbd4
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/xxheroinit.py	Tue Jul 14 16:41:58 2009 -0500
@@ -0,0 +1,522 @@
+import os
+import orpg.pluginhandler
+
+class Plugin(orpg.pluginhandler.PluginHandler):
+    # Initialization subroutine.
+    #
+    # !self : instance of self
+    # !openrpg : instance of the the base openrpg control
+    def __init__(self, plugindb, parent):
+        orpg.pluginhandler.PluginHandler.__init__(self, plugindb, parent)
+
+        # The Following code should be edited to contain the proper information
+        self.name = 'Hero Turn Tool'
+        self.author = 'Heroman, based on xxxinit.py'
+        self.help = """This is the Hero Games turn turn. It is a bit more complex than other games."""
+
+
+    def plugin_enabled(self):
+        #You can add new /commands like
+        # self.plugin_addcommand(cmd, function, helptext)
+        self.plugin_addcommand('/hinit', self.on_hinit, '- Toggle Init Recording on or off')
+        self.plugin_addcommand('/hhelp', self.on_hhelp, '- List all of the Hero Init Commands')
+        self.plugin_addcommand('/hstart', self.on_hstart, '- Start the Hero Init Tool', False)
+        self.plugin_addcommand('/hact', self.on_hact, '- Start the Hero Init Tool', False)
+        self.plugin_addcommand('/hseg', self.on_hseg, '- Start the Hero Init Tool', False)
+        self.plugin_addcommand('/hdex', self.on_hdex, '- Start the Hero Init Tool', False)
+        self.plugin_addcommand('/hclear', self.on_hclear, '- Start the Hero Init Tool', False)
+        self.plugin_addcommand('/hadd', self.on_hadd, '- Start the Hero Init Tool', False)
+        self.plugin_addcommand('/hdel', self.on_hdel, '- Start the Hero Init Tool', False)
+        self.plugin_addcommand('/hown', self.on_hown, '- Start the Hero Init Tool', False)
+        self.plugin_addcommand('/hlist', self.on_hlist, '- Start the Hero Init Tool', False)
+        self.plugin_addcommand('/hsort', self.on_hsort, '- Start the Hero Init Tool', False)
+        self.plugin_addcommand('/hrun', self.on_hrun, '- Start the Hero Init Tool', False)
+        self.plugin_addcommand('/hchange', self.on_hchange, '- Start the Hero Init Tool', False)
+        self.plugin_addcommand('/hset', self.on_hset, '- Start the Hero Init Tool', False)
+        self.plugin_addcommand('/hchange', self.on_hchange, '- Start the Hero Init Tool', False)
+
+        #If you want your plugin to have more then one way to call the same function you can
+        #use self.plugin_commandalias(alias name, command name)
+        #You can also make shortcut commands like the following
+        self.plugin_commandalias('/hlow', '/hsort low', False)
+        self.plugin_commandalias('/hsortlow', '/hsort low', False)
+        self.plugin_commandalias('/hhigh', '/hsort high', False)
+        self.plugin_commandalias('/hsorthigh', '/hsort high', False)
+        self.plugin_commandalias('/hreverse', '/hsort high', False)
+        self.plugin_commandalias('/hgo', '/hrun', False)
+
+        #This is where you set any variables that need to be initalized when your plugin starts
+        self.toggle = True
+        self.init_list = []
+        self.backup_list = []
+        self.dexterity = 99
+        self.segment = 12
+        self.state_strings = ["0 Phase","1/2 Phase","Full Phase","Stunned","Not Gone", "Held Full", "Held Half", "Abort"]
+
+    def plugin_disabled(self):
+        #Here you need to remove any commands you added, and anything else you want to happen when you disable the plugin
+        #such as closing windows created by the plugin
+        self.plugin_removecmd('/test')
+        self.plugin_removecmd('/example')
+
+        #This is the command to delete a message handler
+        self.plugin_delete_msg_handler('xxblank')
+
+        #This is how you should destroy a frame when the plugin is disabled
+        #This same method should be used in close_module as well
+        try:
+            self.frame.Destroy()
+        except:
+            pass
+
+    def plugin_incoming_msg(self, text, type, name, player):
+        #This is called whenever a message from someone else is received, no matter
+        #what type of message it is.
+        #The text variable is the text of the message. If the type is a regular
+        #message, it is already formatted. Otherwise, it's not.
+        #The type variable is an integer which tells you the type: 1=chat, 2=whisper
+        #3=emote, 4=info, and 5=system.
+        #The name variable is the name of the player who sent you the message.
+        #The player variable contains lots of info about the player sending the
+        #message, including name, ID#, and currently-set role.
+        #Uncomment the following line to see the format for the player variable.
+        #print player
+
+        if self.toggle:
+            if text.lower().find("heroinit") != -1:
+                command = text[text.rfind("(")+1:text.rfind(")")]
+                self.process_user(command, player)
+        return text, type, name
+
+    #Chat Commands
+    def on_hinit(self, cmdargs):
+        self.toggle = not self.toggle
+
+        if self.toggle:
+            self.chat.SystemPost("Init recording on.  Enter your info")
+        else:
+            self.chat.SystemPost("Init recording off")
+
+    def on_hhelp(self, cmdargs):
+            self.chat.InfoPost("Commands:<br>/hclear : Clears out list<br>" +
+                        "/hstart : Sets you to segment 12, highest dex<br>" +
+                        "/hgo : Proceed to the next DEX/segment<br>" +
+                        "/hact <i>#</i> (full|half|abort|stunned)<br>" +
+                        "/hseg SEGNO : Set segment to SEGNO<br>" +
+                        "/hdex DEXNO : Set dex to DEXNO<br>" +
+                        "/hadd DEX SPD NAME : Adds to the list<br>" +
+                        "/hdel # : Delete character #<br>" +
+                        "/hown # playerid : Change ownership of PC # to playerid<br>" +
+                        "/hclear : Clears out player list<br>" +
+                        "/hchange # NEWDEX NEWSPD : Change PC # to have Dex NEWDEX and SPD NEWSPD<br>" +
+                        "/hset list_# state : Change player's state (state:" + self.statelist() + ")")
+
+    def on_hstart(self, cmdargs):
+        self.dexterity = self.highestdex()
+        self.segment = 12
+
+        for player in self.init_list:
+            player[3] = 4
+            if player[0] == self.dexterity:
+                player[3] == 2
+
+        self.chat.Post("Combat Starting.  ")
+        self.call_time()
+
+    def on_hact(self, cmdargs):
+        cmds = cmdargs.split(None)
+
+        if len(cmds) == 1:
+            msg = self.do_action(-1, -1, cmds[0])
+        elif len(cmds) == 2:
+            msg = self.do_action(-1, int(cmds[0]), cmds[1])
+        else:
+            msg = "Error in command. See format with hero init"
+
+        self.chat.InfoPost(msg)
+
+    def on_hseg(self, cmdargs):
+        cmds = cmdargs.split(None, 3)
+
+        try:
+            new_seg = int(cmds[0])
+            self.segment = new_seg
+            self.call_time()
+        except:
+            self.chat.SystemPost("Invalid format.  correct command is: /hseg SEGMENT#")
+
+    def on_hdex(self, cmdargs):
+        cmds = cmdargs.split(None, 3)
+
+        try:
+            new_dex = int(cmds[0])
+            self.dexterity = new_dex
+            self.call_time()
+        except:
+            self.chat.SystemPost("Invalid format.  correct command is: /hdex DEX#")
+
+    def on_hclear(self, cmdargs):
+        self.init_list = []
+        self.backup_list = []
+        self.dexterity = 99
+        self.segment = 12
+        self.chat.Post("<hr><font color='#ff0000'>New Initiative</font><br><font color='#0000ff'>Set new Initiatives</font>", True)
+
+    def on_hadd(self, cmdargs):
+        cmds = cmdargs.split(None, 3)
+        try:
+            if len(cmds) == 3:
+                new_dex = int(txt[0])
+                new_spd = int(txt[1])
+                self.init_list.append([new_dex, new_spd, cmds[2], 0, -1])
+                self.backup_list.append([new_dex, new_spd, cmds[2], 0, -1])
+                self.list_inits()
+            else:
+                self.chat.SystemPost("Invalid format.  correct command is: /hadd dex spd description (" + str(len(cmds)) + " arguments give)")
+
+        except:
+            self.chat.SystemPost("Invalid format.  correct command is: /hadd dex spd description")
+
+    def on_hdel(self, cmdargs):
+        try:
+            cmds = cmdargs.split(None, 1)
+            self.init_list.remove(int(cmds[0]))
+            self.backup_list.remove(int(cmds[0]))
+            self.list_inits()
+        except:
+            self.chat.SystemPost("Invalid format.  correct command is: /del list_number")
+
+    def on_hown(self, cmdargs):
+        try:
+            cmds = cmdargs.split(None)
+            player = self.init_list[int(cmds[0])]
+            player[4] = int(cmds[1])
+            self.chat.InfoPost("Character " + player[2] + "(" + int(cmds[0]) + ") is now owned by ID " + int(cmds[1]))
+        except:
+            self.chat.SystemPost("Invalid format.  correct command is: /hown # playerid")
+
+    def on_hlist(self, cmdargs):
+        self.list_inits()
+
+    def on_hsort(self, cmdargs):
+        self.init_list.sort()
+        self.backup_list.sort()
+
+        if cmdargs == "high":
+            self.init_list.reverse()
+            self.backup_list.reverse()
+
+        self.list_inits()
+
+    def on_hrun(self, cmdargs):
+        advance = True
+        nextlowest = 0
+        heldactions = False
+
+        for player in self.init_list:
+            if self.actson(player[1]. self.segment):
+                if player[3] == 5 or player[3] == 6:
+                    heltactions = True
+                continue
+
+            if player[3] == 1 or player[3] == 2:
+                self.chat.InfoPost("Hero " + player[2] + " needs to act before we advance DEX")
+                advance = False
+
+            elif player[3] == 3 or player[3] == 4 or player[3] == 7:
+                if player[0] > nextlowest:
+                    nextlowest = player[0]
+
+            elif player[3] == 5 or player[3] == 6:
+                heltactions = True
+
+        if not advance:
+            return
+
+        advanceseg = False
+
+        if nextlowest == 0 and self.dexterity != 0:
+            if heldactions or self.segment == 12:
+                msg = "End of Segment " + str(self.segment) + "."
+                if heldactions:
+                    msg += " There are held actions."
+
+                msg += "  Issue command again to advance to next segment."
+
+                self.chat.InfoPost(msg)
+                self.dexterity = 0
+                return
+            else:
+                advanceseg = True
+        elif nextlowest == 0 and self.dexterify == 0:
+            advanceseg = True
+
+        if advanceseg:
+            self.dexterity = nextlowest
+            for player in self.init_list:
+                if player[0] == self.dexterity:
+                    if player[3] == 3 or player[3] == 7:
+                        player[3] = 0
+                    elif player[3] == 4:
+                        player[3] = 2
+        else:
+            nextsegment = 0
+            while nextsegment == 0:
+                self.segment += 1
+                if self.segment == 13:
+                    self.segment = 1
+
+                elif self.segment == 12:
+                    nextsegment = 12
+                    break
+
+                for player in self.init_list:
+                    if self.actson(player[1], self.segment):
+                        if player[3] == 0 or player[3] == 3 or player[3] == 7:
+                            nextsegment = self.segment
+
+                    if player[3] == 5 or player[3] == 6:
+                        nextsegment = self.segment
+
+            self.dexterity = self.highestdex()
+            for player in self.init_list:
+                heldactions = False
+                if self.actson(player[1], self.segment):
+                    if player[3] != 3 and player[3] != 7:
+                        player[3] = 4
+
+                    if player[0] == self.dexterity:
+                        if player[3] == 3:
+                            self.chat.InfoPost(player[2] + " unstuns.")
+                            player[3] = 0
+                        elif player[3] == 7:
+                            self.chat.InfoPost(player[2] + " recovers from the abort")
+                            player[3] = 0
+                        else:
+                            player[3] = 2
+
+                    if player[3] == 5 or player[3] == 6 and self.dexterity == 0:
+                        self.chat.InfoPost("There are held actions. Issue command again to advance to next segment.")
+        self.call_time()
+
+    def on_hchange(self, cmdargs):
+        try:
+            cmds = cmdargs.split()
+            self.init_list[int(cmds[0])][0] = cmds[1]
+            self.init_list[int(cmds[0])][1] = cmds[2]
+            self.backup_list[int(cmds[0])][0] = cmds[1]
+            self.backup_list[int(cmds[0])][1] = cmds[2]
+            self.list_inits()
+        except:
+            self.chat.SystemPost('Invalid format.  correct command is: /hchange list_# new_dex new_spd (example: /hchange 1 18 4)')
+
+    def on_hset(self, cmdargs):
+        try:
+            cmds = cmdargs.split()
+            self.init_list[int(cmds[0])][3] = cmds[1]
+            self.backup_list[int(cmds[0])][3] = cmds[1]
+            self.list_inits()
+        except:
+            msg = "Invalid format.  correct command is: /hset list_# state (state:" + self.statelist() + ")"
+            self.chat.InfoPost(msg)
+
+    #Other Methods
+    def statelist(self):
+        msg = ""
+        stateindex = 0
+        for state in self.state_strings:
+            if stateindex != 0:
+                msg += ", "
+            msg += str(stateindex) + "=" + state
+            stateindex += 1
+        return msg
+
+    def is_index(self, value):
+        try:
+            if value[:1] == "+":
+                offset = 1
+            return True
+        except:
+            return False
+
+    def actson(self, spd, segment):
+        speeds=[[0,0,0,0,0,0,0,0,0,0,0,1],
+                [0,0,0,0,0,1,0,0,0,0,0,1],
+                [0,0,0,1,0,0,0,1,0,0,0,1],
+                [0,0,1,0,0,1,0,0,1,0,0,1],
+                [0,0,1,0,1,0,0,1,0,1,0,1],
+                [0,1,0,1,0,1,0,1,0,1,0,1],
+                [0,1,0,1,0,1,1,0,1,0,1,1],
+                [0,1,1,0,1,1,0,1,1,0,1,1],
+                [0,1,1,1,0,1,1,1,0,1,1,1],
+                [0,1,1,1,1,1,0,1,1,1,1,1],
+                [0,1,1,1,1,1,1,1,1,1,1,1],
+                [1,1,1,1,1,1,1,1,1,1,1,1]]
+
+        if spd < 1 or spd > 12:
+            return False
+
+        if speeds[spd-1][segment-1] == 1:
+            return True
+
+        return False
+
+    def highestdex(self):
+        dex = 0
+        for player in self.init_list:
+            if self.actson(player[1], self.segment) and player[0] > dex:
+                dex = player[0]
+        return dex
+
+    def do_action(self, playerid, index, action):
+        if index == -1:
+            count = 1
+            for player in self.init_list:
+                if player[4] == playerid:
+                    index = count
+                count += 1
+
+        if index == -1:
+            return "You do not have any players in the combat list"
+
+        index -= 1
+        player = self.init_list[index]
+        if playerid != -1 and playerid != player[4]:
+            return "You do not own that player."
+
+        # You can only perform a full action if you have a full or held full
+        if action == "full":
+            if player[3] != 2 and player[3] != 5:
+                msg = player[2] + " cannot perform a full action."
+            else:
+                player[3] = 0
+                msg = player[2] + " performs a full action."
+        elif action == "half":
+            if player[3] != 1 and player[3] != 2 and player[3] != 5 and player[3] != 6:
+                msg = player[2] + " cannot perform a half action."
+            else:
+                if player[3] == 1 or player[3] == 6:
+                    player[3] = 0
+                    msg = player[2] + " performs a half action."
+                else:
+                    player[3] = 1
+                    msg = player[2] + " performs a half action (half remaining)"
+        elif action == "hold":
+            if player[3] != 1 and player[3] != 2:
+                msg = player[2] + " cannot hold an action."
+            else:
+                if player[3] == 2:
+                    player[3] = 5
+                    msg = player[2] + " holding a full action."
+                else:
+                    player[3] = 6
+                    msg = player[2] + " holding a half action."
+        elif action == "stunned":
+            player[3] = 3
+            msg = player[2] + " stunned!"
+        elif action == "abort":
+            # abort if full/half/not gone/held.  Those just lose this seg action
+            if player[3] == 1 or player[3] == 2 or player[3] == 4 or player[3] == 5 or player[3] == 6:
+                player[3] = 0
+                msg = player[2] + " aborts!"
+            # if you have 0 remaining and did not act this seg, regular abort
+            elif player[3] == 0 and not self.actson(player[1], self.segment):
+                player[3] = 7
+                msg = player[2] + " aborts!"
+            else:
+                msg = player[2] + " cannot abort yet."
+        else:
+            msg = "Unknown command."
+
+        return msg
+
+    def list_inits(self, player=0, send=False):
+        msg = "Combat Turn:<br>"
+        msg += "<table border=1 cellspacing=1 cellpadding=1><tr><th><th></th></th><th></th><th></th><th></th><th></th><th colspan=12>Segments</th></tr>"
+        msg += "<tr><th>#</th><th>Owner</th><th>Name</th><th>Spd</th><th>Dex</th><th>State</th>"
+        for x in xrange(1,13):
+            msg += "<th>" + str(x) + "</th>"
+        msg += "</tr>"
+        count=1
+        for m in self.init_list:
+            msg += "<tr><td align=center>"+str(count)+"</td>"
+            if m[4]==-1:
+                msg += "<td><font color=red>GM</font></td>"
+            else:
+                msg += "<td>" + m[4] + "</td>"
+            msg += "<td><font color='#0000ff'>" + m[2] + "</font></td>"
+            msg += "<td align=center><font color='#0000ff'>" + str(m[1]) + "</font></td>"
+            msg += "<td align=center><font color='#0000ff'>" + str(m[0]) + "</font></td>"
+            msg +="<td>" + self.state_strings[m[3]] + "</td>"
+
+            for segment in xrange(1,13):
+                if self.actson(m[1],segment):
+                    msg += "<td align=center>" + str(m[0]) + "</td>"
+                else:
+                    msg += "<td></td>"
+            msg += "</tr>"
+            count += 1
+        msg += "</table><br>"
+
+        msg += "It is currently Segment " + str(v.segment) + ", DEX " + str(v.dexterity) + "<br>"
+
+        if send and player != 0:
+            chat.whisper_to_players(msg, [player])
+        else:
+            self.chat.InfoPost(msg)
+
+    def call_time(self):
+        plist = ""
+        msg = "Segment is now " + str(self.segment) + ", DEX " + str(self.dexterity)
+        for player in self.init_list:
+            if player[3] == 1 or player[3] == 2 or player[3] == 5 or player[3] == 6:
+                if plist != "":
+                    plist += ", "
+                plist += player[2] + "(" + self.state_strings[player[3]] + ")"
+        if plist != "":
+            msg += ": " + plist
+        self.chat.Post(msg, True)
+
+    def process_user(self, command, player):
+        if command == "hadd":
+            txt = command.split(None, 3)
+            try:
+                if len(txt) == 4:
+                    new_dex = int(txt[1])
+                    new_spd = int(txt[2])
+                    self.init_list.append([new_dex, new_spd, txt[3], 0, player[2]])
+                    self.backup_list.append([new_dex, new_spd, txt[3], 0, player[2]])
+                    msg = "Character " + txt[3] + " added to initiative."
+                else:
+                    msg = "Error in command.  See format with heroinit"
+            except:
+                msg = "Error in command.  See format with heroinit"
+
+            self.chat.whisper_to_players(msg, [player[2]])
+
+        elif command == "hact":
+            txt = command.split(None)
+            if len(txt) == 2:
+                index = -1
+                action = txt[1]
+                msg = self.do_action(player[2], index, action)
+            elif len(txt) == 3:
+                index = int(txt[1])
+                action = txt[2]
+                msg = self.do_action(player[2], index, action)
+            else:
+                msg = "Error in command.  See format with heroinit"
+
+            self.chat.whisper_to_players(msg, [player[2]])
+
+        elif command == "hlist":
+            self.list_inits(player[2], True)
+
+        else:
+            msg = "Commands:<br>heroinit (hadd DEX SPEED CHARACTERNAME) : add character CHARACTERNAME with dex DEX and speed SPD to initiative list<br>"
+            msg += " Example:  heroinit (hadd 18 4 Joey)<br>"
+            msg += "heroinit (hact # (full|half|hold|stunned|abort) : Have character # perform an action.  # is the number from hlist.  If ommited, uses first owned character<br>"
+            msg += " Example:  heroinit (hact 1 full)   : Make character index 1 perform a full action.<br>"
+            msg += " Example:  heroinit (hact full)     : Have your first owned character perform a full action<br>"
+
+            self.chat.whisper_to_players(msg, [player[2]])
\ No newline at end of file