From 238837d18f46aa7cb950d946cfec7b3d5137635d Mon Sep 17 00:00:00 2001 From: bitcraft Date: Thu, 19 Jan 2012 20:12:54 -0600 Subject: [PATCH] misc documentation cleanup --- NOTES | 24 ++++++++++++------------ npc/pirate/actions.py | 17 +++++++++++++++++ npc/pirate/actions.pyc | Bin 9124 -> 0 bytes pirate.prof | Bin 0 -> 184876 bytes pirate.py | 10 +++++----- pygoap/actions.py | 29 +++++++++++++++++++---------- pygoap/agent.py | 20 +++++++++++++++----- pygoap/blackboard.py | 23 +++++++++++++++++++++-- pygoap/environment.py | 28 ++++++++++++++++++++++------ pygoap/environment2d.py | 19 ++++++++++++++++++- pygoap/goals.py | 20 ++++++++++++++++++++ pygoap/goaltests.py | 2 -- pygoap/objectflags.py | 20 -------------------- pygoap/planning.py | 33 +++++++++++++++++++++++++++++++-- pygoap/tiledenvironment.py | 17 +++++++++++++++++ pygoap/util.py | 10 ---------- 16 files changed, 197 insertions(+), 75 deletions(-) delete mode 100644 npc/pirate/actions.pyc create mode 100644 pirate.prof delete mode 100644 pygoap/goaltests.py delete mode 100644 pygoap/objectflags.py delete mode 100644 pygoap/util.py diff --git a/NOTES b/NOTES index becac1a..a5a78a5 100644 --- a/NOTES +++ b/NOTES @@ -5,42 +5,42 @@ THIS IS MOSTLY NOTES FOR MYSELF planner -planner sould be able to reasonably predict the cost of repeating actions +planner should be able to reasonably predict the cost of repeating actions agents: -in an rpg game, the player can expect to talk to NPC'sr and and to gather +in an rpg game, the player can expect to talk to NPC's and and to gather information about quests, items, other npc's, etc. i think that goap can become an engine of sorts, dictating every action in the game. basic play elements can be emulated through goap and would not have to be explicitly coded into the game. take simple "hello" meet/greet actions with an npc: - npc will have a insatable desire to talk to a player + npc will have a insatiable desire to talk to a player they will have a different thing to say depending on mood/state of player a side effect of this will that npc's could possibly become more lifelike as -they can move around the game world to satisfy goals. to moderate and conrol +they can move around the game world to satisfy goals. to moderate and control the npc's and to make the game more enjoyable, npc's can have goals that are only relevant at certain times of day or days of the week. in the harvest moon series for example, the nps do have certain schedules that they will loosely follow. this makes the game play predictable once their -simple schedule is learned. imo, giving the npc's too much freedom to act wiil -make the game world seem more random, and potentially frusterating to play. +simple schedule is learned. imo, giving the npc's too much freedom to act will +make the game world seem more random, and potentially frustrating to play. tying the speech system to goap agents could make the gameplay more immersive by allowing the player to ask unscripted questions. while developing a system that perfectly synthesizes english is not a viable option, giving the player -the option to ask canned questions, unrealted to the quet or story, with the -ability to choose specfic parts of the question is a definate cool thing. +the option to ask canned questions, unrelated to the quest or story, with the +ability to choose specific parts of the question is a definite cool thing. for example, the player might ask an npc "have you seen gary?". the goap agent can then search it's memories of gary and give a response to the player. because this would be based on the agent's memory, and not some canned -response, it will simotaniously make the make more immersive and releave the -game designers and writters the burden to creating dialog. +response, it will simultaneously make the make more immersive and relieve the +game designers and writers the burden to creating dialog. -a frusterating aspect of some games is dealing with faction alliances. for +a frustrating aspect of some games is dealing with faction alliances. for example, in some games, killing or doing some negative action against a member of a faction will cause all members of that faction to instantly become hostile toward the player. this is unrealistic in situations where the information @@ -48,7 +48,7 @@ that our your hostility could not have reached the other party. simulating the spread of information could also be simulated in goap by creating goals that one agent wants to tell other agents things that he saw the -player do. for example, they may be nuetral npc's that will gossip with other +player do. for example, they may be neutral npc's that will gossip with other npc's in distant towns. or, members of one faction may use radio, phones, letters, messengers, etc to tell other faction members about the player. diff --git a/npc/pirate/actions.py b/npc/pirate/actions.py index b71d52a..d254984 100644 --- a/npc/pirate/actions.py +++ b/npc/pirate/actions.py @@ -1,3 +1,20 @@ +""" +Copyright 2010, 2011 Leif Theden + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + """ This is an example module for programming actions for a pyGOAP agent. diff --git a/npc/pirate/actions.pyc b/npc/pirate/actions.pyc deleted file mode 100644 index 0b449ad58e4fae07034e42b2912a5faeaf6511c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9124 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. +""" + """ These are the building blocks for creating pyGOAP agents that are able to interact with their environment in a meaningful way. @@ -10,14 +27,6 @@ to satisfy the current goal. They will be instanced and the the agent will execute the action in some way, one after another. -There is a delicate balance between the actions here and the "ActionEffects" -and "ActionPrereqs" that you will have to master. A simple way to mentally -distinguish them is that the prereqs and effects are clues to the planner to -behave in a certain way and will never change anything except a blackboard. -The action classes here are the 'guts' for the action and will modify the game -environment in some meaningful way. - - Actions need to be split into ActionInstances and ActionBuilders. An ActionInstance's job is to work in a planner and to carry out actions. @@ -35,7 +44,7 @@ class ActionBuilder(object): """ ActionBuilders examine a blackboard and return a list of actions - that can be succesfully completed at the the time. + that can be successfully completed at the the time. """ def get_actions(self, caller, bb): @@ -173,7 +182,7 @@ def pause(self): class CalledOnceAction(CallableAction): """ - Is finished imediatly when started. + Is finished immediately when started. """ def start(self): diff --git a/pygoap/agent.py b/pygoap/agent.py index a6d8cd1..fa3bbd6 100644 --- a/pygoap/agent.py +++ b/pygoap/agent.py @@ -1,5 +1,18 @@ """ -fill in later +Copyright 2010, 2011 Leif Theden + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . """ from environment import ObjectBase @@ -23,9 +36,7 @@ class GoapAgent(ObjectBase): """ AI Agent - every agent should have at least one goal (otherwise, why use it?) inventories will be implemented using precepts and a list. - currently, only one action running concurrently is supported. """ @@ -36,13 +47,12 @@ class GoapAgent(ObjectBase): def __init__(self): self.idle_timeout = 30 self.bb = Blackboard() - self.mem_manager = MemoryManager(self) + #self.mem_manager = MemoryManager(self) self.planner = plan self.current_goal = None self.goals = [] # all goals this instance can use - self.invalid_goals = [] # goals that cannot be satisfied now self.filters = [] # list of methods to use as a filter self.actions = [] # all actions this npc can perform self.plan = [] # list of actions to perform diff --git a/pygoap/blackboard.py b/pygoap/blackboard.py index 6007eb5..06c9021 100644 --- a/pygoap/blackboard.py +++ b/pygoap/blackboard.py @@ -1,7 +1,26 @@ +""" +Copyright 2010, 2011 Leif Theden + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + """ Memories are stored precepts. A blackboard is a device to share information amongst actions. This implementation uses sqlite3 as a backend for storing memories. + +The MemManager class is not used. """ import sqlite3 @@ -43,8 +62,8 @@ def __init__(self, owner, value): # initialize our database -engine = create_engine('sqlite://') -Base.metadata.create_all(engine) +#engine = create_engine('sqlite://') +#Base.metadata.create_all(engine) class MemoryManager(object): diff --git a/pygoap/environment.py b/pygoap/environment.py index 48a16df..1aa2710 100644 --- a/pygoap/environment.py +++ b/pygoap/environment.py @@ -1,6 +1,23 @@ +""" +Copyright 2010, 2011 Leif Theden + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + """ Since a pyGOAP agent relies on cues from the environment when planning, having -a stable and effecient virtual environment is paramount. +a stable and efficient virtual environment is paramount. When coding your game or simulation, you can think of the environment as the conduit that connects your actors on screen to their simulated thoughts. This @@ -13,7 +30,6 @@ """ from actionstates import * -from objectflags import * from itertools import chain, repeat, product, izip @@ -159,7 +175,7 @@ def update(self, time_passed): def broadcast_precepts(self, precepts, agents=None): """ - for effeciency, please use this for sending a list of precepts + for efficiency, please use this for sending a list of precepts """ if agents == None: @@ -174,12 +190,12 @@ def model_precept(self, precept, other): """ override this to model the way that precept objects move in the simulation. by default, all precept objects will be distributed - indiscrimitely to all agents. + indiscriminately to all agents. - while this behaviour may be desireable for some types of precepts, + while this behavior may be desirable for some types of precepts, it doesn't make sense in many. - the two big thigs to model here would be vision and sound. + the two big things to model here would be vision and sound. """ return precept diff --git a/pygoap/environment2d.py b/pygoap/environment2d.py index d6c3df2..98c4dd7 100644 --- a/pygoap/environment2d.py +++ b/pygoap/environment2d.py @@ -1,6 +1,23 @@ +""" +Copyright 2010, 2011 Leif Theden + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + """ Since a pyGOAP agent relies on cues from the environment when planning, having -a stable and effecient virtual environment is paramount. This environment is +a stable and efficient virtual environment is paramount. This environment is simply a placeholder and demonstration. When coding your game or simulation, you can think of the environment as the diff --git a/pygoap/goals.py b/pygoap/goals.py index d7b9b27..d43163d 100644 --- a/pygoap/goals.py +++ b/pygoap/goals.py @@ -1,3 +1,20 @@ +""" +Copyright 2010, 2011 Leif Theden + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + """ Goals in the context of a pyGOAP agent give the planner some direction when planning. Goals are known to the agent and are constantly monitored and @@ -7,6 +24,9 @@ See the modules effects.py and goals.py to see how these are used. +The Goal class has a lot of uses in the engine, see the pirate's actions for +an idea of what they are used for. Not all of the goals here are used/tested. + test() should return a float from 0-1 on how successful the action would be if carried out with the given state of the bb. diff --git a/pygoap/goaltests.py b/pygoap/goaltests.py deleted file mode 100644 index c5c2eee..0000000 --- a/pygoap/goaltests.py +++ /dev/null @@ -1,2 +0,0 @@ -import unittest - diff --git a/pygoap/objectflags.py b/pygoap/objectflags.py deleted file mode 100644 index 3ffcad0..0000000 --- a/pygoap/objectflags.py +++ /dev/null @@ -1,20 +0,0 @@ -states = """ -liquid -glowing -hot -frozen -burning -normal -dead -dying -bleeding -cracked -broken -hard -soft -sticky -ooze -gas -""".strip().split('\n') - - diff --git a/pygoap/planning.py b/pygoap/planning.py index d03c56a..dfab784 100644 --- a/pygoap/planning.py +++ b/pygoap/planning.py @@ -1,6 +1,35 @@ """ -Goals and prereqs are related. The Vaildator class system removes the need to -duplicate similar functions. +Copyright 2010, 2011 Leif Theden + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + +""" +Copyright 2010, 2011 Leif Theden + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . """ from blackboard import Blackboard diff --git a/pygoap/tiledenvironment.py b/pygoap/tiledenvironment.py index bbe6a23..3e3e370 100644 --- a/pygoap/tiledenvironment.py +++ b/pygoap/tiledenvironment.py @@ -1,3 +1,20 @@ +""" +Copyright 2010, 2011 Leif Theden + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + from environment2d import XYEnvironment import tmxloader from pygame import Surface diff --git a/pygoap/util.py b/pygoap/util.py deleted file mode 100644 index 2eb8b3b..0000000 --- a/pygoap/util.py +++ /dev/null @@ -1,10 +0,0 @@ - -DEBUG = False - - - -def dlog(text): - print text - - -