Advertisement
Guest User

Untitled

a guest
Sep 5th, 2019
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 6.34 KB | None | 0 0
  1. use screeps::objects::Creep;
  2. use stdweb::private::ConversionError;
  3. use log::*;
  4. use screeps::{game, find, prelude::*, objects::Room, pathfinder::*, LookResult, constants::*};
  5.  
  6. pub struct CreepController {
  7. }
  8.  
  9. impl CreepController {
  10.     pub fn new() -> Self {
  11.         CreepController {
  12.         }
  13.     }
  14.  
  15.     pub fn run(&self) -> Result<(), ConversionError> {
  16.         debug!("running creeps");
  17.         for creep in screeps::game::creeps::values() {
  18.             if creep.spawning() { continue; }
  19.  
  20.             let role: Option<String> = creep.memory().string("role")?;
  21.             if let Some(r) = role {
  22.                 match r.as_ref() {
  23.                     "miner" => self.do_miner(&creep),
  24.                     "truck" => self.do_truck(&creep),
  25.                     "worker" => self.do_worker(&creep),
  26.                     _ => {}
  27.                 }
  28.             }
  29.         }
  30.  
  31.         Ok(())
  32.     }
  33.  
  34.     fn do_miner(&self, creep: &Creep) {
  35.         let _ = creep.memory()
  36.             .string("source")
  37.             .and_then(|id| game::get_object_typed::<screeps::objects::Source>(&id.unwrap()))
  38.             .and_then(|s| {
  39.                 let source = s.unwrap();
  40.                 if creep.harvest(&source) == ReturnCode::NotInRange {
  41.                     creep.move_to(&source);
  42.                 }
  43.  
  44.                 Ok(())
  45.             });
  46.     }
  47.  
  48.     fn do_truck(&self, creep: &Creep) {
  49.         let _ = creep.memory()
  50.             .string("task")
  51.             .and_then(|task| {
  52.                 if let None = task {
  53.                     creep.memory().set("task", "load");
  54.                     return Ok(());
  55.                 }
  56.  
  57.                 match task.unwrap().as_ref() {
  58.                     "load" => {
  59.                         if creep.carry_total() >= creep.carry_capacity() {
  60.                             creep.memory().set("task", "deliver");
  61.                             return Ok(());
  62.                         }
  63.  
  64.                         let _ = creep.memory()
  65.                             .string("source")
  66.                             .and_then(|id| game::get_object_typed::<screeps::objects::Source>(&id.unwrap()))
  67.                             .and_then(|s| {
  68.                                 let source = s.unwrap();
  69.                                 if creep.pos().get_range_to(&source) < 3 {
  70.                                     let resources = creep.pos().find_in_range(find::DROPPED_RESOURCES, 2);
  71.                                     if !resources.is_empty() {
  72.                                         let drop = &resources[0];
  73.                                         if creep.pickup(&drop) == ReturnCode::NotInRange {
  74.                                             creep.move_to(drop);
  75.                                         }
  76.                                     }
  77.                                 } else {
  78.                                     creep.move_to(&source);
  79.                                 }
  80.  
  81.                                 Ok(())
  82.                             });                            
  83.                     },
  84.  
  85.                     "deliver" => {
  86.                         if creep.carry_total() == 0 {
  87.                             creep.memory().set("task", "load");
  88.                             return Ok(());
  89.                         }
  90.  
  91.                         let _ = creep.room()
  92.                             .find(find::MY_SPAWNS)
  93.                             .iter()
  94.                             .nth(0)
  95.                             .and_then(|s| {
  96.                                 if creep.transfer_all(s, ResourceType::Energy) == ReturnCode::NotInRange {
  97.                                     creep.move_to(s);
  98.                                 }
  99.  
  100.                                 None::<ReturnCode>
  101.                             });
  102.                     },
  103.  
  104.                     _ => {}
  105.                 };
  106.  
  107.                 Ok(())
  108.             });
  109.     }
  110.  
  111.     fn do_worker(&self, creep: &Creep) {
  112.         let _ = creep.memory()
  113.             .string("task")
  114.             .and_then(|task| {
  115.                 if let None = task {
  116.                     creep.memory().set("task", "load");
  117.                     return Ok(());
  118.                 }
  119.  
  120.                 match task.unwrap().as_ref() {
  121.                     "load" => {
  122.                         if creep.carry_total() >= creep.carry_capacity() {
  123.                             creep.memory().set("task", "build");
  124.                             return Ok(());
  125.                         }
  126.  
  127.                         let resource = creep.pos().find_closest_by_range(find::DROPPED_RESOURCES);
  128.                         if let None = resource {
  129.                             return Ok(());
  130.                         }
  131.  
  132.                         let resource = resource.unwrap();
  133.                         if creep.pickup(&resource) == ReturnCode::NotInRange {
  134.                             creep.move_to(&resource);
  135.                         }
  136.                     },
  137.  
  138.                     "build" => {
  139.                         if creep.carry_total() == 0 {
  140.                             creep.memory().set("task", "load");
  141.                             return Ok(());
  142.                         }
  143.  
  144.                         let site = creep.pos().find_closest_by_range(find::CONSTRUCTION_SITES);
  145.                         if let None = site {
  146.                             creep.memory().set("task", "upgrade");
  147.                             return Ok(());
  148.                         }
  149.  
  150.                         let site = site.unwrap();
  151.                         if creep.build(&site) == ReturnCode::NotInRange {
  152.                             creep.move_to(&site);
  153.                         }
  154.                     },
  155.  
  156.                     "upgrade" => {
  157.                         if creep.carry_total() == 0 {
  158.                             creep.memory().set("task", "load");
  159.                             return Ok(());
  160.                         }
  161.  
  162.                         if let None = creep.room().controller() {
  163.                             return Ok(());
  164.                         }
  165.  
  166.                         let controller = creep.room().controller().unwrap();
  167.                         if creep.upgrade_controller(&controller) == ReturnCode::NotInRange {
  168.                             creep.move_to(&controller);
  169.                         }
  170.                     },
  171.  
  172.                     _ => { }
  173.                 }
  174.  
  175.                 Ok(())
  176.             });
  177.     }
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement