Hime-Works / Requests

Bug reports and requests that may require longer discussions and is not suitable to leave on the blog
http://himeworks.com/
GNU General Public License v2.0
7 stars 9 forks source link

Dynamic Inventory Count #2

Closed HimeWorks closed 11 years ago

HimeWorks commented 11 years ago

Posted by RogueDeus:

Suggestion: It doesn’t seem as though anyone has make a script to handle dynamic inventory count limits. Something as simple as Yanfly’s ‘Adjust Limits’ script, applies a static default to all items, and then allows you to set an items limit individually. But no ability to ‘adjust’ it dynamically. maybe I want the player to find an inventory expanding item that adds +5 to the default limit, or +25 to all potions, etc… No script for that anywhere I have looked.

Would you be up for the task? :) If not, no biggie.

HimeWorks commented 11 years ago

Posted by RogueDeus:

True. I think I have managed a work around for now, in the way I display item descriptions. Also, it may help that all like items, but a few specific ones, are limited at the same quantity. I figure, if they enjoy my game, they will make mental notes of what they can and cant carry. And if it irritates them, then they can focus on expanding it via collectable’s or even wearable’s if a script can get that detailed.

I can imagine that my relatively limited item cap may cause some issue with people feeling that they are being cheated when they loot something if its an item that’s already capped. But that’s my issue as a designer to work around. Of course it would help it whatever inventory script is made, can include a check for a looted item that is already capped, and allow the designer to set an ‘exchange’ item (or list) to fall down till a non-capped item can be looted. (As a quick fix)

Also, it helps that I have grabbed Bubble’s ‘TMI Item Scene’, and ‘Info Pages’, script which, combined with his crafting system, does wonders for inventory display. Better than I could have hoped for a free to use script anyway. Much like M.Algebra’s Quest Journal. Exceptional is an understatement.

I have run into a few hiccups with script compatibility lately, but nothing to terrible.

If you are up to making an inventory control script, I would love to give you a simple wish list. :) And you could always disclaimer, that begging for window dressing is a no-no.

But no pressure. I am content with what work you provide. You are most gracious.

Roguedeus commented 11 years ago

Thanks for considering this!

Just for my own satisfaction I figure I will go ahead and list the things I was hoping to get in an Inventory Count script. I don't mean to be presumptuous. If you decide to ignore the whole thing I am cool with that.

Wishlist:

Roguedeus commented 11 years ago

Wonder what those Issue update links are from??

Anyway, I wanted to let you know that I managed to force my way through getting a dynamic stack count for items using a modified version of Yanfly's Adjust Limits script. (Mostly to piggy back on his already established note tags methods)

Here are the particulars.

This is the method that allows you to update the stack size container immediately after changing the items max.

class Game_Party
  #New Method
  def refresh_container(item_id)
    item = $data_items[item_id]
    container = item_container(item.class)
    return unless container
    container[item.id] = [[item_number(item), 0].max, max_item_number(item)].min
  end
end

This is the altered overwrite of Yanfly's. @ line 518

  #--------------------------------------------------------------------------
  # overwrite method: max_item_number
  #--------------------------------------------------------------------------
  #def max_item_number(item); return item.max_limit; end
  def max_item_number(item)
    return YEA::LIMIT::ITEM_MAX if $game_variables[item.max_limit] < 1
    return $game_variables[item.max_limit]
  end

Go to the item you want to setup a custom stack size for, and use the default script note tag.

<max limit: x>  
#Only now the x is the game_variable with changeable value.

Lastly, create an event, and place this in a script call, after changing the game variable.

$game_party.refresh_container(id)
#id should be the item ID from the database. 

You will find the item stack max altered the next time you open the item menu. If the stack size drops, then excess items are destroyed. So be careful.

Also, be sure to note that the note tag normally used for Yanfly's script is now a game variable pointer and not a stack size value. You need to assign whatever game variable number selected to the desired stack size. This also means that you will have to make heavy use of the default stack size value, unless you want to assign separate game variables for every single item.

I kind of hacked this together for results, not utility. That might come later. :) I may poke at it a bit and make a simple separate script... Especially now that I know how simple it is to alter the stack size during play. :)

Note: You have no idea how long it took me to figure this out... I am almost embarrassed. :p

HimeWorks commented 11 years ago

