Discussion: Contract system
-
I don't think it is off topic. My feedback on contracts is that while they may be intellectually interesting, I think no one will use them and I would rather the dev team spend its very limited time working on things that either make the game more playable (performance) or more fun (new units/buildings to script).
A better way to implement the same thing contracts are driving at would be to let people buy/sell CPU ticks on the market. Then there would be some liquidity and a marketplace. Without both, this feature is dead on arrival.
My 2c
-
@shedletsky I mean, it is specific performance complaints/bug reports that are off-topic.
This discussion is intended to check whether the community would be interested with such a feature. We didn't start to implement it, and you may surely be right, but let's see what people say.
Buying/selling CPU is a no-go feature since it would immediately create a pay-to-win flavor for many players.
-
@artch To my understanding a contract is a fully isolated module without the ability to require other modules. In order to setup a new contract I would have to create a new module every time (which is impossible for my code to do) or fall back to string concatenation/manipulation - depending on the implementation -, which means the potential loss of IDE support.
-
@postcrafter No, you can require any other modules as usual. It's just your code, nothing special about it.
-
@artch So a contract can consist of multiple modules which will simply run in the context of another player? Even with this functionality, which is awesome by the way, this won't solve the problem of reusing the same code for multiple contracts.
-
I have thought a bit more about the feature and I'm not sure anymore how practical this will be. I think it might be hard to create code that works seamlessly beside other players codebases.
for example spawning creeps... people have different ways to queue creeps to spawn.
When you accept the contract, you're now obliged to execute the contract code. You cannot pause it, that would be a violation of the contract terms. So it's now your responsibility to ensure that the contract code is able to execute each tick.
What if the code malfunctions? maybe not throwing errors, but spawning creeps every tick without moving them because of a wrong target id and blocking spawns.
You can't enforce people to fulfill the contract anyways .. of course you can prevent the user to pause the code .. but you can't stop him to change memory of the contractor creeps, suiciding creeps or other more subtile sabotage like changing prototypes so the script won't work correctly.
The code could also contain a bug that was not recognised in the code review ... maybe it's using a huge amount of cpu under certain circumstances.. then you will be stuck with it ?
-
I have a couple of questions/concerns here:
Terminology: Client=Guy paying $$$, Contractor=Guy doing work.
-
Is the code for a contract proposed by the contractor, or by the client?
-
Is the client able to cancel his contract? If so, does the contractor get paid in any way when the client cancels?
-
If a contractor is locked-in to a contract, and is unable to edit it, what happens if there is a bug that makes the contract unsatisfiable? Is the contractor doomed to waste CPU on a fruitless contract forever? In this case, I doubt that any rational person would ever accept a contract. It would make far more sense to me to allow players to break contracts (potentially with some kind of penalty system, such as credits kept in escrow or similar).
-
What happens if the contractor runs out of CPU on a tick or encounters an error? Is the contract code still executed?
-
What if a contract throws an exception? How is this handled?
-
What happens if a player gets wiped out and needs to respawn? Many of his contracts may no longer be applicable to the new location, and it seems unreasonable to saddle players with obligations that may out-live their empire's lifetime.
-
-
I really like this system- especially the custom part of it. I can see how this could be used for a number of things people have done manually, such as @Bovius paying players to build his art (and he even wrote scripts for them, so this would be a perfect tie in) or the "clear the edge" folks paying people to remove their rooms in specific sectors.
I do think it would be possible to build a system that would also allow completely automated codebases to contribute (although I also agree that there's no way to completely automate this that wouldn't either be burdensome to the game admins or limiting on the community).
You mentioned that a standardized list of contract templates would be more powerful and flexible when guided by the community, but for things to be completely automated there needs to be a way to verify that the code matches what the players expect. I think this can be done by making it so players can publish contract templates that other players can use. Then people can choose to trust a specific players public contracts when used by other players. For example, the
LeagueOfAutomatedNations
account could publish contracts from a repository on github. Players could then be reasonably sure that the contracts on the site that are "written by"LeagueOfAutomatedNations
are what they expect (and the first time it gets abused everyone will stop trusting it and start trusting something else).
-
@w4rl0ck said in Discussion: Contract system:
for example spawning creeps... people have different ways to queue creeps to spawn.
The example they used shows how to handle this- let them spawn what's needed and have your code search for creeps that have a specific memory value. Still, it might be a good idea to give the contract an api a way to expose desired creep builds.
@w4rl0ck said in Discussion: Contract system:
You can't enforce people to fulfill the contract anyways .. of course you can prevent the user to pause the code .. but you can't stop him to change memory of the contractor creeps, suiciding creeps or other more subtile sabotage like changing prototypes so the script won't work correctly.
Presumably the contract would have a way to say that it's "satisfied". If the contract involved building a spawn, but the player accepts the contract and somehow sabotages it then the spawn never gets built and the contract keeps running.
Presumably all the other issues could be resolved by allowing the person who took the contract on to cancel it without getting paid.
-
@artch So a contract can consist of multiple modules which will simply run in the context of another player?
A contract doesn't consist of multiple modules, it's just one long string of code, but yes, it is executed in the contractor's context.
Even with this functionality, which is awesome by the way, this won't solve the problem of reusing the same code for multiple contracts.
What is the problem here exactly?
-
@w4rl0ck My only concern of what you have mentioned is modifying prototypes. We're still debating on how to handle that. All other things could (and should) be covered by contract conditions.
-
@artch said in Discussion: Contract system:
Even with this functionality, which is awesome by the way, this won't solve the problem of reusing the same code for multiple contracts.
What is the problem here exactly?
Taking your example from above, if someone wants to setup two contracts for different
sourceId
s, he will have to copy the module's code and change the constant's value for each of them. It doesn't make any sense to copy an entire file just to change a single value. This would not only be bad coding practice (DRY), it would be impossible or at least impractical to automate.
-
I have a couple of questions/concerns here:
Terminology: Client=Guy paying $$$, Contractor=Guy doing work.
- Is the code for a contract proposed by the contractor, or by the client?
Can be both. Code is proposed by the party creating the offer, and an offer can be created by any party. When you create an offer, you write code and choose one of two options:
- I am the client (I pay)
- I am the contractor (I execute the code)
- Is the client able to cancel his contract?
Yes.
If so, does the contractor get paid in any way when the client cancels?
I think that would make sense.
- If a contractor is locked-in to a contract, and is unable to edit it, what happens if there is a bug that makes the contract unsatisfiable? Is the contractor doomed to waste CPU on a fruitless contract forever? In this case, I doubt that any rational person would ever accept a contract. It would make far more sense to me to allow players to break contracts (potentially with some kind of penalty system, such as credits kept in escrow or similar).
Yes, both parties are able to break the contract on some terms.
- What happens if the contractor runs out of CPU on a tick or encounters an error? Is the contract code still executed?
No, all your contracts won't be executed on this tick.
- What if a contract throws an exception? How is this handled?
It is handled as usual, you will see an error in your console.
-
You mentioned that a standardized list of contract templates would be more powerful and flexible when guided by the community, but for things to be completely automated there needs to be a way to verify that the code matches what the players expect. I think this can be done by making it so players can publish contract templates that other players can use. Then people can choose to trust a specific players public contracts when used by other players. For example, the
LeagueOfAutomatedNations
account could publish contracts from a repository on github. Players could then be reasonably sure that the contracts on the site that are "written by"LeagueOfAutomatedNations
are what they expect (and the first time it gets abused everyone will stop trusting it and start trusting something else).While I admit it sounds interesting and cool in theory, but implementing this is a lot of work, and I doubt very much that even a single deal using such a template-based automated convention will ever be made even once by anyone at all. Some people here express the opinion this entire mechanic will be used by 5 people, and automated variant of it will be used by literally nobody.
-
Taking your example from above, if someone wants to setup two contracts for different
sourceId
s, he will have to copy the module's code and change the constant's value for each of them. It doesn't make any sense to copy an entire file just to change a single value. This would not only be bad coding practice (DRY), it would be impossible or at least impractical to automate.Oh, I see. Well, it's just how the system works basically - every contract consists of some code. You can use an external template (e.g. from GitHub) to create that code, but essentialy it will be a separate script in the database. In the same way as how we have a lot of players running identical open source code base - it's also suboptimal, but it is how it works.
-
@artch said in Discussion: Contract system:
Taking your example from above, if someone wants to setup two contracts for different
sourceId
s, he will have to copy the module's code and change the constant's value for each of them. It doesn't make any sense to copy an entire file just to change a single value. This would not only be bad coding practice (DRY), it would be impossible or at least impractical to automate.Oh, I see. Well, it's just how the system works basically - every contract consists of some code. You can use an external template (e.g. from GitHub) to create that code, but essentialy it will be a separate script in the database. In the same way as how we have a lot of players running identical open source code base - it's also suboptimal, but it is how it works.
When two independent players want to use the same contract template that's an entirely different story and saving the contracts separately in the database once they've been created is absolutely fine.
Would you be open to accept pull requests to add some sort of parameter/environment variable/contract memory when the feature is actually added to the game?
This would also make automatic accepting of contracts a lot easier, add a checksum of the module to the contract and let your code decide whether it wants to accept it or not based on the parameters. This will only work for "well written" contract code, but that's something we as the community are responsible for.
-
@postcrafter We won't have API for automatic contracts acceptance/creation, so environment variables don't make a lot of difference. And such a PR would require access to the official driver code which is not open sourced, and is much more sophisticated than the private server driver.
-
@artch said in Discussion: Contract system:
While I admit it sounds interesting and cool in theory, but implementing this is a lot of work, and I doubt very much that even a single deal using such a template-based automated convention will ever be made even once by anyone at all. Some people here express the opinion this entire mechanic will be used by 5 people, and automated variant of it will be used by literally nobody.
I actually think having the "standard library" of player contracts will make it more likely to get used, not less.
Let's use the
LeagueOfAutomatedNations
example. Assuming the system is workable, I would create templates for the following-Build Spawn in Room
Destroy Structure in Room
Guard Portal
Then players who want to make extra credits already have tasks that they can easily consume. Players could program the specifics for each bootstrapping each contract type once then scan for any players that are requesting them, rather than having to do a bunch of manual work and potentially having to write custom code for each project. People would still have the option of writing the more advanced/unique stuff, and since people would be able to get used to the system using the more "standard" stuff there could be more people willing to dive into those.
I admit I could be wrong about this, but really think some system for standard contracts and identifying when they're in use would make the system more popular simply because it would make it easier for people to use it (assuming the community put the work into making the scripts, which I think is a reasonable assumption).
-
There are probably other ways these same goals could be accomplished in different ways too. Another idea would be to separate out parameters (json blob defined by client) from code, and then give each code a unique signature when it's updated (SHA512?) that people can compare against to confirm it's the script they think it is.
-
@artch said in Discussion: Contract system:
@postcrafter We won't have API for automatic contracts acceptance/creation, so environment variables don't make a lot of difference.
I seem to have missed that part about no automatic creation and acceptance of contracts earlier. Unfortunately this makes it a non-feature for me, I think you do at least need to be able to create contracts automatically, accepting them is a bit riskier for obvious reasons, but it's a problem that's absolutely solveable.