Re: [CODE] I want more mana! :)

From: Thomas Arp (t_arp@mail1.stofanet.dk)
Date: 08/13/00


----- Original Message -----
From: "Torgny Bjers" <tb@sbbs.se>
> I am working on implementing 5 mana pools, or techniques (sort of like Ars
> Magica), and I just wanted to ask you guys which is the best way to do this
> in the magic system?  Shall I just duplicate all the MANA and MAX_MANA
> checks and suchlikes to utilize the four new ones, or how?  Can you give me
> any pointers on this?  I am rather familiar with the code, I just don't know
> how to code.  I have hand-patched in DG Scripts and made it work, so I am
> not a complete moron. :)  But, speak in simple programming terms and try to
> avoid much to difficult code-lingo, please.. ;)  I do NOT need information
> on how to add this to the player struct, or anything like that, I just want
> tips and pointers on how to make it effective in the already existing
> functions such as do_cast, leveling, and such... Shall I use like some sort
> of switch statement for them all, or just line them all up in a long row,
> how?

I'd suggest changing the struct spell_info_type (in spells.h) to allow five different
mana pools (I'm only suggesting the names mana1-5) to be used with each spell, rewriting
the spello() function to accept all five types of mana, and lastly write a new mana check function.
Mailer code(!) follows:  (best put somewhere in spell_parser.c..)

int mana1_cost(int spell, int level){ /* and make copies called mana2_cost, mana3_cost etc.*/
  return MAX(SINFO.mana1_max - (SINFO.mana1_change
    * (GET_LEVEL(ch) - SINFO.min_level (int) GET_CLASS(ch)])),
    SINFO.mana1_min);
}

This could be used instead of the standard mana check..

int have_mana_for_spell(struct char_data *ch, int spellnr) {
  if (GET_MANA1(ch) < mana1_cost(spellnr, GET_LEVEL(ch))
  || (GET_MANA2(ch) < mana2_cost(spellnr, GET_LEVEL(ch))
  || (GET_MANA3(ch) < mana3_cost(spellnr, GET_LEVEL(ch))
  || ...
    return 0; /*No, there was some mana missing somewhere..*/
  else
    return 1; /*All were higher or equal to*/
}

And this instead of the standard subtraction:

void use_mana_for_spell(struct char_data *ch, int spellnr, int divisor) {
  if (divisor < 1)
    divisor = 1;
  GET_MANA1(ch) = MAX(GET_MANA1(ch)
        - mana1_cost(spellnr, GET_LEVEL(ch)) / divisor, 0);
  GET_MANA2(ch) = MAX(GET_MANA2(ch)
        - mana2_cost(spellnr, GET_LEVEL(ch)) / divisor, 0);
  GET_MANA3(ch) = MAX(GET_MANA3(ch)
        - mana3_cost(spellnr, GET_LEVEL(ch)) / divisor, 0);
  etc..
}

Which should be called with ie.
use_mana_for_spell(ch, SPELL_BLESS, 1); if the bless spell went through, and
use_mana_for_spell(ch, SPELL_BLESS, 2); if the bless spell failed..


Hope this helps - if not for anything else, then the gurus will have someone to
flame for bad coding technique :P (that's me..)
In the leveling part, I believe you can just copy the existing mana additions.

Welcor

- who actually thinks 5 mana pools is quite a fascinating idea,  which will never
be put into Cruel World MUD, as long as he has anything to say about it...


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     |  http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html  |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 04/11/01 PDT