This script handles the dynamic stack sizes. It keeps excess items if your stack size decreases, but that can be easily changed. I would rather not use variables for this and stick with making script calls.

http://himeworks.wordpress.com/2013/11/01/dynamic-stack-size/

It uses my implementation of Item Stack sizes which probably does the same thing as yanfly's adjust limits. You can easily write a utility method for the purpose of checking whether item_number >= max_item_number

The rest of the features do not belong in a script whose purpose is to change your stack sizes for a party's inventory.

For displaying the item stack size in text, I would define a convert code that might look something like this

\stack_size[w2]
\stack_size[a5]

Where it takes a letter representing the type of item and an ID.

Roguedeus commented 11 years ago

Thanks Hime, you are really really good at this. I wish I wasn't so dyslexic or I might find coding a whole lot easier.

I have still got to figure out how standard expressions and string replacement works... So many convenience functions in Ruby simply don't, or didn't, exist when I thought myself Java/C# :p

Either that or I hadn't gotten to them by the time life got in the way. The other day I saw a Java version of standard expressions...

Diving in and altering that Element EX script really helped. However the author seems to have ignored it shortly after I shared it with him... I will wait a week or so before I assume he ignored it and move on without his feedback. http://lescripts.wordpress.com/rgss3/element-ex/comment-page-1/#comment-69

...

Anyway, how would I define a convert code that actually worked in displayed text?

Also, is there a way to make them work with object names? I am a big fan of color coding things for quick recognition. And having every single name in the game the default font/color makes that disappointing.

...

Also, do you mind if I alter your scripts to add the option of a game_variable to be used as the stack size designation? It simplifies a few things in my mind, such as displaying the value in text (already exists), changing it with tools outside of the script like Yanfly's Debug Script. Etc... Unless you have a better way?

I also intend to use your Scene Interpreter in a common event to dynamically change the stack size via equip/unequip, much like we figured out how to do with equip slots. That way backpacks/etc can be worn to give basic boosts in stack size. Etc...

The primary reason I am asking, is that I don't want to step on your toes or duplicate effort. I can likely force my way through it and accomplish what I am looking for, but it will take me much longer and likely wont be anywhere as compatible with other scripts as your solutions. :)

So many scripters in the community over engineer their scripts and cause compatibility issues with other scripts. But so far, only a single one of yours has had a problem, and that wasn't even your script causing it. (sorry about badgering you about that.. :p)

HimeWorks commented 11 years ago

There are scripts that allow you to write your equip names like

\c[2]Short Sword

Where you use all of the control codes and convert codes. I don't have one, but there are a couple out there. Global text codes or something.

Note that I made up these terms, as specified in http://forums.rpgmakerweb.com/index.php?/topic/6056-text-manager/

The purpose of this is to allow you to define your own control and convert codes using a simple plugin API, but I ran into issues though I don't remember what they were. Might look at the script again. Anyways you can look at that script to see what's involved in defining your own text escape codes.

You can modify the scripts to suit your needs as you want. I didn't use variables for this because you could potentially end up using a large number of variables.

Roguedeus commented 11 years ago

I noticed you mention Yanfly Message System... Will anything in his script interfere with yours? Not all his codes have duplicates in your script yet.

Roguedeus commented 11 years ago

Ok, I am super confused.

Where are the RPG::* stuff defined in the tool set?

I keep seeing people use them as if they are classes, like yours here (in: Item Stack Size):

  # Stack size for items
  class Item < UsableItem
    def stack_size
      return @stack_limit unless @stack_limit.nil?
      res = self.note.match(Tsuki::Stack_Size::Regex)
      return @stack_limit = res ? res[1].to_i : Tsuki::Stack_Size::Item_Stack_Size
    end
  end

  # Stack size for equips
  class EquipItem < BaseItem
    def stack_size
      return @stack_limit unless @stack_limit.nil?
      res = self.note.match(Tsuki::Stack_Size::Regex)
      return @stack_limit = res ? res[1].to_i : default_stack_size
    end
  end

However, I can not find them anywhere.

HimeWorks commented 11 years ago

It's more about me overwriting the same methods.

Documentation for RPG classes can be found in the help file.

Roguedeus commented 11 years ago

Thanks for pointing that out. Unusually busy evening yesterday, kept me away from my PC. I'll get to tackling this later today... Hope you don't mind if I have a few more questions. :)

