Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
  • 20:06

    erikogenvik on master

    Pass name by value to allow for… (compare)

  • Feb 16 12:12

    erikogenvik on master

    Smaller fixups. Allow tasks to be "pending". I… (compare)

  • Jan 25 13:01
    erikogenvik closed #25
  • Jan 25 13:01
    erikogenvik commented #22
  • Jan 25 13:00
    erikogenvik closed #22
  • Jan 24 22:35

    erikogenvik on master

    Include required header. (compare)

  • Jan 24 22:14

    erikogenvik on master

    Don't send task updates unless … Use a time window when limiting… Decrease time between IO to 2 m… and 2 more (compare)

  • Jan 24 16:18

    erikogenvik on master

    Comments fix. Added asio include. (compare)

  • Jan 23 23:43

    erikogenvik on master

    Prefer std::chrono::steady_cloc… Process IO handlers for at leas… (compare)

  • Jan 23 23:43

    erikogenvik on master

    Delete an entity when it disapp… Only delete entitoes on Disappe… (compare)

  • Jan 20 22:49

    erikogenvik on master

    Rename and fix incorrect refere… (compare)

  • Jan 20 22:45

    erikogenvik on master

    Fixed that path_result is in st… Added missing file. (compare)

  • Jan 20 22:18

    erikogenvik on master

    Arrange tests better and remove… (compare)

  • Jan 20 18:37

    erikogenvik on master

    Fixed issue with ranged combat. (compare)

  • Jan 19 22:25

    erikogenvik on master

    Moved physics tests to subdirec… Improve Gather goal to check fo… Improve Steering. We now allow… and 4 more (compare)

  • Jan 13 16:36

    erikogenvik on master

    Make sure hit display window do… (compare)

  • Jan 12 16:52

    erikogenvik on master

    Provide separate window for con… (compare)

  • Jan 12 14:32

    erikogenvik on master

    Improve combat. We now check i… (compare)

  • Jan 11 22:10

    erikogenvik on master

    Conform to PEP8. (compare)

  • Jan 11 22:03

    erikogenvik on master

    Store entity as entityId only. … Use standard Entity Ref. (compare)

