Jump to content

Suggestion: Seperate weapon / armor drop limit


Recommended Posts

As far as I know, even if the worse item on the floor is worth 50 million and a mob drops a worn helmet, that 50m item will be deleted to make room for it. Thats why you can often see crap items after waves.


But it should only be ONE crap item. Cause the crap item should be the one continually being replaced if more crap items keep dropping.

Share this post


Link to post
Share on other sites
/sign

I have literally pages full of trans and supreme weapons collecting dust and far from enough armor to gear all my characters!

Share this post


Link to post
Share on other sites
Yeah, it's high time this gets fixed. I shouldn't have to run around all wave like a madman trying to loot weapons and myth armor just to clear room for stuff on the ground. No one needs 150 weapons and 25 armor pieces on the ground. Just change it already.

And while you're at it, how about you look at that whole "green thumbs up" algorithm and have it stop telling me that armor with negative stats and 25 upgrades is ever better than my maxed out gear with 175 upgrades, k, thanks.

Share this post


Link to post
Share on other sites
And while you're at it, how about you look at that whole "green thumbs up" algorithm and have it stop telling me that armor with negative stats and 25 upgrades is ever better than my maxed out gear with 175 upgrades, k, thanks.


The way it currently works is that equipment gets a multiplier on the quality rating based on the difference between the current level and the maximum level of that item (between 1 @ 0 ups available and around 2.42 @ 368 ups available, but it's handled by an exponent which means it has heavy diminishing returns.)

The issue for armor is that +1 to a hero stat adds +9 to the base quality (resistances only add +2...), and 250 upgrades of that is worth 2250 quality. The minimum quality of Transcendent armor is 30000, so fully upgrading a 250 ups piece trades a 2.2x multiplier for less than +10% to the base - fully upgrading high quality armor actually reduces the quality for the formula. Weapons don't have this issue, mainly because adding one upgrade of +100 damage increases the rating by around 185 (unles base damage has passed 10k in which case there's a funky exponent pulling it down, but it's not too heavy), compared to hero stats' +9 per upgrade, so weapons actually increase in quality.

The current formula only really works for armor at low levels, though. High level armor, even though from a player's perspective is obviously improving as you use upgrades, from the game's quality calculations, it's getting worse. It's a little bit silly and needs reworking. - at the very least it should check if the equipment's base quality is over, say, 7.5k, and ignore the potential upgrades on the one it's checking against if it is. There's code to ignore potential upgrades, so the quality comparison formula should use it, in obvious cases where fully upgrading what you're wearing would reduce quality.

Share this post


Link to post
Share on other sites
Had nothing better to do, so I coded up a quick alternative to the current item comparison system. The core difference between the current system and mine is that my one uses the potential value of each upgrade rather than a multiplier based on the number of upgrades - that is, maxed out armor doesn't suffer from the drop in quality I pointed out in the last post. I've coded two versions; both should work the same, but one of them uses a lot less code. Both versions follow this; just paste them into the right place in HeroEquipment.uc if you want to use them, Trendy (overwriting GetComparisonIndex but not GetEquipmentRating) ...and then test that they work, just in case I made minor syntax errors and it screws up.

Version A
, the long version:

function float GetEquipmentRatingDingleVersion(optional bool bForceCalculation, optional bool bIgnorePotentialUpgradeLevels)
{
local float rating;
local int it;

if(!bForceCalculation)
{
if(!bIgnorePotentialUpgradeLevels)
return MyRating;
else
return MyNonUpgradeLevelRating;
}

for(it=1; it {
rating+=StatModifiers[it]*9.0*(StatModifiers[it]<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0); //300
}
for(it=0; it {
rating+=DamageReductions[it].PercentageReduction*2.0*(DamageReductions[it].PercentageReduction<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0); //120
}
if(EquipmentType == EQT_WEAPON)
{
rating+=(EquipmentWeaponTemplate.BaseDamage+(WeaponDamageBonus<10000?WeaponDamageBonus:int((10000+(WeaponDamageBonus-10000)**0.9))))*1.85;
rating+=WeaponNumberOfProjectilesBonus*12.0;
rating+=(float(WeaponSpeedOfProjectilesBonus)**(WeaponSpeedOfProjectilesBonus>0?0.6:1.0))/(25000.0*(WeaponSpeedOfProjectilesBonus<0?0.75:1.0));
rating+=(WeaponAdditionalDamageAmount*0.7)**(WeaponAdditionalDamageAmount>0?0.92:1.0);

rating+=WeaponAltDamageBonus*0.75;
rating+=WeaponClipAmmoBonus*(WeaponClipAmmoBonus>0?0.8:1.6);
rating+=(float(WeaponReloadSpeedBonus)**(WeaponReloadSpeedBonus>0?0.6:1.0))*2.5*(WeaponReloadSpeedBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
rating+=WeaponChargeSpeedBonus*2.25*(WeaponChargeSpeedBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
rating+=(float(WeaponKnockbackBonus)**(WeaponKnockbackBonus>0?0.6:1.0))*2.0*(WeaponKnockbackBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
rating+=WeaponBlockingBonus*0.5*(WeaponBlockingBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
rating+=WeaponShotsPerSecondBonus*4.0*(WeaponShotsPerSecondBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);

if(!bIgnorePotentialUpgradeLevels)
rating+=FMax((((MaxEquipmentLevel - Level)*MaxDamageIncreasePerLevel)**0.9)*1.85),0);
}
else if(UseWeaponCoreStats)
{
rating+=(WeaponDamageBonus<10000?WeaponDamageBonus:int((10000+(WeaponDamageBonus-10000)**0.9)))*2.5;
rating+=WeaponNumberOfProjectilesBonus*12.0;
rating+=(float(WeaponSpeedOfProjectilesBonus)**(WeaponSpeedOfProjectilesBonus>0?0.6:1.0))/(200.0*(WeaponSpeedOfProjectilesBonus<0?0.5:1.0));
rating+=(WeaponAdditionalDamageAmount*0.7)**(WeaponAdditionalDamageAmount>0?0.92:1.0);
rating+=WeaponShotsPerSecondBonus*4.0*(WeaponShotsPerSecondBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
if(!bIgnorePotentialUpgradeLevels)
rating+=FMax((((MaxEquipmentLevel - Level)*MaxDamageIncreasePerLevel)**0.9)*2.5),0);
} else if(!bIgnorePotentialUpgradeLevels)
rating += FMax(((MaxEquipmentLevel - Level)*9),0);

rating+= (MaxEquipmentLevel - default.MaxEquipmentLevel)*1.45;
return rating;
}


function int GetComparisonIndex(HeroEquipment OtherEquipment)
{
local float tMyRating,tTheirRating;
if(OtherEquipment == none)
return 1;
tMyRating = GetEquipmentRatingDingleVersion();
tTheirRating = OtherEquipment.GetEquipmentRatingDingleVersion();
if(Abs(tMyRating - tTheirRating) <= ComparisonS imilarRatingAllowance*(MyRatingPercent**ComparisonRatingExponent) || Abs(tMyRating - tTheirRating) <= OtherEquipment.ComparisonSimilarRatingAllowance*(OtherEquipment.MyRatingPercent**OtherEquipment.ComparisonRatingExponent) )
return 0;
return (tMyRating > tTheirRating)?1:-1;
}


Version B
, the short version:

function float GetEquipmentRatingDingleVersion(optional bool bIgnorePotentialUpgradeLevels)
{
local float rating;

rating = GetEquipmentRating(false, true);
if(EquipmentType == EQT_WEAPON)
{
if(!bIgnorePotentialUpgradeLevels)
rating+=FMax((((MaxEquipmentLevel - Level)*MaxDamageIncreasePerLevel)**0.9)*1.85),0);
} else if(UseWeaponCoreStats)
{
if(!bIgnorePotentialUpgradeLevels)
rating+=FMax((((MaxEquipmentLevel - Level)*MaxDamageIncreasePerLevel)**0.9)*2.5),0);
} else if(!bIgnorePotentialUpgradeLevels)
rating += FMax(((MaxEquipmentLevel - Level)*9),0);

return rating;
}

function int GetComparisonIndex(HeroEquipment OtherEquipment)
{
local float tMyRating,tTheirRating;
if(OtherEquipment == none)
return 1;
tMyRating = GetEquipmentRatingDingleVersion();
tTheirRating = OtherEquipment.GetEquipmentRatingDingleVersion();
if(Abs(tMyRating - tTheirRating) <= ComparisonS imilarRatingAllowance*(MyRatingPercent**ComparisonRatingExponent) || Abs(tMyRating - tTheirRating) <= OtherEquipment.ComparisonSimilarRatingAllowance*(OtherEquipment.MyRatingPercent**OtherEquipment.ComparisonRatingExponent) )
return 0;
return (tMyRating > tTheirRating)?1:-1;
}


I've decided to leave the old version of this code untouched and simply change the equipment comparison to reference this version - that way, it doesn't break the quality descriptor system (if this was used for that, it'd make transcendent/supreme a lot rarer)

This version of the comparison code results in comparing the full potential of each item. The calculation from base damage isn't perfect (it won't return an accurate future rating) but both items follow the same rules for it, so it'll work fairly for anything above the minimum damage needed for the max damage upgrade.

This version makes the equipment comparison a lot more accurate, but it still doesn't have weightings based on player preferences. My thought is a system that uses hero stat ratios to apply a weighting to each stat, so weapon stats would be used based on the % of points spent in hero damage compared to the highest points spent in a single stat, and each hero stat would be multiplied based on that stat's ratio to the highest stat. Hence, a character with no hero damage wouldn't receive a green thumb for a weapon with 5000 damage and no tower stats, for example. I know where to start coding it, but it'd take time for me to look up all the variable names, so I haven't bothered yet.

If Trendy decide to use the code I've already posted, and want to extend to the functionality I just described, I'd sugget using version A of my code to retain modularity for that functionality without breaking the existing quality determination. If Trendy don't think it's an issue, then... fine. I don't really want credit, I'm just trying to help fix issues in the game.

Share this post


Link to post
Share on other sites
Dingle, you are amazing, the other comparison idea you mentioned sounds great, but would take a lot of time for you to come up with if it wasn't going to get implemented >

Share this post


Link to post
Share on other sites
Dingle, you are amazing, the other comparison idea you mentioned sounds great, but would take a lot of time for you to come up with if it wasn't going to get implemented ><


I could probably write it how I'm thinking of it within a couple hours, it's just a nightmare to track down all the variables and I'd have to write an extra function into the class that handles heroes.

In psuedo-code, it'd be something like


//to go in DunDefHero

int GetHighestHeroStatValue() {

int value;
for (each hero stat) { if value < pointsInStat { value = pointsInStat } }
return value;

//alternate rating function to go in HeroEquipment

function float GetEquipmentRatingDingleVersion(optional bool bForceCalculation, optional bool bIgnorePotentialUpgradeLevels)
{
local float rating, weaponrating;
local int it, maxStatValue;

weaponrating = 0;
maxStatValue = equipmentHero.GetHighestHeroStatValue();

if(!bForceCalculation)
{
if(!bIgnorePotentialUpgradeLevels)
return MyRating;
else
return MyNonUpgradeLevelRating;
}

for(it=1; it {
rating+=StatModifiers[it]*9.0*(StatModifiers[it]<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0) * (pointsInRelevantStat>0?pointsInRelevantStat/maxStatValue:0); //300
}
for(it=0; it {
rating+=DamageReductions[it].PercentageReduction*2.0*(DamageReductions[it].PercentageReduction<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0); //120
}
if(EquipmentType == EQT_WEAPON)
{
weaponrating+=(EquipmentWeaponTemplate.BaseDamage+(WeaponDamageBonus<10000?WeaponDamageBonus:int((10000+(WeaponDamageBonus-10000)**0.9))))*1.85;
weaponrating+=WeaponNumberOfProjectilesBonus*12.0;
weaponrating+=(float(WeaponSpeedOfProjectilesBonus)**(WeaponSpeedOfProjectilesBonus>0?0.6:1.0))/(25000.0*(WeaponSpeedOfProjectilesBonus<0?0.75:1.0));
weaponrating+=(WeaponAdditionalDamageAmount*0.7)**(WeaponAdditionalDamageAmount>0?0.92:1.0);

weaponrating+=WeaponAltDamageBonus*0.75;
weaponrating+=WeaponClipAmmoBonus*(WeaponClipAmmoBonus>0?0.8:1.6);
weaponrating+=(float(WeaponReloadSpeedBonus)**(WeaponReloadSpeedBonus>0?0.6:1.0))*2.5*(WeaponReloadSpeedBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
weaponrating+=WeaponChargeSpeedBonus*2.25*(WeaponChargeSpeedBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
weaponrating+=(float(WeaponKnockbackBonus)**(WeaponKnockbackBonus>0?0.6:1.0))*2.0*(WeaponKnockbackBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
weaponrating+=WeaponBlockingBonus*0.5*(WeaponBlockingBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
weaponrating+=WeaponShotsPerSecondBonus*4.0*(WeaponShotsPerSecondBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);

if(!bIgnorePotentialUpgradeLevels)
weaponrating+=FMax((((MaxEquipmentLevel - Level)*MaxDamageIncreasePerLevel)**0.9)*1.85),0);

weaponrating*= (pointsInHeroDamage>0?pointsInHeroDamage/maxStatValue:0);
rating+=weaponrating;

} else if(UseWeaponCoreStats)
{
rating+=(WeaponDamageBonus<10000?WeaponDamageBonus:int((10000+(WeaponDamageBonus-10000)**0.9)))*2.5;
rating+=WeaponNumberOfProjectilesBonus*12.0;
rating+=(float(WeaponSpeedOfProjectilesBonus)**(WeaponSpeedOfProjectilesBonus>0?0.6:1.0))/(200.0*(WeaponSpeedOfProjectilesBonus<0?0.5:1.0));
rating+=(WeaponAdditionalDamageAmount*0.7)**(WeaponAdditionalDamageAmount>0?0.92:1.0);
rating+=WeaponShotsPerSecondBonus*4.0*(WeaponShotsPerSecondBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
if(!bIgnorePotentialUpgradeLevels)
rating+=FMax((((MaxEquipmentLevel - Level)*MaxDamageIncreasePerLevel)**0.9)*2.5),0);
} else if(!bIgnorePotentialUpgradeLevels)
rating += FMax(((MaxEquipmentLevel - Level)*9),0);

rating+= (MaxEquipmentLevel - default.MaxEquipmentLevel)*1.45;
return rating;
}


Fill that in with the correct variable names for the points in a hero stat and the equipped hero, and we'd have a system where items get green thumbs based on hero stat distributions. You could quite literally say Tower Damage is worth 100% of the normal value, Tower Range is worth 50% of the normal value, Hero Damage (and weapon stats) is worth 0% of the normal value, and it'd tell you what's better based purely on that. And it wouldn't need a complicated UI because it's based on the player's stat distribution.

It even uses the player's highest stat to generate the ratios so it doesn't screw up for low-level characters, though a lowbie might not see a green weapon for a while unless they add a point into weapon damage...

Whether Trendy want to put the time into making the idea work, though... it'd take me an hour, maybe two to find all the variable names I need to plug into that, and I don't know if it's even wanted by Trendy just yet.

Oh, and I'm not that amazing. I just have a chunk of free time and a basic level of programming knowledge. I still haven't finished my degree, finals right now (and literally all my experience with unrealscript is reading through Trendy's code...)

Edit: Was bored, cleaned up that Pseudo-code into something that might work, but it depends on enumerations being browsable using numbers rather than the state names. UnrealScript reference doesn't mention it... but Unreal Wiki says I can use it that way.

//to go in DunDefHero

int GetHighestHeroStatValue()
{
int value, i;
for (i=1; i {
value = Max(value, GetStatValue(i, true);
}
return value;
}

//alternate rating function to go in HeroEquipment

function float GetEquipmentRatingDingleVersion(DunDefHero theHero, optional bool bForceCalculation, optional bool bIgnorePotentialUpgradeLevels)
{
local float rating, weaponrating;
local int it, maxStatValue;

weaponrating = 0;
maxStatValue = EquipmentHero.GetHighestHeroStatValue();

if(!bForceCalculation)
{
if(!bIgnorePotentialUpgradeLevels)
return MyRating;
else
return MyNonUpgradeLevelRating;
}

for(it=1; it {
if(!(it == 2 && theHero.HeroSpeedModifier == MAX_STAT_VALUE_SPEED_HERO)
rating+=StatModifiers[it]*9.0*(StatModifiers[it]<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0) * (maxStatValue>0 ? theHero.GetStatValue(it, true)/maxStatValue): 0); //300
}
for(it=0; it {
rating+=DamageReductions[it].PercentageReduction*2.0*(DamageReductions[it].PercentageReduction<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0); //120
}
if(EquipmentType == EQT_WEAPON && (theHero.GetStatValue(LU_HERODAMAGE, true) > 0 || maxStatValue == 0))
{
weaponrating+=(EquipmentWeaponTemplate.BaseDamage+(WeaponDamageBonus<10000?WeaponDamageBonus:int((10000+(WeaponDamageBonus-10000)**0.9))))*1.85;
weaponrating+=WeaponNumberOfProjectilesBonus*12.0;
weaponrating+=(float(WeaponSpeedOfProjectilesBonus)**(WeaponSpeedOfProjectilesBonus>0?0.6:1.0))/(25000.0*(WeaponSpeedOfProjectilesBonus<0?0.75:1.0));
weaponrating+=(WeaponAdditionalDamageAmount*0.7)**(WeaponAdditionalDamageAmount>0?0.92:1.0);

weaponrating+=WeaponAltDamageBonus*0.75;
weaponrating+=WeaponClipAmmoBonus*(WeaponClipAmmoBonus>0?0.8:1.6);
weaponrating+=(float(WeaponReloadSpeedBonus)**(WeaponReloadSpeedBonus>0?0.6:1.0))*2.5*(WeaponReloadSpeedBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
weaponrating+=WeaponChargeSpeedBonus*2.25*(WeaponChargeSpeedBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
weaponrating+=(float(WeaponKnockbackBonus)**(WeaponKnockbackBonus>0?0.6:1.0))*2.0*(WeaponKnockbackBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
weaponrating+=WeaponBlockingBonus*0.5*(WeaponBlockingBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
weaponrating+=WeaponShotsPerSecondBonus*4.0*(WeaponShotsPerSecondBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);

if(!bIgnorePotentialUpgradeLevels)
weaponrating+=FMax((((MaxEquipmentLevel - Level)*MaxDamageIncreasePerLevel)**0.9)*1.85),0);

weaponrating*= (maxStatValue>0 ? theHero.GetStatValue(LU_HERODAMAGE, true)/maxStatValue): 1);
rating+=weaponrating;

} else if(UseWeaponCoreStats)
{
rating+=(WeaponDamageBonus<10000?WeaponDamageBonus:int((10000+(WeaponDamageBonus-10000)**0.9)))*2.5;
rating+=WeaponNumberOfProjectilesBonus*12.0;
rating+=(float(WeaponSpeedOfProjectilesBonus)**(WeaponSpeedOfProjectilesBonus>0?0.6:1.0))/(200.0*(WeaponSpeedOfProjectilesBonus<0?0.5:1.0));
rating+=(WeaponAdditionalDamageAmount*0.7)**(WeaponAdditionalDamageAmount>0?0.92:1.0);
rating+=WeaponShotsPerSecondBonus*4.0*(WeaponShotsPerSecondBonus<0?NEGATIVE_EQUIPMENT_STAT_WEIGHT:1.0);
if(!bIgnorePotentialUpgradeLevels)
rating+=FMax((((MaxEquipmentLevel - Level)*MaxDamageIncreasePerLevel)**0.9)*2.5),0);
} else if(!bIgnorePotentialUpgradeLevels)
rating += FMax(((MaxEquipmentLevel - Level)*9),0);

rating+= (MaxEquipmentLevel - default.MaxEquipmentLevel)*1.45;
return rating;
}


// Modified GetComparisonIndex function, to use the new function above specifically.
function int GetComparisonIndex(HeroEquipment OtherEquipment)
{
local float tMyRating,tTheirRating;
if(OtherEquipment == none)
return 1;
tMyRating = GetEquipmentRatingDingleVersion(EquipmentHero);
tTheirRating = OtherEquipment.GetEquipmentRatingDingleVersion(EquipmentHero);
if(Abs(tMyRating - tTheirRating) <= ComparisonSimilarRatingAllowance*(MyRatingPercent**ComparisonRatingExponent) || Abs(tMyRating - tTheirRating) <= OtherEquipment.ComparisonSimilarRatingAllowance*(OtherEquipment.MyRatingPercent**OtherEquipment.ComparisonRatingExponent) )
return 0;
return (tMyRating > tTheirRating)?1:-1;
}


Functionality of this code: Compares items based on future potential of stats rather than a multiplier based on potential upgrades. Uses points in hero stats to determine the ratio of value for each stat bonus; armor assumes all points spent in hero stats, weapon assumes all points spent in base damage unless the player has no stat points in hero damage, in which case assumes all points spent in hero stats. Pets assume all points spent in damage, which might not work well for some pets. I'd have to attach an extra boolean to pets along the lines of "combat/noncombat" to make it handle all of them properly.

Using this, players would be able to define what a weapon needs to have to be considered "Green" by allocating their stats in the ratio that matters to them. Thoughts?

Edit again: added the modified GetComparisonIndex function to the latest code block so it's all in one place. Also fixed some stupid mistakes (potential division by zero fixed, was dividing in the wrong order making lower stats' weight approach infinity instead of 0, so fixed that too). Added code to handle Hero Speed (if player maxes it with level up stat points, it isn't counted on gear at all.) If all hero stats have 0 points added to them, compares items via the old system - though a situation where all stats are 0 and the character is wearing gear is rare.

Edit: Realised the second equipment wouldn't have an equipped hero to use, so I changed the function slightly so both items use the same hero.

Share this post


Link to post
Share on other sites
you're amazing just for the way you keep going through everything, so much patience :P

what if the stat-checker also checked for the stat distribution that you get from equipment you're using? (while knowing it's replacing the piece it's checking against) so if I do have gear that's stat heavy for Hero HP, but don't have any points in it, it will still look at Hero HP as well?

actually, that could start a real mess, lol

Share this post


Link to post
Share on other sites
I doubt trendy will look into changing up any of that really since they announced a while back they were working on your own personal upgrade filter. I'm sure they are just waiting for that to come along rather than feigning any interest in it's current validity. Or lack thereof.

None of this has anything to do with the terrible, terrible drop rate/end-wave rate of armor :P

The fact that this was pawned off into the unheeded suggestions forum just because I was foolish enough to add the word 'suggestion' to the title when 99.9% of the suggestions in the patch notes forums don't get moved is just a kick in the nuts. Requesting topic lock, since Trendy is just sweeping the idea under the table. It'll pop back up in the patch notes forum a few times and finally get a "We're doing this!" answer from Jeremy within the next couple of months, just like every other change, so this topic has served it's purpose.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...