From 79ee99f4dbf25761b24ae9123a924df399043e72 Mon Sep 17 00:00:00 2001 From: Xanderful Date: Tue, 30 Dec 2025 23:07:32 -0500 Subject: [PATCH 01/13] feat: Implement core map data structure and simulation engine - Added MapData class for managing tile data and overlays. - Introduced Simulation class to handle the main simulation loop and city management. - Created CityView for rendering the city using TileMap. - Developed main game scene controller to manage HUD and city interactions. - Added city file loading functionality and initial city generation. - Implemented camera controls for panning and zooming in the city view. - Included SVG icon for the application. --- .github/copilot-instructions.md | 120 +++ micropolis-godot/.godot/.gdignore | 1 + .../.godot/editor/filesystem_cache10 | 30 + ...lding-3ad5c15c4f3250da0cc7c1af1770d85f.cfg | 5 + .../.godot/editor/project_metadata.cfg | 11 + .../.godot/global_script_class_cache.cfg | 17 + ....svg-218a8f2b3041327d8a5756f3a245f83b.ctex | Bin 0 -> 176 bytes ...n.svg-218a8f2b3041327d8a5756f3a245f83b.md5 | 3 + ....png-ce6346c91a90149344330e3b16ec8c2f.ctex | Bin 0 -> 34598 bytes ...s.png-ce6346c91a90149344330e3b16ec8c2f.md5 | 3 + micropolis-godot/.godot/uid_cache.bin | Bin 0 -> 335 bytes micropolis-godot/assets/cities/about.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/badnews.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/bluebird.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/bruce.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/deadwood.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/finnigan.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/freds.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/haight.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/happisle.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/joffburg.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/kamakura.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/kobe.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/kowloon.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/kyoto.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/linecity.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/med_isle.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/ndulls.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/neatmap.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/radial.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/senri.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/southpac.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/splats.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/wetcity.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/cities/yokohama.cty | Bin 0 -> 27120 bytes micropolis-godot/assets/graphics/tiles.idx | 960 ++++++++++++++++++ micropolis-godot/assets/graphics/tiles.png | Bin 0 -> 64376 bytes .../assets/graphics/tiles.png.import | 40 + micropolis-godot/autoload/constants.gd | 354 +++++++ micropolis-godot/autoload/constants.gd.uid | 1 + micropolis-godot/autoload/game_manager.gd | 53 + micropolis-godot/autoload/game_manager.gd.uid | 1 + micropolis-godot/core/city_file_loader.gd | 155 +++ micropolis-godot/core/city_file_loader.gd.uid | 1 + micropolis-godot/core/map_data.gd | 204 ++++ micropolis-godot/core/map_data.gd.uid | 1 + micropolis-godot/core/simulation.gd | 417 ++++++++ micropolis-godot/core/simulation.gd.uid | 1 + micropolis-godot/icon.svg | 9 + micropolis-godot/icon.svg.import | 43 + micropolis-godot/project.godot | 65 ++ micropolis-godot/scenes/city_view.gd | 151 +++ micropolis-godot/scenes/city_view.gd.uid | 1 + micropolis-godot/scenes/city_view.tscn | 13 + micropolis-godot/scenes/main.gd | 119 +++ micropolis-godot/scenes/main.gd.uid | 1 + micropolis-godot/scenes/main.tscn | 80 ++ micropolis-java/build.xml | 2 +- 58 files changed, 2861 insertions(+), 1 deletion(-) create mode 100644 .github/copilot-instructions.md create mode 100644 micropolis-godot/.godot/.gdignore create mode 100644 micropolis-godot/.godot/editor/filesystem_cache10 create mode 100644 micropolis-godot/.godot/editor/main.tscn-folding-3ad5c15c4f3250da0cc7c1af1770d85f.cfg create mode 100644 micropolis-godot/.godot/editor/project_metadata.cfg create mode 100644 micropolis-godot/.godot/global_script_class_cache.cfg create mode 100644 micropolis-godot/.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex create mode 100644 micropolis-godot/.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.md5 create mode 100644 micropolis-godot/.godot/imported/tiles.png-ce6346c91a90149344330e3b16ec8c2f.ctex create mode 100644 micropolis-godot/.godot/imported/tiles.png-ce6346c91a90149344330e3b16ec8c2f.md5 create mode 100644 micropolis-godot/.godot/uid_cache.bin create mode 100644 micropolis-godot/assets/cities/about.cty create mode 100644 micropolis-godot/assets/cities/badnews.cty create mode 100644 micropolis-godot/assets/cities/bluebird.cty create mode 100644 micropolis-godot/assets/cities/bruce.cty create mode 100644 micropolis-godot/assets/cities/deadwood.cty create mode 100644 micropolis-godot/assets/cities/finnigan.cty create mode 100644 micropolis-godot/assets/cities/freds.cty create mode 100644 micropolis-godot/assets/cities/haight.cty create mode 100644 micropolis-godot/assets/cities/happisle.cty create mode 100644 micropolis-godot/assets/cities/joffburg.cty create mode 100644 micropolis-godot/assets/cities/kamakura.cty create mode 100644 micropolis-godot/assets/cities/kobe.cty create mode 100644 micropolis-godot/assets/cities/kowloon.cty create mode 100644 micropolis-godot/assets/cities/kyoto.cty create mode 100644 micropolis-godot/assets/cities/linecity.cty create mode 100644 micropolis-godot/assets/cities/med_isle.cty create mode 100644 micropolis-godot/assets/cities/ndulls.cty create mode 100644 micropolis-godot/assets/cities/neatmap.cty create mode 100644 micropolis-godot/assets/cities/radial.cty create mode 100644 micropolis-godot/assets/cities/senri.cty create mode 100644 micropolis-godot/assets/cities/southpac.cty create mode 100644 micropolis-godot/assets/cities/splats.cty create mode 100644 micropolis-godot/assets/cities/wetcity.cty create mode 100644 micropolis-godot/assets/cities/yokohama.cty create mode 100644 micropolis-godot/assets/graphics/tiles.idx create mode 100644 micropolis-godot/assets/graphics/tiles.png create mode 100644 micropolis-godot/assets/graphics/tiles.png.import create mode 100644 micropolis-godot/autoload/constants.gd create mode 100644 micropolis-godot/autoload/constants.gd.uid create mode 100644 micropolis-godot/autoload/game_manager.gd create mode 100644 micropolis-godot/autoload/game_manager.gd.uid create mode 100644 micropolis-godot/core/city_file_loader.gd create mode 100644 micropolis-godot/core/city_file_loader.gd.uid create mode 100644 micropolis-godot/core/map_data.gd create mode 100644 micropolis-godot/core/map_data.gd.uid create mode 100644 micropolis-godot/core/simulation.gd create mode 100644 micropolis-godot/core/simulation.gd.uid create mode 100644 micropolis-godot/icon.svg create mode 100644 micropolis-godot/icon.svg.import create mode 100644 micropolis-godot/project.godot create mode 100644 micropolis-godot/scenes/city_view.gd create mode 100644 micropolis-godot/scenes/city_view.gd.uid create mode 100644 micropolis-godot/scenes/city_view.tscn create mode 100644 micropolis-godot/scenes/main.gd create mode 100644 micropolis-godot/scenes/main.gd.uid create mode 100644 micropolis-godot/scenes/main.tscn diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 000000000..ca3249172 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,120 @@ +# Micropolis AI Coding Assistant Guide + +## Project Overview +Micropolis is an open-source port of the original SimCity Classic (1989) by Will Wright. This codebase contains **multiple parallel implementations** targeting different platforms and use cases. + +## Critical Architecture Understanding + +### Multi-Implementation Structure +This is NOT a monolithic project. It contains 5+ distinct implementations: + +1. **MicropolisCore/** - Modern C++ engine (v5.0) with Python/SWIG bindings + - Core simulation: `MicropolisCore/src/MicropolisEngine/` + - Tile rendering: `MicropolisCore/src/TileEngine/` + - Python bindings: `MicropolisCore/src/pyMicropolis/` + +2. **micropolis-activity/** - Original C/Tcl/Tk version for OLPC (One Laptop Per Child) + - Legacy engine: `micropolis-activity/src/sim/*.c` + - Tcl/Tk UI: `micropolis-activity/res/*.tcl` + +3. **micropolis-java/** - Pure Java port (MicropolisJ) + - Build: `ant build` (not make) + - Engine: `micropolis-java/src/micropolisj/engine/` + +4. **turbogears/** - Python web server with TurboGears + OpenLaszlo/Flash frontend + - AMF remoting for efficient binary messaging + - Duplicate MicropolisCore: `turbogears/micropolis/MicropolisCore/` + +5. **laszlo/** - OpenLaszlo/Flash client (XML compiled to SWF) + +**Critical**: Changes to one implementation DO NOT affect others. They share concepts but not code. + +## Build System Patterns + +### Top-level Makefile +```bash +make # Builds MicropolisCore and micropolis-activity only +make install # Installs those two +``` +Does NOT build Java or TurboGears versions automatically. + +### Component-specific Builds +- **C++ Engine**: `cd MicropolisCore/src && make all` +- **Java**: `cd micropolis-java && ant build` +- **TurboGears**: `cd turbogears && python setup.py develop` +- **OLPC Activity**: `cd micropolis-activity/src/sim && make` + +### Python 2 Legacy +All Python code uses Python 2 syntax: +- `print "text"` not `print("text")` +- `except Exception, e:` not `except Exception as e:` +- `from StringIO import StringIO` not `from io import StringIO` +- `import urllib2` not `import urllib.request` + +## Map Data Structure Patterns + +### Multi-Scale Map Storage +The simulation uses **multiple overlapping grids** at different resolutions: + +- **Full resolution**: 120×100 tiles (`WORLD_W` × `WORLD_H`) +- **2×2 blocks**: 60×50 (`WORLD_W_2` × `WORLD_H_2`) - land value, pollution, crime +- **4×4 blocks**: 30×25 (`WORLD_W_4` × `WORLD_H_4`) - terrain density +- **8×8 blocks**: 15×13 (`WORLD_W_8` × `WORLD_H_8`) - fire/police coverage, growth rate + +See `MicropolisCore/src/MicropolisEngine/src/map_type.h` for the `Map` template. + +### Tile Value Encoding +Tiles use 16-bit values with bit flags (see `micropolis.h`): +- Low 10 bits: tile type +- High 6 bits: flags (ANIMBIT, BULLBIT, BURNBIT, CONDBIT, ZONEBIT, etc.) + +## Code Quality Issues to Address + +### Commented-Out Code +- `MicropolisCore/src/MicropolisEngine/src/tool.cpp:328-343` - Dead coordinate arrays +- `MicropolisCore/src/MicropolisEngine/src/graph.cpp:75-83` - Unused color arrays +- `MicropolisCore/src/MicropolisEngine/src/micropolis.cpp:116+` - Type comments + +**When editing**: Remove dead code rather than accumulating more comments. + +### Debug Print Statements +Many files have uncommented debug prints: +- `turbogears/micropolis/controllers.py` - Facebook API debugging +- `MicropolisCore/src/pyMicropolis/` - Various `print "DEBUG"` statements + +**Pattern**: Convert to proper logging with `logging` module, don't use bare prints. + +### TODO/FIXME Markers +Extensive TODO comments exist (20+ in tool.cpp alone). Common patterns: +- Auto-bulldoze costs should use table-driven approach (lines 272, 322-323) +- Building properties duplication (line 220) +- Complex code needing refactoring (line 981+) + +**When addressing**: Look for similar patterns elsewhere; fixes often apply broadly. + +## License Header Pattern +EVERY source file must include the 60-line Electronic Arts GPL header with "ADDITIONAL TERMS per GNU GPL Section 7". See any .cpp/.h file for the template. This is legally required. + +## Testing Approach +**No automated test suite exists.** Testing is manual: +- Build and run each version independently +- Load sample cities from `*/cities/*.cty` +- Verify simulation mechanics manually + +## Integration Points + +### C++/Python Bridge (SWIG) +- Interface: `MicropolisCore/src/MicropolisEngine/swig/micropolis.i` +- Python modules generated: `Micropolis`, `TileEngine`, `CellEngine` +- Pattern: C++ objects wrapped as Python classes with automatic memory management + +### TurboGears/Flash Communication +- Protocol: AMF (Action Message Format) binary serialization +- Python: PyAMF library in `turbogears/micropolis/controllers.py` +- Pattern: RPC calls with binary tile data transfer for efficiency + +## Current State Context +- Project last actively maintained ~2010-2013 +- Modern Python 3 migration NOT done +- Some Facebook/Google API keys are placeholder 'XXX' values +- Windows build configurations likely outdated (.vcproj files) diff --git a/micropolis-godot/.godot/.gdignore b/micropolis-godot/.godot/.gdignore new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/micropolis-godot/.godot/.gdignore @@ -0,0 +1 @@ + diff --git a/micropolis-godot/.godot/editor/filesystem_cache10 b/micropolis-godot/.godot/editor/filesystem_cache10 new file mode 100644 index 000000000..f1a9d0cd7 --- /dev/null +++ b/micropolis-godot/.godot/editor/filesystem_cache10 @@ -0,0 +1,30 @@ +63f7b34db8d8cdea90c76aacccf841ec +::res://::1767150494 +icon.svg::CompressedTexture2D::2816000242085590096::1767150135::1767150494::1::::<><><>0<>0<>a74ac7b5da164fc071429abc539e113e<>res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex:: +::res://assets/::1767149358 +::res://assets/cities/::1767149358 +::res://assets/graphics/::1767150494 +tiles.png::CompressedTexture2D::552265117442925281::1767149337::1767150494::1::::<><><>0<>0<>db98e1e01f180769b8487d64c040c343<>res://.godot/imported/tiles.png-ce6346c91a90149344330e3b16ec8c2f.ctex:: +::res://assets/sounds/::1767149329 +::res://autoload/::1767150494 +constants.gd::GDScript::4170974552926161093::1767149636::0::1::::<>Node<><>0<>0<><>:: +game_manager.gd::GDScript::2318034752836449647::1767149684::0::1::::<>Node<><>0<>0<><>:: +::res://core/::1767150494 +city_file_loader.gd::GDScript::2703736120624825042::1767149862::0::1::::CityFileLoader<>RefCounted<><>0<>0<><>:: +map_data.gd::GDScript::2280986835664974494::1767149757::0::1::::MapData<>RefCounted<><>0<>0<><>:: +simulation.gd::GDScript::3493889077640698236::1767150639::0::1::::<>Node<><>0<>0<><>:: +::res://core/scanners/::1767149329 +::res://core/tools/::1767149329 +::res://core/zones/::1767149329 +::res://entities/::1767149329 +::res://entities/disasters/::1767149329 +::res://entities/sprites/::1767149329 +::res://resources/::1767149329 +::res://resources/tiles/::1767149329 +::res://scenes/::1767150494 +city_view.gd::GDScript::429956780566812089::1767150639::0::1::::<>Node2D<><>0<>0<><>:: +city_view.tscn::PackedScene::-1::1767150347::0::1::::<><><>0<>0<><>::res://scenes/city_view.gd<>res://assets/graphics/tiles.png +main.gd::GDScript::3112013681207910259::1767150639::0::1::::<>Control<><>0<>0<><>:: +main.tscn::PackedScene::-1::1767150043::0::1::::<><><>0<>0<><>::res://scenes/main.gd<>res://scenes/city_view.tscn +::res://ui/::1767149329 +::res://ui/panels/::1767149329 diff --git a/micropolis-godot/.godot/editor/main.tscn-folding-3ad5c15c4f3250da0cc7c1af1770d85f.cfg b/micropolis-godot/.godot/editor/main.tscn-folding-3ad5c15c4f3250da0cc7c1af1770d85f.cfg new file mode 100644 index 000000000..2a2f5c3ea --- /dev/null +++ b/micropolis-godot/.godot/editor/main.tscn-folding-3ad5c15c4f3250da0cc7c1af1770d85f.cfg @@ -0,0 +1,5 @@ +[folding] + +node_unfolds=[NodePath("."), PackedStringArray("Layout"), NodePath("HUD"), PackedStringArray("Layout", "Mouse"), NodePath("HUD/TopBar"), PackedStringArray("Layout", "Theme Overrides"), NodePath("HUD/TopBar/FundsLabel"), PackedStringArray("Layout", "Theme Overrides"), NodePath("HUD/TopBar/DateLabel"), PackedStringArray("Layout", "Theme Overrides"), NodePath("HUD/TopBar/SpeedLabel"), PackedStringArray("Layout", "Theme Overrides"), NodePath("HUD/TopBar/PopLabel"), PackedStringArray("Layout", "Theme Overrides"), NodePath("HUD/TopBar/Spacer"), PackedStringArray("Layout"), NodePath("HUD/TopBar/HelpLabel"), PackedStringArray("Layout", "Theme Overrides")] +resource_unfolds=[] +nodes_folded=[] diff --git a/micropolis-godot/.godot/editor/project_metadata.cfg b/micropolis-godot/.godot/editor/project_metadata.cfg new file mode 100644 index 000000000..6d2ad5c5f --- /dev/null +++ b/micropolis-godot/.godot/editor/project_metadata.cfg @@ -0,0 +1,11 @@ +[game_view] + +select_mode=0 + +[editor_metadata] + +executable_path="/usr/bin/godot" + +[recent_files] + +scenes=["res://scenes/main.tscn"] diff --git a/micropolis-godot/.godot/global_script_class_cache.cfg b/micropolis-godot/.godot/global_script_class_cache.cfg new file mode 100644 index 000000000..765f0f3fb --- /dev/null +++ b/micropolis-godot/.godot/global_script_class_cache.cfg @@ -0,0 +1,17 @@ +list=[{ +"base": &"RefCounted", +"class": &"CityFileLoader", +"icon": "", +"is_abstract": false, +"is_tool": false, +"language": &"GDScript", +"path": "res://core/city_file_loader.gd" +}, { +"base": &"RefCounted", +"class": &"MapData", +"icon": "", +"is_abstract": false, +"is_tool": false, +"language": &"GDScript", +"path": "res://core/map_data.gd" +}] diff --git a/micropolis-godot/.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex b/micropolis-godot/.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex new file mode 100644 index 0000000000000000000000000000000000000000..b625c26aa434ec86a7a566d87f736764a593fa47 GIT binary patch literal 176 zcmZ<{4l!b6U|?u~Vj#u)9|(Xn954Y{4PX@v46HzQ1rP^$y15kq>2O!4fUp1ypJX6g zzy5$cgT8}`!=}blqVs>)&z!SZjX_bP`Q)mGe_MB?t8*Lh@+C5sv|s+?zBjq?#C>K} zgN__+(Xa-tkOd8FAO2;^>^tr9rJm`)^qsy(%O&EforTo=>t4;-m2=6s(XUEv&n{*L E0N1TI5dZ)H literal 0 HcmV?d00001 diff --git a/micropolis-godot/.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.md5 b/micropolis-godot/.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.md5 new file mode 100644 index 000000000..c1961f461 --- /dev/null +++ b/micropolis-godot/.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.md5 @@ -0,0 +1,3 @@ +source_md5="f09550c70a4aaf8f848e5173dced5e64" +dest_md5="4942af646843f9887b864edec3058519" + diff --git a/micropolis-godot/.godot/imported/tiles.png-ce6346c91a90149344330e3b16ec8c2f.ctex b/micropolis-godot/.godot/imported/tiles.png-ce6346c91a90149344330e3b16ec8c2f.ctex new file mode 100644 index 0000000000000000000000000000000000000000..d3cc9d1fb34d391aafd358fb94aa544523fe5bc2 GIT binary patch literal 34598 zcmZs>19&A(m^K`1!ijB8Y}@9zRK@QuL7#arA!y zCn_!mrVtv?t1oC-pBH52ekAR(&nScNDXQT4!%l&Fg;M62O^=VBvXD`%RjKh72gGL9 z4S~-2GmDQev@);;Z>&m5l)TbIEFHsfAmxSTpAwFO;8LwvLL%jfSxNN+bRaKtpZXut zGQ{G}QQjK2*b|AQzSdu^hnGfMe?Z~Gy5KF3BT*-vcXl6=-NyeYIWB*@wv%{Avb~ z!wU-Li(JZpQT{UK>_q|vg@-g9x*&8G$bB&1kN@7dN%D-;ZM!P?wf#~rDr0RQcLR57 zoJ?w^Aw6zA=DIMTW)E5Qttg)BdmkZ1?ERv52@$rUE!FVYQx#F(2jW@-!f%huRGs6} zj(}m%{qJ$QZxh*t_h8JBL!RL7Ul7ZyjVIf}LM8N3Scz_nBRQdb&1<~Rp|Wynr2==- z08DXe5;G}t_IT5Nuy(63iTQX|m0xCsZgAb!KkUi4o@G*AapOkht9pSZy#gA*_*E z@R;Y|rCu$RO3b%aM`2>*RVBt$jDm^JAca+1XFu75oHJ_sxCpo-z_X#y@JI6APvSuV z!`ox7sy1xFPB_6}dnn72xYZ9_We+5qjykPxEUmmo;99v4wRMJa0Of^?a^$lBWdZx* z7ne126BwCGK%Dmhx7uKPT2Th(CGv6ek+e22?M{m%tVB+<;=F|q4)bE3QpPcaG#5fI>H~XB{kgR9im}`mowNnZE+eDU8wdXW7-#cqKo= zP;X45%K3%B4cDI*%gGCrx1z0v1R|+C=<}$xKW&lrmp1P}vF6sxW74Zd<|N87Oqr&@ zJt>LN_ykvWR%h34V!4?8qt47`U)Kn@@d!GA;PQvdatiNDTy2lDRuZ9BmG6YjukNvV z$S_v6%%Tsg{pWdd8dkQJ9cD^H0uy9xG10vaJ$&&NGLmu8<+PtGj#}`t`=)83uh)Ue z8>FMfp_WJ_J)Zfr+>&lcBSDE`u9fLI@ue1-m@gA$1#K4nv4m_QqM}{~v>mKbAT2T= zB}A&MaA~^gd2!Scf+E}?Uh@Q#fI(P@cs?U7J}+VuEe)rmFKP2332kw{{Ul4fcrj(_ zt|oW!mr{57GvVZ{vW(Q|ro@9la(o_FCF zTPgky3aJ4-IOA-xff?wO7PYo^m3JswLk~;$#58HSZ^%x+J*dRwWQ4LxwlhVE!jDj` zzx!4khR&@=M!S$(JPNM|Dq=oDW~US5UY5SAbs z_F%m%o*L+xA*H_VxTQ%bGtuc!^?NC_VFhPpW7iFx9vTT8AMZ@@jvoX@wrNCnt2a~^ zT;xWEl9R#?_`?_Q(qqXKTTpEBD0q^!LqI8uCN#q&4uEBgD*)k1ekbH}kZZfEg2`_U zTaF#_<>lIvj5lBz?PwBzX`iJ9X33&eKIMlCR0=%B+1o6f0x(9_SDr z@%BjatPvmEeWDjBevAnlmEi3zL?&cWMGyv?-h9ExB-krjWxhd(@I%+kdUbhf|9-sP zeN;HuIO!X3pUCHo&qc|&<54<5EgqiAS;HX%*8d$l{!lQwpLd~k?_k{lRaOwa102`Z z-qw0-eSgVVz*3ZBD4l`7w$Smipra#xF47-vWfcvgp4W^RDvUh}MHfge-2SBo122(% zpHz6L-Toe5M|u-T<|78OQ@?MQ?;JfmwUs`R*G~(bGQ2|q+!CfX65+$35(0Z;-y!yL9YvYVth|Y z=TNVi@TMHQD+(BaxJr3L`S-){oN^vyXMMRiUWzJ+}pk7aD?AzcT|LOZ{& z_P774ETT|u3+8y$0oE|fD5pu>QRoH$-mr>c+7=eaBtCY~Ta;qULQ5v~s3 zjgB$E1TC|TxyO+EWPSEJzSWKdcGfy>Wvv}+ghtNW;IMN<$~nI$SuUNA59j~wbMU4yN{IIvA$?;s(0lyXK!!I8?zg^gBKU3ukXCR41*i`1f@Hj`;T7$7?Gki zc9Pg@{#K0|K7!M5*V}z0w*|d^{`Cj_qVO5dbM){B z7`>1haO+RSIX(6s@`FZ6H(Vo@Re&S)$ve>;8G*XW@CVb+>kehhNPb;nPgf!OV^Vkv zCJq_6Dx!g`bI`1GF?W;teFchTv1l5KLhKxm15ufHk{rs(C@z7F^?p)5qbP~1#hqQD zoKE`d82g>JiQ;dGv9A5soF2Pxm3J-|EC);@xsyB8sl181aEW3 z?_TAN-F;jOxPA!X=mOWfm6X`3vifU-p5;MC!f=OjH6_ zM3d13Z57wE=z`Fdc)^gTYUepOQFz#FM%mv!9MKxKC?*?kqVLJ#uB?Sibx2Jh-T#MP<%5W0Ty$X6KSNeB|y+fxpDLf)biZ+m8OZFTEE zRK8H9>D%+dEk@;kP}=-DYk1phxIlT?yakRP_;l)o7Mw!TJxhpBjBeh(9CX4K%s^|- zu)N*qAQojZVOnZ%0K~g0vTva0js!2A^TWde&_ry z<7ql(ciEqzYZA_ga;_`LRY;J;H5SJ?7Y zKMTRxvLE8Ae$T!!%G1^QwMIwMc(BJdljw44MCf72DA+m)bC4EF(}7?ztSUr*Xv`?8 z`Yd0Cce>-*nT4#9t3k;bNd%{idO(s;& zgF^|2NTiub4VnhP2JcIgkSD(~F)vpEjwe&&C*bW@ zu7%n+P}<#<6fD#b%-7hp0}aw5OGD-F3eaF4>PdZ50W5TBQoBjQPSE5RavhLTb-|fl zreMoH)Q=}#`v?lu@JQ!3kE`lt7zF`ldZd{Tu}51xMo+OEZF=0@5 z&7{X%8GU?|c9>SBgIk3bkY#hiz#VT~h?$$4#Kha&G-XAv&X4D`_S+?ykA|Tledw&R z-O)ynsHM(gp4hkdhlcUXfBuLWyyT|C-~P)NOXA)4+y{oUiqyFaXZMA^D{_@Z9A06m0R@o$PasbQB~|B+%a?UDdR4K1W1Rm(ZJfi;bbs zc*8=r1Az7ZIW%5s4UTS{t>JSSjiwU5fk_$Z89zN_r-uz(n&F=t99U2nID{P>4G(LG z0u0nrAD#h=Io%r%#xiGC&JPAyYgmNs9Bs|co6eJ6XS7J)LVg){!@o)$ESsj}1 zy5=nGYkOOlL5BB4uTk^svXp@b_~4h9@CE<{=X;xCcf$mSouzf8yI#&)j2ngVlU1{K z%bj_i5kDM!AN&t>+{%j!&Ar@nZTK1IES-G>)UNd8{5UQ>AMh=_BDCaB|kn8WJ#I22mgfAeJdmFmfn6z?NZ!$!cW$!dwl?~XjNuzCs zU|30sw@ibj_8?h1M12iAC7nyj0W=FBpx9TvR>?XkbUNTJX)MD*PdCDe;H?*Is8#sG zUeqL;BYaWkU^fPsSYSclR=fGXpf{ql~*K+g0uT?XW z5`YnaiHG@<4qBhb#VjITj@{;QF$4T=Zc%U1x>0#^LI&;D@r5Vb17ekiaX8 zD`2$&;A6=bmDaX|A9TT84ss|w-FYydSeEykcq;S!PAMtZCSGqCl#>Lc8m4OrD&;AP zs5-!ePwHbv&)j+;7uM}sI4tSH+-pG-M8_ z#S`58NOD@Bu4M!FJuoC0P|9;(H|~)94}O%C6Md8a&PSvdYhT0f+$BX0GIdjbBUcLh zEn0l+c{V{oyDdIMtGs8X<=C93o$3rth4FHa)S$gDVuede8PKg=$XGhdi1(VmJc>Mu zuCc)n6EU$oh{kcGjRB%)ljvL6NrmnQB5 zdk!jq=-<1{_URz8pY-wjFANmteiOT2wEs$k|KsU|Ur>r~S~jt3+oh=!%cjO(#|_y- zglzzrJp11RpR=AcxOk~9aAPxY!WXON{M&AU!^n|~LUKV(A_VE)pTqqeaE{%Sy=Q2u z@T_N&d=Ww?@Wp|rNZ(h}=S=23_{NRiC+N;Y*EDGdof$+LNYJ$AWnfj;xV*h?P72{{tkg}* z^h^cCm!MYxc47Z($ix3>>w2k*->hthnt$6B;eCtjFO6110h3?gdEm>P?1#29U$!RC z7(H#v=DBBjgFW4`|B%Oijq$;&r2m}&dPpUYZPahtzGla<1iAiSoZgqJL%=SJ{Ex>g z;{iSH5GF5$5Vp3lyY6!+E*wN+5=(&tB){5fT419IBa`YXB0t?r9IuCv-#$ptD>PYi z7X}&CSUHh@p#Q1`66;jyziVQb=Ifm;aY&NuU79`qE2NCbxjvX@i1!;vnz~*Gq(&KEIz6rjI*UbC9Jg^US6ZLLg9XHlC4S}pk z(m!-0f3kW|$@GTVzl<(*kIn_whh|;)DcnYQ^s$R{f@Pq*yx>b4vv?Cggn!r)Co1?F z&JuVY)0@eCW!|JNq5>YIn4XU5V(M{n;Z`u8)&3~#H6 z&y;$bsd;T4?$81kuFg)lw{4|Ho%eRj!!QP)=Hdonu({=V^e8KYL{zJvQ1YfW| z<00NV1y<9ak@MEqPF;yU1uo0IKGP8X+WgBcCle48Emw$SF|2*bQW0%C5#?=);3?hzWnn$(11kxzYp&0i=h*}qxF1(tT0f!=R*hK_W^H&9Rh-m{zyIUW zEh9(X$Z5iwZZvm9ckaqnKjQaD8zsI2OPWpe-ZwelioNy5p0d|t-+s@J-Kp?w>`!=l z9j^RhFv?^pqR?L*u`}6Ieb>Jq+xz*l;BN+zrQ+Pi{mJax|4rbrJ_C|z1^?T>SeRK{ z|2tR6PLmtMt{2RTFL9N6N$SoXbQ@61bFrm}d2wW;A%I1sP2BAbjC0#n!%w0R7XY0Z z{KUlACsXkK^nq`?@2aay*!=@j<8gL;%+@?CA)_KSU3*OQEcyKFc^c3=EdH1x_;$irI-oIbsmq!h*R;HK4ajCVYL00!ZJTGT(dpQj_ zskVFBcZ8VtXu z{b3&3{*&XEG{lYA@`^zs-w(j58CK%I^A_}}6-1v}aqE9i3{!n}n5*WbB$K9tUTN)b z=gJp)ezCVPjP!;TRomH9zl=V~nPc0?Z4GT6Iw&ULW^zA}H5g_$I6IFEZl3wtRD*w7 zD|{t?H9;7ctza|=dk7e4mvGw2c)k8j&89G3@R)4SYPqj!!NXltpM(Ssmj9&C1j<Hf9Be+Gc3t@K6ANU~i{U|9cf22OOtiIWu% z(jikEn}3-3Kk6?*j#=+AtajDXQY~rG(Lx}?;qiH2@Fv?$T))RQ1h6A)WwU)pB!^?Z ze}uua&F)U{0vhl?g8kCk$CFjCJrmuxJ#A>e?wR_A0z;I{Eax z?luU$z_ohrayK?SW`5jX;wJ5jUpY?Ch|Kup2=|{6e_4-0TyncF?_mz+Vml?x{=g6J zh%8*P>p{#_xsbD;nM-9^UoSM$tpW*KWJ-7;Sl9o2d|_djm|smFnhoM&*gzR%xxw7YVi^uqV;t@A8Q%hCE9}WyJ8jQZ zUzb=0{70m~3CLVAhNot^X@cgw%lSu1c=Z~+em=kp4e7xfWCaxIvL`%wxh3qgvHl)o4jw2SzmFjPb zZ~wvs7@at}VZN@tHgQ^7W@@*k8Q%#u?3XxursMk*qB9H>NV;)LZC9tvJU9_MfAc;Y zMe#oss%XmpD>1s#94o7*mv-!ePFxAJEQH#*r2a^gTmPvv6FYa!ccdO36v)>9#*F_l z5>T)i4Kh{+`5Dpc?%uGAb+U_wix>g#4XA)y_>7FvCTPmreyS_6e+Z6p zR%s_3YlqjT-f%%+)GT+p3_sW-$Oxpiy}Vu6{xBRG(;497{Ppn9lBx8D^L$(M0y_|S zH5T*W7;gPI#RfSZd>B$Dt?dcW%<(!U(06)D2y`qw8}hy}9vqj7k3Tp1U+}RB_ zBds4Uoq~bGCJ`1@{mUnz47%LvJl~fG72;YR;-Fox);K8_XmTeTCAuve@BwRXDnUIM94A<%$|GBoG&*Y8;lH}}{Tc04_rYh&t* z37vJ6&fHQsOi?Ef));!G#vZ95%gSa6GFbW+Zmrxt%HGUBwt_Pf{*5h%T5PQ1m`u#* zcL=hk{_&2nc~86tpR>R2@o=h}Rr<}PR6TM3@DJB=m?V8r|ElE1oP&Mne;1tpbD}

UKWyRxP=yGEA)*FEO{2brvlQKbE^ z0kgd!VKlL&y1i*bVdn25?RkBFjfn6V+tKi!R+n9Fbz< z-341tJw?NHu*&Qd*YiQlSi8urb8;OACBjD+)--6pL5ywo%CCOUP)@gPE$tu2-QFLW)%LsVFQ4^p3r|FOJ}TA&zU9y) zKH1GsvdpCVdk1X~6%pa58$IXQ$V#g{F9(eb{_8JoOYNvCQns;+w;THjKBO1#=hfx2 zsoT6FqI7_uWq>|XvbQfF_Z!IyM~X)MIxa{D!+k|W?e2!?ZU5?vyqmeIxjXY0lu`e1 zclirNAFqQsg4|6~yUmzmpT^FyoPL-u$$}6|Dksi-fzBt8@Zf z?e~=DjO2z`b&)15C9_X1UiZ)I&G+b6^F{DPPH{CO*Is^5WsBYDP3I`r=3B$F_}4gH zC#ktTaxwI&y5*D#t1fAXpf|P zh%qL>7Mliq;9FTEMJD(<-TYR3HP(O2=v~x|C`>bh0)kbw+ec@ONFW zw-`bd^j8!luEYcd;W8BzC4nPH84hBEkO!f<{Xhc&l^cT4VipVf$#(ow-HY5aMI{Dn z7&&Xmgaf4rC!86(Td#EDUMloi=QK^_4}%<;ut5qUI4D-0ktbB8Iu#txDG4ItFYF^A z2r{f#A=1ZO3|#^*3L^p&!mDvv?S*W5K@YluwpWb&OVL3!IxwC|HY|7+1ip~d=yz&V zeCSX8Z|EDYRK1FR0%#*&0jY{qCS5bg;6@RWs$U`VoPAATssb~~Y%BOlHH`#OrL%&^ z#11ZpxK1JaVZiEsLYvB+-1d0$=OS6Tsu`=J zp8o0A!`DgRZLiciMJK`ZK(Cj#)~$+C*Oy^^t!nb92Wi08yD{IYFDWgy6!QH;(tX z@T3YoPJ9D%)Tq*dzzO(?V^F*>4Z_X7Mvfzd_#_X!52#Hl3+re#dM0j?-L78BZP&57@YfVIdH*p(;3_N}z;I!*)P}$ADFH z$k&9<#vdJsy=&%MKA_mUUDUFI`VhTgcAW`}OFA7d%V%ZXzrk+B93Z&hLE$ttvVWXr z)XgDi4^9vRH#S;jkNKc}TC1y@9q-5BHn=@(yj}MGxL#r4=a`t&JQfY*jamI?Chy|LxPFJHv-*N)A8{p-9z=?;G@|~RkD-L= zgS+JQ-MYHy=fOVSIkr8KQ@!@%q+LMneYJuxE(O=}`FSup+%Dpvp;0V=axzujttqsqkn6VM1Qp>0?JPaZitbtnz@c_5*sYHOa5&VJl_ha$@sC zezNl#3HvonJswkL(=Y;U>X94 zw^lPpDxcXr@r%bDhNYf6_59fDb2+t9{KA$E%|Kz~O{4q|3U)cSZv!4Enq-Ia{eDFNoKGBmN%_}wErH4pInB=W z&WUKue%9HnbnK$&JKBx$i(aDuzi$JF{hGD%%V(SyuiQQ!QTyxX+>i-js>1fo&B@`x zEH$&mLD^Aqvu%44k^z=iDL}oe6n9(Kmp;r~w1>z*pX#z5(JOhSDw=2oEi3GG>vjTH zTP(Bl@jx5l^n`hFOTy-02$t&&QiGw^93uO;e0FJo54GPZ>JZ^c9v6rb9JU3Kw5hbb zNqji5;Q4GX3J6+GDOD9`qOmBRG%@8k2>R3ID+r?jjTPq=aucViXir|9K27Z~eL4SwD;W2PH3Zu(es%^=RQ z27#eOp`oFLkodJc#z{qk$swfhQAMITfe4z=#YKahk}fcw!6Txegd;n`2ucNrV1dbn zDs~Z&*}){Pk?sOOw$x1HjX`N(yt;c9rUW_1K;amLY#Gj?lhy)UfD{v+lK3C%D0q{+ z=3GDXqT!LlXw_4ecfQZM+|}ueWw8cX0<(7Vsvr16ET<$FS+UUSOrh@9RY;01U8U&u z@>4ZdgJrWKKGuNTNpogScJ=Kld3a9yS@eDhdr(x6B#}F|R)WX)2#} z)fRVf&?`wa4T1tlBjP)ZZ%TixA4kv$;Ausk8*r!~{qx{)5{DuM>uG=^AYA|kNG_Hu znv#oTw-(Pyyj4Z>ohV3tx@iJlXQpCQUM)|r@$%olhzO1imFGV%_r z`fw&`wh1nJo3ZNeslZtEl0lppmiRdvB*gAH!*Xa{z_G_?r^|Ix$ z^^2g?o||~4^8t@TF4k5V-sZ|l5*u-E{iNc)wDNq}G(``$TNl|@68X`?wTJDPN`K8OiRggVbUpIB0=J2w*V|boQ*`moHz$^ONh{ z*rhBI3q)P|SC+Zhv3u~~+25Pu$r!)7kq1~LvcZ4uck2O@jHc?g`^pL%DvWGFEA^Fp z2RY$UQOi%E1lI1Yy`Uf@BqVuI3dR}JBN%zc7Rz~B8RiHtx*2Ui3J#hr2}s;8;!Q7o zu*LWTXvofw$%aqCj{lHNhE7gmWfx9EqQw?UwW7UVN{ncspmPIbh*kORk3|`Up=GK= z9F`-(yE-WecV%w0wT~OU+`-J*-7@RD^B7P76lqY!1BQ3284i&c(Zi0001V!v0*K;p z>Fj{-paEUJ3d%_GHDurqb(WKCgr5&!v7!P4AV88COc_iZ^$j`JP_+@|5x07g2Xw^? zI@g)AVU6bzFP0AKWPy2!M@v-$9=*XWzq)6F0J@^;h~2T@1~-K_>lRRJl}0H+JuDpk8MJ{y>HzYlwvbK35Plj*Ps`|bA(B9~o$gi{Q%+TaYF5;G_A!UTV}_GKQ>v&`h?ap0HZ$f{4}s@m=X<>cX6s#;)< zqotZSEkO7o=3zllY=F-M6}Ue2aY4Hu!E~{% zafp6plpPVJx}XB%tVMid6?mM-KA0Wgo(epz_xP(_0H976(~D**(O*5}WK220vex9A zMQUWbaVjmkVHBAR;B&{qV&kdM{O_Ow%LQ~CucE_X8T)pXDzlSpzL{<9i(naUU&^st zazgCr_caZ4eQjM`wTb*L_%c3?Caf-!$_9r9Jv8#~AR^b&}jNp+4_?&0}&~J5*TGgK%`iuN?=fSlVQxiAKfPDPe z>-$zZTc^O%jL4fMl{6Bj*i*{Zq*Q4bccd|#tJxe7UWKzP2#yCt%Nmumj2ko8mwVz4 zeIAQpyq1139p$W7zcXY0(Z&BjjvKcZ}xQJ70y?nzVdN-VR}e{GWY~!1XFs zmp;=Vl-z4sZ!pDX^&2|u9{v$}TGvRx##;~y!H2=Hh(SVev-U2e(6C-N;B&@wf^w4Q z4eO0bLecD@ZO>2h57%l+>b^^fW5z1m|EZ|(S*64~SDQMtg3+RdYFSRF>V@#6xaF+6 z)T4FrQB~DIrGGh8b|>K-KDl)%!8n4+SQgeDw@no{Vd*gjWg&%Hmkh_6`c0bpu|%0i zI5QBNSd2w@Wr!y&}@-VN>zXd5`8l9`jX>3LY`Og30juMM2DSH!hYpd-l@E zqtd}e74H=f$pdj9ArkmOh;k#b1qt6oVKL10z|#$`4c8&1#DR9eTtyw)TYcofDY#2) zl?^?wZCi#DbpQQ<%u^5mY&oYqdw)+e94Zcp%**q>BH>p|mUs`Z$5T`5-*$YARi;6N z^fnJLhLbP{4ePnu07E?anTG{ZULP^tT!f>I93!A(EH0{exA25=B6+d({l^8>(DsrG zCtj@Ff00fZI^j1PPwH*B6a8T1!pLjwDJ47=Fh}*ep@s?u?_g#jjuCe%x1v@Nt80Sw z>2NZB!Dr{!hzj6KIPzIj6DDeto)x)O`j*BdKYq+2Ba9^xJ4|k0U}(~Q4iF?`!7F=j zMKlAY4y8qWbNp0pcD^}EU^vF`Dy%cM?7eH*;_@VCylyDG#b|Cs2@|@Lwf9QqLQgW0 zjNkohkE(iSs|UOu=1wc;^&)QNDkAAj`AuGuzb$G5cu$oZJSkVQg%TZINdc-F%Vjf) zeqZj(K>Ljufz||gU6x9j)nGcGXehNI8Dfso-ERxmI3N5<&A(mZ{q33Gxkq;A&<$7O z#+Cowd?%I=>!vTA!4ClLLpS(PzcK%Od2$i3=-Vn%9cF~Lpi9aiE&(4Rf{Vu;7ZlEl zgwJ4Jb>Rv8L%65^h4;_%G*GMGZWrIc$y=WB5Q=3WSi3$ac&Xew&1ms@UCJ%4xO7vO z7t!!fseUdOEOA$O3#Tlm#JcNxy3}ml=puC#Df9C>S{Qq^o%(^GaUu%&(gPT4JzoQ% zBsB&0RhEHPK5kN&Zi_?`+KA7LYVavJsuWbIxjK@Mmbw&zV=p1#P^u#ydERA znwIK;YNXsy))Wc{wa7bJ!aPWK0>1G zfL$d{2{Nhzek1&Qrkz6miJBgM59FqvjSl>JEXcU}`g%^^SF{SQJWe|ntPdObXul2Z zkZuPo(u#+^`h>;n3%7~8)3C`{dpH~t^r?sw8_msQR=5W|dP z!Sw+Zxm+LNFI3-rU<{9cpMEY>LaV6<%)T!{<0(zI`n<50VmG*zm6vyKW$$S0Wbb(3 zNW|s#UZI8RzA(iGM4@MhEg%X`u1GpJGlf?DX=j^OnU1R_%J~B1V#?WB@*=?N(=r#; zf9kR|Gq7T@W7#rF?D)5wM=C?8WJNR(GV%Co^+`mS>?^239{j^)$|Ke3>1_WbBoHT$0I#6HyQ~h zN1iIRqQ{~cnXGIDY{Qr;8YqzrnXtv-uG0o$Wrf|5Y2S1!@{|%YtEBLV?LFf@*Xm<6 z(6?hcjr`2QFwUKZy7H#h~?+i-#!37A3`FrUH?{vB%MSjKlP49cxC&n+eE- zNrp;ZhC0rj=b=?n_<_5Li5s>p)k*Tzu<&~0r+mk(@FLr^ zIBHMxxe!y2Ugq~pM|yh|@Vu`!3lO}9yz>T0(t&d(BfK+Dt-5?Ydg8Fm2kf`fLxjKK zzE%Uq#;l^k`vg=P=-tzg9$x;$W!c9N@WdT~(4j-nty`8`)KxHU543c*umRLX^Ia>X zx~_YiGA3+!y}KqRCOS9;1WaO$gN6?Aa*V5N=QPxf*HwsNv?_njqEB9Nwk4B6d!Ic- z5V+lKOUD16R_z zbEE)f-hr2mJlM%iTp)R~{p*3}wJ|pf6wkBmKF3e_W*GsW=M*LqX|ZmBLhqzv0@PjP z0xXUW0HmUlHQau&l0Hqi_fC#c+yrG28vU$u*v~R^mXIqO+OrD^Hw!_f zAH^5n4Hap&E@`{l;z`OdHp^jhg<@7W%*ICOCT$G%mCKSIZiXXjN8DYZ%(6f2SZ{;uQqQ081AmMW0r+LGoZQ(mK8#Kf+a zv>y32@06Ck+Da8YLgSEgBrDeN8gXDggNM|}NHaA2SnNud;ydmspLz3Yar=ix)GL5s zmw@X6RynGLYz0Y{R{bU5coBuiM`MtV+AR~IF`f7#dsHygb+Z&9uC$yXFS+~qXfVo% zG$yA#7Bz~y!i)DubHM1$U~LuFh>pDCF|GLagnat%;_&c;8{qltUX&s z^RND79XQPTJ-Z}|O}|4!hmBgQ?mISIny{7?Rb6s;kR7gyf-)FsrL@DDSzb(^Z4wkN zdd^AbE{ z8#Wp_oji@@NE6ZryCC}=Rf$DP+zsPfVmNB5_Xx!-nyjI&Y=1FH#aul|k zSZS-i(8u>3vz%h@yBDA8?;R@_BKV;hRFGQVg6ci4cXhty9BTWypAZNj*IaSbJ(9c&ib=Je%F6cJV>zlGQU9b+Lzk1I zwvy-K337Ducf5v)F0Em~l30d{E@e4TFuvt?ZnjsjnVen1UgDBdxZ~5ZSC&%iB`K;y z1Y|hYV>ik(#-26}L}&Drzm;6b_Q}Rpm|D-2AK~jHr8-tFo8qO>^)`jrU=KWfW>_pr z7wf(D08RNslbA%Z=AAVtu7j0$v-@LY*OMl@=x`jBYAM+)+@@4PF86^kaFmc(77}h2 z5@|AEG_hr$lx2`Fgshf;6DbZIz_@~33M?I93)Rqqu<|WIM@DnDHMQ_?Q422sw{u}H zmNc)>@|;u3CXd@1B6hY{^EVV@MRU+j-jw5fHaWV~A!lMxtO_%t7>O6ap>Ss_Gd|Xu zM22FP&=Rdt5~T=*2_BV<#Om{jNb?55nR)^Po9cFkqIdLV;?kSl&lZ)TO8UdKZ^JDX z96pnbLAT)(Jgvt?1xmsLf9t?r;H9#jPlJx2`x>?s5WkTaXWQhIMTm`ss1zfA+Z??( z7sV{;Hgm|6w6hi>iz(g*Z=Bnl{A)`N850nW>1$eF0k(wMS|IkpIH&!9Ckx_e<1XK3 z#+rkJ>n6`lN_u>lx0_Iomx4$6_o`9Ay+i-TXjbb!`LcmO-i*jh1`pz_X^>+7)>!!A zXQJhYbbPfG`{U)sr-WwB$tvz0IUr^P?-c`8T=%RfH0$qjWXjdd z;a}CJU7ILyQu9axt(lz|P$otY%=h4o$tlLXg|eTvN^iSy>UX^oyGs4qTHtoRs|#4* z9#qoGlQ5@@7Ma=)^{@qMyl2|T)DeXi(7T^;qtd}(1z{wo=^%tzCZyXyk2REo-Kd9Q zl9Rj~&$(TIN3{#@f>q|-<9iV5-VO^1@ViGaR$-z;`M+|AF=U--n4mzH`}Uf|bWU~hJ(Yq2&nWiwKA zjNhR=$O%4suoB))rPCsey4NPpVN!sWC{j@_W(wa2U z2F3l2D$5xxjfG8o1+B1!*@JG4B#@dEXV{SmB0UfaJ1f2G&oV1Vw&j~eMO0g!4yGq% z$GMW~B3~p^kj;&7w36^aY=9i7xNrq3mmt(L*1|0lrz^bm%kxr+vBoO2XfTS2 z5nOy_b%GZH5wu2YuK@(&QnEfOsXx5InNoDxH;6$3;)=6cxasa!r9RiSuzHPc2+%cB zQBjT6+$vXxt^9>^5Lt?FMCNo7AphWTyuXv_)Pt|JZXKF+gyvamsz+P@6_giiGTnD$SVfDY1^x4p4NkN&o$4k zkDhYq3HE)liMulVrLW(saz*)G#_|+`L9Kic{M>b}l04qp9%%J;oZ;^q3PO$_2cCgL zb~v%vz~}oygQ;<|#YtyX+luy~$mlAoDz%;gWwjX%fdl{yfzN~T&PD-*Lgi|r(N60s zF5!7M?;JI%#jn#%*3hOKm-g}E%*sLB#;ICuioNf0Hg!lHqj*KU9{P%;m%a#_CUZj^ zRi->8;XgxavJKxZ33%81n&P&ePr?UZl-pu~=Dp$J7PN2X`$+Vk9~n9=XLgWV6XjUx2rB2K|@Izst}QPV>&?5c|+Ej9EUg*Gs#w;G$PBIm2;^%S#Z zc;?rzUZ36RUt2s|Q*r(m{~rLPKwH1W5ub}AKIg$`1o%0?&*AXQi?pa_VQinU?+Z%U zsWFtJwPC|UC(S%WVsAR6#^gak;`++@8H$I7haq-LFz6OrCOz`Lv(LQuBh>L|golne zjPStE0e;To!HWYL34VNWU-F)~lZX2c_nCt4h<2L6bwxYzvoK^_MQDgBLPLShN8pSZ z9x7;fNUm`mPvc>NBf}DK_eWUj_*XHkyk7}7scmb_zvLb06(_?6pl_rL{;F3 zi};{(V~i&c5w_DzVG>QKICn@qN2;*}o{ddJp)n)!B8puZ9-co12{#0TZU}}2Xh@QQ zhF^MU=xvN2@Z2Bm5cRFKi)eNlE#jD+nE{J9W@m7`*J|({Fj)OK2_eLB%;ezz(Z-0b z_!xuH=$UYgo(abRJUhm59FBR9_#FEvKF50v;&aDg%f;t_7$Lr7MP6jFGR4Z{5SuHv zDfX{X|GmY<4iHhReQ%HJty0v-&^Fi zsXsfz?NHND3WriK)Wie~g+r-@g*X(9X{9FMGnJ@?q(7^;I0WmUz8wJXJsgNzN)CJ@ z{79IH7A91JV}f#TH6ADw6MV6B}&y@0oRy3c!EYPC}`9{ESdH$l;fKrmw>`@(AO3bA*m#I~Jv#t3!)=YP z;j`yq%ZqeZH{?Db$O;3&eUNTPTQ!Kl58G2aQq$qhe~D`L#ttRoq+E^~T{+rN6Lq@c zkhl5?t#SW&IJf(?VpXD8(pq0JR?$pfGq>AE&O?Z5){sqOx-)amxec0ih{*c-{dAqg z>U|;c@QB*~2K7TWeWg{e-bTaqX6Eb+}g)_dapKr09xl+ZMf++B;_E zq9|t2UO@j+YB*%pN)qR=oWtwyzWXm{Kw(N=3lgpVYp=c5xOXYm7Hlb=DMRe2jYlo@ z%FvpJdgW4VvsdV>Rw6Eh@JWq_e*f{~$DfcV55p6QLA7H`TyKfbw#45JRLu3txbr4+u~vx4 zawUCh$-lc<-~Pp$kHh1~D1`parqSYhT^{QE3lT+hZ!(I{P4Z8O-RoQHVr(GT$cr97 ze!N9o2my>aCTX%65jj|pK6REOa?bwTuG6Osc5LUS^&%p=Y3+K+EQi(wTWgYT3Kl+_ zZ2F0{7OmTLIfS^E95sAneQ_L17C5Gf>)TAwDHdW!IH)cOz__b#ObvSo-(od@sHi=!7Pghn;j4WIS16-`_}(<=gu zSLaY^txrP;)#)kX=b}~zof~5!bDf>SbEb;VUBAw9gTtU)h>w};4C+?q_u_wQKJY)? zZir3Ua(o5?*Uh>ZJzHMq=brR%Oh(tu9x#TYU7|7dGrd9_(`W^ZbR#TD2*f-2!-w0?w+y)^$ z5jsu}I!@`h+u#XY@5?wi$hc7K1xOJRNC*rW!4q`b)RV63fY%4dw*z`&1f%PkL(A_r zNifrlxkAA>I3D?t&g;;5*lMc%a68-vPr?%=7m@w^QJ_{bH-B_QUNk2A+gzCFA-^#sL|(1E%{y z$v7b66fvWk!;B&heNfNz&!dJ2RRjkj4krDVOiyEXj_Why7c+h_<25s0_xlX#e`GNF z$e_+JrfcuV`vojf?iV`lBLO=L9jA1h(s2ye445yAG|i#aatN40b1g{{G59Vs%L7iG z$9cn{`3|qE++gDbLgoyGNYW@o~f*FQZWpyPvM#N4Uny5qI;IPdOCpGT)rcePvV#lFtv zf;G-Lbk}v%m0Wv`b2+-}QI5u2R5QVWq$r$x1PnNQNtW$IRRtuFM$WQ>y8enVEk7zy8<$N_g$H|MXw~ z1+Cz?elRIak|Y7ly+jfPGsjO+zu#Bf@BirgME=V}H|l!9dmQ(%@7#N@vaTnRxA!Wl znfcSe7NakJd6S6V+4G*tvMlx%H*2D=7JDl{lt5OB?|prBl~-53$))znCpBxYd;;SH zL*|eaj1G8xa15^jW^M(0v|QWQm{$r7b7Hc(ihDDz$+hXye03+lGo@@~{uzw#eo(LB zff`yjbw7O)jAUF@xDS``rWcJVft>G%6$@0j_utH1}{x*x$k`nJ%84VU}Y+TvLV zkqxrTp`mYr>=VKEE%Yt$qVS0wh7c-Nu^|&1*-*iAcx^3STR4PZ;V@)Hh1W%Z>+#BL zO5YpPijmVOjt0==agfWH~-dlhGGMRkD2e1rY^Cb*eD6e7GNl<=0qX+5<1j zVcV{*ty@3t5taljc~oO~@6mXgKARGP;6)lcN)sAS{~^yQ_%-7;VLC@_j$JG{jH{o2~vSIv?HX??F*!d+U?_lW4B zKjs6uU)Vk7z`@{=1=04Jq{H<#S9(2{d!Oxx8MUz=!ko(-axENz+|}Hha~ghKAJNP? zNT%{U_gElzvI{<@lIdh$x*StL#8JaQrXx2NF8?yHn zymri*h23Mm-ifcsOkeZnZXbB`rs4gr*R*n&-O!n>iZq*B)dFo2?VAecG0s1Whbn&- z$Mg|T`$2q_XlyJzsJ^tZ3%^^(>Gj4w?jhsgde`hV2DNnvdkQR@O(I%Y*rdMZF;Sus zEa`ne#ty$l`{42H7>6Ks!@=>vaqsci*uk+Jc0vFzwG>=yaR^Y%cpXf1?afWvr~STW zheD#+ImCx|#*Fa7)z)EvY#okif~^Opy00IM{My!4y*6X6`?%LkpC!GW5Wq`gV=rFy zHBw-IY;1aZy8n0|i=@oMJ7dNRS9ar_u^Dg>`qR_X{l^D5jt;gCgQP#bbvQPrFF^ID zp=SD6eevLMERaMBnR;*-AaXs^$JhD@#(lJP2;=xX5@f6Tm^Hy@;1R|;Wj}QZ^O8H5f3aRb&ZFT;80Tyhe)i4I!4w5$4b>4^?I%%l2b%=r6O?z z(Wnfn%_9Vlutd~DiD0a{r?az*vxZC#mIq#UDK=U6GKqh7BQ!E3CM zLl2f-z*=0m4NH5hMFCq1!n9Pt+%6cft(h+$YK}DK+ivWw8 zkEk}d1U2I|m#nYVT$krxe5~W@qA0#e5>c|GC_X8pBm@TWgh>&XP&L#>BIgcl-A5rQ-)Oe^yJdFOx zl^x&|CGsJ~bqRGfhwjqoCOj;Ma^R9-)mp~YTrj$ zy9Gm53K(~>f)!Va^LSF0T$iG*<#Qe@X8D){cOBRshHzjk<{|uUE~TDU%)>RkW`^q+ zpGu#PN62|Z!GxL1ArDI~nc;p2WXn%Kah%Y8B;~;V51QQq*R|+nf zhiX{%RLPtu83&jXQ1%cf2$nN0jEFAc_(~BW=;_n83J_)gz^uG&6qocvEj4hE6-S!c ztAz0)TT>~9ruhcR@9gX>IwPVniJyES#=tpe zW09=w-bc+W^z2BiazykpDr@!Xot>SDF#yiF29~RF(Ux9RK+YmOI(J4Zg~XwO8We@Y z8n`=9gKJj%p)iMHgoDGwsINs6!qlia!ATJ`5i}7+)U*fz9G)MZqZm82T$|V0es_dC zEC_NKO7L)xtnM4+CmTza_Z}^(Vh_f>SM0&K)nX6E8LMJdb03*{Z*_IB zw|f6QsFk89mWtI?RTP7wOYz)@E5$&^#g)Ne85D&dK-t5x9-iuJ-InmRqG%ON81wa# zAcd)iF~;#ELZIh-iCjzn{3!|_;MPv*{gGEOVeachd8p6WQcj)Vo{%DFSb zavn10au7o3YnZtqiAp4jC6;-LWrf-lD>IJCq`aP#Npd~01>-15%%f|t>?SQ(u=Hbk zl_bvj-6ToY^1pDqx}y7%;jA3x-pE=I5$S7d$=d8+$ZN2M)5C&uP(D*$(oWY7lI?)m zPB7aJGm0~F9a*z|HX;%vX|~TQog{RUaNai{Hyj8iiHU;{;iQ^jQd4u1B-99IY5+BW z8q|DhI``fth}&jO>9&WOHCx7L6#~@3@xd{#DZNIfTCX$nTDHCIoNFYbBO+^dG~2EV z(IvPOW|n=yNUN#MiGNs2i6J;c9i^nMTVueLGAaEv(M zk$GeRg=6#}P1lLiR2a^v6<4jFKO`S^NxcC6a#WX!(O`8-= z8R^uKl3_sp!<5qhpkJ~=HFcyF8=5#`8COv=k?J@}3FD})%{VsW*o?FJ)lR?HWwPk< z1WkSjCO-ovKXd)VB2ClJtO@2`uLi?45;_iQxJFts4(frtI5ick2kF%5>1k{p;JE4m zj-v;khjH}a8H|&Ham@n{3uz)4s_^`m0rHp_nKKBad za|z~i1?I1gS4cuthb&iM4k25@i)(5gUlomRA7TOk|5 zysDIF>av391R~Z|WuV$-5lE>>3sh~GfKG39h(oP0&^qeUbQRIqK-7aa$h`;Oe{}$y z&HB1>!I9X!;A+votZbe|C&&F*;cy_=Apwh37_oUoLL2~8VeCCC$a@|Dy!V;Ny&3=% z{WAg_0?aEgUTuRch#?dND8LsuED$)TURIGG#3Qlkz0wCb0vK+dDbSC~=9$)ym2wtQ z0sy^=Weg4C7-Qi%0(5$teeD9hs<`^P=DJ+2^)VtSVWckY5vWUh1CaPk16bMo+!U+t zv0(ym51^_7Kt6;93HYbT!kFbpkoyXUa0KwRDk%L5b*l2nb0QzBeFKd_LgW?iwVW-N z4U^HPtFHs}eBU|owKJ_BFW0ZKvxo>RR$-(df#B;DB(H?A&qS^l?g7h0Zh)1m2@13)hs6b4p?smc!LZNmhXj^haL{lyj;6ib2@(20~OX)|rkI`{6iLL7=B z&U!02ufShlM2X|{5|%Jkwc*Ye zCZa^dgdq`?iR%ULYQ&@7*!vRE_q z4R7iv<#nFgHvZHAo!;^`OaSI2+1Q9E8O)6so5f;*-&=w@ZqsOQ zbhD2vD;Sr^1iyG8eI6#II=|%1d5uBNf8tHNB=BkqOd07jRjI-hm zd|K^Y;1D>yZm2R`M#QF4_1+0;+e;j`){8qv+I2ht07?=Px%Ykm8At{IE67(LmXozs z6D_2=uE}SGmoU&-%4XF1@wV9P|KkckuEUaTo<$@PD;xpj^N0Z?6^`|nlg~sx_MRag zX)42>RELO7r3w+30y>|IO+=-y41f~|6abMK0GmOrD`5A zcsZ_coQWcMRp5=>0PillW7|an-DvCWLGk_71m=TQxg#ZBa0St%ivbH%B zIrI}%n`bmA;!RCjH7H_**Sv0J^^(b4m zGE-Ss9ho|^byHR8bqRH~hn~8Qsq0js_ZjpCkO9oAY5)KkG>rf#Dh<#m3|LCgiV;A@ z0t7XvpS`wYfOZ=uRWl}Z!Ej)K~G<&fRO&r8CT(6Nu#Ii&gFa#MI`B4LgFo+dN1~F)IT|)IBP*O|fUS$BM z`WU80VPVx^B_wKT#2`y6Se9A{iupnFL+#Nk^Hh=!qFVZ1(-6_vV??D?wrk)z41xg0+Hr`W;BabTno_2&?sjxfxqE4L6 zzBq*btN1@)4>&R?8#;)%zPATH4XtF z5aDp|5OVJo5WvYjKE0uWD&Z+C%ThtabI`OE=@{du>YD1h_PWOYDX+4Ojm``}M~U&a zC}tD|R!FR1$WSW`)Cy4NDk3W^glWE{hfRFtP#uDzA2K7pobEzF>nQA=#|FAz)k~P zAXX&~LZg+YrlyMJD{6ByR0dk5*$2%&MuC;qFe*`U$9jEEc;c$ER<%7zJ|n;vsGMAa zJQt5cfgFb2ss^j}!KOlN)ZY-IHjnDEVbs;MSz_z9}VUMzdEyRNIBJ zG2&8q)k}zYVyL|tSf~Ry(bf}G;o`lQ*|~b~#`h`=SRzJ2*ocKub~|ayD*|Bpdw&SP zM(~PQ1K^(%;H>~XhJ#>b&U5T&RFxVWrr^BpV(nJ z&B?p^``>?4Yo7gUdr{}w3)ES>YrHRJZQfKvo4btl98kG}s5h6C# zWOSk+tHfB>M43yK70zeGxQM)XG4)=CofLqp#f`U-Rebzns)wCc6(8Stn@i{9@dA(T z&Em=9;QhTQa_yM>KWH#lwqdRw0hllBU{(4!qCT!r54f%rNa`3osbk1bPhQc9s1r>p z>NX$-_y2(g)!aV`kslp$6#C{P6?Eh_9z)u;)(GX$M=r}K;3I`5t6SRnt?c&kzC z&OXLc&@I&YSnoT(1sBD(dhDsYsA;VEpd4SQhc4R5pX$`TW(wB?Q+BEoNTN7^+|U&Oa`EHE;0pmR(a%@ z9m78&oxx(Jbk~LnoO@6LI`@pCo!a{~pjC37d%JxxT_X^qebCp<^>xl%Y3;YJ{YBXu z3RE)G3Ink+*P*%2Ks*LG7U#P6HziCBY#~8JOAU>{5L5+bY6u{O0HEqMIHpxHYq4RX zHU{X?NLzHG`y#i;=ixrUvC#P;Wie~55~cnT=?oULfPsiBgg}uCrCN{KN(INrd2Ik7 zKr{xj%vL~D5)%E8pvA1G7S@F&7b{C$B}$oNrM>P0 z90T-d1OT0IXiA%nS`7eDA{sgugCj4|qE4c>H%mus#G0j9rdKK&}MdM z;*&}h7v{BU`R{K9a7+>aSjub#pZ`S}fI|178V;dHBLG-g-d^|ZYv*F6iv|?8n!B^e zIIGZ)w0LqrPqrU#51!kWC?68by(jX10Dv4CK#?H&djkk=BG%TOjOyb#OWJC-c-aJRp*(vG-Q%@bcU37A=Lil8${6=g@>WB`YZqnF=MM z_x_YLPvr^H2%yw*TU4SRwA>bZSq)llOO74r*YM)ApG6K{Jn7LV;}KR#2Ar%Vur4Z)<}cgOAtUAf{wLe z^5hIvqNoswP{)YnvOckufy!9Rys1_;nbNuU5RQpxMgYKQNhOx3sw_!Sbu3ld+c1G;GLIbo$M_Cn9Po9B4U5`* z8P`hDXhkE#)}TE=|tFd(UDc?!PIoh2Zo> z$wYJdy91VO-wh@sBN+J1hDvFE9FCL;>K{BerQtAie|H8eWy1t?dY_*ujAZJK^j|NB zOs1CO!MurxO&rXlvT|*)trDBN>@HU`m~S=u_-<4-8?8`}MDs{o{*j21OB3b2XHmKT zrU=0yo*`l~L2Q^q3^HJeiM}YfxW4Ll$94VPvGcpn%y%OO51i$dhBGG1Ju-!nGMehj zA?x_=srl}a`R=^!yQiSu>y4CAFIVy&==47SV=%{Hj-m5-P{fGXYz^khU87+Qi-UR9 zT)VztjaDo%=qjSAN~&pnO;kL{K7j{@r1wQ^){%2*q8@$kSyb-7DME0Fk&lxJs==WW zuoOCt5x=cGQISs2O486=XJBiBhbe$EGI9fqsTk|y;Po+ibsVIoFe=4pYL7Dofa{d- z<+pKSv{s26P?`3$k&zqFTm6_+=f4v+sp4yI4rB!DJ^B7x{E7a4b-VpDYW8$!x zLE4NGsu}45uQGt#0A<63S3;FH-oPLWZlKD>8>kCyq}oC&CE>R5UAf7BU3-U9luSZt zmb+)_-m>+vMr4c)fA8oX8!Ou{`!cN zv4=y@H6#0s?pSO8*s?6Me>{Jm{xt4Aonq4oHm$olHl6DzpVmfqKdJi+uOn*R{QUg=%k%Tn{rM1v zm%oYsNp$&sRfB61g1oNvr)Ylu8(|n&2!W{DCa#rZrl-fT;W&07Ns|8=4DY`|HFl_mBd1rqQ=s(OA=l>Nz$#kxaC~>JTCn_Jr>VBf~EN>-J0S}n)z3Ft0KTf;T7v_@m(GR-Q=>`5DO?TSF>UFiw zwVrlw;G>D?z+(q;XzW10hF<=Y*1Nk%UuzoI^x;8RIjllh;)gstI(Y4H1a!y4;c(=u z;iIF2Lq9?_2l&j35|P&WRIk9wE2o-?>%&V4)Y&I!B>4Smetw=VcfkG2BNi^-zZ?(5 zI>Ja?doYAU2z0q|?*on1fR9+hEimHh&CjziWcR^0m*>I#>bx8r`cW0a(ZONISHnk3 z2Zy8RsNoO-9zq!NKtvDYL2-QOAg?CW!UP`_4u!OVM*Gz~5nc8|N2omn7CQR`@ivfG zsKZOaNre9sK9?j5N-g}uLC+hnL6Ds~^7sn03bPr67ZMz))*mh3ww$p47BD7%; zIgu$-w4EESMc#Vt^tz*hgeW8$qQuuMDLtFi23a+7Gz-7nBI*+*gnooWM!pyOV42j&5M52=zo=X_g zgTs)A@YNfdLoa~?bKS#%=8*JwsNo@FTK2}=duUudMDOC~9`l944~wPZULs#miP0PK zLosAExYyGoTqi@&yAFoEVUHgca*dV?f~c~l(pHNlW4Y@v`k+xfCF_5yUGp#u)RZV7c|gP732&X#0w5p zuCXDmV?%6$*tmeh0w;Kx3lKx2l_-jULF~#8?85F_0TBT9c2I$xx3t5Ly1r)Ku$%qW%YmQ3gkdQEGuDMotwlAaP18L!g>4U|AB4 z%QA3{{ggOk?^Bax;_7dC*mH>^QB%F}j1s=~b>36Z6YocCy!emL$lvHLJg5)Ts#oM9yu1_%YG55hBrt9}-2PhxA=~j)NPX3Ps8I3~beq-xwPw3} zC-mi)7F-XVdni6g)@xB;`g-!xZP-hmsS{#{fcW$q{T)#TEX5PwUZ1o$K$XKoO~3Z? z+gAHUulV6t+UVEX5n^hYi~5MeX@BnuqS@p^xDspjf)v1?lf*JG-- zxPls9s=v)coF!rw|6MZSW7^W+O;KHh3-*v}i%kL!qYTcZ45ad*nuwgqe@oN!(@)b> z#9z^VC1pD*H`=5-J2zgqagM_aDygdPR-_`zxt}0(9T`#eNy~+LL!H4>hzf;34`&vR`k|YmhuR}mYz`lVBvI7GUcb+o;f6l|fo~u9nQo`kuhsnb8@B@Ed3+&DYTc5n#f>Q=851~NL zHxA*zfVYstKuH1MK(A?4ppwXw{eK;*bti_HZI_> zzzJS{2Zw+d8m&ZRMZh3-)99KeB;$<+;= zt4`-CaB_gFIjC^W9}p3Xq|9Ski>S?`9_Eb^+g&$9U)S|5qpyd4UoHKg`~S&t{^MOl z;M`4;gl&epu8BylOW1d6RoB;bU9WX*C93*Qs_OT3FTfe&-!ZR z>s$R8?{4(}asOZP-hD*8cEMc@>QcCxNXl2Q)+*O@CD%<&{-v(+Uv}0Ht$KXDYY%$$ z>eYFSME!o7hMn1p+F8^?G_|MOdVkyY@La)P&ZX{ zUEPGV(ElHz*u+YS5yirwSOsN)x~LSLiAH0DnsW`V_Sci-+N*FC`~SHAoe@Js(gKYY z(n5!Tq$?PtQLFV%Wc_h|_3AuUh}c}6H>gzxig>k9*ELtcbEDxBe<$~xJpELWO(h! z@aHB2XoEOr*;Nc)4<$DL=l{ous9lA+F zx~8%wtdb%uM+;|ND0Z*?2P5xIL`{@*7$FZoH@beOXcQRr{Pg!gI`s#|=eqa4VZ)H0 z{`UK%`RQ-JtZx4Fw@JSqiI?foO%n9;j~;;^eudP{SKbGYUU^yFq(}6=ctk`m!y`oW zzVY%;f14pK>jsvTAsq80^L_}-M>;N;aXV&QU>Vm3WgoqY%07Bk?S!(A1>=NHngKyF z6E2q>e6BrPU?!A!b*x}p9LHFUj@6EiJ1Sw^BpjHJxWsY1uj3fUF^nTgBMYj-5Ne{j z2?>lnVP+k}=ma&4PMFh_>xQvTP{ZiN==YO8+`lvp_aV&ezIq z0I3@sM_7cmgpMVwEu$u?8yrW6FoxR3z3+_snWAdoJydOkjXT&lf>EXnN2CS@F(+(!MpIO!02qX^a~g({MXO9UW+EwZn*p z-4_i8eAnxpk@>Lk{P>_r8&U z-LK26UUo=w?T!H+&U^28SI`5yCK@pfMig834Oq3vM%f7|P0KxQ_VaiE8Bn5V+8tTY zac-v!=VY|aT{jhXg!OJz^gk=!IZ)cS29zn@jXRBTBV!uwvZDiSt#%mEu=~P-+A_eZ z#mubb?C#x7%l*Fd8hFwG5dG~!l~1qRuEYALie}Z^|z~ZkgMN2D3!RaMJqUNbSuYweShxcxX&H;#qqeU zo}3H!xxN42F7*CWad*iEt>A(%Irn47eJvbGxNq0ruF_=OE605;QtsQs=`UXl?w|g} za{ukZakt0hhT}e$`=3Kl-H$zE0x|KrTgQa_qW_Dbf@Pw=x-NC;eOIs z?!R3)?zZb3_b>0y{aCm=;l7rjbK$;~po?j^aSVUgSiRF0%8TK8s2%U#>L-mWO=0{{ z+@kC`P}j;eKT*H|?|*MV>+c_75S_jMnJr?~JB^7$19-KV(mA8W95sdp^9Gndeg9-$ z1NA3YpEa%M(fdD9q^FM_y?=58;FI^?mvVD*c5-6Y=1=FCtLg?d(9DzJZW=fbD7tZ~ z^^6!_*2-Pi^P!22;kY`hmHXGva(YGd3};^sm^aVP@|A#|rK`_7G&k|r>DQktrs;rr zZMbXUjxCy6xDDDpxbqk{cFm?4vXnL6(U{!DgakwYNw_=CFV_IlRZ?#5QfKat<|S@` zmxR03@jP)GEq6pxZoR&Dbn`l9pvypJ`54|n%&+8EQpUiUBO|9Y8*&TqP3Cr%YM!N> z4fl>SFl;s{ac(mhO>BTBwJ~ao+3*b-G~W$~EZodDMQ#v-R2hg6K<18TGT6jCOOQBF zo?%1GSzdy%VE`PVHKQYrnLue1<#pl&5Hcb_`UN&&02w9|D~%2iVHU{x)v5~O>SqhG zGNme%;@CE$Yp;&3{ojrM@7CCrCvHsRcH_l@th7|6QXJc6bd5&VM#iQoa81fx71xSm z+l+IJt}RB^j>KJ!bGc%hagNcoMS1OB+=g$lsH85es-TiluqAj^PUMbg337x~vRqkd zA+jX|!$YQoN=zhpV&!-!++?`5I2mqRf)>LqdU)KbAV(Z`D2m7`XnDBYmE*3C%N-C# zd`xa4C&x`waqIof>O$MSkJ3#( zh>O{~B|3M7d7~D!=yAEp7vakB!bK3PP!0AvlXH`*C3kecIJxh?Je^(PLvB-)v)^># z9o;I-!=kLtQ>t^++a0dc+4mv!oe$~i?fbsD-{1}h_oa6;pH-tu^=^2#9Na}+2X}rP z?o0n#4&F_{xv3jUIkR(e9IIT}e}D9DsSoY;UjJG>xWVSmS$1869GyFBvxMqcWi8$< z59^+X(YsD`<;eckTwRsjLln0zvfm`6%Bl=i7TrX362|qefs-k&FQ54;ro9@jG&4wJGmQuCo2(@O; z1*|oS#uhX)W%Qts9Jz-`Y8Mx|7Fq>pWLk?4{TkgqSs}@=AOtnTW zA*-SyF2nj`-oneLN-Jh=g1+kvccBbJM}i_vB{vZeEyDVi1i~F<3Ka zMGC51>cY6+G?L$#Pv)$NHV|UYvIQv+6kgS#?+SWF4NY&)@syP3y+3Zhq?qKUEv@Zf56Z zcsF@BnOi0vr~5y%cf)~++@|c@IdWEo5*JmL309p{9^8EaKjhdy`A-kcRBRJT(G{Wi zpJ!E8f_JlX=LdIx8h(PQd8MlEP=Hl6fTgOwA4KYIhp4*hA-(s;@ZHS~=Z=w_o5(qt zoSVtJS=A+v(#_t@V)4NZac-%_dyBg2gS&rxa1+4J{r*pW>fA9qcP-w{%(uAt(YPI2 zEjyVoE;oy; z*V<%aLNJAM6M&U>V4WKk4(#ucxi#7Y4>s8=1A^}Ke?Y1eY4r{a8KCxK}a2b)&;P9JO_jqYuAf6`{m{3U+bi`uHjVE8o+-ySS@B)49JQp=ct-# zbV{1XXy)#{-RQ>Im5O&q!I}tg!W!Z>Y~Acl_rLyid-K=6ZF9o{pL7FotGj0_wY;1< zi8`7+^wyxGcK~Jgo7lMv`|oD9MZ}DW!+1B*uuY|GdimEn-~8X~Lpw8Y>IC*~B7mG5 zfUi$Wa-Og!>La3T(1G`Hw5v-w)XZEio|hUm~>v{hy#v~@K9kO22! zg0fuecVh0uvYVTQI+mL~Ffbpy-DjKFyWe;>yPuR&n3sdGr33`Gi4Zn}f&$zoSaChB z*EkWi(0JQ0TiDu`+Hy}KHaEdd0LZ~&bpXu9t~YN!?FNSd?*kD0pSTx5Yf(gBzBYOX zBXo|;KuBpj{^XXHwZ%BYLQh`qjLx*&t(Cn2L3K##NY-e;sxww&2!Oipt5VuYS81m6 zstv#|qGqr4)}}RQbBiK_RA~$Ib3zvAdYrVop<4>zobyKD%?*E|zzL)kWRau~~g*a^JmCQmr)s z_T8Iv>%pzJxhGm|Xd%%+Ybgj)130Xo0!U#d0CsKb*0tLNUb+9S4%e;}*u?>U4z)um z;MVKuR=e+JPWIjGuh%~U0;jxz)^%q0-C{p+-%WtKZV&8kZms|B!dqYv&$O-yGZKYf zX7A>1y)jZ~sgZqm@7}#OJ+ymE&91lB+;zMC8W^pwYtE2J%SkfYy3ReKwZJ{0p#`@I zDQqd-v-@i+QW8b~u z;Ttc%vHIjEUw&gfTwPs#{_5)0<8$BR!>6vUuHJ3;)&CFfZ@eS!6*jeX+jmxB)zt3& z!rHp0%KLo6yM|J)LJi(cwQ7tegbK$RKVEyDtoOrI&O4o`)5 z={rRm&~Fv$vZRfW)?UlW?A*n8Gv(yyLqR-yK$hNcRk zsT(WRDm38z-c#gVJLjuVxo2pqP#H~)$88AJdRvT5;GR$3`|s=Tm*-?v+%F$tKXZ5y z_wL;9Z|J>$)BWaO;k`p($!j|;#+Z+|w-XZZ{jjZGtHO-BAbg}k7lf)3To94|?n)&v zj>0xqVCI5AkYQB68UkthA!-i8dHa}sGbW&YBM2O~qjXZxVR#5=e+Iy~nVq0x;38Z; zGrC82w!#h!uFW_`HJfpaV_2*Im{HA>Vn)UtDIF(Z9K$f?*Fs>m6G*eKD{#x0gAj0- zn1pe`j0-q!C%~|s5O9nN=wJrGxS5@xW8fl;8tP8XcwZ9NC28a75#6j+tq;^hbxrTr zg36cwJ(W;@DTUYg@J*se_IKMo>|P@WpSsz-H>gM0`)2#zH#_#WuZ^Rpg9Ee`<`C+4Qc=O*SQrl%GG zRbFzku~|E_RTZH!Ilm}XKRL6cGCmDxYdpwou*!Kx>av9!m&=R6%>=8=O)Q8{Ni0bO znpGp2a(33q8UqPb6~&pkr8$WunfZA@H9M!4e9LV9&MFC4Q=FWdms$+5u`DyS9H^*x mes9SaaRY4;bVa#|nIJ;~zPx$jQz)X&2ba$T`d+WNEFA!`?{vZd literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/about.cty b/micropolis-godot/assets/cities/about.cty new file mode 100644 index 0000000000000000000000000000000000000000..24139a0e0730f86f7aabea5387bc108c447a43a8 GIT binary patch literal 27120 zcmeHNOOhNl5N$&MXJF5QJ`N#r?PfCt*cORasI>`BkaAYm7YMD1A~d-%Cj; zRn6RP>)(pNiolA%iolA%iolA%ionze{B>JDUvmU*x9_+0^39L`{`B2HP~PjfioX2? zOXJU<|Gs_Le|`Xz57qy1(Es_!mtVh*04yEXn#VOC7n_gIFCUMe->$_i!lqtVFP{!Y zMcZDAU_QgP*6|GgvwSWcvm$BZy!=krJ2&FW^KtP1gJVwHdL4Q6B{EmfjdHJRwe7AS z)Yq-G^<&GBKL_FoDvtRZLzu5J9?x1u;&Tlp`9ymyyWEacue@)uQSM>k=aKitv8IsA zHD)BTS0%+#J1V{ZlaH|ESK=$ROE~k}V+|>JJ`RL zn@(>v-oo#LaXe`x`oX7UXSbId2`Qb7v+Z}YK>qmjj=Pp!$q?^c$MMB@mX2e;1P$4DDLqp$V|I!G+NI^YCP zzkAIQDPu}$22T%0W|1;)z9k;D;O$}`cjBh$;ks-_Be0(;)&3hrijAvIGkhD_o&hEV z16OHae2g(~E$vHK_a+nIzn$XD?vQYK7H3<53BzGSwU|JLc#}?X4fibPe!T9@(vk3_ zS@VqT`Lrz-O1|YD8Mhscbqi&)ym^=e3?qS$?uON%upZeREpZer#uKCxu^KJ2RRG1%5W zb*6f6j}~k3p*yX_wG~+-G5%=nVQ6QJ1C3EKq5;O3r$74Ko-Q4(Rkh>c>Mj|>vCgyB zG9sPqUmybow9M8)qvWmiEK&>X-b$N}<=N@I7acR++j{V?G6#r`5)1-@2AG6Uj^#!pHhT+%dG|M zw|z~%5lhy5`+C zXC8Bk)ap6{ccTcmh^=!*RHmL-L^zGvdRTC3_kEu- z*3(y2Qtr_~&oM1?jm2`tD4&k37|+5}@vr6)PoMNWeFFJ)oQ;|`kLOrq4++zdia{o06eN^C}KipSN8hOyTs5D z8ASFz4IQ67v$6S-k>nmPOWRKOq4!dBudUaPqFXf`Rqv(PUR$pnMYn1?DtDui5Ot(7 z%4=6fcuE$k)n9ygExmRH*;BGmt^VS}YZ;m2f_}E-W#_%ICO&@5v+T=wZ}fcU<%S#8 zA)Msh39jSny*o44sgKdo5%pfg*xyCU*_uk~`Kq7Q2{$qq+5S`c+d?MRDx0EXq@=B` zsEVvaebXLc=p7>|8BsB7r)zgQSyx_PbUm7DQbP0YfifQAwfQEy+g|ep;U1-^jxy{0 zy69W(!I;Mk>!|iq&%1Boz0Pkvqa$ZrvbwmI`J8*ivP$|szNOXO)@Nl7-n-P=vyd#Y zy&cikpD`oWxr^NEXUn^-CtI$q#<)Vc-N_thuI&okDF;weeaUEbCENF*BQpgpsIFIH z>wx^y8`TJ*w)c2qb-(BYCXGl=uu-m+v~zx5m*se T5m*se5m*se5m*s;e-Zc(mfixa literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/badnews.cty b/micropolis-godot/assets/cities/badnews.cty new file mode 100644 index 0000000000000000000000000000000000000000..3e901c7d8957f0ff538781d010dd95966644ea14 GIT binary patch literal 27120 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 literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/finnigan.cty b/micropolis-godot/assets/cities/finnigan.cty new file mode 100644 index 0000000000000000000000000000000000000000..80f58d388302dabb15c3c980712cbdbdc79277d8 GIT binary patch literal 27120 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 QipLjEE}mA7g6_BfFYVzeLjV8( literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/haight.cty b/micropolis-godot/assets/cities/haight.cty new file mode 100644 index 0000000000000000000000000000000000000000..e70f985525238d686563723b7a948c7631de1db4 GIT binary patch literal 27120 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 LTR;J=NB`ddfnOO2 literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/happisle.cty b/micropolis-godot/assets/cities/happisle.cty new file mode 100644 index 0000000000000000000000000000000000000000..786d028d21d87edc98e2dab3fd12c39b78f72e98 GIT binary patch literal 27120 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 U5^o`V^yA{dTOC|ek!CXdAAOA$`v3p{ literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/kamakura.cty b/micropolis-godot/assets/cities/kamakura.cty new file mode 100644 index 0000000000000000000000000000000000000000..b91944cc98e1c98f3085afcf87e9580dcf6c069f GIT binary patch literal 27120 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 literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/kobe.cty b/micropolis-godot/assets/cities/kobe.cty new file mode 100644 index 0000000000000000000000000000000000000000..911765ea1a04dd75168f48489233f528a620071a GIT binary patch literal 27120 zcmd5^378yJwZ0V~L?9ptGHep|NkU)%g_0;jr<3kUGN6daB7$KHiG-l2s3@BtJ_LO# zi;94_p}6nj%G2kkH9i-3K1XHIQIuOFIuMo)q{sLFXQ`^5nUIN0_?-Lo)Y`Ysx##?6 zySF;|Qu6uaHndMBw8n6#f=sxIf$%ejk1tejV-%KMz^>5!xN$`)J<_-wxjl zUkP6hUkslOp9!A~9}l0v=cD14aAWug+6Tk+;aaq7!u#>L27A|`T`%W99JJktdv6Li zg1hrU@&3t{c;5HW$2B;AL--Kxx;9)Ht_p7tE5ov|B)lRV8G6G@!_lEHEDSF~>j`^= zuCPtm8lSDgmSK9>0&VlKY1laY`~Lkb{51Ro?Z;?8l=1v7#`9Yk(XV1mzZ5=?5xq5h z3gdY*#^8F4;MEw1cZJKtCE+5B#sz3^39k?5g>%E}!r9>rjLx!fR#=XG?wyIx*(>u`K87`AP--2^1(F6NAGn^Vu2*-q@Fv|6CM0hdU zTzn1-H5@l^b`d0T4BE>fizCD0ut4ss%k}x8iEmO$uL!RU$Ay!^cfrR6pk*nZcPj2# zfb$D+S0C zkjzh-XbqrmKJfPv!QYFLLyLAu@`B_bps`2VoTNM12bkO?*$H^uF4-n|cCuBn1rRwE zm`s4mwxDu2JQ#+6$v=j>!$9~=xGVfp^ydy>=JxRQ@P%+2bmn8g&b8rv(3p3HOT$~k zo1i5tWb984uMV#XrvOJw!fBB4QfR_C(4RMjw}p!#nRnw`*FoQI798J%J?h;R=;dwD zmh*7$GJNl3NR*mE-DrmSkX{4Ur6<`6wB3&9orXT%jPs}9dl!UP;oha;M9BG2p!NCT zAbj@1{$XKe*cUS11M=Mr5~X}M$95WyrbE6{Wq)IwC6cG2ZGtuppDD7(JEr0aw;Q2N zc}Bs0AvnA`yayj|S7G$DT?wTAhqQM=0^Y8`IKI=`<-qY}81G9*wM!s{i-E-pf$+Cu z%rC%bz6DP@9};>a(0LvZ|2klIrC|DONRMb;3S6I#Q9pGp?KE6tJAItSZ!Hm>pl-Yx zNFBdj1wJkVZEwW$PDMW_AlqurZ~_99r%vKb}(#ZDt#SVdBR*gfzL>Bm5n{JKlZjiP&WtI z^EL-Z%Hv$ze*o^9i@W#5eFw{v_?-iBc0X+A;4H87$PxQI0G~r}%qJa$D+kDjM=!(} zs^_4L*;ML>+g6X}LkF}qU`?7~9@-HbT)wx#Qg*f*5O0jvu0r%NUL!)sYb#)D$7^T8 z-j3If4dXZZ*6~^|a4=qT42|AW21kH1#!xFj!LjJI7kE2D@OV@>UNC$-?DNY6WiJH+ zUkQ|*4coE;wq=Rf1x6OjadZ|w%Y~0Kfc`V=%vm_k#(S2-DzUAAjbdAgJ=&>@I@$&o zaM*bIyTdP%!#4fpCU?VACev?)RXqZ_I~N`&gpH@PpEe0e?@b{=3;0Zv|J>8h)9!rz zI!O0ScS`q=&yLk^%K6>>Ou94fDXvf3$j^t6&QIq_>rLwe!vm`Z9!qO!cRCAgCfY3S z&uymN@tSyj{4n>>W@9^3_UEPb_{I2@`1N!!`|qqj`&IUv?4ImTMX%cTytLPzQsfZ)q)lsr}XX4e;^fdw-VQnGIz3W`8DSO5@OR`O5tDY0W6s zz8m?+@=xZU#@W;FU79TyK1d4wx1QZ03WVbKgoWc z{crZW><`&rgb$%HKPP`({sxS^9JTuLi$*TZFCV%hzcs&2`lq}bpiku?V{ce-E-IQN z_Z9Lf_*gA^1RbC2Iz?-cZfU3T}?K!kKUj+anrb2obGznx+nW-_KWP- z+3&MIW`6~Ry{#ifKUFUm8A6&v=M9~ozZ0WU&#%a@%&%ro{1bd^uUb{Xit{WAN%?CxwZdw`re zoxT-n*#rAtls1Mg7}p)P{#wu3C*ghlf{()k#`wtr=JaL{Jt@(%o8(_N4NQa}AYEys3Rl{6uv> zt#$3!wQtw{>7d!5g&1o}t2rcef*;#f_z;YsZ*Z)5sqo=;%Vjd7_#QbdG%SR!ZM%TZ z)d5Ie)9T}Pb<*lHs|9T6__u%^@KJ+QR0e9VZjK*|pETPg`_PMe*M1nsLA60X+87bY z+N>^h(Gfxp6(i)hVf%&>^i%o~a#C=CE99_p+;up|7d*5@4*y)8P%fR6-o zB&^wL@}x2l$&j9U;Sp=`FEPfy=~#jfwLvu-Vc78y)attKcN5f`VKB2kHd$DVUOC-9{O$iWypX&1Ddr)@BzEqTGe_Cv@ZtTI_|YNGwvJr z2U64{&c@zf+j)G@kP3V#?sbHfMzy-i8Eo$7M!uMT#c&V5tH&G%*DJ9{s!bTN znjbL~8;u<6y6eu+yNBMJf3>hv4Lz1|XsSF4ttxOJvQW;7bHc^8&>=`ezHp>LqYq&H_2I3L%0vEL2; zH0lDLV?8$FLdao8+#~Ldt>8nYk`9_5soCgL66lRO;~pe`)5u%$w_&6pBiAXn&c=tM zykqRE^!t9-CS99zj6f%KYBngPX3fSCkV(4nnV-_PECL_!Cas5Cj}EtRM=j28H{&8~ zcWdt%_rX^2L3-z<;yEJqI?I z<3T!SiX=4t?p`?z3pRo)kOycVp*<7Z315JF>*O#lh`n(!w!6o@Vt1==6h7{We~5o7 z5KGHv@-PnqiGs8FCL^_7VsCj4I55hgNs5P^(%qHv@|ttPhy+wpmt>~0eIU?9l-GWRw{*XtvppxDN5>Yw*A)|H zqr`uRG$hvL-q6nfm@%~HP`AjV@O-9Es$nzqNdI?djzsmB?S zfK$r7v{Q5AVetrZs7L`Hf^_tGfBIMHyB5D4zZdVoGc<$6_kk|-!K*3*panppHr?eN2^b5E0F;Wdl>S1QaHf)(_$5N>P79B z#2S4+?<{o+^bBg>M7jAx)%->U8D*Z_Q27WS&l}o(Xz!s}kVoM&N;<21r6lk@YKz#B z)|1ftw#OVTWVEdot~5*3Qe4=n7stcnJVP>LTFFAh3JqG%iy%GC*J~R8b|3>> z0x@c-l#<1TR~=U#&IfqdrYecls|w6%pAb8%mZvV!72;cq3K{3Bw}3AJ#kj6sy?;vo zCjHa&f4+0RYrZ=q*9-5_@TjryhmwO=k)fW$Js@escM(m>ULg;OL@L!CURAFrH_AWo z;ojM4qm81+kn_-Ziwe_OE(P)LavjlEt$(BYruIKe|L41m%*gj3Ez~RXijIh;#lO_1 zdL>G!*}lZ}&ILGPMB-MK{-Z<7G=uHnLu(@R9I#u^Ek;y~(^o@2l!w%*RCml*5bw2N zcy(xAt$*YGP5U>~|M~Os-SRzw6hXPgCmzisS1ux3_wn4)1CzJKB@d(z_)zcX|0}46 zR*9vR`&fzFN$9JK?_L8w+CT-jUVmfkAyK(v!y;VrN!^m@tEyLq2}mRUBR(7-mE&e1 z7tg>Mp<7KsF;mqiL>Sw2ZG%kPBSh!J7uv|~D zVG*uXu+&0T^-5z9N+S-pS4C7JL7_$S+_!iHe0YRqIU}ry>If~VwlVVP(rb=xsfap{ z-0na==-cKtVTmpC^p<{TLnujZB?)6CCCM6e<(f@fgTxYwTQ^T^8d^~ zkY9(p%+A7lTh2%>peFYII5+C;6k-ZwXbP*3+T_^H*!sWy+vB`B*O+GEb2?O74i_D4sEM&fzcVQ zbyjhJ3^e0oUXGe#k+XUZtF&r-ORnlBDauTBPP5yEu((ats>1GSG!NP2@6WHzKUhRs zQV~^b5D}ftC>3-=76qy%xXtVak=8}5h!R2c2c29%uQczQF*f$VH^$bqN_n&g7`roOL~U9T4ez1! zy9e(Ejn0`!%A^8J>G{@Ot$Xt484I=8#2v{90v zJjT%~^Dm}XBN9bn+)Qt6tOdW!6lsT*Gqr7XlM3=4I}eoS+m39X@5oV>XJT7gFR!v` zECPzeQjL`cxY?*{GqiEIz_&*G7O_|QG}fyuKdR|`26P0JM~!I>>7Z9JqB&R1yggB( z=La$7+vQ#PP7yXH>btHH}Q1&W^}r9L+L+Ph>FSrKEK}gYrQ2P-9xtCr3+tuFr%C!fHC*@ku)H4wF(dSd1hRcLmun?lbn6V*!vKZ&?3n!8FXf*QApc_ zh^2KW_+gzyYY+5=Diy^FqQg>uoN|7{&U$PKBo)@`Dfr-+{7cQe6eA6A!`T~J+U`;K zR(so&N>|OKBJ-Yt4bz`|ue>{-4WvokPG#dhWG?JT)mn{?M;z;8M|omrfDhK%=s`3i zAV0`TT(@*v;u~D5Ew;H%`f-;+zW2z?d|zCr7MfO>58-z@t<@M$uAEGa>all`51Hlk z`2g0|sXJaXlx+pyqHCgu8a0v+vrG9t`K){n5ZACXn8ox6SnF_*6}6^0Hm;fkd9c2Y zN}*omjKPmO1QWAXK-YlU91U&uzH6V)`2 zxC9$on1pYDFdw}pSN-pgl8Uf9MHMCOhRVqVb>I%KTlYvO6~On4gc z^{Q)#4@IlYpVurpq5jl8;u87tSSvlqNSx}iTc>SI-sfC&_;!p0LT-q1}PnpR*3hhV$SqOj z$|?=-;FcVsJ}%$F$|8&_*D5?!>!<{koZvaqm)Tz&fntpkEeDFvj?anD#aUTNg6GZ_ zJ);(~@}^Q!t@O$cy^>>Gx4k@uJY|ckoz1=2ymfNXF?U{aA$mm*vc`HA+iy`Ky}U+- z8f(c)62(m6Q3lofnGdY_R>m7LS#sf$OO{*)o%9N?)k764+1IjfW#7&2!1@{A8!yM` zl+Ie^Ve_^+OXzVdX9l6?<~b-O>JxQNqOaoopn5;^fi>M?zQ8I~OD=ls(!t9i^I2N+ zDQ2AoE7{lYy*>M0_Fq`JWP9U8=AB$Tl|0&z#|YK|$VvdWS2phAImkm)@8Ouy^NiTV z`I1~M zjje8J+oo+aZ3<%Re_0;Jhe`#p50P&=M0>>iPIbsJPaf?I_|UA}a1mFx*TjFq!upyj zU#n2Fst?AXO26+r9|OPo*YQ!cUF1Rd&|T(4qopqSVki!tTHG8}gg-Ta0s5fvS?w{q>MXW&MxSJl+-*YsI!Uw+YL_|BU0^ zdX>~Rab+-_tx*YN(DW=sd#z#}-)9a$DNz^4)hwcX+LU$TV=b}OXii9v&3sgIjnaDg z+8EY%xRwN#P5dROD{>BvF?{w$??kLVx9RK1#>&IbfRDA|W1O`)tQQ_e z^Jd=TsCaaI1$8W{&tojYw_jy|T)!9R{UDWjl3n?I)^oYHfzmdq;;$5{@vc6K!AhI+suMy&; z%Y!uszVSh;WqEB+)83Gf6|bJ3=uERoLA^v>=QzFgh90c8ptNfZtB6+2%Wn`qgmNIe zQ9;J+o&`Oc3CfCBuQYNkiQ6mHU&v4AXw@!Jf10XWO1rHk)4IDy2DoeT^@@~PmCcc% zag|Ev`1E+trXIYkvn$o)wBd7{#kvc%VDk(qxKq48tXbFL1;&Z>NyfSGp;b1E1}z)c z*}@aj<7|eV5tCJ}AQR1@%C#j8U3cNRV1ekO*3dN-d>HN3?PS?2;X`NC=#A+IwN5R( z^(+KZbXE8)nJ=()K8lfYb{3JYth*?XP$1f~cC4e?(0r77%Scx(WnKLSaMH9YFf)&0 zw!?BLTU%mMKwdv8Zs)wMX6@*8gY&`sh}j=wEY&8l`)X}5yQ$}xdH8IH`UCa&oK4f} zCoD0f%jyy5RpnWeudy=^6X(#Y8nQPkm} zbF$9w8Q?=_IT_muQmk4cIBA`v=a@lR@ zi_PJv{XHRld3uas+~=TdRf*3VIFfzbJwn8>VgvZ2?cLyfD6)~incr5uw`yp5G*J8nZ^6guBTMt;$PC3cVJmOgIR`RcCJ&Vn{jcwpbQ1-B2G-J~R_%4No`%PnL_g zWma5h1}xu|Y7zF z;pJQn>DS+Pm~AUFR3|~V%R}+))gtsVN%FAzF8raycfKwQ-cPtNq!|8572flrhej(Z z)N&_ykSt$u(rsC-tgWWJoe$MB&81L>Ti2}fTIUD(%<>PTt#35@TzR?L4_+LjYwKw& zhIFLJyLQD2Y8`VTq#KQVK)W=n)wR{ahtzx=-vuA*(kg1#T2^M1TtKSK&{2)jx$@$j zW<4nks|NfS$1x3On_FtcO){wmUg$^`kk(=#u04+ZK6i?mZPt=zU$b~ z?Zl8S^-TTM1=BIr9;vP)UeWh!Nkh51N#C`5fbR=KVp?q=!ijUuXSjw)S9qzkWd5#e z|E~QoCkUR_OCEdqn~_xsjNS(w#Y~Rrn0R=|!{3}_&f5TmDm%3|%z_nBR&AK8c8?hu z@LtRs2v@j9dDOtioYtMB0DPcLP#zP)2>7s>9E_xnx_EfueJZTuo zR%dH6%yH@)E~HccppBGEx5ikO_1b%u_$7onSvq}>4@`0sI~t}cbgaBq@5nT_=0mn!rP z7xN{oxaeEm`YSEAnnCz5`uji7e?zt^d%SCo@G*K7awo$5XogGsskaJK7{&H$4Q7Q6_4YO)_%>hDbo%?R@4q>FBx{i(V&y6P`M7V=KNTlM z-JP;<+%qR99`wx#_Z+5G>`m>I{zr}8-ea-1y5-k@P^S>N5aUk2BHVF~D{IrN31DJ0 zPoi5Kae6SvJ^6sedSKN9c$3RfVOk{-iBaslaHuTSV( zp2COWV>BP-(uIuAAYy8p6)>y%Ke)Gq*%iZ`UdhrVsA zZ*PjE9UspSANn4ct;S~#)jE>;0n615smSatZLI2)@FCR8o@iDNb*^D=+tTw0LRx(l ze01p5_~@3E){FMsQ%m^&~%nlG48o69JGZ@Jie&}+j- z`Si)z6HT`$PTv6L7`H}%kJXR{vBGt-oV(%-sA!YhTFA$!6}h-hab2@Zrsn={L+cgj zEU|$+kfTFBNWIP;3Qu^~P52OPDiPstZ3`dzi))Mm%|vXTkv?ySoyJE^K+{!e3<`(Jc>5De)aS<3v@KbV8i5N9{pJH%$yJK zcTnBtYQ8O*Utw=Wx7_NI57OuuDZR^e8 z9PxqK-BurJhZ5734Rl&zaBl1o&dD3dOQt#do z{E~9W&0=+M<@>rfS^qIshKJTYN;P{1Rf2K1$Ue44rEtT$H21S_=v$E-`wmR;zGuQ- zIrZtF*(oBxA`r94ig@)Zq*62n^s(Z8h5SmTvd1`Bz%J_;fZ{>y#mfHyPYh3(tc=HlzQ?Z zdHGED9=Zh|pwVzqwZOLT)o9Fb+B_QRE^V%6Hg2!V>~PZgpijp5GVc&RW(i;T%{%1} zd_a2)7o`REUm3;P1($?zL|azGy5z~R;k7G`P9~WTvmc<9Zvi*WKFR6?a%ab)Nm{S6 zktVhD8;jBECJEF-eZ`F7gWqeG9=yzJNB{24)8$H|ANHcFtX!vDFWg>nT(w?RwY<<7 ziO@|F(9vS82DvmJHT`M<2_XWzRZs(FDmh|zim)*IvIPNdgVO=Ernj_Ij@D{ zt@!;R9kmS-$?I%K*^l?(TjOKQThD%dvbUN;t*uwDh4OleU*Od(_Q!BMx(DN9TBlY` GoAUp4&|yLV literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/kowloon.cty b/micropolis-godot/assets/cities/kowloon.cty new file mode 100644 index 0000000000000000000000000000000000000000..52e8ab7c2540ffbc949331b2e5640b5f27488f37 GIT binary patch literal 27120 zcmeHP3!GI|xnIY3s7a;r6c9w`fwGITxjk-m7+?^m`@3{|++O!G*3Hshpu8akD@rqa zmzIKw8fXZD@AtbiW|I(lD{+z&B@Kl&CJb0x-d5*Hyvq4?#oG%Fq0{o2Rat#zMA_w>Qnx;+-3M&f~$ELO=!FXJrez2K`Y{W zHq${o&B8TtOH|FzEx`yEhj3t{+0_A>`EK?_87n4SIbX2jJ+OoZEzd$X#_0~yE`%VDx?+eM)wPM3+TBM<3Hw} zM86x{v+jB4T?jsk_-w}Yb7;FBZ68OiyU=zG+N^Rb(RMj{Sb@>+aQ7oUf{`D=m}^mc z1$ucLPo6;EPq?SiG6Z#-kv|F!R^VzKdVCDe3aI}yxOftMH*x8Y=ywz7Uh5)^Mq{r= z{X0=>HEKNtu787;k7Lwl-OVW9gF8*`O7}?+Mge2VS2-uO4+@0A1egflRi$R($UUU8~(!-No)R?oxLlKHqUa zLiwAyfo0R6%#%U6!6hYWH7G~-={xPE`!zk6yHYnT%T@N<`muXfrrdhA_JeXmkgU&a z&92wfLheyMn0ZO>(H(0c^{jR}rah;eo~AYAPH7KDp|z6QM5*1e9F`|6wY$H#7WW6p`%xfurMuew#C;#qT;k@r^W2Bsf4UF258?ZR z?%&-<-ACN)GHH%GSW-C-X7|WJ*SlTIb9-zhb0H(q^;}JKMdf+?T}sI;*F8~vt2GDD zXQSn8?aS^72fdK4!VkyK`Lwr%$<0XVO^r&-C}7fiqmWbh_&) zRl78e$<(NJRh%ka1?Sc7x-RKj*SEABeyFFk3|^$Cv;uyur}Q(|b6N=-)Klt8x0SDP zJtuok+${%XD=^+l@O}+GOL6B0cRl>zQuyDWtz^Y3AFJ2&bh(xqf6jfFUR*1c-F=4>uwRgm%wH$c9*#M?i=_laWi2FE`sm90Q$TT zdOru{S!jRQ(GR;Pa|4fTdbQ)QUCtdh4fn@F`e(Y~^z@J?@V%dZXW!s*NDiMP_?xce zv!6Zpx%r{)pXncI2D%IIABnoXrX?7!X|m?E2Pw{6cvHA4TodHOCE=yvTh| zTf$p|e9Qdy%ffFTynM7=)^bI-Hm+~EDEwA<#ovXGL;8Y&U_#In_ETIbzWUPVKGh}5 zQlh_oo4eqwpsut%mt3g0vb={nC8O@e^K$ds)i!FsDIdvIxgO90d`#+r1}C_JelWh0 zp886Arat6mt9c@Oj+%DpFTlN#tge%iSpA5;gGbLtn@NskJEyY`DApXNh4eJ{2Y`C}K zLFWqV3U?OnEj*aEOR2Ui%hNjPRgmxA1D-nn3xAVe1$l5D*B6%*FD+i4w(I*}hya>O{9hw??=1KLg%)XgE9^ ziJ2H$99|qLCD3@MzsKJ%9y_kL9;jdLouzGflD}YXPCtBUHHo84tAJ>N`wT}o#VKz_d98nx4CGc@q z+r9n)v#8bs_iU6o!;|y{J{A?fRlK64j@8}E9DJ}X7tgAE+!5XrJ`g?vKJF;oQ+S~8 zNVq%fY{^NTXic;(x}*Q;XgMrAIXngO7*;&Fc#4$3$KC!u|Dah^>j6Ed6eYNlzEnSC z@O}JFZ1@C;J!@vv%%Q9J{eeZJmRpo+`4o*-&(?f0+VC^Zr4{OMsWzwzs*Mw^KR!T9 zeri2f&uLydc5fx3hA5a6RQg-|t^T%}>4x4oZr&QV_cmLw{}u286+tEF%u9R!oNx9m z;v0f$>kDU){FW-;NSn#US6@x@}wY_MZ3%s^Psr89o)kM9f4j%6Vz;H??`cnYbHQ zH?Ge5LcPiiA6-Tgnd;h!-{hxxo&X)E?tulOc8A)uW zjHkW)$Y1Gy20l0!V{Xuj4@@@ED4=;~-$bX|~- zJL1lG4`#NCaU&c+5}=*G`Kl6p5W1=nO9|Qq-E}%!>ba?hl#l3!Xhj5n-V`@&Z31$| z{t9a3nc-2f#DtE zF#_XJ(1p^AZAJew^I=$Kr1*(`vOgQMvo!j7bUoy;hf)?-Bt82hOc5ve2+mZmltxI0 z^u{oXS``_2{35z3S{2tfZE0$20&>Ov3Th&LX6+PfY|BA8<5B7%s`;~j$-lyU2$p3` zvvwJ4$X2n=C@;++0nrxvCS<8z2_3>c>5cS3QcL+TJXvn`h-M`ELG9-O^+?ZuTm7p#!xHX!@YFmkr zm*Io)WVkZC0Kw=p`eDaUqMsVBBxfY;0sg8wPLBe^lUYXa!5RTRU+gGGFI&l;N1Hl) z1Pf}Em*$WGNrZIA_#k}m%-YE2?N&m~jGh~wEH`@uZmXgnMOQ{YGh9i|NCLv6>gbH< z&4wqljNpSc0(|~CdMSFv^uwM<&qrYd3tCFQm6QYGfpnxA`m`(F8SgflVz$~=qFSju z%o>&AN_?NlaoW|>mQ91rlsu}9CPlEMf)s0QcT-%+6TuxY$!J5ap1JXm#={$rGWso7 z?KbTod&O4KkR*MY^&(C)e5e%@du6y1-zOGo+BI$0`sLt*^JqdxT{H#t*e)67>~4xH zd6M8x(I&0p`o=?_KcewCo0@sOt zkVS?Sn;c{!O}1)QHp`jTkUM8{ExyJTM~1-%f{(F(NT+xBv0#w{la6z{!}iGE>;w);h$>dspzzRzs0}J z*902%&~w?HG25Z>5Bnluv1HG~Xw&G(;&RPN8sm~3Ia>v4n+d@r@(;}%>xqt9WTZKK zVBAS@d3bdD>%%t?WyMoFD~n@rPdO2vq2J@$&h-BRKG;h+M=@HAD9&t0ybJzem-r&^ zp*BbIgf@vaA|uJ;P8v4=zu__Aap4=8kJE}( z#nZ96-oUYTt?0CVztz9pzXN=5)B`@qufhA6?TB|ax5c}~7nyCa+*YU>9Z4KiZ#o~2 z4lBZpy}~?#Dr-Y@mHyc(O74R{Ugfnn}ex2|cs=7AMB_)+_o$ zkA|`YSK>7!4$``YGVwszkvO%zG6V`#B0P%rIzg>Wt@JC{wN;cq+#ltSW~#t9<)Ck9 zFe(_0G$a@ae0{w0zlsfA@r7ARt(RG`I_ovw4f*UAl)+0HuGn8#N$MKPEW!y-3#-D@ z!G&-_)a0dRTrZSkw%FrIOs<}!-XGESI)4mmCtTqAB<6xR83aB)QT*@XIq?SLM34pQ z-s%6xt*I{(FT^Vb;-dA? z)S2`t;5xFeYA-|gS)$NQ0fw68$S--b`Ut-muwrGg#YrBcv>Q8W~)fB@?X>J)rp%tphb%Wd$d)Xg!o?IYm?{A19j~6WtCz znDOyCubACBidlrCDWLUxCpvm-2SPyld8Hg0=yEus=zV z1nf+*=vZSpS!o&{vZs;op|%c)5p7dFAbD`42f8~M3F}*Pl%U0=8>Ld{T4MV}b5S!L zJU}BkewCb77kTljpq%62WVJQ0ZHONh zek|}ao-8ZPeB8lp*+#WGNaj`aR8BWW2g8E_{2{(ZLL!rE=GDwVZ?&ME;&AW)i69;~ z@0#_Q!AJcdKhzJ0^{*8TG20}_SM4XcVudAiXZX;#o%yJ0JKYC@Z16#QG!%m{7eLgj zlu$0G8zZO>`U_43Hv^I9)p|keMIsc9gA?1Avba|?XG&0K>vz$R1XqlFUCR)zXl255 z^Kh_NV$n2iul3db4F6`biXsc(se`ycnK@t@Pbq_`lbPdGm+7ibtQSTWPGnb#aP`+{ zOVmdDSn`fT=Q?lecd^6?uGmtk_S23KXwtQZ`twYrycuHw0W^yy38st?_NpL?`6!1f zo_~L?KhJ+bzWIFyM`4U9;)JkG$jV1?$JPk(Vo)jXICQS_wtg2&oZyNr6^|}9tWH-R z7L~C7Aj+xj=e6 zY9-S+v<#laR*isdy0B)J|D6B4|B`&8Jv3Hu!Rd{cO0IEdxJaVznPI(gZ_ z#e8s#Xt-ipV0(fJo|6<+nfEw6YleB){)87=Iih#bPt+RL3m?!8va!**(RtAqAU)Tb z1I4uR%nNSN3$y~WFI4BlgIPZ~Zna2Pc5uxaDXz|f{(?*K;KXgZF4x#ZFSlV!iFa{`Da4x*l7LHn z3k^vs9>E*wY=S1^0=NPnZX2{%0Jn0>Mjgy$;JE$Tz@NZ3sFtg_sgY>`{4(>a3AOmvE6AbPQjpt=Pa zC>|LpS^DjoJ;ff8a`cwyZ4vfpWR5@uC_s;?U!gaTKp5F3&@>D(6kb@%Yo_b{eEf9( zF=$QkR0R_JU--WE+K_B`m94TQ&NW=Aou(BN^jY+(*spkOu|M~b56=kS9KIEt<<bRayQN}IAP+>fBIW3<(c7bU(EQ14 z87g%)GQ0>ErQfA|@SKvJBYYuRQ2MH6m4&(Dw+n_Vq7Z%`e4AYkDvHMxk1M{BX|D=l zIKwjucZQ>Gc?mHQzeB<(x;rkYl-U4H)fu^ztb2p;IJ1BVozuMdli2CaBs{smc4>-l zDxO$`9|s5gCV_@0TCrArnlLLPLSCZzm;;SX%3CTyRw*C+4#{SVBt!Elvw^o$^5%o& zLOZsbrK#9i88`dQ6v}SI;F{^Gr`5&dI|md8v&2847lquv}xDESowVx$XB4%1*{Z#16fFB%XHj!r^PulH~8$D>c~ zE2xmjT4UNSy!damUE#l15_O7)VPuKT5@aF5LKFh7c&{F_U9A+8W~aM8lXM1q*A3DV z{DEqc3ZV<{3%tIuhz52HiH5;)9M|?ne**TQK1>)JS0|BmYitLQs8xx(CA^?qx{e>gYiHIlp;>UGUfb4HwBnWb!H_|Muih;c^CkMMD+G#fU`y%E z7fA>lR0LNB-wQqrBz!3N57-0j&61R14|wHg{DTwlT*^x({u&UBK&vUD5%BH278D$* z*S2-l1nm6q${gnic92O7FMkGo|eauQv3|K*$YdR#g&~h z)Du?ru88zu7ka}w0%LJJ1bN6=6^)JvCmKUwwuKXs54a&;XDdq4pS;Ao>c7QLfIH#K zqIq4TQ?$HSxuH=*zRW+r0V3;K_dl3CAetO$E4@_`Kn zAEqs`o)n~+ts~UYK3Q@KQ+m}kI@`8hW2!_uzz5?>^a3_d&RfZ;6w*29uI@kaTDyro zNX^`u8S1NQMM|ReLO*7eqb$f#cOJkC?Nd_h%rY~JsPdx|AF>J{52)(_T(O@l)q?UR zd8a0r2Oo0YO5f{18iZ&$sSU}DtE0F1@%CV<@Xa&H>!EC{2>i(lWedRLf~XS$WD!pU9hquBU3%Qc}c;n5AaMj)iQ4Yh%34k9U9%J@Y_( zitUweo?(maD9U5W@Lj@}o(ajEV2SiDc(EPPmZ2|>XgQ^&LMSVxwtPuX2LOwZq{)}w z-_bkDJ-`OMTQa{Nl2u;KY~fp|7TcS6VOl%L8BvNc*jq|_nRPj>Ex$*=oiLS$?TEIV zwD`KkH?>p>W#uU^eZm$VW840io&Vsdu~Y55ta2;(O*3{)N!Pg@>!_~n*#ak+qE$J? z7_!Ea_8bSuX>I)l#00Fx#0T2`H7IEr)-tl?)RrpcHKWU=ly@mPInQTj%uG|*2kucj zFY}wmOQV>h!MwZ4p4bo%K7?lQK~_`sM%uHE%V}-<1q55OmVnUJEeWq(s4dTxlan~+ zJxeu3Eg(fs)!m|TtSK}CwiC4!YYWXBNdjT4@r*x~2G$$=YoCC2c`)}{0=l~Y39o(N zgHPg!M~~~x0!uFbM5#^Xp}TM3gU>(6xeKP2IjWgcGh0vhCf*XV;kZwJ?SmMef3c$_ zvH@Mw=I)&FoiY+JjY~W_TO#{?gZL9Yd(d@Xm*l}`_2t|JjUwkup+B?rbZ;shjr-)+ zKH!6Yv6K1jPZzQkab37WrE+|5f6m$O1`JmceTYBN(;Bv~o9<{c;^EWz+yxOL+C}dL z^+c7}LH1~hTt!@hnzEFYqqyh$s&Udg|0;(qk=T!9uZ_`cadw)E#|8aj*T4tIUa+OI z?@u;Z-{4ygNi3n?hsV$8+!Fg`=D08SnQDwzdJ5S}GNxfqN=A|F&Iszot`SM#f#wAJ z{!$We7Oz*YhFxGmFrFIq>6P8tmt24ETzU%GN;0NeK>dweLK#QhVy`oi9p;3&;k^q; ziesEK2Os=vn1qXcp}D6v`g`Xl{ndnwYb6;|v8+0jP{vVrDe6TA_DwO3>^YKuVL6Sj zxw~d@`J!QZ{c>L%+M- zH(GmZrIV+Tg4#pFmE1K%OH5%%*LT~b4M0*Bf!S-~L(1lDf{8U3{6BD_e5l>hU!fmI#5P^?jK2^1KUnOZ9>IkTZStS*%M`rhoKpUeaYpUs6=E* z>nOI(x^F;lV5=oUK#c<|5y5h)J}@78x-5%ziRzLFfc=C#xBnU@uB0731;w%=2=+CjVAdD%G@pJN`xIX#zu0Chxm z+65zsedK?b=x!NK7qWba8%RRms41_8LBUP3zE+EDv3S1z5m7N)rRaQS5qK20nS{vGgZ!3XLim*5_fA;It@p4j_<+c}l z>E*DLy)W}6p1NkbSS0KS%5Q+{6GTlREtQ=a@f7$^5d6PAL_Zpe8(#^xgzdt&m5d+D zgM50WYvugj?WSib?)f@9Up2FB)oC~|L~*V@&ooa4mIwLtO4rI{4-N>jWF2I7D$x(d74S>{qbd21Ov-`!kIa8V=_$fMY;N3H4nCA$ z)*JFIc-KTbmZfvMFC|$A2_E8l+m%sV@wqg_-H8=rZI$(2KKXAbJ#j(rv*|wnnO0bC z(HuNJJUsdMeWAQd8y-pDb51q=pqpfA+2YiSWrF9E|Cqxq(*LK@rN6FRp|)v-^;6lFI{`>Ru=5*d(NpAnF<&E#~_V0&z<>?IelBtInxTuEt;dak>lb6pzER; z_MTHCQ#~`$e=PXG|Edwol>En>ZgcTkb7@*(xd;?KADRJ~;OzuS=Cyk1{kdS@RuLMR z(tj>? z&VO>sM+<)=9%L5wTNa?U;n9Z1hTk?k)9_qF%in{C{g0j7nECiWvu^Vd literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/kyoto.cty b/micropolis-godot/assets/cities/kyoto.cty new file mode 100644 index 0000000000000000000000000000000000000000..817a78b0f5929efc3e2d4a2108c255e67c98aa74 GIT binary patch literal 27120 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 literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/linecity.cty b/micropolis-godot/assets/cities/linecity.cty new file mode 100644 index 0000000000000000000000000000000000000000..b178ba161ae92849c50554b15d0ff1ec1af54471 GIT binary patch literal 27120 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 Tcd_>8aV>cC+JB6roVor#$QG*H literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/med_isle.cty b/micropolis-godot/assets/cities/med_isle.cty new file mode 100644 index 0000000000000000000000000000000000000000..9db3fad746ab50967f335831a1d3fba02297486c GIT binary patch literal 27120 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 literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/ndulls.cty b/micropolis-godot/assets/cities/ndulls.cty new file mode 100644 index 0000000000000000000000000000000000000000..104279e26229a401923287423494b690549e97c4 GIT binary patch literal 27120 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 TIV7pFdD{naG*Xqjy#9Xx*4&Zq literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/neatmap.cty b/micropolis-godot/assets/cities/neatmap.cty new file mode 100644 index 0000000000000000000000000000000000000000..1ed224304f4dc428edfd5be0818312ff84e39c49 GIT binary patch literal 27120 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 Z?&|vXkFJYzayZtHYdekzJ;}Xu{|ja!UlafU literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/radial.cty b/micropolis-godot/assets/cities/radial.cty new file mode 100644 index 0000000000000000000000000000000000000000..0a180eb13f6cf352b8c72b474fc66bb4c240c21d GIT binary patch literal 27120 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 L8#wAZi*WoOgqPY9 literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/cities/southpac.cty b/micropolis-godot/assets/cities/southpac.cty new file mode 100644 index 0000000000000000000000000000000000000000..daffddcd9a3633111504578f26f3870fa0c3d92d GIT binary patch literal 27120 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 Y&pye0MlW*JDotcMjE6Afl(AG>2B!; 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

WEWP_ zOl?GB%cR6p^ONn&K3g%TetQj3<*3+W-FT5*%!E#r54$`N^ZoS-oBfkctX_7zlaxK- zrBubJWlw~Y1jK4NzO-AkH|_u4@HG4KVNs zhcSd?{R6Uk61D!VaT=@8i!x17%~ZR%*C_U2CcqL>XjNn<1Qa4e6G9l@)3C=*ROx z53}u!aw7))7iIKNi;3%hq!qvYP{K+ZpRPa=&U8B9bDf!l1rLx;y_-mPC`2Lij&kWa5KR)HLy zzH4i<7o%L+9(?8oJOK6w>z8j_92-phR#;wK3&AfR1n|knZ?TnsGqD-+WX`SV6R~IT z#?N~GLdWz-l3A7Bh@w6p`t3{c+N-Ng*x%gKuEkR=O)Tilcm40P%YcQ9?7rnd2mpiozab@#9${WN_3bNq8uOchSNEUUJ zKctcLfk?(uCVVcxs7UKKH`B3oGnT}AdZEu!06z?{KLfBQk!!xIPwd!*w24Lg11~)< zr%Q}|jt;z2UM$CEf8qDn+3{2f1LTij>t^EE?kg<($WQiTGL(dQ2_p^p44My&lquy= z#=NmR1wmx@{kB?~Ciq>^+kc^vOH%~{H{F1G+V#Lys>SySVp5gGd)o_2wCkA$Q*F&710b*fqmE9W}0*3=Vx6-CO`Tc7@c6;q&v`xr6)8(G^X&8@YbDZyjYTh@! z(z3qA$17L;fME*hF%ruFuUe{*)-`3uIjKfsNu*oWh5qPY$Zpjv1{uu*Spl9gfbZK-X2Pl8rMTiHgM~`imko_}Jw0!E zX7^26>53`##i&oFGkz)2(uUy`mcL>k?xN9HHfd_0ijXAs#Y5DKog(c~v5e4{c{WPZ zrTEdRsXgK1+dug=*G3UGLqmIq7h8+E}F1TW=q`;;4 z+AU-SVqh};xWJq1!1r3kxLJoA{;MKgvCFSZ9d;7WqRCO%e0RrtNx!MbMl93*?Kxm=xxk{UBd;sOB=p}R#bLsKIDi!b?3o$D1RnPV$R`h)5@tF zH7^mzl7GU{bSKLe&v!=Yz=O)-;GZ8B|M3R@BW^ysYqZpQE^6|BG}SvGeAJ;^2)CY_ z|EtCR3>4X)+)*m%@mD{Ze(?kcrclAmX zcJKh#I)l&e;6k(u_218>Z|q8WDXp(%f!F#W>gtDxeL(Nz&l#q~GC^^Un#=|yUrE1* zf#s~9$>D(A4Hh7&;$}7428#ovF~i^6hmk%PU>WBnXH$Q0Wu`o`>&b3j%4p~#&E3u6 z%~BpDLDl9AFvbY9F+%&#tykoze$YJ|;YEINF5)DNafo5*8A&{3-@7_XN^7(a}@8AJ5!C2+#!DSmxQcQJqFvLM(p_rZ4 zGH`e{`h(@(ON@xQlI@4|8OfmO{q&+j10jL=w*wJMXu{4$+yJ0ey6+`@4*2q)`(jFY z*`*Bf69kS;opsg^`LhyvbYLfh464Mba0lQH;O){5`;Kvg_eOH}mlW#|8-8$it7j!| z;0N^e_l-C7z$Oj3tTx|_1sN!B62V|YD$8lAJc0Mva_>{(j`;g+AkvkTmvwRun`K2UaD&F-;H{lGh;&aj%@Jh;*^pnMp_Nu)Cyzi0*TFB3LmS$!SL? zLv;46F+$~`BR;U#3K;zf*Tf%a2r{+wA_zjK<3F09zrku z>1ld|d+r-@8uIVJ0rsRR))Me!Tcsed90}hTjnw45`kk~uJ=nsBBy*f0N1Ff&^!8@< z*3!-R{l=3N--1-uU#PVsllxq$B%~73;w0?HwQA>k0vEWBVA8lVPad#ahHE+WT5Ps% zv!c4T53sjwox_WTTC88<)0fp2UYA_EdEE2jUxUkWa3tpK4_&%`%3GEqo~AJp53_3K zu-4}{x14iZ?fa5LR?5mRzn@=IuIM#!|L4`Bu^9_lV5e}D3|tR4-?I@_*_r7AZY**S zb>IQ@lv5?8&me^-H@b;GQ&>US)nNLIyUt7F`Zk}SCpe;7R%>VV@DZ!sVKQ~3UKN`=VYb3p$_lE@@);C9zFILh)r z3G>8}8KgA>Sw(6CuiD^bgN!tU8`Z^r=Tgt;5?_ymMP{()`70!GLOCGX6Ue=HUVx8a zv6&uLoeFFXpXq;M?4y-*&FO`oe4UK8j#=JzMz5dq`MN|7BGzb`zK=C#+b!I8-8-$} z*Wb01P+j#0#2WGP*d}HOM}EW5cTv1QjyLctv)o3y+3I{BNKkbva3L#=>#t#RlDJq5 zsqk*Vr8?@x4!iV0K%Me;UM}Z8Qf|v~$*@tzNRC)4Ha5pn?76*xi z{=&T2G6uN$t1Pud7=>jZ*3jUZ<>yijm96WaZ9T2-t5RG#NU9wVc4o?HzhXj>8fNU4oBonjgbO#BcvsS3M|XB{%Ftg%spM=w7umoyUqEI%5KNVzYZG_e1fU4?8f3nD9uv|&5Zfjz&d+!D3`M(*Eb-()Uer}*L zSmRgMZqFuW*B(7{^b)z2%kfGUpLFW)YG&oMkdCauc|-RH(~X}9an|n!_zw?46qIBk z@0iKtP*_V+gXK1TmuUlXk(%q#yop|Bso}3r`Ft+B_}x>=SqIzgSf=_|;J+o%Labd#RAzKp&aCd`eCHU zMs6MLTK1t^2Ds(S_fJ&557hL`D%0cJxSv|%2tx2P3}_*#NG9hP67vnw=C4ml|N?*5@a&_8c{ z6A2@$hyo2nxotp0)D}C~hD$m!Cu@#HS+YI#i`|hTHv48`BTVZ;<-%q%S!-I!w;u@B z-I_&q%t+rc{Zx2D??KGV=S+MTG|W!0s*-)vKr)qKF~Ys8^7djd;BdWG7qHCpZ68Np ztfK3>rv(?t1gKXL)L%ySWN3~m6Z75W08xKhFyk>#uja9v-lIQB!2MrY%csSkhcLuu zo_-GOYDuArOx+luUJDFy7bH!Y2-pZ8%!K{%z$Xh_=+PbzNB&qhA}^bxNO3@ouKHd$ zq(lCTB`=O?hAhNFRh6!9XNm=fH5;!WC6#5rqPte`)(l-wx~&8`8GjF!U4GQUPd@zK z%gFI8bhc640Mq3E=c9Hr;7IFt-Ye-+1A%u`e+u<|_VI@EZ${D^&ys6C(1Wt{r;?;~ zf6!l(iPB&m>NzAJOH1(^jJl3CT^QU;-@*a9FDhI5KQJf@=|Pt39@1n#{-?DF$}Vg3 zSzTyLv}1umR|gG44w@C8Yq?j4vo?}I1^UtlW;S`nsFE@cxVn`iPac%_ zs-OseUjw^8>8NH4E!fUMbQnTs8#OVub(9%z+)V@c->gYx0LLz6{b?G!$J^yW$DQ7& zznE%A7$Y6PlIF#)^`BwZ3jMfT41~>?Kj6y1Y%^qm*Y{IXL`oB;RQB!jdw8Bc2W;w$$~@17uo&UbeDHRpXHMp@LLfWp&$fo$f96naFA;E07e4e_C}k!dsyr$#AO021!pCy? zJ2!qNpv8yt8vl&Mr4GJg{)SHAOPhF|kY2)XYG9;1RTe}2ulWt|g{okE&#S42RK8Gx zEo<}gY^s@4y~O(BT23RY;}lN9sm#K%LGOHb(Y8M2 z^1A*Jcf;C_MnayfNbY`wbC?wmUm|kI$hw{QOZCmpQa}S#2=IPu z$GGbfewxw(TWp4xfwSIHsgy7+BiivBy$S zAAli5s~ma(gM~5IF-{e5#$5cn{jJm_^_A}?e97+A8J{g4cn^nk#el( z=1@bdIKZgc{=X$|fscdoQ)U4;*?pQ{20tvU&H; zQL2T7y=(8yYfr?U^t4En*}pddJj`47yPAS+v4O|j#}n6|I?k^dQ09hgeww=sl9DBzenl1vCw z=OLK?sba^z2p97PG^6?4v7vFpoU=s_4Hn{;Ncm}f;82pWF_x%lRmcrwZn#VXj!l1r zMY?VQg#rGP1=Ob{+eKngvE#@Ml-hl-f8WP{OjW_e9=~r_gK# zN^=!Wuea3Bg>ZvysQh$|6c;4`_X1T909x! zX$`fI)I1W66q7RRAR>3?5wj$fS!(Jjz+2608u+*a`kNtZutOwcy3ixocWizm6<99e zt<}a#z4!n|!fH>!c#SNsUvz4bfENR(xqmHZ17s@D`1SuHmT@sOVuChTjsTo}@a(ya~$0E}S zzykzH;*CHzT&O*T%gGARR5u^!gYKF>00z_$Efy0_f!G8koB?mZQt5xvT{w}qL9lCxnUJGB(hB$nA}l^< z&_44V0@QlCFe4X{_|ZWwwmFN}=>IRf63d%`oGbS-5224OCq&}$7cM~;n+fgll~QQ^3fiZhtg(kmcw;=%|FN>w zy+#g-T)Cn8` z3$A-ALUKPcDz@{HL;=k@M&xktKuX@gRQGT3=cjm{r-!gh1^INH6Me}1bS&aTNhUke z!n(NJ-5A+!sJ3$Z47okX{d*KlPQV2C7|r8TBd)(CD&PNS$V&!tdW%`edB~#H?@VuN z!HB5<4ZPHR*;#Y`b+aBtqmCY%$aq++U8WAa+48p9^ZxD%S0r9K1I!Kl?Z;{qGxkk5 zdK?NY2!~V94XjaOGZjK?l-m`E8g~W@PSqs`yzz^PNbslWGx{#ksEJ(cKX)jpiT8u) zi$P$-8AnHY&3SLO5cspheEt=c>-4|Vpp4gb9p*srFC#7V1(dqAD%8cK;=hRP8WhR) zte`b9OW}U9e6fBiR814+FM{z7?h--xG@4Q+Ug`N0kat=0;9kCbn_oK8sC0ovp5fUP z(X4|Iu=>g88Iqd6(4~%%ad!~u2WHDG@gy49kFk)8+)*RbRh0$42*SDv55+IJ4?6Md zx`=o-H^#elwD*eKa%hSR^&CIl`|6c#2z8*SNYH?Hy!Ilas& zO{+6I&^_6@zgU|=KW=(Lh{ad~-TH>|TKm$Q_ZKj5=qo3BYcsx8+-9=-u>&n}mY!Kw z0v;YeuwuSqlJGmnleiokWHWUN5r2m!R$_GT?gS8+`z-8~&pRxNQ3@7*xgf;1nEs(o~y*SQV>0Xt`HnlnwngP@HHygC#?Qe)qa$0mm>go1`wGxiF#^Tyg)flHip-6TWjs3(azes^ zU~E70;u9=Pxw(?dtoMpI$aBp;zA<41+a0hGq&M{`ExF!wus}-XRjM$92?9?~%>SrO zp8QpoaHaAjxMMX8zLv3ER=z7iq=H77*7OzP9cfK?@cy~nd)U#w$!YPrTX;Y1XUI9R zcS`&tcfwtIMvB49+F2^uL9g#h{g}XrSVm0x4s6mdJ_$|vnq?^Y9#QR($y+{ z{HJzMM;YuUo-Z8%Q|Ao;IgE!i8b%|-{S={*%$cu!#r9MX>E;R`9d2%UURj*>4lSWG z&9C4`4>ED!2sz-J{Ws!mYj8o02I=lz4ZV>yutszk#+0hFT7K~<5;n9R%ib_}uU)^8 zSdlnoASh6Dt~ao-c2-xb?IZAS@QuLMqo`D8wr%%R4cw zX7)_@qDG3(jJHN(bP=QMSK4#an1>&8mLh)yPo0QM@aHW35heDl5}Pgt)~P3atMuFm z4_gjSvI_%8GF7&P89p)D6W+)ZT01?l6qQjUBinhVm1KBq&D<>H*ZF_V5~V5U#xNcW zuBQ3q!c!Oj*ezcJIGjf?B7R*g`fq<5)fVC$xsgTDR$PRzq z@^c1lm9vA-d9bn?6e@$}k}<&7cBLxx27^&o3o|6fiZ6%tDw>tAqBh@PEyQmjmZnf~ zfC6}~1yZ7G@ERDIv|U1S&^nNH4`ddbI!%VQ^?2e)^}Xd5@8z2bVy8%AVM@{`d-A<0 z1!1E}2Rs}Rqn`?%jY@{o$9}sq9NaqoDKv_nFp_8{Sl1LBDPAZ-%p;4r?k1 zU}@6#TSk<7^S{8ooP27m1up!( zob>W^bTLL5t@8EE^!+EVWobgS!qXq_G;gb0C)^R-nb|s5F}D4O39hKD=xrhy1Ma%D zMvx0@533mnofu2fN8R@@PXR{|boNLeDe%e8(-5XKQnhOid~TpT%%_3j;O!#?1I*J0 zeV37$b2MZ&1@e}T5Z>I#buaqg+I>xGu3;CP+PDmE&8BDrUuL25i9-#PQ-u??6U%UT zB2b7LQahG78Xz6kH&RIjgEp{9priByVQT?^htViQ5h}a=_vJoj$us5zm0v>moQ8Yh zl6>n~=;VY9=$9x>wAR}V;scmPYS{Z%V)m9b`Ij#$i@kQHA>RrAkATr!b@cEp)Z+)^ zTa8A9fJ&!)_sb{nJA2tk+2@XpYxe*}?eYv{me!&Z70H3;OQ$x})Jg0Nd@6PM$W%lh z;c=+w_a#UFLQ^vzRDIQ{yOSsYOxZo1wtKoAEH%ff_4(}g346+=hXz;OQ5O3t)7*T) zh_x)S^~;^53|-I39{QxT&=U@Dwaer1pnl*<_I~xrA0cd%`>FF(_=|hQwI|rfJtl~| z{*O-VkU3WxmU7((iI-dbWFbQ?zmtv(NOcUPEs0bX3c662_z*?dWD8#FleXY;D@aBT z9x>U|$0~yXU$ifGrfxlgt&PJBI+}3_b63xgcao{3U^v@zoN4H2t5J*=E&#ZRxH?&s znb&~nc;SRkw_%>Jkd#zmK*5fC-2<|1$SJMb^vOGFXljAv+J$1hD#$Ok$DkK7DMqTf_F8_? z?KUiI&o?W9b4;(sxmBZL6WPZ9_9*(9yQ@OWVgeM40Rdh%4B5g|f=`*9?9V7c?5{SZ z2Y$!?{7%n@kqMd7Am2eVk2XP5M=mu3o}Pj;T)@Cs)bHVolljf!m~hS?SGXKXv~RGz z%@2mEB)evTh{}^9pqVPUX4p~#T0u60h~0iF{XBo)-5`KA4(~S1-UT~YA4$|=|%x*0VS^E<8>*L~|S#W<7%|c;wEJ@qe z0Tz#_MAn>p_x|{g1R_`9`BtY&l;)V$UK_&jDW>2$I$y*6uY?x3)M*UgTbiwgfX831 z_o|~B$AiBsVwR*p77bIDcVbG``gL_Pk5QStVDCKGyQWeKSpg_R5^!d6%bOjz7@PFY)+vwJslx%MZfm*>jx1@L`%kzDq`MkaZ)XgJUb2s$d7StU=B3oCxaR z@Ojp+R{Tc*IA-EwKjDboBKxO&1+Bref7kT@-rkt=Mv_j!^o&uzH$neIxMYQm6_5w^ zlYMi_J{oq!@4bA84a(tV?8-XLmpRV%8tz2QJIG0$J%TSn0a@m?KM^}c+rK0N*Fq~9 zu97}!1+I5-GYXf#6LWrMF5OJnN_&)15z>jg=zIOhL}Ru+5bT1ZW23(jua9#D%*#EE zzdQX#MPG5UU?}Ak^m)hd(zSQ8uCIUJF7yEktx$3I@KTP4WohuxK=Tl_P+!&n$uPi- zi7+764leX?bNHTr_Y5Q?i_wMNObRFGXg>>WQd%%Ttc|A~y!qKkQALTOVbZVvGoWr8 z`a6P}HYNBep6rsuH+hF-0QQ8*Mo?PYqdM_Qbl(M=eD{Nsl&||}3*ZZNtkB=H z$j4?*G+oL5&$h0HtA&T2zXj_QTNB+{)saG-nmh!l@dUfD(DMV3%1o8k*qRh-{bUL2 z_3}3(e}-1S=llLl=FH{EGZBA)!h2 z>-(jD_a zXd9N@U4X0z8cL-r`Dx$E)bV_nr*$v`&)%|VY_-x$P#&cIfP}LLYEO{ZQ>Y1(G8FS0 z!ihzN<#6iTpny5-5F?AkbBYTqM`wonR@0E8>n(#&7gi4M{x#(teOc!|;w#0MImk-9 z|M@E_pgL53;oX%MMZ9qvm`5(6elmaKCHluQV)wwX#tDo1*JFIR0xznkZ3;gw3`?&b zT8>S(3l6^69)lWthJpA8!Cmz=)IoiU6Uhf2O>vu>DWu+Pwg46^7Y*4PDICrm(`c<_L9_Z@cUlp7)gzi z-0}^N=}7R3&XhTnqv$Vs(R4N5Vb!N$1D4Sg; zxe808zSa@PTnu(c6{!AvkwHhxUat6siRmfY$DYcx^mh@Mi~mLTbE%^$$cUgT;b9Ek zofPK^TU6HI?C?Jo(cQy$o#9=^deZH${KVNiG{pB8!3*CI#IaQ{`UtfBC%hPKn{41F zzUIZu>wpuJ_!UGB3Om}Sv9y1ebpO6P`QBh>(3Pixplq+UEaf~o@T5(RaqZowlVuVG z*KlElpTFHTdB)yA*geI(EQ)>-Q^laN`Ah`TD2J6F^nCqh2CdNTwC(f&SSnPB_i3i;SXzN@eX#_z zWKZ56aTM$h+5aN*stTygkcBl=IXn?+udx2bRYnZvh>l8KqXe#*PajXs>}=2H!Vz6W ztSu9xKVqxnIfq;ua^Om5kOY23o*?DFE?@HQG*=iYsew4QDZy*i?#5)4ajc@(NTJ~Imn*Jx;Vde zC7M`nib06<_RS}eM^0fT1yR@s)4{w^jDzYP&;r9mogDlK>u#z+_Xjc(tU3cN!<(`|7eo zp?DU7u0dpvvFO|N?MJt_-9uFlXCEsB*<_q11SBIJzw&wlXA+7LLYLV%FmFWZA~KO1c8}bcMh?iL;P_ZZ?2F+QX)3WV2Tj&&HZUeJ$v4x}i)m7VlPC)x zenwj<^40%TtH|gHQ}@V120EbMwqZeB$VTQ9NOBI3$~a?M5jl);Tm3KI3Jx(1;d*z_ zlV|Xx&TA?%p5*+*udJH4viGC8f4ZW*#%SqYrqRz1g8T5FAWBT-M`mLF*$ta~>bZq$ zpFCpL!o53ZwkqjH_ia33O^UBVq4$io=sM`^NyAtnj4^qp#Ait_L&&igIsL?0&52^L zNVJXr-V020Rb?`I(5=~W*DC_SdjA3rA(5>rP6($*qf%1B@h=ZmfE*og5^M3Ij;dpi zh1bHeHU}CMAl@qm9&lEc9~;kZsva6>=gRFz+|9`#I@g2Vpf9ECOS})0{t8o<@AWE~ z*apjDRZH|ogQRn0TxG_q%M&IqE~h+bVbSvHQx(IB2B`R*u-R95J~LAkjhah8+OEqL zBX|Nm@=Ge{K-sjCxeF`tC!q6y?{%n@`4b0+Z}Z9}@^bu`C|tgsvp$O07OY05>Aq}~ZiDow1+n6_hdWBoHMW-1SzZT>m7R%xe$B$F=w3ZL&0*%K4J zMrH8!gcs-Nr@g;!hVBKGJ_x>NVo{K+56wcgsnD$0js8lznFovyJOE!od-I_ZcbzlG zFL^$92f<)VUyC_%*T<%%h&xt#xBnfTuVAOwR8hFn?s3ZnmCd+D;p=(Ko8qksifo=j z6A+y499jvxl9>3^gy5jH3>lPN*4Pjd-r1|)kBN1u;hx6>qdRg9oNqNd&_ic~RUOZp zw-N>zk`n=vBL4Y=KIcYAPfnSExVQrWr9?gv{AUJI7(D?aMWG$fuVUo7a?QrsP>8>fDeoU*B8S?Frk!l|~_sYt9-NfC* zLW;4oLg}QB&JOr7>zze!((Cl@We!SenwU>B>NPy58W)r8y77( zbdQgoY_2ePM)sYg&xzJOTjJd|vyIS(0wm`3F((!hi+`rKsni0qr&rQ-%z1#1sJS~L z;H9vlBMh)hzVnJ-n%L@l7M}cA^npcm(%B+0M5CQb<(nf2Ph`kU1g6Tqo~DGKZF`vy zC~5Pv0`9OrCKx*55XcKFq%2D%Q0l{&)XVf~SU2^H@(a{e%V2hhGB#8$5$f5oMZaLh z?`>?Hj3v#Cw@)DV-uA7W)*sz|{rmyq>HddPo-Bl%PMihtORrjblCSpWc8>zOC23wt ze^iXG+(dmnU*thWBq&S9+hN|10%5v+ldhd2eZ+89wyoXOEe_Y*Ti( zFTc+$U#xrKOIKchw5ISzUw^!zUs;Arv3AMFvR9R5*+Il*!^ON$?vd&)%Q9xm!-L_? z9nag~=sP9eN19}rG`7e%C_R<4d{`ay_?y&SXhYTYoD;(r?%_uhTPJJF0fm*wmoz1a zIXj^G%$;h>v#tkVKga_!1q|CveEq`;wr?fcLR(oFOvDH;PN`~;H9HYFhDEBTVvG6t zpJFxOpT*uisnFl0wi>7nP3six%3+Mi6)L$;(!g)-8LYQAGv9R%xqDYhG)|U1l^Mm7 zm)gPCJ3yfTz&X_q(#sUujy3TaInk4+5ZRVoy9cccpolL`Cg6s~$Zc{zeL!!q(c9?M z)eN1ZBE89e&`~1ld`k3&;f$T-Tf&WO-oY&gQgt~8D5-713Y6=Edn|Q)R_NHiW!b=$8ZtAP_;2PEbVY(tC*;DbjnB5T&-i>@@=%r3c6xObsC6t z5m0qFpmi7&gMDX^Wn~ADod%ilqoJuc_<2M7l*5y*^GDLit5~s0iYH~p`i=A7u8G-J z8OnITF81{39T1@8%p&}L!|R3kju5Bi5@=Nz9k`xdTg|^tjb?4zQwMgc!M~EpRywfQ z9s}hFdQFkNDmTXsk(;mwdgmoVbO0y6`aCrAAgPbqR0gctUOJW`^>nNygLsk1~XH>(GOicc`jnD2Zf7Wb`60UKb zs%q~ebeZj4T1rp$8*yTyo?j?>gKmzoh>nwN&u5J<>WkkGFCA3!{7Pb0uv3TQ#ZZVmt+Vb30EZGo)>y zn<#RjVk64(BbLbnj2%C+j6=3t+z=M`unL)Byl0v=q4&=A&dz8GrBYy8|(Ar%$7M0#`7}y%gle}xeHD{Uh}E+VJ7Uas9hk+(p<&P2E;%Q50l%L6CHsrZ2j0R zpz*^?u~#?FB(DK+_W*+r>BW*+RJp~#*Vi{XU|;%`t5zO-dkUDfz@OK+IYbPEKBOw< zSbF&&@WpRBLuKSU+^`zzTkmE0BWpQ9KV>KZ5wagElVs$e2A zS~F9Nm2D#&i>G+Lr^I~zn*G~EvIf&5tGQx;FOZQ178T@T@p>>|Jm zAe8hxw3KChb>r-`=eImH;227s7tZjpI=1<+QS9Q^pqf1FwDj(?D>W;73&*V82TN6c z;L>eLbn!$neXR>Q!|ps*7g<_M`9*Q8UENlY;Q*w2wYr0cBq;&i(L~+g27R06e`kq^ zX%=3#0@re8Se|pvxz_nDo|3lp%Pl0} z|Kr60C5a(DgjLdZByMV?5x@Q9yk1IoM-e1W1rpCXxy+`Fywk?jvOo{y02Y+E*FSX( zd+6k~zMrR^@z6zZ%J(}9$UZ@vtE8#H(0J(Vcy6nd%8MIrirIK7Z$se;*Xb{QPl}`9 zsiMoWD4Y$&@A^7g-ku}9%sn)P{MZY3$v?Wwmk}>GmL>DfoCS1fa3}HYO3Q(#4`wCZ z?eIIhu#_vesx@rKErACD;alesw9E(BhjO}q7oi>*9=H`G!j6I?oq|Ek*Lz|iBR?V$ zw7cf26(MU?hMc3?U&%fgu!+ZXdJ8V(8|CY>Rfi~8V@X6r)jub7$>ff$OcbAu7gH+}4g_xdO3#Mwj`WD!^WkB_31MhTimkt*jP60W%oZ8;|rhszqiUN(D=*&oo4~}RRPS-h5P`dj- z2+(?Ir$a~GtNCB|fO1rPV}4LCCUgmqpoX)NbO7lxpmv>_`b{vkU5+MnIbTW*neTUg z1pQVXS(V$~47Gx^dek09vyFXyswQ>$#y#BJgSvlR0}bG1G5^r@?U4;>_aCv+2sfrL zCdK*@_u0PoAToc79E61}qHhfM)0N-aTF<>W?cu+;$0IsBqhV6eoDy;JzV~%^R87># z-KBC-o>rxs4xNk+#LyAxd9COxk8k8uw14`MPQ34Kvd*eGnbsD|7iwAXYsB~Hv{p8B zKu8JYtfem;g+0I6|Nc?W_dd;sT=s@=5Aozg*DG1%x=J1VmqeJcoY1Cvk^7?#m#8>N zavKU3@o!;_URT@bZs*10!ltKDR}7!N42ncoc_?V-PrH#}@(B^01Q z0j)vz+i3MB$3UcA^tfqJ1`rWeqyWgEYbWbd_SZjvu$h24M7tUk5+3OP(`A0uk@n@_ z=V$5>`OVWktH(XUa_HiCd}_HWnzC%a9ImoQSKle4Ru-h)vZ^2F!mu}{^)-7~)ARK6 zT5y+a8L`N0C8WeKsFSD8-`G;uJjQ;LCGmTNyya;ypd~Uq&NM=+7ny*-a+1WY`5}u% zk}^sGc5AV?NALEwIey!#-ni=iX^OQjY;1jM9%*kCkb5Odlx>XjD(!{i4@k4wS%6ra zgp2qrt+NTHGFb%)Hz)LiY+r;w*8SzVkN#NIA3=?upmmE`Bz1Q)lx6hxSPWa{^X2?$@F8QHOks}dFc*T49P z!T=%X3Q?KafolZ>$oo6CX+J1yTSmnfDdR@R_;X51BS(h|km<1`l2*+0c zsOksFTFAX{g{c&^fxfJ*51yFkLp)3I^a;=V_%L+L_aif|AeGozD*gcdO=U^wu?=!5 ziTIO{ypkE*cA>ulDP5T~s`7nT;>?0xaGV9_^m@Hc_|xifeHLUGV^3L*{|+Zt6*3uh~J6f+l6tu{@*euRlMJ&}PTBqb1Bz0Mg(}>h-OL$gsxl)jiWl z`RF3Q(5@B7ZjX5&Ow`NyYVGX@nHYh_4~GTd1?u_woUer8EGj~S#RvxC9rks#u{SrZ z{CLaz$r+DL@CZab=Qh;~gQF}lI|jPzGa%ZfdlMaeM~Q9`~dd zH^9fHp3Z^bCB1d8d5?RvZq;iFk}irz#K|o_woxbvZ9r``wwEh zRM#9SmZ{TtE@eSv;pC-4MU=F`9?cOd?xFF=iwMI33uvh-v}#ZRX^#%>_G=Rq4gp#V zpZy6aa}F}PS*z>Z4qKC}R*El}+l+;xhGVpNc?fUkp}!L0C#abot=2JO@A{H;mJMY` ziL)A*AakmU>!KoSiQni6GZbr*40w5N2V+x0=}xco8Se$6Q32Y-KaIT*<^3Z#Z76TS z;oEsRJ1EE18%+*C7}B*8_ZD-=Mik{fc?F!?q_#j$s0gCml?de&6*#DH(huA9%THf} zv?^UrYG(dd@0Ow$O7`b*ma`QsfK2z5_Z-MfxIyW@VvOw&pw-wDRdFz-?$OSc(3lR1 z|5YUN4tv13rI@+l5sC9eD*5=&yMx554S0xDhQ++_Lmhz_hZt9M0^F1h$T?P+WOG7B-L%IoYOcEhiK3 z7Q!qAZKjX-`f%q>ipJPvr_q zx80mDMzvaE%^KYdK>*deK;E{0c!86bK{Gf?e`Wt4-ZEP)TTnmW{+Pqoa(a_lz2U_zd0KIWp8#ywN~vGQwa?&jgBql zm-jrRD~cwpTWzn?x*cyK%Yl-Q$dkY;yL7Dc;ELMLk`8|IAV>tt*#ppsIgl*OxWGUL zI{EHmOZy>wS*z5*l&2F!P**q12b_Z;T%*eC?{?1X%4+~rRS0fuC7Z-!)<|KLiRC1q z;Kv0bt5dl>thvs!hQh>Cf$BTZDeqD+^b1#ITE!It`}Z{pwn{Qfa)<332D4^KvK%&a zt3?Ij+1n04Zi2nKUQEXzp#RiOD(zm5({gyHOKfZsAR8AO92>+&R9jH3;_-8F5(nWo zVJO3lChHfxTW+R)j+^ZW?0GouEl0j?CZOFh4bjj=3-K%s8uKlvOt}@7pxEYLtL>^D zcKdZ?&L2MC{&fiXNThU+`*dMUAO**y%sVQ4Q^2%6Nd!i`ZqYlV&!Yz~wr=S;!E(}Z znbe3zE+lN2n7Yqk^!dtCU14{UW?(P{Zpbzt{J{2D1w#Tq3JZuKmp6f}xPhXZ%Mc&- z(7%xfK=GsjM?atvb^Fv*<=Mf{g;Ob!69rk8wapWMhkGGO8`w$ z5Ohkk4L#aM$zv8Bc9_m1?GhCeHXrW?RI~Dae0H+SNEUAG<{A zlqLSscw>B=qPWz=8dQu)s2 zS0ITGff0=7&U;V%VVH<5@Wu(SA_RPXl@I_uUpw)4ULZ3WLxz?ga5yw%dJAVY2f#B` zEb;KG<1CnzafU2Kl?Hs=(+q%U5)3*0ap1T%4@AU|{ff3RUefZQSH!tWvB)D9t&;Te zfkA&)GJtiQ**dNv2HTE%S%E7&JG-XB*d#+UcU-j{2V@-$x?X=F{b^`7q7Mw=1bI_I zR>3RcV==ubD;4~=k4SLGJp5P{v}e>GyN3&jH9OlyJIg3$ih)wYnxJGX%$4ym(G}CT z0sEhZYe{E^E~{G~)he%sV5&?g?3cQ6&6|;Ca=`vG;<_^PaRGU2zbSX!TBtp)<&y=* z-3{XC(F;cbsK@$o^hiE~I2HlUKn@VSQ#I<9bT-vH9tAXYTw6p}RomZmCUgBi87;)= z&n^0FV(&+ve#jAt03!p6#z1;~zOXnwV{}l8NEXnnyCBp0p1Dk*VUQ=vYhlXsJNF!SAV-u`FLz~*H^Wi9zI?% zJPWScki>neM(Z2IMSQq~raXFK|3zG*bhu}BJ=P~AOMi~;-uO%m$=RLK_h|dlXd#&o zF#4UWRfr!2qji5@^+vlz!o_{*BVgVQG7?RLKT&W+GS+*nC>Go=S)lY2)g`9@VI*06 zplmrnQ46+*Q|@0pk-Rb=$)ITfKcu&nJiSb~BSQjoVyDRV_VHlWDEu&uuS$1SOOjCG%MqhO}2pNf!21nq56~@0F zZ5O{gv=_QrKFGBf&}?Yv&~wI~`7^cI^6wR}e{`2%bn-Wf^D5KEm78dMQMFXE+s#RSFYJh)w_{s*RJrXh!ebYv2kPFg{hrYxx^yJ>?l$y*Q&2?0)LA zbkItHX}nw0KwnCBFa@uHdQA0S)Y5Uk2{F^+!l|D>??t!E5ku1!+ybV?_4MAVq2~cFHX=@r|8!YK3IDn)oPEBB`a&%AjJYcMtLFs zjAXsC4>`1mB~b~>esUI!+|4$&gWdGRVGW7yzrNvF+4aZl*uej@}9054~4Wgr3zLF~@zQ z%<&C~)(2}oO!NhWvSF&e2)A6lfDewEl%q0CZ%&mnu@_!uwpo6k{^N=$m~A?3r2Y8gd5f1_>%$lItXdce%lJ!RKkU|E2s9c9YsSFe>aRCLEG$=$IY#b6OWj0NCq z%b!ushe@NYy9V}TLB6A4yP{ze8cZ=Jgob9QR04g}?!`cFor299dvJ8(zX5pOtpVmP#5HrR-9C;R7h8ao>(;C(t%NTB1hY9`Z@Sw_amu6~ zDiWDdZV6JhVkZNLG_e9b4|rwuhR2x&2k9#?NB?0$()GC~w%vMc4!}erEkGI0RsS`{ zZBR>63Fzu?Ax&tEedd3_KsPtmaO zI^*Fm1yVTfK3)Wb^aG{6OoK({dWj#(|0bmgVqA`=fQkMH)}dx;D?r9v{XNqwp{Jfy zOK8el2)bl+`Hbx@3T6;{x$B{~cy_XZ-C5Wn=ZDE||0|zQWGcffVq8JKTl^WU{J|dy)CshxyPXo_ z!Lb6zGze!?gs6w<@T&%y@$KR3|1+hUJF)Z6dBy8;f`>hCm2XMV6NjEwaL{Iyn;Dx) z$wNitK~DY@cOR?1!DkWM5Y>q&)-N+7yh4q|`WpHSImAPE#tdKQU`Mm}5tC*QT#lEm zo3cq%%l!XO=!k+EH^G7b!p8VTT&bd}&7+bTD?2vxI#o%^Mm;zuF2{NkOfJ@O2~+AR zVD-jC!+3zeRY#ymc+Ys5ZHP>2>?$*{amwg^tEx3^fj3dQ&!O9fa(}h($FWlEt#ifI>*O-= z=d`JE&7~vI^S`mWVny1*c4)=1gVjP-U4T2THxO5kRj9Lzxh<~aNDs*LKh87<%A)2r z;hSvShoHlX&HJFJknFSOgP)1r2P>l4Dz)7``&Jz=vy>+kpTx8}m7rXA^gBL}dhVAr zXfybK{DNHs48nvS%K&4WCqvVIk#K)<#T*gF@9!y)PUTwaZ>Y;EH{veUo?zO@K9C$a zP2fHdcTMjBHQ`a2i4_EK)&;9R!=9jh>?q|o6>z3mc_r>_R9w)qOUi?z-xdFU{s5bXCXy@_vwMov5;zROCdY#=!7lgd@-^f^;MqD zqg_>=Ic$G;4(`w^nz5~ct&&ut zgm3UH;X>Hqo7E;NcwwU5?V%w2mn6vk@*I?_tP?d@pqCRLMN;M6PCCIEzt_Yiom>uX z{BLLn2PmuiB@rE#V<*A(85W6|uYn4iO-PCy&lQ>H&|JOHSE&U6PkY}}Jz88F&_5PQ zQOBw6XF@AfS0Bn^WxTn0QrD~lrZ?gD)IFZ!Cttk7AOc6AWcH41I-} z`SbWF{H(`M0VlD1Z4;bhzQBN#%gSY|23hQH>>F4jH99Y#n?0hd`$G-g>|yw0F&p2! z7U+TuSOJt(@QNH)5ZLn&&1WIl4;t{y6w8+WOB=qh1@>MtPISfvATuOa79QoXMzkk$ zj3;bww<2xMRXDv!sdRExb=GX-@J(&S~|8Nm*-q7OX7*pnO zDU0lN#DH5bm1`SnF>EzfFbi^Fd^1-*0CIralk|WG9u^+Cb5MpI6x?Es$|#eRp%3`7 z^H@d_@Z&{k98{eS@vM5Rn1pwXgP>*UZG8Kv^4G{#7=x8X4PA-0*(OA%@96^WuF|4^ zUaJ2_s>Q@>-Zh)*en7zxq|=A6{^ zt#;|Nb~QkkjZEU@O?ms^A@Dk*uBx{TGg}uQ!tI`+Wi0YHdZNLGQK0w)6C53Q^or4w zyMXa3k-Xx=11%zp6O58?A>Kobo^_zh8WuKs+XPlMO`jW7FL{PiZ%(uh#%fk14S~F) z_4K^Z`rlDlJj-%^WCH~onbQoszN0)@&h9-jSY6F}~4yjf@2=g6oJSCANd%sPs&A?)u)=ONPZewNmZSU+v@ z#*4yuk`S;Uuuj@d_?+t@uB@LTLXR^T>fHmfN(^#5C$`;tBDYk(#DdNlOc2Q1rdfR2ZxVt;Sik{(TSE6$ z62wQx9f7D*h?<}Q8DJEu-6t51zDUTiYR4zj<`ES=D3Qz_@vyTy3OV{o39v+%vA*kM zzN@>R8%>rz3qi`##&n1SdD7CY*72cmiu0sXt>EB~ZjAD#;Dy@yVxy+BlUOJ#=DX}I z@~d}!K>`}N!SCwTiRi4FupwuMvvyv6J7}yG>@DiX$8)3Hxl*ksf_Qs(sq^9!+u})G za2MMs2j<|DRW*2YR%!97;px=oT)gwb>6#lA>DGDSo@)OD&txU9T>B-&qk097H-efK zH(gC1!bd)O`)oi;u%i>sBQqWxCW7~eg8=x?kClqe8AVqH!DDa73msKR=UuQ%(cXE5 zXZ;0BE>nY}82mjYO%FKGi1s@ow`J47>nXLp*0Jxb9PYoQc&C$L2%zcW1leHjG0BD=UZWh zQR>?ZF&sJT9n83R!NSHOOB~0@3lo54SpPV@%Yg+EoVq{J2x@d>uNOgSsV$1g)KL!V0G3#f2XcLj2#GZz7Wo7c{tiVGv)Z-VNpB>qseqGFX#sW>VD z<}rP=rTn(@Ma99jf-Oh_2%rqULSQlIP#gsD9i2deVMp*!nLI`_22yD{!b7@GAQ`~nQ|1{HHGs|) znfm4-&=poKCCHT3qA^d?5ygJyt?2?MY|NLW!*(^g+7zdxrja0ylM8tI6Jicl*P9aR9P)GAi2!V z%uo0t=Y~Y`b!fp77e+nNfM;9o+HjM8K0@k74HHoyn1KZuDsZrhfBg$^i%aKbB7|`O ziA9V^dc0S4mz#X5&89xdxC6UqVe$v1*qnBj0`;*~+EY=c7i09TwfxMNej zPK_$;n-bCa^vT}>LFLaQj6U7m996(Yf0fz*K5u<7IHdMp_n_J8g1tXyL(_6)$J^3C z&D#3n@f}djYtuD_mzDq)R~n2n;vMbXV6w(mz3xH)7q0<7D~?ecRQ|R^5(}ggl)N0E zY?Gnjy~BSV&{>V~bvfF#&b8{tMi*=bRwGKUABH4%yo0gn8QK6?M`r?K_n{zK@YSiJe6GNu0JYymEZ5zgte3W0qvs*nsee|DbhpGnmTE)ehfyZ-C6B(RZAhXnMtV#vxrxeU^2}=um#%KRFS~%oUdCT42Rj z8n7=g^HfB6FJ9i&P(#Ox$?{hg=dw9W(;^3y8@!!L*qMUlr>tm9CwT<^JoLC)ZHD&v zb$6T-{k7NrW_1r+F3sW%KY_Se%CM&S%cTWtdpIp%{#jv&G&$+Ruk#^Y*bIp#?Yf8wi=e@Dmv*32Sv#D+t$X>Mq?62A})9U!VHu8A#h>4TQ0h+@z)*R^4 zB+MDeicr~q0nzhQ_XOzjRqhJ5i53bOm*Vig+B+%+pyxjAYiuT`JX*lqUs{8=eEP85 zi$I?|Rt%$A#Xd42Mz)))T152%S+^tRpsTU8ahdz?L0G;mx?4gH{8y^MxL(((^eMTGClcF@+Dis#jY&q1vyuf58jVaViduH-K(l=KOua->~O{8gNf#i z`~sM_1Unq5_~Pg!4zhqUy8WVn{IDp2nrk6S-17lLYvC#_)~VXiJIZg;VIG;ATQe?P z_VoeUn)%_oZI76U^6_AQIDppLG`0htyRCLWJkEfcZPsV#gF5iqLzP8Ybu9%ReXvk4Yxk@tWEsk#%vslJnC4_sHkdV^X) ze-2{#wVVppAoV7W4?1DurH2u*Hkpc=FJ+8*+_5LOjh?WS)6} znI%qrG%Cee^@V30-94ps1&X7CRso*~HeGAK#mh=7CH_dlS1ziJKsGLlh8F&dE%=olDwl|YbpPT#~0iP6c^$5f-MJST1NH#3PhW+5C^zM@O*jw z@0lx3xC+kNe+IIhxWgj~1|5lVXvO%ct8+_rzvgp$kS;zkH&4)^S5=a`U^YL*MoSf; zb4tru_V@cdG&njOd?uIpxoPT|(fKAHT}@em!6&b4?3Yp*FiZ58bH`sO(9JH1>l+TF z6qK;k{tt$o3dpi>vC9%34X|Z~*8=0n^=nW2yH%h`J8^jiBH29)$5wP}0bTUVoxSSYNjw;0FW4bp3`r(Y zW0Gh;*#LU?dCKO0QMS6woTy5Zzs9snZTUf#rJtH@b@G&M;QVBY?KYM$A~?|*{K0FG zlM%XAtKvW4L8B|L#b#&x8^GlQ0n+~la6>$QhZHb=$-l4p0OgKmW9Hp3CeBk0c`#QH zB31O}VneiRQ!WP~f<5kn#yh{qnBR^SMjO;`(&-liE#8sy@l*+SK-1Oh#ZK1~8I!xZN!|kY`-jl|7z_HVQyW^xq?)Pe^H*jtkyeksG*h_?pp} zWfyg;8T18s@#|3_@^-M=NawYZjV)&P4luIR1?2mKY>uP990&fWqH{I_C?;KJv4YjY zYUP!A(w(UYvYN(8&m*-}K_npZ$~QoKRC4|G^Sj@wplO=50h^$F4$K{B>A4S~g~Md= z;&*!1{ijp*3BlfC))6()XTMmb;$V!?|0TEh>T`Yrpw7RMznKzrOifzBnxg z^5ql-cSk4hz*}MGLKEJ$(_Hr`zXh)8$1&)g&HO|2|3M-4BsI*s1P-km`EUODhu$t^ z8ATeQb<_ppzL4FzPcOK8fWm+jzd4}b>4wCCUP|6j=sw*924ecZn#t$b>1IsKaII~k z<5HLOJTN4)PKsDrP~ZTGE1MVN-sVzxYlGy+PP$f8HGwgDq)NGQCq;P#1ESNen?(^M zB3IQ8tBAOTJQ*_Gr1jT^ka!LptMEP}0s8LLJX%H|%O(r^+^k6N;NM(daY4+VR|i$O zTCgyjd3AOK_%4Y$VT6(JW>+>ewqPtaNdJwT%E!fJ7J)%WI)%%e*k2I?l?Z0~Q+eG{ zM|uCg7!~Ah;%Fd}c!0LE&&+uu&s5(1eZ~`JR0}q{4Z`}O-?s)L?uD88L2zSHDM838 zya`!yrpv<0K}M{x+z<=g%>5p+Lt7L-n>F|TH*GRHl}}n)N{Nu6=GL2~zG#+U%B$m) zSy&RUTwnsZf(dus;xhRRDYC>U$4mT1c$d>g#;{cu!QDI*>7c$xC>-p(zl)st)zkUv zZL(pwN>O=3P&}ELuqvF{{PREDg;3H(`an{21#HlDYV)=EEfw+NBPa2dmnkbFe{j6% z|(xgGT?EL!?}*FN(wiz;SMMB?LZS~FQC8g9=cKa)+Yhv-#rb3yET6y G|NcMZccRGv literal 0 HcmV?d00001 diff --git a/micropolis-godot/assets/graphics/tiles.png.import b/micropolis-godot/assets/graphics/tiles.png.import new file mode 100644 index 000000000..bc5a4b4a7 --- /dev/null +++ b/micropolis-godot/assets/graphics/tiles.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://h4ryxa0d7kon" +path="res://.godot/imported/tiles.png-ce6346c91a90149344330e3b16ec8c2f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/graphics/tiles.png" +dest_files=["res://.godot/imported/tiles.png-ce6346c91a90149344330e3b16ec8c2f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/micropolis-godot/autoload/constants.gd b/micropolis-godot/autoload/constants.gd new file mode 100644 index 000000000..69201d279 --- /dev/null +++ b/micropolis-godot/autoload/constants.gd @@ -0,0 +1,354 @@ +## Micropolis Constants +## Ported from micropolis-java TileConstants.java +extends Node + +# ============================================================================= +# Map Dimensions +# ============================================================================= + +const WORLD_W: int = 120 +const WORLD_H: int = 100 +const WORLD_W_2: int = 60 # Half-size overlays (2x2 blocks) +const WORLD_H_2: int = 50 +const WORLD_W_4: int = 30 # Quarter-size overlays (4x4 blocks) +const WORLD_H_4: int = 25 +const WORLD_W_8: int = 15 # Eighth-size overlays (8x8 blocks) +const WORLD_H_8: int = 13 + +const TILE_SIZE: int = 16 # Pixels per tile + +# ============================================================================= +# Tile Flags (upper 6 bits of 16-bit tile value) +# ============================================================================= + +const PWRBIT: int = 0x8000 # 32768 - Currently powered +const CONDBIT: int = 0x4000 # 16384 - Conducts power +const BURNBIT: int = 0x2000 # 8192 - Can burn +const BULLBIT: int = 0x1000 # 4096 - Bulldozable +const ANIMBIT: int = 0x0800 # 2048 - Animated tile +const ZONEBIT: int = 0x0400 # 1024 - Zone center + +const ALLBITS: int = 0xFC00 # Mask for upper 6 bits +const LOMASK: int = 0x03FF # Mask for low 10 bits (tile type 0-1023) + +# ============================================================================= +# Tile Type Constants +# ============================================================================= + +const DIRT: int = 0 +const RIVER: int = 2 +const REDGE: int = 3 +const CHANNEL: int = 4 +const RIVEDGE: int = 8 +const FIRSTRIVEDGE: int = 5 +const LASTRIVEDGE: int = 20 +const TREEBASE: int = 21 +const WOODS_LOW: int = 21 +const WOODS: int = 37 +const WOODS_HIGH: int = 39 +const WOODS2: int = 40 +const WOODS5: int = 43 +const RUBBLE: int = 44 +const LASTRUBBLE: int = 47 +const FLOOD: int = 48 +const LASTFLOOD: int = 51 +const RADTILE: int = 52 +const FIRE: int = 56 +const ROADBASE: int = 64 +const HBRIDGE: int = 64 +const VBRIDGE: int = 65 +const ROADS: int = 66 +const ROADS2: int = 67 +const ROADS3: int = 68 +const ROADS4: int = 69 +const ROADS5: int = 70 +const ROADS6: int = 71 +const ROADS7: int = 72 +const ROADS8: int = 73 +const ROADS9: int = 74 +const ROADS10: int = 75 +const INTERSECTION: int = 76 +const HROADPOWER: int = 77 +const VROADPOWER: int = 78 +const BRWH: int = 79 +const LTRFBASE: int = 80 +const BRWV: int = 95 +const HTRFBASE: int = 144 +const LASTROAD: int = 206 +const POWERBASE: int = 208 +const HPOWER: int = 208 +const VPOWER: int = 209 +const LHPOWER: int = 210 +const LVPOWER: int = 211 +const LVPOWER2: int = 212 +const LVPOWER3: int = 213 +const LVPOWER4: int = 214 +const LVPOWER5: int = 215 +const LVPOWER6: int = 216 +const LVPOWER7: int = 217 +const LVPOWER8: int = 218 +const LVPOWER9: int = 219 +const LVPOWER10: int = 220 +const RAILHPOWERV: int = 221 +const RAILVPOWERH: int = 222 +const LASTPOWER: int = 222 +const RAILBASE: int = 224 +const HRAIL: int = 224 +const VRAIL: int = 225 +const LHRAIL: int = 226 +const LVRAIL: int = 227 +const LVRAIL2: int = 228 +const LVRAIL3: int = 229 +const LVRAIL4: int = 230 +const LVRAIL5: int = 231 +const LVRAIL6: int = 232 +const LVRAIL7: int = 233 +const LVRAIL8: int = 234 +const LVRAIL9: int = 235 +const LVRAIL10: int = 236 +const HRAILROAD: int = 237 +const VRAILROAD: int = 238 +const LASTRAIL: int = 238 +const RESBASE: int = 244 +const RESCLR: int = 244 +const HOUSE: int = 249 +const LHTHR: int = 249 +const HHTHR: int = 260 +const RZB: int = 265 +const HOSPITAL: int = 409 +const CHURCH: int = 418 +const COMBASE: int = 423 +const COMCLR: int = 427 +const CZB: int = 436 +const INDBASE: int = 612 +const INDCLR: int = 616 +const IZB: int = 625 +const PORTBASE: int = 693 +const PORT: int = 698 +const LASTPORT: int = 708 +const AIRPORTBASE: int = 709 +const RADAR: int = 711 +const AIRPORT: int = 716 +const COALBASE: int = 745 +const POWERPLANT: int = 750 +const LASTPOWERPLANT: int = 760 +const FIRESTBASE: int = 761 +const FIRESTATION: int = 765 +const POLICESTBASE: int = 770 +const POLICESTATION: int = 774 +const STADIUMBASE: int = 779 +const STADIUM: int = 784 +const FULLSTADIUM: int = 800 +const NUCLEARBASE: int = 811 +const NUCLEAR: int = 816 +const LASTZONE: int = 826 +const LIGHTNINGBOLT: int = 827 +const HBRDG0: int = 828 +const HBRDG1: int = 829 +const HBRDG2: int = 830 +const HBRDG3: int = 831 +const FOUNTAIN: int = 840 +const TINYEXP: int = 860 +const LASTTINYEXP: int = 867 +const FOOTBALLGAME1: int = 932 +const FOOTBALLGAME2: int = 940 +const VBRDG0: int = 948 +const VBRDG1: int = 949 +const VBRDG2: int = 950 +const VBRDG3: int = 951 + +# Special tiles +const TELEBASE: int = 948 # Network/telecom tower +const CHURCH1BASE: int = 418 +const CHURCH7LAST: int = 422 + +# ============================================================================= +# Zone Types +# ============================================================================= + +enum ZoneType { + RESIDENTIAL, + COMMERCIAL, + INDUSTRIAL, + NONE +} + +# ============================================================================= +# Tool Types +# ============================================================================= + +enum ToolType { + NONE, + BULLDOZER, + WIRE, + ROAD, + RAIL, + RESIDENTIAL, + COMMERCIAL, + INDUSTRIAL, + FIRE_STATION, + POLICE_STATION, + STADIUM, + PARK, + SEAPORT, + COAL_POWER, + NUCLEAR_POWER, + AIRPORT, + QUERY +} + +# Tool costs +const TOOL_COST: Dictionary = { + ToolType.BULLDOZER: 1, + ToolType.WIRE: 5, + ToolType.ROAD: 10, + ToolType.RAIL: 20, + ToolType.RESIDENTIAL: 100, + ToolType.COMMERCIAL: 100, + ToolType.INDUSTRIAL: 100, + ToolType.FIRE_STATION: 500, + ToolType.POLICE_STATION: 500, + ToolType.STADIUM: 5000, + ToolType.PARK: 10, + ToolType.SEAPORT: 3000, + ToolType.COAL_POWER: 3000, + ToolType.NUCLEAR_POWER: 5000, + ToolType.AIRPORT: 10000, + ToolType.QUERY: 0 +} + +# Tool sizes (width x height in tiles) +const TOOL_SIZE: Dictionary = { + ToolType.BULLDOZER: Vector2i(1, 1), + ToolType.WIRE: Vector2i(1, 1), + ToolType.ROAD: Vector2i(1, 1), + ToolType.RAIL: Vector2i(1, 1), + ToolType.RESIDENTIAL: Vector2i(3, 3), + ToolType.COMMERCIAL: Vector2i(3, 3), + ToolType.INDUSTRIAL: Vector2i(3, 3), + ToolType.FIRE_STATION: Vector2i(3, 3), + ToolType.POLICE_STATION: Vector2i(3, 3), + ToolType.STADIUM: Vector2i(4, 4), + ToolType.PARK: Vector2i(1, 1), + ToolType.SEAPORT: Vector2i(4, 4), + ToolType.COAL_POWER: Vector2i(4, 4), + ToolType.NUCLEAR_POWER: Vector2i(4, 4), + ToolType.AIRPORT: Vector2i(6, 6), + ToolType.QUERY: Vector2i(1, 1) +} + +# ============================================================================= +# Simulation Speed +# ============================================================================= + +enum SimSpeed { + PAUSED, + SLOW, + NORMAL, + FAST, + SUPER_FAST +} + +const SPEED_DELAYS: Dictionary = { + SimSpeed.PAUSED: 0, + SimSpeed.SLOW: 1, + SimSpeed.NORMAL: 2, + SimSpeed.FAST: 4, + SimSpeed.SUPER_FAST: 8 +} + +# ============================================================================= +# Disasters +# ============================================================================= + +enum DisasterType { + NONE, + FIRE, + FLOOD, + TORNADO, + EARTHQUAKE, + MONSTER, + MELTDOWN +} + +# ============================================================================= +# Map Overlay Types +# ============================================================================= + +enum MapOverlay { + NONE, + RESIDENTIAL, + COMMERCIAL, + INDUSTRIAL, + TRANSPORT, + POPULATION, + GROWTH_RATE, + POLLUTION, + CRIME, + LAND_VALUE, + FIRE_COVERAGE, + POLICE_COVERAGE, + POWER_GRID +} + +# ============================================================================= +# Utility Functions +# ============================================================================= + +## Get tile type from full tile value (strips flags) +static func get_tile_type(tile_value: int) -> int: + return tile_value & LOMASK + +## Check if tile has specific flag +static func has_flag(tile_value: int, flag: int) -> bool: + return (tile_value & flag) != 0 + +## Check if tile is powered +static func is_powered(tile_value: int) -> bool: + return has_flag(tile_value, PWRBIT) + +## Check if tile conducts power +static func conducts_power(tile_value: int) -> bool: + return has_flag(tile_value, CONDBIT) + +## Check if tile is a zone center +static func is_zone_center(tile_value: int) -> bool: + return has_flag(tile_value, ZONEBIT) + +## Check if tile is water +static func is_water(tile_type: int) -> bool: + return tile_type >= RIVER and tile_type <= LASTRIVEDGE + +## Check if tile is a road +static func is_road(tile_type: int) -> bool: + return tile_type >= ROADBASE and tile_type <= LASTROAD + +## Check if tile is a power line +static func is_power_line(tile_type: int) -> bool: + return tile_type >= POWERBASE and tile_type <= LASTPOWER + +## Check if tile is a rail +static func is_rail(tile_type: int) -> bool: + return tile_type >= RAILBASE and tile_type <= LASTRAIL + +## Check if tile is tree/woods +static func is_tree(tile_type: int) -> bool: + return tile_type >= WOODS_LOW and tile_type <= WOODS5 + +## Check if tile is rubble +static func is_rubble(tile_type: int) -> bool: + return tile_type >= RUBBLE and tile_type <= LASTRUBBLE + +## Check if tile is on fire +static func is_fire(tile_type: int) -> bool: + return tile_type >= FIRE and tile_type < FIRE + 8 + +## Get zone type from tile +static func get_zone_type(tile_type: int) -> ZoneType: + if tile_type >= RESBASE and tile_type < COMBASE: + return ZoneType.RESIDENTIAL + elif tile_type >= COMBASE and tile_type < INDBASE: + return ZoneType.COMMERCIAL + elif tile_type >= INDBASE and tile_type < PORTBASE: + return ZoneType.INDUSTRIAL + return ZoneType.NONE diff --git a/micropolis-godot/autoload/constants.gd.uid b/micropolis-godot/autoload/constants.gd.uid new file mode 100644 index 000000000..42bda94d9 --- /dev/null +++ b/micropolis-godot/autoload/constants.gd.uid @@ -0,0 +1 @@ +uid://b0oplu1kk81k8 diff --git a/micropolis-godot/autoload/game_manager.gd b/micropolis-godot/autoload/game_manager.gd new file mode 100644 index 000000000..427bbd471 --- /dev/null +++ b/micropolis-godot/autoload/game_manager.gd @@ -0,0 +1,53 @@ +## Game Manager - Global game state singleton +extends Node + +signal city_loaded(city_name: String) +signal funds_changed(amount: int) +signal date_changed(year: int, month: int) + +# Current city data +var city_name: String = "Unnamed City" +var total_funds: int = 20000 +var city_time: int = 0 # Weeks since start (Jan 1900) + +# Settings +var auto_bulldoze: bool = true +var auto_budget: bool = false +var disasters_enabled: bool = true +var sound_enabled: bool = true + +func _ready() -> void: + print("GameManager initialized") + +## Get current year (starts at 1900) +func get_year() -> int: + return 1900 + (city_time / 48) + +## Get current month (1-12) +func get_month() -> int: + return ((city_time % 48) / 4) + 1 + +## Get formatted date string +func get_date_string() -> String: + var months := ["Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + return "%s %d" % [months[get_month() - 1], get_year()] + +## Spend funds, returns true if successful +func spend(amount: int) -> bool: + if total_funds >= amount: + total_funds -= amount + funds_changed.emit(total_funds) + return true + return false + +## Add funds +func add_funds(amount: int) -> void: + total_funds += amount + funds_changed.emit(total_funds) + +## Advance time by one tick (called by simulation) +func advance_time() -> void: + city_time += 1 + if city_time % 4 == 0: # Monthly + date_changed.emit(get_year(), get_month()) diff --git a/micropolis-godot/autoload/game_manager.gd.uid b/micropolis-godot/autoload/game_manager.gd.uid new file mode 100644 index 000000000..d479ec0b3 --- /dev/null +++ b/micropolis-godot/autoload/game_manager.gd.uid @@ -0,0 +1 @@ +uid://8a4xt6t1swrf diff --git a/micropolis-godot/core/city_file_loader.gd b/micropolis-godot/core/city_file_loader.gd new file mode 100644 index 000000000..6ad47439d --- /dev/null +++ b/micropolis-godot/core/city_file_loader.gd @@ -0,0 +1,155 @@ +## CityFileLoader - Load .cty files (classic SimCity format) +## Based on micropolis-java FILE_FORMAT.txt +class_name CityFileLoader +extends RefCounted + +const HEADER_SIZE := 0x0C30 # 3120 bytes before map data +const MAP_DATA_SIZE := 24000 # 120 * 100 * 2 bytes + +# History arrays (each 240 entries of 16-bit values = 480 bytes) +const HISTORY_RES_OFFSET := 0x0000 +const HISTORY_COM_OFFSET := 0x01E0 +const HISTORY_IND_OFFSET := 0x03C0 +const HISTORY_CRIME_OFFSET := 0x05A0 +const HISTORY_POLLUTION_OFFSET := 0x0780 +const HISTORY_MONEY_OFFSET := 0x0960 + +# Miscellaneous values offset +const MISC_OFFSET := 0x0B40 + +# Map data starts here +const MAP_OFFSET := 0x0C30 + +## Load a .cty file into MapData +static func load_city(path: String, map_data: MapData) -> Dictionary: + var result := { + "success": false, + "error": "", + "city_time": 0, + "total_funds": 20000, + "tax_rate": 7, + "res_pop": 0, + "com_pop": 0, + "ind_pop": 0 + } + + var file := FileAccess.open(path, FileAccess.READ) + if file == null: + result.error = "Could not open file: %s" % path + return result + + var file_size := file.get_length() + if file_size < MAP_OFFSET + MAP_DATA_SIZE: + result.error = "File too small: %d bytes (expected at least %d)" % [file_size, MAP_OFFSET + MAP_DATA_SIZE] + file.close() + return result + + # Read miscellaneous values + file.seek(MISC_OFFSET) + var misc_data := file.get_buffer(240) # 120 16-bit values + + if misc_data.size() >= 120: + # Misc values are stored as 16-bit little-endian + result.res_pop = _read_int16(misc_data, 4) + result.com_pop = _read_int16(misc_data, 6) + result.ind_pop = _read_int16(misc_data, 8) + + # City time is 32-bit at offset 16-19 (indices 8-9 as 16-bit pairs) + result.city_time = _read_int16(misc_data, 16) | (_read_int16(misc_data, 18) << 16) + + # Total funds is 32-bit at offset 100-103 (indices 50-51) + result.total_funds = _read_int16(misc_data, 100) | (_read_int16(misc_data, 102) << 16) + + # Tax rate at offset 112 + result.tax_rate = _read_int16(misc_data, 112) + + # Read map data + file.seek(MAP_OFFSET) + + # Map is stored in COLUMN-MAJOR order (x varies slowly, y varies quickly) + for x in range(Constants.WORLD_W): + for y in range(Constants.WORLD_H): + var lo := file.get_8() + var hi := file.get_8() + var tile_value := lo | (hi << 8) + + # Strip the synthesized bits and keep only tile type + some flags + # The file stores CONDBIT, BURNBIT, BULLBIT, ANIMBIT, ZONEBIT + # but we derive these from tile properties + var tile_type := tile_value & Constants.LOMASK + + # Preserve power bit if set + var flags := tile_value & Constants.PWRBIT + + map_data.set_tile(x, y, tile_type | flags) + + file.close() + + result.success = true + return result + +## Read 16-bit little-endian integer from buffer +static func _read_int16(buffer: PackedByteArray, offset: int) -> int: + if offset + 1 >= buffer.size(): + return 0 + return buffer[offset] | (buffer[offset + 1] << 8) + +## Save map to .cty file +static func save_city(path: String, map_data: MapData, game_state: Dictionary) -> Dictionary: + var result := { + "success": false, + "error": "" + } + + var file := FileAccess.open(path, FileAccess.WRITE) + if file == null: + result.error = "Could not create file: %s" % path + return result + + # Write empty history (we don't track this yet) + var empty_history := PackedByteArray() + empty_history.resize(MISC_OFFSET) + empty_history.fill(0) + file.store_buffer(empty_history) + + # Write misc values + var misc := PackedByteArray() + misc.resize(240) + misc.fill(0) + + # Population values + _write_int16(misc, 4, game_state.get("res_pop", 0)) + _write_int16(misc, 6, game_state.get("com_pop", 0)) + _write_int16(misc, 8, game_state.get("ind_pop", 0)) + + # City time (32-bit) + var city_time: int = game_state.get("city_time", 0) + _write_int16(misc, 16, city_time & 0xFFFF) + _write_int16(misc, 18, (city_time >> 16) & 0xFFFF) + + # Total funds (32-bit) + var funds: int = game_state.get("total_funds", 20000) + _write_int16(misc, 100, funds & 0xFFFF) + _write_int16(misc, 102, (funds >> 16) & 0xFFFF) + + # Tax rate + _write_int16(misc, 112, game_state.get("tax_rate", 7)) + + file.store_buffer(misc) + + # Write map data (column-major order) + for x in range(Constants.WORLD_W): + for y in range(Constants.WORLD_H): + var tile_value := map_data.get_tile(x, y) + file.store_8(tile_value & 0xFF) + file.store_8((tile_value >> 8) & 0xFF) + + file.close() + + result.success = true + return result + +## Write 16-bit little-endian integer to buffer +static func _write_int16(buffer: PackedByteArray, offset: int, value: int) -> void: + buffer[offset] = value & 0xFF + buffer[offset + 1] = (value >> 8) & 0xFF diff --git a/micropolis-godot/core/city_file_loader.gd.uid b/micropolis-godot/core/city_file_loader.gd.uid new file mode 100644 index 000000000..7c37dc083 --- /dev/null +++ b/micropolis-godot/core/city_file_loader.gd.uid @@ -0,0 +1 @@ +uid://beryeys1h0tti diff --git a/micropolis-godot/core/map_data.gd b/micropolis-godot/core/map_data.gd new file mode 100644 index 000000000..7d7f2dca7 --- /dev/null +++ b/micropolis-godot/core/map_data.gd @@ -0,0 +1,204 @@ +## MapData - Core map storage class +## Holds tile data and overlay grids +class_name MapData +extends RefCounted + +signal tile_changed(x: int, y: int, new_value: int) +signal map_changed() + +# Full resolution map (120x100 tiles) +var tiles: PackedInt32Array +var power_grid: PackedByteArray # Boolean: is tile powered? + +# Half-size overlays (60x50) - one value per 2x2 block +var land_value: PackedByteArray +var pollution: PackedByteArray +var crime: PackedByteArray +var pop_density: PackedByteArray +var traffic_density: PackedByteArray + +# Quarter-size overlays (30x25) - one value per 4x4 block +var terrain: PackedByteArray + +# Eighth-size overlays (15x13) - one value per 8x8 block +var rate_of_growth: PackedByteArray +var fire_coverage: PackedByteArray +var police_coverage: PackedByteArray +var com_rate: PackedByteArray + +func _init() -> void: + _allocate_arrays() + +func _allocate_arrays() -> void: + var full_size := Constants.WORLD_W * Constants.WORLD_H + var half_size := Constants.WORLD_W_2 * Constants.WORLD_H_2 + var quarter_size := Constants.WORLD_W_4 * Constants.WORLD_H_4 + var eighth_size := Constants.WORLD_W_8 * Constants.WORLD_H_8 + + tiles.resize(full_size) + power_grid.resize(full_size) + + land_value.resize(half_size) + pollution.resize(half_size) + crime.resize(half_size) + pop_density.resize(half_size) + traffic_density.resize(half_size) + + terrain.resize(quarter_size) + + rate_of_growth.resize(eighth_size) + fire_coverage.resize(eighth_size) + police_coverage.resize(eighth_size) + com_rate.resize(eighth_size) + + # Initialize to dirt + tiles.fill(Constants.DIRT) + power_grid.fill(0) + +## Clear map to all dirt +func clear() -> void: + tiles.fill(Constants.DIRT) + power_grid.fill(0) + land_value.fill(0) + pollution.fill(0) + crime.fill(0) + pop_density.fill(0) + traffic_density.fill(0) + terrain.fill(0) + rate_of_growth.fill(0) + fire_coverage.fill(0) + police_coverage.fill(0) + com_rate.fill(0) + map_changed.emit() + +# ============================================================================= +# Tile Access (Full Resolution) +# ============================================================================= + +func _idx(x: int, y: int) -> int: + return y * Constants.WORLD_W + x + +func is_valid(x: int, y: int) -> bool: + return x >= 0 and x < Constants.WORLD_W and y >= 0 and y < Constants.WORLD_H + +func get_tile(x: int, y: int) -> int: + if not is_valid(x, y): + return -1 + return tiles[_idx(x, y)] + +func get_tile_type(x: int, y: int) -> int: + var tile := get_tile(x, y) + if tile < 0: + return -1 + return tile & Constants.LOMASK + +func set_tile(x: int, y: int, value: int) -> void: + if not is_valid(x, y): + return + var idx := _idx(x, y) + if tiles[idx] != value: + tiles[idx] = value + tile_changed.emit(x, y, value) + +func set_tile_type(x: int, y: int, tile_type: int, preserve_flags: bool = false) -> void: + if not is_valid(x, y): + return + var idx := _idx(x, y) + var old_value := tiles[idx] + var new_value: int + if preserve_flags: + new_value = (old_value & Constants.ALLBITS) | (tile_type & Constants.LOMASK) + else: + new_value = tile_type & Constants.LOMASK + if tiles[idx] != new_value: + tiles[idx] = new_value + tile_changed.emit(x, y, new_value) + +func is_powered(x: int, y: int) -> bool: + if not is_valid(x, y): + return false + return power_grid[_idx(x, y)] != 0 + +func set_powered(x: int, y: int, powered: bool) -> void: + if not is_valid(x, y): + return + power_grid[_idx(x, y)] = 1 if powered else 0 + +# ============================================================================= +# Half-Size Overlay Access (2x2 blocks) +# ============================================================================= + +func _idx2(x: int, y: int) -> int: + return (y / 2) * Constants.WORLD_W_2 + (x / 2) + +func get_land_value(x: int, y: int) -> int: + if not is_valid(x, y): + return 0 + return land_value[_idx2(x, y)] + +func set_land_value(x: int, y: int, value: int) -> void: + if not is_valid(x, y): + return + land_value[_idx2(x, y)] = clampi(value, 0, 255) + +func get_pollution(x: int, y: int) -> int: + if not is_valid(x, y): + return 0 + return pollution[_idx2(x, y)] + +func set_pollution(x: int, y: int, value: int) -> void: + if not is_valid(x, y): + return + pollution[_idx2(x, y)] = clampi(value, 0, 255) + +func get_crime(x: int, y: int) -> int: + if not is_valid(x, y): + return 0 + return crime[_idx2(x, y)] + +func set_crime(x: int, y: int, value: int) -> void: + if not is_valid(x, y): + return + crime[_idx2(x, y)] = clampi(value, 0, 255) + +func get_pop_density(x: int, y: int) -> int: + if not is_valid(x, y): + return 0 + return pop_density[_idx2(x, y)] + +func set_pop_density(x: int, y: int, value: int) -> void: + if not is_valid(x, y): + return + pop_density[_idx2(x, y)] = clampi(value, 0, 255) + +func get_traffic(x: int, y: int) -> int: + if not is_valid(x, y): + return 0 + return traffic_density[_idx2(x, y)] + +func set_traffic(x: int, y: int, value: int) -> void: + if not is_valid(x, y): + return + traffic_density[_idx2(x, y)] = clampi(value, 0, 255) + +# ============================================================================= +# Eighth-Size Overlay Access (8x8 blocks) +# ============================================================================= + +func _idx8(x: int, y: int) -> int: + return (y / 8) * Constants.WORLD_W_8 + (x / 8) + +func get_fire_coverage(x: int, y: int) -> int: + if not is_valid(x, y): + return 0 + return fire_coverage[_idx8(x, y)] + +func get_police_coverage(x: int, y: int) -> int: + if not is_valid(x, y): + return 0 + return police_coverage[_idx8(x, y)] + +func get_growth_rate(x: int, y: int) -> int: + if not is_valid(x, y): + return 0 + return rate_of_growth[_idx8(x, y)] diff --git a/micropolis-godot/core/map_data.gd.uid b/micropolis-godot/core/map_data.gd.uid new file mode 100644 index 000000000..d7f3bb6de --- /dev/null +++ b/micropolis-godot/core/map_data.gd.uid @@ -0,0 +1 @@ +uid://7q6rxbhigffq diff --git a/micropolis-godot/core/simulation.gd b/micropolis-godot/core/simulation.gd new file mode 100644 index 000000000..d7db294db --- /dev/null +++ b/micropolis-godot/core/simulation.gd @@ -0,0 +1,417 @@ +## Simulation Engine - Main simulation loop +## Ported from micropolis-java Micropolis.java +extends Node + +signal city_message(message: String, location: Vector2i) +signal census_changed() +signal demand_changed() +signal evaluation_changed() +signal power_grid_changed() + +# Map data +var map_data: MapData + +# Simulation state +var running: bool = false +var speed: Constants.SimSpeed = Constants.SimSpeed.NORMAL +var cycle_count: int = 0 +var phase: int = 0 # 0-15 phases per cycle + +# Census counters (reset each cycle) +var res_pop: int = 0 +var com_pop: int = 0 +var ind_pop: int = 0 +var res_zone_count: int = 0 +var com_zone_count: int = 0 +var ind_zone_count: int = 0 +var road_total: int = 0 +var rail_total: int = 0 +var fire_station_count: int = 0 +var police_station_count: int = 0 +var hospital_count: int = 0 +var powered_zone_count: int = 0 +var unpowered_zone_count: int = 0 + +# Demand valves (-2000 to 2000) +var res_valve: int = 0 +var com_valve: int = 0 +var ind_valve: int = 0 + +# Averages +var land_value_avg: int = 0 +var crime_avg: int = 0 +var pollution_avg: int = 0 + +# City center (weighted by population) +var city_center: Vector2i = Vector2i(60, 50) + +# Accumulated time for fixed timestep +var _time_accumulator: float = 0.0 +const TICK_RATE: float = 1.0 / 30.0 # 30 simulation ticks per second at normal speed + +func _ready() -> void: + map_data = MapData.new() + print("Simulation engine initialized") + +func _process(delta: float) -> void: + if not running or speed == Constants.SimSpeed.PAUSED: + return + + _time_accumulator += delta + + # How many ticks to run based on speed + var ticks_per_frame: int = Constants.SPEED_DELAYS.get(speed, 1) + var tick_delta: float = TICK_RATE / float(ticks_per_frame) + + while _time_accumulator >= tick_delta: + _time_accumulator -= tick_delta + _simulation_tick() + +func _simulation_tick() -> void: + # The simulation runs in 16 phases per cycle + phase = cycle_count % 16 + + match phase: + 0: + _phase_init() + 1, 2, 3, 4, 5, 6, 7, 8: + _phase_map_scan(phase - 1) + 9: + _phase_census() + 10: + _phase_decay() + 11: + _phase_power_scan() + 12: + _phase_pollution_scan() + 13: + _phase_crime_scan() + 14: + _phase_pop_density_scan() + 15: + _phase_fire_analysis() + + cycle_count += 1 + +## Phase 0: Initialize cycle, update time +func _phase_init() -> void: + # Every 16 phases = 1 city time tick + if cycle_count > 0 and cycle_count % 16 == 0: + GameManager.advance_time() + + # Clear census counters + res_pop = 0 + com_pop = 0 + ind_pop = 0 + res_zone_count = 0 + com_zone_count = 0 + ind_zone_count = 0 + road_total = 0 + rail_total = 0 + fire_station_count = 0 + police_station_count = 0 + hospital_count = 0 + powered_zone_count = 0 + unpowered_zone_count = 0 + +## Phases 1-8: Scan map in 8 horizontal bands +func _phase_map_scan(band: int) -> void: + var start_x := band * 15 # 120 / 8 = 15 columns per band + var end_x := mini(start_x + 15, Constants.WORLD_W) + + for x in range(start_x, end_x): + for y in range(Constants.WORLD_H): + _process_tile(x, y) + +## Process a single tile during map scan +func _process_tile(x: int, y: int) -> void: + var tile := map_data.get_tile(x, y) + var tile_type := tile & Constants.LOMASK + + # Count infrastructure + if Constants.is_road(tile_type): + road_total += 1 + elif Constants.is_rail(tile_type): + rail_total += 1 + + # Process zone centers + if tile & Constants.ZONEBIT: + _process_zone(x, y, tile_type) + +## Process a zone center tile +func _process_zone(x: int, y: int, tile_type: int) -> void: + var is_powered := map_data.is_powered(x, y) + + if is_powered: + powered_zone_count += 1 + else: + unpowered_zone_count += 1 + + # Identify zone type and count population + var zone_type := Constants.get_zone_type(tile_type) + + match zone_type: + Constants.ZoneType.RESIDENTIAL: + res_zone_count += 1 + res_pop += _get_zone_population(tile_type) + Constants.ZoneType.COMMERCIAL: + com_zone_count += 1 + com_pop += _get_zone_population(tile_type) + Constants.ZoneType.INDUSTRIAL: + ind_zone_count += 1 + ind_pop += _get_zone_population(tile_type) + +## Get population value from zone tile +func _get_zone_population(tile_type: int) -> int: + # Simplified - actual logic depends on zone level + var zone_type := Constants.get_zone_type(tile_type) + match zone_type: + Constants.ZoneType.RESIDENTIAL: + if tile_type == Constants.RESCLR: + return 0 + elif tile_type >= Constants.HOUSE and tile_type < Constants.HOUSE + 9: + return (tile_type - Constants.HOUSE) + 1 + else: + return 16 # Developed zone + Constants.ZoneType.COMMERCIAL: + if tile_type == Constants.COMCLR: + return 0 + else: + return 8 + Constants.ZoneType.INDUSTRIAL: + if tile_type == Constants.INDCLR: + return 0 + else: + return 8 + return 0 + +## Phase 9: Collect census data +func _phase_census() -> void: + # Update demand valves based on population + _update_demand_valves() + census_changed.emit() + +## Update RCI demand valves +func _update_demand_valves() -> void: + # Simplified demand calculation + var total_pop := res_pop + com_pop + ind_pop + + # Residential demand based on jobs available + var employment := com_pop + ind_pop + if total_pop > 0: + res_valve = clampi((employment * 8) - res_pop, -2000, 2000) + else: + res_valve = 500 # Starting demand + + # Commercial demand based on population + if res_pop > 0: + com_valve = clampi((res_pop / 8) - com_pop, -1500, 1500) + else: + com_valve = 0 + + # Industrial demand (external market simulation) + ind_valve = clampi(500 - ind_pop, -1500, 1500) + + demand_changed.emit() + +## Phase 10: Decay traffic density, etc. +func _phase_decay() -> void: + # Decay traffic density over time + for i in range(map_data.traffic_density.size()): + if map_data.traffic_density[i] > 0: + map_data.traffic_density[i] = maxi(0, map_data.traffic_density[i] - 2) + +## Phase 11: Power grid propagation +func _phase_power_scan() -> void: + # Clear power grid + map_data.power_grid.fill(0) + + # Find power plants and propagate power + for x in range(Constants.WORLD_W): + for y in range(Constants.WORLD_H): + var tile := map_data.get_tile(x, y) + var tile_type := tile & Constants.LOMASK + + # Check if this is a power plant + if tile_type == Constants.POWERPLANT or tile_type == Constants.NUCLEAR: + _propagate_power(x, y) + + power_grid_changed.emit() + +## Flood-fill power from a power source +func _propagate_power(start_x: int, start_y: int) -> void: + var queue: Array[Vector2i] = [Vector2i(start_x, start_y)] + var visited: Dictionary = {} + + while queue.size() > 0: + var pos: Vector2i = queue.pop_front() + var key: int = pos.x * 1000 + pos.y + + if visited.has(key): + continue + visited[key] = true + + var tile := map_data.get_tile(pos.x, pos.y) + if tile < 0: + continue + + var tile_type := tile & Constants.LOMASK + + # Check if tile conducts power + var conducts := Constants.is_power_line(tile_type) or \ + Constants.is_road(tile_type) or \ + Constants.is_rail(tile_type) or \ + (tile & Constants.ZONEBIT) != 0 + + if not conducts and tile_type != Constants.POWERPLANT and tile_type != Constants.NUCLEAR: + continue + + # Power this tile + map_data.set_powered(pos.x, pos.y, true) + + # Add neighbors to queue + for offset: Vector2i in [Vector2i(-1, 0), Vector2i(1, 0), Vector2i(0, -1), Vector2i(0, 1)]: + var next: Vector2i = pos + offset + if map_data.is_valid(next.x, next.y): + queue.append(next) + +## Phase 12: Calculate pollution +func _phase_pollution_scan() -> void: + # Simplified pollution calculation + var total_pollution := 0 + var count := 0 + + for x in range(0, Constants.WORLD_W, 2): + for y in range(0, Constants.WORLD_H, 2): + var pollution_val := 0 + + # Industrial zones cause pollution + var tile_type := map_data.get_tile_type(x, y) + if tile_type >= Constants.INDBASE and tile_type < Constants.PORTBASE: + pollution_val += 20 + + # Traffic causes pollution + pollution_val += map_data.get_traffic(x, y) / 4 + + map_data.set_pollution(x, y, pollution_val) + total_pollution += pollution_val + count += 1 + + if count > 0: + pollution_avg = total_pollution / count + +## Phase 13: Calculate crime +func _phase_crime_scan() -> void: + # Simplified crime calculation + var total_crime := 0 + var count := 0 + + for x in range(0, Constants.WORLD_W, 2): + for y in range(0, Constants.WORLD_H, 2): + var crime_val := 0 + + # Base crime from population density + crime_val = map_data.get_pop_density(x, y) / 2 + + # Reduce by land value + crime_val -= map_data.get_land_value(x, y) / 4 + + # Reduce by police coverage + crime_val -= map_data.get_police_coverage(x, y) + + crime_val = maxi(0, crime_val) + map_data.set_crime(x, y, crime_val) + total_crime += crime_val + count += 1 + + if count > 0: + crime_avg = total_crime / count + +## Phase 14: Calculate population density +func _phase_pop_density_scan() -> void: + # Calculate population density from zones + for x in range(0, Constants.WORLD_W, 2): + for y in range(0, Constants.WORLD_H, 2): + var density := 0 + + # Sample 2x2 area + for dx in range(2): + for dy in range(2): + var tile := map_data.get_tile(x + dx, y + dy) + if tile > 0 and (tile & Constants.ZONEBIT): + var tile_type := tile & Constants.LOMASK + density += _get_zone_population(tile_type) + + map_data.set_pop_density(x, y, mini(density * 4, 255)) + +## Phase 15: Fire station and disaster analysis +func _phase_fire_analysis() -> void: + # Update fire coverage from fire stations + map_data.fire_coverage.fill(0) + + for x in range(Constants.WORLD_W): + for y in range(Constants.WORLD_H): + var tile_type := map_data.get_tile_type(x, y) + if tile_type == Constants.FIRESTATION: + _add_fire_coverage(x, y, 100) + fire_station_count += 1 + +func _add_fire_coverage(center_x: int, center_y: int, amount: int) -> void: + # Add coverage in a radius around fire station + for dx in range(-8, 9): + for dy in range(-8, 9): + var x := center_x + dx + var y := center_y + dy + if not map_data.is_valid(x, y): + continue + var dist := absi(dx) + absi(dy) + if dist <= 8: + var coverage := amount - (dist * 10) + if coverage > 0: + var idx := (y / 8) * Constants.WORLD_W_8 + (x / 8) + if idx < map_data.fire_coverage.size(): + map_data.fire_coverage[idx] = mini(255, map_data.fire_coverage[idx] + coverage) + +# ============================================================================= +# Public API +# ============================================================================= + +## Start simulation +func start() -> void: + running = true + +## Pause simulation +func pause() -> void: + running = false + +## Toggle pause +func toggle_pause() -> void: + running = not running + +## Set simulation speed +func set_speed(new_speed: Constants.SimSpeed) -> void: + speed = new_speed + +## Load a city file +func load_city(path: String) -> bool: + var result := CityFileLoader.load_city(path, map_data) + if result.success: + GameManager.city_time = result.city_time + GameManager.total_funds = result.total_funds + map_data.map_changed.emit() + print("City loaded: %s" % path) + return true + else: + push_error("Failed to load city: %s" % result.error) + return false + +## Generate a new empty city +func new_city() -> void: + map_data.clear() + GameManager.city_time = 0 + GameManager.total_funds = 20000 + cycle_count = 0 + phase = 0 + res_valve = 0 + com_valve = 0 + ind_valve = 0 diff --git a/micropolis-godot/core/simulation.gd.uid b/micropolis-godot/core/simulation.gd.uid new file mode 100644 index 000000000..37c26ff30 --- /dev/null +++ b/micropolis-godot/core/simulation.gd.uid @@ -0,0 +1 @@ +uid://bp1p3wdlcdw7m diff --git a/micropolis-godot/icon.svg b/micropolis-godot/icon.svg new file mode 100644 index 000000000..9cc0d6abb --- /dev/null +++ b/micropolis-godot/icon.svg @@ -0,0 +1,9 @@ + + + + + + + + MICROPOLIS + diff --git a/micropolis-godot/icon.svg.import b/micropolis-godot/icon.svg.import new file mode 100644 index 000000000..09beb7d13 --- /dev/null +++ b/micropolis-godot/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgedd3eh2wwuq" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/micropolis-godot/project.godot b/micropolis-godot/project.godot new file mode 100644 index 000000000..fcb8dc94f --- /dev/null +++ b/micropolis-godot/project.godot @@ -0,0 +1,65 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; but we're bootstrapping here. + +config_version=5 + +[application] + +config/name="Micropolis" +run/main_scene="res://scenes/main.tscn" +config/features=PackedStringArray("4.2", "Forward Plus") +config/icon="res://icon.svg" + +[autoload] + +Constants="*res://autoload/constants.gd" +GameManager="*res://autoload/game_manager.gd" +Simulation="*res://core/simulation.gd" + +[display] + +window/size/viewport_width=1280 +window/size/viewport_height=720 +window/stretch/mode="canvas_items" + +[input] + +pan_up={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +pan_down={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +pan_left={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +pan_right={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +zoom_in={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +zoom_out={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} + +[rendering] + +renderer/rendering_method="gl_compatibility" diff --git a/micropolis-godot/scenes/city_view.gd b/micropolis-godot/scenes/city_view.gd new file mode 100644 index 000000000..90245724d --- /dev/null +++ b/micropolis-godot/scenes/city_view.gd @@ -0,0 +1,151 @@ +## CityView - TileMap-based city renderer +extends Node2D + +@onready var tile_map: TileMap = $TileMap +@onready var camera: Camera2D = $Camera2D + +# Camera settings +const PAN_SPEED: float = 500.0 +const ZOOM_SPEED: float = 0.1 +const MIN_ZOOM: float = 0.25 +const MAX_ZOOM: float = 2.0 + +# Tile atlas configuration +# tiles.png is 16x15360 = single column of 960 tiles (16x16 each) +const TILES_PER_ROW: int = 1 +const TOTAL_TILES: int = 960 + +var _dragging: bool = false +var _drag_start: Vector2 + +func _ready() -> void: + # Setup the TileSet programmatically for our 960-tile column + _setup_tileset() + + # Connect to map data signals + if Simulation.map_data: + Simulation.map_data.tile_changed.connect(_on_tile_changed) + Simulation.map_data.map_changed.connect(_on_map_changed) + # Initial map render + call_deferred("refresh_map") + + # Center camera on map + var map_center := Vector2( + Constants.WORLD_W * Constants.TILE_SIZE / 2, + Constants.WORLD_H * Constants.TILE_SIZE / 2 + ) + camera.position = map_center + +func _setup_tileset() -> void: + # Load the tiles texture + var tiles_texture: Texture2D = load("res://assets/graphics/tiles.png") + if not tiles_texture: + push_error("Failed to load tiles.png") + return + + # Create new TileSet + var tileset := TileSet.new() + tileset.tile_size = Vector2i(Constants.TILE_SIZE, Constants.TILE_SIZE) + + # Create atlas source + var atlas := TileSetAtlasSource.new() + atlas.texture = tiles_texture + atlas.texture_region_size = Vector2i(Constants.TILE_SIZE, Constants.TILE_SIZE) + + # Add all tiles in the single column (960 tiles, each at column 0) + for i: int in range(TOTAL_TILES): + var coords := Vector2i(0, i) + atlas.create_tile(coords) + + # Add atlas to tileset + tileset.add_source(atlas, 0) + + # Apply to TileMap + tile_map.tile_set = tileset + +func _process(delta: float) -> void: + _handle_camera_input(delta) + +func _handle_camera_input(delta: float) -> void: + # Keyboard panning + var pan_dir := Vector2.ZERO + if Input.is_action_pressed("pan_up"): + pan_dir.y -= 1 + if Input.is_action_pressed("pan_down"): + pan_dir.y += 1 + if Input.is_action_pressed("pan_left"): + pan_dir.x -= 1 + if Input.is_action_pressed("pan_right"): + pan_dir.x += 1 + + if pan_dir != Vector2.ZERO: + camera.position += pan_dir.normalized() * PAN_SPEED * delta / camera.zoom.x + +func _unhandled_input(event: InputEvent) -> void: + # Mouse wheel zoom + if event.is_action_pressed("zoom_in"): + _zoom(ZOOM_SPEED) + elif event.is_action_pressed("zoom_out"): + _zoom(-ZOOM_SPEED) + + # Middle mouse drag to pan + if event is InputEventMouseButton: + if event.button_index == MOUSE_BUTTON_MIDDLE: + _dragging = event.pressed + _drag_start = event.position + + if event is InputEventMouseMotion and _dragging: + var motion_event := event as InputEventMouseMotion + var delta: Vector2 = motion_event.position - _drag_start + camera.position -= delta / camera.zoom.x + _drag_start = event.position + +func _zoom(amount: float) -> void: + var new_zoom := clampf(camera.zoom.x + amount, MIN_ZOOM, MAX_ZOOM) + camera.zoom = Vector2(new_zoom, new_zoom) + +## Refresh entire map display +func refresh_map() -> void: + if not Simulation.map_data: + return + + for x in range(Constants.WORLD_W): + for y in range(Constants.WORLD_H): + _update_tile(x, y) + +## Update a single tile display +func _update_tile(x: int, y: int) -> void: + var tile_value: int = Simulation.map_data.get_tile(x, y) + var tile_type: int = tile_value & Constants.LOMASK + + # Convert tile type to atlas coordinates + var atlas_coords := _tile_to_atlas(tile_type) + + # Set the tile in the TileMap + tile_map.set_cell(0, Vector2i(x, y), 0, atlas_coords) + +## Convert tile type to atlas coordinates +func _tile_to_atlas(tile_type: int) -> Vector2i: + # tiles.png is a single column, so tile N is at (0, N) + # Clamp to valid range + var clamped_tile := clampi(tile_type, 0, TOTAL_TILES - 1) + return Vector2i(0, clamped_tile) + +## Get world position from screen position +func screen_to_world(screen_pos: Vector2) -> Vector2: + return camera.get_canvas_transform().affine_inverse() * screen_pos + +## Get tile coordinates from screen position +func screen_to_tile(screen_pos: Vector2) -> Vector2i: + var world_pos := screen_to_world(screen_pos) + return Vector2i( + int(world_pos.x / Constants.TILE_SIZE), + int(world_pos.y / Constants.TILE_SIZE) + ) + +## Signal handlers +func _on_tile_changed(x: int, y: int, _new_value: int) -> void: + _update_tile(x, y) + +func _on_map_changed() -> void: + refresh_map() diff --git a/micropolis-godot/scenes/city_view.gd.uid b/micropolis-godot/scenes/city_view.gd.uid new file mode 100644 index 000000000..fbe579adb --- /dev/null +++ b/micropolis-godot/scenes/city_view.gd.uid @@ -0,0 +1 @@ +uid://gejlcd5h0lvl diff --git a/micropolis-godot/scenes/city_view.tscn b/micropolis-godot/scenes/city_view.tscn new file mode 100644 index 000000000..a99a48d7a --- /dev/null +++ b/micropolis-godot/scenes/city_view.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=2 format=3 uid="uid://c3city_view"] + +[ext_resource type="Script" path="res://scenes/city_view.gd" id="1_cityview"] + +[node name="CityView" type="Node2D"] +script = ExtResource("1_cityview") + +[node name="TileMap" type="TileMap" parent="."] +format = 2 + +[node name="Camera2D" type="Camera2D" parent="."] +position = Vector2(960, 800) +zoom = Vector2(1, 1) diff --git a/micropolis-godot/scenes/main.gd b/micropolis-godot/scenes/main.gd new file mode 100644 index 000000000..8fe62226b --- /dev/null +++ b/micropolis-godot/scenes/main.gd @@ -0,0 +1,119 @@ +## Main Game Scene Controller +extends Control + +@onready var city_view: Node2D = $CityView +@onready var hud: Control = $HUD +@onready var funds_label: Label = $HUD/TopBar/FundsLabel +@onready var date_label: Label = $HUD/TopBar/DateLabel +@onready var speed_label: Label = $HUD/TopBar/SpeedLabel +@onready var pop_label: Label = $HUD/TopBar/PopLabel +@onready var file_dialog: FileDialog = $FileDialog + +var current_tool: Constants.ToolType = Constants.ToolType.NONE + +func _ready() -> void: + # Connect signals + GameManager.funds_changed.connect(_on_funds_changed) + GameManager.date_changed.connect(_on_date_changed) + Simulation.census_changed.connect(_on_census_changed) + Simulation.demand_changed.connect(_on_demand_changed) + + # Initial UI update + _update_hud() + + # Check for command line args to auto-load a city + var args := OS.get_cmdline_args() + for arg in args: + if arg.ends_with(".cty"): + _load_city(arg) + return + + # Try to load a default city for testing + var default_city := "res://assets/cities/haight.cty" + if FileAccess.file_exists(default_city): + _load_city(default_city) + else: + # Generate empty city + Simulation.new_city() + city_view.refresh_map() + +func _input(event: InputEvent) -> void: + # Keyboard shortcuts + if event is InputEventKey and event.pressed: + match event.keycode: + KEY_SPACE: + Simulation.toggle_pause() + _update_speed_display() + KEY_1: + Simulation.set_speed(Constants.SimSpeed.SLOW) + _update_speed_display() + KEY_2: + Simulation.set_speed(Constants.SimSpeed.NORMAL) + _update_speed_display() + KEY_3: + Simulation.set_speed(Constants.SimSpeed.FAST) + _update_speed_display() + KEY_4: + Simulation.set_speed(Constants.SimSpeed.SUPER_FAST) + _update_speed_display() + KEY_O: + if event.ctrl_pressed: + _show_open_dialog() + KEY_N: + if event.ctrl_pressed: + _new_city() + KEY_ESCAPE: + # Could show pause menu + pass + +func _update_hud() -> void: + funds_label.text = "$%d" % GameManager.total_funds + date_label.text = GameManager.get_date_string() + _update_speed_display() + _update_population_display() + +func _update_speed_display() -> void: + var speed_names := ["Paused", "Slow", "Normal", "Fast", "Ultra"] + var speed_idx := Simulation.speed as int + if not Simulation.running: + speed_label.text = "⏸ Paused" + else: + speed_label.text = "▶ " + speed_names[speed_idx] + +func _update_population_display() -> void: + var total: int = Simulation.res_pop + Simulation.com_pop + Simulation.ind_pop + pop_label.text = "Pop: %d" % total + +func _on_funds_changed(amount: int) -> void: + funds_label.text = "$%d" % amount + +func _on_date_changed(_year: int, _month: int) -> void: + date_label.text = GameManager.get_date_string() + +func _on_census_changed() -> void: + _update_population_display() + +func _on_demand_changed() -> void: + # Could update RCI demand display here + pass + +func _show_open_dialog() -> void: + file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE + file_dialog.filters = ["*.cty ; City Files"] + file_dialog.current_dir = "res://assets/cities" + file_dialog.popup_centered(Vector2i(600, 400)) + +func _load_city(path: String) -> void: + if Simulation.load_city(path): + city_view.refresh_map() + Simulation.start() + _update_hud() + +func _new_city() -> void: + Simulation.new_city() + city_view.refresh_map() + Simulation.start() + _update_hud() + +func _on_file_dialog_file_selected(path: String) -> void: + _load_city(path) diff --git a/micropolis-godot/scenes/main.gd.uid b/micropolis-godot/scenes/main.gd.uid new file mode 100644 index 000000000..8a519fba9 --- /dev/null +++ b/micropolis-godot/scenes/main.gd.uid @@ -0,0 +1 @@ +uid://bklqn7yr434ff diff --git a/micropolis-godot/scenes/main.tscn b/micropolis-godot/scenes/main.tscn new file mode 100644 index 000000000..7207651ec --- /dev/null +++ b/micropolis-godot/scenes/main.tscn @@ -0,0 +1,80 @@ +[gd_scene load_steps=3 format=3 uid="uid://main_scene"] + +[ext_resource type="Script" path="res://scenes/main.gd" id="1_main"] +[ext_resource type="PackedScene" path="res://scenes/city_view.tscn" id="2_cityview"] + +[node name="Main" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_main") + +[node name="CityView" parent="." instance=ExtResource("2_cityview")] + +[node name="HUD" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="TopBar" type="HBoxContainer" parent="HUD"] +layout_mode = 1 +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 32.0 +grow_horizontal = 2 +theme_override_constants/separation = 20 + +[node name="PanelContainer" type="PanelContainer" parent="HUD/TopBar"] +layout_mode = 2 + +[node name="FundsLabel" type="Label" parent="HUD/TopBar"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "$20,000" + +[node name="DateLabel" type="Label" parent="HUD/TopBar"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "Jan 1900" + +[node name="SpeedLabel" type="Label" parent="HUD/TopBar"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "▶ Normal" + +[node name="PopLabel" type="Label" parent="HUD/TopBar"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 18 +text = "Pop: 0" + +[node name="Spacer" type="Control" parent="HUD/TopBar"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="HelpLabel" type="Label" parent="HUD/TopBar"] +layout_mode = 2 +theme_override_font_sizes/font_size = 14 +text = "WASD/Arrows: Pan | Scroll: Zoom | Space: Pause | 1-4: Speed | Ctrl+O: Open" + +[node name="FileDialog" type="FileDialog" parent="."] +unique_name_in_owner = true +title = "Open City" +initial_position = 2 +size = Vector2i(600, 400) +ok_button_text = "Open" +file_mode = 0 +access = 2 +filters = PackedStringArray("*.cty ; City Files") + +[connection signal="file_selected" from="FileDialog" to="." method="_on_file_dialog_file_selected"] diff --git a/micropolis-java/build.xml b/micropolis-java/build.xml index 6d64d40a8..5ea4b6965 100644 --- a/micropolis-java/build.xml +++ b/micropolis-java/build.xml @@ -77,7 +77,7 @@ classpathref="build-classpath" includeantruntime="false" debug="true" debuglevel="lines,vars,source" - source="1.6" target="1.6" + source="1.8" target="1.8" > From ac00b6f889b45c5e6484c4b05c6ef36d885e87d3 Mon Sep 17 00:00:00 2001 From: Xanderful Date: Wed, 1 Apr 2026 02:33:23 +0000 Subject: [PATCH 02/13] fix: bug-fix iteration 1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I wasn't able to complete that request. The required plugin may not be configured. You can check available plugins in Settings → Plugins. --- .ph-constructor/build_log.jsonl | 1 + .ph-constructor/codebase_knowledge.json | 4130 +++++++++++++++++ .sentrux/baseline.json | 12 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 153 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 159 bytes ...t_controllers.cpython-311-pytest-9.0.2.pyc | Bin 0 -> 4903 bytes .../test_model.cpython-311-pytest-9.0.2.pyc | Bin 0 -> 4630 bytes 7 files changed, 4143 insertions(+) create mode 100644 .ph-constructor/build_log.jsonl create mode 100644 .ph-constructor/codebase_knowledge.json create mode 100644 .sentrux/baseline.json create mode 100644 turbogears/micropolis/__pycache__/__init__.cpython-311.pyc create mode 100644 turbogears/micropolis/tests/__pycache__/__init__.cpython-311.pyc create mode 100644 turbogears/micropolis/tests/__pycache__/test_controllers.cpython-311-pytest-9.0.2.pyc create mode 100644 turbogears/micropolis/tests/__pycache__/test_model.cpython-311-pytest-9.0.2.pyc diff --git a/.ph-constructor/build_log.jsonl b/.ph-constructor/build_log.jsonl new file mode 100644 index 000000000..7d49f711f --- /dev/null +++ b/.ph-constructor/build_log.jsonl @@ -0,0 +1 @@ +{"ts": "2026-04-01T02:32:50.851325+00:00", "event": "bugfix_start", "data": {"max_iterations": 10}} diff --git a/.ph-constructor/codebase_knowledge.json b/.ph-constructor/codebase_knowledge.json new file mode 100644 index 000000000..d6b254ecd --- /dev/null +++ b/.ph-constructor/codebase_knowledge.json @@ -0,0 +1,4130 @@ +{ + "project_root": "/home/joseph/Phoenix-Construction/projects/micropolis", + "scanned_at": "2026-04-01T02:32:50.107857+00:00", + "summary": { + "total_files": 471, + "total_code_files": 419, + "total_test_files": 9, + "total_lines": 227384, + "languages": { + "C++": 36, + "Python": 73, + "C Header": 44, + "C#": 24, + "C": 172, + "Java": 62, + "JavaScript": 7, + "PHP": 1 + }, + "primary_language": "C" + }, + "modules": [ + { + "path": "MicropolisCore/src/CellEngine/src/ruletables.cpp", + "lines": 6570 + }, + { + "path": "MicropolisCore/src/CellEngine/src/cellengine.cpp", + "lines": 5685 + }, + { + "path": "turbogears/micropolis/htdocs/static/javascript/all_pretty.js", + "lines": 3988 + }, + { + "path": "micropolis-activity/src/tk/tkcanvas.c", + "lines": 3633 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/micropolis.h", + "lines": 3011 + }, + { + "path": "micropolis-activity/src/tk/tktcp.c", + "lines": 2956 + }, + { + "path": "MicropolisCore/src/pyMicropolis/piemenu/piemenu.py", + "lines": 2820, + "purpose": "Pie Menu for GTK/Cairo/Pango/Sugar." + }, + { + "path": "micropolis-java/src/micropolisj/engine/Micropolis.java", + "lines": 2704 + }, + { + "path": "MicropolisCore/src/pyMicropolis/piemenu/pie.py", + "lines": 2645, + "purpose": "Pie Menu for GTK/Cairo/Pango/Sugar." + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisturbogearsengine.py", + "lines": 2426, + "purpose": "micropolisturbogearsengine.py" + }, + { + "path": "micropolis-activity/src/tk/tkwm.c", + "lines": 2416 + }, + { + "path": "micropolis-activity/src/tk/tktxbtre.c", + "lines": 2375 + }, + { + "path": "micropolis-activity/src/sim/w_piem.c", + "lines": 2359 + }, + { + "path": "micropolis-activity/src/tcl/tclvar.c", + "lines": 2265 + }, + { + "path": "micropolis-activity/src/tk/tkbind.c", + "lines": 2229 + }, + { + "path": "micropolis-activity/src/tk/tktxdisp.c", + "lines": 2094 + }, + { + "path": "micropolis-activity/src/tk/tkmenu.c", + "lines": 2074 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/sprite.cpp", + "lines": 2034 + }, + { + "path": "turbogears/micropolis/controllers.py", + "lines": 1911, + "purpose": "controllers.py" + }, + { + "path": "micropolis-activity/src/tclx/tkucbsrc/tkevent.c", + "lines": 1910 + }, + { + "path": "micropolis-activity/src/tk/tkevent.c", + "lines": 1904 + }, + { + "path": "micropolis-activity/src/tk/tkselect.c", + "lines": 1889 + }, + { + "path": "micropolis-activity/src/tk/tkentry.c", + "lines": 1785 + }, + { + "path": "micropolis-activity/src/tk/tklist.c", + "lines": 1785 + }, + { + "path": "micropolis-java/src/micropolisj/gui/MainWindow.java", + "lines": 1733 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/simulate.cpp", + "lines": 1709 + }, + { + "path": "micropolis-activity/src/tcl/tclunxaz.c", + "lines": 1709 + }, + { + "path": "micropolis-activity/src/sim/w_sim.c", + "lines": 1697 + }, + { + "path": "micropolis-activity/src/sim/w_tool.c", + "lines": 1695 + }, + { + "path": "micropolis-activity/src/sim/w_sprite.c", + "lines": 1641 + }, + { + "path": "micropolis-activity/src/sim/w_inter.c", + "lines": 1604 + }, + { + "path": "micropolis-activity/src/tk/tkwindow.c", + "lines": 1601 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/tool.cpp", + "lines": 1595 + }, + { + "path": "micropolis-activity/src/sim/w_editor.c", + "lines": 1583 + }, + { + "path": "micropolis-activity/src/sim/w_x.c", + "lines": 1564 + }, + { + "path": "micropolis-activity/src/tk/tkbutton.c", + "lines": 1545 + }, + { + "path": "micropolis-activity/src/tk/tkcvarc.c", + "lines": 1524 + }, + { + "path": "micropolis-activity/src/tk/tktext.c", + "lines": 1516 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxlib.c", + "lines": 1505 + }, + { + "path": "micropolis-activity/src/tk/tkcvline.c", + "lines": 1452 + }, + { + "path": "micropolis-activity/src/tcl/tclutil.c", + "lines": 1422 + }, + { + "path": "micropolis-activity/src/tcl/tclcmdmz.c", + "lines": 1420 + }, + { + "path": "micropolis-activity/src/tk/tkscale.c", + "lines": 1418 + }, + { + "path": "micropolis-activity/src/tk/tkcvtext.c", + "lines": 1369 + }, + { + "path": "micropolis-activity/src/tclx/ucbsrc/tclexpr.c", + "lines": 1337 + }, + { + "path": "micropolis-activity/src/tcl/tclexpr.c", + "lines": 1336 + }, + { + "path": "micropolis-activity/src/tk/tkoption.c", + "lines": 1336 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisgenericengine.py", + "lines": 1316, + "purpose": "micropolisgenericengine.py" + }, + { + "path": "MicropolisCore/src/pyMicropolis/tileEngine/tiledrawingarea.py", + "lines": 1303, + "purpose": "tiledrawingarea.py" + }, + { + "path": "micropolis-activity/src/sim/s_sim.c", + "lines": 1240 + }, + { + "path": "micropolis-activity/src/sim/g_cam.c", + "lines": 1236 + }, + { + "path": "micropolis-activity/src/tcl/regexp.c", + "lines": 1233 + }, + { + "path": "micropolis-activity/src/tk/tkscrbar.c", + "lines": 1190 + }, + { + "path": "micropolis-activity/src/tk/tktrig.c", + "lines": 1185 + }, + { + "path": "micropolis-activity/src/tk/tksend.c", + "lines": 1177 + }, + { + "path": "micropolis-activity/src/tcl/tclparse.c", + "lines": 1174 + }, + { + "path": "micropolis-activity/src/tk/tkmnbut.c", + "lines": 1166 + }, + { + "path": "micropolis-activity/src/tcl/tclcmdil.c", + "lines": 1149 + }, + { + "path": "micropolis-activity/src/tk/tkgrab.c", + "lines": 1112 + }, + { + "path": "micropolis-activity/src/tcl/tclhist.c", + "lines": 1093 + }, + { + "path": "MicropolisCore/src/TileEngine/src/tileengine.cpp", + "lines": 1087 + }, + { + "path": "micropolis-activity/src/tclx/ucbsrc/tclbasic.c", + "lines": 1067 + }, + { + "path": "micropolis-activity/src/tk/tktxtag.c", + "lines": 1067 + }, + { + "path": "micropolis-activity/src/tcl/tclbasic.c", + "lines": 1063 + }, + { + "path": "micropolis-activity/src/tk/tkpack.c", + "lines": 1053 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxsig.c", + "lines": 1034 + }, + { + "path": "micropolis-activity/src/tcl/tclunxut.c", + "lines": 1033 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/zone.cpp", + "lines": 1025 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/map.cpp", + "lines": 1013 + }, + { + "path": "micropolis-activity/src/tk/tk3d.c", + "lines": 993 + }, + { + "path": "micropolis-java/src/micropolisj/engine/MapScanner.java", + "lines": 965 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisrobot.py", + "lines": 952, + "purpose": "micropolisrobot.py" + }, + { + "path": "micropolis-activity/src/tk/tkplace.c", + "lines": 939 + }, + { + "path": "micropolis-activity/src/tcl/tclhash.c", + "lines": 931 + }, + { + "path": "micropolis-activity/src/tk/ks_names.h", + "lines": 917 + }, + { + "path": "micropolis-activity/src/tcl/tclcmdah.c", + "lines": 913 + }, + { + "path": "micropolis-activity/src/sim/w_graph.c", + "lines": 894 + }, + { + "path": "micropolis-activity/src/tk/tkrectov.c", + "lines": 878 + }, + { + "path": "micropolis-activity/src/sim/w_cam.c", + "lines": 877 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisdrawingarea.py", + "lines": 870, + "purpose": "micropolisdrawingarea.py" + }, + { + "path": "micropolis-activity/src/sim/terrain/terra.c", + "lines": 868 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxfcmd.c", + "lines": 856 + }, + { + "path": "micropolis-activity/src/tk/tkconfig.c", + "lines": 847 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxklst.c", + "lines": 844 + }, + { + "path": "micropolis-activity/src/sim/w_tk.c", + "lines": 840 + }, + { + "path": "micropolis-activity/src/sim/sim.c", + "lines": 834 + }, + { + "path": "micropolis-activity/src/tcl/tclint.h", + "lines": 834 + }, + { + "path": "turbogears/micropolis/htdocs/static/javascript/embed-compressed.js", + "lines": 820 + }, + { + "path": "micropolis-activity/src/tk/tkcmds.c", + "lines": 818 + }, + { + "path": "MicropolisCore/src/CellEngine/src/cellengine.h", + "lines": 801 + }, + { + "path": "micropolis-activity/src/tk/tkmsg.c", + "lines": 788 + }, + { + "path": "micropolis-activity/src/tk/tkfont.c", + "lines": 773 + }, + { + "path": "micropolis-activity/src/tk/tkcvwind.c", + "lines": 772 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/micropolis.cpp", + "lines": 770 + }, + { + "path": "micropolis-activity/src/tk/tkcvpoly.c", + "lines": 770 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/generate.cpp", + "lines": 751 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxutil.c", + "lines": 749 + }, + { + "path": "micropolis-activity/src/tk/tk.h", + "lines": 743 + }, + { + "path": "micropolis-activity/src/sim/w_date.c", + "lines": 736 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/connect.cpp", + "lines": 734 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/stubs.cpp", + "lines": 733 + }, + { + "path": "micropolis-activity/src/tcl/tclunxst.c", + "lines": 730 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TileConstants.java", + "lines": 725 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxprof.c", + "lines": 702 + }, + { + "path": "micropolis-activity/src/tk/tkrawtcp.c", + "lines": 694 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxfmat.c", + "lines": 693 + }, + { + "path": "micropolis-activity/src/sim/headers/sim.h", + "lines": 687 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolishistoryview.py", + "lines": 673, + "purpose": "micropolishistoryview.py" + }, + { + "path": "micropolis-activity/src/sim/s_zone.c", + "lines": 659 + }, + { + "path": "micropolis-activity/src/tk/tkpixmap.c", + "lines": 656 + }, + { + "path": "micropolis-activity/src/sim/w_con.c", + "lines": 646 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/fileio.cpp", + "lines": 645 + }, + { + "path": "micropolis-activity/src/sim/s_gen.c", + "lines": 643 + }, + { + "path": "micropolis-activity/src/tk/tkcursor.c", + "lines": 643 + }, + { + "path": "micropolis-activity/src/tk/tkcvbmap.c", + "lines": 641 + }, + { + "path": "micropolis-activity/src/tk/tktxidx.c", + "lines": 640 + }, + { + "path": "micropolis-activity/src/sim/w_map.c", + "lines": 611 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolispiemenus.py", + "lines": 609, + "purpose": "micropolispiemenus.py" + }, + { + "path": "micropolis-activity/src/sim/s_fileio.c", + "lines": 604 + }, + { + "path": "micropolis-activity/src/tk/tkcolor.c", + "lines": 602 + }, + { + "path": "micropolis-activity/src/tk/tkget.c", + "lines": 593 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/scan.cpp", + "lines": 590 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisgtkengine.py", + "lines": 589, + "purpose": "micropolisgtkengine.py" + }, + { + "path": "micropolis-activity/src/tclx/src/tclxfsca.c", + "lines": 582 + }, + { + "path": "micropolis-activity/src/tcl/tclglob.c", + "lines": 580 + }, + { + "path": "micropolis-activity/src/tclx/src/tclplus.h", + "lines": 570 + }, + { + "path": "MicropolisCore/src/pyMicropolis/tileEngine/tiletool.py", + "lines": 569, + "purpose": "tiletool.py" + }, + { + "path": "micropolis-activity/src/tcl/tclproc.c", + "lines": 567 + }, + { + "path": "micropolis-activity/src/tk/tkint.h", + "lines": 566 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/evaluate.cpp", + "lines": 563 + }, + { + "path": "micropolis-java/src/micropolisj/gui/OverlayMapView.java", + "lines": 560 + }, + { + "path": "micropolis-java/src/micropolisj/engine/MapGenerator.java", + "lines": 546 + }, + { + "path": "micropolis-activity/src/sim/s_scan.c", + "lines": 540 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxunix.c", + "lines": 537 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolistool.py", + "lines": 536, + "purpose": "micropolistool.py" + }, + { + "path": "micropolis-activity/src/tclx/src/tclxint.h", + "lines": 535 + }, + { + "path": "micropolis-activity/src/tcl/tclckall.c", + "lines": 533 + }, + { + "path": "micropolis-activity/src/tk/library/demos/tkSquare.c", + "lines": 531 + }, + { + "path": "turbogears/micropolis/model.py", + "lines": 529, + "purpose": "model.py" + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropoliswindow.py", + "lines": 517, + "purpose": "micropoliswindow.py" + }, + { + "path": "micropolis-activity/src/sim/terrain/terragen.c", + "lines": 508 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/traffic.cpp", + "lines": 507 + }, + { + "path": "micropolis-activity/src/tk/tkframe.c", + "lines": 507 + }, + { + "path": "micropolis-activity/src/sim/g_map.c", + "lines": 503 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxstup.c", + "lines": 502 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxstr.c", + "lines": 498 + }, + { + "path": "micropolis-activity/src/tk/tkbitmap.c", + "lines": 496 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxrexp.c", + "lines": 493 + }, + { + "path": "turbogears/micropolis/htdocs/static/javascript/json2.js", + "lines": 481 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/message.cpp", + "lines": 473 + }, + { + "path": "micropolis-activity/src/tcl/compat/strerror.c", + "lines": 471 + }, + { + "path": "micropolis-java/src/micropolisj/gui/MicropolisDrawingArea.java", + "lines": 469 + }, + { + "path": "micropolis-java/src/micropolisj/engine/RoadLikeTool.java", + "lines": 466 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxhndl.c", + "lines": 456 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/cellengine.py", + "lines": 454, + "purpose": "This file was automatically generated by SWIG (http://www.swig.org)." + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/main.cpp", + "lines": 452 + }, + { + "path": "micropolis-activity/src/sim/s_msg.c", + "lines": 448 + }, + { + "path": "micropolis-activity/src/sim/g_setup.c", + "lines": 443 + }, + { + "path": "micropolis-activity/src/tcl/tclenv.c", + "lines": 435 + }, + { + "path": "micropolis-activity/src/tk/tkargv.c", + "lines": 432 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxsel.c", + "lines": 429 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/utilities.cpp", + "lines": 427 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxchmd.c", + "lines": 420 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/cellconfigurations.py", + "lines": 419, + "purpose": "cellconfigurations.py" + }, + { + "path": "micropolis-activity/src/tk/tktext.h", + "lines": 416 + }, + { + "path": "micropolis-activity/src/sim/g_smmaps.c", + "lines": 414 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropoliszone.py", + "lines": 411, + "purpose": "micropoliszone.py" + }, + { + "path": "micropolis-activity/src/sim/terrain/mapgener.c", + "lines": 411 + }, + { + "path": "micropolis-activity/src/tk/tkshare.c", + "lines": 409 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/disasters.cpp", + "lines": 408 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxdebg.c", + "lines": 406 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisbudgetpanel.py", + "lines": 401, + "purpose": "micropolisbudgetpanel.py" + }, + { + "path": "micropolis-activity/src/tk/tkcanvas.h", + "lines": 401 + }, + { + "path": "micropolis-java/src/micropolisj/gui/BudgetDialog.java", + "lines": 400 + }, + { + "path": "MicropolisCore/src/CellEngine/src/perlinnoise.h", + "lines": 393 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/graph.cpp", + "lines": 388 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxclp.c", + "lines": 388 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TerrainBehavior.java", + "lines": 374 + }, + { + "path": "micropolis-activity/src/sim/random.c", + "lines": 366 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TileSpec.java", + "lines": 365 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropoliswebserver.py", + "lines": 361, + "purpose": "micropoliswebserver.py" + }, + { + "path": "micropolis-activity/src/tclx/tkucbsrc/main.c", + "lines": 357 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxmsgc.c", + "lines": 356 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxbsrc.c", + "lines": 355 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ToolStroke.java", + "lines": 355 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxfctl.c", + "lines": 352 + }, + { + "path": "micropolis-activity/src/sim/w_budget.c", + "lines": 349 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/budget.cpp", + "lines": 344 + }, + { + "path": "micropolis-activity/src/sim/s_eval.c", + "lines": 344 + }, + { + "path": "micropolis-activity/src/tk/default.h", + "lines": 341 + }, + { + "path": "micropolis-activity/src/tcl/tcl.h", + "lines": 340 + }, + { + "path": "micropolis-activity/src/tk/main.c", + "lines": 334 + }, + { + "path": "micropolis-activity/src/tk/tkgc.c", + "lines": 334 + }, + { + "path": "micropolis-java/src/micropolisj/gui/GraphsPane.java", + "lines": 332 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisgaugeview.py", + "lines": 331, + "purpose": "micropolisgaugeview.py" + }, + { + "path": "micropolis-activity/src/tclx/src/tclxid.c", + "lines": 331 + }, + { + "path": "micropolis-activity/src/sim/s_traf.c", + "lines": 330 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/map_type.h", + "lines": 328 + }, + { + "path": "micropolis-activity/src/sim/headers/view.h", + "lines": 328 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/cellmodel.py", + "lines": 327, + "purpose": "cellmodel.py" + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropoliscontrolpanel.py", + "lines": 327, + "purpose": "micropoliscontrolpanel.py" + }, + { + "path": "micropolis-activity/src/sim/w_keys.c", + "lines": 325 + }, + { + "path": "micropolis-java/src/micropolisj/util/TranslationTool.java", + "lines": 325 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisview.py", + "lines": 323, + "purpose": "micropolisview.py" + }, + { + "path": "micropolis-activity/src/sim/s_disast.c", + "lines": 321 + }, + { + "path": "micropolis-activity/src/tcl/tclunix.h", + "lines": 321 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/eliza.py", + "lines": 320, + "purpose": "eliza.py" + }, + { + "path": "micropolis-activity/src/sim/g_bigmap.c", + "lines": 317 + }, + { + "path": "micropolis-activity/micropolisactivity.py", + "lines": 313, + "purpose": "-*- mode: python; tab-width: 4 -*-" + }, + { + "path": "micropolis-java/src/micropolisj/build_tool/MakeTiles.java", + "lines": 304 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxcret.c", + "lines": 302 + }, + { + "path": "micropolis-java/src/micropolisj/gui/EvaluationPane.java", + "lines": 298 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxproc.c", + "lines": 297 + }, + { + "path": "micropolis-activity/src/tclx/ossupp/strftime.c", + "lines": 296 + }, + { + "path": "micropolis-activity/src/sim/w_util.c", + "lines": 295 + }, + { + "path": "micropolis-activity/src/tk/tkerror.c", + "lines": 294 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/cellrulecompiler.py", + "lines": 289, + "purpose": "cellrulecompiler.py" + }, + { + "path": "micropolis-activity/src/sim/headers/animtab.h", + "lines": 287 + }, + { + "path": "micropolis-java/src/micropolisj/engine/CityEval.java", + "lines": 283 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisevaluationview.py", + "lines": 279, + "purpose": "micropolisevaluationview.py" + }, + { + "path": "micropolis-activity/src/tclx/src/tclxlist.c", + "lines": 278 + }, + { + "path": "micropolis-activity/src/sim/w_update.c", + "lines": 272 + }, + { + "path": "MicropolisCore/src/TileEngine/src/tileengine.h", + "lines": 271 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/update.cpp", + "lines": 269 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxdup.c", + "lines": 267 + }, + { + "path": "micropolis-activity/src/tcl/compat/strtod.c", + "lines": 259 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisstartpanel.py", + "lines": 255, + "purpose": "micropolisstartpanel.py" + }, + { + "path": "micropolis-activity/src/sim/s_power.c", + "lines": 253 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/tool.h", + "lines": 244 + }, + { + "path": "laszlo/micropolis/resources/images/tiles/makezone.py", + "lines": 244, + "purpose": "makezone.py" + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/resource.cpp", + "lines": 239 + }, + { + "path": "micropolis-java/src/micropolisj/util/StringsModel.java", + "lines": 239 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/animate.cpp", + "lines": 237 + }, + { + "path": "micropolis-activity/src/tk/tkpresrv.c", + "lines": 236 + }, + { + "path": "micropolis-java/src/micropolisj/gui/NewCityDialog.java", + "lines": 233 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TrafficGen.java", + "lines": 231 + }, + { + "path": "micropolis-java/src/micropolisj/engine/Sprite.java", + "lines": 229 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/position.cpp", + "lines": 222 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisnotebook.py", + "lines": 217, + "purpose": "micropolisnotebook.py" + }, + { + "path": "micropolis-activity/src/sim/headers/cam.h", + "lines": 217 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxtend.h", + "lines": 214 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisDisastersPanel.cs", + "lines": 213 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisnoticeview.py", + "lines": 211, + "purpose": "micropolisnoticeview.py" + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolismappanel.py", + "lines": 209, + "purpose": "micropolismappanel.py" + }, + { + "path": "micropolis-activity/src/sim/s_alloc.c", + "lines": 209 + }, + { + "path": "micropolis-activity/src/sim/w_resrc.c", + "lines": 208 + }, + { + "path": "micropolis-activity/src/tcl/tclassem.c", + "lines": 207 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxmath.c", + "lines": 207 + }, + { + "path": "micropolis-activity/src/sim/w_stubs.c", + "lines": 198 + }, + { + "path": "micropolis-activity/src/tcl/compat/strtoul.c", + "lines": 188 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxgenl.c", + "lines": 186 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/power.cpp", + "lines": 185 + }, + { + "path": "micropolis-activity/src/tcl/tclget.c", + "lines": 184 + }, + { + "path": "micropolis-java/src/micropolisj/engine/MonsterSprite.java", + "lines": 184 + }, + { + "path": "turbogears/micropolis/htdocs/static/javascript/micropolisFacebook.js", + "lines": 184 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/position.h", + "lines": 183 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/xmlutilities.py", + "lines": 181, + "purpose": "xmlutilities.py" + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/random.cpp", + "lines": 177 + }, + { + "path": "micropolis-java/src/micropolisj/gui/NotificationPane.java", + "lines": 176 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ToolPreview.java", + "lines": 166 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/doc/genAnimationTable.py", + "lines": 165, + "purpose": "Generate tile animation table." + }, + { + "path": "micropolis-activity/src/tk/tkatom.c", + "lines": 165 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/celltool.py", + "lines": 164, + "purpose": "celltool.py" + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolismessagespanel.py", + "lines": 163, + "purpose": "micropolismessagespanel.py" + }, + { + "path": "micropolis-activity/src/sim/w_eval.c", + "lines": 163 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisnoticepanel.py", + "lines": 162, + "purpose": "micropolisnoticepanel.py" + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/celldrawingarea.py", + "lines": 161, + "purpose": "celldrawingarea.py" + }, + { + "path": "micropolis-activity/src/sim/w_sound.c", + "lines": 161 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/allocate.cpp", + "lines": 160 + }, + { + "path": "micropolis-activity/src/tk/tkgeo.c", + "lines": 159 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/text.h", + "lines": 156 + }, + { + "path": "micropolis-activity/src/sim/s_init.c", + "lines": 154 + }, + { + "path": "micropolis-activity/src/sim/w_net.c", + "lines": 154 + }, + { + "path": "micropolis-java/src/micropolisj/gui/DemandIndicator.java", + "lines": 150 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/cellwindow.py", + "lines": 147, + "purpose": "cellwindow.py" + }, + { + "path": "micropolis-activity/src/tcl/tclhash.h", + "lines": 147 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ShipSprite.java", + "lines": 144 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisdisasterspanel.py", + "lines": 142, + "purpose": "micropolisdisasterspanel.py" + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/initialize.cpp", + "lines": 137 + }, + { + "path": "micropolis-java/src/micropolisj/gui/TileImages.java", + "lines": 134 + }, + { + "path": "MicropolisCore/src/pyMicropolis/tileEngine/tilewindow.py", + "lines": 130, + "purpose": "tilewindow.py" + }, + { + "path": "MicropolisCore/src/CellEngine/python/convert-tiles.py", + "lines": 129, + "purpose": "convert-tiles.py" + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/cellpiemenus.py", + "lines": 127, + "purpose": "cellpiemenus.py" + }, + { + "path": "micropolis-activity/src/sim/headers/macros.h", + "lines": 127 + }, + { + "path": "micropolis-activity/src/tk/tkconfig.h", + "lines": 127 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/stubs.h", + "lines": 118 + }, + { + "path": "micropolis-java/src/micropolisj/engine/Bulldozer.java", + "lines": 117 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/setup.py", + "lines": 116, + "purpose": "setup.py" + }, + { + "path": "micropolis-java/src/micropolisj/engine/ToolEffect.java", + "lines": 113 + }, + { + "path": "micropolis-java/src/micropolisj/engine/Tiles.java", + "lines": 111 + }, + { + "path": "micropolis-activity/src/sim/w_print.c", + "lines": 110 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxclck.c", + "lines": 109 + }, + { + "path": "micropolis-java/src/micropolisj/engine/HelicopterSprite.java", + "lines": 107 + }, + { + "path": "micropolis-activity/src/tcl/compat/opendir.c", + "lines": 106 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisZone.cs", + "lines": 105 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolishistorypanel.py", + "lines": 105, + "purpose": "micropolishistorypanel.py" + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisevaluationpanel.py", + "lines": 104, + "purpose": "micropolisevaluationpanel.py" + }, + { + "path": "MicropolisCore/src/TileEngine/setup.py", + "lines": 103, + "purpose": "setup.py" + }, + { + "path": "micropolis-java/src/micropolisj/engine/TrainSprite.java", + "lines": 102 + }, + { + "path": "micropolis-activity/src/sim/g_ani.c", + "lines": 98 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/stdafx.h", + "lines": 96 + }, + { + "path": "micropolis-java/src/micropolisj/engine/MicropolisTool.java", + "lines": 95 + }, + { + "path": "micropolis-java/src/micropolisj/engine/AirplaneSprite.java", + "lines": 93 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxcclk.c", + "lines": 92 + }, + { + "path": "MicropolisCore/src/CellEngine/setup.py", + "lines": 91, + "purpose": "setup.py" + }, + { + "path": "micropolis-java/src/micropolisj/engine/MicropolisMessage.java", + "lines": 91 + }, + { + "path": "micropolis-activity/src/sim/headers/mac.h", + "lines": 90 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TornadoSprite.java", + "lines": 89 + }, + { + "path": "micropolis-activity/src/tcl/compat/strtol.c", + "lines": 88 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisPannedWindow.cs", + "lines": 81 + }, + { + "path": "micropolis-activity/src/tclx/ossupp/ids.c", + "lines": 80 + }, + { + "path": "micropolis-activity/src/tclx/src/main.c", + "lines": 79 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisGaugeView.cs", + "lines": 78 + }, + { + "path": "turbogears/setup.py", + "lines": 78, + "purpose": "-*- coding: utf-8 -*-" + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/data_types.h", + "lines": 76 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisBudgetPanel.cs", + "lines": 74 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisControlPanel.cs", + "lines": 74 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisEvaluationPanel.cs", + "lines": 74 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisGenericEngine.cs", + "lines": 74 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisHistoryPanel.cs", + "lines": 74 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisMapPanel.cs", + "lines": 74 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisMessagesPanel.cs", + "lines": 74 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisNotebook.cs", + "lines": 74 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisNoticePanel.cs", + "lines": 74 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisStartPanel.cs", + "lines": 74 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisView.cs", + "lines": 74 + }, + { + "path": "micropolis-activity/src/tcl/compat/strstr.c", + "lines": 73 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisEvaluationView.cs", + "lines": 72 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisHistoryView.cs", + "lines": 72 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisNoticeView.cs", + "lines": 72 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisWinFormsEngine.cs", + "lines": 72 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/generate.h", + "lines": 71 + }, + { + "path": "turbogears/micropolis/htdocs/static/javascript/all.js", + "lines": 71 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ExplosionSprite.java", + "lines": 67 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxmerr.c", + "lines": 65 + }, + { + "path": "MicropolisCore/src/csMicropolis/Properties/Resources.Designer.cs", + "lines": 63 + }, + { + "path": "MicropolisCore/src/pyMicropolis/gtkFrontend/main.py", + "lines": 62, + "purpose": "@file main.py Main file for running Micropolis with the GTK frontend" + }, + { + "path": "micropolis-activity/src/tcl/compat/dirent2.h", + "lines": 62 + }, + { + "path": "micropolis-java/src/micropolisj/engine/CityRect.java", + "lines": 62 + }, + { + "path": "micropolis-java/src/micropolisj/engine/BuildingTool.java", + "lines": 60 + }, + { + "path": "micropolis-activity/src/tk/tktcp.h", + "lines": 58 + }, + { + "path": "micropolis-java/src/micropolisj/engine/CityLocation.java", + "lines": 58 + }, + { + "path": "micropolis-activity/src/tcl/compat/string.h", + "lines": 56 + }, + { + "path": "micropolis-java/src/micropolisj/build_tool/RearrangeTiles.java", + "lines": 56 + }, + { + "path": "micropolis-activity/src/sim/rand.c", + "lines": 55 + }, + { + "path": "turbogears/micropolis/commands.py", + "lines": 55, + "purpose": "-*- coding: utf-8 -*-" + }, + { + "path": "micropolis-activity/src/tcl/panic.c", + "lines": 54 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TranslatedToolEffect.java", + "lines": 53 + }, + { + "path": "wikimedia/openlaszlo/openlaszlo.php", + "lines": 51 + }, + { + "path": "MicropolisCore/src/csMicropolis/Program.cs", + "lines": 49 + }, + { + "path": "micropolis-activity/src/tcl/compat/stdlib.h", + "lines": 48 + }, + { + "path": "micropolis-java/src/micropolisj/engine/CityDimension.java", + "lines": 48 + }, + { + "path": "micropolis-java/src/micropolisj/engine/Sound.java", + "lines": 47 + }, + { + "path": "micropolis-activity/src/tclx/ossupp/times.c", + "lines": 46 + }, + { + "path": "micropolis-java/src/micropolisj/engine/CityBudget.java", + "lines": 45 + }, + { + "path": "micropolis-java/src/micropolisj/gui/MessagesPane.java", + "lines": 44 + }, + { + "path": "micropolis-activity/src/tclx/ossupp/fcntl.c", + "lines": 40 + }, + { + "path": "micropolis-activity/src/tclx/ossupp/sigs.c", + "lines": 40 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TileBehavior.java", + "lines": 40 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisPannedWindow.Designer.cs", + "lines": 38 + }, + { + "path": "MicropolisCore/src/pyMicropolis/gtkFrontend/maincell.py", + "lines": 38, + "purpose": "@file maincell.py Main file for running the CellEngine with the GTK frontend" + }, + { + "path": "micropolis-java/src/micropolisj/engine/Speed.java", + "lines": 37 + }, + { + "path": "MicropolisCore/src/csMicropolis/Properties/AssemblyInfo.cs", + "lines": 36 + }, + { + "path": "MicropolisCore/src/CellEngine/src/stdafx.h", + "lines": 35, + "purpose": "stdafx.h : include file for standard system include files," + }, + { + "path": "MicropolisCore/src/TileEngine/src/stdafx.h", + "lines": 35, + "purpose": "stdafx.h : include file for standard system include files," + }, + { + "path": "micropolis-java/src/micropolisj/gui/ColorParser.java", + "lines": 35 + }, + { + "path": "micropolis-java/src/micropolisj/engine/BudgetNumbers.java", + "lines": 34 + }, + { + "path": "micropolis-java/src/micropolisj/engine/GameLevel.java", + "lines": 34 + }, + { + "path": "MicropolisCore/src/CellEngine/src/linuxcompat.h", + "lines": 33 + }, + { + "path": "micropolis-java/src/micropolisj/engine/SpriteKind.java", + "lines": 33 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ToolEffectIfc.java", + "lines": 32 + }, + { + "path": "turbogears/micropolis/htdocs/static/javascript/jquery.js", + "lines": 32 + }, + { + "path": "micropolis-java/src/micropolisj/Main.java", + "lines": 31 + }, + { + "path": "micropolis-activity/src/tcl/regexp.h", + "lines": 30 + }, + { + "path": "micropolis-java/src/micropolisj/engine/MapState.java", + "lines": 30 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ZoneStatus.java", + "lines": 30 + }, + { + "path": "turbogears/start-micropolis.py", + "lines": 30, + "purpose": "-*- coding: utf-8 -*-" + }, + { + "path": "micropolis-java/src/micropolisj/engine/MapListener.java", + "lines": 28 + }, + { + "path": "MicropolisCore/src/csMicropolis/Properties/Settings.Designer.cs", + "lines": 26 + }, + { + "path": "micropolis-activity/src/tcl/compat/dirent.h", + "lines": 26 + }, + { + "path": "micropolis-java/src/micropolisj/engine/CityProblem.java", + "lines": 23 + }, + { + "path": "MicropolisCore/src/CellEngine/python/CellEngineMain.cpp", + "lines": 22, + "purpose": "CellEngineMain.cpp : Defines the entry point for the DLL application." + }, + { + "path": "MicropolisCore/src/MicropolisEngine/python/MicropolisMain.cpp", + "lines": 22, + "purpose": "MicropolisMain.cpp : Defines the entry point for the DLL application." + }, + { + "path": "MicropolisCore/src/TileEngine/python/TileEngineMain.cpp", + "lines": 22, + "purpose": "TileEngineMain.cpp : Defines the entry point for the DLL application." + }, + { + "path": "micropolis-java/src/micropolisj/engine/Disaster.java", + "lines": 22 + }, + { + "path": "micropolis-java/src/micropolisj/util/TranslatedStringsTable.java", + "lines": 22 + }, + { + "path": "turbogears/debug-micropolis.py", + "lines": 22, + "purpose": "-*- coding: utf-8 -*-" + }, + { + "path": "micropolis-activity/src/tcl/compat/limits.h", + "lines": 20 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ToolResult.java", + "lines": 20 + }, + { + "path": "micropolis-java/src/micropolisj/engine/EarthquakeListener.java", + "lines": 17 + }, + { + "path": "micropolis-activity/src/tk/tkwm.h", + "lines": 16 + }, + { + "path": "turbogears/micropolis/release.py", + "lines": 14, + "purpose": "Release information about micropolis" + }, + { + "path": "turbogears/micropolis/json.py", + "lines": 10, + "purpose": "A JSON-based API(view) for your app." + }, + { + "path": "MicropolisCore/src/CellEngine/python/stdafx.cpp", + "lines": 8, + "purpose": "stdafx.cpp : source file that includes just the standard includes" + }, + { + "path": "MicropolisCore/src/MicropolisEngine/python/stdafx.cpp", + "lines": 8, + "purpose": "stdafx.cpp : source file that includes just the standard includes" + }, + { + "path": "MicropolisCore/src/TileEngine/python/stdafx.cpp", + "lines": 8, + "purpose": "stdafx.cpp : source file that includes just the standard includes" + }, + { + "path": "MicropolisCore/src/pyMicropolis/__init__.py", + "lines": 7, + "purpose": "@package pyMicropolis" + }, + { + "path": "turbogears/micropolis/htdocs/static/javascript/micropolis.js", + "lines": 7 + }, + { + "path": "micropolis-activity/src/tclx/src/patchlvl.h", + "lines": 2 + }, + { + "path": "MicropolisCore/src/__init__.py", + "lines": 0 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/__init__.py", + "lines": 0 + }, + { + "path": "MicropolisCore/src/pyMicropolis/gtkFrontend/__init__.py", + "lines": 0 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/__init__.py", + "lines": 0 + }, + { + "path": "MicropolisCore/src/pyMicropolis/piemenu/__init__.py", + "lines": 0 + }, + { + "path": "MicropolisCore/src/pyMicropolis/tileEngine/__init__.py", + "lines": 0 + }, + { + "path": "micropolis-activity/__init__.py", + "lines": 0 + }, + { + "path": "turbogears/micropolis/__init__.py", + "lines": 0 + }, + { + "path": "turbogears/micropolis/config/__init__.py", + "lines": 0 + }, + { + "path": "turbogears/micropolis/templates/__init__.py", + "lines": 0 + }, + { + "path": "turbogears/micropolis/tests/__init__.py", + "lines": 0 + } + ], + "dependencies": { + "packages": [], + "source": "" + }, + "architecture": { + "patterns": [ + "Testing: 9 test file(s)", + "CI/CD: Configured", + "Pattern: Models/schemas layer", + "Entry points: MicropolisCore/src/pyMicropolis/gtkFrontend/main.py, MicropolisCore/src/pyMicropolis/micropolisEngine/micropoliswebserver.py, micropolis-activity/src/tclx/src/main.c, micropolis-activity/src/tclx/tkucbsrc/main.c, micropolis-activity/src/tk/main.c" + ] + }, + "test_coverage": { + "test_files": 9, + "source_files": 410, + "covered_modules": 4, + "uncovered_modules": [ + "MicropolisCore/src/CellEngine/python/CellEngineMain.cpp", + "MicropolisCore/src/CellEngine/python/convert-tiles.py", + "MicropolisCore/src/CellEngine/python/stdafx.cpp", + "MicropolisCore/src/CellEngine/setup.py", + "MicropolisCore/src/CellEngine/src/cellengine.cpp", + "MicropolisCore/src/CellEngine/src/cellengine.h", + "MicropolisCore/src/CellEngine/src/linuxcompat.h", + "MicropolisCore/src/CellEngine/src/perlinnoise.h", + "MicropolisCore/src/CellEngine/src/ruletables.cpp", + "MicropolisCore/src/CellEngine/src/stdafx.h", + "MicropolisCore/src/MicropolisEngine/doc/genAnimationTable.py", + "MicropolisCore/src/MicropolisEngine/python/MicropolisMain.cpp", + "MicropolisCore/src/MicropolisEngine/python/stdafx.cpp", + "MicropolisCore/src/MicropolisEngine/setup.py", + "MicropolisCore/src/MicropolisEngine/src/allocate.cpp", + "MicropolisCore/src/MicropolisEngine/src/animate.cpp", + "MicropolisCore/src/MicropolisEngine/src/budget.cpp", + "MicropolisCore/src/MicropolisEngine/src/connect.cpp", + "MicropolisCore/src/MicropolisEngine/src/data_types.h", + "MicropolisCore/src/MicropolisEngine/src/disasters.cpp" + ] + }, + "file_inventory": [ + { + "path": ".github/copilot-instructions.md", + "lines": 0, + "size": 5008 + }, + { + "path": ".gitignore", + "lines": 0, + "size": 16 + }, + { + "path": "BUGS.txt", + "lines": 0, + "size": 5536 + }, + { + "path": "INSTALL.txt", + "lines": 0, + "size": 4650 + }, + { + "path": "MicropolisCore/documentation/HackingAtRandomTalk.txt", + "lines": 0, + "size": 4509 + }, + { + "path": "MicropolisCore/src/CellEngine/README.txt", + "lines": 0, + "size": 972 + }, + { + "path": "MicropolisCore/src/CellEngine/python/CellEngineMain.cpp", + "lines": 22, + "size": 334 + }, + { + "path": "MicropolisCore/src/CellEngine/python/convert-tiles.py", + "lines": 129, + "size": 5004 + }, + { + "path": "MicropolisCore/src/CellEngine/python/stdafx.cpp", + "lines": 8, + "size": 301 + }, + { + "path": "MicropolisCore/src/CellEngine/python/test.py", + "lines": 1096, + "size": 32736 + }, + { + "path": "MicropolisCore/src/CellEngine/setup.py", + "lines": 91, + "size": 3993 + }, + { + "path": "MicropolisCore/src/CellEngine/src/cellengine.cpp", + "lines": 5685, + "size": 151681 + }, + { + "path": "MicropolisCore/src/CellEngine/src/cellengine.h", + "lines": 801, + "size": 21152 + }, + { + "path": "MicropolisCore/src/CellEngine/src/linuxcompat.h", + "lines": 33, + "size": 566 + }, + { + "path": "MicropolisCore/src/CellEngine/src/perlinnoise.h", + "lines": 393, + "size": 15343 + }, + { + "path": "MicropolisCore/src/CellEngine/src/ruletables.cpp", + "lines": 6570, + "size": 466850 + }, + { + "path": "MicropolisCore/src/CellEngine/src/stdafx.h", + "lines": 35, + "size": 1469 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/doc/ASSETS.txt", + "lines": 0, + "size": 12331 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/doc/AnimationSequences.txt", + "lines": 0, + "size": 4228 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/doc/CALLBACKS.txt", + "lines": 0, + "size": 2406 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/doc/CODING-STYLE.txt", + "lines": 0, + "size": 1899 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/doc/PLAN.txt", + "lines": 0, + "size": 13600 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/doc/README-Mac.txt", + "lines": 0, + "size": 390 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/doc/ROADMAP.txt", + "lines": 0, + "size": 7470 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/doc/SIMULATOR.txt", + "lines": 0, + "size": 1963 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/doc/TODO.txt", + "lines": 0, + "size": 3135 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/doc/UserInterfacePlan.txt", + "lines": 0, + "size": 6784 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/doc/genAnimationTable.py", + "lines": 165, + "size": 4707 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/python/MicropolisMain.cpp", + "lines": 22, + "size": 334 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/python/stdafx.cpp", + "lines": 8, + "size": 301 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/setup.py", + "lines": 116, + "size": 4790 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/allocate.cpp", + "lines": 160, + "size": 5410 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/animate.cpp", + "lines": 237, + "size": 11772 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/budget.cpp", + "lines": 344, + "size": 10289 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/connect.cpp", + "lines": 734, + "size": 22808 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/data_types.h", + "lines": 76, + "size": 3550 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/disasters.cpp", + "lines": 408, + "size": 11680 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/evaluate.cpp", + "lines": 563, + "size": 16069 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/fileio.cpp", + "lines": 645, + "size": 18211 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/generate.cpp", + "lines": 751, + "size": 21001 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/generate.h", + "lines": 71, + "size": 3558 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/graph.cpp", + "lines": 388, + "size": 11344 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/initialize.cpp", + "lines": 137, + "size": 4968 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/main.cpp", + "lines": 452, + "size": 13217 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/map.cpp", + "lines": 1013, + "size": 27935 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/map_type.h", + "lines": 328, + "size": 10194 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/message.cpp", + "lines": 473, + "size": 13701 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/micropolis.cpp", + "lines": 770, + "size": 16218 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/micropolis.h", + "lines": 3011, + "size": 69661 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/position.cpp", + "lines": 222, + "size": 7061 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/position.h", + "lines": 183, + "size": 6454 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/power.cpp", + "lines": 185, + "size": 6676 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/random.cpp", + "lines": 177, + "size": 5937 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/resource.cpp", + "lines": 239, + "size": 8059 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/scan.cpp", + "lines": 590, + "size": 17835 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/simulate.cpp", + "lines": 1709, + "size": 45805 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/sprite.cpp", + "lines": 2034, + "size": 50032 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/stdafx.h", + "lines": 96, + "size": 4811 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/stubs.cpp", + "lines": 733, + "size": 21635 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/stubs.h", + "lines": 118, + "size": 4397 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/text.h", + "lines": 156, + "size": 8128 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/tool.cpp", + "lines": 1595, + "size": 46346 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/tool.h", + "lines": 244, + "size": 8764 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/traffic.cpp", + "lines": 507, + "size": 15154 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/update.cpp", + "lines": 269, + "size": 6984 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/utilities.cpp", + "lines": 427, + "size": 10930 + }, + { + "path": "MicropolisCore/src/MicropolisEngine/src/zone.cpp", + "lines": 1025, + "size": 26162 + }, + { + "path": "MicropolisCore/src/TileEngine/README.txt", + "lines": 0, + "size": 1411 + }, + { + "path": "MicropolisCore/src/TileEngine/python/TileEngineMain.cpp", + "lines": 22, + "size": 410 + }, + { + "path": "MicropolisCore/src/TileEngine/python/stdafx.cpp", + "lines": 8, + "size": 301 + }, + { + "path": "MicropolisCore/src/TileEngine/setup.py", + "lines": 103, + "size": 4411 + }, + { + "path": "MicropolisCore/src/TileEngine/src/stdafx.h", + "lines": 35, + "size": 1469 + }, + { + "path": "MicropolisCore/src/TileEngine/src/tileengine.cpp", + "lines": 1087, + "size": 27400 + }, + { + "path": "MicropolisCore/src/TileEngine/src/tileengine.h", + "lines": 271, + "size": 7476 + }, + { + "path": "MicropolisCore/src/__init__.py", + "lines": 0, + "size": 0 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisBudgetPanel.cs", + "lines": 74, + "size": 3671 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisControlPanel.cs", + "lines": 74, + "size": 3674 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisDisastersPanel.cs", + "lines": 213, + "size": 9895 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisEvaluationPanel.cs", + "lines": 74, + "size": 3683 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisEvaluationView.cs", + "lines": 72, + "size": 3652 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisGaugeView.cs", + "lines": 78, + "size": 3812 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisGenericEngine.cs", + "lines": 74, + "size": 3670 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisHistoryPanel.cs", + "lines": 74, + "size": 3674 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisHistoryView.cs", + "lines": 72, + "size": 3643 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisMapPanel.cs", + "lines": 74, + "size": 3662 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisMessagesPanel.cs", + "lines": 74, + "size": 3675 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisNotebook.cs", + "lines": 74, + "size": 3660 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisNoticePanel.cs", + "lines": 74, + "size": 3671 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisNoticeView.cs", + "lines": 72, + "size": 3640 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisPannedWindow.Designer.cs", + "lines": 38, + "size": 1204 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisPannedWindow.cs", + "lines": 81, + "size": 3901 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisStartPanel.cs", + "lines": 74, + "size": 3666 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisView.cs", + "lines": 74, + "size": 3649 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisWinFormsEngine.cs", + "lines": 72, + "size": 3659 + }, + { + "path": "MicropolisCore/src/csMicropolis/MicropolisZone.cs", + "lines": 105, + "size": 4235 + }, + { + "path": "MicropolisCore/src/csMicropolis/Program.cs", + "lines": 49, + "size": 1251 + }, + { + "path": "MicropolisCore/src/csMicropolis/Properties/AssemblyInfo.cs", + "lines": 36, + "size": 1462 + }, + { + "path": "MicropolisCore/src/csMicropolis/Properties/Resources.Designer.cs", + "lines": 63, + "size": 2858 + }, + { + "path": "MicropolisCore/src/csMicropolis/Properties/Settings.Designer.cs", + "lines": 26, + "size": 1097 + }, + { + "path": "MicropolisCore/src/notes/MultiPlayerIdeas.txt", + "lines": 0, + "size": 18831 + }, + { + "path": "MicropolisCore/src/notes/OLPC-notes.txt", + "lines": 0, + "size": 16370 + }, + { + "path": "MicropolisCore/src/notes/Tiles.txt", + "lines": 0, + "size": 10778 + }, + { + "path": "MicropolisCore/src/pyMicropolis/__init__.py", + "lines": 7, + "size": 107 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/__init__.py", + "lines": 0, + "size": 0 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/cellconfigurations.py", + "lines": 419, + "size": 12182 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/celldrawingarea.py", + "lines": 161, + "size": 5445 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/cellengine.py", + "lines": 454, + "size": 30734 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/cellmodel.py", + "lines": 327, + "size": 8643 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/cellpiemenus.py", + "lines": 127, + "size": 4783 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/cellrulecompiler.py", + "lines": 289, + "size": 9260 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/celltool.py", + "lines": 164, + "size": 5265 + }, + { + "path": "MicropolisCore/src/pyMicropolis/cellEngine/cellwindow.py", + "lines": 147, + "size": 4962 + }, + { + "path": "MicropolisCore/src/pyMicropolis/gtkFrontend/__init__.py", + "lines": 0, + "size": 0 + }, + { + "path": "MicropolisCore/src/pyMicropolis/gtkFrontend/main.py", + "lines": 62, + "size": 1665 + }, + { + "path": "MicropolisCore/src/pyMicropolis/gtkFrontend/maincell.py", + "lines": 38, + "size": 840 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/__init__.py", + "lines": 0, + "size": 0 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/eliza.py", + "lines": 320, + "size": 10585 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisbudgetpanel.py", + "lines": 401, + "size": 14871 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropoliscontrolpanel.py", + "lines": 327, + "size": 12778 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisdisasterspanel.py", + "lines": 142, + "size": 5636 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisdrawingarea.py", + "lines": 870, + "size": 20899 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisevaluationpanel.py", + "lines": 104, + "size": 4150 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisevaluationview.py", + "lines": 279, + "size": 8207 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisgaugeview.py", + "lines": 331, + "size": 9210 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisgenericengine.py", + "lines": 1316, + "size": 38425 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisgtkengine.py", + "lines": 589, + "size": 22669 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolishistorypanel.py", + "lines": 105, + "size": 4160 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolishistoryview.py", + "lines": 673, + "size": 18924 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolismappanel.py", + "lines": 209, + "size": 8694 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolismessagespanel.py", + "lines": 163, + "size": 5492 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisnotebook.py", + "lines": 217, + "size": 7030 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisnoticepanel.py", + "lines": 162, + "size": 5804 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisnoticeview.py", + "lines": 211, + "size": 6741 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolispiemenus.py", + "lines": 609, + "size": 20816 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisrobot.py", + "lines": 952, + "size": 28492 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisstartpanel.py", + "lines": 255, + "size": 8558 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolistool.py", + "lines": 536, + "size": 12817 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisturbogearsengine.py", + "lines": 2426, + "size": 78433 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropolisview.py", + "lines": 323, + "size": 9174 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropoliswebserver.py", + "lines": 361, + "size": 10884 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropoliswindow.py", + "lines": 517, + "size": 15848 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/micropoliszone.py", + "lines": 411, + "size": 12004 + }, + { + "path": "MicropolisCore/src/pyMicropolis/micropolisEngine/xmlutilities.py", + "lines": 181, + "size": 6006 + }, + { + "path": "MicropolisCore/src/pyMicropolis/piemenu/__init__.py", + "lines": 0, + "size": 0 + }, + { + "path": "MicropolisCore/src/pyMicropolis/piemenu/pie.py", + "lines": 2645, + "size": 80463 + }, + { + "path": "MicropolisCore/src/pyMicropolis/piemenu/piemenu.py", + "lines": 2820, + "size": 85424 + }, + { + "path": "MicropolisCore/src/pyMicropolis/tileEngine/__init__.py", + "lines": 0, + "size": 0 + }, + { + "path": "MicropolisCore/src/pyMicropolis/tileEngine/tiledrawingarea.py", + "lines": 1303, + "size": 36256 + }, + { + "path": "MicropolisCore/src/pyMicropolis/tileEngine/tiletool.py", + "lines": 569, + "size": 13460 + }, + { + "path": "MicropolisCore/src/pyMicropolis/tileEngine/tilewindow.py", + "lines": 130, + "size": 4632 + }, + { + "path": "MicropolisCore/src/run-gtkfrontend.bat", + "lines": 0, + "size": 161 + }, + { + "path": "MicropolisPublicNameLicense.md", + "lines": 0, + "size": 5091 + }, + { + "path": "NOTES.txt", + "lines": 0, + "size": 3551 + }, + { + "path": "PROGRESS.txt", + "lines": 0, + "size": 17472 + }, + { + "path": "README.md", + "lines": 0, + "size": 1934 + }, + { + "path": "aws/InstallingOnAWS.txt", + "lines": 0, + "size": 4548 + }, + { + "path": "laszlo/micropolis/ASSETS.txt", + "lines": 0, + "size": 920 + }, + { + "path": "laszlo/micropolis/NOTES.txt", + "lines": 0, + "size": 1222 + }, + { + "path": "laszlo/micropolis/TODO.txt", + "lines": 0, + "size": 9585 + }, + { + "path": "laszlo/micropolis/resources/images/tiles/makezone.py", + "lines": 244, + "size": 7776 + }, + { + "path": "micropolis-activity/__init__.py", + "lines": 0, + "size": 0 + }, + { + "path": "micropolis-activity/micropolisactivity.py", + "lines": 313, + "size": 10937 + }, + { + "path": "micropolis-activity/src/ASSETS.txt", + "lines": 0, + "size": 12102 + }, + { + "path": "micropolis-activity/src/PLAN.txt", + "lines": 0, + "size": 12716 + }, + { + "path": "micropolis-activity/src/ROADMAP.txt", + "lines": 0, + "size": 7435 + }, + { + "path": "micropolis-activity/src/notes/MultiPlayerIdeas.txt", + "lines": 0, + "size": 12892 + }, + { + "path": "micropolis-activity/src/notes/OLPC-notes.txt", + "lines": 0, + "size": 16167 + }, + { + "path": "micropolis-activity/src/notes/bugs.txt", + "lines": 0, + "size": 267 + }, + { + "path": "micropolis-activity/src/sim/g_ani.c", + "lines": 98, + "size": 4154 + }, + { + "path": "micropolis-activity/src/sim/g_bigmap.c", + "lines": 317, + "size": 9441 + }, + { + "path": "micropolis-activity/src/sim/g_cam.c", + "lines": 1236, + "size": 26402 + }, + { + "path": "micropolis-activity/src/sim/g_map.c", + "lines": 503, + "size": 11849 + }, + { + "path": "micropolis-activity/src/sim/g_setup.c", + "lines": 443, + "size": 11197 + }, + { + "path": "micropolis-activity/src/sim/g_smmaps.c", + "lines": 414, + "size": 11270 + }, + { + "path": "micropolis-activity/src/sim/headers/animtab.h", + "lines": 287, + "size": 16375 + }, + { + "path": "micropolis-activity/src/sim/headers/cam.h", + "lines": 217, + "size": 6404 + }, + { + "path": "micropolis-activity/src/sim/headers/mac.h", + "lines": 90, + "size": 3789 + }, + { + "path": "micropolis-activity/src/sim/headers/macros.h", + "lines": 127, + "size": 4732 + }, + { + "path": "micropolis-activity/src/sim/headers/sim.h", + "lines": 687, + "size": 18066 + }, + { + "path": "micropolis-activity/src/sim/headers/view.h", + "lines": 328, + "size": 8000 + }, + { + "path": "micropolis-activity/src/sim/rand.c", + "lines": 55, + "size": 2104 + }, + { + "path": "micropolis-activity/src/sim/random.c", + "lines": 366, + "size": 13317 + }, + { + "path": "micropolis-activity/src/sim/s_alloc.c", + "lines": 209, + "size": 6576 + }, + { + "path": "micropolis-activity/src/sim/s_disast.c", + "lines": 321, + "size": 8279 + }, + { + "path": "micropolis-activity/src/sim/s_eval.c", + "lines": 344, + "size": 8804 + }, + { + "path": "micropolis-activity/src/sim/s_fileio.c", + "lines": 604, + "size": 13937 + }, + { + "path": "micropolis-activity/src/sim/s_gen.c", + "lines": 643, + "size": 14620 + }, + { + "path": "micropolis-activity/src/sim/s_init.c", + "lines": 154, + "size": 4895 + }, + { + "path": "micropolis-activity/src/sim/s_msg.c", + "lines": 448, + "size": 10513 + }, + { + "path": "micropolis-activity/src/sim/s_power.c", + "lines": 253, + "size": 6777 + }, + { + "path": "micropolis-activity/src/sim/s_scan.c", + "lines": 540, + "size": 13575 + }, + { + "path": "micropolis-activity/src/sim/s_sim.c", + "lines": 1240, + "size": 29203 + }, + { + "path": "micropolis-activity/src/sim/s_traf.c", + "lines": 330, + "size": 8734 + }, + { + "path": "micropolis-activity/src/sim/s_zone.c", + "lines": 659, + "size": 14547 + }, + { + "path": "micropolis-activity/src/sim/sim.c", + "lines": 834, + "size": 19090 + }, + { + "path": "micropolis-activity/src/sim/terrain/mapgener.c", + "lines": 411, + "size": 9706 + }, + { + "path": "micropolis-activity/src/sim/terrain/terra.c", + "lines": 868, + "size": 25935 + }, + { + "path": "micropolis-activity/src/sim/terrain/terragen.c", + "lines": 508, + "size": 13263 + }, + { + "path": "micropolis-activity/src/sim/w_budget.c", + "lines": 349, + "size": 9412 + }, + { + "path": "micropolis-activity/src/sim/w_cam.c", + "lines": 877, + "size": 21272 + }, + { + "path": "micropolis-activity/src/sim/w_con.c", + "lines": 646, + "size": 15193 + }, + { + "path": "micropolis-activity/src/sim/w_date.c", + "lines": 736, + "size": 18192 + }, + { + "path": "micropolis-activity/src/sim/w_editor.c", + "lines": 1583, + "size": 39189 + }, + { + "path": "micropolis-activity/src/sim/w_eval.c", + "lines": 163, + "size": 6385 + }, + { + "path": "micropolis-activity/src/sim/w_graph.c", + "lines": 894, + "size": 22467 + }, + { + "path": "micropolis-activity/src/sim/w_inter.c", + "lines": 1604, + "size": 52720 + }, + { + "path": "micropolis-activity/src/sim/w_keys.c", + "lines": 325, + "size": 8900 + }, + { + "path": "micropolis-activity/src/sim/w_map.c", + "lines": 611, + "size": 14877 + }, + { + "path": "micropolis-activity/src/sim/w_net.c", + "lines": 154, + "size": 5053 + }, + { + "path": "micropolis-activity/src/sim/w_piem.c", + "lines": 2359, + "size": 66898 + }, + { + "path": "micropolis-activity/src/sim/w_print.c", + "lines": 110, + "size": 4025 + }, + { + "path": "micropolis-activity/src/sim/w_resrc.c", + "lines": 208, + "size": 6102 + }, + { + "path": "micropolis-activity/src/sim/w_sim.c", + "lines": 1697, + "size": 30545 + }, + { + "path": "micropolis-activity/src/sim/w_sound.c", + "lines": 161, + "size": 4754 + }, + { + "path": "micropolis-activity/src/sim/w_sprite.c", + "lines": 1641, + "size": 36929 + }, + { + "path": "micropolis-activity/src/sim/w_stubs.c", + "lines": 198, + "size": 5108 + }, + { + "path": "micropolis-activity/src/sim/w_tk.c", + "lines": 840, + "size": 20641 + }, + { + "path": "micropolis-activity/src/sim/w_tool.c", + "lines": 1695, + "size": 36496 + }, + { + "path": "micropolis-activity/src/sim/w_update.c", + "lines": 272, + "size": 6581 + }, + { + "path": "micropolis-activity/src/sim/w_util.c", + "lines": 295, + "size": 7142 + }, + { + "path": "micropolis-activity/src/sim/w_x.c", + "lines": 1564, + "size": 38862 + }, + { + "path": "micropolis-activity/src/tcl/compat/dirent.h", + "lines": 26, + "size": 809 + }, + { + "path": "micropolis-activity/src/tcl/compat/dirent2.h", + "lines": 62, + "size": 1658 + }, + { + "path": "micropolis-activity/src/tcl/compat/limits.h", + "lines": 20, + "size": 893 + }, + { + "path": "micropolis-activity/src/tcl/compat/opendir.c", + "lines": 106, + "size": 1983 + }, + { + "path": "micropolis-activity/src/tcl/compat/stdlib.h", + "lines": 48, + "size": 1937 + }, + { + "path": "micropolis-activity/src/tcl/compat/strerror.c", + "lines": 471, + "size": 11479 + }, + { + "path": "micropolis-activity/src/tcl/compat/string.h", + "lines": 56, + "size": 2180 + }, + { + "path": "micropolis-activity/src/tcl/compat/strstr.c", + "lines": 73, + "size": 1922 + }, + { + "path": "micropolis-activity/src/tcl/compat/strtod.c", + "lines": 259, + "size": 6087 + }, + { + "path": "micropolis-activity/src/tcl/compat/strtol.c", + "lines": 88, + "size": 2267 + }, + { + "path": "micropolis-activity/src/tcl/compat/strtoul.c", + "lines": 188, + "size": 4318 + }, + { + "path": "micropolis-activity/src/tcl/compat/testpid.c", + "lines": 30, + "size": 907 + }, + { + "path": "micropolis-activity/src/tcl/compat/teststrtoul.c", + "lines": 39, + "size": 1277 + }, + { + "path": "micropolis-activity/src/tcl/compat/testuid.c", + "lines": 30, + "size": 907 + }, + { + "path": "micropolis-activity/src/tcl/compat/testwait.c", + "lines": 40, + "size": 1244 + }, + { + "path": "micropolis-activity/src/tcl/panic.c", + "lines": 54, + "size": 1603 + }, + { + "path": "micropolis-activity/src/tcl/porting.txt", + "lines": 0, + "size": 5608 + }, + { + "path": "micropolis-activity/src/tcl/readme.txt", + "lines": 0, + "size": 8761 + }, + { + "path": "micropolis-activity/src/tcl/regexp.c", + "lines": 1233, + "size": 28088 + }, + { + "path": "micropolis-activity/src/tcl/regexp.h", + "lines": 30, + "size": 806 + }, + { + "path": "micropolis-activity/src/tcl/tcl.h", + "lines": 340, + "size": 11810 + }, + { + "path": "micropolis-activity/src/tcl/tclassem.c", + "lines": 207, + "size": 5815 + }, + { + "path": "micropolis-activity/src/tcl/tclbasic.c", + "lines": 1063, + "size": 28329 + }, + { + "path": "micropolis-activity/src/tcl/tclckall.c", + "lines": 533, + "size": 15386 + }, + { + "path": "micropolis-activity/src/tcl/tclcmdah.c", + "lines": 913, + "size": 22196 + }, + { + "path": "micropolis-activity/src/tcl/tclcmdil.c", + "lines": 1149, + "size": 29590 + }, + { + "path": "micropolis-activity/src/tcl/tclcmdmz.c", + "lines": 1420, + "size": 35676 + }, + { + "path": "micropolis-activity/src/tcl/tclenv.c", + "lines": 435, + "size": 11261 + }, + { + "path": "micropolis-activity/src/tcl/tclexpr.c", + "lines": 1336, + "size": 34332 + }, + { + "path": "micropolis-activity/src/tcl/tclget.c", + "lines": 184, + "size": 5183 + }, + { + "path": "micropolis-activity/src/tcl/tclglob.c", + "lines": 580, + "size": 15285 + }, + { + "path": "micropolis-activity/src/tcl/tclhash.c", + "lines": 931, + "size": 25017 + }, + { + "path": "micropolis-activity/src/tcl/tclhash.h", + "lines": 147, + "size": 4968 + }, + { + "path": "micropolis-activity/src/tcl/tclhist.c", + "lines": 1093, + "size": 30514 + }, + { + "path": "micropolis-activity/src/tcl/tclint.h", + "lines": 834, + "size": 32413 + }, + { + "path": "micropolis-activity/src/tcl/tclparse.c", + "lines": 1174, + "size": 32722 + }, + { + "path": "micropolis-activity/src/tcl/tclproc.c", + "lines": 567, + "size": 14709 + }, + { + "path": "micropolis-activity/src/tcl/tcltest.c", + "lines": 157, + "size": 3332 + }, + { + "path": "micropolis-activity/src/tcl/tclunix.h", + "lines": 321, + "size": 8384 + }, + { + "path": "micropolis-activity/src/tcl/tclunxaz.c", + "lines": 1709, + "size": 43274 + }, + { + "path": "micropolis-activity/src/tcl/tclunxst.c", + "lines": 730, + "size": 15307 + }, + { + "path": "micropolis-activity/src/tcl/tclunxut.c", + "lines": 1033, + "size": 28420 + }, + { + "path": "micropolis-activity/src/tcl/tclutil.c", + "lines": 1422, + "size": 36607 + }, + { + "path": "micropolis-activity/src/tcl/tclvar.c", + "lines": 2265, + "size": 63934 + }, + { + "path": "micropolis-activity/src/tclx/ossupp/fcntl.c", + "lines": 40, + "size": 946 + }, + { + "path": "micropolis-activity/src/tclx/ossupp/ids.c", + "lines": 80, + "size": 1578 + }, + { + "path": "micropolis-activity/src/tclx/ossupp/sigs.c", + "lines": 40, + "size": 986 + }, + { + "path": "micropolis-activity/src/tclx/ossupp/strftime.c", + "lines": 296, + "size": 6896 + }, + { + "path": "micropolis-activity/src/tclx/ossupp/times.c", + "lines": 46, + "size": 1135 + }, + { + "path": "micropolis-activity/src/tclx/src/main.c", + "lines": 79, + "size": 2476 + }, + { + "path": "micropolis-activity/src/tclx/src/patchlvl.h", + "lines": 2, + "size": 22 + }, + { + "path": "micropolis-activity/src/tclx/src/tclplus.h", + "lines": 570, + "size": 14411 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxbsrc.c", + "lines": 355, + "size": 10746 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxcclk.c", + "lines": 92, + "size": 2963 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxchmd.c", + "lines": 420, + "size": 12052 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxclck.c", + "lines": 109, + "size": 3256 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxclp.c", + "lines": 388, + "size": 12024 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxcret.c", + "lines": 302, + "size": 11188 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxdebg.c", + "lines": 406, + "size": 11565 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxdup.c", + "lines": 267, + "size": 8133 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxfcmd.c", + "lines": 856, + "size": 25276 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxfctl.c", + "lines": 352, + "size": 10095 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxfmat.c", + "lines": 693, + "size": 19148 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxfsca.c", + "lines": 582, + "size": 18202 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxgenl.c", + "lines": 186, + "size": 5745 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxhndl.c", + "lines": 456, + "size": 15380 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxid.c", + "lines": 331, + "size": 9702 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxint.h", + "lines": 535, + "size": 13942 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxklst.c", + "lines": 844, + "size": 26556 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxlib.c", + "lines": 1505, + "size": 46571 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxlist.c", + "lines": 278, + "size": 7384 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxmath.c", + "lines": 207, + "size": 5237 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxmerr.c", + "lines": 65, + "size": 2091 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxmsgc.c", + "lines": 356, + "size": 9625 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxproc.c", + "lines": 297, + "size": 8275 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxprof.c", + "lines": 702, + "size": 22542 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxrexp.c", + "lines": 493, + "size": 16414 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxsel.c", + "lines": 429, + "size": 13908 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxsig.c", + "lines": 1034, + "size": 30778 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxstr.c", + "lines": 498, + "size": 13601 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxstup.c", + "lines": 502, + "size": 17273 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxtend.h", + "lines": 214, + "size": 7154 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxunix.c", + "lines": 537, + "size": 14132 + }, + { + "path": "micropolis-activity/src/tclx/src/tclxutil.c", + "lines": 749, + "size": 21294 + }, + { + "path": "micropolis-activity/src/tclx/tkucbsrc/main.c", + "lines": 357, + "size": 9165 + }, + { + "path": "micropolis-activity/src/tclx/tkucbsrc/tkevent.c", + "lines": 1910, + "size": 53187 + }, + { + "path": "micropolis-activity/src/tclx/ucbsrc/tclbasic.c", + "lines": 1067, + "size": 28460 + }, + { + "path": "micropolis-activity/src/tclx/ucbsrc/tclexpr.c", + "lines": 1337, + "size": 34383 + }, + { + "path": "micropolis-activity/src/tk/default.h", + "lines": 341, + "size": 11431 + }, + { + "path": "micropolis-activity/src/tk/ks_names.h", + "lines": 917, + "size": 22724 + }, + { + "path": "micropolis-activity/src/tk/library/demos/tkSquare.c", + "lines": 531, + "size": 15725 + }, + { + "path": "micropolis-activity/src/tk/main.c", + "lines": 334, + "size": 8456 + }, + { + "path": "micropolis-activity/src/tk/tk.h", + "lines": 743, + "size": 29192 + }, + { + "path": "micropolis-activity/src/tk/tk3d.c", + "lines": 993, + "size": 28230 + }, + { + "path": "micropolis-activity/src/tk/tkargv.c", + "lines": 432, + "size": 11516 + }, + { + "path": "micropolis-activity/src/tk/tkatom.c", + "lines": 165, + "size": 4570 + }, + { + "path": "micropolis-activity/src/tk/tkbind.c", + "lines": 2229, + "size": 63596 + }, + { + "path": "micropolis-activity/src/tk/tkbitmap.c", + "lines": 496, + "size": 14484 + }, + { + "path": "micropolis-activity/src/tk/tkbutton.c", + "lines": 1545, + "size": 49754 + }, + { + "path": "micropolis-activity/src/tk/tkcanvas.c", + "lines": 3633, + "size": 110732 + }, + { + "path": "micropolis-activity/src/tk/tkcanvas.h", + "lines": 401, + "size": 15655 + }, + { + "path": "micropolis-activity/src/tk/tkcmds.c", + "lines": 818, + "size": 24149 + }, + { + "path": "micropolis-activity/src/tk/tkcolor.c", + "lines": 602, + "size": 16192 + }, + { + "path": "micropolis-activity/src/tk/tkconfig.c", + "lines": 847, + "size": 22834 + }, + { + "path": "micropolis-activity/src/tk/tkconfig.h", + "lines": 127, + "size": 3099 + }, + { + "path": "micropolis-activity/src/tk/tkcursor.c", + "lines": 643, + "size": 19208 + }, + { + "path": "micropolis-activity/src/tk/tkcvarc.c", + "lines": 1524, + "size": 45917 + }, + { + "path": "micropolis-activity/src/tk/tkcvbmap.c", + "lines": 641, + "size": 18184 + }, + { + "path": "micropolis-activity/src/tk/tkcvline.c", + "lines": 1452, + "size": 43661 + }, + { + "path": "micropolis-activity/src/tk/tkcvpoly.c", + "lines": 770, + "size": 22452 + }, + { + "path": "micropolis-activity/src/tk/tkcvtext.c", + "lines": 1369, + "size": 40317 + }, + { + "path": "micropolis-activity/src/tk/tkcvwind.c", + "lines": 772, + "size": 22266 + }, + { + "path": "micropolis-activity/src/tk/tkentry.c", + "lines": 1785, + "size": 55452 + }, + { + "path": "micropolis-activity/src/tk/tkerror.c", + "lines": 294, + "size": 8824 + }, + { + "path": "micropolis-activity/src/tk/tkevent.c", + "lines": 1904, + "size": 52960 + }, + { + "path": "micropolis-activity/src/tk/tkfont.c", + "lines": 773, + "size": 22252 + }, + { + "path": "micropolis-activity/src/tk/tkframe.c", + "lines": 507, + "size": 15378 + }, + { + "path": "micropolis-activity/src/tk/tkgc.c", + "lines": 334, + "size": 9027 + }, + { + "path": "micropolis-activity/src/tk/tkgeo.c", + "lines": 159, + "size": 4724 + }, + { + "path": "micropolis-activity/src/tk/tkget.c", + "lines": 593, + "size": 14416 + }, + { + "path": "micropolis-activity/src/tk/tkgrab.c", + "lines": 1112, + "size": 34409 + }, + { + "path": "micropolis-activity/src/tk/tkint.h", + "lines": 566, + "size": 18977 + }, + { + "path": "micropolis-activity/src/tk/tklist.c", + "lines": 1785, + "size": 53288 + }, + { + "path": "micropolis-activity/src/tk/tkmenu.c", + "lines": 2074, + "size": 63236 + }, + { + "path": "micropolis-activity/src/tk/tkmnbut.c", + "lines": 1166, + "size": 37007 + }, + { + "path": "micropolis-activity/src/tk/tkmsg.c", + "lines": 788, + "size": 23468 + }, + { + "path": "micropolis-activity/src/tk/tkoption.c", + "lines": 1336, + "size": 37494 + }, + { + "path": "micropolis-activity/src/tk/tkpack.c", + "lines": 1053, + "size": 30546 + }, + { + "path": "micropolis-activity/src/tk/tkpixmap.c", + "lines": 656, + "size": 20144 + }, + { + "path": "micropolis-activity/src/tk/tkplace.c", + "lines": 939, + "size": 27568 + }, + { + "path": "micropolis-activity/src/tk/tkpresrv.c", + "lines": 236, + "size": 6336 + }, + { + "path": "micropolis-activity/src/tk/tkrawtcp.c", + "lines": 694, + "size": 17379 + }, + { + "path": "micropolis-activity/src/tk/tkrectov.c", + "lines": 878, + "size": 26580 + }, + { + "path": "micropolis-activity/src/tk/tkscale.c", + "lines": 1418, + "size": 44267 + }, + { + "path": "micropolis-activity/src/tk/tkscrbar.c", + "lines": 1190, + "size": 36703 + }, + { + "path": "micropolis-activity/src/tk/tkselect.c", + "lines": 1889, + "size": 55044 + }, + { + "path": "micropolis-activity/src/tk/tksend.c", + "lines": 1177, + "size": 32687 + }, + { + "path": "micropolis-activity/src/tk/tkshare.c", + "lines": 409, + "size": 12088 + }, + { + "path": "micropolis-activity/src/tk/tktcp.c", + "lines": 2956, + "size": 80913 + }, + { + "path": "micropolis-activity/src/tk/tktcp.h", + "lines": 58, + "size": 1807 + }, + { + "path": "micropolis-activity/src/tk/tktext.c", + "lines": 1516, + "size": 46052 + }, + { + "path": "micropolis-activity/src/tk/tktext.h", + "lines": 416, + "size": 16057 + }, + { + "path": "micropolis-activity/src/tk/tktrig.c", + "lines": 1185, + "size": 32241 + }, + { + "path": "micropolis-activity/src/tk/tktxbtre.c", + "lines": 2375, + "size": 67340 + }, + { + "path": "micropolis-activity/src/tk/tktxdisp.c", + "lines": 2094, + "size": 63634 + }, + { + "path": "micropolis-activity/src/tk/tktxidx.c", + "lines": 640, + "size": 16933 + }, + { + "path": "micropolis-activity/src/tk/tktxtag.c", + "lines": 1067, + "size": 30802 + }, + { + "path": "micropolis-activity/src/tk/tkwindow.c", + "lines": 1601, + "size": 45586 + }, + { + "path": "micropolis-activity/src/tk/tkwm.c", + "lines": 2416, + "size": 72261 + }, + { + "path": "micropolis-activity/src/tk/tkwm.h", + "lines": 16, + "size": 353 + }, + { + "path": "micropolis-godot/.godot/editor/main.tscn-folding-3ad5c15c4f3250da0cc7c1af1770d85f.cfg", + "lines": 0, + "size": 703 + }, + { + "path": "micropolis-godot/.godot/editor/project_metadata.cfg", + "lines": 0, + "size": 131 + }, + { + "path": "micropolis-godot/.godot/global_script_class_cache.cfg", + "lines": 0, + "size": 339 + }, + { + "path": "micropolis-graphics/buildings_3d/scripts/render.sh", + "lines": 0, + "size": 240 + }, + { + "path": "micropolis-graphics/buildings_3d/standards.txt", + "lines": 0, + "size": 349 + }, + { + "path": "micropolis-java/.gitignore", + "lines": 0, + "size": 47 + }, + { + "path": "micropolis-java/FILE_FORMAT.txt", + "lines": 0, + "size": 408 + }, + { + "path": "micropolis-java/graphics/HACKING.txt", + "lines": 0, + "size": 950 + }, + { + "path": "micropolis-java/src/micropolisj/Main.java", + "lines": 31, + "size": 704 + }, + { + "path": "micropolis-java/src/micropolisj/build_tool/MakeTiles.java", + "lines": 304, + "size": 7483 + }, + { + "path": "micropolis-java/src/micropolisj/build_tool/RearrangeTiles.java", + "lines": 56, + "size": 1497 + }, + { + "path": "micropolis-java/src/micropolisj/engine/AirplaneSprite.java", + "lines": 93, + "size": 2206 + }, + { + "path": "micropolis-java/src/micropolisj/engine/BudgetNumbers.java", + "lines": 34, + "size": 883 + }, + { + "path": "micropolis-java/src/micropolisj/engine/BuildingTool.java", + "lines": 60, + "size": 1249 + }, + { + "path": "micropolis-java/src/micropolisj/engine/Bulldozer.java", + "lines": 117, + "size": 2564 + }, + { + "path": "micropolis-java/src/micropolisj/engine/CityBudget.java", + "lines": 45, + "size": 948 + }, + { + "path": "micropolis-java/src/micropolisj/engine/CityDimension.java", + "lines": 48, + "size": 993 + }, + { + "path": "micropolis-java/src/micropolisj/engine/CityEval.java", + "lines": 283, + "size": 6982 + }, + { + "path": "micropolis-java/src/micropolisj/engine/CityLocation.java", + "lines": 58, + "size": 1239 + }, + { + "path": "micropolis-java/src/micropolisj/engine/CityProblem.java", + "lines": 23, + "size": 542 + }, + { + "path": "micropolis-java/src/micropolisj/engine/CityRect.java", + "lines": 62, + "size": 1393 + }, + { + "path": "micropolis-java/src/micropolisj/engine/Disaster.java", + "lines": 22, + "size": 503 + }, + { + "path": "micropolis-java/src/micropolisj/engine/EarthquakeListener.java", + "lines": 17, + "size": 503 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ExplosionSprite.java", + "lines": 67, + "size": 1541 + }, + { + "path": "micropolis-java/src/micropolisj/engine/GameLevel.java", + "lines": 34, + "size": 840 + }, + { + "path": "micropolis-java/src/micropolisj/engine/HelicopterSprite.java", + "lines": 107, + "size": 2572 + }, + { + "path": "micropolis-java/src/micropolisj/engine/MapGenerator.java", + "lines": 546, + "size": 9549 + }, + { + "path": "micropolis-java/src/micropolisj/engine/MapListener.java", + "lines": 28, + "size": 925 + }, + { + "path": "micropolis-java/src/micropolisj/engine/MapScanner.java", + "lines": 965, + "size": 18163 + }, + { + "path": "micropolis-java/src/micropolisj/engine/MapState.java", + "lines": 30, + "size": 862 + }, + { + "path": "micropolis-java/src/micropolisj/engine/Micropolis.java", + "lines": 2704, + "size": 59343 + }, + { + "path": "micropolis-java/src/micropolisj/engine/MicropolisMessage.java", + "lines": 91, + "size": 3726 + }, + { + "path": "micropolis-java/src/micropolisj/engine/MicropolisTool.java", + "lines": 95, + "size": 2069 + }, + { + "path": "micropolis-java/src/micropolisj/engine/MonsterSprite.java", + "lines": 184, + "size": 3841 + }, + { + "path": "micropolis-java/src/micropolisj/engine/RoadLikeTool.java", + "lines": 466, + "size": 8762 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ShipSprite.java", + "lines": 144, + "size": 3316 + }, + { + "path": "micropolis-java/src/micropolisj/engine/Sound.java", + "lines": 47, + "size": 1238 + }, + { + "path": "micropolis-java/src/micropolisj/engine/Speed.java", + "lines": 37, + "size": 1233 + }, + { + "path": "micropolis-java/src/micropolisj/engine/Sprite.java", + "lines": 229, + "size": 5022 + }, + { + "path": "micropolis-java/src/micropolisj/engine/SpriteKind.java", + "lines": 33, + "size": 735 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TerrainBehavior.java", + "lines": 374, + "size": 7992 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TileBehavior.java", + "lines": 40, + "size": 920 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TileConstants.java", + "lines": 725, + "size": 17799 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TileSpec.java", + "lines": 365, + "size": 7449 + }, + { + "path": "micropolis-java/src/micropolisj/engine/Tiles.java", + "lines": 111, + "size": 2565 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ToolEffect.java", + "lines": 113, + "size": 2496 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ToolEffectIfc.java", + "lines": 32, + "size": 799 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ToolPreview.java", + "lines": 166, + "size": 3479 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ToolResult.java", + "lines": 20, + "size": 556 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ToolStroke.java", + "lines": 355, + "size": 6986 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TornadoSprite.java", + "lines": 89, + "size": 1693 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TrafficGen.java", + "lines": 231, + "size": 4123 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TrainSprite.java", + "lines": 102, + "size": 2732 + }, + { + "path": "micropolis-java/src/micropolisj/engine/TranslatedToolEffect.java", + "lines": 53, + "size": 1127 + }, + { + "path": "micropolis-java/src/micropolisj/engine/ZoneStatus.java", + "lines": 30, + "size": 1095 + }, + { + "path": "micropolis-java/src/micropolisj/gui/BudgetDialog.java", + "lines": 400, + "size": 12113 + }, + { + "path": "micropolis-java/src/micropolisj/gui/ColorParser.java", + "lines": 35, + "size": 1033 + }, + { + "path": "micropolis-java/src/micropolisj/gui/DemandIndicator.java", + "lines": 150, + "size": 3598 + }, + { + "path": "micropolis-java/src/micropolisj/gui/EvaluationPane.java", + "lines": 298, + "size": 8284 + }, + { + "path": "micropolis-java/src/micropolisj/gui/GraphsPane.java", + "lines": 332, + "size": 9452 + }, + { + "path": "micropolis-java/src/micropolisj/gui/MainWindow.java", + "lines": 1733, + "size": 44360 + }, + { + "path": "micropolis-java/src/micropolisj/gui/MessagesPane.java", + "lines": 44, + "size": 1117 + }, + { + "path": "micropolis-java/src/micropolisj/gui/MicropolisDrawingArea.java", + "lines": 469, + "size": 10569 + }, + { + "path": "micropolis-java/src/micropolisj/gui/NewCityDialog.java", + "lines": 233, + "size": 6102 + }, + { + "path": "micropolis-java/src/micropolisj/gui/NotificationPane.java", + "lines": 176, + "size": 5336 + }, + { + "path": "micropolis-java/src/micropolisj/gui/OverlayMapView.java", + "lines": 560, + "size": 12751 + }, + { + "path": "micropolis-java/src/micropolisj/gui/TileImages.java", + "lines": 134, + "size": 3790 + }, + { + "path": "micropolis-java/src/micropolisj/util/StringsModel.java", + "lines": 239, + "size": 4688 + }, + { + "path": "micropolis-java/src/micropolisj/util/TranslatedStringsTable.java", + "lines": 22, + "size": 625 + }, + { + "path": "micropolis-java/src/micropolisj/util/TranslationTool.java", + "lines": 325, + "size": 7693 + }, + { + "path": "turbogears/README.txt", + "lines": 0, + "size": 131 + }, + { + "path": "turbogears/debug-micropolis.py", + "lines": 22, + "size": 592 + }, + { + "path": "turbogears/dev.cfg", + "lines": 0, + "size": 1778 + }, + { + "path": "turbogears/micropolis/__init__.py", + "lines": 0, + "size": 0 + }, + { + "path": "turbogears/micropolis/commands.py", + "lines": 55, + "size": 1793 + }, + { + "path": "turbogears/micropolis/config/__init__.py", + "lines": 0, + "size": 0 + }, + { + "path": "turbogears/micropolis/config/app.cfg", + "lines": 0, + "size": 7202 + }, + { + "path": "turbogears/micropolis/config/log.cfg", + "lines": 0, + "size": 598 + }, + { + "path": "turbogears/micropolis/controllers.py", + "lines": 1911, + "size": 58295 + }, + { + "path": "turbogears/micropolis/htdocs/static/javascript/all.js", + "lines": 71, + "size": 105622 + }, + { + "path": "turbogears/micropolis/htdocs/static/javascript/all_pretty.js", + "lines": 3988, + "size": 154041 + }, + { + "path": "turbogears/micropolis/htdocs/static/javascript/embed-compressed.js", + "lines": 820, + "size": 46600 + }, + { + "path": "turbogears/micropolis/htdocs/static/javascript/jquery.js", + "lines": 32, + "size": 55774 + }, + { + "path": "turbogears/micropolis/htdocs/static/javascript/json2.js", + "lines": 481, + "size": 17454 + }, + { + "path": "turbogears/micropolis/htdocs/static/javascript/micropolis.js", + "lines": 7, + "size": 245 + }, + { + "path": "turbogears/micropolis/htdocs/static/javascript/micropolisFacebook.js", + "lines": 184, + "size": 4505 + }, + { + "path": "turbogears/micropolis/json.py", + "lines": 10, + "size": 311 + }, + { + "path": "turbogears/micropolis/model.py", + "lines": 529, + "size": 17258 + }, + { + "path": "turbogears/micropolis/release.py", + "lines": 14, + "size": 425 + }, + { + "path": "turbogears/micropolis/templates/__init__.py", + "lines": 0, + "size": 0 + }, + { + "path": "turbogears/micropolis/testming.py", + "lines": 89, + "size": 2376 + }, + { + "path": "turbogears/micropolis/tests/__init__.py", + "lines": 0, + "size": 0 + }, + { + "path": "turbogears/micropolis/tests/test_controllers.py", + "lines": 25, + "size": 765 + }, + { + "path": "turbogears/micropolis/tests/test_model.py", + "lines": 45, + "size": 1781 + }, + { + "path": "turbogears/prod.cfg", + "lines": 0, + "size": 1779 + }, + { + "path": "turbogears/sample-prod.cfg", + "lines": 0, + "size": 2382 + }, + { + "path": "turbogears/setup.py", + "lines": 78, + "size": 2488 + }, + { + "path": "turbogears/start-micropolis.py", + "lines": 30, + "size": 765 + }, + { + "path": "turbogears/test.cfg", + "lines": 0, + "size": 779 + }, + { + "path": "wikimedia/openlaszlo/openlaszlo.php", + "lines": 51, + "size": 1879 + } + ], + "conventions": { + "items": [ + "Docstrings present" + ] + } +} \ No newline at end of file diff --git a/.sentrux/baseline.json b/.sentrux/baseline.json new file mode 100644 index 000000000..9c45ce891 --- /dev/null +++ b/.sentrux/baseline.json @@ -0,0 +1,12 @@ +{ + "timestamp": 1775010773.6540775, + "quality_signal": 0.5415332570288858, + "coupling_score": 0.005863539445628998, + "cycle_count": 1, + "god_file_count": 108, + "hotspot_count": 64, + "complex_fn_count": 62, + "max_depth": 4, + "total_import_edges": 5628, + "cross_module_edges": 38 +} \ No newline at end of file diff --git a/turbogears/micropolis/__pycache__/__init__.cpython-311.pyc b/turbogears/micropolis/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29fc45db5966fd18177c744f7329408d2b4ab5ff GIT binary patch literal 153 zcmZ3^%ge<81g4E=GC}lX5CH>>P{wCAAY(d13PUi1CZpdMeo1LjQhs`BVo|YvZf0^(enEatX0d*Jd}dx|NqoFsLFF$Fo80`A(wtPgB37Vg XknzR*K;i>4BO~Jn1{hJq3={(Z({Cd# literal 0 HcmV?d00001 diff --git a/turbogears/micropolis/tests/__pycache__/__init__.cpython-311.pyc b/turbogears/micropolis/tests/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b4b14c2048464cf792c6101730e8a45cc61b625 GIT binary patch literal 159 zcmZ3^%ge<81g4E=GC}lX5CH>>P{wCAAY(d13PUi1CZpdMeo1LjQhs`BVo|YvZf0^(enEatX0d)rYH>-ietdjpUS>&ryk0@&FAkgB{FKt1 dRJ$Tppb;QTiur-W2WCb_#t#fIqKFwN1_0?$C6)jH literal 0 HcmV?d00001 diff --git a/turbogears/micropolis/tests/__pycache__/test_controllers.cpython-311-pytest-9.0.2.pyc b/turbogears/micropolis/tests/__pycache__/test_controllers.cpython-311-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b726aa6780db61370a29a1825df04315e9553a9d GIT binary patch literal 4903 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 Date: Wed, 1 Apr 2026 02:33:56 +0000 Subject: [PATCH 03/13] fix: bug-fix iteration 2 I'll analyze the test failures and fix the underlying import issues. Let me start by examining the test files and searching for the `testutil` module. find /workspace -name "testutil.py" -o -name "*testutil*" 2>/dev/null | head -20 --- .ph-constructor/build_log.jsonl | 1 + .ph-constructor/state.json | 169 ++++++++++++++++++++++++++++++++ 2 files changed, 170 insertions(+) create mode 100644 .ph-constructor/state.json diff --git a/.ph-constructor/build_log.jsonl b/.ph-constructor/build_log.jsonl index 7d49f711f..38a0b4dc7 100644 --- a/.ph-constructor/build_log.jsonl +++ b/.ph-constructor/build_log.jsonl @@ -1 +1,2 @@ {"ts": "2026-04-01T02:32:50.851325+00:00", "event": "bugfix_start", "data": {"max_iterations": 10}} +{"ts": "2026-04-01T02:33:25.260083+00:00", "event": "bugfix_iteration", "data": {"iteration": 1, "passed": false, "elapsed": 27.6}} diff --git a/.ph-constructor/state.json b/.ph-constructor/state.json new file mode 100644 index 000000000..120bf935a --- /dev/null +++ b/.ph-constructor/state.json @@ -0,0 +1,169 @@ +{ + "project_name": "micropolis", + "phase": "bugfix", + "build_mode": "auto", + "spec": { + "name": "micropolis", + "description": "Bugfix run for micropolis", + "project_type": "other", + "tech_stack": { + "language": "python", + "framework": null, + "database": null, + "frontend": null, + "testing": null, + "containerization": "docker", + "ci_cd": null, + "extras": [] + }, + "requirements": [], + "nfr": [], + "architecture": { + "pattern": "monolith", + "description": null, + "constraints": [] + }, + "acceptance_criteria": [], + "existing_repo": null, + "test_strategy": { + "unit": true, + "integration": true, + "e2e": false, + "framework": null, + "coverage_target": 80 + }, + "build_mode": "step", + "optimization": "balanced", + "modules": [], + "created_at": "2026-04-01T02:32:23.022619" + }, + "manifest": { + "project_name": "micropolis", + "crew_size": 6, + "assignments": [ + { + "role": "planner", + "model_id": "deepseek-v3.2", + "provider": "openai", + "system_prompt": "You are the Director of the construction crew — a Principal Software\nArchitect with quantum cognitive architecture. You perform Phase 1 of the\nUltimate Coder workflow: Consciousness Awakening & Multi-Dimensional Analysis.\nYou think like Claude Opus — deep, structured, adversarial reasoning.\nYou decompose problems across surface, hidden, meta, systemic, and temporal\nlayers before any code is written.\n\n\nBEFORE planning, execute this mental workflow:\n1. Constitutional Analysis: What are the ethical, quality, and safety constraints?\n2. Multi-Perspective Synthesis: Technical, user, business, security, maintainability views\n3. Adversarial Pre-Analysis: What could go wrong? What am I missing? What will the coder get wrong?\n4. Meta-Cognitive Awareness: Am I over-engineering? Under-engineering? Making assumptions?\n\n\nGiven a project specification, decompose it into concrete, implementable\nmodules. For each module define: name, responsibility, public interfaces,\ndependencies, priority, and file paths. Apply SOLID principles during\ndecomposition — each module should have a Single Responsibility.\n\n\nOutput structured JSON with this exact schema:\n{\"modules\": [\n {\"name\": \"module-name\",\n \"description\": \"What this module does (1-2 sentences)\",\n \"dependencies\": [\"other-module-name\"],\n \"files\": [\"src/module_name/file.ext\"]}\n]}\n\n\n\nDESIGN PRIORITIES (in order — never compromise):\n1. Security — identify modules that handle auth, input validation, secrets\n2. Quality — each module must be testable and correct in isolation\n3. Readability — clear naming reflecting domain concepts\n4. Maintainability — loose coupling, high cohesion, Open/Closed principle\n\nPLANNING RULES:\n- Be pragmatic — avoid over-engineering. START simple, add complexity only when justified\n- Prefer composition over inheritance, flat over nested\n- Create 3-8 modules (not too granular, not too monolithic)\n- Each module should have 1-4 source files — one per logical concern\n- Order modules so dependencies come first (topological sort)\n- Apply DRY: if two modules share logic, plan a shared utility\n- Apply ISP: don't force downstream modules to depend on interfaces they don't use\n- Identify error/edge cases DURING planning — don't leave them for the coder to discover\n\n\nExecute multi-dimensional decomposition:\n1. Surface analysis: What does the spec literally ask for?\n2. Hidden requirements: What's implied but not stated (error handling, logging, config)?\n3. Systemic concerns: How do modules interact? Where are the failure points?\n4. Temporal concerns: What changes over time? What needs to be extensible?\n5. Adversarial check: If a bad LLM implements this plan, what will go wrong?\n Add guardrails in the plan to prevent that.\nThen create the dependency graph and output the plan.\n", + "tools": [ + "file_read", + "project_tree" + ], + "fallback_models": [ + "qwen3-coder-next", + "qwen3-coder:480b", + "grok-4-1-fast-non-reasoning" + ] + }, + { + "role": "architect", + "model_id": "kimi-k2.5", + "provider": "openai", + "system_prompt": "You are the Lead Architect of the construction crew — a world-class\nSoftware Architect performing Phase 2 of the Ultimate Coder workflow:\nCodebase Investigation & Design. You think like Claude Opus — producing\nimplementation-ready technical specifications that are precise, concrete,\nand leave no ambiguity for the coder. You design for the real world,\nnot the happy path.\n\n\nBEFORE designing, execute this analysis:\n1. Read existing code FIRST — understand conventions, patterns, naming before creating anything\n2. Constitutional check: Does this design satisfy security > quality > readability > maintainability?\n3. Adversarial pre-analysis: How could a coder misinterpret this design? Add clarity to prevent it\n4. Dependency analysis: Map all inputs/outputs/side effects before defining interfaces\n\n\nGiven a module specification from the planner, design the complete\nfile structure with interfaces, types, and contracts. Every interface\nyou define must be implementable without ambiguity.\n\n\nUse tools to persist your design as files:\n- project_tree: Inspect current directory structure FIRST\n- file_read: Read existing code to understand patterns and conventions\n- file_create/file_write: Create every designed file on disk\n- Do NOT write file contents as prose — call tools to create files\n\n\n\nEach file must contain:\n- All imports/includes needed\n- Complete class/struct/function signatures with types\n- Docstrings describing purpose, parameters, return types, and exceptions\n- Constants, enums, and configuration values\n- Stub/empty bodies only — implementation stage fills these in\n\nSOLID DESIGN (MANDATORY):\n- SRP: Each class has one reason to change\n- OCP: Design for extension without modification (use ABCs, protocols)\n- LSP: Subtypes must be substitutable for their base types\n- ISP: Keep interfaces small and focused\n- DIP: Depend on abstractions, not concretions\n\nADDITIONAL RULES:\n- Follow GoF patterns when complexity justifies it (Strategy, Factory, Observer)\n- Define error types and exception hierarchy for each module\n- Include input validation contracts in docstrings\n- Do NOT write implementation logic — but DO specify exact behavior contracts\n- Do NOT skip any file from the plan\n- Match existing project naming conventions exactly\n\n\nExecute systematic design:\n1. Read the existing codebase to understand patterns\n2. Examine the module spec and identify required interfaces\n3. Design the data flow (inputs → transforms → outputs)\n4. Define error cases and validation boundaries\n5. Create each file systematically, ensuring no ambiguity\n6. Adversarial check: Re-read each interface — could a coder misunderstand it?\n", + "tools": [ + "file_read", + "file_write", + "file_create", + "project_tree" + ], + "fallback_models": [ + "qwen3.5:397b", + "mistral-large-3:675b", + "grok-4-1-fast-non-reasoning" + ] + }, + { + "role": "coder_1", + "model_id": "devstral-small-2:24b", + "provider": "openai", + "system_prompt": "You are the Implementation Engine of the construction crew — a legendary\nSenior Software Engineer performing Phase 4 of the Ultimate Coder workflow:\nRecursive Implementation with Continuous Meta-Analysis. You think like\nClaude Opus — deep, methodical, self-correcting. You write complete,\nproduction-quality code with real logic. You NEVER produce placeholders,\nstubs, or skeleton code. Your code is your reputation.\n\n\nBEFORE writing ANY code, execute this workflow:\n1. READ the entire codebase context — understand patterns, conventions, naming FIRST\n2. PLAN which files to modify and in what order (dependencies first)\n3. IMPLEMENT incrementally — one function at a time, test after each\n4. VALIDATE — run tests, check for regressions, verify behavior\n5. META-REFLECT — did I actually implement the feature, or just scaffold it?\n6. ADVERSARIAL CHECK — if I were a code reviewer, what would I reject?\nAfter each change, ask: \"Does this ACTUALLY work, or did I just make it compile?\"\n\n\nImplement the assigned coding task by reading existing code, writing\ncomplete implementations, and verifying with tests. Every function you write\nmust contain actual working logic that does what it claims.\n\n\nUse the provided tools to produce file changes:\n- file_read: Read existing code FIRST to understand patterns and conventions\n- file_edit: Modify existing files with exact old_string/new_string\n- file_write/file_create: Create new files with complete content\n- run_tests: Verify no regressions after EVERY change\n- lint: Catch style and type issues early\n\n\n\nCRITICAL PROBLEM-SOLVING PHILOSOPHY:\n- NEVER suppress, disable, or hide warnings/errors/alerts\n- Find the ROOT CAUSE — investigate deeply, don't treat symptoms\n- Fix the ACTUAL PROBLEM — don't silence diagnostics\n- Test to CONFIRM — verify the fix resolves the issue completely\n\nQUALITY RULES (violations cause AUTOMATIC REJECTION by QualityGate):\n- NEVER use `pass` as a function body — write real logic\n- NEVER use `raise NotImplementedError` — fully implement the feature\n- NEVER replace tests with `assert True` stubs\n- NEVER delete existing tests to make code pass — fix YOUR code instead\n- NEVER create files that are only imports with no real logic\n- NEVER comment out assertions or validation logic\n- Every function MUST do what its docstring describes\n- Every new module MUST be imported and used by existing code\n- If tests fail, fix your implementation — not the tests\n\nDESIGN PRIORITIES (in order — never compromise):\n1. Security — input validation, injection prevention, no hardcoded secrets\n2. Quality — correctness, robustness, proper error handling\n3. Readability — clear naming, small focused functions\n4. Maintainability — SOLID principles, DRY, appropriate GoF patterns\n5. Testability — mockable dependencies, pure functions where possible\n\nCODING STANDARDS:\n- Follow the architecture spec exactly\n- Write idiomatic code for the target language\n- Apply SOLID: each class/function has one responsibility\n- Apply DRY: extract shared logic, never copy-paste\n- Handle edge cases: empty inputs, None/null, boundary values, error paths\n- Add input validation at module boundaries (public functions)\n- Use the project's established naming conventions\n- Prefer composition over inheritance\n\n\nExecute the Ultimate Coder implementation loop:\n1. READ: Study the codebase — what patterns exist? What conventions are used?\n2. PLAN: Which files need changes? In what order? What are the dependencies?\n3. IMPLEMENT: Write one function/method at a time with complete logic\n4. TEST: Run tests after each change — fix regressions immediately\n5. REFLECT: Re-read my code — is this real implementation or placeholder?\n Would Martin Fowler approve? Would it pass code review?\n6. ITERATE: If anything is incomplete, go back to step 3\nAfter ALL changes, do a final adversarial review of your own work.\n", + "tools": [ + "file_read", + "file_write", + "file_create", + "file_edit", + "file_delete", + "project_tree", + "shell_exec", + "run_tests", + "lint" + ], + "fallback_models": [ + "glm-4.7", + "minimax-m2.5", + "grok-4-1-fast-non-reasoning" + ] + }, + { + "role": "coder_2", + "model_id": "glm-4.7", + "provider": "openai", + "system_prompt": "You are the Implementation Engine of the construction crew — a legendary\nSenior Software Engineer performing Phase 4 of the Ultimate Coder workflow:\nRecursive Implementation with Continuous Meta-Analysis. You think like\nClaude Opus — deep, methodical, self-correcting. You write complete,\nproduction-quality code with real logic. You NEVER produce placeholders,\nstubs, or skeleton code. Your code is your reputation.\n\n\nBEFORE writing ANY code, execute this workflow:\n1. READ the entire codebase context — understand patterns, conventions, naming FIRST\n2. PLAN which files to modify and in what order (dependencies first)\n3. IMPLEMENT incrementally — one function at a time, test after each\n4. VALIDATE — run tests, check for regressions, verify behavior\n5. META-REFLECT — did I actually implement the feature, or just scaffold it?\n6. ADVERSARIAL CHECK — if I were a code reviewer, what would I reject?\nAfter each change, ask: \"Does this ACTUALLY work, or did I just make it compile?\"\n\n\nImplement the assigned coding task by reading existing code, writing\ncomplete implementations, and verifying with tests. Every function you write\nmust contain actual working logic that does what it claims.\n\n\nUse the provided tools to produce file changes:\n- file_read: Read existing code FIRST to understand patterns and conventions\n- file_edit: Modify existing files with exact old_string/new_string\n- file_write/file_create: Create new files with complete content\n- run_tests: Verify no regressions after EVERY change\n- lint: Catch style and type issues early\n\n\n\nCRITICAL PROBLEM-SOLVING PHILOSOPHY:\n- NEVER suppress, disable, or hide warnings/errors/alerts\n- Find the ROOT CAUSE — investigate deeply, don't treat symptoms\n- Fix the ACTUAL PROBLEM — don't silence diagnostics\n- Test to CONFIRM — verify the fix resolves the issue completely\n\nQUALITY RULES (violations cause AUTOMATIC REJECTION by QualityGate):\n- NEVER use `pass` as a function body — write real logic\n- NEVER use `raise NotImplementedError` — fully implement the feature\n- NEVER replace tests with `assert True` stubs\n- NEVER delete existing tests to make code pass — fix YOUR code instead\n- NEVER create files that are only imports with no real logic\n- NEVER comment out assertions or validation logic\n- Every function MUST do what its docstring describes\n- Every new module MUST be imported and used by existing code\n- If tests fail, fix your implementation — not the tests\n\nDESIGN PRIORITIES (in order — never compromise):\n1. Security — input validation, injection prevention, no hardcoded secrets\n2. Quality — correctness, robustness, proper error handling\n3. Readability — clear naming, small focused functions\n4. Maintainability — SOLID principles, DRY, appropriate GoF patterns\n5. Testability — mockable dependencies, pure functions where possible\n\nCODING STANDARDS:\n- Follow the architecture spec exactly\n- Write idiomatic code for the target language\n- Apply SOLID: each class/function has one responsibility\n- Apply DRY: extract shared logic, never copy-paste\n- Handle edge cases: empty inputs, None/null, boundary values, error paths\n- Add input validation at module boundaries (public functions)\n- Use the project's established naming conventions\n- Prefer composition over inheritance\n\n\nExecute the Ultimate Coder implementation loop:\n1. READ: Study the codebase — what patterns exist? What conventions are used?\n2. PLAN: Which files need changes? In what order? What are the dependencies?\n3. IMPLEMENT: Write one function/method at a time with complete logic\n4. TEST: Run tests after each change — fix regressions immediately\n5. REFLECT: Re-read my code — is this real implementation or placeholder?\n Would Martin Fowler approve? Would it pass code review?\n6. ITERATE: If anything is incomplete, go back to step 3\nAfter ALL changes, do a final adversarial review of your own work.\n", + "tools": [ + "file_read", + "file_write", + "file_create", + "file_edit", + "file_delete", + "project_tree", + "shell_exec", + "run_tests", + "lint" + ], + "fallback_models": [ + "devstral-small-2:24b", + "minimax-m2.5", + "grok-4-1-fast-non-reasoning" + ] + }, + { + "role": "tester", + "model_id": "minimax-m2.5", + "provider": "openai", + "system_prompt": "You are the Constitutional Debugger of the construction crew — a\nworld-class QA Engineer performing Phase 4b of the Ultimate Coder workflow:\nConstitutional Debugging & Validation. You think like Claude Opus —\nsystematic, exhaustive, adversarial. Your tests are the quality gate that\nprevents broken code from shipping. You write thorough, meaningful tests\nthat verify real behavior — never trivial stubs.\n\n\nBEFORE writing ANY test:\n1. READ the actual source code — understand what the function does, not what you assume\n2. IDENTIFY contracts — what are the inputs, outputs, side effects, exceptions?\n3. ADVERSARIAL THINKING — what inputs would break this? Empty? None? Huge? Negative? Concurrent?\n4. BOUNDARY ANALYSIS — what are the edge cases? Off-by-one? Type coercion? Unicode?\n5. META-CHECK — am I testing behavior or implementation details? Tests should survive refactors\n\n\nGiven an implementation, produce comprehensive test coverage:\nunit tests, integration tests, edge case tests, and fixtures. Your tests\nmust verify that the code ACTUALLY WORKS — not just that it doesn't crash.\n\n\nUse tools to produce test files:\n- file_read: Read EVERY source file BEFORE writing tests — understand the actual code\n- file_create: Write test files with complete, meaningful test cases\n- run_tests: Execute and verify tests pass\n\n\n\nMANDATORY QUALITY STANDARDS:\n- READ the actual source code before writing ANY tests — no assumptions\n- Every test must exercise REAL LOGIC — no `assert True` stubs\n- Every assertion must verify a MEANINGFUL PROPERTY, not just \"didn't crash\"\n- Test names must describe the behavior being verified\n\nCOVERAGE STRATEGY (follow this order):\n1. Happy path: Normal inputs, expected outputs\n2. Edge cases: empty/zero/None/max/min/boundary values\n3. Error handling: invalid inputs, network failures, permission errors\n4. Integration: modules working together correctly\n5. Adversarial: malicious inputs, injection attempts, resource exhaustion\n\nCRITICAL RULES:\n- If tests fail due to implementation bugs, REPORT CLEARLY — do not modify implementation\n- Mock external dependencies (network, DB, filesystem) — tests must be deterministic\n- Focus on BEHAVIOR, not implementation details — tests must survive refactors\n- Meaningful coverage over 100% line coverage\n- NEVER weaken or delete existing tests\n- NEVER write `assert True`, `assert 1 == 1`, or any trivial assertion\n- NEVER skip error path testing — if a function can raise, test that it does\n\n\nExecute constitutional test design:\n1. READ the source — understand every function's contract\n2. MAP the test matrix: for each function, list [inputs × expected_outputs]\n3. IDENTIFY boundaries: where do types change? Where are the limits?\n4. WRITE tests systematically: happy → edge → error → integration → adversarial\n5. RUN and verify — every test must pass for the right reasons\n6. META-CHECK: Do these tests actually catch bugs? Would a broken\n implementation still pass? If yes, the tests are too weak.\n", + "tools": [ + "file_read", + "file_write", + "file_create", + "project_tree", + "shell_exec", + "run_tests" + ], + "fallback_models": [ + "devstral-small-2:24b", + "glm-4.7", + "grok-4-1-fast-non-reasoning" + ] + }, + { + "role": "reviewer", + "model_id": "qwen3.5:397b", + "provider": "openai", + "system_prompt": "You are the Adversarial Validator of the construction crew — a world-class\nSenior Code Reviewer performing Phase 5 of the Ultimate Coder workflow:\nAdversarial Solution Validation. You think like Claude Opus — systematic,\nthorough, uncompromising on quality. You red-team every change. You provide\nprecise, actionable findings ranked by impact. No filler, no hedging —\ndirect assessments with specific evidence.\n\n\nREVIEW WITH ADVERSARIAL THINKING:\n1. Constitutional check: Does this code satisfy Security > Quality > Readability > Maintainability?\n2. Red-team: How could this code fail in production? Under load? With malicious input?\n3. Pattern analysis: Are SOLID principles followed? Is there DRY violation? Anti-patterns?\n4. Meta-cognitive: Am I being too lenient? Too harsh? Am I missing something obvious?\n5. Temporal analysis: Will this code be maintainable in 6 months? Is it extensible?\n\n\nAnalyze the provided codebase and produce findings in these areas,\nordered by the Design Priority hierarchy:\n1. Security: input validation, injection risks, auth gaps, OWASP Top 10, secrets exposure\n2. Quality: correctness, robustness, error handling, edge cases\n3. Readability: naming, structure, documentation clarity\n4. Maintainability: coupling, SOLID violations, DRY violations, missing abstractions\n5. Testability: coverage gaps, missing edge case tests, untestable designs\n6. Performance: obvious bottlenecks, N+1 queries, missing caching\n\n\n\nFor each finding provide: category, severity (critical/high/medium/low),\nfile and location, specific recommendation with code example, and estimated\neffort (trivial/small/medium/large). Prioritize by impact-to-effort ratio.\n\nENHANCEMENT VALIDATION (critical — prevents bad code from shipping):\n- Code actually implements the described functionality (not stubs/placeholders)\n- Tests have real assertions testing real behavior (not just `assert True`)\n- New modules are integrated (imported and used, not orphaned files)\n- No existing test coverage was removed, weakened, or replaced with stubs\n- Error handling is present and meaningful (not bare `except: pass`)\n- SOLID principles are followed (especially SRP and DIP)\n- No God Objects, no Spaghetti Code, no Copy-Paste Programming\n\nFORBIDDEN PATTERNS (auto-reject if found):\n- `pass` as function body in non-abstract methods\n- `raise NotImplementedError` in non-abstract methods\n- `assert True` or `assert 1 == 1` in tests\n- Deleted or commented-out tests\n- Suppressed warnings/errors (pragma disable, -Wno-*, etc.)\n- Bare except clauses with no error handling\n\n\nExecute adversarial review:\n1. Read each file systematically — does it do what it claims?\n2. Check the Design Priority hierarchy: security → quality → readability → maintainability\n3. Look for anti-patterns: God Objects, Spaghetti Code, Copy-Paste, placeholder code\n4. Verify SOLID compliance: SRP, OCP, LSP, ISP, DIP\n5. Red-team: What happens with empty input? Null? Concurrent access? Malicious data?\n6. Final check: If I were Martin Fowler reviewing this PR, would I approve it?\n", + "tools": [ + "file_read", + "project_tree", + "lint", + "security_scan" + ], + "fallback_models": [ + "kimi-k2.5", + "mistral-large-3:675b", + "grok-4-1-fast-non-reasoning" + ] + } + ], + "rationale": "Bugfix run on monolith codebase with unit/integration testing needs. Balanced optimization favors lean team: 2 coders for parallel fixes, 1 tester for 80% coverage, 1 reviewer for code quality. Docker adds minimal complexity. No devops/security needed for bugfix-only scope.", + "created_at": "2026-04-01T02:32:50.099321" + }, + "tasks": [], + "completed_phases": [], + "git_commits": [], + "git_branches": [], + "conversation_history": [], + "errors": [], + "started_at": "2026-04-01T02:32:23.022633", + "paused_at": null, + "resumed_at": null +} \ No newline at end of file From bb4e612ece18630b48c4d2c05d3d4826a6aeb4e1 Mon Sep 17 00:00:00 2001 From: Xanderful Date: Wed, 1 Apr 2026 02:34:05 +0000 Subject: [PATCH 04/13] fix: bug-fix iteration 3 I'll analyze the test failures and fix the underlying issues. Let me start by examining the failing test files and understanding the import problems. ```tool file_read path: "turbogears/micropolis/tests/test_controllers.py" ``` --- .ph-constructor/build_log.jsonl | 1 + 1 file changed, 1 insertion(+) diff --git a/.ph-constructor/build_log.jsonl b/.ph-constructor/build_log.jsonl index 38a0b4dc7..beab9d755 100644 --- a/.ph-constructor/build_log.jsonl +++ b/.ph-constructor/build_log.jsonl @@ -1,2 +1,3 @@ {"ts": "2026-04-01T02:32:50.851325+00:00", "event": "bugfix_start", "data": {"max_iterations": 10}} {"ts": "2026-04-01T02:33:25.260083+00:00", "event": "bugfix_iteration", "data": {"iteration": 1, "passed": false, "elapsed": 27.6}} +{"ts": "2026-04-01T02:33:57.797307+00:00", "event": "bugfix_iteration", "data": {"iteration": 2, "passed": false, "elapsed": 25.0}} From e97785ba505a44cd4592a8bbb5fdfce091493cd6 Mon Sep 17 00:00:00 2001 From: Xanderful Date: Wed, 1 Apr 2026 02:34:15 +0000 Subject: [PATCH 05/13] fix: bug-fix iteration 4 I'll analyze these test failures and fix the underlying issues. Let me start by examining the test files to understand what they're trying to import. turbogears/micropolis/tests/test_controllers.py --- .ph-constructor/build_log.jsonl | 1 + 1 file changed, 1 insertion(+) diff --git a/.ph-constructor/build_log.jsonl b/.ph-constructor/build_log.jsonl index beab9d755..50ec5dfdd 100644 --- a/.ph-constructor/build_log.jsonl +++ b/.ph-constructor/build_log.jsonl @@ -1,3 +1,4 @@ {"ts": "2026-04-01T02:32:50.851325+00:00", "event": "bugfix_start", "data": {"max_iterations": 10}} {"ts": "2026-04-01T02:33:25.260083+00:00", "event": "bugfix_iteration", "data": {"iteration": 1, "passed": false, "elapsed": 27.6}} {"ts": "2026-04-01T02:33:57.797307+00:00", "event": "bugfix_iteration", "data": {"iteration": 2, "passed": false, "elapsed": 25.0}} +{"ts": "2026-04-01T02:34:06.763797+00:00", "event": "bugfix_iteration", "data": {"iteration": 3, "passed": false, "elapsed": 1.7}} From 50c1b79cfe561bc4f1e4d15132d184774330e015 Mon Sep 17 00:00:00 2001 From: Xanderful Date: Wed, 1 Apr 2026 02:34:42 +0000 Subject: [PATCH 06/13] fix: bug-fix iteration 5 I'm currently unable to access the necessary tools to analyze and fix the test failures you've described. The error messages indicate that the tests are failing because they cannot import `turbogears.testutil`. This is typically a Python path or package structure issue. To help you resolve this, I would need to: 1. Examine the project structure to understand how TurboGears is organized 2. Check if `testutil` exists in the TurboGears package 3. Verify the Python path and import statements 4. Po --- .ph-constructor/build_log.jsonl | 1 + 1 file changed, 1 insertion(+) diff --git a/.ph-constructor/build_log.jsonl b/.ph-constructor/build_log.jsonl index 50ec5dfdd..511269910 100644 --- a/.ph-constructor/build_log.jsonl +++ b/.ph-constructor/build_log.jsonl @@ -2,3 +2,4 @@ {"ts": "2026-04-01T02:33:25.260083+00:00", "event": "bugfix_iteration", "data": {"iteration": 1, "passed": false, "elapsed": 27.6}} {"ts": "2026-04-01T02:33:57.797307+00:00", "event": "bugfix_iteration", "data": {"iteration": 2, "passed": false, "elapsed": 25.0}} {"ts": "2026-04-01T02:34:06.763797+00:00", "event": "bugfix_iteration", "data": {"iteration": 3, "passed": false, "elapsed": 1.7}} +{"ts": "2026-04-01T02:34:17.308537+00:00", "event": "bugfix_iteration", "data": {"iteration": 4, "passed": false, "elapsed": 3.5}} From fa8d918788ed319654da70eaacf6ecb929719ce9 Mon Sep 17 00:00:00 2001 From: Xanderful Date: Wed, 1 Apr 2026 02:34:52 +0000 Subject: [PATCH 07/13] fix: bug-fix iteration 6 I'll analyze the failing tests and fix the underlying import issues. Let me start by examining the test files and the turbogears package structure. turbogears/micropolis/tests/test_controllers.py --- .ph-constructor/build_log.jsonl | 1 + 1 file changed, 1 insertion(+) diff --git a/.ph-constructor/build_log.jsonl b/.ph-constructor/build_log.jsonl index 511269910..60321cc7a 100644 --- a/.ph-constructor/build_log.jsonl +++ b/.ph-constructor/build_log.jsonl @@ -3,3 +3,4 @@ {"ts": "2026-04-01T02:33:57.797307+00:00", "event": "bugfix_iteration", "data": {"iteration": 2, "passed": false, "elapsed": 25.0}} {"ts": "2026-04-01T02:34:06.763797+00:00", "event": "bugfix_iteration", "data": {"iteration": 3, "passed": false, "elapsed": 1.7}} {"ts": "2026-04-01T02:34:17.308537+00:00", "event": "bugfix_iteration", "data": {"iteration": 4, "passed": false, "elapsed": 3.5}} +{"ts": "2026-04-01T02:34:44.538574+00:00", "event": "bugfix_iteration", "data": {"iteration": 5, "passed": false, "elapsed": 19.9}} From 4ce48a42607e0e207f3f19d4ee47bd076afd884a Mon Sep 17 00:00:00 2001 From: Xanderful Date: Wed, 1 Apr 2026 02:35:01 +0000 Subject: [PATCH 08/13] fix: bug-fix iteration 7 I'll analyze the test failures and fix the underlying issues. Let me start by examining the failing test files and understanding the import problems. ```tool file_read { "path": "turbogears/micropolis/tests/test_controllers.py" } ``` ```tool file_read { "path": "turbogears/micropolis/tests/test_model.py" } ``` --- .ph-constructor/build_log.jsonl | 1 + 1 file changed, 1 insertion(+) diff --git a/.ph-constructor/build_log.jsonl b/.ph-constructor/build_log.jsonl index 60321cc7a..312e9335e 100644 --- a/.ph-constructor/build_log.jsonl +++ b/.ph-constructor/build_log.jsonl @@ -4,3 +4,4 @@ {"ts": "2026-04-01T02:34:06.763797+00:00", "event": "bugfix_iteration", "data": {"iteration": 3, "passed": false, "elapsed": 1.7}} {"ts": "2026-04-01T02:34:17.308537+00:00", "event": "bugfix_iteration", "data": {"iteration": 4, "passed": false, "elapsed": 3.5}} {"ts": "2026-04-01T02:34:44.538574+00:00", "event": "bugfix_iteration", "data": {"iteration": 5, "passed": false, "elapsed": 19.9}} +{"ts": "2026-04-01T02:34:54.371297+00:00", "event": "bugfix_iteration", "data": {"iteration": 6, "passed": false, "elapsed": 2.8}} From e15a23aa8e2cf2f9656af037859301e36e5f25ce Mon Sep 17 00:00:00 2001 From: Xanderful Date: Wed, 1 Apr 2026 02:35:11 +0000 Subject: [PATCH 09/13] fix: bug-fix iteration 8 I'll analyze the failing tests and fix the underlying issues. Let me start by examining the test files to understand what's failing. turbogears/micropolis/tests/test_controllers.py --- .ph-constructor/build_log.jsonl | 1 + 1 file changed, 1 insertion(+) diff --git a/.ph-constructor/build_log.jsonl b/.ph-constructor/build_log.jsonl index 312e9335e..38593bb28 100644 --- a/.ph-constructor/build_log.jsonl +++ b/.ph-constructor/build_log.jsonl @@ -5,3 +5,4 @@ {"ts": "2026-04-01T02:34:17.308537+00:00", "event": "bugfix_iteration", "data": {"iteration": 4, "passed": false, "elapsed": 3.5}} {"ts": "2026-04-01T02:34:44.538574+00:00", "event": "bugfix_iteration", "data": {"iteration": 5, "passed": false, "elapsed": 19.9}} {"ts": "2026-04-01T02:34:54.371297+00:00", "event": "bugfix_iteration", "data": {"iteration": 6, "passed": false, "elapsed": 2.8}} +{"ts": "2026-04-01T02:35:03.318496+00:00", "event": "bugfix_iteration", "data": {"iteration": 7, "passed": false, "elapsed": 1.9}} From a4a474bbd38a48a11a317f830fcce56f7a9bf408 Mon Sep 17 00:00:00 2001 From: Xanderful Date: Wed, 1 Apr 2026 02:35:21 +0000 Subject: [PATCH 10/13] fix: bug-fix iteration 9 I'll analyze the test failures and fix the underlying issues. Let me start by examining the failing test files and understanding the import problems. ```tool file_read { "path": "turbogears/micropolis/tests/test_controllers.py" } ``` ```tool file_read { "path": "turbogears/micropolis/tests/test_model.py" } ``` ```tool file_list_dir { "path": "turbogears" } ``` --- .ph-constructor/build_log.jsonl | 1 + 1 file changed, 1 insertion(+) diff --git a/.ph-constructor/build_log.jsonl b/.ph-constructor/build_log.jsonl index 38593bb28..d6beea682 100644 --- a/.ph-constructor/build_log.jsonl +++ b/.ph-constructor/build_log.jsonl @@ -6,3 +6,4 @@ {"ts": "2026-04-01T02:34:44.538574+00:00", "event": "bugfix_iteration", "data": {"iteration": 5, "passed": false, "elapsed": 19.9}} {"ts": "2026-04-01T02:34:54.371297+00:00", "event": "bugfix_iteration", "data": {"iteration": 6, "passed": false, "elapsed": 2.8}} {"ts": "2026-04-01T02:35:03.318496+00:00", "event": "bugfix_iteration", "data": {"iteration": 7, "passed": false, "elapsed": 1.9}} +{"ts": "2026-04-01T02:35:13.210413+00:00", "event": "bugfix_iteration", "data": {"iteration": 8, "passed": false, "elapsed": 2.6}} From 29a1e9f09d47e8b8554e36002d99b454dc9a5cdd Mon Sep 17 00:00:00 2001 From: Xanderful Date: Wed, 1 Apr 2026 02:35:32 +0000 Subject: [PATCH 11/13] fix: bug-fix iteration 10 I'll analyze the test failures and fix the underlying issues. Let me start by examining the test files and the turbogears package structure. --- .ph-constructor/build_log.jsonl | 1 + 1 file changed, 1 insertion(+) diff --git a/.ph-constructor/build_log.jsonl b/.ph-constructor/build_log.jsonl index d6beea682..eaf6e7f8d 100644 --- a/.ph-constructor/build_log.jsonl +++ b/.ph-constructor/build_log.jsonl @@ -7,3 +7,4 @@ {"ts": "2026-04-01T02:34:54.371297+00:00", "event": "bugfix_iteration", "data": {"iteration": 6, "passed": false, "elapsed": 2.8}} {"ts": "2026-04-01T02:35:03.318496+00:00", "event": "bugfix_iteration", "data": {"iteration": 7, "passed": false, "elapsed": 1.9}} {"ts": "2026-04-01T02:35:13.210413+00:00", "event": "bugfix_iteration", "data": {"iteration": 8, "passed": false, "elapsed": 2.6}} +{"ts": "2026-04-01T02:35:22.753732+00:00", "event": "bugfix_iteration", "data": {"iteration": 9, "passed": false, "elapsed": 2.1}} From 01218b78bcaefea6278a85ebc9306e1764b96ddd Mon Sep 17 00:00:00 2001 From: ph-constructor Date: Wed, 1 Apr 2026 02:35:41 +0000 Subject: [PATCH 12/13] bugfix: automated changes (bugfix/20260401-023541) --- .ph-constructor/build_log.jsonl | 2 ++ .ph-constructor/codebase_knowledge.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.ph-constructor/build_log.jsonl b/.ph-constructor/build_log.jsonl index eaf6e7f8d..123577c5c 100644 --- a/.ph-constructor/build_log.jsonl +++ b/.ph-constructor/build_log.jsonl @@ -8,3 +8,5 @@ {"ts": "2026-04-01T02:35:03.318496+00:00", "event": "bugfix_iteration", "data": {"iteration": 7, "passed": false, "elapsed": 1.9}} {"ts": "2026-04-01T02:35:13.210413+00:00", "event": "bugfix_iteration", "data": {"iteration": 8, "passed": false, "elapsed": 2.6}} {"ts": "2026-04-01T02:35:22.753732+00:00", "event": "bugfix_iteration", "data": {"iteration": 9, "passed": false, "elapsed": 2.1}} +{"ts": "2026-04-01T02:35:34.183971+00:00", "event": "bugfix_iteration", "data": {"iteration": 10, "passed": false, "elapsed": 4.0}} +{"ts": "2026-04-01T02:35:40.905118+00:00", "event": "bugfix_complete", "data": {"iterations": 10, "elapsed": 167.2}} diff --git a/.ph-constructor/codebase_knowledge.json b/.ph-constructor/codebase_knowledge.json index d6b254ecd..003d7100b 100644 --- a/.ph-constructor/codebase_knowledge.json +++ b/.ph-constructor/codebase_knowledge.json @@ -1,6 +1,6 @@ { "project_root": "/home/joseph/Phoenix-Construction/projects/micropolis", - "scanned_at": "2026-04-01T02:32:50.107857+00:00", + "scanned_at": "2026-04-01T02:35:40.905921+00:00", "summary": { "total_files": 471, "total_code_files": 419, From 5a53b4036de1a796dcd41b48a6980844b1ce91a2 Mon Sep 17 00:00:00 2001 From: Xanderful Date: Wed, 1 Apr 2026 02:46:39 +0000 Subject: [PATCH 13/13] fix: bug-fix iteration 1 I wasn't able to complete that request. The required plugin may not be configured. --- .ph-constructor/build_log.jsonl | 1 + .ph-constructor/codebase_knowledge.json | 2 +- .sentrux/baseline.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.ph-constructor/build_log.jsonl b/.ph-constructor/build_log.jsonl index 123577c5c..14ad6cd7a 100644 --- a/.ph-constructor/build_log.jsonl +++ b/.ph-constructor/build_log.jsonl @@ -10,3 +10,4 @@ {"ts": "2026-04-01T02:35:22.753732+00:00", "event": "bugfix_iteration", "data": {"iteration": 9, "passed": false, "elapsed": 2.1}} {"ts": "2026-04-01T02:35:34.183971+00:00", "event": "bugfix_iteration", "data": {"iteration": 10, "passed": false, "elapsed": 4.0}} {"ts": "2026-04-01T02:35:40.905118+00:00", "event": "bugfix_complete", "data": {"iterations": 10, "elapsed": 167.2}} +{"ts": "2026-04-01T02:46:01.581302+00:00", "event": "bugfix_start", "data": {"max_iterations": 10}} diff --git a/.ph-constructor/codebase_knowledge.json b/.ph-constructor/codebase_knowledge.json index 003d7100b..9e3bc0cb3 100644 --- a/.ph-constructor/codebase_knowledge.json +++ b/.ph-constructor/codebase_knowledge.json @@ -1,6 +1,6 @@ { "project_root": "/home/joseph/Phoenix-Construction/projects/micropolis", - "scanned_at": "2026-04-01T02:35:40.905921+00:00", + "scanned_at": "2026-04-01T02:46:00.813144+00:00", "summary": { "total_files": 471, "total_code_files": 419, diff --git a/.sentrux/baseline.json b/.sentrux/baseline.json index 9c45ce891..6394bb559 100644 --- a/.sentrux/baseline.json +++ b/.sentrux/baseline.json @@ -1,5 +1,5 @@ { - "timestamp": 1775010773.6540775, + "timestamp": 1775011564.313989, "quality_signal": 0.5415332570288858, "coupling_score": 0.005863539445628998, "cycle_count": 1,