The example below illustrates using the Standard Template Library (STL) to manipulate the objects in your inventory.
It adds a new verb (stltest) which you can type to put it through its paces.
It uses a vector which is quickly loaded from the current player's inventory (in 2 lines) and is then sorted into different orders.
The sort itself is very simple (one line) and is assisted by a "compare less" function object which should be pretty self-explanatory. You can add to it to sort on different fields.
It also illustrates a "print" function object which lets you send the vector contents to the player in one line.
This it the file stltest.cpp ...
Changes to tables.c ...
Add this to commands.dat ...
Example of testing it ...
stltest
Log: Lordrom: stltest
Objects in original order ...
object: 'A book with "DON'T PANIC, LOOK AT ME!" written on the cover lies here.', level 0, weight 1
object: 'A blade of metallic stone protrudes from a leather-wrapped hilt.', level 1, weight 2
object: 'A strong metal collar from the academy', level 1, weight 5
object: 'A pair of kid gloves from the Academy lie here', level 1, weight 2
object: 'A charm bracelet from the academy lies here', level 1, weight 2
object: 'A pair of black combat boots from the Academy lies here', level 1, weight 3
object: 'A set of mail leggings has fallen here.', level 12, weight 4
object: 'A cherry pie makes your mouth water.', level 0, weight 1
object: 'A large marble fountain gushes forth here.', level 1, weight 500
object: 'A large chocolate cake awaits someone to eat it.', level 0, weight 1
object: 'Some sort of dried meat is on the ground here.', level 0, weight 1
Objects sorted into description order ...
object: 'A blade of metallic stone protrudes from a leather-wrapped hilt.', level 1, weight 2
object: 'A book with "DON'T PANIC, LOOK AT ME!" written on the cover lies here.', level 0, weight 1
object: 'A charm bracelet from the academy lies here', level 1, weight 2
object: 'A cherry pie makes your mouth water.', level 0, weight 1
object: 'A large chocolate cake awaits someone to eat it.', level 0, weight 1
object: 'A large marble fountain gushes forth here.', level 1, weight 500
object: 'A pair of black combat boots from the Academy lies here', level 1, weight 3
object: 'A pair of kid gloves from the Academy lie here', level 1, weight 2
object: 'A set of mail leggings has fallen here.', level 12, weight 4
object: 'A strong metal collar from the academy', level 1, weight 5
object: 'Some sort of dried meat is on the ground here.', level 0, weight 1
Objects sorted into level order ...
object: 'A book with "DON'T PANIC, LOOK AT ME!" written on the cover lies here.', level 0, weight 1
object: 'A cherry pie makes your mouth water.', level 0, weight 1
object: 'A large chocolate cake awaits someone to eat it.', level 0, weight 1
object: 'Some sort of dried meat is on the ground here.', level 0, weight 1
object: 'A blade of metallic stone protrudes from a leather-wrapped hilt.', level 1, weight 2
object: 'A charm bracelet from the academy lies here', level 1, weight 2
object: 'A large marble fountain gushes forth here.', level 1, weight 500
object: 'A pair of black combat boots from the Academy lies here', level 1, weight 3
object: 'A pair of kid gloves from the Academy lie here', level 1, weight 2
object: 'A strong metal collar from the academy', level 1, weight 5
object: 'A set of mail leggings has fallen here.', level 12, weight 4
Objects sorted into weight order ...
object: 'A book with "DON'T PANIC, LOOK AT ME!" written on the cover lies here.', level 0, weight 1
object: 'A cherry pie makes your mouth water.', level 0, weight 1
object: 'A large chocolate cake awaits someone to eat it.', level 0, weight 1
object: 'Some sort of dried meat is on the ground here.', level 0, weight 1
object: 'A blade of metallic stone protrudes from a leather-wrapped hilt.', level 1, weight 2
object: 'A charm bracelet from the academy lies here', level 1, weight 2
object: 'A pair of kid gloves from the Academy lie here', level 1, weight 2
object: 'A pair of black combat boots from the Academy lies here', level 1, weight 3
object: 'A set of mail leggings has fallen here.', level 12, weight 4
object: 'A strong metal collar from the academy', level 1, weight 5
object: 'A large marble fountain gushes forth here.', level 1, weight 500
Objects shuffled ...
object: 'Some sort of dried meat is on the ground here.', level 0, weight 1
object: 'A book with "DON'T PANIC, LOOK AT ME!" written on the cover lies here.', level 0, weight 1
object: 'A strong metal collar from the academy', level 1, weight 5
object: 'A set of mail leggings has fallen here.', level 12, weight 4
object: 'A blade of metallic stone protrudes from a leather-wrapped hilt.', level 1, weight 2
object: 'A charm bracelet from the academy lies here', level 1, weight 2
object: 'A large marble fountain gushes forth here.', level 1, weight 500
object: 'A pair of black combat boots from the Academy lies here', level 1, weight 3
object: 'A cherry pie makes your mouth water.', level 0, weight 1
object: 'A large chocolate cake awaits someone to eat it.', level 0, weight 1
object: 'A pair of kid gloves from the Academy lie here', level 1, weight 2
It adds a new verb (stltest) which you can type to put it through its paces.
It uses a vector which is quickly loaded from the current player's inventory (in 2 lines) and is then sorted into different orders.
The sort itself is very simple (one line) and is assisted by a "compare less" function object which should be pretty self-explanatory. You can add to it to sort on different fields.
It also illustrates a "print" function object which lets you send the vector contents to the player in one line.
This it the file stltest.cpp ...
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <sys/stat.h>
#include "mud.h"
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
#include <functional>
#include <iostream>
#include <sstream>
using namespace std;
// this define lets you create a string on-the-fly
// you can use output modifiers in the string, eg.
// string mystr = MAKE_STRING (
// "hello " << boolalpha << true << hex << 1234 << octal << 3456 << dec
// << 123456 << scientific << 123.45 << fixed << 1234.567 " );
//
// see: ios_base::fmtflags for more details
#define MAKE_STRING(msg) \
(((ostringstream&) (ostringstream() << boolalpha << msg)).str())
//-------------------------------------------------------------------------
// function object to print one object
//-------------------------------------------------------------------------
class fPrint
{
// remember who to print to (set in constructor)
CHAR_DATA * m_ch;
public:
// constructor - remember which player to send to
fPrint (CHAR_DATA * ch) : m_ch (ch) {};
// show this object
void operator() (const OBJ_DATA * obj)
{
string s = MAKE_STRING (
"object: '" << obj->description
<< "', level " << obj->level
<< ", weight " << obj->weight
<< endl );
send_to_char (s.c_str (), m_ch);
};
}; // end of class fPrint
//-------------------------------------------------------------------------
// sort sequence
//-------------------------------------------------------------------------
enum {
obj_sort_description,
obj_sort_level,
obj_sort_weight,
};
//-------------------------------------------------------------------------
// function object obj_less determine if one object is less than another
// - the sort sequence is provided in the constructor
//-------------------------------------------------------------------------
struct obj_less : binary_function<OBJ_DATA *, OBJ_DATA *, bool>
{
const int m_iSequence;
// constructor
obj_less (const int iSequence) : m_iSequence (iSequence) {};
bool operator() (const OBJ_DATA * obj1, const OBJ_DATA * obj2) const
{
switch (m_iSequence)
{
case obj_sort_description:
return strcmp (obj1->description, obj2->description) < 0;
case obj_sort_level:
return obj1->level < obj2->level;
case obj_sort_weight:
return obj1->weight < obj2->weight;
}; // end of switch on sequence
// default to sort on level if switch doesn't match
return obj1->level < obj2->level;
} // end of operator()
}; // end of obj_less
//-------------------------------------------------------------------------
// do_stltest - shows my inventory in various ways
//-------------------------------------------------------------------------
void do_stltest( CHAR_DATA *ch, char *argument )
{
// vector to hold however many objects we are carrying
vector <OBJ_DATA *> v;
//-------------------------------------------------------------------------
// add object list to vector
//-------------------------------------------------------------------------
for (OBJ_DATA * obj = ch->first_carrying; obj; obj = obj->next_content)
v.push_back (obj);
//-------------------------------------------------------------------------
// original order
//-------------------------------------------------------------------------
send_to_char ("\n\nObjects in original order ... \n\n", ch);
// display them
for_each (v.begin (), v.end (), fPrint (ch));
//-------------------------------------------------------------------------
// description order
//-------------------------------------------------------------------------
send_to_char ("\n\nObjects sorted into description order ... \n\n", ch);
// sort into description order
sort (v.begin (), v.end (), obj_less (obj_sort_description));
// display them
for_each (v.begin (), v.end (), fPrint (ch));
//-------------------------------------------------------------------------
// level order
//-------------------------------------------------------------------------
send_to_char ("\n\nObjects sorted into level order ... \n\n", ch);
// sort into level order
sort (v.begin (), v.end (), obj_less (obj_sort_level));
// display them
for_each (v.begin (), v.end (), fPrint (ch));
//-------------------------------------------------------------------------
// weight order
//-------------------------------------------------------------------------
send_to_char ("\n\nObjects sorted into weight order ... \n\n", ch);
// sort into weight order
sort (v.begin (), v.end (), obj_less (obj_sort_weight));
// display them
for_each (v.begin (), v.end (), fPrint (ch));
//-------------------------------------------------------------------------
// shuffle them
//-------------------------------------------------------------------------
send_to_char ("\n\nObjects shuffled ... \n\n", ch);
random_shuffle (v.begin (), v.end ());
// display them
for_each (v.begin (), v.end (), fPrint (ch));
}
Changes to tables.c ...
*** ../src.orig/tables.c 2004-01-21 13:03:44.000000000 +1100
--- tables.c 2004-01-21 13:05:44.000000000 +1100
***************
*** 681,686 ****
--- 681,687 ----
if ( !str_cmp( name, "do_supplicate" )) return do_supplicate;
if ( !str_cmp( name, "do_switch" )) return do_switch;
if ( !str_cmp( name, "do_showlayers" )) return do_showlayers;
+ if ( !str_cmp( name, "do_stltest" )) return do_stltest;
break;
case 't':
if ( !str_cmp( name, "do_tamp" )) return do_tamp;
***************
*** 1316,1321 ****
--- 1317,1323 ----
if ( skill == do_supplicate ) return "do_supplicate";
if ( skill == do_switch ) return "do_switch";
if ( skill == do_showlayers ) return "do_showlayers";
+ if ( skill == do_stltest ) return "do_stltest";
if ( skill == do_tamp ) return "do_tamp";
if ( skill == do_tell ) return "do_tell";
if ( skill == do_think ) return "do_think";
Add this to commands.dat ...
#COMMAND
Name stltest~
Code do_stltest
Position 100
Level 51
Log 1
End
Example of testing it ...
stltest
Log: Lordrom: stltest
Objects in original order ...
object: 'A book with "DON'T PANIC, LOOK AT ME!" written on the cover lies here.', level 0, weight 1
object: 'A blade of metallic stone protrudes from a leather-wrapped hilt.', level 1, weight 2
object: 'A strong metal collar from the academy', level 1, weight 5
object: 'A pair of kid gloves from the Academy lie here', level 1, weight 2
object: 'A charm bracelet from the academy lies here', level 1, weight 2
object: 'A pair of black combat boots from the Academy lies here', level 1, weight 3
object: 'A set of mail leggings has fallen here.', level 12, weight 4
object: 'A cherry pie makes your mouth water.', level 0, weight 1
object: 'A large marble fountain gushes forth here.', level 1, weight 500
object: 'A large chocolate cake awaits someone to eat it.', level 0, weight 1
object: 'Some sort of dried meat is on the ground here.', level 0, weight 1
Objects sorted into description order ...
object: 'A blade of metallic stone protrudes from a leather-wrapped hilt.', level 1, weight 2
object: 'A book with "DON'T PANIC, LOOK AT ME!" written on the cover lies here.', level 0, weight 1
object: 'A charm bracelet from the academy lies here', level 1, weight 2
object: 'A cherry pie makes your mouth water.', level 0, weight 1
object: 'A large chocolate cake awaits someone to eat it.', level 0, weight 1
object: 'A large marble fountain gushes forth here.', level 1, weight 500
object: 'A pair of black combat boots from the Academy lies here', level 1, weight 3
object: 'A pair of kid gloves from the Academy lie here', level 1, weight 2
object: 'A set of mail leggings has fallen here.', level 12, weight 4
object: 'A strong metal collar from the academy', level 1, weight 5
object: 'Some sort of dried meat is on the ground here.', level 0, weight 1
Objects sorted into level order ...
object: 'A book with "DON'T PANIC, LOOK AT ME!" written on the cover lies here.', level 0, weight 1
object: 'A cherry pie makes your mouth water.', level 0, weight 1
object: 'A large chocolate cake awaits someone to eat it.', level 0, weight 1
object: 'Some sort of dried meat is on the ground here.', level 0, weight 1
object: 'A blade of metallic stone protrudes from a leather-wrapped hilt.', level 1, weight 2
object: 'A charm bracelet from the academy lies here', level 1, weight 2
object: 'A large marble fountain gushes forth here.', level 1, weight 500
object: 'A pair of black combat boots from the Academy lies here', level 1, weight 3
object: 'A pair of kid gloves from the Academy lie here', level 1, weight 2
object: 'A strong metal collar from the academy', level 1, weight 5
object: 'A set of mail leggings has fallen here.', level 12, weight 4
Objects sorted into weight order ...
object: 'A book with "DON'T PANIC, LOOK AT ME!" written on the cover lies here.', level 0, weight 1
object: 'A cherry pie makes your mouth water.', level 0, weight 1
object: 'A large chocolate cake awaits someone to eat it.', level 0, weight 1
object: 'Some sort of dried meat is on the ground here.', level 0, weight 1
object: 'A blade of metallic stone protrudes from a leather-wrapped hilt.', level 1, weight 2
object: 'A charm bracelet from the academy lies here', level 1, weight 2
object: 'A pair of kid gloves from the Academy lie here', level 1, weight 2
object: 'A pair of black combat boots from the Academy lies here', level 1, weight 3
object: 'A set of mail leggings has fallen here.', level 12, weight 4
object: 'A strong metal collar from the academy', level 1, weight 5
object: 'A large marble fountain gushes forth here.', level 1, weight 500
Objects shuffled ...
object: 'Some sort of dried meat is on the ground here.', level 0, weight 1
object: 'A book with "DON'T PANIC, LOOK AT ME!" written on the cover lies here.', level 0, weight 1
object: 'A strong metal collar from the academy', level 1, weight 5
object: 'A set of mail leggings has fallen here.', level 12, weight 4
object: 'A blade of metallic stone protrudes from a leather-wrapped hilt.', level 1, weight 2
object: 'A charm bracelet from the academy lies here', level 1, weight 2
object: 'A large marble fountain gushes forth here.', level 1, weight 500
object: 'A pair of black combat boots from the Academy lies here', level 1, weight 3
object: 'A cherry pie makes your mouth water.', level 0, weight 1
object: 'A large chocolate cake awaits someone to eat it.', level 0, weight 1
object: 'A pair of kid gloves from the Academy lie here', level 1, weight 2