Author Topic: [PSX/PC] KERNEL.BIN editor - WallMarket (v1.4.5)  (Read 391714 times)

NFITC1

  • No life
  • *
  • Posts: 2899
  • Karma: 72
  • I just don't know what went wrong.
    • View Profile
    • WM/PrC Blog
Wall Market, FFVII KERNEL.BIN editor
« Reply #250 on: 2008-12-18 02:55:53 »
What I CAN do is make a data sheet of different attacks' IDs.
I've just done this. There are just under 1000 unique attacks in this game. I now have a text file and csv file with a list of their names and the scenes that contain them.

You... are... amazing.  How do you do these things so quickly?  Are you sleep-depriving yourself or something? (please tell me you're not)

Character IA is in the kernel, isn't it?  It's used for Vincent's Limit Breaks and for Sephiroth.  Will this ever be changable?  And if it's not, do you know where it is stored?  I just wanna see what happens when you make Galian Beast, Hellmasker, etc. controllable, that's all.  As for making Seph controllable, I think I found a certain topic on that a while back.  I'll have to go looking for it.

No. I'm not sleep deprived at all. I don't have a very demanding job at the moment so I work on my own projects while I have down time. I slightly modified Heidegger to produce that entire list for me so it's not like I went through all 256 scenes and wrote down the unique attacks

Yes, Character AI is in the kernel and WILL eventually (key word there) be editable. The easiest way to make Sephiroth controllable is to disable his script. That's easy. Changing the script, that's harder. I don't know how much control I'll give to this.

The Seer of Shadows

  • No life
  • *
  • Posts: 1146
  • Karma: 0
  • I used to be indecisive. But now, I'm not sure...
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #251 on: 2008-12-18 04:57:04 »
Automatic list production.  Nifty!  I never thought of that.

Character AI, I just want to disable (including Vince's Limits).  Do I just change every AI value to ff or something?  I've never attempted AI editing before.  It seems all so complicated.

NFITC1

  • No life
  • *
  • Posts: 2899
  • Karma: 72
  • I just don't know what went wrong.
    • View Profile
    • WM/PrC Blog
Wall Market, FFVII KERNEL.BIN editor
« Reply #252 on: 2008-12-18 06:13:20 »
Automatic list production.  Nifty!  I never thought of that.

Character AI, I just want to disable (including Vince's Limits).  Do I just change every AI value to ff or something?  I've never attempted AI editing before.  It seems all so complicated.

The data is saved in kernel piece 2 (KERNEL.BIN2 using WM) so you can create the pieces and load from them then save that data. Even though WM doesn't edit that info, it still reads it when it loads. It's like it's begging to be edited :O. Anyway, you'll just need to blank out (make the data FFh) with a hex editor and create the KERNEL.BIN from that.
Well, you obviously don't want to blank out EVERYTHING in that piece or you'll get all screwed up. :) All you'd need to do is blank out four bytes. 0x062A & 0x062B for Vincent and 0x0630 & 0x631 for Sephiroth. Instead of erasing the script, that unlinks the scripts to the characters and the game just ignores them. This SHOULD make the game think they're normal characters. Vincent's characters just have a main script while Sephiroth has Pre-battle and main scripts. However, Vincent's limit forms become uncontrollable if these scripts are disabled. The game is hardwired into looking for specific scripts when the Vincent's turn comes around. If it doesn't find them then his turn is ignored and the timer is reset to 0 and starts over. I don't know if Sephiroth is handled this way or not.

The Seer of Shadows

  • No life
  • *
  • Posts: 1146
  • Karma: 0
  • I used to be indecisive. But now, I'm not sure...
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #253 on: 2008-12-18 10:54:22 »
That's both interesting and disappointing, but I can (almost) guarantee that disabling the AI for Sephiroth will make him controllable.  It's one of the things gjoerulv mentioned in his first post on the thread for his Hardcore mod.  "Disabled Sephiroth's AI so that he is controllable in the Kalm flashback" or something to that effect.  Seph is indeed controllable using his kernel, so yeah. (Unfotunately, his spells consume his MP during battle.)

Thx for the info!

Akari

  • Freak
  • *
  • Posts: 761
  • Karma: 26
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #254 on: 2008-12-18 16:31:15 »
Sephiroth can be controllable (I checked it). Just switch his first script off (write 0xffff instead of pointer) His initing script turn on script 2 (attack script) which is run when his timer bar filled. It's not that interesting though.
Vincent limit can't be controllable. His ai turned on from executable. If you switch his attack script off - he will just reset timer bar and will not do anything.
« Last Edit: 2008-12-18 17:01:26 by Akari »

Armorvil

  • Freak
  • *
  • Posts: 621
  • Karma: 0
  • Working on : FFVII Total Grudge
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #255 on: 2008-12-18 17:04:58 »
I noticed a weird thing in Wall Market. In my game, Braver and Big Shot randomly damaged my own characters...
I had no clue what caused this, until I decided to uncheck the Random box, in "Limit"'s command target window (in WM "command" tab). The result ? Braver hit all enemies.
Noticing these boxes didn't behave like I thought they would, I remembered that I unchecked the "Short Range" box... ...and as I thought, that's what was making my limit skills hurt my team.

Just to let you know :)
« Last Edit: 2008-12-18 17:28:49 by Armorvil »

NFITC1

  • No life
  • *
  • Posts: 2899
  • Karma: 72
  • I just don't know what went wrong.
    • View Profile
    • WM/PrC Blog
Wall Market, FFVII KERNEL.BIN editor
« Reply #256 on: 2008-12-18 17:42:37 »
I noticed a weird thing in Wall Market. In my game, Braver and Big Shot randomly damaged my own characters...
I had no clue what caused this, until I decided to uncheck the Random box, in "Limit"'s command target window (in WM "command" tab). The result ? Braver hit all enemies.
Noticing these boxes didn't behave like I thought they would, I remembered that I unchecked the "Short Range" box... ...and as I thought, that's what was making my limit skills hurt my team.

Just to let you know :)

