[ScryMUD] SVN Commit Info r921 - branches/people/gingon/autonomous_npc/mud/grrmud/server
scrymud at wanfear.com
scrymud at wanfear.com
Fri Jun 1 16:56:33 PDT 2007
Author: gingon
Date: 2007-06-01 16:56:32 -0700 (Fri, 01 Jun 2007)
New Revision: 921
Added:
branches/people/gingon/autonomous_npc/mud/grrmud/server/autonomousNPC.cc
branches/people/gingon/autonomous_npc/mud/grrmud/server/autonomousNPC.h
Log:
Added: branches/people/gingon/autonomous_npc/mud/grrmud/server/autonomousNPC.cc
===================================================================
--- branches/people/gingon/autonomous_npc/mud/grrmud/server/autonomousNPC.cc (rev 0)
+++ branches/people/gingon/autonomous_npc/mud/grrmud/server/autonomousNPC.cc 2007-06-01 23:56:32 UTC (rev 921)
@@ -0,0 +1,147 @@
+
+#include "autonomousNPC"
+
+bool AutonomousGroup::addMember(critter* member){
+ if(member->group != null) return false;
+ groupmembers.push_front(member);
+ member->group = *this;
+ if(subgroup) member->subgroup = true;
+ return true;
+}
+bool AutonomousGroup::removeMember(critter* member){
+ for(i = groupmembers.begin(), i != groupmembers.end(), ++i){
+ if(*i == member){
+ groupmembers.erase(i);
+ if(subgroup) member->subgroup = false;
+ return true;
+ }
+ }
+ return false;
+}
+
+bool AutonomousGroup::removeSubgroup(AutonomousGroup* remsub){
+ for(i = subgroups.begin(), i != subgroups.end(), ++i){
+ if(*i == remsub){
+ //ok, we've got the right group
+ subgroups.erase(i);
+ --subgroupcount;
+ delete remsub;
+ return true;
+ }
+ }
+ }
+ return false; //isn't a subgroup of this group
+}
+
+bool AutonomousGroup::moveToSubgroup(critter* member, AutonomousGroup* moveto){
+ if(removeMember(member)){
+ if(moveto->addMember(member))return true;
+ }
+ return false;
+
+}
+bool AutonomousGroup::moveToParentGroup(critter* member){
+ if(removeMember(member)){
+ if(parentGroup->addmember(member))
+ return true;
+ }
+ return false;
+}
+
+bool AutonomousGroup::promote(critter* newleader){
+ demoteLeader();
+ if(newleader->leader) newleader->group->demote();//make sure we remove ourselves from other existing groups
+ newleader->group->removeMember();
+ addMember(leader); //add use to this group
+ removeMember(newleader); // remove us from this group if we are in it
+ leader = newleader;
+ leader->leader = true;
+ leader->group = *this;
+ return true;
+}
+
+bool AutonomousGroup::demote(){
+ if( leader!=null){
+ leader->leader = false;
+ addMember(leader);
+ leader = null;
+ return true;
+ }
+ return false;
+}
+
+bool AutonomousGroup::addSubGroup(critter* members, unsigned int mcnt, critter* sgleader){
+ AutonomousGroup* newgroup = new AutonomousGroup(members,mcnt,sgleader,*this);
+ if(newgroup!=null) return true;
+ return false;
+}
+
+
+/* not used
+bool AutonomousGroup::addSubGroup(AutonmousGroup* sg){
+ if(sg->parent != null) return false;
+ sg->parentgroup = *this;
+ subgroups.push_front(sg);
+ ++subgroupcount;
+}*/
+
+AutonomousGroup::AutonomousGroup(critter* members = null, unsigned int mcnt = 0, critter* gleader = null,AutonomousGroup* vparentgroup = null){
+ while(mcnt > 0){ // add our members
+ addMember(members);
+ --mcnt;
+ }
+ // ok, let's add our leader
+ promote(gleader);
+ //set our parent group
+ parentgroup == vparentgroup;
+ if(parentgroup){
+ subgroup = true;
+ parentgroup->subgroups.push_front(*this);
+ ++parentgroup->subgroupcount;
+ }
+ //done!
+}
+
+AutonomousGroup::~AutonomousGroup(){
+ //ok, first we clear the leader
+ demnote();
+ //next we remove our members
+ for(i = members.begin, i != members.end(), ++i){
+ member.removeMember(i);
+ }
+ //if we are a subgroup, remove ourselves from parent
+ if(subgroup){
+ for(i = parentgroup->subgroups->begin(), i != parentgroup->subgroups->end(), ++i){
+ if(*i = *this){
+ parentgroup->subgroups->erase(i);
+ --parentgroup->subgroupcount;
+ break;
+ }
+ }
+ }
+ //if we have subgroups, remove them also
+ while(subgroupcount > 0){
+ for(i = subgroup.begin, i != subgroup.end(), ++);
+ i->removeSubgroup(*i);
+ }
+ //make sure the manager ditches us too
+ autonomousNPCManager.removeGroup(*this);
+}
+
+bool AutonomousNPCManager::addGroup(autonomousGroup* addgroup){
+
+ groups.push_front(addgroup);
+ count++;
+ return true;
+}
+
+bool AutonomousNPCManager::removeGroup(autonomousGroup* remgroup){
+ for(i = groups.begin(), i != groups.end(), ++i){
+ if(*i == remgroup){
+ groups.erase(i);
+ --count;
+ return true;
+ }
+ }
+ return false;
+}
\ No newline at end of file
Added: branches/people/gingon/autonomous_npc/mud/grrmud/server/autonomousNPC.h
===================================================================
--- branches/people/gingon/autonomous_npc/mud/grrmud/server/autonomousNPC.h (rev 0)
+++ branches/people/gingon/autonomous_npc/mud/grrmud/server/autonomousNPC.h 2007-06-01 23:56:32 UTC (rev 921)
@@ -0,0 +1,127 @@
+#ifndef __autonomousNPC_h
+#define __autonomousNPC_h
+#include "const.h"
+#include "critter.h"
+
+typedef std::list<AutonomousGroup*> GroupList;
+typedef std::list<critter*> MemberList;
+
+class AutonomousGroup;
+
+struct common_routes{}; // stub for point to point routes
+
+typedef route char*;
+
+
+unsigned int mob_toughness(critter* mob, bool ignore_resists = true){ // estimate the overall toughness of a mob, by defualt ignores resists since most damage is physical
+ unsigned int value = 0;
+
+ value = mob->getLevel();
+
+ swtich(mob->getClass()){
+ case WARRIOR:
+ value += (mob->getHP()/50);
+ value += (mob->getMP()/300);
+ value += (mob->getSTR());
+ value += (mob->getDEX());
+ value += (mob->getCON());
+ value += (mob->getINT()/5);
+ value += (mob->getWIS()/5);
+ value += (mob->getCHR()/10);
+ value+= (getHIT, true)*5)
+ break;
+ case RANGER:
+ case THIEF:
+ value += (mob->getHP()/50);
+ value += (mob->getMP()/300);
+ value += (mob->getSTR()/1.25);
+ value += (mob->getDEX()*1.3);
+ value += (mob->getCON()/1.25);
+ value += (mob->getINT()/4);
+ value += (mob->getWIS()/4);
+ value += (mob->getCHR()/10);
+ value+= (getHIT, true)*5)
+ break;
+ case WIZARD:
+ value += (mob->getHP()/40);
+ value += (mob->getMP()/80);
+ value += (mob->getSTR()/5);
+ value += (mob->getDEX()/4);
+ value += (mob->getCON()/2.5);
+ value += (mob->getINT())1.5);
+ value += (mob->getWIS()/1.25);
+ value += (mob->getCHR()/10);
+ value+= (getHIT, true))
+ break;
+ case CLERIC:
+ value += (mob->getHP()/40);
+ value += (mob->getMP()/80);
+ value += (mob->getSTR()/5);
+ value += (mob->getDEX()/4);
+ value += (mob->getCON()/2.5);
+ value += (mob->getINT())1.25);
+ value += (mob->getWIS()/1.5);
+ value += (mob->getCHR()/10);
+ break;
+ case BARD:
+ value += (mob->getHP()/50);
+ value += (mob->getMP()/300);
+ value += (mob->getSTR()/1.25);
+ value += (mob->getDEX()/1.25);
+ value += (mob->getCON()/1.1);
+ value += (mob->getINT()/5);
+ value += (mob->getWIS()/5);
+ value += (mob->getCHR()/2);
+ break;
+ }
+}
+class AutonomousGroup {
+ int goals[10];
+ int goalvalues[10];
+ int goalscales[10];
+ unsigned int membercount;
+ unsigned int subgroupcount;
+ unsigned int id; // == guild tag in mob data
+ route* currentroute;
+ unsigned int routeidx; // where are we in a route?
+ bool subgroup; // true if this is a subgroup, ie a raiding party of a larger group
+ GroupList subgroups;
+ AutonomousGroup* parentgroup;
+ MemberList members;
+ critter* leader; //leader of the main group or leader of a subgroup party
+ unsigned int resoucethreshold; // amount of gold and such required before returning home and expending or depositing resources
+ unsigned int currentgoal;
+
+
+ AutonomousGroup() {int count = 0; int id = 0; leader = null, maingroup = null}
+
+ bool promote(critter* newleader);// promotes an existing mob to a leadership position, used to replace lost leaders or to form new groups from subsets
+ bool demote(); // used to replace existing leaders
+ bool expendResources(); //uses the group's resources to aqcuire more members, gear, or camps only used when the core leader is in a camp, or when no camp is present at leader's current location
+ bool move(); //leaders move with goals, individuals move to leaders, wander if no leader or goal is present
+ bool addMember(critter* member); // adds a member to this group
+ bool removeMember(critter* member); // removes a member from this group
+ bool addSubGroup(critter* members, unsigned int mcnt, critter* sgleader); adds a subgroup, requires mobs to populate with
+ bool removeSubgroup(AutonomousGroup* remsub); // kills a subgroup
+ bool moveToSubgroup(critter* member, AutonomousGroup* moveto); // move from main to sub
+ bool moveToMaingroup(critter* member); //move from sub to main
+ AutonomousGroup(critter* members, unsigned int mcnt, critter* leader, AutonomousGroup* vparentgroup);
+ ~AutonomousGroup();
+}
+
+class AutonomousNPCManager{
+private:
+ GroupList groups;
+ unsigned int count
+public:
+ void update(void);
+ void halt(void);
+
+ bool addGroup(autonomousGroup* addgroup);
+ bool removeGroup(autonomousGroup* remgroup);
+ bool queryStatus();
+
+ AutonomousGroup(){ count = 0; );
+ };
+
+#endif
\ No newline at end of file
More information about the ScryMUD
mailing list