We have a Steam curator now. You should be following it. https://store.steampowered.com/curator/44994899-RPGHQ/
4th Age
Moderator: Mod Janitor
I've finished implementing the abilities for the Hobgoblin Grunt and Hobgoblin Soldier. As mentioned above this meant implementing reactions. It also involved implementing the Marked condition (Rules Compendium, page 232).
Here's a video demonstrating Formation Strike, a conditional movement effect after an attack hits that takes into account most of the things that have been discussed in the thread recently (new monster, tooltips, checking monster race). The Hobgoblin Soldier advances, takes an opportunity attack, misses an attack, spends an action point, attacks again, the hit triggers a shift to guard an ally, which does not trigger an opportunity attack.
Here's a video demonstrating Formation Strike, a conditional movement effect after an attack hits that takes into account most of the things that have been discussed in the thread recently (new monster, tooltips, checking monster race). The Hobgoblin Soldier advances, takes an opportunity attack, misses an attack, spends an action point, attacks again, the hit triggers a shift to guard an ally, which does not trigger an opportunity attack.
Got tired of WoW, so here are some updates:
Defeated creatures no longer block movement or line of sight.
Powers can now have both Prereqs (to select during character building) and Reqs (conditions that must be true to use them, such as Bloodied).
Finished the Orc Raider abilities.
Defeated creatures no longer block movement or line of sight.
Powers can now have both Prereqs (to select during character building) and Reqs (conditions that must be true to use them, such as Bloodied).
Finished the Orc Raider abilities.
Strange. I’m unable to see the clip.J1M wrote: ↑ August 26th, 2024, 04:00I've finished implementing the abilities for the Hobgoblin Grunt and Hobgoblin Soldier. As mentioned above this meant implementing reactions. It also involved implementing the Marked condition (Rules Compendium, page 232).
Here's a video demonstrating Formation Strike, a conditional movement effect after an attack hits that takes into account most of the things that have been discussed in the thread recently (new monster, tooltips, checking monster race). The Hobgoblin Soldier advances, takes an opportunity attack, misses an attack, spends an action point, attacks again, the hit triggers a shift to guard an ally, which does not trigger an opportunity attack.
Works for me. Have you tried watching it in a new tab? Are you having trouble viewing any other f.rpghq.org links?
@rusty_shackleford it appears we have 2 members unable to view vault videos.
Implementing the Imp's Tail Sting ability motivated a few improvements:
Concrete example of a monster refreshing a limited use power.
OngoingEffect can now impose a stat penalty in addition to ongoing damage and a condition.
Implemented secondary/tertiary/quaternary/quinary/etc multi-hit effects.
Also implemented the "next hit" conditional +2 buff for the Hobgoblin Archer, which I assume is similar to what will be needed for a lot of player abilities that grant temporary bonuses.
Looking to confirm a rule interpretation: which parts of the Imp's Tail Sting does a Skeleton ignore? My assumptions:
Implementing the Imp's Tail Sting ability motivated a few improvements:
Concrete example of a monster refreshing a limited use power.
OngoingEffect can now impose a stat penalty in addition to ongoing damage and a condition.
Implemented secondary/tertiary/quaternary/quinary/etc multi-hit effects.
Also implemented the "next hit" conditional +2 buff for the Hobgoblin Archer, which I assume is similar to what will be needed for a lot of player abilities that grant temporary bonuses.
Looking to confirm a rule interpretation: which parts of the Imp's Tail Sting does a Skeleton ignore? My assumptions:
- The power has the Poison keyword, but that doesn't make the Skeleton immune to non-poison portions of the Power.
- Assuming the first attack roll is successful, the Skeleton takes the 1d8+3 physical damage.
- Assuming the second attack roll is successful, the Skeleton ignores the ongoing effect (damage and stat penalty) entirely because it is the Poison effect type.
Monster Manual, page 63
Tail Sting (standard; recharges when the imp uses vanish) ✦ Poison
+8 vs. AC; 1d8 + 3 damage, and the imp makes a secondary attack against the same target.
Secondary Attack: +5 vs. Fortitude; the target takes ongoing 5 poison damage and a –2 penalty to Will defense (save ends both).
Monster Manual, page 234
Skeleton Level 3 Soldier
...
Immune disease, poison; Resist 10 necrotic; Vulnerable 5 radiant
...
Last edited by J1M on September 2nd, 2024, 17:42, edited 2 times in total.
So, for most immunities, the text in green applies: the damage type or condition is ignored, but the rest is not. However, for charm, fear, illusion, and poison immunities, the immunity extends to all effects of a power with that keyword. Furthermore, since Poison is both a damage type and a keyword, immunity to Poison means both immunity to Poison damage and immunity to all effects of Poison-keyword powers. Hence:Rules Compendium wrote:IMMUNITY
Some creatures are immune to certain effects. If a creature is immune to a damage type (such as cold or fire), it doesn’t take that type of damage. If a creature is immune to charm, fear, illusion, or poison, it is unaffected by the non- damaging effects of a power that has that keyword. A creature that is immune to a condition or another effect (such as the dazed condition or forced movement) is unaffected by the stated effect.
Immunity to one part of a power does not make a creature immune to other parts of the power. For example, when a creature that is immune to thunder is hit by a power that both deals thunder damage and pushes the target, the creature takes no damage, but the power can still push it.
- The Skeleton is immune to all parts of a Poison-keyword power except damage of other types.
- Assuming the first attack hits, the Skeleton takes 1d8+3 damage because it is Physical, not Poison.
- Assuming the second attack hits, the Skeleton ignores the effect because it comes from a power with the Poison keyword.
-
rusty_shackleford
- Site Admin
- Posts: 45461
- Joined: Feb 2, '23
- Gender: Watermelon
-
Geolocation
Adventurer's Guild
I suspect it might be because it's an mkv. Didn't bother checking the encoding, but it could be that too. I think webm/vp8 has the highest adoption between browsers for video.J1M wrote: ↑ September 2nd, 2024, 17:41@rusty_shackleford it appears we have 2 members unable to view vault videos.
Thank you for your attention to this matter!
Steam friend code: 40552640 https://steamcommunity.com/friends/add | email: [email protected]
Having trouble running an old Windows game?
Rusty's Stuff Collection
Steam friend code: 40552640 https://steamcommunity.com/friends/add | email: [email protected]
Having trouble running an old Windows game?
Rusty's Stuff Collection
I just used the default settings in OBS. I don't see webm listed. @Oyster Sauce and @Unhelpful Contrarian which OS/browser are you using?rusty_shackleford wrote: ↑ September 2nd, 2024, 18:17I suspect it might be because it's an mkv. Didn't bother checking the encoding, but it could be that too. I think webm/vp8 has the highest adoption between browsers for video.J1M wrote: ↑ September 2nd, 2024, 17:41@rusty_shackleford it appears we have 2 members unable to view vault videos.
FirefoxJ1M wrote: ↑ September 2nd, 2024, 18:34I just used the default settings in OBS. I don't see webm listed. @Oyster Sauce and @Unhelpful Contrarian which OS/browser are you using?rusty_shackleford wrote: ↑ September 2nd, 2024, 18:17I suspect it might be because it's an mkv. Didn't bother checking the encoding, but it could be that too. I think webm/vp8 has the highest adoption between browsers for video.J1M wrote: ↑ September 2nd, 2024, 17:41@rusty_shackleford it appears we have 2 members unable to view vault videos.
@WhiteShark thoughts on treating Invisible as a Condition? Specifically referring to the kind granted by the Imp's Vanish power, not the Stealth skill. Does the Imp need to follow all of the Remaining Hidden rules that apply to someone who obtained Stealth via a skill check? It almost seems like there are different types of invisibility, or do they all break when someone attacks, etc.
Last edited by J1M on September 2nd, 2024, 22:45, edited 1 time in total.
Chrome on a mobile device.J1M wrote: ↑ September 2nd, 2024, 18:34I just used the default settings in OBS. I don't see webm listed. @Oyster Sauce and @Unhelpful Contrarian which OS/browser are you using?rusty_shackleford wrote: ↑ September 2nd, 2024, 18:17I suspect it might be because it's an mkv. Didn't bother checking the encoding, but it could be that too. I think webm/vp8 has the highest adoption between browsers for video.J1M wrote: ↑ September 2nd, 2024, 17:41@rusty_shackleford it appears we have 2 members unable to view vault videos.
I think that makes sense. I don't foresee it causing any rules conflicts to classify it as such.
Invisible and Hidden are indeed separate conditions.J1M wrote: ↑ September 2nd, 2024, 18:49It almost seems like there are different types of invisibility,
Thus, Hidden includes the effects of Invisible against targets from whom one is Hidden, but being Hidden doesn't make one generally Invisible, and one can be Invisible without being Hidden.Rules Compendium wrote:hidden: When a creature is hidden from an enemy, the creature is silent and invisible to that enemy. A creature normally uses the Stealth skill to become hidden. See also invisible.
[...]
invisible: If a creature is invisible, it has several advantages against creatures that can’t see it: It has total concealment against them, it doesn’t provoke opportunity attacks from them, and they grant combat advantage to it.
I recall finding Stealth tricky to adjudicate at the table becuase, technically, it's checked per enemy. I'm not sure how hard implementing it will be, but at least the computer will be able to track it 100% faithfully to the rules. Here's a guide I remember being useful for understanding the Stealth mechanics in 4E: The Rules of Hidden Club
Last edited by WhiteShark on September 2nd, 2024, 19:23, edited 1 time in total.
That was an interesting read. Agree that per creature skill checks each turn is a huge pain, even for a computer.
I also think the author is overcomplicating things a bit. If the players can communicate to effectively strip Hidden status from an enemy, why can't enemies do the same, essentially simplifying the benefit to applying only when you are hidden from all enemies?
Also a little counterintuitive that invisible is less beneficial than hidden, but at least it is semantically sound.
I also think the author is overcomplicating things a bit. If the players can communicate to effectively strip Hidden status from an enemy, why can't enemies do the same, essentially simplifying the benefit to applying only when you are hidden from all enemies?
Also a little counterintuitive that invisible is less beneficial than hidden, but at least it is semantically sound.
I thought the same thing at first, but after reviewing both the guide and the Rules Compendium, I see the issue.J1M wrote: ↑ September 2nd, 2024, 22:44I also think the author is overcomplicating things a bit. If the players can communicate to effectively strip Hidden status from an enemy, why can't enemies do the same, essentially simplifying the benefit to applying only when you are hidden from all enemies?
Rules Compendium wrote:If a creature finds a hidden creature, it might point the hidden creature out to others, resulting in them knowing its location.
As you can see, pointing out a creature to one's allies does not strip it of its Hidden status. It only lets them know the square(s) the creature occupies. Thus, the Hidden creature retains all the other benefits of Hidden against creatures who have yet to directly perceive it.The Rules of Hidden Club wrote:Yes, you CAN point out the exact square of any creature you are aware of, to anyone else.
This does NOT mean that the creature is no longer Hidden, or that anyone else can perceive it - but as long as they believe you when you tell them what square it's in, they can "guess" the right square automatically.
So, as long as PCs are sharing information and can take Free Actions, anyone who breaks Hidden can tell everyone else what square to target.
It may be worth considering what creatures can communicate when deciding whether location information can be shared. Mindless creatures, for example, may not be able to communicate at all. Since the rules only say a creature 'might' point it out to others, whether a creature can and will do so comes down to the GM's ruling.
Last edited by WhiteShark on September 4th, 2024, 17:27, edited 2 times in total.
I had to modify the base Effect class to require an EffectTypes property, which involved touching every Effect file made so far, but the keyword that controls this immunity check is now at the individual effect level instead of the Power.WhiteShark wrote: ↑ September 2nd, 2024, 18:09So, for most immunities, the text in green applies: the damage type or condition is ignored, but the rest is not. However, for charm, fear, illusion, and poison immunities, the immunity extends to all effects of a power with that keyword. Furthermore, since Poison is both a damage type and a keyword, immunity to Poison means both immunity to Poison damage and immunity to all effects of Poison-keyword powers. Hence:Rules Compendium wrote:IMMUNITY
Some creatures are immune to certain effects. If a creature is immune to a damage type (such as cold or fire), it doesn’t take that type of damage. If a creature is immune to charm, fear, illusion, or poison, it is unaffected by the non- damaging effects of a power that has that keyword. A creature that is immune to a condition or another effect (such as the dazed condition or forced movement) is unaffected by the stated effect.
Immunity to one part of a power does not make a creature immune to other parts of the power. For example, when a creature that is immune to thunder is hit by a power that both deals thunder damage and pushes the target, the creature takes no damage, but the power can still push it.
- The Skeleton is immune to all parts of a Poison-keyword power except damage of other types.
- Assuming the first attack hits, the Skeleton takes 1d8+3 damage because it is Physical, not Poison.
- Assuming the second attack hits, the Skeleton ignores the effect because it comes from a power with the Poison keyword.
A pain to do, but now I have the flexibility to do everything you quoted, such as having creatures immune to only some of the effects a Power hits them with. (Confirmed it works for the Tail Sting + Skeleton interaction mentioned above.)
With that out of the way, it's time to return to Concealment/Obscured Squares/Invisibility.
Last edited by J1M on September 3rd, 2024, 05:59, edited 2 times in total.
The invisible condition is now functioning correctly. (Total concealment, combat advantage, movement doesn't provoke an opportunity attack.)
Emergent counter for invisibility: make the invisible creature perform an opportunity attack.
I decided that "attack" referred to "attack power" not "attack roll" for the sake of clearing the invisible condition. The practical difference is that an invisible attacker retains combat advantage for all attack rolls in a power with secondary/tertiary hit effects.
With those changes, all of the monsters I set out to implement are done.
Time to bite the bullet and implement some kind of visible damage effect to make it easier to see the outcomes of attacks. I also need to revisit the targeting code and clean that up since it was initially written before there was the concept of allied teams of creatures.
Emergent counter for invisibility: make the invisible creature perform an opportunity attack.
I decided that "attack" referred to "attack power" not "attack roll" for the sake of clearing the invisible condition. The practical difference is that an invisible attacker retains combat advantage for all attack rolls in a power with secondary/tertiary hit effects.
With those changes, all of the monsters I set out to implement are done.
► Show Spoiler
Last edited by J1M on September 5th, 2024, 05:23, edited 1 time in total.
Are you referring to Hidden? Invisible isn't automatically cleared by making an Attack. The end trigger for Invisible is specific to the power that granted it. For example, in the case of Invisibility granted by the Imp's Vanish power:J1M wrote: ↑ September 5th, 2024, 04:46I decided that "attack" referred to "attack power" not "attack roll" for the sake of clearing the invisible condition. The practical difference is that an invisible attacker retains combat advantage for all attack rolls in a power with secondary/tertiary hit effects.
The imp doesn't have any powers that cause it to make multiple attacks, but if it did, its Invisibility―and the benefits granted thereby―would end after the first attack roll.Imp wrote:The imp becomes invisible until the end of its next turn or until it hits or misses with an attack.
If you do mean Hidden, then the rules already have you covered:
Still important to remember that Hidden and Invisible are distinct. For example, an imp that uses Vanish becomes Invisible, but it doesn't become Hidden unless it subsequently uses Stealth to do so.Rules Compendium wrote:Not Remaining Hidden:
If the creature takes an action that causes it not to remain hidden, the creature retains the benefits of being hidden, such as combat advantage, until the action is resolved. The creature can’t become hidden again as part of that same action.
I'll have to check if the Imp was touched by errata. What you've quoted doesn't match the Monster Manual, page 63.
Tail Sting has a secondary attack and Vanish does not refer to hit or miss.
Haven't made an attempt to implement Hidden.
Tail Sting has a secondary attack and Vanish does not refer to hit or miss.
Haven't made an attempt to implement Hidden.
You're right, it was apparently updated in Monster Vault. Since the later books updated the monster math for better balance against player stats, I recommend generally defaulting to the updated versions of monsters; both the portable compendium and the online one always show the most recent version of a monster.J1M wrote: ↑ September 5th, 2024, 12:59I'll have to check if the Imp was touched by errata. What you've quoted doesn't match the Monster Manual, page 63.
Wasn't aware that they had updated stats with the Monster Vault instead of creating "Imp 2". I had stayed away from the Essentials line because it came across as desperate, especially the new character options.WhiteShark wrote: ↑ September 5th, 2024, 17:39You're right, it was apparently updated in Monster Vault. Since the later books updated the monster math for better balance against player stats, I recommend generally defaulting to the updated versions of monsters; both the portable compendium and the online one always show the most recent version of a monster.J1M wrote: ↑ September 5th, 2024, 12:59I'll have to check if the Imp was touched by errata. What you've quoted doesn't match the Monster Manual, page 63.
I'm guessing the updates were pretty scattershot, rather than a reprint. Though to your point if the math changed so much that monster damage nearly doubled it might be a real pain to go through and update everything. (Am aware of MM3 on a business card, if I was using that approach it wouldn't be that difficult to update since I'm using Excel as a data source, but I am a bit concerned that would make all of the monsters feel the same.)
Last edited by J1M on September 5th, 2024, 22:09, edited 1 time in total.
Have been improving the tooltips today so the effects that have been created already don't look so much like debug output.
How interested are people in seeing how the project is made? The code/data/etc? Here's an example of the data that defines the Imp's Tail Sting power. It's more complicated than other Powers because of the secondary attack (SequentialHit column).
By defining the data in Excel, I can easily do find/replace across all of the data or fill new rows/columns and use formulas to populate fields like Alias, PowerUsedStat, GameElement, etc. Each of the 50+ Excel sheets defines an enumeration, such Condition type, PowerSource, or Feat type. These sheets are translated into about 12,000 lines of C# to serve as an in-memory database. This approach provides compile-time type checking, intellisense, and the ability to implement things like extension methods.

How interested are people in seeing how the project is made? The code/data/etc? Here's an example of the data that defines the Imp's Tail Sting power. It's more complicated than other Powers because of the secondary attack (SequentialHit column).
By defining the data in Excel, I can easily do find/replace across all of the data or fill new rows/columns and use formulas to populate fields like Alias, PowerUsedStat, GameElement, etc. Each of the 50+ Excel sheets defines an enumeration, such Condition type, PowerSource, or Feat type. These sheets are translated into about 12,000 lines of C# to serve as an in-memory database. This approach provides compile-time type checking, intellisense, and the ability to implement things like extension methods.
Code: Select all
EnumId{ushort} Id{omit} Alias{string} CreatureName{omit} Title{string} PowerUsedStat{Stat} GameElement{GameElement} FlavorText{string} Prereq{Req} Req{Req} Job{Job} PowerType{PowerType} Level{int} IsCommonAction{bool} IsBasicAttack{bool} Usage{Usage} PowerSource{PowerSource} Focus{Focus} ActionType{ActionType} Range{Range} Target{Target} Attack{Attack} HitDamage{Damage} DynamicVars{Stat[]} DamageTypes{DamageType[]} EffectTypes{EffectType[]} HitEffects{Func<Creature,Creature,SrcId,List<Effect>>} HostHitEffects{Func<Creature,Creature,SrcId,List<Effect>>} SequentialHit{Power} HostEffects{Func<SrcId, ReadOnlyCollection<Effect>>}
0x5D00 23808 Imp_TailSting Imp Tail Sting Stat.PowerUsed_Imp_TailSting GameElement.Power_Imp_TailSting Multi-attack power test. #AlwaysReq #AlwaysReq Job.None PowerType.Attack 0 FALSE FALSE Usage.Encounter PowerSource.None Focus.None ActionType.Standard #RangeType.Melee 1 #TargetType.Enemy 1 #Ability.None +8 Defense.Phys #1d8+3 Ability.None DamageType.Physical [] [DamageType.Toxin] [EffectType.Poison] (_,_,_) => new([]) (_,_,_) => new([]) Power.Imp_TailStingSecondary (_) => new([])
0x5D01 23809 Imp_TailStingSecondary Imp Tail Sting Secondary Stat.PowerUsed_Imp_TailStingSecondary GameElement.Power_Imp_TailStingSecondary [Flavor text NYI] #AlwaysReq #AlwaysReq Job.None PowerType.None 0 FALSE FALSE Usage.None PowerSource.None Focus.None ActionType.None #RangeType.Melee 1 #TargetType.Enemy 1 #Ability.None +5 Defense.Fort #0 Ability.None DamageType.None [] [DamageType.Toxin] [EffectType.Poison] #(_,_,_) => [OngoingEffect [EffectType.Poison] 5 DamageType.Toxin Condition.None -2 Stat.Defense_Will] (_,_,_) => new([]) Power.HobgoblinSoldier_Flail (_) => new([])

Last edited by J1M on September 6th, 2024, 05:03, edited 1 time in total.
I'm a total amateur at coding, but I do find it interesting. I've never made a game, so at some point I'm curious to see how the core loop works.J1M wrote: ↑ September 6th, 2024, 04:30How interested are people in seeing how the project is made? The code/data/etc? Here's an example of the data that defines the Imp's Tail Sting power. It's more complicated than other Powers because of the secondary attack (SequentialHit column).
One-time disclaimer: I am a hobbyist. Never worked in the game industry professionally, never completed a project to the point of putting it on a storefront. I'll place any technical details after the screenshot/video so those only interested in the progress can easily bypass those details.
Today I added icons for status conditions. I'm not sure how I will go about visually representing other effects like ongoing damage or temporary buffs yet. I suspect using icons for those in the same way would be overwhelming. Maybe I will go with something like a "buff' or "debuff" indicator that shows how many are present and you can mouseover to get more information. There's also the issue of distinguishing which effects should be displayed or not, since the approach I use has the same system for stat changes provided by things like level or race and those provided by powers.

The implementation essentially attaches a big list of Effects to each creature. A monster entering an encounter has 20-30 effects on it from its base stats and abilities. A creature does not have a strength score or a stat for "number of healing words cast this encounter". Any time a stat is needed for a calculation, it is derived from the list of Effects.
Effects implement an IsStat() function and a GetBonus() function that produces a list of stat bonuses. These bonuses include 4 pieces of information: which stat the bonus is for, how much, what type of bonus it is, and the game element it came from. All of that information is required in order to accurately calculate the stacking rules for how different effects are combined/ignored. If you think this sounds more complicated than how most RPGs implement things, you would be correct.
There's no simple "everything stacks" or "everything is an additive or multiplicative bonus". There are all sorts of conditional effects that mean that an effect needs to be aware of the entire encounter state in order to know if it applies. Examples:
Today I added icons for status conditions. I'm not sure how I will go about visually representing other effects like ongoing damage or temporary buffs yet. I suspect using icons for those in the same way would be overwhelming. Maybe I will go with something like a "buff' or "debuff" indicator that shows how many are present and you can mouseover to get more information. There's also the issue of distinguishing which effects should be displayed or not, since the approach I use has the same system for stat changes provided by things like level or race and those provided by powers.
The implementation essentially attaches a big list of Effects to each creature. A monster entering an encounter has 20-30 effects on it from its base stats and abilities. A creature does not have a strength score or a stat for "number of healing words cast this encounter". Any time a stat is needed for a calculation, it is derived from the list of Effects.
Effects implement an IsStat() function and a GetBonus() function that produces a list of stat bonuses. These bonuses include 4 pieces of information: which stat the bonus is for, how much, what type of bonus it is, and the game element it came from. All of that information is required in order to accurately calculate the stacking rules for how different effects are combined/ignored. If you think this sounds more complicated than how most RPGs implement things, you would be correct.
There's no simple "everything stacks" or "everything is an additive or multiplicative bonus". There are all sorts of conditional effects that mean that an effect needs to be aware of the entire encounter state in order to know if it applies. Examples:
- Apply a bonus if this is an opportunity attack
- Apply a bonus if the target is a certain size
- Apply a bonus that is removed once used
► Show Spoiler
Buffs may be harder since they're not standardized, but, for ongoing damage, perhaps you could dynamically generate an icon of a colored number, the color representing the damage type and the number representing the amount.J1M wrote: ↑ September 8th, 2024, 00:50I'm not sure how I will go about visually representing other effects like ongoing damage or temporary buffs yet.
I like that idea.WhiteShark wrote: ↑ September 8th, 2024, 07:55Buffs may be harder since they're not standardized, but, for ongoing damage, perhaps you could dynamically generate an icon of a colored number, the color representing the damage type and the number representing the amount.J1M wrote: ↑ September 8th, 2024, 00:50I'm not sure how I will go about visually representing other effects like ongoing damage or temporary buffs yet.
Why this disclaimer? Are there rumblings that necessitated it?J1M wrote: ↑ September 8th, 2024, 00:50One-time disclaimer: I am a hobbyist. Never worked in the game industry professionally, never completed a project to the point of putting it on a storefront. I'll place any technical details after the screenshot/video so those only interested in the progress can easily bypass those details.
...
Do you foresee this causing processing bottlenecks or requiring sacrifices?J1M wrote: ↑ September 8th, 2024, 00:50There's no simple "everything stacks" or "everything is an additive or multiplicative bonus". There are all sorts of conditional effects that mean that an effect needs to be aware of the entire encounter state in order to know if it applies. Examples:
...
Last edited by Kalarion on September 8th, 2024, 16:49, edited 1 time in total.
The disclaimer is there because I'm going to drop into an authoritative tone when talking about my own project and I don't want this thread to become arguing about component-entity systems and whether or not a game engine should have a scripting language.Kalarion wrote: ↑ September 8th, 2024, 16:48Why this disclaimer? Are there rumblings that necessitated it?J1M wrote: ↑ September 8th, 2024, 00:50One-time disclaimer: I am a hobbyist. Never worked in the game industry professionally, never completed a project to the point of putting it on a storefront. I'll place any technical details after the screenshot/video so those only interested in the progress can easily bypass those details.
...
Do you foresee this causing processing bottlenecks or requiring sacrifices?J1M wrote: ↑ September 8th, 2024, 00:50There's no simple "everything stacks" or "everything is an additive or multiplicative bonus". There are all sorts of conditional effects that mean that an effect needs to be aware of the entire encounter state in order to know if it applies. Examples:
...
The conditional effects are more of an issue related to the complication of implementation and ensuring the rules are resolved in a way that matches what would be expected at a kitchen table. I don't anticipate needing to worry about performance in that way, but if I do there are optimizations I can explore. Simple example: the existence of an effect like "extra critical damage dice" means that either a) the generic way of calculating damage from an ability needs to assume every power could have this and all powers need data defined for that property or b) there needs to be a mechanism to inject a modification to how much damage a power does (but only if the attack roll was a crit). TLDR: it increases complexity more than its a performance problem.
I'll talk more about this in a future post, but even the existence of "extra damage dice" instead of "extra flat damage" adds additional complexity and prevents certain approaches of implementation because the value isn't known until it happens.
Last edited by J1M on September 8th, 2024, 17:36, edited 1 time in total.
Seems like a good opportunity for a bikeshedding conversation. I suppose gray could be added to the potential choices, but I didn't want to use it unless it was necessary. That won't be the icon, it's just a color test.J1M wrote: ↑ September 8th, 2024, 13:33I like that idea.WhiteShark wrote: ↑ September 8th, 2024, 07:55Buffs may be harder since they're not standardized, but, for ongoing damage, perhaps you could dynamically generate an icon of a colored number, the color representing the damage type and the number representing the amount.J1M wrote: ↑ September 8th, 2024, 00:50I'm not sure how I will go about visually representing other effects like ongoing damage or temporary buffs yet.

Could Radiant be made white and Necrotic black? If so, you could then move Radiant's yellow over to Lightning, move Lightning's current blue over to Force, and move Necrotic's purple over to Thunder.
Acid's color is appropriate, but it looks deceptively close to Poison's color, at least to me on my monitor. Maybe that's something that can be tweaked with brightness.
Acid's color is appropriate, but it looks deceptively close to Poison's color, at least to me on my monitor. Maybe that's something that can be tweaked with brightness.