WM is assigning all the targeting data for commands correctly so I'm not going to even begin to speculate why it's doing that. Kinda fun though. :D

Progress on the Battle & Growth data is going well. It's really not as hard as I had initially feared. Although I think there should be a disclaimer saying that editing that is advanced stuff and should be treated with caution.

Armorvil

  • Freak
  • *
  • Posts: 621
  • Karma: 0
  • Working on : FFVII Total Grudge
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #257 on: 2008-12-18 18:07:35 »
I know you're gonna hate me and my demands even more after this (lol), but could Heidegger list the scene files from 1 to 256, instead of from 0 to 255 ?  :-P

Quote
Progress on the Battle & Growth data is going well. It's really not as hard as I had initially feared. Although I think there should be a disclaimer saying that editing that is advanced stuff and should be treated with caution.

Wow, that's very cool. So, for example, with this, one could remove all stat growth at level up, huh... I previously had the idea of eliminating stat growth and make enemies drop sources with a chance of 100% - so the player would tightly control everyone's evolution over the course of the game (think FFX) . That could be interesting.
« Last Edit: 2008-12-18 18:14:08 by Armorvil »

NFITC1

  • No life
  • *
  • Posts: 2899
  • Karma: 72
  • I just don't know what went wrong.
    • View Profile
    • WM/PrC Blog
Wall Market, FFVII KERNEL.BIN editor
« Reply #258 on: 2008-12-18 18:29:53 »
I know you're gonna hate me and my demands even more after this (lol), but could Heidegger list the scene files from 1 to 256, instead of from 0 to 255 ?  :-P

No. And this time I mean it. It is referenced in the KERNEL.BIN as a 0-based index so that's how it's going to stay in Heidegger. Sorry.

Wow, that's very cool. So, for example, with this, one could remove all stat growth at level up, huh... I previously had the idea of eliminating stat growth and make enemies drop sources with a chance of 100% - so the player would tightly control everyone's evolution over the course of the game (think FFX) . That could be interesting.

Yup. Totally possible when this addition is made. That actually sounds fun. :D

burnloungaz

  • Cool newbie
  • *
  • Posts: 64
  • Karma: 0
  • www.burnloungaz.synthasite.com
    • View Profile
    • Burnloungaz's site
