Git Product home page Git Product logo

ainneve's Introduction

Evennia MUD/MU* Creation System

unittestciimg Coverage Status Pypi Version

Evennia is a modern library for creating online multiplayer text games (MUD, MUSH, MUX, MUCK, MOO etc) in pure Python. It allows game creators to design and flesh out their ideas with great freedom.

Evennia does not impose a particular style, genre or game mechanic. Instead it solves the boring networking and basic stuff all online games need. It provides a framework and tools for you to build the game you want. Coding in Evennia is done using normal Python modules imported into the server at runtime.

Evennia has extensive documentation. It also has a very active community with discussion forums and a discord server to help and support you!

Installation

pip install evennia
    (windows users once: py -m evennia)
evennia --init mygame
cd mygame
evennia migrate
evennia start / stop / reload

See the full installation instructions for more help.

Next, browse to http://localhost:4001 or use your third-party mud client to connect to localhost, port 4000 to see your working (if empty) game!

screenshot A game website is created automatically. Connect to your Evennia game from your web browser as well as using traditional third-party clients.

Where to go next

If this piqued your interest, there is a lengthier introduction to read. You can also read our Evennia in pictures overview. After that, why not check out the Evennia Beginner tutorial.

Welcome!

ainneve's People

Contributors

ahmedcharles avatar aliceafterall avatar andrei-pmbcn avatar chrishc avatar chrislr avatar dernarr avatar dgisser avatar ergodicbreak avatar feend78 avatar friarzen avatar griatch avatar inspectorcaracal avatar jaykingamez avatar maxsond avatar nadorrano avatar stefanludlow avatar whitenoiseoss avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ainneve's Issues

Write Room typeclass

The base Room typeclass needs to be constructed.

This is a fairly easy task, but it will require knowledge of the Object API. Whoever writes this will be doing things like attributes for a short/long description, a dict or list for contents of the room, perhaps a room size, weight capacity, or something along these lines.

