Search Unity

[RELEASED] Love/Hate: The Emotion-Driven Relationship System

Discussion in 'Assets and Asset Store' started by TonyLi, Mar 24, 2015.

  1. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Thanks! Happy (belated) holidays! Please let me know if it continues to throw any errors after adding holders for those states.
     
  2. twobob

    twobob

    Joined:
    Jun 28, 2014
    Posts:
    2,058
    I rebuilt it from scratch.

    So far no errors. I have been testing at each stage since I have no idea where the error came from - nor what it pertained to.

    Let you know if it fails: Will do.

    Cheers


    found it. The other author is going to fix it. Heroic support
     
    Last edited: Apr 8, 2015
  3. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Opsive has updated their Behavior Designer integration package for Love/Hate. The latest version of Behavior Designer, 1.5.0.1, can now pass event data with behavior tree events. This allows the Love/Hate integration to pass information such as who committed the deed when faction members witness deeds.

    If you're looking for an AI solution, Behavior Designer and Love/Hate make a great combination. Love/Hate will let your NPCs make emotional and relationship-based value judgments that can help Behavior Designer decide what actions to take, resulting in some very sophisticated behavior.
     
    BackwoodsGaming and twobob like this.
  4. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Great! Glad you found the issue.
     
    twobob likes this.
  5. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Love/Hate 1.1 beta 1

    Love/Hate 1.1 beta 1 is available for customers to review. If you'd like access, please PM me. I plan to release 1.1 on Sunday.

    The release notes are:

    Version 1.1 (beta 1)
    - Added: Colored scene view gizmos for faction members and traits.
    - Added: Aura triggers.
    - Added: ORK Framework support.
    - Improved: Improved rumor evalation. Added deed.aggression to better affect dominance.
    - Improved: Faction manager now distributes witness evaluation of deeds across frames.
    - Improved: Better handling of uninitialized fields.
    - Improved: Added cache to interaction triggers to reduce component lookups.
    - Improved: Replaced foreach loops to eliminate garbage collection caused by Mono boxing.
     
  6. twobob

    twobob

    Joined:
    Jun 28, 2014
    Posts:
    2,058
    Where is the "Love" button :D
     
    TonyLi likes this.
  7. blueivy

    blueivy

    Joined:
    Mar 4, 2013
    Posts:
    633
    Is love/hate still in beta?
     
  8. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Hi @blueivy - No, you can buy version 1.0.2 right now on the Asset Store. The next version (1.1) is in beta; it'll be submitted to the Asset Store tomorrow with a bunch of new features!
     
    blueivy and hopeful like this.
  9. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    While Love/Hate v1.1 is being reviewing by the Asset Store, I thought I'd let everyone know that the manual, API reference, and demo links have also all been updated to version 1.1.
     
    Parallaxe and blueivy like this.
  10. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Love/Hate v1.1 is now on the Asset Store!

    Release Notes
    • Added: Colored scene view gizmos for faction members and traits.
    • Added: Aura triggers.
    • Added: FactionManager and FactionMember string serialization methods for easy saving/loading.
    • Improved: Improved rumor evalation. Added deed.aggression to better affect dominance.
    • Improved: Faction manager now distributes witness evaluation of deeds across frames.
    • Improved: Better handling of uninitialized fields.
    • Improved: Added cache to interaction triggers to reduce component lookups.
    • Improved: Replaced foreach loops to eliminate garbage collection caused by Mono boxing.
    • Fixed: Deed template library editor bug when adding/removing templates.
    • ORK Framework: Added support.
    • PlayMaker: Added string serialization actions, OnAura and OnEnterAura events.
     
  11. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Love/Hate v1.2 beta 1 Available On Request

    If you own Love/Hate and would like to download Love/Hate v1.2 beta 1, please PM me for access. This update has some refinements to deed/rumor evaluation, more runtime info in the FactionMember inspector, and a new Stabilize PAD component that you can use to gradually bring PAD values to target values over time. This is useful, for example, to gradually "cool down" characters' arousal.

    Release Notes (beta)
    • Added: StabilizePAD component to restore PAD to target values over time.
    • Improved: FactionMember inspector shows memories, relationships & parents at runtime.
    • Improved: Enhanced rumor evaluation (added TraitAlignmentImportance, PowerDifferenceCurve).
    • Changed: Rolled FactionMember.ApplyRumorImpact into DefaultEvaluateRumor.
    The deed evaluation function is now fully documented at the end of the manual.
     
    Last edited: May 11, 2015
    Kiwasi, hopeful, Teila and 3 others like this.
  12. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Love/Hate v1.2 Now Available!

    Version 1.2 is now available on the Asset Store!

    The roadmap for version 1.3 includes:
    • Multiplayer example
    • Tradesys support -- your traders will be able to adjust their prices based on how they feel about the player and each other!
     
    blueivy likes this.
  13. Teila

    Teila

    Joined:
    Jan 13, 2013
    Posts:
    6,932
    Ooooo, you saved us a lot of time, Tony! We were already looking at Tradesys, actually have been for a long time, but this clinches it. Fantastic!
     
  14. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Hi @Teila - Have you given any thought to how you'll handle Tradesys data in an MMO? The multiplayer example that will be in v1.3 is designed for limited-player games like Neverwinter Nights and Left 4 Dead. I'm also working up partial implementations for handling Love/Hate data in MMOs, which looks like it'll also work well. But if you can share any insight into how you're planning to handle data like this, I'll also incorporate it into the writeups and examples.
     
    BackwoodsGaming likes this.
  15. Teila

    Teila

    Joined:
    Jan 13, 2013
    Posts:
    6,932
    I will look into it and let you know if I have any information at all. We are in the middle of a house remodel so my "programmer" is busy painting and putting in a new floor. :) He is the database man and probably has a better idea of how it will work. We are still a long ways from the MMO part of the project.

    We are starting with a limited-player number for our game (lobby based) so my guess is we will test it all there and see how it works and then start working on adding the MMO features. That isn't my expertise so I won't confuse you by saying things that make no sense. :)

    Our game is in steps though, just so you know, starting with the lobby based mini-game and then moving to a slightly larger medieval city scenario. We are scaling based on interest. We may end up being a small game focused on immersive role play, never going beyond the politics and intrigue of the city, who knows. Still sounds like fun to me!
     
    TonyLi likes this.
  16. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    I don't know know if you ever played Skotos' Castle Marrach. It was just what you described but limited to text only (a MUD essentially). The large, active userbase was clear proof that it sounded like fun to a lot of people!
     
  17. Teila

    Teila

    Joined:
    Jan 13, 2013
    Posts:
    6,932
    I don't think so. I played Firan for quite some time, another MUX, role play based and 300+ players, some of them played for many years. It is still running. That text game is my inspiration and why I know there are a lot of role players out there. It is also a game based on politics, ruling families, guilds, mystery and intrigue. :) Very mature, as in grown up, player base as well as some interesting mechanics for a text game.
     
    TonyLi likes this.
  18. BackwoodsGaming

    BackwoodsGaming

    Joined:
    Jan 2, 2014
    Posts:
    2,229
    I'm just now discovering Tradesys myself. It looks perfect for the trading system I had planned on implementing. Speaking of MUD-like games, I am planning something similar for a trading system to the one in Simultronics' text based game DragonRealms. My thoughts as far as how to handle it for any multiplayer solution whether it would be MMO or even lobby based coop would be to keep track of reputations, love/hate info, or faction information keyed to the NPC or player record in a database. Not really necessary if those numbers never change. But with a system where they will be changing, the updates would definitely need to be kept in a central record where any players referencing those NPCs/players would get correct values.

    For example, several traders deliver wheat bundles to Joe's market, This causes Joe's supply to exceed his need causing both his price he pays for wheat bundles to drop, and possibly the price he charges villagers for wheat. Whereas if wheat was dwindling, he would be paying a premium for wheat bundles and possibly also charging more for wheat.

    I know, what does that have to do with Love/Hate? In addition to storing information in the DB about all of that stuff, we can now keep track of how often player brings Joe products that he is in desperate need for. Of course if Jane is always bringing Joe copper ore when his stores are at a critical level, he may start paying her a bonus.

    I would probably do some type of table using the player ID as a primary key with each record containing a list of the trader NPC IDs the player has interacted with and their current reputation through Love/Hate then have a script that gave a random percentage bonus based on different reputation points. Similarly I might subtract a penalty or refuse to purchase if the points went more to the hate side.

    All this is conceptual. I still need to dig into Love/Hate (and now this Tradesys system lol). Well, and Dialogue System which I have yet to start integrating... But I think that is my general thought process..

    Can't wait to see what you do with the example in 1.3!
     
  19. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Hi @Shawn67 - Thanks for sharing your thoughts on this!

    For version 1.3, I considered two multiplayer scenarios:
    • Limited-player games like Diablo
    • MMOs like World of Warcraft
    The multiplayer example in 1.3 is for limited-player games. These games are typically instanced, and one of the players is the server. All players are clients. In this kind of game, you probably want all clients to maintain complete Love/Hate info on all PCs and NPCs. To do this, 1.3 introduces a few more events that fire when Love/Hate data changes on a client. This allows the client to report the change to the server, which can then broadcast the change to the other clients. The faction database has generic player slots for the maximum number of players that can join a game. As players join, they're assigned a slot. To save a game, the server just saves the current state of the faction database and faction members. To load a game, the server sends the state to the clients.

    The documentation also includes a writeup of some internal proofs of concept I've run for the MMO scenario. In this scenario, Love/Hate data needs to be maintained on dedicated server(s), which will probably be running special server-side software, not a Unity-based client. For MMOs, it's not practical or even useful to create slots for all players. To Player 1, the important relationships are what NPCs think of Player 1, not what they think of Player 999999, whom Player 1 has probably never met and never will. The server stores the player's personal Love/Hate data with its player record. When the player logs in again, the server sends this data to the client, which then applies it to Love/Hate. Faction member data (NPCs) are stored on the server independent of players, so if one player upsets an NPC other nearby players will also see that the NPC is upset.

    @Shawn67 and @Teila - do either of those approaches sound like they'll work for your projects? Can you recommend any changes or additions?


    Regarding Tradesys, I like your idea of improving relationships by delivering goods that traders need. This is as simple as defining a "delivery" deed and scaling the impact value based on how much the trader needs the item.

    I'm working on an example scene that currently only adjusts prices based on how the trader feels about the customer. I'll add your idea to it, too!
     
    BackwoodsGaming likes this.
  20. Teila

    Teila

    Joined:
    Jan 13, 2013
    Posts:
    6,932
    Perfect, Tony. Sorry I haven't gotten back to you but busy with the house stuff today. :) This looks exactly like my understanding of how the server-client data will work. Thank you for thinking of us when creating your examples.

    Yes, very cool idea, Shawn!
     
    BackwoodsGaming likes this.
  21. BackwoodsGaming

    BackwoodsGaming

    Joined:
    Jan 2, 2014
    Posts:
    2,229
    Definitely sounds like a start, Tony! I agree.. I probably wouldn't create slots for each player. Instead I would create a slot each time the game establishes a new relationship. Player interacts with NPC 89723, game creates a record in relationships table containing player ID, NPC ID, and their relationship. If player never talks to or does anything to create a relationship with 89722 or 89721, records are never needed to be created for them. So with a game with 90000 NPCs and 1000 players, each player may only have a couple hundred relationships. Still might be much for a large game, but I would assume if the game is MMO and has 1000+ players, they are probably dealing with some back end resources to handle the processing.

    For me, I still picture a Diablo sized game using a central database. Basically a battle.net type scenario. I'm not sure I would want processes that could effect gameplay stored locally. This is kind of crossing a bridge that we don't have in Diablo though. I don't think Diablo, Path of Exile, or any of the other similar games have any type of faction/relationship gameplay. Will have to put some thought into that. But would still think something like this that could effect how the world reacts to a player based on their reputations/relationships would be something you would want to store server-side.

    Regarding Tradesys - exactly. My thoughts are each region will have market exchanges where the player can get information on what is currently in demand in other areas. Then the goal would be to find the merchandise to buy low in an area and then transport to the area that it is in demand before demand drops. The player could also pick up contracts (quest) from current traders for something that is in demand and if delivered back within a certain amount of time get paid a premium. But all prices regardless of where the player sees them aren't set in stone.. I mean if a trader hates you, they will want to stick it to you until you do enough to make them like you again, right?

    Maybe even throw in some quests where a rival trader is undercutting prices or offering you more to buy out a contract's goods designated for another trader. Or you keep taking delivery contracts from a trader that are mysteriously getting stolen along the road when in reality you are selling to a band of thieves, trading for stuff that you can't normally get anywhere else..

    The possibilities are ENDLESS! lol
     
  22. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Hi @Shawn67 - That's pretty much what Love/Hate does now. Every character is a member of a faction (usually their own personal faction), which can have parent factions (e.g., the village blacksmith has her own personal faction whose parent faction is the overall village faction). These are all defined in the faction database. You can use multiple faction databases, but the data is small enough that it's usually easiest to keep it in one database. Even with 10,000 characters it's just a few hundred KB. As each faction forms a relationship to another faction, it adds or updates an entry in its relationship table. So if no one has any feelings toward anyone else at the start, all the relationship tables are empty.

    Good point. I'll add this option to the multiplayer documentation.

    Hmm, I think I'll have to look into Tradesys for Quest Machine, too! :)
     
  23. BackwoodsGaming

    BackwoodsGaming

    Joined:
    Jan 2, 2014
    Posts:
    2,229
    Heheh... I haven't even looked at Tradesys yet. Just having diarrhea of the brain and rambling off the way I hope to figure out how to get things to work. As I was thinking about contracts after you mentioned them, I got to thinking they was pretty much like a quest. Quests could be contracts for traders, work orders for crafters, bounties for bounty hunters.. If ya think about it, they are all pretty much tailored quests for a profession. :) I think all of those professions would be fun to tie into Love/Hate where depending on how well a trade guild, or the current village, or local magistrate likes you determines the not only the types of jobs you are offered but also the value of rewards paid for completing them.

    Quest Machine.. Is that the quest system that you were talking about when we were chatting via PM? If so, what is the status of that? Making much progress with it?

    I guess I really need to get my core crap done so I can start playing with Dialogue System, Love/Hate, Tradesys, and eventually your quest system. The real world needs to settle down and give me more development time! rofl
     
  24. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    It's making progress! I'm working on example scenes, documentation, and art now. Currently it uses the Dialogue System exclusively to present quest text. Before release, I want to abstract this to a generic interface so people can use it without the Dialogue System if they want.
     
    BackwoodsGaming likes this.
  25. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    The Pixel Crushers forum (http://www.pixelcrushers.com/forums/) will be down for a few days while we switch from bbPress to phpBB. In the meantime, please continue to post here or PM or email me directly at tony (at) pixelcrushers.com!
     
    blueivy likes this.
  26. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    I received a support request from a Love/Hate user who asked how to change deed evaluation. He wanted the affinity change to be based on how well the deed's traits align with the faction member's traits, instead of basing it on the deed's impact value. If the alignment were positive, the affinity change would be positive. If the alignment were negative, the affinity change would be negative.

    Unfortunately his email is bouncing, so I'm posting the answer here while I look for an alternate way to reach him.


    The short answer is to assign an EvaluateRumor delegate method to the faction member.

    Love/Hate's default evaluation function determines the sign of the affinity change solely by impact. By default, trait alignment can adjust this up or down 50%. If you set the faction member's Trait Alignment Importance to 100, trait alignment can at most negate the change (at 100% non-alignment) but since it's restricted to the range [-100,+100] it can't go any further than that.

    Page 22 of the Love/Hate manual describes how to assign an EvaluateRumor delegate. You can add a script like this (CustomDeedEvaluation.cs) to the faction member:
    Code (csharp):
    1. using UnityEngine;
    2. using PixelCrushers.LoveHate;
    3.  
    4. public class CustomDeedEvaluation : MonoBehaviour
    5. {
    6.  
    7.   private FactionMember me;
    8.   private EvaluateRumorDelegate OriginalEvalFunc;
    9.  
    10.   void Start()
    11.   {
    12.     me = GetComponent<FactionMember>();
    13.     OriginalEvalFunc = me.EvaluateRumor;
    14.     me.EvaluateRumor = MyEvaluateRumor;
    15.   }
    16.  
    17.   public Rumor MyEvaluateRumor(Rumor rumor, FactionMember source)
    18.   {
    19.     var tempRumor = Rumor.GetNew(rumor);
    20.     tempRumor.impact = Mathf.Sign(Traits.Alignment(me, rumor.traits)) * Mathf.Abs(rumor.impact);
    21.     var result = OriginalEvalFunc(tempRumor, source);
    22.     Rumor.Release(tempRumor);
    23.     return result;
    24.   }
    25. }
    This script sets the impact's sign based on trait alignment, and then runs that through the default evaluation function.
     
    BackwoodsGaming likes this.
  27. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    June 6-7 - Pixel Crushers office closed for the weekend

    The Pixel Crushers office will be closed this weekend, June 6-7, 2015. If you post here, PM me, or email me at tony (at) pixelcrushers.com, I'll reply first thing Monday morning! Have a great weekend!
     
    blueivy likes this.
  28. blueivy

    blueivy

    Joined:
    Mar 4, 2013
    Posts:
    633
    @TonyLi Have a great weekend as well :)
     
    TonyLi likes this.
  29. lazygunn

    lazygunn

    Joined:
    Jul 24, 2011
    Posts:
    2,749
    I'm an artist principally and when I program it's almost always art related so you have no idea how much it pleases me when systems like this, opsives and tradesys, which I actually own, seem like they're going to help me mesh together my perfect game, cheers to all
     
    blueivy likes this.
  30. Licarell

    Licarell

    Joined:
    Sep 5, 2012
    Posts:
    434
    Here Here!
     
  31. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Thanks, @lazygunn and @Licarell! This week, I'll make a beta release of the next version (with Tradesys support and a multiplayer example) available, with a goal of submitting it to the Asset Store at the end of the week. If you have any suggestions or requests to make it easier or more useful, please let me know!
     
    Teila likes this.
  32. BackwoodsGaming

    BackwoodsGaming

    Joined:
    Jan 2, 2014
    Posts:
    2,229
    I haven't put much thought into it since we talked about it earlier in this thread. If it makes what I talked about possible, I'll be MORE than happy. :)
     
  33. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Love/Hate v1.3 Released

    Love/Hate v1.3 is now available on the Asset Store! The major additions are a multiplayer guide and TradeSys support.

    Version 1.3
    • Added: Multiplayer example & guide.
    • Added: Wolf/rabbit/farmer simulation example.
    • Added: FactionDatabase: CreateNewFaction()
    • Added: FactionMember: SwitchFaction(), IRememberDeedEventHandler, IForgetDeedEventHandler, IModifyPADEventHandler, FactionMemberEvents component.
    • Changed: Serialized FactionMember data now includes faction ID (since members can switch factions).
    • Improved: Exposed FactionMember.DefaultEvaluateRumor().
    • TradeSys: Added support. This is a work in progress and will develop further based on developers' needs.
     
  34. Teila

    Teila

    Joined:
    Jan 13, 2013
    Posts:
    6,932
    Thank you, Tony! :)
     
  35. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    My pleasure! The multiplayer example is a 1-4 player, instanced game, not an MMO. I have some multiplayer development experience, so if you have any questions about using Love/Hate in an MMO beyond what's discussed in the guide, just let me know!
     
    BackwoodsGaming and Teila like this.
  36. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Love/Hate 24 Hour Deal - June 24

    If Love/Hate has been on your Asset Store Wishlist, this week's the time to get it! This Wednesday, June 24, Love/Hate will be the featured 24 Hour Deal. :)
     
    Tiny-Tree, opsive and Teila like this.
  37. hopeful

    hopeful

    Joined:
    Nov 20, 2013
    Posts:
    5,686
    Love it! ;)
     
    TonyLi likes this.
  38. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Love/Hate is today's 24 Hour Deal on the Unity Asset Store!

    Click to: Buy Love/Hate

    If you have any pre-purchase questions, please feel free to ask here!
     
    Teila likes this.
  39. thedreamer

    thedreamer

    Joined:
    May 13, 2013
    Posts:
    226
    finally i got it.. May I ask you something about your future update plans?
     
    TonyLi likes this.
  40. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Hi @thedreamer - Thanks! Love/Hate is a tightly-focused product, and it's fairly complete right now in what it's designed to do. The current roadmap primarily covers third-party support, such as expanded support for TradeSys and integration with the upcoming procedural quest generator, Quest Machine. I'll also continue to listen to developer feedback -- the recently-added multiplayer example was based on several requests from developers. Some tutorial videos are also in the works.

    Do you have any specific questions about future update plans that you'd like me to address?
     
  41. thedreamer

    thedreamer

    Joined:
    May 13, 2013
    Posts:
    226
    upcoming procedural quest generator, Quest Machine what's this?
     
  42. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    It lets you configure quest givers, mission terminals, etc., to generate new quests automatically based on the quest giver's goals and the current state of the world.

    The Love/Hate integration will tie Love/Hate affinities into this. If an NPC hates another and is the murderous type, he might generate a quest for the player to kill the other NPC.
     
  43. thedreamer

    thedreamer

    Joined:
    May 13, 2013
    Posts:
    226
    WoW that's great.. I hope the product is coming out soon
     
  44. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    It's in the works. The core is done -- annotating the world with questable info and planning quests to satisfy goals -- but some peripheral things remain, such as writing the manual and example scenes, and decoupling quest presentation from the Dialogue System so users can use their own conversation and quest UIs if they don't want to use the Dialogue System. I'm eager to release it as soon as it's ready!
     
    BackwoodsGaming likes this.
  45. Licarell

    Licarell

    Joined:
    Sep 5, 2012
    Posts:
    434
    I really don't want to hijack this thread but are you considering maybe a discount to the quest system for those of us who have bought the dialogue system and love hate?
     
  46. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    I'd like to, but I don't think the Asset Store offers the capability to do this. Does anyone know of a way? Barring that, the best "discounts" I can provide are prewritten integration packages so you don't have to spend time and effort getting them to work together.
     
  47. -Singularity-

    -Singularity-

    Joined:
    Jul 27, 2014
    Posts:
    122
    Bought to support - really like your work!
     
  48. TonyLi

    TonyLi

    Joined:
    Apr 10, 2012
    Posts:
    12,697
    Thanks! I hope you find it useful, too! :)
     
  49. -Singularity-

    -Singularity-

    Joined:
    Jul 27, 2014
    Posts:
    122
    I'm sure I will, I can't use it in my current project but it's one of those things that inspires a lot of creative thought!
     
    TonyLi likes this.
  50. Licarell

    Licarell

    Joined:
    Sep 5, 2012
    Posts:
    434
    Duly Noted... Thanks!