Wall Market, FFVII KERNEL.BIN editor
« Reply #259 on: 2008-12-18 18:50:18 »
NFITC1 would you like to be a moderator for the game section of my forum?

NFITC1

  • No life
  • *
  • Posts: 2899
  • Karma: 72
  • I just don't know what went wrong.
    • View Profile
    • WM/PrC Blog
Wall Market, FFVII KERNEL.BIN editor
« Reply #260 on: 2008-12-18 21:59:43 »
NFITC1 would you like to be a moderator for the game section of my forum?

No. I don't want to take the time to be a moderator to anything.

Just thought I'd leave you all with this. It's incomplete (obviously), but I'm pretty happy with it so far. Just don't ask how long it took go get that graph to work. :P

Kudistos Megistos

  • Banned
  • No life
  • *
  • Posts: 3936
  • Karma: 1
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #261 on: 2008-12-18 22:15:04 »
Quote from: Me
wallmarket doesn't recognise changes to the names of spells, weapons etc. that were made to kernel2.bin after I first used version 1.0; interestingly, it does recognise changes made with Teioh before that. The changes do show up in the game.

This is fixed now.

Quote from: Me
An unhandled exception occurs when I open my modded scene.bin; the program seems to work, but doesn't open any of the scenes from EA onwards. It doesn't happen when I open my unmodded backup, so it may be a problem at my end; I'm going to do a bit more experimenting.


But this still happens; it's a "System.ArgumentNullException: Buffer cannot be null" error.

Quote from: NFITC1
Just thought I'd leave you all with this. It's incomplete (obviously), but I'm pretty happy with it so far. Just don't ask how long it took go get that graph to work. :-P

Looking good!
« Last Edit: 2008-12-18 22:20:44 by Leighos Kudistos Megistos »

The Seer of Shadows

  • No life
  • *
  • Posts: 1146
  • Karma: 0
  • I used to be indecisive. But now, I'm not sure...
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #262 on: 2008-12-19 00:49:42 »
I've noticed a tab on that pic that says "spell order".  Does that mean the order of the spells on the menu?  Enemy Skills and Summons included?  Just a curious question.  "Big Gurad" and "White Wind" belong at the top of the Enemy Skill list more so than "Frog Song" and "L4 Suicide" after all.
« Last Edit: 2008-12-19 01:06:51 by Shadowseer »

Kudistos Megistos

  • Banned
  • No life
  • *
  • Posts: 3936
  • Karma: 1
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #263 on: 2008-12-19 00:53:32 »
It only includes spells on the magic menu; I don't know where the data determining in what order the enemy skills and summons go, but it is likely to be in /MENU/MGICMENU.MNU on the PSX version and in ff7.exe for the PC version.
« Last Edit: 2008-12-19 00:58:10 by Leighos Kudistos Megistos »

Akari

  • Freak
  • *
  • Posts: 761
  • Karma: 26
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #264 on: 2008-12-19 03:06:14 »
It only includes spells on the magic menu; I don't know where the data determining in what order the enemy skills and summons go, but it is likely to be in /MENU/MGICMENU.MNU on the PSX version and in ff7.exe for the PC version.

Order of enemy skills and summons determining by their id only. There is no special data that sorts them.

NFITC1

  • No life
  • *
  • Posts: 2899
  • Karma: 72
  • I just don't know what went wrong.
    • View Profile
    • WM/PrC Blog
Wall Market, FFVII KERNEL.BIN editor
« Reply #265 on: 2008-12-19 14:39:53 »
Quote from: Me
An unhandled exception occurs when I open my modded scene.bin; the program seems to work, but doesn't open any of the scenes from EA onwards. It doesn't happen when I open my unmodded backup, so it may be a problem at my end; I'm going to do a bit more experimenting.

But this still happens; it's a "System.ArgumentNullException: Buffer cannot be null" error.

This has been fixed. Now that it's not forcing there to be no more or less than 33 scene blocks it works fine. :D I recreated LKM's scene.bin perfectly but modified the original one slightly. It's the same size as it's always been so I'm not real concerned. Heidegger now works to my intent and satisfaction. I'll fix errors/bugs, but I won't add any new features to it. It has been updated on the first post.