The methods written will do things like dictate how the appearance of a room appears to players (Object's return_appearance method). This is a core piece of functionality, and it must be fleshed out before building can begin.

Enhance return_appearance on Character Typeclass

The character typeclass is currently using the default return_appearance hook implementation from DefaultCharacter/DefaultObject, which isn't aware of the difference between inventory items and equipped items, and displays all of the character's items to anyone looking at it.

Ideas for improvements to return_appearance:

  • Perception checks to give more or less detailed messages to the looker, including archetype, race, possibly indicators for health and/or stamina.
  • Hide contents of character inventory from lookers.
  • Show equipped items to lookers.

Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Build a limited, wilderness "training" area within Riverport

Before we get too much farther on the combat and other game systems, we could use a small grouping of rooms that can serve as a testing ground.

This will be the first permanent parts of the Ainneve game world, and it should be comprised of 5-7 rooms near the center of Riverport. To anchor this area to the maps that @kylemecklem has created, it should include the bridge near the center of the town at coordinates (36, 18) (see Riverport.pdf), as well as one room along the main east-west road, and 3-5 additional rooms north of the road that will be semi-wilderness along the river shore, and can provide some low-level enemies to train against.

Any interested builders should comment on this issue if you are interested in working on this or have questions.

Implement Commands Based On Medicine Skill

OA Origins

In the Open Adventure red book, the Medicine abillity is described as

“Medicine” is the practice of healing and nurturing. A character who practices medicine can remove adverse conditions or cure certain poisons.

It is a one round action for which, if the skill test is successful, removes one condition token from the target character, but if failed, the target character must make a will save or lose one HP.


Ainneve Considerations

However, in Ainneve, we are treating Medicine as a skill, rather than as a single ability, which means there will ideally be a few different commands that are governed by it. For example, we may want to have a separate heal command versus cure poison or others for individual status effects.

Because these commands will generally target only characters, they should be among the easiest and most straightforward to implement. If you are interested in working on this task, please feel free to discuss your ideas in this issue.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Customize combat messaging for weapons

Currently, all weapons use the base Weapon typeclass's combat messaging. They are stored in an dict attribute called messages that has four keys for the four possible weapon attack outcomes.

  • dmg_hp - displayed when the weapon is used to damage the target's HP
  • dmg_sp - displayed when the weapon is used to damage the target's SP
  • dodged - displayed when the attack is dodged
  • missed - displayed when the attack misses

Here is a link to the messages' definition in the base typeclass: https://github.com/evennia/ainneve/blob/master/typeclasses/weapons.py#L29

To implement this, a messages key will need to be added to each weapon prototype in the prototypes_weapons.py file.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Unable to Equip Objects

https://github.com/evennia/ainneve/blob/master/commands/equip.py#L92

After initial character generation (with a purchase of equipment):

equip lance
There is no 'lance' here.
You have nothing in your equipment.

inv
You are carrying:
a lance polearm A sturdy wooden rod fitted with a menacing spike, (Damage: 4)
this lance polearm threatens even enemies at a
distance.


When looking at the code, this seems to be the issue:

equip.py line 92:

def func(self):
    caller = self.caller
    args = self.args.strip()
    swap = any(s.startswith('s') for s in self.switches)

    if hasattr(self, "item"):
        obj = self.item
        del self.item
    else:
        **obj = self.caller.search(args) if args else None**

This else statement always seems to fire, but is not able to find anything in the character's inventory. Tested this (without full debug) by doing:

print args
print obj (after assignment, always None)
print caller
print caller.contents

This verifies that the args are as expected, the obj object is None, the caller is as expected, and the caller.contents contains the object that args should reference. Additionally, tested via the find command with the args string and was able to locate the object with no issue.

Flesh out Character typeclass

The Character typeclass is incomplete and needs a great many more methods.

At the time of this issue being written, it is only capable of being skeleton'd out for the most part. It should return certain properties (such as armor) and have any methods that it may need. Keep in mind Character is the base for NPC/Mob/etc. Things specific to things like Shopkeepers and beasts should not go in Character.

While the programming is not difficult, the amount of other things that must be considered is fairly formidable.

move primary/secondary traits out of Character to integrate with Archetypes

Part of the effort to slim down Character and make things modular. Since it's really Open Adventure archetypes that define primary traits, and we derive secondary traits from primary traits, I propose integrating primary/secondary traits with archetype and moving them out of Character altogether.

By integrating I mean the archetype base template will instantiate Traits, like we have in Character at the moment.

This will probably include moving the function base_stat as well, which currently calculates secondary traits.

Implement Commands Based On Appraise Skill

OA Origins

In the Open Adventure red book, Appraise abillity is described as

The PC with an astute eye for detail may attempt to appraise the target Item (such as a piece of treasure, armor, weapon or equipment) to determine an accurate value of it's worth.

It is an action that takes one minute for which, if the skill test is successful, the item's true value is revealed, but if failed, the character gets false information about the item.


Ainneve Considerations

Since we are considering Appraise as a skill, rather than an ability, we have the option to create addition commands or situations where the Appraise skill is required. For now, a basic implementation of the appraise command would be a great start.

Because this command will target only items in the character's inventory, it should be a fairly self-contained and straightforward to create. If you are interested in working on this task, please feel free to discuss your ideas in this issue.

Bug: Traceback on Combat

Just wanted to put this here, got a traceback testing combat.

blah says, "iwill"
blah says, "kill you now"
blah wields a battle axe.
blah attacks you!
You are in combat.
  Opponents:
    blah at ranged range.
  The current turn timer has 120 seconds remaining.
The turn begins. Declare your actions!
Icarus says, "bah!"
You add 'retreat' to the combat queue.
You add 'attack blah' to the combat queue.
.. blah removes a battle axe.
.. blah removes a battle axe.
.. blah equips a javelin.
-> Icarus has already retreated to ranged range.
.. blah removes a javelin.
.. blah equips a javelin.
-> Icarus does not have a weapon that can attack opponents at ranged distance.
Next turn begins. Declare your actions!
You add 'advance on blah' to the combat queue.
You add 'attack blah' to the combat queue.
Turn timer timed out. Continuing.
-> Icarus advances to melee range with blah.
.. blah stares into space vacantly.
-> Icarus attacks blah with a battle axe, striking a painful blow.
Next turn begins. Declare your actions!
Icarus says, "My name is ignio montoya! You killed my father, prepare to die!"
You add 'attack blah' to the combat queue.
You add 'attack blah' to the combat queue.
-> Icarus attacks blah with a battle axe, striking a painful blow.
Icarus has vanquished blah.
blah falls dead.
ValueError: "<CombatHandler: combat_handler_513>" needs to have a value for field "scriptdb" before this many-to-many relationship can be used.
An untrapped error occurred. Please file a bug report detailing the steps to reproduce.
(Traceback was logged 2017-01-09 02:15:17-0000).


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

move mod_stat out of Character

Currently the function mod_stat() in Character basically is a custom rule about the Mana secondary trait. I think we should consider integrating this in some way with Trait, so that traits can have custom rules about their minimums/maximums. Then we can remove this from Character altogether.

Start using Travis CI

In order to add Evennia as a dependency to the build it seems like we'll have to commit a custom ./install-dependencies.sh (to pull down Evennia) as well adding a pip requirements.txt .

Create NPC shop(s)

Currently in Ainneve, the chargen menu provides the opportunity to "purchase" equipment, but we do not yet have an in-game NPC shop.

Shops can generally follow the structure of the NPC Shop Tutorial.

evennia start throws stacktrace in ainneve

74 static files copied to '/Users/cpatti/src/personal/mymud/ainneve/web/static'.

Starting Evennia Server (output to stdout).

Starting Evennia Portal in Daemon mode (output to portal logfile).
cpatti@MBP15-04484 11:59:38 ~/src/personal/mymud/ainneve |master ✓| →   Server started for the first time. Setting defaults.
 Creating objects (Player #1 and Limbo room) ...
--------------------------------------------------
 Ainneve Portal (0.5.0 (rev 7f11256)) started.
  amp (to Server): 5000
  telnet: 4000
  webproxy:8000 (<-> 5001)
   + client (None:8001)
--------------------------------------------------
Unhandled Error
Traceback (most recent call last):
  File "/Users/cpatti/src/personal/mymud/lib/python2.7/site-packages/twisted/application/app.py", line 617, in run
    runApp(config)
  File "/Users/cpatti/src/personal/mymud/lib/python2.7/site-packages/twisted/scripts/twistd.py", line 25, in runApp
    _SomeApplicationRunner(config).run()
  File "/Users/cpatti/src/personal/mymud/lib/python2.7/site-packages/twisted/application/app.py", line 348, in run
    self.application = self.createOrGetApplication()
  File "/Users/cpatti/src/personal/mymud/lib/python2.7/site-packages/twisted/application/app.py", line 413, in createOrGetApplication
    application = getApplication(self.config, passphrase)
--- <exception caught here> ---
  File "/Users/cpatti/src/personal/mymud/lib/python2.7/site-packages/twisted/application/app.py", line 424, in getApplication
    application = service.loadApplication(filename, style, passphrase)
  File "/Users/cpatti/src/personal/mymud/lib/python2.7/site-packages/twisted/application/service.py", line 411, in loadApplication
    passphrase)
  File "/Users/cpatti/src/personal/mymud/lib/python2.7/site-packages/twisted/persisted/sob.py", line 207, in loadValueFromFile
    eval(codeObj, d, d)
  File "/Users/cpatti/src/personal/mymud/evennia/evennia/server/server.py", line 464, in <module>
    EVENNIA = Evennia(application)
  File "/Users/cpatti/src/personal/mymud/evennia/evennia/server/server.py", line 157, in __init__
    self.run_initial_setup()
  File "/Users/cpatti/src/personal/mymud/evennia/evennia/server/server.py", line 249, in run_initial_setup
    initial_setup.handle_setup(0)
  File "/Users/cpatti/src/personal/mymud/evennia/evennia/server/initial_setup.py", line 211, in handle_setup
    setup_func()
  File "/Users/cpatti/src/personal/mymud/evennia/evennia/server/initial_setup.py", line 98, in create_objects
    nohome=True)
  File "/Users/cpatti/src/personal/mymud/evennia/evennia/utils/create.py", line 123, in create_object
    new_object.save()
  File "/Users/cpatti/src/personal/mymud/evennia/evennia/utils/idmapper/models.py", line 383, in save
    super(SharedMemoryModel, self).save(*args, **kwargs)
  File "/Users/cpatti/src/personal/mymud/lib/python2.7/site-packages/django/db/models/base.py", line 734, in save
    force_update=force_update, update_fields=update_fields)
  File "/Users/cpatti/src/personal/mymud/lib/python2.7/site-packages/django/db/models/base.py", line 771, in save_base
    update_fields=update_fields, raw=raw, using=using)
  File "/Users/cpatti/src/personal/mymud/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 201, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/Users/cpatti/src/personal/mymud/evennia/evennia/typeclasses/models.py", line 76, in post_save
    instance.at_first_save()
  File "/Users/cpatti/src/personal/mymud/evennia/evennia/objects/objects.py", line 824, in at_first_save
    self.at_object_creation()
  File "/Users/cpatti/src/personal/mymud/ainneve/typeclasses/characters.py", line 159, in at_object_creation
    self.base_stat(stat.name.lower(), rulebook.roll_stat())
