Threat System

envenger

Active Member
Hi....

I had thought a threat system for my RPG map...
I need some help, feedback and suggestions on it.
So here how it is like...
First every hero has a threat value... they gain it from items or passives..

They are numbers like 2,3,4,20 etc...
like if A has 10, B has 20 and C has 5.

They have 2 use..

1. Deciding the attacked enemy
The enemy units line of sight(triggered) is updated like every 1-2seconds(value not thought better if any one could say me).

When it is updated it checks units with the highest threat and then attacks it.

like if A has 10, B has 20 and C has 5 threat value.
and A does a damage of 1000, B of 800 and C a healing of 1500.
Threat value of A is 1000*15 = 15000, of B is 800*20 = 16000 and of C is 1500*5 = 7500

And the enemy will attack B
*Here i need a help to check if the both units are in line of sight or not or if they have trees or wall or something between them.

2. The aggro during a fight
When 2-3 units are attacking an enemy unit.
There damage or there heal is multiplied by threat and is stored in a variable named threat value.

There is a trigger which runs every 4,5 or 6 seconds(There is a random loop executing it. It is done to make some randomness and put more effect. And suggestion on it will be welcomed).
The trigger can run in any of those 3 values it depends on your luck.
When it runs, the threat value is rested. And the enemy attacks the unit with the highest threat value.

Also there are some special spells which make this trigger run when there is a need for extra threat.
Displaying system

There is a system that stores the value and converts them to a percent to show players by multiboard.

like if A has 10, B has 20 and C has 5 threat value.
and A does a damage of 1000, B of 800 and C a healing of 1500.
Threat value of A is 1000*15 = 15000, of B is 800*20 = 16000 and of C is 1500*5 = 7500
Total threat value of system is 38500

Now there are 2 ways to represent this

On a full-scale

The threat percent for B is ((16000/38500)*100) = 41.55%
Even though this is more clear it has its problems
In a 2 men group the job of players is to keep threat below 50% who doesn't want to take threat but,
for a 3 men group the job of players is to keep threat below 33%.

Its technically 100/(no of players)
On a out of 100% scale
In This the threat percent for B is taken out of 38500/(no of players)

So, the threat percent is ((16000/(38500/3))*100) = 124.65%

So, here if you don't want to take threat you will need to keep it below 100% while if you want to take threat you need to keep it above 100%
The threat percent is updated on the screen every 1.5 or 2 seconds(suggestions if any).

*And, i am unsure which of the systems should i use among the two to represent this. Need help for that or any way to improve it.

Also there are many spell schools which have there own threat percents like a shadow spell causes more threat than a nature spell.

Well this is it... i know its not organized but hope you understand... I have tried my best to represent my idea here.
 

GFreak45

I didnt slap you, i high 5'd your face.
display should be via floating text unique to the local player for units in combat with the target, threat also should not be limited to heroes but include npcs, ie: mind control threat... threat should be updated upon a damage event not on regular intervals
threat should be determined by overall damage dealt to a target, which is dynamic, not a static method like the one you are using (determined by who has the best items/level/hero type/etc)

display should not be for the total group, but for each player on each unit

this is something i was working on a while back but it should put the main point across:

JASS:
private struct Threat extends array
    unit unit
    real max
    real secondMax
    integer target
    integer second
    group targets
    boolean inCombat
    texttag text
    
    private method periodic takes nothing returns nothing
        local group g = this.targets
        local unit u
        local thistype i
        local real x = GetUnitX(this.unit) - 20
        local real y = GetUnitY(this.unit)
        local integer a
        call SetTextTagPos(this.text, x, y, 10 * 0.023 / 10)
        loop
            set u = FirstOfGroup(g)
            exitwhen u == null
            set i = GetUnitId(u)
            set a = R2I(LoadReal(bj_lastCreatedHashtable, this, GetUnitId(u))/this.max)
            if GetLocalPlayer() == GetOwningPlayer(u) then
                call SetTextTagVisibility(this.text, true)
                call SetTextTagText(this.text, SubString("|cffff0000" + SubString("''''''''''''''''''''", 0, a - 1) + "|r|cffffc1c1" + SubString("''''''''''''''''''''", a, 19) + "|r", 0, 19), -10)
            endif
            call GroupRemoveUnit(g, u)
            set u = null
        endloop
        call DestroyGroup(g)
    endmethod
    
    implement T32x