Roguedeus commented 11 years ago

I think I have changed my mind, after a pretty lengthy introspection... And a few conversations with people.

I am not going to impose arduous limits on inventory for the sake of item restriction, as it will create unnecessary issues with looting, in its current form.

Instead, I am exploring the feasibility of item use cool-downs.

Items are essentially skills, so I don't think it will be to difficult to adjust Yanfly's 'Skill Restrictions' script, to apply the same note tag effects to items AND skills. For some reason he opted to restrict items to buff/debuff rather than skill+. And since he is pretty much MIA, I am gonna do what I can without trying to bother him.

The idea is that cool downs are more player friendly then low stack limits. They are also better for over all balance. Now the problem is determining how to implement them... Per party use? Per actor use? Per effect use?

HimeWorks commented 11 years ago

If by "per effect use" you mean like "potion and hi-potion both restore HP, so they should both be assigned to the same cooldown", I'd probably consider using the Tag Manager to assign tags and then building your script around tags

http://himeworks.wordpress.com/2013/03/07/tag-manager/

Roguedeus commented 11 years ago

That's a really good idea.

Not to mention it will allow me to remove a script I recently added to limit certain items to certain classes... With this I can just use tags...

Actually I might be able to rework quite a bit using tags. Thanks for pointing that out. Yet another of your scripts I saw in the past, intending to try it out, but forgetting to. :)

I am thinking that actual item cooldown should be exactly as skill cooldown is handled in Yanfly's script. That way, there are greater incentives to having specific party members in the battle group.

Roguedeus commented 11 years ago

Question:

Can you please explain to me where on earth 'skills' is defined? Obviously its a collection of applicable skills, but I am having trouble finding out if they are battler skills, actor skills, or database skills? I am guessing its battler skills as the method is defined in the Battler Class. But where?!?

Yanfly's Skill Restrictions - line:687

  #--------------------------------------------------------------------------
  # new method: update_cooldowns
  #--------------------------------------------------------------------------
  def update_cooldowns(amount = -1, stype_id = 0, skill_id = 0)
    return if cooldown_lock?
    reset_cooldowns if @cooldown.nil?
    data_array = skills + [1, 2]
    for skill in data_array
      skill = $data_skills[skill] if !skill.is_a?(RPG::Skill)
      next if stype_id != 0 && skill.stype_id != stype_id
      next if skill_id != 0 && skill.id != skill_id
      set_cooldown(skill, cooldown?(skill) + amount)
    end
  end

Also, what is he doing adding [1,2] to it? (are those skill ID:1 and skill ID:2?)

I was doing really well, following along and changing things till this. I can always ignore it and move on, as I am not touching skills, I am adding items, but I am really stuck here.

I know that items are party side, so I will have to grab the party item list and cycle through it the same way. But if I can grab them as easily, I would do it.

So much of RGSS3 info is scattered and frustrating to find.

Roguedeus commented 11 years ago

Well, I ignored it till I can get feedback.

So far I have functional cooldowns for items. I aliased 'consume_item' and process it there, as skills are done with an alias of 'pay_skill_cost'

I have not tried any of the other restriction types yet, but I will get them working, if there is a problem. I don't expect there to be.

Halfway through. Now I just need to get the 'draw cooldown' and 'draw used' text to update the items names as expected.

Roguedeus commented 11 years ago

Ok. ran into an issue.

I can't seem to get the script to stop treating items and skills the same... As in, applying the cooldown on item (id:1) also applies it to skill (id:1)...

I have gone backwards and forewords and back again, and again, and I just don't see where the issue is being caused.

I was reluctant to ask you, as I was hoping to get it done myself. But it may actually be easier for you to write a version of this that works in less time than it takes you to figure out why my attempt at hacking Yanfly's script isn't working.

I am simply copying all the note tags to the item object, reading them, and then reacting to them in the same methods but with item.isa?(RPG::Item) checks done to separate the ID's and $data* notes.

It seemed to be working fine until I realized that my test item (id:1) was making the Attack, command grey out when it was in cool down. sigh Then it dawned on me that Attack is skill (id:1)...

I feel like I have wasted this entire day.

I think I will write up a request form... Hope its not to much.

Roguedeus commented 11 years ago

Never mind... It seems I over reacted.

