What you would have to do instead, is remove the #define MAX_CLASS statement from merc.h and create a global integer, "sh_int MAX_CLASS = 0;" in the top of one of your main files, most likely in db.c.

Then, in your load_class function use "extern sh_int MAX_CLASS;" and do "MAX_CLASS++;" at the end of loading each class from file.

That is your best bet.

- Valnir

----- Original Message ----- From: "Jeremy Hill" <[EMAIL PROTECTED]>
To: <[email protected]>
Sent: Monday, December 27, 2004 9:03 AM
Subject: Re: changing MAX_CLASS to an external value


Unfortunately, what you want to do in its current state is impossible.

Why? The preprocessor converts "MAX_CLASS" to a string literal "5" for example before the compiler takes a stab at it. The compiler is able to allocated fixed memory on the stack because the value is constant. When MAX_CLASS is a variable, memory must come from the heap, and you must do all the assignment yourself.
Therefore, your structure will need to be something like this, now:
struct    skill_type
{
  char *    name;
  sh_int    **skill_level;
  sh_int    **rating;

And all your skill loads will have to dynamically assign skill_level and rating. That means you can no longer use a flat const skill table, sorry. (Or, at least, it can be flat except for the variable aspects which will have to be located elsewhere, i.e. a read/write skills.dat file. Otherwise how will adding a classe magically transform 5 ints for skill_level to 6?) I wrote a dynamic Skill Builder/Loader in C++ for a version of ROM I have if you'd like to take a look. It writes/reads skills from disk on boot, but it's a little hackish as I never finished it.
-- Jeremy



Tristan M wrote:

i think i worded that subject correctly...anyway, what i want to do is load my classes from a file. ive put together my own class editor which works perfectly(prolly littered with memory leaks i dont kno about tho:p) except that now that classes load from a file, i want to change all those MAX_CLASS's around to maxClass, which is set when load_class is executed during the boot, and changed if classes are created online...so for example in merc.h:

...
...
struct    skill_type
{
   char *    name;            /* Name of skill        */
   sh_int    skill_level[MAX_CLASS]; <--- change this to [maxClass]
   sh_int    rating[MAX_CLASS];<--- change this to [maxClass]
   SPELL_FUN *    spell_fun;        /* Spell pointer (for spells)    */
   sh_int    target;            /* Legal targets        */
   sh_int    minimum_position;    /* Position for caster / user    */
...
...

so i changed the [MAX_CLASS] 's to [maxClass] just to see what would happen and this came out:
rom24\src\merc.h(1838) : error C2057: expected constant expression
rom24\src\merc.h(1839) : error C2057: expected constant expression
rom24\src\merc.h(1839) : error C2229: struct 'skill_type' has an illegal zero-sized array rom24\src\merc.h(1840) : error C2229: struct 'skill_type' has an illegal zero-sized array

and i probably sound like a newb asking this, but thats ok.



--
ROM mailing list
[email protected]
http://www.rom.org/cgi-bin/mailman/listinfo/rom


Reply via email to