Erik Ogenvik
@erikogenvik
Thanks for the PR btw, I'll take a look.
Erik Ogenvik
@erikogenvik
pyramid3d
@pyramid3d
Great move for making the forge more accessible to the public. The snap and appimage links seem to be broken though.
Erik Ogenvik
@erikogenvik
Thanks, the AppImage is hosted on BinTray, and apparently the link only works if bintray.com is set as referrer.
But which Snap link was broken?
pyramid3d
@pyramid3d
Oh, nvm. Seems all of the snap links are back. Could have been my network...
Erik Ogenvik
@erikogenvik
Check, thanks for reporting.
pyramid3d
@pyramid3d
Just notices that the link to the Mercator page is wrong (should be https://www.worldforge.org/index.php/components/mercator/) on the cyphesis page https://www.worldforge.org/index.php/components/cyphesis/
Erik Ogenvik
@erikogenvik
Thanks, I've fixed it.
pyramid3d
@pyramid3d
Thanks for that :-D
Giovanni Passalacqua
@Ciro1979_gitlab
hello
where i can play Worldforge?
Erik Ogenvik
@erikogenvik
It's not really playable yet, in the sense that there's any real game play.
But you can download the client and connect to the crimson server to play around with the world.
Hsingai Tigris Altaica
@DrAlta
Does ember have Python scripting like the server does? so you can do client-side prediction and such with the same code ?
Erik Ogenvik
@erikogenvik
No, Ember doesn't have Python scripting. Part of the UI is scripted by Lua however.
James Lu (ampdot)
@CrazyPython_gitlab
is it possible for non-coders to add gameplay to worldforge?
I am part of a community that develops an open-source MMO game, arras.io.
Erik Ogenvik
@erikogenvik
Allowing non coders to add gameplay is certainly one of the goals. The game logic is kept in short script snippets, with the idea that you can combine multiple ones in order to get the desired behaviour.
James Lu (ampdot)
@CrazyPython_gitlab
is it okay if I share some of the things I think helped get lots of people develop gameplay for arras?
Erik Ogenvik
@erikogenvik
Absolutely, please share.
James Lu (ampdot)
@CrazyPython_gitlab
would you prefer principles or examples?
James Lu (ampdot)
@CrazyPython_gitlab

Background Information: In Arras, guns can only be controlled collectively, not individually. When you move your cursor, your entire tank including your guns rotate to match the facing of your cursor.

Principle: Data-oriented design

The appearance of a gun is controlled by POSITION, which contains length, width, ratio between gun base and gun nose, etc.
Guns may create recoil, which accelerates the firing tank in one direction, which is defined in the data file as part of SHOOT_SETTINGS.
The Gunner class shoots each gun slightly after the other, instead of every gun at once. DELAY delays individual guns from firing.
The Battleship class has fast drones that expire after travelling a certain distance. RANGE controls the distance a bullet the gun fires may travel before it is destroyed.
The Eagle is like the Booster, except it has the ability to spawn a trap. The ability is activated through right-click. ALT_FIRE controls if a gun is triggered by left-click or by right-click.
With only the 5 properties mentioned above, you can make tanks that can teleport. Can you figure out how?

James Lu (ampdot)
@CrazyPython_gitlab
hundreds of people with zero coding experience have created tanks by writing in a text format
a wealth of examples and a vibrant community of tank creators helping each other out helps, of course
James Lu (ampdot)
@CrazyPython_gitlab
the website says "allow anyone to create their own virtual world," but maybe it would be better for community focus to develop one game? That would provide technical focus. There can still be many private servers, but they can share world assets.
Our game crashed every 30 minutes, was never above 40FPS, and had jerky movement. Still, we had tens of thousands of unique monthly visitors. I see a lot of anti-lag commits, maybe more focus should be on gameplay :)
if someone finds the game compelling and with potential, they will spend time to fix the lag
Erik Ogenvik
@erikogenvik
It sounds like you have a really nice setup. Making it available to non coders certainly helps with getting players being involved.
Our goal is more to provide a general framework for simulating the real world. So the current way development is happening is that I define some simple example gameplay and then add the facilities to implement it using general and generic features and components. This approach is what makes it take time. Since I'm aiming for more general solutions they need to be carefully designed. Which unfortunately takes both time and a lot of trial and error.
We could certainly move much faster if we decided on a specific kind of game with specific game play, but that would go against the goal of having a more general framework for real world simulation.
James Lu (ampdot)
@CrazyPython_gitlab
Can you give me an example of this simple gameplay? To use your words, I think implementing more complex gameplay through a general, orthognal design, would help inform your design.
James Lu (ampdot)
@CrazyPython_gitlab
I read about Behavioral Programming a few weeks ago. (Harel, et. al) It is really cool! I'd love to see a MMO made with it. Read the paper.
Arras is not easy to script. Instead, the engine is easy to modify. You can make most games in Arras' genre in less than 500 lines of code.
Benjamin Stanley
@HeadClot
Hey everyone
Erik Ogenvik
@erikogenvik

@CrazyPython_gitlab One example could be the "bread" entity type, https://github.com/worldforge/cyphesis/blob/master/data/rulesets/deeds/rules/consumables/bread.xml
Breads can be eaten, so the bread class includes a "usage" of "consume".

<map name="usages"> <map name="default"> <map name="consume"> <string name="name">Eat</string> <string name="handler">world.objects.Consumable.consume</string> <string name="constraint">actor can_reach tool</string> </map> </map> </map>

