| 361 | } |
| 362 | |
| 363 | pub fn project( |
| 364 | &mut self, |
| 365 | input: &Path, |
| 366 | project: &Project, |
| 367 | config: &Config, |
| 368 | stage_diagnostics: D, |
| 369 | sprites_diagnostics: &mut FxHashMap<SmolStr, SpriteDiagnostics>, |
| 370 | ) -> io::Result<()> { |
| 371 | let broadcasts: FxHashSet<_> = project |
| 372 | .stage |
| 373 | .events |
| 374 | .iter() |
| 375 | .chain(project.sprites.values().flat_map(|sprite| &sprite.events)) |
| 376 | .filter_map(|event| { |
| 377 | if let EventKind::On { event } = &event.kind { |
| 378 | Some(event.clone()) |
| 379 | } else { |
| 380 | None |
| 381 | } |
| 382 | }) |
| 383 | .collect(); |
| 384 | // TODO: switch to deflate compression |
| 385 | // this should be configurable, use store in debug (because it would be |
| 386 | // faster?), use deflate in release (because it would be smaller?) |
| 387 | self.zip |
| 388 | .start_file("project.json", SimpleFileOptions::default())?; |
| 389 | write!(self, "{{")?; |
| 390 | write!(self, r#""targets":["#)?; |
| 391 | self.sprite( |
| 392 | input, |
| 393 | STAGE_NAME, |
| 394 | &project.stage, |
| 395 | None, |
| 396 | config, |
| 397 | stage_diagnostics, |
| 398 | &broadcasts, |
| 399 | )?; |
| 400 | for (sprite_name, sprite) in &project.sprites { |
| 401 | write!(self, r#","#)?; |
| 402 | self.sprite( |
| 403 | input, |
| 404 | sprite_name, |
| 405 | sprite, |
| 406 | Some(&project.stage), |
| 407 | config, |
| 408 | sprites_diagnostics.get_mut(sprite_name).unwrap(), |
| 409 | &broadcasts, |
| 410 | )?; |
| 411 | } |
| 412 | write!(self, "]")?; // targets |
| 413 | write!(self, r#","monitors":[]"#)?; |
| 414 | write!(self, r#","extensions":[]"#)?; |
| 415 | write!(self, r#","meta":{{"#)?; |
| 416 | write!(self, r#""semver":"3.0.0""#)?; |
| 417 | write!(self, r#","vm":"0.2.0""#)?; |
| 418 | write!( |
| 419 | self, |
| 420 | r#","agent":"goboscript v{}""#, |