I got the items and skills ID's to play nice. I have just been staring at code all day and got tunnel vision for a while.

Time for me to take a break.

HimeWorks commented 11 years ago

If you do a ctrl+shift+F in the script editor and then search for "def skills" you'll find where it's defined. The default skills method returns an array of RPG::Skill objects, so yanfly's doing his own thing. I would've called it "skill_ids" though just to make it obvious that they're ID's. If you print it out you'll probably see an array of numbers.

Item and Skills are both "RPG::UsableItem" instances because they designed it so that they should be treated with the same interface. Which makes sense in some way I guess, since they ARE both "usable" objects.

In a statically typed language where you can overload your methods to handle them separately, you wouldn't have to worry about checking the type yourself.

Roguedeus commented 11 years ago

Thanks Hime, Sometimes I get so stuck I forget the simple steps I should take to find the info I need. Last night I was so happy I figured it out, only to realize I hadn't, and I was so worn out I forgot to back up and gather the standard stuff... So I posted here asking WTH?! Only to take a small break, and then actually gather the standard stuff. :)

I got the two Module classes to play nice, and I am pretty sure I can figure out the rest now. To make sure what was inside the skills I simply printed them out in console and sure enough, my original assumption was correct.

I sometimes miss the 'clearer' aspects of static types... But over all I think the versatility of Ruby is pretty awesome. Even if it throws me for a loop sometimes.

My brain is still really new to code. I taught myself to do it, through brute force, about 7 years ago, and only sporadically utilized it since. I have done more coding this past month than I have in YEARS.

Do you code professionally? Is Ruby your primary language?

HimeWorks commented 11 years ago

I code for my job and code as a hobby. Don't have a primary language as I use whatever is appropriate but I'd say I'm fluent in Ruby just because I've been writing RM code for 2 years.

Roguedeus commented 11 years ago

I figured you had to do this sort of thing professionally. You are to good at it and to consistent to be strictly a hobbyist. Can I ask you what your job is? :)

...

Can you enlighten me as to why Window_SkillList is able to access an @actor, while Window_ItemList is not? Even though they are both children of the Window_Selectable class?

Even though I add the same methods from the SkillList class to the ItemList class, @actor is always nil.

class Window_SkillList < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
    super
    @actor = nil
    @stype_id = 0
    @data = []
  end
  #--------------------------------------------------------------------------
  # * Set Actor
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    @actor = actor
    refresh
    self.oy = 0
  end

class Window_ItemList < Window_Selectable

  #--------------------------------------------------------------------------
  # overwrite: Object Initialization
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
    super
    @actor = nil
    @category = :none
    @data = []
  end

  #--------------------------------------------------------------------------
  # new method: Set Actor
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    @actor = actor
    refresh
    self.oy = 0
  end

Is there some kind of RGSS3 magic I am missing?

HimeWorks commented 11 years ago

Unfortunately I am a strictly a hobbyist RM scripter. Consistency and standards are usually something you develop for yourself after you do something a dozen times, regardless what kind of task you're doing. I'm sure if an author wrote 20 stories or something they'll have come up with ways to optimize their story writing processes to suit their needs the best.

Can you enlighten me as to why Window_SkillList is able to access an @actor, while Window_ItemList is not? Even though they are both children of the Window_Selectable class?

Inheritance only allows the two windows to inherit methods from Window_Selectable. It has basically nothing to do with whether @actor is accessible, unless @actor is defined in Window_Selectable and is consequently inherited (or something like that)

Are you sure your actor= method is being called when you say something like @item_window.actor = new_actor?

Roguedeus commented 11 years ago

Thanks for the quick reply. I am feeling my head spin a bit, so I am taking a small break. Give me about an hour and I'll re-crawl into the code. :)

Considering the situation, would I be able to call the actor with $game_party.menu_actor.id in battle?

I will try it when I am rdy. Likely about an hour or so.

HimeWorks commented 11 years ago

Probably not. If you look for all the instances where $game_party.menu_actor is set, I believe it is done strictly in the menu scene (and related scenes/windows).

Roguedeus commented 11 years ago

It looks like quite a few scripts overwrite create_item_window. No wonder.

The actor seems to be assigned in Scene_Skill Class, when the Skill window is created. Its the only place the skill list window is created new. Which means the actor is inherited, as @actor is not defined in Scene_Skill. But @actor is not defined in Scene_ItemBase either... And Scene_MenuBase defines it as $game_party.menu_actor