endstruct


this is part of a threat system that i made a while back, im not even sure that it compiles cuz i havent looked at it in a while (for personal use and not optimized/changed for public use)
 

envenger

Active Member
I will use an multi-board to represent for each hero.
Got no idea about npc or player may be a floating text above them will like you said. And only the player which could control it could see it.

I don't want to make it on damage...

Cause if i make a mage with a huge damage spell... He should use it form time to time so... If i do it on damage it will draw instant aggro even if his total dps is less.
 

GFreak45

I didnt slap you, i high 5'd your face.
well the point is to balance the damage for damage dealers and make non-damage dealers create modified threat, ie: a tank creates 300% x his damage in threat, but deals very little damage, whereas a caster deals 10 x the tanks damage but has his threat reduced by 75%, and healers get minor threat on everything when they heal, etc...
what you wanted to make isnt a threat system, its slightly improved AI, threat is a dynamic high quality AI
 

envenger

Active Member
making threat on damage will make the enemy move between two targets while not attacking any.

Any suggestion on the two ways to display threat? Which one should i use??

And way to detect trees or any path blockers between the two units?
 

GFreak45

I didnt slap you, i high 5'd your face.
no it doesnt... whoever has dealt the most total damage over the duration of the fight has the most threat, its not instantaneous threat its accumulative, starting at 0 and getting higher and higher
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • tom_mai78101 tom_mai78101:
    Labor Day vacation is the best.
    +1
  • tom_mai78101 tom_mai78101:
    Make sure you keep checking out my news..
    +2
  • Jesus4Lyf Jesus4Lyf:
    Man, I made this account 15 years ago? Wild. :)
  • Ghan Ghan:
    Seeing J4L is definitely a blast from the past.
  • Jesus4Lyf Jesus4Lyf:
    Oh hey Ghan! Long time. :)
    +1
  • jonas jonas:
    J4L! What has happened in your life
  • Jesus4Lyf Jesus4Lyf:
    Hmm, how to summarize... Moved to the USA and got married. Became a professional software engineer and solution lead. Learning Godot for game dev. :)
  • jonas jonas:
    So you are pursuing game dev as a hobby? What industry is your dayjob in?
  • jonas jonas:
    FAANG?
  • Jesus4Lyf Jesus4Lyf:
    Not quite FAANG, less pay for a less hours/stress. Yeah, game dev as a hobby.
  • jonas jonas:
    makes sense. Do we have a hobby game dev subforum to showcase some work?
  • Blackveiled Blackveiled:
    Happy Thursday
    +1
  • The Helper The Helper:
    Happy Thursday!
  • The Helper The Helper:
    TGIF!
  • The Helper The Helper:
    hey tom_mai please do not archive anymore news
  • Ghan Ghan:
    AMD Ryzen 7000 next week :D
    +1
  • The Helper The Helper:
    noice!
  • tom_mai78101 tom_mai78101:
    "hey tom_mai please do not archive anymore news" ----> Got it. What should we do with the "News Archive" subforum?
  • The Helper The Helper:
    I think leave it for real old news that cannot be sorted the reason we had it in the first place was a server issue that we do not have anymore. I don't want to get rid of the archive just not put anything in it for now until we figure it out more
  • The Helper The Helper:
    The side chat has nothing on the discord. it is not possible but the biggest thing on my wish list right now is a sidechat channel on the disord that hooks up to this...
  • Ghan Ghan:
    I've been selected for the Diablo IV beta.
    +1
  • Ghan Ghan:
    Woo!
    +1
  • The Helper The Helper:
    that is so cool
  • V-SNES V-SNES:
    Eh just noticed the new discord section on the side. Looks great!

    The Helper Discord

    Staff online

    Members online

    Affiliates

    Hive Workshop NUON Dome World Editor Tutorials

    Network Sponsors

    Apex Steel Pipe - Buys and sells Steel Pipe.
    Top