I think I need to take a brief moment and explain that last picture I hastily posted yesterday. Obviously there are six tabs there. These are representing all the information in the KERNEL.BIN2 file.

Character Growth:
This is where you can set the curves and limit info of the character in the List box in the upper left. The graph shows the possible range of stats for each level and the sliders cannot go outside those bars. Switching the buttons in the lower left will change the graph for the characters' stats. Changing the numbers to the right of those buttons will cause the characters to use a different curve. The graph uses initial data from KERNEL.BIN3 to get starting values so Yuffie's graphs all start at level 1 with stat 0. This will change if you modify the starting values in the Initial Character Data tab under Initial Data. Cait Sith's and Vincent's Initial Data is not contained in the KERNEL.BIN at all so their starting stats have been hard coded into the data.
Let me also add a disclaimer that the graphs assume that the stat increases are sequential in the bonuses and none are lower than the previous increases. If this is broken, the graph will be inaccurate.
You can also see frames for limits. The drop-downs there will be populated with attack names taken from KERNEL.BIN18 so as those change, these will be updated. To the right of limits X-1 and X-2 (sans level 4) there is a Uses required. This is the number of times that limit must be used to get to the next one. The game will ignore this if the next limit is empty or use count is NULL (FFFFh). The HP Divisor at the bottom right of these frames indicates....something. It's a calculation to do with MHP, but I'm not exactly sure how it calculates it. Either MHP / (Divisor / 100) damage raises the limit bar 1 point (what I suspect) or MHP * (Divisor / 100) is amount of damage required to get the limit bar to full. Regardless, the lower the number, the easier it is to "break limit" or whatever you want to call that action. :)

Curves:
The curves themselves can be edited here. Changing them will be reflected on the graph too and you can make some pretty funky curves. It might even be possible to break the program and stuff. :D On here will also be the stat bonus. The process of calculating that is basically described on the wiki and in Terence's Party Mechanics FAQ. So you can get your characters to have stats at level 100 within one level or never have any gain if you so choose. The bonuses are universal, but the curves are there to allow you to change the characters as you wish. :)

Character AI:
Admittedly this is currently blank. It will eventually have Character AI data so you can make characters automated or have them perform some action at the beginning of the battles. This will take the longest time to decode. Sorry, be patient. :(

Random Numbers:
This is just crazy stuff. It's all the numbers 0 - 255 inclusive all jumbled up. When the game wants a random number it randomly picks one of these bytes and uses that as the random number..... Crazy, I know. But you can use this to your advantage. If you set them all to the same number then your chances of really rare things happening becomes 100% (this,of course, assumes that you know the right number to change it to ;) ).

Scene look-up:
This is one of those things I'm going to classify as "use at your own risk". I'm only allowing editing of this because it's there in the KERNEL.BIN2 file. Hojo and Heidegger should be able to change these on their own, but you can set them however you want. The results could very well be disastrous so use with great care. More detail on the structure of this is in the wiki link above.

Spell Order:
This is also described on the wiki link above so I won't bother describing it further.

Have fun speculating on how great this will be. ;)
« Last Edit: 2008-12-19 16:28:26 by NFITC1 »

Kudistos Megistos

  • Banned
  • No life
  • *
  • Posts: 3936
  • Karma: 1
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #266 on: 2008-12-19 16:59:32 »
Quote from: NFITC1
The HP Divisor at the bottom right of these frames indicates....something. It's a calculation to do with MHP, but I'm not exactly sure how it calculates it. Either MHP / (Divisor / 100) damage raises the limit bar 1 point (what I suspect) or MHP * (Divisor / 100) is amount of damage required to get the limit bar to full. Regardless, the lower the number, the easier it is to "break limit" or whatever you want to call that action.

I don't think that it is either of those: they would both require the character to lose more HP before a limit break than they actually do. T Fergusson says this in his "party mechanics FAQ":

Code: [Select]
The Limit Bar dictates when you can use a certain Limit Break.
Depending on your Status Attributes, and which Limit Level you have chosen
to build, it will grow quickly or slowly based on the damage you take.

