Jump to content

MOBA map/mod


simernes
 Share

Recommended Posts

Hi all

I've been interested in the possibility for a MOBA style mod/map (like DoTA from Warcraft 3), and since I haven't been able to find anyone working on something yet (there was some talk 7-8 years ago in this thread but that's pretty much it), I've created a git repository on GitHub with a very basic outline: https://github.com/0ad-moba/dott.

So far it's just a map, but probably it should be turned into a mod? I don't have any experience making mods or maps in 0 A.D. and I don't know how much time I will have to develop it, but if anyone's interested as well and wants to contribute please reach out and I will give access to the repository.

At the moment I'm not even sure if it's feasible or even possible to make this map, as heroes would need to be able to carry items (like weapons etc.), and I haven't seen it in the game yet at least.

Anyways, hope this is interesting to someone and any feedback is welcomed!

  • Like 1
Link to comment
Share on other sites

15 hours ago, simernes said:

Hi all

I've been interested in the possibility for a MOBA style mod/map (like DoTA from Warcraft 3), and since I haven't been able to find anyone working on something yet (there was some talk 7-8 years ago in this thread but that's pretty much it), I've created a git repository on GitHub with a very basic outline: https://github.com/0ad-moba/dott.

So far it's just a map, but probably it should be turned into a mod? I don't have any experience making mods or maps in 0 A.D. and I don't know how much time I will have to develop it, but if anyone's interested as well and wants to contribute please reach out and I will give access to the repository.

At the moment I'm not even sure if it's feasible or even possible to make this map, as heroes would need to be able to carry items (like weapons etc.), and I haven't seen it in the game yet at least.

Anyways, hope this is interesting to someone and any feedback is welcomed!

A lot of the ideas that I have suggested have been more appropriate for small scale battles, such as weapon switching and ammo. Part of my motivation is to make a MOBA or RPG style of mod possible. I can mod and program Javascript myself, and I have spent some time recently trying to understand the code so I can help out in this area. Status effects have already been added to the development version of the game which enables things like poison arrows. Another important change, which I think is possible to do with Javascript is an "Inventory" system. Currently if you want to change a units stats, you need to change the entity, this makes it difficult to have some unit with an arbitrary number of different items/weapons etc. Each combination would need to have a different entity. I'm not really sure what would need to change to make an inventory system. I have been looking at that a bit in my spare time.

 

I'm actually really interested in helping you and making contributions to this.

Edited by myou5e
Link to comment
Share on other sites

8 hours ago, myou5e said:

A lot of the ideas that I have suggested have been more appropriate for small scale battles, such as weapon switching and ammo. Part of my motivation is to make a MOBA or RPG style of mod possible. I can mod and program Javascript myself, and I have spent some time recently trying to understand the code so I can help out in this area. Status effects have already been added to the development version of the game which enables things like poison arrows. Another important change, which I think is possible to do with Javascript is an "Inventory" system. Currently if you want to change a units stats, you need to change the entity, this makes it difficult to have some unit with an arbitrary number of different items/weapons etc. Each combination would need to have a different entity. I'm not really sure what would need to change to make an inventory system. I have been looking at that a bit in my spare time.

 

I'm actually really interested in helping you and making contributions to this.

I started making a few issues in the GitHub repo, so if there's nothing else set up yet it could serve as a preliminary to-do list, and eventually if things pick up it could be used to track outstanding elements and bugs during development. So far I just plotted down what I could think of but it would help organise the different things that need to be done, and each issue could serve as a tracker of whether or not it is possible in the game or not yet, and which mods could be used to support it. For example, as you mentioned an inventory system, this issue could be tracking the discussion on possible ways to use it in the map, and possibly link to upstream tasks it is waiting on in the 0 A.D. source tree.

The repo and organisation on GitHub is just something I threw together quickly so I'm just putting it out there as tentative place to collect ideas and drafts, but let me know if you want access. I think anyone can comment and add issues, without any special privileges.

  • Like 1
Link to comment
Share on other sites

1st, you need to define action in https://code.wildfiregames.com/source/0ad/browse/ps/trunk/binaries/data/mods/public/gui/session/unit_actions.js
2nd, you need new command for that which will be called from ^ in https://code.wildfiregames.com/source/0ad/browse/ps/trunk/binaries/data/mods/public/simulation/helpers/Commands.js
3rd, create function in UnitAI that will be called by your new command from ^
4th, you would need new Fsm order and state inside UnitAi, something similar to Gathering
5th, ideally you should create custom component like inventory or something which you would call from unitAi when item should be picked

Note: Also pickable entity should have some custom component so you can tell in unit_action that the entity can be picked or not.

Picking itself is not so hard, just get the entity which should be picked, get cmpPosition and call moveOutOfWorld. Also you need to store id of that entity in inventory component so you can create ui for it later and player can throw it away from inventory or interact with it somehow. You can use auras and apply them on entity doing picking the item so you change entity stats if you want to.
For throwing items away, just get cmpPosition of the item and call jumpTo (or something similar, cant recall right now).

Hovewer you would need to edit the entity which should be pickable so it can be useful when picked up or used.

  • Like 1
Link to comment
Share on other sites

1 hour ago, Angen said:

1st, you need to define action in https://code.wildfiregames.com/source/0ad/browse/ps/trunk/binaries/data/mods/public/gui/session/unit_actions.js
2nd, you need new command for that which will be called from ^ in https://code.wildfiregames.com/source/0ad/browse/ps/trunk/binaries/data/mods/public/simulation/helpers/Commands.js
3rd, create function in UnitAI that will be called by your new command from ^
4th, you would need new Fsm order and state inside UnitAi, something similar to Gathering
5th, ideally you should create custom component like inventory or something which you would call from unitAi when item should be picked

Note: Also pickable entity should have some custom component so you can tell in unit_action that the entity can be picked or not.

Picking itself is not so hard, just get the entity which should be picked, get cmpPosition and call moveOutOfWorld. Also you need to store id of that entity in inventory component so you can create ui for it later and player can throw it away from inventory or interact with it somehow. You can use auras and apply them on entity doing picking the item so you change entity stats if you want to.
For throwing items away, just get cmpPosition of the item and call jumpTo (or something similar, cant recall right now).

Hovewer you would need to edit the entity which should be pickable so it can be useful when picked up or used.

I just had a go. I tried it on A24, the unit was not selectable, but the graphics at least loaded properly. I tried it on A23 and the graphics didn't finish loading.

On A23 First error I got was

ERROR: JavaScript error: simulation/components/UnitAI.js line 6138
Error: Registered component has unrecognised 'OnMotionUpdate' message handler method
  @simulation/components/UnitAI.js:6138:1
  launchGame@gui/gamesetup/gamesetup.js:2285:3
  g_MiscControls.startGame.onPress/<@gui/gamesetup/gamesetup.js:1016:5

On A24

ERROR: CCacheLoader failed to find archived or source file for: "art/textures/skins/props/shield/aspis_01_spec.png"
TIMER| common/modern/setup.xml: 177.815 us
TIMER| common/modern/styles.xml: 152.082 us
TIMER| common/modern/sprites.xml: 1.60963 ms
TIMER| common/setup.xml: 362.699 us
TIMER| common/setup_resources.xml: 52.449 us
TIMER| common/sprites.xml: 562.493 us
TIMER| common/styles.xml: 70.799 us
TIMER| session/sprites.xml: 1.82045 ms
TIMER| session/styles.xml: 137.566 us
TIMER| session/session.xml: 143.162 ms
TIMER| common/global.xml: 668.523 us
ERROR: JavaScript error: simulation/components/GuiInterface.js line 2011
Error: Invalid GuiInterface Call name "IsSelectionDirty"
  GuiInterface.prototype.ScriptCall@simulation/components/GuiInterface.js:2011:8
  onSimulationUpdate@gui/session/session.js:625:6
  resetTemplates@gui/session/session.js:437:2
  onSelectionChange@gui/session/top_panel/PlayerViewControl.js:119:4
  selectViewPlayer@gui/session/top_panel/PlayerViewControl.js:81:3
  onPlayersInit@gui/session/top_panel/PlayerViewControl.js:60:3
  init@gui/session/session.js:308:3
  reallyStartGame@gui/loading/loading.js:22:2
ERROR: Error calling component script function ScriptCall
ERROR: JavaScript error: simulation/components/GuiInterface.js line 427
TypeError: cmpAttack.GetSplashDamage is not a function
  GuiInterface.prototype.GetEntityState@simulation/components/GuiInterface.js:427:30
  GuiInterface.prototype.ScriptCall@simulation/components/GuiInterface.js:2009:1
  GetEntityState@gui/session/session.js:203:21
  insertIfRelevant@gui/session/PanelEntityManager.js:56:21
  update@gui/session/PanelEntityManager.js:47:9
  onSimulationUpdate@gui/session/session.js:637:3
  resetTemplates@gui/session/session.js:437:2
  onSelectionChange@gui/session/top_panel/PlayerViewControl.js:119:4
  selectViewPlayer@gui/session/top_panel/PlayerViewControl.js:81:3
  onPlayersInit@gui/session/top_panel/PlayerViewControl.js:60:3
  init@gui/session/session.js:308:3
  reallyStartGame@gui/loading/loading.js:22:2
ERROR: Error calling component script function ScriptCall
ERROR: Errors executing script event "SelectionChange"
ERROR: JavaScript error: gui/session/PanelEntityManager.js line 59
TypeError: entityState is undefined

 

Link to comment
Share on other sites

OK So I got it working @Angen ! Still some errors, and I'm not really sure how the code works! I just managed to problem solve, change a few parameters, and add in a few missing lines from the newer codebase! It looks pretty good! I showed at the bottom of the screen the stats as I put on new gear!

moba6.png

moba5.png

moba4.png

moba3.png

moba2.png

moba1.png

  • Thanks 1
Link to comment
Share on other sites

OK So I got it working @Angen ! Still some errors, and I'm not really sure how the code works! I just managed to problem solve, change a few parameters, and add in a few missing lines from the newer codebase! It looks pretty good! I showed at the bottom of the screen the stats as I put on new gear!

@myou5e that looks amazing, great job getting it to run! So many cool maps and games could be made with that, not just a moba. Happy to see it's at least possible!

@Angen it's not available anywhere in a git repository where it's easy to browse the code etc?

  • Like 1
Link to comment
Share on other sites

thnx next step dungeon map or ui don't know yet. 

hmm. except inventory, equipment and item component + using them in relevant templates for merging with a23b/a24

you need 

"pick": function(player, cmd, data)

 {

  GetFormationUnitAIs(data.entities, player).forEach(cmpUnitAI => {

   cmpUnitAI.Pick(cmd.target);

  });

 },

 

 "pick-use": function(player, cmd, data)

 {

  GetFormationUnitAIs(data.entities, player).forEach(cmpUnitAI => {

   cmpUnitAI.PickAndUse(cmd.target);

  });

 }, in https://github.com/SlavomirSlovenkai/MMO/blob/master/simulation/helpers/Commands.js

from https://github.com/SlavomirSlovenkai/MMO/blob/master/gui/session/unit_actions.js

"pick": {
  "execute": function(target, action, selection, queued) {
   
  Engine.PostNetworkCommand({
  "type": "pick",
  "entities": selection,
  "target": action.target,
  "queued": queued
  });
   
  Engine.GuiInterfaceCall("PlaySound", {
  "name": "order_gather",
  "entity": selection[0]
  });
   
  return true;
  },
  "getActionInfo": function(entState, targetState) {
  if (!targetState || !targetState.equipment)
  return false;
   
  return {
  "possible": true,
  "cursor": "action-gather-treasure"
  };
  },
  "actionCheck": function(target, selection) {
  const actionInfo = getActionInfo("pick", target, selection);
   
  if (!actionInfo.possible)
  return false;
   
  return {
  "type": "pick",
  "cursor": actionInfo.cursor,
  "target": target
  };
  },
  "specificness": 1,
  },
   
  "pick-use": {
  "execute": function(target, action, selection, queued) {
  Engine.PostNetworkCommand({
  "type": "pick-use",
  "entities": selection,
  "target": action.target,
  "queued": queued
  });
   
  Engine.GuiInterfaceCall("PlaySound", {
  "name": "order_gather",
  "entity": selection[0]
  });
   
  return true;
  },
  "getActionInfo": function(entState, targetState) {
  if (!targetState || !targetState.item)
  return false;
   
  return {
  "possible": true,
  "cursor": "action-gather-treasure"
  };
  },
  "actionCheck": function(target, selection) {
  const actionInfo = getActionInfo("pick-use", target, selection);
   
  if (!actionInfo.possible)
  return false;
   
  return {
  "type": "pick-use",
  "cursor": actionInfo.cursor,
  "target": target
  };
  },
  "specificness": 1,

 

},


And from https://github.com/SlavomirSlovenkai/MMO/blob/master/simulation/components/GuiInterface.js

const cmpEquipment = Engine.QueryInterface(ent, IID_Equipment);
  if (cmpEquipment)
  ret.equipment = {
  "type": cmpEquipment.GetType(),
  "specific": cmpEquipment.GetTypeSpecific()
  };
   
  const cmpItem = Engine.QueryInterface(ent, IID_Item);
  if (cmpItem)
  ret.item = {
  "type": cmpItem.GetType()
 

}

 

  • Like 1
Link to comment
Share on other sites

I downloaded your latest commit to Github, overwrote your UnitAI with the latest Github Dev UnitAI(Should be the same as SVN), and added just a few lines to UnitAI and it seems to have the same functionality. Haven't thouroughly tested though. This is good news. It actually changes a lot about how I was going to make my own mod. I was planning on creating separate entities for everything, because I didn't properly understand the variant system(:LOL:) .

Some improvements I could suggest to make it more usable.

  • I COULD NOT find the bow on the map, even with revealed vision and even looking at the location in the map file(and estimating its position relative to the other entities). I think probably it might be that the  equipment seems to have a very small footprint. Perhaps increase the footprint size and maybe highlight pickable items? I don't know how easy it would be to outline equipment without the cursor over it. I ended up finding it by putting a box of apples over top of the bow, which is visible.
  • Another issue is that the items are half embedded in the ground.
  • For my mod, I want to integrate with the generic RTS play and I want units to be able to equip and purchase items at scale, treating them possibly as resources, and equip them at a blacksmith. I guess it should be quite easy to do this, but I'm not exactly sure the best way to go about it. I want to walk a bunch of troops near a blacksmith, and then get an option to upgrade their armor across the whole group. At that point, all the stats and variant changes are applied to them just as it does when you  "pick up" an item.
  • You treat the mmo player as special, instead of modifying template_unit, you create template_unit_mmo. Maybe this was intented to be a temporary thing, i'm not sure. However, for my mod I want the inventory to apply to all units. A man is not a "spearman", just a man who also happens to be holding a spear. This would be a good idea, I think, even for an MMO only game, as it would be simple to make the killed units droup their equipment for the player to pick up. Would you modifiy the SpawnEntityOnDeath code to make this work? Perhaps, in a multiplayer game, this could create too many entities and then lag, but this could be counteracted by only sometimes dropping the gear, and having a limited lifespan after it is dropped.
  • Also, atlas wont start with your mod enabled.
ERROR: Failed to load map maps/scenarios/_default.pmp: File_OpenFailed
terminate called after throwing an instance of 'PSERROR_Game_World_MapLoadFailed'
  what():  Failed to load map.
Check application log for details.
Aborted
  • The main problem with integration seems to be the panels right now. This error comes up when I select a Spartan citizen. I understand "spart_house" is there because it is the first item in the list of construction options.
GAME STARTED, ALL INIT COMPLETE
ERROR: RelaxNGValidator: Validation error: structures/spart_house:1: Expecting an element BatchTimeModifier, got nothing
ERROR: RelaxNGValidator: Validation error: structures/spart_house:1: Invalid sequence in interleave
ERROR: RelaxNGValidator: Validation error: structures/spart_house:1: Element ProductionQueue failed to validate content
ERROR: RelaxNGValidator: Validation failed for '(null)'
ERROR: Failed to validate entity template 'structures/spart_house'
ERROR: JavaScript error: gui/session/session.js line 223
Error: deepfreeze requires exactly one object as an argument.
  GetTemplateData@gui/session/session.js:223:1
  g_SelectionPanels.Construction.setupButton@gui/session/selection_panels.js:299:18
  setupUnitPanel@gui/session/unit_commands.js:97:8
  updateUnitCommands@gui/session/unit_commands.js:149:4
  updateSelectionDetails@gui/session/selection_details.js:499:2
  updateGUIObjects@gui/session/session.js:671:2
  onTick@gui/session/session.js:599:3
  __eventhandler54 (Tick)@session Tick:0:1
ERROR: Errors executing script event "Tick"
ERROR: JavaScript error: gui/session/session.js line 223
Error: deepfreeze requires exactly one object as an argument.
  GetTemplateData@gui/session/session.js:223:1
  g_SelectionPanels.Construction.setupButton@gui/session/selection_panels.js:299:18
  setupUnitPanel@gui/session/unit_commands.js:97:8
  updateUnitCommands@gui/session/unit_commands.js:149:4
  updateSelectionDetails@gui/session/selection_details.js:499:2
  updateGUIObjects@gui/session/session.js:671:2
  onSimulationUpdate@gui/session/session.js:642:2
  __eventhandler56 (SimulationUpdate)@session SimulationUpdate:0:1

 

1 hour ago, Angen said:

thnx next step dungeon map or ui don't know yet. 

hmm. except inventory, equipment and item component + using them in relevant templates for merging with a23b/a24

you need 

"pick": function(player, cmd, data)

 {

  GetFormationUnitAIs(data.entities, player).forEach(cmpUnitAI => {

   cmpUnitAI.Pick(cmd.target);

  });

 },

 

 "pick-use": function(player, cmd, data)

 {

  GetFormationUnitAIs(data.entities, player).forEach(cmpUnitAI => {

   cmpUnitAI.PickAndUse(cmd.target);

  });

 }, in https://github.com/SlavomirSlovenkai/MMO/blob/master/simulation/helpers/Commands.js

from https://github.com/SlavomirSlovenkai/MMO/blob/master/gui/session/unit_actions.js

"pick": {
  "execute": function(target, action, selection, queued) {
   
  Engine.PostNetworkCommand({
  "type": "pick",
  "entities": selection,
  "target": action.target,
  "queued": queued
  });
   
  Engine.GuiInterfaceCall("PlaySound", {
  "name": "order_gather",
  "entity": selection[0]
  });
   
  return true;
  },
  "getActionInfo": function(entState, targetState) {
  if (!targetState || !targetState.equipment)
  return false;
   
  return {
  "possible": true,
  "cursor": "action-gather-treasure"
  };
  },
  "actionCheck": function(target, selection) {
  const actionInfo = getActionInfo("pick", target, selection);
   
  if (!actionInfo.possible)
  return false;
   
  return {
  "type": "pick",
  "cursor": actionInfo.cursor,
  "target": target
  };
  },
  "specificness": 1,
  },
   
  "pick-use": {
  "execute": function(target, action, selection, queued) {
  Engine.PostNetworkCommand({
  "type": "pick-use",
  "entities": selection,
  "target": action.target,
  "queued": queued
  });
   
  Engine.GuiInterfaceCall("PlaySound", {
  "name": "order_gather",
  "entity": selection[0]
  });
   
  return true;
  },
  "getActionInfo": function(entState, targetState) {
  if (!targetState || !targetState.item)
  return false;
   
  return {
  "possible": true,
  "cursor": "action-gather-treasure"
  };
  },
  "actionCheck": function(target, selection) {
  const actionInfo = getActionInfo("pick-use", target, selection);
   
  if (!actionInfo.possible)
  return false;
   
  return {
  "type": "pick-use",
  "cursor": actionInfo.cursor,
  "target": target
  };
  },
  "specificness": 1,

 

},

 


And from https://github.com/SlavomirSlovenkai/MMO/blob/master/simulation/components/GuiInterface.js

const cmpEquipment = Engine.QueryInterface(ent, IID_Equipment);
  if (cmpEquipment)
  ret.equipment = {
  "type": cmpEquipment.GetType(),
  "specific": cmpEquipment.GetTypeSpecific()
  };
   
  const cmpItem = Engine.QueryInterface(ent, IID_Item);
  if (cmpItem)
  ret.item = {
  "type": cmpItem.GetType()
 

}

 

 

 

Edited by myou5e
Link to comment
Share on other sites

On 8/24/2020 at 5:05 AM, simernes said:

Hi all

I've been interested in the possibility for a MOBA style mod/map (like DoTA from Warcraft 3), and since I haven't been able to find anyone working on something yet (there was some talk 7-8 years ago in this thread but that's pretty much it), I've created a git repository on GitHub with a very basic outline: https://github.com/0ad-moba/dott.

So far it's just a map, but probably it should be turned into a mod? I don't have any experience making mods or maps in 0 A.D. and I don't know how much time I will have to develop it, but if anyone's interested as well and wants to contribute please reach out and I will give access to the repository.

At the moment I'm not even sure if it's feasible or even possible to make this map, as heroes would need to be able to carry items (like weapons etc.), and I haven't seen it in the game yet at least.

Anyways, hope this is interesting to someone and any feedback is welcomed!

You could make an attempt at recreating the Dota or LOL map? Maybe? Angen is doing a great job with the mechanics. I will try to integrate it into the main game and could maybe help you with map triggers later.

Link to comment
Share on other sites

4 hours ago, myou5e said:

You could make an attempt at recreating the Dota or LOL map? Maybe? Angen is doing a great job with the mechanics. I will try to integrate it into the main game and could maybe help you with map triggers later.

I've drawn up the map in the editor now. It includes:

  • 3 Lanes (like the commonly seen 5v5 maps in DoTA and LoL)
  • A base for each team in opposite corners of the map
  • Defense towers around the bases, and along the lanes
  • Shop keepers (not programmed)
  • Secret shop
  • A river running across the map, perpendicular to the middle lane
  • A few trees indicating where the should be forest

Please find the attached screenshot.

When it comes to scripting and game functions, I've started drawing up a bunch of issues on GitHub outlining what needs to be done. They should be considered as discussions for each individual topic and is a good place to define details on how to make the different parts of the game work.

Regarding game mechanics and scripting and other complicated things, we will have to see how things can evolve as not everything is yet possible. As pointed out here in previous comments there has been done some work on a MMO game where items can be picked up and carried by units, and some discussions on how to select heroes at the beginning of the game has taken place in the GitHub issues.

dott-map.png

Edited by simernes
changed link to original author's repo
  • Like 1
Link to comment
Share on other sites

12 minutes ago, simernes said:

I've drawn up the map in the editor now. It includes:

  • 3 Lanes (like the commonly seen 5v5 maps in DoTA and LoL)
  • A base for each team in opposite corners of the map
  • Defense towers around the bases, and along the lanes
  • Shop keepers (not programmed)
  • Secret shop
  • A river running across the map, perpendicular to the middle lane
  • A few trees indicating where the should be forest

Please find the attached screenshot.

When it comes to scripting and game functions, I've started drawing up a bunch of issues on GitHub outlining what needs to be done. They should be considered as discussions for each individual topic and is a good place to define details on how to make the different parts of the game work.

Regarding game mechanics and scripting and other complicated things, we will have to see how things can evolve as not everything is yet possible. As pointed out here in previous comments there has been done some work on a MMO game where items can be picked up and carried by units, and some discussions on how to select heroes at the beginning of the game has taken place in the GitHub issues.

dott-map.png

That's a good start! Maybe you could do the Dire/Radiant theme. Take a look at the Pompeii map in 0ad. It's what the Angen's first MMO map is based on. You can give the Dire lots of dead trees :-)

Link to comment
Share on other sites

19 hours ago, myou5e said:

That's a good start! Maybe you could do the Dire/Radiant theme. Take a look at the Pompeii map in 0ad. It's what the Angen's first MMO map is based on. You can give the Dire lots of dead trees :-)

Thanks! Maybe, but I think a novel theme wouldn't take too much effort and would make the map more interesting as something independent and new. Heck, just basing it around the heroes that are already present (which are at least somewhat historical?) could be a possibility. Having it too realistic would probably not be a good idea though as it would limit possibilities of having magic abilities for heroes etc.

I don't want to spend too much time designing the exact details of the map yet though in fear that it will have to be adapted and changed, which would lead to a lot of extra work. For instance I'm still not sure about the size of the map (it's now Giant). I'd probably want to get some of the basic features up and running and see how the game feels to play, and once that is more established start putting in the details and make the map pretty.

Anyways, I'm not in a rush here so I'm fine with exploring possibilities for a while both theme wise and with game mechanics.

  • Like 1
Link to comment
Share on other sites

  • 1 year later...
  • 3 weeks later...
On 22/11/2021 at 2:02 PM, ImanJx said:

Umm, it's been a year. So how is it going man, i really want to try to play this mod

Hey @ImanJx, really happy to hear your interest! I've honestly been sidetracked and busy with other things, but please if you have some time have a look at the project on Github. I mapped out the status of some requirements, and there are a bunch of tasks there that needs to be done that may serve as a starting point: https://github.com/0ad-moba/dott/issues

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...