exceptions.AttributeError: 'str' object has no attribute 'name'


Failed to load application: 'str' object has no attribute 'name'

Feature Request: Changes to the TraitFactory

@feend78, @ergodicbreak, @whitenoiseoss

I have looked more closely into the handling of Traits/TraitFactory after a user asked me about implementation details. I have some suggestions from the perspective of core Evennia:

  1. To keep consistency with Evennia's source, I suggest that the TraitFactory class is renamed to TraitHandler since it works basically like a handler in Evennia (from the outside it looks like an object on which you access member-traits).
  2. The internal property dbobject (for the _SaverDict) is potentially confusingly named since "dbobject" has a legacy use in Evennia to mean "ObjectDB" and other base django model classes. Maybe I'm the only one confused by it, but I would recommend renaming it to attr_dict or even saver_dict for clarity.
  3. That said, I don't think it's really all that necessary to have TraitFactory/Handler accept a separately created Attribute dict as input. This could just as well be a string for the name of the Attribute you want to use or, better, child-classes of handlers hard-coding the storage-name (like how Tag/AttributeHandlers do it). The reason for this is partly that it muddles the API (why should the user need to know they must initialize a Attribute dict when it's only ever used internally?) but mainly because passing the _SaverDict itself around is potentially not future proof. That _SaverDicts retain their link to the database is an implementation side-effect of Attributes; Their names start with a _ for a reason - I'm not comfortable with them being passed around and themself used as a main unit of data; Attribute internal implementation may (not saying it will, but may) change at some point. Letting the TraitFactory itself manage its own storage is also in line with how all other handlers in Evennia works (the standard is in fact to pass in the typeclass itself and have the handler access it to set up its storage as needed).
  4. There is no need to fully comply with how handlers are used in Evennia, but you should be aware that all evennia handlers use handler methods named get/add/remove/clear/all to access and modify internal state. In Evennia's case this is because handlers generally require extensive extra arguments (so a plain property assignment is not enough). But it's worth to keep in mind.
  5. As far as I can tell there does not seem to be a reason to not use the evennia.utils.utils.lazy_property decorator for assigning traits/skillsproperties on Character, similarly to how it's done for equip.

Traceback on @Open

When using the following @batchcommand (PasteBin Link of Batchcommand) in a fresh install of Ainneve, @OPEN commands fail with the following traceback:

28/28: @open East;e,West,w = arena#5                  
TypeError: object of type 'Character' has no len()
An untrapped error occurred. Please file a bug report detailing the steps to reproduce.
(Traceback was logged 2016-08-07 22:21:55-0400).

I can confirm that the same @batchcommand works just fine in production Evennia

Edit: adding console log: http://pastebin.com/NJmED4GU

Write Character Generation

This will involve creating a Room typeclass for character generation, a CmdSet for the character generation commands, and an understanding of the Character typeclass.

This will utilize MenuNode from the contrib unless decided otherwise.

This is not terribly difficult, but has a lot of moving pieces.

Set up base Room and Exit typeclasses

In IRC, we've had a few discussions about implementing some baseline typeclass features for rooms and exits. I wanted to continue that here. Some topics that have come up:

  • Using ExtendedRoom as the parent class of our Room typeclass
  • Rooms incorporating a linear range / size that affects room capacity and combat
  • Rooms having terrain types and corresponding MV costs to enter
  • Use of "slow exits"
  • Ability to view an exit's destination through a room's Exits

Design the ability system

Hi all,

Creating this so we can have clarity around how the ability system will work.

Objectives from IRC discussion

  • Ability system based on Open Adventure rules
  • Abilities can be either skills or spells, unique structure for each
  • Players will start with all abilities during character creation
  • Players will have ability points to distribute during character creation
  • Ability points can be used to improve abilities in order to customize characters effectiveness

If this is incorrect, please advise and I'll update this post.

Questions

  • Discussion Point 1: Should players have the ability to learn and unlearn skills in the game
  • Discussion Point 2: How to store abilities
  • Discussion Point 3: Data driven vs de-centralised system

Decision Point 1: Learning/Unlearning Skills

Should we be introducing the basic concept of learning/unlearning skills as part of the initial Ainneve role out? Is it an important core feature that people who fork Ainneve in the future will likely use, i.e. allow players to learn a new skill via a 'trainer mob' or purchase new 'spellbooks' etc.

Decision Point 2: How to store abilities

How do we actual store skills and spells on a character? The logical conclusion would be to create a new attribute on the character class, i.e.

self.db.skills = {}
self.db.spells ={}

New Skill and Spell classes can be created which inherit from a parent Ability Class. These objects can then be assigned for each ability and stored under the character class. The problem I can see with this system is how you maintain it moving forward. Each object that is initialized using this approach is a unique instances assigned to each player. There is no simple and clean method that allows us to make tweaks or modifications to skills or spells and have these propagate to all players.

Decision Point 3: Data driven vs de-centralised

How do we structure the code? The two options that have been discussed are data driven and decentralization.

Data driven implying that we have a skill and spell database where we store all the the core attributes. This would include things like descriptions, cast/use messages, modifiers, delay_on use settings etc. When coding new skills and spells, you can make reference back to the database to pull key information.

De-centralised:

A class is defined for each skill and spell and all the relevant attributes are hardcoded within the relevant python source file.

Other

Please post any other items that need to be discussed for abilities and I'll update the top post to reflect the current position.

world/build directory?

"Build scripts are in the world/build/ directory and have *.ev or *.py extensions."

There is no world/build directory... am I missing something here?

Flesh out Race class

The Race class is now ready to be fleshed out, as the underlying infrastructure is complete.

The required fields will need to be decided by the developer. A good start is already in race.py, but it's missing methods and properties that may be necessary, and it may need more or less fields. The OA rulebook should be consulted to make these decisions.

Any architecture/programming questions can go to whitenoise, or just be posted here.

Create Archetype Starter Gear

Write and create Starter Gear for each Archetype. This can be a joint effort between a builder and a coder.

On the builder side, what is needed:
Item short and long descriptions (i.e., "This breastplate is made of a fine..." and "a fine, leather breastplate")
What slots the item will take up
Any effects of the item (is it cursed? does it boost a stat? does it give health regen?)

On the coder side:
Create a Typeclass for each abstracted type of item (a Breastplate typeclass for example, from Armor, that is coded to only take up a 'torso' slot)--then all things that only take up the Torso can be Breastplates.
Add to core typeclasses if necessary for decided item effects
Write Spawner/Prototype code to generate these items

Refactor: Use django.conf.settings instead of server.conf.server

E.g. at

https://github.com/evennia/ainneve/blob/master/typeclasses/characters.py#L19

the settings module is directly imported as from server.conf import settings. This is explicitly not recommended in Django, you should always use from django.conf import settings. See the django settings docs; there is no need to deviate from the django config mechanic for no reason. This should be changed to the right way wherever it occurs.
.
Griatch

fix `CharTraitsTestCase` failure

There's a wily whitespace problem with this test case, https://github.com/evennia/ainneve/blob/master/commands/tests.py#L17, that I've tried and failed to track down.

My test output (on Windows and Travis) is identical with a local diff, but the test itself fails. However using an online diff tool, I see some weird spaces after "Magic" and "Carry Weight", which coincidentally have some custom whitespace -- maybe it's a Windows line ending issue?

I'd appreciate someone on Mac/Linux giving this a look.

Chargen error message

I am using Windows 8.1 with Python 2.7.1 and I've noticed problems with the chargen command.

Using a fresh install, I login as the super user and attempt to create a new character:

@charcreate temp

Welcome to Ainneve, the example game for Evennia.

To begin, select an Archetype. There are three base
archetypes to choose from, plus three dual archetypes which
combine the strengths and weaknesses of two archetypes into one.

Select an Archetype by number below to view its details, or help
at any time for more info.

1: Arcanist 5: Warrior-Arcanist
2: Scout 6: Arcanist-Scout
3: Warrior
4: Warrior-Scout

I select any number and it generates the following traceback:

Menu object not found as abba(player 1).ndb._menutree! An untrapped error occurred. Please file a bug report detailing the steps to reproduce. Server log time stamp is '2016-03-22 19:47:38+1100'. A command handler bug occurred. Please file a bug report with the Evennia project. Include the relvant traceback from the server log at time stamp '2016-03-22 19:47:38+1100'.

The traceback is:

2016-03-22 20:00:48+1100 [AMPProtocol,0,127.0.0.1] [..] Logged in: abba(player 1) ('127.0.0.1', 55528) (1 session(s) total)
2016-03-22 20:00:51+1100 [AMPProtocol,0,127.0.0.1] [::] Traceback (most recent call last):
2016-03-22 20:00:51+1100 [AMPProtocol,0,127.0.0.1] [::] File "d:\github\evennia\evennia\commands\cmdhandler.py", line 435, in _run_command
2016-03-22 20:00:51+1100 [AMPProtocol,0,127.0.0.1] [::] ret = yield cmd.func()
2016-03-22 20:00:51+1100 [AMPProtocol,0,127.0.0.1] [::] File "d:\github\evennia\evennia\utils\evmenu.py", line 202, in func
2016-03-22 20:00:51+1100 [AMPProtocol,0,127.0.0.1] [::] raise EvMenuError(err)
2016-03-22 20:00:51+1100 [AMPProtocol,0,127.0.0.1] [::] EvMenuError: Menu object not found as abba(player 1).ndb._menutree!
2016-03-22 20:00:51+1100 [AMPProtocol,0,127.0.0.1] [::] Traceback (most recent call last):
2016-03-22 20:00:51+1100 [AMPProtocol,0,127.0.0.1] [::] File "d:\github\evennia\evennia\commands\cmdhandler.py", line 569, in cmdhandler
2016-03-22 20:00:51+1100 [AMPProtocol,0,127.0.0.1] [::] ret = yield _run_command(syscmd, syscmd.key, sysarg)
2016-03-22 20:00:51+1100 [AMPProtocol,0,127.0.0.1] [::] ErrorReported

Create Item typeclass

The Item typeclass needs to be created. This will be the base typeclass for all items in the game, such as (for example):

Weapon
Armor
Shield
Potion
and so on...

Item should be very general, something that all items would have. For example: value, name, short description, long description... and any properties/methods that would go along with these.

Sdescs will not evaluate between a and an based on potential {}, e.g. a yellow rat, an orange rat

When dynamic descriptions are created, there is currently nothing in place to automatically evaluate them for grammatical correctness.

The logic should be, for sdescs:
If the first letter of the second word in a string beginning with "a" or "an" is a consonant, then the first word of the string should be "a"
If the first letter of the second word in a string beginning with "a" or "an" is a vowel, then the first word of the string should be "an"

Griatch suggests somewhere around region https://github.com/evennia/evennia/blob/master/evennia/contrib/rpsystem.py#L443 for a place to potentially install something or other to fix.

Write AinneveArchetype skeleton

AinneveRaces can be used as an example for this code. Whoever does this will need to write the Archetype class (new Python class) and then figure out if anything and if so what goes into the module's init.py.

In addition, this module will need to be tied into Plugger.

settings secret key has been publicized

I'm not sure if it matters, not sure how exactly it is used, but the secret key in server\conf\settings.py is actually included in the repo.

# The secret key is randomly seeded upon creation. It is used to sign
# Django's cookies. Do not share this with anyone. Changing it will
# log out all active web browsing sessions. Game web client sessions
# may survive.

Posting this as an issue, because I thought it better to spam than have a possible security risk.

Overhead mapper

Is it possible to include a basic overhead mapper to the game which can be toggled on or off?

Move Trait to ./world module

Currently trait.py is in ./utils, but it is really part of the core game systems and so belongs in ./world.

Will need to update import in ./typeclasses/characters.py

This is a good task for a beginner to get experience with Git and pull requests.

Add limbs as well as slots

This is coming up in #20 and I've seen some discussion in IRC. Do we have a good use case for including equipment slots and a separate simulation of limbs? It seems like having both may make integration with combat code slightly easier, if we have effects for targeting/hitting limbs, but I'm not wholly convinced we can't do the same thing with just slots. Your thoughts?

'get barrel' in tutorial elicits a traceback.

I was using a newly created player with no extra privs:

Traceback (most recent call last):
  File "/home/feoh/src/personal/evennia/evennia/commands/cmdhandler.py", line 417, in _run_command
    ret = yield cmd.func()
  File "/home/feoh/src/personal/evennia/evennia/contrib/tutorial_world/objects.py", line 1006, in
    func
    self.obj.produce_weapon(self.caller)
  File "/home/feoh/src/personal/evennia/evennia/contrib/tutorial_world/objects.py", line 1063, in
    produce_weapon
    wpn = spawn(WEAPON_PROTOTYPES[prototype], prototype_parents=WEAPON_PROTOTYPES)[0]
  File "/home/feoh/src/personal/evennia/evennia/utils/spawner.py", line 189, in spawn
    for key, val in all_from_module(prototype_module).items() if isinstance(val, dict)))
  File "/home/feoh/src/personal/evennia/evennia/utils/utils.py", line 803, in all_from_module
    mod = mod_import(module)
  File "/home/feoh/src/personal/evennia/evennia/utils/utils.py", line 767, in mod_import
    mod = __import__(module, fromlist=["None"])