A character's Limit Bar is measured in Units.  Once a Limit Bar contains 255
Units, the Limit Bar is full, and the character may use their Limit Break.

The conversion rate between damage points and Limit Bar Units is as
follows:

   Units gained = [[300 * HP Lost / Max HP] * 256 * Status Factor / LNum]



In the above formula, Status Factor is equal to 2.0 while in 'Fury' Status,
0.5 in 'Sadness' Status, and 1.0 otherwise.

LNum, on the other hand, is a special number that varies for each character
at each Limit Level.  The following table shows the LNum value for all nine
characters at each of their Limit Levels.

                   Level 1       Level 2       Level 3       Level 4
     Cloud           140           324           435           506
     Barret          129           240           374           450
     Tifa            120           334           509           566
     Aeris           200           284           322           436
     Red XIII        195           300           389           486
     Yuffie          200           300           400           480
     Cait Sith       160           180          9590 *       12760 *
     Vincent         202           244           319           426
     Cid             200           280           380           480

 * Cait Sith does not have either a L3 or L4 Limit Break - these numbers
   are still in the data, however.


Obviously, the higher the number, the larger the percentage of your Max HP
you must lose before you can fill the Limit Bar.  With the numbers above, it
is possible to work out the rough percentage of HP that must be lost:

                   Level 1       Level 2       Level 3       Level 4
     Cloud           46.5%        107.6%        144.4%        168.0%
     Barret          42.8%         79.7%        124.2%        149.4%
     Tifa            39.8%        110.9%        169.0%        187.9%
     Aeris           66.4%         94.3%        106.9%        144.8%
     Red XIII        64.7%         99.6%        129.2%        161.4%
     Yuffie          66.4%         99.6%        132.8%        159.3%
     Cait Sith       53.1%         59.8%         ----          ----
     Vincent         67.1%         81.0%        105.9%        141.4%
     Cid             66.4%         93.0%        126.2%        159.3%

This is backed up by my experience; my Cloud (I may have modded this, I have lost track of the number of mods I have made), has a lv1 divisor of d2; using T Fergusson's formula he would need to lose 83 HP at the start of the game (with a MHP of 302) before getting a limit break. I haven't checked this, but that is approximately the amount of HP he loses before getting a limit break.
« Last Edit: 2008-12-19 17:11:51 by Leighos Kudistos Megistos »

NameSpoofer

  • Guest
Wall Market, FFVII KERNEL.BIN editor
« Reply #267 on: 2008-12-19 18:49:59 »
Hello,

Sorry for having some noob questions here but since the fact that I mostly hex edit the kernel.bin, I havent been able to use this program well. So with wall market you can edit the attack sound of the weapon, but does anyone know the index sound of rude's attack? Since i swap rude with barret i want to change the attack sound of barret gunshot to rude's punch.

Also, how do you change the attacking texture of a limit. For example, if i want to change the chain of machine gun shots in barret's ungarmax into a chain of grand spark, how do i do that?

Also, when i swap the limit between cloud and vincent, i got this level overflow glitch (although the battle animations are fine). Any help here?


NFITC1

  • No life
  • *
  • Posts: 2899
  • Karma: 72
  • I just don't know what went wrong.
    • View Profile
    • WM/PrC Blog
Wall Market, FFVII KERNEL.BIN editor
« Reply #268 on: 2008-12-19 19:02:39 »
I don't think that it is either of those: they would both require the character to lose more HP before a limit break than they actually do. T Fergusson says this in his "party mechanics FAQ":

. . .

This is backed up by my experience; my Cloud (I may have modded this, I have lost track of the number of mods I have made), has a lv1 divisor of d2; using T Fergusson's formula he would need to lose 83 HP at the start of the game (with a MHP of 302) before getting a limit break. I haven't checked this, but that is approximately the amount of HP he loses before getting a limit break.

Ha. Well I certainly won't argue against Terence. It was mostly a guess on my part anyway with little to no observational data. ;)

Also, how do you change the attacking texture of a limit. For example, if i want to change the chain of machine gun shots in barret's ungarmax into a chain of grand spark, how do i do that?

