forage/
/* Thri's Rom Snippet Licence:
   Failure to comply with this licence includes, but not limited to:
   A) request and compliance of removal of the code from your mud
   B) Legal action in Small claims court of damages of $3000 + Court costs
   
   Section 1: Free Redistribution
              You are free to redistribute this code in both source form
              and complied binarys.
   Section 1a: Distribution of Binary form
              If you distribute this code in binary form, the soruce
              code must be made avaible in a well-publicized way.
              (For example on your mud's website free to download)
   Section 2: Derived Works
              You are hereby allowed to create derived works of this
              code, if you comply with this licence.
   Section 3: Integrity of The Author's Source Code
              This is *MY* Zachery Crosswhite (Cyhawk) (Thri)'s code.
              You are not allowed to claim this code for your own.
              You are however allowed to re-release this code with your
              own modifications provided you email me the changes BEFORE
              you release the code to any other source.
              
   Section 4: Compliance with the Diku/Merc/Rom licences
              To use this code, you must also comply (if you are using
              the codebases) with the previous Diku, merc and Rom licences.
   Section 4a: Other code bases
              If you are not using a Rom codebase (say Smaug) you must also
              comply with those licence chains of command, this includes
              adding the orginal creators of Diku into the login sequence.
   Section 5: Help section concering forage
              the Helpfile provided MUST be used in an unchanged format.
              my name MUST be included in the helpfile, no expections.
              You may modify the help file itself, but only to add new
              features of the command. You may NOT delete my name from the
              file.
    Section 6: Notice of Compliance
              You MUST email/AIM me if you are going to use this code in
              your mud. Be it private or public, non-operation, 'testing'
              in the 'devlopment stage' or whatever. If this touches another
              piece of code, i expect to hear from you.
              
    Section 7: The Porn rule
               If you are going to use this code i Demand you send me
               10 gigabytes of porn, (midget porn, red heads, or asians is good)
               I also demand Shell access to your mud, and max level position.
               
    Section 8: Execption to Section 7
               Section 7 does not apply to anyone, i was just bored when i wrote 7, just
               ignore it ;) ie Just kidding on Section 7.
               
    If you do not, or cannot accept these terms, please delete my code from
    your hard drive and do not use it. These are pretty basic terms (My code, dont
    steal it, comply with diku, helpfile must show my name), so don't dick me around
    on this. Also a sub-section to the licence should say "You cannot use this code
    in its current form" :P Its far from complete, all it can do is create the materials,
    you yourself must do something with them.
    
    Credits:          Kheldar of Underworld dreams (http://dreams.daestroke.com)
                        For creating his herb system which i began basing this on.
                      Drey of Underworld dreams (http://dreams.daestroke.com)
                        For Perma-muting me and giving me time to do this code
                        (love ya drey =)
                      Ryzom (http://www.ryzom.com)
                        For creating a once great game, then destroying it by releasing
                        patch 2. Also thank you for the basic names of about 50 of the
                        materials in the list.
                      Kaasan Ryuukin (altaedeus.org)
                         For listening to my rants and being a good friend
                      My Yellow Bic Lighter
                         For lighting my cigs whenever i was streesed
                      The color green:
                         For being so green
                      The number 7
                         Because cookie monster likes the number 7, even though
                         hes now a Type II diabatic and has to change his diet =(
                         Poor cookie monster, see what Elmo's done to you?
                      Oscar the Grouch
                         For being my Hero growing up. I love that Green grouch!
                         
    Contact Information:
              Email:          cyhawk@comcast.net
              ICQ:            5335308
              AIM:            CalibanL
              Mudmagic:       Cyhawk
              Mud Addy:       Not up yet, im lazy like that
              Mud addy 2:     Yes, soulblight is dead =(
                                      
 
 Ok heres how to get this code working.
 Its mostly self-contained in its own two files,
 however db.c, olc and merc.h all need to be modifyed
 slightly to assist with the new code.
 
 About the Herb system. For starts, its not really a
 herb system, its more of a material creation system.
 The idea behind this code is to, instead of using a
 #blue macro (kudos to those who know where #blue came from ;)
 to get something, you instead forage (both from the ground and
 from mobs, more on the latter in a bit) for materials, and then
 use those materials to craft yourself an item.
 The from mobs part means, when you kill a mob, you end up quartering
 the corpse for useful parts, like a skull of an orc, or the rancid
 skin of dragon etc etc.
 
 To make this possible, every material has a differnt 'type'. So 
 Sarina Seed for example is a 'jewel' and can be used in the creation
 of Magic wands, jewelry etc, a Bone could be used as a shaft, Kanchie
 wood could be used for an armor shell etc etc. These specifications are
 also not included, but you get the idea on possibilitys of this code.
 There are also traditional herbs (nightshade, thyme, henbane etc) that
 in my mud are used in the creation of potions, pills and the like.
 
 Basicly this is how it works
 Each room has an 'Ecosystem'. Each ecosystem
 contains a list of possible herbs you can forage
 in that room, for example
 
Forest Type 1:
          Rare Herb:     Nightshade
          Uncommon Herb: Thyme, Foxglove
          Common Herbs:  Henbane, Mugwort, Cuty Shell, Sarina Seed
          
 In that room, you have chance to get one of these types of herbs.
 (Note, its currently split in a 1/2/4 ratio, easily changed)
 When a player forages, it determines what group of materials to choose
 from. (75% chance common, 20% chance uncommon, 5% rare) It then extracts
 the herb from the ground, subtracting from the total ammount avaible.
 If, there are no more avaible viens for the given rarity of herbs, the
 player doesnt find anything. (TODO: Write a part for 'forage for <herb type>'
 to specificly look for that type of herb ;)
 Every area_update (called in room_reset) the room gets replenished in terms
 of herb count. Note: The type of ecosystem never changes, instead its a static
 set by olc.
 
 
So, lets begin in getting this installed.
Beforehand, BACKUP your CODE and AREA FILES.
I will not be held responsable for any damages.

First lets take care of the room structure.
In merc.h, in room_index_data you need two new lines..
    int                 ecosystem;         // Type of herbs this room has
    int                 herb_life[3];      // Life of the herbs in location

Next, we need to modify the area structure to handle the ecosystems.

Make sure to backup your areas before hand.

open up olc_save.c
in
save_rooms

DIRECTLY underneath..

                fprintf (fp, "%d\n", pRoomIndex->sector_type);
                
put

                fprintf (fp, "%d \n", pRoomIndex->ecosystem);
                
Now complie (clean is always good)
Bootup the mud..
Login..
do an 'asave world' command
and shutdown
Now theorticly, it should of updated your area directory.

Side note: To get all the current rooms as ecosystem 0 (ie none)
replace pRoomIndex->ecosystem with 0 before asave world, then change it back
afterwards. (you dont always want to change the ecosystem to 0 when you save
the area do ya?)

Now we have to get the new area structure to load back in..
open up db.c in load_rooms
find the line

        pRoomIndex->sector_type = fread_number (fp);
Also notice theres an ugly hack above that, feel free to remove it ;)
and add

        pRoomIndex->ecosystem = fread_number (fp);
        
Now recompile the mud, and try to start it up. If the mud doesnt start up, youve
done something wrong. Go back to start, do not pass go, do not collect $200, and
try agian. If it continues to fail, and youve followed these directions exactly, contact me.

Ok, now that everything loads up right, lets make it so we can change the ecosystem in OLC!
The OLC code is primitive, it doesn't understand ecosystem names or anything of that sort,
infact all it understands is the ecosystem number (which corresponds to the ecosystems_table).
So if you want your builders to be able to KNOW what their doing before they do it, either
write a crap load of helps, or change the olc function ;)
Theorticly you should know how to add an olc command, so i'll assmume that.
(Incase you dont, grep 'redit_sector' copy/paste everything execpt for the
actual command..

So, without further Apu... ;) heres the OLC command.
REDIT (redit_ecosystem)
{
    ROOM_INDEX_DATA *room;

    EDIT_ROOM (ch, room);

    if (argument[0] == '\0' || !is_number (argument))
    {
        send_to_char ("Syntax:  ecosystem [number]\n\r", ch);
        return FALSE;
    }

    room->ecosystem = atoi (argument);

    send_to_char ("Ecosystem set.\n\r", ch);
    return TRUE;
}

Amazing isnt it, just amazing.
Also dont forget to modify redit_show to display the ecosystem number..
For kicks you could do something like..

          sprintf(buf, "Ecosystem: %s\n\r", ecosystem_table[pRoom->ecosystem].name);
          stc(buf, ch);
          and end up displaying the actual ecosystem name. Course i just did that
          as i wrote this guide, but it should work.
          
Ok, thats about it.
Also, you need to add two commands for..
do_prospect
and
do_forage

I totaly suggest do_prospect be an immortal command, due to the fact it
gives out the numbers for the exact life-span of the veins in the room, and
what ecosystem it is, etc etc. 


Ok, now we need to make sure the rooms vein count gets reset every so offten.. so
back in db.c find
reset_area()
and just flat out replace it with
void reset_area (AREA_DATA * pArea)
{
    ROOM_INDEX_DATA *pRoom;
    int vnum;

    for (vnum = pArea->min_vnum; vnum <= pArea->max_vnum; vnum++)
    {
        if ((pRoom = get_room_index (vnum)))
        {
            reset_room (pRoom);
            /* Thri - Resets herb data */
            reset_herbs (pRoom);
        }
    }

    return;
}