class Scene_MenuBase < Scene_Base
  #--------------------------------------------------------------------------
  # * Start Processing
  #--------------------------------------------------------------------------
  def start
    super
    create_background
    @actor = $game_party.menu_actor
  end

Which doesn't make sense, if menu_actor is only defined in the main menu. I can enter game, jump into battle, and never access the main menu, yet @actor is not nil.

Ugh...

Roguedeus commented 11 years ago

I have no idea what that error means... Obviously it doesn't like one of the variables. But why? Its not saying its nil?

  #--------------------------------------------------------------------------
  # * Create Item Window
  #--------------------------------------------------------------------------
  alias rd_create_item_window create_item_window
    def create_item_window
      rd_create_item_window.
      @item_window.actor = $game_party.menu_actor
  end

dgr_skillrestrict_issue_5

HimeWorks commented 11 years ago

I wonder if you are mixing up the scene and the window

Roguedeus commented 11 years ago
class Scene_Item < Scene_ItemBase
  #--------------------------------------------------------------------------
  # * Create Item Window
  #--------------------------------------------------------------------------
  alias rd_create_item_window create_item_window
    def create_item_window
      rd_create_item_window.  <----- There it is.... *facepalm*
      @item_window.actor = $game_party.menu_actor
  end
end
Roguedeus commented 11 years ago
  #--------------------------------------------------------------------------
  # new method: item_restriction?
  #--------------------------------------------------------------------------
  def item_restriction?(index)
    item = @data[index]
    @actor = $game_party.menu_actor if @actor == nil

    rtn = false
    #return @actor.item_restriction?(item)
    if @actor.item_restriction?(item)
      rtn = true
    end
    print("#{item.name}(#{rtn})\t")
    return rtn
  end

dgr_skillrestrict_issue_6

Seems this is more complicated than I can figure out... :p

Roguedeus commented 11 years ago

Strangely, its returning the correct actor. But its still not seeing the method. However, the method exists for the actor object in the BattlerBase actor.

It sees the applicable method here...

  #--------------------------------------------------------------------------
  # new method: skill_restriction?
  #--------------------------------------------------------------------------
  def skill_restriction?(index)
    skill = @data[index]
    puts("#{skill.name} Actor:#{@actor.name}")
    return false if @actor.nil?
    return @actor.skill_restriction?(skill)
  end

But not in the above method. Which is practically identical. Only the 'when' is different for the actor assignment.

Roguedeus commented 11 years ago

Here is the entirety of the Yanfly script that I have altered...

SNIP

Roguedeus commented 11 years ago

I loaded the un-saved version last time. Now its good.

HimeWorks commented 11 years ago

Are you asking why "item_cooldown" is throwing an error even though it's defined? Where is it defined?

Roguedeus commented 11 years ago

I think so. Right now I am feeling a bit overwhelmed.

When I get like this its easier for me to just stop, go do something else for several hours. maybe even wait till the next morning, and then start over where I can.

I am Dyslexic, and reading text is a very deliberate activity for me. It wasn't till my late 20's that I got comfortable with words enough to read more than a few dozen pages of a novel without feeling my eyes glaze over.

I'm not making excuses, just trying to explain activity that might seem odd to others.

If you could once over what I have managed to get done and give me any feedback you can, I'd appreciate it. Its not necessary, as I would likely get it eventually if I poke at it enough. Like I did with Element-EX. Though that was not touching any window/list classes, and popups are rather simple in comparison. At least is seems so.

HimeWorks commented 11 years ago

item_cooldown method name has a question mark at the end.

item_cooldown?

A lot of scripters (myself included) miss it if you don't pay attention and ignore the trailing characters.

Roguedeus commented 11 years ago

That fixed it...

text = "CD:#{@actor.item_cooldown?(item)}"

facepalm

These are the kind of issues that make me want to yank my brain out of my head and scream at it. They might as well be invisible half the time.

I even see the CD:1 way off to the side. now I need to fine tune the positioning, to the LEFT of the item count. Thanks!!

Roguedeus commented 11 years ago

I think I might do more scripting in Rubymine, rather than Sublime Text, so I can utilize more of the auto-complete, and syntax checking. Maybe it will reduce the silly mistakes like that, I find so hard to catch...

