Renegade Projects Network Forums

Full Version: Patching extra functionality into <gamemd.exe>
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
That AltInfDeath idea really sounds great as it could add some nice detail... and I like nice details Smile
Some infantry deaths just don't fit to some infantries, e.g. most of the InfDeaths don't fit to the Brute.
Heh, you could even make "damage levels" to infantry using mutations which spit out a "damaged" infantry, you could give it more lives... Rolling eyes
That guest's idea is a good one though, I needed to know that.
If a warhead has InfDeath=5, the animation AltInfDeath5 should be played, if present...

Anyway, I just started to work on my 100-units research so the InfDeaths will be pushed into the future...
I didn't find any really new stuff. Just that the limit for [VehicleTypes] is 101.
I was quite surprised that when you work "around" the bug by just setting TechLevel=-1 to the last unit, the AI won't build any land units, but naval and jumpjet ones (Kirov). I wonder what happens if the last unit's a naval unit... or a jumpjet...
Plus, it builds an unusual amount of defensive weapons and builds two refineries after building the barracks... at least that's for brutal AI.

I don't have any idea what the reason could be for the bug and what it does exactly... but I'll continue my research today (with InfantryTypes and AircraftTypes) and I hope I'll find out.

@Bobingabout:
Heh, finally a patch without any bugs Big Grin
To be honest, I totally forgot the taunts. I forgot that they exist.
But nice that you remind me of that. I'll look what's up with them.

@ZombyDragon:
Copying code from TS sounds easy, but it isn't.
Sure, I could just copy e.g. the whole Spotlight algorithm, and it would even work, IF I didn't have to correct data offsets, storing addresses etc, cause TS isn't the same as YR, although it uses the same engine.
I tried copying code from TS when "improving" the random map generator. I wanted it to build bridges, which really lacks in YR.
But that gave me an IE, and I expected that.
Correcting addresses requires knowing where anything it depends on is stored... and that seems to be way impossible...
PaD Wrote:@Bobingabout:
Heh, finally a patch without any bugs Big Grin
To be honest, I totally forgot the taunts. I forgot that they exist.
But nice that you remind me of that. I'll look what's up with them.

theres nothing "up with them". its just that you can't add any to your new countries. doesn't even crash when you try to use the non-existant onces, which i think is a pretty solid co-incidence.
Didnt think it would work, but it was worth a try...
Marshall Wrote:@Cannis:
Eh? Blade was saying AltInfDeath=[Integer] on the warhead to indicate the infdeath to use if the warhead killed a unit with NotHuman=yes.
This would allow a different infdeath to be used for animals than humans for specific weapons which would also enable genetic mutation possibilities against animals.

You're saying AltInfDeath=[Animation] on the unit so that it always dies using the same animation? What's the point of that? Besides, we can already do that using DeathAnims=[List of Animations]
Even if you meant AltInfDeath=[Integer] on the unit we can already do that using DeathAnims= (by stating the anim of course, not the infdeath number).

Or am I misunderstanding something?
No, you're right, in the way I said it I was clearly confused.

As an InfantryType property, you'd have to create alternative animations for every InfDeath that existed, which is obviously too much of a pain in the ass. But it would be a really cool thing to set a specific alternate death anim for a specific warhead for whatever specific unit you want. Like say Tesla troopers die from electro-shock differently thatn anyone else.

Don't want to create a million new tags for units (one for each possible infdeath), since they get added to every single infantry unit (using defaults). Then it becomes a memory hog.

I can think of 2 possibilities:

UseAltInfDeath=[comma-separated-list]
ex: UseAltInfDeath=5,8,22
...means the unit uses Die5= for InfDeath=5, Die=8 for 8, and Die=22 for 22. If a value on the list is not found, use the regular InfDeath=.

Or...

UseAltInfDeath=yes
...means first check the warhead for the specified InfDeath=. Let's say it's InfDeath=5. Then check the unit's artmd code. If Die=5 exists, use that sequence. If Die=5 does not exist, fall back to using the regular InfDeath=.

I think either of the above is doable and not memory-intensive (in the second case, errant Die3= etc entries will have to be removed from artmd.ini).

This way a modder who made a special death anim for a specific unit could have that sequence played, no matter what unit it is, and no matter what InfDeath= it is. He could expand upon this feature of his mod one unit sequence at a time as he feels like doing it.
I still think Alternate DeathSequences inside the infantry-SHP are a bad idea...they take too much work. Decompile the SHP, draw the frames, integrated the frames, recompile the SHP, write the sequence...and that for every infantry you want this to have. Something more like the normal InfDeaths, with independent anims, would be a lot easier to use, and therefore more attractive to modders...

Think about it...would you really want to re-compile and re-include every animal in the game just to have it have better DeathSequences?

Just adding a few additional (possibly generic as well) anims on the other hand...
I kind of see Cannis' points about the infantry sequence idea however there are 3 main drawbacks:

1. It's a pain to have to split and recombine the infantry shps when a single smaller anim would be preferable.

2. This would need new DieX= tags (all the way up to 355 now).

3. How would alternate mutation InfDeaths work?
DieX= cannot be used to state a MakeInfantry=


So, to do absolutely anything you want, the simplest option probably would be to have
AltInfDeathX=[animation]
on the infantry unit (where X is any number from 0 to 355).
Obviously, mutation deaths have to be matched manually by the modder or there will be errors.
NotHuman=yes would have to change its function to "IFF AltInfDeathX= is not present, THEN do what NotHuman=yes normally does"

[IFF = If and only if]


I still think there are much more useful wishes that we could be discussing.
I've got an idea. a combination of both really.

firstly, you create an AltInfDeathName= to the infantry. this points to another list.
also, a NonHuman= would trigger this change. maybe an AltInfDeath=yes tag instead to decide if the creature will just die like normal, or force 1 of these new deaths. NonHuman= would mean force SHP death, AltInfDeath= would mean use alternate deaths. which 1 is domanant is upto PD, or the game itels to decide, but sufice to say, you shouldn't use both together.

you could add [AltInfDeathName] as a list of alternate death anim lists and for example: [CowDeaths] 1=, 2= ect, you could list the name of the anim in which to play. this would also allow the same anim to be used more than once without multiple copies, and use the existing ones with only 1 changed SHP for example.

this would probably be very simular to having a tag to specify each death, only easier to implement because only 2 tags and 1 table (plus another for each entry in the table)are added, tables use a numbered list which doesn't require any extra programming.

so back to the unit. add AltInfDeath=yes and AltInfDeathName=CowDeaths, and then this unit will use the anims listed in CowDeaths when they die instead of the standard deaths.

as you can see, this allows you to specify an alternate generic death for all units of a spacific kind, and 1 new list for all new deaths for each unit if you wanted.

still, i dunno exactly how anim to infantry would work, because you probably wouldn't list these new deaths on the [NewInfMutations] lists. maybe you might add them to the end instead of the beginning of the list to know not to use them as a standard death anim.
wha?
From what I can tell, that is more complicated both for modders to use and for PD to implement than what I just said.

Implementation of what I said:

Read in InfDeath number of warhead (X)
If unit has AltInfDeathX=
Then use that animation.
Else If unit has NotHuman=yes
Then (do what NotHuman normally does)
Else use general InfDeath X animation.


Your system requires whole new (runtime-named !Wink sections in the ini!
There are more useful wishes we could be discussing, but since the InfDeath line of discussion is already open for generic animations, while we're at it perhaps we can come up with extra functionality that isn't too much work.

The idea I had about checking to see if DieX= exists in artmd.ini? Forget that, since I don't think the game does any art checking now. It just seems to assume art is there.

So back to the comma-separated list. Like was said before, the generic sequences really don't apply well to the Brute anyway, so let's look at him.

Say you make a new die sequence for him when electrocuted, and another one for your custom warhead infdeath you've added later (which might use InfDeath=42, lol).

[BRUTE]
NotHuman=yes
UseAltInfDeath=5,42

UseAltInfDeath= means ignore NotHuman= for the InfDeaths listed under UseAltInfDeath=. So for the electro death, use the Brute's Die5= sequence and for your new warhead, use his Die42= sequence.

Yes there would have to be new DieXX tags but unless UseAltInfDeath= is pointing to them they would never be used.

What's cool about this is, you could add one sequence at a time for one unit for one InfDeath alternate. You don't have to take on a daunting job of applying this to dozens of infantry units at once.

Adding a new sequence to the SHP is easy as hell. All you have to do is extract with 'combine shadows' on, add your 6-12 new frames at the end, recompile with 'split shadows' on, and write a simple one line of DieX= code pointing to those new frames.
I thought of the following:

You give a unit the tag AltDeathX=Y.
What do X and Y mean? Well:

X is the InfDeath that caused the death anim Y to work. How that works?
When a warhead kills an infantry, it checks what InfDeath is set to the warhead and plays the animation. I'd expand that:
Before it plays the animation, it checks for the AltDeathX= tag of the dying unit.
X would be the same number as assigned to the InfDeath= tag of the warhead, so if the warhead's InfDeath is 5, the game checks AltDeath5=
If its value is NOT the default value (e.g. -1), it takes the InfDeath number Y listed in the NewInfDeaths list or NewInfMutations list.

Example:
[NewInfMutations]
0=COWTOANY

[COW]
...
AltDeath8=0 ;if genetic mutation is fired at it, animation COWTOANY is played.

Because of the number X, it's easy to find out whether the anim is a mutation or not (0 to 7 isn't, 8 is, 9 isn't, 10 to 100 is, every higher number isn't).
That's essentially what I said, except AltDeathX=[integer] instead of [animation], with that integer being a different InfDeath number.
Your way, PD, is better.

However:

[NewInfMutations]
0=COWTOANY