ImportError: No module named prototypes

Above traceback is from an untrapped error. Please file a bug report.

Build Zodiac Square

The existing build scripts contain central Riverport, east of the Kai River. To the west of the bridge where new players begin their quest, is Zodiac Square.

This description is based on the world building document (Issue #58). The main road of Riverport runs through the square, and at its center stands a fountain. In the immediate square area are four shops:

  • General Goods Shoppe
  • AEther Shoppe
  • Kaiwa Bazaar
  • "Dancing Dragon" Inn

To the west of the square along the main road is the Sosen Temple that could also be included.

The first three can likely be built using the @buildshop command once it is merged from PR #88. The Dancing Dragon and Sosen Temple will likely be more specialized for quests or narrative, and need to be adjusted later.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Create automatic NPC stats script

Using the 'Custom Enemy Stats' table (on the NPCs sheet in this doc, https://docs.google.com/spreadsheets/d/12DVWa-X3J8aXSxRQ5u53gDrFjIGq_gPyQvywxuDhhuU/edit?usp=sharing), write a script that generates acceptable NPC stats. See page 81 (Creating Custom NPCs) of the OA red book for more information.

Design the script so that it generates random stats following logical templates ('veteran fighter', 'street brawler', 'humble citizen', etcetera).

Output should be a dictionary of stats (which we'll probably import into Google Sheets, for example see https://github.com/burnash/gspread)

Create player configuration settings

At some point we'll want to keep track of player configurable settings. Some possible settings:

  • color on/off
  • integrate EvMore paging mechanism
  • prompt on/off and prompt configuration
  • room descriptions on/off
  • list exits after room description on/off

Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Chargen Needs to Allow Exit

During chargen, if a user is in the middle of their work and needs to quit, there is no option to exit besides manually disconnecting.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.