From e281512787cb4b9278d75a0baa49bcda746ae3ee Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 10 May 2022 00:16:12 +0200 Subject: [PATCH] Choo Choo, Part IV - Trains now play a sound sequence based on attached blocks when arriving at a station after travelling for some time - Trains can now be stalled by movement behaviours of mounted blocks - Fixed bells constantly activating when mounted to a train - Max train length is now configurable and substantially longer --- src/generated/resources/.cache/cache | 34 ++--- .../resources/assets/create/lang/en_us.json | 3 + .../assets/create/lang/unfinished/de_de.json | 5 +- .../assets/create/lang/unfinished/es_cl.json | 5 +- .../assets/create/lang/unfinished/es_es.json | 5 +- .../assets/create/lang/unfinished/fr_fr.json | 5 +- .../assets/create/lang/unfinished/it_it.json | 5 +- .../assets/create/lang/unfinished/ja_jp.json | 5 +- .../assets/create/lang/unfinished/ko_kr.json | 5 +- .../assets/create/lang/unfinished/nl_nl.json | 5 +- .../assets/create/lang/unfinished/pl_pl.json | 5 +- .../assets/create/lang/unfinished/pt_br.json | 5 +- .../assets/create/lang/unfinished/pt_pt.json | 5 +- .../assets/create/lang/unfinished/ro_ro.json | 5 +- .../assets/create/lang/unfinished/ru_ru.json | 5 +- .../assets/create/lang/unfinished/zh_cn.json | 5 +- .../assets/create/lang/unfinished/zh_tw.json | 5 +- .../resources/assets/create/sounds.json | 27 ++++ .../com/simibubi/create/AllSoundEvents.java | 14 +- .../actors/BellMovementBehaviour.java | 8 +- .../deployer/DeployerMovementBehaviour.java | 36 +++-- .../steam/whistle/WhistleSoundInstance.java | 4 +- .../BlockMovementChecks.java | 37 +++-- .../trains/entity/ArrivalSoundQueue.java | 133 ++++++++++++++++++ .../logistics/trains/entity/Carriage.java | 4 + .../trains/entity/CarriageContraption.java | 16 +++ .../entity/CarriageContraptionEntity.java | 85 +++++++++-- .../logistics/trains/entity/Navigation.java | 7 + .../logistics/trains/entity/Train.java | 14 +- .../station/AbstractStationScreen.java | 1 + .../edgePoint/station/AssemblyScreen.java | 5 +- .../edgePoint/station/StationScreen.java | 6 +- .../edgePoint/station/StationTileEntity.java | 16 ++- .../create/foundation/config/CTrains.java | 4 + .../assets/create/sounds/whistle_low_old.ogg | Bin 44230 -> 0 bytes .../assets/create/sounds/whistle_train.ogg | Bin 0 -> 9515 bytes .../create/sounds/whistle_train_high.ogg | Bin 0 -> 10939 bytes .../create/sounds/whistle_train_low.ogg | Bin 0 -> 10640 bytes 38 files changed, 443 insertions(+), 86 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java delete mode 100644 src/main/resources/assets/create/sounds/whistle_low_old.ogg create mode 100644 src/main/resources/assets/create/sounds/whistle_train.ogg create mode 100644 src/main/resources/assets/create/sounds/whistle_train_high.ogg create mode 100644 src/main/resources/assets/create/sounds/whistle_train_low.ogg diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index e172e4484..75d5b5836 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -544,22 +544,22 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 875f9aff979888b9d63d6a425cbf544431f1af5a assets/create/lang/en_ud.json -c8e4df6292133a1873e4dccb34c00b1e52afcd92 assets/create/lang/en_us.json -3ca43c518fc5c0120b5cf2aaf37cc78f51625fd4 assets/create/lang/unfinished/de_de.json -128d3e35cf2d41dacdb54abd8562091f15323a8c assets/create/lang/unfinished/es_cl.json -f02d6b15275a22ac665303e6d7181998f408e1a7 assets/create/lang/unfinished/es_es.json -02e43d3f9d2527c2cd72f1a5bfe76397b6cfa32f assets/create/lang/unfinished/fr_fr.json -9f0982f15705f8c3f675f9dfac5b68a753ddf97a assets/create/lang/unfinished/it_it.json -84d0f74256115e505a239ed826b28002fbc67f86 assets/create/lang/unfinished/ja_jp.json -96dfb6f44098b2a44c4ba6c53ed6f42a4d7811f5 assets/create/lang/unfinished/ko_kr.json -5ea64ddc9613b72376220353819a477bf4c6d64d assets/create/lang/unfinished/nl_nl.json -dd81cd81f426833b627831530c77ab3f3655bb39 assets/create/lang/unfinished/pl_pl.json -7cdff911043ccc6232932f85825090305ce92426 assets/create/lang/unfinished/pt_br.json -ba139e8ea012ed05598ea5bb57ee6ac95693efdd assets/create/lang/unfinished/pt_pt.json -86ac8dc000591768856bbaa873f9d101faddc1cd assets/create/lang/unfinished/ro_ro.json -14988b8d3a0b97a7c6b49f392d5088fd59a3aaaa assets/create/lang/unfinished/ru_ru.json -99ffa28fe67913dda825628947e5763f0a21ee8a assets/create/lang/unfinished/zh_cn.json -01da3a96eb7aeea75afed38dd1a83321959fcf0a assets/create/lang/unfinished/zh_tw.json +0a0155981901a175ef3d80376bd12bf6ed87fc40 assets/create/lang/en_us.json +2441d72bd7c3f9bd175a3b7ad6dfd08650244333 assets/create/lang/unfinished/de_de.json +c78d38ed11410f3749b0531faddb47bc864c602e assets/create/lang/unfinished/es_cl.json +3f324c1793d15fc4efee2496ded04ef40a149eef assets/create/lang/unfinished/es_es.json +a75c200cad527244a00e9c8d8044b99ebcb4f434 assets/create/lang/unfinished/fr_fr.json +f8498450f21370fc25144fb02d7f3de644302eae assets/create/lang/unfinished/it_it.json +fb99ffda9c4f753478d69d4a7e672d2934e4eefe assets/create/lang/unfinished/ja_jp.json +c5b3a59940d9d1f31bd333acb05e77a07833f8f7 assets/create/lang/unfinished/ko_kr.json +1a8e15b473cc565d4a0ce6a077ebb21b04436caa assets/create/lang/unfinished/nl_nl.json +a4c4763232172a82d131bdcf9418e8944faa4767 assets/create/lang/unfinished/pl_pl.json +4293a80519e12fe25df446daf66a2c93abde0c29 assets/create/lang/unfinished/pt_br.json +40b6e4ba6fbdc90902288bbf0be9fd65a08d0bce assets/create/lang/unfinished/pt_pt.json +e4a748bfbb60cb7b597921115ce69b45bbfb3d79 assets/create/lang/unfinished/ro_ro.json +5539e89820b997b42e5605202e5c8ba508e80b77 assets/create/lang/unfinished/ru_ru.json +b3f274b8dc40d041733ba10cab527c5130f68bcf assets/create/lang/unfinished/zh_cn.json +5309ae6bd90efd2cf5e8adb730c2d2f4818edf7d assets/create/lang/unfinished/zh_tw.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -2155,7 +2155,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json -92c34840e05861f7f98aa2f942f9a90370f82cd6 assets/create/sounds.json +56f5b100aa98b37efb44b85856ff4bfeaa7a89ec assets/create/sounds.json 0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json 613e64b44bed959da899fdd54c1cacb227fb33f2 data/create/advancements/andesite_alloy.json 81885c6bfb85792c88aaa7c9b70f58832945d31f data/create/advancements/andesite_casing.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index a8348c037..b4ba24a0e 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1591,7 +1591,10 @@ "create.subtitle.potato_hit": "Vegetable impacts", "create.subtitle.saw_activate_wood": "Mechanical Saw activates", "create.subtitle.whistle_high": "High whistling", + "create.subtitle.whistle_train": "Whistling", "create.subtitle.haunted_bell_convert": "Haunted Bell awakens", + "create.subtitle.whistle_train_high": "High whistling", + "create.subtitle.whistle_train_low": "Low whistling", "create.subtitle.deny": "Declining boop", "create.subtitle.controller_click": "Controller clicks", "create.subtitle.whistle_low": "Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index ba1bd10d7..9fe22059d 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1534", + "_": "Missing Localizations: 1537", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_cl.json b/src/generated/resources/assets/create/lang/unfinished/es_cl.json index cf040cab2..88da16e32 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_cl.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_cl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 556", + "_": "Missing Localizations: 559", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "Impactos vegetales", "create.subtitle.saw_activate_wood": "Sierra Mecánica se activa", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "Campana Embrujada despierta", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "Boop denegante", "create.subtitle.controller_click": "Controlador cliquea", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index afa0eb6c1..cbf678d2a 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 227", + "_": "Missing Localizations: 230", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "Impacto de vegetal", "create.subtitle.saw_activate_wood": "Sierra mecánica activada", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "Campana maldita se despierta", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "Pitido denegante", "create.subtitle.controller_click": "", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 5f5e14a95..13f2cc4e3 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1796", + "_": "Missing Localizations: 1799", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index f968424c3..df6a738c6 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1485", + "_": "Missing Localizations: 1488", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 97675bda5..dda9a8ef5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 222", + "_": "Missing Localizations: 225", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "野菜の衝撃", "create.subtitle.saw_activate_wood": "メカニカルソーが動作する", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "憑りつかれた鐘が目覚める", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "失敗音", "create.subtitle.controller_click": "コントローラーのカチカチ音", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 032930d2f..edb7137fc 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 222", + "_": "Missing Localizations: 225", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "채소가 부딫힘", "create.subtitle.saw_activate_wood": "톱이 작동함", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "종에 귀신이 들림", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "취소음", "create.subtitle.controller_click": "조작기를 누름", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 2a5ee0564..a714167ff 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 2148", + "_": "Missing Localizations: 2151", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json index cfb2fc191..daaed4897 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json +++ b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 595", + "_": "Missing Localizations: 598", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "Warzywo ląduje", "create.subtitle.saw_activate_wood": "Mechaniczna piła aktywuje się", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "Nawiedzony dzwon budzi się", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "Dźwięk odmowy", "create.subtitle.controller_click": "Sterownik klika", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 63512bdad..7f26447d9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1396", + "_": "Missing Localizations: 1399", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_pt.json b/src/generated/resources/assets/create/lang/unfinished/pt_pt.json index b67ce3882..24ee64f31 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_pt.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_pt.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1768", + "_": "Missing Localizations: 1771", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/ro_ro.json b/src/generated/resources/assets/create/lang/unfinished/ro_ro.json index 7a0c43bfe..838c56bda 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ro_ro.json +++ b/src/generated/resources/assets/create/lang/unfinished/ro_ro.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 223", + "_": "Missing Localizations: 226", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "Impact de legumă", "create.subtitle.saw_activate_wood": "Ferăstrău Mecanic se activează", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "Clopot Bântuit se trezețte", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "Boop de refuz", "create.subtitle.controller_click": "Controlor clickuiește", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index aa5f5b619..ff8631f41 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 600", + "_": "Missing Localizations: 603", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "Овощ врезается", "create.subtitle.saw_activate_wood": "Активируется механическая пила", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "Призрачный колокол пробуждается", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "Отрицательный «Буп»", "create.subtitle.controller_click": "Клики контроллера", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 4b8a10998..f2973e25f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 222", + "_": "Missing Localizations: 225", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "土豆:击中", "create.subtitle.saw_activate_wood": "动力锯:切割", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "奇异钟:转化", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "提示声:出错", "create.subtitle.controller_click": "遥控器:按下按钮", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 66c18c141..9079e4385 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 614", + "_": "Missing Localizations: 617", "_": "->------------------------] Game Elements [------------------------<-", @@ -1592,7 +1592,10 @@ "create.subtitle.potato_hit": "食物撞擊聲", "create.subtitle.saw_activate_wood": "機械鋸子運作聲", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "靈魂鐘轉化聲", + "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_low": "UNLOCALIZED: Low whistling", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "遙控器按鍵聲", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index fd39c82df..e5da11631 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -419,6 +419,33 @@ ], "subtitle": "create.subtitle.whistle_low" }, + "whistle_train": { + "sounds": [ + { + "name": "create:whistle_train", + "type": "file" + } + ], + "subtitle": "create.subtitle.whistle_train" + }, + "whistle_train_high": { + "sounds": [ + { + "name": "create:whistle_train_high", + "type": "file" + } + ], + "subtitle": "create.subtitle.whistle_train_high" + }, + "whistle_train_low": { + "sounds": [ + { + "name": "create:whistle_train_low", + "type": "file" + } + ], + "subtitle": "create.subtitle.whistle_train_low" + }, "worldshaper_place": { "sounds": [ { diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index 903313641..a5275e6e3 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -228,7 +228,7 @@ public class AllSoundEvents { .attenuationDistance(64) .build(), - WHISTLE = create("whistle").subtitle("Whistling") + WHISTLE_MEDIUM = create("whistle").subtitle("Whistling") .category(SoundSource.RECORDS) .attenuationDistance(64) .build(), @@ -238,6 +238,18 @@ public class AllSoundEvents { .attenuationDistance(64) .build(), + WHISTLE_TRAIN_HIGH = create("whistle_train_high").subtitle("High whistling") + .category(SoundSource.RECORDS) + .build(), + + WHISTLE_TRAIN_MEDIUM = create("whistle_train").subtitle("Whistling") + .category(SoundSource.RECORDS) + .build(), + + WHISTLE_TRAIN_LOW = create("whistle_train_low").subtitle("Low whistling") + .category(SoundSource.RECORDS) + .build(), + WHISTLE_CHIFF = create("chiff").noSubtitle() .category(SoundSource.RECORDS) .build(), diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java index 056929ba4..e521fdfad 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.actors; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.curiosities.bell.AbstractBellBlock; +import com.simibubi.create.content.logistics.trains.entity.CarriageContraption; import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvents; @@ -17,6 +18,11 @@ public class BellMovementBehaviour implements MovementBehaviour { public boolean renderAsNormalTileEntity() { return true; } + + @Override + public boolean isActive(MovementContext context) { + return !(context.contraption instanceof CarriageContraption); + } @Override public void onSpeedChanged(MovementContext context, Vec3 oldMotion, Vec3 motion) { @@ -28,7 +34,7 @@ public class BellMovementBehaviour implements MovementBehaviour { @Override public void stopMoving(MovementContext context) { - if (context.position != null) + if (context.position != null && isActive(context)) playSound(context); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java index 45d47c096..720bc8ae0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java @@ -83,8 +83,13 @@ public class DeployerMovementBehaviour implements MovementBehaviour { .getNormal()); facingVec = context.rotation.apply(facingVec); Vec3 vec = context.position.subtract(facingVec.scale(2)); + + float xRot = AbstractContraptionEntity.pitchFromVector(facingVec) - 90; + if (Math.abs(xRot) > 89) + facingVec = context.rotation.apply(new Vec3(0, 0, 1)); + player.setYRot(AbstractContraptionEntity.yawFromVector(facingVec)); - player.setXRot(AbstractContraptionEntity.pitchFromVector(facingVec) - 90); + player.setXRot(xRot); DeployerHandler.activate(player, vec, pos, facingVec, mode); } @@ -105,7 +110,7 @@ public class DeployerMovementBehaviour implements MovementBehaviour { if (schematicWorld == null) return; if (!schematicWorld.getBounds() - .isInside(pos.subtract(schematicWorld.anchor))) + .isInside(pos.subtract(schematicWorld.anchor))) return; BlockState blockState = schematicWorld.getBlockState(pos); ItemRequirement requirement = ItemRequirement.of(blockState, schematicWorld.getBlockEntity(pos)); @@ -121,15 +126,15 @@ public class DeployerMovementBehaviour implements MovementBehaviour { IItemHandler iItemHandler = context.contraption.inventory; for (ItemRequirement.StackRequirement required : requiredItems) { int amountFound = ItemHelper - .extract(iItemHandler, s -> ItemRequirement.validate(required.item, s), ExtractionCountMode.UPTO, - required.item.getCount(), true) - .getCount(); + .extract(iItemHandler, s -> ItemRequirement.validate(required.item, s), ExtractionCountMode.UPTO, + required.item.getCount(), true) + .getCount(); if (amountFound < required.item.getCount()) return; } for (ItemRequirement.StackRequirement required : requiredItems) - ItemHelper.extract(iItemHandler, s -> ItemRequirement.validate(required.item, s), ExtractionCountMode.UPTO, - required.item.getCount(), false); + ItemHelper.extract(iItemHandler, s -> ItemRequirement.validate(required.item, s), + ExtractionCountMode.UPTO, required.item.getCount(), false); } CompoundTag data = null; @@ -183,7 +188,8 @@ public class DeployerMovementBehaviour implements MovementBehaviour { if (player == null) return; - context.tileData.put("Inventory", player.getInventory().save(new ListTag())); + context.tileData.put("Inventory", player.getInventory() + .save(new ListTag())); player.discard(); } @@ -215,8 +221,7 @@ public class DeployerMovementBehaviour implements MovementBehaviour { if (itemstack.isEmpty()) continue; - if (list == inv.items && i == inv.selected - && FilterItem.test(context.world, itemstack, filter)) + if (list == inv.items && i == inv.selected && FilterItem.test(context.world, itemstack, filter)) continue; dropItem(context, itemstack); @@ -237,9 +242,11 @@ public class DeployerMovementBehaviour implements MovementBehaviour { private DeployerFakePlayer getPlayer(MovementContext context) { if (!(context.temporaryData instanceof DeployerFakePlayer) && context.world instanceof ServerLevel) { DeployerFakePlayer deployerFakePlayer = new DeployerFakePlayer((ServerLevel) context.world); - deployerFakePlayer.getInventory().load(context.tileData.getList("Inventory", Tag.TAG_COMPOUND)); + deployerFakePlayer.getInventory() + .load(context.tileData.getList("Inventory", Tag.TAG_COMPOUND)); if (context.data.contains("HeldItem")) - deployerFakePlayer.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.of(context.data.getCompound("HeldItem"))); + deployerFakePlayer.setItemInHand(InteractionHand.MAIN_HAND, + ItemStack.of(context.data.getCompound("HeldItem"))); context.tileData.remove("Inventory"); context.temporaryData = deployerFakePlayer; } @@ -257,7 +264,7 @@ public class DeployerMovementBehaviour implements MovementBehaviour { @Override public void renderInContraption(MovementContext context, VirtualRenderWorld renderWorld, ContraptionMatrices matrices, MultiBufferSource buffers) { - if (!Backend.isOn()) + if (!Backend.isOn()) DeployerRenderer.renderInContraption(context, renderWorld, matrices, buffers); } @@ -268,7 +275,8 @@ public class DeployerMovementBehaviour implements MovementBehaviour { @Nullable @Override - public ActorInstance createInstance(MaterialManager materialManager, VirtualRenderWorld simulationWorld, MovementContext context) { + public ActorInstance createInstance(MaterialManager materialManager, VirtualRenderWorld simulationWorld, + MovementContext context) { return new DeployerActorInstance(materialManager, simulationWorld, context); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleSoundInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleSoundInstance.java index 8908a378a..0a91e3340 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleSoundInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleSoundInstance.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.components.steam.whistle; -import static com.simibubi.create.AllSoundEvents.WHISTLE; +import static com.simibubi.create.AllSoundEvents.WHISTLE_MEDIUM; import static com.simibubi.create.AllSoundEvents.WHISTLE_HIGH; import static com.simibubi.create.AllSoundEvents.WHISTLE_LOW; @@ -18,7 +18,7 @@ public class WhistleSoundInstance extends AbstractTickableSoundInstance { private WhistleSize size; public WhistleSoundInstance(WhistleSize size, BlockPos worldPosition) { - super((size == WhistleSize.SMALL ? WHISTLE_HIGH : size == WhistleSize.MEDIUM ? WHISTLE : WHISTLE_LOW) + super((size == WhistleSize.SMALL ? WHISTLE_HIGH : size == WhistleSize.MEDIUM ? WHISTLE_MEDIUM : WHISTLE_LOW) .getMainEvent(), SoundSource.RECORDS); this.size = size; looping = true; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java index b65997686..970dba444 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java @@ -11,6 +11,8 @@ import com.simibubi.create.content.contraptions.components.actors.PloughBlock; import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceBlock; import com.simibubi.create.content.contraptions.components.crank.HandCrankBlock; import com.simibubi.create.content.contraptions.components.fan.NozzleBlock; +import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock; +import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleExtenderBlock; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.ClockworkBearingBlock; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.ClockworkBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingBlock; @@ -146,8 +148,7 @@ public class BlockMovementChecks { /** * Attached blocks will move if blocks they are attached to are moved */ - public static boolean isBlockAttachedTowards(BlockState state, Level world, BlockPos pos, - Direction direction) { + public static boolean isBlockAttachedTowards(BlockState state, Level world, BlockPos pos, Direction direction) { for (AttachedCheck check : ATTACHED_CHECKS) { CheckResult result = check.isBlockAttachedTowards(state, world, pos, direction); if (result != CheckResult.PASS) { @@ -179,10 +180,10 @@ public class BlockMovementChecks { if (state.getBlock() instanceof FenceGateBlock) return true; if (state.getMaterial() - .isReplaceable()) + .isReplaceable()) return false; if (state.getCollisionShape(world, pos) - .isEmpty()) + .isEmpty()) return false; return true; } @@ -258,11 +259,15 @@ public class BlockMovementChecks { return true; if (block instanceof WoolCarpetBlock) return true; + if (block instanceof WhistleBlock) + return true; + if (block instanceof WhistleExtenderBlock) + return true; return AllBlockTags.BRITTLE.matches(state); } private static boolean isBlockAttachedTowardsFallback(BlockState state, Level world, BlockPos pos, - Direction direction) { + Direction direction) { Block block = state.getBlock(); if (block instanceof LadderBlock) return state.getValue(LadderBlock.FACING) == direction.getOpposite(); @@ -331,18 +336,23 @@ public class BlockMovementChecks { } if (state.getBlock() instanceof SailBlock) return direction.getAxis() != state.getValue(SailBlock.FACING) - .getAxis(); + .getAxis(); if (state.getBlock() instanceof FluidTankBlock) return FluidTankConnectivityHandler.isConnected(world, pos, pos.relative(direction)); if (state.getBlock() instanceof ItemVaultBlock) return ItemVaultConnectivityHandler.isConnected(world, pos, pos.relative(direction)); if (AllBlocks.STICKER.has(state) && state.getValue(StickerBlock.EXTENDED)) { return direction == state.getValue(StickerBlock.FACING) - && !isNotSupportive(world.getBlockState(pos.relative(direction)), direction.getOpposite()); + && !isNotSupportive(world.getBlockState(pos.relative(direction)), direction.getOpposite()); } if (block instanceof IBogeyBlock bogey) return bogey.getStickySurfaces(world, pos, state) .contains(direction); + if (block instanceof WhistleBlock) + return direction == (state.getValue(WhistleBlock.WALL) ? state.getValue(WhistleBlock.FACING) + : Direction.DOWN); + if (block instanceof WhistleExtenderBlock) + return direction == Direction.DOWN; return false; } @@ -355,7 +365,7 @@ public class BlockMovementChecks { return state.getValue(HarvesterBlock.FACING) == facing; if (AllBlocks.MECHANICAL_PLOUGH.has(state)) return state.getValue(PloughBlock.FACING) == facing; - + if (AllBlocks.CART_ASSEMBLER.has(state)) return Direction.DOWN == facing; if (AllBlocks.MECHANICAL_SAW.has(state)) @@ -373,10 +383,10 @@ public class BlockMovementChecks { .getAxis(); if (AllBlocks.PISTON_EXTENSION_POLE.has(state)) return facing.getAxis() != state.getValue(BlockStateProperties.FACING) - .getAxis(); + .getAxis(); if (AllBlocks.MECHANICAL_PISTON_HEAD.has(state)) return facing.getAxis() != state.getValue(BlockStateProperties.FACING) - .getAxis(); + .getAxis(); if (AllBlocks.STICKER.has(state) && !state.getValue(StickerBlock.EXTENDED)) return facing == state.getValue(StickerBlock.FACING); return isBrittle(state); @@ -415,13 +425,12 @@ public class BlockMovementChecks { public CheckResult isNotSupportive(BlockState state, Direction direction); } - public static interface AllChecks extends MovementNecessaryCheck, MovementAllowedCheck, BrittleCheck, AttachedCheck, NotSupportiveCheck { + public static interface AllChecks + extends MovementNecessaryCheck, MovementAllowedCheck, BrittleCheck, AttachedCheck, NotSupportiveCheck { } public static enum CheckResult { - SUCCESS, - FAIL, - PASS; + SUCCESS, FAIL, PASS; public Boolean toBoolean() { return this == PASS ? null : (this == SUCCESS ? true : false); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java new file mode 100644 index 000000000..ceb24a635 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java @@ -0,0 +1,133 @@ +package com.simibubi.create.content.logistics.trains.entity; + +import java.util.ArrayList; +import java.util.HashMap; + +import javax.annotation.Nullable; + +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock; +import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock.WhistleSize; +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.foundation.utility.NBTHelper; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.block.BellBlock; +import net.minecraft.world.level.block.NoteBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; + +public class ArrivalSoundQueue { + + public int offset; + int min, max; + Multimap sources; + + public ArrivalSoundQueue() { + sources = Multimaps.newMultimap(new HashMap<>(), ArrayList::new); + min = Integer.MAX_VALUE; + max = Integer.MIN_VALUE; + } + + @Nullable + public Integer firstTick() { + return sources.isEmpty() ? null : min + offset; + } + + @Nullable + public Integer lastTick() { + return sources.isEmpty() ? null : max + offset; + } + + public boolean tick(CarriageContraptionEntity entity, int tick, boolean backwards) { + tick = tick - offset; + if (!sources.containsKey(tick)) + return backwards ? tick > min : tick < max; + Contraption contraption = entity.getContraption(); + for (BlockPos blockPos : sources.get(tick)) + play(entity, contraption.getBlocks() + .get(blockPos)); + return backwards ? tick > min : tick < max; + } + + public void serialize(CompoundTag tagIn) { + CompoundTag tag = new CompoundTag(); + tag.putInt("Offset", offset); + tag.put("Sources", NBTHelper.writeCompoundList(sources.entries(), e -> { + CompoundTag c = new CompoundTag(); + c.putInt("Tick", e.getKey()); + c.put("Pos", NbtUtils.writeBlockPos(e.getValue())); + return c; + })); + tagIn.put("SoundQueue", tag); + } + + public void deserialize(CompoundTag tagIn) { + CompoundTag tag = tagIn.getCompound("SoundQueue"); + offset = tag.getInt("Offset"); + NBTHelper.iterateCompoundList(tag.getList("Sources", Tag.TAG_COMPOUND), + c -> add(c.getInt("Tick"), NbtUtils.readBlockPos(c.getCompound("Pos")))); + } + + public void add(int offset, BlockPos localPos) { + sources.put(offset, localPos); + min = Math.min(offset, min); + max = Math.max(offset, max); + } + + public static boolean isPlayable(BlockState state) { + if (state.getBlock() instanceof BellBlock) + return true; + if (state.getBlock() instanceof NoteBlock) + return true; + if (state.getBlock() instanceof WhistleBlock) + return true; + return false; + } + + public static void play(CarriageContraptionEntity entity, StructureBlockInfo info) { + if (info == null) + return; + BlockState state = info.state; + + if (state.getBlock() instanceof BellBlock) { + if (AllBlocks.HAUNTED_BELL.has(state)) + playSimple(entity, AllSoundEvents.HAUNTED_BELL_USE.getMainEvent(), 1, 1); + else + playSimple(entity, SoundEvents.BELL_BLOCK, 1, 1); + } + + if (state.getBlock()instanceof NoteBlock nb) { + float f = (float) Math.pow(2, (state.getValue(NoteBlock.NOTE) - 12) / 12.0); + playSimple(entity, state.getValue(NoteBlock.INSTRUMENT) + .getSoundEvent(), 1, f); + } + + if (state.getBlock() instanceof WhistleBlock && info.nbt != null) { + int pitch = info.nbt.getInt("Pitch"); + float f = (float) Math.pow(2, (pitch - 12) / 12.0); + WhistleSize size = state.getValue(WhistleBlock.SIZE); + playSimple(entity, (size == WhistleSize.LARGE ? AllSoundEvents.WHISTLE_TRAIN_LOW + : size == WhistleSize.MEDIUM ? AllSoundEvents.WHISTLE_TRAIN_MEDIUM : AllSoundEvents.WHISTLE_TRAIN_HIGH) + .getMainEvent(), + 1, f); + playSimple(entity, AllSoundEvents.WHISTLE_CHIFF.getMainEvent(), .75f, + size == WhistleSize.SMALL ? f + .75f : f); + } + + } + + private static void playSimple(CarriageContraptionEntity entity, SoundEvent event, float volume, float pitch) { + entity.level.playSound(null, entity, event, SoundSource.NEUTRAL, 5 * volume, pitch); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Carriage.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Carriage.java index e47ecdd3e..818ac2972 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Carriage.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Carriage.java @@ -36,6 +36,7 @@ public class Carriage { public Train train; public int id; public boolean blocked; + public boolean stalled; public Couple presentConductors; public int bogeySpacing; @@ -50,6 +51,7 @@ public class Carriage { // client public boolean pointsInitialised; + static final int FIRST = 0, MIDDLE = 1, LAST = 2, BOTH = 3; public Carriage(CarriageBogey bogey1, @Nullable CarriageBogey bogey2, int bogeySpacing) { @@ -284,6 +286,7 @@ public class Carriage { tag.putInt("Spacing", bogeySpacing); tag.putBoolean("FrontConductor", presentConductors.getFirst()); tag.putBoolean("BackConductor", presentConductors.getSecond()); + tag.putBoolean("Stalled", stalled); CarriageContraptionEntity entity = this.entity.get(); if (entity != null) @@ -303,6 +306,7 @@ public class Carriage { Carriage carriage = new Carriage(bogey1, bogey2, tag.getInt("Spacing")); + carriage.stalled = tag.getBoolean("Stalled"); carriage.presentConductors = Couple.create(tag.getBoolean("FrontConductor"), tag.getBoolean("BackConductor")); carriage.serialisedEntity = tag.getCompound("Entity") .copy(); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java index 276f5e296..967b081c4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java @@ -21,6 +21,7 @@ import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -42,6 +43,7 @@ public class CarriageContraption extends Contraption { private boolean backwardControls; public Couple blazeBurnerConductors; public Map> conductorSeats; + public ArrivalSoundQueue soundQueue; // during assembly only private int bogeys; @@ -53,6 +55,11 @@ public class CarriageContraption extends Contraption { conductorSeats = new HashMap<>(); assembledBlazeBurners = new ArrayList<>(); blazeBurnerConductors = Couple.create(false, false); + soundQueue = new ArrivalSoundQueue(); + } + + public void setSoundQueueOffset(int offset) { + soundQueue.offset = offset; } public CarriageContraption(Direction assemblyDirection) { @@ -106,6 +113,13 @@ public class CarriageContraption extends Contraption { protected Pair capture(Level world, BlockPos pos) { BlockState blockState = world.getBlockState(pos); + if (ArrivalSoundQueue.isPlayable(blockState)) { + int anchorCoord = VecHelper.getCoordinate(anchor, assemblyDirection.getAxis()); + int posCoord = VecHelper.getCoordinate(pos, assemblyDirection.getAxis()); + soundQueue.add((posCoord - anchorCoord) * assemblyDirection.getAxisDirection() + .getStep(), toLocalPos(pos)); + } + if (blockState.getBlock() instanceof IBogeyBlock) { bogeys++; if (bogeys == 2) @@ -151,6 +165,7 @@ public class CarriageContraption extends Contraption { return compoundTag; }); tag.put("ConductorSeats", list); + soundQueue.serialize(tag); return tag; } @@ -165,6 +180,7 @@ public class CarriageContraption extends Contraption { NBTHelper.iterateCompoundList(nbt.getList("ConductorSeats", Tag.TAG_COMPOUND), c -> conductorSeats.put(NbtUtils.readBlockPos(c.getCompound("Pos")), Couple.create(c.getBoolean("Forward"), c.getBoolean("Backward")))); + soundQueue.deserialize(nbt); super.readNBT(world, nbt, spawnData); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntity.java index d53682631..fe9c8ad80 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntity.java @@ -2,19 +2,18 @@ package com.simibubi.create.content.logistics.trains.entity; import java.lang.ref.WeakReference; import java.util.Collection; +import java.util.List; import java.util.Optional; import java.util.UUID; import javax.annotation.Nullable; -import org.apache.commons.lang3.tuple.MutablePair; - import com.google.common.base.Strings; +import com.jozufozu.flywheel.repack.joml.Math; import com.simibubi.create.AllEntityDataSerializers; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.Create; import com.simibubi.create.CreateClient; -import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls.ControlsBlock; import com.simibubi.create.content.logistics.trains.TrackGraph; @@ -65,10 +64,15 @@ public class CarriageContraptionEntity extends OrientedContraptionEntity { public boolean leftTickingChunks; public boolean firstPositionUpdate; + private boolean arrivalSoundPlaying; + private boolean arrivalSoundReversed; + private int arrivalSoundTicks; + public CarriageContraptionEntity(EntityType type, Level world) { super(type, world); validForRender = false; firstPositionUpdate = true; + arrivalSoundTicks = Integer.MIN_VALUE; } @Override @@ -167,15 +171,13 @@ public class CarriageContraptionEntity extends OrientedContraptionEntity { } tickActors(); - contraption.stalled = false; - for (MutablePair pair : contraption.getActors()) { - MovementContext context = pair.right; - context.stall = false; - } + boolean isStalled = isStalled(); + carriage.stalled = isStalled; CarriageSyncData carriageData = getCarriageData(); if (!level.isClientSide) { + entityData.set(SCHEDULED, carriage.train.runtime.getSchedule() != null); boolean shouldCarriageSyncThisTick = carriage.train.shouldCarriageSyncThisTick(level.getGameTime(), getType().updateInterval()); @@ -184,6 +186,18 @@ public class CarriageContraptionEntity extends OrientedContraptionEntity { entityData.set(CARRIAGE_DATA, carriageData); carriageData.setDirty(false); } + + Navigation navigation = carriage.train.navigation; + if (navigation.announceArrival && Math.abs(navigation.distanceToDestination) < 60 + && carriageIndex == (carriage.train.speed < 0 ? carriage.train.carriages.size() - 1 : 0)) { + navigation.announceArrival = false; + arrivalSoundPlaying = true; + arrivalSoundReversed = carriage.train.speed < 0; + arrivalSoundTicks = Integer.MIN_VALUE; + } + + if (arrivalSoundPlaying) + tickArrivalSound(cc); return; } @@ -223,6 +237,59 @@ public class CarriageContraptionEntity extends OrientedContraptionEntity { validForRender = true; } + private void tickArrivalSound(CarriageContraption cc) { + List carriages = carriage.train.carriages; + + if (arrivalSoundTicks == Integer.MIN_VALUE) { + int carriageCount = carriages.size(); + Integer tick = null; + + for (int index = 0; index < carriageCount; index++) { + int i = arrivalSoundReversed ? carriageCount - 1 - index : index; + Carriage carriage = carriages.get(i); + CarriageContraptionEntity entity = carriage.entity.get(); + if (entity == null || !(entity.contraption instanceof CarriageContraption otherCC)) + break; + tick = arrivalSoundReversed ? otherCC.soundQueue.lastTick() : otherCC.soundQueue.firstTick(); + if (tick != null) + break; + } + + if (tick == null) { + arrivalSoundPlaying = false; + return; + } + + arrivalSoundTicks = tick; + } + + if (tickCount % 2 == 0) + return; + + boolean keepTicking = false; + for (Carriage c : carriages) { + CarriageContraptionEntity entity = c.entity.get(); + if (entity == null || !(entity.contraption instanceof CarriageContraption otherCC)) + continue; + keepTicking |= otherCC.soundQueue.tick(entity, arrivalSoundTicks, arrivalSoundReversed); + } + + if (!keepTicking) { + arrivalSoundPlaying = false; + return; + } + + arrivalSoundTicks += arrivalSoundReversed ? -1 : 1; + } + + @Override + public void tickActors() { + super.tickActors(); + } + + @Override + protected void handleStallInformation(float x, float y, float z, float angle) {} + Vec3 derailParticleOffset = VecHelper.offsetRandomly(Vec3.ZERO, Create.RANDOM, 1.5f) .multiply(1, .25f, 1); @@ -308,7 +375,7 @@ public class CarriageContraptionEntity extends OrientedContraptionEntity { train.navigation.waitingForSignal = null; return true; } - + @Override public Component getDisplayName() { if (carriage == null) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java index 886d1bd31..f5a9ae325 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java @@ -17,6 +17,7 @@ import javax.annotation.Nullable; import org.apache.commons.lang3.mutable.MutableDouble; import org.apache.commons.lang3.mutable.MutableObject; +import com.jozufozu.flywheel.repack.joml.Math; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.TrackEdge; import com.simibubi.create.content.logistics.trains.TrackGraph; @@ -52,6 +53,7 @@ public class Navigation { public double distanceToDestination; public double distanceStartedAt; public boolean destinationBehindTrain; + public boolean announceArrival; List> currentPath; private TravellingPoint signalScout; @@ -366,6 +368,9 @@ public class Navigation { cancelNavigation(); return -1; } + + if (Math.abs(distanceToDestination) > 100) + announceArrival = true; currentPath = pathTo.path; destinationBehindTrain = pathTo.distance < 0; @@ -676,6 +681,7 @@ public class Navigation { tag.putDouble("DistanceToDestination", distanceToDestination); tag.putDouble("DistanceStartedAt", distanceStartedAt); tag.putBoolean("BehindTrain", destinationBehindTrain); + tag.putBoolean("AnnounceArrival", announceArrival); tag.put("Path", NBTHelper.writeCompoundList(currentPath, c -> { CompoundTag nbt = new CompoundTag(); nbt.put("Nodes", c.map(TrackNode::getLocation) @@ -703,6 +709,7 @@ public class Navigation { distanceToDestination = tag.getDouble("DistanceToDestination"); distanceStartedAt = tag.getDouble("DistanceStartedAt"); destinationBehindTrain = tag.getBoolean("BehindTrain"); + announceArrival = tag.getBoolean("AnnounceArrival"); currentPath.clear(); NBTHelper.iterateCompoundList(tag.getList("Path", Tag.TAG_COMPOUND), c -> currentPath.add(Couple diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java index f3be96ef6..2d487785c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java @@ -181,6 +181,10 @@ public class Train { stress[i - 1] = target - actual; } previousCarriage = carriage; + if (carriage.stalled) { + distance = 0; + speed = 0; + } } // positive stress: carriages should move apart @@ -532,7 +536,6 @@ public class Train { navigation.cancelNavigation(); forEachTravellingPoint(tp -> migratingPoints.add(new TrainMigration(tp))); graph = null; - syncTrackGraphChanges(); } public void forEachTravellingPoint(Consumer callback) { @@ -613,14 +616,13 @@ public class Train { if (derailed) status.successfulMigration(); derailed = false; - if (runtime.getSchedule() != null) { - if (runtime.state == State.IN_TRANSIT) - runtime.state = State.PRE_TRANSIT; - } + if (runtime.getSchedule() != null && runtime.state == State.IN_TRANSIT) + runtime.state = State.PRE_TRANSIT; GlobalStation currentStation = getCurrentStation(); if (currentStation != null) currentStation.reserveFor(this); updateSignalBlocks = true; + migrationCooldown = 0; syncTrackGraphChanges(); return; } @@ -722,7 +724,7 @@ public class Train { while (current != null) { prev = current; d = current.getLocationOn(edge); - current = signalData.next(EdgePointType.SIGNAL, d); + current = signalData.next(EdgePointType.SIGNAL, d); } if (prev != null) { UUID group = prev.getGroup(node2); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AbstractStationScreen.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AbstractStationScreen.java index 8333b48f2..3e80a5fe2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AbstractStationScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AbstractStationScreen.java @@ -65,6 +65,7 @@ public abstract class AbstractStationScreen extends AbstractSimiScreen { Carriage carriage = carriages.get(i); w += icon.getIconWidth(carriage.bogeySpacing) + 1; } + return w; } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AssemblyScreen.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AssemblyScreen.java index bdc5ccdaa..2c090f5bd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AssemblyScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AssemblyScreen.java @@ -153,7 +153,10 @@ public class AssemblyScreen extends AbstractStationScreen { TrainIconType icon = train.icon; int offset = 0; - int position = background.width / 2 - getTrainIconWidth(train) / 2; + int trainIconWidth = getTrainIconWidth(train); + int position = background.width / 2 - trainIconWidth / 2; + if (trainIconWidth > 130) + position -= trainIconWidth - 130; boolean frontConductor = false; boolean backConductor = false; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationScreen.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationScreen.java index 1de347dfa..8f5bebad5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationScreen.java @@ -116,7 +116,7 @@ public class StationScreen extends AbstractStationScreen { .length()); trainNameBox.setHighlightPos(trainNameBox.getCursorPosition()); } - + super.tick(); updateAssemblyTooltip(te.edgePoint.isOnCurve() ? "no_assembly_curve" @@ -154,6 +154,8 @@ public class StationScreen extends AbstractStationScreen { int trainIconWidth = getTrainIconWidth(imminentTrain); int targetPos = background.width / 2 - trainIconWidth / 2; + if (trainIconWidth > 130) + targetPos -= trainIconWidth - 130; float f = (float) (imminentTrain.navigation.distanceToDestination / 15f); if (trainPresent()) f = 0; @@ -164,6 +166,8 @@ public class StationScreen extends AbstractStationScreen { int trainIconWidth = getTrainIconWidth(train); int targetPos = background.width / 2 - trainIconWidth / 2; + if (trainIconWidth > 130) + targetPos -= trainIconWidth - 130; if (leavingAnimation > 0) { disassembleTrainButton.active = false; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java index 6d62c1a0f..9a43e7613 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java @@ -33,6 +33,7 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePoi import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBehaviour; import com.simibubi.create.content.logistics.trains.management.schedule.Schedule; import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleItem; +import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; @@ -311,8 +312,8 @@ public class StationTileEntity extends SmartTileEntity { BlockPos bogeyOffset = new BlockPos(track.getUpNormal(level, targetPosition, trackState)); - int MAX_LENGTH = 48; - int MAX_BOGEY_COUNT = 20; + int MAX_LENGTH = AllConfigs.SERVER.trains.maxAssemblyLength.get(); + int MAX_BOGEY_COUNT = AllConfigs.SERVER.trains.maxBogeyCount.get(); int bogeyIndex = 0; int maxBogeyCount = MAX_BOGEY_COUNT; @@ -324,10 +325,14 @@ public class StationTileEntity extends SmartTileEntity { Arrays.fill(bogeyTypes, null); for (int i = 0; i < MAX_LENGTH; i++) { - if (i == MAX_LENGTH - 1 || !track.trackEquals(trackState, level.getBlockState(currentPos))) { + if (i == MAX_LENGTH - 1) { assemblyLength = i; break; } + if (!track.trackEquals(trackState, level.getBlockState(currentPos))) { + assemblyLength = Math.max(0, i - 1); + break; + } BlockState potentialBogeyState = level.getBlockState(bogeyOffset.offset(currentPos)); if (potentialBogeyState.getBlock()instanceof IBogeyBlock bogey && bogeyIndex < bogeyLocations.length) { @@ -510,9 +515,10 @@ public class StationTileEntity extends SmartTileEntity { BlockPos bogeyPosOffset = trackPosition.offset(bogeyOffset); try { - boolean success = contraption.assemble(level, - bogeyPosOffset.relative(assemblyDirection, bogeyLocations[bogeyIndex] + 1)); + int offset = bogeyLocations[bogeyIndex] + 1; + boolean success = contraption.assemble(level, bogeyPosOffset.relative(assemblyDirection, offset)); atLeastOneForwardControls |= contraption.hasForwardControls(); + contraption.setSoundQueueOffset(offset); if (!success) { exception(new AssemblyException(Lang.translate("train_assembly.nothing_attached", bogeyIndex + 1)), -1); diff --git a/src/main/java/com/simibubi/create/foundation/config/CTrains.java b/src/main/java/com/simibubi/create/foundation/config/CTrains.java index bc3e8f97d..f30b31e97 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CTrains.java +++ b/src/main/java/com/simibubi/create/foundation/config/CTrains.java @@ -7,6 +7,8 @@ public class CTrains extends ConfigBase { public final ConfigFloat trainTurningTopSpeed = f(18, 0, "trainTurningTopSpeed", Comments.mps, Comments.trainTurningTopSpeed); public final ConfigFloat trainAcceleration = f(4, 0, "trainAcceleration", Comments.acc, Comments.trainAcceleration); + public final ConfigInt maxAssemblyLength = i(128, 5, "maxAssemblyLength", Comments.maxAssemblyLength); + public final ConfigInt maxBogeyCount = i(20, 1, "maxBogeyCount", Comments.maxBogeyCount); @Override public String getName() { @@ -32,6 +34,8 @@ public class CTrains extends ConfigBase { static String trainTurningTopSpeed = "The top speed of Trains during a turn."; static String trainAcceleration = "The acceleration of any assembled Train."; static String trainsCauseDamage = "Whether moving Trains can hurt colliding mobs and players."; + static String maxAssemblyLength = "Maximum length of a Train Stations' assembly track."; + static String maxBogeyCount = "Maximum amount of bogeys assembled as a single Train."; } } diff --git a/src/main/resources/assets/create/sounds/whistle_low_old.ogg b/src/main/resources/assets/create/sounds/whistle_low_old.ogg deleted file mode 100644 index 32c065f03bdb63ee4293a71cdaea06ea4f7b0725..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44230 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 diff --git a/src/main/resources/assets/create/sounds/whistle_train.ogg b/src/main/resources/assets/create/sounds/whistle_train.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d2e62ec6c6533a8a9544457cb741eb241c0e4dab GIT binary patch literal 9515 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 N9j?Bt<;@J({|^p=PmKTo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/sounds/whistle_train_high.ogg b/src/main/resources/assets/create/sounds/whistle_train_high.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fca7997610c768f651e0db9eae03b33caf87e606 GIT binary patch literal 10939 zcmaia2|Sct`|!DEhMBPrhO9M28B0YJQjM(`OAKR|BC=;sk;WQA(vYMq8QIsUluTud zlATu4BB`hzZNhhk=Xu}vd%y4Z|KGpcaqe^7=eo|dp6gt5?>l_h8lb@67j?~Q=Uefq zSIAl<{7A5ycL-+)F|7Rim7~Z?=LWKmGxJ{;XC?=7<*4!^VaM|Sbv;0@B2tEMd+$K6 zP5Ximll;8hY*)~eOi1cm)YP}AZ`n#x+~*(Q9T@Bp;t>!^=HN!SR;QBn4QvsBgClBY zq;^JM1|0wb00-pB0_QwU$Sh`|;;|g2F{jtQB{_$g+%E2(s@CyOL((`T3IGN$6!Ga- z-kJFHY9AKgm>yi9?QNlTm4r>Pn$X7Io8RCbP;#xrH=viSfa7=I0#Gg#W7z~EjnlX# z$tH@!=9F}Bm+aNNU>>E?f><8)E>fJC`gHL*3!UlGE9p8P6tDH^^QvAOpqi--+qze` zaJxi>^lDG#{oUYK_#nZx=yOXPBIx5d=#$7LIl&OsDqAGLfNX-jXNe|t#GX3oNB#2q zzN%P>X!dV4vbHg&!z;|iF5F`@JZv=lghNh((~T1jHxiu25?p>H928Id`~G=i{0HY= zVV#74g7wJzBLk%A=%^v+_CissMIBExgq9)xQB>ezNgQhwdtZ5grb2P+!6pDf)k^lLM zS+N($i0mcLY##=0YsSG9u`nQ7@j{#d-zp{eLQ>%yQf^=Fw@2Cnxo-=~h!+R%Cfi)x zc(W|$;)(|SdL>>%U6Q*mv=?0H%MIx@;mc*M_Kpc(#8#CJz%hxbJb@00gYZ4?fn03a z6MHzY`kf+itlf;DBGXcdsq7voRR$WqVG+-3+(+ml=t}&o-_8} z=0kycJ2)oZaVeH`BAwffC|e?XZf)opfpZ0FUF71mY3X~YWpS1?iH)q#*cHx60K^kk ztoWa1#gtdAxHvOKsavt(p?Z%Br>VT(t20x3pJ2eJ2CY~{6IyXvT4!FIg+6{&!T)$p z5V7;D^ne4S7HYny{z0GA%(_@hCF&yskq{+kS z`U!`oza3`PZN^8#{=;)PE+VI${@OSb^KZ{7P)wiHN?&i1DesWE;aK+Jc?Cyi%^_q+Cr(nMz7mOwRUB&Mm)L z-c+w*{%w`Vo&8Xtp+;-|Qvm?5Gx$tb;)oSZb(p3(OjD)X?EIfS21185%m+1~V6y;_ z0AM{-ay%g=I72^Rr#(*Xojg~eHg{p0c>GnuRz7WhxzG%~jXQ5-YTxJkHbGMqH8hJ$ zQ`nwP;=fnoZ1PqM2g4o)SOLIL>r!hI5AHR2P+-`rhQGw@(%#5AH()|m%@*HERwxm6 zf1P(_z~n(OQ`|J=Qn9dmauu8eu<(z!urEUtp%4LZDA6PUDK^1BRLx7u528ddvh zo^`J_PA0xvjr&p@fy|P&?j?6h$3N72n-|xorw9Ovjle&BMU6v7fUprv1j;`?r(sG| zFcmR+O!OEPF(1v+c%-3eWkc@~p%2^8pNW~%n-t7N%+3F@p^F&NMd^dt=JZDY#~L0_ zZ0Ik<=)+AO&%~nbvctx=nmfS95eN+%%|78e;_s64H!5@D3aV}N(I!o+P`VY}!@-8` z5bojdgKjr+!W2TS&7X+U=}q(}^ZxYg6R$$)E_NPIe$XAnqMb$)UVT6DN}PjvbT|w` z4~}>oydE~L=$-5BQ&d`>t5{xMR^H@aUR~u>^uD~Pyu1Ezd39xXeN9ER-wcFSmzLM7 zl$Wbi)K@N)tIRZ&mN!>**VkUGu9#_><-M;m(;Qe{U0qTCkppe6n&}9dY2Ff5LhdQ4 z_|RO|+#E2|9Q3fsU;0YUkj79qKCa;y1cf7eE7Q_z3lWOq27N- zYt=$GL@@AE`|%O!n{Zk~fD|0-_@=!3pjJBTa4uYFdDX@8ikbQV<@=R0`d0K4E?FMq z+g%*i1dMM_cN$GAD*w=|)N=7Ia>J z54%#shwnTCZ3E%hhDbN1P*xem&_V#W>=evwGnAJ zqgdF2_E+u5UEe{1s2*^Luh4j#!-S|V#AQ;cRau#|hk55XsN&M8Cgi3}su^4r zm0FiTbM#Xi$)ovc!c{?3nN&a34o4@m#xQ~-@5-vG8f|@jsyZNX1(vuewXRXjH$d&3 zB-Oi$L%ghA%qblbxAxU68S&u&ocwo=l+IQiWy$@YPOT-xczcTYq7G`|lyR&r>V!W|;y%*}aQ z7c+AdDAB4gXbPgr*jxdA$2p9BmC5|Y73@o6CUx9SB z4-?!TYQLA(fRRx;UO=fMFHS%oCkmGV_o|25up#I}0L=Fa<6y&L4sZZ8>NE+Cky)V} z0F%Z8fKnjLh-$44g~XmMfH4yVj&WipRU2E#+(YglF*9k99Av31m=DUX-IfDjI({TU z)9}*_CqT36a5SJ+wcGnv%d$q?Dm6!;5jVce^`%09@1vUlJmRsXPN5xjhHwI3?no)B|p^octpd0^nl@1ZYo5bDF%6^nWKN|L)=c zKTMRtJWI$H?$#aRQn=Nue2?(Tqr2bVNqWxehdheax*=t$2V2 z{Zrh%5;~BhFI>8>D!FmQEwvHKA4Z4~x6_&t@ALJ zXcr%5sR6%43S$bb!6{fi5hAFD>obY2Nqh zY%Z7QVWfBxMmDJ(A!ab*L;@lv`S;zpi`Ow?39KG~5wI43On#D_T&{Myz!|{|!danA z;d3HPXubeUAPhmkkmpKDO7cv0Dq)kn15cr6&h=9 z<{oH=0^-%{w%OM--XrPCEG}anEU0jQsMst`WA|4Gvf|6o9XDlm&7XUD{L@f`WAPH3 zcWH(J-pKI2)O~ogDk04E#vUErON%eJ|G7GSZ)Sfx<+k(VuqU@eY!-4h?wh(1`s7l% zEJ|`TK00#Wk3SQq96U>Re{`}twU|F!W-ztouPyQb?21H#pLBkPJ86QAZbpGMTJJ&H zo_mJh!Nlyx^U|HceC8eJo-T&Zdhg$kFwW68Rxpc*!XVEn;?HPSkqw#4cxXN+ETSw= zAQVL76nBjYk@bZ=^0n4)PDb;TSL}W?J1J}!h!MKkIKU%^w4pcAwtH$@Zx*aR?6+gb zj$8DOrZ4wPYhR`j~JL#Xq)JFv<_lj$!uS5y&`!HChvAFWpvi z1l#@bXj7zi(F-fj*Ruk~)<=8ZY^X=pYKhKovtQgEokRWA-Kq6y`IN{2wHAO@j*0}= zg1`yH4gtw=cuR3W({?NYFT=rM^$3N>xf1#w3!mCB;P`gH9z}qP>QRS18)fI`h+rv) z+hv9a5UO&b+9izjjr0{uY0ID2a`AKrJw5J%IaQrLnbay=ehi^tGx8(6%AO4yyT=ZwRDjX(0jnA@74JF2REnEM8h_D+5AQ0G1Yw4U`@nL{(KzyYa(gP z-FdHE242-@F?lYLc|?=jBI@YZ7n(gqWfxy;UgOIBB=g*fMBP(BqPTqk;#P zV7DmLq3iDFB1YsJvGs>A(ylj^8S>Q&^C&kXWrczUb*CM20bZ%}W=xId^&`oXw7Aar zJ8SI>c8u!u$WA$RODZ28J&Lv7d&Xy^m)1EsfBm=}eXh}y zhhOvRj_ym;nhgp+MZ=Co%vb}+?+$@#i%a!XO6POe}Om|aL>XTYJl-@yPsf&;E0@Cu03M~|Z zlK=U=wxt@6hNZUyx*I>lDS3QH&4o2#e*4!YZZ-SbDV#l+)w1J+zCCTO)+}6X!->JL zd(MLnPtjMU!c{|}5(E}q(UK`TCV~!|YVBX4be7&{dEff@@oLMpA?KIZn?ElbkR1B{ zcF4|H23GKf04RNZ0NXbPXs_y6AbmdcL$t@|H0RM9ataHAv;3e|5U|}bfIWYFSAJC+ zcM)nRElX)%akH|D2}Pi~%!5clQjMN3ms9Dcjbi=c@~OlWMFoqPsIxP+$18mFH=%ah zFcYtba&KV(hEU4~J=rgJo8&2lLJP`V48)jkTDxLRW7&3_WUgZJwyw`loo2Fo??h_b z=J(ocIk~UzY1C2N4iVd7?yo0C+SZpmZ%HM`7;P2@WO4zw-`LRB)ba97whp@aY``z}T?bO6Lp5xFc4bB~GEOn$WR4eHn4 zCW?SNcb<*JqQn5j%mf$<)t8;e8;S`C6B(x8Nx8gQr21=LNqdBpse*D<2{Ny08Fbp+ zrvguhHG8+=jgU}Qu|>KKepfkVNQr&tWX&0KVkuypeQ+jMQ62?K_pU)9Cof*=Lwp{n zXGP4HjK1gPJsOsE@H*@K=7xH%#iYkN*Hq)>rX<#JUF#8;lYEk6>WU{Q@O;qGc%r*s z=E4|QdOsf^)AT*9m8s_PTKx zsqO0r>-DbTb}1z!&1yQczTkHE6qmc4EU30^N{w!+_?9Uoac~X+Tf_F88bBdHp@~*k z*p7YFmCU+kE0B_3_|wzlY>1>@dz9R{ygdne2JQCiDi)vlWgTrJOsIpMN(MBxWc}Vz z>A12P-HTkZ)=@!xT-wO4>EXrZ`X{@e8Cy_(P;o&Yt@4j6p2slI>-u1g#G0+E z+l=(Fm|KYKcc-89rSIJAS6xFg|LgmV3lMB~K z+M6oCw1HlpEmKj6qnw)5o_0v&QpecWi51Jz0;+!KBkOTA48oYcR^`OHi!}fR#!{>! z08MGmpl5EmsW3C~aPe|^K$m-M$C`f0X9tBJRvKk8dlNqu6>a*yfnYPIX>gx)_>*Sg zr^y!YknbvnJX<>T?a%%$cF%=Ux;&N@y?gLE@1M-4mCh~Ocg&u=h0-7acJ#t2POMSm zmX2UhfwZ(VW#B=*yD7rgep!#~dv=5gqN%?UBN{Eb^;@7{PC z8X;U0S7X|&UL@(O)Uo){0eQxI5lX_6y$ru&%vgxY8i(hmraB~)%U_Lt`qU|Y(S37Y zxELf#r|DNR0@$|?oztD&=qX;+FHzQlwHB2y$IHvgBr7DoJJ}LGu*0ZYppmbr$ADXm zC#`Shdh~W#@3c|LJM|7P9{iW@mXofhz*O;zjWu)iC6^m{Ksg>fcZO+Mm=a+3pa9}0-?u?M4B!;R);l`)(~K3U zR6?oAvy%nB27z3xz)O~>B<413e@#Nl*Aly-_ubeyL0m2xieR9*yPK^ME=yTNmV%+iC~Dg_XuiB=eq2;aAjxP&apVZ=Z&*T ztQ^W5?S++X#lee5!#wtf5Js*KO!}&Ijo>`a?^z~K`&4x*taCqTc44V2Y)QK0N9Qi4 zx{}@RSGSj=nIx$LV1g4}Cd9cT<`^3hQeYn<$vanEe-I5Gg+x~d$3JdAe=j%AGgMO+ zVQ3OTiQ_bWSsX(Md_7$pk^#8cmH`Ye(zD|z4vd+YD?$@m?-zuu=wqsLJGb|t6_Wd)(2zYrz zbWy#2c=wlssa7|gd8-#%qws#QTwrYW_d3X4L?9aGqI3LUw3e}#3%$YH7&={V!suj- z?ba=$GsZh_F8*+bzkXTZD9C06PCty;qrSoYBJ z6mcgWxKRDRPIX#}(JW^b8Kd0gb-gc)<*!l<)r!LtzSvF>BsUp_yjqO&q_TP_@!-NY+9^G-~# z9=TkaHT`^3BvtLXqJeEPnXVkKH! zeEPDmg`pgUu_0`n)Si~VY>KA<5}_=$#Q+0y6ZSr)-viUQz;1b+ED0Ib`DyK{V-G~I z8~>_C4c)+8DXVB`+0osBJ?paPOnuZeFRmt${gn98+i0Tr1Mj^Sa)3xn!BtI{gQ;J> z)p`a9gQZgQ`GFeU6DMay3%`B_R~MImf^B**W#)x^%}sE@vqJ<5!1_u`Tp(F(BB&oWrf^1ZVG4E%SFivt9({vL7TD2o>`0xb$P2tOnbM`rcgkLttNX zg0wILfY6st=Ian~0^wod#WShM0r0h3|A)KOi+v@IAnNkaOrr<+>5zr-Inp^3ZY7y` zTmDY;_@`Yp+J>?Tx16qL^qQ(2ds&+H#kuS)cDMYMD35iY7f%|pQ_wJ6Mvv}>MIEr# z8NkEeWfX9|dlzFYpbM(@mJ`6(C(HYNJ7_0|n7TeMejG)Cobfk~Yy%7e{;UTSeZOwa zHL_$bis&4DNLYQVDPnoA(N27l?2hN5xc&5{AY5EZCs3ANh8R`j^+_G=#7vy=vZ9QR z`NdMPmODn4FSH1?a_i-B?A9`mTS~C{)@X6nbx2%`Hb$rDH!#q>MK9j8Eqt56H*`*cO#XzDVn6>t^D*$M) zu=6A=8uNp_C;{CA%Ag>TU*`{Fs*VVpMF2Z!90Tl+NXs$g7%E8Z(jatB?Zb^|q9xem z*;no+3fEJfftHg2425ghJC?H=L0{@#S05gQuVEKGQVzS4V=RqPYSxC_Bz@S~ZjJ>=}Jue+lFq0$`=cfC-L;*x|(~GC=zW_UdWkf=`~m zd^+~5w{NKH;lrBENOVrv+p!wElLgjrqYpcB>+`Y{s^~5X{6T>N6gv(Ja1jg?I6rpa zj0P#PxCs1CjH<56wR!E!j61je$7NWYdJDk#8lYk+(C>WqILuwySbX!qexS_aS3=y$ z;$VXC=GZn9L+Y>-Z$u4f%RJ~?%BhE3FuW*679t%2xC^zHq0HVNVC$Y-d#a@n6T~tY zcJ{ojAES5htdoz{9)DRYFRI3GMx=9gbB#>RL)(o5LQz7{_5WQvB|U)wm{ z_sWQQlD?fUc~`W3|A7r)ZBEvFz3UN=KX()l+EhCp37cJ~AkRjDkE6@5bOE#yxq;w& z6cENLgETajBBbdA#G_8z`JRh#(C{CyFMr>91|D#J7YfCr7#Oa(PJTda%~PvWQex=q zT^BhTyr+y2FU-uOuP(sEO6^cj1dDLiRU zDJM)$uWN|QMMwaU_qDges?T>rHA6WIVhTD*BzQwq9L?G3n6aPr#$B_!+@JF`BpL>Z zh?&*2H0ev8agjLd>Cn10x5#??UhaH+bW+xI(tRu2QR>kH{oXtT)bKA*0{IRip( z44eaFKphpvqIcipI~ zy7k926ePH_Zdi%Om}JbD^Yt`PFvfw>v7c0aBcCREX-4tq-**=V3wMzmM*W>Gj!!#F zV3LCac?Y-jo?;wN^W&D*W*>gP#l|S?kUA2bq&fe*dVVR<$oCn2rm}irnQSZxz*tS| zUr=%I^amnf(E

BMzUT0-^@s3D7KG;mWB!v+u^ecc8Z|g?@+mz?yXpM8kSx zYT~1JTGBY+Ncr@3DEWmAm~c_oam(|%ghAwW%LVUXC<k)*fHKFy6C?!yT3&A(sM#q#{%DOaEx=u0C@QSix zBfU4-#~jD2bvXNU?WfB8BYl6ce+hB1dygFE=i1V8cx3R8MYj9gWrFt7Pc=v#3;M>zf#un7(xU;s zLcmq3x{ZY60Ze*J2p@t&K<-aB-y|_(`$`W*rG9V94`$j-sXFzIW807x#weA9M6$6n-)C`4}Si^fIeRjM%>@BTCiq26-j- z5R6q|70KerPiLNbxgYBD*thS3q+<5zD54vXrNgZGXcs4srR+3y>S%O&NUP1Q4Ql`F zgebs9S93AixFh|5XrLdNQL}aCflc?Pu?BhC7fyY)FYU ziU=#@p_m)a71dy6%9MPrsf~Z30@4C zmDMbJK^lR4TwraW0=P4AfU7_aU@+dI;LVzs#h+fguhGvjR=DN*nFtu~jwaFo;~EHj z0YKkw|163xk0PVBVR%5Y5s1lVnkYB&#bDX8L!VB{T9y`VD%A}jBy&;1nh7=~EqYiS zI6^hqzLvvM^wldTZ~#5`0(Ea=%%w=LEb>Cyc$AYg!HuGJ`{zvjMLnSy&&;$_R%8c> zz}aoT*&3Vf^vlx@C2?2)jFTOWU7=Pg}1h#omq%nFD|i4Mt%2{4ndeK9g8LCf?CgjKYHh zni;3Ed8du=vEa^a{%nTzTaYfW4sf+uC6ne2Sq=N;)%6O0S`s5a+rwOzFQ*OvB8fo( zpnlF#GXXNDUZ>7~();%pf$mLDD53=@6ZHr=u~&&T=7NvC%&~i-C5$54#cf@0In9$N zba>n9@OF{IcNMplA<=6@Pt1UvPfJyU-IdM@N5Yo4;0Is_TBmkFh9>TE0gP^eDJXq) z0HxuWAL^&bPzMxeX!pk|JW=-cY=jLDM})3~%BHWdAZ9nwuyeu+ev{OlyXOEtC>?~# z1|8k6lQOB6RJ63KT!bKMW7Kyv5%;Qk&FzbWjXchSV;h)zw5YEFG~pJ&$p14C0slYN z^G82j62E7E{G5Qq0_DbszU|{;dY8@c{3pMw9H%}*C3H$QqbwsMGfF*p(w{Dl`P_V2 zZAQ(!7&!G)UIPPbd{e}pc0_AIYKOap-QuairF>z1&So)ll4AntF#r*KPX*3yap{cs zpb;9l*`&o}ot@!o|MoG(Y}aixsLd^q1Hjml(Rc&}qWI30%Y#zX*Y$!nQc6I0sO3T+ zUZoINUYonr6jw3XKUqcn0oFu(Wx)^&;v+X6gNdt`5^#8IVwdqw{^XWTYKKsj?Tvr+ z2-_O@dvTM-uQ1yVWC%_8r}5bS6iAaX`f@R5;#pSVJ&gGiE3S9+sIb9@k1`ESz~!c5 zf2W#9ixS7LJod(9uqZDfG#-O_tb%h(#KA!c{q|1KBl-m=VikTA0B2MyG5&T zdl4>h27VnCP_MG5OdnyZq6(qdZam;{=W>hs?%nxW52kAFMF0Gz{P@iHi~8LBagA~KYiE|D%#rKj z@aKCdgwb?zkT5bf`emQ;=a4QqG`Emd+Bm`kel%COIvaw%r5{;Xm?UpP7~cJu&HP~h zS~EY3#?~_%tZ!@FMs*Vd9Pbk+ULDK%y3hXNq`GF92u}$p|JsZ^nn%F)mmYr_{9W_! n9hXY47)hM)M{z?6@Gy5PP7GQHa9w)9aSO)g|T4ADl5&PXJK5C*~MgecKV^h6TLBuWrO8N%pgh#JvJL-bA< zHA<8SA|xS^`W^h=`@Y}(zUSWa?Agygd+oi}UTgi;PXGPCu3pMxMv@@i%EQlH z#wfrI>FwcUal{^}hm@CZj2LLJnFAhs6 zT+{O$Lc4K^B?RQ5Jua%2Afd4)i)dK;o~W~Lab2;O?+{9amcg1D0PTX&6^vxV9d=I9 zf>B&xcb_kyN3bL-fKK9Z-aR_`9%Q(I{D-2Hi)tSp7bd7}h}Vs1(o5HkVGZOaES#%e z(AeDy974a(`lo{(>45~#qDjMj1))iM$UYiXoE`wOI#vq_;6XKk3rTExPucpP@(qp( z8-12CVO1Jc&^9$QGzYI>JIfH4$&ld5kTC1?NZY0`>!wKCsYttTk&awZ|FrL63*Qdg zk?KeYkarTDwu~we;wgBCE})Evs-OU_9GV0POBO;U7wQ$edRBR4Hn^8J`1IFE_1D0U zmViE`Iy?=K=Rqv~f10axn#=#*Fz!7P00y*Ww?ALEzpyq=xH~`!dSu}q0Q4yaC)F9C zcp*@+JMawHE(D$LB^V5THDLOe6As-D02n#GPJg~$&>A@DHvvkPf$EcihLfNv4lVLO zUw4o20xBYy?V9F^r&UOFJTeO&WXqLLs|7!n1TKiqUqKQ_h+hWLjKtNvQnt)DZ82t< zV$G%LnMWS<9^zgGeTnMJ=*-I)AqEcV!HJ~fQ7B6$w6b&zoa26<#n{E|2(I%OBSK53 zt-!t3BgD1G&1~Q(hL9;%-)wfw?;lu{+Gh>5p_jlNF*BK7%`iJ~bZ{kWdk}Uw_ut`z z0sZDU#nqL44;hv~mjwx>emP@xEzRLDJ2la@%3vtfmLW-FH$|(Mv_Fp zVNs;xhytC8yppIv!+jJaQRxAFs1h(L{?lpfe!*C!X+5HQ}UQvaofsXlR;S46!sL=R;`$-G7T5 z_t=v3*plej_t6RBF=-w##IoiB@4l+dmjAW=SL9p>5C$6dNn|FRl4wg;mL5q=6#`I9qX+3}~!og^y^60|2rW0{%3`6|ZOm2r*#MPk1;*QJ+mjpH+L9 z&1I6+a57bKP*KUm%)Fn~e8S9pmc!7zLBx>N(D197IjgogyZM_mL-Tr{VMUi|GxN6` z<`WGrvmCcA(}EWi46VUiGDr=cObfeA_OVOkt>~ zZ|0WdFny3}YBPU8R zYz$ry_aJ(B7CbH^ikFp@mNod4RaM#+td|v(_0_nQRaNxWJSng8-UO*tkIQPL%F3k5 zYbt)0No_VfE^DdmtEtYcD&K7QME_c9v&FBhs;azZ>yX+~x!L8v*&=(Z7}Z}~zR^;y=*f!&g|g@lv9{y}GaF(`L)5x?n*Q^We7xyJbsI51-4|a%{gv*7%%$Rr#|I zWH9y}J$#j~8QfOu%L~qReUUupsG2}>BZ4O_tIRAb->mVKd|k1rX<{B`m+G>hVrR|i zyP%R_I~iY4w$UQd{}L1=H`jHQ@0l#0-K;W5$gZiR4|DGM1{?O8?ehPrw!9x)_yi8? zeh6X%a)=GqK1{x#Bn4g-0?-J)XEQ}ebRvTgxD8~HnH-H^;6-dFAHf*wDM%QX=t7z$ z==Ef!uwdO$gfSd6pJa^n$|sO(ynovIA&*r{QIISLwYb$ z-5~*F^**nNQ4>olV$;V;TMU3eE*#U)EiGa()hn$BS&@o3^s#acY_`5~WIk|55sR%J zs*BCkN4kr6vI_~a>OB;GBx5z50J6#mPsU;^Q>Ll1ZSTY6U3XJ{-wE-r*s$Dsq#>`#M9Jd zQ25%6O&ppq<^-}z#>Igy@}5%-{eZ6?rLX@A_N;!uV@_=E_2*t}-}W*s~w zfWgCD@(xqTVc2R!d37F;pTC6m{Kof;BAJCu`sUJe4P@QBntq6%jUqZUm z!V850wU7quj-#-pF^uVi&@ouUfb(D!cOk*NL&Htt3LoJrVsl0ak+?v=kl36-+j0dm zYD#cB4{3;_B8;&Ts7M4>PlN;(xO9AAJ?A|_u;K#`beu;V;7)M4C}fbCyaaQE0amQ^ zE@;upU=RwV&H)?G%DO2GZDk}`US9-+f@@_*x(!&tZh;5dI?5v=Kq3^ta20}b(QXK* z0rWbbBA6NZA{ZsQvcefPY1zSJfX}J{G}s|DK>}Fs<%feEi7<9Zz+pci!8sHu=#W6b z(E)&jA6OApn_LOJmy`$QObQ_MFlS=X(0qapstZX-#)0BMl}ZEPpzS&>4haOCEhGpH zZ>10f2&*m|Eo^0{l~Xb*4F#$xd9{_rxL^{BSB{jx zBSAC9$wjd_#mc?U(xOFmrh_$3G1p<~0X}38>yJ2)0N!?i1oV5p!!9c@;opVHzelkD zj}oO|oyBYcKCQdBcxjKTavheVTW9ZoiuCm3+yAK9|6RTRPa|8eN)U4Y*#VeWbWq?g zl-J^dDvF0*>QF}nBUtFYP6tm+!ygfaS}%$K-IK3{MT?7oC_$k>_<#{ju)$^o;&2io zq_o4-F>ZsE26;n8NMxKRC`FByR5yMoYDz;FMIzfgkOo5z3*I`#DMjJHC7n}F6>>#m zI50lBoGZWpvhf0s?j??W2oFz7_vYNLhb!Av_L?;KVC;L);xk1Z9X`M z;s-${el!vRN3i1p?g)$#EMO@|068De5m-PON97#>cZf*PG>3#Es2+`Af`{fhS}b_H z_plZOAxe3eg-@;v7xoExD=xKD8oT#k0X!T4{HHuOQRE(EXI4a-enesb!byf17mL2| z)J2!OlWT$?M`AO@d97zT#hDmoJ7eWuR}d_);z{?$0xIf52EaE;BrPC|5LCE}fv|D) zfPx~ZP(WUF>xkSXDykJ0c{(^h0kA!DC$_D5;-CtcC@s|uPRhW`1$jH#ZKtHg;cXiqj9%TXn z{@O#f_%^$|?907eye&{j%yjYlP+G^gMB_?ei+}P|>xQV&;J%m!@Wt{}^B3sdSuqu;U(wYgbZW$LLOK@vnGG{ z4a5SMl;1y#xU_0m*7eEr4=unAxv!wJBKBMnh z4A|!u$`rJF_D^fS5O|EH9IBfjZSCAh84~#Vlu3b_5BR0YsON_+&kHWaCmyJ%wM{fA z-U#s)b3NDIHMX=#&G^H{pRdIceeUe1xvjT68WaGRX$p2j{l`1>bvrY+4}~Zb?t8B{SXijV07HYt(L4nnonkw?o6& zdq&4t_CO%4yJM@TCe^g_RGvzdD2675b8EI*$}RUr1$FxX&%{~zt_}X8o6vo9u(Q3h zO<4;=@b)YuX9+?7i`hxww{PwTiN}c2=le_}}saEhd`D~g< z=pq$mkf22xMN_EC(5@Tgd%-Ikn8#1n`4G6!J_ayg&Vf_NQpk(5X4&hi{z{h^JE3yr zU}3jq$EswOVkQ%){XB?#_*AHiyfTEid#wo8P#uC?|3bW0S34Iz;*L7`>8M!lg^zb#O?RI%34|POmo`h4^x|Hs9@izKAq&Pb(9q^^(zO~JAOJvh$ zN4PNrKRAq_4~O*brm zQup&-!SqZ#TT-AIq@5${_^P)*Y7Us~e|NE)MQOqP2ZSqy?sDw?Em@WebPK@q3E`H^ zJC85+@QdWYOCIw-p5@^9@@>wMBP&TlPc0~e&+q%~c$X5&2OU55U$z*2{}fCg=<~TA zruPd1u<71%n5IIAO7W{DwyC-YQl&u_$tRZ)ukH~oG840|7x`Gt;MQW7{Q^VZGPqXW zI3MTA1gQEsnnX@>7TmqF z5;2OI`F_$#zdX6%W#wL}XOnr~3cWk9!=eelT5Z4l(1{MYyfwy>)3UetY45S^lE2?O zC=F)v2`p^^(tad5ma5- zy3e5D136pn1c8!&CA^c3%k*5RF}cb`dA?pyxn`k)@*vMMuk>2{kYKV!7%$KJaMq5gFE6KQui+|vMA4E4*i!my&U%^{t;%q6T& zE5b_srEZOrDWW1giIIQ)ivJQ)H7O=v3a=NnmYckOm*Q-T(#~-3GuypOjj;-M0DKhX z!jvp!Iz(49JVy~jvn+VRsUO%`b!IbujJu8QnI$AwdNjc&<$uiF{Lane^`Ly4+h<3z z->j$A&Y3>(PWH^%tQk~^ja@g520UsuYUI;*E@J&*=B2VM9=*762V3Jf%bQJEKW613?*(gw zS85i|KA|~5aLMopH}CX^Sc5x*~0`R?KP1xLrL?gG`n_3lvo7dpt0|v)inl6%7=( z;ypVmh|jmHbIy8yx#}*IIR(ooOWm*Y<_Keg_Vb_oo~BGHWq5j3M-!HI@-NV+Ub7P- z29wUoL*3lDIFhINQ7XrJ-Z#0l@Lp6_U)7wqyCC*`BIo)w$&MZoZ1X%+KsK*Y=B^gc zO3E3YZsQ=77q*wbJ@-r`LP)w~l5<{cVsb+KYwb|*OcHe=1YL#3k=ZpL~VFFwMy z4>#Avyv2=BKtg;Lc`jZhkcz_VBLeKvtt)T5)$r5)!1B!Ih zIpk5y#Vz_PKmD`!R75)xOrA?TVtu4nntUnr756v=S%M*_ni(M^4%dcA{|bi%tvk%g zJieR0a5p74cVFn#U*J}!1}{nA8GS|{QeeXxYAiEvLYSlX_SWOETQGhTLR%iS;c}2V zO7poH=4Q)e&dNh~p+D|2>}(+d>KFg_`!ctbeMnXKx-OGf{U;00tZ=4B;_mrl#=4uF z*^>{99+{^yt*h+-IkAS{7k=8iW?%Oay!fjXn6hb1Xe3~)0@MH;3nLLBNrU&lGA@l5w|_&*wjyXM^9ocop{dt;U&`)>+;3^O@< zu|Le`y#4f4mr4H+5AZTZsblTu$KtCi54C_DD6mc$bJg359Z8AMg<@!U`oTx$9wl9G zXyoX{4Z(C}2_s6+CpA2wzfQF;3Reuo4)TbqtEelzM~oWKl1{U`tG-xPM4p+GjErp% zE+CwHT71``B*ZCCt9ssg#TFlOR}O`BnZGf`&*r~GB$+L0((ha9DCDKm5@rgFNbH(& zujd(HTCCfmRCy`CPds###fO=6xdetdR9jcj%f0OynlG!?OS`4YOLcaYO`k`dzaZ}& z#|s(#%!b>hGa31;e=>qsUcIk$oxaYOb)W_0oky}b&ZJNox8dPkTF%pQ)Uv98&YXmZ z&k_rKn_JCPzVmg*;Nq%lTqPPSU%=uL(!{w+C@|Ji=dJo?z?p*;dR-+ zVsXR-^+5{YY^?Oor$2O!?as>sCjiX5)~n)DB8d=MnjI(xTbIU8**bV~iEklg60Tjd zq`$(5#W5&6_?CR57?xqI*x%&Q{pr9TCSPh?FkfVNYEn2fpziz)7QpX*4dnWV2dd{o z?#z?9KF|{6w4Ubb37pK0r`xMBHR`-tR=ur$MKkrF@!gW9`8(Sk(-(HzMr_G zi*z1WZm2!augdETj*zSgX5hhjt>h={ur4kA$+ST6*=o96ci znmL|zO723jubO3LzMgM*C2|gG!Kt9nR#}Xfl+w(eMlT{?QHuy+tk&~*4YqZw)HW-4 zZ)DA2C*&SoQ2y~#uy?Mu1bUG}f+m-&hSl6-BEgCU<^PyfN)8u*|fm=(#WZy_uh+Twz67unOvS>(t%S_x|bc!+P977C3`q zA8O&}2rn8y_oXk59NcO6#rvh3_7MwhT=U#gD`tKNOo-n((r$TV>S)aDb`^*Fq zO%NO|Uj0e@EfcY{Rd?~+YoPX|iGYddOKkme;bY}IiKI8mRBNWt+G`$~Z*!9AxV}Ht zkYNvLB1`0*1O8aY2Ym?)4m5nu$Q*MHj<;`>Mp(eU-kX6SN2070sAabwmR8(pgCj&< zwT^PqIg03)ohyorY#A z^Ub%h?xj<+nS=YOK68z7>n;#|5V9_Xr{}a_z z^xWdrgee59^b*p@6Ck>#xK9(vs zk(yjZ?jHml6fGT$A}^1!NTR6`!qM}0z zAKV1O9W||cEg7Uad#XE_vY%-8(XkueMc$EFXApOIAjyB>&f7a{+c&xgOByyjqwZ*X z-3W)iv<_bU^iri!;7rc-qlCRE!mNysgIxhu901smaACTo>yp;W#I$r0i>YGIj ztnlW;)#r~m^gBg%f0D;j-^c`rxhX%v7zh3sP_#rhn(l`Blwzp-Hr!b9?z|K3ahpm0 zF_n}!lM%8WFO}4iV-@4uqLz5;SL5v(55nTtR~J*KEyh`}I?D#-ydv#(f2^EsVJoo;@J&?z$>Frv^<6I*ixI!bkKKWZv5F z`*8CGD;lyGBlz;k!D1Ir@UeS%+`1#g-&;T6H@ex*RQ{B zhR@>$%5!a${5qqm(*sW=+z5IjEmXc!Q)0cgN8T20$>4}}EdbRyQ<%Xz0JueDgo20H&R{i=}+@{e0d*dbbkXO(-q_`!MX0TIY(ZEbCbKc8M zN$a_uKNYVlx>JhS&t`C;ZDGsSuBTNb^cVFEm9)c;<%b7TVh$Ky3e>9dO+0KZCzb;E zGbOb?96T;Xy~#GavbJ>j?>Zg=pa4K3l9{dGe?+k7L|LTb-l|E}+O*h5! z-xo*UQ1mnDe+$0N+-Nd$OX-Yab=r!*x@fmH)+9I=N{5KN#w=!2ale~dC@eMl0en!! zjh?iabMFNm>6(vQ?7*91i))V!zq~eiJsxG^JnZ6Z%Q?%0Pe7zEYKclF0=MW94ju!8 zUw^dDy=obD&JJ=}TyCRjJyCa6XS?OC6Mf{&IhD61R4Ztz}b*(S0rzcrzaoRIaw=@%B0m4U}a=W4@AV!smf};MLImUyWYBV ziJs}@kEDE9*9PWM=?+Hac$6>$0>oZ$DE;H26jNsY19p;B1V!C#(e?o2junT&4G5|I+Rq z=UYklUo{%bN58AUa%!Xjf*S4KvB6#bH5WfeCyv~Vi^ zYv+l2(c*KlxlJ^t!NgdQZtRp@bIN|3soeO2=vV zVNYA~smGEf*_6@2>E>6S1ba8obTlvlV zl#&k~GTYg-Y*93=R~fRp(v6Y6=D#X(k{^uOUE&l4zWSQoD}y!y5CPX)wZB8{9ou0H z7f*dcsfSU$oPK%coTHN literal 0 HcmV?d00001