[Crossfire-wiki] [Crossfire DokuWiki] page changed: cfequip.cpp
no-reply_wiki at metalforge.org
no-reply_wiki at metalforge.org
Wed Apr 29 14:19:44 CDT 2009
A page in your DokuWiki was added or changed. Here are the details:
Date : 2009/04/29 14:19
User :
Edit Summary: Content moved to client_side_scripting:cfequip.cpp
@@ -1,351 +1 @@
- <code>
- /* cfequip.cpp
- * $Id: cfequip.cpp,v 1.3 2005/12/01 23:11:02 tbrown Exp $
- * Author: Terry Brown
- * Created: Tue Nov 29 2005
- */
-
- /*
-
- Bugs, contact:
-
- terry_n_brown at yahoo.com
-
- To compile:
-
- g++ cfequip.cpp -o cfequip
-
- To run from within the client:
-
- script /path/to/cfequip
-
- Commands to script from client:
-
- (replace '1' with the number of the script if more than one running,
- use client command 'scripts' to list)
-
- scripttell 1 cfe file <filename>
- set the file for storing / reading equipment sets
-
- scripttell 1 cfe store <name>
- save current equipment set as <name> (use a single word)
- the file is written every time you use this command, so there's no need
- to save before you quit
-
- scripttell 1 cfe use <name>
- equip the equipment set <name>
-
- scripttell 1 cfe list
- list known equipment sets
-
- scripttell 1 cfe quit
- quit the script - not really necessary
-
- Equipment needs unique names, e.g. "shoes +1" might be confused with
- "red shoes +1" - just rename the items as needed.
-
- Containers behave oddly, because "apply -u bag" opens rather than drops
- an active but non-open bag.
-
- */
-
- #include <vector>
- #include <map>
- #include <iostream>
- #include <fstream>
-
- using namespace std;
-
- #define inv_col_flag 6 // request items inv returns multiple columns, with
- // flags in column inv_col_flag
- #define inv_col_name 8 // and the name starting in column inv_col_name
- #define flag_equip 8 // the flags value to test for being equipped
- #define red "draw 3 " // see crossfire-client-1.8.0/common/newclient.h NDI_RED
- #define blue "draw 5 "
-
- // make a string of words into a vector of words
- vector<string> stringToVector(const string &s);
-
- // class the handle equipment sets
- class EquipmentSets
- {
- public:
- void setfile(const string &fn); // set the file sets are stored in
- void store(const string &name); // store current equipment as set <name>
- void use(const string &name); // equip equipment set <name>
- void list(); // list stored equipment sets
-
- private:
-
- typedef map<string, vector<string> > eSets;
- eSets m_dat;
- string m_fn;
-
- bool load(const string &fn);
- void save(const string &fn);
- };
-
- void EquipmentSets::setfile(const string &fn)
- {
- m_fn = fn;
- m_dat.clear();
- if (!load(m_fn))
- {
- cout << red << "Couldn't open '" << m_fn
- << "', will create on first"
- << " cfe_store command (if writeable)\n";
- }
- else
- {
- cout << blue << "Loaded " << m_fn << "\n";
- list();
- }
- }
-
- bool EquipmentSets::load(const string &fn)
- {
- ifstream in(fn.c_str(), ios::in);
- if (!in)
- {
- return false;
- }
-
- m_dat.clear();
- string c;
- while (in.good())
- {
- string l;
- getline(in, l);
- if (l.length() < 1)
- {
- break;
- }
- if (l[0] != '\t')
- {
- c = l;
- cout << blue << "Set '" << c << "'\n";
- }
- else
- {
- m_dat[c].push_back(l.substr(1));
- cout << blue << l << "'\n";
- }
- }
-
- return true;
- }
-
- void EquipmentSets::save(const string &fn)
- {
- ofstream out(fn.c_str(), ios::out);
- if (!out)
- {
- cout << red << "ERROR - couldn't write to '"
- << fn << "'\n";
- return;
- }
-
- for (eSets::const_iterator i = m_dat.begin();
- i != m_dat.end(); i++)
- {
- out << (*i).first << "\n";
-
- for (vector<string>::const_iterator j = (*i).second.begin();
- j != (*i).second.end(); j++)
- {
- out << "\t" << *j << "\n";
- }
- }
- }
-
- void EquipmentSets::list()
- {
- cout << blue << m_dat.size() << " sets loaded\n";
- for (eSets::const_iterator i = m_dat.begin();
- i != m_dat.end(); i++)
- {
- cout << blue << (*i).first << "\n";
- }
- }
-
- void EquipmentSets::store(const string &s)
- {
- m_dat[s].clear();
-
- cout << "request items inv\n";
- string l;
-
- while (getline(cin, l))
- {
- vector<string> r = stringToVector(l);
-
- if (r[3] == "end")
- {
- break;
- }
-
- if (r[0]+r[1]+r[2] == ("request" "items" "inv") )
- {
- int flags = atol(r[inv_col_flag].c_str());
- if (flags & flag_equip)
- {
- string item = "";
- string comma = "";
- for (unsigned int i = inv_col_name; i < r.size(); i++)
- {
- item = item + comma + r[i];
- comma = " ";
- }
- cout << blue << item << "\n";
- m_dat[s].push_back(item);
- }
- }
- }
-
- save(m_fn);
-
- cout << blue << "saved\n";
-
- }
-
- void EquipmentSets::use(const string &s)
- {
-
- if (m_dat.find(s) == m_dat.end())
- {
- cout << red << "Can't find set '" << s << "'\n";
- list();
- return;
- }
-
- cout << blue << "use " << s << " (" << m_dat[s].size() << " items)\n";
- cout << "request items inv\n";
- string l;
-
- while (getline(cin, l))
- {
- vector<string> r = stringToVector(l);
-
- if (r[3] == "end")
- {
- break;
- }
-
- if (r[0]+r[1]+r[2] == ("request" "items" "inv") )
- {
- int flags = atol(r[inv_col_flag].c_str());
- if (flags & flag_equip)
- {
- string item = "";
- string comma = "";
- for (unsigned int i = inv_col_name; i < r.size(); i++)
- {
- item = item + comma + r[i];
- comma = " ";
- }
- // cout << blue << item << "\n";
- cout << "issue 1 1 apply -u " << item << "\n";
-
- }
- }
- }
-
- for (vector<string>::const_iterator j = (m_dat[s]).begin();
- j != m_dat[s].end(); j++)
- {
- cout << "issue 1 1 apply -a " << *j << "\n";
- }
- }
-
- vector<string> stringToVector(const string &s)
- {
- vector<string> ans;
-
- string part;
-
- for (unsigned int i=0; i < s.length(); i++)
- {
- if (s[i] > ' ')
- {
- part += s[i];
- }
- else
- {
- if (part.length() > 0)
- {
- ans.push_back(part);
- }
- part = "";
- }
- }
-
- if (part.length() > 0)
- {
- ans.push_back(part);
- }
-
- return ans;
- }
-
- int main()
- {
- string s;
-
- cout << blue << "Starting cfequip\n";
- cout << blue << "================\n";
- cout << blue << "\n";
- cout << blue << "Supply equipment set file name with:\n";
- cout << blue << " scripttell 1 cfe file <filename>\n";
- cout << blue << "Other commands:\n";
- cout << blue << " scripttell 1 cfe list - list known equipment sets\n";
- cout << blue << " scripttell 1 cfe quit - end script\n";
- cout << blue << " scripttell 1 cfe store <name> - store current equipment as <name>\n";
- cout << blue << " scripttell 1 cfe use <name> - equip equipment set <name>\n";
-
- EquipmentSets es;
-
- while (cin.good())
- {
- getline(cin, s);
-
- vector<string> r = stringToVector(s);
-
- if (r[0] + r[2] == ("scripttell" "cfe") )
- {
- if (r.size() == 5 && r[3] == "file")
- {
- es.setfile(r[4]);
- }
- else if (r.size() == 4 && r[3] == "quit")
- {
- cout << blue << "cfequip quitting\n";
- cout.flush();
- return 0;
- }
- else if (r.size() == 4 && r[3] == "list")
- {
- es.list();
- }
- else if (r.size() == 5 && r[3] == "store")
- {
- es.store(r[4]);
- }
- else if (r.size() == 5 && r[3] == "use")
- {
- es.use(r[4]);
- }
- else
- {
- cout << red << "invalid cfe command\n";
- }
- }
-
- cout.flush();
- }
-
- return 0;
-
- }
-
- </code>
IP-Address : 70.245.1.210
Old Revision: http://wiki.metalforge.net/doku.php/cfequip.cpp?rev=1133482310
New Revision: http://wiki.metalforge.net/doku.php/cfequip.cpp
--
This mail was generated by DokuWiki at
http://wiki.metalforge.net/
More information about the crossfire-wiki
mailing list