[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