???
I thought the list was supposed to start from 1?
1~89 = InfDeaths 11~99
And I didn't think we were allowed to use 90 = 100.
At least, that's what your tutorial implies ["up to 89 new mutations"].

Also,
InfDeath 9 is mutation, 8 isn't (okay the virusd stuff but let's ignore that)
InfDeath 10 is BRUTDIE.



AltDeath5=9
Should mean: "if this infantry unit is killed by a warhead with InfDeath 5 [electro], then use InfDeath 9 instead [gendeath].
If used on, say, the Guardian GI, then a Guardian GI killed by a prism tower would in fact use gendeath and get turned into a Brute.

With AltDeathX=Y, NotHuman= becomes obsolete
Well, not exactly, we still need NotHuman=yes to be equivalent to AltDeathN=1, where N is EVERY InfDeath (in order to maintain compatibility).
I.E. NotHuman=yes overrides AltDeathX=Y

Edit: Actually, thinking about it, NotHuman=yes shoul mean "all InfDeaths should use InfDeath 1, EXCEPT those with an AltDeathX=Y override".
With the 9 is mutation, you're right.
I'm thinking on zero base like the game does, so 9=8 (yes, I am a machine Wink).

90 = 100 - works
why not?
Hm... OK, you can add 90 new InfDeaths!
Even more than 89 LOL
Hell, I'm not even able to substract two numbers correctly... :unsure:

The NotHuman stuff is solved automatically I think.
The tag AltDeath5 for example is ONLY checked when the InfDeath=5, so others would still respect NotHuman.
So if AltDeath7 is the default value and InfDeath 7 should be played on a NotHuman, it just works like normal.

Am I missing something?
PaD;date=Feb 19 2005, 09:11 PM Wrote:Hell, I'm not even able to substract two numbers correctly... :unsure:
[right][snapback]509[/snapback][/right]
Don't worry, neither do certain Pentiums, can't remember which pentium though, i know its a really old 1.


anyway. hugh mistake on 1 of the tiny details of my rather massive "neededfor4sidesv2" file.

I neglected to look at the EVA untill tonight.

and in doing so missed this:

[EVA_NuclearSiloDetected]
Text=Warning: Nuclear Silo detected.
Russian=csof001
Allied=ceva001
Yuri=cyur001
Type=QUEUE
Priority=IMPORTANT


I've been referanceing the EVAs as CEVA### CSOF### and CYUR###

clearly i was mistaken, and it uses 3 (hardcoded?) tags Allied, Russian, and Yuri. what we need here is not a EVAPrefix04=CEVA but another tag on the EVA file such as Side04=ceva001 for the 4th side.

this would need adding to every entry in the conventional EVA list.

DOH!

so side 0 (allies, using the internal table numbers) is Allied=, side1 is Soviet=, and Side2 is Yuri=. so side3 wants to be Side04=(we number from 1, not 0...)


I'll say it again.

DOH!


EDIT: i played co-op for the first time. wow!

I've got to make some more of those for our mod. also, I've got to figure out about all these graphics for extra sides...

loading screens are already definable in ini. as for scorescreens, well, looks like they are from missions, which means, we need graphics for them...

ALLIED
ascore.pal
ascramd.shp ;anim
ascrbkmd.shp ;background
ascrtmd.shp ;open/close anim

SOVIET
sscore.pal
sscramd.shp ;anim
sscrbkmd.shp ;background
sscrtmd.shp ;open/close anim

YURI
yscore.pal
sycramd.shp ;animation
sycrbkmd.shp ;background
sycrtmd.shp ;opening anim


:huh: yuri changes the naming slightly. shouldn't be too hard for PD to do...
PaD Wrote:I thought of the following:

You give a unit the tag AltDeathX=Y.
What do X and Y mean? Well:

X is the InfDeath that caused the death anim Y to work. How that works?
When a warhead kills an infantry, it checks what InfDeath is set to the warhead and plays the animation. I'd expand that:
Before it plays the animation, it checks for the AltDeathX= tag of the dying unit.
X would be the same number as assigned to the InfDeath= tag of the warhead, so if the warhead's InfDeath is 5, the game checks AltDeath5=
If its value is NOT the default value (e.g. -1), it takes the InfDeath number Y listed in the NewInfDeaths list or NewInfMutations list.

Example:
[NewInfMutations]
0=COWTOANY

[COW]
...
AltDeath8=0 ;if genetic mutation is fired at it, animation COWTOANY is played.

Because of the number X, it's easy to find out whether the anim is a mutation or not (0 to 7 isn't, 8 is, 9 isn't, 10 to 100 is, every higher number isn't).

OK, that would work, and custom infantry sequences could be saved as separate animations rather than add them to the infantry animation shp. But why do you need a [NewInfMutations] list? Why not just do it like this:

[COW]
AltDeath8=COWTOANY
It'd probably be easier to rig the InfDeath system to check for using a different number than it would be to make it use a specific animation. Not that I know anything about the internal workings of the game of course.