Search Unity

Add Properties to a GameObject

Discussion in 'Scripting' started by ThySpektre, Jul 22, 2019.

  1. Ryiah

    Ryiah

    Joined:
    Oct 11, 2012
    Posts:
    21,203
    Good to know I'm not the only one with an abnormal number of mirrors in my house.
     
    lordofduct likes this.
  2. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    In the meantime, if the "wrench is right for every job" crowd is done, should someone stumble upon the thread and have a better way to kludge around the lack of inheritance on Unity GameObjects, feel free to message me.
     
  3. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    (chuckle) and now the PeeWee Herman defense.
     
  4. Ryiah

    Ryiah

    Joined:
    Oct 11, 2012
    Posts:
    21,203
    Pfft. I'm just bored and no longer able or willing to take you seriously.
     
  5. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    Which is great. You haven't offered anything of value to my query in pages.
     
  6. Ryiah

    Ryiah

    Joined:
    Oct 11, 2012
    Posts:
    21,203
    Wasn't anything to add value to once we got past the first page.
     
    Suddoha and Lurking-Ninja like this.
  7. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    And yet...here you are...still.
     
  8. Suddoha

    Suddoha

    Joined:
    Nov 9, 2013
    Posts:
    2,824
    ::sigh::
    Well, you've fallen back into "i still want that solution which is impossible". It seems to be useless trying to get you where you should be looking for solutions.

    It does not necessarily need to be a component. But it definitely needs to be an additional type. That's how it works. There's no way around it.

    Your premise that you want to add to GO directly is invalid in the first place. It's a fact. Unfortunately you don't understand that dead-simple thing. I wonder why...if you had as much experience as you claim, you wouldn't get stuck on this. But apparently you do...

    Which again, metaphorically speaking, brings you into the position that you're the guy running against a street lamp again and again, while others just take the obvious way around it.
    You cannot take that way unless you remove it (you cannot do that, you're not in the position to do that), or.bend physics / quantum physics altogether (which you can't either).

    Procedural programming or any other paradigms? Perhaps you're an expert there, perhaps even more than that. We don't know.

    Major part of it in OOP? Hard to believe. Actually damn hard to believe based on what you post here.
     
    Last edited: Aug 9, 2019
    Lurking-Ninja and Ryiah like this.
  9. lordofduct

    lordofduct

    Joined:
    Oct 3, 2011
    Posts:
    8,537
    I mean... this is also presumptuous of you.

    My first line of code was written in 1995. So, there's that.

    In the same respect it doesn't stop me from respecting the skill of many of the users on this forum and in this thread.

    Oh the irony, the hypocrisy...

    But heck, sometimes you can't teach an old dog new tricks.
     
    Last edited: Aug 9, 2019
    Lurking-Ninja, Ryiah and Suddoha like this.
  10. lordofduct

    lordofduct

    Joined:
    Oct 3, 2011
    Posts:
    8,537
    See...

    None of use have said "wrench is right for every job". Because none of us have really said composition (your so-called wrench) is right for EVERY job. We said it's right for THIS job.

    You're the one who insists that inheritance is right for a job that Unity designed to have a wrench (composition) used for. You're the one insisting inheritance is right for jobs not designed for inheritance. You insist on using your preferred tool. We're the ones repeating "yes, but sometimes you need OTHER tools, tools the Unity engine was designed for".

    Do you not see this?

    It's like you bought a European car and are wondering why it's all in metric.

    And that is the irony.

    And despite your so-called 30 years of experience... you can't see this forest through the trees.
    (sorry I'm in an idiom mood this morning, only because you seem to like using idioms)

    You know, I've asked multiple times to see your kludge. You still haven't shared it.

    Please, show us.
     
    Last edited: Aug 9, 2019
    Ryiah likes this.
  11. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    And yet, here you are...still.

    I'm not asking for your belief. What I asked for is dead simple from the first post. If you cannot provide it, it may save you future aggravation if you simply stop posting on the issue.
     
    Last edited: Aug 9, 2019
  12. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    Of course it was presumptuous. That was the point to make regarding the local posts nearby. Good to see another old hand on the board. My first line of code was written in 1980.
     
    Last edited: Aug 9, 2019
  13. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    Perhaps you need to reread the thread.

    Not only do I SEE this, it is the point of the thread. I have a nail and Unity only provides a wrench. I'm asking for the best kludge to use a wrench as a hammer. Since we're stuck on analogies and idioms this morning.

    The kludge is as stated half a dozen time so far. An object manager grabs information from the various other components on the GameObject to present to the game manager when queried through an interface. In the reverse, when instructed by the game manager, the object manager shuttles info to the various components on the object.

    Incidentally, instead of being fixated here with perhaps the last piece of attempted useful information being pages ago, you and crew MIGHT want to help out what appears to be a new user who has run into a similar, though not the same, problem

    https://forum.unity.com/threads/saving-from-multiple-script.723350/
     
    Last edited: Aug 9, 2019
  14. Suddoha

    Suddoha

    Joined:
    Nov 9, 2013
    Posts:
    2,824
    Turns out it's entertaining how the dog hunts its tail.

    The closest solution has already been provided. Followed by the hint that you can move the entire implementation that you'd throw into a GO's subclass simply into another type instead, which would eliminate the need of all other components if you wish... Yet you're suddenly hung up on a that "kludge" which utilizes all the components.

    Complete nonsense.

    What you're basically saying is that this one limitation forces you from:
    Code (CSharp):
    1. public class Animal : GameObject
    2. {
    3.     // state 1
    4.     // state 2
    5.     // state 3
    6.  
    7.     public void Move() { }
    8.     public void ConsumeFood() { }
    9.     public void MakeSomeNoise() { }
    10. }

    to
    Code (CSharp):
    1. public class Animal : MonoBehaviour
    2. {
    3.     MovementComponent _movement;
    4.     FoodConsumptionCompmonent _foodConsumption;
    5.     SoundComponent _sound;
    6. }
    7.  
    8. public class MovementComponent : MonoBehaviour
    9. {
    10.     // state 1
    11.  
    12.     public void Move() { }
    13. }
    14.  
    15. public class FoodConsumptionCompmonent : MonoBehaviour
    16. {
    17.     // state 2
    18.     public void ConsumeFood() { }
    19. }
    20.  
    21. public class SoundComponent : MonoBehaviour
    22. {
    23.     // state 3
    24.     public void MakeSomeSound() { }
    25. }

    whereas the closest is just
    Code (CSharp):
    1. public class Animal : MonoBehaviour
    2. {
    3.     // state 1
    4.     // state 2
    5.     // state 3
    6.  
    7.     public void Move() { }
    8.     public void ConsumeFood() { }
    9.     public void MakeSomeNoise() { }
    10. }

    What's the difficulty?
     
    Ryiah likes this.
  15. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    When you are ready to be helpful as opposed to being entertained, please message me. The difference being of course in the first I am accessing properties of a GameObject. In the latter, the game manager now needs to know the internal structure of the game object to know it has an Animal component attached.
     
  16. lordofduct

    lordofduct

    Joined:
    Oct 3, 2011
    Posts:
    8,537
    If this were true, then you contradict yourself by saying we think "wrench is right for every job".

    You insist you understand this.

    We insist we understand this.

    :shrug:

    Snooooooooort
     
    Ryiah likes this.
  17. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    In the meantime, the other user sits hoping for help. You'd have to wonder if the point here is to be helpful or to, dare I say, troll.
     
  18. Suddoha

    Suddoha

    Joined:
    Nov 9, 2013
    Posts:
    2,824
    So where's your constructive comment on the relevant part of that post? Can't you hold anything against it? You skip it again once we're getting to the actual meat of the problem. That's what you do all the time, throughout the entire 5 pages.

    Trolls do that exact same thing. They skip the facts that they can't hold anything against, instead they pick the irrelevant parts and comment them. If that's your attitude... must've been a weird career with that all the ignorance.

    *edit quoted too fast :p I apologize
     
    Last edited: Aug 9, 2019
  19. Ryiah

    Ryiah

    Joined:
    Oct 11, 2012
    Posts:
    21,203
    He's already being assisted. Like @StarManta mentioned he hasn't assigned anything to the stats field meaning he most likely added the component to the object but neglected to assign the field in the Inspector. I don't see anything in that thread I could add that wouldn't be completely redundant at this point. A basic question doesn't need a crowd to answer it.
     
  20. Suddoha

    Suddoha

    Joined:
    Nov 9, 2013
    Posts:
    2,824
    Ahh, there's the edit...

    So no, it doesn't. Because it'd deal with the part it is interested in: the Animal type. No knowledge of GameObject needed. That's the point.

    Hence an interface would be even better. No knowledge about what class implements the actual functionality, not even a base class needs to be known by that manager, as all it cares about is animal functionality (the part it's interested in so that it can do its job).

    Code (CSharp):
    1. public interface IAnimal
    2. {
    3.     void Move();
    4.     void ConsumeFood();
    5.     void MakeSomeSound();
    6. }
    Forgive me for that silly example. I'm not willing to put much effort into it right now.
     
    Last edited: Aug 9, 2019
  21. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362

    Ahh, but an in depth one like this deserve the attention. Thanks! Good to see you taking it serious again, and not engaging in ....trolling.
     
  22. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    Silly examples, that don't answer the query seem to be the order of the day. Don't put yourself out about it.
     
  23. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    Perhaps instead of apologizing in retrospect, you could edit the insults out prospectively in the future.
     
  24. StarManta

    StarManta

    Joined:
    Oct 23, 2006
    Posts:
    8,775
    Beg pardon? Don't drag me into this thread that somehow wasn't locked by mods 3 pages ago.
     
  25. Suddoha

    Suddoha

    Joined:
    Nov 9, 2013
    Posts:
    2,824
    To be fair, all the examples answered the query, as they're valid alternatives to something that cannot be done. Whether you personally call them kludges or not does not invalidate them. They're still valid alternatives to the problem at hand. Just not in a way you accept them.

    At the time of writing that was the only thing you posted. I'm not responsible for your postings, and my answer only put a highlight on what you've been doing so many times. At that point in time, it was just another post of that kind. You picked the most irrelevant part first, and hit the reply button. That's not my fault.

    If you submit wrong information, and someone happens to process that information before you change it (on top of that with the additional knowledge that information of that kind/quality was submitted earlier) well, that's bad luck I guess.

    The other part is a comparison to what your response reminded me of, given that it was the only thing in your post at the time of quoting it. I apologized, I won't delete it though. If you had not replied in that manner so often before, I wouldn't have commented it at all. However, if you reply in that manner, I'm free to say what I think about it.

    Anyway, I won't comment off-topic stuff from now on. Let's focus on the topic.

    Back on topic. It might help if you don't imagine "GameObject" as the representation of the actual object. Try to work with an alternative name, kinda like the ones that were mentioned earlier (page one?):

    - Handle for a set of components
    - Backbone for a set of components
    - collection for a set of components
    or just GameObjectHandle or EntityHandle.

    It does not define what your entity is, it only grants access to what is used that defines it as a whole, even if that's just a single component (Transform). In order to provide that functionality, it serves as a unique handle (via its reference), a non-unique but user-friendly name, it enables us to include it in / exclude it from the happening in the scenes (setting it active and inactive). And some properties for rendering them (ir)relevant to some systems (via layers for example) , as well as flagging/tagging them (tags).

    Different example:
    How would you implement a fixed-size inventory? You could say it's an array. You cannot subclass arrays, because they're nothing but a handle to a contiguous piece of memory. Intuitively, you'd wrap around an array.

    Even if you knew that collection's exists, you most-likely wouldn't subclass collections. Their sole purpose is being a container, their reference being a handle to a specific organized structure of items that were thrown into it.
     
    Last edited: Aug 9, 2019
    Ryiah likes this.
  26. There is no topic after the first page.
     
    Last edited by a moderator: Aug 9, 2019
    Ryiah and lordofduct like this.
  27. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    They however aren't. They are answers to a question never asked.

    Take responsibility for you insults, or I suppose admit you are an automaton.

    And perhaps (I can only speculate at this point) is why you don't understand why your proposals don't meet the original query. It's rather like ....no...no need for another analogy. The example at hand does,.

    The original post asked how to add a property to a GameObject. How to treat that as the object you are modelling. Here you explicitly state "...don't imagine the "GameObject" as the representation of the actual object."

    If this contradiction dos not make this clear, it is doubtful any ting else I could add would.
     
  28. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    And yet...here you are....still.
     
  29. I'm here for the popcorn
     
    lordofduct likes this.
  30. Ryiah

    Ryiah

    Joined:
    Oct 11, 2012
    Posts:
    21,203
    Feel free to set an example and take responsibility for the insults you're throwing around.

    I'm surprised no one has posted a picture of it yet.
     
    Lurking-Ninja likes this.
  31. lordofduct

    lordofduct

    Joined:
    Oct 3, 2011
    Posts:
    8,537
    It's more like a bowl of chocolate covered grass hoppers.

    Sure... I'm eating them... but they're not exactly the tastiest things around and I don't really think anyone wants me to share.
     
  32. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    True dat.

    But here you are....still.
     
  33. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    Unity doesn't make popcorn. Learn do to without.
     
  34. lordofduct

    lordofduct

    Joined:
    Oct 3, 2011
    Posts:
    8,537
    Ryiah asked.

    I didn't say I don't like chocolate covered grasshoppers.

    Also... here you are still.

    There's an easy fix to this... don't respond to Suddoha. Your interchange with him is really the only thing keeping this all going. The rest of us are just like "heh... heh heh. This is awkward and weird."
     
    Ryiah likes this.


  35. They didn't wait for the inheritance, apparently.
     
    Suddoha, Ryiah and lordofduct like this.
  36. lordofduct

    lordofduct

    Joined:
    Oct 3, 2011
    Posts:
    8,537
    WIN!
     
    Ryiah and Lurking-Ninja like this.
  37. Suddoha

    Suddoha

    Joined:
    Nov 9, 2013
    Posts:
    2,824
    What do you expect when you come here with a false premise... this implies that there will be a contradiction to your initial request.

    You were still in just a few posts ago. :p
     
    lordofduct likes this.
  38. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    No query of you was made.

    "Sure... I'm eating them... but they're not exactly the tastiest things around "

    Lordofduct, meet lordofduct.

    Yes...I still have a purpose here, as mentioned multiple times now, other than the trolling you all have been involved with by your own admission.

    In the meantime, if the "wrench is right for every job" crowd is done, should someone stumble upon the thread and have a better way to kludge around the lack of inheritance on Unity GameObjects, feel free to message me.
     
    Last edited: Aug 10, 2019
  39. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    There is no false premise. Even if there were a false premise, your logic does not hold.
     
  40. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    Corniest post of the thread.
     
  41. Ryiah

    Ryiah

    Joined:
    Oct 11, 2012
    Posts:
    21,203
    With that attitude you might end up haunting this thread for all of eternity. :p
     
    Suddoha likes this.
  42. lordofduct

    lordofduct

    Joined:
    Oct 3, 2011
    Posts:
    8,537
    I think I've realized your issue... you only operate in absolutes.

    Because composition doesn't work absolutely, you don't like it.
    Because you think inheritance works absolutely (regardless of it not), you love it.

    You don't seem to understand I can not dislike something while also not liking it.

    I call it "Led Zeppelin".

    See... I don't dislike Led Zeppelin, but I don't like Led Zeppelin. Rather instead... if I'm in my car cruising along and the classic rock station blares out "It's Let The Led Out Hour! A full hour of LED ZEPPELIN!"

    I'm not gonna turn it off... but that's about the only condition under which I listen to Led Zeppelin.

    ...

    This thread is Led Zeppelin.

    I didn't ask for it to exist.

    But hey... it's here.

    ...

    You see.

    This is called not being a dick about everything.

    And instead appreciating the things I myself might not like... but I don't hate em'. I don't like motorcycles, but I'm not going to tell someone they shouldn't drive one.

    I'm not here to tell you you should never use inheritance. Hell... I USE INHERITANCE, like all the god damn time. It's a big part of programming in the object oriented paradigm. I was here to suggest to you though that trying to kludge around composition in a framework designed with composition in mind though... well that's dumb. You're insisting on using a tool you prefer than the tool the job demands (see: expecting a European car to be in US standard measurements). That's like trying to play Led Zeppelin with out a guitar. Sure, there are other instruments out there... but Led Zeppelin kind of requires a guitar. And sure you could do a "classical orchestral rendition of Stairway to Heaven"... but it's not the same thing anymore. It's not really Led Zeppelin anymore...

    But heck, at this point, I'm not even here for that. You've made up your mind.

    You like your way of doing things. You insist on calling it a kludge. You blind yourself to the fact that implies it's "bad/less optimal", or rather you aren't and you actually think composition is bad. And you repeatedly call us automatons but requesting we don't call you names. And thusly I don't try to convince you anymore.

    So now I'm kind of just here... eating chocolate covered grasshoppers and listening to Led Zeppelin.

    I don't love it... but hey, it's entertaining.
     
    Last edited: Aug 10, 2019
  43. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    At least until helpful replies are delivered.
     
  44. lordofduct

    lordofduct

    Joined:
    Oct 3, 2011
    Posts:
    8,537
    I'd love to proffer some helpful replies.

    It's why I asked for examples of your code to see what it is you're actually trying to do. You've yet to supply that though. Instead you repeat the same description that is both vague and contradictory at times.

    It may actually be why some people question your actual skill level. You've yet to demonstrate any code of your own that exemplifies your skill. Personally I don't let that make me think you don't have skill... lack of evidence is not evidence. But... it is hard to assist you without getting a read of said code/skill.
     
  45. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    You demonstrate your psychology skills match your answering skills.

    Listening to Led Zeppelin in your car is a passive process. Posting in this thread and eating chocolate covered grasshoppers is an active process. But please, demonstrate you know as much about psychology as coding.

    You might want to start demonstrating that. You've stated multiple times you have nothing more to offer in this thread...yet you persist in trolling. Why is that exactly?

    Agreed. So...when you have a job that calls for Inheritance...or Led Zeppelin, you can kludge around it with an orchestra or composition, but it's really not the same thing...it's a kludge

    So you've decide to start trolling full time, instead of just part time. What was that about not being a dick again?

    EH...at least they're not Coldplay
     
    Last edited: Aug 10, 2019
  46. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    Obviously if, at this point in the thread, this is what you see, it should be fairly obvious there is a minute chance that your skills set matches answering the query.

    It may actually be why some people question your actual skill level. You've yet to demonstrate any code of your own that exemplifies your skill. Personally I don't let that make me think you don't have skill... lack of evidence is not evidence. But... it is hard to assist you without getting a read of said code/skill.[/QUOTE]

    The question was plainly clear. The only skill level I am concerned with at this time is that of someone actually answering it. The only skills I've seen put forth for pages now from you are trolling skills and they are decidedly lacking.
     
    Last edited: Aug 10, 2019
  47. Ryiah

    Ryiah

    Joined:
    Oct 11, 2012
    Posts:
    21,203
    I believe you've hit upon the reason for why they haven't given us any code. Since we're dealing in absolutes here not having the solution they want to the problem means they haven't written any code at all and in fact won't be writing any code until they've successfully solved every problem in exactly the way they're happy with.
     
    lordofduct likes this.
  48. ThySpektre

    ThySpektre

    Joined:
    Mar 15, 2016
    Posts:
    362
    As stated many pages back, a kludge of an object manager and interfaces was selected. Certainly not as clean or elegant as inheritance would have provided, but it works. (shrug)
     
  49. lordofduct

    lordofduct

    Joined:
    Oct 3, 2011
    Posts:
    8,537
    Passive/Active... it's regardless.

    It wasn't a "psychology" thing... it was a matter of taste/opinion. I am saying just because I am aware that grasshoppers aren't all that delicious... I still eat them on occasion for the experience of it. It's interesting.

    This thread, and you included, are very intriguing to me. Despite my not liking you.

    Lol... problem with being a dick... it's subjective. You might think I'm a dick, you might have interpreted much of what I said as being a dick. But I assure you... I don't mean it in a dick way. I legitimately am intrigued by your absolutism of things.

    Case in point, I think you're a dick. But hey, you might not mean to be one. And that's fine.

    But your working an engine designed with composition in mind. And composition is not a kludge... it's just a different way of doing it.

    The job doesn't necessarily call for a inheritance. Your design calls for inheritance. You want to use inheritance because you engineered an answer to your problem that uses inheritance. And the fact that Unity is designed with composition in mind stands in your way of using inheritance.

    Yes, it's a kludge to force your design. But that's not the fault of unity, or of composition. It's because you can't see another way to solve the problem.

    There's more than one way to skin a cat. And here in Unity land we skin cats with composition. If you don't like composition, you might be in the wrong place.

    I didn't troll part time before. I was attempting to operate within this thread.

    Now though... I guess you can call this trolling.

    But I don't know...

    Definition
    Trolling
    as it relates to internet, is the deliberate act, (by a Troll – noun or adjective), of making random unsolicited and/or controversial comments on various internet forums with the intent to provoke an emotional knee jerk reaction from unsuspecting readers to engage in a fight or argument

    I don't know... my opinions aren't that controversial. The fact my statements are for the most part in line with the majority here demonstrates as such.

    He's got jokes guys!

    Sorry... but it has been demonstrated by the fact that NO ONE knows what the F you're question actually is.... it wasn't plainly clear.

    Or sorry... the original question was. You asked how to inherit from GameObject so as to add new properties to it... and we said "you can't". Easy answer.

    Your follow-up question though of whatever the heck you are attempting... that one is more vague and contradicts itself a lot.

    And of the multitude of skilled developers who have read here... not one of them has yet to figure out what it is you exactly want. Though we are pretty sure what you don't want.

    You don't want composition.

    Which again... welp... sorry. Welcome to Unity. Unity was designed with composition in mind.

    That's how 3rd party tools work... they're engineered and designed in a specific way. Like a European car uses the metric system. If you don't like that... than don't use it. But for all you try... you're not going to force that us standard bolt into the lamborghini without blowing a head gasket.
     
    Last edited: Aug 10, 2019
    Ryiah likes this.
  50. Suddoha

    Suddoha

    Joined:
    Nov 9, 2013
    Posts:
    2,824
    1)
    => they are => false premise

    2)
    => technically impossible due to how the language works => false premise to begin with

    Then suddenly:
    => asking for a workaround
    => workaround's been provided

    1) see previous "is there a kludge" => yes
    2) workaround without component list has been provided as in

    => workaround
    => no component list
    => only a different base class (allowed, due to "is there a kludge?" a.k.a. workaround)
    => cannot get any closer

    Then, you refuse, redirect to first post and the requirement.
    => Now start this post from its top again. Rinse and repeat. Or break out of the illogical reasoning.

    As you like to say...
    "I don't hold your experience against you".

    Proper requirement analysis is a key to success, so is pragmatism.
    1) Make up a consistent statement of your requirements.
    2) be pragmatic, don't get hung up on something you cannot change
     
    Last edited: Aug 10, 2019
    Ryiah likes this.