There's a simple constraint on the usage that the actor which performs it must be able to reach the bread. The script for the "consume" action is then handled by "world.objects.Consumable.consume", found here: https://github.com/worldforge/cyphesis/blob/master/data/rulesets/deeds/scripts/world/objects/Consumable.py
Erik Ogenvik
@erikogenvik
The script will check if there's a conversion property set ("_consume_mass_conversion") as well as a property specifying the kind of consumption ("consumable_type"). For the bread the consumption type is "plant". The result is that the bread is destroyed, and a "Nourish" message is sent to the actor (the one which consumed the bread). The Nourish message (or "operation" as we call them) will contain information both of the consumption type (plant) as well as how much nourishment it contains (depending on the size of the entity being consumed as well as any conversion property.
The Nourish op then needs to be handled by the entity that ate the bread. Consider if a human ate the bread. The "human" class will inherit from the "creature" class, which is defined here: https://github.com/worldforge/cyphesis/blob/master/data/rulesets/deeds/rules/creatures/creature.xml
The "__scripts" property contains scripts that define the behaviour and can install "operation handlers". One of the scripts of "creature" is "world.traits.Nourishable.Nourishable", which is defined here: https://github.com/worldforge/cyphesis/blob/master/data/rulesets/deeds/scripts/world/traits/Nourishable.py
Erik Ogenvik
@erikogenvik
This script will perform a couple of checks and apply modifications, and then increase the "nutrients" property of the entity. The "nutrients" property specifies how much nutrients an entity contains. For a creature it would be how much food it has eaten. Another script, "world.traits.Metabolizing.Metabolizing" then acts on this, and allows the entity to grow or heal if there's enough nutrients.
By default all "creatures" are omnivores, i.e. they will convert both "plant" and "meat" nourishment to nutrients. But take the wolf for example, as found here: https://github.com/worldforge/cyphesis/blob/master/data/rulesets/deeds/rules/creatures/wolf.xml
It has this property, which makes it not receive any nutrients from "plant" nourishments, thus making it a carnivore:
            <map name="_modifier_consume_type_plant">
                <float name="default">0</float>
            </map>
Conversely a "cow", as found here https://github.com/worldforge/cyphesis/blob/master/data/rulesets/deeds/rules/creatures/cow.xml, is an herbivore as specified by
            <map name="_modifier_consume_type_meat">
                <float name="default">0</float>
            </map>
Erik Ogenvik
@erikogenvik
But even plants can be nourished. So plants, https://github.com/worldforge/cyphesis/blob/master/data/rulesets/deeds/rules/plants/plant.xml, also use the same world.traits.Nourishable.Nourishable script. However, they obtain nourishment by consuming from the entity into which they are planted (if the are planted). Therefore they use a script at world.traits.PlantFeeding.PlantFeeding (https://github.com/worldforge/cyphesis/blob/master/data/rulesets/deeds/scripts/world/traits/PlantFeeding.py) which will at a regular interval send a "Consume" operation to their parent entity, for the "soil" type of consumption.
Erik Ogenvik
@erikogenvik
A typical entity which then would be able to nourish a plant would be the "land", https://github.com/worldforge/cyphesis/blob/master/data/rulesets/deeds/rules/environment/land.xml Other entities would just ignore the Consume op sent from the plant. The "land" contains the "world.traits.PlantNourishing.PlantNourishing" trait/script which allows it to send back Nourish operation to any plant.
So in this way a couple of shared scripts can be reused in many different entities, for nourishment both for entities that eat things (creatures) as well as those that suck nourishment from the ground.
It doesn't stop there though. The "fire" entity, https://github.com/worldforge/cyphesis/blob/master/data/rulesets/deeds/rules/environment/fire.xml, uses the https://github.com/worldforge/cyphesis/blob/master/data/rulesets/deeds/scripts/world/objects/elements/Fire.py script to at regular interval consume other entities by sending Consume operation of the "fire" type.
Erik Ogenvik
@erikogenvik
This kind of Consume operation will be ignored by entities, unless they implement the "https://github.com/worldforge/cyphesis/blob/master/data/rulesets/deeds/scripts/world/traits/Flammable.py" trait. So a rock wouldn't be consumed by fire, whereas a log would be, as the latter has the Flammable trait. The speed of fire consumption is further governed by any "_burn_speed" property.
And so on. All game play if defined by having these smaller scripts which interact with properties and send messages/operations to other entities.
@CrazyPython_gitlab Where could I find information on how arras works? Is the source available? I couldn't find much on the arras.io site.
Erik Ogenvik
@erikogenvik
Hi @HeadClot