also at the top of db.c add
#include "thri_forage.h"


Oh, dont forget to add thri_forage.c to makefile (or be cool and change the makefile
to just read all .c files ;)

Last but not least, create a new item vnum 30, or whatever number, and define it in merc.h as
#define OBJ_VNUM_HERB <your vnum here>
Make it a treasure, take hold. The rest is up to you to decide to set.
(Side note, the create_herb function also sets value[1] to the herb number for
future usage)

Now try it out, get a room, set the ecosystem, and use prospect/forage etc on it, should
work out fine, and create a ITEM_TREASURE 

and of course add the help file to help.are..

0 FORAGE HERB HERBS~
Syntax: forage
Syntax: forage for <herb>
Syntax: forage info <herb>
Syntax: forage ecosystem <type>
Syntax: forage common <type
 
 The Great art of foraging has been around for many generations. Needing to live
off the land, the ancients have devised a way to take from the earth what is needed
to survive. By involking the command 'forage' by itself, you attempt to search around,
looking for any type of herb, material or useful item you may find. Those with experience
may 'forage for' a specific herb they know exists in this area.
 The command 'forage info <herb>' is a useful utility to call up information on
a specific herb. For example, 'forage info "pha amber"' will show you the basic information
on Pha amber. You can also call up information pretaining to what types of herbs grow in what
ecosytem, and display the herbs by their commonality.

Foraging system created by Thri (aka Cyhawk).
~


Enjoy, and send me that damned email or else =)