No clue. Limit data isn't stored in the KERNEL.BIN so you'll have to look elsewhere for that info. The limit's name is stored in the KERNEL so you can use/change that at least.

Also, when i swap the limit between cloud and vincent, i got this level overflow glitch (although the battle animations are fine). Any help here?

What do you mean swap the limit? Are you editing the Growth data manually? At least that picture tells me needed exp is an unsigned Int32 value instead of a signed one. :)

Kudistos Megistos

  • Banned
  • No life
  • *
  • Posts: 3936
  • Karma: 1
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #269 on: 2008-12-19 19:10:03 »
Also, how do you change the attacking texture of a limit. For example, if i want to change the chain of machine gun shots in barret's ungarmax into a chain of grand spark, how do i do that?

No clue. Limit data isn't stored in the KERNEL.BIN so you'll have to look elsewhere for that info. The limit's name is stored in the KERNEL so you can use/change that at least.

Some info on limit breaks is in my post here, although I don't know how to give enemy specific animations to limit breaks, so you might have to work that out yourself.

Akari

  • Freak
  • *
  • Posts: 761
  • Karma: 26
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #270 on: 2008-12-19 20:01:05 »
Also, how do you change the attacking texture of a limit. For example, if i want to change the chain of machine gun shots in barret's ungarmax into a chain of grand spark, how do i do that?

No clue. Limit data isn't stored in the KERNEL.BIN so you'll have to look elsewhere for that info. The limit's name is stored in the KERNEL so you can use/change that at least.

Some info on limit breaks is in my post here, although I don't know how to give enemy specific animations to limit breaks, so you might have to work that out yourself.

Limit attack animation manipulated by animation script. Animation script Id for limits - hardcoded (don't remember which is which). To change effect of chain of machine gun shots in barret's ungarmax into a chain of grand spark you need to change animation script (0xF8[XX] - attach effect of machine gun shot to given model joint).  Impact effect id set with attack data though.
ps: I not looked into difficult animations scripts yet so I can't say this is 100% true, but more or less this is true =)

NameSpoofer

  • Guest
Wall Market, FFVII KERNEL.BIN editor
« Reply #271 on: 2008-12-19 20:40:50 »
Limit swap is, well, changing the limit AI while still keeping the same ID. For example, in my Turks Mod, i modify the kernel.bin so that Rufus ( in vincent's battle skeleton ) is able to do vincent's limit break while still keep ID as Cloud. Like this:





The overflow level exp i got is after i edit the kernel and load a save file. When I start a new game, this didnt occur so I believe it is because of the kernel but I have no idea why. Anyway thanks for the information.

Btw kudistos megistos i saw your video on youtube you were able to change some spells to aero3 how did you do that?

Kudistos Megistos

  • Banned
  • No life
  • *
  • Posts: 3936
  • Karma: 1
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #272 on: 2008-12-19 20:47:52 »
Most of it was general editing with wallmarket. The only thing I found troublesome was the animation ID. It turns out that one has to add 4e to the animation ID of the enemy attack and use that as the ID for the magic attack. For example, the animation ID for Rapps' aero3 is 5c; adding 4e to that makes aa, and that the the animation ID one has to put in for a magic spell to use that animation. I found all of the information I needed to do this in this thread.
« Last Edit: 2008-12-19 20:50:32 by Leighos Kudistos Megistos »

Armorvil

  • Freak
  • *
  • Posts: 621
  • Karma: 0
  • Working on : FFVII Total Grudge
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #273 on: 2008-12-20 19:29:38 »
I'm eagerly awaiting WallMarket's amazing new version. Actually, my whole project is on hold till I can edit the characters' stat growth. 8-)

Kudistos Megistos

  • Banned
  • No life
  • *
  • Posts: 3936
  • Karma: 1
    • View Profile
Wall Market, FFVII KERNEL.BIN editor
« Reply #274 on: 2008-12-20 19:39:20 »
I'm doing something similar; my edits won't be quite as dramatic, but I plan to make the characters much more individual and to make the exp. curve much steeper as the levels increase.