Ptarth Ptarth

UberFix v1.02

UberFix v1.02

UberFix


The UberFix is a compilation of bugfixes for Demigods version 1.2. The patches incorporated into the mod
are listed below along with the creator of the patch.


Download:

v1.02

Installer format: www.box.net (Recommended Download)

filesize: 334,609 bytes

MD5 Checksum: 5322667e9be4dbd0fc9cb44823a6dc81

Source Code: www.box.net


Old Versions


 

v1.01

Installer format: www.box.net

filesize: 322,544 bytes (Downloaded 223 times)

Source Code: www.box.net

 

v1.00

Downloaded 178 times 

zip format:  16.5 KB  v1.00 Mediafire  v1.00 Box.net  

exe format: 301.2KB v1.00 Box.net  

 


Currently Included Patches

Uberfix 1.02 

  1. Lord Erebus Poisoned Blood Potion Fix by Ptarth
    • Poisoned Blood Potions can no longer be used by Lord Erebus to farm himself. He and his teammates treat his Poisoned Blood Potions as regular potions now.
  2. Oculus Electrocution Fix by Ptarth
    • Health and Mana regeneration are now correctly stopped.
  3. Torch Bearer Projectile slowdown Fix by Ptarth
    • Toch Bearer's fireballs and fireblasts now correctly accelerate to maximum speed when their target moves a great distance. This includes his Fireball Ability.
  4. Unclean Beast Ooze Suicide Fix by Ptarth
    • Ooze now correctly ends when the Unclean Beast is low on Health.
  5. Oculus Sacrifice Fix by Ptarth
    • Sacrifice now will heal allied units.
  6. Unclean Beast Post Mortem Plague Conflict Fix by Exxcentric
    • Plague I and II no longer remove the Post Mortem death effect.
  7. Rook Move Attack Fix by Ptarth
    • Rook now attacks while moving correctly.

UberFix 1.01

  1. Lord Erebus Mist Form Fix by Ptarth
    • updated to end when mana drops below 125.
  2. ZikFix (Zikurat Tower Fix) by mrappard
    • The Dark side towers on Zikurat while playing Conquest now spawn correctly, instead of at warscore 6.
  3. Orb of Veiled Storms Fix by Ptarth (bug reported by awuffleablehedgie)
    • The Orb of Veiled Storms now deals ArmorImmune damage like every other demigod ability and weapon ability (except for the Doomspite Grips and Girdle of Giants, which have a cleave attack).

UberFix 1.00

  1. Minion +hp Fix by Ptarth
    • Minions summoned by Demigods Generals [Sedna, Lord Erebus, Oak, Queen of Thorns, Oculus] with +minion hp items now have the correct health
  2. Oculus Brain Storm Fix by Ptarth
    • Brain Storm now has a visual effect at all levels, instead of only when Oculus has Mental Agility
    • Brain Storm now removes debuffs on targeted unit as specified by the rollover tooltip text
  3. Queen of Thorns Attack Animation Glitch Fix by Ptarth
    • Reduced the lifetime of the QoT's root attack animation to make the animation look better.
    • This is only a cosmetic change.
  4. Oculus Lightning Ball Summons Fix by Ptarth
    • Lightning Balls will no longer summon in map void space.
  5. Oculus Lightning Blast Fix by Ptarth
    • Lightning Blast now occurs at the origin of the target instead of the origin of the unit that procs the effect.
  6. Missing Oculus Shield Effect Fix by Ptarth
    • Oculus now has a visible Shield effect.
  7. Heart of Life and Wings of the Seraphim Healing ends effect Fix by Ptarth (awuffleablehedgie provided starter code)
    • The Heart of Life and Wings of Seraphim no longer stop their regeneration effects when the user is healed.
  8. Parasite Egg and Sludge Slinger Partial Fix by Ptarth
    • Changed the Parasite Egg and Sludge Slinger so they can be used, although it isn't perfect.

 

