-
Posts
118 -
Joined
-
Last visited
Everything posted by SteelRook
-
I've been messing around with making base-game class duplicates of the Resistance Hero classes (Reapers, Skirmishers, Templars), and it's not really working. I'm successfully able to handle ability distribution, armour-and-weapon assignment and so on, but I can't get the skills unique to the new classes to work on the old ones. http://steamcommunity.com/sharedfiles/filedetails/?id=1129907423 The above is my attempt to use the Skirmisher ability Justice on a non-skirmisher class, and it just doesn't work. I know the character rig can handle the animation because Skirmishers use the vanilla character rig, so why can't it animate Justice? If I can create a base-game class and give it Psi Operative Mindspin, then why can't I do the same with Justice?
-
To make a long story shot, I'm trying to replace the "enemies take 33% more damage" aspect of Templar Amplify with the same "+2 damage from every attack received" effect from Demolitionist Rupture. In theory this would be simple as Rupture (technically, BulletShred) is just another aspect of the X2Effect_ApplyWeaponDamage class. However, attaching an object of that class causes the ability to deal the damage of the weapon it's attached to. The X2Effect_ApplyWeaponDamage object's "damage" statistic is only bonus damage on top of that. Setting it to 0 doesn't prevent the ability from dealing damage. So, is there any way I can make Templar Amplify rupture without dealing damage?
-
How does one update mods to War of the Chosen?
SteelRook replied to SteelRook's topic in XCOM's XCOM 2
Not quite what I had in mind, but I did run into this problem as well later on. Thank you kindly. -
How does one update mods to War of the Chosen?
SteelRook replied to SteelRook's topic in XCOM's XCOM 2
Since posting this, I found out that there's a brand new SDK which will supposedly do this this for us. The trouble is I can't get it running. "Can't find one or more components." I was hoping I could use that to "recompile" my own mods, but it looks like that's not going to happen. -
War of the Chosen just dropped, and it's a mod-pocalypse. Turns out they're not handling it like previous DLCs, but rather as a whole separate game with its own executable, config files and so on. The new launcher even has an option to display which mods will be compatible with War of the Chosen and which won't be. This leads me to suspect there's something about mods that's specific to War of the Chosen - something simple that the launcher can check for. Do we have any idea what that might be yet? The only mod I'm subscribed to which got updated to War of the Chosen was the Mod Options Menu, and that's displaying as OK in the launcher, but everything else has an exclamation point next to it. I had a look at the Mod Options Menu but I can't find anything specific to it. So... What do we need to do in order to update our mods? What, specifically, when it doesn't seem like even ModBuddy itself has been updated.
-
This will probably come across as a very simplistic question, but... How would one go about editing XCOM 2's loot tables? Say for instance I don't like how rare Repaeters are and want to make all weapon mods drop with the same rate? Here's what I know so far: Loot tables live in DefaultGameCore.ini, specifically in [XComGame.X2LootTableManager]. There are six loot tables I'm interested in when it comes to weapon mods - BasicWeaponUpgrades, AdvancedWeaponUpgrades, SuperiorWeaponUpgrades, as well as BlackMarketUpgrades_01, BlackMarketUpgrades_02, BlackMarketUpgrades_03. Each element in these tables represents one weapon mod and carries several parameters - Chance, MinCount, MaxCount, TemplateName, RollGroup. I can assume that TemplateName is the system name for the weapon mod and looking at the other tables suggests that MinCount and MaxCount define how many of that item I'm likely to get in a single drop - 1/1 for weapon mods, obviously. That's where my knowledge ends and my questions begin, however. 1. What does "chance" actually do? I know it defines the likelihood of getting that specific weapon mod every time the game rolls on a table, but based on what? It's not % chance since the numbers don't always add up to 100. Does the game combine the chance value and roll on the sum? Does chance 30 out of 150 come out to 20% (30/150 = 0.2)? I ask, because I remember looking at Insanity in the past, and the way that weighed the list of potential outcomes was weird in the extreme. 2. What's "RollGroup?" I can't really infer the meaning of this thing from looking at the code. I can see that mods are grouped somewhat "logically" in their RollGroups - one's for scopes, one's for ammo, one's for damage - but I can't glean the same rationale from any of the other tables. I suspect this affects drop chances, however, so it seems important to know. 3. How do I alter one of these drop tables? Each line starts with LootTables = (<some table>). I'm admittedly rusty on UnrealScript since last time I messed with mods, but I'm not familiar with this command at all. Is this appending a new row to a table? Does that mean I'll have to in some way remove rows from the table? Or is it enough to do a basic ini file edit with -LootTables = (<old values>) and +LootTables = (<new values>)? I have no way to actually verify loot tables that I'm aware of, so that sort of thing is useful to know. 4. Is there a good way to check that the values I'm trying to change have actually been changed to the correct ones? In the past, I've changed stats which the game already displays - damage, armour penetration, resource cost and so on. I have no easy in-game way of verifying drop tables, however. Is there an easy way to do this? --- Sorry for the long and wordy post for such a simple question, folks. I tried to do as much of the legwork as I could on my own. Thank you for your time.
-
Actually, I take that back. I've not been able to get OnPostTemplatesCreated to work at all. It doesn't seem to trigger at any point. I put a log message in there which never shows up anywhere whatsoever. I may be checking the wrong longs (XCOM 2 SDK\XComGame\logs\Launch.log) and crucially - the changes I'm trying to make don't work. This is caused by an issue I've had before, where trying to read from configuration files when extending a class which already reads from those configuration files doesn't seem to work, and gives me no feedback as to what's going on. *edit* Never mind, figured it out. I was trying to use ini files wrong, so my value for Rupture wasn't being used, which I think caused the whole method to throw a silent exception and the template to never be finished. Now it works, and all I did was extend X2Ability_Gatekeeper. My new ability overrode the Vanilla one by itself, so now my Gatekeepers will do 2-4 damage with their mass resurrection AoE, but will shred soldiers (and Aliens and Advent) caught in the blast for 2. Cool.
-
prowler83 explained to me how to use the OnPostTemplatesCreated method and how to reach the template for an item I'm looking for. The thing is that supposing I reach the 'AnimaInversion' ability's template, I'm not sure how to reach its X2Effect_ApplyWeaponDamage effect, which is what I need to add psychic damage to. The ability template is an object of class X2AbilityTemplate and the AddMultiTargetEffect() function adds an effect into an array called AbilityMultiTargetEffects in the template. That array is protected, meaning I can't access it directly unless my class extends X2AbilityTemplate, which X2DownloadableContentInfo_<class name> (where OnPostTemplatesCreated) doesn't. Normally there'd be a "getter" function for either the entire array or specific elements from it, but there isn't one that I can find. Basically, assuming I can find the X2AbilityTemplate of the Mass Resurrection skill, how can I "get" its AbilityMultiTargetEffects array? Once I have that, the rest should be easy. It looks like there's only one multi-target effect for that skill, so I can just draw member 0 from the array and add Rupture damage to it. Now, I presume the above will work like it would in Java where all objects references are inherently pointers. What I mean is if I draw a member from an array and alter it (add an extra damage component), the member still inside the array will also be altered since both would just be references pointing to the same object. I still have nightmares from doing C++ back in the day and having to manually specify *memory_address and &object_pointer. Incidentally, I managed to get this working through a very, very thuggish approach. I created a class which extends X2Ability_Gatekeeper and overwrites its CreateMassPsiReanimationAbility() function. XCOM 2 appears to search for classes in that inheritance tree and creates objects from them without my input. For some reason - and this may well be unreliable - modded objects which extend ability classes end up taking priority over base-game objects of the same kind, so the mod technically works. Now I COULD use OnPostTemplatesCreated to find the ability template itself in the template manager, but I'd still need a child of X2Ability_Gatekeeper or something else that's going to get pulled into the lists at run-time, which seems to do the same thing. Basically, it works for now, but I don't think that's a good way of doing it.
-
Wait, so Ruprture is permanent? That's... Not what I was expecting to hear, but it does make sense the way you've described it. That concerns me a little, if that's the case. Suppose Gatekeepr AoE only did 2-4 damage but ruptured all targets in range. That can potentially rupture your entire squad and do even more damage to them long-term than the standard Mass Resurrection AoE. If I'm reading this correctly, then Rupture (technically) adds "rupture points" onto a target, which then get added to any damage that target receives from that point on. From looking at the Grenadier code, it... Sort of looks like all I'd need to do is grab the Gatekeeper damage effect and append WeaponDamageEffect.EffectDamageValue.Rupture = <shred value> to it - literally one added line of code. I mean from your description, it sounds like it's literally as simple as that since the weapon damage effect is already part of the skill. That's... A lot simpler than I was expecting, but it gives me something to go on :) That still leaves the question of how to overwrite or append the ability, however. I found the RiftKeeper (turns out it's one word) mod, but that adds an entire new enemy, rather than replacing existing enemy skills. I was given an interesting approach to modding skills at runtime in another thread which I can probably use here, but that's predicated on there being just one copy of that skill. Do alien skills get replicated for all difficulty settings like weapons do, or do their templates exist as a single instance of the ability template? Because if the latter is the case, I can just pull out reanimation ability by its ability name ('AnimaInversion' if I'm not mistaken), access its PsiDamageEffect... Though I'm not entirely positive how that might work. The effect is added via the AddMultiTargetEffect() method, meaning it's adding something to an array that I'd then need to fish effects out of, and THOSE don't seem to be identified by a unique name. I mean worse come to worst, I can probably just create another instance of the Mass Reanimation ability with the same name, which SOMETIMES manages to overwrite the existing ability at start-up, but that would mean copy-pasting the entire body of code to add one line.
-
Gatekeepers are pure cheese and I hate them for it. That massive unavoidable AoE means either you kill the Gatekeeper on its own turn or you're losing soldiers, which makes for uninspired gameplay in my eyes. At the very least for my own game, I want to drop the Gatekeeper's damage on the Mass Reanimation attack considerably, down to something like 2-4. The problem with that is it basically takes the teeth out of the unit all but entirely, so I'd need to add something back. So... How about Shred? I tracked the ability itself down to X2Ability_Gatekeeper in its own CreateMassPsiReanimationAbility() function. So far, so good. I figured I could copy the design of either Schism (which is just a check to enable additional effects in Insanity and Void Rift) or Rupture (which seems to be called Bullet Shred in the game files). This faces me with several problems, however. And yes, this one I do fully intend to finish, unlike the Death From Above thing :) Problem #1: I don't actually know how "rupture" works. I haven't the slightest idea how Schism manages to "rupture" targets since all it seems to do is apply weapon damage via the standard X2Effect_ApplyWeaponDamage. class. Bullet Shred, aka Rupture, does use its own custom X2Effect_Shredder class which inherits X2Effect_ApplyWeaponDamage, but I'm not sure how that works. All it does is override the GetBonusEffectDamageValue function in that class which... What does that do? From everything I understand of X2Effect_ApplyWeaponDamage is it's a single-run class, meaning you run it once to apply damage without leaving any persistent effects on the enemy. Rupture, I thought, would be some variety of the X2Effect_Persistent class since it's... You know, a persistent effect, but I clearly don't know what's going on. How DOES the "rupture effect" work? Problem #2: I don't know how to actually introduce a new aspect to the Gatekeeper's Mass Reanimation ability without screwing it up majorly. The skill definition is full of very scary comments to the tune of "// DO NOT CHANGE THE ORDER OF THE DAMAGE AND THIS EFFECT" which make me reluctant to touch... Really any part of that skill. There must be a reason for the programmer to be this loud. If the Rupture effect is indeed some variety of X2Effect_ApplyWeaponDamage, then I can probably piggy-back it onto the already-existing Mass Reanimation damage by just altering that one effect, but... Can I be positive that won't mess something up? Problem #3: I don't know if aliens have separate variants per difficulty setting. Soldiers don't (luckily) which means I can theoretically just create a single new ability and jam that in the template manager at game launch and it will work. In fact, my Blademaster Enhancement mod just creates a child of the Ranger class and it seems to work fine. Difficulty-specific templates, however, get split into several versions of the same template and need to be fished out of the template manager one by one. I don't know if aliens and their skills require this or not. Any help on the matter would be greatly appreciated. Sorry to be needy like this, but I've done about as much of the legwork as my skills will allow me to.
-
Changing Death from Above; getting back into modding
SteelRook replied to SteelRook's topic in XCOM's XCOM 2
Having looked into the matter more thoroughly, I've given up on my aspirations for this specific mod. The UnrealScript coding necessary to make it work is beyond my capability and I've actually changed my mind on the merits of Death From Above. While it used to bother me how Squad Sight is handled in XCOM 2, I've grown to realise that that's a good thing. While it's handy to plant a sniper on a perch and get sight on literally the entire map, it's also a really boring way to play. I've had a lot of experience with Gunslinger sharpshooters and found that to be a more enjoyable way to play the game in the first place, which has in turn caused me to start moving my Sniper Sharpshooter more rather than camping her on a deerhunter tower all game. Basically, having the Squad Sight aim penalty makes the game more fun and I've changed my mind on removing it. Besides, the ability to reload your gun after scoring a kill has proven to be more useful than I originally gave it credit for. Call it lazy or call it inept, but I'm shelving this idea. Still, thank you kindly for your help in identifying the new skill hook :) -
Thank you. That got it working.
-
Changing Death from Above; getting back into modding
SteelRook replied to SteelRook's topic in XCOM's XCOM 2
I see. No, I can't do what I need to do by adding stuff to the existing template. Death From Above currently refunds a single action on a sniper kill with height advantage. I need it to not do that, but instead do something else completely, which is to add extra Aim based on distance to target. I wasn't aware of OnPostTemplatesCreated() though. So that's what - just a method which runs for the mod immediately after templates have been created? I can work with that, I think. That's a good time to create my new ability and put it into the template manager at that point. Thank you. With that sorted, the real hard part begins - how to add aim based on target distance if a shot is taken from height advantage :smile: I should be able to pull the "has height advantage when <event> happens" conditional from the old Death From Above skill since it's already tagged like that, but I'll need to swap out (i.e. remove) the event check so that the skill is active for all shots taken with height advantage. The extra aim might be difficult, though, since I'm not sure how to pull distance to target or how to add extra aim. Are there any skills out there which scale with distance or such that add aim? -
Changing Death from Above; getting back into modding
SteelRook replied to SteelRook's topic in XCOM's XCOM 2
How would I go about modifying the existing template if not by overriding it, though? I'm not sure how that works. The only thing I could figure out to do for Blademaster was create a "child" class of X2Ability_RangerAbilitySet, override the Blademaster() function with my own and keep my fingers crossed. Since all that method does is return a template, I don't really know how to access the AbilityTemplateManager to begin with, and I'm worried about messing with core classes where that might show up. If I could just "inject" my code into the method which creates the ability, this would be much much easier. -
How did you accomplish that? I can't even find the correct executable.
-
So I stopped messing with XCOM 2 mods back in February after my Blademaster Enhancement mod ended up being a major pain. I'd like to get back into modding with my other long-time dream - turning Death From Above into a skill which negates (or counters) the Squad Sight aim penalty to some extent (I'm thinking halving it). This leads to two separate questions. 1. How does ability replacement work now? Previously, I ended up forced to basically create and load a duplicate skill, which - through crossed fingers - XCOM 2 would load instead of the default one. I remember there being a patch something like a month ago when a lot of the Static methods were to be replaced with non-static ones, but abilities don't seem to have had that done to them. They're still created by static methods in a giant wrapper class. So... If I want to replace a skill, what do I do? Just make a duplicate object and hope against hope that the game will use that instead of the vanilla version? Or is there a smarter approach? 2. How would one go about actually changing Death from Above to negate Squad Sight aim penalties. The skill itself already has a system to check for height advantage so I can keep that, and I can gut most of the code revolving around refunding an action because it's not going to be doing that. What about the Squad Sight penalty, though? Near as I can tell, it's 4% per tile past visual range, and that value is coded directly into the game's accuracy calculation. It doesn't seem like I can change that on the fly, is what I'm saying. Way back in the day I had the idea of giving the shooter a "counter-buff" worth half (or a quarter) of the Squad Sight penalty, but would that work? It would be hella-clunky to be sure, but if it works then I'm OK with it. I'm VERY rust from back in the day, so any amount of help would be greatly appreciated. And yes, I do apologise for being needy, but XCOM 2 modding is a bit... daunting.
-
Is there a tutorial on the matter or some kind of explanation? I have no idea what changed with the new patch, or what I need to change in my own mod.
-
Really? I'd have thought that would be a dirt simple correction.
-
Has the bug with the tech level of Conventional Swords been fixed? They used to be tagged as Magnetic... Or was the Magnetic sword tagged as Conventional? Either way, has that been fixed?
-
I'd really love to know how overriding static functions works. My one finished mod (the sword damage varying by tech level) relies on overriding the ability template for Bladestorm. Currently, I'm doing something I know I shouldn't be, which is just overriding it anyway, because it works through some trick of load order - my override loads after the default function, I think. If that's changed then I'm going to need to fix my mod or risk either non-function or crashes to desktop. I ended up not really comprehending gamestates back in the day, so overriding gamestates doesn't excite me AS much, but I know it's very important for proper mod support. That's good to hear.
-
That's odd, because in my experience it was only being called once on saved games made without the mod. This is back from my Blademaster Enhancement mod, where I tried putting the "ability insertion" in that method. It would change nothing if I loaded a mod with Blademaster Enhancement already active, but it would change the skill if I loaded a save without it. If I first loaded a save without the mod, then a save with the mod, the change would persist, but that's because I'm replacing templates wholesale. This is one of those "50% of the time, the function runs 100% of the time" situations. I'm personally VERY leery of putting events into it if I want them to absolutely positively run every time a saved game is loaded.
-
*edit* Before I forget - thank you SO MUCH for taking the time to explain this! :) Hmm... I follow you, somewhat. This puts in perspective why you were advising me to only mess with templates during the Strategic part of the game, since GameStates get generated for the Tactical part and then discarded when returning back to Strategy. But I think I follow what you're saying, if not specifically which function names are called when. At game launch, the executable itself will create datasets which search out and create a single instance of all the templates they're responsible for, then put those into data managers for later retrieval. These get used when a tactical game needs to create actors and populate their ability lists for actual spawning in the "level." I'm speaking loosely for the most part, just because I need to internalise the concept before I try to deal with the specific code, but this much I think I can follow. That makes sense. It also explains why changing an ability template in the strategic part would work better, as we don't have gamestate objects created from those templates yet. The bit about history does concern me, though, as it's using a bit of a... Strange naming convention. Originally I thought that StateObjectReference was literally just a memory pointer, what C++ would refer to as a *name to use in lower-level OOP, but that doesn't seem to be it. In fact, the way you describe history in XCOM really reminds me of the Java AWT event dispatch thread in an odd way that I can't fully articulate. This whole system of allowing gamestates to be changed independently of their containing structures and then "updated" upon need is an almost exact fit for a presentation I had to give on multi-threaded programming back in University. Thinking of History as an event dispatch thread managing potentially asynchronous events and ensuring consistent behaviour through on-demand updates vs. content locks actually gives me more of a footing of what it actually is. Sadly, I know comparatively little of race condition handling via events, but that's fixable - it's something I can read up on, and should on account of it being part of my real-life job. Just because it hasn't come up yet doesn't mean it won't, especially with UI design via Java Swing. But I think I follow what you mean up to a point. I get why they use of XComGameState_BaseObject is crucial. It's the root of the gamestate tree, so it's safest to always expect that out of all of the basic actions, meaning you can always cast "up" to the actual object you're expecting to get. It seems to me that UnrealScript doesn't throw a lot of exceptions, so a failed cast will likely just produce a null pointer or some other such item which doesn't require the kind of try/catch block that I'm not convinced UnrealScript even supports (Google says "no"), so I can kind of wrap my head around it. I know my back-explanations probably don't make a lot of sense to you, but they do - for the first time - make sense to me, which is actually a pretty nice feeling :smile: I'm not entirely sure where StateObjectReference comes into play if it's not a pointer address value, though... However, this still leaves the question of my experience with replacing abilities in the main menu, though. It plain and simple doesn't work correctly, but it works half-way. I was able to get the ability to change temporarily (and corrupted its icon, among probably other things), but it would eventually reset itself. If gamestates get serialised into a save game file, then how does altering an ability template at game startup alter the ability's gamestate in a tactical game in progress? My Blademaster Enhancement mod uses a dirt simple method of "code injection" by creating a child of X2Ability_RangerAbilities with one method overridden, yet that's nevertheless enough to alter Blademaster in a tactical game already in progress. Previously, I was attempting to pull an ability template out of the ability manager, replace it with a new one and put replace the old one with the new one in the ability manager itself. This worked up to a point, but I was clearly not doing something correctly because the event became corrupted during the strategic layer and then failed to have a gamestate for it created ever again. But the mere fact that simply adding a new ability template with the same name as an old one into the ability manager is able to alter an ability's behaviour in a previously-saved tactical game is very odd to me, given what I think I understand about gamestates. And this also brings up the other question of exactly what I'm doing with this approach. I know that creating a child of X2Ability_RangerAbilities will get that class picked up by the executable and its CreateTemplates method called, but all that does is put new abilities in the ability manager's array, near as I can tell. Does my class execute after the original class? Do my ability templates replace those of the original class, or do they get added as "doubles" in the list? Am I recreating ALL of the Ranger ability templates? That would suck, since it would be unfortunate for compatibility... Although I could also override the CreateTemplates function to only create the one I want. I'm able to override Blademaster pretty easily using this method, but I'm still confused as to exactly WHY this works and what it's doing that I'm not aware of. Because it really is dirt simple class extension and overwriting one solitary function.
-
It really, really was :smile: Thank you kindly. Although I do have a few follow-up questions. So basically, the game creates a unique object for each individual Template, then uses those to create non-unique objects for specific Gamestate "items" like individual skills, weapons or characters. I have to say, that naming convention is more than a little confusing as I'd expect "gamestates" to handle the state of the game, whereas they're more along the lines of... Well, instances. But I follow what you mean now, though. Templates are unique generic objects which hold the "rules," Gamestates are non-unique specific objects which hold the individual instance of a thing to actually be used, as well as to be serialised into the save game file. With that in mind... When are Gamestates created and when can they be modified? I ask, because I've run into a lot of issues with this. Initially, I tried overriding the ability creation classes, which obviously didn't work - you can't override static functions via class extension... And yet it seemed to work. In fact, it seemed to work without the need to overwrite anything. I'm told this is because the game will pick up all classes which inherit the base Template class (I forget what that's called) and create a single object from them. What this seems to mean is I can create a random child of, say, the Ranger ability template creation class (X2Ability_RangerAbilities?) and basically re-write one of its template creation functions and that'll work. Clearly it's not replacing the original function so it's not preventing the original ability from being created, so how does this manage to work? Does my ability override the game's default ability in the array? Does it instead get added "later" in the array and get read because of a naming conflict in search methods? This kind of attempt is very finicky and fickle and tends to work sometimes but not other times and I suspect this comes down to what order templates are created in. And then we have Gamestates. My understanding of the process of serialisation is limited at best, but from what I understand... If Gamestate objects are serialised into a save game file, wouldn't loading a game recreate the exact same objects regardless of templates? Well, if that's the case then why do abilities become altered after loading a saved game if I alter their templates? Wouldn't the serialised objects just ignore the template and be loaded straight from the save game file? Or does that only apply to items which can exist in multiple instances? An issue I had in trying to use a screen listener to replace an ability was that it got added "half-way." Its icon didn't behave like it should - wouldn't colour properly - and the ability would basically disappear entirely once the game went back into the Strategic layer. I have no idea why this happens, and I don't understand whether we can alter gamestates already created at run-time through templates or not. Sometimes I can, sometimes I can't and I don't know what determines this. Sorry to be dense. I'm just having issues grasping the innards of the game.
-
I'm starting to wonder how class overriding even works in UnrealScript... Because I suspect it may not work the way it seems like it does. What class gets called is defined wherever the class is called and I don't know that class overriding can really change that. Can UnrealScript really intercept calls for one class file and actually pass them off to another? I've actually never seen that happen. The closest I've seen was Lua modding in Payday 2, but that's "cheating" as it performs runtime code injection into the class files themselves before they're loaded into memory. The only way I can see what you're looking for working would be something very fundamental like what FxsRMcFall mentioned, which frankly kind of scares me to consider. OOP tends to enforce strict rules on inheritence to ensure that every method or variable that it looks like you can access will always exist and be exactly what you thought it would.
-
By this I mean how do I set up a theoretical new skill to only work with rifles, or to require a Gremlin, or only work if the character has a WAR Suit equipped? I've not been able to find that link anywhere in the skill templates, nor have I been able to find that in the weapon/item templates. I know that something about the ability must carry that information, as I know the Blademaster bonus damage has an explicit logic check between the attacker's weapon and "something else" that I can't quite determine the origin of. Sorry if this seems like a stupid question, but I did look and I couldn't find that link made explicit anywhere.