Discussion: Contract system


  • Dev Team

    @domnomnom

    • It takes little code to completely screw over a player. Here's my code-golf to do damage in various ways:

    Yes, but the other party would never accept a contract with such code. It's in your best interest to provide as cleaner code as possible in your contract when you offer it to someone, with descriptive comments and everything.

    • How do you deal with the following attempt at duplicating credits?
      • Create a contract worth most of your credits
      • Allow two of your allies to complete the contract in the same tick.

    The total amount of credits is deducted from the client's balance when the contract starts, in a similar way as buy orders on the market. These reserved credits are then either paid to the contractor or return to the client in case if the contract is cancelled.


  • Dev Team

    @tigga

    Firstly, I really hope this can be fully automated. If not, I'll be very sad.

    Unfortunately, I believe automatization of such a system is impractical, unrealistic and can barely be done by anyone in Screeps.

    IMO this begs for a library to sit on top of it. If there's a "standardized" list of contracts then it becomes easier to value a contract based on difficulty:reward, and automatically accept contracts that you're able to do, or offer contracts out that you need doing. It also helps with the security concern: a standardized library can be checked char-for-char against what you're sent.

    Standardized list of contract templates is something that came to my mind as well, but honestly I think that this system will be more flexible and powerful when guided by the community, not by devs. One useful thing that can be done here is a public GitHub repository with popular contract templates, where everyone can send a Pull Request. But doing that in-game would create too much management burden.


  • Dev Team

    @postcrafter

    Will we be able to provide parameters to a contract, sort of like environment variables? This can be used to use the same code but targeted at different rooms, ticks or players. Otherwise we would have to modify the code and/or use string modification for each contract which seems kind of bad.

    In the example above, both sourceId and dropPosition would be provided with these parameters instead of putting them directly into the code.

    What's the added benefit of complicating the system like that? You can re-use someone else's contract code just as easily, if all the parameters are clearly defined in the top of the script as constants.



  • @artch

    I feel like this is a feature that 5 people will use. Is this building towards something more substantial?

    What does the 2018 roadmap look like? Launching power creeps would be cool, though I would settle for reasonable response times on shard0. Right now the web interface is so slow for me it is no longer really fun to tinker with my colonies.

    This main map pageload time of 5 seconds is zzzzzzz.


  • Dev Team

    @shedletsky This seems a little off-topic here, isn't it? If you believe it's something with the web site itself, not your connection/setup, then you might want to create a separate post in Technical Issues forum.



  • @artch

    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


  • Dev Team

    @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.


  • Dev Team

    @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.


  • YP

    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.

    1. Is the code for a contract proposed by the contractor, or by the client?

    2. Is the client able to cancel his contract? If so, does the contractor get paid in any way when the client cancels?

    3. 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).

    4. What happens if the contractor runs out of CPU on a tick or encounters an error? Is the contract code still executed?

    5. What if a contract throws an exception? How is this handled?

    6. 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.


  • Culture

    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).

    👍

  • Culture

    @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.


  • Dev Team

    @postcrafter

    @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?


  • Dev Team

    @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 sourceIds, 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.


  • Dev Team

    @dignissi

    I have a couple of questions/concerns here:

    Terminology: Client=Guy paying $$$, Contractor=Guy doing work.

    1. 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)
    1. 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.

    1. 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.

    1. 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.

    1. What if a contract throws an exception? How is this handled?

    It is handled as usual, you will see an error in your console.


  • Dev Team

    @tedivm

    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.


  • Dev Team

    @postcrafter

    Taking your example from above, if someone wants to setup two contracts for different sourceIds, 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.