Current Buglist (Todo list: Verified and replicatable)

  1. Rook Shoulder weapons having target locking issues
    • I thought I had something to fix it. However, I'm having problems replicating the effect to test it.
  2. Fix the skill queue.
    •  Eg, if you tell a UB to grasp he tries to get into melee range and execute the grasp. If you tell him to spit, then it gets thrown to the back of the skill queue and he doesn't spit, he continues to follow like an r'tard. To fix it you have to issue a move command, then spit.
    • AbilityTask.lua has the functions related to this. There are many interesting things in it.
    • After finishing a command the demigod reverts to an attack/move order if previously moving towards a target
  3. AA targeting issues
    • Like how Oak frequently swings with his Axe and does no damage or how Sedna will stand by a target without attacking
    • This may be linked to the Rook Shoulder weapon problem or the command queue
    • (http://forums.demigodthegame.com/356419)
    • Demon Assassin stops auto-attack after warp strike. It should continue to attack the locked target... this would be natural.
  4. Rollover Data Error on flag tooltip while being captured behind fog of war.
  5. Demigods do not resume auto-attack immediately or change targets after using an ability.
  6. UB Post Mortem damage does not count as UB damage for the purpose of awarding gold.
  7. Move order is canceled when using effects (http://forums.demigodthegame.com/356694). The move order is turned into an auto-attack order.
  8. Inaccurate health bar on zoom in (http://forums.demigodthegame.com/356347)
  9. Language for engine messages (xxx has left, xxx has joined...) in game lobby uses the hosts language setting (this should be the users language setting): my russian is a bit rusty!
  10. Torchbearer respawns in Ice mode by default. This should be the last used mode (Fire/Ice)! Same for QoT.
  11. Queuing to grab a potion and then being Foul Grasped while picking up the potion and then UB getting Shadow Swaps allows you to pick up the potion instantly as long as you have contiguous line of sight. I've been able to do this roughly 25 in-game yards away.
  12. When a demigod switches primary weapon the window information doesn't update properly (mainly a QoT issue)
    1. This is a visual glitch, the weapon does change, but the window does not update correctly.
  13. Oculus cannot autoattack directly beneath him

Bugs Requiring Research List (requires verification and a reliable replication method)

  1. Light/Dark capping all flags creates "Invalid Game State" error (http://forums.demigodthegame.com/362132)
    1. This happens enough to know that there is an issue, but without a way to replicate it reliably it is beyond me to fix
  2. Torch Bearer's stat progression for PermaFrost Movement Debuff is 3%/10%/15%. It should probably be 5%/10%/15%
  3. "War Score" display at each teams' citadel is incorrect.
    • It shows the average of the two teams' warscore, it really should show just yours.
    • The citadels look to upgrade correctly.
  4. Minions still get stuck in citadels
    • Need a map person to look into hedgie's proposed fix idea
  5. Oculus's Ball Lightnings attack animation sometimes sticks with permanent bolt from minion to target.
  6. Oculus's Chain Lightning effect sticks until his or target's death if target teleports during cast.
  7. Oculus sometimes becomes unresponsive after using Blast Off.
  8. Sedna's Silence debuff never expires under certain circumstances.
  9. Oculus moves very slowly when selected with Ball Lightnings.
  10. Pathing issues on Prison
  11. Selling Monk idols sometimes destroy summoning button
    • To replicate: Summon Monks, Sell Monks (while idol is recharging), Buy a different type of idol (siege archer or warrior, possibly any other item too), Buy new Monk Idol. I can't replicate this any more for some reason.

Current Unfixable Errors (Can't do list)

  1. Sedna's low quality Silence effect causes speakers to silence
    1. Unfixable since we can't access and change the sound files
    2. Setting sound quality to medium fixes this for most people.
  2. Ping times periodically spike in-game (despite sufficient upload bandwidth).
    1. This is not handleable within lua
  3. Multi-game achievements fail to record progress properly.
    1. This is controlled by Impulse
  4. Overlay friend chat buttons constantly reappear.
    1. Controlled by Impulse
  5. Game result stats include players who joined and left lobby before match start.
    1. Controlled by Impulse?
  6. demigods.exe is looking for version 1.20.211 but is version 1.20.214 with the last patch
    1. GPG compiles the exe
  7. warning: 00:03:04: Granny: FileReading (c:\Work\forge\main\code\src\libs\granny\granny_file_info.cpp(152): File has run-time type tag of 0x8000002d, which doesn't match this version of Granny (0x80000026).  Automatic conversion will be attempted.)
    info: 00:03:04: Total Material Count: 24 Total Mesh Count: 24
    info: 00:03:05: Can't find texture "/env/common/layers/none_normal.dds" -- trying fallback.
    1. Internal and Granny related, all GPG accessible only
  8. Oculus Stun Animation does not loop fluidly
    1. The animations are scripted in Granny which we don't have access to.
  9. Demon Assassin's movie on the character select screen was filmed using the wrong skin.
    1. The movie was made using Granny and Bink, we don't have access to Granny
  10. Assorted replay playback issues
  11. Game result stats include players who joined and left lobby before match start.

Current Nonbugs (Feature List)

  1. Mana/Health loss on item drop (http://forums.demigodthegame.com/360939)
    • Working as intended I believe
  2. Oak's Shield can be interrupted
    • This is most likely a lag effect
  3. Scroll of Restoration doesn't cure stuns
    • The scroll only affects debuffs, not stuns

 Bugs Fixed by Previous Official Patches (SD & GPG fixed it list)(not complete, just ones that come up)

  1. Match ending while dead results in "wind" effect persisting until game is closed.
  2. Sound looping issue (http://forums.demigodthegame.com/356935).

Current Potential Additions to the BugFix (Addition list)
    1. SkillInfoMod
    2. AIMod by Peppe


Current Semi-Active Project Members

Ptarth - guy who does stuff

awuffleablehedgie - guy who finds bugs

UhelligGudn - new guy with lots of energy


Plea to Community

If we want Stardock and Gas Powered Games to increase their support of Demigods, we need to demonstrate our commitment and our willingness to support it. If we want to accomplish anything worthwhile to demonstrate our commitment, we need to work together. If you have time, please consider helping out. Every little bit helps.

1,095,790 views 519 replies +12 Loading…
Reply #151 Top

Hm, maybe you have answered this question somewhere already, but why did you make 1.01 a separate mod?

Reply #152 Top
I made it multiple versions to prevent compatibility issues. Without maintaining separate versions players will have no idea if they have UberFix 1.0 or UberFix 1.01. They may attempt to join games that have a different version, and be unable to. Or they may join games and have it crash out because the content of the versions is different. This would lead to a decline in the number of casual users that are willing to use mods, which is bad for us if we want Demigods to be effectively patched.
Reply #153 Top

I wrote up some instructions to send to someone who was interested in working on the UberFix. I'm going to post them here since they are useful. It isn't completely correct, but it is good enough for an initial start.


I code using notepad, you can get a LUA editor, but it doesn't offer us that much in turns of usefulness. The majority of the functions and code we will be writing will have to run within the demigods game itself.

Demigod's uses a hook method of activating mods. That means we will be putting files into a mod directory and the game will add those files when an actual game starts. There are some other ways of doing things, but this is the main way it works.

If you haven't already done so, download the Uberfix, install it, and then browse around the files in it.

The main data file we work with is dgdata.zip. It is downloaded to your root Demigods directory whenever there is an update. You'll want to extract out all the files into a subdirectory (not under root Demigods, you want to keep it somewhere else). The files and file structure of dgdata.zip are what we get to work with. Only files that are loaded when a game starts will we be able to change. If we want to change other things it either has to be outside of the files that the executable runs, or we will have to modify the executable.

Demigods is a Peer to Peer game, which means that to enforce anticheating, it checks all the files during play. It also verifies the hash of the dgdata.zip file on startup. To change the hash is actually trivial, you just have to do a search and replace, but that does prevent you from using the mods with others.

In the Uberfix post in the Mods forum is the buglist. I'm the only maintainer for it, but it is pretty complete. Those are the majority of the issues to be addressed.

To enable debugging, you'll need to open the Game.prefs file located (on Windows XP) at c:\Documents and Settings\<user name>\My Documents\My Games\Gas Powered Games\Demigod\Game.prefs and add the following to the end:

debug = {
    enable_debug_facilities = true
}

Save it afterwards.

The most important technique is debugging and testing code is to run demigods in window mode and to enable the cosole with ctrl+F9. This will show the logger and give you some idea of what's going on. You can also restart a game without having to quit it by pressing ctrl+f10. This will not load new files, only ones that you have changed.

Most of the time what we are going to be doing is tracing down functions that aren't working quite right. This will involve finding the function that is breaking and then searching for the functions that it calls or that call it, which may be functioning incorrectly. The best way to do this is via a direct text search of extract dgdata.zip files.

If you haven't setup your OS to do a decent search of text files, you'll need to do that. Google it on and it should provide isntructions.

There is a list of the hotkeys that the debugger allows you to use. I need to dig it up or you can just search the data file to find it. It is fairly self-explanatory, however most of them don't do anything useful.

Demigods uses the Moho Engine, which is the engine used in Supreme Commander. The version that demigods uses is slightly different, however most of the information is very similar. I use Supreme Commander wikis are a technical reference for somethings.

Many of the functions and properties of objects you'll have to learn about via experience. If you have questions, ask away.

I should also send you a copy of the code that someone else wrote that allows for Logging of tables better. Currently the logging options are rather bad, so you'll find it helps.

I think that is a lot of the stuff you'll need to worry about at this point. Sorry if it is a little disjointed. I was trying to get all the information out there quickly.

Reply #154 Top

I'm looking into Lord Erebus's Poisoned Blood Ability. I'd like some second opinions.

When a Lord Erebus drops a Poisoned Blood Potion and a teammate drinks it should it:

  • do damage, deal no damage, or be a normal healing potion?
    • No other ability can deal damage to your teammates (that I can think of)
  • kill or reduce to 1 hitpoint?

If the Lord Erebus manages to kill a teammate with a Poisoned Blood Potion which should occur:

  1. Lord Erebus gets primary credit for killing his teammate and gold/xp
  2. Lord Erebus gets primary credit for killing his teammate, but no gold/xp
  3. Lord Erebus's damage is not recorded and also does not get gold/xp
  4. Poisoned Blood Potions shouldn't be able to do any damage to teammates, hence this is not a valid question

If the Lord Erebus manages to kill himself with a Poisoned Blood Potion, should it be different than killing a teammate?

My personal thoughts are that when a teammate drinks a Poisoned Blood Poition either it shouldn't do any damage, or should function as the potion its rollover describes it to be. Other thoughts?

Reply #155 Top

When a Lord Erebus drops a Poisoned Blood Potion and a teammate drinks it should it:

* do damage, deal no damage, or be a normal healing potion?
o No other ability can deal damage to your teammates (that I can think of)
* kill or reduce to 1 hitpoint?
End of quote

Definitely be a normal potion for team mates. Since you have a Lord Erebus ally, you shouldnt be afraid of him killing you that way. Team mate drinks poison blood = normal potion.

If the Lord Erebus manages to kill a teammate with a Poisoned Blood Potion which should occur:

1. Lord Erebus gets primary credit for killing his teammate and gold/xp
2. Lord Erebus gets primary credit for killing his teammate, but no gold/xp
3. Lord Erebus's damage is not recorded and also does not get gold/xp
4. Poisoned Blood Potions shouldn't be able to do any damage to teammates, hence this is not a valid question
End of quote

Option number 4.

If the Lord Erebus manages to kill himself with a Poisoned Blood Potion, should it be different than killing a teammate?
End of quote

Lord Erebus shouldnt be able to commit suicide, and escape getting killed by the enemy. Right now as it is, you even get gold/xp from killing yourself with your own potion. This shouldnt happen. Erebus drinks his own potion = normal potion heal.

p.s. But if Erebus drinks enemy Erebus's poison blood, it SHOULD do damage to him. This actually might be very difficult to mod, as the game might confuse the 2 potions (your own, or your enemy's).

Reply #156 Top

When a Lord Erebus drops a Poisoned Blood Potion and a teammate drinks it should it:

* do damage, deal no damage, or be a normal healing potion?
o No other ability can deal damage to your teammates (that I can think of)
* kill or reduce to 1 hitpoint?
End of quote

My thought is that poison is still poison (unless your teammates have built up an immunity to iocane powder).  As a result, it should do the same amount of damage.

I don't know, though... the logic gets a little tricky. I guess the main question is should his poison blood be helpful to his teammates... should poison be helpful... I'm pretty much up in the air on this one.

 

Reply #157 Top

Well, we have to becareful that we don't imply real world physics into a game. Just because something is called poison doesn't mean it acts just like real poison. Likewise, we could assume that the Erebus gives his teammates an antidote to his blood so it acts like a healing potion.

In the end this is about balance. Should an Erebus's teammates be penalized for his skill choice? Also recall how infrequently this will make a difference. As long as we remove the ability for the Erebus to farm his own death, it shouldn't make much of a difference.

Reply #158 Top

Progress report

So, I'm still waiting on some feedback on if my Poisoned Blood Fix worked, until then I've been working on Effects that Stop Regen not working.

I think I've found the problem, and because it was hilarious, I'm going to share it with everyone.

The source of the problem comes from how Buffs are applied (which is declared in BuffAffects.lua). Here is the applicable code snippet (with parts resolved).

Code: c++
  1.     local adds = 0
  2. <strong>    local mults = 1.0</strong>
  3.     for k, v in unit.Buffs.Affects[affectType] do
  4.         local def = Buffs[v.BuffName]
  5.         if (not def.WeaponLabel or (def.WeaponLabel == weaponLabel)) and
  6.             (not def.AbilityCategory or Ability[abilityName].AbilityCategory == def.AbilityCategory) then
  7.             if v.Add and v.Add != 0 then
  8.                 adds = adds + (v.Add * v.Count)
  9.             end
  10.             if v.Mult then
  11. <strong>                mults = mults + (v.Mult * v.Count)</strong>
  12.                 if mults &lt; 0 then
  13.                     mults = 0
  14.                 end
  15.             end
  16. ...
  17.     end
  18.     #Adds are calculated first, then the mults.  May want to expand that later.
  19. <strong>    local returnVal = (initialVal + adds) * mults</strong>
  20. end

The important lines are bolded. First, mult is declared as 1. Next we loop through all of the buffs on a unit. For each Buff v, we multiply its effect by the number of instances of that buff on a unit (v.count). We take the base value that is being modified, add to it the additive buffs and then multiply by the multiplicative buffs.

The glitch comes from how multiplicative buffs and buffs that stop regen interact. The effect of stopping health and mana regeneration (in Oculus at least) is created by setting a buff with a Mult = 0.0.

If we run this through the above code, the following happens

 

  1. v.Mult  = 0
  2. local mults = 1.0
  3. mults = mults + (v.Mult * v.Count) => mults = 1 + (0 * v.Counts) => 1!!
  4. local returnVal = (initialVal + adds) * mults => (InitialVal + 0) * 1 => Initial Val

So the effect of having a buff with Mult = 0 is... nothing. It doesn't change anything.

That seems to be the reason why it doesn't work. Now, I'm trying to track this down in other places to see if this is consistent. The problem is I know there are abilities that stop regen, but I can't remember which ones. If I could get help from the crowd, I'd appreciate it. What abilities and items stop regeneration?

Reply #159 Top

One of the biggest problems with the Demigods modding community is that there is
no central depository of information. This results in much of the work being
very redundant. The Stardock forum, the GPG forum, the Supreme Commander Wikis,
and the currently available mods are only methods of transfering this knowledge
from one modder to the next, and they don't tend to be very good about it. In
following I'm going to record how I went about tracking down the Poisoned Blood
problem with Lord Erebus.

The first part in making a mod, or in this case fixing a bug, is to specify the
current behavior, the desired behaviors, and how the two are different. In this
case the problem is:

Lord Erebus possesses an ability that allows him to drop poisoned health potions
when he dies. When a demigod consumes this potion, he loses 750 or 1500 health
instead of healing. If Lord Erebus kills a demigod with this damage, he receives
credit and gold for the kill. However, there is an additional complication. When
a Lord Erebus consumes his own potion, he also gets credit for killing himself.
Likewise, when he kills a teammate, his gets credit.

The problem with this is that this is abuseable and not fair.
It is abuseable because a Lord Erebus can use the potions to farm himself. He
gains 1500 gold every time he commit suicide. By repeatedly committing suicide,
he could gain a huge gold advantage. It is not fair
because a Lord Erebus can kill himself voluntarily by drinking his own potion,
cheating his enemies out of the rewards for killing him. It also penalizes his
own teammates for having him die, in contrast to other demigods which drop a
useful item for their teammates upon death.

The desired behavior would be for the poisoned potions to kill enemies. However,
what effect should the potion have on allies? This is a tougher question that
moves from bugfixing to balancing. The effect of Poisoned Blood drinking is
trivial, the amount of times this will effect games is very small. However, it
does have an effect. The effect from the original Demigods is definitely
incorrect. At this point, I'm going to tentatively say that our goal is to
have the potions be normal potions of healing for the allies of the Lord Erebus
and be normal poisoned blood potions for his enemies. This allows for the
intended effect of hurting his enemies while not poisoning his teammates.

Since I have now defined the effect I'm trying to achieve, I can now try to
impliment the effect. In this case I need to be able to have the Poisoned Blood
Potion have different effects based upon the team that consumes the potion.

To do this, I need to find the code that relates to the Poisoned Blood Ability.

A search of the contents of dgdata.zip reveals the following files contain
"PoisonedBlood":

  • EffectTemplates.lua
  • LootDefinitions.lua
  • PowerUpDefinitions.lua
  • HVAMPIRE_AchievementData.lua
  • HOculus_AIBlueprint.lua
  • HVampire_AIBlueprint.lua
  • HVampire_Abilities.lua
  • HVampire_SkillLayout.lua
  • HVampire_unit.bp


EffectTemplates.lua

This file contains the emmiters or graphics specifications. There are two
effects that are used by Poisoned Blood. The first is when a potion is consumed.
This is the effect:  PoisonedBlood01. The second is the effect that occurs
around a potion while it is on the game playing field: Health02. Effects contain
entries for Small, Medium, Large, and Huge targets to allow different graphics
for each target of the effect. Each entry is further divided between low,
medium, and high. These refer to the level of graphics that are currently being
displayed. This file is of no interest for changing how potions work.

LootDefinitions.lua
This file contains the Blueprints for the Potions. The Poisoned Blood potions
correspond to HVampirePoisonedBlood01 and HVampirePoisonedBlood02. The blueprint
specifies which PowerUp is associated with the item and also contains a weight.
The weight determines how likely a particular type of potion is to be created.
For Poisoned Blood Potions there is only one choice, therefore weight's value is
meaningless. However, it is present because it is referenced by the code that
creates loot drops.

PowerUpDefinitions.lua
This file contains the Blueprints for the Poisoned Blood Potion ability. The
entry resembles that of an item or ability. This entry specifies the
characteristics of the Poisoned Blood Potion. Two versions of the Potion exist,
one each level of the Poisoned Blood Potion. I will now go over the entry for
Poisoned Blood Potion 1 line by line. Poisoned Blood Potion 2 is very similar,
the differences are trivial.

Code: c++
  1. <strong>PowerUpBlueprint</strong> { <em>#Declares the Blueprint name and opens the table</em>
  2.     Name = 'HVampirePoisonedBlood01', <em>#The name of the Powerup Blueprint</em>
  3.     DisplayName = '&lt;LOC ITEM_Powerup_0000&gt;Health I', #The name that is displayed when a player places his cursor on the potion. It references the string_db file using the index ITEM_Powerup_0000. If it fails to find this string, it will use this as a default. The string_db file is used to specify the language used by the game.
  4.     Description = '&lt;LOC ITEM_Powerup_0001&gt;Restores [GetHealth] Health.', #The effect of the item displayed when a player places his cursor on the potion. It also references the string_db file. Note that in this case, the string includes [GetHealth]. GetHealth is a function that is declared in the next line. By defining it and including it in the string, the text display will automatically update to the correct value if the value it references is ever changed. This reduces the amount documentation that must be updated when values are changed. It is used very frequently in the definition of strings.
  5.     GetHealth = function(self) return Buffs['LootHealth01'].Affects.Health.Add end, #This declares the function GetHealth. It defines the function as referencing the value of Affects.Health.Add of the Buff LootHealth01 (the basic healing potion). This is the value that the basic healing potion heals. It then returns this value to whatever function called the function GetHealth. In short, it reports the amount of healing a basic potion does. Note, that in the Poisoned Blood potions case, this is a lie.
  6.     Mesh = '/meshes/items/potions/potion01_mesh', #This is the potion's mesh or model. This is what you see when the potion is on the ground.
  7.     Animation = '/meshes/items/potions/Animations/Potion01_Idle_anim.gr2', #This is the how the potion mesh is animated while on the ground.
  8.     MeshScale = 0.1, #This is a scaling parameter that controls the size of the mesh displayed on screen.
  9.     Effects = 'Health01', #This is the ambiant graphics displayed by a potion on the field.
  10.     EffectsBone = -2, #Bones are specific parts of the mesh that are selected as locations. Typically they are defined and named. In this case, the source is -2. I don't know what this does exactly. However, -1 and -2 are both common values. What I do know is this specifies the origin location for Health01.
  11.     EffectScale = 2, #This scales the size of the effect Health01.
  12.     Audio = { #This opens up the table for the Audio effects
  13.            # Ambient = 'Forge/DEMIGODS/Torch_Bearer/snd_dg_torch_idle_ice_lp',        #PLACEHOLDER  #This is a line from the original templates used in demigods. It is a placeholder and is commented out. It can be removed without any negative effect.
  14.              OnActivate = 'Forge/ITEMS/Lootdrops/snd_item_lootdrops_poisoned', #This specifies a variable, OnActivate and a sound. When a function references the Blueprint, it may look for the Audio effects generated by the item. It may then also look for the OnActivate variable. This variable is referenced when the potion is used (activated), but can also be referenced by other functions. When the function that controls potion activation is called is also references and plays the sound.
  15.         }, #Closes the Audio table
  16.     Buffs = { #Opens the Buff table
  17.         BuffBlueprint { #Open the BuffBlueprint table
  18.             Name = 'HVampirePoisonedBlood01', #The name of the Buff
  19.             Debuff = true, #Is this a debuff? Some abilities render demigods immune to debuffs.
  20.             BuffType = 'POISONEDBLOOD', #This is the type of the Buff. This allows buffs with different names and sources to be treated in similar ways. It allows deals with how buffs stack.
  21.             Stacks = 'ALWAYS', #This combined with BuffType determine stacking behavior. In this case, if a demigod drinks two potions of Poisoned Blood simultaneously. He would take damage from both potions.
  22.             DamageSelf = true, #This is one of the sources of the problem with Poisoned Blood. This line allows the potion to damage the Lord Erebus who drops the potion.
  23.             CanBeEvaded = false, #When a damage effect occurs, some effects can be dodged. Typically only regular melee attacks are dodgeable.
  24.             Affects = { #This opens the affect table for the buff
  25.                 Health = {Add = -750}, #This modifies the Health of the user. In this case, the user gains -750 or takes 750 points of damage.
  26.             }, #close affect table
  27.             Effects = 'PoisonedBlood01', #This defines the effect that occur when the buff is activated.
  28.             EffectsBone = -2, #This is the location of the Effects.
  29.         }, #Close BuffBlueprint
  30.     },#Close Buff
  31. } #Close PowerupBlueprint


HVAMPIRE_AchievementData.lua
This file contains the achievements for each of the demigods and how they are
awarded. Lord Erebus has an achievement for having 50 Poisoned Blood potions
consumed. This file is of no interest for changing how potions work.

HOculus_AIBlueprint.lua
This file contains the AI's ability builds for Oculus. The Oculus builds were built using
the template provided by Lord Erebus. It still contains commented strings that
refer to the template. This file is of no interest for changing how potions work.

HVampire_AIBlueprint.lua
This file contains the AI's ability builds for Lord Erebus. Some builds select
the ability. This file is of no interest for changing how potions work.

HVampire_Abilities.lua
This file contains the abilities for Lord Erebus. The Poisoned Blood ability has
two parts. The first is a passive buff to the regeneration value of Lord Erebus.
The second is a change to the loot drop table of Lord Erebus. When a demigod is
killed an item is selected from this drop table to appear. In this case, the
entire drop table is replaced by Poisoned Blood potions. This means that once a
Lord Erebus takes this ability, all of his death drops will be poisoned potions.
Loot drops are somewhat complicated. The drop table is defined in game.lua. When
a demigod death occurs, LootBlueprints.lua determines what item drops based upon
the weights in lootDefintions.lua.

HVampire_SkillLayout.lua
This file creates the skill layout. It specifies the visual display created when
a demigods skill tree is viewed. This file is of no interest for changing how
potions work.

HVampire_unit.bp
Defines when and how abilities are gained.  This file is of no interest for
changing how potions work.

In the log when a Poisoned Blood Potion kills a demigod the following entry
appears: "info: Time : Kill V0". Doing a search for various parts of this does
not return anything.  (Editor's Note: The origin of this is probably interesting,
 but I never traced it down.)

How a loot drop occurs.

  1. DeathThread (HeroUnit.lua) calls SpawnLoot (HeroUnit.lua).
  2. SpawnLoot performs GetLootTable (HeroUnit.lua) to get the drop table.
  3. GetLootTable returns the LootTable from the Demigod
  4. SpawnLoot gets the Demigod's level.
  5. SpawnLoot calls CreateLoot (LootBlueprints.lua) with a list of loots from
  6. the loot table indexed by the Demigod's level.
  7. CreateLoot selects a loot item from the Items it was given.
  8. CreateLoot calls CreateDroppedItem on the loot item.


Now, one important question, is how does the game known who created the potion.
Looking back upon the code, there is no immediate obvious answer to this question.
However, whenever a Demigod dies to Poisoned Blood Potion, the Lord Erebus gets
the kill and the gold. This suggests that there is information being carried along
with the potion, that isn't obvious. When your investigating a charcter
can select its properties can be seen in game by opening the console and
pressing shift+F7 (I think). However, items are unselectable, so that doesn't work.
The best solution I have is to include LOG comments in functions that are used
by the object. (Editor's Note: Another curious find is that when Lord Erebus is
killed by his own Poisoned Blood potion, the game does not count it as suicide.
However, when a Demigod consumes a potion that gives them -100000 health, it is
counted as a suicide. This is interesting, but I haven't check out why it occurs)

In this case, we have another lead. This lead comes from the awarding of credit
for kills. This requires tracing what happens when demigods die. There are
(at least) three places that contain this information.
DeathThread (heroUtil.lua) is the function that deals with removing the demigod.
ForgeUnit.lua contains the damage and death functions
Conquest.lua contains the rewards for killing units and heros.

It seems that the Poisoned Blood potion may be bring along an instigator field.
This would explain how the Poisoned Blood potion credits the Lord Erebus.

Given this information, the route I chose to fix the problem was to used nested
buffs. The declaration for the effect of the Poisoned Blood potion is in the
PowerUpBlueprints. PowerUps do not have all of the inbuilt functions that Buffs
have. It would be more elegant to add features to PowerUps, however with the
UberFix I'm trying to avoid changing things too drastically. The feature that
I am looking for would be called OnApplyPowerUp. However, since it doesn't
exist, I'm going to use Buffs.

The nest Buff solution is to apply the initial buff and then have that buff
apply a new buff. The first buff will do nothing besides specify the second
buff. First I'm going to show you the completed code, then I'll discuss it in
more detail.


Code: c++
  1. PowerUpBlueprint {
  2.     Name = 'HVampirePoisonedBlood01',
  3.     DisplayName = '&lt;LOC ITEM_Powerup_0000&gt;Health I',
  4.     Description = '&lt;LOC ITEM_Powerup_0001&gt;Restores [GetHealth] Health.',
  5.     GetHealth = function(self) return Buffs['LootHealth01'].Affects.Health.Add end,
  6.     Mesh = '/meshes/items/potions/potion01_mesh',
  7.     Animation = '/meshes/items/potions/Animations/Potion01_Idle_anim.gr2',
  8.     MeshScale = 0.1,
  9.     Effects = 'Health01',
  10.     EffectsBone = -2,
  11.     EffectScale = 2,
  12.     Audio = {
  13.            # Ambient = 'Forge/DEMIGODS/Torch_Bearer/snd_dg_torch_idle_ice_lp',        #PLACEHOLDER
  14.              OnActivate = 'Forge/ITEMS/Lootdrops/snd_item_lootdrops_poisoned',
  15.         },
  16.     Buffs = {
  17.         BuffBlueprint {
  18.             Name = 'HVampirePoisonedBlood01',
  19.             Debuff = false,
  20.             BuffType = 'POISONEDBLOOD',
  21.             Stacks = 'ALWAYS',
  22.             Affects = {
  23.                 Health = {Add = 0},
  24.             },
  25.             OnApplyBuff = function(self, unit, instigator)
  26.             if IsEnemy( unit:GetArmy(), instigator:GetArmy()) then
  27.                 #LOG("IsEnemy")
  28.                     Buff.ApplyBuff( unit, 'HVampirePoisonedBlood01Damage', instigator )
  29.                 else
  30.                 #LOG("IsFriend")
  31.                     Buff.ApplyBuff( unit, 'HVampirePoisonedBlood01Heal', instigator )
  32.                 end
  33.             end,
  34.         },
  35.     },
  36. }
  37. BuffBlueprint {
  38.     Name = 'HVampirePoisonedBlood01Damage',
  39.     Debuff = true,
  40.     BuffType = 'POISONEDBLOOD',
  41.     Stacks = 'ALWAYS',
  42.     DamageSelf = false,
  43.     CanBeEvaded = false,
  44.     DamageFriendly = false,
  45.     cancrit = false,
  46.     Affects = {
  47.         Health = {Add = -750},
  48.     },
  49.     Effects = 'PoisonedBlood01',
  50.     EffectsBone = -1,
  51. }
  52. BuffBlueprint {
  53.     Name = 'HVampirePoisonedBlood01Heal',
  54.     Debuff = false,
  55.     BuffType = 'POISONEDBLOOD',
  56.     Stacks = 'ALWAYS',
  57.     DamageSelf = true,
  58.     CanBeEvaded = false,
  59.     cancrit = false,
  60.     DamageFriendly = true,
  61.     Affects = {
  62.         Health = {Add = 750},
  63.     },
  64.     Effects = 'Heal02',
  65.     EffectsBone = -1,
  66. }

There are two features of note in this code. The first is the OnApplyBuff function. This function allows for other functions to occur when the buff is first applied to the target. There is another counterpart function, OnBuffAffect. I believe this occurs each time the buff pulses. (Editor's Note: Buffs can be set to pulse every X seconds. When this occurs a specific effect occurs. This is displayed in abilities like Lord Erebus's Vampire Creation Aura and the Queen of Thorn's Compost Aura).

The first buff, HVampirePoisonedBlood01, when applied checks to see if the
consumer of the potion (unit) is a teammate of the Erebus who dropped the
potion (instigator). If it is an ally, the HVampirePoisonedBlood01Heal buff is
applied. If it is an enemy, the HVampirePoisonedBlood01Damage is applied.

The only other tricky part is:
            Affects = {
                Health = {Add = 0},
            },
Looking at the code, you should note that it doesn't do anything. In fact, the
Buff code terminates early because there the value is 0. However, this snippet
is important for the AI. To detect and use potions, the AI relies on the
PowerUpBlueprint having a buff that contains an affectType (Health, Energy, etc)
and an Add or Mult value. In moving to a nested buff solution I removed this
line from the Buff declared in the PowerUpBlueprint. I couldn't move the
secondary buffs into the PowerUpBlueprint because they would then all be
performed when the PowerUp was activated. (Editor's Note: Credit goes to Peppe
for helping me figure out this part). In this snippet is not present, the AI
will ignore the Poisoned Blood potions.

That should be about it. If you have questions or suggestions on how to make all
of this more clear, please post them. Hopefully we can start making more
tutorials and editorials on how the LUA in Demigods works.

Reply #160 Top

goodness... i've got some reading to do...

 

Reply #161 Top

Update: Torch Bearer Fireball Slow Down Bug

Teseer reported that the Torch Bearer occasionally has Fireballs that are very slow. I tried to replicate this a number of ways and I was only able to reproduce it in one way. However, I think this might explain his observations.

When a target teleports after a fireball is in flight, the target seeking features of the Fireball activate. In the Fireball's projectile file there was no acceleration. This means that as long as the fireball was headed in the generally correct direction, there wasn't a problem. However if the target teleports to a location that requires the fireball to drastically change its heading, the fireball slowed down because it couldn't accelerate in the correct direction (very quickly at least, it still does, but it is a small value). If Teseer was playing against players with very fast movement speeds or that teleported (Bat Swarm, Cloak of the Night, Demon Assassin or Teleport Scroll), this behavior should be reproduced.

To fix the problem I added Acceleration and MaxSpeed to the Fireball03_proj.bp (which is the fireball currently used in the game for the Torch Bearer's Fireball).

If Teseer or anyone wants to test this to confirm, here is a link to a test mod that contains the Fix. It changes Fireball 1 to have a longer range and shorter cooldown so you can test it more easily. It also contains a modified Scale Helm which adds viewing distance to make sniping it easier. (It also contains a few other bits and pieces which aren't really important, leftovers really).

Also, does anyone have any experience with how often the Torch Bearer's regular attack misses? I was toying around with him today and occasionally his projectile would display the same problems as his Fireball ability. I wasn't sure if this is an issue or not.

Reply #162 Top

Since I've been spamming the thread today, I might as well throw this in as well.

After working on the Poisoned Blood Ability I've come to the conclusion that suicide abilities are probably not intended. Lord Erebus's wasn't coded very well. The only other ability that allows you to do so is the Unclean Beast's Ooze. Ooze is also more likely to be done accidentally or out of spite. I don't think this is an intended behavior. So, I'm going to make Unclean Beast automatically come out of Ooze when low on life. If anyone has any strong objections, make your opinion known and provide a reasonable rational for your opinion.

Reply #163 Top

I really dug the in depth walk through.  Good read.  Thanks for posting.

Reply #164 Top

Quoting Ptarth, reply 162
Since I've been spamming the thread today, I might as well throw this in as well.

After working on the Poisoned Blood Ability I've come to the conclusion that suicide abilities are probably not intended. Lord Erebus's wasn't coded very well. The only other ability that allows you to do so is the Unclean Beast's Ooze. Ooze is also more likely to be done accidentally or out of spite. I don't think this is an intended behavior. So, I'm going to make Unclean Beast automatically come out of Ooze when low on life. If anyone has any strong objections, make your opinion known and provide a reasonable rational for your opinion.
End of Ptarth's quote

I think that UB's suicide is on purpose.

I remember checking the code about it in the past, and I found the neccessary code required for a suicide. While Erebus's suicide on the other hand is accidental. It just counts in all Demigods (including himself) able to be killed by the poison.

And UB's suicide has a message on the screen too, so it is definitely intentional.

UB - ooze: "pacov has suicided"

Erebus - poisoned blood: "pacov has killed pacov (+1000 Gold)"

Reply #165 Top

The suicide code is generic to all demigods. It occurs whenever the instigator is the same as the unit that dies. I'm not sure why it doesn't fire when a poisoned blood potion takes effect.

Here is the snippet from conquest.lua that is relevant.

Code: c++
  1. local killAnnouncement = ''
  2.     if hero == hero.KillData.Instigator then
  3.         print(LOCF('&lt;LOC conq_0004&gt;%s just suicided', heroNick))
  4.     elseif instBrain.Conquest then
  5.         if instBrain.Conquest.IsTeamArmy then
  6.             killAnnouncement = (LOCF('&lt;LOC conq_0005&gt;%s killed %s', instBrain.Conquest.TeamName, heroNick))
  7.         elseif instBrain.Conquest.TeamArmy then
  8.             local killer = hero.KillData.Instigator
  9.             local instNick = instBrain.Nickname
  10.             # Calculate the reward here
  11.             local reward = Game.CalculateHeroKillGold(killer, hero)
  12.             reward = reward * (hero.BountyGivenMod or 1) * (killer.BountyRecievedMod or 1)
  13.             instBrain:GiveResource('Gold', reward, 'Bounty')
  14.             # Announce killer and reward
  15.             killAnnouncement = LOCF('&lt;LOC conq_0006&gt;%s killed %s (+%d gold)', instNick, heroNick, reward)
  16.             if killer:GetArmy() == GetFocusArmy() then
  17.                 local VOTag = 'KillHero_' .. hero:GetUnitId()
  18.                 LOG ( "KILL VO : [".. VOTag .. "]" )
  19.                 if killer.Character.CharBP.VO[VOTag] and killer.Character.CharBP.VO[VOTag].Sound then
  20.                     killer:PlaySound(killer.Character.CharBP.VO[VOTag].Sound)
  21.                 elseif killer.Character.CharBP.VO['KillHero_Generic'] then
  22.                     killer:PlaySound(killer.Character.CharBP.VO['KillHero_Generic'].Sound)
  23.                 end
  24.             end
  25.         end

Reply #166 Top

:omg: :omg: :omg: I never checked these lines, LOL :grin:

Then yes, you are correct (even though this is reeeeeeeeaaally strange that this happens only with UB, and not with erebus)

The only thing I can think of, is that it was probably meant to do more than just commit suicide with only UB demigod, because the game had 2 other game modes, from what I know of, 1 was Capture the Flag, and the other was something with chest treasures (something like that), but they were removed before release, so my guess is that it was meant for something else, but they left it still active for some reason.

Reply #167 Top

Update: Ooze

Well, I feel reather stupid today for two reasons.

1. When merging blueprints the statement is:

  • Merge = true,

On the other hand if you use:

  • merge = true,

Demigods will infinite loop with a message reporting it failed to find the correct mesh for the modified unit.

So remember kids, table keys are case sensitive.

2. When trying to figure out if an ability has an intended effect, check the code first.

Looking at the Ooze code, it actually possesses the correct code to kick the Unclean Beast out of Ooze when low on life. There are two problems with it though.

  1. The Ooze exit check takes 1 tick to perform, that means you'll take an extra hit of damage. Combined with taking damage before the last tick, you can then experience the suicide effect.
  2. Like Mist Form, the ability exit check has a hardcoded cutoffs. Also like Mist Form the cost of the ability was changed, but check was not updated to reflect this change.

On the bright side this clears up any debate about the issue, it is obviously a bug. If you want proof but don't want to look at the code yourself, try committing suicide with Ooze 1 (outside of combat). You can't do it. You'll get down to 100 health. The check will kick in and you will end up with around 64 hp.

For those who are interested in the code, here is the original and below it is my fix for Ooze 4.

Code: c++
  1.     OnAuraPulse = function(self, unit, params)
  2.         if unit.AbilityData.OozeOn then
  3.             Buff.ApplyBuff(unit, 'HEPA01OozeSelf04', unit)
  4.             if unit:GetHealth() &lt; 100 then
  5.                 local params = { AbilityName = 'HEPA01OozeOff'}
  6.                 Abil.HandleAbility(unit, params)
  7.             end
  8.         end
  9.     end,

Code: c++
  1.     OnAuraPulse = function(self, unit, params)
  2.         if unit.AbilityData.OozeOn then
  3.             if unit:GetHealth() &lt; 100 then
  4.                 local params = { AbilityName = 'HEPA01OozeOff'}
  5.                 Abil.HandleAbility(unit, params)
  6.             else
  7.                 Buff.ApplyBuff(unit, 'HEPA01OozeSelf04', unit)
  8.             end
  9.         end
  10.     end,

As you can see, I made a couple of changes. First, I move the Buff.ApplyBuff (which causes the damage) down and inside the if statement. If the Unclean Beast fails the health check, then and only then is the Buff.ApplyBuff ran. In contrast in the original version the check was made AFTER that Buff was applied. This is what caused the 1 extra tick effect to occur.

Reply #168 Top

Good point, but then why there is the message "xxxx has suicided" ?

Is my assumption correct, that it was left from maybe a different game mode or something? :|

Reply #169 Top

My guess would be that it is a coincidence.

Consider this, the person who wrote the death code is most likely not the person who wrote the Demigod Abilities code, especially the Unclean Beast's code. What I would expect is that whomever wrote the death code added it in as a possible outcome, without knowing if there was an ability that would trigger it. It would be the same for someone who was writing the healing effects. You wouldn't write one just to add health and stop. You would add one that can handle health, energy, etc.

Reply #170 Top

Quoting Ptarth, reply 169
My guess would be that it is a coincidence.

Consider this, the person who wrote the death code is most likely not the person who wrote the Demigod Abilities code, especially the Unclean Beast's code. What I would expect is that whomever wrote the death code added it in as a possible outcome, without knowing if there was an ability that would trigger it. It would be the same for someone who was writing the healing effects. You wouldn't write one just to add health and stop. You would add one that can handle health, energy, etc.
End of Ptarth's quote

Yeah that makes sense.

But this isnt very professional on GPG's behalf isnt it? :\

Reply #171 Top

I'm not sure I can back you up on that claim.

First, I'm not a professional programmer, so I'm probably not qualified to have an opinion on the subject. However, ignoring that, it doesn't seem to unreasonable for this sort of random occurence. The individual steps leading up to all of these are reasonable. It makes sense to code the contingency for a demigod killing itself and giving it a different message. It makes sense that the person who originally wrote the Ooze code to have written it the way they did. It also makes sense for the person who balanced the Ooze ability to not consider the possibility that the Ooze could lead to suicides in rare cases.

Looking at it from a bug perspective, it is a very minor flaw. The frequency of the event is tiny, it requires a UB near death to have Ooze on. Likewise, no one really was convinced it was a bug until I got around to looking at the code just recently. Given that it has escaped notice for this long, I willing to say that it wasn't something that we should criticize GPG's professional skills for.

Reply #173 Top

So, back on page 5 TrouserSnake69 suggested that Oculus's Sacrifice skill didn't work. However, not one verified or agreed with him, nor did he sound confident he was correct. It turns out that not only is he correct, he also found a potentially huge bug.

The problem is how Demigods treats the NOT statement. Typically NOT is used to indicate the presence of a variable, here is an example:

Code: c++
  1. if not data.Radius  then
  2.         error('MetaImpact Radius &lt;=0')
  3.     end

In this case, IF data.Radius lacks a value then an error is reported.

However, in Sacrifice the following is used:

Code: c++
  1. if IsAlly(unit:GetArmy(), v:GetArmy()) and not unit == v then
  2.                     DealDamage(data, v)
  3. end

The intent of this code was to check to see if Entity V is an Ally of Unit and is also not the same as Unit. If both of these are true, then heal the unit (data is a negative number so it is a heal). Notice that NOT is supposed to apply to the outcome of (unit == v).

However, if we verify this using a True Table. We find something troublesome and interesting. By including a log statement in the previous code snippet I generated the following table.

Code: c++
  1.            for k, v in entities do
  2.             LOG(k, unit:GetArmy(), v:GetArmy(), IsAlly(unit:GetArmy(), v:GetArmy()),not unit == v, not(unit == v))
  3.                 if IsAlly(unit:GetArmy(), v:GetArmy()) and not unit == v then
  4.                     DealDamage(data, v)
  5.                     end
  6.                 end
  7.             end

 

Unit Oculus Team Unit Team isAlly(Oculus,Unit) not Oculus == unit not(Oculus == unit)
1 1 6 TRUE FALSE TRUE
2 1 1 TRUE FALSE FALSE
3 1 6 TRUE FALSE TRUE
4 1 6 TRUE FALSE TRUE
5 1 6 TRUE FALSE TRUE
6 1 6 TRUE FALSE TRUE
7 1 7 FALSE FALSE TRUE
8 1 7 FALSE FALSE TRUE
9 1 7 FALSE FALSE TRUE
10 1 7 FALSE FALSE TRUE
11 1 7 FALSE FALSE TRUE

We find that NOT (X == Y) is not the same as NOT X ==Y. (This is seen in the last two columns).

NOT X == Y only confirms if X has a value. NOT (X == Y) does the check that we want.

This broke Sacrfice because NOT Unit == V was always FALSE, so the heal effect never occured. (Since Unit always exists, NOT Unit is always FALSE).

Why is this so troublesome? Well, NOT X==Y being the same as NOT (X == Y) is pretty standard in programming language. Its absence is unexpected. This means that there may be additional effects in the code where the writers intended NOT (X == Y), but wrote NOT X == Y. This should be verified, and that's a lot of work.

Also, I fixed Sacrifice.

 

Reply #174 Top

Here is the contents of DefaultKeyMap.lua. This is a useful resource for new modders, especially if you keep forgetting what file it is in.

    ['Esc']                 = 'escape',

    ['F10']                 = 'options_menu',

    ['Pageup']              = 'chat_page_up',
    ['Pagedown']            = 'chat_page_down',
    ['Shift-Pageup']        = 'chat_line_up',
    ['Shift-Pagedown']      = 'chat_line_down',

    ['NumSlash']            = 'show_frametime',

    ['W']                   = 'pan_up',
    ['A']                   = 'pan_left',
    ['S']                   = 'pan_down',
    ['D']                   = 'pan_right',
    ['Q']                   = 'rotate_left',
    ['E']                   = 'rotate_right',

    ['Space']               = 'cam_free',

    ['Ctrl']                = 'restrict_selection_to_demigods',     # This is a dummy entry for the keybinds page, can't actually be bound to a function
}

defaultUserKeyMap = {
    ['K']                   = 'show_skills',
    ['C']                   = 'show_player_stats',

    ['1']                   = 'use_ability_1',
    ['2']                   = 'use_ability_2',
    ['3']                   = 'use_ability_3',
    ['4']                   = 'use_ability_4',
    ['5']                   = 'use_summon_1',
    ['6']                   = 'use_summon_2',
    ['7']                   = 'use_summon_3',
    ['8']                   = 'control_minions_soldiers',
    ['9']                   = 'control_minions_archers',
    ['0']                   = 'control_minions_priests',
    ['I']                   = 'control_minions_special',
    ['M']                   = 'control_minions_all',
    ['N']                   = 'control_minions_allplushero',
    ['O']                   = 'control_minions_regroup',
    ['H']                   = 'control_demigod',

    ['F1']                  = 'use_inventory_1',
    ['F2']                  = 'use_inventory_2',
    ['F3']                  = 'use_inventory_3',
    ['F4']                  = 'use_achievement',

    ['W']                   = 'pan_up',
    ['A']                   = 'pan_left',
    ['S']                   = 'pan_down',
    ['D']                   = 'pan_right',
    ['Q']                   = 'rotate_left',
    ['E']                   = 'rotate_right',
    ['equals']              = 'zoom_in',
    ['minus']               = 'zoom_out',
    ['T']                   = 'track_unit',
    ['Backspace']           = 'reset_camera',
    ['Space']               = 'cam_free',

    ['Tab']                 = 'toggle_score',
    ['Tilde']               = 'cycle_lifebars',
    ['P']                   = 'ping_alert',
    #['Pause']               = 'pause',
    ['PrintScreen']         = 'cap_frame',

    ['F12']                 = 'toggle_team_color',
    ['Ctrl']                = 'restrict_selection_to_demigods',     # This is a dummy entry for the keybinds page, can't actually be bound to a function

    ['NumMinus']            = 'decrease_game_speed',
    ['NumPlus']             = 'increase_game_speed',
    ['NumStar']             = 'reset_game_speed',
    ['F9']                  = 'debug_toggle_log_window',
}

debugKeyMap = {
    ['Ctrl-L']              = 'debug_output_logs',
    ['Ctrl-A']              = 'debug_achievements',
    ['Ctrl-Alt-P']          = 'debug_navpath',
    ['Alt-F2']              = 'debug_create_unit',
    ['Alt-T']               = 'debug_teleport',
    ['Alt-A']               = 'debug_run_opponent_AI',
    ['Ctrl-Alt-B']          = 'debug_blingbling',
    ['Alt-Delete']          = 'debug_destroy_units',

    ['Ctrl-Alt-Comma']      = 'debug_graphics_fidelity_0',
    ['Ctrl-Alt-Period']     = 'debug_graphics_fidelity_1',
    ['Ctrl-Alt-Slash']      = 'debug_graphics_fidelity_2',
    ['Ctrl-Alt-M']          = 'debug_toggle_ren_environment',

    ['Alt-F3']              = 'debug_scenario_method_f3',
    ['Shift-F3']            = 'debug_scenario_method_shift_f3',
    ['Ctrl-F3']             = 'debug_scenario_method_ctrl_f3',
    ['Shift-F4']            = 'debug_scenario_method_shift_f4',
    ['Ctrl-F4']             = 'debug_scenario_method_ctrl_f4',
    ['Ctrl-Alt-F4']         = 'debug_scenario_method_ctrl_alt_f3',
    ['Ctrl-Shift-F4']       = 'debug_scenario_method_f4',
    ['Ctrl-Shift-F5']       = 'debug_scenario_method_f5',
    ['Shift-F5']            = 'debug_scenario_method_shift_f5',
    ['Ctrl-F5']             = 'debug_scenario_method_ctrl_f5',
    ['Ctrl-Alt-F5']         = 'debug_scenario_method_ctrl_alt_f5',

    ['Shift-F6']            = 'debug_create_entity',
    ['Shift-F7']            = 'debug_show_stats',
    ['Shift-F8']            = 'debug_show_army_stats',
    ['Shift-F9']            = 'debug_show_cvp_stats',
    ['Alt-F9']              = 'debug_open_lua_debugger',
    ['Alt-F11']             = 'debug_show_frame_stats',
    ['Ctrl-Alt-W']          = 'debug_render_wireframe',
    ['Ctrl-Shift-W']        = 'debug_weapons',
    ['Ctrl-Alt-O']          = 'debug_grid',
    ['Alt-Q']               = 'debug_show_focus_ui_control',
    ['Alt-W']               = 'debug_dump_focus_ui_control',
    ['Alt-D']               = 'debug_dump_ui_controls',
    ['Alt-V']               = 'debug_skeletons',
    ['Alt-B']               = 'debug_bones',

    ['Ctrl-Shift-X']        = 'debug_redo_console_command',
    ['Ctrl-Shift-C']        = 'debug_copy_units',
    ['Ctrl-Shift-V']        = 'debug_paste_units',
    ['Alt-C']               = 'debug_cam_zoom_near',

    ['Alt-N']               = 'debug_nodamage',
    ['Ctrl-Alt-E']          = 'debug_show_emitter_window',
    ['Ctrl-Alt-R']          = 'debug_reload_effect_templates',
    ['Ctrl-Alt-Shift-R']    = 'debug_reload_effect_utilities',
    ['Ctrl-Alt-Z']          = 'debug_sally_shears',
    ['Ctrl-Shift-Alt-C']    = 'debug_collision',
    ['Ctrl-Slash']          = 'debug_pause_single_step',
    ['Ctrl-F10']            = 'debug_restart_session',

    ['Alt-F']               = 'set_level_25',
    ['Alt-G']               = 'give_all_skills',

    ['Ctrl-U']              = 'debug_ui',
    ['Ctrl-Shift-Alt-D']    = 'debug_damage',
    ['Ctrl-Shift-U']        = 'debug_dump_frames',

    ['Ctrl-Shift-E']        = 'debug_erics_ring',

    ['Ctrl-NumMinus']       = 'debug_corpse_delay_decrease',
    ['Ctrl-NumPlus']        = 'debug_corpse_delay_increase',

    ['Ctrl-K']              = 'suicide',

    ['NumMinus']            = 'decrease_game_speed',
    ['NumPlus']             = 'increase_game_speed',
    ['NumStar']             = 'reset_game_speed',
    ['Ctrl-Alt-Shift-P']    = 'pause',
}

Reply #175 Top

ptarth - debating about the release of 1.02 instead of keeping with 1.01 for the tourney.  Is there anything you are working on atm that you were thinking of rolling into 1.02 or could you go live with 1.02 (as a beta initially) with what's listed in your changlog currently? 

Hmm... if its good to go in your opinion, please release 1.02 as a beta asap and link to it in the op.  I'll get people using it asap then.