I stared at that over and over and over... Saw nothing wrong, till you said something.

Roguedeus commented 11 years ago

It looks like this is the better choice, rather than menu_actor. @actor = BattleManager.actor

It always reflects the current party member, for the scene.

Roguedeus commented 11 years ago

Well, well, well... I think I am getting the hang of this.

#==============================================================================
# ¡ Scene_Battle
#==============================================================================
module BattleManager
  #--------------------------------------------------------------------------
  # new method: self.surprise
  #--------------------------------------------------------------------------
  def self.surprise
    @surprise
  end
end

#==============================================================================
# ¡ Scene_Battle
#==============================================================================
class Game_Troop < Game_Unit
  #--------------------------------------------------------------------------
  # aliased method: increase_turn
  #--------------------------------------------------------------------------
  alias rd_increase_turn increase_turn
  def increase_turn
    rd_increase_turn
    @turn_count -= 1 if BattleManager.surprise
  end
end

Was necessary to prevent the 1 turn warmup on something from completing due to surprise. I understand if that's an intended mechanic, but then whats so bad about surprises? I think they should be free turns for enemies, rather than counted as an actual turn. call me crazy.

Later I will create a flag to enable it as an option.

HimeWorks commented 11 years ago

Yes, I usually use BattleManager.actor if I need to know who you are currently controlling.

Roguedeus commented 11 years ago

Well, it looks like the basics are done. I have cooldown, warmup, and limited use implimented. And they are updating the item list with the appropriate text at the expected location.

Over all, I think I learned more than usual today. :)

Thanks for the help. I needed it.

HimeWorks commented 11 years ago

Wonderful. Now you're ready to write scripts for a hobby.

Roguedeus commented 11 years ago

Apparently using BattleManager.actor is a no-no when not in battle. :)

I was wondering why Bubbles Crafting was crashing since I added that part of the script... Now I know!

And knowing is half the battle... G.I.Joe!

HimeWorks commented 11 years ago

Yes, you generally shouldn't be touching BattleManager unless you're in battle. Menu_Actor is what you should use when you're in the menu scene.

Crafting scenes and shop scenes are a bit different. Would you say they are part of the menu? Possibly. What if it's an NPC crafter? It's a little hard to decide what you should inherit from. But basically if you need to access the "current actor", you should inherit from MenuBase.

Roguedeus commented 11 years ago

This is the final product...

Can you tell me if there is anything I have left out? Like credits, or typical Community stuff.

http://www.roguedeus.com/Stuff/RDeus%20-%20Item%20Restrictions%20Plugin.rb

I already noticed something missing... :p Go figure. (Fixed)

HimeWorks commented 11 years ago

Looks fine to me. I've never really understood what the "level" means .

Roguedeus commented 11 years ago

:) Me neither. I would assume its to do with how complex you think your script is to use.

Roguedeus commented 10 years ago

Ummmm. Something just broke, and I can't figure out why.

All of a sudden (as in since I last checked dynamic slots) I am getting this error when I attempt to equip the same item I have used since this started, which was working perfectly fine.

This is the error with scripts OUTSIDE the project, including all other scripts. dynamic_slot_issue_scriptsoutside

This is the error in a CLEAN project, with only the scripts required to make it work. dynamic_slot_issue_scriptsinside

I am at a loss as to why its trying to call this method, and failing, seeing as it didn't have the problem before. There is no refresh method for Scene_Equip and I have checked every script being touched (or so I think) by the common event I am using to get the result that WAS working just fine before.

For the first time in a while, I am dumfounded. At least in previous request for assistance, I at least guessed that I might know why, before asking, but not this time. Confused is an understatement.

For reference here is a report of the common events contents:

dgr_dynamicequip_7_equip dgr_dynamicequip_7_unequip

Roguedeus commented 10 years ago

Another note.

It only errors when swopping between items using similar events. I can unequip to nothing, and then equip the dynamic slot item, etc... No error.

BEFORE this, I could swap between evented weapons, but the issue was the scene wouldn't update until I exited out of the equip slot window and re-entered it. I had it flagged as a nuisance bug that I would look at later, but didn't do anything...

Well, now its completely broken.

Roguedeus commented 10 years ago

Hold on... Maybe I found it... ugh.