From d740edecf06abd705494a3385519c02ebbb9dbe6 Mon Sep 17 00:00:00 2001 From: Contrabang <91113370+Contrabang@users.noreply.github.com> Date: Tue, 26 Mar 2024 14:26:42 -0400 Subject: [PATCH 01/48] yes (#24826) --- code/controllers/subsystem/SSjobs.dm | 3 +++ code/game/gamemodes/revolution/revolution.dm | 1 + 2 files changed, 4 insertions(+) diff --git a/code/controllers/subsystem/SSjobs.dm b/code/controllers/subsystem/SSjobs.dm index df436ef8106f..5b2d10876b0f 100644 --- a/code/controllers/subsystem/SSjobs.dm +++ b/code/controllers/subsystem/SSjobs.dm @@ -428,6 +428,9 @@ SUBSYSTEM_DEF(jobs) AssignRole(player, "Assistant") else AssignRole(player, "Assistant") + else if(length(player.mind.restricted_roles)) + stack_trace("A player with `restricted_roles` had no `special_role`. They are likely an antagonist, but failed to spawn in.") // this can be fixed by assigning a special_role in pre_setup of the gamemode + message_admins("A player mind ([player.mind]) is likely an antagonist, but may have failed to spawn in! Please report this to coders.") // Then we assign what we can to everyone else. for(var/mob/new_player/player in unassigned) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 93c6eaec86d5..9583e0e849f5 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -44,6 +44,7 @@ var/datum/mind/new_headrev = pick_n_take(possible_revolutionaries) pre_revolutionaries |= new_headrev new_headrev.restricted_roles = restricted_jobs + new_headrev.special_role = SPECIAL_ROLE_HEAD_REV if(length(pre_revolutionaries) < required_enemies) return FALSE From 048dfecd06f448558705f88edb6d0eb6055811dd Mon Sep 17 00:00:00 2001 From: warriorstar-orion Date: Tue, 26 Mar 2024 14:27:10 -0400 Subject: [PATCH 02/48] cere: bridge has correct supply computer (#24825) --- _maps/map_files/cerestation/cerestation.dmm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_maps/map_files/cerestation/cerestation.dmm b/_maps/map_files/cerestation/cerestation.dmm index df41cd73f6c1..667b8b21519f 100644 --- a/_maps/map_files/cerestation/cerestation.dmm +++ b/_maps/map_files/cerestation/cerestation.dmm @@ -18091,9 +18091,6 @@ /turf/simulated/floor/carpet/black, /area/station/command/bridge) "bRZ" = ( -/obj/machinery/computer/supplycomp/public{ - dir = 8 - }, /obj/structure/railing{ dir = 6 }, @@ -18102,6 +18099,9 @@ d2 = 2; icon_state = "1-2" }, +/obj/machinery/computer/supplycomp{ + dir = 8 + }, /turf/simulated/floor/carpet/black, /area/station/command/bridge) "bSg" = ( From f9e30f8e780ab07a6d944233147d854a3898f6b3 Mon Sep 17 00:00:00 2001 From: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> Date: Tue, 26 Mar 2024 17:23:33 -0400 Subject: [PATCH 03/48] Cyborgs can now choose what type of brain they spawn with. (#23954) * choose your own brainventure * i kinda remember sql * lets try on Login() instead * wait its actually here * Revert "lets try on Login() instead" This reverts commit 6fd26912b190d1d38fd5c442fc9dcd6f4c49041f. * hold on i gotta sort this out * lol, lmao even * i apparently do not remember sql * Actually remember to switch to varchar * aaaaaaaaaaaaaaaaaaaa * does the comma fix it * i am so fucking stupid lmao * lmao i REALLY dont know sql, thanks AA Co-authored-by: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com> * the other place to fix a string * sql is now 54, happy birthday sql * autodoc whitespace fix Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> * maybe using the defines i made is a good idea * AA's changes --------- Co-authored-by: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com> Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> --- SQL/paradise_schema.sql | 1 + SQL/updates/53-54.sql | 5 +++++ code/__DEFINES/misc_defines.dm | 2 +- code/_globalvars/lists/flavor_misc.dm | 7 +++++++ .../client/login_processing/20-load_characters.dm | 3 ++- code/modules/client/preference/character.dm | 15 ++++++++++----- code/modules/client/preference/link_processing.dm | 4 +++- code/modules/client/preference/preferences.dm | 2 ++ code/modules/mob/transform_procs.dm | 10 +++++++--- config/example/config.toml | 2 +- 10 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 SQL/updates/53-54.sql diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index ea78bcc0d558..60c0dc25dc08 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -79,6 +79,7 @@ CREATE TABLE `characters` ( `hair_gradient_colour` varchar(7) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '#000000', `hair_gradient_alpha` tinyint(3) UNSIGNED NOT NULL DEFAULT '255', `custom_emotes` LONGTEXT COLLATE 'utf8mb4_unicode_ci' DEFAULT NULL, + `cyborg_brain_type` ENUM('MMI', 'Robobrain', 'Positronic') NOT NULL DEFAULT 'MMI', PRIMARY KEY (`id`), KEY `ckey` (`ckey`) ) ENGINE=InnoDB AUTO_INCREMENT=125467 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/SQL/updates/53-54.sql b/SQL/updates/53-54.sql new file mode 100644 index 000000000000..303de0b32be3 --- /dev/null +++ b/SQL/updates/53-54.sql @@ -0,0 +1,5 @@ +#Updating SQL from 53 to 54 -Wilk +#Add a choice for what type of brain borgs want to have + +ALTER TABLE `characters` + ADD COLUMN `cyborg_brain_type` VARCHAR(11) NOT NULL DEFAULT 'MMI' AFTER `height`; diff --git a/code/__DEFINES/misc_defines.dm b/code/__DEFINES/misc_defines.dm index db931f29746a..b3bb3de5491c 100644 --- a/code/__DEFINES/misc_defines.dm +++ b/code/__DEFINES/misc_defines.dm @@ -392,7 +392,7 @@ #define INVESTIGATE_BOMB "bombs" // The SQL version required by this version of the code -#define SQL_VERSION 53 +#define SQL_VERSION 54 // Vending machine stuff #define CAT_NORMAL (1<<0) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 19768711ea14..5d588c4793bd 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -61,3 +61,10 @@ GLOBAL_LIST_INIT(phonetic_alphabet, list("Alpha", "Bravo", "Charlie", #define DSATCHEL "Department Satchel" #define DDUFFLEBAG "Department Dufflebag" GLOBAL_LIST_INIT(backbaglist, list(DBACKPACK, DSATCHEL, DDUFFLEBAG, GBACKPACK, GSATCHEL, GDUFFLEBAG, LSATCHEL)) + +//Chooseable brain types for borgs +#define MMI_BORG "MMI" +#define ROBOBRAIN_BORG "Robobrain" +#define POSITRONIC_BORG "Positronic" +GLOBAL_LIST_INIT(borg_brain_choices, list(MMI_BORG, ROBOBRAIN_BORG, POSITRONIC_BORG)) +GLOBAL_PROTECT(borg_brain_choices) diff --git a/code/modules/client/login_processing/20-load_characters.dm b/code/modules/client/login_processing/20-load_characters.dm index f22512e75e93..40be0ffc0cd8 100644 --- a/code/modules/client/login_processing/20-load_characters.dm +++ b/code/modules/client/login_processing/20-load_characters.dm @@ -60,7 +60,8 @@ hair_gradient_alpha, custom_emotes, physique, - height + height, + cyborg_brain_type FROM characters WHERE ckey=:ckey"}, list( "ckey" = C.ckey )) diff --git a/code/modules/client/preference/character.dm b/code/modules/client/preference/character.dm index 333acaf4d4bb..ca75666d651f 100644 --- a/code/modules/client/preference/character.dm +++ b/code/modules/client/preference/character.dm @@ -38,7 +38,8 @@ var/species = "Human" var/language = "None" //Secondary language var/autohiss_mode = AUTOHISS_OFF //Species autohiss level. OFF, BASIC, FULL. - + /// If a spawned cyborg should have an MMI, a positronic, or a robobrain. MMI by default + var/cyborg_brain_type = MMI_BORG /// The body accessory name of the mob (e.g. wings, tail). var/body_accessory = null @@ -191,7 +192,8 @@ hair_gradient_offset=:h_grad_offset, hair_gradient_colour=:h_grad_colour, hair_gradient_alpha=:h_grad_alpha, - custom_emotes=:custom_emotes + custom_emotes=:custom_emotes, + cyborg_brain_type=:cyborg_brain_type WHERE ckey=:ckey AND slot=:slot"}, list( // OH GOD SO MANY PARAMETERS @@ -251,6 +253,7 @@ "h_grad_colour" = h_grad_colour, "h_grad_alpha" = h_grad_alpha, "custom_emotes" = json_encode(custom_emotes), + "cyborg_brain_type" = cyborg_brain_type, "ckey" = C.ckey, "slot" = slot_number )) @@ -291,7 +294,7 @@ player_alt_titles, disabilities, organ_data, rlimb_data, nanotrasen_relation, physique, height, speciesprefs, socks, body_accessory, gear, autohiss, - hair_gradient, hair_gradient_offset, hair_gradient_colour, hair_gradient_alpha, custom_emotes) + hair_gradient, hair_gradient_offset, hair_gradient_colour, hair_gradient_alpha, custom_emotes, cyborg_brain_type) VALUES (:ckey, :slot, :metadata, :name, :be_random_name, :gender, :age, :species, :language, @@ -318,7 +321,7 @@ :playertitlelist, :disabilities, :organ_list, :rlimb_list, :nanotrasen_relation, :physique, :height, :speciesprefs, :socks, :body_accessory, :gearlist, :autohiss_mode, - :h_grad_style, :h_grad_offset, :h_grad_colour, :h_grad_alpha, :custom_emotes) + :h_grad_style, :h_grad_offset, :h_grad_colour, :h_grad_alpha, :custom_emotes, :cyborg_brain_type) "}, list( // This has too many params for anyone to look at this without going insae "ckey" = C.ckey, @@ -379,6 +382,7 @@ "h_grad_colour" = h_grad_colour, "h_grad_alpha" = h_grad_alpha, "custom_emotes" = json_encode(custom_emotes), + "cyborg_brain_type" = cyborg_brain_type )) if(!query.warn_execute()) @@ -466,6 +470,7 @@ var/custom_emotes_tmp = query.item[55] physique = query.item[56] height = query.item[57] + cyborg_brain_type = query.item[58] //Sanitize var/datum/species/SP = GLOB.all_species[species] @@ -551,7 +556,7 @@ loadout_gear = sanitize_json(loadout_gear) custom_emotes_tmp = sanitize_json(custom_emotes_tmp) custom_emotes = init_custom_emotes(custom_emotes_tmp) - + cyborg_brain_type = sanitize_inlist(cyborg_brain_type, GLOB.borg_brain_choices, initial(cyborg_brain_type)) if(!player_alt_titles) player_alt_titles = new() if(!organ_data) diff --git a/code/modules/client/preference/link_processing.dm b/code/modules/client/preference/link_processing.dm index 41aa9f771ae0..f33977c4a3d5 100644 --- a/code/modules/client/preference/link_processing.dm +++ b/code/modules/client/preference/link_processing.dm @@ -862,7 +862,9 @@ active_character.organ_data[organ] = null if("Cybernetic") active_character.organ_data[organ] = "cybernetic" - + if("cyborg_brain_type") + var/brain_type = tgui_input_list(user, "What type of brain would you like to have as a cyborg?", "Cyborg Brain Type", GLOB.borg_brain_choices) + active_character.cyborg_brain_type = brain_type if("clientfps") var/version_message if(user.client && user.client.byond_version < 511) diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index d47ab9fb3267..902d83132158 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -373,6 +373,8 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts if(!ind) dat += "\[...\]
" else dat += "
" + dat += "

Cyborg Brain Type

" + dat += "[active_character.cyborg_brain_type]
" dat += "

Clothing

" if(S.clothing_flags & HAS_UNDERWEAR) dat += "Underwear: [active_character.underwear]
" diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index d29f82eac76e..f5529fab46ed 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -92,13 +92,17 @@ if(O.mind && O.mind.assigned_role == "Cyborg") var/obj/item/mmi/new_mmi - switch(O.mind.role_alt_title) - if("Robot") + switch(O.client.prefs.active_character.cyborg_brain_type) + if(ROBOBRAIN_BORG) new_mmi = new /obj/item/mmi/robotic_brain(O) if(new_mmi.brainmob) new_mmi.brainmob.name = O.name - if("Cyborg") + if(MMI_BORG) new_mmi = new /obj/item/mmi(O) + if(POSITRONIC_BORG) + new_mmi = new /obj/item/mmi/robotic_brain/positronic(O) + if(new_mmi.brainmob) + new_mmi.brainmob.name = O.name else // This should never happen, but oh well new_mmi = new /obj/item/mmi(O) diff --git a/config/example/config.toml b/config/example/config.toml index bb01c052363a..e09198a3e52a 100644 --- a/config/example/config.toml +++ b/config/example/config.toml @@ -145,7 +145,7 @@ ipc_screens = [ # Enable/disable the database on a whole sql_enabled = false # SQL version. If this is a mismatch, round start will be delayed -sql_version = 53 +sql_version = 54 # SQL server address. Can be an IP or DNS name sql_address = "127.0.0.1" # SQL server port From 3954100889062d9fb7707a8255973bc144e225e8 Mon Sep 17 00:00:00 2001 From: S34N <12197162+S34NW@users.noreply.github.com> Date: Tue, 26 Mar 2024 22:19:30 +0000 Subject: [PATCH 04/48] Use a github app token, not the default token, to run !merge_upstream workflow actions (#24822) * Use GitHub App Token instead of built-in token * the important token location, and simplify * nanomap render * Update .github/workflows/merge_upstream_master.yml Co-authored-by: Arthri <41360489+Arthri@users.noreply.github.com> * further updates * formatting --------- Co-authored-by: Arthri <41360489+Arthri@users.noreply.github.com> --- .github/workflows/merge_upstream_master.yml | 15 +++++++----- .github/workflows/render_nanomaps.yml | 27 ++++++++------------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/.github/workflows/merge_upstream_master.yml b/.github/workflows/merge_upstream_master.yml index 94cad7e5baeb..7809101f7b92 100644 --- a/.github/workflows/merge_upstream_master.yml +++ b/.github/workflows/merge_upstream_master.yml @@ -1,7 +1,7 @@ name: Merge Upstream Master on: issue_comment: - types: [created] + types: created jobs: merge-upstream: @@ -15,9 +15,15 @@ jobs: runs-on: ubuntu-latest steps: + - id: create_token + uses: tibdex/github-app-token@v2 + with: + app_id: ${{ secrets.APP_ID }} + private_key: ${{ secrets.PRIVATE_KEY }} + - name: PR Data env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ steps.create_token.outputs.token }} run: | pr_json=$(curl -L -s --fail-with-body -H "Authorization: token ${{ github.token }}" ${{ github.event.issue.pull_request.url }}) if [ `jq -r '.maintainer_can_modify' <<<$pr_json` == "false" ] ; then @@ -84,7 +90,4 @@ jobs: - name: Notify Failure if: failure() - run: | - curl -s -H "Authorization: token ${{ github.token }}" \ - -X POST -d '{"body": "Merging upstream failed:\nhttps://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"}' \ - "https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/comments" + run: gh pr comment ${{ github.event.issue.html_url }} -b "Merging upstream failed:\nhttps://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" diff --git a/.github/workflows/render_nanomaps.yml b/.github/workflows/render_nanomaps.yml index 5b348499cde2..305e55553edb 100644 --- a/.github/workflows/render_nanomaps.yml +++ b/.github/workflows/render_nanomaps.yml @@ -9,19 +9,21 @@ on: - cron: "0 0 * * *" workflow_dispatch: -permissions: - contents: read - jobs: generate_maps: - permissions: - contents: write # for Git to git push - pull-requests: write # for repo-sync/pull-request to create pull requests name: 'Generate NanoMaps' runs-on: ubuntu-22.04 steps: + - id: create_token + uses: tibdex/github-app-token@v2 + with: + app_id: ${{ secrets.APP_ID }} + private_key: ${{ secrets.PRIVATE_KEY }} + - name: 'Update Branch' uses: actions/checkout@v4 + env: + GH_TOKEN: ${{ steps.create_token.outputs.token }} - name: Branch run: | @@ -32,20 +34,11 @@ jobs: - name: 'Generate Maps' run: './tools/github-actions/nanomap-renderer-invoker.sh' - - name: 'Commit Maps' + - name: 'Commit Maps and open PR' run: | git config --local user.email "action@github.com" git config --local user.name "NanoMap Generation" git pull origin master git commit -m "NanoMap Auto-Update (`date`)" -a || true git push -f -u origin nanomap-render - - - name: Create Pull Request - uses: repo-sync/pull-request@v2 - with: - source_branch: "nanomap-render" - destination_branch: "master" - pr_title: "Automatic NanoMap Update" - pr_body: "This pull request updates the server NanoMaps. Please review the diff images before merging." - pr_label: "NanoMaps" - pr_allow_empty: false + gh pr create -t "Automatic NanoMap Update" -b "This pull request updates the server NanoMaps. Please review the diff images before merging." -l "NanoMaps" -H "nanomap-render" -B "master" From 164ce333e4503d07b8e6c80222d616dc31828530 Mon Sep 17 00:00:00 2001 From: S34N <12197162+S34NW@users.noreply.github.com> Date: Tue, 26 Mar 2024 22:44:20 +0000 Subject: [PATCH 05/48] one more time (#24831) --- .github/workflows/merge_upstream_master.yml | 9 +++++++++ .github/workflows/render_nanomaps.yml | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/.github/workflows/merge_upstream_master.yml b/.github/workflows/merge_upstream_master.yml index 7809101f7b92..303b6c157859 100644 --- a/.github/workflows/merge_upstream_master.yml +++ b/.github/workflows/merge_upstream_master.yml @@ -35,17 +35,23 @@ jobs: echo "PR_HEAD_LABEL=`jq -r '.head.label' <<<$pr_json`" >> $GITHUB_ENV - uses: actions/checkout@v4 + env: + GH_TOKEN: ${{ steps.create_token.outputs.token }} with: repository: ${{ env.PR_REPO }} ref: ${{ env.PR_BRANCH }} - uses: actions/setup-node@v4 + env: + GH_TOKEN: ${{ steps.create_token.outputs.token }} with: node-version: 20 cache: 'yarn' cache-dependency-path: ./tgui/yarn.lock - uses: actions/setup-python@v5 + env: + GH_TOKEN: ${{ steps.create_token.outputs.token }} with: python-version: '3.11' cache: 'pip' @@ -54,6 +60,7 @@ jobs: env: BASE_BRANCH: ${{ github.event.repository.default_branch }} BASE_REPOSITORY: ${{ github.repository }} + GH_TOKEN: ${{ steps.create_token.outputs.token }} run: | # Compare head branch and base branch compare_result=$(curl -L -s --fail-with-body \ @@ -90,4 +97,6 @@ jobs: - name: Notify Failure if: failure() + env: + GH_TOKEN: ${{ steps.create_token.outputs.token }} run: gh pr comment ${{ github.event.issue.html_url }} -b "Merging upstream failed:\nhttps://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" diff --git a/.github/workflows/render_nanomaps.yml b/.github/workflows/render_nanomaps.yml index 305e55553edb..dee5d4cb0546 100644 --- a/.github/workflows/render_nanomaps.yml +++ b/.github/workflows/render_nanomaps.yml @@ -26,15 +26,21 @@ jobs: GH_TOKEN: ${{ steps.create_token.outputs.token }} - name: Branch + env: + GH_TOKEN: ${{ steps.create_token.outputs.token }} run: | git branch -f nanomap-render git checkout nanomap-render git reset --hard origin/master - name: 'Generate Maps' + env: + GH_TOKEN: ${{ steps.create_token.outputs.token }} run: './tools/github-actions/nanomap-renderer-invoker.sh' - name: 'Commit Maps and open PR' + env: + GH_TOKEN: ${{ steps.create_token.outputs.token }} run: | git config --local user.email "action@github.com" git config --local user.name "NanoMap Generation" From bb3800ca90159ecff1ad49da50bf0b1e904e4510 Mon Sep 17 00:00:00 2001 From: S34N <12197162+S34NW@users.noreply.github.com> Date: Tue, 26 Mar 2024 23:06:36 +0000 Subject: [PATCH 06/48] it was under my DAMN NOSE THE WHOLE TIME (#24832) --- .github/workflows/merge_upstream_master.yml | 1 + .github/workflows/render_nanomaps.yml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.github/workflows/merge_upstream_master.yml b/.github/workflows/merge_upstream_master.yml index 303b6c157859..bc876941c9d2 100644 --- a/.github/workflows/merge_upstream_master.yml +++ b/.github/workflows/merge_upstream_master.yml @@ -40,6 +40,7 @@ jobs: with: repository: ${{ env.PR_REPO }} ref: ${{ env.PR_BRANCH }} + token: ${{ steps.create_token.outputs.token }} - uses: actions/setup-node@v4 env: diff --git a/.github/workflows/render_nanomaps.yml b/.github/workflows/render_nanomaps.yml index dee5d4cb0546..016803ff428d 100644 --- a/.github/workflows/render_nanomaps.yml +++ b/.github/workflows/render_nanomaps.yml @@ -24,6 +24,8 @@ jobs: uses: actions/checkout@v4 env: GH_TOKEN: ${{ steps.create_token.outputs.token }} + with: + token: ${{ steps.create_token.outputs.token }} - name: Branch env: From 83f2e85b7449ffb313c8a35f14920389cfc469b8 Mon Sep 17 00:00:00 2001 From: Luc <89928798+lewcc@users.noreply.github.com> Date: Tue, 26 Mar 2024 23:40:54 -0400 Subject: [PATCH 07/48] fixes bugs with observer crew monitor (#24828) --- code/modules/tgui/modules/crew_monitor.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/tgui/modules/crew_monitor.dm b/code/modules/tgui/modules/crew_monitor.dm index d57e9612da3a..65dc8e2ef869 100644 --- a/code/modules/tgui/modules/crew_monitor.dm +++ b/code/modules/tgui/modules/crew_monitor.dm @@ -70,8 +70,8 @@ data["is_advanced"] = is_advanced data["possible_levels"] = list() - for(var/z in 1 to world.maxz) - data["possible_levels"] |= z + for(var/zl in GLOB.space_manager.z_list) + data["possible_levels"] |= zl return data @@ -79,3 +79,6 @@ name = "Crew monitor (Observer)" is_advanced = TRUE ignore_sensors = TRUE + +/datum/ui_module/crew_monitor/ghost/ui_state(mob/user) + return GLOB.observer_state From c7887bffde9571b31fc21bfce062665534e920f6 Mon Sep 17 00:00:00 2001 From: Aylong <69762909+AyIong@users.noreply.github.com> Date: Wed, 27 Mar 2024 07:42:55 +0200 Subject: [PATCH 08/48] Sord missing icon fix (#24829) --- code/game/objects/items/weapons/weaponry.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 8d5fcf7c5c3c..e6aa76550813 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -28,10 +28,10 @@ /obj/item/sord name = "\improper SORD" desc = "This thing is so unspeakably shitty you are having a hard time even holding it." + icon = 'icons/obj/weapons/magical_weapons.dmi' + icon_state = "sord" lefthand_file = 'icons/mob/inhands/weapons_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons_righthand.dmi' - icon_state = "sord" - item_state = "sord" slot_flags = SLOT_FLAG_BELT force = 2 throwforce = 1 From 0a16d6e9ec65b5eea147adcf021cd1a45e4143a9 Mon Sep 17 00:00:00 2001 From: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com> Date: Wed, 27 Mar 2024 01:52:33 -0400 Subject: [PATCH 09/48] Adds the Proto-Adrenaline Bio-chip (#24716) * Adds the Proto-Adrenaline Bio-chip * Apply suggestions from code review Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> --------- Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> --- code/datums/uplink_items/uplink_general.dm | 7 ++++ .../weapons/bio_chips/bio_chip_adrenalin.dm | 32 +++++++++++++++++++ .../items/weapons/bio_chips/bio_chip_fluff.dm | 6 ++++ 3 files changed, 45 insertions(+) diff --git a/code/datums/uplink_items/uplink_general.dm b/code/datums/uplink_items/uplink_general.dm index 162c2e18527b..22ab171ff354 100644 --- a/code/datums/uplink_items/uplink_general.dm +++ b/code/datums/uplink_items/uplink_general.dm @@ -808,6 +808,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/bio_chip_implanter/traitor cost = 50 +/datum/uplink_item/bio_chips/proto_adrenal + name = "Proto-Adrenal Bio-chip" + desc = "A old prototype of the Adrenalin implant, that grants the user 4 seconds of antistun, getting them back on their feet instantly once, but nothing more. Speed and healing sold seperately." + reference = "PAI" + item = /obj/item/bio_chip_implanter/proto_adrenalin + cost = 18 + /datum/uplink_item/bio_chips/adrenal name = "Adrenal Bio-chip" desc = "A bio-chip injected into the body, and later activated manually to inject a chemical cocktail, which has a mild healing effect along with removing and reducing the time of all stuns and increasing movement speed. Can be activated up to 3 times." diff --git a/code/game/objects/items/weapons/bio_chips/bio_chip_adrenalin.dm b/code/game/objects/items/weapons/bio_chips/bio_chip_adrenalin.dm index 7623f39ed668..67e06aad5990 100644 --- a/code/game/objects/items/weapons/bio_chips/bio_chip_adrenalin.dm +++ b/code/game/objects/items/weapons/bio_chips/bio_chip_adrenalin.dm @@ -32,3 +32,35 @@ name = "bio-chip case - 'Adrenaline'" desc = "A glass case containing an adrenaline bio-chip." implant_type = /obj/item/bio_chip/adrenalin + +/obj/item/bio_chip/proto_adrenalin + name = "proto-adrenal bio-chip" + desc = "Removes all stuns and knockdowns." + icon_state = "adrenal" + origin_tech = "materials=2;biotech=4;combat=3;syndicate=2" + uses = 1 + implant_data = /datum/implant_fluff/proto_adrenaline + implant_state = "implant-syndicate" + +/obj/item/bio_chip/proto_adrenalin/activate() + uses-- + to_chat(imp_in, "You feel a sudden surge of energy!") + imp_in.SetStunned(0) + imp_in.SetWeakened(0) + imp_in.SetKnockDown(0) + imp_in.SetParalysis(0) + imp_in.setStaminaLoss(0) //Since it doesn't have a good followup like adrenals, and getting batoned the moment after triggering it will stamina crit you, will set to zero over - 75 + imp_in.stand_up(TRUE) + SEND_SIGNAL(imp_in, COMSIG_LIVING_CLEAR_STUNS) + imp_in.reagents.add_reagent("stimulative_cling", 1) + if(!uses) + qdel(src) + +/obj/item/bio_chip_implanter/proto_adrenalin + name = "bio-chip implanter (proto-adrenalin)" + implant_type = /obj/item/bio_chip/proto_adrenalin + +/obj/item/bio_chip_case/proto_adrenalin + name = "bio-chip case - 'proto-adrenalin'" + desc = "A glass case containing an proto-adrenalin bio-chip." + implant_type = /obj/item/bio_chip/proto_adrenalin diff --git a/code/game/objects/items/weapons/bio_chips/bio_chip_fluff.dm b/code/game/objects/items/weapons/bio_chips/bio_chip_fluff.dm index 336f74465d1e..96f4de6aa72e 100644 --- a/code/game/objects/items/weapons/bio_chips/bio_chip_fluff.dm +++ b/code/game/objects/items/weapons/bio_chips/bio_chip_fluff.dm @@ -22,6 +22,12 @@ notes = "One of Cybersun Industries oldest and simplest implants, even in its simplicity it is rumoured to be one of Cybersun Industries best-selling products." function = "Subjects injected with this bio-chip can activate an injection of medical cocktails that removes stuns, increases speed, and has mild healing effects." +/datum/implant_fluff/proto_adrenaline + name = "Cybersun Industries FX-1 Proto-Adrenaline Bio-chip" + life = "Destroyed after 1 use." + notes = "Originally developed as part of Cybersun's medical line for preventing high-G sickness during space travel, but today it is sold for less legal uses." + function = "Subjects injected with this bio-chip can activate an injection of medical cocktails that gets them back up on their feet." + /datum/implant_fluff/supercharge name = "Cybersun Industries RX-4 Synthetic Supercharge Bio-chip" life = "Known to last for up to a year." From 8dc01209469918fb8da4c6ecb54656d4a04acef9 Mon Sep 17 00:00:00 2001 From: CRUNCH <143041327+Fordoxia@users.noreply.github.com> Date: Wed, 27 Mar 2024 05:53:03 +0000 Subject: [PATCH 10/48] Rags can clean kitchen machines just like real life (#24748) --- .../food_and_drinks/kitchen_machinery/kitchen_machine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm index 8db5fa8e3199..06597129b2e6 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm @@ -83,7 +83,7 @@ default_deconstruction_crowbar(user, O) if(dirty == MAX_DIRT) // The machine is all dirty so can't be used! - if(istype(O, /obj/item/reagent_containers/spray/cleaner) || istype(O, /obj/item/soap)) // If they're trying to clean it then let them + if(istype(O, /obj/item/reagent_containers/spray/cleaner) || istype(O, /obj/item/soap) || istype(O, /obj/item/reagent_containers/glass/rag)) // If they're trying to clean it then let them user.visible_message("[user] starts to clean [src].", "You start to clean [src].") if(do_after(user, 20 * O.toolspeed, target = src)) user.visible_message("[user] has cleaned [src].", "You have cleaned [src].") From d49d9d51897fd7a524b8260b38346952a8a240c4 Mon Sep 17 00:00:00 2001 From: CRUNCH <143041327+Fordoxia@users.noreply.github.com> Date: Wed, 27 Mar 2024 05:54:48 +0000 Subject: [PATCH 11/48] Soap is no longer comdom scented. Collectable captain hat doesn't look like a comdom hat. (#24661) * no comdoms * Update code/game/objects/items/weapons/soap.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> --------- Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> --- code/game/objects/items/weapons/soap.dm | 2 +- code/modules/clothing/head/collectable.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 5a23face976d..e7c486d5a40d 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -102,7 +102,7 @@ return /obj/item/soap/deluxe - desc = "A deluxe Waffle Co. brand bar of soap. Smells of comdoms." + desc = "A luxury bar of soap. Smells of honey." icon_state = "soapdeluxe" cleanspeed = 40 //slightly better because deluxe -- captain gets one of these diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 0e8e7476e5f0..76450a01cac4 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -47,7 +47,7 @@ /obj/item/clothing/head/collectable/captain name = "collectable captain's hat" - desc = "A Collectable Hat that'll make you look just like a real comdom!" + desc = "A Collectable Hat that'll make you look just like a real captain!" icon_state = "captain_hat" item_state = "captain_hat" dog_fashion = /datum/dog_fashion/head/captain From 6f1c47628c4196b4a3a4b99e81fac8ff0fcdbecc Mon Sep 17 00:00:00 2001 From: GDN <96800819+GDNgit@users.noreply.github.com> Date: Wed, 27 Mar 2024 01:09:15 -0500 Subject: [PATCH 12/48] fixes a ling gc issue (#24833) --- code/modules/antagonists/changeling/powers/fakedeath.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index b8c7389ca42f..d826b4712e77 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -23,7 +23,7 @@ return TRUE /datum/action/changeling/fakedeath/proc/ready_to_regenerate(mob/user) - if(user?.mind && cling?.acquired_powers) + if(!QDELETED(user) && user.mind && cling?.acquired_powers) to_chat(user, "We are ready to regenerate.") cling.give_power(new /datum/action/changeling/revive) From ebc98f5043c755be1f1bde99cac1a6a89c98cbbc Mon Sep 17 00:00:00 2001 From: Contrabang <91113370+Contrabang@users.noreply.github.com> Date: Wed, 27 Mar 2024 02:09:42 -0400 Subject: [PATCH 13/48] Slightly modifies the logging of runtimes (#24800) * moves errors to vscode style * OOOPS forgot to push --- code/modules/error_handler/error_handler.dm | 8 ++++---- code/modules/error_handler/error_viewer.dm | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index e0615f0a46cb..2ecb9e20e863 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -72,13 +72,13 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) var/skipcount = abs(GLOB.error_cooldown[erroruid]) - 1 GLOB.error_cooldown[erroruid] = 0 if(skipcount > 0) - log_world("\[[time_stamp()]] Skipped [skipcount] runtimes in [e.file],[e.line].") + log_world("\[[time_stamp()]] Skipped [skipcount] runtimes in [e.file]:[e.line].") GLOB.error_cache.logError(e, skipCount = skipcount) GLOB.error_last_seen[erroruid] = world.time GLOB.error_cooldown[erroruid] = cooldown // This line will log a runtime summary to a file which can be publicly distributed without sending player data - log_runtime_summary("Runtime in [e.file],[e.line]: [e]") + log_runtime_summary("Runtime in [e.file]:[e.line]: [e]") // The detailed error info needs some tweaking to make it look nice var/list/srcinfo = null @@ -131,8 +131,8 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) desclines += " (This error will now be silenced for [ERROR_SILENCE_TIME / 600] minutes)" // Now to actually output the error info... - log_world("\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]") - log_runtime_txt("Runtime in [e.file],[e.line]: [e]") + log_world("\[[time_stamp()]] Runtime in [e.file]:[e.line]: [e]") + log_runtime_txt("Runtime in [e.file],[e.line]: [e]") // All other runtimes show as [e.file]:[e.line] except this one to prevent fuckery with analyzing both old and new runtimes. runtime.log should stay in the [e.file],[e.line] format. for(var/line in desclines) log_world(line) log_runtime_txt(line) diff --git a/code/modules/error_handler/error_viewer.dm b/code/modules/error_handler/error_viewer.dm index a6a0a7276656..63dd60a8b806 100644 --- a/code/modules/error_handler/error_viewer.dm +++ b/code/modules/error_handler/error_viewer.dm @@ -117,7 +117,7 @@ GLOBAL_DATUM(error_cache, /datum/ErrorViewer/ErrorCache) // from the same source hasn't been shown too recently if(error_source.next_message_at <= world.time) var/const/viewtext = "\[view]" // Nesting these in other brackets went poorly - log_debug("Runtime in [e.file],[e.line]: [html_encode(e.name)] [error_entry.makeLink(viewtext)]") + log_debug("Runtime in [e.file]:[e.line]: [html_encode(e.name)] [error_entry.makeLink(viewtext)]") error_source.next_message_at = world.time + ERROR_MSG_DELAY /datum/ErrorViewer/ErrorSource @@ -128,7 +128,7 @@ GLOBAL_DATUM(error_cache, /datum/ErrorViewer/ErrorCache) if(!istype(e)) name = "\[[time_stamp()]] Uncaught exceptions" return - name = "\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]" + name = "\[[time_stamp()]] Runtime in [e.file]:[e.line]: [e]" /datum/ErrorViewer/ErrorSource/showTo(user, datum/ErrorViewer/back_to, linear) if(!istype(back_to)) @@ -156,10 +156,10 @@ GLOBAL_DATUM(error_cache, /datum/ErrorViewer/ErrorCache) name = "\[[time_stamp()]] Uncaught exception: [e]" return if(skipCount) - name = "\[[time_stamp()]] Skipped [skipCount] runtimes in [e.file],[e.line]." + name = "\[[time_stamp()]] Skipped [skipCount] runtimes in [e.file]:[e.line]." isSkipCount = TRUE return - name = "\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]" + name = "\[[time_stamp()]] Runtime in [e.file]:[e.line]: [e]" exc = e if(istype(desclines)) for(var/line in desclines) From 2f7233617dc66b78e1b3b6ad7bd0ed84948fbc66 Mon Sep 17 00:00:00 2001 From: Adrer Date: Wed, 27 Mar 2024 10:57:52 +0100 Subject: [PATCH 14/48] Fixes disposals pipes in medbay on boxstation (#24771) Co-authored-by: adrermail@gmail.com Co-authored-by: S34N <12197162+S34NW@users.noreply.github.com> --- _maps/map_files/cyberiad/cyberiad.dmm | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 4b282b507ae9..822f1d944fa6 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -54324,8 +54324,8 @@ /turf/simulated/floor/plating, /area/station/maintenance/disposal) "ejO" = ( -/obj/structure/disposalpipe/segment/corner{ - dir = 4 +/obj/structure/disposalpipe/junction{ + dir = 1 }, /turf/simulated/floor/plasteel{ dir = 4; @@ -62692,6 +62692,8 @@ /turf/simulated/floor/grass/jungle/no_creep, /area/station/command/bridge) "imB" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "darkblue" @@ -82303,6 +82305,13 @@ icon_state = "whitepurplecorner" }, /area/station/science/hallway) +"rHw" = ( +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "whiteblue" + }, +/area/station/medical/medbay) "rHJ" = ( /obj/machinery/atmospherics/unary/vent_pump/siphon/on{ dir = 4 @@ -131405,8 +131414,8 @@ cjC cjC crY cnw -ure -ure +rHw +rHw imB ejO crt From 3b2ab24fe18681d5bde1d415b86a0a492f9c188d Mon Sep 17 00:00:00 2001 From: Zack Date: Wed, 27 Mar 2024 05:23:16 -0500 Subject: [PATCH 15/48] missing cables (#24769) Co-authored-by: S34N <12197162+S34NW@users.noreply.github.com> Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- _maps/map_files/cyberiad/cyberiad.dmm | 49 ++++++++++++++------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 822f1d944fa6..00ceb3c20581 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -19316,6 +19316,11 @@ d2 = 8; icon_state = "1-8" }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, /turf/simulated/floor/plasteel{ icon_state = "neutral" }, @@ -19330,22 +19335,16 @@ icon_state = "dark" }, /area/station/service/hydroponics) -"bhN" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - icon_state = "neutral" - }, -/area/station/hallway/secondary/entry/lounge) "bhO" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, /turf/simulated/floor/plasteel{ icon_state = "neutral" }, @@ -19368,6 +19367,11 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "neutralcorner" @@ -19626,14 +19630,6 @@ icon_state = "grimy" }, /area/station/service/chapel/office) -"biA" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "neutral" - }, -/area/station/hallway/secondary/entry/lounge) "biC" = ( /obj/structure/cable{ d1 = 1; @@ -20686,6 +20682,11 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "neutral" @@ -109271,7 +109272,7 @@ aXD aZf aUt aNu -bhN +bda aSX bhm bhm @@ -109528,7 +109529,7 @@ aXC aZa mNq aNu -bhN +bda aSW bhm bhm @@ -110042,7 +110043,7 @@ aXE aZb aVc bcG -bhN +bda sYL sYL sYL @@ -110299,7 +110300,7 @@ aTu aTu aTu bcM -bhN +bda bgv biv bkd @@ -110557,7 +110558,7 @@ aZj aTu bgC bhQ -biA +blq blh blq blq From 777458a26570f58b6bfe3e469c9c567dbd29ebe4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 10:30:46 +0000 Subject: [PATCH 16/48] NanoMap Auto-Update (Wed Mar 27 01:08:10 UTC 2024) (#24741) Co-authored-by: NanoMap Generation --- icons/_nanomaps/CereStation_nanomap_z1.png | Bin 921117 -> 921274 bytes icons/_nanomaps/Delta_nanomap_z1.png | Bin 634614 -> 634964 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/_nanomaps/CereStation_nanomap_z1.png b/icons/_nanomaps/CereStation_nanomap_z1.png index 44eb8e20ec02a643b0f396527b4fe12d81e9bddf..61e992f4ba588ffb28484d8f6b74a4ea710478e7 100644 GIT binary patch delta 379634 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 z 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

usn_it$hA-;hOY1*> z65+2a{R%$Yx|t>wc|w|VCzNAfym;}>AIT~W%xsu?I3lg%(RI3=f&+_%zBVD8m)%7Q zKR=eTFHX&dvgy`W9FE&uuQ6F_*tu^0_j4qe}pV(a!vvU z3FzVFBmXu*TFO6nxHT5O+|H%I2Ux#YOvkJD)~7yKqNBu5(wfy{3)O2 zpzk6%qm$?V*Fm*Rge4TCTJN}NXqWIk{wHvZM`#*-K<@fq8w}vstXhUiriAkY>*$(f z0o~=UD?4AmhBj;3%as-d#J@0VNhKHdJe0vr(}7c^SBoTdq)!UeNPQO01rS9!^134}Kck8m38Gg}wq&rAYq_Zu#W_aY- zWO`{Cp;P*0X=?j%ZO#TK&-mFr{csNFAO^}cJej!LS-%||Kj3eWHaEFdLb*-(#FyD$ z3~@VV@p=)sK^a$ZSNFH0H->?F1EXrefoTMYqkYlsT0Oj`GoIuajEaN@g+=NPh|;*h z$`CgQS~^Segm6b`A4##BOHb0gN6LabQUhKV3Ipp33jyg}fAxvl@o(bQ>Hkx_5}(^G zM)(zfW>WVD%{=d5HD0Gxi98stqxmvC{$X|wFd>CyZ`L#@YJ4vdG#cPk6e=jgZK}-~ z{mp0JS$fkyPDa6{xP*NQIHId^YbVS^7$m z;QN`5_Sr8lJmqkH?ecm0cW|rD0o^bbj06(w`ij330ne=4J*#iWh(!Qr_F@ZXTH(eT z#LJ(+;=Q#&Oz1zZxg~QA^e=bK+Gpu}EB5{FREvz_9NNsU%q>2@&-C*bRQ;0D z5-R1aO)_{@h0`%q%bU3Hh?{ZaoeT#K*60mpQAC+wW8C}k9QbPTXV1%z)`w_qpnDyl z(VseNly+#zEFd~FjR=3PCe&!|>c=SCC*-E$OalR2`+S;Jh8t(*5d{BTg0V9v4w^E* zy}UpEZ67ByX@Yk+ff{1bnrVR4y&)Isi(gbc;O{VhAtv56=`&?=d(pwpU8mF}8+uE; z1Hy%{V+&MkLvFyrOa_y+tF}yOi!%o#-6u3xu3YJ3S|Ym-!=fqb5uBbdfed&Va(c=omDFpMYN?!q0rf%sKkeA zKtD~m_Za#9AT^%bwXl%JuKWr8r0oHi&R>j7dSlH?Y!-PIWsoD&=fSwV6e3c|z$zm# z%Jq?nBd~kOgQ|soj2fgL!p)=Y81B5eK!0g0c%a04|5$9DmPwoty44nBEIdH^)h=fB zywB=H@{`D{I?aG+ggO8H?ze$_TBb=TsGKs{`BC-mGMuW4P0g-dESv4VKJqV_7=vORW~)14hcD z3^rdhDrf$f=V#$Q4in34@Mp&7I5$dI8rhGH!7N z9uNN&%%F9c)AqD)gHvFAyRWsTeYn|5W$9;NmC0d7)h9)h2R)j%IQy05o?j>!?VVhC zd_hVuPR(PdGyb~dd(+jT&v*O8qlmXhT%lm(_Tsc%I__gYawW3gV{JJC^cSUDqRJY5 zsxkIO(}K(9IrX`ati}j1tPOj{f|ytld{IFcf>C|7`uh!EPhW%yHdo6bCW5fjA|vwB z<};FOCD#kNq>e^t#-l!6_Cj|pR$Ox z;Zbco*qQ2(POlCmFcHt4t;tVg#Kl2j`Qy$6{~7sQRxxb@*cTKB?$SxhFDb;>TwOfn zu0UwjgMbTJ)`Lj)J1&aQ47B;RE{u?W`NBGln#Bi5X#Qwa^GbsQig%QJjAZLHujc|m zp;zj0$^Q17`b|6dy>nExGNQnYQP7mS)wa+TM#%(?V_54@l^2z^>6mLoJIy2KU=vVY9MQdehkx8}-20F|8E z&K3s=A8IA`2`Ms6^Eg$#LVT5=rQHidT)=`E=H1{4iR&w0{UrWF5L*K|~hF-1^P8=IMOSP1a=2=g8qL$#EB+IOn z`omUguSw6$&9ra@lE?wiKUn5gYs>e4Yo=2hQ&m@Qm?E^()uGVX)2=L^4C_#+9U`n= zC6jxDzx(pfZBKxX0M<)Ga=Lk5MkUBb#nJ931$cYMj@x^M)kcfPM?A`zpaxgh1mfZ@ z2BQLarwvv3c1ECK3G<6gX*mVGGY$Y*W`j3y090{froEDykMfQ(U|KR^ndGCU;56IS z-`oq9&phKt^g|br&NEb}R`eQ-4-4dvsN3Zsx6m``XQzi6kP|dOi(h21Snlj>>O^6oDv!Q70W;rWDQ{gLv&WTXuZaRw8&EA3 zY*~YV({#akRgM-kf8HS_B;+7}*0^|XJ5bo&gn5}X~e__#$5s_+xR^~TFxX82~*3bq&w>ev}|e?8iWY36}NRR9Q54nc;f)ye_DMCh`unASS2y7^I2n47Vxi<0n)HH zXO|<%-JEx+(N5`Ec32la|+mYvUc2DM-c5Qow8%Wwg8)@n=F#5m- zX>O23#0|i{Cl7K5lAv@gx|LN_6y#m_$Tf+SGdju;>n(gRH`#%#jEBrOUD+MK$RF-) z3+&u0LF&4i*_$@qN1UveZ>y*et5aJfUs#cDquP{6J$y%E=-km4heMAW+Z7+I;GSU!Xu9QbgouV zPbG+i%?cFo^?(%B;}M*q2y2Ngw8b-gHgd-yob*P@gufi8C(U<=-pm%!r+HE7Zfse0 z>td@7fk?#LV)G&WOyz_07&i7g;s=H25`6jT({Vh1EjKSi$(IinA`k{TQ2>$ zu(k!dY#f`;74iI^dJqT@8CJb6Dza;7*%XC~eGy^V617Y&oOteM#t81@`Yq82dHK_W z;y%wW0>bek#@M?fuT5F|%=*K{$7W)|4m~RITZBZ+C%gP>@65N0UX1(Ne5A!E6;paoj_r3XoQ(CDt8@WjO;fS&ISmP2ZL-EaQv$Q?R|JhZ+@vA-j zvpEmMG70MwJTrfGz+QS99K>4uvE)IVj%P?&&jj4&jJXDo8awj$>clV#Y%$al^dR*s zT5_r{JpC-k-Yat8w-{Vzo2Jd%{uJ83i%C~DiFq=Y+rCGx)n$wFd!srPXZ|JU_I|uK-Y72(Gx#pODQc zBKG>16oMoNR*;wjpn)l#reDwiUbF};g>6vGtHw2g{e`<-!EyyJU7fR@IO9PN_SFm~ z;-Q*luU#l!2)PYS-9sEj9W#&wYS9iYeWh@-RZYu8p>;c-9=oMs^Lc20*J%jizKJ{E z9*E5g!Gf$6DKIclJfh=;BOG}GiM0$Y5btx{+CtDPLgzQkAZcWU*e`Jx1#!?ktGW4P zE$%8e2R?m#eq9!?I9c6K5npPS;38P*OtM0`6b0=&!0x-xs?2>>oF9VA{T-F)Z#QxE zDDGUZ(~UQky~`csI1SyNk%nKPM?8tBQJLGY_{f|;hvF$jkd9GY>!_!(AyvF*cK;df zfCGq5Fn*!fUo7iXzp{?TRpaLanb+oTOjhE7e-sf_r z`c9ZFdgssenfM)gE+Vk`k*V>TaFbxL<34qND8^{NSV3HH!=AS?q1aPE-SL-nq26%tA3e2%rB0t1S_wssFq#O9)%T0B5^r6t&t%&L)X$)$UqBu+Tc7PVImBl$m-g} z8>}Te48TsNlL)1c)qvL>iEsf5z@u4a4jE$AKvTc=qX=Olvw17fvfy{`V{9k=_x!Bq+#p%0#{Q9x$K_fOT#r=Co-psUTVby16G}9X`Cn8Ar4-SIzzx$o<6+e{)*UF zZ}*Df-g{@i;F?<<89sU83ymJS2biCrS7hH>ep}Nd{gZ0`xCck}AB;Y5vM=W<`i2G1 zvm}H3K`Q{!nFZ%Th?s*l#By5SS)#6|a^7*q1G8zTTq^>uXg^HK9d|5D7n3B%FM}fZ zS$4z6TYt81JLY}Fz89!TE~`#01T9VMbKSnYiG8R>xGO%AI2TpT7MxGV$0T6vXaSdi zISz$RMv45H*S`V@NJ>FJcHMsZ^4JY1CTE8mGsPUl+;Qz+xu!{YbE^3#=B?=8o2R6= zNs3g&IgtaPg{EowVk)2c?wt|eDPK}+b0OjlgM0_AVu3_M^xGLsi{8kqzy;4d~y^!{aULAUwPAQHy z5ZPuLzJkw(WQ9x~LQEW02Vt*4*;E^7Hu7{BhR5njM1K6%Z*pXn8y74nVv?Ks!M&50Zxal=qw6CCOLvQ_2pnUUPPq%vY)$PX=j@`X`A}m7gfpsY?W?!QgYX;=-<}2$iILp4ipg65v-M#sdpZ zhc-immE0X)p){QE^+Ju&(fi0#wo2B8Y5XnD=}?L(TTm3XQk5F$S!GkAs=yoW%x|0} z>)yNVeRQ}H@l5CD&CmUQ=U_Dnsk{eRL1b5*^Yle-YwK*>x7GJ#^=I-pt%jhdNUQMZ(E`0LyaFCV(p_t`K#;)O@F! zU7ma7Y~*>92Xcj|OZNriuL~(lyR#02pEU|bo7)K~E=qsDn#S_gp}r7U`SWmbG4~+k z%|n1J(>aGPFL(5THJ#}EFBWB;LA(sy3IHHW<>r*#N1k{RR;+CEqv*-JW#H_wGo?Lq z1L>drYAfP*jo*FZTDPa+2lOo=T$Sz8v6q1#Bg+D)o31MwEEMc|#N_R>Y9sl^()jOgP2IFK*aNj>fjS(aUU%t8cA`%7?$@u$iJKKvFikX-Xqvds!5%-eBM2Q&^P!( znj;C<=#A%xfgMqHOh&n;__2@8a}oj*PxI$u@+kdLHP@vF0LeFU99e(a=Wa?UN)7Gx z!gDR=gr48TvB#_ek}YGFl75SU1a|h49hV(4SkS@_NH?eQx*udYHa$JJ-S{VyP!iz# zkup6#?th4p`49PrhwBwxuX$upilG#m!P3C7D4HU~xyxS!%k(dO91Y};Mz#{ULX!DG zg2BJ%g)ux@jeT-=eg>P^%RY6?03@w`E(7hA)3sc()ZQlnJ#OXPY43Mu*f_l;XklR4 ztZ9@-Tni^cw*5V2*b?hsl__dURwP|G>9zp$qlD zQ|GHv7s)eH0nOA_U@`i7_LI(=EuqJw66Y{0qWJ1s!!1iHO2evZt`b8+0xBhP*;?g{V>5`I&+;&wNG zDZJ{So@)z8z{-0M$XyO6Tuf7oJ(+fh4x(HZ*bI*L_vH^IIj2DH!n?%$Ky)}iHxpsV z{o46vQU!MIu-{~$jj}3`gO79u!xA2FFEa6`KU{u6Tw|m-9|R+SXH}{IMdtl1AWG4? zQn?}vo}{Uh!`yfzQzNs^@fmDuT8|t?vDw65IVxxApKNp8RGc}@;V%K3Mi8unZzC-~ z=)*8K1~$+z40PmG2Fr*PERNp$TxryhAFQIt{jTx%^&D+Pv?S%3eDR!;!8zmWvnQ~C zM>(|?$eXY`Nwk_!=CFfL84*L#NcE_`hIb;Gxvh$7KJKSD9CBXzv!H>DC;bE&`J?Q5eQ0K~` zp^&**&AQf>cE_e9JvZe;<$|z)!n!|q<>sX^)*?Zce^_{h03Q?=5Tw6qUxoU$xjJV% zsdzHlVSVXJ%j+wJ@Hg#U$=qKkoe}t0l7-i3G`e2Ec{E^g601b$(CIFG8 z_U)lQsc^Jo%bxl>ikti;w#GL+l#PbLH`xPRdav)|P9o{LV1q+X#V<$Lonj4atv~Dq zHdfYoUE%!pC4eDZleq)`6Ut=qJWIa7mLf0FTaJn#g`UD3y)> z0mgc@E3o?We~Lfd6S#~(_E1%&!^@}-*gS?EoIC8Q8-4NAM)P=*fT||g>jc?xZ8UTv z><0I6XEZwOuU&ef!ZxK0CMDpl%@F~)xO{{T#Es+ z9u)%72wBA>Xl&lXuH7#`gi!w4ht?E_sgXsvybJP*0|cNkmBj#`QX@1<2jdccb&^CO zKCZ?rnR^s*+jJU1Xn#`|XR?5Je7O5_t%Z5K_nX)j!Blgd)(c;|zH5E{;1{)w(Hxve zaAvSa!v=LPhk+qJffdcw1Gc#?;5qt`nE{>4b6@ERKznS2o?qEw_$hnbIgj;=M|QS6 z4QQ^G8UEd@7DUh2c9DYyK|Xjx>n!4QVpr+NSB`CfLkHKL5ud^JVI=UNH!&jTaX#ld zc@eYKj=+K-2nCqD8z<_!uc|W5EWdK-JBkOrVa@O?K~R;bI1@)A&dkiOR|)E?n^6os zu^dF5^(AlBAF6)u8zW@F;lo@uM&iImsXN*Ww5lKgVyX9zypN=XX#>Wx7|f}`5>$x? z28q9#o#4FL&%b%IK$L{lz<7nl_T(!BO$0!(icuy5`_2M6jC?{uro?JgCx;gJ)BU zUq;*|#WQmHYp7tu8!ShPim(z_*Ukikja3i9#wx2mc%R`@{gN*L5$z#u#}@JNy8w!C z1jOjiCk@8ckh0hfRewTii$BT;(5M54G&tgFl745lTT*QC;Q8#!Q+!)J8*Bu_T0mTz z?J0}$j*12P^Yz`17;``Mz}xh;eQYr7fnXfbC+J&cb+l~#6W5<`$)N_onkkn4-!)UQ ztH7G6nMOT{EE$MK>QC7EVugquUH$ymS!Iu4U}vkES}eAW@eg%mf0uep6Q;q4^j;nw z)f(NPK}~A_xdvlxD>u?f(LwLT`bE$;E|9(91KNKqH}J7k_R)urXG5Mc#5Yzbq#&jh z)*Y`?a$}_;Gq-xi;ykDVI`9#O3oME|5`<}Q?gvZ=>hux|2M3~UO9rb{>@U!$!&Wki z3J`m`N8-Sj0EMQU_p;Oz)zjJJ;oyq$J`ZIWVkM1ijld-d%RMhSBY>dt_GKDl@IXhV zyrj;li*j;uZlM=~afO8pmEz*RwwF<nbxn;-6ezXMDw}nAs$Gge}Vst1p@Zl^PR}e#m|gNSZ*&l;Yj~z zTh2AXqXs;DZwWV$IbXG%u*lS1ZvKa<>kF8=P76XR9+YirQ zFGg-N6Yh@@XZgjL+P)>I0$_O77;DS9zYU&D&w^Y3cq0J0@oZW(9+EjxzxpxSl5n zp_;i@*%2HD^z&{0B8Qo8Mz-6%_ci3OInG$b-9Q;5& z4tev2e6QD&9bzJ~iz6HmgJ_4OMFlp;ntn6StK7rG>$Fot`c&6}r6|8^2o|{Ls%5!>}YC(D?N) zSMfiUgq)q<*Hsf|d)^a_U)G(Y^khFxH2FeNi- zy1Tfn#XJI&o614-8`5Yfe47EM&A4K5b%zccg??q-!=_ZrbAw+}d?gN%%OHN-JV#tk zZ%sP7=<$+gftwYsw4fssa@!-^8~A6P*>0wbP+^R5~n!(eDBsD zv?W=n;!j-QS9xZxXID-&LXTv7Ecqr3jE4^ykFKrL+F4qhJ4`yQ67Obgyc}xu zc&Yrf>HF^`9M6fFw`+Iw+mt=!`@vgaWqx?vc)y8shBNFGvUxkFVoQ!(Cclgec1f)) zmwUahPr#80f^vtWv6k=q&#tCf>guH9@p~?x<|x=)*b%{m8N>VJSFF~4HcR=XZB&>_ zMkgbWvn-2m*f+wJ0TBb|b4IDYjM;IKrk~uO$P!IS)OHI${Ku6oIlwdI+g7e5A+hPC zACi_|*OK@2Pen}T6ZKFEiD}=5;(bO20sy#$8_b@d!nz@#342UOTFSZ2#X7fZc}^lc zhP~T9U(q~1l{1cfm%6*vAQsOly0jpmzvX@vbcZw?N+-J-ZC|`|Pz78Wy!r>$@8u^A z03`>w^g6RXSX}@06+<9nd=|IUa%$$UDAhy~) zt^2-k^YZz}tO=-*pv4;5^1STh%Fr4h-M~W6wzV>c&ke^FDL=pZ$m{3b9l3=-~AgW2RyF1t%Fp*mmVNDlzL}ZQ0otYMTDN2 z2#yLVxlT~2Hq#~`<((*BPo?t&c5gtt0r{KN=yXm$Zeal;8s^A+hhufYsGIs$&)>36 zNlmHpnUX=YZfLvi8Dqu_^LyI_lUr+6V{SFMCEjIi6>18i4Z3|3mk7$!x;NMrvf{DZ zrog;;iF{1;G~#&Fs~;wDnE;wX%Z+4P>Qjr|@ZzGNuT=*h!WGP)_2b;jv}FaCJAmDp z*y>B6F$xGVg`R1XeP-^RKkV8ERB}KDtChGDta(}F`VjO68`u}_l=G@4$7k+LuL|@< z;2vUpP~)YcG+|7nQm6+opbvK-zm*v-IOtygiqk8&rA|%t}pk?iRq&c@q6f29h&C=H#M|ro(Om!y3%?vE_i*9IrX+B1|e00fLzwsI({-xTDb>!sTrD>pf?KzYqf$0hvy`L=dXYD0nfiA#s}A2#KQL{r$;2uKC} z#{7m0;Km2AjcX$`5TZx#qe=&M<5!a+CqNGaLO&O{)PsskYL|oDleE*ztP;N`RM4LLGso=KC7352jsKy*UyPdXlc+J! zkJOyjG)s}1oWjR+XcaDj#6a((XFT?U8(z>2*Q|MGJ4U?m8} zHGU)!*TS3G513SYBCrEwxWaI7R{!2CN>>9_%1Q-f4~Od`rGC3)a6eQwyAO9Hx-vie zQM>kuk{|h5zMmK2}Cs#8g zhNNyYZO4QpX^&h#)avTc-?g&{M!vRBiIIc;nqtP-PxKsPD4$^&;7t4Wf! zF>1}e%h%UQxjxy_XJKwm!$nE0xPMq9)bI()sI>~Ltjf75fDL^?SyYQY4i$ngMjA5G zUlD#{uSTo@$YI84np3AMbnhGX0et%=))Y;%2g-0ZAko&o;%R59{=o$&(txwb$GwDa)T1)&5tBlD$1`ST*yE;f!r4z>}N-1Q*ID{ z^C?Gdmm2dBp}_~VIv2WnIhc?zB;@r(9TS=I*>$~!DW_okRI6`Cp7sP2nr|$2o#bs- zuYykMVZ3@5Wv}GW(pzH>tr7eubcpX>u2`e~x1JuXzE^arG;iK{5D9BYMica4!}}m2 z)6Usj5xSU-1KY*SQ)~f;c(5|b5YmkOY2ySVh68W1I%9{x1?q@#YWr|Te=jx0XzFL0 z74rKiHS?~D^ygM*{)?H_nzLH`9>X2EF5_|Ias12Kr-R;3gDVfS{1}pNO!2we755wZ zw88#QMfnPQy}yn>?{QcrNfVdfmt&TW_!PL;MF==Qy0kr{0yYtr&)*(~xb@VK4`|f) z)d3tnhWL%ylrMyZ{#zf=jOrOMdDTih;HLW zBdTQKpK+lEY+&3>3s|tR%AN5hmMbp_P*nYWCl2!Ba3_*>Ci5r2no!b8OOk*Pw5R8b z(8p+3u2%E&okEed!+NqGnyr4UIk9%jehuA$ZDT^2;GDuYj$Y0-o8dc_fQO$U4=!Az z^pFJC1OdYef4MYow^6ySZ|Mm6Bv}jcH~ZyS@oH*k9tG!7zbe)=!dPQz?G>_YPz7Y- za!Qe8}w=)nu&_+`ugC69ei^rKpM`RBh}?uVP=iD@klvU9Nob6VH9u}!Sgt5I?ITIk-?#7E@PSRJf)yM;u+*IAE1C$u ziV~B7?Lceko2R3x%L?xTp~z))(GKLcC=`|QgrZEPPv36An7(dgX@<#D%a|FYQr?6y zcRzCA_Khr;yEX3`CT5}_SC6&yGh52o#!YdxZ!IFxXDv8~FzNDG5NWI`rMfis^eE>^Je{uk+m$W6{i5N0^@cOjWgGHU z;Vcupd>mxVoR(_L*(Ao)V#DFJo;%;r@7T90Lt1SA@`$vR)Sol0*%dHCh*xJU`AsK> zodS?vbR^>qlEMlatg(FVjAah{>r1Te*P3&#j2Sg4DFzxOQ5s-Ym6VDE0pGYn81RjQ zFIwJ5o}HO(xeIXHjx$|(wt-wEr0Dr)&$;Sxik?3)`pWPNc+okO0$^=0m)m_>t%uW8Y(Wq;TTGgPBTVgSONB{{xR-AkSi6++vFcxU z;bxCl|LqJay-^(>)JCfe7bmDStDOTAo!jUBRFWU0cx~iV*KdC4Gbk}={+A){b(?rc zsoWlr3ESA6UaM>Gm2RCR&w7Cd&R=pxa59Ov)|NXxnR#Nk^6$c zNUqtw!{Tdn%QQH@53V~~r)10dIamLd4v<4&qEIDn7xQe50jt@6n<@5*vSCw@1O!|` z237>0mC!$JL5s~5a^Jr9&ycP!>;G9$;7SCE68qeR$_@FyDAxpWV4d;Xm+zO(u79XQ z{ytb^k@aQoNs5XR6}f&mqr>Ms+}!3vzXQ_n;phjo5=h)NkM&Tg61sH{aYqnX{6td8 z_oIgi3_W6btq#2yZNm3YIS6S-C*+pYe9@^JsybaeL^<4=Xey$4KUj4I$eTq?>Gc#bKMk#l+w;|zKyN}k55f3tvJCJDU z=c7T~RoL8bmKTED{`Zm-!>WH6t`C&sQI)*`;~yME!1a@DQiVSQ%tP;X6&H<>9SNn@ zSI*KF?pY+{J%3v}z^(1zlDPNeIGgRUgNM>3#c=lKJ zXhnGP+iwR}Mf7k4$FetNCx`YeMlfE2>e=wP>dL{^{TJLk`F8FppWizMf2$o zEMGWpq|SOs3dI_7s|3+2B=u)#;!{H9n?MfWWY8CyzP^4NXqvbs`kmz`NIn#?;cAPs z$`I<1K^#rC;au}~{+{u3{Rv7Qi#OeopOnq^k6Hh>a@2C_?2>Tg_CJK9-z6T=3=W{Z zb;3GW>=(;{S54Gc5$LA%)znmCW97g?MOfrAuW1Op#EpYpsl5B``c%(bTVC@7mirlG zc2Qy66W9=Ul?zKu>5@oTQL*Fx`tf56dX{z_K$A`lI*Wq{8qL%bq@rf^8$55`y4Cpn zf>6`)IMYe&YB4d6eX(@36!o4>S=Lij2EGq;-#!v6XK3V0BI7$8{Q9A=CwhAu*5%2w zGE2L3oq}tz{`$ z1TNeyeT6z4&T!LG5&jR|D-beQ*VD~ok&g&&HL%TV*t7Zp{N%A@z-Gt;mJ|pH+H&4r z)qws?ZUpjI&O~?&0A$0CBBB6H$nF&vn#$?_%@3b3pkSVxM1@rHhw=LDdoarR`ClJ>Wcl#%a*}*BHE)zcOLPbVC~%7#~ki>$J&y6PVH#o@N)n$)^sZ|h}nU2 zKkVhiAGD{YpALm?ye8BxRI;BV;HW1gQ3XviGvAY`5g3>;1bQM9$uYA5BiL+YoF4=cnS@s7FrA(b^bQ@XX$xUlES(Kf`SWzuUAuFUoLmH zyUVhNu`wUgyOH<)8BY#Kf2Iw4kc{k@;I%grfdn43MPbQ{PTXx^H1(T#Y%VU~5m+X8 z)g}_F^F#@-FvX~dC67^geBTypQQrO~#Vm*{B5zB#FT56_D{>4v#9iNa>Q@Lkx>OT{ zey00k!g*XKk>epZ0{-Pc%D_kmNBf>D0QZ20_Oa5}t2?x~(-8XLQ=*xbnh;$iFEIiy z{zxN*9g8b;Xj!9_`Z+W}f z7bFb4^LYNVAN@m+VEDxKknoU$FGKjiilobShsF}TMut+P%iwqub+XMp?~Hqkqd6q< zMwMRJ^S)rcDDFYy{fk1q!|y`z5s}=8kH09aijAA49i^7`a;K9~?B04e)~RPe&sxJN zjj>nf4=lF|ja>JsFwInX&xxSGu>SZ!Aavic^p7~9;q}=&__v^fk}bxD=R5)rU@dP; zgI4cJLhZT=Ur`+&OIjeSE6Zj;LxWE=yqe@UkVXX?+z3o2ZXwBL^$>La4X#Y{Yr;13 zQ>AGi^p8CrhRjIT?q$?RuA6M^X!N0ptR15o9?X$9O%biQZy4ILE1J zhtQ*izCY(LU&ZNg#IKE$lPakn47uNgBvv*L=lEoEU0qn#BA}djHXXs6MvCZJ=3c++ z`375M0ITUCdFwt-h@kj~etEeGd9R`TupdTWD1eu0hLSqcsg6c$x}FmaMWKTKaFn{C z1E@Y{zB7H%CSWP-wTrwhT^8~P>8L$RkS22XkjRjtIvgBhpu1^ji2s#g%U;Z|*$^gW zuF+J^(}i6nKL6<2e0b+c_nm`VG_E%V1o+gk25Ms3Z*hRT!Ga_5N2aU{u=KM!Hb>_-OM zGhxVh5n_|xPnj1S7dbh}o%W-^W?M4`>^N_;v&q%N^>Kuol%ZOYrbP4GYbK}J505_D zw(*cupT2&72t95 zXS&l~>LaYF2*8g6!8YaFN6qiR&vt=%j0NgJ=-*VUHUCSsT0U<_EM(euzi32x9Mxu3 zpZ1@4N}3zX#LQ}fo#TcB%=276e&*$?9q;kDTW?f<9AiMFdc}1K?YQp^*t$t}Oa_-$ zuR=K0Ek#ro!*8TH=GToPj1(pOj?u5*g^(CwD|K*pj#3o|WX@xx*EHtjs4>`6z3i5T zRjALP25#q&U16WWO5wUmz^|4ItZJ>kJC4-E~Ov6(e`Es${B4ulZ3g-jbpDAHaUAi*Vv#qr^_kiR>n?C$=$7}?x z3OXLq@ih#*XV*eM1%RQ+gyV_TFDA{R>uzOvjxTyj-SYob>|+H935H&*GRBVeRr zUo_630lL?jQYe)e0cK1lAZS;ao4zp4wVc6qSk78AxP&5ylUT5uDtA^wM+|{Nf(?NQ zC`Lzq<^pSlzcO&eHFL-{K=JhJW=XEpE8Pb;25{#$85hm{oyq#$Al6;pzpesof1AB3 z7)}@M*b71_y8!nO?CicQopt=>zPS*z5f^gvTV}?Hif>HFuYDe|rQ4CFwxL4)0HMHK z!`%G)!08Wt!U5CMe?&2VlyssxUZo*R@!XaZD-9}?m*Cna(OCKVCtD97Im`J+n%j?ZkC!7FP}SL!itWQX=p97tXFbu3eeHtK{MaHuuQKI^tPHB!Ozr0ewEud+xs(BEn+zQ9io|;bNi^)?a z%$C(DyW{4PiX4dNisq^=oJ67nC+QG^ORvXaZoy}ATm~xBh}*t;+KmCtvg|It!yKB^ z+|P~};2q4YIjfqs`NN3->iq~$O-_Q`jeDL_=w++8qTKf+uU6n&+K!LZKu+x=>~6G% zkbp8}es)W?KlO_6aoPkKn6XU$A7yVI5B2*0|67teib|2BX+tGT6bUoh6QWgRnS>_0 zB1^`+6s3|VvNJ+TvL}^gEJfA{*_pBL%wn0v%)EZr&^hP*{(e5c@9p>N-*ZmqcARI| z>v=t{$K(E3OX)KuJ^@K6#)7pHUIN=EjE2M&toMrQ%c%K0of7(oP@y^}$0?T?J^J;6 zW=8;R+#H4NRVrL~LK7^iDl9lu^(qv{o>+Z|({Z)NJ@kI5Gv|X>&pk%lF3dSCIsViN z!EP;bj_)q)6iaFaE< zuhvAAKKv%}kALekLCcd8UVJ9eZDSbfF#Q1!^!SK}fX3dC`-Be18qgS=K|f^8znv`G z*}y7fNB~L*vJ`j099RIqi#u{o7r;O??H(!2(E;@&B?z@B0Gd$BIZeZ}@+r-hU?QOv zn%t%|G^hi>d}-_~fAb<2$7N#E-CvaqY0G_w+aW?-)Kq7u$X{TEilo7^&wJQA%fv6VMB0iRrKv3(XnO zUJg|$6bBGCw0cGa(r{G2Ds*2p08T+_;25qj4^R6SdA|KWkmn=c<6NKB6;1Efzd`69 ziEC6QdmL|-UfgpFt~YXczCrAK5Q={Iuv@T-@{fgosUm=?+NYmsnfiI}mt?AlP&- z%(7hyH0I5gXyXax=yABLT=-9pvh(1F@j@UeSGSuu)B)EHudl7ZYV&~LCtu*7Gly@) zktYQ+ap75H^_Wry%(&g=z_jqrtAXIT~?R9KGK zgmmGdEhkg12%r?Xy?yw_U4RLXl>EraINaCM(;Df)x zeauItWr(T1cP>|C@uj>D+eQZKchJchNty-rfj0WNmM@p+{1D31bfqX{T}XvEpfNlp%H1PUz00 zv{_Fw-?Uv4X*Jw8(iI>^PjeId zo|Rq$pFqFqgM`lhX3i2`ycWF7OtU9Rs~z3Sr<>ChZ2JX{rA0jOS{r!oKNUx49g_LI zbvc%(&QiOqt{ua1SZ1Z~4S&d&9I?2yMq8p&!#Wix;BVbZY-JXGW_*8!iWYcs7WK

r`!wA}x@H%*Umi}VTl^f~UOhHEecOHX1e^4)zxYeK}$y{OfC0p#xT zY+ZOn;#2xK#QCcAgV07;hp$@Rb2IP@>C?g9gVgx)P`wFO5K*d?-p^+?fCU#Ic36T5 z?`BRB@P3O{G1vN)a_n0aWYEcjtznfubEf_8yemqkN2Ix1ZDJNGl=ktRzU` zY*(;${ByM8Dc@X`QEp*oc8?nq)iS3oZ#nFfAKpHFr%%qE8U-Jcx0;j!hAIX4P9_E- zf&a>%?FGCOuq!#|iZisVT?QXJgd>^;FzVkk#2jh>n{2(zk?W-j7Qnd~ugl-O6nQ>sMV=Z3L4si-D=-H+DggY@vO1kMJjKG8&_X#fuc z1L!}P;?un-2%hZBA;K4j;_h;asbR<5={VeUpBldZ2!KNzImHk23GU}3%Ijs$Kf`Gr zJ{--I(ExGzLe&j|>Pio3sam;DbE+}QL5~}shG~r_xIXfK+Q(7BOX1EiA7AB2BdD9M zPJIFIqq}T@C2MKuK%@O!AXM>aJ+ow)lobsbr7($nkbBk>Z>9caeUf7z&S!FUuukaq zS*=*RD>&7vXA49T_tdXP;uHkDPhDa^0M@qb*Ao4&hG1qW+>swpS}OMUYcHU#j&T^# zN5doYR*+7v!7JM~yZ>*FH!?uP#X%!ZarUnk47UFE*>>b@9k2(Zp``W!lv|(we~%@Q7?|pQ zn~PXKHMYZ~4i!7WgS>=r46#V~OOD?-UFDGOFQ&AWxAnOw$O1f|?3Jy3MBAC8fduxw z5D8{Gv$64`8ILIz0MLR82!5{v$TTf1sR}tWeMB7A+2F+IQ+pHpA6$fZLImsn%_Vd`F-{Duu5P zEXxC`>pC)MpvL4)WX^c#ALv$=yQkZGceN)wQtzhKf4H2%yLscr4Ks7|?xilb1FLQL zooh1sC;M;SEr)d_i_AM{05Wx=Lskn3RM1sekhI)$Oi@x`RRFkAfd1Q~q(8SWxfB`TygtOK<=vC<e`U2;okfh-6R&-@U~fY05@&hobfjX+?iv;`RgCMU5_{qnkm7*r;YR3@-HMl(@K^RT!59N8W#Eq zJcWrYf1vNoDw~Vi9(6T!Q7wD*c07y6L5%MKnlc`Hru>xoinN75HHZJw?{`8>#;zyXF_k$2o6`^Vr-{ zvF$8QMQfjm2&Fyu+W9r*MVtt#_8l7PIb;u`6IgxjSD3S^Qy<(}}n z#oz$LNX_Vc%wfaU)RilZWQsnTcnqJ4`!?o2W(XX1PJ@U+vp%ioWzMW;%}EO!Od_dO znIygcYM-?Cpp4zh%{n=QE)aq+Ppi}{h1i4LmskTuCN$0%XuixORcBASETU>ztJ7QZ zOuKemi{7IdO?x=BujO`E{>2e#6z<^Lg6!bcs-fvJPV-7?;IIls!}oBsS1J_kq&;G9 zm!FS+pU%G2P1aa!jHw8`v_}xN;s%CbTNAXg-NF6(M0bRY45S=;Gu=t5z|P1qI0C$^ zQ;wYG6@W@r^kf|R>xa|I2u}qE&U9hV*#D}6GUA-4O&*j_09 znzpX)*lPb_`WGgBC9q|`W8LZxdK3`V_pp>i3QRq@;OP9>R;9#bseDVG>SKvS%&>?5lmvl$~cx0t?%|g7{-pL`)@|{=x z?Tj*zrJYr-ew>^T$`UH8l*td2j{QAd&R$Ti#VZf!Y-GdFuNTuw93L4`^Y!ruDsLk6 z*bpq5PJTJ1)tD8G47NiFu8xdQH=(&}zo!lD;qPl5e=jh8 zJ8~aqe?PD3fAAu*Bi&|li>Q$b%AO>%H>T-Wr$<3*eX>)4y{myQTA)L#dC!|q3repq ztC>Ok@__huSWTw(8SM<3op^nYoSwC1weitTGy{Q$|%ru)FvgXdY*{*P+A=ZKXU z1@MA_AkU53fD!|!=xe)?0b#|tnuoJ?>WD%9u+5oTB|xkmSC#pm_ZO+fC=e3GHN99W z1}H+OQ+D0o3Q1`?v2B_scZrM7uW9%BU$x8smM*)jnNIQ*h-3X;_)+sA^6a9U0<8;%>5FZ={B&a5#~9eFvqTrKYRbkjKHIZPg*k|4>|k-}G6gbjNUI%p zUFWzio|v^3H*^}cVk{u~`Kg7k{CfiPZQWm|3r6{ZOy3$_lEq$~Das4i&opxc%4u*> zSj*+Ya4aH`7t8%og9YoE!e@)HTR%gRU$fTF^Q~n}eb59KI2^9Vw#+aLFA%)iOmGz9Q zt(%*F=l;IU1S2wvF}zM*|Nx|>Y@9v z(5HMwN9cZPQX>I7Q)x+BeD(p&|3UIieji5qOrya1W{@2Ua-td*qtoDh=PCim)rj94 z;Ga-q`#Dk9hrZ+d=b6gJ7!620X?la}(>K7$cK1l{o?|xotC*CTyS2lobVcxTngC&* z;w53q#+FWfZHR=%tYXR}K}K?g>CD%M`f31|(5Pp2V-RkUbiM!AeuXs=X3GGk|C=;) zT>BOLp8j^fTU>^2`0Pp${#@x(y?htfn$J2I6S2qQg5~TZgO+%j*C$gyzEb(0y5WI$Xc7(%kE`dQI<%!X!n)qAD8YeF96EMCsq4e5IeA zXCbV@&$mDTUoR~|k@=+pT#9_nj#@L%pF>SvoDPJZWxk*5moDt084skrMgdFPeX`(q zU!SQ?$56LpcFFyBp94U#)QcD5xt6OurL5}t$mUB9oc9YHAfCVps@xZ2qV|=C1va+> zMR01c5Q*!kVib9PG#d`)*DZ=kZX$tp+C}DkQxPweZqWEEY7s16u^O15hV+(E$o5WV zxl>n8V=+4zW@%*lS$fS9?w=GR%t9Q|_p#+y2oF7%$@)ocSPnaT);O=PdXz1Q8K~1K zO>1{_ z2-3?5RnQRIIgeTw1>G`g)tCpkbk1@M;dolK+Am{Jl<+>y71;i2j$h(A4{MOYXZGt- zE_7-zj>q}JL3QUGoe0imNEkplCpg-RZ}SPSRMTfw@tsZmB^sn%Nmh4&AFxW5F9+TS zZa|~^e&2xx(0{}gTyr0qpo-^-rK{Z_uD-kyI)(rt5jTTUnQt99X$-3b4B6ow3dK^%tkU6%{El5Avqr~9>94oExzYzJ<9tA&R* zMctWRwROv~Hn|4Wj0GtNYbPOQBH!Zw?a$h3-y-WSK@wOYFe}yUam0A z={>7Du=^p`qOvRh4-_xfL$x3Io zdj9H`VlF}5Nz;Ap>!)(kDA~wTegPn@T$4Xf04DgpRytI#2)))-mOSCd8Cb(T_O<-X zcpP7Vt6di0cA9wFUL0Y;i`~7~7bmPBqVaVmnwt$@ZQ*oJ0L5$KHGf?L+ax7{wtK~@sl_~+AA5HT4gzEw!-WDz3 z_Zz`ulx<0A&^AbRUBY$yrG*V=!7I-+H)a|!Ta?W1TMNv;%R_4W>Mpw0daqNVD6YIa z!7&7!GB2}C+#MkM@=;L}G8arPa}SKquNMuvf9mXWKu%0Ze)n$lB~=k~A^pp-H!h&pliA&X0_hhOV8v_qFj_4RhV#>p#j zZKq;58{VoYhG#d#eEN-vVTKzJDlT>D^2N4)wKfJeIdfTSgZ_uu1|F>kb|Ce==^z$a zv%>xr|5hMo#s@AKBHk;T^!~2JGvpd5-Hd192S7mJLxlp_%JUk-uS@(su&6$h;7a@L z3p>1~XkAQT>5`IG7=RYVq+Waxp_sI0FDi@2yd}H5^rPHbM4`*90ov#SKu-;tmxQ8q zkTi;&V0@nDt+A=qEnSU)xU=*f)AoIG;W`UL(66rc4-$SON0m9{XkL5l2>A*D*#8g& z-XtfvQIjZs)jK5%JgY4$Y4PPm7j*5Dli2i+BtPnEFM!@Ry%k}(dC38Ist_H=xlYDn zpwSHl*j4XnI-i~A2ZX_e_~rgpkEdVbdkX!M3F@3T?Girr3KGSLGM&HXE`lfxu>Yy< zXT6X7v+pm(M*nR4Fy6edo@vX8xg6!Ao5Z`+rU=Tb;j!OC&*{9*+vmY1Hnle40y-He zzDu032^mf90cd%49#0knE6HX{OG}NFIZm2Ik2EkR(%GOF@Wue99`qNGO3wtIYGlXF zDInLcWI6Q#N8oxP#gf^trb6pZkcV3;BvzBx1;Ycv2zpQM;0w6y#k#+Q7M;AMnCGqB zB!p3^B4EMds}-xYqF9ZM=MKT(p6TUkZUbGoC=zZT!5INA!3eGMgx&DkTSjxmfc&Z1 z&klTrg}N*j|gLHgO(6!r9s~EkNtu=S0s0PAD3! zt>8I+N-C8oG>6)cY?3Z z4Nca{^2q463Ic7CkYUero)-goi6Q=yPnodVJ;M`P=Xb@FSibB41cwud+$!LSaVv98 zUUS@f>P{4|*Q@;Kav0NmSAt&%DN77Jr||6J$gis@L+Iu297z184_9`i(m-$me=sam zje6V)z{Q%Q03477DUy~Ktx<*6El7{UJKT7T6IIA3eJl%$#XE%o4Y29A)oR^B9O z%39Qe-dQESMY6DrVoLlErHp@Tg8h>#uJCw8xWB<#R)Aq4m#7 z=qsR48$9iSlkZzk34c|>h^F#c>DkxYriKwZv?c{Xnmb%Tp~T_fPs0oXZ14@rr7aQ1 z*iPdneAL*`+v}{T%Qy;&O&#+=&mZfk03PS%T?2-dcEIj``s@q z_RAxu+8urG)zUg53eTEcyuSD?no5seT9Lf2XD=;B%Gabw91-)z@1sFyfj^~&Y?1vL zg=|7yn}dEn|7Z}iB5A74ys-}=gWzcb{Qi&T0NNLo@q8AX7DSDe!HgB!RjXitPsf?G%tMbzrxvETBS+Z~@*G zEdK9&k({mjqoVyYBt-Kr!FA6fLQ%l12VWT3qv_PKebCHw(US!XM zcJz9!?JiSa6d`5wcVj5?&Y*E&q?jb{-Hn)^w=l6D2FTqQ!^r1r6K7P#Rjzg2XiV(i ze>Hr|W;MI1JY>^r*;Z+$^B`Ic*T1Z9yN%}cqaa)B`)wPmtd&3DHdTU((=1`)|dk(=u5XNR%|Pq9T+oi=|r^hp?J zC?0(p#r%^kJx>Hge6#oCU{|7_O?(>Q4U(};0*#4#s?6r*Wf+V)cB8BTi+y<($t8<# zwUu`*EG*m?*?PIO$g7?1ycyrkMCS1?)p}_+^Hm1AA%M z$e)V{S5*v-$k+XCsZ(IubzYd5&FRnyR^8S*;hM!wEP$>vg$Ya|cqZ3aYF#u|zSa_L zzc3*|Ik7Kn@3|pkYi#|-s>jOH?cTc9l}T2QeaxAAkWn^Tb{^c^8ne&r5W(}snLMr9 zhxe6PAgA;C_hR&`XFnACE5|hIinHrQC_%bSs2lIEh5{BPBZEKf11|{*|cqQ+32PX_IeRsL5<;PV`2iVq?y(=$&D}l(+96 zQy!vda54rk<1^Zcsy&4A{L>|H8Sr}nn3k%vaqjm(TYjVCpk>8sEx=W}_2uI4eP9!!!#pHVt9XD@+Vkl(s?2Hw@c~KG2+DmXY zCa=i(qjpxU@jpfy;^cjYvhTBII`c7q&NkHHT}QsbXRnk#iQ`=l5W#sqJnuQB`>KMk z4N=2f&cxZ(%}&TLSy)eJN5>2^%?L;`>3Q_?ZL+dO@BgS-6SJd>LWE45=t3ubfo6#y zfc_E%G-r&poi_otbjOlVh;V0dwC>`oTh}o2QbXN3Q89U+;uLBoe}Tp7!`q_YY@HsD z>g&p!H`2T~wSvlO7q0i$KTtWJys?suk&!=^!IK>{@ZjyRIBXSea;F8Ls)(apkyr28 z0hXiOgD2XFK#BvDi8%F;L&M~b5|gfPsWPVp$Afm6{J79r+?&&Ln+t;$%~7p=aK|7x z&%hPMmp@d~g`^`kM@dSK2B;fHbMBVoH2Eon9hO`0oW(eDu`^D|p0%N<3NCWgB0_)m zEY+)hh`pPgv7DZuqGIa#dBy*9&&fNKAP0b_&@G`b;JBR45{xTtjgY58c;|g!Rt~bw z8$eFQYwr^7QlUj|zVDl@^sXgj=RwV2e|RSQr~B9S6tkfz{j!G9lbwKr);v0EM^xU+ zd*f^O@HoVeteP%GRyX}uWOYzltGZnYz~P(bXW#f{&-FYJrINtk=QN+v#wjgy2Xy>L zh9CL8j*+Vm3Fw_a8-u6#RmYWm4=f*&ulgKtpv-A{DOZ{p!Vjay@*J<+D)9yn%H$=J z9={}z5sXfNvYp|L`1Z*{1X3Hw0cu@k;x6=|QA!0pVNxea&I24$1P}wI4ZM>RWGe&N zEp<5f%Xs!7PYXD1n1&^#+8%rP^kmu4&X}`?IN27P(*<%r_fvsu@yYbDoP6rdMnHvn zcVY0Kp&EX&R8$DS8r5EYoKi=q`u^ooW=(KV2_J{QG+m>_|JJ4ck){0HM$c#RBD-9y zG9HmxD4y`82Dd?Huh-^XN9sEzPd5bazu`ZU_WT;|$9;_>>O;!Z$?0~!{qKR(vo|UZ z{6?~n^MsU13ECw1PI9SD;M@v_;OlgNHrrr+FDC_7&i@TYDscb0@X_~xXiyC*f>3eJ zresju41wAt(oNLAhz4GO>w8KNy_q>gCUXEy$lRbVN|T3o?f}6wN|d%FDWM$yv4jp< z-RbfvA))`MQ6zpkbx31LjXIUt4xQe*bwXzO!RJX*>!$di$FO5FPHWpZYVh34{Dd0sa8Oo`Q`I5mv*VIbiX+b+;nY$25p)Y>5|NIUmcLdajnZ@LM z1?Nwf(9b1|Sdkp(K6m6Qt+Y1bn7uVdoz(-Np+8)b9X|igs5XQ3)f&&N?1;^5ZthzDHd2Hg$ z%mrYzLV5a^WLwAVKXG2FbrEiAI(i7CsB&k)83cql-cep}uzNxpVzd`J2 zLm{xKy6OY~P2oX1`4ZVA<rYtwK|sE{SM~1}g*p(X(Z$?6)i>IE zIRo{FNe>jv-z~9OOVavM2z6p(`~gYckkP)^6Bc>4H33E!78ndvS9?1n%-e8HoTjs~ zyMi3S1(TPYp57@bBqjn&1|?VF;d|L@-dAWDgEzAkf1P;+F~iM^SDPR958G!qWGVdS z^5FTfPs|74vo<;#2M(Zq6RVU`C~LkRfiypu8KSPOaMtpi0y<8^o~9}ppuYEVG@aP@ z&S=lB3W17QmM$Gi_oSZIgMlEG!QYYideYXw(X+g30>4PvfjQKIX}rE}VqPm91Jyyg zI1nKn`Skn?-=;-KuJa<7`ney0#E-nf!SUy_{+SxkW(0nKz*I6VS+ztBBmDBBc28)v zA70*pL|xcP`_Q_)9^9c~XKW^e=31@DD>*1r+Z_ESU(v`>N0QA;UZ9rgq&d=uQ?7Fx zym||-Kw{9cC(CiAt0?4HB%?k1xmW@^y%)cI#$uT`FGL{WxW%TT71-_gfi%$6iaK&V z>HihN%El8K_eFk1ZQj=n_M# z0iIU=ij5zGJ8w7L9vsBDj$N9R_*+gYu=ji=z1mshVvPeqn?{Ev8wS! zp40nYe>i*j+r#Gq2HOLNHf$IhFz@!ym2ubc*EyKjB5Cb=U*RT_;XM+4BPr-bbaqUl zc#!JgZC-Suwj>5gj2|C69$2}3YT=7Xw{f?#lg6r?K$W)}Zdisvfq|(Pdb5i@EHHR& zA2u4smCzrZRi3uI%sMe-r8HZ!c;9R!E=I=;nLGRWryR(-7J5cpx-tFQd*zudCJn*7 zJ|eveuYxz3np($T`V5}Kwl&U*wpj&pXkwBIT8FkxM~usEIb^Kv9o`>By?5(smCsZk zhHCs}_mhBcUp4>{-Ey2DVwi+f!RaH8j<2t4^P;XS(5s4sp36)Ij5kS|NY% zX@+Q1eO@&Zfkv3BQ@A zU5e&kiHzoy;WJCH4*;ok$KV74R2lAvf-7c=y z{ujaOhaGNOJ)TcqcXt?HvWBxcFnRy2n%UJFJ)6CgB9fDYGCp>x*>ki?3Dq(LC=%C~ z(IB1XlQ{1?JewQj`l6>fkr0x9g_Y8KQe*EuwJY(@Jx{AWsB)8lu~M^&zUNN$D?Rv9 zAopBKqaa_n`8BU3uZ&U)ht$cYP&=N6stXT{@?^;r4WFMACIc^;O;++Td1iR+Jp9Rf_|Og0WaT2p&A;hHI_ z?PN+x-uCs-hNN3le@b%dWAW+q!-y2_>t(LWb7rAN1T0K}@M21I3jt!ma z*!{|-#y2?CoKD&~4uO`BKfh0qmQ(T2^BKBEQ62GjJNUp$Km$YFjiVQD?>Wqx!jpSO z3RsyR=M6*P)3TapNCP66#y|-S72~Li3V_=w#WogP@D24lK3Cs7RE=yoh}=&V{e9%a zSLB9urgf`Ay!7=$0>qtI^x?RZ;|{3%bHF@X9|I{hJ;+3p&kvBNjg7^AD6Fmeq<&cb z*~qV7NnfZ2@Avy4A9U=&hW97}%vw+~bT}n7`FVxl;i)g?0eV!*Fo9QMmM|~o5T^=G zAr!E$$45wuuLGIJ12t<)}=@1>qa z`p|{dsqnArc5U#~YQPycsC67Ph$L^BddjEi@~dc(rzzKsdW3o4dZFyDyok$E-qbI}_- zuaO<$PV%(n)L*VEkh)@XYsI8vuu#c<&RIWN{Fg21XsPY~668-gtoQ0hri~y zTb$VUSXai=lSK`ev}tl5y{2g0+wo%}Qq>tGO&tf(&YX3x$>s3J*@yYKERE5jQ}MQ! zAzKSljP=u$1FllfYDV2(Dee%V4oU_ROE9NVX9gKoNq%QkQPja+3jFHrG<06iKY72c z*3XBY&7|h$sgL;gI6ZG;9@2}^+Z4U#(vgdBKw>$127Vjm6^x)=5=;d@4bl9Vb`sh# z$7}%RxRQ#;ti+ig@kE>M!r-1NIuN4z*YKRChk+2)YVLZHn7YB6SJny%p-HcKGrdJh z;evuut5vuyD^}Fo1VU9>+mjyWI<$UJoSd9=Md#l9AqUd!xU&&yr6Qmf%C`6EJ&zuR zE{k(Vn&gu^q<7hcYfQ2ieRqkxfJ!iRp?@Ln4O9f*m8FGLFvQH%Ly?9~M`W{rSI~Zb&ojXO#-zP6ok+3wxoylG4$- zjEu?+N1&y-ndX_uBCOmSUa5Xrd?}V%7d2!S zwkbOVDxe)N+5f(XIm$@5*G7zGZ@Uw6-~e>~nG{67mv=^$7HQ*fR_aNh;c@v=_arM^ zOI@g-2LChTZio%s+!rIMX^-BHvz!l@Vp3x{ej_dT$b!$_<=M@O4Aht+yN(Orq9pF| zqld4sK11lDhYIGu217Ct}CGca!HY?s!9?X~nudcJMS35?g zP(KEKgi0`UTA=Z_Q7X>AgoRXg9pq|F{`n4J!FOo0l37;Ij~I22tC+@k9~WEOp#odc z$axtJuw;iL^KGwRzrGfqY2)^QuDP$aw!=92OK5lv+(iB0{{8){he&hzf73 zGk?_5C5(=N8zsaKLzB|J&a+}^tXlePN9E)$-|MW*k}Ir1y#cFzu>-q>(+pxvZ&nut zO1gODHFBmM-z8gaU-KhpL3%cF7p4XFn1<+(SquYuObrk%NN1`)Q#4i}`RSi(nNDMH_kW1fY}yT9?`BokKW zDrN_cyW9@pq`gKIAt*T5{JJ)vwC=ibKH<)}=0+hx2JTEtQ2P)i->dgt%|q;^_6?#y z3c{A-6vQ~ibrCu-$a|H{7rK3kkQL!Nm*{Hc3xLoeFcGD9p>=dt)wR>3=Arx5J}@Zu zV4>m2UXMJyXflQ5bm)WH&zv$unEd}a9ggi;Tp3Jl(hcdq9x3xrkP{Kyc61UP8-i*9Yt(j2Dy?xlKan>Ko!(U#9aXdHtLU0%{Rkg@1?Kk0st3_77E;f;z1y=HEEF^s==tWoZJn4SHrtttJJm#=;<@ z9g4#Db6-3+i9Qt*Cj84LTzi%wN`AWXYV_{S7S>tc#c|D5yN`B7>m14Q9DzqN;*!1h zXh2ClKo8QC`xD+I-Mh-18x19Ytv53-b?le?!T;(AMj^=D6xAm@Jc)-P!{6p%P@!>e zLK;Q#+x=I#6v+(w=n20Ik#PNL*Q?Sl&XZJp{Nigx-HHkPyf;+`d1o|Hq#-kH@%I4@ z1+f)Lxo>Vr`aM_6>qLY11 zf0y{){GXxBC|_z8b_cnW*2OfFMfDMXz?>U}`8bz7bI*Kh;%Ag&c};uWdj}p~`=amt zRKQCrtVIBt;(QrL#Hj~wnN+b-eQp$UYOjK|dtTW|R&%WhpzCOZ!GUDAOv>YF4;e#4 z8`W`7Eu|#m=RxYScqfGDEZuc|O7u0r$uAp|nAWTyMEG@RHjp2s-e!I6PMXuihPVg;{_t2*o zjAAanJEvE0t0C61*?#_}^e}<@^W`qDXNC2kNNZ$+FzrWh)Cpk||C=aX-90{o;ntGs zY7MUtQi=Jyq@!q+6{9LV;Vm!9S24cW2$=N@{_=&wqCgToL75k0TA$Qg7 zbuDpI;q~EAhEa6SrKaDbll6T+zgWzsg@u02O+PZ*QbGej{S9lf)XW@2Q3|V@t9pv2 zk6?K1nNPf^?_T4TT)<|HAKzH`@0ZBTSJZ}o?C5Le=l~NhJhe!+?r)hVBow;3O+eB_ z&On$3e|Z5PA$tE-1gY4%$pK6e2=ta^W>HT|VqzNu3AY;9I@hmv^L4&@@ADql3<|dg z|1?8GDKcZBUaQ#DAN_*YZuecQsfco;`j5&>mZn*8*wm>cPvxAOVNX3+%~h(nVohFa zmBb@sMhA z(_EX~8rldJ*tU~mDR&sAIAcD{ z#;oHPs^(~x5JdQm&%hP1@#NwK-rXO{A%#FxGoU)DT|?o4{@Qu-6{aFcgPC6tg)fIw zBo&h}p#~2zq1K{=4ERJEmI=-qQ{ywTL%*SXE5zzm@9l=ZuUN6-_Z~nQm>+uhT@iEl zt3@}+Qxd9nc7vw?{1Fgt-8G=B;RJ|n-(x&DMF}-u9zU)+(~kh}qUF0Qy~CAJ3Rn)s zdOYXR4cF)q8xcB<==wrxYrnu>>A%l=*y&dsqK*TDcotivpkdZ0$Ajg=nbp#%BNjxm zcJ-dj&#_V<*qUk`yl^n&Q86>>scTHc7W^}y0G)f!SAe=rQZ3WvIQHX^%jCVtq`#!0 zr5!eFLA+{t9VwIHWG$c;!O*~z;=#(LtFE|q<>EwW>kRyf)*poY#N5#?j%)1mdK7hc zfkky}cV%}ye58D#>!F%bF6YuHF7buysmxS8+j8>R4QoxAH2nPR8 z4TQA>ptp%cIM;6W??r=m6xD=)Ko!Cq{?lhUmC-KCt`FYDHD`h(Ak`*9DCh?IxJX^ttQS>B9eYL4h zV1De~7vHvx$)NA27EMUQ1r4g}ke0Z_j!tOD%pIRQib%(IoU$&*mnfWd#ZX#RN`j`} z@su=!m1gS2(xr`S>JEp>an_Wsj#_cYRN4%bHY#x!KU-4j3BBbe@!ySg+s?5b6qpTM zyWyq>afo)MU3AN7kr#g!OfPB+$;<)Hr$D`In9_SM_#(l3;gJf)8_mt_g1C51~jH<}ZI4SsC@glz24C4$EA9VArl)Y3C9d zzio@xRg@Ub#eTD}OpRkx@7=rj65)AqwqEdV*?>x3g;1<{X&7b7+nJLQg4mMkq{3tQ zjmFQrTlR{CNBOR^RMX$q0$qKH{dw%(iB&&99`F&SowL}FMr3(K;^}PK41?fD+j%Fn zu0f-aCIIsFMH8Z(wEjb^ZclR#NAPb|13#Buy_ba_`4H_IS}o%b8v}u(zsI^~sk?F;1)|d#g0L6JLjFQOD2k zlNq8v)#x!*kny;BGW_T&hNe-U(kz+D+lJvLzi-z>N002C^c@~u7BgyH2R}lWdAGfq zjLynE-=vt*D`!-8pr;arZ{^e^hM#Ai-99tp?sr$Z`ZPx>s;<<-Cr*Rw3uw8oVc96H zQ~kM;2)mWviF$XwFkP{P78YlI!OnBGHIm|>>IP1s6)S9oJ*h?fQypCho{APi&T$`_ z%oSCDKg^Vd(y`ANV`_Dx2+C3mAN7QO73IDlC%^H`@|-@^roQ_tBy~ z#^<7Q-yAkaVoOV#j5ZExRLUq(jrMz!9zA|2O%zfh;um*+loh+3%lYn^6;&IhiK7h` z(6Tjgec>FHMDVYiz&P)~oqAnX)F50`<<%92I9XGkNGx} zdWwHtL&ak4ixnUQDTnq-<69kZN(FTh4fJ_k4#>WxeA@S5E<+j4PXJd4S%naImf)i? zp!6Vze`0^K4j57fly9ziYZ0<`t@@5?f7NYnF!S|b znsxuqn6Zeb+PQ%d=Ad!N7$jtjDqQI+Z$&}%u(hfE|5N#hn&dWxV%^EgxOFz+psn$jc|J0mm16a_%{0y|6jo?QY{|* zNSLhG{<{9%Ui;MwedHn=L@Lc!^%v?J3GKBg&{Mp~Mdy9e+o!mv_LweaMsZqMxuKDM znn(;Nq+?n><+$LB7H4i7t=yN84j%;zpDF_mCvek$hi33TvDX#{x3g8JxgQre^+2;Q z8P!5cBIC<}GRj%Q%blNWNYWJ@u|2G!pnCU#9IKBNujf_XS$caqR23e`Mu&lgaH_8v z;vXibmJXB6{9={7(o){SCZ#JqcRYF=Di7SkVmNO+3~_ez1^jE zn+;T7J~)10KwC1KK+vLB5+-^%@2Te%Rg3o!)|2;O32yR0oS?0cv%hibLre5Kqll;ck$XHN+ba!ff2@h&X$RodB4VgZ`bT!F zNgvl6UTAM{q>!cIA=Lo!BcV-AcVyR|`oOtOKh(~GxQpoYiN!bL_;!o@A;T^iau&4! zK!cM3VP&ZME#ZX6J^}>u;(x^)Z6R_OB?@sb1T}^sM)+g``-eN>$o@Ai%gYG?OC~m* zuYDzlLXt{jEmMEX?J+1h4|Q~|Rrb*;sLv1Bg6atGE74CZrFRxY1@4WKFov>;qfoK8 zG1S)FUUBgp@TYu-NAab@A5ox}GCKC=8+Apm*XN&7w!V)-w=Yh*Ak?-efNi8fnYR9> zzg%6QaToAkWN?1IkZ>Ii^_`FnJKdb7i)YQfYl!GL`qpFy`eiZ~wFvc_5h8TVxc2k1 z-eFaa+^7ZI6<-{<;~i09*)5rPd_T( z?~QZKD~L5Lt@^k4;guDtDlBBND#TS^f33}M?dzh$7axmH*2icNL!Lh`j+`oU;69h} zeXJ-f9AO%Pn%d*vr-Sm|b>S~_z7X;wpYwjd_=}L5p}>w_2p}oRJFz7l%BU?gtk7ED z`)twp{@fxkSC071Vpr}BVkBCv!7MVgdYcuZvjwz-7Stjr>lqiCHY&!L#z(A{=QXMJ z2g)XV)F3dYpV%)e5V3b;sOP0aLe{2nCnoEYj4qVSvnS6NOKHjl7tIhDA#JVZp4}(8 zL-SCkG&F~>@?#b7&o1~^S3%<(5ww{ZMh{bOl3T$u1Hok4iYvk-Qkc zfB(p&t)O|Lf%5GBoC{I=9d;-R$mnZ!_|%ExhISYu4{}T1m{NW?vhyQLrAS>ZOqk9w zz;H8Pi|}r*zjj#PyE#oII9&dss)aUD+_a8xV1ue#8i6pgAP5!3fssw-K$dXh_U-Lk^atA;LQlCIPz~R4SHkoN zUq4xCI&ezY--Dm7Dse=AfA^?b)x{nvmLkYSFRLlOb#^SlQz-zyH9KM;zY1pXu35To|$sgz{ zxaF2ajAu`~{uu7{*#D860xDmve^iBD=_!Y(?@Zu9EpfyqGKF3E|1fsu@ldbt|F;x% zD4i5(8*Nm!vLw+=y9%jPvJR;xNkX>F%$rn_BxDU!3Uy@5zRlQoCi|MP%Q|DmGW-1Q zq0Z@iKA-R7@%uLq6)yL6-LLEUdfjOYS0T;betn)zhjcW9z?ewbyS-L?uO?7<3`CcZ zpW}ZYUq~hN;Nf?VfLOGjc|4yjt3ZoPU091X;1!O9xfGadyBkJtIx_kPa*~;((pf@O z3stS7C4VGP*e#4NZWKFa9>g1HC;ExyL{h;Uz>}@u&dWNxK@L({zF*fZa#~&cS=3!0 z{I3PRdb!DUL-*4^q+m`?4Tgw7)6q#<{2gyt$O?Z}1cdFF*t_N;iu)hR~Y%Lf8WDm*GsAZ{HsIviXkbYfZv7yO+(rH))=vPF{di*Bvpb%d%zKY_BxTQu3`s9RzWdL5m-bBI73+@jeolXT}r6rQn0C!{U zB&z9g+l;x=If8TKx$VSWjJQ;8xaw&UG%fOiqe3KKS-}bj`wk2opDmNGk=ua1?%s$sH?OR! zP5EvuVXVa|3NkZw|7;_lS^?CPu3A>R;R4!{{*aNToz}lU6av{p`~xlWK;Gv#ef9Rp zk|4*tQG*>YXB#7zQ8H=kL8WB-(J8-Ow+r`TD~e=8RxB$U01l@^_R{kq9XXclCL=O{ zOB6T-?V8#&!u`{QCwC;X%^k(ihYBIqB)Ej8c5BND|K-1C%OQX4Yh^IsHn`xswdo^A zU7!h^ro;8j?kt~0X~N+LNebxX$y7Ypp88bh=z$0#O}>_6YkU`%Hy8#IcB;}S);j+o)5*n&lX!Aj<9+np~8Vr*Z{$v>WT4O#=pkW04kWKq}KVEIS{LEeOwOYQJ z*@s2Td+9}NeGG7sP$@jSMZL?2l;r~p`uoH}_I$0_O?-mPvpSyON>bz25z|xxkr~F? z94F67GW%8e7KE7REo+kHBHp!ldFX<<@)fxt?L@A2M^(6>pz{Bh`jULRL~DlWi&KB z-n~`!yIu=vQe48kPzuq}RnKads16&WMUGQv>0=JAVS#o^G~Imv+tx+;uWH`izw`0V zW-$-I;*6>8(}0I+s<2(lLHhm;kw${jNB|FVB+65Ju6BE^=izTViKWt;anj;r} z?uvvOH|^d&DE!1Q3}@G$G4!(qw)F|hT(sZ|NW;OfpiPPVTFP)XT?A33Dw0VLU0p}Z^=^Ngb52qIHLAPyL9^CiOF1Rx8@;?>K;p@X*}|l7 z+$8P?5NX(nHDCyLCYLR@w%8-@?HHmros-qg@5Apa>ag3JB89Kg&}jDGeXEh{r82ifecp`l?v z3SyD|!uIv_n9)%6;LLcKE57ccPIAogKO~E$Tk}x^r2KJm3(5D)L^&@ z3_&^+Y&cPjgo^F-FdKfg&22Da;V`GDkwSNyH3jMnY8TlI(M1z`Vi+DM@9O&8(|mic zAF+EMEN#JbI1p(i+UTAclIU=!RlQ~~Pn`TTRjo|5k;NFmwsf}M+x(IJWY5cbfr#{= z9cu6+H!iRjp3^bpQmC*3MJA8~M%&&h#FjwR3K+*XJaijdA(hY`$wg^qYttOu_O1hd zE#E9%$JJkcyT@Ji^xpk0-^!b`2T@&z9xcdUxH`}IHfK2flH6gb?Fei?9_|MXqqM}O z=--)QL*U}f-q5S%5L_jNMM3xg3B_O3Ps;~_=YJ#$7s zMknxdjr)5a&&cN*ai}w5E5I~e90-f`Twg8l^@bZ|mqh6B$rjR<-S>ZWB0ep`S8K@m z`C@V^i?aFPbwi5cXy8UaU8%?Aa8I-bG=c6^VEw)jm-2U8LKdFw9db&4 z=P)GLY0~c&3Imc)GCO@sn2s=5QVqNG*w3WxvhU5@KvYlM^jag^sO| z(CEGsLtEBe9C{~tvSw62GE~8sYhq|f>>C{&#e+Ac;I?&ks|7BXPKt%ecO=?$M*eDX2D)b3nNvTLoyugsMP|`F44y_ zu!t__X7xikk>+^W6mp!pmUZQ`M+S>|@brq=KM7B>pt)T+QI|gJ%AQXTay>nB^R?VF zi}Ruq_#JLblTLhHPxLscfX`DonD_lqBwRyyFAi~_<+-}eQg-zxW#GuU>{Jsdhjfks zCLO~zl0-PyV=OUeuKMxuRCiB_Fy*=&1gpNUB877M6<}eih?)lc9wjQVy?%}XW}F72 z&8ds9`y6uxLM6En^TCMFFUd)v;F&f`bI6oMFe!LGx+$o6k~=rvzTkHQouCO3gO6nN zdu-VJM?#o~)O8PTr~pw2fsO**NgFr3FrdLP(L;(E%2=>@4EAa;Qe(h^-JdXcswO&U zCAKEv=Mt&@d9H!dy(lcAg|7m~aYi!%R12|#qG9j9J6WH}*?ZZ&K!T zEI|!?rlInw*jctKpQLBxodjY(Hc?NZ8YA9_u zvsrPr%*yxp0-t+%DF$?apU8{2_LQG5y`TT4U~)<9O5QxV0+*{-2cryRC?ne$qFD5C zFy>f^N{zhJdEk}S=?D}QC2FF`prD52!PEPUZBF{=uYwL(y%g<5U`KLoujf_|Pu{w5 zY>Ga#KO?0{h}ESg9an;TnzAX87(dL>Me5f#^qw?CykY7k=wx?$(SjDLC2`^ zlETYzu^$UVYaP}s6eF>HIheLSgv==ME?--6j9+=BoH@U35C0aNM2lkEa!w}G+AvUG zAcQWMBeGzf-Oe-j(%r_t9%;eEW|$gWkmCHKI#CjzE{5V3LwI*@0KWe+er}Ba%<*5N zq#Ujbyk~JyZ}FbuCsYzK4VGoJR+iKKh;;K(><7Ky=LKjVFFK=vDmM{ zVO0@%XUspI{W?*t%zFQmps`-$Xa{s0u7kys`%{+)o88>m)pU1VME}=Cp=tj~j!TY2 zafSbvGxy(Utey-@g%1X_ndQC!+9iVI_2Xp#oIkMo!TeSz#`hJ7*}l4muFHyvVEs0dBEhQd0?-iWeK* z_*cGtm!g%91r80oT#5VRSBDiUh{v9J_I~XLpJf+ZFvqqo)@OXF3wPljv>Mfc zw5wW1hMGh>P8-)=`HVJYB=LzG;quR`jXn`0FGX4@R0{+jzj;Zn>_vPbgViCb{}XvB zmAtU?Kt=kWpqbw5gD-@&28yfiu^h}u1G6I?k;#07V!GMCUM-}{)v|g0AA%HV;i@OE zbEC#v1_xpxS0DK*ylq>~Y-wUU?i%4pY7K6;N<HCO$2cF@AS@5ptLe30+H+x0yrCQbFeQohssh- za%KZ9nD4JgGe2C9W|#l?1j%gL^!%`ZA;$)llQrDnj}q0urpcE$>&8w@Y>pn_RUoco z{LJ#u>m(L)uMTQ(2$oXi74WBd(cn-I6$ z=H$O=T~r~YEE*3VKVZ}s>tJZPSEX2@AY>MoWK#vV-zvroMKqE3Loi1cz6Vk$?`yEE)ld*geEeOHVUrjuE zU&oN`7-+T!-%V37Wo(wp*6Kl}yUz}laT@2ccI~$Wi#e3L63>)r3f%w5sdJqa{J7mf zMex4V5psMuWSO6NTw+!3%Wrd}E0vEc>x7{wrDsTA(niW3R#OQm=B|19QXa5BK~8djfuf zJ%c&B67sSd=5R-CE35oV(}&`hv6?p^RoxOg`l6#W!Nw6tr1+-%M|u@%bkd_)UEaXe z5pk|Wvc;r6FJ)e-kxhDd6f!tGpr9aISJ5R6q>+gGKx|t9hRO$u<)&nvYEjww(%B#HU&?G@M?*?VsGKA z4ZM30#3)bKBhUx@v!SG|%jcj9Z@lH^9<`es>>&f3?F)$CEHVSuup0kCe+JbyO#(-YJc;4Yl9FdD*u%;~BEWXOZ z+TzOvulFk=({MFH1U+tz@Qm%eKSr5`o^8Aekj^Ton{{j27M(SQ%%o~$DmrEpJ2CWh z@B1hw8LUAzTGoMgwc5FM9A5{fsr!@()s$N*1RV?et=6C=-Jw0jf~D5@=D48BhCj?M z;NYC+dyOQl$LeLqzb(ATG4UsJo21Y0Ek8H%+B2oUr(msrsX1)lYyIK@Y4Mu!wZivY zR}DzfR3mpR3dC>W28rGjy4d?%a-9mF6uQ2wZBa%DOQP3^1R=NK4KW{WGDgBVtjmEO zGTeu~x9rp$6nx|FnQ}}4`WqO+{se~7mVu#WGs)Y>os-7lF7+>K1jN-3ZK!`?*AZ3X z4R@Z%A#4nHYe`RA2<-Eydb)87!qiceR|39{K+<9K6%chqD(yD@{=i3#6KH{a@Hb%u z03+xh!U&9mm>yt2+Lhc@-@#lvaQDLpo1{6?I8b_08||pN^saj2MNZSOSqtJPPBgHL z6OkU2RUS=YGe!yBAPL3e6^++7hU9ExXRtU$ZdIn>emV4AH|~J#K-MDB7^-JVa!d#~ zRc|Kh=yo>r%CI-DDjqgkK2sKW1Kc()NR>~OuJyNhQfG*8fZ^fD7g7ffoJ(`}-WT}@ zMTZ<0=PzxpUU5tr#3-pV!0XX$2G|dAz@=34a!Rn)cQbX)2cyyaij^4;yx$nQ_mWiW zqDSQKOG7?RXP}OY>qJ0=hFQ`YK0VO2JwRCsyR|Z6rvwULp;>S++YviLo zNI)Bn>^iDqDYeRi!Kz-^)&v}84->ee;1S?nsAC}I?83owvaC%LL8>3yQm=t^xP-L1Wv2$NSV5On#|sK-h+mrPnT}LVyb$x~ zZbOtt!N-<~3S}RkgdnE9FJ2~CBM$5vV%DFZ;9*AZfl;uVNP1$X1dP_93 zLXB{ESR5=6z*VGOo4zMTpG5rNr)GeHN|712Iop&uuaD3M{L6&Dek;xhetK}AUyyiG z4sB3GpC6cBtFOOa(bB4OVEPZfgqEn-J0uO_q{1rgn9zGTUqD+7#F1H!t6<1E@x{alzAKur;)iQC9l3`+f2mnPg`CB@Z2$2kZa>3`51La6jT*i9|C2V!p$p|&P#ekVvIJO}aK?2Qoi{|||i@P`s zH&@qd8oUe+=etLhFIYfksBCq5*3pMRat=;zV}n!e@+&wDJIypeI*QEI27hCZBT~V&Pl+g8IUwO>2?VS~kJLSdP>7t70^~TMX(}r^nr2P3CSo&@c zhJ0-uA}|cs7sNCoAdRW3{XbsI9`-lY3eL znd#Hp1g9NhQCtPJlrSX2IXgy2b4NFn%%d0}#Zuc+RZ>S(e&SIv)04Xd1>wv4#}7qC zoZz)zY?<|de*vNCJ=&ARh;(iG_-h%f1E11eH=L1rXUd1Ax|UQoDF}TnBbEG^j#~$& zG|hgykY3APC36J=XmO$~U)aqy(^3F;qc2 zVBw%YT^;gvbD-C>#2fZUFeOwJwCTo{P_i0_c>kW;C}~D^=Y>JJwRVAn z>#uwEt02fd_`77-c*AXck{$9}&^9aYZ&!g}IRP-0C%A@RcLgKuAy!t$1@o_7*S7-% z!<19?vn%pJ<%0bDzoK|uTrRiIBIoeDKMMH+)DE;|CLe?w=*6VcHZa$ z=hBdT`OB9tt51AsW!)@HD+8$2<|dmDPZeOXD>t)WyRHZG+0&KVjok};U>=`#!}zjW z6qh9HK?AZ03nbyU4aY0W=39B)#C$n?t8btAh$6yeY%n#cfD%h*++(+1+4lnC%?~{C zKv?j{vv2h5?CiaPQ`r@3iZk2;N#@&d!-2Gbw*jJ7V4AuLA6x)JT>OZkS%2YHG4@Bp zqjKJ`X8uPAPu|uQhQio;tU2A=*mU`=+%GYUV%I%?-UEeIY*GAgM)vF>Bm+C9P=Ysg2Xti5Yk-iNL4H$XDSafr}6L@>#)}~vp zk3YS-LFVQIUI5u`^LX*;#8Y`M5y;A!&91#0{DJ*}*vh zB4{YlN_++4k-2|rQ1NdHSsVZ zSgheEU~E$>3)(o*`xpgmUGB4r-zaDWK}$X0>Mc#I5yhGVF@#ow0U9r%s{|*~$1!4T zY^2)F7hKcw;aNf7=U9;oOFd0mE1*$TGGVL06zaUSMQf4$3+NZ+KUG8ndDGM@mYRa4jqhnZ_{xLO+ zx4=nW;octt|5l1>D4^#2o9g02T`@x-+7#mlp$_>C3jcU{N$%2_>)*7{^aroKH;ZoT zq>j{S`Ztpxth(dq08rmR_Vx3fTX~ZkW#4u>@|cSYGOiu!Kz@_kM+n(T@EKH926K?G zG;yu_zX`94b%o&e2>ecV1op}S3u=jc#qGunAOA=1;Qa!&Hhjp-gu)lyG=b<=vn0A5 zIp`H2I=rm8LAhr|qEsE_UD=KrgT8{De9g^ISj_gMauWYW^uN_L_~gRI)69 ztipd+(u5Gkee%#`;IcBh2j4!1#AC@vo1aNNJviEXy-ATdEU!{aWX#;p7#;R2_M{X^ zD@Ppvj2bl;5fzQcrT9-(i_Sv}(FL3Urtf~L3YWQ(v1V2ET4xX74=5JpSKyByKc45C z*{;}Cp})E0to0GR*knLlAK2e?vcx6_$QZ6dnejSumjri7Uz_-NnR91;td8$!d%fgn3-RlK&KbQH+~D&m zPXF0PJrCMqszk)Il?Dm;Z=0UVN1w8KVY3Ug&dx&2l+r$&IDR(}*mBJmB$Dxckz9){ zH-*ZBphkf`;I7ywVm7Cfzzfx%PkQyL=cCv7xE-S|7B@*98l7h3 z6?&edSPsIjgg~&(H=GV~7)s`waFWqdv4(HH`V*;7-eXD{@9VlA$SbuQx1)y6vot#1 z=fJW!T<(l~hxWYx7}n+bi9}y8pCCD8e~20$Sv!`^irs4v99C#4EZrCpwvcpFFnT5P z@wl|7nd9O?;Fmh7w3zDpl*}A~8vHtBPHrLD&M!hx(Syd%$XCE$))T(i19voh+32yZ z{!I=?%_F{00I|RrdjlRY?7@-|^p}yr?8oPEy}Wn0A3)T7TjUwX9Pp4kzG=eu^qJS! z2+*bj#vTd?+j-zXp=Xd+4CGa<@hF4w#XdU>cZAe8yU%EIptL*jrL;lMwA(3cah~&7 zL${H`%08d5K-WT>Y9TSUOY_3oHR9(Bc8hUtARfG{>*DTw+cu2EGAi`8%z1g$JO?ZM`CXJR0g^CLfg+?iWFDlEEo1-~rK^PHqnwco5`w46utf`WoN zg12?vL)cWtmIPk*UvD=ex$;l+n5e_4^EP^VN!1PmI}!Usw5uJIHQ|5~bC?3WZ?BD^ zAI zQC>pQpxQC}!jX}jg<@10>O1~Msy)1CVW=3$YxDKsm7zoD;72i2Z6jm(>|6#|=iLbx z3yGr((;;sg)b3Amz?dVGmw1#gI{FCZF7<6{#cpl8(~oSZ@=pnTw_QNilBVl+)(JJ_1tKTqv*TzG_B zlyM&VT2y6@qAY6m7Ikmr&WCdg4nS(YhwvE->cH}NBh`qob;}P|{@&Rl7SmmXU(%b$!luJ)L3ZaDGTec$y0r%Rn0|$jek-xzY$M&=#5R?Mym~w4 zHf{PWZUM{xxlPhkcqDBHH|2|VVx8V@v^kf|)PFH#Yo~8{uuK>BpBR~ZBzm0SM+JdJlwXsvMnfpf*y&z>D-X>b_nKDe}q-K+eA;x~cB zq#K==%F9)(sDHjE>S0>P^e$c3U;m`y&Un@Q+s5Cz_U~kwQeiunH36AGaXhyfj&Xbo zIoiK3=T(4a1noO#v_4NvHO~@t2ueZP^uY@!BkV+ZH)$~-s=|#E2#IRg+!@kN=Hh|h zQ<>AO47j0p_9b_wjqvwtGqbZ_Ocz<9b~0q|>#r{l$onvKHZa8Z7wHFJ}}>zFH8qTs}51^N`g6NJ;8q49xpHb105Z@LPF?un@L))0I2omhr6_j z&YMKWWtUzsR~^{d;m$W3mfpw&!+9-}6E*p*C$Jj}x%J^ofRml(e-a#>%k!fTc(bia z&*jWz&4#C|P2MO(HQlIzHVk9z>}w+z@{vc}C=yaL=F@-hCJEd?t=S{|8cfNJ=f|Lo zhj$AR+TrOwq^x4S!-GIU?Tzrvu^4+pIDx_cwOo0zB&gAZfR00`h|N#UL`T0wlq|t( z3+h-1_aHcNj*pn!(Gkl`8ADE@DA3@Co;X!VsPUVFeZc6`a;cu*MYm@Ca2}V7MRC@5 zn2&038fW_D6^Q}A^fpr*#3)0s%c>>%>*+bKwin&e#nz7O>qJCgXvt>7n>(_WKwD3w zcK^S)6>>;}nnSeJdyHOIJJ1t8*}m-ZBdCI~ z^>LDiQHB~X`p@$^<)W)_iinP4R2AsLkGn@R>=8$_7jOQBwC~M5Jy$R{m&LwCB)Tvh zX^PwXpTVF$tzuTyn8Cnt4TiU1tRa(TXCEM++EQwVE6x^UgWr*V%1R>EFdq#>%cQVtr|tYYkMm_dAL9$`ajiTJ#h;gP120v4GyW`AsRuNj5Fr%>xY#$AwGW3 z<>rf9H|4&2-6XIuKOdQrk|Hat@e(AS>K#c-NPrR=Ksw_2HlnAeCyFDZ=ISd-eQq9? zYpU(Dby>G#AM#_JI)R-$ja7NhTMZmcZ|UZ2No@yzewsOC7szKJ19|*W52$kG9ax6+ zDsr$yDKQ#aQtalvwYkYLOu_cpl@MD<`ws9n9$E4>%4y!BtDvD68RgA1S{WxH{d1T4 zS?+4RO_4he{HJ0khGf-Frn)5Xx&o#f**)9Nl%MM@x1PRaE@UUc9vREHkF>*q`^Jxn z?(omp3ZWPUj1tsEbGE?tqRq_A)K@bU@r?0kWaszT<>65&vyO9LNrMCbC_OZH8EM zx4r!Jl1l2&%%=mhmVakHk^3F;QCSM?w<^3_7YZ9Ub<@`ZDU8c|H1Gusc(9p}!h{?Z zaOb^|v%^*hqLvKq8xTaBvKQ?O`u0I<)@T20q_HG7aGZ6tSsd`l6K&$VBgYK)*qm+- zdMcal^JAx64FPVhLQY(QOg1~P#xlonNkbuY$Gis_vtFiY{JCzz_mRF3q7@)+Da<{+ ze1fE3W%XpoOn(((fP$JXL>6~L3bR>o9@T-{K=7OD@6AgqhVrJ(?tgc36y)=A?K@oS z>ztQ;D4f%Wl4^jVz)SJqKdo{tyh&w^RqH_90g&hv{;*zr-P-Lsn{EQeNxr>#J??*G zLp3OhYU{i{C$e^Ly7*oJ$VX&`Fw40hS*H@BJv&y{X;Jp-?F~osHv>)l{rm^T0uave z6PyF>5_HQ9>t=el3S=FXs2Do@VYmXZKxqJoH>XqQRt0QYIqKYJpY*|-bL2a6otw@K z;J}joCh=TLXYXw%#^YT4a$M4c#`iI1xfJkKLcbX+g<6-4l}GB9Y)kYnJssU+;P_g* zy*K1DHp{v!%$Ael^v@*M)B+ThVg$H695?`v0h{>Lyh!5pL|`hZT&TY|@%T`MQ0z)| zV|OKt0sbqNFnVNe;Y0Sn1UWk%2AU@TMNTCaWSBp^mwQ~w64rItXgY;Lfxdj>7ne z(eOZWOt(N3kU+vox!Tx|^43~I5oJv#kcf1T2Ssy$Pl6;s?VxgZe=$qOl@MI&67)bn zyni>p-13)K9^g}FTrRC%uA;UHDEq$@I(|2lC-7L(BcI1Dn>TNehS&TUta=KdqjNJM;1$1Hmz1I;$L0NTy|ocxt$lsJ;tVhd^0@#Wnk{8puCID(|Wg8TAuR z`y=$}2G=vSy8?EUbVl}<0av6}izvL1zr=I(&YMt~T$}_zU8tI-Zn033?1aQ#?RWRn zhf)?Lvc6-{f&M*@O3))P%z;>|Q>#%I`P>s*A;NnrU#Q`OZRUmFJrWRH2XRrUFP2rY;^-J5s0U;CM$S*qGSyoQrLV`jswzkn!j#PU7bWMiA|}PT@55Ne z1*L8rDq)mAcGbY91^EAMly`j_{tm=MVc=sR`S3~$7z#sbrB>jN6i(xU++yW_(rQ$B z=9WLeZ&qj^IdisqWIM^*bkv1YsszK+=rIc#*YGaLf&ns6gTPbc2T zmZ;<8kcZgy^ktLfLGcoeb*}BnOz6$JdWKtB<3YwRXAkM(RK=sjN zF6d_9mE_QrJB_8W-f$ZCeRhuo$TDnJ!P4WDkRue6y6^-9nlFbXsZ}Q9Fq!Im9BYrb zWXh77vwPnR7Y*H8z|W|SR^IZAf&MLrsrkx5?QkP5f;aa(1Jg7|e0HKJq+`y=0MRi* ztTpUUD#`Hj^DcuGOZXej8MrW>RU@n}ZPO|UcI6%(tR7nf8;HG50^El8AWt%A=HsgqCozD?rD(hzHKdDe#D%m-eE0$#Sd|eb&EcYGg}! z!ye=loEEQISo73&>@LtUnfLFj`N7q2)JQSqED^ zc-ob2@2M`c;;?f%TO1rF@?9Xz#v%*N*n3v7~&2=v*RU6&# zgNE2GSxOPR@0cBk;-1q{wrnxf;FyOahUF=3gA8?#q?aE1y;WMSu*A7513XY%_*YET z9%$&GeW7b!mD`fmv8>7cmn7%js6)#fORe!Gv;8XVrllFOXjATUv79gN1`ua(wBdH# zCWLRF-#OwY1?pldhzuC23Owxs5`*%q6z^Evl~T`%nlY*>htO9}*qki+ zlIxl*18x1`&zx8E0D$$m$A#8Qcw)rlZ+OK?5uyJImKl#vcVxk3Oq=zY+$g& zcg6Wx7Z-yBw~Mun@(pq~izf$tpN`$Dskp^Xqi7Atk7+pYyw_G)z4Gim=(QXM)wKo6 zi?2wHN3zhCKZl~}waU5Y=j%2Ch1H$-q{d+5t@j@r#b3Rw({T6$WRSnC8E!FLtmLO8 z9mp+Z`w+3$sGB4Ffi)Gt!p#Gtr}9_43S{q{rpFoM)05C|j_eu2?$i6U;{On3(r3nv-5BM3X}ZvYrB z3vJ8vA@k#lU@C1ge&5w0X}OzC@9v!O-(&Q8F*$1=s(TVU-dlpWp35(=R2~!YvuPQF zz_6ZeK$2Z5FOyG1ZI8c)pl$Sf9#RJ^#C~J}hDQN{eNW%Df0vccH8{Mb@mTo&+&fjk zie--$UD9{|t+GMCWVSOMD!tSJZ3w&vsJ=8Dk?ZW3lg0#Q+upSg@C7}EE^|LlYg0ee zfSE{dBQnzn37g~Ch(daHZ?!xJpUZ?VoQRVwD(ExEZ~|_>L-cv$mYm&xt+xFzI>$VF z%uB-QhLDiZ-3|Om3ROl;q`7iO_QP?gId#^sCj&)frJV-N>J zP{1B2@PMm~2CEowdza-Ug1N;q+J#gN0ch7*IpmflQ)C@vv_}oT5m#auxp$Yfz`(S8 zv+|-m6Qo8C!-4Js(j{*{MgR$-y_k!ZsFgRr(i)}ZaaaK@QYkwQ=qjI4hUW4IAi;3|Zo!b&5Ojk8(!>9OWxPjMd=yq!SxCCCC?xsU`7zy2_Y{SeqjC`sz9gMv| z-7!=V>!!~tPpUH4rt5aYOsD^V=*B!Hc}o;HkaC%zP8ErpGzA=bqz!n(z}U$AoB+0; zV_^>K=u^ue*I1-bETmF!&t!O5;@%R<)e)L$w``L<&3jo@TZQVDZ^l%)y$kcOAUvo8 z$IohG>7|he^y35qc0>W`SL*FN*7#Nu95e%h%hkccLrrVB%ZXe!0twZ{@^e28rcFYI zVf>t{I^=cWNm|cWilC)UHGfe4mwz(y3dh62f&2ww^K2zIEbMfgtdncUDfI`pii=Sy zET-~vA#-`32hxZgXn)FVG2H@CqBzPE9N{-%DCdtnek4`DTSXwR3*=q(E%&hU#l5LuP4)*T5qK}n*0=wv2gsMb0&fZ?UPib0eSz2t7xw4`{U)|Ib>Q}ppmAy6#pf(~CfmM1X*)@{ z(q?2x&EC7s4J~>%vSVH>2TgCp2>{W}ZaUn7i}7G#`SOk?f40Gp2q%n^Z23XsaZtZ# zUhTtwNLTW^oQy;?5w#?hhd zD$&xNxRmSLCsqbYBQA#ss+4 z2TJI%-Vu~~7)~&;D@$$g)i&)3eV%2cmCFdPas&j|Ooi4OZiR!?aMCy$Zh|1(rTs@s zkv_`DVc4|Q{eCxk`_@a7zpO;Rf8Sq`Q9J{khtVng2_>@FwG9c@yCpuJ`%(8_d2MTb z<1xB)^8r@-AFV3%Q~3%%4+Jr`G_gPY`jJDuvi^!kN2gm*BSrOZe};8WgsyyQIm_Ix zXc6Xs(58NNHKvbo2T5XT&UdINT#Y^h!F#K@3%`C<(l`!%nFReRgt0JkF{-YIE2F%6 z@|qZm(o?wG`a8VPdT7s3I(0VERV1JM^A3HvYHgnz_ta3Y#ulE!s`E#Xx>>HqvR%~er(JaLKEkdql<>X4%~%e^=t_=KnGnA-oEXw3reitG z^}N1&>nnu5nSAhiM_;pMji3KR%35IHE4v`mJlIhxTE2`;)xCSi`O)-2BF6xyr6vuc zvb|d zMnX(bBI9qgXPh+(evTMSStC;#X{n<fe91^hfOh7WyenVdcJdhdt}S>glW6`>4WpIG|!nS?#Iq zyt~sGWFfocG9+PP5{7?B%)V3NDJ1XX5atyte_^D$mD;6)sD>)g%k1q>Jb$I@&_(Wsw=AeU8oxJ{;EpcOBg`H#N z8D)I;Vn+X1KE&O6krh$*bKs@v=<4eF-VwXBOJ<*I^Vu_hAR!29^|m>-nE(+yAD{3? ziXlkA85gWw8N48Ss4;fj*lGO*8JWKS-qb zr)29>dWW8|LnLM#>mEx?+w_;{dwAj%$UCVkC{WqVHntC=Uae+z^MnM*^D-k8763MC z2x$jfZDwF;hXeD=0A|v763SX&_(Ow>tEr~G1nhJNf(=lpx4o@T1{BAeW&y^va+8SE<7k6gyJ8;hH5#GXG84_PbKI6d5`ni-1!O0ZB;(Kd>HbwNZhqLt6zWb5 zUMXOb{l+a7Ib~n*ozJI8Wc3odH{vJ5c^b>p%pFlaQI=Yhn1CQ<%$xG-OnMx|r|+>0 zM|{2qzM38arSPmof7JrApFwd><>HFL^!)dePArWrS<04BYANV^}{ z7`@WqY)nt8BOW4jvtl%mlhdMrX3NIxa5(qcfsM$wdAl#53MxLVW~rX4(*G&yp~wDk zM1!R=ZUmS1v&Pbm$Ppr+TbL(4&;z8~P9M{EyjT7*aP3=&>31t=i>fe@Hnd%H*f%$~ zN=XcxGD#H73iyRV9VR+2VNm740}#xx`Qn)v%^2p7AD?8l_`8vE>41bfeCzCTt%0X4 zETZ?F^mQ4nj~qL5=8UDDt5pU+TNt0LX3)>$1vbSXdRv^J!iX@L>n|WSC z-+>8}%hbGmmxPfJx3aRb8)~#DX^euCVG?3Wd0F1Eo!;emEu^Cx1;jr0iA{@{%(9u$ z?+_=o9S#AhCbnfr0^)S1Lj96V20z@(WL<>1*k%vnDUsdNKzK4K{%dg%#F$%p>8aon zp!^Y0&oH*PaO&kZGDFM6)8Sh&`~D%Gve7?@r$#k8Ys-u!SnD(Ocoq?nCqocG{L)~w z&Y^&21O>y8jIRsoppq0|YD41%2Oa<_E1e_#V79klLV`~D=V4%(7SP<4AtrCqouS`_ffu#3ttE_YkU5fXBm(-@UHzaU)T-!a#bR!q(Y z9N{cX8`GzrlO4&;kdMdvH>usZcMm!+ZHz>Tusj&$2m|bwqYD3BE@@@4uL>@0 zIJ`k;M)16bu=s{QdYj$tMe$MuDJ04v(R zkSo{=lp($}!)KhB^a}e0>YBmPU_@ymZR*$wnTp*d{W3AaS^(ae9%wF(6kHRkrK!vVn%=36DWfqs9?ugxIw+y|7{zV|keQa!* zM0&zE|B{@lj{?bQ0ZXU8$B66PR~uodqml|~p~a2+4&XfGnm%V_f;gY>8jo%{{q>m! zo02iR@pq}FtS=)VyWwb%FaM)UCzwYHbfa~tWzKw0Z{Ogg3hhv=3E=0Vo2(PujW`q; zV%O-u6vSmf6{HY>e~#ZYccdtKkhU#NU98^#rmys?s6+oJzeF8NBHdxqwrw-k9`Su> zUMPor#MNM&gx_vtEs%yo^2>G~|86Y+{lmQMzzu7G-wnoB{>uhFik;LvY;h!ARn+

Aa$P4fv+ZA@OYU4xI4aEx#7~jJy?T9R@Zyh&%D0J6iow&cafr;em9FbXNk4ClJU@7_<&JuXp8P$tO=Yq4vK&-V_Q z2FPojdLL?6cyc{>?%^PaYPX=S0|HS?a+bzjO+eXTh`*^rc!(jo^qu^L8nv46x@k@B z1t&M81hbthloa5Zf!>P)k;TpivY<`cnDgDJ-vytZdz`)cLssCts6V&{6wDgJM<_!&Z(r^Aj#b+HF(f9nW5~EEQ6?02* zeaf3h@~W2acYKIzxkG}`^`#C8jCt;0MMe&+1O-YS59WKw!9gL{|k){aijfo)D5 zPepPjj6WPM2An#rz3GGWbakK{6lL-CLDL2F2=#N9-BFAZSJM!0^DCo0H&b-bVi>=y z6hQzcz@d!KVS%48-y4yGmxq6pU+Ozh zTmgJ=M}Bok{`)K;xaj}K*qO&e+4f;yDei8SN|8#V1ud3BNtkJuEtN{vX;G3GOZG7r zsU+D&)~OUpNcPBBvM*B>%4yFaURF_ zs2y~&(~DN*Y~sDu^qL(vk~n;m1F`9GNzl*oC8Js zcUbTnp0g}*HsE-XPq;X)(=Pwy$Py&;5_iQRl3~p!Zq-=Rv^RKKWcV)W;Z4uCC5BX? zK)f)CCcW85GZbk|1|h`7FXoz?VUWPqn58umMf%Uk;C}$IWy{@Ggu|46)4)T#6+6$n zxkI}@T{bh92(E~e^5;v#LUd<@yEGkB@-e0?%{Dh_=2#m*p#st9j(BTy1Nqx4$?(d7 zs$-Uk{_N9Nscx^fNf0zLhP)x3x33SO z)G<3(e7!@?QfsKA4Asp20_1}V!aRm=gril1_#iEHgoy9-OfbR~xJ|`k9bJAc`ra(e zL_maUcyT(aw}J(a6}>U#YW9ARu_OL+~?*< zHuR~}Se=BP;GbPfz&G^2s!I5q;F6Ku25hWsOv1=P5%IidzI2S9cQx7^0DkQDUW$29 zhNH6(cFuL8ZSu^*43zMZ`2KX!N&$B1T3A zq?oeOX3Dm2Sfit}Q)#3$Ha7MkXy#byiTj--)C?6SFZIZFjXW*u4hIR@4tZ_BkTiM{ zr+9+f&AtzgDhYqS^fa*i%6P#5sUsD-LQ(0HeEzYynl}zw=&1Z}rJbF@*WOK#&X1gD z(vp2f_R2Q<4oE_x>;j3Ct=|Sm@8g{w64n8$41apuf!;J@cnHA_NRaB^TF-B{BO@+* zi7$)}kd{tTMT=fI2u|uN4oEauCoccfnDdD=Ux{7^Zih(N#q*ELBHbMSe7Y@@Gw)9- z8WRV(#pnlnvP6SoA=#MtsFACEV+{`H#Qjek#Db$QeEM`W`?8lg(tvljUUce4t(yyl z9==#Kcl+3ISf{znXzp^;Z$leFG5?B3if@V)*PWT+m_QAliEsv+J|>-41%%?83B2 zzZ2z^2HPf3GiPzujr=cNo_87e>0&PTx^)5oB_kwJ({2+?jn6UE6tp^apR_1B(TO-~ z6Ec3d(z!GwR~xq+Siu%fnksWNwBQ(zA694FFHsGBsq)BlkJLe9ZcM=WYUz7TU6lw; z_brY>KS_^3C&ZgY6 z_5;M@Q&dl`BN{Z%VWZaL?#5=yL$O$*3t*BDL|x(?Y|w|87%UW`0{mjXgei96V0K~Q z8eqy8864XTKI4g}w<&!~U9KszD`RqjN#0#Ybf;_WnD~*E^y{qgb+qQ#614{qUO>li4G-SA2{6NHk#>qRn(r z-w;#y#drUbosS||1iYaqOyr)MPxAQS3bW;|T@g3m+i*FQkZ6GX64K|=<8KZ>OEBF<7 z7v9usue_5YLi$z`m7mU$9}p!2iMu%8_4*ABBM{|F0mGj2?MQL&zLv?4@aHWZY8z8B zWA?A)hGpqQWY))A(z*8Tvh}G!7jk@0RPyeYM6VZfUG3MX%{N?#?6mB@=(XT&V*Z3Z|)PKbJz;xyFfoBqxPWPTN`PVO3`N!|` z5JS zAsEftiIW;rPx0q67uGC4|HB3qTh3~r~r$RfG02C z3%U=1^vYLWp#d%8*RNl;dNoeYoDEyEg=X) zPPwpY11KEXf2D*5M+UE)PkB0OoCX2@Xlr(+&gjU<^-}C0h57iK#ky~Mxy;Yocu(>* zuf73Rq1h|`ulBO}&Loj4!75$+eb#e)=w5!5Egs0O;DYxlQQ0k}Jlc!XpOj|lxF|md1S4xbx4qtz3hFBE0j0zp#rgfLxXtbpi zU4k}-Hf3kme&>F5Ym5hK)l>aywUYTvC3p^t@a7mNBe93sue7V>433Kbae3#iGx{;t zb|aHELgdu*+~9Zw{m)GJw)l14?GyLI(@eWLt#h%F?yqzkN*|~szvk>Q5eU7Z=P@^5 z*>kDOyTL_>ceb7b0Y`Wdj)`{ecd7b9?#$<^GQW{Ck$7iXEHU1CiJ&mGX1{jo+h}qHOJk;9dU!9533)v>)2_x{jp_W*h6J#v}9BL2@XKK>}8L_Kt^cF-O(-dKWZXzwA#a;>tG#URPAK z%tvBv={|I|TuX9%U*_j!p?keaK>18YyqDI z#mk$oc=^utoO2z<>9ln1QY1Hm&XK z8#gdkoMHUd+5&H9x+(922UJ~6x@Ga{M!rR)p(P(3c6G!*gWhi#f2eO9;S1_049DAP z6LW~7Kt6*ZREF1HH1W|&GdZX&W110+1^(zPswXdJ&N+jQ!hX#Qv7y-xI^V?Fj$Iq3 zZ+j95%-{A!fJ)EHY8f_gwv8J>d7baczcwwunQwD~fX|6*NjF5bZe<#d;okwj7~Dp9 zV!!lr+21yAs>f>A$(Ag&$4f($tF?}#4xr0-tp~vzkc!H?3<{`;hm3@le>%JCj=J~! z^bVT**7BwpmF5?e4ZxoQlj2X%{NtCb*9S?hH1~dfaUNqfqoTacuznaS;yEEUZF)qG zklI>M$@UtIE^vs;WbY8IS@x`;PxNdiP|Qp@wu?1;)4&gf9gHbH3X5Lk70Fhkjc@et z4O*2}mWu3SymY0nLj%#P0r6Y(5}rB}`k$iLFU?Cqa|Vi$L4o4IjM>33Vf#m2?o9%P zpx5t9k0=`c%2q1`4Y$On)6N(#)o?!2Yu%($dnO^}I|0Kwg9SyW9d4rmhnhzXBdF(7 zk9L_;5PjB7tcmxny=lC8n#mjj#PMwZRFBygMLty}r=KK$OCTH(*ANqzY5%xCwsF77v>X3R2_IpoB+G?6B-MQ5K9N{6gSph}(6x||W4Hb-etmWp zsu2U?S2E8A3t-Pj6t4d=WA@Ou0LRm=7X=EI#fQ#!2|Pv!DjoJ%FCYN|R@Ne^1Fl}l z4XH*ciKf{%8x==#JhSSvZBS0+nuLD4*7AwTBY9`#3!{~_g&aWF8)(@}fch`3W16pH z0-o^d#|WhQ0eSFHsVmiF3u1WwX%`6Qj&Zwrjn=aut_K3_abv~ZzJ5CQYQ^*|N{$LS z)qGf4{8=mGyL+g@pXuf)FM&Pik3eS4Ealu*0qc*sd8a53e_Sh~N;)Q3_`l47O9ZRb zc%}@`m^HQGh%K);r!f$Ed^M^-m&T`WEuLzTRBEu{%ksbrU$pGWa+--jDw-alKW6)vZ@6%yvW7Ub4mIWAI~84%Z@+aAzQWYlE0zrsd>7%-0=;}YL#V;k z5HPuX-%7HXFXL!jQYWD(ocJ*|fOYMp4Tqx*O1iOQFDsjdle7rXOeR-aS1_JBaS$V= z<@q%j^v9&M%d`i&_V0~0Y_uE$`aZ#fCe_m1akDA$(6y>Sv2z>=atz-O1&dt6=Tf15 z*njrk5A>LCb2^*?=RF~8sF>KkkSxc6s`CTW1dZ26pRD&d>=Eg<(qSqgA>rsl^EFQZt3`$gZzLJdJOCuft z_e}Ugu=1`6*)y5@IRJ4fpYDcx|;pI#7Z_rwlP#5pk8U=2$Mr`a0HO?#Mzh|d{^SrKW50b z+K+e1Qk`~9A3e7_`~8Czy!cl;{%_8x67Mm?2t#0yf)y+6dRj6k;_}p&SLzt+SG)bez*`sDHG=Uy8jX_sOp(M0cX|`%+SK^LE|i znhsZck60TDwzsuOxX=_!($e;V4eAyKLwF@zL&6%z*pY)l6prQSw^ zuEA{+S;Yfq)Za-lg@FVEZ{|hrP-n^eP9Ze`qT*KeJ$N%;GR*mgBJN%>mft}!Yb|aq zv7OOAq((U6Zp_kV#Lz7)Sjti)a6yFaSJt3D2*9kKb$xTsG0NhT@5wp(2obdP!@!~b z)i!LgU_k3)OA+?h&sGgj2s1dM3*>SoCUh8;34Kp;)nYs7?iJz-PR9un? ztS5ywl}G1RbCbO;6_pd1H1vW2GatjTp{3TM{c;QxEhCh~8QFHEuHsfg*T(@djA~|& z`P52IgpyMgcgB)!CTDnRBxNR~w9?uFb(o6d4NQ)JAYeo`R$8y5wc72z%arJNK`WDM zLxqOThw7WrXVN@;dN6Jg;LmNR z$_KLPnjWheS+g~n@Gl3PjWY$B)`Fx37H!4}!h)o=Tk5bew>{t*ENS(?lGeVOvsKSw zIScyVde(YD(Ma9(`d6MB>~#jsttBLN1w11NrBq26V^(`-9a5xe90te@F!95OiE{If zdTHp*H^DPa386ZsB#KbjRPVI~s90S3Ob{?A8&0p0aJdbl8ISj}{nhRillAjyDm_?; z_(;Qb{EZ5K*#>HpK66{l-2gn|!`9&g?IoIUwr;b_B^_?Sj>S_Z&)ZjT`^cht^}lq6 zz*lCpp1=Mp&<(hrn!???g!kQ^^kFD>)*=nnf0zEi2AK|V_IgYSi%z7*GwYY3Ic?Fz zkMOtbl*(=#4BnbRiSK(>B8$RCF<`6L#_^{#x16G%f19Qo3)|A)-B_RL40{4y9_?Y`}eO&JlMt6xeOZKynq{|T_*7(B>2D!n7#S8Fca4@|?6Oi*K zpom@KrLMEPoLBzz0m=^GUcGqo3p{@}_gAnEf|GSs%R;5k%Z4fV+__q9VYII;le&g! z2iBrpd5db7o({RKGDHNgNVD651=))mE1nlS zmBldf(qA@7#H}6KxbBYAwFXJ9vl~fjRqK)0DkS7jNykAh8uIkW=f}F{OMtVAPVAOv zigaty*v*}yu8c54@`}}yclhZ%d47~m1$yBfM=G{Mhd$j23#UNPTBZolPXWb3F_U^7 znS~Uj$~W&*{QDejcL~Y4Etk=tXVp z&qZx4fVei0_y!w>RcFBZn2{0U^QuRiH6{T1Yk6SKB%srCUJnD+j0Ctz1P0&xCHq>c z9*ViNyZmxi)04WfI`vNq21dzRbH}KK*_A!7>qqtHJesZ@EKJ;LRIWHCLgBdJZ@WF< z4TdB-4WYc4vk{;u-uvgkSUm9k4u_!CC!UZ9@U@be*W(meC@q2!;3-cjxJ@n9x?u|B zF%ueQi~7335ZGAwAp`Ulb4Q=1LGc{xo#?G>Ym_%jW?;V#_vNQ%cZzNZb?Xnu1Ulzy zha1c`^RA|raE#LFFp&!=V(y~gH_j^Ur_U6^rzvPd0?G-%VfN?&#>8jv^kM=t_6 zs2;(=!K=TDzdWUU9{W1%$@+c(O?=~5?W2n0aXDZm`~07*`c!(!@&Lo;hS@U>XV$zh ze|cd$x@({crAuJQO&FeVz1tU}q9_ zUJqAX@$u@~Gez>8JrJO!gb*u*EitMa`ZD24tU0M8z z@RO&=6>~>X+l(iExxonHiSJElJ9b>}kL|%}&i8)&dAp+2Ib<{Kq&nG3u16X+=npsjO|mCWIgejSu`zLdTChpQX~NF= zdzHaZf*MIxtl7&rf~vvk;1Blk7fl6qqUM?rpO2(LJ>5HN1i42KcmUkEEdgi=u))m3 z^pPhhFIne#nB#-3O=(yVPfHKes9Vl|x0{57>is>T==scDAbW`*?J)E$^Y2sAyB zXdDwcRJR?nNUR$)%#Nnn*@YW8>E;_WP5@NqD}TG5!eI7;VZNtfb!|~xOEP?a)olti5dNVYx$U1|d+6_E z`&%cnPQ1vWJ@~Mqgq>ojF=*S8Y_~nJ#yYLWnq8>5ps!tXqw@u}Dp+9a3(=x5FMDm` zB_OsqRE22iS=K|j^y*-Vo*S}KlfsjN5*!t@?Ad3_c2L>QW|mPuk#d3+SSkF4xLHd~ADd6Tr4-Ny@C3_3ohtn8}FZYuQx5`EFqtk?P)$Z_=cF9>vK zThgzognR>2Ry)ErHGT@RmD@h4G9bFe{d+2O`^&T$aEi^$cEh}WaNw57HUCqqD|~$i z@WPTo^&%NK(~yEdZ491!RJ4N)uv|07>QF43F-z@WR7&LIX1_K^zS=#e`Sl)FuhYpW zd@ejYf%TF24B8w`aY-yAksRj0dwUyto?8BD$Ku)g$*ptd4D&0QjzMb-{yJL^QW=cR z>1p{FG>`MrCDgC;KI${Y=pvip=I|VPqM2T~{AgCjss{R?To zop~JK`~H-Lyk5@Yd zc(>1VHoSaY-qWc_bLxQ2vK!@Z$P zE#9Ngeheh7`3tQE;hD7H)}NBwh6Ox&Vc``KL^Oqf`Kat~_bAXyb@rH}S+Tq0tAZu# z(L$DYX}bgzk>kBY@$=RHnU1t>`HRW5L6h9 z)Hk}Ix-eL{{pFXs13gCr;Gqt=L)tpH#39+t*7lqIBL%>tT-(;}vg@yb&Wv6WB=6z6 zw5UV0s6sR&9P3yKDeUFO5$`@W^W+|59VB>&3z&Ql>`R=&dIkJ`I zuf5iZ(klnqlY_lzK}*a*l_&qCg+PI(F{cPmZ0b~d)^*|Qx8bpd-kJh)dUC0&W7&_$ znzPUrYq`D*}7^;%d1ddfg1wqXCl zBB1ukkJsks7teNSb}Zjlem&nm-={nth;;SmtZJb{yVgcaYpT6S`C%AgAOe*EWMw6Xqb znDn&|&x9%a^ZrU(dJA{rML`TxplbuFCY(RH`TvqfGj%1Qo_u^(p<%?|U0_rQ$w+e`X9Z;%&@a z5+tRzJZ`GVl*P};%?k?)CmrhB`yB$uEI@jdP|{j)fUdk$bj!$vx2WEsfX?q+n|XX3 zb-ZiGx`WQQ<`qElF`qiYX3=pRIHdV6zg^v4k$irXlvL#2bj$TS5flliuwg#`(C_2) z8ego`X;x0oWJQ|%D8CP#se}G^juW0s{)vjSA9Fdw?CYs?2I*cLUmh4to0ViMqx!x> z_u3osa}``>@%QO{Zg)D@y%ydW@-&3_R;#4QjkR!Qnp+f88Qu9%e@T=_Q?HvAVzknK zL7JTT6KYD(z?|8F692Ar1jM#l#=%43!q}y&bpIl*g|#sP*JEE2>?-%DsQ$pF6da$wk~huG{v{0~W`HP@@9c&$zJC9ReL)&dic5j+#nEs>T$02KLKYl2|pmh9P6 zjL5i^9VxN{zKFS(HJf5iz>F=fE+}qno@)fRBM4lNz&~^>G-}El78tFz)h_YLwJuXR zI#GwdMH*5A30l|AUZGx-t|}#mslvlZ8w5e3p#83ZYf~?}@Me%YuhlHs=3E@O80|lN zXH#d?vl1h@mnyWhT3ZqJss{zDPVWWBqfVHx1k#w-l}AvdvJ7cW|XQfru1dA_{~v$2+&|#9{Wv5L2QG$ zcdid0`XHeppzVT{5(!63$tCb%V5nH^2S3sV0tA~7Xx+bs&L?ajbUx(H#LzGanv#Q< zWRBcmY$LnBvOa+$=Q2=Ngu z;fm~;KB(e9gih#0RG3F9R^_0wRh71O1B#V!BMc(P4ErE#L)d@5^Ojva>wfz?wTNYM z^RIo^Cmj8DY~)KJjd*FjhS1f!vx?l_GCy!#7fQISr-w~$sC&AX_bw&H8sqHjOsb8L z!>eX*fyM=nCU10qapC2arD=C=|2gz8RsWhbKidvH z0J47+mCL<2pytgO0=pt`tKSZxPDC%qwZXgM=f2-paL_+6gH>fVGoWb#wYY|^NbshS zWq@u4{moij3quaSznX15%zIN zXW6?~sM@%>0QNyBfUWpX#=l=Fh}DFqB&K2x3HVF#<*(e?N;Mp;gXK>9ib6AW7vX5? z1!+M?t_fz`Jle`1N}Qhr82xjxPmeH>ZgbsVudKRom`?FaTnnV2*U@f)h^Y%pUXgO% ze~*FEvEPT3?#|WF4KS#V4k&iJS{<01bP$(}`6D7gB1`4@@a>(Nf_HoCN z_41EdB2_ZHEB3&!*D{#Y!3q5NC%6{v34rDH@{jv{>o=^wu^oU%Shn^>#FZ}iu-OZ; zfDH3@A=JjYm(}6j0%8Vctw2JBU=8)s7!8AmWI~}(8B&{?Jk$9T;5mG4@nuj=4?D#!0b1AIC0M zjsj0)JJL6!Hh&?Q%Bsz81t0biI9^&uA|8g64uNjzLJaR}y|%f|<@|qG`z(qD3}eJ= zHIGHX&OY-7y>+dP`D{Q#AWh+AQMt&HmLB{Y_G<3PunnSlOoA~9w-&%&UQ-^}L@&ni zruJ4VMWt<-L&a1 z9{Hc#UC;Ild##I%V`GO}@KITpHLtvz)+rF3Us349nEi|55GqW>#(HtHfr0)8@B}cwU*E~p4eJ-!?_JAzCDGu`%Uo)4> zN~W>`xTet%i*2J3{(SW$crx&R2t8xFd_rgjjx&H9nL5h&j7GUcXLe9TKpZrd>q;(` z2b;>XW8O_qf(>Ku$*;*eeIfpta%K2*Ix{|Ec%^m!_9oq_vH64|4sN>4ppxwJ7FRgPo|)clk=J3`fNDBh9sXXeOo3CAB&K-iqa3!w6#w+kCx z10KVKdldc}F+{pI?ADWMou01*q%jzT2AVBFhiwRkcgc>M;x#ZA{Xym`p2x?JxwC~s zR0dAcKR&tGcSPntVygt#6Q^3~BG(*guG}SxE8-v+IA(KcObx_S--8#N(BLnOCg&e2 z(`WV1oj!Lat8+CAG*_;18D;O#-P9b&=Ck_q_^kfAHGtF5RT-mv_p)_UyobG&6*<>R z_#lb+?CaoMkPXvr187wsYoAm65yrt+@B47&((E;mL|#S9kXxs(FeB7V-V5A%`-ms)Sl_GoUTbb6uxDf`X#zBdh>n zZGB-%Eo!z9YE*g#zU%NXB}xgchT!&uB@%zhi*l6sGV~^?{c3ikn;E8Feg&JHCx=lg zets1<&-XxfzTIsTaY(Va44R+>dW=R428aAgFjxL^JLab6Duz&-xu60d?J#nx&9Hkg z&6Rbp8`#e~r?xsOZ7^^QU(pBY0Jz$mzSU_MuGRt@^wcai;QQjm2^plqPU-@Wtv`P@ zhKA<0r0lMH_du4^nppMMKw+ekg#K&EyQK9Cc!83 zX-O0+oi{}xy=~-CY*XTiD6lG1OhF0<{B@M@;zocoP5{Jke;mnIfv)J~$60?ge%`@34Md;oy4>z`kdFPZgF<_yjY^x^CZ*-M?BdH3R>` z@fSY;XVl4?V=04k-4@FLz$}dY;rO!rXHX_qOv2tbvjG+aLt#PC6FBDH3!=LOCSbE3 zJXKY;BLfooF*G11fezo#b+taE)ma8iP+2sQorlJ6 z9!So5apjVEQR~Xp(c*k?LZ{=>{z0IH zP3r~WDfpjlWV5{lMIMfpo(sj|=3^R-)d#7=!bJ%HWEYPOAI<@P7F*`$T%__XFK109 zZE*X6V2`wXUCjnhsS=8Z=*DB56eX$#w}ot7okxj&QVlSQPl4r%DoXJQgm^G{P3koa z*53qCgLD6Wv{6M%#I(Hh*J*k+NT^{Bid9|~9Zz_sT0KfT^ZQ`4{${&yUu8^PKi3U< z0w(s0m_{ES7AEfpz^vtf8Bbm%2IKQiTn4^~)7qdMLVX-Hd9Lo9exdeA1?0om*Q9c-yEI#$LXNfpEy`hCSV5VNnwi*^)5~BI>R}JlYIiS%lne?aTQxVQc_7 zd&SwHo3|>w7u93ENbsfF&KUqqz6BVxtpjfXL&6GZlJ9`eE^hz733bo7+;g?~G0wA^ z$jqlwZ1SqYfyCi^OFk~HYe8+(`2$+bDS+U%E$tVo0=L73uXmu`XjXd>pMCm!9J?;30IpYN}$iK0<#AF{W}U93f*U) zW#VSi&Pn;vySsC@XKduQi5fr!sQZm^7j0NonvHJ>O zp@EFz(I|Fr?{l)81-GngD2#KL`Nox3exz-N?GtFdG@2nGmh|drj~5e zyz3DKo9LsWcon;}43#9mXRlK96|3r%b3qW-oS4J)-z zIAC~eY+@A7PiA`y6J$w11p9r4c~WODo?!yay|FuFfU@@8tf&B(VY>&G7{XdKVpz`ik4##mZb(l ztjAX7Q5~r;3;id#NxnM-#sD$)C(qy0v_UmdKRLvHsJNb7i+Eswh zmzDzUUBmBrr71^GoIAcd*Y)rn+0&+`rY~1-aTB`9@S~26saRN80Bz%hmlsP$>avkh z%gv_vu%mpA{xIO^FU-$6=HQ+80r%Ohf$T+JpW4)NWC9@LYnJ&)!3;ELMikCz!pprN zO!68TAo-(<-97F$StYEDg>|#db1xrlidhyYyA|s$>oa*A8UEg*a2;5|reg#^5E5+k zu)hynC1YP6`jK9)B0MR-wLkyMx7++E=KYl5Q1yT=eiHLs6C#1uU+vF|AMum-kbPr8 zGfaer5Ay3Z!T2<{whm!&u=RlP%A0N3d$VQ94|PFkF!sO@+YA$veA2G}cEjhN?``gw zU7J6Xa8}|6JV0ve`wvQ|gIBY*kL=Fj5LopKl>rby7Dt-bJ_YQ8Z~t1p;Lo5d8$cnA z1|BBd=eGbrvLQD-PQbmLk%Mkw3KAH%v+K~W7e9ts*~hyE7!FDyh|BObvZOS#R*fHG z{rxe71F5t*Sk0P@#Z7cVKWMLkm41Tpd7<8O2Wa<!JT(hh=PUmN{bc!Ds?y`e>TKDDs36QW^E z=fgi>Xwk?YK~zm(*wB_tQ8~3cSL%T7<~bO3wqw5-SSI>Sv*p`ov-DyKEvC$GQ` ztbbwgq0X+ZE;kyvR<2RgUy+c|LJM@-1R;aEw~cSyEna zt=ssIbJp|N{?4a-{lVX=c?Yhf=Dc|uR6Cmlr(OHhfQYcrYw0w%*lTG#!Dd>S{tJ$E zSxxrVz^tb*e{N5n1o^Wc z$svZ*Mdb^s15_^@ec#0_AD~z_Ku2Uh?cn*Cf2jX(acIK_GBIAuYrm4tWi=A5?J$3V zN&)844p`a(%lSpZtC0$7v3Jtn1&7+ih;z(6zVmEq zM9Hv23m)Cu%(##!W%^BJW|eU7dl-5TnUV?IPsRy@f{L&mtbuWvz59qz9h+_uTf8xR z3s1f=93Q_ikal53Bo#LA865Nhc^dC8@S0ATrrA&JNZjKy9Vec5n4bAGvxEI$Vyg#t zgraR`W<)+^67k+1Vi1wCGaE#I5@*&oey@+sc*Ei0?5UNo3ynKSfY{OfC|qLv3-|Aj zHyD58&hxxF^q*eyqTUKIY0kNGseKObRk<6H+e3JyxVCVc2>9KQbtt^|QlI=3e-&!9 zn~Qldq0*dKcjATqPqm!9nEsz(S9^+#|gf*rSZ; zIX|i9Zz`PqTcqV7*DhP{B^O#ya5NK_HTr7E>;RZ(j_21#O;tDnLymbkf9(`PB`5oXL_I;hQSF2MHQV zqb*OW@0Z-lRJDYG))dYoa)n=8C&rB!x-!>G}ve$M9f;e$Ny`6v;=k z&8RGDTth_(Z*yHo(*TXw_L9YQp_6Br^gpU&$gk0rXLyglG1hk!*zMa>fi4GBLSx}3L2N#*Of#YLQQ2-uZZdD^45p@_@vIel~hP5(}wqe3z@&jn$e?1z#P?(BxW zm%1G1r$k4{}rofVTgx>PWkAfIS|;aWnaY(s?HppJK!XiTf>+_0E&;WEAb6ega8ns<@AE~B z>zuWxv0@CN4(9)l*7aNJLU3pYjba}Qms)>>0&fn|hW6g(LEPbO*4#Q&mix?iV~caF zILPZ1d3RK1VwQdO-9DPh4Je6VG|@bm)Cy!Tq3(F)jU?hb+Et_OC? zkb6GSfpV+`6?S04F>VE_bEb{NA$vx|#qN7BA1^6|S6v<>aC2P&Y{GlZSb3d&Zb)|! z?iKh$s&9<0F30Q2T&*|JOi!szIf(mCHufsXRU~avWws5rSrAO>^C`RnKFfgT75Wlem@85I*M(1_%|9?_5R7Aki4g9~{QXjtELn%|JJ$8IwohvQ8p`W^DLY z5GQyGJ8p|VV2L4g&-g6?pCXhEbKr@mF~_H{0rl~CRsKNBK;uGsHJzVcZFKWuvW&R_ zT!no5fQ~~QXT%xm+-tY4oUOX?;foS9D=7Rio}xs|h-KF+5e}uz#QAib`h8VA1hT5K zc3VZxr9UM0d}Y2o@+5e*HvVjdr2(w#_^mwr{=Wg*=rEv7Xs4iB^>pPa=~hP^UF(DKAdY;@qd? zTJ7{Xr5Yi=3U&!ON?QfqUS4TZJ(`;&8Lz*tb#9rp8+x0o_9$(?FvL}f!EQPjLE{<@ z($83$`4A7|WbG{me=*-c90+7y>!{V&MKeRjb5@)y(rE1DGV7uFy9ObEBh&)SWJFia zQ$t94Sns4!fS3SY?u`j{r}{;0W=q3 z*eSviOc`Xj1vF2Jg62sSqg3!^NY%XRFCu#f>qRbcQ)WJCV!mvmKbNahPa>7L)|sHL zDAKR`l8A7rgVH1^Zzk`J_iI$HvG^>-g;dg1lW;KqJS(ulI081tn{0=_tgnD@51(dc zdQ7bMtLOWDlIhD~B>yrwNZ0HDNQ9Asa&6nVPgHJfe7^qA2MQ^Mc-)Cm+O~1fjV0A# zIdu>-)s33JSL22ZS1IlF;}=e@4s3W`kI*>b5a=PJoJcz_^7IAyePOg`5PAUaAE;nu#*bC_tp!lova`jYe6x@_n!F42 zIo35Un&C9L=6pX~zhOOI7Ei7O_@gu}l4&$%RV;gqHkLtpHyBrGeb-oj-Or3?8izAn z>)ME-t{OAi1}HfMc{g|i;^uNU7q};ic>vN|&%T~{ukJ|W`9<5Fw5ZKY(s$CGVTj83 zMtMm!9802YS*RDWp$Ze*{P|zmTl~|F1^eh+Kxeo=#snxqH z&bEOj%HZ0U8G68Dj49~^g%dOt28ufsa`O5b@)yf63op?Bq{ix^WY%~cU>c*D=q{mU zR`-6t12_Wca-r&hi^_o#N&$y0eXeO}YVOiqivJcD8eHfJY@XDIyPW>h|5lqcyF)v; zYj@9(!uaZSR)J+(=FVG(Eg@l(jk=l#F-}gG8N2%=qNlQy60_p^Sp> zdlsXvptGIy@m7}PmLpMC*Nh4dwYrDy_%kIndWA1&DmeZ}#4r4(Fu)v&W0j2O24M$=*6%Ii*N>ivK(AArHzE_Pc>Lap`>-06VBQ2_!g@Xp!Ki zU|?MB+xNWH?U3!f9AD~k<+wng9YEjy?Jki7@Iql_p5b9sQ+;D|+(K@au>x?$L2fp_ zPh`eJj@O{X@H6xTA>3C=F5n1s0-mx=7iR18T7n{BV!qL|gaTJ&f^p0GS=#P6wDxO%IHw$Q#iXZ%=8Jw*qUux zm2*0&S+4GnXc>&$n%W&VmPQhB$1pJcjkz34OJ|EYbjVHT{06|GrcD03vL>y>I{|gN zxSiH?ca!1D)M zejMwB#n=qtNPI!KEAX-*Ht)AH&Qxu4y|d2vx+SO2Ioa;J%gwtEyAJOlRoddefX_1c zL9s#+`zD``iZ1J^Y*BkfK!iZtp*NpoV;~SRoOlS**-_icW{y$; zHU5>Tc`=6L+ulI(U{S)P_HEsZz~9gUkL;oo-tM0`u5F?)C*bp^Kwuu|-x;JkBRHhY zdzy)rd28%2(dFUX&nOyD0}e_8)4r{TFd4vwpQ3&}NCo>X6bU?cJlK3f_5HDJ1KIB0 z-V)IElP_Yi#%(3ieyjh{KydCYp8!WCKFiWL{qsxMUUFlHWaz#!aya4R#}$2M_e12O zdIss`b1OpFLdYN>sTKP?;Y(_;q9*PE_-%s~gh0NQcE&kjFK*4`$1_t!~l^0I2$=XXs7%$NKW^%1EE=j z%_H(O$qi`cG6N5+N#`&Kit6!a!`9ZhPCFymu%mjgvaw3=z4Iw<-2vMMW`2*dL0|{4 zK?Z!i+VUgs^K`=DwFzO={@mq^cLNw`*JryUrc9F~4&U*Y2)<}(>^y6V-;uz&-W5RX zfQJLVp8Dnz@8c=+W7KY!z*-&X^O>5G7w1~O{kUSqG=|kPRSCDr0ldR!Yf2=KvE0UQ zOW$U4x62eIry9+xeO5&}E-Cg_?R%=)*gR+oF`3PFr6qh#FVRwg0%2 zfLXN_j1#yIywrwuwaaSY+h}{R>uPe9cIC|mM$LN@X-c1P)~^+;^MmZw?$C3_9GjWV zjB-^pljA<#7q>%gK3WE$Z%AwHi)PZM27YB@8{NQAb>~c+GWiL){U65O zJRa)5`~N4Qx3$fd7)ymHMWIH9HZ4L*h)hC~ec$J0$r5GAmSl;f$e!#o*6d66ea4=3 z42GF8%kMSneZ8;i`g}gO@9(evsB|+PJ+R`&raQW~u$~#*b2fftInL8A5c~=RJ=7*eM9p_d2yxn< z$Ck7{n`GJZ@m~iK4qZHR=+2qHB)l#wF%<=fZ07?GsrL|643c=r5p0?l*Qd_cZ212< zO36F5PDNdMXUiJb>D$}c+)McvYa@fELI!SI z(#%1Fld=++g%uVk(Md9wv0bkV3-dO+d+tk(6d!1bSIEf7i1xdhhpkx3J4DBY$Rp)# zc5Gom0KMGc{rcS{YUrTKL%{056udba%KJeVvu2dd8 z>j3TujDa((b6|M#`_QG+_nl%|?HqRx*0#A@jfCdqG!N1izNi z=aaWkM>5rj?=Kvi%pg0hwuu1ZzkS}+dsJ3&dMcO(gnw=w7Uqx+F31J-In2Yc90 z(>S3XrhQpL$iMu4np#&ePI~eB`6h3Wo_Em~<`*EnZR|xeXxAo4)4MnE&U@6X)_WJO3A_@MrTv+vYU?)2!zsn!@{Y^-Ygy1am!WXDB`gWUtGiT zUReeGn@xHg(!yRlJeLfY%M=d_egXKXckH25H z@35w=c8!Uf7kbthF2pdBt#b@xnN%yw!f_438Rq*j^M^9>$l_lkAVNZi1~<3NCNCR3 zi&a^RsA8rRKwoU;P+!tMP%ieKz|A$U6~ulR=Nit@vIh=CDn2XUQXY03(8!p+$5y4s#{tMVRRB{S^>ePxhH40VVSR5n* z8;VgseWR-sXz}*Ve4V;Fig?}f?-n%Oq8moBjdf3Mx|$oEab@^&%Z_!fGYny1@}Nd= zAY^>ol_WT>Oar%DA%1F_`@Q>fldzI8t=xZ0}2k|T&)P!s~5oC zI4~5rNsVx6>WKOCTl|KzUYX*YG~#{ZSk3jA7pK4jmlnQIwM!F6<=+hoIQHGD_;Vu_ z(?UK;zsm5I)z>NYin*D>pS_}p!6elGjIRF2dCLX80FHfSuYR|$0EQHsKHVApc*k69 z%HNUM1A(q~uH@(6eypec*QKe^Nh?$omeZ&boBPstX34m;e^`_mfu8|D19CGvbN@x1V(RYsKW_C|K?+3OL9*vSS9+v!f1nNl^;3 zE z_K^BIl0U<M+ZVpbJO zRHhcU_g3l81}6F+RWtu$duPkkaM^axzA!`SyYc(p zNL+LBI(S~gCGV(s+aZsXpo;gNQ{8WZycNZ7bm@GsJPbT-FlpO*kvabt%*cgsHLxen zt0`StFa7vCF&Y1%q}v$*tJhh$(|#Jet?1+E>#j;gJWCdPR8&;5ve&O1TcnU?-JQEA zI~Jl|q~l6ZXw$7eH8&3LQd;5JoLjK8DQi^YO7c3dbAcCuB2tuEWlv2rh7h@N^Qjlr zhNzq~WMHm;MbiKXUT$EoMpOnP0Er<&X?1l{SDdbU$z14K#?%L_L5I%SA2ky)h~|?M zON2Ok>LxaCR!&c*U{A-(@Wz8SHye)uWg@IE*jHc~h35)N-RXrmK2gYwqV zxw&^1AddCmIl`|~Fhcj0bC8m`UPI)|qJ9|{w8;saMX9M^8t(V8=Qd3c+6C0L?mU7jNMs4smJ zR#y>=vpP&!wMg04L-gyd<*dU}9yW}OK!-Pp`&w96Peg|m=UK`QEmI&ry;|mt zh9`w~=H}))x~9HI6jtAVU|wOmVDpe-g_T9FlLIcYrkPF(p=&(0cyyDU^3aYsb8agv zG;Ul248Q+WS_{uAQ!Hl+p7R%(y_5o{P91A|^X9}=VYMfdFFGIv(WFf!1z^Vx`pi82 z#zD#BxE-8t?|5{U3*d`Yfn#f%Yo-#gA32Wz&t$J8!YU|j(Sh)O*s&P1k-hd(N!u*& zr$j$?z!}d!AQL&4h0zK@Ko=5}_%~t^NBiY>N<-&MOmH4+$fqG+v{eR?X-J4l#eIE% znJ>RG188X#`D*UOyMrCC97fI46HDZc>g-Lb-*Agu>O2vm^BmXgu>|p0>R(>hvly6ZDWW@=!?n2=+l0t`T4F(SxARRtxv@DKF5HYS1tb13){1n zA{$*4C3>F{VtLb&Qn9%}#8Ia%r2yM!6r#4zfCu3`THzEtgi_b+4;N%Q`ijf(43mnW z5cctY-YM5`2yPEl3bEa^nnt2gd}CX0mYP-$ELDytCCIc1%%)AHVw9UPEeljv94;OW z3_iCcyDrcP(Z#9`k1fO;9*^b01{+Q+d{KJt=OoWU=_aWrb;cQKN>r@@&}bROcl<7B zNZE&AlL0mgZRUFGNf`3{#{Vwc}9VxLwo*$Uqbr!2vK~v zsBuc^)nDQfJ%QEHBwoz-xYsr%fi zcDP>;I(gkTG{Fbq6<7Nmvrk!BarmX4c>?)XDZ<;)0LB@|DR<W2#j6dEhAvUG_ea^^AC$ zb^`s$n{YTELyZ8KYcS*p_1^s415{_A(E!qSMoaqeqDhq}ULZPadU{%imzNi&(fN+Q zjD^oDpn^Hg^sXo#-Y0Kcki95R>RzkZs^!YZqA7{Fty@UAJPA#jJwvzgE31`=cNZoV ztL))ju(v=AM%q=WG94v7h3(Pycp=J9De|cV#(@LQ{;5@?k_USixPn*4U?26)<{i7H z;!GjR`q@g5{H_8@r~p|!_){bDg(FfBdiJffl}WEtgF6SPEHR-iuU)A7$i(PdnXwER z4%J-sWLjr;YEfA2M$RdGbuoe%qr5nW6}INOQp}U7vWD(TxtE?`a)DCK&92VQ^)o>2 zU@J^)NR@nDpW4>}RL#0Av5%8$96Vw4K78#e+@JhAqT_R>f=tolm(j2T%jD7F^0#yT zof}t(_wbi%kt(`#Os(*C9Xz`QcE5Hmk(m#-tH}z$3TE^Af#DaECktG!(S`f)W^ZKW z;NMg9Radc^p4#~7L2f`Eh1C?T<6#2INk|wiNMx*Uowsb#4bO6t)(Kt3D)d$`k(}eNwFd8dh6W#&5hutZ1d%_yojay!^S{Sy@ z!{QllU)H7&D>@+I4EX>Hi`CoC(#`-@*OUDkEOM)AC)Z!!)GBk7o9OG?dq=G9+smA( zh=#1NQvQhq@Xfo|P`V$tO#h;(6jOa(Civ3Sp(4SxV3UYJJ4f}}{973ObW9ZIrBm!gMP^)Km*VbodEP63#B~fXY{nV=q27ildEXV874hZ$3c%4hmvZbM1K4k(5 zt?c`Y1XPtiD|~F{>PAZoN5Sk!-rko|HV6mDc`7g}ga z4J$lo?<~AJFQIh);#d9dN&*CFWH%;5^$%}it2#+{B`v}7Q_#jV>h!MCfPbX6m}*c8 zc|>J>VG_aXO?Bs_(ykUPIe2&=oe^P$SHSOqS2;{GB&=NElrtp~)AVt=E3Y)7E){l$0*C%?_!;N9hTo6E!Pm-kSHwv3YBe*W~J4r`&{(s-$DW(eC8P zqZiUQG5c!7;%^ywv~Cgz)Y--e0p4#VC3jxGdbMnJhsReV_~PV!G>R0H(Mn!I`2n%q z`BY7+6`^dy1M#Ig-x>)>Q2%8#kSkhxOd$5;B3?YE#4t{yXHh4Pi9JCGw6 zYd6sR`(aoqq-29WDWeU2&Ti3=Andk6rCu>Mel=Q~%VjpdEkY^I%;Yj>kDS&iDY-i$ z(-Gxzf!26~v-RG(18Q z4_W#?jVy_JVjAz}@vD-6gc7ekv}|@?FZM6EBBDQ=dK#e4_iuPmDNV-zNAh>z(;>(v zd4-=$effA0!*j%;!I#zk?$bSv`AM+LwE*&r4Rh5fzVUY@A|^w;ZILP)YZ#39z!dDw zF*#}Ia@0C+YH;gVEMAgF8BCTpD&Oa`68mS-Zz27A##rnif5> z(0Oiu!dQtZW?Y8@p-)OY+At4*+8UV^q1cn| z#c9v(P$x5xr$0j6NSn#Jj9MY2tT2AN9mlu zEJ+Zbz2;=m)emg2u!L%f^f9p*>gaSmc=*jdS;c8;vXcb0YG?XEWRnfxKRE!u#PYc^ z%1oYX<{?EH;j3!|b0a7dt46or7*&*`#)XWkT4t9j*MS(;eqvrwd zbxZ^eLeO9H;S1>d?M|=~ec(usts-d1RzU zY=bLTNy8hCUl}6#vD06^iHrmp)r;bPXEs-?}wneGH53n1O>x32^tTSR4A6He!@D*8~*0k=G9{4#Mj(-1d zGORZ+&8Dyfw)1jvy=bTW6ry!Og2rJ?9UVD?;9@=qfr-F;lnMR&)AP-cCAzIF3BwRE z>jrW3igi2??@@{9?tlm<1J4FI@^phGa@0xh#I{vdj~-h`?s(LqU0p8=!M1Ud@&oK8 z{+mk!QWxone4OioM-t3_9u81iL|V!9y;)dbQ{som{F?RY#+B#HG=pnd3olcwTi#{4 z}R?9`qs+yItJqezzC6XL&-PI#JE!zQhE7kJ(; zx3j_%&mIsu#4r_&f(?OT9{X>l2TG;4i(&L9BIzdjv`K}rivlnsjLAr z$=LR3`R)6Yz3ttsz^`uMPdq2PF&MPek=GMHM@K7tY;BjVTZ_N&FWh+d6w=VZc938E z?PfY+Qpo-7VRP{itD*iWGR4o)3sB>%LAlI&mhnq5W``Jqvh=CI3M9oB7D#Sp0O@Ree%T zzOZSmdr~SqaE^M<+wZs50~{T3xWV#_fG#Jhvj2OZZk%N?c9y9ZSf*~SsFk4Ivtlq*bKDx7Y$#a^_xn^&Ij3_jFV8i zRRmy*H>yeu-R6wvyt3AU={evnA4G4T1}m9N-kQ=D;@TaCJss0hb)5Hc2cqc}SOaj% zYXx4T*6lsCzvvKsJQbDkH8pA}$zznZl+<(}J}SAD?f^e(WT-yb?3}Gdxp0*;|Axxt z$@Y`=4i2~n!(pfQQ4=A$GM*#`QDTjmr#4&j!ktm~fgP5fou;6(jXp5|cz zk2w|jZSNJ}u7_Dotq7CyXW`GX{^7iu-KboOI&El!)8m&xk$V~X zqU37?sG{6ahuPUs{B_FZLU{zQD4^Q9a`%(;6(2B6V{9g*iQH8$c8kn@(CKT^`FDCaC}Cwlzd{okKIg;fii7@*l#Vl znxz3cs8g2fFk!co??8JQ`Yb@l-H|*2pz`HDJz#!b6vXXs0?uu zBSW#U3GD&SJrQBqC&?0Fp1{1rc?eh@DU4A%9d1#7qh*H%#l&xI-p8w;9>u$@B6*L_ zJApO(*coFipa%bB&0=|1^}+E_qk)uP*>Bp6yL5fycPQs%dIh3^o2MhM zdySn@*ssiGmnq%GKD!W}#eLG370yX)b4TN_I;SVnqZgTip${`U~v$Rh8aGTWOQB+Tds}vfpq!Bzclf zIXgrRnq<6lq7Um=!2eL*0SshH?){~?2`r5adTfc#kj!Ttaw&sx$kM7&0t-b+k&e&3 zZ6tU9liObNMBnJ+Pwqa6LVin;4*sP)6AqA?Ss8rKt7B;Zs35%Tr00o1tx+%-B-7D# zsl=ul)tia2qos*RaAj@1{Jsw=MWa2+i6dwlpi@AISMSOJ0gi@$13%jl!0gt1)39q^ z`^AHk!I+m?i9f%^u8TK}#E*Y&hcwI|M_+eoqOVm2Lawt-aL>6Im-cwuBdTvMk;L^D zvlnBkX$uxU)Nh!(`7uGF=+l%@2l^R!P+CejyzdfzXAZ}El0jrlHylv-e9v=d*7jb9 zJ$a1f>Lm?a0Jnrati1|+t@JqnF=W$WWdO`R7$nBtkV-_bX^J;5rp)E$emwm+pD}ozEQ)IfznAbSL zZ`ru(=yB*g`AZJEc78t0pv2)3s8v(n0G7N5puIc)`p`1hdN`o8dgHro?lq1(g2T(p z$F`>rBYZSVd(gzo%-7lYoBr@oCdV@hHMLCG#}@uU<#zMhDVj{HuEiMq+*V{+MiUZW zW@aH~|JLW>L4A+aQLtJ#7>Rdg=J-e~!F;G*N2$c%#!4}@Fuxns8ZYEu>CYa@$*Z730GGNePj0;+N-?S4O8y>V$3i!-91 z9k^_Fh=XjtGht!(DEX_+T>*pcuDkThBM<}1>=;wM`DFHcOKpo5WgJT3e50|u0czh6buQd)1Wjw_97idpEvDFGn&^Gb4go_ZrE z9GHoG-Ac~Lfiu{g`r=U(m~dWa>){EK1jv#fo0|qZGT*rERkL7PcP!Inpn8|K=`h5{ zCK*2|*<{N2V+Jc01t?C=R{a8B=e3hn3dJ&LzZO%qKUv6wxt}S_&AEGeFc?h;8vQkx zZ8Ieh?uYlm=GM2a_s5|JLGfT}ZtGSnG9U^2i)O*Tv!K8JL2a@>u>xR9x{3D;)VZwd9MP)h_yRA+s&GtFD`%R1j|+60C3@g zni_3$ZEfw)%vb9GsA#mn=Sn6eGifAI{zM{CA3v0)->6b1yG*)Qc!Y&_uMpFoK;c9>mYb(~3}?o%n% zY_6tujI?T}euejK14<@HVx(ebZ$jiq}`b&kJtc6+wVR(F7xl1;o$4}=e*(y#{e=se%5 z+3`HcetX4@ZQQa|?oW=6;oEY_AMh9W#nrT&gJ;_YfMQ_=|C(Zi)&CaI8hbo;KhKER zn1mnpF%uuXd6idsi8n=`Qk;MEUI-G#6AV(gTQCr$VQX7zL@3!5jVjZ1-8Ig>TaZ<( zK{du4dFjUnD>!nXDy-&ZO$`AR2wXHW_@fqw$Y0850LPGjg;5@9;=M0C@BAlMGbAu? z8(wfWacJMU(|t9qS=s5VMt#HNL5MgaoLCUzAa2U1MuA@fC`65W?0ml#7qgGlylI(v zFm~ZeOm>2llvENeQV1WsZ&7xUZ!syVG4N`0iKlIM_M+6-pfc_|bx@h!Cpo~j&teFu zua3G)8%k@7DpJ&n@cvL%uXyLMk;;o}{jmy^)m70NlS&yAH(V1 zAmqZEv)s~GTU!bdn2kU`&`f61g+;kH&}Zg7y3+?o!UF54-m*lidK)7v0|D5Z)E@`I z(ZFxgp)hGGp0fshNi~1=y6)Pb3mq689{%zb4JKW|PRCGjkb*;arYI+N0F$l1O!;z8 zZusZT@2~iZUF3e2huwM2vjN>2U%SW(s6H(*%L3CbQQ`J%O7CnwhLWggm3^45v6+WF>2lG%dQT2H^0pZlUJ22t}hF+xd0VO|V0cJRN^7=w(dbN2@JUR2|O3t%IH zE{p5L1j`kBzWd%2coI~^zn%FNfLekXJZ+tk ziH(eme7b)9`c}aScGP~2!P*QT>{rE5d+7)r}sOKM*~2D@QD3hu8~d2+~I zdzP*&&!gxhrBWA|%v5(fD=T)=BP#voEJRpv?H(r z0M6M^UvLQ!4=u(-19%o33N8NdEM_(n+Crs7Q_5U02zJ2iSo$l7W>`+ERLEu-_8Mu* zD5PLxhle)YqZd-h(uB_%8Sxyq3wqy%N0&Khc-{KL`b8*NPebQ+Ldna3_5Z=iMr=S% zrVDtTnr$l&f`0_`Lu{pBoco}CcXu034z%WINpVHMHH5y=^mv;$1dLJW%{4ar`TMY| zZ?*q`i6q!CEETQ&Uoq-tEfUt;!FTKHWwdVEldVWfL*Xx#gX7#tu+`3JK%Hlx2`1B0 zwV$MIAHS^I=uwIj0Hu4+MBdpAPAcheKDCaFvPY+CsCS~Ry|cO7xvxuBw^Dx2rWzwk z=6GoTu&)=$qKlUl^ccy$j?~g()^GMOI9?Thn3`~ya^NJaSz1%?Nm2AqMNSet2ZXlZ zO6!pFAWV(M3UM#~ zrguC^0dHMY7+JO+i9CRNj|vF5@`>lUKQm*apsd|V*Z;&|2Lp8E?v^t3U1}~6U~@iY zT3S1&nbZU7O?&Al!{mrfLjGbqjv;e1ELW;%cMcDOli?&Ova;2C;HRoUZ z%ulTxn>4*g7I%!Naaw*F$`*lqb#_3rQ18>ENlDw!SSZJhM{g$D$y60a2gxh$S7P_7 zhtn#6$=i)bkr1br{q6`%Egh2zEr{Y5s_QgWi+FR}H*SScZ;GMDuMlwE<;tJ^1|8@! zWC%WTPf;>O?l%h49t6tcoSIN!w|9l~8@bjSJp7w=IkKV?VFMw98&E2x9YdQ$!pehW zj1zNMM8rhHC%^H~CoZNI}xn%jf-1DWS|qKpBGLU#QS zz+5$_zc5cGwQ9IPyvL0?E|&$A=x+O`Mo9Od*~YfAR-?TzteYBXSd zK0zLNc~N63V#7C(XgyVPZ*4EmQyTHU*W>>W96OOX)Td6ZQv{aR4Dt=1ft0L-*yTqJ zZ6(hu`R0=xU_P((7RFGU)S$@iO8PTf(=qz1qPPI((4GDCIuXmg!2>(UG!*?1B&#I8 zM64m&A%b5Y!fchWqFMK7;efOIb|^;F0v~@Y;^zsK#pC|lC+CXgl5Q4rM|aFjtRp2m zRx}Gz5x8^4z<`@%#I+~-w2e$v;YyYE0pG`VaXvc-7P4;Rq&IjqZ%noAsg<;CU=f1v z)a46{!qaNFQ+|pv$DZv8XAms+m6UP4{K!TkNwlu1ps+d%8}~SMA*feB~mg1G3P*E1MyT! zaO*Yxh!8_1c)F8{)&fsVQARsQ+&<&cL-VU^+9ep=DUR_AzJh6pe>Cc~elLk6-(w<6 z1*mm0vy>>Z>2W&RZ|c)Ys1LD%cCBe?-QX2{O_pV{uG*e*8zhUk&;oq`yaDWRe+zb3 zPbJ$EtQk1q0zmb~Ho{lALo=5I8!)dRjKt;Pc#f*3zk(;AcCq9VFBg_CUl{WbK&xlc z-qq+VbhFJ;uSU=7;^cGit0B*csR?~n^u$Pc{3I*E&=c(fL!;jWn0P+xgH8_}DalLD zfajLv^6%_DzfwYSVx(moo?f`uBZ#cQ_kzz^D88#Rx-BZp7h(S}5jAM)lUs3FNYLbp zAT=x?Kv8R6*wJ>lD2Oblb$C=LlC@!mC&((EZO~-3XE3PK7m=cK0CL=DZP?3{xE=10 zIB%1MTboqABXU12Ki@%qHMZ8@4VY_BoL5L}H(qBNSoUZSgNhaw)P;n6hCiv3v5=x| z0C-7Ds*5lxs(K2&)9VonUMqo4;Ak0zr0?IAXa?k=!~Rev`hP+KvaLudZ;INE3Gi@-6T;-cO7I*}dwY&NN*= z&Gjfg5FQ8Uu9?Riv||Unv|lH}LVs0Dn2lgRC^*%JUd{}@qjv!zXFoqTH%Gkd?QY{xG{(#scT{bLJl8?)=XPC@{Y7Bc+`Qs`i;h95q`!wq zXz|gBemS0=+LN55=U$I!ivtir7Bk!oy1Lq!gaB=JfYS?fHvMH&`mJ5ORzKJX$5D0( z<6x$IQgY_Ha~>?J8hj9w@(|Qz{j-Qc9!OER$EcbsW!D~ej7Obv1KM+6THi2MMVYd1 zNpFky?^G@n{6OjWK8b;W2@;B$@W%ot?)}>W_uByn{B42rH{Y0BiMw&Em0j2N%wuQv zKNh&`f3v`yd#FnBX=!Tdyx=#-x$pdgd{b%nSGnv28hcb>sG8;*x~I()I6yWg z`S!_Qoa#0jVbIJkyr19Th(Wx)Kdwd}`+;Lnho=cn4exxLM&l+9Sb4zCxu=wTx;Rum zsWFwCK|Y8VTzXXaj^F>@SLM;R8ED&z$JbPmBa*E2J946Tx-A;Adk-IP<1bq7BWZkp zGJXfpUtRG?(+O$voTvruF}2RPMqiG4lhh($6nI#a=}l@zc@yYlTV4)^`4|z2%{ZIxg4FpDvw^zpZ5ygHqG!mXseg(o|A!Wh? zQ_aVQMhBpncYzt%1yTKvzfDJKbSaA(>79IZljt^?3aDOa*bu$Wwl4Z9)9)up#_(M@L7`vBR20e59-G ziK&t(E#K1Dsgi0}eOt`cE?2pb+XePN*A;bt3AMbgshMgDZsIpR@(nm4es98qn}=uO zCTJX*;yloIO78obme&t%e}=6qVTTnR1AuTy{tr&u%EUojDM#_yTe&v$5Ci-a=Mh06 z!=trWPQzHJuGqCaD$nzA5z67lz*o@mWsj=zYDxRG%?o*02#g@wcF(){!kup!whOK2 zO={8N-(I!=9`U0%Ll|Lezp*w4?drGSsiJlEW&s!Qx1Vl|oZQ}mc878{N$d2Hl%YWt zTEeLo$W3Nx&WHO8q%-@u8MX(GIxz<8N~Q83d`Lq}#>HUh^_ZzcJjW15fhR$5eHfE6 zg-{j*=YwHGLhtUj;^&Y@FZ9^WAv@OqZ$wsVYR7LRma>ibLg1pg`oVS~mn+s_{cRf64kN?l~D*y7tHOQNvs24K+L$vH4f(NzWx!`H6l z@u?xqJW6&Ihg?{&&ZKWe+RyGROwel|QCn$J{I8`+0=&uhLh^wK^u(?UaM0|xk!^*% zN`&GVeFg`2cReFue?mf)y>D-Sz7@hn3lu1#bmdCZG{eERfM-R34z}f82ito8I*7`u z9Q=1>hi`&Nc|7o|C2#b-JjAK6h|B{yt@jG6(B$yapHc-WYJhXVasssbK2pLE(XS(b z(f_cqrT=YX6RR2eW^K&sL7QA+wjFDl9ypLms&d=QlVP3uuIqpU)$KPk`vfwxs#zyr zqzgGxblhPvZ4Z@7^_h{hy8J62P0eH-u?>0Maix4Ov`iy$k2Kt=A#qfaT=-aE)#-06 zmV6O9xfn+KxqW^3^>`aefMPasMnF22!?P@(S$Um)If%lf5S;fP0E13b@f$5?ig74!FC=H~ocrKx5XJv+g9GXVj$s zsv@GtA&)_vB^$@USzCM&-8(OC<`wu3R|LVS2=>@X7D9)){iF%vDK$G}_m%P`DH_KS z=njYrU%{|w!Uq~e#G%1RH~>0*7|#+VKv+eJ4nn{<96NB5MoR`|!rpa~!N%%#V`84j zsHYc`A#!-o%6`xThf@B?$j4m0Zy5nh@?PV_kl&6o@Si>jHf6f;AO=gLrmy@-#60St zf$Z4po4m+NTY`WCcC38EmN=71kOY2f;}NxQw|R+L4MY4koH6`n-{?J~T|LFUCbiSY zJKACyUbFpm-){c#nkk()jXyAz6&4D} zllZ5Sdp-V}m;nrAM*DYUCJZ98jHt#J_dsNp90T@in7Aco{ld0H)^-2L?0 zTZ$x;piTYkX5(ZV_@e^TEnv;c@vx}f$UeaHx(P9857DhYwBB-+4Sp|8i#b*vO!9aA zXR(D!fxqo%042-3b<@ro?KfE+mAbWFI9U2LVTHiULGxaPU87Im2cMg&Ji4=NllcQ- zw{UO(;7aX>R@fsNxg+(0%conl4s*!hXE?dJJ|SAg35 z@V|AWi(^!tV4`(tr`5@lSV0{B&MN{^vOkV8l`WC1&KZth?3eS1g*TLSSSId;cp7A2 z4caQeNCsN>TIq&G$y@Ld!}oJiptTIbnwU|Y;Hz}SdH9|hOgU34^*=n?yAezu_{@@V zmMtFR+US?=vCz;otRHxEOwq0;o^5vmvLoF|P!r$R!s3p|ab>@GGm z&mC;d+|!noHQ~`zNsT0YnZ^~^-VR6Sh_tjHHZJ1R{AjvMIiCFbra*VRT2_`JY8jv; z$)v`QEC**uG{G*8_;R2lJNiZhmsyr9#K+IZ9ejJVJ9s)uapYwfaE;EQ{cq%=mjJi7 z9IKU|dLzzo`s{L!8Q>XoY&SpJb=rBiqtsj~QNp4Za{u)XVViE7Dx($_1tNbL z1m{O!7|&47B~%doer62%-YGE}%y;u=@aBhnm4CTfNRlObizV6~f64KR?Vi^Df|f+>t~Ym5=!9o)PO#M+2Xmiywoe*zDAUc! z*mcl3_6`;KglTDEVfa?WRvu$N!`KC2{*_P-7vNgMCLF-;JOKA&`6Uc`!-QdKpKXDP zEg@g_zFuyKPj!fb=GCy~M6? zHcRhQG%9S}hc2+8u1h+U$wSTzJyNqnCu!Peop%g4_RwLD!q-pz)5K4g6LP}3d=#Yqagxp@qNm5q}tpGrQ8 zZ}d{rpqz8Ue(=0Y%1V6XPr4F1@oe$p$p5f_#V{;jM-;<^K8q<~3vSe;A70_?DySEL zU=Uk^<<9nhYfEqY)*9GE+=gY?T09P7TD|g4G7oI+japI~QENy^Y~JR+3za+d4!lL4 zx1DKWh@6}sK71R)Z5Pw&n?6~?MR~$TatCwPQ{`uehxm^EM9TZzO=X@rJ0?MAQdW&5 zHYNO(?i;1_@sI)q%ZZ2sT&@D0Kf=Wzy^6A!nSUYHjbC2PnJHD zCCB>lS8>g>kb5(dLFFD~jehLzK?9Uq%hDoxaK&H{u+uVXbx1S$0pU>LW!IQ-Vn?5(r;c4)8l_OY72%H^ zdQF*B(*BT9hG%Q36!;D9!4E!3a*g|)&~JZ&qRQT*#^0CI)N<}P&I9Mv+(fYXNqRU*nOQP1? zDK92Pk9NV&VyiU`b%!|hexe!zCo5ron!_})L1l0eH6$1S!2QWev^X{;RxFRdup_ZZ zJ&S3>xE64Ae0zL!gfYgKSz3b;2j}=YGuw>3pN8j}FSS(9LOAYL?h)dk(HdoqR1aot ze_uQnCDUFQ&3WY^EBzUMCHRh31GgBxfS8<=B>A#@N-}yc=IZ59nL|3SU&2DA;Sy$K zfIBXhMqk!(f0Ih$-mg~%2N@PGfViKCGQOy$7xzzsgBwqrR)sH>&;!0s-Sv39Yu8Gr zG1(K(l=w8Ti-9Y-O`oSvY2LYn9_T>6 z@GYrAAZ8utX*m!nK>m$iW(`N*JYU4|fj8>V^z9R;jX8=v> zE|oGC?DbcG`lSue2jEK*!bq3sniZ6pd^{TBge;iM z(#)63r7F8v|Gc9|2 z7KBjD;qvN_t?=IxFLyEVv+_fvpm6}@_;W|nQ+gmkSnQXd)E1Hxdr~+Ad@n34l#}EKxgarEEyHk#^T<3Rk@k6>Q>0foW$XPKfgx-I}q<@V%3W5#hXHS2_?RM;b zN87QolE9Y_Jhmm?y)pvMhrgU28q*k;NjwWe%aS7=zDOmOv)E+Cl=qO#0-o1F`Da& zB9Xy#XoWMf;G7ePt{R28P>$EinOXH_MsS}8#%p!%$~Bk$ogTC4q)v0t@b_?qs+pnh zdx5La*7!UV(6S_aIq9vhRXH_s`54EtAJsTCup z!I4)0S5+F*O?@zKsg5MPM{iLE04gMO6Uu_LfELVl=59FFJm5ls7uJ~N=946Bo0 z&Wj)H%AX7KI1PJ5s+e^nOwU|9(%beQoW~?j%lz@Vsc>LUxykdr_5x_3^D(VP@Wa=F za^is36R5H8so;pG|LBE3#uhNu@i8s~Y2ri1$ms9St%SLKbMxHxbSxsj$)QF^6c<(% z5FJnzz+6+?%*4*(9~8~Z!?q;fPl4UC5rL6lkI*4T9zPV7QsfI<+T!sSxgYz@x%+u+ z63?dW$}j;z;uHch{!V|sh`1O&pPnhbUvzjein&=@w^?IW=fOp<3C3t+y(*13J=2*j zZwRDZbb6w39h}R6C2JX#iAk#Z{9WJYQNejJ4aFd`;qI)gde|!s|KB5ul=?xIp)zFC zA>Yf1UB;T5-RE2<^EJO*k(>Z7t{*anf+9Q881wJZk zigwtN#EyxIdn_)$$dM##VuUS~-R0*2_*$rSy-Awx$%08vsiEvUIXPpa$Q#OyuEvwIdKO|=U*p`ZgX~PDQGK{R)+K>vpE~~zO=b1Qvk>%2Q(v$f296Jc76e`AAeUR{!D(f1EXk@$ zab11x8Y7OTL4MNF6TXLJ1#WL|vc-!y*x8mgf7#mR#&i@tpM>z&wPk_68oCM~Yt?8X5QH=TtYeMTeV zgYG=itgNWWW-G8zDCYwMRyuCBrRAne)2o1kQ=Gz^?9U9IIb8k`$SmBQy~Vyw=vX3a z61S1K<>i?q7DuToW!x2kz_U%c+sBNJUahANBpYbc&zHmvo|F3k4Rn%uT-*a+V@ z^PnsvhbHcCMtmpe`K%KqPwjeD?nHyEV;yedI~=#(9Zh&)*;i_8Mfb5e~}`5%zk z$JU0#9{he!U<9B!cT7}adD665kS_d)`3o4O_U@Lku5a8Y zp%5)1iBZ-p5k+Mg6e`)0EX5F_Y$1j)k0q&uWUItbN!gcVH}*B5MAotIjCIT~%X<&i zIp_Dj?_Z~Xjx^6b&wX9r>-+s&ziS!&=bwI?q547yI}R;45Sc-;FeDH*$~|XWx#xQt zFN7)M#{>v0>Jn+c;R-}pi=ra3g92f9?lr?I^(>63<<6KA$}B?yCs)kDN~m$j#PbbH zl!U+={Ul=U#lnB8muv?}v&yCY>+iTIt?emty%Bs)=CyC|9rZhW9KqSliyCUl&r<_b zS|k%cq?{VAm8L*>98o(Y1Dipx4@~a%+XIWv1SJsm|4r{PF|iD>@_s%p$&@q2$;v3% zyhz$oUf|}NY$~AMZK+u93@-*&iSmVT+OWVRqXk*ggY$Ct(dut+-_7MR`(7vYP|r>E z;%k<~)o45vzW#s7E|Oca3%E%HsdE%tTBl2Ec^~qH@8w4Jzmx2^y|eOsm2`jeUQab3 z{lC|El#?H)=kr#gJ+GYdt1qY<{3qcx-)k4_S`T%~s{yQp>W=yPSNIY0V~7MX2kC84thcl-!_?TxD|8(;;l(v zl>P>{>$xRptqtc^!3C1B3Mg-76az>T(#%p@9+&Mucx44URLxFMbG^PAQw$Z>3mwCnlORNIaIpXy7dOq^86Fl2$-eOG5 z3_0Mz#1bR#;DJ%$GjvC6wmu~UZp8&NDGkb447mmdxiK4Gw0u{rihlxmy{SLD>T-RP z&=GnOlMf~3f>`9Y@$R`<W6Yhz@w2I-w*E= zcW0qOzL5pe?>3~H3N=PEF0Qekft%X2a2d5QhjfmQdQv_(U=^hDvL2~Ij9dPx@&%52 z*SBJQ(=p4dg9Q~YnFE{AVjk_%%AItBxHh<(Vod59v&f_yqr5*UJ{w-Jog=s)W%JN3 z8+-2T6tH2!-R8tX3qAGWT&bRr#@chGp*RCRjZH9s2)Z3Y8%uRQ;yJPd1YcZII+QLX z{5tmfB^O~RLXkc-Rg}1s6>+d=7)|PIC2>ccxnfoYgbYHc(UsdkzAz&dqLn|eVVy|m z%?*zDl5qU`I_`<)JLD=JzrfGS>+^cqHcjK)i+Z+OOcv^nL&-W_&|P#1rOIK@i8`u` z2K03GC(_?mc8{b!Ntf)Geu9h&SbyYGxre$`y70CjslYPBL#RK7|EL|3y2-E^v(y*i zkMyZ6AwRx9u#b#iFT|iPf|2TxjwjLwYB!U=>Qe=3I6xGDn7uBz(I#4NS|)rJVhlRX zDai4ZD2WLi9*luFzTZZVqmKE6OI?!6e6f!3IzNq(QE2@ULW&NM&5ltiTx-a5%!a^< z!Iac=kibyY_wIn7{Rsm>f$$-uM5%H$EWXVD$7T)PS~Hw@T$}#Mmk@a-{Oqt zkX_g&_+A@SLuS{$Rk|)aykN!r?CH%7t-=aL5pQfe>P(j@%{wx_FUDah`N3!G|dlhS_o9rz+uzRv{a^K#T4tQDZ1%Di(K1 zO`ACXP+%F{0c-yW?|sVhXZRf-y%=#Mu^hGSkb@Zuyd`T`?{?#zSPK^y!0b4QPOyfu z%U0Dr0(cIc+R89**G^v?d(`}{2d7+}XKUDT%k9Z-)mWzWE#r}K3q;GC)z=<8aJ|Y} zmVQ^y6Y7E<*5DC`Y2EAym4qOD{4{HiKwvHUj|b7uetjj^W-I%uaE$(I|4Hj1;aa|U z-Fd@C)ROZitZ{Ie=&b^2_(t1Q*`399b=9}W=1$Wg>H7U^;u!sT2eXF0NQ-6Pr@xEj zU@R7=IAkUjNSJ7ax=1_TYF@Hlv2u0}A8=nE7^7T$FppcGpkO7)TE})*Jb73Wf_al# zUx_{+EgdOCesuXV6~c=uHbofe>i<^*QYX4X$Kmt5_YXL6o91OE=tM;5dvkdmdUD~7 z#|iUq-{lPFM#<=pSEu?8l3aAkQ&!RO#rMo-BW{3Fd@$kcw;z55^DwvP-kp4h?%iXq z4EqRVYYwdwPQQ+AzZmN?#8IksKYX9|DVD>>9!$7`*TCw&GVJTgIs$NDRSZsIAygY; zb>+a;xZ_vtv6vka`snLh0loQ$gQ4FOrGk6fEDla*gTKdmMG6dwmL2eG>3#UM0W^PN z8zOZ(R+Z&fYi(d$);-Vqk1SL|%*3*w1_Za5!fgtu8gIsfb44Vn|F zNMJ=UL!0>5R1Q0=*amo9*ltQmY^G)YkEl5Xj4ywktz~=kze=$(Zy(|PPrfH5CheX{ z!Q9eKwIl3cWT@bUfKmd44Iq?w*8m&Q$=qN*I-hMn4E;z#O~{Rd*`b(@h%=p5f0QMC zpe$_*OVaRv2}@pqFyC>58R%G<&JO#yEn5t%Y+?WpA6zkY25ME0RvVrC&r0hRmM8<@ z>QJiLPCP-|-D|!>gKlq;*o!^s-jjXb6BETPkXmmB$V&mEO3sIP9`oMzb`*4)`dTVo zggHNeVm`Mp5U5~s znTOd?MjQ8$i*}_S!?*2B;?S&E{RO4^2as{bhdqyue|cxupiY_|VVk{TahYQb`6K8u zRlSNskimm_!mJxs2uivz!0OUL_-z($L<}vT=>-WsIza2PrWufc1)LUFsP(c-UGE;( zYbT2Gzun`Q7X)rd5gK8vzWV_h+Ej)*+Vn{CumxpJ!KIZ0!;mo+S71%ieA$0jcy z#gi)378(HfoU}1HYBPBg1zu7feH9h?>jIORq|B|PJna%L3)y-B@?lP|+)(9rnIFyW z&U5zFqTE^l$wzmsm&e9)k0dISY_y{{gCprN+g<*)I&k~Pqp;QRu1!n7uGlNro3^gz zcQ>$VRUcnt)^GdV30J@+PSoJn&U?@Du(YKa6Q}n(m~*DTP`HXVd+$c~;ZAwp$9HD@ zo56_dq?_<6>m?POl7C1t;wg)I{73-nvUcG?Yl4p*Z{_Uq8+ZO*&x$8&%zAr!f;*1BNWmAr>BWAH zrZtzR|7k9_^L^9339&CGAR=tJXqC%N=;V%;0 z3C^P~tI`7ZlYFQ4Bb%RvhpUv|{h3yN%3eqPLu=G_+V53BfaqSt)R_W3nlowZUj7aA za`E#!wk=@EvC*+>GM)L2IV+s+zjP;u>)BrkEBr;^k>BA`MV00;MV@&Gd8#DFRjceS z!=f8V4-p&q67%H%vg_AT#b$Q)XkjU_#)|i=Eg*Fc90$VM$-PXMM5?cmxc zYA25J`i`a!T6nN_~DAG^(QeLlC>d<>+{G(j5kFm1p=;y*^SZbDqDgU zxUa?f1Xc(PkPwhcuPOC%Y&a#UjsuyjJ2PXGfmgMz=Hnm`EY&7yNxkPTUXPU7wyare zDpb4=Rso3Ist~0<@H!$qYR6)Ko^6>f9Zj^r?n%7f zMpbwyZ`2wxzcSjf>|;c9YNP5cJT@LE2A?9e{gMaqik_atEPPO-Znk&5wOpznPC7Q= z^$31Q)tC0Yz7rG>2v@&+-}fj&+?2(mkqb-QJXAIb z$X^JKA-?u-sX;RV@VfQ97lhogh#J|YRJjMrjJWrC6WUBDq}7flg|OkN>sf_@8=DV$ zqw^MaL7V$Xo>b4`j_|3%)HWAyOK4dpg*?*-$|;qY%g1Lql16f?!WZcrGmd3B9G?we zWV}Y2o0H@?;G4P5JoAdWZ1-iE!g9o4sd96adsGx<^q<-@kyT*NV;E)%Q_D?y%-~7q6{#XdV5|&sSKsRm9Dffm4g5ZiM_r(A35sox^en_( zIzjmBM^nkhr|m4Vq1}m`*e=fav(W418+V~{vZS)26Tn{T?AgWyg8pGU@prh>wa_3^ z+EFICIyb=3@W3gxT|bU3%n(!gd#>QS-m>HGN!wfzp~cs715#LE3r1xpXq{|Fa(a6D zT{=ixBy5T1@=>?fv%pyRkkq<9tzz4hE=yiTyo{fiUP-4E#Uu|Qe^8bNX56{ohM zeDV>O{M3Ab8a6lu1XBs}Y;`tN5$yH9hlqBDTo2#qU$iKc9w21KV>dE~F#St>L;(gX z|L#`!1%fUmKw!l}f)JwFCO(PdJr;jlsYMxFghXhm02o*XvGXLI?h5dZyvG6U(rcW; zfCOqvHd-gI(YJmHCVM89FSUA%WtS+YJ-}gQ`ojPCme7ZI-r>9JM>;9`Ods9FJ{~D3 z_m!`)@Sf(rc8iIr^*2(I)@uU8tr5+w#1~ZRp~U&ett0|59GrMW{a(Xc#3$nL^7F0z z^p@Wr*uJKg#5qSNA#@zhXBxCXxqNitPH(S778-9BShxo%hJUumRY)U&T z+6@Zy%&9}CabKuQiEZCjK0C=!PY_y=lCN{C)aGCI{iG3`2>*AMFS~RU8UWP|VILeg zhUQL8vZIEtKgy}u_hCfWTe8ex@~;erS0u#Uze+i7Gr&j2E8^!V^UJ`-y%o07HCAcF z((Fzf^?&V7zhD`~E=T>g(tyUSfZt8B3V)eGXOX&{OkA}2^0`1)PFYPLw z1@rdbF)W~$9si@3O@;7nl$njDE{@iAZ<6|O#84D!1jJk#`KAyppI;$vz5g`M!tN+N z>UYoaWcXfVVs|it>g$-8ZT_dcB1Vx{h_lf&4iT-oIx;=~kHk>{jV*PlP##Dj76=xs zLmn#}`%qGq;B81rJ}B|=M5M@T84a9VfxYX`jXARn+_e?t0Ey%~e#HpYw*qx<%xvAu z5m!F8G;AH9-`=T>Y|O?a@+^Y&G44a-DdnF`c=n_r5B0r-e-ePJFtN}df`Zo|)OF(9 z|0?b8$ig4V!H)CUSH<&ygftKIGtc2ehfeL@Mqqs%YNtj2K=Kc^o&2*_S3AIVCGW?y zDTQ%|$laG2febRoAF=sZ33QKOmPUiF9HdlM9&L$Y$Wc=r8m^KS2*FPA3dJ$7St=_l zLpSaiba;%^J_%8r#JxGm@KSAWQaV~~(#UJ(Q>r-Fc0b#A}$yZab2Iq6U+G7^1i`kDT(6qPF-@qf%42o~u+!AwJiefvlYG zBx!Tl+~%)Fx~sJ14z)Uy?H`lWZxVGvS_ff19`M`KYj?FGba{>)y<(n07pSw{-ZDsEf<15gKVk)fs z@mfMYFhAhr$^LO=C;a@gNCV4mzkdq9>(9W)SnWaFG6Dnx-%zavvqtJjIb2x{o6|Gd z&M4MOKL4d(Dk?rwv-MP;D5;E#m`b8=fRrGklU!4#qNn87^_;|9?64CeyJs>aI*ip# zYTX3;sS80~|Dw+ags=De?re79f`_lTe%OdJw z$ICtiT_<+$AOZhG$x=iiFnW-9MZI4Z(4mYvuPz!-0kO{F|0&kR{T1t8{TAy^mp;ol zD7)M;h{}aS$%oN2LqyN;ZK%64Dbk85glQ`_=qPX@Vd&WFUtEMSdL)akp5F5A-Y9g* zE9$NN%qi!*lxo({Rz(b9%e-y=`m-Yd6wpk(6`q-*jV&?kwMbqu0MEnbYUtjYxTsfH;G zCW+RUjZqhHltij60Eha2Z`;&rTnv(KoF-3ok1)2oSPRymE+|uO!H)R<_FMV5)|MNR zmb!GgTrPcsEgd>m{~+X+N=t;7OtS6K`L42 zHfB3RY}of9E{f`vH4f8X!V8kJS3#AtkL3RpvK+O$lmD%mv*x+)ajIf9^Kw7tbb7B;-C=enus96?(vrwA)lmHtf;fYQPq^XX zN;+KNjvY~98>$W6bV-;29v4i%;Qa&=2z3>XGcXY9LYH0B zAaE+DuE+{hqVY3`R-$~V^7;0Hr7EhbOrZ?@?;s)yGU)->IR^X#(Ui!@`zg} zuP&-J87G0+z>^%Bo2w#$TtjEvQmO-|1pu|tS)@z%>Y&+~wza3QH*6ggdTDP=3p{4# z>No0h&x6tvAjry?1t)vF)PIXp7C@bd?EB&(+S4qZVK=Ac3*3Hq zVzQsI4H6>Es|~`>WMa6mu}6ao$KlErHm~TTLxkTw(+%gyscX5U#)Da<=kT_xyBTSI z20C5WmEC`R9938TByDjb{8PjfvJZ8C6cNoiC{77x5Nuv;LN3O&yiZCYdHyLKX@SJk za14Jd2qa!JuB6|Rpuwpo#jb!u?W)1li~d0%HET;><9->Sc0jF=n$d?nEn{!UGkexiu_g-dF;o?OrD20UrqmVwz`l{B! zi>4#eI2Sw_%erMbNolm%sx}*M?dP*skH2vIiRS2-Xk4NgIi66iVfkz@{YZLp5^yUc ztiZ@#?2Xu@J~gjL63Jj%2hAjhq-~#ch&bR9GkpH~(nm#^A(~Cj09ZhL&s>Gdk3RE_ zwsp(^iEn4G!yHBBKQ_;^%L1|VLk2kZzDfm;3kr}G+0cU7m%!F<)JQPh@5YGsa!ZiU zd)AbOAtu4={rs=3pBdk>2d2fTCC+$V%&MlM)@=W-km{s+c_}iRJ?XgTb91mfUj92F z^vpnjz3IGh)Tc?%Ne0^bWg=C~iQvc0&O~%C(Fpr}@FC#{gFI;2%M zJ27d2fz7aQ+tNB=1Eek&Mi3asw0v0nB2md}jyI#3{!EG~GlM71Q=Vt14B^aw*1aua z2^iVmn8NBvs@3>13_ehcFR%ducZ5a^Ng4v{0zTkGz^(wL*fWISKJ`!4Z)=H7dRM+5 ze!{s)IR9vCQ-DoLtT?t!j4;qt=J=kJSBOo{U1?q-Zpn~fv=^P^_oLhykKDs{7&rs$ z?>P>ZmG6IY;m+0PNxK(PFoC+McUE4Dbm}R6e$;0*LT9=B2oS9FPkbcc<{&<*kTu#)_0Dtr5+vq#&fux{ka?i0|Hbir|3Z; zOb>YfT4DqrAD>~gV@BBHr6t!ae`fI3o~2S0B;%WM^v{&#EY`r_$%fC`A87z~m>`WE z=JL{9(epbPs-EW;T4|uyESifuPa+~@|TgvDzgA^$6X(6@)Nh>T^WD zp#BK3?{?#US>NhxHL_*)d#VJ~tZ58}%3gdJke~tPqrQ;;IGpI11sRU8HPhRUTvI7o zc5e~Aq1d?scgr5}SaGinl6eDgKY9(bTeVN)Xs(|x-mEK(TBvUpx-y+8!Z>#D+U*;GePwzxI4Une$oNn(@eo-EJ-^qHyzDJ%&HWL6b#s>MH#Z&q>nHiV{}kAcFO? zn}a)VxYtaGuWKW}Z(bTcsP(RFz7qVF0cy%x33_KbA@j}lFz8pvwIz&-TWsncz@lOj zgsNP$GNmVMZ*rifd=qshn==IWSr8H$qj^p%E+`ayy$b%Jm8Dg_&a>Ce+Dyp=p`Q)3 zodw|i_j_qUAvXVjT=P;7fb+fPDIwbpP_hEl1Z&vX_iTqXBWFQa^S~Dn)?|5KTx|OK z{UdIW9SmubNj&)}_}|R3Md@``6e05LdI~ti^yY)k=+F_%s~=%bC#;fdUiGC=*=5NGM4W!4}F$`_da8jtgv$K zD?Wg`B>y?-jSrR2r9^RAte25zVV)Af53e766d6!t^)L`3b^1u^JvCV)i)!e$_dQbF(s>Go^Fmst#%;1$Ne$c^&LHmvJ?K4`{I;|- zzMF?`p7*Il=ke&wr_`^h@YVr3`v^S#Qxrr@=Z+b!$$T2J!<6O%gn$jOe{g;tI}dB8 z6X(}lqm+=A;cTaPH2K_a+LM`W41p#3#x9czp$YIWYScO0#6poAsQlqms z_>zogrz6f;7(->@Snz7^Tlyh|9qh<_L)AE*eXYzHwXgi=N?%LQMwG5{wy5uUm9j% zVtwsnn~)O_0M0?URjaPj!`&H?foRV99d$RKBzW5eIu+fy0azA%q#q%jkih5{@>D&> zVNHwa(oQ}0fAv(kt2*y-b=i(EQ`F05rRM^r4D1nSg&YJF<2}EM zu>~A+*N}2?6hLQbDLwGJK-F!&v5)_|gC6GWTg=(;DXfY|KzY~q=7A)NkRq2WqcSJK z*$c>FPhs)xL(i#VT16UU24;qjgb?`Jr!>613;G_y(cV47WiVM*xcB#Z2KWK-J$o-XtTC(U- z)<^K540HjHRA(@abe7X)A1v|YJI`GxcUPFp){a-y~;hf8C9~89*^zn+edCVz49cf z1%0vLx$m^!oYr#RI7hbm`IS4fEfz;2Q586*k<7)M3fIyKMGsH)V#;^E4)}finc3n` zp>_MOC+rvFYMz@bJ>W=wnrXC#X9x>~WMfS1;zGx$z;=Xak4%>`QY-4~PHASm2Kv7cp8~gG zGPLSBXDR=)nteI<-wOI7+K^_X7k)i57~7OTs<0Y0FC6{UI}Pp*jfvo%W^=kX6LRTa zT~6VeIXwr?Yv`v>#~1YKsPQ4N4-f2O;Jxoaw`c=S|M2Vx&5nti1p2Omuh=s|^UMu8 z#YlEKH>F4L_Ir5R>57fOmWjcNqJTnev7Bq8xYp(*sY{mYxBRA?AlPDneUn;Ie)V|i z$cnq65(-LPW_>_9M|GY>i&4|}Q1g-4YV}izL)vwp?#Bw>Svga?s5M|Eul3*^IK5e` z|L?bDmN99_=5g7MvN7@rD!|^2lQ`}eFWo{t_Of|gREC0^lYh3lkgqQSfkg2WMm%cy zpnr9r7{NtgkOktH~oP439=grCXYY8q_|$N5>jO9QE$#q?c%=M`DC3{o3ks16=) zwe_ToaZ&>jo(S!#h-EG1IC{7kv~_&zjyoTu;RL2gpFPR9P~R)gp|`h~^A|CDIu zSmikiKcagybW{CkTLq0{7SeQBr2ORtx|g4ac@D4~q-9cV!Q1ah2UNuY*Bw?U{l{3@ ziakE~C)dhzh`?q}W;>T%ZK$VgWLoMeMV0X6A2E z^yuJ%WvynS5*Y6{XQ^Ce8ufpl>U|ei>3P*d)Z~gBF5!oV`Wwv+8r)kri!j}-rH6d}&0ZpwN zIVlV@4yb@`aCTed;Hnt=qvJu~+7%_j*en3bUwUdeOX#O4c-I0t>^Mi3g@)hhJFj;e zjzM=jM$*<=3%10(ghG8vR33k20ue~{4a^+*H<>e?(nBKzPrkBMaPGAjAEa^lYQ?Dl z+g3`G@Hn)V(+P+<2sUihwPU38xU7y|0ln}!&NAIyJD@am>!1-bWwAqxdxImoZaOkD zjYhw0J%P~OGz@Fo#LuUjpJ8Is*`csm%ET1LCU@o(eLFpVb=6Tg#rtPM=Uax(B_>LB zbcEXT8Dy|rZZ@kkg;?s9fDs1CmgGo{VPQz8>2w;=EA%9!HmZnpT zqO)1|q*?&%DU3zaN>pHOA;sgBuc+UE^G=)@>*9K{d1+d6Uxh_ZH^%^}e=Fh} z$?JBF;W36f$R&b(MVnyPR^oVO-#`e(ma6Abdyf;k2i&&nEkov?I1T{n-@wNcVLMg# z-4LjA4D9MVlZEzmr4SW##mNlfKy=+;@MkG^OB^ii;$HJd{H3{(AxdQ5r?L#V%-J}J z9Qv^~U-Bm-^!>Fq3n<=P1^6Pz_t{tEGX3xcSL_NN|b0li@X#LCtOF6rpL ze5#P}9@8F!J`Q7mgGV{`knvS_0U85@15?vND`lVYLQGxaPNy>(_JYUSJfS)3x%p9s zIg=61>u+A&s;k%|dGchf$uq8^{Ll7!Qnzx8-7~&_X*>umrozV{9_fkOT5!;uNjAI|Lui=${y6$Dtfo@#3cAL)!1omNR-gqO>y;!gM6ng9Pob!qAjq7JyM zcSIFjl8|5ubF>lc#*kd7^LEjr#eOJDg5?sf40%hfp1Wn_qZ^$Yr2ST-7$u{%ia-DW zF7>21YZ<)xJQHb%>|y-8XEwwc<^0=;DP1b3$>P!i5AQ65bwF;u{!$i$RmWV9bij_? z=sa2fwD?%*y}M5{5z}BgU8zlp>WiaEp|?8rwoGVCa_u%$W{b+hd}TQ}%MS9is&y^M z)wq@oX=o-}0nj{*rXja(_UlbIAc2Px#|E9Nj54nif2Qe`Y}jRET2F*Z>`Yju7Ia&r zpO9e)5()fIz4LAhM<%2eg8V}xb7K};kPNsPs(^e+U^OScT0TkBxLfN9F3EDR{Ca1ISnq-FduSzQ+J8d{B(YZ zomUO-;EQZ#YO{;Q_-Ghiw6vyto`2-*4S5#I#)Pz16_jlTCu9zV+$tz2h{<-(!S6^C zd*tRoa~|53Mpf)PNHR&UP9RZ=Z-zsrC}mLV6Ttt4Elms6aQ(TXPWZVt_b+(VQldqsu z(#IV8hcill7h=MMzwMzd#heD)*j#8omFNP-{;g~SlzivEUzUdL6_r9~@`SiTop^!q zH&BEX{YVmPx}%s&k8gsWrM^;hs<|yXA^_d~6AWiZ6tW%Q`itmu%Jqpp3uk)?PhaeL zr*Y>c0mAV?O&QB-~Cmc@xa)p7FvAP}^r;!Ezi$ zYScMXO$bL(Z2kLsSF3Nod5R%_;ro2j%I}i?>^Fr0K5tI|JsO##%r6WqlOxwyk)+{o zo|}9NVIpygc4>pyM6AVRi1HTeC`7lSYaF_xhgMbs4{5PG0$TBKAbkGwrSYYb*Tov# zH%XO?RU=qlrAxCrwCnjMb4@ZXe`viozCr(dppWb$HOfx$d~MjZLzmxvRgs`&ZICqt zVrt|3Uq9^OO>ZuhdX@2Fehtt93QOTC_ue$@5oBC0e@oQPr zB8*TpXOzwE_VcK$%5N14RbBl##WdmpW#r=qnf_l4_3f@a-)BXZi#6sr`cTVQsN}x< z-ks$;Xo^#});BkdjO-9M(^kX&jKqlHBfR~;L>bn*sYmevypUNV*r5W*T*Gd^9c=IU zwzylQ_6Kd3(z4GFKh9H`o#uFHN|sgd*r z$xn40G(c9>A;Ql8{Vp=IK$HW5f^&9oGEbc_&6Uw*$=+`uf#wGY$>z%f{^xKx|9ZqKp<=`Nbc?- z3=a>BiXCD=CrQ8!RhUrf0QyZ1#R9=VwF-WLg+g7SlFk}0h6+mJN;Xe`O(glBACI@} zs}QSCAO_c^n;utg9rv10k`OMvx#Xg}PBr3Be)3Mjh?K<_7p@9uqadgFb>D-n=LG%x zLEVr6Pt2eKS5cbQTUt)$J^L%~>|2;Gxe<7rs5D1ZOekYsLHI>D7Rf*?tUgbBASJ}& zg~#_mIN-cpM1Ep?iHW4u&*K5NlD~edP^{|8{$)07Ocox?`{o_WO-xH|;iDvcbzRV8N#+>+>=oKo7hD-Kqn>M)lNi5?ZLs zaWNjeUHOReuR$ZBkdNbq{sJEbA7F3r26uC3a;UiLU8Nsl`JI7jp zWeH2TxfHVS!Js3{vm=$YeKeM~DKNmJf!v{|zXfn6R4uj^T6pkpq*EU2%#v*WGB z+wj1k7u0V%Ih(tD53nq0URxX`yS@!%BUEi}wc-#e;eQ%Ey3@ABCbuW`beE(Fw(AA7 z8wY@}nLRUXlHC&PKJr}wF}+J`d+f|DVV2=}e2B$#5`%cfwp9ph&O7s^;$~LPO?t@j zz;X;M^uELoaD5Cmm*8o{NZKtT_e%L|Wzr=u=oXbE{VF(e`(-PtG4fcSpY_6 z+Ksr9UuZ)#DVD?WW64(Tx>&HSQQXuRen0OMeCzX?U`MfnKR|-bu+3i~ z>3`1K0z2i)m+Rvj0TR~2f683Q(VrG@3PUkdcO8#i$^zC0$i9x{wM*28S27xuR4%D3 zacF>Kt^fx+^OB!oR=Ap>t6dC5a)1R+B@9``&OVN^&dWLapH}1onF3Z6kfHZO4X`6) zEW)S~Mo!X2zU93QcRKQ02gb47`XiJ70pvP;~}?%xwfb!V9$ydofD`h2Se-D(8; znxH>SnYtT_CPJ4FIJ`J{v{w3^hS~|`OBsc}dqwoqmaUm|!Z1`lD(mS3X@#FV0^}JU zhaKLIrZrHrq0f>B+kavn{M$0~zNvD_9#^q>VoMe(HD1s4{dR7K<4+@VISW{3qSN`r zu$vIr5+|>l!DyYShy$w!d3qW(`s2OK-FKq(_R%Bm)9i=s z1{N{o0p3#+8W;2Yi)@L5rSP;>+B9a94}&f9h9E2!N9b|lw*VFG zOXCbh#%uc=-%)*HfBF4Y_W({0ydpGAjs?c6i|K4uNSC~nnQt4KU@f6QCUG&VfDVH7 z7C0oA8Bp+wW%FypcW3nghKb^H!+sA-i~VS-5Q;b+j<#-5h6z=w~o)L0{_s z_zY2qS)7CwC-j>@mTo7EEg8J1#0|sr?HhQ)hdt-(kvgO5OUHh-R3CqOluJ9>MC|G< zgTt)ku{f@UkC(HR$>)fTx$mNxqj#V7Cjs*+_kwv1l#3SaZ`$;!R;@Tpal=={QmXl7awpgYGeI6enGMN)!t7Q})rj(z`$vX3#%V8gJ^2!IqhcR>Fx(_7dc6g6 z9<$j4ld7;vk)TxKI1I0Jy{20^NPiSd9%8t>B^qOwHlfz|_4Rc!IUK4f@i3Yn7^H;F zWoN{ zJrl0GGz)CS7_@H1cfpN;E`$N*O*M54KMrp9Jd;zkdBpvpkvooDUfglK1*E}_`=7te zkAzm!t2shOo7c!`QyO^%`XY>S%`Ll)YdG@x!O{kDuqblgGNx>ec}LN)5vN{lM&{1n zO;HRld*1Z!^Z`L~(u+%P4jWiy&TDWb`>sbJqKUhDB8BOv3sMoHAi>6bjby!^ktHs- z8s_zgZ$lgG$e7D|)IHB}_z+?D07UuxyQ)8jJGbqsI2*`5|2I~}uG@bJl=K+qfs*Vm zU%trB2oaOmE&UtDten|d?$wjV4$Oy|-tZBP=Z9H&zgDf*3FPuHZ@He+GkxiVPZM<_ zu5Ghd^ZvNQ!pl3(q;)E(hec%iE6>vD*CU~0|EP^_*brRc8^%Ttt)`79XSWrJV zP^XU*ym|I9S4vlFLMFjigEgMG*Pz+g#Yem6rM)tT&<^m+dYpC->&xwfZEp)^I9v+Q zNo;_Th6WxB5$dpe2aRGZd^S92&Jgew2b++zylz?0vFH859snTI60#Zt16*zMgU`U+ z)BKMtIFKTb)I=w&iAW(#X)~;QGXb;!6C6+utKhODnGXOKUlQb5^ zr){ErL$OrmT&>%wfSp@ZxjN%n9QP0};j*r;_-9H(%!|h(vX;h)gVx!9X&m zwwBM6ZVupMRFOO505o+YE@`C%FUUy(Z$;w$;W2ddzjx z#Eag0(iT>*!Ul?}3U@(s>soFH7PL z#4uvcbMHP95U{gQOAVME=U822%)W`uexmc;&}k^tO{_8D-dWP|FBf<)&d@N}8gol(tA2beS|6`ukTQQOTKRmq9Q(2>(?^lPdqYLFB^8)8PMsBKzaE=SdP|Zr+Ij_` zX^dnpz)0rWZV11k2mKD9nJx7=RQ+n@AdraD^WRRywJ&X-o#a0B?_nhE=p+RcY4@L% zJ$G(nHO(j;e>GKp_bVn`)`9N{LInh2?bx~NQc1uO>RW}ri?bQ636eyJEwk{xyR@1Y zo}`5^>=9Cd3Jk>=6dtVaB|rjiu9{?y%xt-C-B9WWyc6XZRJK zvDNNzA64EBq)u#wBuZy|`uxm#!){JDzuazELWZFw7Guo_hT>x#Jj}ddl9mz0ZKJ($~^fDcmk0*XuW!js>iu{)@qOP$!d7&oRU+rlG2q~Ut9=8<00_t) z0g#BC(6DrPCZ?h;`{n0!uK@(u2L%g$H-`xPHror}nuhS==OK%V^3X$-Az>UIj7zo7 z9R6D++PX7i3YRwjT;f=uMmqAaD0Uf(4eRR#%0a7Pl$LK;BLAs^A;Xc zpu*dy0V*a+6xwFRG-6^PF=${z*BH95^|&u$3g;h4Ioyl_N+%Y7FypjY@~Ie;bLT16 z`(}_eLdGT)j>_rV3m=ddXe+c9IWW3Khqrfe%}XoM`bWtffBMHUXHb#>Pg>q6=?6T=zEqUYI1vH|Ew*Cj#HbpF}n<2_y%S9HqBWv>98&_!h6|!_srw~W3UJq6KBU) z&d$KjTCHt2uoRk8IMq!;8Rnzh7u%_=%6IAwZ6A?uClMWa5TM)PRp{<^M2@c+K$ zB0-W+D-&e0AA}i2fYvb})`LY>?0Jq#<%W7EZ|Bhr=^T}N=>ltJk9J&-p(q}3b#obK z<{a^4^e%7F2R&{=7qS~bb$_q>D$T^aMV$?%R))t&Ui&8J`w33N1^-mI3PD%R+49de zOF|5!kgqX|cGlW}XOHJDyS~`= zfj!?w;%6|=XXPOJ})TKK|=<0scaRY2K6gBQV)EB1}kA=T?C`~qX? z!ycPKOh8pBgzMafw#S~|O6mP|Pk@Nak?DAhdr4-d(_I@I8xFyb1oKi)BbiqEF|2%Sd$dk*?E_*jn#>&fU>bj@6>_o7{-{Hc}oI!4Hf9-RM= z|Ga8LiAP$#Yo1k&7k^f7^x&<|Em=bI$Ao%w1yZCSu085BqKc%U+6XI|2WexPO#@Wi z;JXTiB%UbG24rd!M0>o&%OBG4&Ms619c7;_q3GE8 zf(pd^5+CVZq{UVVPUG$}Qj26qx3;yr-k_RYhuIw%EjmF5gaO}_QyStK*Vu9|1m@cK zG#RU$o?T!^nQ!jcZoRz6j!!VWCCR`m<@$?;rR|{h%1XVWo^3Pqw^DY0h<$4n)t(Y_ z(f5ie8q6O?2E-SEL5v$VN8it5gE_woSti`aoqO?X2`ekb|LV~;S-Aso<1o~a@uM8= zFJJOOW1Y6^z#WpUKBqAzxVZY=hR#rM^nO7maj#J8O0N2FVAH-0p_DETTP_kj%R@O(^ z_dLdujT3s9kVQT1X5CVvxYtA0=p7A+U!#y08P;F6tSwDuZT%$puR$U+e^E#uJ*@{v z;PU#2k=Q&x)NKg8#hb|}@c(B#P0N<-_0+c<;TC&-teqBp|Miz16f$X6bkm}M`tAnY ziV9sGhqc$?9)WF#7O<=@l+GO^%=?|pC68oMRGCs)hRD*XBp~J)fi>nHvLgVZ+y~WC z06jcuq?{c%eyA%E{knHPQ!2-9f(_{Q7^6fD+F*4^KBLM-d*Lwt%jr)ZW8 zTdv95TJ^~NH82xGleAR7!Pbol$!>5MQPcw>5OWQ?k;{}fGJqD|K;bt9&`GIlo25Y3 zdSZ2M-T!|x7n=*wv{y6MYcwn?e5jjm$@lKu5eFyjT(7(s5w>R{>|NCodiigQS0($( zoQ-09O2MTRX-GO#%>wZ}-M!mC=cGXZ8+>sVdgOAcAm2;-1wd>#GbbL&Q4bf1>p6=D zM*D}2@h)KG&QtrESG`Jl=2R~`V0qwI=k2h^jD7dl_8ssNBYj%9r=W+rD@P4Rn^7>! zK?q34h$?1(ed_`5lFgpQg!TUdm*a(mXG=HP+xRO$4>dLs1FiS@t=fd0y+wlPX$5#U z#uw{{G@@0~*~p%GQlm?c3Opav2AHzOSsY-^;`51J9|I9;x_w&T776v2vn#ze5-t9ux<6nYE2RpQ>W9Gv$w zYWuFm4*CCnxP@*tYVyif1)H+Rf2j#aojLus+N>{Ba{nG;vvjlX!@0&6{;Rz|vZLxK zg@%-oaKB>RBphgw+hNswiB`zdq{#}(`ScF(h>t?s@%#_&9B07RL9jP`-~E5~h9fPT zh>BVua@L)BWBq4W*LBSV0azzJ+u}>5udS_-wJ)Dyi~SVQLUb>m{}L5@H<@bUW5?~V zXS^vn57TWe;zjxFDDh3U2+wx=Q!8;d)Mlu|FSmYIzn@}q)lYUNuCCduPucs7h`A9E| zRvzd$G0TdqR3f1VFT3xMGz5DChdMM}cTUFfR|L1{QqUWembOnb=q&2)bC_?o)LlDY zb+2JHogGaJtKLR=@XBb)LwS+$#;9?H>}BsD|Cd_34uLW(3jqwfK~jB_cKCH~cPcJs zmZ4Hx<;WB1_Z%!nrGck4Sx(WWy`wx1XCF$enDmXjmQ$^3Fbs{}gx_$sD1L6SeH;>u zH`-cn>emDR6b&tV5Yleg4>mzT*iGa%CPfmRXaVhljfdT{DYkaa1~mdTD|qX^UQ8pO z7aO99_&5&&2S*IRxh|}+TVP7olw4RuFc}OtV9`NzU**pH)=`YA<`(NI}w$@ zMzgszD%!um8SsAyd-HIp+rNFB+{m7U zWG$6!5k=OCl0qmX#3-c27BSX&BTGf3FeFQaB3Y81v1CswWoPWN4l|aSG0XQFy6^k* zd7kI^{r+*tp)tI!_jSF_^EzMW356d2=dyDfJ*)js@GQb?UbDt*KkW(<4lV&bHf zVTg(I%(cW%Mal1?7IU0_Awok?PQyBHo}`E0q$~9IT)Lomf>BXTr}^o(Or944s)2d; zc<;StZUNp92C?2h&FQAIot7W1tnCRfg+CUzJUEpz z-VyH4$As!L_i_wNi4A^U8ep%{dYyrViNE2YOmMI4 z``)ZL8JG@qocLoIA-@!rum!v4wph>s51^=NoXA>J*!OcgTKqqqB~nye-W!O`l|H{S!dGk6iGM+sDoK8QBnv4jqO3pJYQ)Qb1K=M;)o{jHh}NE#-7>_(^L9 z5Y*KM_DWAw&%-(=jwVg9!TJDB|yb?Mo4cq|U zb|+O#CeL%K)|aQL)h|_5S62!%fXL_dhd=~+U7iNvXjJi$JW}og@Pn;h5(ksx>4Uh| zwKS+V)L#h^!Y^p@Ebtx8R(Ry1CuJqd26e#d;1J#f!J27&URA;|Y!>0ykLgYm+qqO% z{d50H`!254xD;%SXWSxZj{0qprGA%Cf<8Qem{*>+Qn`8)&V+1O-W>_~fZJY8uSMv$ z===ZJkOVdq4uV;!vK!tO$U*$(NZdyQnmY5T|6EBl>P(8&9lIM^#_V8ZBGCfKd(qNc z0*)2sXv{yCwb7<4vFZMW^B~R)81AlxS0?A-%1}^VKrwwo@z4zezA}LTpJzx0{-VAn zG=gZU|5!!P|6WFP(^!uG3w)m#e31ziUrWN}eR0rtc^ z4-Y6%AY2wVbzhCH+Ql>`=wsQLqCnu97c!6i*IeT~P$h{G+u}@*{j7w1S0@y1@@j+B z>^cp7U6s1RLTpr?korylTLEvb1Ic^EOUCVuZKK`+9IBNcb_r^8|U#bSw z9kr>c$>fDy+sb6$+@gXc*CuQ!m4%!h|#o4DqA2gL<=6oD=4)lso}#uce8 z8bpPV5dM?}MG^rLn10iH!re-=u^iaV>C9gkW5@2|E8Ti_R0a|zB}-%e3H-VBUB_^j zZrBL#WAy=KSSDur1_TT6=XCdNvcav7fm=%fz|NkJr!Ao=(Vp7&>F}Q#?&-9@Y|GHy z3Co2HAc@-k$=VoCXR$zn6HtcF!dGOW4FJy9($&3m=HSQPrcQv~f#%kA_dt4q0%ixs z=l#gd$5fHBG;~D((aO6u^9bop^b-Zl0j=L5cC~odPMWn^=`-|OnA-xp48J?-=o2|D zQKy1;?457U%Ef)A@=sex>)vsw!%@Bu<w<%|2KNnzq`!Q5(?sj$C-=6Za!^)s-)#Oq@&-x&qW$`porj&r zg)HaFU`4T$XMSoN!gq4?!^$boPoS322uqZ4i|_Hs|9rv|1GRhs2?IbtMG2iT|EGTH z%r39?y_ccYPp@1n?>HlZYHEGHw9^HGmToFn3o?n0mZr?k=EQ>t#T_dTardP+o9<30 z{2_l=Zbu#9ZEMx>@X$2l@UCOZ0Yqqfc9_Gf2c)>K8%jlyK$w^tjhEe*-eCmLs|>6_ zAQkVV%j@=YLiwJhr3r7p#t$r-Ct)IE16IKuS*u(A_8pm3Ume&8dFQvDb$duTj`r;d z3p@pMT*5#9*!$*q6*6V;fq-cZJ<<#|-fhQi0vc%A{pT80;6zgApU{x%CLzRcsUgAd z=Z@VHJ)uW!la&3QDXFY{--AoJJyCG2=;+I&B>T`qJIOXDLX7Fa{qT7el<78d zZ{JuN(pQ*LFrV(^e0hLgJLV`xqd`52zzd=~)e)A(_DwgSQAmNRv_Fbn&g1?$*y1a) z17k)$v|Tht6wfLLKh#fYc)2A&LO-}4kpRR_Bn-8UR5hXTV&weQwheO6NXT1oRe6|X zE4H!uF}HOk0tCBF{_`MW(KNB?zD$K>-BOknpx?g!VOds&q&9JH4oU`qPNA0U<%FO!xh1MN5>lV@bhvb#QY)d|+PJ8uUzFe_OV()9VCmsf$1fk052nBvG4tgbl zQwlDf7wlnZ-|{8#XMaLs{-$FR+&NiL60006kh86vK+H#jWC7(HCApX@6>T}4f{%aU zJ+JL*H130qdYt8uk2jEe!DdE#p2O@SYnXdhF8NJY;vG+u>8S|k1VcpcLG1u?6_s!M zM`-rxKJ#7u6WF{ABS+GTp1~_5J?^->Cy*y;leBC98Ce6~O~PGHb|`Elw~TzEHulqv zP>qr$MDLDQgx5j&Kjr&7;)ee2!&2R-8NxJ1@RRlsI)l*G!H_L&=BfY%#10`dlKoy~ zJ}m5bUb@O!FRwCLG>~GP+a9rRk2daP9|$}OUSnGA=Y6&|A9b3#9XI#_{l|?ElG*O!c}t3e%MkL@&01H9lE;M_muF(9t!~B4 z>q_f-=ji%GlOwOmT|Sg;`B>CfyYM|6{I*#3CPrw36=pYAYJ>G~p+asjXKUh`Yw|xPN zO~-4o#^a-IAD)m!mwM>`In~#B_mK(VN_G`c(=fBrVtB}(eMQ53YjTGkK%|Fgocpia zcIUru+aGv;E?wS@EOes7f09QSKUHZT-`?QSbQ5#na!RfmUllCzcsOgl8XFUXeCpdu zmYQ7w=jm2swJQxobS%9--fR2YsohiflhZxu``%1w?%T=g{aUU1r}<$`M-#>uNUbSX z%Zl)`1$E3NUt0NI97a@3M1|{dl%z(!Ux0;lj>oAg?a_bcYfDP?-Qo@HOw`c{x;R?B zX_XC0wAE19S+?Rf>^cj%&~J^zL99>;>~{;qpgG)G)MtVQ>ju`Q6!vG~ynxKeXO!`# zO1nxgHaPv%I(GPu%d8U{-A`dFHuXoWr2nM+MS-VBDufBI+1q0KyPWSh$G2Fk1|q4C z?0!yLFMS-H1aTp63HZsxy#hX=tRE6;-jo{((Yg?h18ZSU@Ek6WJb^bxJbe1zxwUQF zlu)_d#_JsPSRRVk6Of$+eFy&=SU8x3KJWV#yTA`SEd)lpc9zHPxs1*Y$q!3dulob6 z(&BR3Fuz1CkNd$h?uokG`c*tGwdfCiTXAcU>2Vc)h-n>O;(~B5tbB<&+h4Gtx2GfEUMXgcCy2T||v0bIg=U�BgL@B$ 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

^>*#7?1pzRvA(wfJR5k2@o(1& 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 Y-rT!)v%PZ%{Qbv|>L1BDboR#o0;^+Wa{vGU diff --git a/icons/_nanomaps/Delta_nanomap_z1.png b/icons/_nanomaps/Delta_nanomap_z1.png index 5427c5aa32ad33b350d26d5f73cf3820d4115a56..ee38cd41a7701f53160cb8ccee11f31f3aa5f2f7 100644 GIT binary patch delta 67785 zcmaI-c{r4R`v#6DS&E_*Ei_7{lqSj^lM0n=A<8nAD4`J{jJZRiETe=%CS>1J*33{@ zBF4TmWEuNdW|)0`_f*gOc|V`;@B2NDIXe2s%)HL~dY$Kao!2$%BgeYOj>X7qE=+VugM|ne!ZV5fg7kZRG^r*n+qk`=(ftf}!frqZZ@_mB3&XE$8{6^JDlO9$o zThZBRKUcYdzN1)p8S?HR33#-%pueza*Hga8^VWRYqEC&Vpz|*uUU_V4+QnX4T9TN} zINc~K@h;7cZk~5j>TnHb>Spn>ftUgia1)tx^R`L)wS>65%U9oWC_C%3vJ$g0kKMTM zi3F}2L~oa21+P?BRYk{O?bwghe@S$=95EK%qAkd~MEju$SWi@coifTgF2Tw*Z^29; zuMGb3qQG$v#0-vq^m=B;-n0}q+-?>@mq^A9{}5+UKOXRsxj@O9eMxM&A_lLJ32aio zA~qXRpAVn2A}6sLhYzR3R?1K2xn47~S=5uqY}|Q$aPR&bpL=@b#AVgIM3BoW1)rvI zsoqv?tdB^)5zRP91;u_-E1pkT1K35IzI>8O!YC}@=^&@Du{_kUA1~3j9+6P?RuCeF zHpEw65Z!XX1dSMGG*VUBF**shv4Yomz9r|*!CferS{{K%6XdRata zrZs0gr6}0==i}X5v_-erkGio zq{6WI5Kcq9eEDh%h7*$HOB{ywJSrN|SDSuWqVH-{8dx;4w**UgRQ4`l#0hCN^OS{r z=#I;7k?>&``U6X>gZ*R-YnbTS0P{MJr1aoQ8wAqOhERS~U1)Zr$`UJt@zt6jNr?dD6Sj9t5j+i}oAe^Z2~&$o<~l-Zd2uMyk@!x$J*>J)&Pt3%xpfVE_L0AzRTE zKETO5YHsnKX)M_REpYql)r$qzj3@i|wV~<|5df2FwW4mtwx$gZ4(>3%5iBhje5S|) zZ?r_4*iYDV8d#z=&#EADu!MEK#v}xLRi=z;&59ToLJcwN$*B+MV*v5{3B@g=-@TV@ zNCCSyMKV9V*Wuj7jp?-qJrqwk_)+j^g54KEeqcG2g-eMzXYckymW zGNeo3ye!UlDIcR8yrWasl2G+^!w=ZbPkA<_rnNjjKi@qVFcpHkz^;xM7U0ykx%O@( zVOW!K>Ip0Esh1{hXaBC_Dx^J;luH~X1sMRcT2%Lypqccph#3q>7OTu*J1B3(XCbh@1aF8el(PUkj}erBEAc01x<^ z2rX;PyJJMU$OdxHQ-_9h?$;AsGjw-%Z`&fb?4lFVRwS}x2Y}ViI-Z2;$}|XD_6#p- zJu|!caS$dkaTUHxzd6tBmfwxI__!{ITam{C$h)pWW5jYyl+;pg#5!JLw>YIziFgeD zmh{=RtgeEobPvm|;75Et|4kEiLh`2gKSZZVm2J1|x`uRhPKy$HLS#G(=8*%_LO&BKRXZ z*k9wHq4H1NO8@eBD~ld;-T$^hBLrin>TAeZ44{mS#Pd!Jp}yOmcI!jJk8 zCo%(K!x>B=G_Bmi^&^*Y52yFIvRc`W^e4p0^>zJTvQ=M^*{3VHRn-CJmo7<#>cW?1 z7tJZ3Ki}_)@(5fOF=oZUQ<;$Aj~YZ2R3UIOOx{b2+JP&_Uu@kcG>hz^27^{me%tSv_a1LQHW zVe-x;xgy&U#gpk@oM|>wu*^y4##CpTlxB$!K>=29|`9YQ2tzxgm@d;dYecQdIb-*ztH`n;SgIs2V zi@ME?SH^KuXXTU(4_#zg!5(*%_HbtJ`fMjt47c~HeD9{P_a$P0b< zwdsnO%Md^g@FkIPOo4vI;o*zJ=E^qP-c0$%0S{N7!u7iK1e`7~Ko2wipaX7Wnl^VI zLHi<`POfc_$t@_nS)%&m?LMV5XZGe``vaHDeQiuLTAIz%K18;$JR;aR&tE4>LQG)+ zi{@xUc|jGF=LAOj=?`omL$Mpix@&+X4rQSbhszV2W9pw(44loFON?EUgD_f3<(ioi z)jvN&k2}{?h+6h1{Cp?4pJ#sp@txok9%RD36u}go5|;};aRhe6Mn1l;cn!Xw*oS@p zhO)}X`Fd=DNYG1R*8CKvNF?5-@;mKKK6?&vI)i=gQH|cwJQucDDr&NsfOX5`BpAsG z9tW=6`)zN~zwJ%JzwM0}Xm2zPRE=&Z@@>@!w8!CcFios4**+a9#CZ~W~DF6ED`0&6u8nzvrN_Q=k%2cxgNG+#|k zdA)+dA8d5#wrdXxZj>wMq}Cnk8R^QK%gK*2*j_%V^~&|igD*$*(gBaPrDV3lI;Pmk zt+J>bG>d%?BD0--$a&Y~y_-Cto@;i?<@tTh+atLTqJ>NNQ4g4t4KQs%vAtAxd^s9c zZfan7cY8zZB^UEsaPU$*ha{J4!N0WuB`wyBV29p_Ai!QMq2Rq>!e*Yt1l?3Y93aEC zoyPS~RhDrd-CnAMvOSD57J^a~GgU~`l-1AdvAlmR%E-xVYin3;vnD|n`I-(;J0N`n zb2vYJ3aboCB_P)lASLxhu7UnId7uz!KM$~*0dlrnaPg6sZQNSFycv0C)=JAS#ljR0 z2Sg)=YierBX~SuH@Iw^AhUP*G)Lg{K$&=pGkQV8c7-urWY+KnhO zJY$^+7WE(d@J4CbYeH6qz4hXo+FC>a_N~<uy)rC%X!4c*I> zgXX5V7t@fASq6bKzSD{YaYQa-)O%J8te6xuv+WSq7=G=ApJz)PG}jT0KhjC#c27;U zN4|ViobNiZ{5I)2@K+XtySzMB)M~iK<8sja+7BgEx5t!k&(Lwu1=+i8Y!BF9S0YgE z*19s_PG4S{`Jz6bF7-#^a34N>&n2weRcKL(R?2~NjHYidA`kfx=rqpr&303&EZygi8s&DJk96=<-5y8 zP@fRDUNt;*nO;kX8CGL_`6@o=-Qw~kDdao~ zjxh9J-U*q^5R*(Ifdq5DZ=LVobp8*+KN$o1-$fQ(d?+@(hUgW5QC@|W^3KV% zD*bw1;eT(QzXu3BJ};wnnAJj{%iwQvc#Re$-(1ZS$dM~IA&3^SMtzNX2Yx}H(oM~` z*k3*T4i1vX@!MzW+}zxTwIfE=w7eDS%zU4?BDt&*zPXQ>0CM;9k4&)J!SAC2Ehlrk zColVGYZ~y=A14cw>vG6GXeh#sE{l0Qj2Ekwt(cWzlHZmZuBg4$2k_rCobh2so?UvC zCz77Ar#N^P z&WOKh))nlX6D+iyslAB}vp73@ix;M%<>?RdffZ*$n7Ovd3v;4|6FZaUY5F$GLqb~A zhw^Jd^DUY{1uY^^>#Ds;m-x zGcV4n)xm!TPANM^iKKOVO%Vq%Lus5?qw_DlG=I+Hx}6?Gu-6M+b06KRy!QHaM3j zD}|YHI%#o_TL-#CU%*ka5W2zC9zH{7Us`ZZ1?3mS0tlSee+;JzIb3e>dg zmXze6gZz&ZsL4Mw@cZ5vs9}O2ff@Pvr?ObbjvecsywfW>o)#AL^(JbssN0J6YyU!~ zHRD??LLV;7^m(ha?7NY7$2@BP(jxF-J$ZGgB0t}(r_eh6!48q!4Se$B0c9$#4VTJ5rRGefNQRW;1&y4$@DEUYys$#=TR}u#5GI_UDap@eo_P%m zvYf|+Q8ym!g*Wmr1AafILtt*aKsN=g4uI8!<^mwS8;~j}C@88UnmRchWjFiZ_4VBl zB7dZwxt&(`{X_E#OD2*pX|^UP~Wmi zDtN~u!F_SX@vxnE>cgFnL?yTl?mnPm)oT%;c~<}FUi+&9jM^w?ia0kCN~W-*Db5Vr zYK64;qj}wwLZ4SzGubzsGLGiDc;{8ADSl8NYO8s00OG>KAc$C!?a`R8ozDVLh@rB@ zr;A{NKG=ZEJ=YV%i`*o38(MQW}7sgUx!_4|ykff5fBH(*1u6VowlZ^pP z5}JgQ|*GV5|Lpc2!je!%J!K_6{aFhBLsTt8tj|A1* z4}JfY(Yq=DUzSOb&jqh`jn@G5+|EZa%3rfmke=&EYmqfN)cb8>;7#3t#KnM;wZz=~ zT$36p_xrDeT^_01Bs{%cxz3}ccs?7o9&0h@Hj%z$s*KTESTVI6Y_D(#M5&xRw@|K0 z_%6Wt`l@x^e;#i{!}D*EI)6a4f+(T_JnWeeLRoRdcsXC66;^u#%;$8Pgf|WBL|}7t zy>~e2r_c4cJS+NQ2lYy4`SpLof;uoPfG^C8hxvM}D=)~+62t|Uq-QY9(*IBHxQ1nD{PRinGh`xrLif zQ&-Jz-!vpPeAGQ&rTjNLAf>3rJC3O|>Rr!g{2}{!fvg;ubl&9=Jy+&e|#YO`H`Z zVtp!cUTC&G;dQ(v1+Az>hFZIMy}v!%Ig{I0tUR^cHd)}eV5i)&%oFs#-WEs2MmozHe zAOb}00hMs24p)4qw8oG*_67J~p`0i;^bnpn`TXnV24!~kVd>^osmBh)+Ux3?S73;A z>>*o54Jjo*9h17tiKWfG^OjBD{%C0m%DL|XoYZX>c^kUQr05XOQn9S*C8e1T$#l!jT!h^4D#2?0COyMgxrCm{~R!$ z@S+eWL0_@PaL{UpK?bT-h{&_pCa`NJXee9=RbvZn4lCgBtqG8wxc#&i6EVRsAE5!O#Z&`xp!-{J@PXJess6yFlB-)Y0~Ixe<&aQY($IO z?V4z#Rk@e>xR!O`<^NoaC+OOLMgK!cIj;!O!WFgk#i4{$ava-fcWvK|x`f;aZTLMQ z3(<^&R>QwqfXesGM}e$*m!|MKQ+-wBqvAkR-6$$t7QQg zPM6IPSj*qoh$m~U)Wbtgg@KjwAHE&r@YV76ac=(g60b=#@pW-lo%rg8+~1=Cv|2h- zdq^**QG%%|fLpWS6c!fBe1P@?P5|@NgNl_fLlb39-@r=pw`kI}lA?c3`OAb$SWnZw z_2|9+%S^#wqM5$DHJmRjB_$=nG^hJSAW!hx&YArfUNBHHzj<>SnzH%Sd&BG3vw!?p zxJbI#J7KA#6Pl(Y%~5%BFaqc3=y)XO3T5T-+x=2f8605Z{xkAEMdo<9#G2W8@w?kA z&e#q8l7UOqxUvgZzMY07Xl3EVcmv<8RMNc^h1<&*dcw>HV56NJ1Y1~vi@JHR5EBhi zVQ%QB%U7skBb_oOJx4X2Hdu?f`=H@HaA~GI(;eytt6k~`gx&! zTD&gWzmB}SDcVPs3<`p13pB_k1lfUO0B%6dodxg%hb~26|Murjd&A90aoHM&j#iyRpJH#9?K?y?{>#eu-`H$5%uq7B~Gt!(r^M@bcw1bl`E?^%2R+=kp8I@s#76 zPC0Z1$I;`A0yp=)jlL83vCE}Y5sAbEaClvrm#==kikL>w!@&VS4tTYv0v-_x2gvOQ zGeyY7LybznS@v9yeCg`DPw0JwpO{#JhHo#2^U_;_m<_m|D!{3&xg ztvGQjr4{21kgDlR|KC@d0=;fC!OiwA?(XjGoj!G8i--e8(r6b?n-rYBYQO;0CeKO$7Rn=g&>~-U(+q!8emz6+bJ-Bjf@T= zEZ{%~ka`b1H#d_6|1V@s=l)xmu=5irGLoRQZIZX#(TN|*MuhjFNY%1nzoc#b=lo`N zJJZ0_L9Cb-k8ir8sMb9&;Ac6)Q@G;3FjB1&Qs0TZ^9h=^S`tI9`&aP#uTFh$*^CHs z?CVU{fz7Ev_j1R<^v6|bQgmBhFZF1~QA2;=EYPLL42^J4Z6G$6N3Cf8=Yeog zFU`w!zjFj34UR*s$`Ri-EoiY$&EGoC0=l*G@EgqW6f~G#*^h}7e&*_ZUI9lgb!NN} zl0^(x#|jDA2cBD4=f;ZR+t#PR8SQU_x@FvUg?zS}pYETBJ=_H=U+tx&$d5 z%;E!j-OjyuGjfoigCmYhu_Y`vY2_I}dXtBJD!(OaB>>(2h3rftAM4x;&r1C#0MOLod>%=!N zavmlc#=kyd=0uD1pBI4omr<{QDtQzP1O5Zyq0Oq0pos~~a3LcIMLbkqUOr6h`S%F} z0|N#)x<;(+o2_d4nt{9DBL@iCuv%oF6r~13L*40?`Q4n4C)-Ww>|ZBS*`LzYwjHgeF(fFRXD~whQAP6JX>S=oO8f#$cnnFZ>savf^t>p zFWw|(CtZU@c)7;HDQmCGR`Cy4F19;?y&s#T9hH$<8pe zHS?K$ytwai{+e_CDT#017{|sAgjy#Z@(LF2IEW*mLeBNSaP?_)1L)soTxbgi~9KShIzGTRF&HK z?1nH#!7TU`($goLhNw$)rsx(4u$e311RtkRqXIJWYgr=VAKA7br_n-=gA!5ARs<_f zc!MoYeI1r;gaaPnB}7_{0dzpK%8W(txm@Aa1NyV5y;Y;>x`oUFGN5hwzTI7(oAq#C z#*(KfP^#5`9g2C$Z-;U_A1SVg9`5G35cZx|>Z0z^ z|D+hjp+!08=`h2HD`#|ps+n@w%*-XGXO`06;xoW3DBS+p1(u=MN+jUE^O1-9&OhDv z^{f>Ez5!^^ddWF_*}S9HYtkcz(z`imOip<*8x`Ks2;Q--(;5PqOvQCppASwvZH zk@~K)sr}H*g|OdFh71lD*5u&W;Uyq6~i${z)Ofs6U>6>-U-Sqal(*zFKI|Y;j0e~}KwlYGY9TGeZ zM&1&#iH5D7+*C)v&>@XBODh^>Vqa`u4wZ#z5q(~`X7yA2?6GTvg5&}U7a8AtK zFB06p2%Z8yaD={Y=G*xE2Xjz8O^Um5V_AIDgSA9^3yZ#p`Q8GJYY}oGF-w>+)g>c_~Og;%wg=Zq^RlQjoM$Qg$x}}YGetg=mZ;-Q+6DgO<$jBWw@3s++-JyBVBr&M+e;KDcE6j~P z9ftGpa6Wcv?Q+JmLf@Ph&9@UVcN)Kp2f5xSujX}f`0RuJv^BrQ?)bKNx&-s{=g(?F zszF9NigPtus;V;!yf5`3TGSHib7-(P*Z&+Zp0$5ska0s!9Q_ioKkM566>Hyh|FbW_@M{k~U(o!LM@}jCSflBEPq(H- zt>Re#kAY!IFCd~x+|(mHJdm;Okagmsd3g2pQ z9VePI;hZLtv>gl4P0<31Gt+ocOwu)xKy1TJ^UueQfia*GfbY!;U? z{JgC-KY54v)2x6aEV!un@kdr%gZ=w;O0sxUM}L2X%)2&<+T$!CFd2|gFQW?xEz@c@ zXU{r<<~{z_KCK2Lj9T6?*^fe47sU$=6L+2n_ue>h3%Sps3r71sp*EX(JO~=e96ar7 zIRWNq{-Ci8tGactl$|+Bu9NZsS083)x90M)ns^Ig!V6T$^^S|UgkN=n*8#Io?$Pz% z*r7rK%w<)3S9gyfx(1|F8t7T(J|4s33%vRx(vZ7=&{?FfWsJLv zUAfoB8DShBn^-3LaQh# zEs~a&u&n@5y1Z#@Kal#Z2k6N)54%!ChKBH9#Tycurp3Emn`$+^T7UImF7N2+a`$@jH09ZmVD?>536Soum0*@J%4yH7L%z7Y_l+Zk20=FbQ&$M*io@)|W{K@g z`xgIu!(hT!PcJMI^EE9rfHOfa=cX}VF9|dMDX+c%iY7u!{|Nu}zrz3R&m==a-I`U7 zAfPr!C<&@tChPPApb|$L&F+bcV*fh+1ikXFRRKq8q7XFY;cc@}g@H`K4PGch-YX9O z%pBwf6#rX!TDNRdWWsDv7J-LTR*E!(cNA)VeY78_jVTa8&Y40IEx2v~53V`-$^22i zKVrY>{iOscL&0r;1;+u(>20;j-T}%J>{v^SPD+R{gl>NB*d(upNTH z5KREn5zv)Ih%d3w^8{`TBq;Kw@xQlP@b{i1`=33@PuXV#)!rHYcLKt#cw9-zLzwv8 zosWuDBZ?9DgUNb&P46{*s?l>^B*5&#v&^KXM&HFHlTBw1cLm2>dwnFI4ySd?I(M}Y zyGE4)4MF0xQKPl?G-Ca*v)?%H#Io{fUQ5T&Gw_=3r=vY`{O50TuiC@?JKZ~5* z1P@MpyJn5&BJce>kBwOivPInk4IA}rq}Y}N$w35gdbL(FyfPw5QuABP()a32$`e7g z>0$lYRsiZnv+-jlK%YlXCgU^kKTH53{)aPdEQH|0LPKDuC$fs~rTXD0{{`~T6pqUp zUxVLgWK0!fkG?1RDN!gCffXlD1cDSHB_#!Icj0>&g=-(50|PjSTahQ$em zR_#gLndxYCCVqBfY4mL@!Mc1*1+P+0h4~G(hH3--bTEOLp?g_%S2x#V>%n~_2Pn*! z^TI8GSfv91Yk_Jjtz=c2J;|z`Lg+Qeb`ZtCeImwK=BR0B{OY zuEXicvjE-W9~QuI6Bp5g4rAO&3ioASXKZDaR9b6nYm4R8;`wopMjsoKp66{>VqXl) zgCUn4SH$3t=IuK6N4!rC66L3w$z?dK?A=#Z+PIP=9t`d|(uDGqS?{>B6YyhMHD{KG zR*B6LWe53D$$%+%cK!zz`}o0?LD2I4_xR8+Kpg_U;1i_dzA0o^q2}O5d0+YT-bvz6 zEho0l#QbK8S%%XTTWLMY>=DWEgKp2{<7+hmzbvDJnk5O~Qf6@R<$-bpyupW4c;5Jx zV+=f;AJr}57_y`JDZRBkNE1ALr7;cIX2V${;#;UEPTj89fPo8;eB9B%)3CkN-%G|I z0+z;hFH^znWvvJtPZ30fg_Hk1SOHQU^I%wykP;QhnPZw@FcNKaze~?skJxhyQefHL zBjLaE_lgIYxdb8TpL`84U5Ee=FGG|Ur38_J0O-p&kCN6zm<6_&0s>PA_#e|<`A7-H z`<;4?&*D0ZRtOl%{ri@r2X@5&j#xPDtMp{5vw!lJD0+O#D89(X)al3mse1jHrm#Dm zUH2Ux8B1yS{49+kT@#HzQ^(}r$Tjr%Nv?yTj`|{18UqY%OMtMH^4tDilsY`ENd+H< z_Uk?h$tE;nhTeK1I3$CL{2@4w=m23@q8ip1onDFqOI#8Nk-RISJ7u?ZkT8>e=P}{iiJ3?Jv4)zoACO>BUgCgmP zlrRw#8UMZ&Tu}vSMrOo!U=0{Q3lawYGvw&mlM_tzt8rT+62qb}yYt2UDv@h}5(lUu zGR&eG$&p(4J)}i&@zXjcSW!C9p8jRGY7mfNei9ki{CVFk*$(QyN^qu_C z&#bzEwTEDEGp;tU0L>J75qjF|v?{p#MI6NcBn+oSolucO1k z?8z1j7Fno=RLjBC;DG3P)iuq!tWlHWo6PM}FFbil-TdP9<+rM$? zVO>N+tfV~svx3+-AV_Mve&wO;gGP4oA-Q#td#qyEgYPvd*bUuJDuZU90;(KG-1X(X z8PUgwK75G3QWGT2Q@m-J&wSH1zTL*ze%P$XwWeVgj@5-Yq&ATnua%~(CI5_lODvGX zH6fL6VOvLMs8&7L_v^Zpp=@9@fB~6{J2tuV`#K|r01+I(0?Si6f`^`pUKDgWz%L+x zKRgZLmpmpbOOQ)wf%pqZyD4mPr;WS`F18vk?|~gJTbJR7X*s^XE#P}DjD4@0r#&O% zXpWhj`tkhSl_>XW&ah>HOdX^d9QpNXU%$*+ zDIe`u>>A>23aJ%^6aDy()?3c0aIOOUG4I?(C(D7`WAJxPR~35#`&PO%AhDg+CWf5H zK!~)vSS@K+F~_-?itKlzDGvcmG<%&MUk1%yEW#83qpU_;y6(k;x7=_dG*(c|q7dAc zi{hcDF=h6TA5-1GGw0{#zMg7!q#@Z#Qf90}Zr`_b^E?--8hX~hI=`tA{_|5iA`g%= zc3Xt`lV|*dr=|UZDqfhyW}k|0*|jaKkN=~B*f!WH899IL>&mqBmx&41c)_c{tn2{? zB%-pm!1o~P|}v@A-M{~Rl2LhQd{>*4mn8G>6}+_6|~ z8FmVKdWL2bf0sy{oRHEuGE&~PlZufX%?q?7fIvgmMw}T%2`NiUVa*M%T1VIEL+HKC zk;J>2#h%aP`N0T{*|^a-1_R)Q*TS~lQ<2r}ffG`~8$WPL?B81OxFaV!H8P0-r3C0x zx4X8~Hca>R4I>AFd<|iaWbpkbVQw$8qmpNKVeaL;qfAsIA-xeJ-~1f1UFmydd42Xq z;~N}#$zWp5zI1A6p*or~S|INZH)a&lZ_&dx!~9;Cu(T#O1TL0At&x5^xhRWX9DHVc z{Pjb}&EVMcOC`Wzm#WVgKd~vec~(Y720HiPfI|x@O09nz_!9)}lFzV&mUqu8UQF`+ zlDnb0t1qbC?{&Jv$9&fNr{Vd$7k5SJM4^27VF|W)K^FH&gY$Fzxk%^J_LDkjzL{~5O(;GCSK~siG<0SpOMVMJgdd*JD$AJ zwZN~pS$%CPZGdmN7a`9ZQO5CKX^cVmS|O5@4lGj2AqrH3%^b9d)GowNWSyR$Z{ z2-V}kd>0_1x|!MnQ|lK!J1U+&3UOo);~OLKVXg6qQdT2p(Mrq;+(<3Mp~~2)wMGY> z$i5*f8;5W((T{;!T@L@LUm&K;?%utbNZ%i|Ai!I1dfr5X1TZ)Iov9V zLs_vx99%htHr2MF(3h6L^G8FwmMyCWCw=+YQOyEm0*>H=s<_Pg=3cE&hCoMOZ)m8$ z)4C4c%7uY(L8f&Y!Htp7v{8=h(I?~1;!a7uvr+V&NE{UbeB<93ZirlULEY3n9Y}sQ zOB-F-5IQup?=C-XoV^0=An*pEgchBl9h?qmX4Id8 zp32CK4>I<9GUs^vsQJ9wyLN<1jkipO)uIEHT!a&i%Bch!1f*n2P=&dsipNukY)UT|pob?pxUo9UbxLt3A`K{jB?y&4{cjnwKgZz5cP|;BB z8xmB^;SEg5$O-b|2~n$6mwk_-Tmeo2csTc*M!s059*8{GTzF!0xH@~;Q3KEiCm zb%U#i0cy-;tKwmj2ZuAiv za5OTqNst<_{oEDJ%BBm2_B>;+ZV*&30X~b!2`0nw=Wj_yA0jL%pAPKP4PY(m39}#H zMUM(Rl--hJdyOm1+8tZAbJkS+j<+YVvkh&S|!Xh{yg4SM0>~M z+W*EN^2;%p^RgqP-*$L)<5|T0o?A9OJeGR~R2-Z#riI%s0^wnzOO0Hddy@84em0IP zd~A7RC1%q9lRC%yeneu_az^${bDQ%lu)-f=t1y{=(KwiQO$GgPsJbMay8k@R7dWQEMVg$wb zOxxlJV>Wwl$$sa50@;X{7>)%ItpPUNzP(y4JG#KqZ+Co->{=VIm$yAk0FYLGNh7fA zMOX^xVn9E*ALqeURQFAP4Gh3_FdiPuryMpr)cSaOt`>M!GE;pw^@+=zxyQaK_K97_ z46j4uMfu;=8S!mi>Fj)ECbvgwca(mPnJ0hap~AjLcKb1xa_pbcNc^^{if%aHRiUW4Wx>WyS;y^A}EUy8bO4GDFq z*DNuy3~tdv_)w*b!vQIvnSmwZ4&^L;`e}%sXB96D%RIkqt;id22URA`DT9qjHz6u( zVHOGpIT1!c8_vleJ2Wct^wZfgl1kVPDgT<%(k@y`aDc!Vi~nJuy?q@mGEj^@Os0=) zK<;J2ifcJ4rVYezvk(%ZpKue~x(*@S9Ch9hxz9k~oyYicR!Ga3MqzfL zebqZga%h|o9zf|M6FNI{hZEr@hoq1Eu(VXn3E#mVVI8OC$k_3H8{H)k7+zKRWy^Fd z=R+NV&S)GNqN&|~UI)yU>i@Apo!9oTtnuhKB>(N2#*CbA)gLU6UqgA`{wNncO=mn9 z>gzGgdspoaOJt{wYK?NKW5rRAEZOV+za;+GWWu~%4b^XqczQXQEmkda4W%a6QDROu zx4bo!FTzSGtd*R=Ai|)wmWCVjddvq z12T%n*Z(p~J5PV)0aI@WhhMEM#s!ox2n3rGdmiL{I zd_I3+=6th>!mVDE@x{wPFOT>0hBRHAMhN7GP_u4uE&Aw&f_~-g0-@1j9=F|((~Cb0 z&9&q?cioPDz^gPfK;OqmTK%R>`#g91&7fR1gXK7$ToP!R24N&MhXvx;CqIAc^1Wi) z?t7(djcZSD8`@mB9Ekv~FMHuwwI>d6Kjb29#`h1alYrK;K8NK??Mp))q9Iz~4;yMK zq!=a?{26{g`ak}Y)3S167HpQt{o!VxVBWqpMQMt~8xP+m$v0uPFSHYN1A#xb9hZD! zADS~-#K!iKk>xcIL6^Jank;lvR1pV@#dZzd0)GOI0}SISDFWg95D_LMv;qJu5gow` z!F8g=xPt#nj1jVtg3Qy)--vf}i%(@V=f1YM@0kq)mQI-$YUF0U zj9RT8MsuC^Vn{9Nqb&-$F`*}nG6gxrs2Vhq2~l~+6MOybo==(Y`6LwGRO3uY^!vby ztb_b)fOJ0|nn!SYek65v3>@`RDV$|_+`vryV0-Gs#_)%<6lKTHGh*UWI~P9p7S`qAe@}U6s4Bnb*DtG zY9FqGdayg5I^~s|XLTxmzrQE92jFjmUAfTMtggp9nkxdd}1`2RY##Dw-K_diq z%Y@(6Bc{8Ij(8L3a)0E46ILjnSmiCwh0~*Ik7=! z@#hU(APa~-U2*%)*j|ecXc1caAuui?w~T>lJV0uF3E#&|VYyF%)?&qd%H4J6$C)Y;kj^oJWczo=B|zDj}MX@rvYJb-8h zRwsY#|2{^kwYzsD(K6!U3vCzSS5>u;h{ivO#Dqj?_u*!7ve$_@4VmFqn8O*499+F(o-A z-tCwSOM}6^VR^d4?Qk|5a1=(BM!_;y%K8ZGj*gaBS7tT$KA(-(=*~U)(M+yMWPPDy zbuRe4!!*MCw|Cu#29|~^V`gcmpPrw5QwVG@wvRg5ei>T!(>(Z;V^t*S`p?y3BVcE> zAj($%M`a-AVLeB15ACLlW^xDmOFAEiRrtdn2TPe&tx) ziz{bY2oC*X(M?CI5S}IL(;L@6-)^GudAPwFlIS+BJm%QIFAJP5ObVuY_ z9334<->|n94dw+zp8z@=bu5vfW-?OZ;z7^reX!rHLn_H{;98^bQF+gJDEmqp7%l zzTHuMr(o&uG0xIR^}C~PHD_@=&LNJOC*q&{vA5>0x2Y*R3jrG%K$ds@C#~A5(N|p< zU_~vuXlR~hQ!LWF(J%(*n%!31PA(A!nzBq(VhINv0no|1O+w==?%XewTZ>D)qkge7 zR#@Lc?{b>xkY;`Yj8LNYOX}+Lqpu8WHqBMsxb?c;^Qx^ePha={kFhU}hw^>f*G7x7 zlqfMIEfPslSte10QkEpk6h-#3uXB?YlC^9}D%rQ}S%(tIp6tt5vm4u(88dU=|7%d+ zzQ5n|{6EhdUhrnl`@YWWIFIuo?A!%9kFVxQ{)5%;-H1$`ltYjp~*d zb-apAxbae5Bj}NkMf>%;rU|nu)IC1v$Y~r#sv9=3zo1;V{tvL7>Oq=soF|p$R4&eI z>WTPov!nR?+m6wT2Nq)XbGb%lc_N+A?CfL$)vP)>yPpkz&fM*Sn?RH8yHY#hp&lG> zDGme1-6z5$khNL|HR3H}x=o}7bdd%R))sW~@H($!-4PyD#|D8l;n9w|rn*Du;SdqXQwxWV|G-5)6I^&{ZYHg`F+@y|iYM+$sB zKRJoYCWjBGsi|ouYdc&$DF(%BUSh}XmW;JH>k`l?$d#~v;G5hQfLTe&<%Hom^7&=) zrLWIPNy`t(nUARf#P$lqIOxVEtQIAI$V93PPTbM#J@#r0;tYDSc-kWMEh->#0YBzy z5SnZg6~o^S-*n19#QES7!9!hDL<~DwDOm*rlx>09h;5;m=aoay?74nsG?rKUOz^*O8S5c4-5>)LZ!?^>4f1nQUna3mGC5v*<7(W|fyC)n z1x)*2v}h<)n15*RldJidNl%n8xSDLPJWs)u^%f$i7Aj^_ z?iz*_xnbBO`bhR=M;Y>(_RD|t@*lGF>vt=iv(Ang%eFwA-D1O zT2i6hF9SAuqu=kBHa%kUL}sIH2b0u}%~b3PPKBFq{2Z(1q#w48n-5v%lta^kdRbnt zTO3ctT)M!LJ>X{^<2)nR&-ykNJ2P2?DaExF)@VH?+X9IM3k~y46hIt78 zgvd+c(R%<5F=VKDa@W@QoK9#eH8M(GPR>(Ty*aoMXW5>iJD_%; z4fDRVQ*BYP-`N{g7VrrLU|#fut^Rw|dR(pBh`ad{C}q;?!Iqw z08RV|JQ=uqtwDa1dLl`#U!hTLq<@t?D*`m?W9Wxr2I6 zy!$|cR0rLVA^ykb;-xc1$4fDKqP5kdji)wi!=uH3`uwK&Y?|8G9wB>y=pCKF$luk zxsFa}Q?l87i}!&z?5Bdug0o!e#!xm7SmD&X+)6ETt`U=>ksYb6cavW}vzw^AWP$_* zU?lU|*5k%$+PXSd%S!K@HZC&JLs-mF@+JBX!G`k`^YO{a)|d8EHRI+rrYC;ja`0Iw z9h^nw_J6fOTPJ9hkUdX8f(dY@j_#dg?O^-ShR5oS&Vs{&)eiI_YQQ*r3AKHaew}-m zLlT;^7+PpSWb-;@G{#6Bp%6QRPLE3NOmO7z2Z zP|*sS?c%YAjabGW{=&~hc0FBp|3!K9)KvI)P0#XOk}dl=xO^=wnCh42)x^ijojkqV zOCx{88ql;0#;Y99QK)e#S4B?o?aUl2C%Z{@Rm4ris!#3siR4EP5}^B67VafDmQyNF zE^ACG*a%JgjAFl>` z!#fWBqW^rkb)qvZM^@gdvK${W-Ri0JYJ%#%fVZS{H0G6Jt#A>v1^Z2U+s9A6~i}er#P-8AKidM+&*@~lV4GaWxdu0ZW#efHu>~=ut@Sxh5mqA;}uY=qhQIN zB;{7NO)%*A42f6vXz8c!CuM*fkc3iAW|7WqNKhV?S7OjwV#r!zf=kwtj zV+qBqHz+lB#an%m2?>b-QCI#Q%8O^I7WIUgptAFw z8Pm(sFVOs$&_1YcI+7%k(y+@vbbLJIzS4A8N>52)Nj@$bk{n@4$0QqssvJmg-T!K$ zeMdejHaZMHUWmpnnkR~{`(4&eMAyiv`aW@(#%Pf3U$ZM^LOBD39q=-0>Ly#Jz7IY$ zfCmS8-L_kkJ#0xNZb609juYCK32dW=exINTrbZ1}wK?n_7m0)9FK4`ji3M(culIy*vCPi2%*u3>^9dU8GzTVw%bb^kOsKmBoy{r$=<@HM-PUWI1qT<+|y< zhJ00CD>mCYA0Hnx4#}Mx>|VThVH;LE!dAM$VUrqb{aZ?bO#YG}Gqk#*mp%nn^xEsp z&CM@~ggx8QQx&iM(3j_dX<(Z}|LzrrR@)_aOC38{$`iD_@ijwh{A>zSN||yebgTyj z9?3&t2C8&r2YrE@QJ(2D+cop?gXWRWQp>B)zCH}svNts_!TD~T(ai`v1M3%<=Du`8 zLHjYmG#UGw7&^BEVNzmNNTmPgo%n>i78vfWjurjbTIDhUirUDg`qV*N>kA}(r+m4@ zK|=gHdiK> zp~qYer9i!r-l5{K2d9SC7le(xi+{og5u+hc{$-$Rn?I zNWtt<#ugJ^y_{;QXx))>qp=#Mr3wl{s#`WVwJiV9kyR~RP%pzXf`wVXyWj2rBx-OfsBO~tZ z(v<1sa0~=cxBB9Qiqje5^n~gqC_`f*<5}N}1_3$dnFoB6 z(Qd$c^`dTLZiNC>xM!FFiNO5?$Z zMaTqH=mFyV^@XjmQ^s@5>ezTyeBjPqY|I&h~wLxHuVw!GYHM^mHPl?!vmSxMGWt#)6{3Cbua zMfhY@8V*k@X3@G*M?bQ8*;8h(@vK>nh*(lN>I3a9@e3;)xs?`XcPX%;?i-<~s5Maa zpmhIc+MzeDT}M#;G$F*4p^afI;#Q9bqrM~Rmx_v@mJ@PP`?*Rn4$h;r9aEkLzf8By zuQ9l*&FbS88Vuwe8|IGXN%Q)kC4+lj(i@TPrwzqBYqs^psNfM&xhJjz!OhtLPVKTm?eQ@BL@WPN;o+)9cn5-t(@<_(0kx3Zc#_2+05tRP^Yrm?M= zMU7pYsi36-1h-VK)1n|%lzO&uL#g9C@vldOszQzQhPGx6lv0I`0Nc9eh#qdTvLP@QWHVb}g+7&CXjNKRorsw29Wur%z?~LHWc+a?EUc zzmr)(a5f_ArNe==&)S~-dt)61v_HT5sB`Pde}LzJk@1LdLDSUWbSXgmE*_>N8p~`T z;x2!DRBn3~&33+D8sbB@bRT-UgP*etZkhHbiyh7);tAVmF=Y{*Z~FODIq z1p41{hVQ@S3}?XQxt+kB=HxSa(5pPqnXONJgLu`NvH{D!9^LiS%!gZ6tEtR%+f=%I zS-sO_K{ExJ%4u9{4rBM%tpe*uva;u(N(OkY+qZ8Y%|9wCYFn~)%4vCd?8O;x#toUU zbo&W!Hv4+mMCCI*EQ|W${%0yayEO{v5Ch6R=Zc>h@Kx0Q4~1 z3iM+z!f#?HQnq##M6fD9zs>s6mLXo?34+M8?GF8=V|AauVBL;EGHR0t6BF(jZJJfT zd+9qKDN|8?DrxyKF_GngE#v1XJNatg`_M!_YN%l_nF+5=G_GiXO8S+sKLiEs_~6xs`xno4>6hJGb#C7-%!5@Z?YlT}S@7PeB%kginW5nhR3 z&Edpz)H34ttS59j#iwhv#{V1K+sZs3>ZtgQQJW?GLwmu=zR#hybb($25-fei_ct+!L^4r+@v$YFf zF0#Tv5z&bwSiT~_wV=^}OZ+*V)Kl}~J*o7j$YJpwK9fGvZsTtS#Q_=ikaaE~{sAj4 zGS|Rg$~O3reGmKaTxJq`5S38nFYO0wgX1;Pkr9zguRc?^jE zl32t4`T>>!{YWe_invZwydvo^4~(X!;!gZxISA#{vao$7V4db{7O+ka3ZQ=wy2{@O zJ?h@c<@3OqISw#P!j3MkQZ<_{=JAKW*i>_ZY>z^uncmD)+-=j-tGiSX&+`w_44<;<^G^{g-6y|S1TRICou-VV^G6b+u6wxQg#SV+bATt5K5`j zwFn*Gd`aVks39MR-+5Nj$7|RKQ}P0z`+>fYmpAs0=kmT~yDs9NeM9V$d1Fs@UofQ{1TUwBf{XENjlmw(6s@%mKLD_-!73dA!aBT946bluFV}#BbGkdVCE&< z4>S?oR^6Nn(>6ocg_SLh-;q(+zlyVn5FRWnfww{Kj)M&h>R}d#5XYn~`X{s@R;$4HEny>Jg?Ot{k zLMkgauJX=-%f3v%yVXY49XsA!s8eVCcKOPcG99r9^x}@Dz%%b#j=Q$$fGCR*pqX!-5{uWY*|YC!UGu9QX@mAEkCRnyT)59Cdx|0m2}FO# zC$7f{*|~adZuG&Wgdza34XBo#oo`esg-aJCj?{DAEj(#975jE{Q~{_jh7|j&y=d=zSnimb zUOW+%3nl`tFSh1ok3O`>i6}t^5e8z1;^K5a;LwL8AM2I2CBB{~-eh|TE*FqMUfBb# zmY~z^UsbnDkQGI$CLQ0GQIDbT(FJCsmxI>hI-O?ZG#Fx-dVH|9^Ku4NT=JvxFSBj) zw$zsG4{6~H)_Q0TM;@l>16gDfiA8Xl)pS;fwx!SKlQYwsAa=-^d-v|2oaXVU*aw*h zrChLheUpCE;0&x;sml|gYWS&FKF4(b3OgO~ti(hp`@?#aN~OsUoY{>{W$#5(zS&NIa+@)R z0Qvr)ND7!WlVhfQ&sGDyuZfW3f#TN{FQT)p8LGP-ic@opwwA1K|084~JbGuGh5HPydJ%4M zCyb~khU?-3BPsfTn)N7zEM#Hww|M78w?ePc!ajXxIlNC98VCmjW>@tZoy@sE*s}IC z+8hvfaT20q;9}%Ti3F7{K||(HNJWkR@Fv#~CJz;(enkr>3X}W+@maxjryKhf z=hve+mE0N65UC2_U1io}W@X;|fus(Q*U6!(y4R7BF7`lnXy$k|<3AJ}j7uti-oCKM zob}Cq*NXllKoqPiXwE;9)FEz(J}k&N>6N5paxD%YBN)ioE-3T|C4CFf`w^+YR>3Rf zCAXU)qvND^KykEhOvQ$DtzMRW-q7-du4c2hvx_m*H7Y~mzrPV4d3?qM*(irTjqoV3 z)Vg^)p%gObA${^aSejm9|!AU|EXK?qn z3{JH)HxJOLzQzpV3*J@F{+cGFMmyqAfiV*)iU={ny`sJ^&&2IpNGRNG^v09)O9YP5k! z2Q(am46;kOBMYxF>2hOKpJ1ni-c2wv4lT#tM@@#ise3@rX$Za%`)l~Z{KFEJ)rWJc z*nXV)G3QC>>MKtVeM+&@v>R8Mk}+NQDxkg58?oHvfrW=WV4Ws7TbvewSCd&zEZTA3 z5AJ@rVX56xZwD(xXt6$e0*(1mK@~fM<9)%8MPRJEBt_=MQIYQnd8m(-gp|5nTLZrl zx_m1Ly(o&b7VNfUI&bd>-;#pgR&^Ue)XXb=F9RFIqKY3}rncB4M1~+ae|&X#cr-v} z@a&42et#|kK%%JS`dnY0+e4bU2sIK+#ovL>uOLb9FrC2Mn#UA71*}zI=-zLnnkx~d z{_DB3mspg#yiepS5sNad!@JTXPWr4}$cW#eH!gf&JOJGKzsCbZ-_K@zo5NP5Ag^fb z!T%uzfmXC2^C{|Io%Yt^cb46)L-{4Gjtf7pz|p3`kUkkT zH-gUY+WADEPG$uxkfC6>RI7#{57@xx+z3==c~`*RW!PAYuoB9CLekWaBIn!VL{r#A_ zx;g`uKkDVRD^^?H^pnDrA)D`|kbCDZR4$)8!mLxeA$_)bP$CYsK0BG_8KOtem1i$J zw4Yuz{}eUPL({c1_e=aC^1a%jmhXCMEx7)ovDlPUk$ZTf6Z;^E1&OO=VNS~Xjb*Xf z3s>swXxU@(a+>^|qe(gc^@CSFlZA%# zLI^&y6gT?o*UYmJgbkThGr``PmoE006`;+SaTBBnX57xaYb$gj{`uNsH~Vr0lYv-- zd%{g9-Bb)yMiY`YJ;>Z&hWHFgwkJkx>n!`&Q<5c8TFUt@OPx0F4m*h1S7;ll) z%9X=Zh`z~9woKh0#x>052VIo$!Wks1n%{;laEfeow)kAuAitHCPwQ?D(py#`KkuMM zHqZPekA@d~3=MfDN|iI7Z#s)6Z&**;7Vg-OM=7F{__Ao;>x^fMr@fCq<6^pHa=q{W zPvyga%3o$s`Dm-kemvyOLu-ARunhOnNH^t|?5#6V-2`ETW}t9g(d`QH&U;g(z!61VgPfesXs_; zGioaHK`zH9Q=G+cAFpHnbI{;s3>r`pJDWHCf1Wf})&P~h)9{u-XB=igZ}@BP5>Q_o zG4y-!leM9HRBVn?OJj}hPZaTYzk_Y)SGmP!q~uZHSjj$5Lrf2@(HhpPlz;IWq@ zQopO#a})?XQv9%BQj6oG>)Ku)Zac42GA=-oNS_OvHl{wd<{u_BYR-y&YcZJo*l}=3*u!r7mBHI>4&@X3=z}$>LIls(c{fn zU)9SOTBD4wosg5`3`{cA4=jsq3C9T!g|p^*QqHUm?P+?_bn>eAE5P!71~b@7BdJpMVCWf_r!LD@d6V zU36JmgmF8^?bPBVG?`R#Hb^uTbTwb`eGb+PKw5|S61uDp7QUJOcZcT0p$Bu@t&uhD zxALBDl2Gr3hvZ&@u1kAHff9`b_vS#^2B~A$OOZnn@y^Hd(x>c^k^NnxvhF4QQF(k5 zgf`naxYhY^Y!G;q{AbU$rBv?`n5-@ffzK#_m)~EO)9k;a-%() zapPtm(=z1PGKkO?c)8W9#ZR8On3zt_AL^cGxB?YjS}Qc_-=X&^LV|iXZ-%PI+eLUy zaVH7PMyRsy5eg(5wRmHIGw?pwwcDJGuG;W9S6j!$Kjjuq)0)OTGTqbs?(R>t`!#FF zW3lZ)*^0~JfqBpEeiro7-lGh0MTm{G`w!pMK09Q-B@8?``+}Qx$4tj&MRap5_@ea-?$Gz$t7=Hb!h47W7yh;{84RM z>B(HoZdLnvVy0a3$WJP7yAP&3zf;P)%T(hjx=F+BiV&pZr(~)5CP*d0R&T4cz_&-k zU5}IIXl$OP^7=V?6z9hpQjBxkOxq5`H;hTEHkD+%pCh8KoIfh|*f-p?hVUEV@@G!b@BN)Am(Kxxe4Z^M~ zZk5{TkSm;3v5?og9-$%>EeRr_ql0Jdp-;s9k>fD4va#U;A|r2TO78Yw6QU0>gy_GT z<5(JBnf7;^j&;*aOyaM#%sH0NKAh<~X*FHIhYw#JfjSr?P=U&!Sh)e#@b#6?m#Txy zAaZ9!b`tXB^T4ThTXRa!FWV}y7{+nbJ?#5Ln+PzEGQ1h~M#*IwuRo%5N$Khpl{bB@ z??&1VU~YtWe%0x0;eFAt;~0kJK^7m?s?upuJTuJ#r$c;|dMR6Izn_cJ1!pdcyy=2p zx(;v89=OC+DtV+gW2p6yULB!qfh=(@CT>ASd)OSX*Hgwu-CTX6GTWQNyJ`Z9&Vkut zb%!!NIiY$+V!WBT^jFM6khiBn_1XKG^xduWh`ac*|H}p?sk$GBpU(oju6VE?G~vrG z`SfI$zGR!iGZHCI zhAtXlQbamF)-`gCfaxp0fT5K4m&uo6MqE9i>yd$IdAo7GmIcF1;UVA=Vf2Z(if)O{ z+xQ^lTZqtTG4TzCEiG*!T{rO3-FUGZy3cgRzaK0J^BjPX9@l&@6yu|C+a;wSnu6M~YdjIdhryld^hbrWjdf zNf-)x{=6iqSZcdI)w;T1grP%{Z~>15yh4drUYBEm?J^nIE>)2w+EbB}^+Ts4Bg>Y2 zcJ9yKku-rL?ipM$Vup`Zhf*Vj4Zl8jqO z1U)s~kGYYS@-~B4w(`A5zR8Q3XHf$%P1nLakq}(+mJnPv>X#L`;GJ#2J39G;8v{_l zfJ)D}^T!eo=ZKG6w{SxXCypO~yMeqAs&%d8hNwliS)M_21uRAx8`8+z_{ibY&KwxK zK;TzD^RLM)<+OfK1%v~uW|Zk{wRV5zOEo(O(~H>l)^sQB6NT%P`_XfCEmtT^?HhnT zdkGIf-MkdlVnmwLuXWSX4bimr!4!F2p_|T-_4C1oa%G@P3p#n0;8VU(H|s)Zoi!>T@1s^g3P#N2u<$y zF>0XJ^cav-RHm zrS3r6+Ety@pDj@uAnTyXhBRX@;SY4RD;VF!D_q+)Fz!zQTsu9cO6 z=N_|SX;aT&T1*XBZ+IKFoU=Ujgx2BH`*D^lydeZw5%a?RH{K&Ia|tE*=48hd@qsrh z237_ocyaNy($1rruL4xfbT5C84?Yl@>SjZ{nRcT9yR_hqzrnttvZFtJiY`XJk{0&qn| zg>Dw7+R106uQ8)L;nUk19f6Xox+PIiHdT0e$0xxJ8)Q&PrN`6O7bVI^8@|VN5=rfi z`ASHhWjome$hhX4nor+6w|2{SN2(ueInFd$C9BgsA9Ma)(;^QIg+0Bb)iQS~Cgh;8 zB`!hIxI7#@ABoe?pgp}t0%varFB)xxPlUe;eB|iviS}so*52~;^UawQNpjIOilSz) z@60x!;=0{w;X9yK%O0oWd!6?*BCw9Hw)dNDEq*Ihs2TQoD*M@lV1>FT2@hL+p4%{r zy4**jsAOg#GZ*^V?6CZdM(id+!h4)>)a=E5tYk$=D(3d#GGfA`|?em*A{FS|}JtCh|&%L^mxM4)Y zLDc^lQ)uJ=eF@eFIU>s|HdOjdkf3djWwF?|bn{0(<){||X$;tx*b6mUkIGJG|9zT^c zuwb}Z@S+t-gB?euZ*ANUW+8|bf_;)rED4q+EN;$=@>ks-v^ywzvJde)8U|el1p4wj zF{2)94|yQ@bL9alDfQn+Zx?IRh+UysN^4bQBI)e8_9>balq%8M$meCm#u^MaJL6K% zTN!$tue&G8F_VX09)8d8U1Y5IE_9lEvaTP?FUlTf&4)5rzOyLMY8qz3`BAw)2xxRi zYaU07`|$T0YScrVr8&8T>>a@QHmfWO-I|@sIi&r~NYi`wdNUOe@v*VCJ<00o#pvNOF~G96P&W2}Xto6FCV}&6B6aHa}RWz>hrJ zI>+7td5i`3>Hgsw2Pbrf<`me`8;|!sX19y&D8od};HLQj&pER*`T3(b7j*Bs)aSYH zVTSb@=Ta8c5X2yPt)b1hk~O(s*As?!toh#JV;F{8K-NY^WMaNTk?CkVP^K1y;jOHQ z_)_e0%#L=|dT3+D%q> zQ*lB^{Qd88RTK}msb2#zLXP^%Z)q_xI^*>{frXjxE1qv9M7`nPqWtsv9G?W)=Oro^ zd$iWS3SM~Hu`)Y?(XpTy_#M6HR6WCm=;P zr1&ub=U`GF{4{t*X>%c)6+UwbB})UMRrk3=Pxpquwq4>RNp<5k!jB6w&NK$y*q_{* zffi|c688N)Ls0u;Lk6;v4YM*>0{;M!WDjaQj7`FYtZ7w0Y+oG=qka#D(8^?}B{B7! z=bjT*I^ob1k(NIn9gq(Da`-p08#&Hu*^dQXH!h5BFTNfCxQ$rWS=3pVbHLaE1&{(5>`+6qvNTNq++lCRmT%_Idb_vp? z1X)PaP{%v&2@g$>Ye<+OU|{)8N+Q^~0_Y^9sM%}2;;ArjT0R}(t7dvDsIGDMFn%eK zcP&w-YUs<3L5PGx0!N%88&{c*4(FiE841I{c{h?#dYF|e$cTa|@JK}Ya#fIt+ zCv`pg!8J_yj91?iYrATz_@}o05zec9UZtBMF3aDF;VvpFIzB|cAs-7J3sIr{r7n9F zgJE$&jH~)r-)2Tw%mr6gC!pOw?dve#xwAq2mRDpm%=3dAP1W2@#9uvKa!~vBK`yMz z#rN0zE?TUGmw2(&Z1Y%S>st?W{TSL1!O;u?>nM$E;Yq}*MgGzgeLrBmzd#a%fOu9J0FcOQ+xMOiS`eYr$%~02-6AHzM2QEpzE}Kw`+vR~6MMrqv&TGlho~(N`=SV<>0mY4srscF%=#*q}1l zxs}ixT{YUx*jTBLCbr@m!FwM}^~UtAz5mvVD?W<bPgtb*~{Cxx%zTirQ1LEu~ zAy;Bfd($2Kw`y*4u6_wmQ`j5@92rIn!#3>w^Ga>&bm+Rg7u1if*mu`9Cgo3uH_3mv zf1vNr1M(z{MDR8|b^7uuV8LdCzin3uDTg-wLMd1GVHzI;Y_Wd8kDG3rQcAD#P{!fVg7XV1Qd2+|+}LFgB}Ya_jk z4{Tv`I*pPu+7PAzEJNJzb-rZHZVXeQb`(%HPzlZ}ViRKijhtq%9l`C34b7OzRSybK zxsa*bYeSBQs$_wGjxsDQoRtc zT-^HW+2A}aKXZ^7K{i*Bl^`3$Cj*DWLZevug9)%FK^MYXo<*m_*el>V?O_wVyf%LR z*uAny;`n=!6g4+KJ}wQuPtB;MSL#D2Md#d+S8E+=ZJRXM7fxOhKjS$dB-V^qMdGrR z(B-h(v0Co|&m!v!zed#p1^j6?>TYC+PNh!Q4-?cgk`70=IsG)5Y5ZR{N5Gje_czSX zMH58V#mt~Wf6%O2BE}#yqs%Q|<|N9wD>b}hgQ?X^bcn zcN?c7J2hnI+)nP*d3Pku9l!4VPSefQP3Lj9HhJTo$0rEg?lr=*0d1KM(3XW4izLi5 z?qB#i14lsOpbb+;jW%MnVB$t>2M~}28$(%#Jw5dbT~h@>HQL$Kmr8%(ma7=NJ}0PppHg`ebIS)484D5#O_utX;;z#kXYZM5hyF zASZ*#f(Hneu~;exK#5^U2F4cC9<1ov{U!H3~JH-8MC&e1RZjyqB zYF-?&WOr}h;1jQbcKjsx8&4;FyHOyheLJ{y(+Zvja4h8B`}k^>^u^e-53&b5$bf(f zz*w3iz)Zo8D;+*CP)jp%5^qle{#@RT0h;3I-B=Ie}J#o-UJ!53SqIbHWlN1UO z%8agYoC9VHu5R~JBl{qCJGYzJQP1-;0WP`)*~0Ee@OOZNz{0Vn1A?jlI-PWqKVXsL zB7{R!)edvE0MXd0_X0K588_0p$#u=pANA@4KWgJ#tc&mvB?n5N}Yq~eV7xvIQ==xgs2kg&n<`3}-0maLsB=UJG+*0zo1^Wp1E zUIBWOJ{x4>b0m+%dcyH;ymTf?R;;Bvy#p&wVOf@W9ZA*F5*ahgX_%*dbuI*mT86)w`ZLo}d?p`-I{Sg7!(dlH8X76WEC-kT z`RDa;vmE4$1`@Z#1b`EW0eI%TH0FLnY;%YYdJHTrf@Rh(vcWW0y*77#fz=96Ws6sp zrpvD;vGjq!8-WDa5hQ0d1Ra(_gW_iQu3-cSP%GWXPo8wR_%-9V8MxTEubX)Q00U=^ z7r4%mRGDCgcB@KwIcuZ5>6JokJ;7K1qXaLns}C7RjcGZ%TOU>aHMA8LPUBdAOJ)>5 zGrjF54v#racsyM^Hxh3I1$G>u6+KR=PfFnkMs|;4*{!j73XqVVa_AjaOhK} zsMt4uHWxql=xNM){Poz?I3PB`jp}rFhC?{AA!xVILEJP|hH4Zfb}qRAJrL?Ah`A%P4(PB*=UoKyDi)Q9@NkePF!t8mKs7#8$OgJ?s(tyZ zAS2Om_qBm*EXo@w*6SrVPEEgtiVMW=(Xq}j2_zDZzZ@!+7qAf%6-{d5!|Y@gbQ?U| z^?bWG-hp1Y9vv9e%A%S4a;opt;jhLDwaI5BL$feSn@C4>tM?&bl(?yC$i(nOIRDBm zTNXE-X$Pa*hZM?ni<=41((QKw-rpI26C9i3OcdtdVd#@0Z;vsL0@J_ zsTNGASSu>bxL$MD|2f&vT2hUvDI=-o8b2ecCOML**x{R;yups!pK zJCA3dP2OPn#kX$v1{!r~I&2#Xn3OqoHCmDdRl%Y*OslA+XdH#&bP8u?Y3)Mrbip5+L-gqVCef!2Mw6TR2M z_XvK9XGy9XHPrW~)<24+zy8Dldqkf^462)C0@7Gl>iXojKquM00A{CRSX$J60wEhKu*D13yvw9~Uo3 zpz)?P#-0sy8{5s*v-`V9!Wp7wstsm&FmbP~g?E5wD*O0xiho+0>C|ZFy?)%Ve!%?<7p=bN~k;?SNKR zp^3nVn?XnG%qeVw1pv%n_4h9C82{~?DJ2L%ScJyP4CUSlE<(1aJV5A}40iUKMsztz} za$Jhh3@4u92OG|*eyvx_q;`=S5e(0#Hvg%ocum<~HijQ7HU?tX^V1K7C)RN|{Ws$b zpQq~HWjK7X?LcD8C>s9z{QE5AlM=48Z$fz4c^oR!HwW$o5Pg|Xu>GR3&owVDN9~sl zh~u4$5guM;k-5a0ac8=rk|3_c}aIu*;VIhvni$isn{ns0&c<_Ze&pAgE)0BIw zxijCaoIn(!I`*5mt#?1`KXQn2+}=d5hdHYv2LDwIm3buhnk zm6Y0ueTi!(MvPCtP-J1-Z2Ti47po!rK&7g>`flSJIlBdCT!dAIMmP(LaBO4h=Ds*; zoec5067+t)CNbi*@Qly!3hsQBuS?C~_rXxFIT}?C2U*0Z#j7yXi@>;=ykhc=E=MTb zu`=}HW+H;#$791jOkeMLH5v?t-Q1u@X7af&5tU8|&naofp1Q5<)fSN{8m6WR+`s;j z6$Fm7=wrd%RyZ%4)W+2SFUT35`V_fL0u1lojaY=zY+O0ah+qUGqV>f;YPQ_%JWA8R zb5QAEVw&(LjpkJh{#U{6TD&^)4~V?+us6Va>+Q`xNn$`>lywdk(m)^Siv%l}W|N`z zd`Eb?udKeU5oHh9p$DF~Fc1J8Z-HQ+lOr*Wc#iUv4Z6(I=ieY|F_qY!opaL7&O-H< z4pXCc_y-!DVDhprDz6V*$Y4>|^lyrF$9!tJ{4r0@(pPqYa%bd@=^e9deDlSdVVd#t zlQ@KTdyBlmPTc=OA!5)V?N*L#(osC?&6_DK8Eq ztZBaGf^pI4Z@a;YWA}e(eKb54%y4qfGX~!ruu54J#(+J|{D;KjKXTkFVl6+>#-^3Y zD5uu;AdlCR8+rWf(8ti2UQN9ewxsJi0)a}}0#12iE2iC~tNPr}+x*StKqyQkN-|L$ z-id({-pPvUmF?+vqCGA3(8uZ{AYyUxb=y~U@BwJ+Hp820&$1JOvTSpN26R9@%dw5} z?&lv*36HXESWG%``n14}GI>K$)j3WzPNa~W+c0a z4lh){-v(S;$w#;rbM(wyu^qk@IHB&NRFdcAgdlKP1RAp@F## z8Ul7SH&CaYYuVd)$yv9C-2iU^P2}jt)QW>JRyxs z=nl7~@7crON2q&Cn4EkOy|ewbaJyp7hq2N_e0-Pm3`D`P7cMY;c0x)jqxG%212)-37208tkMn4ufTkLl?Yolf=&dAD3AH}s;4y@Xd zz_zFTX+5@sk;<6Q&NbJNTS+WYGTAb^_ac7MFBrrLXz%789(xfay_krDln*65r?lQn zK}rjdci3k3^ZBoBOUb>j#$o9HOrrv_Vic~uFtp$bqT{v`3#M0y)H`w$ws#mc2ZeXt zxJsnH;%WK^k@jmzOh4cFwsS<9cQY;NC=mM7ejZ~WQM;^tF7cXBv%>hNm#V^``jU+n zB3A~0(x0Ys+D-%TqqrSqd+Ac^x=p(Sk&h9!wYHPU)ufdD&WSm(q~-E{3NXHI?VZaT zx_yplRGtJ(}WN7Wk9f!qdi=@#z z3CB}OgDg2%;Cc&lh1 zqsLcBR|v4KC;e-t_+JbnN&gxCkulp$HIUq`OJ7ayp7U^&VFLBepz)px~>9G_X3nU9~#eCSd| zF<~lg&z<_T_16~4U@gZn1??n5DD2ZS4uyF_XGF+v6EFE+CSI_K5lKDD8RYnFe(>QN z!d+J<>=pUGEX5z5GJM`h%|Pk)b{}NmA5?#G28V(irTiyd6$AezPkYBd@C zL#i^#d@RPjL(}Opj+PCPDAH|7`YwpP#hhQa8( zmVt6(&w?_L>jRZjHShPy8K-5P^diGEvrjFZ;#~|wWtjI)(Fze<7EKXNM)59@MhiOA z#qf9p<{8AvA@3wWy19f8{-hT_0|slhSo2~az^N+V|Ej*!3l%d9?+rLz{WV`ZMa|8v z=mCCw^ySN1|A)de$apW*%vsr)7#H`2Lc%VXFr)v*!P8+A7IZfDnSvF`AorrIqe{F% zXq=?vd~t?NUR-F+_S5STKeIPR#r*eiWCAL>o`*J?s{!(#Bz$lTX@`iH&Y~MsMfZVG z9n?>C^}B~VUVO0}VLTw}2>GQ1dM3`dg4t$);=?9CW<5$61yAFf+oO|fq3Yj+R-_wT%|>2c zr)6ZQ8tIHNZFsBrK!SaG^MzuCUs-SIyVzE8djqyAljq({}ddO6H*8uhIcz93d=ohKY z#ON%bDWC;p;Qo-d{|jf!z|IK_?0m^_;|g~6|9bNaYy-O=gM_F?3*yJbYm)6Qh)wVP z0jR?a?K@c|0@YBE{Pd!5IeicZt#)t_&@sB)GqxNgTr9j|>~+Yvt$gQ)yV)v{8z}Gk zmhpzVyUN;W;5C&OjS+V-ey^3|ITsz6I&>m$*-gZ9vsMJ0ae zI`Qe%Vhj(f?vJtlXzRJu4V`i?od;j)OKPY6^%9%-Lhy($qj3n%4lS3P{RZhbgl`Q^ zig&su%8@s0ls1(cYb1{MWB)(&?r(M%_iuJLt{`FLOIZx(R%Hkn3@o~;Q)~U_7qy=9 z&Tu1ilbk(1$b0*h^z+_um3ZM@e&dP%kFYNRhjM-Yr-c?pi;$Q~QW8l~i76^dMP(^M zQDhx$WSciBX|dI@B}OT0wuH(uge1$9or$q#8Dnh2?C<}1XQQ%JA@%>Fpc9|tEiH+J}i@HW--S4Tp9pBrxo56ar1g#vqHwG`h~ zE;LBiJy40?_i0!}Y`({ihJT6+3Mf2Mza#mMxQ!|K=Wc1$L_oYhdO1aVy@iS3-j$~W z+qN%ZWhgnsd7Yb6z#ivJLO^4?j8^(&ASN6Af$mV2eg21w#i`;HZi!aJoD^ZfwKK4- zT}%~56R`Nj0E^#b%UES=ep?t3I*=vX3QnXB?wv6nk-zz$M1GzXj~&9_p8)**LSV)7 z4OsD*Xi{3!C(P2eo`7gfFEW%#iNS4?WT_0&7=ZPO$qPC&&_0NPVBq{Fispov&)3mc zE1A*Qj~iE-?r~)S+Z>h7s0reBa3cIDxJm2j_{kah&);1AOENcuBXPp0G*X&(G|qaO zC)l(s1wm*@&?JK$v+s)8l=6p^f-hwwB*X%7Jopu8WlKjKY2?h0p*e>fFJC>VxHRVr zwdS!E=E3Q2$6*gEucNtxOaax1ci?ZZH6pqlg2N%DX02ORsgc!u5I%1Hrv`h24*M10i=uDDTr{qpI`E1+0eU*!GK{!|Eg|hw+42!Rq zg{Sj41OsF(CYBiLPnLk=oi!Q4ZCSPK4%2-VodgqbYf110P1at2V0HbaY>~C=>@9FM zsitNGNvetECDn-MU>6ak&#am*8$|OUPKb|jDy0aBtQ?P;LaQrH0^3f3(b3W7bPxaN zw)kl78HJPk{8I!})3VEbbRQ3G>s8c=kYBw#bFo2`%VSjH3YotuR#Flt{Hj3TxeBbg z)((;p3KDUS36g9}>?PVb6Gwok^fOaf8~-Be18h>G!Q4Kea7BcBNw0AQlnkKc=RDJ! z7Be%muMduf?29;MT~xOtD};6F+O>MAu1b{t2r=JG*@vDTVI)x^?D6`SC3(i5mgM=L zL*$wM?=TM8eZO_Cj_*5p!~;DoAt=WMo~$RqwRzBV4*pa6$wdzH#31?!sv&?ZDU$vq zV<;<@!*j3R|9Gq)!GJ(3>mY4B2wWD2ewopTmn_LjD~_UxCO|v{a~8ndC-w++Bm1ne z(6qMl^?dtVF+zKQJTOm^9a&62c5m3TL-v|ZK^jqT3cjhN-5W=bx zw=vzWjzFdiGvhANdTo%8!_x)>BH;50!3>Q)(qquD*5=akEONe+xLiyg_~YGOqA?}Z zkWw5XBLbAM6EtCB8yI*0bKUU+W|(sb?9Xu^{Ipah>xxE0$V}Y*hI`eIAScDvj&sl_ ztq%02*Nk&|0-ujt*Noj0y&@G%zb}6bygb0cB}JEF25}VN#|@mi!4lHKizG@=1ryFfPGR_DXVyb=TY3s(o-_BXH(M%Jm=B zT7d_?`uqZ4L-M>!wYU7~3D`ZrS+Nib?dVpBNJn8VaJe}^~ zo9jZ8q_>}>*p!!t467z6M&#F9D;}Pg%R^u9Sm9RFW1LvHNMtpf03?T>SBD!@*2WQ} zi_rKPYMhH$BL_HcQGg!l%34(pKN#F(UzwvuZZCgKKTg8mgpq9U}oy(ee zxxWTmBVfRHI3dioJA(?Guq2x|aw6Vii1h`}|6|HDead#~IiuR#9?bNimVK;OUU1awBwa3#lXLe@J zyOsEMQ$H0#LGryd=2YM*2d=kQT*bd{t9~+gHbUn`{5;0HDH?4~!I}Gp8_NmqP=w>O z?$6J~*x1xm<;xD@<69JL$23}|(JCAcNI$X%_8l}8SsncgW1M9Kdy)N*fGr>JW+`}E zI~A2zLSshB$h6Z&xs12&)X~67349U{B5m-lHc-!!tld~ z&ogdIm*e<8hX?Xf=ecZpIWPUA%v6i@ep%7J%nYUUWf5Li^A~DibE?tfG<#$HjHTv* zdxPW&8nz+lrJNiXdDCr7D(KZZpxoYciAkb6&|ve$k&)D31Uk)!Z(q>LBIOX`j5c^z zG0FtAQh|xZp8p@OG<)#Qs!6Qlv4u3}=5w+rb(=2gm+4er%_G=HYy>zZ`@)ohYnRJ` zO-JnhHn(C9)Pk$E6XE`B-*Yn~h&w$4D@dSsYr}xBvT%paGvQ*moAKB_o8JUd)f+fV z?=Xuhug!k^-HeMYY^O7_Nhgwj1D|;pLFqZZYpw4KJRZKGjl*xVxSj~?}=@mSS zzXdr7xm;$N(xz(2;Bt!6#(*pOcj#toBx0rTV}f*5`V#4vFQzTmqwU;mQ9f3f#l}j4 zn6Dv)hzSdtF``;pbK|yr3dg{h=zLf5%4PoBw9?tKU@KxhB_{*}hLKl|_y=&r2i%|0 zRO@0fnSDRYciUG@8tvT5bPio!WVlA6TJerY6_g(R@^Mg*fxW$nms-AUXIipq!Y5CD zYh|(@7rpfzGQ2+6UMbHc5~oQaTrQxD?$m~x7WF|?3e+XJVZ(_}d56$D7`?F$y_~co z>!HgRn{RJH){z^{Z0d<8;fYl z5ut3hCeSgtEov%*>e}zUk7jOUL*wO z=DIIZAHIsM!|qYPE%3Osl(qyq6ajK`ODIsl=cVgRY$XYtV_@8?pK z59d!F(aY3_pp$k>a+q(Tu6;#jlj>~52x(NR;f>yAka9o6gHHIdL1k_vc| zWorc5_HDh}x09N+E#TOFSL>x73zI9@d9tL_*l&{Ts^DZfBRN1E4QdPQ&LpJ`g?gKF_$S&|@vu&^*}llXv3;c`F=vB*K_7H^!1yk-lrCHHo^ z*3>?D@IYgRN`g#GBY%ABloiyRooL3XtT!!5=+DKq!ABfFy4d>dYak9RdKpz!40NZ55>^bn zZ;d#1^QfVrM%+?974yOa7UVT!{cge4=~5BwzxypyMp_yTec?T6dOP%|tH+@-#a$LDeYRSF&Hs@)R8t1sUxH;=SVowd!Mdj(0jNJ;r74svce{3=bEX(y+M_{4v7THfSGOiZHh z`Iq=2;LJQoh0~sD1Q8%2tMq3Qa*??WmGHJ5(&D{`u1*S#>vn0#prY6<8J6C1{j`icqP@vnMId3xE$R4bZ@Ur*LB-#saudKck8t39(ZiZ!*R9~+Y36e zl;xrPPAsiR@gRHKv#)1|_pUVUPX0CKhTMhh{OM)gCibYBpP%CuZ!xYRDW;#^c`O#uGc*D2pE0q zXP^D6xcJSFLK88K%|&G4EDurlqq&K+ro1NGE+!JADoiAYp7qL2qo+E+Fzkn%4a`zmQ*jqCgnR;M&HYiPBHi!jFkpR#rlUFY3Z- z?^mY0ySq^}cQ#iq9tS)dvJWx8Uh`eQ=98GvRm&Yw(vK?V0d|tkNCgiFs|0UGZ{FuG zC~16i{e%l8hlT?Qq7>k`0|p^f{R`o@Y4^7p%^G6}>g-=(ox{5BtEgSxXRe*u+<|TN zo}oPik|2m+n0B@^ZRl`am8GX1$*WgQ4OGx7K*iHi>E-`1Q#oZ>2d9DGrrK9jKi~2Bjfu zd4mdwcfH%TqhxM2ea+@Jm4)7;ecjjV14w+Wu9Z%!CvJNYEtOJg%Gvbv*x^^<+@>by z#J9%ZO_SqO<~f4iD^=4p6<@bQ%>jVvJ{&1vYH??kjgD=VTP7vsdwOrNlR8_@?DOM( zGqd4&@9kh+)GeT&O%bGG0(QvmKH$v~o6QQ3>e#J*@WXu}L2 z*#ElIWzVbmZFM2Q6%jAns&a*4xNgM5rW3KRiv#v`y}-VX4eaZ3F_m91VR)mnF3FjA zt~#+9X|z7LYhT53S|UM0r6`c0=0Aaz`WI@M?%tS|2JO~L9NfL;$=R2wFHf5&!v^(d z@xXiHvc&+jkw)T4*yGhxfAWAZ=-T+12Y~hHD<*OGTM24Gm-V^yee+_sWw}gYSL^5- zWOv{;!%LI!mTEUeaW_ z7<^+zjsbdikbKvPe%pXO!?y|K?Sf7g^SIJUah5q(0jlDhmyXSw2KZf1TD6mUI~jv7 zDAyYPXa#R5FSTnQK;!Uu$gT5iF@@dgoX<@Tkr>Gl@1LQ`ztXs_`LpQZ%YUT%MKCk1 zw(n|ev4&z?$apaGMn`fpcY3E`E#IUb2!2y_>1>GQ)4EY{sZ)L(#&~}fC08=L>;cs9 z4Up;m+j(FZm_cvqeBlzvGnsZ)Q3;1$zkR=+=Qx*#DVvcyyi>>gK82NrM8MdFP@s+} zZgb)1nSxpzAtZN-agmI(L-9^Yy?;?4VyXyPsRW`o|AR?8yffq)mio0P?B(q1P;vVyUb=>YVD!on#bD;x&M~KU!US-tN)M z&NC7CckecZA3IEzI^Ko8wSM58G~X}!w8;jK*8vc(N8>(ta9Y=wLjz-cu2WtKT84W7 zJ)|o4H;aWa;SC!;xNmTLL;BW2u5QA#u;AH=zcWG_`*{cYOSNgf`ll(=gJDR0oRwZ`#j7 zUW(t(%@HGyD{Lw!7;L8phkEX3t#~>)_}$a>$lMLS)UPzH}ZJUr5FYD9TLc8|uf?AEY=UIy7d z$Ay-Yi*K7YlQVl~b(5bUJaU4g@S-&lS*^URD&);-ww;o=03b7;!{#XgYk9LyLzzzb z3Y}9EPaB??T;1J5@*oyxxSLacxD@Q>+N@Bkq|Pl{M2q8l7Q{hogdcbPIt}qE!kkON zQ7WrHwEU^bIddby#S&3F8K-Jeq@PGME^`jwllL$)-ca|X$hkQHd7hnt_@;6sP) z)gMhZ{ia9q5>Prr6r+#?l+ZPR^qV?w#=1t5trv{t6b^A*SX{eF!jEUJL(pVdGrCq= z8z~CGU0S~ncb*()?=QejW{U6rtbiMCvwwCF6LXQ|3|-!vgTcDWQrvWK0lNf6-VWbR z1deWPb=(0%89g+4jrc3Th@9TX$uI?ZvV+Yw&Cc`{x}CrYYAj~KB@2;hz`26>uUvh2 zzy-Lo9E9oQaW!xDl(#d=0lf-DA0hOrFV^YoBO3t#D3nCWd+t_#x1^(`|51WHSnXA~szzz@Tss9W$0drso z(eTI4Y4~eiAp>9!$}s1JgHVx6fNu^5P`nElXfNQdHz)xVMbH(#Wxc&BZqi`Bd>Eg4 z$E$QjTg!-r+IAY|FcP}A+xr1m`ulYd53KK?t{7{%dut?6>1GUP)6CO=V*VS(7_UW8 z#*o?8WR?|TcmaU`O$1BA@AEvfZ(qTs(a*cn8~*Ose9;TdiwQiuLdX0zsEwV3!%v|r zS4e4zGa8-M2iXkvSpys@kLxhaKV~-la;|Q_!_&bJepYHaSPd+hbu7wxgW0P6w1WjQ+ z|G1c0=})3;15`bw7x?ID21HN*7F>V!HWsJ2-DL%b56`O_NP3-_X?CVATOlb)KBh_^ zuESQkhFkCM3}7d_*3^FaP%Y>P4K}bd^2+7DJ-}&+E^ECq9R^}A0vtfl6X4{6N zn+|38i0y8sRz*et>ZPEAiwHljk2h0=eg*dN+|ydub_n~9$=gB&*<2NAULOO(vlA}}?1-$^I+L#cS*b#x>p#-?6hF3HNW(tyWVJ|m zonTyEx+5G3E;KL9(Yx3D9=hcK>D# zMM;U5TU(yHwqU1-kT>W8gCSnz^Ert(VrSYx<`f_qrib@ebmX;7a8%#KxF8sxBWF}z z2v0NvDs^7AUif`(bFGv5*Zd}u7EJa7lNy-rC#Vp4{^a7d5MF@Nk<1}?kLJg6YF&AH z@8=kpb{WXJ($E3>DHqgF#yatCqg54#;Qj_eIR`m%AVj$TUIQs3x|0CYG^j%`=J+=@ z(&4pX$NEnoeI7D7`A5iIflb6{XHl>C84-47@iRusR>)`tRBnpr2#exnsrtuuMY!1+ zrdUJa_bz#+D1}!n+`eHGxVb%gv{OT4fG)rmV_&e%%WU2ric%ZN7S+zoKcpFPTccm} z;{vu_^^D5Z4rgftwnh&2AduPB8K~@@%7>1+S#UZgMTtwl9$=L8QIA&g`n$r1Pv-hN z2#IetJCZ3qNsJiuAmUG9!3?O@)jB6~FiEE757dpPpVoq(p^=&b=UOL0K6v50w|G6=x$=bfzBFc+XC*{U6)1>=#3JhoEDV|YiU$U1+?t zqBx!VUB7mPW+>>W_8;MEbR9@;_+Rpp+Btd2*4mhA>y&_ZRy5{I(03|mzC3BQN#)C< z1(DR#izOpfzAqAjPUjFkfZ$|Gk~ZO1dA< zaaK)njx2JJQ84t)vGYR1qxrC~wkycO{nsASd13T9XzPAe)$yNP4vUa_<UE`PYg19+DnXXt_SVyMxQDs91Wr$Rk9_%5)o-WK+-*FUP5js8t1d=u@lwu(CQ z!d{l?CB9dzjAZ9f`42E>Bq4J~XpJfzqrA^E ztZ=;waN)%uMtBEd0l`Spn#Gb(N*e_QI;?chK8ZV{dG_kSe~4@ruH!ZDG;=3EnWry<> z)$ZMqn0@R)SDsGkJuLY{=_ z++9luFRQ0=5#g4_Js6kz@4CRpu7K6+59!325Cn*FFj)UBrjwxVr+o#Bd{EA4`UKBs z5&}{*ak1~&eLHLr^L}mxuy4I*tZ1?h2;cbmX*;$Kx_X3B9$mt6|9*sS4399{l<3|0 z!qhVC_35JagY2`Pu$Mn5PaTxJv#4*L>XtPj3nz5DDlY8M<{z8o68@d21~9Yk06uO+ z5U`65xC!M@K)Z4xom5ob<-z*;sGxR@KgkrDVFR1gl0KC7j`fN=k7=X-kX5uDKk{>+ z7N9vMQDg5s5~eeSC;TZR7e2~z`j*o8z#hRO6)8GfKz?mg$KS3 zEJl8WB=g`Tgsj_3tkOsgWc31!GyV4MFrH8%ExI~V1^yDWS46P)e?wA})0yOX@DWD8 z;04X%st~kTATlhJkx~)v=`Z2g5fP$= z;6eyG%#PxTo({VLtTXnnT-hz~Rq?SEXCN>LWPw2-77PMMkU?Oq`$!O51M^o>mPyp#n~g>LeJkGdn?|DBa_!oeKUa`zBQRCj6 z!IU>X5M|yxtk%V2Ku- z@PoXGc?11dxB=r_HqSV-^KUQZ&)Emh_43od+Kq0|Zv3O$00wnT(azv#5pOLR@f9i7 zU04I`@87=D_<{n9{LW=|0seMO7sP)3H3vB$Nyf#yk9g|cS909@ zV#jpaQroDZwe^skq8DnJn($7;m+yKChj3H`mT!8R<%U$39h0pVS@nNVmXTR zXyhF6|5o%|dYAiXUQsa~+GTzHD@X%)8)lj+c7TfD1f5*LzftnHA4_pdy9hzt`yJZY zk-+JT9iM4G@myzMRza%_1s!ajmI^YRqZ0VI%->!Y{f~hP4|BQq3v&_Q4yJ8TljF~- zB(LdcyD>a#6wmeB3M1IVN2i9YCX%$8rxuJ@eT)vDtbVs7D!gBOK-f}gO*r3o-d6~J zv}++4n zxeo?iTxL;I~7q{oRRv05UM(HRL(Hf`vf(_4v+9rka{cnhauZiZpH ze@0zlueW4$qMiXW6(Rgq7>G`scu#L#@&08Mnq3}drn#>GLXZpb{Zysz&v|YjZ{)^e zBCZJ6P65C9pAo1V53u$^_-^LnA?{}Uwy|DhBT$uJkQ!E*eBYT)s~G1iMA;w%_Aw%* zN}NCl?J)*ZU}8O8Sh&x#;T9Bpo;kRzftAn(x@_Lh{>6Vjo-|96hF)#|a%tzXc^{;6 ztY+hbaTk9N-g-_f0iPgoasoKZXHo&m6+*yy zmrZfM@!<>P(_5GiO#l-%&_w`n%Ud99oxyUs#4PC??Qq_Fi%>|f&z2HDzT_j(@)B!f zG!6z%pxLF?!jC%P6J^FapKghhU#D|h>*K^=94f@>_fI9_FPyf%7m|UR3Jg#UUo@*Rx;)h;&$`9YUpR#~baO=llW(K5`P79ath}kCK zdINh{l|k)i$FM_ClK)Cr0{&_V&NaXXEZ-7BMp*4Rr&wMM4wbGEB;Ks5&8>(rH{`oI zd|sMEp~AqM!_gNjG~UaIFW_G#b=n1f>Aila>FVl2_AkE=^2pSHOKqvzi+JU1Sb0pq zxe{2zRc-^HS|a-(Sz@&X>zO5*IL>z_m$r+TU!z`myz!R3c@NK!qE7pnHFPuJxqSV$ zM}gg_oy=`ZbM8#2PTne#|LJ1zPT2BJVUv2qATB26I#VbfTHpHV2reFToa+YNYHAb4 zwUB|(_JKwtzMIk15eDf3&gT55bKL<;QSovL*^yr^Yk3+!Rlu}IQPS$0&8ReS93;=*YTo4!IltNE z_!T(w9n8+nY@_AK@T{&ktOrgDw*ni#$A@=Nu36QaC|0@PG<{ z2Y6JBEN1}6bK6V@)tMj)y}+Hu{k99ZQi6+uf3wP#yy@MW3b1*-)b?Dm34NuslHh2~ zELEnlIA_6)Ii^fxq3vQRs6E#SSkz?xRPDs)O#;$bTwLT`!4%MtoxF9d(mV0f)!7RL2a?e zUO(*Z?X?H40?5f$5gA;YeBt!Bj?s-oi7GZb6H=LaHc_n}-$YZB;d|p&k-GyAALHW# zxLH;U)*ReTsS*7>uHLP-2ygglc>l+5A{RwBK4037dQ|xsyNK;-4OkYj$Wglw|1yd_ zbB%j~3qrR}Z&|$whl?mKwmPx5GVXa?g!5*($w?X$x%q<+75GPikwxsZb7L`&6s!a^ zV>~Q?U&awaa9%|hN~Xwp_7p?ZK%j!X`u(`FJJ=XR?k&f{FCF66P8H1CS*{NxYNj9{7WlHBv;@)K z`tI(4-ug0PNwH!HFy$&~NlOY!R)Jk7aCD~HvdT#m)b}+?6}ox3Dg`y%Q_St<2Zw%J(M?1DNujm ztsX+E@Q@@Tk%`M%p2Ex}jvAUrV1C>Q@iZ^)gt*B|^zNpJ=zZ6VQ_g=SBo9hc2^JQRVs9X%nY3aqj=uMH~xMj}D`!1xUkKO?;{ zc2}4w3T{kEh&-W6hlg<5otdbZBWXm`Y75Ry35P_)KC5o!Sd>&z=gP@E`TCfmL-2sL zPcZY5$ItyG+R4^?)e?9lBM&yAf@&3R3)a=Z^8 zF^<>Bg}atMI#G*$PS;pQqqTsq5HX0!<3z$kDnWomIeR1cUDG`S`91_~Vtv2Jy$e6; zJhgqF&!j^Wm|#ow3LtVTAq`IpSC~Q?n>9!5=%On zl${LfVF0y?-b=L^MiWJVRtmTf`E(|8)cx39e$T<(|1qc+A^Ilw>ciLCd}*PqM@S%L z6?q;BcB7^g*76fDWe@&JX00$oZzVXv! zNGYOv<&uQBo82Nge!3tD&y2Qji26s5q<^FT+)bI)oAnR70B z;5?6i(;_jTTYV)9x3AFP;k}oA3Q6*5J$4y*YM!qpwP|V`iC6k4k5C3&idGcXrp=gWey@ z?-}j~0y)oBTRVhY{sDryIf{xB7tElvrWzh7V9@}$UKU#Z_$G?z!*p(>mTFr}H?RTG zbXl3~qFNsV%t9LsBxq66OK+dOcmYs1ILS8nH=M43MWU*E);?Ox0eC>C8+c9?-|=u& zU|$-;By1jY`tW%YSKWUyfdU@VebYOVw>Epge)|!v1ylqK7|wwJ8sM)v&0*RrsnQd| zp1Fb;3ZkL?A$B8&^(|nd8{5 z`^~XUcK}1<^te*~HiMt3Z1%qLhy$AS%x4i%_XWsx=PREKJ~-67a_Ia^GzdS)o8(6% z5R*B1@}mgVVt2zw)Np?49iP$_r3lr+j}1oXXnl@LUb?U7Mv#HvOM!qiDrj);gUzO| zc1efVWjy=K0F1rOa$USsjOCov#xxw^IQz($XRwnm$%*$!09lwFmyC+fU8MRpYa5`unLQIu-uhLg7H`wm^cEtM!{xZyN$L8~wXwCUI= zRq8@kJQlH%a?}JI+l)9-+=i6_x)&8PtAOh$ek-)6aCn_<0@oYn%;|o?<2a(+3o*euzigs!{Ajg8LS)fir*29J|;S^-SV+PEuhvRDJ10yJ3it^a3 z!$0JZftB)jm0BNe70$3}eQ+O5yIRxAwSC-JbCAJ#mk@j6WjDJ`+hh zzyU^>mpu=sf7~)CzN9;(!uANf!a#(JFd_g2{uJ5=XoquZyM$-1VVmbi&bTa=hmaZ} zv-r(5Hy9znO>13E`v8bZ5~PdHBqR#@eH^>R%m{2|`m70lLJ2A-kU8}%WYE)M@zISN zuJ!vTXLAgT-!(R}=YIkMJ^o%5{?!9dgbMm8&yp1O-#?(R2Ao(>N_b@I%Ek9z6==8cko+i`g1w6E`C#5MkC=F6Vr*<1Lo@fqn~YmRRSC9MH&i?f?N4n6SW z)KL_xiQ@zC@Oj(6qxY#^_R)rtSA2mxiSPvfNk33tyxRj`J8?`@lRgL74<4mu| z%s^u^r?;ndA2UD7l%rKoIU<{*HqV7Zh9|al^Yn$Dg4MMWbH-^zSIG2NXoF8~=oyOTu3 zak;SwDxlr@H9p+?Jbl_x0wK)`!r; z<<)QBpMM&)M7yIZbk(Zja4w0>ffZgg{RoX$n_E6@EiE4Hn~df^MXB`_d~DdMrM{6j zF~IyWF-WUI86N;re6Uzn(Om}Y5qUMTWp)g_6I4or$|PxGg$VgF86jVaj<(K_ac#=L z!A>KY)VUeleToiup>Osqs7r7?bHrVj=%SS1*`sIzXGk*lvUYo#kpe9o@rE~SlQ9~^QuwyL2Z+K|o5mJXlTejC8|lw{oi>N!`&H@NDc)k>`LB)| zsXUjC9~g^^Y#mt1N#~i_0Nb1Y(u|#QwxJcPf@9U@Q+d4o^j6|{RdofWZ;6p9s)dWWQD#Jo(`PH=sI9+3*sM00l zt2gf6!LY4zJ-X@4O2bViN=r58MJWFD)>!%ILAR5kOendw?sG}7pr$hpiFM(-Ze>mbuvxws74+d}r6gb`At%}17PA)p;B{|g7e zdtiIZ{y&dL)%9Kc&>F{|6aCfbYqqYsC9MB-^g~}>onG+*f0LUJ`Mzkm!R?b>^bEZv zueSlh`-1SU6Z70QdD%P6^j`)=e5-gN@J?iSwFaI7-ic|`6iL?1kjhz`F}+V|M+Awc zKuO_5DhB%&AcH`tvenC~>GbTjJ< zdwZAe?1_4?Zi(#?Z{MR=mCjMEKNV-HY(PA)hyLYvvZxR5_@EROa_@UFD}#3tI|%0d zP%a@45PamB4*B`Ki@7cngr*^7wO;7g4KzfIht!{uzSHpwslPoFgcF%R9%Qdt^%_BKMEz!O4jgOjYj1VL?qIrYf!8AT!HEV} z3}T?ld&|G!(}_i@AiPA~#?iKla#qP*2}i&u+SGyQ$e+{v=*Uo_T~q_hM@YKZfakFF0PHR*C<#s|>sR59`U}faT~jLmdCrXvhR;#$ za<2pC?WDw`C>QL&Ep9JDwd)8gj33p{&giEqmfY_^a?H`Wts<{b?OdG0L-k8|vdC+Q;1+oDUFV=s5DgXle zT+rvfW%V)poHjGLu)yPnkRkqqlNnX?gxVJuwVEMJ27+b}V4R&tc6Z!Fu3HhvHcdNg z{t99-Jt*xoMV|-DBHZ$~UnNBb8DKExGijBtaKI^Jg%5DbSoH-`0kwmNRn4piEVp)h z3mcrl6uKSErTB(XuY7-Z*c*06L&yC~hClyM4nIa+y<{PnUjF2YqSrZz(K!PElvcf< z2?KslKu(BP_cI#*@DUXi>yo^gofVo8xBOr zV+E<9w~}wQ?NjM8TCR6uPJ>g$ zk5lT;(oOijD7RgwwZLPC45TYfoLsu}g?Y-|Zqa2JXE5pe+CRmzuV%Pv!FXD@`lvpH zhQHDVTn5sqa+sTW!Z2JwF0G+)A}g17HeTm6%Z@}UTRJ-xQ*1EgQc(ecif$BDK%m4s z7|UdsP7a%Ip>68svg$=SnKO5{wdkz96kayUrF|=W60F=zqC-`OR?hzdrY&VoP8u^J zA%cBs1le>INIu!M3sXU{Q!}nBc9&a^Z(whHgZ7Pyw|!fTo|wno zl37eH7S>5A-1a7ks5MkP4(YCaVr^M8PRe~}LC}N>XoZs=ALBfH&w&GhaY>)la)W$? zK(p}9f+4sU!rRw{w5JcGXLfjXGKlE|vG@)z4FX(1;sB1yash!K*V(-?0s^-PmD+G^ zvpLfbN>R9*PkJU=unl!={%y$}GXd3Cy$MExb{t%!m6oM)ByO#&thQ-dlPg)O7=rx? z{j@B?Gq}6V+G_)u?b*^Y#Kd*dt)3_^+}Bg$2hHz2M?wKhcY@C$=r0q}O;TJInZ(rn zkdLv&P0@#vRvvwi&6Ucq^i=3jb4bHdVymMELfTV2n9PQt8m|I!wRbtTQ;wP7J{*hX zwEOzLeB+g$iEkKyGwq>n*jhj!e*NqNtimz8oU}M4_`kS`V)OeY_vCvWy9k-B-SkgSvN2+K-d*iJCrWihleY5372VEXb9_|=)@hY#82onGbS@K z8)%b&lWXo*Cn+TrUBl!CYSDXfwp2!t+YWK+o?p@us0nV=>PoLU6YoEQL&FhJ0^7wkwb{*XzndDnG4wGCja$V5C>-9 z+3->Ufz@}R!ubLMR7T@K9Hy!B{15u!?s0$7`>*?}FJi~jjfRI73!`_gT@yJB9&AX% zYM+Gnol3ocndxcSlqScd`W=0Tz~+L=L}k1#?IbVfMn^XpoSO`hg@;jZ>u?^vu^EQk z!5c~k^?=nzY%P5%kN*vI>FFS$6DX?I|4rRn&OtB11JRGMb5(Od0w)mhx>>J27ya+s1qg}M?#IvTJ0 z#^d2c3SimSfBpf!@b%t6o9)5r;MbPso>s-?p1~<{%P4tOh50%Q@T;SkdlF||^2cVg z5oJ21$9-F6eldQgW9;Ol*ZXTl;$96U-CXXa1O*=rGTxI`;2)z^I`H%7<|BG~3Nf{I za;}-_>5z%6?}*?1x1(JUhlbV;+YPymMBAPlAQTjzY=JmA)J;RD=gO1b0@NCovu?$Pdqj&y;&dzJ}F?bvb$X6k~FMA*BWp!Zf?9YAb zO+~iJn~Lv4WI|egL9w9^yH{-7_c;9X2!UhaJqFJJ%e=^*+n_6t)yCgO2?#taLw5=a z+@9IbxQEGYZn1cgq;NO9|AQN8^w?QzL-l$0t7#f#aYe%Ql+h+Lc=}O;1xhMzQ&pT} zuGd>*#e3kN2fi#J!%H2dDDN@*S`=e2($FpzO=a%0geNnLajy*gg2AfIDMn9Ih#ote znWJNi#gBMg+Ae4K6Gk7d)&C|FfFLkQThY<=!=>L}cVZS==!9TP?HR8tdidB+v%t zQhTOFtSv3ITCPC5u6d6c8WPw$oVaB;cKg!V4+LhiPzuNgq8R@5gdm(wLS+j>AI>k= z8pj`K+Za#|8V*-x(v*`%LMIUd(+$+30wz;q`hlSBvkL)fwM}l6V`?2%7^IAZ*G%eB z8Z~`6p8v7gpx;FV#=!7A0fB|HRlSp3isL4Z(QQTVS5$b>^;|am_4V}_y;Sd0{lwQG z*>THMoaYensK|z1xiVYBv9Pc(2{Mh@SW;5*b!23OKAsfP*wWIxcIdS0nGTE8!ikB- z3(ZJ9w_I}Lc=Jrl)(->wF{5p5q_5DY$USi&_I^94k zBv+@x{BsCymSux;sOC8;*MeYSjTHTSe)V^agFW!94i;{mfWZ3!dZng-fSXyxZ8vaL zA8T(n@9(L2Wc_1gNM`;gH;GF!aI}3$vjilOp^@tC{b{1!OLCpa(IQ#%s|9T$;W?Qd zi|Eu{=pPGXwY6`Y?rgy%kv%7VdK7eK6!zwy!Aql2-~_3Pfihbr`)V=y;P@C3nTHh+ z=*oDYRao6WaRyA1Djjp%52ZDkw=us^-E{*Cd#NP2>$)dcg+D=2Z`VS;Fw}ziXfSw5 zi^@tMwnRp#kv&^*NeyJDnE~667C*-uuGwi(X+u-YhHHA{4lC=h_3i)&`A#3n=Uzpmp)9I5sIWv!hp6q2HI|I^7pSj7=W! zg+OJV80LMaOT2H@IX*e;nQ55RLK^bQZ;A8(4|0K}UoVKfK%^)JX%+O!`FneNhcr6o zp7HhdRp@aa8HyEJd1lBJb+&VSwz4+yE32ljFGUu$Z!49ov22U=8;`8W!hprwcUXpP zI(j)rVeH3`ALWCCgO}Fs+XcRglu!4kd%gTGgW?w`BcSyL1uF7Dz+!EvVB@r8C-Y0! zrlZrwX-!XGpWdpZq;wpp0G=Q7V3kY+<1wVJ2X8cuZ9|6MFk*{~-9toU|C*tBI}xaT z$}N+{=#Rd>o?!hD8ir`OtVvZW9sH>UykhE&A|kn36D=T+<-2J}04$kpyuJ3>j?mTA z)O0=QNCHK+6!NSjkX5y`w634IeUr?-@%X-apQZJ_&+~sIOcY}qEOivfLz1FW;F~z? z&4~*J@BSos-?)$=*XT;a>S!AHA4FoUAoI~HS~9&Gbdy>lgU7-58d-F7ANbekGfA6r zJ)z3Dk{B(2U;=JxXK!CwW*K^u-D`+S$;?dO4b^x2xqsXwZZPTJj(S?-V>7_=BT>8x zCW1*PIj(FU=lnPY47bRN@Kgie0ls*a+9JB3zy;yG%%K5`+BByZjZg2gs7t$tX>o4- z=8KAo`m+iktzDU~5+2bsusg%b1#H1aaU0oMm^(0LcRS1k`q`F1gDUQkgN8ffvI^hH z3jM#@t~8*jGhN4F3W7qc(1B_pQn09~sHkWm#F37GSVNIvQvpSxiY01Ml#m=8m$X$u zP>gF*1}GwgMT%huK}8Xa$`GI|As_|_5VjMtXTEbzL}k49&Y#O4|9HOjeV_Mvp6|;! z25vri48M-3^=^GbkxqZgac;zC<-~p(TorAIE1O;no5kaYP+8N35 zTQH9?D&0A;C#KJBPsL|?Jza-4MoB(5>dXP}TFlOTFIj#dGMW~j$x&$3cvogi*w>Nt zQV1jgcqN;c!@k{67Xs!@3k6=U7UMeJn6fuSuNI4X9U!@2OA`qo*WpAjBxHx?k>lQo zIk2r^#-!6Ji`jM6#mzg6%If>_@3|24t?rzQ;tMoN9`7NmX0qrt=8UfPQ&k1Z{b3u*dX{81SKIuNrR;rTD2a*V%sK5?Bx|9y6 zNvpLhTq4?84?Kw*G;xMg=8UJ<=V{QFu4_d75GKOs?yEl4mlp`5?S6%hw282IRsI$x&I7cBd0x zicOkZPm?0)U1RR9ioVOb_0_7fC7|TZ`k+TB-wms)oO$&JHpP{=LN<#`GQ78Id&bA( zT6c63N&`a_&&XtoajO%xCoeab6}fgn)i&n5dxHRIGczOT*Vd6bS4_z8(0Jr@5Q!zw zt#mKkjMW?q#%n;t)Dfr~mapX3k`B&E^@UcRt;4&{zk1a_YVw4{N8R8h*bZRgM4T;s z=wwx!DHIwSy8rm`<1Xp<2J6_aJ|Q7HBh$+|e=Ftsp6u((dXOWxPWih-jhMM|R`+^s zJ+E#u5kyT#Z=4K-%_pXM{fHncuv0x+LF^5~S^5OR5iDX*$gbk9J0rt}&%7Y(Q zwH?|{fsDU*qCT!0p2`-%cL=S!jX(ovdcYbHjfPYk@HnoTXpe-4_dIZAE+UL9lX<{h zU0pU{2)-d9f}e{kiX!4V=v9hTx5RDXowHamjABK_Zua%SiYsV4>8G^5u}hGaM!v&F z;*p$wug#Gb1w}>ejgF39W4wRi5hb5B2tEQjSzusQU#jOKF*yQL%QOlx6!)cA%~L9h z4-0F?CcTknI?|G(!9SmTN*$%p(qoftsdt+PpZa8({pBxzi4teAI(!6N%IG(I%kGmg zKV=KrVGxgK8`rL1-3i%#zmS7h+Bu*s6c_O zWqOzk()VHBRs@F3Jm$)KZJNV)lZ~uFJv}}9!otE{5DX;EWD=zgYwwpLjE zBld_muiRxF*pnF>`jtNPJGj2g0F7{n&DxZBX@4f0vMw+8tPgqqNR`8x>=tTGN~HCq z^y>Rk`{_5y+{zrq$Mm(?JAI7<`ubA+U2`Gq#YDzky}qv&MA4E?^MAJ@8D?j1mR6kqJLE1{iwZnKjZyn0}8AP3IynjHwM zm4vvJdG0j6Dw^BS3&}>A!B0vxzcPH9i{m*iN%BA&yy`x|-AIt2>@&976iNU(>N>AD5K)o5#VB)YDtl=cMF%v&`QzsKg;ld%=%d2?-{UqmI8=VNl}HqJyKkxO@gYVR zx~d<0iSF^8#z|P75Wb##vX5`6a&*jQBB-kEAIsBNixm@m;0L@;++H^ynS1*cJOmW` zCZM+tNzZ^A<2NlVEpKmgQ*QxMwbx-+@nM(F;e@?-Nd6JE7c*=$HD$Mu*jWa?EuSs0 zYzPwYS+eQWIIV?Sw6brI5`s@4{CWhph_ z?;+q;SI}- z-k+|3-xpwD@t?R?#jVlx&4yt0jJ|bQ#gk!KWy3YlzU0x0{>hU&$ z`X(J#I`A08W;GD^8C9yuXujeVAPKPmtOo|J6T%zGG0$9d+6k*&n07*!x%D?4(7I`4 zPh_p8^uh?0PNAH5@-e)h3HK1d`*A*VX4cl*JCKdT-=jZZRS)fORe|^#xodF=5A<^a zQS1;kaDbpU{!VTD7h(h19%mHJiz7|G*Z{2xe&1(0Ac%T$J4S`2mjT3AZ4U`4s{_!B z3yna@58&$;E^K?uf>*y_O;ekWi(A56ezykHmnh@0LvGaH5DWm`FGKnoI)pLNU%;y@ z3kxD>akexHMUoW6Ies@UPx8$I5RSu5)zoF3!+Ou0H5hgI0(cE_5sjJISh+c)~t6pCnbU$9R~zo#7$#-^2W?Up-m z7!Mv?`jn>o-&gk9Kr9nw17>MH&8N@b0?Ia|}je^TDE@{j!Vh!AUaZ z6iK!VBv6i=;Ht_n*STQYfs2yG13n}D2#p97d&L+A9|7^cer)m? zAH~hhbFYMTcML*H&+hI!8W70B>*0OfoWvBZS`@LDthDgp@p$Y5>u)yg)Eg|fQelux zP|N&-pL`8ya=O+tT-;wpSS(B@f5p<-j zA$& zg@lCdzokaofGRSc=qjyt3yc}9(kKY*CpSnNqzwf*6QbQAnc^xs*6ms4asL`c?ELjs!eGd8sExX) za|8;e!IY{E6>!qHXYx>%U$&iBhEG61z_nJ4->86X#8)LH(&hVfPA*A1sPrto;`|Hn zA^0(oJoW3V3Iy_J&O42*-V(|AZ1YCrYYr_U%AXrj&FTk2b_KKW)VoTs(_WB#V1NV7 zg2T!3cMv`~*?=#6LsC7>tGIMbQ!W-qtMjU~N0L|eC18NhLE{SOVg$5sBY|ilt}kyn zO;Ud=9ILZ3Ie#7=P5fi?k`yms@+O|i=u25h>?!jlO}ye>w%A+eUSG!=yGiWRsb#1x zkwi-#dO8Qcmnfirq%=f4VeAeveIHZpcA{}*<9Yy!^KGR~<1V!f-fX+{? z^twLe+y6#l>Qij* z#N=t%+Cc3dzS8bBGSk*Bl#n_ukE!QcDkwSqh$^YgDg%`N~X&D|n<@ ziXvRA_2b8npFd`a$C5@qkd4mLeWYlpKj~?X^OK2@RsNDgG*me%nfjU?1G&gp5A8tN zwB?tc$@Sqp>01%F)-3AbaBGwLWu4WDC1R8Da_5F-=be}>3~P1+9(|(J9(leUp}@FM z25?TfuCIt6=s8oR)R^^zIs2O7mjncXRTu(KVX@$b*HFt{b?D3Vyap}-2IRG5>gzm? z=}n6%`}P_KOQH)kJg+>~^B@6cSk$^kYQWby z2hQq}9E$CwG7nt`CU=ix2!&(kxg?`%>BCJM^`CQCKCORW$w=vwuNvL74zwc`K=iL7 zX<7{dPh^4+Qpq#2a^z_Q#C^aVddz)5R_1m+!wpFBiw30>qQAb1L_=$890JPi9?7;TjjVC--c8fAw6x0y?g)NrFA%BD&M{BO zEbIJk=&ul`*)(>u{oKjQgD%qnG*4ZQUW&|g$lDcwfBX;NGvGkqO-)S^5{M%3?GfI(1s6N4 zRPH3@MShU|nWGC%_!ciNrqSB|SMU;vLg^v5rcVH3`hDpdn#?aR6R>XT=$x5;H53%p)Ku zxa6fxr5EhzKy!W?B=}zpcc3%?UAcm1AZ%;dM`(x}gE%qtQqfZbZ#hOG2LuP2+RkWT%O0kl z4)!y%zY6HSlqhE+zq1Su;@S5!gs?K1D%L7P& z+Z3@Fb7?U+l#V5h&Va*mvYrSimxKYS<%f?U^DoATYTP@b+J_KTAx2a=VWl(!h}$9< zor$}&B)KsUxnNfTh{qMJ+U?8=#J_R^oZvScEqz5 z@EyI%_L$Kas=Ct^)D9f(b_&8>!C8Uzk8!qfLvmN}ZSTDm!R!SV76I39-?qeC9#;+6 zz;F@xB7NOE@~J6ED=pF7X%`_C<<}qo3=GKXZ})C;0k=IiNDoz=80#^2qLvCc@f#4A zdpXaA`g>*Z;fn8|&UVwQOnz;5sK+4u;+OWu@H@9?D@fho%pCQPa9{ro0o!sr>0$6? zx*13)Xg4mHNMMi52acME!Zm<0^N{Vp{gH&sA+#1PXl+({;^~4G-x-CUD(|IWsvLB} z^ko^&55)Fucr0mR#=b?9^@hQ|;g?Hf2dXuDiD|4D&2dS$WD-VlWRo*mIS-+Z&<=Xk zTSJJm@QAbYRu%Akn3F6+d+43P^Hq3w`1Xu4TIk6-O6RL4*OH8nHi+qlo70JXpV}a@ zBy}#{*W9$)YR&J|88huBu6~_>CaDwk`P*9>jIu@OQrEE|o%aWoBL!`|{@ISx0|dvu z+oU{DLBWoH*$p<$XtDkf=I1Cm#Idky`eYN2d&9qFbC#Xql)${ESxgkx7tM>MKHC$c zjXlw8XX?pETxJ|@Y8Apdye$gc>40^-BOO@5De|+2jAd>olpJ|}*?4Mx*DtdmO7X2I z)L<`sGY2*KikXJMJC3ixOg>52BGOxv&$!>6q)9R7U$(vSN)WyG*D7$!;d}T>P43Z+ z$c+K?u0Y@f`~nHP?%=ERAwYz@=b~O850Gv(Lb{=8v(J*+gYxWup(pjCkDS#1CO9#$ zi?3Qc%HEm@I5w~km(oX&HfMV#`>vlKvt{R4#kQkXIf7~VjFly{*J$NVDAc{oMo}*0V}D7 zR%XA4Ml@WgY!S@OhLn%MITH9ZZsw~dq@`-2Cz2XwTQYn~mUc@d64Dpc!M8SZoa}N4 zbq~ssWe`e|RnsIHp~uLrtt@(p z&|uL=XfO)$HxTdzEnz#5PkV?1Z#o4>Hd)YE&w@t|QPK|cZUnx(qmiS?(Dt8*3Iv^* zj{h|D449#eMlyltTDlNv&@35ok6YKHO1|SAK%!oh90N#Wg{mYjdQMyfgo1Mr7Z~mduds zd-ioK*_W{mv(N9Q-k<0FeV*t0JHE#;f6T!#qu2GiuJb&v^SbUjhL5cc9(ymjHLJ`^ z%1>&GpVU@ADQ-WhZGKWbep0-CQhWtckk$}jTg@55`{NLe09*9!D-rGsEXhyrWZE>7 zYZx%oOEQJC>D$b=NJ8z^1-D7;8Fw3MOY{&;J@3 zDA|7s-F~H!6uTdl7N*~k^6Sy~$=i1(0L+!8>C}nT)Hk7#2Vr+VT2@{oK44~LWl4U4 z0};rWASw?ViK!J+MwKux@IW1Fii;y$11F=knxv*oQ)@39CE1|H|ICbI}qJ zNKX$brE{I}Y@SKDTb>4zFjqYQxy5?w{+lNM>!v zhj#q5naDkQ1|AKQYNCmJuU_4=buD;X1zc|);D#}^Win~@PX@!CiKkFzZo1=!?*!I5 z^ttAr7TSAsE6g&Q64zS}eO@EZF4=zGyS7qQz=}VO>Y;t?yWUbp;*MfBpxAkE?sve% zix;a?>lsU4Q~a~a!aUxBQn!Qc2N*Tf^Xyw!SC0-=m$ed?s!M05tkjFym1-y+oaaZ# z`7JHDl8+E7@WY+vjXM4~{t&5nJ^0}xlQ#$zHLKxCI&>Yq-`Ao#;V{JeFl0r?+IrS{ zvG<;l(Hr6(Qt#j(>ynXCZ~l8%yw3ZT=_1?y=kaN2Z|{5)M}N{c8;lE=O7Ea#Jy%fY ze-M}P^@>8Kot~2BD>OGz77GBJ*+OQ?a+~ksQ7I{i?#8$8SZDr@MP@CTjx0~cW=CTg zYdbY24tn;oNo5X6|5iBSD4j^WaA5E#(1@{AjQ)zs7!o@HFLa9lf*SEBvM^PrXl zH2u}9SFA$eTj&aukzRtkYG23EvYs(7{W~9S$#f&)uD;4gE%uMXkl63d;Yb5QVPPS6 zXz0d`HOdUEeDq)!SG)N&;5`UV^d{ppauKFtX(Ecqd@YMG;8;+-Ns53RCM61nppujw z-wJpsIf|pZ8HaedB$2XD+Bm&%>i-r}3A8zfJVDJs*&wJyPBV(;s@bYOxO;8B_pBI< zRkI2vR`F+uI8d-=MjM8|=PVpquK;paA}Op1E9A?>=0|Absn%klng1ko=}gJG$Afm# z8z|NoeVG2kU2c)T>So87*gCrcV}6?MK#BIk&msp_^aS6E27~zm9#3`A@r(V--!ILy zF&LKmDU0>BwV{cX+Ow-oO-+2Z#JbLTlhW%<$3XH99C95!zPdhWu%0o`zl#cfVsZv00LFO& zo~J>KGAo<{&L?vsjDI@I7ij>luHNtZ6go()fK^BNaGd=^=r z#SQJCoiup1-zXjlAgsI^8}T|t;lV%5r8bLPV4eBJ!O+NIGYB#9CaclV#=FTXgr@!CNeO_z41tb!16fa%Y`=qJGH~6^oGKk`9R{k}VolzMy`(Enq zZ}7Z%e@4~0a(`K8Uba@uVApz-o9;o?QF(%_%MUE!*7=NsuW>3L!Los80F3z}HI<_f zjqCp-TlVdeQ8$cxu>tTPiJWbIRXDOdw35c1en)kV68q?8Jq$& zV#ruNHkURGj5W%1ZNvyHn!5RUT*h=!7Ao~g$URrL^|V*7RCWXs2HN}6XRNI|lf*{o z!>~BI1o09LS^UVYnFUzTYoW#y=*0w#Em_HJnVr`&GDA*t^V1^fwNz9E-vOk_>vXc` za8C?%7~0&~7CcSlUbUo?xmXcw)r-g^&aT$~%a6P*MNrrF`Nmf%5{@6askY9RJ9BZx zu1zxuBxu%Gi&DZ3L7_9i@}dwJ-6Pz4Gpehr#lNP+jIErEc;M*1>og)+82pXzaR&^d zq&oOO7BkCT>^4x*B1%QFI__c*a^Z)Pg30Yx&1rRS=JY8~)=wqG~& zWN}Y9Y}+t!zcW^0u{~Aaq#CIX+1p&sX;eC-cXv9Y0{hkeMrYP3yaCOMbU`@^r{i#H zj+qc%0?@fxZl2hi9Pv0%!fM7WJoa(-MHIQ?0p{{eQ!@TD?agxSlUT3l z8>xNW*hm)l^ra=?ORQ=6?LR(TQ6Yi|D7bwQ@Cv+E~}&GytBml})lgO&_% zwHDsuA%6oZursx9=Gp#$kI|oQb94KI%mfVb0ic%A`<7uMb)$Z209rJKkGz&zw3`Mb$C0BNh`6pUy7LPFM?lYwF6zhJqVbY_2=oS0!B8kqtx!EWhpCXFXs|3q{lZR zpM6S49)Da`EGTH>dw|94XMG~Ie3}0Aju;?b(w1=2+TeIG*Cjw4#~lmt+%kakjfKPl zU!TT34`<(X8`ZzNjiyBy| zQ^0mOj8DdrqGQv64%A|0IZ97YL(`5AHAL>u??%n>E>7FhsR$2t{DEXnnW0UW!)v(L z(kQ5V&ipoSw+9@YgLEC*HH*`~$LGo=e}7Cf9e18=q47T1CN6^C4aD}cW|a}M!ckDR z5{VIla@!`}A#Of9A*wX(F>`o5kH2dxFk zl2^a0jh)WX`IN}b)9}Zf?Z(yN4EMjX=YDv`o$k`U>#^|(H^RcgQ<6F}XC`U|t%oP8 zb?umYeb0D#og}TH8B}N0&fhLwht-rr^}{IRD<|>PikGu13Y&#Q_p#^-@IvM6#?{9` za9h2iaF(ATM8Jn_HUTTR(EXoZudP54Q_^SU_9yf@=RLe1n3&W-y>~UN6`hhcu!8xa znac5pu^eME*-=IJNcIeGPLmQq+ilGJ)|I^8zdTtlT*#ixW@-kf9f4@=nP!3oa_MNf zW;kK|_?=6ijF(lS;{d zB|%}zV7_(t9B#emSO35$W0Y^cOO_gvr43sXVy(zV8M9kl1K6)-_6OVuat~n7%xn`a zuuegK<}{~xRj89{5i%r^*Z2PF1cQc?Cp)ik^q#eVRg(Qw?b+=FC4VDsq!QL?41d^n zJIJAvQ6(DetVk9+fA=b7a3S9JW6k}#^322<+uKMIO;fg|fE^b>u^1M%!I>pMKJK&| zv!)N9Z~hb+xh!0QV<$kaY;1l8us~uHAb1vw)(YtO{aC$>P4Ki^#grsWpBg*!cfAq8G|;aqzZ<^Kwhv&=in%3 zAX0#!XoRnU{$q>^55oCl-S1mgR+Hu$4*wTUs9NMfzMChQ>q?$q8xGG@MwDv9hQwnG ztT10I9UzkCT%)+qa6?M}A%Si_4!R*pmy6W;`ejWP57G(%sV?Qt$GyEgjB}z>V~+Bze96E1)d=5n zr}5}fN2D$nemE(35#(Q$s>z3^S!z&ngc=M{rwtoVvY`(H45}P4bJ=T+`?Px&tG#`1 z7xnNBH3MuGt0fxK63I@+yFXh)n?P6Sa92@n;o2uH=y~J&x3&4Z5_g3xk+}W zWOc$Fo7?ah<1I^W)9{%|3CkjnN!g*}gX`HZ~S_H?`vgW~*W?wbdyQzM<4_57PnW z1{mGO5k&~Y*(oWvzCy;~SngAvmX01aHt(8c?P+a-UcI3!qSQ8n`ucjOK6?v`OWHb*cZ#2O7rAIN?(g+O2zDiPvc9DN zxuM>x%I$GR+<+VLhJI(t$dC?hJr=SX;55F$*^XHbpA~jO{3kYIN_H0>f-Fu)E!4?f zD?QMo&8>tRGHHQ7@6CV;FpGsA@l@L{&^%{_l7?1(bZ+)bzBpsoMGB2Bq<^l%;z&Ugq{>mVjnZi=DsJLOn-LIUNb84=wjdHBDf?aZ<;*zFa{K6@0vHZdxk!bio*AiLQcCPAZZ8<05p?Y{o))T{LDJ093# z4M6*Dz=1O544|($24Nuvn`TNxA?B9u8umG~kS8W4d_Z=$Y1{bM!+PUUhK&wmx*aVW zRsq;{-|j}vFhL}}uwz5j-*V~b>YBJ&z7_vr^$wLjJbZXovQB}p;fq}Hnq6rC_2d;( zb_#LW{z)1|xM)ei*x}&hO>J#jz<{BrE|7TVq);%32i77#?eC|6o%=*h!L%~Bn!w`e zCFM_A__JrCoDkf|J}%U@nZvvKpv6;`HyM@X_5slN4(IX7J{T|7m~Js#)DZ2(xnosy zQbsrJSDurKQn-RsTfwJmfoXM1q3-KHa}RP8l@WL3>ywfl47Xpp2A*=$tpKREr)X=b zr2ZJo_s4{P}|rd#x7@gKeI|Exkq26f~??2uj#iZ&bLXZ*YYc| z!S4Ua(V1lp77y^>5K}6`R}YjOM-)iQCqCUg=C7iv3Qbon|8HS2Vp{-IZ&<+KrsjAh zOXr4_8isZY&wPfTkj)$7(i_Eu<%XWK~Ly$iZy`V0MpkyPF*~wsJL)A!9GZLT-DUmA<$mZFs_A9=s|@=E8qWW6nI;X@7H_g zbfokFK8a`fMYK?@&)wAf9*2fTIJsP&y7uigZvErCtkLM+(RjBek^;78eC*fcD%fgL zZLo`VcJwDm%!Cb)vQ$EMUjCF%reWk@Q~2Py!6;{fDC%KpV*xovr1-}{4v$x57ss2% zP0s^+Z5tR9$(X3?{YP)*8FAbQD_#^@xf=0DS8}rS<7~eT;egKsPMFtKQlL65yIs-3 zLOZXVqetfZhYPhMCcG$qRyK}HVXElC87 z=nd2~%4`cda6dZro5-qP;cK4TGr4}J361>qy4~HIieo@%Rv7uDs9JOAw0k$xbj;rr zaT=r3QgYst-{;JjGX?bi1K5L5>*B`Gkw}b)&Z5&wke})&q8njq@ zbNe=!&21oiIrzTfET&+d2s6*~5m!v{e})!4#D{3(K8G+Y%nu!uVEoTNPQ8YIdhqdX>IO~-@@%Szy@LF^)YR1A$#+uk(zk8{CM8=H z5PYB=m7bB&h>GShjEjkgxb^X4uitOKjGElHZ+B<}Tx8pGsR`j~s;jTv37HvNl2=es zxxuOF6qr8ykXmUEpGbXis`-F}d3j-#CgI-^0Hk^8f6gxwXS*IOLLGdVg;C}Pdd7%{ zdxq(x>OepY+8b++XX8Aa1b$`lK5s8)t)aeKVF=A`?Ar~GS?0qRSllT8rKxjS~)@=1!+K#)G1`*wu7YG2gt?^EJ zdi%vo#L+K#k92xSJ-ZNg$Ly3Mh?d>? z&94RS=R)*q!{)78Pyz}F13-s>E*T`c3A#9t58DiWmzrcgd|6WK{2q=fEP`7NgZw4D zP0WPT|A+r&ZD0U%Q5}GTE(IZzjkL)}z=|ggrszHIDD>6!b)wxY3ba9Oi)7-N6|GaQq?u}8=KEYPmW1T}%*0lW+;f$_X4$$#w(CeD8l zkwuGI+O+P-Uoef-$Lwh4P)RS#s@y0!$Y+odB@7YiZn1i^J9@jQDCPib@CVDG5Rc^Gg0^+ zCrkf7O918UyrSN}(ll^{xan+}6iq3Ok*s?=HOejeWm511BI_6wn9$aOBc1+}!+%IGfg7=uU{3$xusR&(d z?frfTAsM~YdpD{^<>coc@ARQ+^Xr|QsIoize)23hIFhs%F8c%^xG@n+CCiSy3pxEY z3cy(`f}3M98bt$b`_>f8&kRigrk#8@AsX;Pg7~!wU+qcS{;foQH4=j2QR*!4E2*Mi zZ_`C!$fSYy<^QLM6>ra2=8AHnFLh5cX)DUS*nHsj`3zqvkjPt4Z0Z7|;a{LS*qAun z$juIZHHa`zhC^jz=qc*7{4_@Ff7an z@7Yv@zIyCq-RI`!=E|8}Ad^{=hss1xRZmDJU>w7O{k}l4xRDUZK5*`wqX7(C3SUJI z3PM;3uY%V^s@gGVHy5*lYES?;{)(bSAx7aQHvC}m5^Uc=>3<@^ep_9wTo5cuYQ%r+ z?}u*?*ELRstg&;m(pZ2Eu4GN^`J5p(@oEH!at=Lo)EVF+3Z(E)h((#%hDp6wQ1)SX z%&;NQLu=6+dOx778fzKg{x_9%IVl)@JoyiuRhGj{_+y4es*%Q=J3l`7&%&Z(C1rVFIxHlMlGejO$?JaW$reon@U(%hGwt&3%&l)0{y;-9r<9sl256>;Dx>%X3s-%3sOSe?`+HXZGJ0He63+n0=nna9$1R?FpoLkn{%%y1 z%NA;eBF50!X@l44ChXg@CG;pnuVd;~QTHtN^z`<(myye!v-~#h%q?5le0RUTN8RA3 ze>+Gl@WclXUx*^~FodPSW;-mnz0{1Tsk^q&bRye`eb$PUU(Kheh9jiU-A6b`(}zLR z{9QV%-T-tF)~}}$H5Axfe4O-8;2@?ctCa8Q^rpF9kz3BC{{(H|EhtgJ+=|iD#9b-| z9VfzeE%7W)|7t0MR&ev#5$zQRT|K?y3Ud4Jj-87+b>ezT{jw;f3u?A%vlMn1qM^l> zPT!Eq8?Q^-91vS;YI0kJV-Yj5JB;t&-zB~0O-)o}?j{umeJj0ioscq{&}y zVWtgy3s-^*n~VI;84%a9tkYbKN^XRP(q0bJ+j#EX-Freo8Ig1hsCkt+%^gKZPoITM z^9PZ$TA=C<5)MmuQ#jtLZDT`i6>5bdt4RT#w4r#U!|hwgfm;IfOWmkyCG!)NWyChH z5K$##O3=io&0a+QzczY`Xr%WrR_qwTeb zdBLDA?SR5S|Mh8Y+SAamu(ZA~>yD-obp^zLy*8|8byH|myLC_cA1?OX=oN)~R;hsm z6a8WKHhv=j4*q?ndZ_!sd{aP_|ZGWgp{i-z4AOATGN$Tg}IB6KZJan8#gsSp9C<4Nqe1n3ed zNmfgk30=+(XNvC6v+M$m)`|iRu2zYui~eU~s$u&cu4pA&wbnTOUVgM4 zdD?r|=n<|dL6^A8$NwE%`;7s?xOO;hvK9v~VmR)05ft8X(Lat`d~H{y|?c!j&o67~F(kd}bw+uOSGvsr{Y6Y0@SLubI8(A|w*+*~=t6TuGy6r)6 zls~QkZf4XH-4-%n!s>jEe?RIlU0RTZem$Ho0djH6 zdt4O(au&#$UJ}EUwz9Sh<$((mMZudlBf7u}T=*mrMWBtq4@Q5gYrSwg_4BN0T6|vk zgmkZ*>x<#Y17*y#0hD*n#ifmY_Rnh{j~0uc-PhL_%@bXod_O;9HF1lxo~| z_=g?7@{@pJ$QQEtK{)r&>OF=p%nG z-KvN3${oGEFAbZx3s;x?#NYYR76WhlYQuCxo9LcZ@tK78{Fv)c-+W}ZVMPDd{gHBh)UxvTB+{2+g>@G%^}E0G_&Phtl;yn*r z2KO0oLud#^5eC6sXYfiWiT5d(G-hr)<7F`W+tOtgo%} zP&l;xq364rIxf+S&O3Qj`JYL^@|zmxUzcxh6{QuJF62~Cf^NoRb`sPz|H5OIcGfCba3^*XU$43w0+hGET^eiDGj$HP}N&JA^1RnTRyGcPbZl2+kmwnlL(E8=u1^?-} zAQ4Med)l){)8Fgy029?XL|!y+p?%FZH3CPm;D*6;w-hXebe8nu94MOCDv;gGre%Lw zzVXXOpk)N&o3~ijdhkY%`$K~B(e$qn-1Zsr^yyRO=>J*>z(fHp>UJR&3hYb%>6|pZ z^j#rl(0NRw{(z1bC&`pxVcKm?JY()#81fGEePC)pAZEgCkM2n z3mNIOHzq#cpT@a`k^Q`2>lUAvde7y6jSF6j{g_r6zPT_kX055||IXgq0p~yl23TWY z-{HF`$i1oD; z-2e`3h8jt$pY6hHGKi_V8_c|M9r)K)OzYq{AM4-^azFEMmK#s+@So5-jS62}xe9XQ z-}%KK_TiesozaEx1D(X42BPbVP}=3f?^D5b%T6Jahb#TD`vbSr%9}-6GK?;dsdpVl zUSWMEWZ0OE?@j&schsMHp?B<2qEy;b*Yt17@?TW?o6GFPNWzR2ZNr}Oa{E%^v%;Dw zY%QYbn16ek#mltJS!K+WTA;_sRuFa|Rydb7q&HZKu9 z$~T!gW(@$u{~q;nkMI9P{fBq?%J;tVNtA&>cff2{rs|D=9X{{dr(JA~jr+H3`t-so zCM+>Av31KOkUj&55YVEnc8-Mz4}?Ioq~1XnC`D4WBK;x$O_i|IL>>)nUf&R|+g z>jz*WxLrEncmv$5gd^QJU>S_~kRE%|V*$J>BR>wAU>2Pb z%S|gJ`pVsVuYQcJY*6|n8Z;n-Q~*Fnv4Ic9ESv?HR7X+Lwvp4HUlJ*-V6Ym-_`L-W z{TZfhc8@&jT3QX}7_Ez-KQuEt3mt9vJv1~Vtg5177T3OG^Z@X=vXet#ET}?Ejf~i` zCMB{2)1o+~qFSY*?{3=ocJg4^S!rU4U4?zDz1ps(vH)lnr31M*d?^5WUBW}e;Uf6+((-sk&x#%0hvpd|JUR<3 zuhV{MP4pKM=7+24HbCbT4@XYB#;*gr-sT!`wLFA2n#^ZO^=KFEEgD4Ofe~bJU zj`xC5D$CM+|RgE9Ew zy){5!Lm2>|LCnEEcrg4>{?oykxw#7&3tZh)esN>g5|8-1GMcB{^oD##--$w`sj6f* zZ%Bn)!uxkrsYEG#&_98q+mp+z>CxDJpD5?$sPtgW3V?3+=lBKKc7ZG2ewqH@-Lcxw z%Du&9!qLr^5?I9eqeqU`?2Ubbf7JbR4+bm01gZ|XA9^<3)X9gOlq6k% zAtr9)&~aE8U}x1#125~KD?8dG1--FsaI;!T-Jz1gb_9p&m(KqN^8U$>!~0GcK6qkd zGZ3PaYz;U4wo2ND*g|&k@(O?zAZ%=CeEf5?@~ze{HNqmJYfsmXHWa;x7Wi3l|CB~0 z4iHzwxV!&AWi;{q;)^GGsJUU*E`0Y95HsTDL!-0J2IXa-(BPD!U|4<*GbM=; z*Ws4yg*^X*^R~HdC-aX!5tx7#vc(Ib?9c6I(@q(sTf7-S##Nj?P|Nvbe<5=0Z0yQy zd`r#uOsumu{^QCx5>IgsTM29FLWq#2?x_o2x-g~;)CK7%R+Wo-ZtJ6F9{*V(mI>n%Ey{S6 z<8nOl1}-f9%5~8g#)uH>uc30f3|NDNWe-yit*vMXnoy};$)I#EL!)ktK)bmLJMd&# zdNRD5zHV^cNcjgq_B0TI*zK%xfA8S#pp;Jwd+)5idEV&1{k9z7Nij$0TyZNXRgG60iT^Qf zSrcj+ev0-Bh);VP`tW+k&hK0gwhr@r;@Y$Q;gOI@%yTCnRVA+iF1urU599I0zUcMR z?mp{GOkE)5K_(6raE+CK@9c2UL@VlmtEcPJr`J!0z1{V#IuW>cQh8M9v3{qk!$JJzlQ%Vf z>~5=&NPul6rlK!$SPa`qD@pJ@Q=flMklO!}Id7+Fal4F9?_et28qkYDpv|g6v@TcX z-HQBZj~z?xWI3`~TML`kP;ji5ducz`YmmflAyQ4iA#Xu&f(~h`30`nrSV-tM2~k44 z{vH5^w{lE0?hHQt6mtlrMtpO{M4sE@A-3=^3hOi?+rCoPNrL-s8&M^(2ER?y7ch2( z;D=hba_X<>d`MmJ2*MB1d_yPRI?T8PA^@gSMtNG*{2D;KzMaMV-jwg=;W1_tmYu&hNipG|@=Yx+m1|XuDr!I`??Q zQ$N%x$&>EtHx+3KA>ZyQ;#Aro8i4car{qWrG`Vs7pyQrXPY7CglvDlHW$(O@aBIQC zVzk|rhS{I_o=L05H|K_YAMUx9iC`BNseUC}h~F_aXZJtnStbg-y>Hx+-N zHyzW{1DhnlRt6t4vT?Bs3!3%SA6kdj=>5SW%)v-2*&L@=vb>-n1a0fvdUvab8@ za49;Ll|sx_+Z}wJvsY3+d+Q)|D$(s`%ep>56x`!0OkDSHZKuTaxEYiEtJe=$OdzL3 zm~ACnrsrlt#4HnbcP<+x_mLnD^oo+Ej?AlJ_cDbNQ+nb*v2DdJ4q zAct{UZQ$buz0EEB$w6ZmW`*|e6J7}1j%6Fb&OefTsos0-I4pnWq8{H2OD@o-uMo-g zl(JM*D*o1Y^@7{AM3WB*XU{IrX4w@ae5l)bekC9~fV%eRI&;hfL&l8gg- zt=$PlbcWyi!w-0gU@m)L2`3(7*Do@?`ohwUG`aAEHP`kfw}nA6WEjr*eerJN3*&e0 zz&qLsQta#yF-n#MTD+X}qGN}iFueQN^j^CER-{DcWx)On8(X{1cd78Sg!V=<17J$$ z$%-5}pfYPJe`eo~#Qfg5^ay2yni^}Or>DpITmQG7<#a=Rn`DwcC$6WDXx*JQ1qJ>q>~KY`=

;^6DDL~jkH+2{Qbu}dpIB%bJ#-t;%Unh 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 Date: Wed, 27 Mar 2024 05:35:01 -0500 Subject: [PATCH 17/48] Fixes Cyberiad External Airlocks Appear To Have Incorrect Access Settings (#24688) * access issue * maybe this will fix the access --------- Co-authored-by: S34N <12197162+S34NW@users.noreply.github.com> Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- _maps/map_files/cyberiad/cyberiad.dmm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 00ceb3c20581..f611c8ee6d3e 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -25398,7 +25398,7 @@ /area/station/hallway/primary/central/west) "bzN" = ( /obj/effect/spawner/airlock/w_to_e/long{ - req_access_txt = 11 + req_access_txt = 32 }, /turf/simulated/wall/r_wall, /area/station/engineering/ai_transit_tube) @@ -65815,7 +65815,9 @@ /turf/simulated/floor/plating, /area/station/maintenance/port) "jRo" = ( -/obj/effect/spawner/airlock/s_to_n/long/square/engineer, +/obj/effect/spawner/airlock/s_to_n/long/square/engineer{ + req_access_txt = null + }, /turf/simulated/wall, /area/station/maintenance/fpmaint2) "jRx" = ( @@ -75554,7 +75556,9 @@ /area/station/maintenance/asmaint) "oBF" = ( /obj/effect/spawner/window/reinforced/grilled, -/obj/effect/spawner/airlock/s_to_n/long/engineer, +/obj/effect/spawner/airlock/s_to_n/long/engineer{ + req_access_txt = null + }, /turf/simulated/floor/plating, /area/station/maintenance/fpmaint2) "oBJ" = ( From 06969b4da1524771f8a023bea840ec73776b3818 Mon Sep 17 00:00:00 2001 From: Zantox Date: Wed, 27 Mar 2024 20:31:08 +0100 Subject: [PATCH 18/48] Add job_globals sanitization, fix duplicate value (#24795) * Add job_globals sanitization, fix duplicate value * Remove 'support_positions' job category * Add Supply dept to jobban list --- code/game/jobs/job_globals.dm | 7 +-- code/game/objects/items/weapons/cards_ids.dm | 2 +- code/modules/admin/db_ban/functions.dm | 6 +-- code/modules/admin/topic.dm | 51 +++++++++++++++---- code/modules/client/client_procs.dm | 9 ++-- code/modules/unit_tests/_unit_tests.dm | 1 + .../unit_tests/jobs/test_job_globals.dm | 26 ++++++++++ 7 files changed, 79 insertions(+), 23 deletions(-) create mode 100644 code/modules/unit_tests/jobs/test_job_globals.dm diff --git a/code/game/jobs/job_globals.dm b/code/game/jobs/job_globals.dm index 5f922af3975b..b469381bbfe9 100644 --- a/code/game/jobs/job_globals.dm +++ b/code/game/jobs/job_globals.dm @@ -55,8 +55,7 @@ GLOBAL_LIST_INIT(science_positions, list( "Roboticist", )) -//BS12 EDIT -GLOBAL_LIST_INIT(support_positions, list( +GLOBAL_LIST_INIT(service_positions, list( "Head of Personnel", "Bartender", "Botanist", @@ -76,8 +75,6 @@ GLOBAL_LIST_INIT(supply_positions, list( "Shaft Miner" )) -GLOBAL_LIST_INIT(service_positions, (list("Head of Personnel") + (support_positions - supply_positions))) - /// Roles that include any semblence of security, mostly for jobbans GLOBAL_LIST_INIT(security_positions, list( "Head of Security", @@ -133,7 +130,7 @@ GLOBAL_LIST_INIT(nonhuman_positions, list( GLOBAL_LIST_INIT(exp_jobsmap, list( EXP_TYPE_LIVING = list(), // all living mobs - EXP_TYPE_CREW = list(titles = command_positions | engineering_positions | medical_positions | science_positions | support_positions | supply_positions | security_positions | assistant_positions | list("AI","Cyborg")), // crew positions + EXP_TYPE_CREW = list(titles = command_positions | engineering_positions | medical_positions | science_positions | service_positions | supply_positions | security_positions | assistant_positions | list("AI","Cyborg")), // crew positions EXP_TYPE_SPECIAL = list(), // antags, ERT, etc EXP_TYPE_GHOST = list(), // dead people, observers EXP_TYPE_COMMAND = list(titles = command_head_positions), diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index aa53d533db2a..64940e3e2d6d 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -512,7 +512,7 @@ "Medical" = GLOB.medical_positions, "Science" = GLOB.science_positions, "Security" = GLOB.security_positions, - "Support" = GLOB.support_positions, + "Service" = GLOB.service_positions, "Supply" = GLOB.supply_positions, "Command" = GLOB.command_positions, "Custom" = null, diff --git a/code/modules/admin/db_ban/functions.dm b/code/modules/admin/db_ban/functions.dm index ee6b850f2c81..7d42d9005781 100644 --- a/code/modules/admin/db_ban/functions.dm +++ b/code/modules/admin/db_ban/functions.dm @@ -160,10 +160,10 @@ "rounds" = (rounds ? "[rounds]" : "0"), // And here "ckey" = ckey, "computerid" = computerid, - "ip" = ip, + "ip" = "[ip ? ip : ""]", // This is important. NULL is not the same as "", and if you directly open the `.dmb` file, you get a NULL IP. "a_ckey" = a_ckey, "a_computerid" = a_computerid, - "a_ip" = a_ip, + "a_ip" = "[a_ip ? a_ip : ""]", "who" = who, "adminwho" = adminwho, "roundid" = GLOB.round_id, @@ -490,7 +490,7 @@ output += "" for(var/j in GLOB.other_roles) output += "" - for(var/j in list("commanddept","securitydept","engineeringdept","medicaldept","sciencedept","supportdept","nonhumandept")) + for(var/j in list("commanddept","securitydept","engineeringdept","medicaldept","sciencedept","servicedept","nonhumandept")) output += "" for(var/j in list("Syndicate") + GLOB.antag_roles) output += "" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index c9538c22c093..021efa163c28 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -161,7 +161,7 @@ message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom IP and computer id fields replaced with the IP and computer id from the located mob") if(job_ban) - if(banjob in list("commanddept","securitydept","engineeringdept","medicaldept","sciencedept","supportdept","nonhumandept")) + if(banjob in list("commanddept","securitydept","engineeringdept","medicaldept","sciencedept","servicedept","supplydept","nonhumandept")) multi_job = TRUE switch(banjob) if("commanddept") @@ -194,8 +194,14 @@ var/datum/job/temp = SSjobs.GetJob(jobPos) if(!temp) continue jobs_to_ban += temp.title - if("supportdept") - for(var/jobPos in GLOB.support_positions) + if("servicedept") + for(var/jobPos in GLOB.service_positions) + if(!jobPos) continue + var/datum/job/temp = SSjobs.GetJob(jobPos) + if(!temp) continue + jobs_to_ban += temp.title + if("supplydept") + for(var/jobPos in GLOB.supply_positions) if(!jobPos) continue var/datum/job/temp = SSjobs.GetJob(jobPos) if(!temp) continue @@ -553,11 +559,32 @@ counter = 0 jobs += "" - //Support (Grey) + //Service (Grey) + counter = 0 + jobs += "" + jobs += "" + for(var/jobPos in GLOB.service_positions) + if(!jobPos) continue + var/datum/job/job = SSjobs.GetJob(jobPos) + if(!job) continue + + if(jobban_isbanned(M, job.title)) + jobs += "" + counter++ + else + jobs += "" + counter++ + + if(counter >= 5) //So things dont get squiiiiished! + jobs += "" + counter = 0 + jobs += "
Service Positions
[replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
" + + //Supply (Brown) counter = 0 jobs += "" - jobs += "" - for(var/jobPos in GLOB.support_positions) + jobs += "" + for(var/jobPos in GLOB.supply_positions) if(!jobPos) continue var/datum/job/job = SSjobs.GetJob(jobPos) if(!job) continue @@ -668,7 +695,7 @@ to_chat(usr, "SSjobs has not been setup!") return - //get jobs for department if specified, otherwise just returnt he one job in a list. + //get jobs for department if specified, otherwise just return the one job in a list. var/list/joblist = list() switch(href_list["jobban3"]) if("commanddept") @@ -701,8 +728,14 @@ var/datum/job/temp = SSjobs.GetJob(jobPos) if(!temp) continue joblist += temp.title - if("supportdept") - for(var/jobPos in GLOB.support_positions) + if("servicedept") + for(var/jobPos in GLOB.service_positions) + if(!jobPos) continue + var/datum/job/temp = SSjobs.GetJob(jobPos) + if(!temp) continue + joblist += temp.title + if("supplydept") + for(var/jobPos in GLOB.supply_positions) if(!jobPos) continue var/datum/job/temp = SSjobs.GetJob(jobPos) if(!temp) continue diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index bc0de582ba83..d2412ed6d547 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -590,6 +590,9 @@ if(check_randomizer(connectiontopic)) return + var/client_address = address + if(!client_address) // Localhost can sometimes have no address set + client_address = "127.0.0.1" if(sql_id) //Just the standard check to see if it's actually a number @@ -598,10 +601,6 @@ if(!isnum(sql_id)) return // Return here because if we somehow didnt pull a number from an INT column, EVERYTHING is breaking - var/client_address = address - if(!client_address) // Localhost can sometimes have no address set - client_address = "127.0.0.1" - //Player already identified previously, we need to just update the 'lastseen', 'ip' and 'computer_id' variables var/datum/db_query/query_update = SSdbcore.NewQuery("UPDATE player SET lastseen=NOW(), ip=:sql_ip, computerid=:sql_cid, lastadminrank=:sql_ar WHERE id=:sql_id", list( "sql_ip" = client_address, @@ -622,7 +621,7 @@ //New player!! Need to insert all the stuff var/datum/db_query/query_insert = SSdbcore.NewQuery("INSERT INTO player (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, :ckey, Now(), Now(), :ip, :cid, :rank)", list( "ckey" = ckey, - "ip" = address, + "ip" = client_address, "cid" = computer_id, "rank" = admin_rank )) diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 11434dea3193..7f234307d411 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -2,6 +2,7 @@ //Keep this sorted alphabetically #ifdef UNIT_TESTS +#include "jobs\test_job_globals.dm" #include "aicard_icons.dm" #include "announcements.dm" #include "areas_apcs.dm" diff --git a/code/modules/unit_tests/jobs/test_job_globals.dm b/code/modules/unit_tests/jobs/test_job_globals.dm new file mode 100644 index 000000000000..7ed56ff99800 --- /dev/null +++ b/code/modules/unit_tests/jobs/test_job_globals.dm @@ -0,0 +1,26 @@ +/datum/unit_test/job_globals/Run() + return + +/datum/unit_test/job_globals/proc/is_list_unique(list/L) + var/list_length = length(L) + var/unique_list = uniqueList(L) + var/unique_list_length = length(unique_list) + return list_length == unique_list_length + +/datum/unit_test/job_globals/proc/validate_list(list/L, list_name) + if(!is_list_unique(L)) + Fail("job_globals list '[list_name]' contains duplicate values.") + +/datum/unit_test/job_globals/no_duplicates/Run() + validate_list(GLOB.station_departments, "station_departments") + validate_list(GLOB.command_positions, "command_positions") + validate_list(GLOB.command_head_positions, "command_head_positions") + validate_list(GLOB.engineering_positions, "engineering_positions") + validate_list(GLOB.medical_positions, "medical_positions") + validate_list(GLOB.science_positions, "science_positions") + validate_list(GLOB.supply_positions, "supply_positions") + validate_list(GLOB.service_positions, "service_positions") + validate_list(GLOB.security_positions, "security_positions") + validate_list(GLOB.active_security_positions, "active_security_positions") + validate_list(GLOB.assistant_positions, "assistant_positions") + validate_list(GLOB.nonhuman_positions, "nonhuman_positions") From 934d6fa7e7a86774a8de780524885556392f57a2 Mon Sep 17 00:00:00 2001 From: Charlie Nolan Date: Wed, 27 Mar 2024 17:35:44 -0700 Subject: [PATCH 19/48] Booze cures anxiety (and other ethanol diseases) (#24481) * Viruses cured by ethanol now accept any form of booze. * Apply suggestions from code review Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> --------- Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> --- code/datums/diseases/_disease.dm | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 8a97ca442a3d..c296db3f7e20 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -108,12 +108,19 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) if(!(disease_flags & CURABLE)) return 0 - . = cures.len + var/cures_found = 0 for(var/C_id in cures) - if(!affected_mob.reagents.has_reagent(C_id)) - .-- - if(!. || (needs_all_cures && . < cures.len)) - return 0 + if(C_id == "ethanol") + for(var/datum/reagent/consumable/ethanol/booze in affected_mob.reagents.reagent_list) + cures_found++ + break + else if(affected_mob.reagents.has_reagent(C_id)) + cures_found++ + + if(needs_all_cures && cures_found < length(cures)) + return FALSE + + return cures_found /datum/disease/proc/spread(force_spread = 0) if(!affected_mob) From 27087670280de99e2fceb47194aad29a7b99b280 Mon Sep 17 00:00:00 2001 From: Henri215 <77684085+Henri215@users.noreply.github.com> Date: Wed, 27 Mar 2024 21:37:29 -0300 Subject: [PATCH 20/48] Service headset sprite update (#24840) --- icons/obj/radio.dmi | Bin 11353 -> 11386 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi index 8a7c97021f68ef91ae02b1cb581234fa717a22ed..af0cf5eb2529e09ad881098bf05b1276299fd006 100644 GIT binary patch delta 10587 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 From 8e4c8688ce06c4d8d325db857551635073ed638f Mon Sep 17 00:00:00 2001 From: DGamerL <108773801+DGamerL@users.noreply.github.com> Date: Thu, 28 Mar 2024 02:42:03 +0100 Subject: [PATCH 21/48] Ezpz fix (#24845) --- code/game/objects/items/weapons/powerfist.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm index 87f48d7b799a..c2b33e300830 100644 --- a/code/game/objects/items/weapons/powerfist.dm +++ b/code/game/objects/items/weapons/powerfist.dm @@ -31,6 +31,9 @@ /obj/item/melee/powerfist/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/tank/internals)) + if(!iscarbon(loc)) + to_chat(user, "You have to hold the powerfist in your hand!") + return if(!tank) var/obj/item/tank/internals/IT = W if(IT.volume <= 3) From b1988e705bcce152cd7aff8776750125fd987a8e Mon Sep 17 00:00:00 2001 From: GDN <96800819+GDNgit@users.noreply.github.com> Date: Thu, 28 Mar 2024 15:37:12 -0500 Subject: [PATCH 22/48] fixes tgui alerts taking WAY longer than they should to delete (#24859) --- code/modules/tgui/tgui_input/alert_input.dm | 1 - code/modules/tgui/tgui_input/list_input.dm | 1 - 2 files changed, 2 deletions(-) diff --git a/code/modules/tgui/tgui_input/alert_input.dm b/code/modules/tgui/tgui_input/alert_input.dm index 5f9abd1de10f..ef1afd04630d 100644 --- a/code/modules/tgui/tgui_input/alert_input.dm +++ b/code/modules/tgui/tgui_input/alert_input.dm @@ -84,7 +84,6 @@ /datum/tgui_alert/Destroy(force) SStgui.close_uis(src) state = null - QDEL_NULL(buttons) return ..() /** diff --git a/code/modules/tgui/tgui_input/list_input.dm b/code/modules/tgui/tgui_input/list_input.dm index f5bee6cb551f..dd642861baf4 100644 --- a/code/modules/tgui/tgui_input/list_input.dm +++ b/code/modules/tgui/tgui_input/list_input.dm @@ -103,7 +103,6 @@ /datum/tgui_list_input/Destroy(force) SStgui.close_uis(src) state = null - QDEL_NULL(items) return ..() /** From 618eb8a2d246d89364337821d687fdea7b4e0cbb Mon Sep 17 00:00:00 2001 From: Luc <89928798+lewcc@users.noreply.github.com> Date: Thu, 28 Mar 2024 18:08:35 -0400 Subject: [PATCH 23/48] Fixes elite action buttons breaking entirely (#24860) * fixes elite action buttons breaking entirely * fixes icons, maptext is still odd --- .../mob/living/simple_animal/hostile/mining/elites/elite.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm index 5c6f883a02e8..b3260be8952c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm @@ -125,13 +125,15 @@ While using this makes the system rely on OnFire, it still gives options for tim STOP_PROCESSING(SSfastprocess, src) qdel(src) return - UpdateButton() + UpdateButtons() /datum/action/innate/elite_attack/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force = FALSE) + . = ..() if(status_only) return var/mob/living/simple_animal/hostile/asteroid/elite/elite_owner = owner var/timeleft = max(elite_owner.ranged_cooldown - world.time, 0) + if(timeleft == 0) button.maptext = "" else From 56b49fa86e1cf50645b82903098db0bc5f3769ab Mon Sep 17 00:00:00 2001 From: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com> Date: Thu, 28 Mar 2024 18:36:05 -0400 Subject: [PATCH 24/48] [s] Tis just a flesh wound (#24861) --- .../objects/items/stacks/medical_packs.dm | 22 +++++++++---------- code/modules/surgery/generic.dm | 1 + code/modules/surgery/organs/blood.dm | 4 ++-- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/code/game/objects/items/stacks/medical_packs.dm b/code/game/objects/items/stacks/medical_packs.dm index 4680b1f9a1cc..92d5ffed73fa 100644 --- a/code/game/objects/items/stacks/medical_packs.dm +++ b/code/game/objects/items/stacks/medical_packs.dm @@ -155,20 +155,20 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/affecting = H.get_organ(user.zone_selected) + for(var/obj/item/organ/external/E in H.bodyparts) + if(E.open == ORGAN_ORGANIC_OPEN) + to_chat(user, "[E] is cut open, you'll need more than a bandage!") + return + affecting.germ_level = 0 - if(affecting.open == ORGAN_CLOSED) - affecting.germ_level = 0 + if(stop_bleeding) + if(!H.bleedsuppress) //so you can't stack bleed suppression + H.suppress_bloodloss(stop_bleeding) - if(stop_bleeding) - if(!H.bleedsuppress) //so you can't stack bleed suppression - H.suppress_bloodloss(stop_bleeding) - - heal(H, user) + heal(H, user) - H.UpdateDamageIcon() - use(1) - else - to_chat(user, "[affecting] is cut open, you'll need more than a bandage!") + H.UpdateDamageIcon() + use(1) /obj/item/stack/medical/bruise_pack/improvised name = "improvised gauze" diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 7a411bb967b3..8c8a29066807 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -39,6 +39,7 @@ " You have made an incision on [target]'s [affected.name] with \the [tool]." ) affected.open = ORGAN_ORGANIC_OPEN + target.resume_bleeding() return SURGERY_STEP_CONTINUE /datum/surgery_step/generic/cut_open/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index e3353fb6b811..c3b4c13111f9 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -12,9 +12,9 @@ addtimer(CALLBACK(src, PROC_REF(resume_bleeding)), amount) /mob/living/carbon/human/proc/resume_bleeding() - bleedsuppress = FALSE - if(stat != DEAD && bleed_rate) + if(stat != DEAD && bleed_rate && bleedsuppress) to_chat(src, "The blood soaks through your bandage.") + bleedsuppress = FALSE // Takes care blood loss and regeneration /mob/living/carbon/human/handle_blood() From 89d6873c7effe5b1698bdacdabd8c6441bcd4d42 Mon Sep 17 00:00:00 2001 From: S34N <12197162+S34NW@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:39:31 +0000 Subject: [PATCH 25/48] Adds workflow for automatic handling of stale PRs and issues, tidies other workflows and adds better logging (#24839) * Tidy the code, better commenting when things go wrong * text! * stale labeller * get the labels right * avoid complications * Update .github/workflows/merge_upstream_master.yml * Update .github/workflows/merge_upstream_master.yml * Apply suggestions from code review Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> * makes the merge upstream thingy comment, and approve its generated workflows * wow * remove this, paradise bot reigns supreme --------- Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> --- .github/workflows/label_stale.yml | 24 ++++++++ .github/workflows/merge_upstream_master.yml | 64 +++++++++++++++------ .github/workflows/render_nanomaps.yml | 16 ++---- 3 files changed, 74 insertions(+), 30 deletions(-) create mode 100644 .github/workflows/label_stale.yml diff --git a/.github/workflows/label_stale.yml b/.github/workflows/label_stale.yml new file mode 100644 index 000000000000..d5d6e5d0dd23 --- /dev/null +++ b/.github/workflows/label_stale.yml @@ -0,0 +1,24 @@ +name: Label and close stale PRs and Issues + +on: + schedule: + - cron: '0 0 * * *' # Runs at midnight UTC every day + +jobs: + stale-prs: + runs-on: ubuntu-latest + steps: + - name: Seek and destroy stale PRs and Issues + uses: actions/stale@v4 + with: + stale-pr-message: 'This pull request seems to be stale as there have been no changes in 14 days, please make changes within 7 days or the PR will be closed. If you believe this is a mistake, please inform a development team member on Discord.' + close-pr-message: 'This pull request has not received any updates since being marked stale, and as such is now being automatically closed. Please feel free to re-open this pull request or open a new one once you have new updates.' + stale-issue-message: 'This issue either requires verification or is unreproducible, but has had no updates for 60 days. Please provide an update within 14 days or this issue will be closed. If you believe this is a mistake, please contact an issue manager on Discord.' + close-issue-message: 'This issue was marked as stale, yet no changes have been observed in the specified time. The issue has been closed.' + days-before-stale: 14 + days-before-issue-stale: 60 + days-before-close: 7 + days-before-issue-close: 14 + exempt-issue-labels: '"Stale Exempt"' + exempt-pr-labels: '"Stale Exempt", "-Status: Awaiting approval", "-Status: Awaiting Merge", "-Status: Awaiting type assignment"' + only-issue-labels: '"Need Verification", "Cannot Reproduce", "Not A Bug", "(99% Sure) Not A Bug"' diff --git a/.github/workflows/merge_upstream_master.yml b/.github/workflows/merge_upstream_master.yml index bc876941c9d2..3333a6e13a79 100644 --- a/.github/workflows/merge_upstream_master.yml +++ b/.github/workflows/merge_upstream_master.yml @@ -16,43 +16,46 @@ jobs: runs-on: ubuntu-latest steps: - id: create_token - uses: tibdex/github-app-token@v2 + uses: actions/create-github-app-token@v1 with: - app_id: ${{ secrets.APP_ID }} - private_key: ${{ secrets.PRIVATE_KEY }} + app-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.PRIVATE_KEY }} + + - run: echo "GH_TOKEN=${{ steps.create_token.outputs.token }}" >> "$GITHUB_ENV" + + - name: Like the comment + run: | + gh api \ + --method POST \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + /repos/ParadiseSS13/Paradise/issues/comments/${{ github.event.comment.id }}/reactions \ + -f content='+1' - name: PR Data - env: - GH_TOKEN: ${{ steps.create_token.outputs.token }} run: | pr_json=$(curl -L -s --fail-with-body -H "Authorization: token ${{ github.token }}" ${{ github.event.issue.pull_request.url }}) if [ `jq -r '.maintainer_can_modify' <<<$pr_json` == "false" ] ; then gh pr comment ${{ github.event.issue.html_url }} --body 'GitHub Actions can not push to the repository without "Allow edits and access to secrets by maintainers" checked.' - exit 1 + exit 0 fi echo "PR_REPO=`jq -r '.head.repo.full_name' <<<$pr_json`" >> $GITHUB_ENV echo "PR_BRANCH=`jq -r '.head.ref' <<<$pr_json`" >> $GITHUB_ENV echo "PR_HEAD_LABEL=`jq -r '.head.label' <<<$pr_json`" >> $GITHUB_ENV - uses: actions/checkout@v4 - env: - GH_TOKEN: ${{ steps.create_token.outputs.token }} with: repository: ${{ env.PR_REPO }} ref: ${{ env.PR_BRANCH }} - token: ${{ steps.create_token.outputs.token }} + token: ${{ env.GH_TOKEN }} - uses: actions/setup-node@v4 - env: - GH_TOKEN: ${{ steps.create_token.outputs.token }} with: node-version: 20 cache: 'yarn' cache-dependency-path: ./tgui/yarn.lock - uses: actions/setup-python@v5 - env: - GH_TOKEN: ${{ steps.create_token.outputs.token }} with: python-version: '3.11' cache: 'pip' @@ -61,7 +64,6 @@ jobs: env: BASE_BRANCH: ${{ github.event.repository.default_branch }} BASE_REPOSITORY: ${{ github.repository }} - GH_TOKEN: ${{ steps.create_token.outputs.token }} run: | # Compare head branch and base branch compare_result=$(curl -L -s --fail-with-body \ @@ -87,17 +89,41 @@ jobs: chmod +x tools/hooks/*.merge tgui/bin/tgui # Actual Merge - git config user.name github-actions - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git remote add upstream "https://github.com/$BASE_REPOSITORY.git" git fetch origin "$PR_BRANCH" --depth=$((ahead_by + 1)) git fetch upstream "$BASE_BRANCH" --depth=$((behind_by + 1)) + + # Check if a workflow file would be modified by the merge (permissions prevent pushes if so) + latest_workflow_commit=$(git log -n 1 --pretty=format:"%H" upstream/$BASE_BRANCH -- .github/workflows) + if ! git branch --contains $latest_workflow_commit | grep -q "$(git rev-parse --abbrev-ref HEAD)"; then + gh pr comment ${{ github.event.issue.html_url }} --body "GitHub Actions can not push to this branch as workflow files have been changed since your branch was last updated. Please update your branch past https://github.com/ParadiseSS13/Paradise/commit/$latest_workflow_commit before using this command again." + exit 0 + fi + git merge FETCH_HEAD git push origin + - name: Approve Workflows + run: | + # Get the list of pending workflow runs for paradisess13bot + runs=$(gh api \ + --method POST \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + /repos/ParadiseSS13/Paradise/actions/runs?actor=paradisess13bot&status=action_required) + run_ids=$(echo $runs | jq -r '.workflow_runs[].id') + + # Iterate over the run IDs, approving each one + for run_id in $run_ids; do + gh api \ + --method POST \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + /repos/ParadiseSS13/Paradise/actions/runs/$run_id/approve + done + - name: Notify Failure if: failure() - env: - GH_TOKEN: ${{ steps.create_token.outputs.token }} - run: gh pr comment ${{ github.event.issue.html_url }} -b "Merging upstream failed:\nhttps://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" + run: | + gh pr comment ${{ github.event.issue.html_url }} -b 'Merging upstream failed, see the action run log for details: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}' diff --git a/.github/workflows/render_nanomaps.yml b/.github/workflows/render_nanomaps.yml index 016803ff428d..7ba495b35401 100644 --- a/.github/workflows/render_nanomaps.yml +++ b/.github/workflows/render_nanomaps.yml @@ -15,34 +15,28 @@ jobs: runs-on: ubuntu-22.04 steps: - id: create_token - uses: tibdex/github-app-token@v2 + uses: actions/create-github-app-token@v1 with: - app_id: ${{ secrets.APP_ID }} - private_key: ${{ secrets.PRIVATE_KEY }} + app-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.PRIVATE_KEY }} + + - run: echo "GH_TOKEN=${{ steps.create_token.outputs.token }}" >> "$GITHUB_ENV" - name: 'Update Branch' uses: actions/checkout@v4 - env: - GH_TOKEN: ${{ steps.create_token.outputs.token }} with: token: ${{ steps.create_token.outputs.token }} - name: Branch - env: - GH_TOKEN: ${{ steps.create_token.outputs.token }} run: | git branch -f nanomap-render git checkout nanomap-render git reset --hard origin/master - name: 'Generate Maps' - env: - GH_TOKEN: ${{ steps.create_token.outputs.token }} run: './tools/github-actions/nanomap-renderer-invoker.sh' - name: 'Commit Maps and open PR' - env: - GH_TOKEN: ${{ steps.create_token.outputs.token }} run: | git config --local user.email "action@github.com" git config --local user.name "NanoMap Generation" From 0e401c2ed9481a632e6c4712781f788a8653ff5c Mon Sep 17 00:00:00 2001 From: Luc <89928798+lewcc@users.noreply.github.com> Date: Thu, 28 Mar 2024 19:47:24 -0400 Subject: [PATCH 26/48] Gives ears a proper slot (#24848) * ears * ears --------- Co-authored-by: S34N <12197162+S34NW@users.noreply.github.com> --- code/modules/surgery/organs/ears.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 182bb3f1eb1d..c9c145dcefa4 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -4,6 +4,7 @@ gender = PLURAL organ_tag = "ears" parent_organ = "head" + slot = "ears" /obj/item/organ/internal/ears/on_life() if(!iscarbon(owner)) From d793fcbb0c7ce784eadcb99dd2a6e5177269befb Mon Sep 17 00:00:00 2001 From: Luc <89928798+lewcc@users.noreply.github.com> Date: Thu, 28 Mar 2024 20:24:13 -0400 Subject: [PATCH 27/48] updates last words (#24843) Co-authored-by: S34N <12197162+S34NW@users.noreply.github.com> --- code/modules/mob/living/stat_states.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/stat_states.dm b/code/modules/mob/living/stat_states.dm index e46e0aac96c8..fb2d64f480b9 100644 --- a/code/modules/mob/living/stat_states.dm +++ b/code/modules/mob/living/stat_states.dm @@ -64,7 +64,9 @@ GLOB.alive_mob_list |= src REMOVE_TRAIT(src, TRAIT_RESPAWNABLE, GHOSTED) + last_words = null timeofdeath = null + if(updating) update_blind_effects() update_sight() From 543b8d4c97caf0259315f9d8a7684f98b9ec36cc Mon Sep 17 00:00:00 2001 From: Charlie Nolan Date: Thu, 28 Mar 2024 18:33:22 -0700 Subject: [PATCH 28/48] Don't runtime when creating nukies. (#24865) --- code/datums/mind.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index c630c1714f72..dd6106e872ab 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -166,7 +166,7 @@ if(ishuman(new_character)) var/mob/living/carbon/human/H = new_character if(H.mind in SSticker.mode.syndicates) - SSticker.mode.update_synd_icons_added() + SSticker.mode.update_synd_icons_added(H.mind) /datum/mind/proc/store_memory(new_text) memory += "[new_text]
" From 2a99f77bdde1b3fd864bd657c58d3a42c6f9d16b Mon Sep 17 00:00:00 2001 From: warriorstar-orion Date: Fri, 29 Mar 2024 05:50:41 -0400 Subject: [PATCH 29/48] refactor: Remove cave generation from mineral ore generation odds (#24783) * Remove cave generation from mineral ore generation odds * use clearer vars --- .../subsystem/non_firing/SSmapping.dm | 1 + code/game/turfs/simulated/minerals.dm | 13 ++++++++--- code/modules/lavaland/lavaland_theme.dm | 22 +++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystem/non_firing/SSmapping.dm b/code/controllers/subsystem/non_firing/SSmapping.dm index 27193044dee2..58aa4771dc0b 100644 --- a/code/controllers/subsystem/non_firing/SSmapping.dm +++ b/code/controllers/subsystem/non_firing/SSmapping.dm @@ -76,6 +76,7 @@ SUBSYSTEM_DEF(mapping) seedRuins(list(level_name_to_num(MINING)), GLOB.configuration.ruins.lavaland_ruin_budget, /area/lavaland/surface/outdoors/unexplored, GLOB.lava_ruins_templates) if(lavaland_theme) lavaland_theme.setup() + lavaland_theme.setup_caves() var/time_spent = stop_watch(lavaland_setup_timer) log_startup_progress("Successfully populated lavaland in [time_spent]s.") else diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index c221da9adcf2..232389712800 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -306,9 +306,16 @@ mineralChance = 10 mineralSpawnChanceList = list( - /turf/simulated/mineral/uranium/volcanic = 5, /turf/simulated/mineral/diamond/volcanic = 1, /turf/simulated/mineral/gold/volcanic = 10, /turf/simulated/mineral/titanium/volcanic = 11, - /turf/simulated/mineral/silver/volcanic = 12, /turf/simulated/mineral/plasma/volcanic = 20, /turf/simulated/mineral/iron/volcanic = 40, - /turf/simulated/mineral/gibtonite/volcanic = 4, /turf/simulated/floor/plating/asteroid/airless/cave/volcanic = 1, /turf/simulated/mineral/bscrystal/volcanic = 1) + /turf/simulated/mineral/uranium/volcanic = 5, + /turf/simulated/mineral/diamond/volcanic = 1, + /turf/simulated/mineral/gold/volcanic = 10, + /turf/simulated/mineral/titanium/volcanic = 11, + /turf/simulated/mineral/silver/volcanic = 12, + /turf/simulated/mineral/plasma/volcanic = 20, + /turf/simulated/mineral/iron/volcanic = 40, + /turf/simulated/mineral/gibtonite/volcanic = 4, + /turf/simulated/mineral/bscrystal/volcanic = 1 + ) /turf/simulated/mineral/random/labormineral mineralSpawnChanceList = list( diff --git a/code/modules/lavaland/lavaland_theme.dm b/code/modules/lavaland/lavaland_theme.dm index 7fa5a9088fa6..20dfdecb38ae 100644 --- a/code/modules/lavaland/lavaland_theme.dm +++ b/code/modules/lavaland/lavaland_theme.dm @@ -1,3 +1,8 @@ +/// Approximate lower bound of the walkable land area on Lavaland, north of the southern lava border. +#define LAVALAND_MIN_CAVE_Y 10 +/// Approximate upper bound of the walkable land area on Lavaland, south of the Legion entrance. +#define LAVALAND_MAX_CAVE_Y 222 + /datum/lavaland_theme /// Name of lavaland theme var/name = "Not Specified" @@ -12,6 +17,20 @@ else if(!ispath(primary_turf_type)) stack_trace("Wrong turf type `[primary_turf_type.type]` in `[type]` lavaland theme") +/datum/lavaland_theme/proc/setup_caves() + var/max_attempts = 100 + var/max_cave_spawns = 40 + var/z = level_name_to_num(MINING) + while(max_attempts > 0 && max_cave_spawns > 0) + var/x = rand(1, world.maxx) + var/y = rand(LAVALAND_MIN_CAVE_Y, LAVALAND_MAX_CAVE_Y) + var/turf/next_turf = locate(x, y, z) + var/area/next_area = get_area(next_turf) + if(istype(next_turf, /turf/simulated/mineral/random/volcanic) && istype(next_area, /area/lavaland/surface/outdoors/unexplored/danger)) + next_turf.ChangeTurf(/turf/simulated/floor/plating/asteroid/airless/cave/volcanic, FALSE, TRUE, TRUE) + max_cave_spawns-- + max_attempts-- + /** * This proc should do all theme specific thing. * Now it only generates rivers, but it can do all stuff you desire. @@ -46,3 +65,6 @@ /datum/lavaland_theme/chasm/setup() var/datum/river_spawner/spawner = new(level_name_to_num(MINING), spread_prob_ = 10, spread_prob_loss_ = 5) spawner.generate(nodes = 6, min_x = 50, min_y = 7, max_x = 250, max_y = 225) + +#undef LAVALAND_MIN_CAVE_Y +#undef LAVALAND_MAX_CAVE_Y From 9a16c04683bb005ac6f78266b83b1c16de1adbf3 Mon Sep 17 00:00:00 2001 From: Zack Date: Fri, 29 Mar 2024 08:57:08 -0500 Subject: [PATCH 30/48] Fixes unbolted grey chairs to be bolted again in medbay on NSS Kerberos (#24838) * chairs * updated chairs --- _maps/map_files/Delta/delta.dmm | 66 ++++++++++++++++----------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index 77945b2eec25..e349499d4aee 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -1089,7 +1089,7 @@ /turf/simulated/floor/plasteel, /area/station/hallway/secondary/entry/west) "aiL" = ( -/obj/structure/chair/office{ +/obj/structure/chair{ dir = 4 }, /turf/simulated/floor/plasteel/dark, @@ -23130,12 +23130,12 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/chair/office{ - dir = 8 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/chair{ + dir = 8 + }, /turf/simulated/floor/plasteel/white, /area/station/medical/medbay) "bqA" = ( @@ -50607,7 +50607,7 @@ }, /area/station/medical/medbay) "cKP" = ( -/obj/structure/chair/office, +/obj/structure/chair, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitebluecorner" @@ -51370,7 +51370,7 @@ /turf/simulated/floor/grass, /area/station/medical/reception) "cNW" = ( -/obj/structure/chair/office{ +/obj/structure/chair{ dir = 8 }, /turf/simulated/floor/plasteel{ @@ -51384,10 +51384,10 @@ d2 = 4; icon_state = "0-4" }, -/obj/structure/chair/office{ +/obj/effect/landmark/start/paramedic, +/obj/structure/chair{ dir = 8 }, -/obj/effect/landmark/start/paramedic, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "whiteblue" @@ -59956,9 +59956,6 @@ dir = 8; pixel_x = -4 }, -/obj/structure/chair/office{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ @@ -59967,6 +59964,9 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, +/obj/structure/chair{ + dir = 4 + }, /turf/simulated/floor/plasteel/white, /area/station/medical/medbay) "dvZ" = ( @@ -66696,9 +66696,6 @@ dir = 8; pixel_x = -4 }, -/obj/structure/chair/office{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4 }, @@ -66711,6 +66708,9 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, +/obj/structure/chair{ + dir = 4 + }, /turf/simulated/floor/plasteel/white, /area/station/medical/medbay) "erk" = ( @@ -70706,7 +70706,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/chair/office{ +/obj/structure/chair{ dir = 8 }, /turf/simulated/floor/plasteel/white, @@ -86386,12 +86386,12 @@ }, /area/station/hallway/primary/fore/north) "qcs" = ( -/obj/structure/chair/office{ - dir = 1 - }, /obj/structure/sign/poster/official/random{ pixel_x = 32 }, +/obj/structure/chair{ + dir = 1 + }, /obj/effect/landmark/start/doctor, /turf/simulated/floor/plasteel{ icon_state = "redyellowfull" @@ -86701,7 +86701,7 @@ }, /area/station/public/sleep) "qqT" = ( -/obj/structure/chair/office{ +/obj/structure/chair{ dir = 8 }, /turf/simulated/floor/plasteel{ @@ -88486,8 +88486,8 @@ }, /area/station/public/sleep) "rrv" = ( -/obj/structure/chair/office, /obj/effect/landmark/start/coroner, +/obj/structure/chair, /turf/simulated/floor/plasteel/dark, /area/station/medical/morgue) "rrL" = ( @@ -89098,14 +89098,14 @@ /turf/simulated/floor/engine, /area/station/science/explab/chamber) "rMm" = ( -/obj/structure/chair/office{ - dir = 4 - }, /obj/machinery/power/apc/directional/west, /obj/structure/cable{ d2 = 4; icon_state = "0-4" }, +/obj/structure/chair{ + dir = 4 + }, /turf/simulated/floor/plasteel/dark, /area/station/medical/surgery/observation) "rMr" = ( @@ -89737,9 +89737,6 @@ dir = 8; pixel_x = -4 }, -/obj/structure/chair/office{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ @@ -89752,6 +89749,9 @@ name = "Chemistry"; sort_type_txt = "11" }, +/obj/structure/chair{ + dir = 4 + }, /turf/simulated/floor/plasteel/white, /area/station/medical/medbay) "sbU" = ( @@ -91197,12 +91197,12 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/chair/office{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/structure/chair{ + dir = 8 + }, /turf/simulated/floor/plasteel/white, /area/station/medical/medbay) "sMA" = ( @@ -94691,9 +94691,6 @@ }, /area/station/medical/sleeper) "uMB" = ( -/obj/structure/chair/office{ - dir = 8 - }, /obj/machinery/alarm{ dir = 8; name = "east bump"; @@ -94702,6 +94699,9 @@ /obj/machinery/light{ dir = 4 }, +/obj/structure/chair{ + dir = 8 + }, /turf/simulated/floor/plasteel/dark, /area/station/medical/surgery/observation) "uMM" = ( @@ -95272,7 +95272,7 @@ name = "east bump"; pixel_x = 24 }, -/obj/structure/chair/office{ +/obj/structure/chair{ dir = 8 }, /turf/simulated/floor/plasteel/dark, From f779546e5c07ab914c785bb9d0b4eef5c0820802 Mon Sep 17 00:00:00 2001 From: S34N <12197162+S34NW@users.noreply.github.com> Date: Fri, 29 Mar 2024 14:03:32 +0000 Subject: [PATCH 31/48] Follow-up patch for "tidies other workflows and adds better logging" (#24864) * null check is important in other languages too * null check is important in other languages too * 1/0 * simplify this * readd user info * remove this to test * new name --- .github/workflows/merge_upstream_master.yml | 32 ++++++--------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/.github/workflows/merge_upstream_master.yml b/.github/workflows/merge_upstream_master.yml index 3333a6e13a79..fc03ad8cc535 100644 --- a/.github/workflows/merge_upstream_master.yml +++ b/.github/workflows/merge_upstream_master.yml @@ -22,6 +22,7 @@ jobs: private-key: ${{ secrets.PRIVATE_KEY }} - run: echo "GH_TOKEN=${{ steps.create_token.outputs.token }}" >> "$GITHUB_ENV" + - run: echo "FAIL_NOTIFIED=false" >> "$GITHUB_ENV" - name: Like the comment run: | @@ -37,7 +38,8 @@ jobs: pr_json=$(curl -L -s --fail-with-body -H "Authorization: token ${{ github.token }}" ${{ github.event.issue.pull_request.url }}) if [ `jq -r '.maintainer_can_modify' <<<$pr_json` == "false" ] ; then gh pr comment ${{ github.event.issue.html_url }} --body 'GitHub Actions can not push to the repository without "Allow edits and access to secrets by maintainers" checked.' - exit 0 + echo "FAIL_NOTIFIED=true" >> "$GITHUB_ENV" + exit 1 fi echo "PR_REPO=`jq -r '.head.repo.full_name' <<<$pr_json`" >> $GITHUB_ENV echo "PR_BRANCH=`jq -r '.head.ref' <<<$pr_json`" >> $GITHUB_ENV @@ -89,6 +91,8 @@ jobs: chmod +x tools/hooks/*.merge tgui/bin/tgui # Actual Merge + git config user.name paradisess13[bot] + git config user.email "165046124+paradisess13[bot]@users.noreply.github.com" git remote add upstream "https://github.com/$BASE_REPOSITORY.git" git fetch origin "$PR_BRANCH" --depth=$((ahead_by + 1)) @@ -97,33 +101,15 @@ jobs: # Check if a workflow file would be modified by the merge (permissions prevent pushes if so) latest_workflow_commit=$(git log -n 1 --pretty=format:"%H" upstream/$BASE_BRANCH -- .github/workflows) if ! git branch --contains $latest_workflow_commit | grep -q "$(git rev-parse --abbrev-ref HEAD)"; then - gh pr comment ${{ github.event.issue.html_url }} --body "GitHub Actions can not push to this branch as workflow files have been changed since your branch was last updated. Please update your branch past https://github.com/ParadiseSS13/Paradise/commit/$latest_workflow_commit before using this command again." - exit 0 + gh pr comment ${{ github.event.issue.html_url }} --body "GitHub Actions can not push to this branch as workflow files have been changed since your branch was last updated. Please update your branch past https://github.com/ParadiseSS13/Paradise/commit/$latest_workflow_commit before using this command again."# + echo "FAIL_NOTIFIED=true" >> "$GITHUB_ENV" + exit 1 fi git merge FETCH_HEAD git push origin - - name: Approve Workflows - run: | - # Get the list of pending workflow runs for paradisess13bot - runs=$(gh api \ - --method POST \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - /repos/ParadiseSS13/Paradise/actions/runs?actor=paradisess13bot&status=action_required) - run_ids=$(echo $runs | jq -r '.workflow_runs[].id') - - # Iterate over the run IDs, approving each one - for run_id in $run_ids; do - gh api \ - --method POST \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - /repos/ParadiseSS13/Paradise/actions/runs/$run_id/approve - done - - name: Notify Failure - if: failure() + if: failure() && env.FAIL_NOTIFIED != 'true' run: | gh pr comment ${{ github.event.issue.html_url }} -b 'Merging upstream failed, see the action run log for details: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}' From 5a0900d48126eb94930a8672ef8405f2d5802a7a Mon Sep 17 00:00:00 2001 From: GDN <96800819+GDNgit@users.noreply.github.com> Date: Fri, 29 Mar 2024 09:47:20 -0500 Subject: [PATCH 32/48] fixes a cloner runtime (#24868) --- code/game/machinery/clonepod.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/clonepod.dm b/code/game/machinery/clonepod.dm index 050b7b816e76..9dad2b6ea368 100644 --- a/code/game/machinery/clonepod.dm +++ b/code/game/machinery/clonepod.dm @@ -385,7 +385,7 @@ return FALSE clone.forceMove(loc) - new /obj/effect/gibspawner/generic(get_turf(src), clone) + new /obj/effect/gibspawner/generic(get_turf(src), clone.dna) playsound(loc, 'sound/effects/splat.ogg', 50, TRUE) var/datum/mind/patient_mind = locateUID(patient_data.mindUID) From 21b43332b7f9edaf9af8f837c46962df56303623 Mon Sep 17 00:00:00 2001 From: Charlie Nolan Date: Fri, 29 Mar 2024 07:48:44 -0700 Subject: [PATCH 33/48] Fixed the grey autocloner bug again, this time for greys. (#24872) --- code/game/objects/structures/grey_autocloner.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/grey_autocloner.dm b/code/game/objects/structures/grey_autocloner.dm index 5178e6eadcfe..d2bba365c31d 100644 --- a/code/game/objects/structures/grey_autocloner.dm +++ b/code/game/objects/structures/grey_autocloner.dm @@ -65,7 +65,7 @@ H.dna = R.dna.Clone() - H.set_species(/datum/species/grey) //This is a grey cloner after all. Funnier this way tbh + H.set_species(/datum/species/grey, skip_same_check = TRUE) //This is a grey cloner after all. Funnier this way tbh for(var/datum/language/L in R.languages) H.add_language(L.name) From f228031f9e1e9adde48f1f47e67c905612a5c33c Mon Sep 17 00:00:00 2001 From: warriorstar-orion Date: Fri, 29 Mar 2024 10:49:32 -0400 Subject: [PATCH 34/48] refactor: remove unused var /area/no_air (#24866) --- code/game/area/areas.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index b0eb9888f12b..71b3b64014e7 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -35,8 +35,6 @@ var/has_gravity = TRUE - var/no_air = null - var/air_doors_activated = FALSE var/tele_proof = FALSE From 321c887e8afc0b42236c84524b1bec9b2b96183c Mon Sep 17 00:00:00 2001 From: Charlie Nolan Date: Fri, 29 Mar 2024 07:50:39 -0700 Subject: [PATCH 35/48] Disguised clown shoes. (#24639) * Disuised clown shoes. * Prevent clown shoe subtypes from being dyed. * Apply review suggestions. --- code/modules/clothing/shoes/misc_shoes.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/clothing/shoes/misc_shoes.dm b/code/modules/clothing/shoes/misc_shoes.dm index 064c1ceeed58..a7707bb00622 100644 --- a/code/modules/clothing/shoes/misc_shoes.dm +++ b/code/modules/clothing/shoes/misc_shoes.dm @@ -85,6 +85,10 @@ slowdown = SHOES_SLOWDOWN+1 item_color = "clown" var/enabled_waddle = TRUE + // "Dyeable" in this case is a bit of an understatement, washing these + // with a crayon will give them the appearance and name of normal + // shoes, but the functionality of clown shoes. + dyeable = TRUE /obj/item/clothing/shoes/clown_shoes/Initialize(mapload) . = ..() @@ -116,11 +120,13 @@ enabled_waddle = FALSE /obj/item/clothing/shoes/clown_shoes/nodrop + dyeable = FALSE flags = NODROP /obj/item/clothing/shoes/clown_shoes/magical name = "magical clown shoes" desc = "Standard-issue shoes of the wizarding class clown. Damn they're huge! And powerful! Somehow." + dyeable = FALSE magical = TRUE /obj/item/clothing/shoes/clown_shoes/magical/nodrop @@ -131,6 +137,7 @@ actions_types = list(/datum/action/item_action/slipping) enabled_waddle = FALSE slowdown = 0 + dyeable = FALSE var/slide_distance = 6 var/recharging_rate = 8 SECONDS var/recharging_time = 0 @@ -332,6 +339,7 @@ icon_override = 'icons/goonstation/mob/clothing/feet.dmi' lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi' righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi' + dyeable = FALSE /obj/item/clothing/shoes/singery name = "yellow performer's boots" From 5c24d2be90a59d7e607ab3530d71c80e4bbae96d Mon Sep 17 00:00:00 2001 From: Charlie Nolan Date: Fri, 29 Mar 2024 07:53:05 -0700 Subject: [PATCH 36/48] ... (#24762) --- .../structures/crates_lockers/closets/secure/miscjobs.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/miscjobs.dm b/code/game/objects/structures/crates_lockers/closets/secure/miscjobs.dm index ee2c5e262ea6..abcc17d19198 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/miscjobs.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/miscjobs.dm @@ -29,6 +29,9 @@ req_access = list(ACCESS_MIME) icon_state = "mime" open_door_sprite = "mime_door" + // It's silent! + open_sound = null + close_sound = null /obj/structure/closet/secure_closet/mime/populate_contents() new /obj/item/clothing/head/beret(src) From d7ae085af5bdbf52a562bb1fca3dfcd2cceae379 Mon Sep 17 00:00:00 2001 From: DGamerL <108773801+DGamerL@users.noreply.github.com> Date: Fri, 29 Mar 2024 15:54:30 +0100 Subject: [PATCH 37/48] Haha funny decimal I forgor (#24871) --- .../mob/living/simple_animal/hostile/terror_spiders/prince.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm index 6af2eade5624..dae3abfb64f6 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm @@ -23,7 +23,7 @@ maxHealth = 600 // 30 laser shots health = 600 regen_points_per_hp = 6 // double the normal - IE halved regen speed - move_to_delay = 3 + move_to_delay = 3.5 speed = 0.5 melee_damage_lower = 30 melee_damage_upper = 40 From e6a5685456bb081f09f084e11650907cdf75ff2e Mon Sep 17 00:00:00 2001 From: Luc <89928798+lewcc@users.noreply.github.com> Date: Fri, 29 Mar 2024 11:00:06 -0400 Subject: [PATCH 38/48] get locked idiot (#24852) Co-authored-by: S34N <12197162+S34NW@users.noreply.github.com> Co-authored-by: paradisess13[bot] <165046124+paradisess13[bot]@users.noreply.github.com> --- code/_onclick/hud/action_button.dm | 31 +++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index b78612c0fbdc..1eacfda42293 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -16,6 +16,8 @@ var/id /// UID of the last thing we hovered over. Used for managing action button dragging. var/last_hovered_ref + /// Whether or not this button is locked, preventing it from being dragged. + var/locked = FALSE /atom/movable/screen/movable/action_button/Destroy() . = ..() @@ -38,7 +40,7 @@ // Very much byond logic, but I want nice behavior, so we fake it with drag /atom/movable/screen/movable/action_button/MouseDrag(atom/over_object, src_location, over_location, src_control, over_control, params) . = ..() - if(!can_use(usr)) + if(!can_use(usr) || locked) return @@ -64,6 +66,10 @@ last_hovered_ref = null if(!can_use(usr)) return + if(locked) + fire_action() + return + var/datum/hud/our_hud = usr.hud_used if(over_object == src) our_hud.hide_landings() @@ -100,6 +106,12 @@ var/position_info = SCRN_OBJ_DEFAULT user.hud_used.position_action(src, position_info) +/atom/movable/screen/movable/action_button/proc/fire_action(left_click = TRUE) + linked_action.Trigger(TRUE) + transform = transform.Scale(0.8, 0.8) + alpha = 200 + animate(src, transform = matrix(), time = 0.4 SECONDS, alpha = 255) + /atom/movable/screen/movable/action_button/Click(location, control, params) var/list/modifiers = params2list(params) if(modifiers["ctrl"] && modifiers["shift"]) @@ -116,18 +128,23 @@ AltClick(usr) return TRUE if(modifiers["middle"]) - linked_action.Trigger(left_click = FALSE) + fire_action(TRUE) return TRUE if(modifiers["ctrl"]) CtrlClick(usr) return TRUE - linked_action.Trigger(TRUE) - transform = transform.Scale(0.8, 0.8) - alpha = 200 - animate(src, transform = matrix(), time = 0.4 SECONDS, alpha = 255) + + fire_action(TRUE) return TRUE +/atom/movable/screen/movable/action_button/CtrlClick(mob/user) + if(!can_use(user)) + return + locked = !locked + to_chat(user, "[src]'s button has been [locked ? "":"un"]locked.") + + /** * This is a silly proc used in hud code code to determine what icon and icon state we should be using * for hud elements (such as action buttons) that don't have their own icon and icon state set. @@ -215,7 +232,7 @@ /atom/movable/screen/button_palette - desc = "Drag buttons to move them.
Shift-click any button to reset it.
Alt-click this to reset all buttons.
Ctrl-click this to get a detailed explanation of how to use this." + desc = "Drag buttons to move them.
Shift-click any button to reset it.
Alt-click this to reset all buttons.
Ctrl-click action buttons to lock or unlock them.
Ctrl-click this to get a detailed explanation of how to use this." icon = 'icons/hud/64x16_actions.dmi' icon_state = "screen_gen_palette" screen_loc = ui_action_palette From 26338e99a9131658628aec2acb598bcd5ef8d3c6 Mon Sep 17 00:00:00 2001 From: Charlie Nolan Date: Fri, 29 Mar 2024 08:14:43 -0700 Subject: [PATCH 39/48] Allowed cyborgs to set transfer amounts on their modules. (#24573) * Allowed cyborgs to set transfer amounts on their modules. * Added an explanation comment to the 'redundant' check. * Applied review suggestions. --- code/modules/reagents/reagent_containers.dm | 36 +++++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 7a70db39f578..b598241f1cb2 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -15,19 +15,43 @@ var/temperature_min = 0 // To limit the temperature of a reagent container can atain when exposed to heat/cold var/temperature_max = 10000 +/obj/item/reagent_containers/proc/can_set_transfer_amount(mob/user) + if(!length(possible_transfer_amounts)) + // Nothing to configure. + return FALSE + if(isrobot(user) && src.loc == user) + // Borgs can configure their modules. + return TRUE + if(!Adjacent(user)) + // No configuring the beaker across the room. + return FALSE + if(!ishuman(user)) + // Although a funny idea, station pets changing transfer + // amounts on random conatiners would probably be frustrating + // for the crew. + return FALSE + if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + // I guess there's, like, a switch or a dial or something? + // Whatever, you need to use your hands for this. + return FALSE + return TRUE + /obj/item/reagent_containers/AltClick(mob/user) - if(!Adjacent(user) || !length(possible_transfer_amounts) || !ishuman(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + if(!can_set_transfer_amount(user)) return var/new_transfer_rate = tgui_input_list(user, "Amount per transfer from this:", "[src]", possible_transfer_amounts, "[amount_per_transfer_from_this]") if(!new_transfer_rate) return - if(!Adjacent(user)) - to_chat(user, "You have moved too far away!") - return - if(!ishuman(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) - to_chat(user, "You can't use your hands!") + // This looks redundant, but it's not. Time elapsed while the input + // list was open, so we need to re-check our conditions and give an + // error if they changed. + if(!can_set_transfer_amount(user)) + if(!Adjacent(user)) + to_chat(user, "You have moved too far away!") + if(!ishuman(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + to_chat(user, "You can't use your hands!") return amount_per_transfer_from_this = new_transfer_rate From ff6af9bcb002f0458e924883f19660ad4dcd01f9 Mon Sep 17 00:00:00 2001 From: S34N <12197162+S34NW@users.noreply.github.com> Date: Fri, 29 Mar 2024 15:16:21 +0000 Subject: [PATCH 40/48] =?UTF-8?q?=F0=9F=99=83=20(#24875)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/label_stale.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/label_stale.yml b/.github/workflows/label_stale.yml index d5d6e5d0dd23..2b643599e0c0 100644 --- a/.github/workflows/label_stale.yml +++ b/.github/workflows/label_stale.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Seek and destroy stale PRs and Issues - uses: actions/stale@v4 + uses: actions/stale@v9 with: stale-pr-message: 'This pull request seems to be stale as there have been no changes in 14 days, please make changes within 7 days or the PR will be closed. If you believe this is a mistake, please inform a development team member on Discord.' close-pr-message: 'This pull request has not received any updates since being marked stale, and as such is now being automatically closed. Please feel free to re-open this pull request or open a new one once you have new updates.' @@ -21,4 +21,4 @@ jobs: days-before-issue-close: 14 exempt-issue-labels: '"Stale Exempt"' exempt-pr-labels: '"Stale Exempt", "-Status: Awaiting approval", "-Status: Awaiting Merge", "-Status: Awaiting type assignment"' - only-issue-labels: '"Need Verification", "Cannot Reproduce", "Not A Bug", "(99% Sure) Not A Bug"' + any-of-issue-labels: '"Need Verification", "Cannot Reproduce", "Not A Bug", "(99% Sure) Not A Bug"' From c87c5e4e163195d0cd3ebb96c57d95f2feb83f12 Mon Sep 17 00:00:00 2001 From: Christasmurf <25437893+Christasmurf@users.noreply.github.com> Date: Fri, 29 Mar 2024 15:19:36 +0000 Subject: [PATCH 41/48] Pen resprite (#24756) * pens * fountainpen description * syndipen in uplink * Apply suggestions from code review Co-authored-by: CRUNCH <143041327+Fordoxia@users.noreply.github.com> Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * remove spaghetti --------- Co-authored-by: CRUNCH <143041327+Fordoxia@users.noreply.github.com> Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> --- code/datums/uplink_items/uplink_general.dm | 7 +++ code/modules/paperwork/pen.dm | 51 +++++++++++++++++---- code/modules/pda/PDA.dm | 5 +- code/modules/pda/pdas.dm | 17 +++++++ icons/obj/bureaucracy.dmi | Bin 27596 -> 29428 bytes 5 files changed, 70 insertions(+), 10 deletions(-) diff --git a/code/datums/uplink_items/uplink_general.dm b/code/datums/uplink_items/uplink_general.dm index 22ab171ff354..7f36a7275447 100644 --- a/code/datums/uplink_items/uplink_general.dm +++ b/code/datums/uplink_items/uplink_general.dm @@ -859,6 +859,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) category = "(Pointless) Badassery" surplus = 0 +/datum/uplink_item/badass/pen + name = "Syndicate Fountain Pen" + desc = "A slick Syndicate-branded pen, to show everyone at the meeting that you mean business." + reference = "PEN" + item = /obj/item/pen/multi/syndicate + cost = 1 + /datum/uplink_item/badass/syndiecigs name = "Syndicate Smokes" desc = "Strong flavor, dense smoke, infused with omnizine." diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 1c54633e47e4..6a3d492555a9 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -62,7 +62,6 @@ "blue" = list(0.5, 0.5, 1), "yellow" = list(1, 1, 0)) var/pen_colour_iconstate = "pencolor" - var/pen_colour_shift = 3 /obj/item/pen/multi/Initialize(mapload) ..() @@ -83,8 +82,6 @@ var/icon/colour_overlay = new(icon, pen_colour_iconstate) var/list/colours = colour_choices[colour] colour_overlay.SetIntensity(colours[1], colours[2], colours[3]) - if(pen_colour_shift) - colour_overlay.Shift(SOUTH, pen_colour_shift) . += colour_overlay /obj/item/pen/fancy @@ -93,16 +90,54 @@ icon_state = "fancypen" /obj/item/pen/multi/gold - name = "Gilded Pen" + name = "gilded pen" desc = "A golden pen that is gilded with a meager amount of gold material. The word 'Nanotrasen' is etched on the clip of the pen." icon_state = "goldpen" - pen_colour_shift = 0 /obj/item/pen/multi/fountain - name = "Engraved Fountain Pen" - desc = "An expensive looking pen." + name = "engraved fountain pen" + desc = "An expensive-looking pen typically issued to Nanotrasen employees." icon_state = "fountainpen" - pen_colour_shift = 0 + +/obj/item/pen/multi/syndicate + name = "syndicate fountain pen" + desc = "A suspicious-looking pen issued to Syndicate staff." + icon_state = "pen_syndie" + +/obj/item/pen/cap + name = "captain's fountain pen" + desc = "An expensive pen only issued to station captains." + icon_state = "pen_cap" + +/obj/item/pen/hop + name = "head of personnel's fountain pen" + desc = "An expensive-looking pen only issued to heads of service." + icon_state = "pen_hop" + +/obj/item/pen/hos + name = "head of security's fountain pen" + desc = "An expensive-looking pen only issued to heads of security." + icon_state = "pen_hos" + +/obj/item/pen/cmo + name = "chief medical officer's fountain pen" + desc = "An expensive-looking pen only issued to heads of medical." + icon_state = "pen_cmo" + +/obj/item/pen/ce + name = "chief engineer's fountain pen" + desc = "An expensive-looking pen only issued to heads of engineering." + icon_state = "pen_ce" + +/obj/item/pen/rd + name = "research director's fountain pen" + desc = "An expensive-looking pen only issued to heads of research." + icon_state = "pen_rd" + +/obj/item/pen/qm + name = "quartermaster's fountain pen" + desc = "An expensive-looking pen only issued to heads of cargo." + icon_state = "pen_qm" /* * Sleepypens diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm index 294cfabd43e6..231dafbef73b 100644 --- a/code/modules/pda/PDA.dm +++ b/code/modules/pda/PDA.dm @@ -76,7 +76,8 @@ GLOBAL_LIST_EMPTY(PDAs) // The slot where you can store a pen var/obj/item/held_pen var/retro_mode = 0 - + /// What pen is loaded in the PDA + var/obj/item/pen/default_pen = /obj/item/pen /* * The Actual PDA @@ -90,7 +91,7 @@ GLOBAL_LIST_EMPTY(PDAs) if(default_cartridge) cartridge = new default_cartridge(src) cartridge.update_programs(src) - add_pen(new /obj/item/pen(src)) + add_pen(new default_pen(src)) start_program(find_program(/datum/data/pda/app/main_menu)) silent = initial(silent) diff --git a/code/modules/pda/pdas.dm b/code/modules/pda/pdas.dm index 8d568b0f1454..9d290e709cbe 100644 --- a/code/modules/pda/pdas.dm +++ b/code/modules/pda/pdas.dm @@ -17,10 +17,12 @@ /obj/item/pda/detective default_cartridge = /obj/item/cartridge/detective icon_state = "pda-security" + default_pen = /obj/item/pen/multi /obj/item/pda/warden default_cartridge = /obj/item/cartridge/security icon_state = "pda-warden" + default_pen = /obj/item/pen/multi /obj/item/pda/janitor default_cartridge = /obj/item/cartridge/janitor @@ -55,44 +57,54 @@ /obj/item/pda/heads/hop default_cartridge = /obj/item/cartridge/hop icon_state = "pda-hop" + default_pen = /obj/item/pen/hop /obj/item/pda/heads/hos default_cartridge = /obj/item/cartridge/hos icon_state = "pda-hos" + default_pen = /obj/item/pen/hos /obj/item/pda/heads/ce default_cartridge = /obj/item/cartridge/ce icon_state = "pda-ce" + default_pen = /obj/item/pen/ce /obj/item/pda/heads/cmo default_cartridge = /obj/item/cartridge/cmo icon_state = "pda-cmo" + default_pen = /obj/item/pen/cmo /obj/item/pda/heads/rd default_cartridge = /obj/item/cartridge/rd icon_state = "pda-rd" + default_pen = /obj/item/pen/rd /obj/item/pda/captain default_cartridge = /obj/item/cartridge/captain icon_state = "pda-captain" detonate = FALSE + default_pen = /obj/item/pen/cap //toff = 1 /obj/item/pda/heads/ntrep default_cartridge = /obj/item/cartridge/supervisor icon_state = "pda-h" + default_pen = /obj/item/pen/multi/fountain /obj/item/pda/heads/magistrate default_cartridge = /obj/item/cartridge/supervisor icon_state = "pda-h" + default_pen = /obj/item/pen/multi/gold /obj/item/pda/heads/blueshield default_cartridge = /obj/item/cartridge/hos icon_state = "pda-h" + default_pen = /obj/item/pen/fancy /obj/item/pda/heads/ert default_cartridge = /obj/item/cartridge/centcom detonate = FALSE + default_pen = /obj/item/pen/multi/fountain /obj/item/pda/heads/ert/engineering icon_state = "pda-engineer" @@ -116,6 +128,7 @@ /obj/item/pda/quartermaster default_cartridge = /obj/item/cartridge/qm icon_state = "pda-qm" + default_pen = /obj/item/pen/qm /obj/item/pda/shaftminer icon_state = "pda-miner" @@ -125,6 +138,7 @@ icon_state = "pda-syndi" name = "Military PDA" owner = "John Doe" + default_pen = /obj/item/pen/multi/syndicate /obj/item/pda/syndicate/New() ..() @@ -140,6 +154,7 @@ default_cartridge = /obj/item/cartridge/lawyer icon_state = "pda-lawyer" ttone = "..." + default_pen = /obj/item/pen/multi /obj/item/pda/botanist //default_cartridge = /obj/item/cartridge/botanist @@ -153,6 +168,7 @@ desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a WGW-11 series e-reader." model_name = "Thinktronic 5290 WGW-11 Series E-reader and Personal Data Assistant" silent = TRUE + default_pen = /obj/item/pen/multi /obj/item/pda/clear icon_state = "pda-transp" @@ -180,6 +196,7 @@ /obj/item/pda/centcom default_cartridge = /obj/item/cartridge/centcom icon_state = "pda-h" + default_pen = /obj/item/pen/multi/gold /obj/item/pda/centcom/New() ..() diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 599237fdadfa86dbd2b08cdbbb8bf07a575ccb3a..30a7fc4f7323a050e73f72a435dd63c8a7d60449 100644 GIT binary patch literal 29428 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
Support Positions
Supply Positions
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 literal 27596 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 GFaH Date: Sat, 30 Mar 2024 08:53:47 -0400 Subject: [PATCH 42/48] rename all station files and datums, consolidate types into one file (#24823) --- .github/workflows/ci.yml | 2 +- .../cyberiad.dmm => stations/boxstation.dmm} | 0 .../{cerestation => stations}/cerestation.dmm | 0 .../delta.dmm => stations/deltastation.dmm} | 0 .../metastation.dmm} | 0 .../subsystem/non_firing/SSmapping.dm | 4 +-- code/modules/mapping/cerestation.dm | 6 ---- code/modules/mapping/cyberiad.dm | 5 ---- code/modules/mapping/delta.dm | 5 ---- code/modules/mapping/metastation.dm | 5 ---- code/modules/mapping/station_datums.dm | 30 +++++++++++++++++++ code/modules/mapping/test_tiny.dm | 5 ---- paradise.dme | 6 +--- .../nanomap-renderer-invoker.sh | 14 ++++----- 14 files changed, 41 insertions(+), 41 deletions(-) rename _maps/map_files/{cyberiad/cyberiad.dmm => stations/boxstation.dmm} (100%) rename _maps/map_files/{cerestation => stations}/cerestation.dmm (100%) rename _maps/map_files/{Delta/delta.dmm => stations/deltastation.dmm} (100%) rename _maps/map_files/{MetaStation/MetaStation.dmm => stations/metastation.dmm} (100%) delete mode 100644 code/modules/mapping/cerestation.dm delete mode 100644 code/modules/mapping/cyberiad.dm delete mode 100644 code/modules/mapping/delta.dm delete mode 100644 code/modules/mapping/metastation.dm create mode 100644 code/modules/mapping/station_datums.dm delete mode 100644 code/modules/mapping/test_tiny.dm diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3adae3a9ab8e..1c5f9e4eb6f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -91,7 +91,7 @@ jobs: strategy: fail-fast: false # Let all map tests run to completion matrix: - maptype: ['/datum/map/cyberiad', '/datum/map/delta', '/datum/map/metastation', '/datum/map/cerestation'] + maptype: ['/datum/map/boxstation', '/datum/map/deltastation', '/datum/map/metastation', '/datum/map/cerestation'] byondtype: ['STABLE'] services: mariadb: diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/stations/boxstation.dmm similarity index 100% rename from _maps/map_files/cyberiad/cyberiad.dmm rename to _maps/map_files/stations/boxstation.dmm diff --git a/_maps/map_files/cerestation/cerestation.dmm b/_maps/map_files/stations/cerestation.dmm similarity index 100% rename from _maps/map_files/cerestation/cerestation.dmm rename to _maps/map_files/stations/cerestation.dmm diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/stations/deltastation.dmm similarity index 100% rename from _maps/map_files/Delta/delta.dmm rename to _maps/map_files/stations/deltastation.dmm diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/stations/metastation.dmm similarity index 100% rename from _maps/map_files/MetaStation/MetaStation.dmm rename to _maps/map_files/stations/metastation.dmm diff --git a/code/controllers/subsystem/non_firing/SSmapping.dm b/code/controllers/subsystem/non_firing/SSmapping.dm index 58aa4771dc0b..6b33a817f4a5 100644 --- a/code/controllers/subsystem/non_firing/SSmapping.dm +++ b/code/controllers/subsystem/non_firing/SSmapping.dm @@ -29,10 +29,10 @@ SUBSYSTEM_DEF(mapping) map_datum = text2path(lines[1]) map_datum = new map_datum catch - map_datum = new /datum/map/cyberiad // Assume cyberiad if non-existent + map_datum = new /datum/map/boxstation // Assume cyberiad if non-existent fdel("data/next_map.txt") // Remove to avoid the same map existing forever else - map_datum = new /datum/map/cyberiad // Assume cyberiad if non-existent + map_datum = new /datum/map/boxstation // Assume cyberiad if non-existent /datum/controller/subsystem/mapping/Shutdown() if(next_map) // Save map for next round diff --git a/code/modules/mapping/cerestation.dm b/code/modules/mapping/cerestation.dm deleted file mode 100644 index 20c533338da2..000000000000 --- a/code/modules/mapping/cerestation.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/map/cerestation - fluff_name = "NSS Farragus" - technical_name = "CereStation" - map_path = "_maps/map_files/cerestation/cerestation.dmm" - webmap_url = "https://webmap.affectedarc07.co.uk/maps/paradise/cerestation/" - min_players_random = 60 diff --git a/code/modules/mapping/cyberiad.dm b/code/modules/mapping/cyberiad.dm deleted file mode 100644 index bc6496192d87..000000000000 --- a/code/modules/mapping/cyberiad.dm +++ /dev/null @@ -1,5 +0,0 @@ -/datum/map/cyberiad - fluff_name = "NSS Cyberiad" - technical_name = "Cyberiad" - map_path = "_maps/map_files/cyberiad/cyberiad.dmm" - webmap_url = "https://webmap.affectedarc07.co.uk/maps/paradise/cyberiad/" diff --git a/code/modules/mapping/delta.dm b/code/modules/mapping/delta.dm deleted file mode 100644 index ed0d91dc0bae..000000000000 --- a/code/modules/mapping/delta.dm +++ /dev/null @@ -1,5 +0,0 @@ -/datum/map/delta - fluff_name = "NSS Kerberos" - technical_name = "Delta" - map_path = "_maps/map_files/Delta/delta.dmm" - webmap_url = "https://webmap.affectedarc07.co.uk/maps/paradise/deltastation/" diff --git a/code/modules/mapping/metastation.dm b/code/modules/mapping/metastation.dm deleted file mode 100644 index d1a486bfc666..000000000000 --- a/code/modules/mapping/metastation.dm +++ /dev/null @@ -1,5 +0,0 @@ -/datum/map/metastation - fluff_name = "NSS Cerebron" - technical_name = "MetaStation" - map_path = "_maps/map_files/MetaStation/MetaStation.dmm" - webmap_url = "https://webmap.affectedarc07.co.uk/maps/paradise/metastation/" diff --git a/code/modules/mapping/station_datums.dm b/code/modules/mapping/station_datums.dm new file mode 100644 index 000000000000..1f0356abc464 --- /dev/null +++ b/code/modules/mapping/station_datums.dm @@ -0,0 +1,30 @@ +/datum/map/boxstation + fluff_name = "NSS Cyberiad" + technical_name = "Cyberiad" + map_path = "_maps/map_files/stations/boxstation.dmm" + webmap_url = "https://webmap.affectedarc07.co.uk/maps/paradise/cyberiad/" + +/datum/map/metastation + fluff_name = "NSS Cerebron" + technical_name = "MetaStation" + map_path = "_maps/map_files/stations/metastation.dmm" + webmap_url = "https://webmap.affectedarc07.co.uk/maps/paradise/metastation/" + +/datum/map/deltastation + fluff_name = "NSS Kerberos" + technical_name = "Delta" + map_path = "_maps/map_files/stations/deltastation.dmm" + webmap_url = "https://webmap.affectedarc07.co.uk/maps/paradise/deltastation/" + +/datum/map/cerestation + fluff_name = "NSS Farragus" + technical_name = "CereStation" + map_path = "_maps/map_files/stations/cerestation.dmm" + webmap_url = "https://webmap.affectedarc07.co.uk/maps/paradise/cerestation/" + min_players_random = 60 + +/datum/map/test_tiny + fluff_name = "test_tiny" + technical_name = "test_tiny" + map_path = "_maps/map_files/test_tiny/test_tiny.dmm" + voteable = FALSE diff --git a/code/modules/mapping/test_tiny.dm b/code/modules/mapping/test_tiny.dm deleted file mode 100644 index 0c6294c15d0f..000000000000 --- a/code/modules/mapping/test_tiny.dm +++ /dev/null @@ -1,5 +0,0 @@ -/datum/map/test_tiny - fluff_name = "test_tiny" - technical_name = "test_tiny" - map_path = "_maps/map_files/test_tiny/test_tiny.dmm" - voteable = FALSE diff --git a/paradise.dme b/paradise.dme index 842679f672c6..404e0e040a33 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1962,13 +1962,9 @@ #include "code\modules\lighting\lighting_turf.dm" #include "code\modules\mapping\access_helpers.dm" #include "code\modules\mapping\base_map_datum.dm" -#include "code\modules\mapping\cerestation.dm" -#include "code\modules\mapping\cyberiad.dm" -#include "code\modules\mapping\delta.dm" #include "code\modules\mapping\mapping_helpers.dm" #include "code\modules\mapping\merge_conflicts.dm" -#include "code\modules\mapping\metastation.dm" -#include "code\modules\mapping\test_tiny.dm" +#include "code\modules\mapping\station_datums.dm" #include "code\modules\mapping\windoor_access_helpers.dm" #include "code\modules\maptext_alerts\location_blurbs.dm" #include "code\modules\maptext_alerts\text_blurbs.dm" diff --git a/tools/github-actions/nanomap-renderer-invoker.sh b/tools/github-actions/nanomap-renderer-invoker.sh index f46dac10d5c3..14f0e810b185 100755 --- a/tools/github-actions/nanomap-renderer-invoker.sh +++ b/tools/github-actions/nanomap-renderer-invoker.sh @@ -1,15 +1,15 @@ #!/bin/bash set -e # Generate maps -tools/github-actions/nanomap-renderer minimap -w 2040 -h 2040 "./_maps/map_files/cyberiad/cyberiad.dmm" -tools/github-actions/nanomap-renderer minimap -w 2040 -h 2040 "./_maps/map_files/Delta/delta.dmm" -tools/github-actions/nanomap-renderer minimap -w 2040 -h 2040 "./_maps/map_files/MetaStation/MetaStation.dmm" -tools/github-actions/nanomap-renderer minimap -w 2040 -h 2040 "./_maps/map_files/cerestation/cerestation.dmm" +tools/github-actions/nanomap-renderer minimap -w 2040 -h 2040 "./_maps/map_files/stations/boxstation.dmm" +tools/github-actions/nanomap-renderer minimap -w 2040 -h 2040 "./_maps/map_files/stations/deltastation.dmm" +tools/github-actions/nanomap-renderer minimap -w 2040 -h 2040 "./_maps/map_files/stations/metastation.dmm" +tools/github-actions/nanomap-renderer minimap -w 2040 -h 2040 "./_maps/map_files/stations/cerestation.dmm" # Move and rename files so the game understands them cd "data/nanomaps" -mv "cyberiad_nanomap_z1.png" "Cyberiad_nanomap_z1.png" -mv "delta_nanomap_z1.png" "Delta_nanomap_z1.png" -#mv "MetaStation_nanomap_z1.png" "MetaStation_nanomap_z1.png" # What's even the point of this? +mv "boxstation_nanomap_z1.png" "Cyberiad_nanomap_z1.png" +mv "deltastation_nanomap_z1.png" "Delta_nanomap_z1.png" +mv "metastation_nanomap_z1.png" "MetaStation_nanomap_z1.png" mv "cerestation_nanomap_z1.png" "CereStation_nanomap_z1.png" cd "../../" cp "data/nanomaps/Cyberiad_nanomap_z1.png" "icons/_nanomaps" From eee8878024bfd174cc768e2f8e7d31df45f9661c Mon Sep 17 00:00:00 2001 From: GDN <96800819+GDNgit@users.noreply.github.com> Date: Mon, 1 Apr 2024 02:42:21 -0500 Subject: [PATCH 43/48] Datumizes spells (#24242) * datumized spells * finished * last changes * conflict * Update code/datums/spells/alien_spells/transfer_plasma.dm * conflicts * shitty runtime fix until i get to this tomorrow * Update code/datums/spell.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/datums/spell_handler/alien_spell_handler.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/datums/spells/alien_spells/regurgitate.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/datums/spells/alien_spells/regurgitate.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/datums/spells/bloodcrawl.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/datums/spells/bloodcrawl.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/modules/awaymissions/mission_code/ruins/wizardcrash.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/modules/research/xenobiology/xenobiology.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/modules/mob/living/carbon/superheroes.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/datums/spells/conjure.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/datums/spells/ethereal_jaunt.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/datums/spells/emplosion.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/datums/spells/turf_teleport.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/datums/spells/wizard_spells.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/datums/spells/wizard_spells.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/game/dna/mutations/mutation_powers.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/datums/spells/wizard_spells.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/datums/spells/wizard_spells.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/game/dna/mutations/mutation_powers.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/game/gamemodes/miniantags/revenant/revenant_abilities.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * guess who just rework the entire malf ai actionsf ai * gc better --------- Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> --- code/__DEFINES/dcs/signals.dm | 4 +- code/datums/action.dm | 12 +- code/datums/mind.dm | 10 +- code/datums/outfits/outfit_admin.dm | 4 +- code/datums/spell.dm | 134 +++-- code/datums/spell_cooldown/spell_charges.dm | 2 +- code/datums/spell_cooldown/spell_cooldown.dm | 4 +- .../spell_handler/alien_spell_handler.dm | 10 +- .../spell_handler/morph_spell_handler.dm | 8 +- code/datums/spell_handler/spell_handler.dm | 10 +- code/datums/spell_handler/vampire.dm | 6 +- code/datums/spell_targeting/alive_mobs.dm | 2 +- code/datums/spell_targeting/aoe.dm | 2 +- .../spell_targeting/click_spell_targeting.dm | 2 +- code/datums/spell_targeting/clicked_atom.dm | 4 +- .../spell_targeting/matter_eater_targeting.dm | 2 +- .../datums/spell_targeting/reachable_turfs.dm | 2 +- .../spell_targeting/remoteview_targeting.dm | 2 +- code/datums/spell_targeting/self_targeting.dm | 2 +- .../datums/spell_targeting/spell_targeting.dm | 8 +- code/datums/spell_targeting/targeted.dm | 2 +- code/datums/spell_targeting/telepathic.dm | 2 +- .../alien_spells/basetype_alien_spell.dm | 10 +- .../alien_spells/basetype_alien_touch.dm | 12 +- .../alien_spells/build_resin_structure.dm | 16 +- .../alien_spells/corrosive_acid_spit.dm | 4 +- .../spells/alien_spells/larva_evolve.dm | 6 +- .../spells/alien_spells/lay_alien_eggs.dm | 10 +- .../spells/alien_spells/neurotoxin_spit.dm | 10 +- .../spells/alien_spells/plasma_weeds.dm | 6 +- .../spells/alien_spells/queen_evolve.dm | 6 +- .../datums/spells/alien_spells/regurgitate.dm | 10 +- code/datums/spells/alien_spells/tail_lash.dm | 6 +- .../spells/alien_spells/transfer_plasma.dm | 12 +- code/datums/spells/alien_spells/whisper.dm | 6 +- code/datums/spells/area_teleport.dm | 8 +- code/datums/spells/banana_touch.dm | 4 +- code/datums/spells/bloodcrawl.dm | 56 +- code/datums/spells/chaplain_bless.dm | 8 +- code/datums/spells/charge.dm | 10 +- code/datums/spells/charge_up.dm | 22 +- code/datums/spells/charge_up_bounce.dm | 16 +- code/datums/spells/cluwne.dm | 2 +- code/datums/spells/conjure.dm | 11 +- code/datums/spells/conjure_item.dm | 8 +- code/datums/spells/construct_spells.dm | 39 +- code/datums/spells/disguise_self.dm | 6 +- code/datums/spells/emplosion.dm | 8 +- code/datums/spells/ethereal_jaunt.dm | 12 +- code/datums/spells/fake_gib.dm | 2 +- code/datums/spells/genetic.dm | 14 +- code/datums/spells/horsemask.dm | 6 +- code/datums/spells/infinite_guns.dm | 8 +- code/datums/spells/inflict_handler.dm | 62 --- code/datums/spells/knock.dm | 14 +- code/datums/spells/lichdom.dm | 24 +- code/datums/spells/lightning.dm | 14 +- code/datums/spells/magnet.dm | 14 +- code/datums/spells/mime.dm | 42 +- code/datums/spells/mime_malaise.dm | 2 +- code/datums/spells/mimic.dm | 42 +- code/datums/spells/mind_transfer.dm | 8 +- code/datums/spells/night_vision.dm | 6 +- code/datums/spells/projectile_spell.dm | 40 +- code/datums/spells/rathens.dm | 6 +- code/datums/spells/rod_form.dm | 6 +- code/datums/spells/sentient_sword_lunge.dm | 6 +- code/datums/spells/shapeshift.dm | 20 +- code/datums/spells/spacetime_dist.dm | 16 +- code/datums/spells/summon_supermatter.dm | 4 +- code/datums/spells/summonitem.dm | 6 +- code/datums/spells/touch_attacks.dm | 14 +- code/datums/spells/trigger.dm | 28 - code/datums/spells/turf_teleport.dm | 8 +- code/datums/spells/wizard_spells.dm | 137 +++-- code/game/dna/mutations/disabilities.dm | 8 +- code/game/dna/mutations/mutation_powers.dm | 94 ++-- code/game/gamemodes/cult/blood_magic.dm | 12 +- .../gamemodes/malfunction/Malf_Modules.dm | 508 ++++++++---------- .../demons/shadow_demon/shadow_demon.dm | 12 +- .../demons/slaughter demon/slaughter.dm | 16 +- .../miniantags/guardian/host_actions.dm | 18 +- .../miniantags/guardian/types/healer.dm | 2 +- .../miniantags/guardian/types/ranged.dm | 2 +- .../guardian/types/standard_guardian.dm | 2 +- code/game/gamemodes/miniantags/morph/morph.dm | 14 +- .../miniantags/morph/spells/ambush.dm | 10 +- .../miniantags/morph/spells/morph_spell.dm | 8 +- .../miniantags/morph/spells/open_vent.dm | 10 +- .../miniantags/morph/spells/pass_airlock.dm | 10 +- .../miniantags/morph/spells/reproduce.dm | 8 +- .../miniantags/pulsedemon/pulsedemon.dm | 26 +- .../pulsedemon/pulsedemon_abilities.dm | 84 +-- .../gamemodes/miniantags/revenant/revenant.dm | 14 +- .../miniantags/revenant/revenant_abilities.dm | 62 +-- code/game/gamemodes/wizard/godhand.dm | 2 +- code/game/gamemodes/wizard/soulstone.dm | 6 +- code/game/gamemodes/wizard/spellbook.dm | 116 ++-- code/game/gamemodes/wizard/wizard.dm | 4 +- code/game/gamemodes/wizard/wizloadouts.dm | 34 +- code/game/jobs/job/support.dm | 4 +- code/game/jobs/job/support_chaplain.dm | 2 +- code/game/objects/items/granters/_granters.dm | 2 +- .../granters/action_granters/summon_cheese.dm | 4 +- code/game/objects/items/weapons/dice.dm | 2 +- code/modules/admin/admin_verbs.dm | 4 +- .../modules/antagonists/vampire/vamp_datum.dm | 22 +- .../vampire_powers/dantalion_powers.dm | 54 +- .../vampire_powers/gargantua_powers.dm | 48 +- .../vampire_powers/hemomancer_powers.dm | 54 +- .../vampire/vampire_powers/umbrae_powers.dm | 53 +- .../vampire/vampire_powers/vampire_powers.dm | 56 +- .../antagonists/vampire/vampire_subclasses.dm | 118 ++-- .../antagonists/wizard/datum_apprentice.dm | 32 +- .../ghost_role_spawners/golems.dm | 4 +- .../mission_code/ruins/wizardcrash.dm | 4 +- .../combos/plasma_fist/tornado_sweep.dm | 2 +- .../mining/lavaland/loot/ashdragon_loot.dm | 2 +- .../mining/lavaland/loot/colossus_loot.dm | 12 +- .../mob/dead/observer/observer_base.dm | 2 +- code/modules/mob/dead/observer/spells.dm | 6 +- .../alien/humanoid/caste/alien_drone.dm | 2 +- .../living/carbon/alien/humanoid/humanoid.dm | 2 +- .../mob/living/carbon/alien/humanoid/queen.dm | 2 +- .../mob/living/carbon/alien/larva/larva.dm | 2 +- code/modules/mob/living/carbon/human/npcs.dm | 2 +- .../mob/living/carbon/human/species/golem.dm | 4 +- code/modules/mob/living/carbon/superheroes.dm | 20 +- code/modules/mob/living/silicon/ai/ai_mob.dm | 4 +- code/modules/mob/living/silicon/pai/pai.dm | 10 +- .../mob/living/silicon/pai/software.dm | 6 +- .../mob/living/simple_animal/constructs.dm | 26 +- .../simple_animal/hostile/angel_statue.dm | 18 +- .../living/simple_animal/hostile/hellhound.dm | 10 +- .../simple_animal/hostile/megafauna/drake.dm | 6 +- .../hostile/retaliate/kangaroo.dm | 2 +- .../hostile/terror_spiders/prince.dm | 10 +- .../modules/mob/living/simple_animal/shade.dm | 2 +- code/modules/mob/living/stat_states.dm | 2 +- code/modules/mob/mob.dm | 6 +- code/modules/mob/mob_vars.dm | 2 +- code/modules/power/apc/apc_malfunction.dm | 4 +- .../projectiles/guns/projectile/revolver.dm | 2 +- .../reagents/reagent_containers/spray.dm | 3 - .../research/xenobiology/xenobiology.dm | 5 +- .../surgery/organs/augments_internal.dm | 16 +- code/modules/surgery/organs/subtypes/xenos.dm | 22 +- .../unit_tests/spell_targeting_test.dm | 2 +- paradise.dme | 2 - 149 files changed, 1346 insertions(+), 1524 deletions(-) delete mode 100644 code/datums/spells/inflict_handler.dm delete mode 100644 code/datums/spells/trigger.dm diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 66b7ca87f190..f0ab8e7ac932 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -600,9 +600,9 @@ #define COMSIG_ITEM_PICKUP "item_pickup" ///from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone) #define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" -///return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/lichdom/cast(): (mob/user) +///return a truthy value to prevent ensouling, checked in /datum/spell/lichdom/cast(): (mob/user) #define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" -///called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/summonitem/cast() : (mob/user) +///called before marking an object for retrieval, checked in /datum/spell/summonitem/cast() : (mob/user) #define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval" #define COMPONENT_BLOCK_MARK_RETRIEVAL (1<<0) ///from base of obj/item/hit_reaction(): (list/args) diff --git a/code/datums/action.dm b/code/datums/action.dm index 7e1c0752ec85..cace288d1b8b 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -637,7 +637,7 @@ /datum/action/spell_action/New(Target) ..() - var/obj/effect/proc_holder/spell/S = target + var/datum/spell/S = target S.action = src name = S.name desc = S.desc @@ -648,7 +648,7 @@ /datum/action/spell_action/Destroy() - var/obj/effect/proc_holder/spell/S = target + var/datum/spell/S = target S.action = null return ..() @@ -656,27 +656,27 @@ if(!..()) return FALSE if(target) - var/obj/effect/proc_holder/spell = target + var/datum/spell/spell = target spell.Click() return TRUE /datum/action/spell_action/AltTrigger() if(target) - var/obj/effect/proc_holder/spell/spell = target + var/datum/spell/spell = target spell.AltClick(usr) return TRUE /datum/action/spell_action/IsAvailable() if(!target) return FALSE - var/obj/effect/proc_holder/spell/spell = target + var/datum/spell/spell = target if(owner) return spell.can_cast(owner) return FALSE /datum/action/spell_action/apply_unavailable_effect(atom/movable/screen/movable/action_button/button) - var/obj/effect/proc_holder/spell/S = target + var/datum/spell/S = target if(!istype(S)) return ..() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index dd6106e872ab..a0b39e4ad696 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1052,7 +1052,7 @@ log_admin("[key_name(usr)] has removed [key_name(current)]'s vampire subclass.") message_admins("[key_name_admin(usr)] has removed [key_name_admin(current)]'s vampire subclass.") else - vamp.upgrade_tiers -= /obj/effect/proc_holder/spell/vampire/self/specialize + vamp.upgrade_tiers -= /datum/spell/vampire/self/specialize vamp.change_subclass(subclass_type) log_admin("[key_name(usr)] has removed [key_name(current)]'s vampire subclass.") message_admins("[key_name_admin(usr)] has removed [key_name_admin(current)]'s vampire subclass.") @@ -1676,14 +1676,14 @@ SEND_SOUND(H, sound('sound/ambience/antag/abductors.ogg')) H.create_log(MISC_LOG, "[H] was made into an abductor") -/datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S) +/datum/mind/proc/AddSpell(datum/spell/S) spell_list += S S.action.Grant(current) -/datum/mind/proc/RemoveSpell(obj/effect/proc_holder/spell/spell) //To remove a specific spell from a mind +/datum/mind/proc/RemoveSpell(datum/spell/spell) //To remove a specific spell from a mind if(!spell) return - for(var/obj/effect/proc_holder/spell/S in spell_list) + for(var/datum/spell/S in spell_list) if(istype(S, spell)) qdel(S) spell_list -= S @@ -1696,7 +1696,7 @@ /datum/mind/proc/transfer_mindbound_actions(mob/living/new_character) for(var/X in spell_list) - var/obj/effect/proc_holder/spell/S = X + var/datum/spell/S = X if(!S.on_mind_transfer(new_character)) current.RemoveSpell(S) continue diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 47f3e37da94d..f6067d0a3165 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -1410,8 +1410,8 @@ box = /obj/item/storage/box/wizard //The spells that the enforcer has. - var/list/spell_paths = list(/obj/effect/proc_holder/spell/aoe/conjure/summon_supermatter, - /obj/effect/proc_holder/spell/charge_up/bounce/lightning, /obj/effect/proc_holder/spell/summonitem) + var/list/spell_paths = list(/datum/spell/aoe/conjure/summon_supermatter, + /datum/spell/charge_up/bounce/lightning, /datum/spell/summonitem) /datum/outfit/admin/enforcer/post_equip(mob/living/carbon/human/H) . = ..() diff --git a/code/datums/spell.dm b/code/datums/spell.dm index e20a939e364f..cc6a40a91ad5 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -1,29 +1,9 @@ -/obj/effect/proc_holder - var/panel = "Debug"//What panel the proc holder needs to go on. - var/active = FALSE //Used by toggle based abilities. - var/ranged_mousepointer - var/mob/ranged_ability_user - -/obj/effect/proc_holder/singularity_act() - return - -/obj/effect/proc_holder/singularity_pull() - return - -GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) - -/obj/effect/proc_holder/proc/InterceptClickOn(mob/user, params, atom/A) - if(user.ranged_ability != src) - to_chat(user, "[user.ranged_ability.name] has been disabled.") - user.ranged_ability.remove_ranged_ability(user) - return TRUE //TRUE for failed, FALSE for passed. - user.face_atom(A) - return FALSE +GLOBAL_LIST_INIT(spells, typesof(/datum/spell)) /datum/click_intercept/proc_holder - var/obj/effect/proc_holder/spell + var/datum/spell/spell -/datum/click_intercept/proc_holder/New(client/C, obj/effect/proc_holder/spell_to_cast) +/datum/click_intercept/proc_holder/New(client/C, datum/spell/spell_to_cast) . = ..() spell = spell_to_cast @@ -34,7 +14,15 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) spell.remove_ranged_ability(spell.ranged_ability_user) return ..() -/obj/effect/proc_holder/proc/add_ranged_ability(mob/user, msg) +/datum/spell/proc/InterceptClickOn(mob/user, params, atom/A) + if(user.ranged_ability != src) + to_chat(user, "[user.ranged_ability.name] has been disabled.") + user.ranged_ability.remove_ranged_ability(user) + return TRUE //TRUE for failed, FALSE for passed. + user.face_atom(A) + return FALSE + +/datum/spell/proc/add_ranged_ability(mob/user, msg) if(!user || !user.client) return if(user.ranged_ability && user.ranged_ability != src) @@ -47,17 +35,20 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) active = TRUE if(msg) to_chat(user, msg) - update_icon() + update_spell_icon() -/obj/effect/proc_holder/proc/add_mousepointer(client/C) +/datum/spell/proc/update_spell_icon() + return + +/datum/spell/proc/add_mousepointer(client/C) if(C && ranged_mousepointer && C.mouse_pointer_icon == initial(C.mouse_pointer_icon)) C.mouse_pointer_icon = ranged_mousepointer -/obj/effect/proc_holder/proc/remove_mousepointer(client/C) +/datum/spell/proc/remove_mousepointer(client/C) if(C && ranged_mousepointer && C.mouse_pointer_icon == ranged_mousepointer) C.mouse_pointer_icon = initial(C.mouse_pointer_icon) -/obj/effect/proc_holder/proc/remove_ranged_ability(mob/user, msg) +/datum/spell/proc/remove_ranged_ability(mob/user, msg) if(!user || (user.ranged_ability && user.ranged_ability != src)) //To avoid removing the wrong ability return user.ranged_ability = null @@ -69,14 +60,12 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) remove_mousepointer(user.client) if(msg) to_chat(user, msg) - update_icon() + update_spell_icon() -/obj/effect/proc_holder/spell - name = "Spell" // Only rename this if the spell you're making is not abstract - desc = "A wizard spell" - panel = "Spells"//What panel the proc holder needs to go on. - density = FALSE - opacity = FALSE +/datum/spell + var/name = "Spell" // Only rename this if the spell you're making is not abstract + var/desc = "A wizard spell" + var/panel = "Spells"//What panel the proc holder needs to go on. var/school = "evocation" //not relevant at now, but may be important later if there are changes to how spells work. the ones I used for now will probably be changed... maybe spell presets? lacking flexibility but with some other benefit? ///recharge time in deciseconds @@ -87,6 +76,9 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) var/holder_var_type = "bruteloss" //only used if charge_type equals to "holder_var" var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used + var/active = FALSE //Used by toggle based abilities. + var/ranged_mousepointer + var/mob/ranged_ability_user var/ghost = FALSE // Skip life check. var/clothes_req = TRUE //see if it requires clothes @@ -153,7 +145,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) * @param start_recharge If the proc should set the cooldown * @param user The caster of the spell */ -/obj/effect/proc_holder/spell/proc/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell +/datum/spell/proc/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell // SHOULD_NOT_OVERRIDE(TRUE) Todo for another refactor if(!can_cast(user, charge_check, TRUE)) return FALSE @@ -178,7 +170,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) * * target - Who is being considered * * user - Who is the user of this spell */ -/obj/effect/proc_holder/spell/proc/valid_target(target, user) +/datum/spell/proc/valid_target(target, user) return TRUE /** @@ -187,7 +179,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) * Arguments: * * user - Who used this spell? */ -/obj/effect/proc_holder/spell/proc/spend_spell_cost(mob/user) +/datum/spell/proc/spend_spell_cost(mob/user) SHOULD_CALL_PARENT(TRUE) custom_handler?.spend_spell_cost(user, src) @@ -195,7 +187,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) if(action) action.UpdateButtons() -/obj/effect/proc_holder/spell/proc/invocation(mob/user) //spelling the spell out and setting it on recharge/reducing charges amount +/datum/spell/proc/invocation(mob/user) //spelling the spell out and setting it on recharge/reducing charges amount switch(invocation_type) if("shout") if(!user.IsVocal() || user.cannot_speak_loudly()) @@ -213,10 +205,10 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) if("emote") user.visible_message(invocation, invocation_emote_self) //same style as in mob/living/emote.dm -/obj/effect/proc_holder/spell/proc/playMagSound() +/datum/spell/proc/playMagSound() playsound(get_turf(usr), sound,50,1) -/obj/effect/proc_holder/spell/New() +/datum/spell/New() ..() action = new(src) still_recharging_msg = "[name] is still recharging." @@ -236,7 +228,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) cooldown_handler = create_new_cooldown() cooldown_handler.cooldown_init(src) -/obj/effect/proc_holder/spell/Destroy() +/datum/spell/Destroy() QDEL_NULL(action) QDEL_NULL(cooldown_handler) return ..() @@ -245,7 +237,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) * Creates and returns the targeting datum for this spell type. Override this! * Should return a value of type [/datum/spell_targeting] */ -/obj/effect/proc_holder/spell/proc/create_new_targeting() +/datum/spell/proc/create_new_targeting() RETURN_TYPE(/datum/spell_targeting) return @@ -254,7 +246,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) * Override this if you want a custom spell handler. * Should return a value of type [/datum/spell_handler] or NONE */ -/obj/effect/proc_holder/spell/proc/create_new_handler() +/datum/spell/proc/create_new_handler() RETURN_TYPE(/datum/spell_handler) return NONE @@ -263,29 +255,30 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) * Override this if you wish to use a different method of cooldown */ -/obj/effect/proc_holder/spell/proc/create_new_cooldown() +/datum/spell/proc/create_new_cooldown() RETURN_TYPE(/datum/spell_cooldown) var/datum/spell_cooldown/S = new S.recharge_duration = base_cooldown S.starts_off_cooldown = starts_charged return S -/obj/effect/proc_holder/spell/Click() +/datum/spell/proc/Click() if(cast_check(TRUE, FALSE, usr)) choose_targets(usr) return 1 -/obj/effect/proc_holder/spell/AltClick(mob/user) +/datum/spell/proc/AltClick(mob/user) return Click() -/obj/effect/proc_holder/spell/InterceptClickOn(mob/user, params, atom/A) +/datum/spell/InterceptClickOn(mob/user, params, atom/A) . = ..() if(.) return - targeting.InterceptClickOn(user, params, A, src) + if(targeting) + targeting.InterceptClickOn(user, params, A, src) ///Lets the spell have a special effect applied to it when upgraded. By default, does nothing. -/obj/effect/proc_holder/spell/proc/on_purchase_upgrade() +/datum/spell/proc/on_purchase_upgrade() return /** @@ -295,7 +288,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) * Arguments: * * user - The caster of the spell */ -/obj/effect/proc_holder/spell/proc/choose_targets(mob/user) +/datum/spell/proc/choose_targets(mob/user) SHOULD_NOT_OVERRIDE(TRUE) if(targeting.use_intercept_click) if(active) @@ -317,7 +310,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) * * targets - The targets the spell is being performed on * * user - The caster of the spell */ -/obj/effect/proc_holder/spell/proc/try_perform(list/targets, mob/user) +/datum/spell/proc/try_perform(list/targets, mob/user) SHOULD_NOT_OVERRIDE(TRUE) if(!length(targets)) to_chat(user, "No suitable target found.") @@ -333,7 +326,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) * Called in `try_perform` before removing the click interceptor. useful to override if you have a spell that requires more than 1 click */ -/obj/effect/proc_holder/spell/proc/should_remove_click_intercept() +/datum/spell/proc/should_remove_click_intercept() return TRUE /** @@ -344,7 +337,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) * * recharge - Whether or not the spell should go recharge * * user - The caster of the spell */ -/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = TRUE, mob/user = usr) //if recharge is started is important for the trigger spells +/datum/spell/proc/perform(list/targets, recharge = TRUE, mob/user = usr) //if recharge is started is important for the trigger spells SHOULD_NOT_OVERRIDE(TRUE) before_cast(targets, user) invocation(user) @@ -371,11 +364,10 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) * * targets - The targets being targeted by the spell * * user - The user of the spell */ -/obj/effect/proc_holder/spell/proc/write_custom_logs(list/targets, mob/user) +/datum/spell/proc/write_custom_logs(list/targets, mob/user) return - -/obj/effect/proc_holder/spell/proc/before_cast(list/targets, mob/user) +/datum/spell/proc/before_cast(list/targets, mob/user) SHOULD_CALL_PARENT(TRUE) if(overlay) for(var/atom/target in targets) @@ -394,7 +386,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) custom_handler?.before_cast(targets, user, src) -/obj/effect/proc_holder/spell/proc/after_cast(list/targets, mob/user) +/datum/spell/proc/after_cast(list/targets, mob/user) SHOULD_CALL_PARENT(TRUE) for(var/atom/target in targets) var/location @@ -427,21 +419,21 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) * * targets - The targets being targeted by the spell * * user - The caster of the spell */ -/obj/effect/proc_holder/spell/proc/cast(list/targets, mob/user = usr) +/datum/spell/proc/cast(list/targets, mob/user = usr) return -/obj/effect/proc_holder/spell/proc/revert_cast(mob/user = usr) //resets recharge or readds a charge +/datum/spell/proc/revert_cast(mob/user = usr) //resets recharge or readds a charge cooldown_handler.revert_cast() custom_handler?.revert_cast(user, src) if(action) action.UpdateButtons() -/obj/effect/proc_holder/spell/proc/UpdateButtons() +/datum/spell/proc/UpdateButtons() if(action) action.UpdateButtons() -/obj/effect/proc_holder/spell/proc/adjust_var(mob/living/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types +/datum/spell/proc/adjust_var(mob/living/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types switch(type) if("bruteloss") target.adjustBruteLoss(amount) @@ -462,10 +454,10 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) return ///This proc is ran when a mind is transfered to a new mob. Tells it if the action should be transfered on return true, and tells it not to remove it on false -/obj/effect/proc_holder/spell/proc/on_mind_transfer(mob/living/L) +/datum/spell/proc/on_mind_transfer(mob/living/L) return TRUE -/obj/effect/proc_holder/spell/aoe +/datum/spell/aoe name = "Spell" create_attack_logs = FALSE create_custom_logs = TRUE @@ -474,10 +466,10 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) // Normally, AoE spells will generate an attack log for every turf they loop over, while searching for targets. // With this override, all /aoe type spells will only generate 1 log, saying that the user has cast the spell. -/obj/effect/proc_holder/spell/aoe/write_custom_logs(list/targets, mob/user) +/datum/spell/aoe/write_custom_logs(list/targets, mob/user) add_attack_logs(user, null, "Cast the AoE spell [name]", ATKLOG_ALL) -/obj/effect/proc_holder/spell/proc/can_cast(mob/user = usr, charge_check = TRUE, show_message = FALSE) +/datum/spell/proc/can_cast(mob/user = usr, charge_check = TRUE, show_message = FALSE) if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list)) if(show_message) to_chat(user, "You shouldn't have this spell! Something's wrong.") @@ -509,8 +501,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) if(ishuman(user)) var/mob/living/carbon/human/H = user - var/clothcheck = locate(/obj/effect/proc_holder/spell/noclothes) in user.mob_spell_list - var/clothcheck2 = user.mind && (locate(/obj/effect/proc_holder/spell/noclothes) in user.mind.spell_list) + var/clothcheck = locate(/datum/spell/noclothes) in user.mob_spell_list + var/clothcheck2 = user.mind && (locate(/datum/spell/noclothes) in user.mind.spell_list) if(clothes_req && !clothcheck && !clothcheck2) //clothes check var/obj/item/clothing/robe = H.wear_suit var/obj/item/clothing/hat = H.head @@ -538,7 +530,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) return TRUE -/obj/effect/proc_holder/spell/summonmob +/datum/spell/summonmob name = "Summon Servant" desc = "This spell can be used to call your servant, whenever you need it." base_cooldown = 10 SECONDS @@ -552,10 +544,10 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) action_icon_state = "summons" -/obj/effect/proc_holder/spell/summonmob/create_new_targeting() +/datum/spell/summonmob/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/summonmob/cast(list/targets, mob/user = usr) +/datum/spell/summonmob/cast(list/targets, mob/user = usr) if(!target_mob) return var/turf/Start = get_turf(user) diff --git a/code/datums/spell_cooldown/spell_charges.dm b/code/datums/spell_cooldown/spell_charges.dm index bdbe9230405b..577da557060e 100644 --- a/code/datums/spell_cooldown/spell_charges.dm +++ b/code/datums/spell_cooldown/spell_charges.dm @@ -8,7 +8,7 @@ /// the time at which a spell charge can be used var/charge_time -/datum/spell_cooldown/charges/cooldown_init(obj/effect/proc_holder/spell/new_spell) +/datum/spell_cooldown/charges/cooldown_init(datum/spell/new_spell) . = ..() if(starts_off_cooldown) current_charges = max_charges diff --git a/code/datums/spell_cooldown/spell_cooldown.dm b/code/datums/spell_cooldown/spell_cooldown.dm index 68f935e5f005..14936e893ac3 100644 --- a/code/datums/spell_cooldown/spell_cooldown.dm +++ b/code/datums/spell_cooldown/spell_cooldown.dm @@ -6,13 +6,13 @@ /// does it start off cooldown? var/starts_off_cooldown = TRUE /// holds a ref to the spell - var/obj/effect/proc_holder/spell/spell_parent + var/datum/spell/spell_parent /datum/spell_cooldown/Destroy() spell_parent = null return ..() -/datum/spell_cooldown/proc/cooldown_init(obj/effect/proc_holder/spell/new_spell) +/datum/spell_cooldown/proc/cooldown_init(datum/spell/new_spell) spell_parent = new_spell if(!starts_off_cooldown) start_recharge() diff --git a/code/datums/spell_handler/alien_spell_handler.dm b/code/datums/spell_handler/alien_spell_handler.dm index 2402653e1024..b8aa1e7cbcc2 100644 --- a/code/datums/spell_handler/alien_spell_handler.dm +++ b/code/datums/spell_handler/alien_spell_handler.dm @@ -8,24 +8,24 @@ This was also the case with the verb implementation, it's just much more obvious /// Amount of plasma required to use this ability var/plasma_cost = 0 -/datum/spell_handler/alien/can_cast(mob/living/carbon/user, charge_check, show_message, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/alien/can_cast(mob/living/carbon/user, charge_check, show_message, datum/spell/spell) var/obj/item/organ/internal/alien/plasmavessel/vessel = user.get_int_organ(/obj/item/organ/internal/alien/plasmavessel) if(!vessel) - return 0 + return FALSE if(vessel.stored_plasma < plasma_cost) if(show_message) to_chat(user, "You require at least [plasma_cost] plasma to use this ability!") return FALSE return TRUE -/datum/spell_handler/alien/spend_spell_cost(mob/living/carbon/user, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/alien/spend_spell_cost(mob/living/carbon/user, datum/spell/spell) user.use_plasma_spell(plasma_cost, user) -/datum/spell_handler/alien/before_cast(list/targets, mob/living/carbon/user, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/alien/before_cast(list/targets, mob/living/carbon/user, datum/spell/spell) to_chat(user, "You have [user.get_plasma()] plasma left to use.") user.update_plasma_display(user) -/datum/spell_handler/alien/revert_cast(mob/living/carbon/user, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/alien/revert_cast(mob/living/carbon/user, datum/spell/spell) user.add_plasma(plasma_cost, user) to_chat(user, "You have [user.get_plasma()] plasma left to use.") user.update_plasma_display(user) diff --git a/code/datums/spell_handler/morph_spell_handler.dm b/code/datums/spell_handler/morph_spell_handler.dm index 688c2a62e0d0..36b796583074 100644 --- a/code/datums/spell_handler/morph_spell_handler.dm +++ b/code/datums/spell_handler/morph_spell_handler.dm @@ -2,7 +2,7 @@ /// How much food it costs the morph to use this var/hunger_cost = 0 -/datum/spell_handler/morph/can_cast(mob/living/simple_animal/hostile/morph/user, charge_check, show_message, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/morph/can_cast(mob/living/simple_animal/hostile/morph/user, charge_check, show_message, datum/spell/spell) if(!istype(user)) if(show_message) to_chat(user, "You should not be able to use this abilty! Report this as a bug on github please.") @@ -15,13 +15,13 @@ return TRUE -/datum/spell_handler/morph/spend_spell_cost(mob/living/simple_animal/hostile/morph/user, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/morph/spend_spell_cost(mob/living/simple_animal/hostile/morph/user, datum/spell/spell) user.use_food(hunger_cost) -/datum/spell_handler/morph/before_cast(list/targets, mob/living/simple_animal/hostile/morph/user, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/morph/before_cast(list/targets, mob/living/simple_animal/hostile/morph/user, datum/spell/spell) if(hunger_cost) to_chat(user, "You have [user.gathered_food] left to use.") -/datum/spell_handler/morph/revert_cast(mob/living/simple_animal/hostile/morph/user, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/morph/revert_cast(mob/living/simple_animal/hostile/morph/user, datum/spell/spell) user.add_food(hunger_cost) to_chat(user, "You have [user.gathered_food] left to use.") diff --git a/code/datums/spell_handler/spell_handler.dm b/code/datums/spell_handler/spell_handler.dm index e11aa76f9fdb..d5da3e07d981 100644 --- a/code/datums/spell_handler/spell_handler.dm +++ b/code/datums/spell_handler/spell_handler.dm @@ -6,17 +6,17 @@ /datum/spell_handler -/datum/spell_handler/proc/can_cast(mob/user, charge_check, show_message, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/proc/can_cast(mob/user, charge_check, show_message, datum/spell/spell) return TRUE -/datum/spell_handler/proc/spend_spell_cost(mob/user, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/proc/spend_spell_cost(mob/user, datum/spell/spell) return -/datum/spell_handler/proc/revert_cast(mob/user, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/proc/revert_cast(mob/user, datum/spell/spell) return -/datum/spell_handler/proc/before_cast(list/targets, mob/user, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/proc/before_cast(list/targets, mob/user, datum/spell/spell) return -/datum/spell_handler/proc/after_cast(list/targets, mob/user, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/proc/after_cast(list/targets, mob/user, datum/spell/spell) return diff --git a/code/datums/spell_handler/vampire.dm b/code/datums/spell_handler/vampire.dm index e23275f072e2..d22a4576beed 100644 --- a/code/datums/spell_handler/vampire.dm +++ b/code/datums/spell_handler/vampire.dm @@ -3,7 +3,7 @@ /// If the blood cost should be handled by this handler. Or if the spell will handle it itself var/deduct_blood_on_cast = TRUE -/datum/spell_handler/vampire/can_cast(mob/user, charge_check, show_message, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/vampire/can_cast(mob/user, charge_check, show_message, datum/spell/spell) var/datum/antagonist/vampire/vampire = user.mind.has_antag_datum(/datum/antagonist/vampire) if(!vampire) @@ -31,7 +31,7 @@ return FALSE return TRUE -/datum/spell_handler/vampire/spend_spell_cost(mob/user, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/vampire/spend_spell_cost(mob/user, datum/spell/spell) if(!required_blood || !deduct_blood_on_cast) //don't take the blood yet if this is false! return @@ -44,7 +44,7 @@ var/blood_cost = round(required_blood * blood_cost_modifier) return blood_cost -/datum/spell_handler/vampire/after_cast(list/targets, mob/user, obj/effect/proc_holder/spell/spell) +/datum/spell_handler/vampire/after_cast(list/targets, mob/user, datum/spell/spell) if(!spell.should_recharge_after_cast) return if(!required_blood) diff --git a/code/datums/spell_targeting/alive_mobs.dm b/code/datums/spell_targeting/alive_mobs.dm index da4c01870b95..8a87a86002a1 100644 --- a/code/datums/spell_targeting/alive_mobs.dm +++ b/code/datums/spell_targeting/alive_mobs.dm @@ -4,7 +4,7 @@ /datum/spell_targeting/alive_mob_list allowed_type = /mob/living -/datum/spell_targeting/alive_mob_list/choose_targets(mob/user, obj/effect/proc_holder/spell/spell, params, atom/clicked_atom) +/datum/spell_targeting/alive_mob_list/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) var/list/possible_targets = list() for(var/mob/living/possible_target as anything in GLOB.alive_mob_list) if(valid_target(possible_target, user, spell, FALSE)) diff --git a/code/datums/spell_targeting/aoe.dm b/code/datums/spell_targeting/aoe.dm index 306a59798d14..d5cacf060d9c 100644 --- a/code/datums/spell_targeting/aoe.dm +++ b/code/datums/spell_targeting/aoe.dm @@ -6,7 +6,7 @@ /// The radius of turfs not being affected. -1 is inactive var/inner_radius = -1 -/datum/spell_targeting/aoe/choose_targets(mob/user, obj/effect/proc_holder/spell/spell, params, atom/clicked_atom) +/datum/spell_targeting/aoe/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) var/list/targets = list() var/spell_center = use_turf_of_user ? get_turf(user) : user diff --git a/code/datums/spell_targeting/click_spell_targeting.dm b/code/datums/spell_targeting/click_spell_targeting.dm index 5d8ffcb74e87..6901e65b86f3 100644 --- a/code/datums/spell_targeting/click_spell_targeting.dm +++ b/code/datums/spell_targeting/click_spell_targeting.dm @@ -9,7 +9,7 @@ var/random_target_priority = SPELL_TARGET_CLOSEST -/datum/spell_targeting/click/choose_targets(mob/user, obj/effect/proc_holder/spell/spell, params, atom/clicked_atom) +/datum/spell_targeting/click/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) var/list/targets = list() if(valid_target(clicked_atom, user, spell)) targets.Add(clicked_atom) diff --git a/code/datums/spell_targeting/clicked_atom.dm b/code/datums/spell_targeting/clicked_atom.dm index d851edf993ec..57bdd86df783 100644 --- a/code/datums/spell_targeting/clicked_atom.dm +++ b/code/datums/spell_targeting/clicked_atom.dm @@ -4,11 +4,11 @@ /datum/spell_targeting/clicked_atom use_intercept_click = TRUE -/datum/spell_targeting/clicked_atom/choose_targets(mob/user, obj/effect/proc_holder/spell/spell, params, atom/clicked_atom) +/datum/spell_targeting/clicked_atom/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) if(clicked_atom) return list(clicked_atom) -/datum/spell_targeting/clicked_atom/external/choose_targets(mob/user, obj/effect/proc_holder/spell/spell, params, atom/clicked_atom) +/datum/spell_targeting/clicked_atom/external/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) . = ..() if(!.) return list() diff --git a/code/datums/spell_targeting/matter_eater_targeting.dm b/code/datums/spell_targeting/matter_eater_targeting.dm index d13449812dc9..7592f5a0b23f 100644 --- a/code/datums/spell_targeting/matter_eater_targeting.dm +++ b/code/datums/spell_targeting/matter_eater_targeting.dm @@ -25,7 +25,7 @@ /obj/item/bio_chip ) -/datum/spell_targeting/matter_eater/choose_targets(mob/user, obj/effect/proc_holder/spell/spell, params, atom/clicked_atom) +/datum/spell_targeting/matter_eater/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) var/list/possible_targets = list() for(var/atom/movable/O in view_or_range(range, user, selection_type)) diff --git a/code/datums/spell_targeting/reachable_turfs.dm b/code/datums/spell_targeting/reachable_turfs.dm index df2de0204b9b..3e7c754ccf87 100644 --- a/code/datums/spell_targeting/reachable_turfs.dm +++ b/code/datums/spell_targeting/reachable_turfs.dm @@ -3,7 +3,7 @@ */ /datum/spell_targeting/reachable_turfs -/datum/spell_targeting/reachable_turfs/choose_targets(mob/user, obj/effect/proc_holder/spell/spell, params, atom/clicked_atom) +/datum/spell_targeting/reachable_turfs/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) var/list/turf/locs = list() for(var/direction in GLOB.alldirs) if(length(locs) == max_targets) //we found 2 locations and thats all we need diff --git a/code/datums/spell_targeting/remoteview_targeting.dm b/code/datums/spell_targeting/remoteview_targeting.dm index fce68b121810..78d525ef27fc 100644 --- a/code/datums/spell_targeting/remoteview_targeting.dm +++ b/code/datums/spell_targeting/remoteview_targeting.dm @@ -3,7 +3,7 @@ */ /datum/spell_targeting/remoteview -/datum/spell_targeting/remoteview/choose_targets(mob/user, obj/effect/proc_holder/spell/spell, params, atom/clicked_atom) +/datum/spell_targeting/remoteview/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) var/list/remoteviewers = list() for(var/mob/M in GLOB.alive_mob_list) if(M == user) diff --git a/code/datums/spell_targeting/self_targeting.dm b/code/datums/spell_targeting/self_targeting.dm index a1facb7462f1..15136c2ead0f 100644 --- a/code/datums/spell_targeting/self_targeting.dm +++ b/code/datums/spell_targeting/self_targeting.dm @@ -3,5 +3,5 @@ */ /datum/spell_targeting/self -/datum/spell_targeting/self/choose_targets(mob/user, obj/effect/proc_holder/spell/spell, params, atom/clicked_atom) +/datum/spell_targeting/self/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) return list(user) // That's how simple it is diff --git a/code/datums/spell_targeting/spell_targeting.dm b/code/datums/spell_targeting/spell_targeting.dm index 37a379a8acbd..5183dd73fb4f 100644 --- a/code/datums/spell_targeting/spell_targeting.dm +++ b/code/datums/spell_targeting/spell_targeting.dm @@ -34,14 +34,14 @@ * * params - Params given by the intercept click. Only available if use_intercept_click is TRUE * * clicked_atom - The atom clicked on. Only available if use_intercept_click is TRUE */ -/datum/spell_targeting/proc/choose_targets(mob/user, obj/effect/proc_holder/spell/spell, params, atom/clicked_atom) +/datum/spell_targeting/proc/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) RETURN_TYPE(/list) return /** * Will attempt to auto target the spell. Only works with 1 target currently */ -/datum/spell_targeting/proc/attempt_auto_target(mob/user, obj/effect/proc_holder/spell/spell) +/datum/spell_targeting/proc/attempt_auto_target(mob/user, datum/spell/spell) var/atom/target for(var/atom/A in view_or_range(range, use_turf_of_user ? get_turf(user) : user, selection_type)) if(valid_target(A, user, spell, FALSE)) @@ -64,7 +64,7 @@ * * A - Atom the user clicked on * * spell - The spell being cast */ -/datum/spell_targeting/proc/InterceptClickOn(mob/user, params, atom/A, obj/effect/proc_holder/spell/spell) +/datum/spell_targeting/proc/InterceptClickOn(mob/user, params, atom/A, datum/spell/spell) var/list/targets = choose_targets(user, spell, params, A) spell.try_perform(targets, user) @@ -77,7 +77,7 @@ * * spell - The spell being cast * * check_if_in_range - If a view/range check has to be done to see if the target is valid */ -/datum/spell_targeting/proc/valid_target(target, user, obj/effect/proc_holder/spell/spell, check_if_in_range = TRUE) +/datum/spell_targeting/proc/valid_target(target, user, datum/spell/spell, check_if_in_range = TRUE) SHOULD_CALL_PARENT(TRUE) return istype(target, allowed_type) && (include_user || target != user) && \ spell.valid_target(target, user) && (!check_if_in_range || (target in view_or_range(range, use_turf_of_user ? get_turf(user) : user, selection_type))) \ diff --git a/code/datums/spell_targeting/targeted.dm b/code/datums/spell_targeting/targeted.dm index 2f6871324176..94ae8bd847b5 100644 --- a/code/datums/spell_targeting/targeted.dm +++ b/code/datums/spell_targeting/targeted.dm @@ -9,7 +9,7 @@ /// Who to target when too many targets are found. Only matters when max_targets = 1 var/target_priority = SPELL_TARGET_CLOSEST -/datum/spell_targeting/targeted/choose_targets(mob/user, obj/effect/proc_holder/spell/spell, params, atom/clicked_atom) +/datum/spell_targeting/targeted/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) var/list/targets = list() var/list/possible_targets = list() var/atom/spell_location = use_turf_of_user ? get_turf(user) : user diff --git a/code/datums/spell_targeting/telepathic.dm b/code/datums/spell_targeting/telepathic.dm index c6c739fe0f1a..95ee241e98a5 100644 --- a/code/datums/spell_targeting/telepathic.dm +++ b/code/datums/spell_targeting/telepathic.dm @@ -3,7 +3,7 @@ */ /datum/spell_targeting/telepathic -/datum/spell_targeting/telepathic/choose_targets(mob/user, obj/effect/proc_holder/spell/spell, params, atom/clicked_atom) +/datum/spell_targeting/telepathic/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) var/list/valid_targets = list() var/turf/T = get_turf(user) var/list/mobs_in_view = user.get_visible_mobs() diff --git a/code/datums/spells/alien_spells/basetype_alien_spell.dm b/code/datums/spells/alien_spells/basetype_alien_spell.dm index f192962592ec..547cba3c4389 100644 --- a/code/datums/spells/alien_spells/basetype_alien_spell.dm +++ b/code/datums/spells/alien_spells/basetype_alien_spell.dm @@ -17,7 +17,7 @@ Updates the spell's actions on use as well, so they know when they can or can't for(var/datum/action/spell_action/action in actions) action.UpdateButtons() -/obj/effect/proc_holder/spell/alien_spell +/datum/spell/alien_spell action_background_icon_state = "bg_alien" clothes_req = FALSE base_cooldown = 0 @@ -28,15 +28,15 @@ Updates the spell's actions on use as well, so they know when they can or can't var/plasma_cost = 0 /// Every single alien spell uses a "spell name + plasmacost" format -/obj/effect/proc_holder/spell/alien_spell/Initialize(mapload) - . = ..() +/datum/spell/alien_spell/New() + ..() if(plasma_cost) name = "[name] ([plasma_cost])" -/obj/effect/proc_holder/spell/alien_spell/write_custom_logs(list/targets, mob/user) +/datum/spell/alien_spell/write_custom_logs(list/targets, mob/user) user.create_log(ATTACK_LOG, "Cast the spell [name]") -/obj/effect/proc_holder/spell/alien_spell/create_new_handler() +/datum/spell/alien_spell/create_new_handler() var/datum/spell_handler/alien/handler = new handler.plasma_cost = plasma_cost return handler diff --git a/code/datums/spells/alien_spells/basetype_alien_touch.dm b/code/datums/spells/alien_spells/basetype_alien_touch.dm index 24141fe3a4c2..c58ff15bed29 100644 --- a/code/datums/spells/alien_spells/basetype_alien_touch.dm +++ b/code/datums/spells/alien_spells/basetype_alien_touch.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/touch/alien_spell +/datum/spell/touch/alien_spell name = "Basetype Alien spell" desc = "You should not see this in game, if you do file a github report!" hand_path = "/obj/item/melee/touch_attack/alien" @@ -15,20 +15,20 @@ var/plasma_cost = 0 action_icon_state = "gib" -/obj/effect/proc_holder/spell/touch/alien_spell/Initialize(mapload) - . = ..() +/datum/spell/touch/alien_spell/New() + ..() if(plasma_cost) name = "[name] ([plasma_cost])" -/obj/effect/proc_holder/spell/touch/alien_spell/Click(mob/user = usr) +/datum/spell/touch/alien_spell/Click(mob/user = usr) if(attached_hand) to_chat(user, "You withdraw your [src].") ..() -/obj/effect/proc_holder/spell/touch/alien_spell/write_custom_logs(list/targets, mob/user) +/datum/spell/touch/alien_spell/write_custom_logs(list/targets, mob/user) user.create_log(ATTACK_LOG, "Cast the spell [name]") -/obj/effect/proc_holder/spell/touch/alien_spell/create_new_handler() +/datum/spell/touch/alien_spell/create_new_handler() var/datum/spell_handler/alien/H = new H.plasma_cost = plasma_cost return H diff --git a/code/datums/spells/alien_spells/build_resin_structure.dm b/code/datums/spells/alien_spells/build_resin_structure.dm index 9da55a22ebf1..0296af4164e1 100644 --- a/code/datums/spells/alien_spells/build_resin_structure.dm +++ b/code/datums/spells/alien_spells/build_resin_structure.dm @@ -1,16 +1,16 @@ -/obj/effect/proc_holder/spell/alien_spell/build_resin +/datum/spell/alien_spell/build_resin name = "Build Resin Structure" desc = "Allows you to create resin structures. Does not work while in space." plasma_cost = 55 action_icon_state = "alien_resin" -/obj/effect/proc_holder/spell/alien_spell/build_resin/create_new_targeting() +/datum/spell/alien_spell/build_resin/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/alien_spell/build_resin/cast(list/targets, mob/living/carbon/user) - var/static/list/resin_buildings = list("Resin Wall" = image(icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi', icon_state = "resin_wall-0"), - "Resin Nest" = image(icon = 'icons/mob/alien.dmi', icon_state = "nest"), - "Resin Door" = image(icon = 'icons/obj/smooth_structures/alien/resin_door.dmi', icon_state = "resin"), +/datum/spell/alien_spell/build_resin/cast(list/targets, mob/living/carbon/user) + var/static/list/resin_buildings = list("Resin Wall (55)" = image(icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi', icon_state = "resin_wall-0"), + "Resin Nest (55)" = image(icon = 'icons/mob/alien.dmi', icon_state = "nest"), + "Resin door (80)" = image(icon = 'icons/obj/smooth_structures/alien/resin_door.dmi', icon_state = "resin"), "Revival Nest" = image(icon = 'icons/mob/alien.dmi', icon_state = "placeholder_rejuv_nest")) var/choice = show_radial_menu(user, user, resin_buildings, src, radius = 40) var/turf/turf_to_spawn_at = user.loc @@ -29,7 +29,7 @@ to_chat(user, "There is already a resin construction here.") revert_cast(user) return - visible_message("[user] vomits up a thick purple substance and shapes it!") + user.visible_message("[user] vomits up a thick purple substance and shapes it!") switch(choice) if("Resin Wall") new /obj/structure/alien/resin/wall(turf_to_spawn_at) @@ -40,7 +40,7 @@ if("Revival Nest") new /obj/structure/bed/revival_nest(turf_to_spawn_at) -/obj/effect/proc_holder/spell/touch/alien_spell/consume_resin +/datum/spell/touch/alien_spell/consume_resin name = "Consume resin structures" desc = "Allows you to rip and tear straight through resin structures." action_icon_state = "alien_resin" diff --git a/code/datums/spells/alien_spells/corrosive_acid_spit.dm b/code/datums/spells/alien_spells/corrosive_acid_spit.dm index 17e7756f7c70..2f32c2dcb049 100644 --- a/code/datums/spells/alien_spells/corrosive_acid_spit.dm +++ b/code/datums/spells/alien_spells/corrosive_acid_spit.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/touch/alien_spell/corrosive_acid +/datum/spell/touch/alien_spell/corrosive_acid name = "Corrosive acid" desc = "Spit acid on someone in range, this acid melts through nearly anything and heavily damages anyone lacking proper safety equipment." hand_path = "/obj/item/melee/touch_attack/alien/corrosive_acid" @@ -32,7 +32,7 @@ to_chat(user, "You cannot dissolve this object.") ..() -/obj/effect/proc_holder/spell/touch/alien_spell/burning_touch +/datum/spell/touch/alien_spell/burning_touch name = "Blazing touch" desc = "Boil acid within your hand to burn through anything you touch with it, deals a lot of damage to aliens and destroys resin structures instantly." hand_path = "/obj/item/melee/touch_attack/alien/burning_touch" diff --git a/code/datums/spells/alien_spells/larva_evolve.dm b/code/datums/spells/alien_spells/larva_evolve.dm index bbda1e2e1549..b10f7d1bebed 100644 --- a/code/datums/spells/alien_spells/larva_evolve.dm +++ b/code/datums/spells/alien_spells/larva_evolve.dm @@ -1,13 +1,13 @@ // Make this reflect amount grown, can't do that currently -/obj/effect/proc_holder/spell/alien_spell/evolve_larva +/datum/spell/alien_spell/evolve_larva name = "Evolve." desc = "Evolve into a fully grown Alien." action_icon_state = "alien_evolve_larva" -/obj/effect/proc_holder/spell/alien_spell/evolve_larva/create_new_targeting() +/datum/spell/alien_spell/evolve_larva/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/alien_spell/evolve_larva/cast(list/targets, mob/living/carbon/alien/larva/user) +/datum/spell/alien_spell/evolve_larva/cast(list/targets, mob/living/carbon/alien/larva/user) if(user.stat != CONSCIOUS) return diff --git a/code/datums/spells/alien_spells/lay_alien_eggs.dm b/code/datums/spells/alien_spells/lay_alien_eggs.dm index f2bfc89011f4..75bb9bd170f3 100644 --- a/code/datums/spells/alien_spells/lay_alien_eggs.dm +++ b/code/datums/spells/alien_spells/lay_alien_eggs.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/alien_spell/plant_weeds/eggs +/datum/spell/alien_spell/plant_weeds/eggs name = "Plant alien eggs" desc = "Allows you to plant alien eggs on your current turf, does not work while in space." plasma_cost = 75 @@ -7,17 +7,17 @@ action_icon_state = "alien_egg" requires_do_after = FALSE -/obj/effect/proc_holder/spell/alien_spell/combust_facehuggers +/datum/spell/alien_spell/combust_facehuggers name = "Combust facehuggers and eggs" desc = "Take over the programming of facehuggers and eggs, sending out a shockwave which causes them to combust." plasma_cost = 25 action_icon_state = "alien_egg" base_cooldown = 3 SECONDS -/obj/effect/proc_holder/spell/alien_spell/combust_facehuggers/create_new_targeting() +/datum/spell/alien_spell/combust_facehuggers/create_new_targeting() return new /datum/spell_targeting/clicked_atom -/obj/effect/proc_holder/spell/alien_spell/combust_facehuggers/cast(list/targets, mob/living/carbon/user) +/datum/spell/alien_spell/combust_facehuggers/cast(list/targets, mob/living/carbon/user) var/obj/target = targets[1] var/turf/T = user.loc if(!istype(T) || !istype(target)) @@ -33,7 +33,7 @@ to_chat(user, "[target] will explode in 3 seconds!") return TRUE -/obj/effect/proc_holder/spell/alien_spell/combust_facehuggers/proc/blow_it_up(obj/target, mob/user) +/datum/spell/alien_spell/combust_facehuggers/proc/blow_it_up(obj/target, mob/user) add_attack_logs(user, target, "Caused it to explode") explosion(get_turf(target), 0, 2, 3, 3, cause = user) to_chat(user, "[target] has detonated!") diff --git a/code/datums/spells/alien_spells/neurotoxin_spit.dm b/code/datums/spells/alien_spells/neurotoxin_spit.dm index d3cabc594c0b..1f24877e54ca 100644 --- a/code/datums/spells/alien_spells/neurotoxin_spit.dm +++ b/code/datums/spells/alien_spells/neurotoxin_spit.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/alien_spell/neurotoxin +/datum/spell/alien_spell/neurotoxin name = "Neurotoxin spit" desc = "This ability allows you to fire some neurotoxin. Knocks down anyone you hit, applies a small amount of stamina damage as well." base_cooldown = 3 SECONDS @@ -9,16 +9,16 @@ action_icon_state = "alien_neurotoxin_0" active = FALSE -/obj/effect/proc_holder/spell/alien_spell/neurotoxin/create_new_targeting() +/datum/spell/alien_spell/neurotoxin/create_new_targeting() return new /datum/spell_targeting/clicked_atom -/obj/effect/proc_holder/spell/alien_spell/neurotoxin/update_icon_state() +/datum/spell/alien_spell/neurotoxin/update_spell_icon() if(!action) return action.button_icon_state = "alien_neurotoxin_[active]" action.UpdateButtons() -/obj/effect/proc_holder/spell/alien_spell/neurotoxin/cast(list/targets, mob/living/carbon/user) +/datum/spell/alien_spell/neurotoxin/cast(list/targets, mob/living/carbon/user) var/target = targets[1] var/turf/T = user.loc var/turf/U = get_step(user, user.dir) // A little aimbot is fine @@ -35,7 +35,7 @@ return TRUE -/obj/effect/proc_holder/spell/alien_spell/neurotoxin/death_to_xenos +/datum/spell/alien_spell/neurotoxin/death_to_xenos name = "Neurotoxin spit" desc = "This ability allows you to fire some neurotoxin. Knocks aliens down." neurotoxin_type = /obj/item/projectile/bullet/anti_alien_toxin diff --git a/code/datums/spells/alien_spells/plasma_weeds.dm b/code/datums/spells/alien_spells/plasma_weeds.dm index b254403bc6e2..ae64db97d4f3 100644 --- a/code/datums/spells/alien_spells/plasma_weeds.dm +++ b/code/datums/spells/alien_spells/plasma_weeds.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/alien_spell/plant_weeds +/datum/spell/alien_spell/plant_weeds name = "Plant weeds" desc = "Allows you to plant some alien weeds on the floor below you. Does not work while in space." plasma_cost = 50 @@ -7,10 +7,10 @@ action_icon_state = "alien_plant" var/requires_do_after = TRUE -/obj/effect/proc_holder/spell/alien_spell/plant_weeds/create_new_targeting() +/datum/spell/alien_spell/plant_weeds/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/alien_spell/plant_weeds/cast(list/targets, mob/living/carbon/user) +/datum/spell/alien_spell/plant_weeds/cast(list/targets, mob/living/carbon/user) var/turf/T = user.loc if(locate(weed_type) in T) to_chat(user, "There's already \a [weed_name] here.") diff --git a/code/datums/spells/alien_spells/queen_evolve.dm b/code/datums/spells/alien_spells/queen_evolve.dm index 75502cfcd690..9f2cd550c665 100644 --- a/code/datums/spells/alien_spells/queen_evolve.dm +++ b/code/datums/spells/alien_spells/queen_evolve.dm @@ -1,13 +1,13 @@ -/obj/effect/proc_holder/spell/alien_spell/evolve_queen +/datum/spell/alien_spell/evolve_queen name = "Evolve into an alien queen" desc = "Evolve into an alien queen." plasma_cost = 300 action_icon_state = "alien_evolve_drone" -/obj/effect/proc_holder/spell/alien_spell/evolve_queen/create_new_targeting() +/datum/spell/alien_spell/evolve_queen/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/alien_spell/evolve_queen/cast(list/targets, mob/living/carbon/user) +/datum/spell/alien_spell/evolve_queen/cast(list/targets, mob/living/carbon/user) /// First we check if there is a living queen for(var/mob/living/carbon/alien/humanoid/queen/living_queen in GLOB.alive_mob_list) if(living_queen.key || !living_queen.get_int_organ(/obj/item/organ/internal/brain)) // We do a once over to check the queen didn't end up going away into the magic land of semi-dead diff --git a/code/datums/spells/alien_spells/regurgitate.dm b/code/datums/spells/alien_spells/regurgitate.dm index 02960c88afb3..4e91808e9312 100644 --- a/code/datums/spells/alien_spells/regurgitate.dm +++ b/code/datums/spells/alien_spells/regurgitate.dm @@ -1,18 +1,18 @@ -/obj/effect/proc_holder/spell/alien_spell/regurgitate +/datum/spell/alien_spell/regurgitate name = "Regurgitate" desc = "Empties the contents of your stomach onto the ground." action_icon_state = "alien_barf" -/obj/effect/proc_holder/spell/alien_spell/regurgitate/create_new_targeting() +/datum/spell/alien_spell/regurgitate/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/alien_spell/regurgitate/cast(list/targets, mob/living/carbon/user) +/datum/spell/alien_spell/regurgitate/cast(list/targets, mob/living/carbon/user) for(var/mob/M in user.stomach_contents) var/turf/output_loc = user.loc if(!istype(output_loc)) return user.stomach_contents -= M M.forceMove(output_loc) - visible_message("[user] hurls out the contents of [p_their()] stomach!") + user.visible_message("[user] hurls out the contents of [p_their()] stomach!") return - visible_message("[user] dry heaves!") + user.visible_message("[user] dry heaves!") diff --git a/code/datums/spells/alien_spells/tail_lash.dm b/code/datums/spells/alien_spells/tail_lash.dm index 0daa1e8a6a04..929d0ed95329 100644 --- a/code/datums/spells/alien_spells/tail_lash.dm +++ b/code/datums/spells/alien_spells/tail_lash.dm @@ -1,13 +1,13 @@ -/obj/effect/proc_holder/spell/alien_spell/tail_lash +/datum/spell/alien_spell/tail_lash name = "Tail lash" desc = "Knocks down anyone around you." action_icon_state = "tailsweep" base_cooldown = 10 SECONDS -/obj/effect/proc_holder/spell/alien_spell/tail_lash/create_new_targeting() +/datum/spell/alien_spell/tail_lash/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/alien_spell/tail_lash/cast(list/targets, mob/user) +/datum/spell/alien_spell/tail_lash/cast(list/targets, mob/user) var/turf/T = user.loc var/cast_resolved = FALSE if(!istype(T)) diff --git a/code/datums/spells/alien_spells/transfer_plasma.dm b/code/datums/spells/alien_spells/transfer_plasma.dm index 3ab94da1daf0..1ba29d900814 100644 --- a/code/datums/spells/alien_spells/transfer_plasma.dm +++ b/code/datums/spells/alien_spells/transfer_plasma.dm @@ -1,13 +1,13 @@ -/obj/effect/proc_holder/spell/alien_spell/transfer_plasma +/datum/spell/alien_spell/transfer_plasma name = "Transfer Plasma" desc = "Transfers 50 plasma to a nearby alien" action_icon_state = "alien_transfer" plasma_cost = 50 -/obj/effect/proc_holder/spell/alien_spell/transfer_plasma/create_new_targeting() +/datum/spell/alien_spell/transfer_plasma/create_new_targeting() return new /datum/spell_targeting/clicked_atom -/obj/effect/proc_holder/spell/alien_spell/transfer_plasma/cast(list/targets, mob/living/carbon/user) +/datum/spell/alien_spell/transfer_plasma/cast(list/targets, mob/living/carbon/user) var/mob/living/carbon/alien/target = targets[1] var/turf/T = user.loc if(!istype(T) || !istype(target)) @@ -20,17 +20,17 @@ to_chat(target, "[user] has transfered 50 plasma to you!") return TRUE -/obj/effect/proc_holder/spell/alien_spell/syphon_plasma +/datum/spell/alien_spell/syphon_plasma name = "Syphon plasma" desc = "Syphons 150 plasma from a nearby alien." action_icon_state = "alien_transfer" plasma_cost = 0 base_cooldown = 10 SECONDS -/obj/effect/proc_holder/spell/alien_spell/syphon_plasma/create_new_targeting() +/datum/spell/alien_spell/syphon_plasma/create_new_targeting() return new /datum/spell_targeting/clicked_atom -/obj/effect/proc_holder/spell/alien_spell/syphon_plasma/cast(list/targets, mob/living/carbon/user) +/datum/spell/alien_spell/syphon_plasma/cast(list/targets, mob/living/carbon/user) var/mob/living/carbon/alien/target = targets[1] var/turf/T = user.loc if(!istype(T) || !istype(target)) diff --git a/code/datums/spells/alien_spells/whisper.dm b/code/datums/spells/alien_spells/whisper.dm index 0f5369d04358..a280b63719ac 100644 --- a/code/datums/spells/alien_spells/whisper.dm +++ b/code/datums/spells/alien_spells/whisper.dm @@ -1,11 +1,11 @@ -/obj/effect/proc_holder/spell/alien_spell/whisper +/datum/spell/alien_spell/whisper name = "Whisper" desc = "Whisper into a target's mind." plasma_cost = 10 action_icon_state = "alien_whisper" var/target -/obj/effect/proc_holder/spell/alien_spell/whisper/create_new_targeting() // Yeah this is copy and pasted code from cryoken and it's good enough +/datum/spell/alien_spell/whisper/create_new_targeting() // Yeah this is copy and pasted code from cryoken and it's good enough var/datum/spell_targeting/click/T = new() T.allowed_type = /mob/living T.click_radius = 0 @@ -14,7 +14,7 @@ T.include_user = TRUE return T -/obj/effect/proc_holder/spell/alien_spell/whisper/cast(list/targets, mob/living/carbon/user) +/datum/spell/alien_spell/whisper/cast(list/targets, mob/living/carbon/user) var/mob/living/target = targets[1] var/msg = tgui_input_text(user, "Message:", "Alien Whisper") diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm index 60502ffbe86a..b7d349b5a32d 100644 --- a/code/datums/spells/area_teleport.dm +++ b/code/datums/spells/area_teleport.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/area_teleport +/datum/spell/area_teleport nonabstract_req = TRUE var/randomise_selection = 0 //if it lets the usr choose the teleport loc or picks it from the list @@ -8,7 +8,7 @@ var/sound2 = 'sound/weapons/zapbang.ogg' var/area/selected_area -/obj/effect/proc_holder/spell/area_teleport/before_cast(list/targets, mob/user) +/datum/spell/area_teleport/before_cast(list/targets, mob/user) ..() selected_area = null // Reset it var/area_name @@ -30,7 +30,7 @@ selected_area = thearea -/obj/effect/proc_holder/spell/area_teleport/cast(list/targets, mob/living/user) +/datum/spell/area_teleport/cast(list/targets, mob/living/user) if(!selected_area) revert_cast(user) return @@ -78,7 +78,7 @@ return -/obj/effect/proc_holder/spell/area_teleport/invocation(mob/user) +/datum/spell/area_teleport/invocation(mob/user) if(!invocation_area || !selected_area) return switch(invocation_type) diff --git a/code/datums/spells/banana_touch.dm b/code/datums/spells/banana_touch.dm index ed44996ce455..6fc3a835313e 100644 --- a/code/datums/spells/banana_touch.dm +++ b/code/datums/spells/banana_touch.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/touch/banana +/datum/spell/touch/banana name = "Banana Touch" desc = "A spell popular at wizard birthday parties, this spell will put on a clown costume on the target, \ stun them with a loud HONK, and mutate them to make them more entertaining! \ @@ -19,7 +19,7 @@ icon_state = "banana_touch" item_state = "banana_touch" -/obj/effect/proc_holder/spell/touch/banana/apprentice +/datum/spell/touch/banana/apprentice hand_path = /obj/item/melee/touch_attack/banana/apprentice /obj/item/melee/touch_attack/banana/apprentice diff --git a/code/datums/spells/bloodcrawl.dm b/code/datums/spells/bloodcrawl.dm index 0175920d82dc..b54ca987de37 100644 --- a/code/datums/spells/bloodcrawl.dm +++ b/code/datums/spells/bloodcrawl.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/bloodcrawl +/datum/spell/bloodcrawl name = "Blood Crawl" desc = "Use pools of blood to phase out of existence." base_cooldown = 1 SECONDS @@ -12,7 +12,7 @@ var/allowed_type = /obj/effect/decal/cleanable var/phased = FALSE -/obj/effect/proc_holder/spell/bloodcrawl/create_new_targeting() +/datum/spell/bloodcrawl/create_new_targeting() var/datum/spell_targeting/targeted/T = new() T.selection_type = SPELL_SELECTION_RANGE T.allowed_type = allowed_type @@ -21,17 +21,17 @@ T.use_turf_of_user = TRUE return T -/obj/effect/proc_holder/spell/bloodcrawl/valid_target(obj/effect/decal/cleanable/target, user) +/datum/spell/bloodcrawl/valid_target(obj/effect/decal/cleanable/target, user) return target.can_bloodcrawl_in() -/obj/effect/proc_holder/spell/bloodcrawl/can_cast(mob/living/user, charge_check, show_message) +/datum/spell/bloodcrawl/can_cast(mob/living/user, charge_check, show_message) . = ..() if(!.) return if(!isliving(user)) return FALSE -/obj/effect/proc_holder/spell/bloodcrawl/cast(list/targets, mob/living/user) +/datum/spell/bloodcrawl/cast(list/targets, mob/living/user) var/atom/target = targets[1] if(!phased) if(phaseout(target, user)) @@ -78,7 +78,7 @@ return -/obj/effect/proc_holder/spell/bloodcrawl/proc/block_hands(mob/living/carbon/C) +/datum/spell/bloodcrawl/proc/block_hands(mob/living/carbon/C) if(C.l_hand || C.r_hand) to_chat(C, "You may not hold items while blood crawling!") return FALSE @@ -101,13 +101,13 @@ . = ..() flick(animation_state, src) // Setting the icon_state to the animation has timing issues and can cause frame skips -/obj/effect/proc_holder/spell/bloodcrawl/proc/sink_animation(atom/A, mob/living/L) +/datum/spell/bloodcrawl/proc/sink_animation(atom/A, mob/living/L) var/turf/mob_loc = get_turf(L) - visible_message("[L] sinks into [A].") - playsound(mob_loc, 'sound/misc/enter_blood.ogg', 100, 1, -1) + mob_loc.visible_message("[L] sinks into [A].") + playsound(mob_loc, 'sound/misc/enter_blood.ogg', 100, TRUE, -1) new /obj/effect/temp_visual/dir_setting/bloodcrawl(mob_loc, L.dir, "jaunt") -/obj/effect/proc_holder/spell/bloodcrawl/proc/handle_consumption(mob/living/L, mob/living/victim, atom/A, obj/effect/dummy/slaughter/holder) +/datum/spell/bloodcrawl/proc/handle_consumption(mob/living/L, mob/living/victim, atom/A, obj/effect/dummy/slaughter/holder) if(!HAS_TRAIT(L, TRAIT_BLOODCRAWL_EAT)) return @@ -176,10 +176,10 @@ victim.ghostize() qdel(victim) -/obj/effect/proc_holder/spell/bloodcrawl/proc/post_phase_in(mob/living/L, obj/effect/dummy/slaughter/holder) +/datum/spell/bloodcrawl/proc/post_phase_in(mob/living/L, obj/effect/dummy/slaughter/holder) L.notransform = FALSE -/obj/effect/proc_holder/spell/bloodcrawl/proc/phaseout(obj/effect/decal/cleanable/B, mob/living/L) +/datum/spell/bloodcrawl/proc/phaseout(obj/effect/decal/cleanable/B, mob/living/L) if(iscarbon(L) && !block_hands(L)) return FALSE @@ -187,7 +187,7 @@ INVOKE_ASYNC(src, PROC_REF(async_phase), B, L) return TRUE -/obj/effect/proc_holder/spell/bloodcrawl/proc/async_phase(obj/effect/decal/cleanable/B, mob/living/L) +/datum/spell/bloodcrawl/proc/async_phase(obj/effect/decal/cleanable/B, mob/living/L) var/turf/mobloc = get_turf(L) sink_animation(B, L) var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(mobloc) @@ -196,24 +196,24 @@ handle_consumption(L, L.pulling, B, holder) post_phase_in(L, holder) -/obj/effect/proc_holder/spell/bloodcrawl/proc/rise_animation(turf/tele_loc, mob/living/L, atom/A) +/datum/spell/bloodcrawl/proc/rise_animation(turf/tele_loc, mob/living/L, atom/A) new /obj/effect/temp_visual/dir_setting/bloodcrawl(tele_loc, L.dir, "jauntup") if(prob(25) && isdemon(L)) var/list/voice = list('sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/i_see_you1.ogg') - playsound(tele_loc, pick(voice),50, 1, -1) - A.visible_message("[L] rises out of [A]!") - playsound(get_turf(tele_loc), 'sound/misc/exit_blood.ogg', 100, 1, -1) + playsound(tele_loc, pick(voice),50, TRUE, -1) + A.visible_message("[L] rises out of [A]!") + playsound(get_turf(tele_loc), 'sound/misc/exit_blood.ogg', 100, TRUE, -1) -/obj/effect/proc_holder/spell/bloodcrawl/proc/unblock_hands(mob/living/carbon/C) +/datum/spell/bloodcrawl/proc/unblock_hands(mob/living/carbon/C) if(!istype(C)) return for(var/obj/item/bloodcrawl/BC in C) qdel(BC) -/obj/effect/proc_holder/spell/bloodcrawl/proc/rise_message(atom/A) +/datum/spell/bloodcrawl/proc/rise_message(atom/A) A.visible_message("[A] starts to bubble...") -/obj/effect/proc_holder/spell/bloodcrawl/proc/post_phase_out(atom/A, mob/living/L) +/datum/spell/bloodcrawl/proc/post_phase_out(atom/A, mob/living/L) if(isslaughterdemon(L)) var/mob/living/simple_animal/demon/slaughter/S = L S.speed = 0 @@ -222,7 +222,7 @@ addtimer(VARSET_CALLBACK(L, color, null), 6 SECONDS) -/obj/effect/proc_holder/spell/bloodcrawl/proc/phasein(atom/A, mob/living/L) +/datum/spell/bloodcrawl/proc/phasein(atom/A, mob/living/L) if(L.notransform) to_chat(L, "Finish eating first!") @@ -246,30 +246,30 @@ post_phase_out(A, L) return TRUE -/obj/effect/proc_holder/spell/bloodcrawl/shadow_crawl +/datum/spell/bloodcrawl/shadow_crawl name = "Shadow Crawl" desc = "Fade into the shadows, increasing your speed and making you incomprehensible. Will not work in brightened terrane." allowed_type = /turf action_background_icon_state = "shadow_demon_bg" action_icon_state = "shadow_crawl" -/obj/effect/proc_holder/spell/bloodcrawl/shadow_crawl/valid_target(turf/target, user) +/datum/spell/bloodcrawl/shadow_crawl/valid_target(turf/target, user) return target.get_lumcount() < 0.2 -/obj/effect/proc_holder/spell/bloodcrawl/shadow_crawl/rise_message(atom/A) +/datum/spell/bloodcrawl/shadow_crawl/rise_message(atom/A) return -/obj/effect/proc_holder/spell/bloodcrawl/shadow_crawl/rise_animation(turf/tele_loc, mob/living/L, atom/A) +/datum/spell/bloodcrawl/shadow_crawl/rise_animation(turf/tele_loc, mob/living/L, atom/A) new /obj/effect/temp_visual/dir_setting/bloodcrawl(get_turf(L), L.dir, "shadowwalk_appear") -/obj/effect/proc_holder/spell/bloodcrawl/shadow_crawl/handle_consumption(mob/living/L, mob/living/victim, atom/A, obj/effect/dummy/slaughter/holder) +/datum/spell/bloodcrawl/shadow_crawl/handle_consumption(mob/living/L, mob/living/victim, atom/A, obj/effect/dummy/slaughter/holder) return -/obj/effect/proc_holder/spell/bloodcrawl/shadow_crawl/sink_animation(atom/A, mob/living/L) +/datum/spell/bloodcrawl/shadow_crawl/sink_animation(atom/A, mob/living/L) A.visible_message("[L] sinks into the shadows...") new /obj/effect/temp_visual/dir_setting/bloodcrawl(get_turf(L), L.dir, "shadowwalk_disappear") -/obj/effect/proc_holder/spell/bloodcrawl/shadow_crawl/post_phase_in(mob/living/L, obj/effect/dummy/slaughter/holder) +/datum/spell/bloodcrawl/shadow_crawl/post_phase_in(mob/living/L, obj/effect/dummy/slaughter/holder) ..() if(!istype(L, /mob/living/simple_animal/demon/shadow)) return diff --git a/code/datums/spells/chaplain_bless.dm b/code/datums/spells/chaplain_bless.dm index 70b8eb8e7082..de9741b53659 100644 --- a/code/datums/spells/chaplain_bless.dm +++ b/code/datums/spells/chaplain_bless.dm @@ -1,5 +1,5 @@ -/obj/effect/proc_holder/spell/chaplain_bless +/datum/spell/chaplain_bless name = "Bless" desc = "Blesses a single person." @@ -14,16 +14,16 @@ cooldown_min = 20 action_icon_state = "shield" -/obj/effect/proc_holder/spell/chaplain_bless/create_new_targeting() +/datum/spell/chaplain_bless/create_new_targeting() var/datum/spell_targeting/click/T = new() T.range = 1 T.click_radius = -1 return T -/obj/effect/proc_holder/spell/chaplain_bless/valid_target(mob/living/carbon/human/target, mob/user) +/datum/spell/chaplain_bless/valid_target(mob/living/carbon/human/target, mob/user) return target.mind && target.ckey && !target.stat -/obj/effect/proc_holder/spell/chaplain_bless/cast(list/targets, mob/living/user = usr) +/datum/spell/chaplain_bless/cast(list/targets, mob/living/user = usr) if(!istype(user)) to_chat(user, "Somehow, you are not a living mob. This should never happen. Report this bug.") revert_cast() diff --git a/code/datums/spells/charge.dm b/code/datums/spells/charge.dm index 806767153a13..be5c5a09b888 100644 --- a/code/datums/spells/charge.dm +++ b/code/datums/spells/charge.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/charge +/datum/spell/charge name = "Charge" desc = "This spell can be used to recharge a variety of things in your hands, from magical artifacts to electrical components. A creative wizard can even use it to grant magical power to a fellow magic user." school = "transmutation" @@ -9,10 +9,10 @@ cooldown_min = 400 //50 deciseconds reduction per rank action_icon_state = "charge" -/obj/effect/proc_holder/spell/charge/create_new_targeting() +/datum/spell/charge/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/charge/cast(list/targets, mob/user = usr) +/datum/spell/charge/cast(list/targets, mob/user = usr) for(var/mob/living/L in targets) var/list/hand_items = list(L.get_active_hand(),L.get_inactive_hand()) var/charged_item = null @@ -21,10 +21,10 @@ if(L.pulling && (isliving(L.pulling))) var/mob/living/M = L.pulling if(M.mob_spell_list.len != 0 || (M.mind && M.mind.spell_list.len != 0)) - for(var/obj/effect/proc_holder/spell/S in M.mob_spell_list) + for(var/datum/spell/S in M.mob_spell_list) S.cooldown_handler.revert_cast() if(M.mind) - for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list) + for(var/datum/spell/S in M.mind.spell_list) S.cooldown_handler.revert_cast() to_chat(M, "You feel raw magical energy flowing through you, it feels good!") else diff --git a/code/datums/spells/charge_up.dm b/code/datums/spells/charge_up.dm index abae667f1a01..1d1d6fad2b05 100644 --- a/code/datums/spells/charge_up.dm +++ b/code/datums/spells/charge_up.dm @@ -2,7 +2,7 @@ * A click-based spell template which starts charging up once you click the action button/verb. Click again on something to activate the actual spell */ -/obj/effect/proc_holder/spell/charge_up +/datum/spell/charge_up var/start_time = 0 /// The overlay used to show that you are charging. Create this in the New of the spell var/image/charge_up_overlay @@ -17,13 +17,13 @@ /// The text shown when you are over the charge limit and thus can't stop. var/stop_charging_fail_text -/obj/effect/proc_holder/spell/charge_up/create_new_targeting() +/datum/spell/charge_up/create_new_targeting() var/datum/spell_targeting/click/T = new() T.allowed_type = /mob/living T.try_auto_target = FALSE return T -/obj/effect/proc_holder/spell/charge_up/Click() +/datum/spell/charge_up/Click() if(cast_check(TRUE, FALSE, usr)) if(!start_time) INVOKE_ASYNC(src, PROC_REF(StartChargeup), usr) @@ -33,7 +33,7 @@ return ..() -/obj/effect/proc_holder/spell/charge_up/proc/try_stop_buildup(mob/user) +/datum/spell/charge_up/proc/try_stop_buildup(mob/user) var/energy_perc = get_energy_charge() / max_charge_time if(energy_perc < 0.5) cooldown_handler.start_recharge((1 - energy_perc) * cooldown_handler.recharge_duration) // Shorten the cooldown based on how long it was charged for. @@ -44,10 +44,10 @@ to_chat(user, "[stop_charging_fail_text]") return FALSE -/obj/effect/proc_holder/spell/charge_up/proc/get_energy_charge() +/datum/spell/charge_up/proc/get_energy_charge() return min(world.time - start_time, max_charge_time) -/obj/effect/proc_holder/spell/charge_up/proc/StartChargeup(mob/user) +/datum/spell/charge_up/proc/StartChargeup(mob/user) to_chat(user, "[start_charging_text]") user.add_overlay(charge_up_overlay) playsound(user, charge_sound, 50, FALSE, channel = charge_sound.channel) @@ -56,25 +56,25 @@ if(start_time) Discharge(user) -/obj/effect/proc_holder/spell/charge_up/proc/stopped_casting() +/datum/spell/charge_up/proc/stopped_casting() return start_time == 0 -/obj/effect/proc_holder/spell/charge_up/proc/Reset(mob/user) +/datum/spell/charge_up/proc/Reset(mob/user) start_time = 0 user.cut_overlay(charge_up_overlay) remove_ranged_ability(user) playsound(user, null, 50, FALSE, channel = charge_sound.channel) -/obj/effect/proc_holder/spell/charge_up/revert_cast(mob/user) +/datum/spell/charge_up/revert_cast(mob/user) Reset(user) ..() -/obj/effect/proc_holder/spell/charge_up/proc/Discharge(mob/user) +/datum/spell/charge_up/proc/Discharge(mob/user) to_chat(user, "You lose control over the spell!") Reset(user) spend_spell_cost(user) cooldown_handler.start_recharge() -/obj/effect/proc_holder/spell/charge_up/after_cast(list/targets, mob/user) +/datum/spell/charge_up/after_cast(list/targets, mob/user) ..() Reset(user) diff --git a/code/datums/spells/charge_up_bounce.dm b/code/datums/spells/charge_up_bounce.dm index a84887258d6e..6555f7646ce8 100644 --- a/code/datums/spells/charge_up_bounce.dm +++ b/code/datums/spells/charge_up_bounce.dm @@ -2,17 +2,17 @@ * A spell template that adds bounces to the charge_up spell template. The spell will bounce between targets once released. * Don't override cast and instead override apply_bounce_effect and the other procs */ -/obj/effect/proc_holder/spell/charge_up/bounce +/datum/spell/charge_up/bounce var/bounce_hit_sound -/obj/effect/proc_holder/spell/charge_up/bounce/create_new_targeting() +/datum/spell/charge_up/bounce/create_new_targeting() var/datum/spell_targeting/click/T = new T.allowed_type = /mob/living T.try_auto_target = FALSE T.use_obstacle_check = TRUE return T -/obj/effect/proc_holder/spell/charge_up/bounce/cast(list/targets, mob/user = usr) +/datum/spell/charge_up/bounce/cast(list/targets, mob/user = usr) var/mob/living/target = targets[1] bounce(user, target, get_bounce_energy(), get_bounce_amount(), user) @@ -20,13 +20,13 @@ /** * How much energy should each bounce have? */ -/obj/effect/proc_holder/spell/charge_up/bounce/proc/get_bounce_energy() +/datum/spell/charge_up/bounce/proc/get_bounce_energy() return /** * How much bounces should there be in total? */ -/obj/effect/proc_holder/spell/charge_up/bounce/proc/get_bounce_amount() +/datum/spell/charge_up/bounce/proc/get_bounce_amount() return /** @@ -36,7 +36,7 @@ * * origin - Where the bounce came from * * target - The mob that got hit */ -/obj/effect/proc_holder/spell/charge_up/bounce/proc/create_beam(mob/origin, mob/target) +/datum/spell/charge_up/bounce/proc/create_beam(mob/origin, mob/target) return /** @@ -49,10 +49,10 @@ * * energy - How much energy the bounce has * * user - The caster of the spell */ -/obj/effect/proc_holder/spell/charge_up/bounce/proc/apply_bounce_effect(mob/origin, mob/target, energy, mob/user) +/datum/spell/charge_up/bounce/proc/apply_bounce_effect(mob/origin, mob/target, energy, mob/user) return -/obj/effect/proc_holder/spell/charge_up/bounce/proc/bounce(mob/origin, mob/target, energy, bounces, mob/user) +/datum/spell/charge_up/bounce/proc/bounce(mob/origin, mob/target, energy, bounces, mob/user) SHOULD_CALL_PARENT(TRUE) create_beam(origin, target) apply_bounce_effect(origin, target, energy, user) diff --git a/code/datums/spells/cluwne.dm b/code/datums/spells/cluwne.dm index eeaed56ac114..b57ea0a531e7 100644 --- a/code/datums/spells/cluwne.dm +++ b/code/datums/spells/cluwne.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/touch/cluwne +/datum/spell/touch/cluwne name = "Curse of the Cluwne" desc = "Turns the target into a fat and cursed monstrosity of a clown." hand_path = /obj/item/melee/touch_attack/cluwne diff --git a/code/datums/spells/conjure.dm b/code/datums/spells/conjure.dm index 380c178688c6..74f4a885e4d8 100644 --- a/code/datums/spells/conjure.dm +++ b/code/datums/spells/conjure.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/aoe/conjure +/datum/spell/aoe/conjure desc = "This spell conjures objs of the specified types in range." var/list/summon_type = list() //determines what exactly will be summoned @@ -15,14 +15,14 @@ var/cast_sound = 'sound/items/welder.ogg' -/obj/effect/proc_holder/spell/aoe/conjure/create_new_targeting() +/datum/spell/aoe/conjure/create_new_targeting() var/datum/spell_targeting/aoe/turf/targeting = new() targeting.range = aoe_range return targeting -/obj/effect/proc_holder/spell/aoe/conjure/cast(list/targets,mob/living/user = usr) +/datum/spell/aoe/conjure/cast(list/targets,mob/living/user = usr) var/list/what_conjure_summoned = list() - playsound(get_turf(user), cast_sound, 50,1) + playsound(get_turf(user), cast_sound, 50, TRUE) for(var/turf/T in targets) if(T.density && !summon_ignore_density) targets -= T @@ -57,8 +57,7 @@ return what_conjure_summoned -/// test purposes -/obj/effect/proc_holder/spell/aoe/conjure/summonEdSwarm +/datum/spell/aoe/conjure/summonEdSwarm name = "Dispense Wizard Justice" desc = "This spell dispenses wizard justice." summon_type = list(/mob/living/simple_animal/bot/ed209) diff --git a/code/datums/spells/conjure_item.dm b/code/datums/spells/conjure_item.dm index d2e77429b870..0aad4922e64b 100644 --- a/code/datums/spells/conjure_item.dm +++ b/code/datums/spells/conjure_item.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/conjure_item +/datum/spell/conjure_item name = "Summon weapon" desc = "A generic spell that should not exist. This summons an instance of a specific type of item, or if one already exists, un-summons it." invocation_type = "none" @@ -9,10 +9,10 @@ base_cooldown = 15 SECONDS cooldown_min = 10 -/obj/effect/proc_holder/spell/conjure_item/create_new_targeting() +/datum/spell/conjure_item/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/conjure_item/cast(list/targets, mob/user = usr) +/datum/spell/conjure_item/cast(list/targets, mob/user = usr) if(item) QDEL_NULL(item) else @@ -21,6 +21,6 @@ item = new item_type C.put_in_hands(item) -/obj/effect/proc_holder/spell/conjure_item/Destroy() +/datum/spell/conjure_item/Destroy() QDEL_NULL(item) return ..() diff --git a/code/datums/spells/construct_spells.dm b/code/datums/spells/construct_spells.dm index de300b929cfa..3afd600fa619 100644 --- a/code/datums/spells/construct_spells.dm +++ b/code/datums/spells/construct_spells.dm @@ -1,14 +1,14 @@ //////////////////////////////Construct Spells///////////////////////// -/obj/effect/proc_holder/spell/aoe/conjure/construct/lesser +/datum/spell/aoe/conjure/construct/lesser base_cooldown = 1800 action_icon_state = "artificer" action_background_icon_state = "bg_cult" -/obj/effect/proc_holder/spell/aoe/conjure/build +/datum/spell/aoe/conjure/build aoe_range = 0 -/obj/effect/proc_holder/spell/aoe/conjure/build/floor +/datum/spell/aoe/conjure/build/floor name = "Summon Cult Floor" desc = "This spell constructs a cult floor" action_icon_state = "floorconstruct" @@ -22,7 +22,7 @@ centcom_cancast = FALSE //Stop crashing the server by spawning turfs on transit tiles holy_area_cancast = FALSE //Stops cult magic from working on holy ground eg: chapel -/obj/effect/proc_holder/spell/aoe/conjure/build/wall +/datum/spell/aoe/conjure/build/wall name = "Summon Cult Wall" desc = "This spell constructs a cult wall" action_icon_state = "cultforcewall" @@ -36,7 +36,7 @@ centcom_cancast = FALSE //Stop crashing the server by spawning turfs on transit tiles holy_area_cancast = FALSE //Stops cult magic from working on holy ground eg: chapel -/obj/effect/proc_holder/spell/aoe/conjure/build/wall/reinforced +/datum/spell/aoe/conjure/build/wall/reinforced name = "Greater Construction" desc = "This spell constructs a reinforced metal wall" school = "conjuration" @@ -50,7 +50,7 @@ summon_type = list(/turf/simulated/wall/r_wall) -/obj/effect/proc_holder/spell/aoe/conjure/build/soulstone +/datum/spell/aoe/conjure/build/soulstone name = "Summon Soulstone" desc = "This spell uses vile sorcery to create a spirit-trapping soulstone." action_icon_state = "summonsoulstone" @@ -64,12 +64,12 @@ summon_type = list(/obj/item/soulstone) -/obj/effect/proc_holder/spell/aoe/conjure/build/soulstone/holy +/datum/spell/aoe/conjure/build/soulstone/holy action_icon_state = "summonsoulstone_holy" summon_type = list(/obj/item/soulstone/anybody/purified) -/obj/effect/proc_holder/spell/aoe/conjure/build/pylon +/datum/spell/aoe/conjure/build/pylon name = "Cult Pylon" desc = "This spell uses dark magic to craft an unholy beacon. Heals cultists, and makes a handy light source." action_icon_state = "pylon" @@ -84,7 +84,7 @@ summon_type = list(/obj/structure/cult/functional/pylon) -/obj/effect/proc_holder/spell/aoe/conjure/build/lesserforcewall +/datum/spell/aoe/conjure/build/lesserforcewall name = "Shield" desc = "This spell creates a temporary forcefield to shield yourself and allies from incoming fire" action_icon_state = "cultforcewall" @@ -105,7 +105,7 @@ icon_state = "m_shield_cult" light_color = LIGHT_COLOR_PURE_RED -/obj/effect/proc_holder/spell/ethereal_jaunt/shift +/datum/spell/ethereal_jaunt/shift name = "Phase Shift" desc = "This spell allows you to pass through walls" action_icon_state = "phaseshift" @@ -119,7 +119,7 @@ jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out -/obj/effect/proc_holder/spell/ethereal_jaunt/shift/do_jaunt(mob/living/target) +/datum/spell/ethereal_jaunt/shift/do_jaunt(mob/living/target) target.set_light(0) ..() if(isconstruct(target)) @@ -129,10 +129,10 @@ else C.set_light(2, 3, l_color = GET_CULT_DATA(construct_glow, LIGHT_COLOR_BLOOD_MAGIC)) -/obj/effect/proc_holder/spell/ethereal_jaunt/shift/jaunt_steam(mobloc) +/datum/spell/ethereal_jaunt/shift/jaunt_steam(mobloc) return -/obj/effect/proc_holder/spell/projectile/magic_missile/lesser +/datum/spell/projectile/magic_missile/lesser name = "Lesser Magic Missile" desc = "This spell fires several, slow moving, magic projectiles at nearby targets." action_background_icon_state = "bg_cult" @@ -144,20 +144,21 @@ holy_area_cancast = FALSE //Stops cult magic from working on holy ground eg: chapel proj_lifespan = 10 proj_step_delay = 5 - proj_type = "/obj/effect/proc_holder/spell/inflict_handler/magic_missile/lesser" + proj_type = /obj/item/projectile/magic/magic_missile/lesser -/obj/effect/proc_holder/spell/projectile/magic_missile/lesser/create_new_targeting() +/datum/spell/projectile/magic_missile/lesser/create_new_targeting() var/datum/spell_targeting/targeted/T = new() T.allowed_type = /mob/living T.random_target = TRUE T.max_targets = 6 return T -/obj/effect/proc_holder/spell/inflict_handler/magic_missile/lesser - amt_knockdown = 6 SECONDS - amt_weakened = 0 +/obj/item/projectile/magic/magic_missile/lesser + name = "lesser magic missile" + knockdown = 6 SECONDS + weaken = 0 -/obj/effect/proc_holder/spell/smoke/disable +/datum/spell/smoke/disable name = "Paralysing Smoke" desc = "This spell spawns a cloud of paralysing smoke." action_icon_state = "parasmoke" diff --git a/code/datums/spells/disguise_self.dm b/code/datums/spells/disguise_self.dm index f45f3d226546..4ebd86c5398d 100644 --- a/code/datums/spells/disguise_self.dm +++ b/code/datums/spells/disguise_self.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/disguise_self +/datum/spell/disguise_self name = "Disguise Self" desc = "Disguise yourself as a crewmember, based on your current location. Also changes your voice. \ The disguise will not hold up to being examined directly, and will break if you're damaged." @@ -12,10 +12,10 @@ action_icon_state = "disguise_self" sound = null -/obj/effect/proc_holder/spell/disguise_self/create_new_targeting() +/datum/spell/disguise_self/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/disguise_self/cast(list/targets, mob/user = usr) +/datum/spell/disguise_self/cast(list/targets, mob/user = usr) if(!ishuman(user)) return FALSE var/mob/living/carbon/human/H = user diff --git a/code/datums/spells/emplosion.dm b/code/datums/spells/emplosion.dm index 4eba6b127bda..2e8e6bc74303 100644 --- a/code/datums/spells/emplosion.dm +++ b/code/datums/spells/emplosion.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/emplosion +/datum/spell/emplosion name = "Emplosion" desc = "This spell emplodes an area." @@ -7,12 +7,12 @@ action_icon_state = "emp" -/obj/effect/proc_holder/spell/emplosion/create_new_targeting() +/datum/spell/emplosion/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/emplosion/cast(list/targets, mob/user = usr) +/datum/spell/emplosion/cast(list/targets, mob/user = usr) for(var/mob/living/target in targets) - empulse(target.loc, emp_heavy, emp_light, 1) + empulse(target.loc, emp_heavy, emp_light, TRUE) return diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm index d6197b8c2bb6..467527a08748 100644 --- a/code/datums/spells/ethereal_jaunt.dm +++ b/code/datums/spells/ethereal_jaunt.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/ethereal_jaunt +/datum/spell/ethereal_jaunt name = "Ethereal Jaunt" desc = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls." @@ -20,18 +20,18 @@ action_icon_state = "jaunt" -/obj/effect/proc_holder/spell/ethereal_jaunt/create_new_targeting() +/datum/spell/ethereal_jaunt/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/ethereal_jaunt/cast(list/targets, mob/user = usr) //magnets, so mostly hardcoded - playsound(get_turf(user), sound1, 50, 1, -1) +/datum/spell/ethereal_jaunt/cast(list/targets, mob/user = usr) //magnets, so mostly hardcoded + playsound(get_turf(user), sound1, 50, TRUE, -1) for(var/mob/living/target in targets) if(!target.can_safely_leave_loc()) // No more brainmobs hopping out of their brains to_chat(target, "You are somehow too bound to your current location to abandon it.") continue INVOKE_ASYNC(src, PROC_REF(do_jaunt), target) -/obj/effect/proc_holder/spell/ethereal_jaunt/proc/do_jaunt(mob/living/target) +/datum/spell/ethereal_jaunt/proc/do_jaunt(mob/living/target) target.notransform = TRUE var/turf/mobloc = get_turf(target) var/obj/effect/dummy/spell_jaunt/holder = new jaunt_type_path(mobloc) @@ -74,7 +74,7 @@ REMOVE_TRAIT(target, TRAIT_IMMOBILIZED, "jaunt") target.remove_CC() -/obj/effect/proc_holder/spell/ethereal_jaunt/proc/jaunt_steam(mobloc) +/datum/spell/ethereal_jaunt/proc/jaunt_steam(mobloc) var/datum/effect_system/steam_spread/steam = new /datum/effect_system/steam_spread() steam.set_up(10, 0, mobloc) steam.start() diff --git a/code/datums/spells/fake_gib.dm b/code/datums/spells/fake_gib.dm index 138db2c0c2ac..262a8c9cba9a 100644 --- a/code/datums/spells/fake_gib.dm +++ b/code/datums/spells/fake_gib.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/touch/fake_disintegrate +/datum/spell/touch/fake_disintegrate name = "Disintegrate" desc = "This spell charges your hand with vile energy that can be used to violently explode victims." hand_path = "/obj/item/melee/touch_attack/fake_disintegrate" diff --git a/code/datums/spells/genetic.dm b/code/datums/spells/genetic.dm index cab9a5f381ab..91ae75562018 100644 --- a/code/datums/spells/genetic.dm +++ b/code/datums/spells/genetic.dm @@ -1,12 +1,12 @@ -/obj/effect/proc_holder/spell/genetic +/datum/spell/genetic desc = "This spell inflicts a set of mutations and disabilities upon the target." var/list/active_on = list() var/list/traits = list() // traits var/list/mutations = list() // mutation defines. Set these in Initialize. Refactor this nonsense one day - var/duration = 100 // deciseconds + var/duration = 10 SECONDS -/obj/effect/proc_holder/spell/genetic/cast(list/targets, mob/user = usr) +/datum/spell/genetic/cast(list/targets, mob/user = usr) for(var/mob/living/target in targets) if(!target.dna) continue @@ -17,15 +17,19 @@ ADD_TRAIT(target, A, MAGIC_TRAIT) active_on += target target.regenerate_icons() + do_additional_effects(target) if(duration < base_cooldown) addtimer(CALLBACK(src, PROC_REF(remove), target), duration, TIMER_OVERRIDE|TIMER_UNIQUE) -/obj/effect/proc_holder/spell/genetic/Destroy() +/datum/spell/genetic/proc/do_additional_effects(mob/target) + return + +/datum/spell/genetic/Destroy() for(var/V in active_on) remove(V) return ..() -/obj/effect/proc_holder/spell/genetic/proc/remove(mob/living/carbon/target) +/datum/spell/genetic/proc/remove(mob/living/carbon/target) active_on -= target if(!QDELETED(target)) for(var/A in mutations) diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm index 3dd2d35bbe58..8b6baba6772e 100644 --- a/code/datums/spells/horsemask.dm +++ b/code/datums/spells/horsemask.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/horsemask +/datum/spell/horsemask name = "Curse of the Horseman" desc = "This spell triggers a curse on a target, causing them to wield an unremovable horse head mask. They will speak like a horse! Any masks they are wearing will be disintegrated. This spell does not require robes." school = "transmutation" @@ -15,13 +15,13 @@ action_icon_state = "barn" sound = 'sound/magic/HorseHead_curse.ogg' -/obj/effect/proc_holder/spell/horsemask/create_new_targeting() +/datum/spell/horsemask/create_new_targeting() var/datum/spell_targeting/click/T = new() T.selection_type = SPELL_SELECTION_RANGE return T -/obj/effect/proc_holder/spell/horsemask/cast(list/targets, mob/user = usr) +/datum/spell/horsemask/cast(list/targets, mob/user = usr) if(!targets.len) to_chat(user, "No target found in range.") return diff --git a/code/datums/spells/infinite_guns.dm b/code/datums/spells/infinite_guns.dm index 56b0cae5cfdc..b18625a3d5f7 100644 --- a/code/datums/spells/infinite_guns.dm +++ b/code/datums/spells/infinite_guns.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/infinite_guns +/datum/spell/infinite_guns name = "Lesser Summon Guns" desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles. Requires both hands free to use." invocation_type = "none" @@ -10,10 +10,10 @@ action_icon_state = "bolt_action" var/gun_type = /obj/item/gun/projectile/shotgun/boltaction/enchanted -/obj/effect/proc_holder/spell/infinite_guns/create_new_targeting() +/datum/spell/infinite_guns/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/infinite_guns/cast(list/targets, mob/user = usr) +/datum/spell/infinite_guns/cast(list/targets, mob/user = usr) for(var/mob/living/carbon/C in targets) C.drop_item() C.swap_hand() @@ -21,7 +21,7 @@ var/obj/item/gun/projectile/shotgun/boltaction/enchanted/GUN = new gun_type() C.put_in_hands(GUN) -/obj/effect/proc_holder/spell/infinite_guns/fireball +/datum/spell/infinite_guns/fireball name = "Rapid-fire Fireball" desc = "Multiple Fireballs. Need I explain more? Requires both hands free to use." diff --git a/code/datums/spells/inflict_handler.dm b/code/datums/spells/inflict_handler.dm deleted file mode 100644 index d69253f59110..000000000000 --- a/code/datums/spells/inflict_handler.dm +++ /dev/null @@ -1,62 +0,0 @@ -/obj/effect/proc_holder/spell/inflict_handler - name = "Inflict Handler" - desc = "This spell blinds and/or destroys/damages/heals and/or weakens/stuns the target." - - var/amt_weakened = 0 - var/amt_paralysis = 0 - var/amt_stunned = 0 - var/amt_knockdown = 0 - - //set to negatives for healing - var/amt_dam_fire = 0 - var/amt_dam_brute = 0 - var/amt_dam_oxy = 0 - var/amt_dam_tox = 0 - - var/amt_eye_blind = 0 - var/amt_eye_blurry = 0 - - var/destroys = "none" //can be "none", "gib" or "disintegrate" - - var/summon_type = null //this will put an obj at the target's location - -/obj/effect/proc_holder/spell/inflict_handler/create_new_targeting() - return new /datum/spell_targeting/self // Dummy value since it is never used for this spell... why is this even a spell - -/obj/effect/proc_holder/spell/inflict_handler/cast(list/targets, mob/user = usr) - - for(var/mob/living/target in targets) - switch(destroys) - if("gib") - target.gib() - if("disintegrate") - target.dust() - - if(!target) - continue - //damage - if(amt_dam_brute > 0) - if(amt_dam_fire >= 0) - target.take_overall_damage(amt_dam_brute,amt_dam_fire) - else if(amt_dam_fire < 0) - target.take_overall_damage(amt_dam_brute,0) - target.heal_overall_damage(0,amt_dam_fire) - else if(amt_dam_brute < 0) - if(amt_dam_fire > 0) - target.take_overall_damage(0,amt_dam_fire) - target.heal_overall_damage(amt_dam_brute,0) - else if(amt_dam_fire <= 0) - target.heal_overall_damage(amt_dam_brute,amt_dam_fire) - target.adjustToxLoss(amt_dam_tox) - target.adjustOxyLoss(amt_dam_oxy) - //disabling - target.Weaken(amt_weakened) - target.Paralyse(amt_paralysis) - target.Stun(amt_stunned) - target.KnockDown(amt_knockdown) - - target.AdjustEyeBlind(amt_eye_blind) - target.AdjustEyeBlurry(amt_eye_blurry) - //summoning - if(summon_type) - new summon_type(target.loc, target) diff --git a/code/datums/spells/knock.dm b/code/datums/spells/knock.dm index 221ac50196e8..9689858794a2 100644 --- a/code/datums/spells/knock.dm +++ b/code/datums/spells/knock.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/aoe/knock +/datum/spell/aoe/knock name = "Knock" desc = "This spell opens nearby doors and does not require wizard garb." @@ -13,31 +13,31 @@ sound = 'sound/magic/knock.ogg' aoe_range = 3 -/obj/effect/proc_holder/spell/aoe/knock/create_new_targeting() +/datum/spell/aoe/knock/create_new_targeting() var/datum/spell_targeting/aoe/turf/targeting = new() targeting.range = aoe_range return targeting -/obj/effect/proc_holder/spell/aoe/knock/cast(list/targets, mob/user = usr) +/datum/spell/aoe/knock/cast(list/targets, mob/user = usr) for(var/turf/T in targets) for(var/obj/machinery/door/door in T.contents) INVOKE_ASYNC(src, PROC_REF(try_open_airlock), door) for(var/obj/structure/closet/C in T.contents) INVOKE_ASYNC(src, PROC_REF(try_open_closet), C) -/obj/effect/proc_holder/spell/aoe/knock/proc/try_open_airlock(obj/machinery/door/door) +/datum/spell/aoe/knock/proc/try_open_airlock(obj/machinery/door/door) if(istype(door, /obj/machinery/door/airlock)) var/obj/machinery/door/airlock/A = door A.unlock(TRUE) //forced because it's magic! door.open() -/obj/effect/proc_holder/spell/aoe/knock/proc/try_open_closet(obj/structure/closet/C) +/datum/spell/aoe/knock/proc/try_open_closet(obj/structure/closet/C) if(istype(C, /obj/structure/closet/secure_closet)) var/obj/structure/closet/secure_closet/SC = C SC.locked = FALSE C.open() -/obj/effect/proc_holder/spell/aoe/knock/greater +/datum/spell/aoe/knock/greater name = "Greater Knock" desc = "On first cast, will remove access restrictions on all airlocks on the station, and announce this spell's use to the station. On any further cast, will open all doors in sight. Cannot be refunded once bought!" @@ -50,7 +50,7 @@ action_icon_state = "greater_knock" -/obj/effect/proc_holder/spell/aoe/knock/greater/cast(list/targets, mob/user = usr) +/datum/spell/aoe/knock/greater/cast(list/targets, mob/user = usr) if(!used) used = TRUE for(var/obj/machinery/door/airlock/A in GLOB.airlocks) diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm index ccdad7e98637..30c0dd39ec4e 100644 --- a/code/datums/spells/lichdom.dm +++ b/code/datums/spells/lichdom.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/lichdom +/datum/spell/lichdom name = "Bind Soul" desc = "A dark necromantic pact that can forever bind your soul to an item of your choosing. So long as both your body and the item remain intact and on the same plane you can revive from death, though the time between reincarnations grows steadily with use." school = "necromancy" @@ -17,26 +17,26 @@ action_icon_state = "skeleton" -/obj/effect/proc_holder/spell/lichdom/create_new_targeting() +/datum/spell/lichdom/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/lichdom/Destroy() +/datum/spell/lichdom/Destroy() for(var/datum/mind/M in SSticker.mode.wizards) //Make sure no other bones are about - for(var/obj/effect/proc_holder/spell/S in M.spell_list) - if(istype(S,/obj/effect/proc_holder/spell/lichdom) && S != src) + for(var/datum/spell/S in M.spell_list) + if(istype(S,/datum/spell/lichdom) && S != src) return ..() if(existence_stops_round_end) GLOB.configuration.gamemode.disable_certain_round_early_end = FALSE return ..() -/obj/effect/proc_holder/spell/lichdom/cast(list/targets, mob/user = usr) +/datum/spell/lichdom/cast(list/targets, mob/user = usr) for(var/mob/M in targets) if(stat_allowed) attempt_revive(M) else if(!marked_item_uid) attempt_mark_item(M) -/obj/effect/proc_holder/spell/lichdom/proc/attempt_revive(mob/user) +/datum/spell/lichdom/proc/attempt_revive(mob/user) // Can only cast when unconscious/dead if(user.stat == CONSCIOUS) to_chat(user, "You aren't dead enough to revive!") @@ -95,7 +95,7 @@ cooldown_handler.recharge_duration += 1 MINUTES to_chat(lich, "Your bones clatter and shudder as they're pulled back into this world!") -/obj/effect/proc_holder/spell/lichdom/proc/attempt_mark_item(mob/user) +/datum/spell/lichdom/proc/attempt_mark_item(mob/user) var/obj/item/target = user.get_active_hand() if(!target) to_chat(user, "You must hold an item you wish to make your phylactery!") @@ -141,7 +141,7 @@ existence_stops_round_end = TRUE GLOB.configuration.gamemode.disable_certain_round_early_end = TRUE -/obj/effect/proc_holder/spell/lichdom/proc/is_revive_possible() +/datum/spell/lichdom/proc/is_revive_possible() var/obj/item/marked_item = locateUID(marked_item_uid) if(QDELETED(marked_item)) return FALSE @@ -153,12 +153,12 @@ return FALSE return TRUE -/obj/effect/proc_holder/spell/lichdom/proc/check_revivability_handler() +/datum/spell/lichdom/proc/check_revivability_handler() SIGNAL_HANDLER // There are other liches about, so round may still continue for(var/datum/mind/M in SSticker.mode.wizards) - for(var/obj/effect/proc_holder/spell/lichdom/S in M.spell_list) + for(var/datum/spell/lichdom/S in M.spell_list) if(S == src) continue // Other lich can still revive @@ -170,7 +170,7 @@ GLOB.configuration.gamemode.disable_certain_round_early_end = is_revive_possible() -/obj/effect/proc_holder/spell/lichdom/proc/equip_lich(mob/living/carbon/human/H) +/datum/spell/lichdom/proc/equip_lich(mob/living/carbon/human/H) H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), SLOT_HUD_OUTER_SUIT) H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), SLOT_HUD_HEAD) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), SLOT_HUD_SHOES) diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm index 53dfd6818c70..d4a141c1ccb4 100644 --- a/code/datums/spells/lightning.dm +++ b/code/datums/spells/lightning.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/charge_up/bounce/lightning +/datum/spell/charge_up/bounce/lightning name = "Lightning Bolt" desc = "Throws a lightning bolt at your enemies. Classic. When clicked will start to charge in power. Then click on a mob to send the bolt before it overloads with power." base_cooldown = 30 SECONDS @@ -15,29 +15,29 @@ bounce_hit_sound = 'sound/magic/lightningshock.ogg' var/damaging = TRUE -/obj/effect/proc_holder/spell/charge_up/bounce/lightning/New() +/datum/spell/charge_up/bounce/lightning/New() ..() charge_up_overlay = image(icon = 'icons/effects/effects.dmi', icon_state = "electricity", layer = EFFECTS_LAYER) -/obj/effect/proc_holder/spell/charge_up/bounce/lightning/lightnian +/datum/spell/charge_up/bounce/lightning/lightnian clothes_req = FALSE invocation_type = "none" damaging = FALSE -/obj/effect/proc_holder/spell/charge_up/bounce/lightning/get_bounce_energy() +/datum/spell/charge_up/bounce/lightning/get_bounce_energy() if(damaging) return max(15, get_energy_charge() / 2) return 0 -/obj/effect/proc_holder/spell/charge_up/bounce/lightning/get_bounce_amount() +/datum/spell/charge_up/bounce/lightning/get_bounce_amount() if(damaging) return 5 return round(get_energy_charge() / 20) -/obj/effect/proc_holder/spell/charge_up/bounce/lightning/create_beam(mob/origin, mob/target) +/datum/spell/charge_up/bounce/lightning/create_beam(mob/origin, mob/target) origin.Beam(target, icon_state = "lightning[rand(1, 12)]", icon = 'icons/effects/effects.dmi', time = 5) -/obj/effect/proc_holder/spell/charge_up/bounce/lightning/apply_bounce_effect(mob/origin, mob/living/target, energy, mob/user) +/datum/spell/charge_up/bounce/lightning/apply_bounce_effect(mob/origin, mob/living/target, energy, mob/user) if(damaging) target.electrocute_act(energy, "Lightning Bolt", flags = SHOCK_NOGLOVES) else diff --git a/code/datums/spells/magnet.dm b/code/datums/spells/magnet.dm index 681833388688..a559b1062c0c 100644 --- a/code/datums/spells/magnet.dm +++ b/code/datums/spells/magnet.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/charge_up/bounce/magnet +/datum/spell/charge_up/bounce/magnet name = "Magnetic Pull" desc = "Pulls metalic objects from enemies hands with the power of MAGNETS." action_icon_state = "magnet" @@ -14,22 +14,22 @@ start_charging_text = "You start gathering magnetism around you." bounce_hit_sound = 'sound/machines/defib_zap.ogg' -/obj/effect/proc_holder/spell/charge_up/bounce/magnet/New() +/datum/spell/charge_up/bounce/magnet/New() ..() charge_up_overlay = image(icon = 'icons/effects/effects.dmi', icon_state = "electricity", layer = EFFECTS_LAYER) -/obj/effect/proc_holder/spell/charge_up/bounce/magnet/get_bounce_energy() +/datum/spell/charge_up/bounce/magnet/get_bounce_energy() return get_energy_charge() -/obj/effect/proc_holder/spell/charge_up/bounce/magnet/get_bounce_amount() +/datum/spell/charge_up/bounce/magnet/get_bounce_amount() if(get_energy_charge() >= 75) return 5 return 0 -/obj/effect/proc_holder/spell/charge_up/bounce/magnet/create_beam(mob/origin, mob/target) +/datum/spell/charge_up/bounce/magnet/create_beam(mob/origin, mob/target) origin.Beam(target, icon_state = "lightning[rand(1, 12)]", icon = 'icons/effects/effects.dmi', time = 5) -/obj/effect/proc_holder/spell/charge_up/bounce/magnet/apply_bounce_effect(mob/origin, mob/target, energy, mob/user) +/datum/spell/charge_up/bounce/magnet/apply_bounce_effect(mob/origin, mob/target, energy, mob/user) var/list/items_to_throw = list() switch(energy) if(0 to 25) @@ -47,7 +47,7 @@ for(var/I in items_to_throw) try_throw_object(user, target, I) -/obj/effect/proc_holder/spell/charge_up/bounce/magnet/proc/try_throw_object(mob/user, mob/thrower, obj/item/to_throw) +/datum/spell/charge_up/bounce/magnet/proc/try_throw_object(mob/user, mob/thrower, obj/item/to_throw) if(!(to_throw.flags & CONDUCT) || !thrower.unEquip(to_throw, silent = TRUE)) return FALSE thrower.visible_message("[to_throw] gets thrown out of [thrower] [thrower.p_their()] hands!", diff --git a/code/datums/spells/mime.dm b/code/datums/spells/mime.dm index e40dd88df963..9fe9431dc8d4 100644 --- a/code/datums/spells/mime.dm +++ b/code/datums/spells/mime.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/aoe/conjure/build/mime_wall +/datum/spell/aoe/conjure/build/mime_wall name = "Invisible Wall" desc = "The mime's performance transmutates into physical reality." school = "mime" @@ -15,7 +15,7 @@ action_icon_state = "mime" action_background_icon_state = "bg_mime" -/obj/effect/proc_holder/spell/aoe/conjure/build/mime_wall/Click() +/datum/spell/aoe/conjure/build/mime_wall/Click() if(usr && usr.mind) if(!usr.mind.miming) to_chat(usr, "You must dedicate yourself to silence first.") @@ -25,10 +25,10 @@ invocation_type ="none" ..() -/obj/effect/proc_holder/spell/mime/create_new_targeting() +/datum/spell/mime/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/mime/speak +/datum/spell/mime/speak name = "Speech" desc = "Make or break a vow of silence." school = "mime" @@ -40,7 +40,7 @@ action_icon_state = "mime_silence" action_background_icon_state = "bg_mime" -/obj/effect/proc_holder/spell/mime/speak/Click() +/datum/spell/mime/speak/Click() if(!usr) return if(!ishuman(usr)) @@ -52,7 +52,7 @@ still_recharging_msg = "You'll have to wait before you can give your vow of silence again!" ..() -/obj/effect/proc_holder/spell/mime/speak/cast(list/targets,mob/user = usr) +/datum/spell/mime/speak/cast(list/targets,mob/user = usr) for(var/mob/living/carbon/human/H in targets) H.mind.miming=!H.mind.miming if(H.mind.miming) @@ -62,7 +62,7 @@ //Advanced Mimery traitor item spells -/obj/effect/proc_holder/spell/forcewall/mime +/datum/spell/forcewall/mime name = "Invisible Greater Wall" desc = "Form an invisible three tile wide blockade." school = "mime" @@ -77,7 +77,7 @@ action_icon_state = "mime_bigwall" action_background_icon_state = "bg_mime" -/obj/effect/proc_holder/spell/forcewall/mime/Click() +/datum/spell/forcewall/mime/Click() if(usr && usr.mind) if(!usr.mind.miming) to_chat(usr, "You must dedicate yourself to silence first.") @@ -87,7 +87,7 @@ invocation_type ="none" ..() -/obj/effect/proc_holder/spell/mime/fingergun +/datum/spell/mime/fingergun name = "Finger Gun" desc = "Shoot lethal, silencing bullets out of your fingers! 3 bullets available per cast. Use your fingers to holster them manually." school = "mime" @@ -101,7 +101,7 @@ var/gun = /obj/item/gun/projectile/revolver/fingergun var/obj/item/gun/projectile/revolver/fingergun/current_gun -/obj/effect/proc_holder/spell/mime/fingergun/cast(list/targets, mob/user = usr) +/datum/spell/mime/fingergun/cast(list/targets, mob/user = usr) for(var/mob/living/carbon/human/C in targets) if(!current_gun) to_chat(user, "You draw your fingers!") @@ -114,33 +114,33 @@ revert_cast(user) -/obj/effect/proc_holder/spell/mime/fingergun/Destroy() +/datum/spell/mime/fingergun/Destroy() current_gun = null return ..() -/obj/effect/proc_holder/spell/mime/fingergun/proc/holster_hand(atom/target, any=FALSE) +/datum/spell/mime/fingergun/proc/holster_hand(atom/target, any=FALSE) SIGNAL_HANDLER if(!current_gun || !any && action.owner.get_active_hand() != current_gun) return to_chat(action.owner, "You holster your fingers. Another time perhaps...") QDEL_NULL(current_gun) -/obj/effect/proc_holder/spell/mime/fingergun/fake +/datum/spell/mime/fingergun/fake desc = "Pretend you're shooting bullets out of your fingers! 3 bullets available per cast. Use your fingers to holster them manually." gun = /obj/item/gun/projectile/revolver/fingergun/fake // Mime Spellbooks /obj/item/spellbook/oneuse/mime - spell = /obj/effect/proc_holder/spell/aoe/conjure/build/mime_wall + spell = /datum/spell/aoe/conjure/build/mime_wall spellname = "Invisible Wall" name = "Miming Manual : " desc = "It contains various pictures of mimes mid-performance, aswell as some illustrated tutorials." icon_state = "bookmime" /obj/item/spellbook/oneuse/mime/attack_self(mob/user) - var/obj/effect/proc_holder/spell/S = new spell - for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) + var/datum/spell/S = new spell + for(var/datum/spell/knownspell in user.mind.spell_list) if(knownspell.type == S.type) if(user.mind) to_chat(user, "You've already read this one.") @@ -159,19 +159,19 @@ /obj/item/spellbook/oneuse/mime/onlearned(mob/user) used = TRUE - if(!locate(/obj/effect/proc_holder/spell/mime/speak) in user.mind.spell_list) //add vow of silence if not known by user - user.mind.AddSpell(new /obj/effect/proc_holder/spell/mime/speak) + if(!locate(/datum/spell/mime/speak) in user.mind.spell_list) //add vow of silence if not known by user + user.mind.AddSpell(new /datum/spell/mime/speak) to_chat(user, "You have learned how to use silence to improve your performance.") /obj/item/spellbook/oneuse/mime/fingergun - spell = /obj/effect/proc_holder/spell/mime/fingergun + spell = /datum/spell/mime/fingergun spellname = "Finger Gun" desc = "It contains illustrations of guns and how to mime them." /obj/item/spellbook/oneuse/mime/fingergun/fake - spell = /obj/effect/proc_holder/spell/mime/fingergun/fake + spell = /datum/spell/mime/fingergun/fake /obj/item/spellbook/oneuse/mime/greaterwall - spell = /obj/effect/proc_holder/spell/forcewall/mime + spell = /datum/spell/forcewall/mime spellname = "Invisible Greater Wall" desc = "It contains illustrations of the great walls of human history." diff --git a/code/datums/spells/mime_malaise.dm b/code/datums/spells/mime_malaise.dm index 471ba5cb1c65..6c448b91bd6e 100644 --- a/code/datums/spells/mime_malaise.dm +++ b/code/datums/spells/mime_malaise.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/touch/mime_malaise +/datum/spell/touch/mime_malaise name = "Mime Malaise" desc = "A spell popular with theater nerd wizards and contrarian pranksters, this spell will put on a mime costume on the target, \ stun them so that they may contemplate Art, and silence them. \ diff --git a/code/datums/spells/mimic.dm b/code/datums/spells/mimic.dm index 15c1481c8fef..e601cf553474 100644 --- a/code/datums/spells/mimic.dm +++ b/code/datums/spells/mimic.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/mimic +/datum/spell/mimic name = "Mimic" desc = "Learn a new form to mimic or become one of your known forms" clothes_req = FALSE @@ -32,7 +32,7 @@ ) -/obj/effect/proc_holder/spell/mimic/create_new_targeting() +/datum/spell/mimic/create_new_targeting() var/datum/spell_targeting/click/T = new T.include_user = TRUE // To change forms T.allowed_type = /atom/movable @@ -40,7 +40,7 @@ T.click_radius = -1 return T -/obj/effect/proc_holder/spell/mimic/valid_target(atom/target, user) +/datum/spell/mimic/valid_target(atom/target, user) if(is_type_in_list(target, black_listed_form_types)) return FALSE if(istype(target, /atom/movable)) @@ -51,7 +51,7 @@ return FALSE return ..() -/obj/effect/proc_holder/spell/mimic/cast(list/targets, mob/user) +/datum/spell/mimic/cast(list/targets, mob/user) var/atom/movable/A = targets[1] if(A == user) INVOKE_ASYNC(src, PROC_REF(pick_form), user) @@ -59,7 +59,7 @@ INVOKE_ASYNC(src, PROC_REF(remember_form), A, user) -/obj/effect/proc_holder/spell/mimic/proc/remember_form(atom/movable/A, mob/user) +/datum/spell/mimic/proc/remember_form(atom/movable/A, mob/user) if(A.name in available_forms) to_chat(user, "[A] is already an available form.") revert_cast(user) @@ -83,7 +83,7 @@ available_forms[A.name] = new /datum/mimic_form(A, user) to_chat(user, "You learn the form of [A].") -/obj/effect/proc_holder/spell/mimic/proc/pick_form(mob/user) +/datum/spell/mimic/proc/pick_form(mob/user) if(!length(available_forms) && !selected_form) to_chat(user, "No available forms. Learn more forms by using this spell on other objects first.") revert_cast(user) @@ -109,7 +109,7 @@ return take_form(available_forms[what], user) -/obj/effect/proc_holder/spell/mimic/proc/take_form(datum/mimic_form/form, mob/user) +/datum/spell/mimic/proc/take_form(datum/mimic_form/form, mob/user) var/old_name = "[user]" if(ishuman(user)) // Not fully finished yet @@ -132,10 +132,10 @@ selected_form = form -/obj/effect/proc_holder/spell/mimic/proc/show_change_form_message(mob/user, old_name, new_name) +/datum/spell/mimic/proc/show_change_form_message(mob/user, old_name, new_name) user.visible_message("[old_name] contorts and slowly becomes [new_name]!", "You take form of [new_name].", "You hear loud cracking noises!") -/obj/effect/proc_holder/spell/mimic/proc/restore_form(mob/user, show_message = TRUE) +/datum/spell/mimic/proc/restore_form(mob/user, show_message = TRUE) selected_form = null var/old_name = "[user]" @@ -157,21 +157,21 @@ UnregisterSignal(user, list(COMSIG_PARENT_EXAMINE, COMSIG_MOB_DEATH)) -/obj/effect/proc_holder/spell/mimic/proc/show_restore_form_message(mob/user, old_name, new_name) +/datum/spell/mimic/proc/show_restore_form_message(mob/user, old_name, new_name) user.visible_message("[old_name] shakes and contorts and quickly becomes [new_name]!", "You take return to your normal self.", "You hear loud cracking noises!") -/obj/effect/proc_holder/spell/mimic/proc/examine_override(datum/source, mob/user, list/examine_list) +/datum/spell/mimic/proc/examine_override(datum/source, mob/user, list/examine_list) examine_list.Cut() examine_list += selected_form.examine_text if(!perfect_disguise && get_dist(user, source) <= 3) examine_list += "It doesn't look quite right..." -/obj/effect/proc_holder/spell/mimic/proc/on_death(mob/user, gibbed) +/datum/spell/mimic/proc/on_death(mob/user, gibbed) if(!gibbed) restore_form(user, FALSE) show_death_message(user) -/obj/effect/proc_holder/spell/mimic/proc/show_death_message(mob/user) +/datum/spell/mimic/proc/show_death_message(mob/user) user.visible_message("[user] shakes and contorts as [user.p_they()] die[user.p_s()], returning to [user.p_their()] true form!", "Your disguise fails as your life forces drain away.", "You hear loud cracking noises followed by a thud!") @@ -188,34 +188,34 @@ examine_text = form.examine(user) name = form.name -/obj/effect/proc_holder/spell/mimic/morph +/datum/spell/mimic/morph action_background_icon_state = "bg_morph" -/obj/effect/proc_holder/spell/mimic/morph/create_new_handler() +/datum/spell/mimic/morph/create_new_handler() var/datum/spell_handler/morph/H = new return H -/obj/effect/proc_holder/spell/mimic/morph/valid_target(atom/target, user) +/datum/spell/mimic/morph/valid_target(atom/target, user) if(target != user && ismorph(target)) return FALSE return ..() -/obj/effect/proc_holder/spell/mimic/morph/take_form(datum/mimic_form/form, mob/living/simple_animal/hostile/morph/user) +/datum/spell/mimic/morph/take_form(datum/mimic_form/form, mob/living/simple_animal/hostile/morph/user) ..() user.assume() -/obj/effect/proc_holder/spell/mimic/morph/restore_form(mob/living/simple_animal/hostile/morph/user, show_message = TRUE) +/datum/spell/mimic/morph/restore_form(mob/living/simple_animal/hostile/morph/user, show_message = TRUE) ..() user.restore() -/obj/effect/proc_holder/spell/mimic/morph/show_change_form_message(mob/user, old_name, new_name) +/datum/spell/mimic/morph/show_change_form_message(mob/user, old_name, new_name) user.visible_message("[old_name] suddenly twists and changes shape, becoming a copy of [new_name]!", \ "You twist your body and assume the form of [new_name].") -/obj/effect/proc_holder/spell/mimic/morph/show_restore_form_message(mob/user, old_name, new_name) +/datum/spell/mimic/morph/show_restore_form_message(mob/user, old_name, new_name) user.visible_message("[old_name] suddenly collapses in on itself, dissolving into a pile of green flesh!", \ "You reform to your normal body.") -/obj/effect/proc_holder/spell/mimic/morph/show_death_message(mob/user) +/datum/spell/mimic/morph/show_death_message(mob/user) user.visible_message("[user] twists and dissolves into a pile of green flesh!", \ "Your skin ruptures! Your flesh breaks apart! No disguise can ward off de--") diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm index 8b8f91c3cb00..ffefd1534a17 100644 --- a/code/datums/spells/mind_transfer.dm +++ b/code/datums/spells/mind_transfer.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/mind_transfer +/datum/spell/mind_transfer name = "Mind Transfer" desc = "This spell allows the user to switch bodies with a target." @@ -15,14 +15,14 @@ var/paralysis_amount_victim = 40 SECONDS //how much the victim is paralysed for after the spell action_icon_state = "mindswap" -/obj/effect/proc_holder/spell/mind_transfer/create_new_targeting() +/datum/spell/mind_transfer/create_new_targeting() var/datum/spell_targeting/click/T = new() T.allowed_type = /mob/living T.range = 1 T.click_radius = 0 return T -/obj/effect/proc_holder/spell/mind_transfer/valid_target(mob/living/target, mob/user) +/datum/spell/mind_transfer/valid_target(mob/living/target, mob/user) return target.stat != DEAD && target.key && target.mind /* @@ -30,7 +30,7 @@ Urist: I don't feel like figuring out how you store object spells so I'm leaving Make sure spells that are removed from spell_list are actually removed and deleted when mind transfering. Also, you never added distance checking after target is selected. I've went ahead and did that. */ -/obj/effect/proc_holder/spell/mind_transfer/cast(list/targets, mob/user = usr) +/datum/spell/mind_transfer/cast(list/targets, mob/user = usr) var/mob/living/target = targets[1] diff --git a/code/datums/spells/night_vision.dm b/code/datums/spells/night_vision.dm index ad854eed6014..de085eae1993 100644 --- a/code/datums/spells/night_vision.dm +++ b/code/datums/spells/night_vision.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/night_vision +/datum/spell/night_vision name = "Toggle Nightvision" desc = "Toggle your nightvision mode." @@ -7,10 +7,10 @@ message = "You toggle your night vision!" -/obj/effect/proc_holder/spell/night_vision/create_new_targeting() +/datum/spell/night_vision/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/night_vision/cast(list/targets, mob/user = usr) +/datum/spell/night_vision/cast(list/targets, mob/user = usr) for(var/mob/living/target in targets) switch(target.lighting_alpha) if(LIGHTING_PLANE_ALPHA_VISIBLE) diff --git a/code/datums/spells/projectile_spell.dm b/code/datums/spells/projectile_spell.dm index 168d2660f5a1..fd724b5019b2 100644 --- a/code/datums/spells/projectile_spell.dm +++ b/code/datums/spells/projectile_spell.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/projectile +/datum/spell/projectile desc = "This spell summons projectiles which try to hit the targets." var/proj_icon = 'icons/obj/projectiles.dmi' @@ -10,7 +10,8 @@ var/proj_trail_icon = 'icons/obj/wizard.dmi' var/proj_trail_icon_state = "trail" - var/proj_type = "/obj/effect/proc_holder/spell" //IMPORTANT use only subtypes of this + /// The projectile we spawn. Make sure to override this + var/proj_type var/proj_lingering = 0 //if it lingers or disappears upon hitting an obstacle var/proj_homing = 1 //if it follows the target @@ -20,64 +21,51 @@ var/proj_lifespan = 15 //in deciseconds * proj_step_delay var/proj_step_delay = 1 //lower = faster -/obj/effect/proc_holder/spell/projectile/cast(list/targets, mob/user = usr) +/datum/spell/projectile/cast(list/targets, mob/user = usr) for(var/mob/living/target in targets) spawn(0) - var/obj/effect/proc_holder/spell/projectile - if(istext(proj_type)) - var/projectile_type = text2path(proj_type) - projectile = new projectile_type(user) - if(istype(proj_type,/obj/effect/proc_holder/spell)) - projectile = new /obj/effect/proc_holder/spell/trigger(user) - projectile:linked_spells += proj_type + var/obj/item/projectile/projectile = new proj_type(get_turf(user)) projectile.icon = proj_icon projectile.icon_state = proj_icon_state - projectile.dir = get_dir(target,projectile) + projectile.dir = get_dir(target, projectile) projectile.name = proj_name + var/current_loc = get_turf(projectile) - var/current_loc = user.loc - - projectile.loc = current_loc - - for(var/i = 0,i < proj_lifespan,i++) + for(var/i in 1 to proj_lifespan) if(!projectile) break if(proj_homing) if(proj_insubstantial) projectile.dir = get_dir(projectile,target) - projectile.loc = get_step_to(projectile,target) + projectile.forceMove(get_step_to(projectile, target)) else step_to(projectile,target) else if(proj_insubstantial) - projectile.loc = get_step(projectile,dir) + projectile.forceMove(get_step(projectile, projectile.dir)) else - step(projectile,dir) + step(projectile, projectile.dir) if(!projectile) // step and step_to sleeps so we'll have to check again. break - if(!proj_lingering && projectile.loc == current_loc) //if it didn't move since last time + if(!proj_lingering && (get_turf(projectile) == current_loc)) //if it didn't move since last time qdel(projectile) break if(proj_trail && projectile) spawn(0) if(projectile) - var/obj/effect/overlay/trail = new /obj/effect/overlay(projectile.loc) + var/obj/effect/overlay/trail = new /obj/effect/overlay(get_turf(projectile)) trail.icon = proj_trail_icon trail.icon_state = proj_trail_icon_state trail.density = FALSE spawn(proj_trail_lifespan) qdel(trail) - if(projectile.loc in range(target.loc,proj_trigger_range)) - projectile.perform(list(target), user = user) - break - - current_loc = projectile.loc + current_loc = get_turf(projectile) sleep(proj_step_delay) diff --git a/code/datums/spells/rathens.dm b/code/datums/spells/rathens.dm index eee61832f823..195103244444 100644 --- a/code/datums/spells/rathens.dm +++ b/code/datums/spells/rathens.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/rathens +/datum/spell/rathens name = "Rathen's Secret" desc = "Summons a powerful shockwave around you that tears the appendix out of enemies, and occasionally removes their limbs." base_cooldown = 50 SECONDS @@ -8,12 +8,12 @@ cooldown_min = 20 SECONDS action_icon_state = "lungpunch" -/obj/effect/proc_holder/spell/rathens/create_new_targeting() +/datum/spell/rathens/create_new_targeting() var/datum/spell_targeting/targeted/T = new() T.max_targets = INFINITY return T -/obj/effect/proc_holder/spell/rathens/cast(list/targets, mob/user = usr) +/datum/spell/rathens/cast(list/targets, mob/user = usr) for(var/mob/living/carbon/human/H in targets) var/datum/effect_system/smoke_spread/s = new s.set_up(5, FALSE, H) diff --git a/code/datums/spells/rod_form.dm b/code/datums/spells/rod_form.dm index 3670b320b8eb..5f43e92f232f 100644 --- a/code/datums/spells/rod_form.dm +++ b/code/datums/spells/rod_form.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/rod_form +/datum/spell/rod_form name = "Rod Form" desc = "Take on the form of an immovable rod, destroying all in your path." clothes_req = TRUE @@ -13,10 +13,10 @@ sound = 'sound/effects/whoosh.ogg' var/rod_delay = 2 -/obj/effect/proc_holder/spell/rod_form/create_new_targeting() +/datum/spell/rod_form/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/rod_form/cast(list/targets,mob/user = usr) +/datum/spell/rod_form/cast(list/targets,mob/user = usr) if(get_turf(user) != user.loc) to_chat(user, "You cannot summon a rod in the ether, the spell fizzles out!") revert_cast() diff --git a/code/datums/spells/sentient_sword_lunge.dm b/code/datums/spells/sentient_sword_lunge.dm index c5b0520152b9..725bc77846c4 100644 --- a/code/datums/spells/sentient_sword_lunge.dm +++ b/code/datums/spells/sentient_sword_lunge.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/sentient_sword_lunge +/datum/spell/sentient_sword_lunge name = "Lunge" desc = "Lunge at something in your view range." clothes_req = FALSE @@ -8,10 +8,10 @@ sound = 'sound/magic/repulse.ogg' action_icon_state = "lunge" -/obj/effect/proc_holder/spell/sentient_sword_lunge/create_new_targeting() +/datum/spell/sentient_sword_lunge/create_new_targeting() return new /datum/spell_targeting/clicked_atom -/obj/effect/proc_holder/spell/sentient_sword_lunge/cast(list/targets, mob/user = usr) +/datum/spell/sentient_sword_lunge/cast(list/targets, mob/user = usr) if(!istype(user.loc, /obj/item)) to_chat(user, "You cannot use this ability if you're outside a blade!") return diff --git a/code/datums/spells/shapeshift.dm b/code/datums/spells/shapeshift.dm index 09d1439e951e..4b601beabe7c 100644 --- a/code/datums/spells/shapeshift.dm +++ b/code/datums/spells/shapeshift.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/shapeshift +/datum/spell/shapeshift name = "Shapechange" desc = "Take on the shape of another for a time to use their natural abilities. Once you've made your choice it cannot be changed." clothes_req = FALSE @@ -17,10 +17,10 @@ /mob/living/simple_animal/bot/ed209, /mob/living/simple_animal/hostile/construct/armoured) -/obj/effect/proc_holder/spell/shapeshift/create_new_targeting() +/datum/spell/shapeshift/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/shapeshift/cast(list/targets, mob/user = usr) +/datum/spell/shapeshift/cast(list/targets, mob/user = usr) for(var/mob/living/M in targets) if(!shapeshift_type) var/list/animal_list = list() @@ -36,7 +36,7 @@ else Shapeshift(M) -/obj/effect/proc_holder/spell/shapeshift/proc/Shapeshift(mob/living/caster) +/datum/spell/shapeshift/proc/Shapeshift(mob/living/caster) for(var/mob/living/M in caster) if(M.status_flags & GODMODE) to_chat(caster, "You're already shapeshifted!") @@ -53,7 +53,7 @@ caster.mind.transfer_to(shape) -/obj/effect/proc_holder/spell/shapeshift/proc/Restore(mob/living/shape) +/datum/spell/shapeshift/proc/Restore(mob/living/shape) var/mob/living/caster for(var/mob/living/M in shape) if(M in current_casters) @@ -72,7 +72,7 @@ shape.mind.transfer_to(caster) qdel(shape) //Gib it maybe ? -/obj/effect/proc_holder/spell/shapeshift/dragon +/datum/spell/shapeshift/dragon name = "Dragon Form" desc = "Take on the shape a lesser ash drake after a short delay." invocation = "*scream" @@ -82,7 +82,7 @@ current_casters = list() possible_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser) -/obj/effect/proc_holder/spell/shapeshift/dragon/Shapeshift(mob/living/caster) +/datum/spell/shapeshift/dragon/Shapeshift(mob/living/caster) caster.visible_message("[caster] screams in agony as bones and claws erupt out of their flesh!", "You begin channeling the transformation.") if(!do_after(caster, 5 SECONDS, FALSE, caster)) @@ -90,7 +90,7 @@ return return ..() -/obj/effect/proc_holder/spell/shapeshift/bats +/datum/spell/shapeshift/bats name = "Bat Form" desc = "Take on the shape of a swarm of bats." invocation = "none" @@ -103,7 +103,7 @@ current_casters = list() possible_shapes = list(/mob/living/simple_animal/hostile/scarybat/adminvampire) -/obj/effect/proc_holder/spell/shapeshift/hellhound +/datum/spell/shapeshift/hellhound name = "Lesser Hellhound Form" desc = "Take on the shape of a Hellhound." invocation = "none" @@ -117,7 +117,7 @@ current_casters = list() possible_shapes = list(/mob/living/simple_animal/hostile/hellhound) -/obj/effect/proc_holder/spell/shapeshift/hellhound/greater +/datum/spell/shapeshift/hellhound/greater name = "Greater Hellhound Form" shapeshift_type = /mob/living/simple_animal/hostile/hellhound/greater current_shapes = list(/mob/living/simple_animal/hostile/hellhound/greater) diff --git a/code/datums/spells/spacetime_dist.dm b/code/datums/spells/spacetime_dist.dm index 07635e89b910..4070c7a73405 100644 --- a/code/datums/spells/spacetime_dist.dm +++ b/code/datums/spells/spacetime_dist.dm @@ -1,5 +1,5 @@ // This could probably be an aoe spell but it's a little cursed, so I'm not touching it -/obj/effect/proc_holder/spell/spacetime_dist +/datum/spell/spacetime_dist name = "Spacetime Distortion" desc = "Entangle the strings of space-time in an area around you, \ randomizing the layout and making proper movement impossible. The strings vibrate... \ @@ -25,23 +25,23 @@ /// A lazylist of all scramble effects this spell has created. var/list/effects -/obj/effect/proc_holder/spell/spacetime_dist/Destroy() +/datum/spell/spacetime_dist/Destroy() QDEL_LIST_CONTENTS(effects) return ..() -/obj/effect/proc_holder/spell/spacetime_dist/create_new_targeting() +/datum/spell/spacetime_dist/create_new_targeting() var/datum/spell_targeting/spiral/targeting = new() targeting.range = scramble_radius + 3 * spell_level return targeting -/obj/effect/proc_holder/spell/spacetime_dist/on_purchase_upgrade() +/datum/spell/spacetime_dist/on_purchase_upgrade() . = ..() targeting = create_new_targeting() -/obj/effect/proc_holder/spell/spacetime_dist/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/user = usr) +/datum/spell/spacetime_dist/cast_check(charge_check = TRUE, start_recharge = TRUE, mob/user = usr) return ..() && ready -/obj/effect/proc_holder/spell/spacetime_dist/cast(list/targets, mob/user = usr) +/datum/spell/spacetime_dist/cast(list/targets, mob/user = usr) . = ..() var/list/turf/to_switcharoo = targets if(!length(to_switcharoo)) @@ -64,12 +64,12 @@ effects += effect_b -/obj/effect/proc_holder/spell/spacetime_dist/after_cast(list/targets, mob/user) +/datum/spell/spacetime_dist/after_cast(list/targets, mob/user) . = ..() addtimer(CALLBACK(src, PROC_REF(clean_turfs)), duration) /// Callback which cleans up our effects list after the duration expires. -/obj/effect/proc_holder/spell/spacetime_dist/proc/clean_turfs() +/datum/spell/spacetime_dist/proc/clean_turfs() QDEL_LIST_CONTENTS(effects) ready = TRUE diff --git a/code/datums/spells/summon_supermatter.dm b/code/datums/spells/summon_supermatter.dm index bfda8c5d18d8..64ed0cfee858 100644 --- a/code/datums/spells/summon_supermatter.dm +++ b/code/datums/spells/summon_supermatter.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/aoe/conjure/summon_supermatter +/datum/spell/aoe/conjure/summon_supermatter name = "Summon Supermatter Crystal" desc = "Summons an active supermatter crystal. Imbues you with some supermatter, giving you resistance to it's hallucinations and radiation immunity." base_cooldown = 5 MINUTES @@ -8,7 +8,7 @@ summon_amt = 1 aoe_range = 0 -/obj/effect/proc_holder/spell/aoe/conjure/summon_supermatter/cast(list/targets, mob/living/user = usr) +/datum/spell/aoe/conjure/summon_supermatter/cast(list/targets, mob/living/user = usr) var/list/summoned_objects = ..() for(var/obj/machinery/atmospherics/supermatter_crystal/our_crystal in summoned_objects) addtimer(CALLBACK(our_crystal, TYPE_PROC_REF(/obj/machinery/atmospherics/supermatter_crystal, manual_start), 3000), 3 SECONDS) diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index 9ce1d514d2fb..d7b0cf278fab 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/summonitem +/datum/spell/summonitem name = "Instant Summons" desc = "This spell can be used to recall a previously marked item to your hand from anywhere in the universe." school = "transmutation" @@ -14,10 +14,10 @@ var/static/list/blacklisted_summons = list(/obj/machinery/computer/cryopod = TRUE, /obj/machinery/atmospherics = TRUE, /obj/structure/disposalholder = TRUE, /obj/machinery/disposal = TRUE) action_icon_state = "summons" -/obj/effect/proc_holder/spell/summonitem/create_new_targeting() +/datum/spell/summonitem/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/summonitem/cast(list/targets, mob/user = usr) +/datum/spell/summonitem/cast(list/targets, mob/user = usr) for(var/mob/living/target in targets) var/list/hand_items = list(target.get_active_hand(),target.get_inactive_hand()) var/butterfingers = FALSE diff --git a/code/datums/spells/touch_attacks.dm b/code/datums/spells/touch_attacks.dm index 611ab28fc487..948cfe80ef89 100644 --- a/code/datums/spells/touch_attacks.dm +++ b/code/datums/spells/touch_attacks.dm @@ -1,19 +1,19 @@ -/obj/effect/proc_holder/spell/touch +/datum/spell/touch var/hand_path = /obj/item/melee/touch_attack var/obj/item/melee/touch_attack/attached_hand = null var/on_remove_message = TRUE invocation_type = "none" //you scream on connecting, not summoning -/obj/effect/proc_holder/spell/touch/create_new_targeting() +/datum/spell/touch/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/touch/Click(mob/user = usr) +/datum/spell/touch/Click(mob/user = usr) if(attached_hand) discharge_hand(user, TRUE) return FALSE charge_hand(user) -/obj/effect/proc_holder/spell/touch/proc/charge_hand(mob/living/carbon/user) +/datum/spell/touch/proc/charge_hand(mob/living/carbon/user) var/hand_handled = 1 attached_hand = new hand_path(src) RegisterSignal(user, COMSIG_MOB_WILLINGLY_DROP, PROC_REF(discharge_hand)) @@ -36,7 +36,7 @@ to_chat(user, "You channel the power of the spell to your hand.") return 1 -/obj/effect/proc_holder/spell/touch/proc/discharge_hand(atom/target, any = FALSE) +/datum/spell/touch/proc/discharge_hand(atom/target, any = FALSE) SIGNAL_HANDLER var/mob/living/carbon/user = action.owner if(!istype(attached_hand)) @@ -48,7 +48,7 @@ to_chat(user, "You draw the power out of your hand.") -/obj/effect/proc_holder/spell/touch/disintegrate +/datum/spell/touch/disintegrate name = "Disintegrate" desc = "This spell charges your hand with vile energy that can be used to violently explode victims." hand_path = /obj/item/melee/touch_attack/disintegrate @@ -60,7 +60,7 @@ action_icon_state = "gib" -/obj/effect/proc_holder/spell/touch/flesh_to_stone +/datum/spell/touch/flesh_to_stone name = "Flesh to Stone" desc = "This spell charges your hand with the power to turn victims into inert statues for a long period of time." hand_path = /obj/item/melee/touch_attack/fleshtostone diff --git a/code/datums/spells/trigger.dm b/code/datums/spells/trigger.dm deleted file mode 100644 index 6737afac9532..000000000000 --- a/code/datums/spells/trigger.dm +++ /dev/null @@ -1,28 +0,0 @@ -/obj/effect/proc_holder/spell/trigger - desc = "This spell triggers another spell or a few." - - var/list/linked_spells = list() //those are just referenced by the trigger spell and are unaffected by it directly - var/list/starting_spells = list() //those are added on New() to contents from default spells and are deleted when the trigger spell is deleted to prevent memory leaks - -/obj/effect/proc_holder/spell/trigger/New() - ..() - - for(var/spell in starting_spells) - var/spell_to_add = text2path(spell) - new spell_to_add(src) //should result in adding to contents, needs testing - -/obj/effect/proc_holder/spell/trigger/Destroy() - for(var/spell in contents) - qdel(spell) - linked_spells = null - starting_spells = null - return ..() - -/obj/effect/proc_holder/spell/trigger/cast(list/targets, mob/user = usr) - for(var/mob/living/target in targets) - for(var/obj/effect/proc_holder/spell/spell in contents) - spell.perform(list(target), 0, user = user) - for(var/obj/effect/proc_holder/spell/spell in linked_spells) - spell.perform(list(target), 0, user = user) - - return diff --git a/code/datums/spells/turf_teleport.dm b/code/datums/spells/turf_teleport.dm index 4cbe53e51ca6..936d4c3fda9c 100644 --- a/code/datums/spells/turf_teleport.dm +++ b/code/datums/spells/turf_teleport.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/turf_teleport +/datum/spell/turf_teleport name = "Turf Teleport" desc = "This spell teleports the target to the turf in range." nonabstract_req = TRUE @@ -14,12 +14,12 @@ var/sound1 = 'sound/weapons/zapbang.ogg' var/sound2 = 'sound/weapons/zapbang.ogg' -/obj/effect/proc_holder/spell/turf_teleport/create_new_targeting() +/datum/spell/turf_teleport/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/turf_teleport/cast(list/targets,mob/living/user = usr) +/datum/spell/turf_teleport/cast(list/targets,mob/living/user = usr) if(sound1) - playsound(get_turf(user), sound1, 50,1) + playsound(get_turf(user), sound1, 50, TRUE) for(var/mob/living/target in targets) var/list/turfs = new/list() diff --git a/code/datums/spells/wizard_spells.dm b/code/datums/spells/wizard_spells.dm index c39d4742f348..5317e92dff56 100644 --- a/code/datums/spells/wizard_spells.dm +++ b/code/datums/spells/wizard_spells.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/projectile/magic_missile +/datum/spell/projectile/magic_missile name = "Magic Missile" desc = "This spell fires several, slow moving, magic projectiles at nearby targets." @@ -12,7 +12,7 @@ proj_icon_state = "magicm" proj_name = "a magic missile" proj_lingering = 1 - proj_type = "/obj/effect/proc_holder/spell/inflict_handler/magic_missile" + proj_type = /obj/item/projectile/magic/magic_missile proj_lifespan = 20 proj_step_delay = 2 @@ -25,33 +25,33 @@ sound = 'sound/magic/magic_missile.ogg' -/obj/effect/proc_holder/spell/projectile/magic_missile/create_new_targeting() +/datum/spell/projectile/magic_missile/create_new_targeting() var/datum/spell_targeting/targeted/T = new() T.allowed_type = /mob/living T.max_targets = INFINITY return T -/obj/effect/proc_holder/spell/inflict_handler/magic_missile - amt_weakened = 6 SECONDS - sound = 'sound/magic/mm_hit.ogg' - +/obj/item/projectile/magic/magic_missile + name = "Magic Missile" + hitsound = 'sound/magic/mm_hit.ogg' + weaken = 6 SECONDS -/obj/effect/proc_holder/spell/projectile/honk_missile +/datum/spell/projectile/honk_missile name = "Honk Missile" desc = "This spell fires several, slow moving, magic bikehorns at nearby targets." school = "evocation" - base_cooldown = 60 + base_cooldown = 6 SECONDS clothes_req = FALSE invocation = "HONK GY AMA" invocation_type = "shout" - cooldown_min = 60 //35 deciseconds reduction per rank + cooldown_min = 6 SECONDS proj_icon = 'icons/obj/items.dmi' proj_icon_state = "bike_horn" proj_name = "A bike horn" proj_lingering = 1 - proj_type = "/obj/effect/proc_holder/spell/inflict_handler/honk_missile" + proj_type = /obj/item/projectile/magic/magic_missile/honk_missile proj_lifespan = 20 proj_step_delay = 5 @@ -65,25 +65,25 @@ sound = 'sound/items/bikehorn.ogg' -/obj/effect/proc_holder/spell/projectile/honk_missile/create_new_targeting() +/datum/spell/projectile/honk_missile/create_new_targeting() var/datum/spell_targeting/targeted/T = new() T.allowed_type = /mob/living T.max_targets = INFINITY return T -/obj/effect/proc_holder/spell/inflict_handler/honk_missile - amt_weakened = 6 SECONDS - sound = 'sound/items/bikehorn.ogg' +/obj/item/projectile/magic/magic_missile/honk_missile + name = "Funny Missile" + hitsound = 'sound/items/bikehorn.ogg' -/obj/effect/proc_holder/spell/noclothes +/datum/spell/noclothes name = "No Clothes" desc = "This always-on spell allows you to cast magic without your garments." action_icon_state = "no_clothes" -/obj/effect/proc_holder/spell/noclothes/create_new_targeting() +/datum/spell/noclothes/create_new_targeting() return new /datum/spell_targeting/self // Dummy value -/obj/effect/proc_holder/spell/genetic/mutate +/datum/spell/genetic/mutate name = "Mutate" desc = "This spell causes you to turn into a hulk and gain laser vision for a short while." @@ -102,14 +102,14 @@ action_icon_state = "mutate" sound = 'sound/magic/mutate.ogg' -/obj/effect/proc_holder/spell/genetic/mutate/Initialize(mapload) - . = ..() +/datum/spell/genetic/mutate/New() + ..() mutations = list(GLOB.hulkblock) -/obj/effect/proc_holder/spell/genetic/mutate/create_new_targeting() +/datum/spell/genetic/mutate/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/smoke +/datum/spell/smoke name = "Smoke" desc = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." @@ -125,13 +125,13 @@ action_icon_state = "smoke" -/obj/effect/proc_holder/spell/smoke/create_new_targeting() +/datum/spell/smoke/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/emplosion/disable_tech +/datum/spell/emplosion/disable_tech name = "Disable Tech" desc = "This spell disables all weapons, cameras and most other technology in range." - base_cooldown = 400 + base_cooldown = 40 SECONDS clothes_req = TRUE invocation = "NEC CANTIO" invocation_type = "shout" @@ -142,7 +142,7 @@ sound = 'sound/magic/disable_tech.ogg' -/obj/effect/proc_holder/spell/turf_teleport/blink +/datum/spell/turf_teleport/blink name = "Blink" desc = "This spell randomly teleports you a short distance." @@ -167,10 +167,10 @@ sound1 = 'sound/magic/blink.ogg' sound2 = 'sound/magic/blink.ogg' -/obj/effect/proc_holder/spell/turf_teleport/blink/create_new_targeting() +/datum/spell/turf_teleport/blink/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/area_teleport/teleport +/datum/spell/area_teleport/teleport name = "Teleport" desc = "This spell teleports you to a type of area of your selection." @@ -187,10 +187,10 @@ sound1 = 'sound/magic/teleport_diss.ogg' sound2 = 'sound/magic/teleport_app.ogg' -/obj/effect/proc_holder/spell/area_teleport/teleport/create_new_targeting() +/datum/spell/area_teleport/teleport/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/return_to_teacher +/datum/spell/return_to_teacher name = "Return to Teacher" desc = "This spell teleports you back to your teacher." @@ -204,16 +204,16 @@ action_icon_state = "spell_teleport" var/datum/mind/teacher -/obj/effect/proc_holder/spell/return_to_teacher/create_new_targeting() +/datum/spell/return_to_teacher/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/return_to_teacher/cast(list/targets, mob/living/user = usr) +/datum/spell/return_to_teacher/cast(list/targets, mob/living/user = usr) if(!(teacher && teacher.current)) to_chat(user, "The link to your teacher is broken!") return do_teleport(user, teacher.current, 1, sound_in = 'sound/magic/blink.ogg', sound_out = 'sound/magic/blink.ogg', safe_turf_pick = TRUE) -/obj/effect/proc_holder/spell/forcewall +/datum/spell/forcewall name = "Force Wall" desc = "This spell creates a 3 tile wide unbreakable wall that only you can pass through, and does not need wizard garb. Lasts 30 seconds." @@ -227,10 +227,10 @@ cooldown_min = 5 SECONDS //25 deciseconds reduction per rank var/wall_type = /obj/effect/forcefield/wizard -/obj/effect/proc_holder/spell/forcewall/create_new_targeting() +/datum/spell/forcewall/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/forcewall/cast(list/targets, mob/user = usr) +/datum/spell/forcewall/cast(list/targets, mob/user = usr) new wall_type(get_turf(user), user) if(user.dir == SOUTH || user.dir == NORTH) new wall_type(get_step(user, EAST), user) @@ -239,10 +239,10 @@ new wall_type(get_step(user, NORTH), user) new wall_type(get_step(user, SOUTH), user) -/obj/effect/proc_holder/spell/aoe/conjure/timestop +/datum/spell/aoe/conjure/timestop name = "Stop Time" desc = "This spell stops time for everyone except for you, allowing you to move freely while your enemies and even projectiles are frozen." - base_cooldown = 500 + base_cooldown = 50 SECONDS clothes_req = TRUE invocation = "TOKI WO TOMARE" invocation_type = "shout" @@ -255,7 +255,7 @@ aoe_range = 0 -/obj/effect/proc_holder/spell/aoe/conjure/carp +/datum/spell/aoe/conjure/carp name = "Summon Carp" desc = "This spell conjures a simple carp." @@ -270,7 +270,7 @@ cast_sound = 'sound/magic/summon_karp.ogg' aoe_range = 1 -/obj/effect/proc_holder/spell/aoe/conjure/construct +/datum/spell/aoe/conjure/construct name = "Artificer" desc = "This spell conjures a construct which may be controlled by Shades" @@ -286,7 +286,7 @@ cast_sound = 'sound/magic/summonitems_generic.ogg' aoe_range = 0 -/obj/effect/proc_holder/spell/aoe/conjure/creature +/datum/spell/aoe/conjure/creature name = "Summon Creature Swarm" desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth" @@ -301,10 +301,9 @@ cast_sound = 'sound/magic/summonitems_generic.ogg' aoe_range = 3 -/obj/effect/proc_holder/spell/trigger/blind +/datum/spell/genetic/blind name = "Blind" desc = "This spell temporarily blinds a single person and does not require wizard garb." - school = "transmutation" base_cooldown = 10 SECONDS clothes_req = FALSE @@ -312,30 +311,22 @@ invocation_type = "whisper" message = "Your eyes cry out in pain!" cooldown_min = 2 SECONDS + traits = list(TRAIT_BLIND) - starting_spells = list("/obj/effect/proc_holder/spell/inflict_handler/blind","/obj/effect/proc_holder/spell/genetic/blind") - - action_icon_state = "blind" + duration = 30 SECONDS + sound = 'sound/magic/blind.ogg' -/obj/effect/proc_holder/spell/trigger/blind/create_new_targeting() +/datum/spell/genetic/blind/create_new_targeting() var/datum/spell_targeting/click/C = new() C.allowed_type = /mob/living return C -/obj/effect/proc_holder/spell/inflict_handler/blind - amt_eye_blind = 10 - amt_eye_blurry = 20 - sound = 'sound/magic/blind.ogg' - -/obj/effect/proc_holder/spell/genetic/blind - traits = list(TRAIT_BLIND) - duration = 300 - sound = 'sound/magic/blind.ogg' - -/obj/effect/proc_holder/spell/genetic/blind/create_new_targeting() - return new /datum/spell_targeting/self // Dummy value since it is never used by an user directly +/datum/spell/genetic/blind/do_additional_effects(mob/living/target) + target.EyeBlurry(20 SECONDS) + target.EyeBlind(10 SECONDS) + SEND_SOUND(target, sound('sound/magic/blind.ogg')) -/obj/effect/proc_holder/spell/fireball +/datum/spell/fireball name = "Fireball" desc = "This spell fires a fireball at a target and does not require wizard garb." @@ -355,21 +346,21 @@ active = FALSE -/obj/effect/proc_holder/spell/fireball/apprentice +/datum/spell/fireball/apprentice centcom_cancast = FALSE -/obj/effect/proc_holder/spell/fireball/create_new_targeting() +/datum/spell/fireball/create_new_targeting() var/datum/spell_targeting/clicked_atom/external/C = new() C.range = 20 return C -/obj/effect/proc_holder/spell/fireball/update_icon_state() +/datum/spell/fireball/update_spell_icon() if(!action) return action.button_icon_state = "fireball[active]" action.UpdateButtons() -/obj/effect/proc_holder/spell/fireball/cast(list/targets, mob/living/user = usr) +/datum/spell/fireball/cast(list/targets, mob/living/user = usr) var/target = targets[1] //There is only ever one target for fireball var/turf/T = user.loc var/turf/U = get_step(user, user.dir) // Get the tile infront of the move, based on their direction @@ -386,7 +377,7 @@ return TRUE -/obj/effect/proc_holder/spell/fireball/toolbox +/datum/spell/fireball/toolbox name = "Homing Toolbox" desc = "This spell summons and throws a magical homing toolbox at your opponent." sound = 'sound/weapons/smash.ogg' @@ -396,7 +387,7 @@ selection_activated_message = "You prepare to cast your homing toolbox! Left-click to cast at a target!" selection_deactivated_message = "You unrobust your toolbox...for now." -/obj/effect/proc_holder/spell/fireball/homing +/datum/spell/fireball/homing name = "Greater Homing Fireball" desc = "This spell fires a strong homing fireball at a target." invocation = "ZI-ONI SOMA" @@ -405,10 +396,10 @@ selection_activated_message = "You prepare to cast your greater homing fireball spell! Left-click to cast at a target!" base_cooldown = 6 SECONDS -/obj/effect/proc_holder/spell/aoe/repulse +/datum/spell/aoe/repulse name = "Repulse" desc = "This spell throws everything around the user away." - base_cooldown = 400 + base_cooldown = 40 SECONDS clothes_req = TRUE invocation = "GITTAH WEIGH" invocation_type = "shout" @@ -419,12 +410,12 @@ action_icon_state = "repulse" aoe_range = 5 -/obj/effect/proc_holder/spell/aoe/repulse/create_new_targeting() +/datum/spell/aoe/repulse/create_new_targeting() var/datum/spell_targeting/aoe/turf/targeting = new() targeting.range = aoe_range return targeting -/obj/effect/proc_holder/spell/aoe/repulse/cast(list/targets, mob/user = usr, stun_amt = 4 SECONDS) +/datum/spell/aoe/repulse/cast(list/targets, mob/user = usr, stun_amt = 4 SECONDS) var/list/thrownatoms = list() var/atom/throwtarget var/distfromcaster @@ -455,24 +446,24 @@ spawn(0) AM.throw_at(throwtarget, ((clamp((maxthrow - (clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1)//So stuff gets tossed around at the same time. -/obj/effect/proc_holder/spell/sacred_flame +/datum/spell/sacred_flame name = "Sacred Flame" desc = "Makes everyone around you more flammable, and lights yourself on fire." - base_cooldown = 60 + base_cooldown = 6 SECONDS clothes_req = FALSE invocation = "FI'RAN DADISKO" invocation_type = "shout" action_icon_state = "sacredflame" sound = 'sound/magic/fireball.ogg' -/obj/effect/proc_holder/spell/sacred_flame/create_new_targeting() +/datum/spell/sacred_flame/create_new_targeting() var/datum/spell_targeting/aoe/A = new() A.include_user = TRUE A.range = 6 A.allowed_type = /mob/living return A -/obj/effect/proc_holder/spell/sacred_flame/cast(list/targets, mob/user = usr) +/datum/spell/sacred_flame/cast(list/targets, mob/user = usr) for(var/mob/living/L in targets) L.adjust_fire_stacks(20) if(isliving(user)) diff --git a/code/game/dna/mutations/disabilities.dm b/code/game/dna/mutations/disabilities.dm index 60c4e85bff4e..f6b570d6f4db 100644 --- a/code/game/dna/mutations/disabilities.dm +++ b/code/game/dna/mutations/disabilities.dm @@ -481,13 +481,13 @@ desc = "The subject becomes able to convert excess cellular energy into thermal energy." activation_messages = list("You suddenly feel rather hot.") deactivation_messages = list("You no longer feel uncomfortably hot.") - spelltype = /obj/effect/proc_holder/spell/immolate + spelltype = /datum/spell/immolate /datum/mutation/grant_spell/immolate/New() ..() block = GLOB.immolateblock -/obj/effect/proc_holder/spell/immolate +/datum/spell/immolate name = "Incendiary Mitochondria" desc = "The subject becomes able to convert excess cellular energy into thermal energy." panel = "Abilities" @@ -501,10 +501,10 @@ action_icon_state = "genetic_incendiary" -/obj/effect/proc_holder/spell/immolate/create_new_targeting() +/datum/spell/immolate/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/immolate/cast(list/targets, mob/living/user = usr) +/datum/spell/immolate/cast(list/targets, mob/living/user = usr) var/mob/living/carbon/L = user L.adjust_fire_stacks(0.5) L.visible_message("[L.name] suddenly bursts into flames!") diff --git a/code/game/dna/mutations/mutation_powers.dm b/code/game/dna/mutations/mutation_powers.dm index d142685d78f7..79fe7d0fa996 100644 --- a/code/game/dna/mutations/mutation_powers.dm +++ b/code/game/dna/mutations/mutation_powers.dm @@ -247,7 +247,7 @@ ///////////////////////////////////////////////////////////////////////////////////////// /datum/mutation/grant_spell - var/obj/effect/proc_holder/spell/spelltype + var/datum/spell/spelltype /datum/mutation/grant_spell/activate(mob/M) M.AddSpell(new spelltype(null)) @@ -255,7 +255,7 @@ return TRUE /datum/mutation/grant_spell/deactivate(mob/M) - for(var/obj/effect/proc_holder/spell/S in M.mob_spell_list) + for(var/datum/spell/S in M.mob_spell_list) if(istype(S, spelltype)) M.RemoveSpell(S) ..() @@ -268,13 +268,13 @@ activation_messages = list("You notice a strange cold tingle in your fingertips.") deactivation_messages = list("Your fingers feel warmer.") instability = GENE_INSTABILITY_MODERATE - spelltype = /obj/effect/proc_holder/spell/cryokinesis + spelltype = /datum/spell/cryokinesis /datum/mutation/grant_spell/cryo/New() ..() block = GLOB.cryoblock -/obj/effect/proc_holder/spell/cryokinesis +/datum/spell/cryokinesis name = "Cryokinesis" desc = "Drops the bodytemperature of another person." panel = "Abilities" @@ -291,7 +291,7 @@ action_icon_state = "genetic_cryo" -/obj/effect/proc_holder/spell/cryokinesis/create_new_targeting() +/datum/spell/cryokinesis/create_new_targeting() var/datum/spell_targeting/click/T = new() T.allowed_type = /mob/living/carbon T.click_radius = 0 @@ -300,7 +300,7 @@ T.include_user = TRUE return T -/obj/effect/proc_holder/spell/cryokinesis/cast(list/targets, mob/user = usr) +/datum/spell/cryokinesis/cast(list/targets, mob/user = usr) var/mob/living/carbon/C = targets[1] @@ -339,13 +339,13 @@ deactivation_messages = list("You don't feel quite so hungry anymore.") instability = GENE_INSTABILITY_MODERATE - spelltype=/obj/effect/proc_holder/spell/eat + spelltype=/datum/spell/eat /datum/mutation/grant_spell/mattereater/New() ..() block = GLOB.eatblock -/obj/effect/proc_holder/spell/eat +/datum/spell/eat name = "Eat" desc = "Eat just about anything!" panel = "Abilities" @@ -358,10 +358,10 @@ action_icon_state = "genetic_eat" -/obj/effect/proc_holder/spell/eat/create_new_targeting() +/datum/spell/eat/create_new_targeting() return new /datum/spell_targeting/matter_eater -/obj/effect/proc_holder/spell/eat/can_cast(mob/user = usr, charge_check = TRUE, show_message = FALSE) +/datum/spell/eat/can_cast(mob/user = usr, charge_check = TRUE, show_message = FALSE) . = ..() if(!.) return @@ -374,7 +374,7 @@ can_eat = FALSE return can_eat -/obj/effect/proc_holder/spell/eat/proc/doHeal(mob/user) +/datum/spell/eat/proc/doHeal(mob/user) if(ishuman(user)) var/mob/living/carbon/human/H = user for(var/name in H.bodyparts_by_name) @@ -390,7 +390,7 @@ -/obj/effect/proc_holder/spell/eat/cast(list/targets, mob/user = usr) +/datum/spell/eat/cast(list/targets, mob/user = usr) if(!targets.len) to_chat(user, "No target found in range.") return @@ -462,13 +462,13 @@ deactivation_messages = list("Your leg muscles shrink back to normal.") instability = GENE_INSTABILITY_MODERATE - spelltype =/obj/effect/proc_holder/spell/leap + spelltype =/datum/spell/leap /datum/mutation/grant_spell/jumpy/New() ..() block = GLOB.jumpblock -/obj/effect/proc_holder/spell/leap +/datum/spell/leap name = "Jump" desc = "Leap great distances!" panel = "Abilities" @@ -481,10 +481,10 @@ action_icon_state = "genetic_jump" -/obj/effect/proc_holder/spell/leap/create_new_targeting() +/datum/spell/leap/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/leap/cast(list/targets, mob/living/user = usr) +/datum/spell/leap/cast(list/targets, mob/living/user = usr) var/failure = FALSE if(ismob(user.loc) || IS_HORIZONTAL(user) || user.IsStunned() || user.buckled || user.stat) to_chat(user, "You can't jump right now!") @@ -551,7 +551,7 @@ name = "Polymorphism" desc = "Enables the subject to reconfigure their appearance to mimic that of others." - spelltype =/obj/effect/proc_holder/spell/polymorph + spelltype =/datum/spell/polymorph //cooldown = 1800 activation_messages = list("You don't feel entirely like yourself somehow.") deactivation_messages = list("You feel secure in your identity.") @@ -561,7 +561,7 @@ ..() block = GLOB.polymorphblock -/obj/effect/proc_holder/spell/polymorph +/datum/spell/polymorph name = "Polymorph" desc = "Mimic the appearance of others!" panel = "Abilities" @@ -577,7 +577,7 @@ action_icon_state = "genetic_poly" -/obj/effect/proc_holder/spell/polymorph/create_new_targeting() +/datum/spell/polymorph/create_new_targeting() var/datum/spell_targeting/click/T = new() T.try_auto_target = FALSE T.click_radius = -1 @@ -585,7 +585,7 @@ T.selection_type = SPELL_SELECTION_RANGE return T -/obj/effect/proc_holder/spell/polymorph/cast(list/targets, mob/user = usr) +/datum/spell/polymorph/cast(list/targets, mob/user = usr) var/mob/living/carbon/human/target = targets[1] user.visible_message("[user]'s body shifts and contorts.") @@ -605,7 +605,7 @@ name = "Empathic Thought" desc = "The subject becomes able to read the minds of others for certain information." - spelltype = /obj/effect/proc_holder/spell/empath + spelltype = /datum/spell/empath activation_messages = list("You suddenly notice more about others than you did before.") deactivation_messages = list("You no longer feel able to sense intentions.") instability = GENE_INSTABILITY_MINOR @@ -614,10 +614,10 @@ ..() block = GLOB.empathblock -/obj/effect/proc_holder/spell/empath +/datum/spell/empath name = "Read Mind" desc = "Read the minds of others for information." - base_cooldown = 180 + base_cooldown = 18 SECONDS clothes_req = FALSE human_req = TRUE stat_allowed = CONSCIOUS @@ -625,13 +625,13 @@ action_icon_state = "genetic_empath" -/obj/effect/proc_holder/spell/empath/create_new_targeting() +/datum/spell/empath/create_new_targeting() var/datum/spell_targeting/targeted/T = new() T.allowed_type = /mob/living/carbon T.selection_type = SPELL_SELECTION_RANGE return T -/obj/effect/proc_holder/spell/empath/cast(list/targets, mob/user = usr) +/datum/spell/empath/cast(list/targets, mob/user = usr) for(var/mob/living/carbon/M in targets) if(!iscarbon(M)) to_chat(user, "You may only use this on other organic beings.") @@ -714,7 +714,7 @@ /datum/mutation/grant_spell/morph name = "Morphism" desc = "Enables the subject to reconfigure their appearance to that of any human." - spelltype =/obj/effect/proc_holder/spell/morph + spelltype =/datum/spell/morph activation_messages = list("Your body feels like it can alter its appearance.") deactivation_messages = list("Your body doesn't feel capable of altering its appearance.") instability = GENE_INSTABILITY_MODERATE @@ -723,7 +723,7 @@ ..() block = GLOB.morphblock -/obj/effect/proc_holder/spell/morph +/datum/spell/morph name = "Morph" desc = "Mimic the appearance of your choice!" panel = "Abilities" @@ -735,10 +735,10 @@ action_icon_state = "genetic_morph" -/obj/effect/proc_holder/spell/morph/create_new_targeting() +/datum/spell/morph/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/morph/cast(list/targets, mob/user = usr) +/datum/spell/morph/cast(list/targets, mob/user = usr) if(!ishuman(user)) return @@ -897,7 +897,7 @@ deactivation_messages = list("You no longer feel you can project your thoughts.") instability = GENE_INSTABILITY_MINOR - spelltype =/obj/effect/proc_holder/spell/remotetalk + spelltype =/datum/spell/remotetalk /datum/mutation/grant_spell/remotetalk/New() ..() @@ -905,15 +905,15 @@ /datum/mutation/grant_spell/remotetalk/activate(mob/living/M) ..() - M.AddSpell(new /obj/effect/proc_holder/spell/mindscan(null)) + M.AddSpell(new /datum/spell/mindscan(null)) /datum/mutation/grant_spell/remotetalk/deactivate(mob/user) ..() - for(var/obj/effect/proc_holder/spell/S in user.mob_spell_list) - if(istype(S, /obj/effect/proc_holder/spell/mindscan)) + for(var/datum/spell/S in user.mob_spell_list) + if(istype(S, /datum/spell/mindscan)) user.RemoveSpell(S) -/obj/effect/proc_holder/spell/remotetalk +/datum/spell/remotetalk name = "Project Mind" desc = "Make people understand your thoughts!" base_cooldown = 0 @@ -924,10 +924,10 @@ action_icon_state = "genetic_project" -/obj/effect/proc_holder/spell/remotetalk/create_new_targeting() +/datum/spell/remotetalk/create_new_targeting() return new /datum/spell_targeting/telepathic -/obj/effect/proc_holder/spell/remotetalk/cast(list/targets, mob/user = usr) +/datum/spell/remotetalk/cast(list/targets, mob/user = usr) if(!ishuman(user)) return if(user.mind?.miming) // Dont let mimes telepathically talk @@ -949,7 +949,7 @@ for(var/mob/dead/observer/G in GLOB.player_list) G.show_message("Telepathic message from [user] ([ghost_follow_link(user, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say]") -/obj/effect/proc_holder/spell/mindscan +/datum/spell/mindscan name = "Scan Mind" desc = "Offer people a chance to share their thoughts!" base_cooldown = 0 @@ -959,10 +959,10 @@ action_icon_state = "genetic_mindscan" var/list/available_targets = list() -/obj/effect/proc_holder/spell/mindscan/create_new_targeting() +/datum/spell/mindscan/create_new_targeting() return new /datum/spell_targeting/telepathic -/obj/effect/proc_holder/spell/mindscan/cast(list/targets, mob/user = usr) +/datum/spell/mindscan/cast(list/targets, mob/user = usr) if(!ishuman(user)) return for(var/mob/living/target in targets) @@ -974,13 +974,13 @@ available_targets += target addtimer(CALLBACK(src, PROC_REF(removeAvailability), target), 100) -/obj/effect/proc_holder/spell/mindscan/proc/removeAvailability(mob/living/target) +/datum/spell/mindscan/proc/removeAvailability(mob/living/target) if(target in available_targets) available_targets -= target if(!(target in available_targets)) target.show_message("You feel the sensation fade...") -/obj/effect/proc_holder/spell/mindscan/Topic(href, href_list) +/datum/spell/mindscan/Topic(href, href_list) var/mob/living/user if(href_list["user"]) user = locateUID(href_list["user"]) @@ -1005,7 +1005,7 @@ for(var/mob/dead/observer/G in GLOB.player_list) G.show_message("Telepathic response from [target] ([ghost_follow_link(target, ghost=G)]) to [user] ([ghost_follow_link(user, ghost=G)]): [say]") -/obj/effect/proc_holder/spell/mindscan/Destroy() +/datum/spell/mindscan/Destroy() available_targets.Cut() return ..() @@ -1015,7 +1015,7 @@ deactivation_messages = list("Your mind can no longer can see things from afar.") instability = GENE_INSTABILITY_MINOR - spelltype =/obj/effect/proc_holder/spell/remoteview + spelltype =/datum/spell/remoteview /datum/mutation/grant_spell/remoteview/New() ..() @@ -1028,10 +1028,10 @@ H.remoteview_target = null H.reset_perspective() -/obj/effect/proc_holder/spell/remoteview +/datum/spell/remoteview name = "Remote View" desc = "Spy on people from any range!" - base_cooldown = 100 + base_cooldown = 10 SECONDS clothes_req = FALSE stat_allowed = CONSCIOUS @@ -1039,10 +1039,10 @@ action_icon_state = "genetic_view" -/obj/effect/proc_holder/spell/remoteview/create_new_targeting() +/datum/spell/remoteview/create_new_targeting() return new /datum/spell_targeting/remoteview -/obj/effect/proc_holder/spell/remoteview/cast(list/targets, mob/user = usr) +/datum/spell/remoteview/cast(list/targets, mob/user = usr) var/mob/living/carbon/human/H if(ishuman(user)) H = user diff --git a/code/game/gamemodes/cult/blood_magic.dm b/code/game/gamemodes/cult/blood_magic.dm index 47ca9460e583..357665e82d91 100644 --- a/code/game/gamemodes/cult/blood_magic.dm +++ b/code/game/gamemodes/cult/blood_magic.dm @@ -265,7 +265,7 @@ name = "Hallucinations" desc = "Gives hallucinations to a target at range. A silent and invisible spell." button_icon_state = "horror" - var/obj/effect/proc_holder/horror/PH + var/datum/spell/horror/PH charges = 4 /datum/action/innate/cult/blood_spell/horror/New() @@ -274,7 +274,7 @@ ..() /datum/action/innate/cult/blood_spell/horror/Destroy() - var/obj/effect/proc_holder/horror/destroy = PH + var/datum/spell/horror/destroy = PH . = ..() if(!QDELETED(destroy)) QDEL_NULL(destroy) @@ -283,24 +283,24 @@ PH.toggle(owner) //the important bit return TRUE -/obj/effect/proc_holder/horror +/datum/spell/horror active = FALSE ranged_mousepointer = 'icons/effects/cult_target.dmi' var/datum/action/innate/cult/blood_spell/attached_action -/obj/effect/proc_holder/horror/Destroy() +/datum/spell/horror/Destroy() var/datum/action/innate/cult/blood_spell/AA = attached_action . = ..() if(!QDELETED(AA)) QDEL_NULL(AA) -/obj/effect/proc_holder/horror/proc/toggle(mob/user) +/datum/spell/horror/proc/toggle(mob/user) if(active) remove_ranged_ability(user, "You dispel the magic...") else add_ranged_ability(user, "You prepare to horrify a target...") -/obj/effect/proc_holder/horror/InterceptClickOn(mob/living/user, params, atom/target) +/datum/spell/horror/InterceptClickOn(mob/living/user, params, atom/target) if(..()) return if(ranged_ability_user.incapacitated() || !IS_CULTIST(user)) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 114bc2a24e5e..b399ca1bde46 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -4,117 +4,91 @@ // crit percent #define MALF_AI_ROLL_CRIT_CHANCE 5 -//The malf AI action subtype. All malf actions are subtypes of this. -/datum/action/innate/ai - name = "AI Action" +//The malf AI spell subtype. All malf actions are subtypes of this. +/datum/spell/ai_spell + name = "AI Spell" desc = "You aren't entirely sure what this does, but it's very beepy and boopy." - background_icon_state = "bg_tech_blue" - var/mob/living/silicon/ai/owner_AI //The owner AI, so we don't have to typecast every time + action_background_icon_state = "bg_tech_blue" + clothes_req = FALSE + base_cooldown = 0 var/uses //If we have multiple uses of the same power var/auto_use_uses = TRUE //If we automatically use up uses on each activation - var/cooldown_period //If applicable, the time in deciseconds we have to wait before using any more modules -/datum/action/innate/ai/Grant(mob/living/L) - . = ..() - if(!isAI(owner)) - WARNING("AI action [name] attempted to grant itself to non-AI mob [L.real_name] ([L.key])!") - qdel(src) - else - owner_AI = owner +/datum/spell/ai_spell/create_new_targeting() + return new /datum/spell_targeting/self -/datum/action/innate/ai/IsAvailable() +/datum/spell/ai_spell/can_cast(mob/living/silicon/ai/user, charge_check, show_message) . = ..() - if(owner_AI && owner_AI.malf_cooldown > world.time) + if(!.) return + if(!istype(user)) + stack_trace("A non ai ([user]) tried to cast an AI spell.") + user.RemoveSpell(src) + return FALSE -/datum/action/innate/ai/Trigger(left_click) +/datum/spell/ai_spell/after_cast(list/targets, mob/user) . = ..() if(auto_use_uses) - adjust_uses(-1) - if(cooldown_period) - owner_AI.malf_cooldown = world.time + cooldown_period + adjust_uses(-1, user) -/datum/action/innate/ai/proc/adjust_uses(amt, silent) +/datum/spell/ai_spell/proc/adjust_uses(amt, mob/living/silicon/ai/owner, silent) uses += amt if(!silent && uses) to_chat(owner, "[name] now has [uses] use[uses > 1 ? "s" : ""] remaining.") if(!uses) if(initial(uses) > 1) //no need to tell 'em if it was one-use anyway! to_chat(owner, "[name] has run out of uses!") - qdel(src) + owner.RemoveSpell(src) if(QDELETED(src) || uses) //Not sure if not having src here would cause a runtime, so it's here to be safe return desc = "[initial(desc)] It has [uses] use\s remaining." UpdateButtons() //Framework for ranged abilities that can have different effects by left-clicking stuff. -/datum/action/innate/ai/ranged +/datum/spell/ai_spell/ranged name = "Ranged AI Action" auto_use_uses = FALSE //This is so we can do the thing and disable/enable freely without having to constantly add uses - var/obj/effect/proc_holder/ranged_ai/linked_ability //The linked proc holder that contains the actual ability code - var/linked_ability_type //The path of our linked ability - -/datum/action/innate/ai/ranged/New() - if(!linked_ability_type) - WARNING("Ranged AI action [name] attempted to spawn without a linked ability!") - qdel(src) //uh oh! - return - linked_ability = new linked_ability_type() - linked_ability.attached_action = src - ..() + selection_activated_message = "Hello World!" + selection_deactivated_message = "Goodbye Cruel World!" -/datum/action/innate/ai/ranged/adjust_uses(amt, silent) +/datum/spell/ai_spell/ranged/adjust_uses(amt, mob/living/silicon/ai/owner, silent) uses += amt if(!silent && uses) to_chat(owner, "[name] now has [uses] use[uses > 1 ? "s" : ""] remaining.") if(!uses) if(initial(uses) > 1) //no need to tell 'em if it was one-use anyway! to_chat(owner, "[name] has run out of uses!") - Remove(owner) - QDEL_IN(src, 100) //let any active timers on us finish up - -/datum/action/innate/ai/ranged/Destroy() - QDEL_NULL(linked_ability) - return ..() - -/datum/action/innate/ai/ranged/Activate() - linked_ability.toggle(owner) - return TRUE - -//The actual ranged proc holder. -/obj/effect/proc_holder/ranged_ai - var/enable_text = "Hello World!" //Appears when the user activates the ability - var/disable_text = "Goodbye Cruel World!" //Context clues! - var/datum/action/innate/ai/ranged/attached_action + owner.mob_spell_list -= src + QDEL_IN(src, 10 SECONDS) //let any active timers on us finish up -/obj/effect/proc_holder/ranged_ai/proc/toggle(mob/user) - if(active) - remove_ranged_ability(user, disable_text) - else - add_ranged_ability(user, enable_text) +/datum/spell/ai_spell/ranged/create_new_targeting() + var/datum/spell_targeting/clicked_atom/external/C = new() + C.range = INFINITY + return C -/datum/action/innate/ai/choose_modules +/datum/spell/ai_spell/choose_modules name = "Choose Modules" desc = "Spend your processing time to gain a variety of different abilities." - button_icon_state = "choose_module" + action_icon_state = "choose_module" auto_use_uses = FALSE // This is an infinite ability. + create_attack_logs = FALSE -/datum/action/innate/ai/choose_modules/Trigger(left_click) +/datum/spell/ai_spell/choose_modules/cast(list/targets, mob/living/silicon/ai/user) . = ..() - owner_AI.malf_picker.use(owner_AI) + user.malf_picker.use(user) -/datum/action/innate/ai/return_to_core +/datum/spell/ai_spell/return_to_core name = "Return to Main Core" desc = "Leave the APC you are shunted to, and return to your core." - icon_icon = 'icons/obj/power.dmi' - button_icon_state = "apcemag" + action_icon = 'icons/obj/power.dmi' + action_icon_state = "apcemag" auto_use_uses = FALSE // Here just to prevent the "You have X uses remaining" from popping up. -/datum/action/innate/ai/return_to_core/Trigger(left_click) +/datum/spell/ai_spell/return_to_core/cast(list/targets, mob/living/silicon/ai/user) . = ..() - var/obj/machinery/power/apc/apc = owner_AI.loc + var/obj/machinery/power/apc/apc = user.loc if(!istype(apc)) // This shouldn't happen but here for safety. - to_chat(src, "You are already in your Main Core.") + to_chat(user, "You are already in your Main Core.") return apc.malfvacate() qdel(src) @@ -127,9 +101,9 @@ /datum/module_picker/New() possible_modules = list() - for(var/type in typesof(/datum/AI_Module)) + for(var/type in subtypesof(/datum/AI_Module)) var/datum/AI_Module/AM = new type - if((AM.power_type && AM.power_type != /datum/action/innate/ai) || AM.upgrade) + if(AM.power_type || AM.upgrade) possible_modules += AM /datum/module_picker/proc/use(mob/user) @@ -167,7 +141,7 @@ temp = "You cannot afford this module." break - var/datum/action/innate/ai/action = locate(AM.power_type) in A.actions + var/datum/spell/ai_spell/action = locate(AM.power_type) in A.mob_spell_list // Give the power and take away the money. if(AM.upgrade) //upgrade and upgrade() are separate, be careful! @@ -178,8 +152,8 @@ else if(AM.power_type) if(!action) //Unlocking for the first time - var/datum/action/AC = new AM.power_type - AC.Grant(A) + var/datum/spell/ai_spell/AC = new AM.power_type + A.AddSpell(AC) A.current_modules += new AM.type temp = AM.description if(AM.one_purchase) @@ -207,7 +181,7 @@ var/description = "" var/cost = 5 var/one_purchase = FALSE //If this module can only be purchased once. This always applies to upgrades, even if the variable is set to false. - var/power_type = /datum/action/innate/ai //If the module gives an active ability, use this. Mutually exclusive with upgrade. + var/power_type = /datum/spell/ai_spell //If the module gives an active ability, use this. Mutually exclusive with upgrade. var/upgrade //If the module gives a passive upgrade, use this. Mutually exclusive with power_type. var/unlock_text = "Hello World!" //Text shown when an ability is unlocked var/unlock_sound //Sound played when an ability is unlocked @@ -223,36 +197,39 @@ description = "Activate a weapon that will disintegrate all organic life on the station after a 450 second delay. Can only be used while on the station, will fail if your core is moved off station or destroyed." cost = 130 one_purchase = TRUE - power_type = /datum/action/innate/ai/nuke_station + power_type = /datum/spell/ai_spell/nuke_station unlock_text = "You slowly, carefully, establish a connection with the on-station self-destruct. You can now activate it at any time." unlock_sound = 'sound/items/timer.ogg' -/datum/action/innate/ai/nuke_station +/datum/spell/ai_spell/nuke_station name = "Doomsday Device" desc = "Activates the doomsday device. This is not reversible." - button_icon_state = "doomsday_device" + action_icon_state = "doomsday_device" auto_use_uses = FALSE + var/in_use -/datum/action/innate/ai/nuke_station/Activate() - var/turf/T = get_turf(owner) +/datum/spell/ai_spell/nuke_station/cast(list/targets, mob/living/silicon/ai/user) + var/turf/T = get_turf(user) if(!istype(T) || !is_station_level(T.z)) - to_chat(owner, "You cannot activate the doomsday device while off-station!") + to_chat(user, "You cannot activate the doomsday device while off-station!") + return + if(tgui_alert(user, "Send arming signal? (true = arm, false = cancel)", "purge_all_life()", list("confirm = TRUE;", "confirm = FALSE;")) != "confirm = TRUE;") return - if(tgui_alert(owner, "Send arming signal? (true = arm, false = cancel)", "purge_all_life()", list("confirm = TRUE;", "confirm = FALSE;")) != "confirm = TRUE;") + if(!istype(user) || QDELETED(user)) return - if(active) + if(in_use) return //prevent the AI from activating an already active doomsday - active = TRUE - set_us_up_the_bomb() + in_use = TRUE + set_us_up_the_bomb(user) -/datum/action/innate/ai/nuke_station/proc/set_us_up_the_bomb() - to_chat(owner_AI, "Nuclear device armed.") +/datum/spell/ai_spell/nuke_station/proc/set_us_up_the_bomb(mob/living/silicon/ai/user) + to_chat(user, "Nuclear device armed.") GLOB.major_announcement.Announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", 'sound/AI/aimalf.ogg') SSsecurity_level.set_level(SEC_LEVEL_DELTA) - owner_AI.nuking = TRUE - var/obj/machinery/doomsday_device/DOOM = new /obj/machinery/doomsday_device(owner_AI) - owner_AI.doomsday_device = DOOM - owner_AI.doomsday_device.start() + user.nuking = TRUE + var/obj/machinery/doomsday_device/DOOM = new /obj/machinery/doomsday_device(user) + user.doomsday_device = DOOM + user.doomsday_device.start() for(var/obj/item/pinpointer/point in GLOB.pinpointer_list) for(var/mob/living/silicon/ai/A in GLOB.ai_list) if((A.stat != DEAD) && A.nuking) @@ -352,17 +329,17 @@ opening all doors on the station." cost = 30 one_purchase = TRUE - power_type = /datum/action/innate/ai/lockdown + power_type = /datum/spell/ai_spell/lockdown unlock_text = "You upload a sleeper trojan into the door control systems. You can send a signal to set it off at any time." -/datum/action/innate/ai/lockdown +/datum/spell/ai_spell/lockdown name = "Lockdown" desc = "Closes, bolts, and depowers every airlock, firelock, and blast door on the station. After 90 seconds, they will reset themselves." - button_icon_state = "lockdown" + action_icon_state = "lockdown" uses = 1 -/datum/action/innate/ai/lockdown/Activate() - to_chat(owner, "Lockdown Initiated. Network reset in 90 seconds.") +/datum/spell/ai_spell/lockdown/cast(list/targets, mob/user) + to_chat(user, "Lockdown Initiated. Network reset in 90 seconds.") new /datum/event/door_runtime() //Destroy RCDs: Detonates all non-cyborg RCDs on the station. @@ -372,17 +349,17 @@ description = "Send a specialised pulse to detonate all hand-held and exosuit Rapid Construction Devices on the station." cost = 25 one_purchase = TRUE - power_type = /datum/action/innate/ai/destroy_rcds + power_type = /datum/spell/ai_spell/destroy_rcds unlock_text = "After some improvisation, you rig your onboard radio to be able to send a signal to detonate all RCDs." -/datum/action/innate/ai/destroy_rcds +/datum/spell/ai_spell/destroy_rcds name = "Destroy RCDs" desc = "Detonate all non-cyborg RCDs on the station." - button_icon_state = "detonate_rcds" + action_icon_state = "detonate_rcds" uses = 1 - cooldown_period = 10 SECONDS + base_cooldown = 10 SECONDS -/datum/action/innate/ai/destroy_rcds/Activate() +/datum/spell/ai_spell/destroy_rcds/cast(list/targets, mob/user) for(var/obj/item/rcd/RCD in GLOB.rcd_list) if(istype(RCD, /obj/item/rcd/borg)) //Ensures that cyborg RCDs are spared. continue @@ -390,8 +367,8 @@ if(is_level_reachable(RCD_turf.z)) RCD.detonate_pulse() - to_chat(owner, "RCD detonation pulse emitted.") - owner.playsound_local(owner, 'sound/machines/twobeep.ogg', 50, FALSE, use_reverb = FALSE) + to_chat(user, "RCD detonation pulse emitted.") + user.playsound_local(user, 'sound/machines/twobeep.ogg', 50, FALSE, use_reverb = FALSE) //Unlock Mech Domination: Unlocks the ability to dominate mechs. Big shocker, right? /datum/AI_Module/mecha_domination @@ -415,22 +392,22 @@ Anyone can check the fire alarm's interface and may be tipped off by its status." one_purchase = TRUE cost = 25 - power_type = /datum/action/innate/ai/break_fire_alarms + power_type = /datum/spell/ai_spell/break_fire_alarms unlock_text = "You replace the thermal sensing capabilities of all fire alarms with a manual override, allowing you to turn them off at will." -/datum/action/innate/ai/break_fire_alarms +/datum/spell/ai_spell/break_fire_alarms name = "Override Thermal Sensors" desc = "Disables the automatic temperature sensing on all fire alarms, making them effectively useless." - button_icon_state = "break_fire_alarms" + action_icon_state = "break_fire_alarms" uses = 1 -/datum/action/innate/ai/break_fire_alarms/Activate() +/datum/spell/ai_spell/break_fire_alarms/cast(list/targets, mob/user) for(var/obj/machinery/firealarm/F in GLOB.machines) if(!is_station_level(F.z)) continue F.emagged = TRUE - to_chat(owner, "All thermal sensors on the station have been disabled. Fire alerts will no longer be recognized.") - owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, FALSE, use_reverb = FALSE) + to_chat(user, "All thermal sensors on the station have been disabled. Fire alerts will no longer be recognized.") + user.playsound_local(user, 'sound/machines/terminal_off.ogg', 50, FALSE, use_reverb = FALSE) //Air Alarm Safety Override: Unlocks the ability to enable flooding on all air alarms. /datum/AI_Module/break_air_alarms @@ -440,23 +417,22 @@ Anyone can check the air alarm's interface and may be tipped off by their nonfunctionality." one_purchase = TRUE cost = 50 - power_type = /datum/action/innate/ai/break_air_alarms + power_type = /datum/spell/ai_spell/break_air_alarms unlock_text = "You remove the safety overrides on all air alarms, but you leave the confirm prompts open. You can hit 'Yes' at any time... you bastard." -/datum/action/innate/ai/break_air_alarms +/datum/spell/ai_spell/break_air_alarms name = "Override Air Alarm Safeties" desc = "Enables the Flood setting on all air alarms." - button_icon_state = "break_air_alarms" + action_icon_state = "break_air_alarms" uses = 1 -/datum/action/innate/ai/break_air_alarms/Activate() +/datum/spell/ai_spell/break_air_alarms/cast(list/targets, mob/user) for(var/obj/machinery/alarm/AA in GLOB.machines) if(!is_station_level(AA.z)) continue AA.emagged = TRUE - to_chat(owner, "All air alarm safeties on the station have been overridden. Air alarms may now use the Flood environmental mode.") - owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, FALSE, use_reverb = FALSE) - + to_chat(user, "All air alarm safeties on the station have been overridden. Air alarms may now use the Flood environmental mode.") + user.playsound_local(user, 'sound/machines/terminal_off.ogg', 50, FALSE, use_reverb = FALSE) //Overload Machine: Allows the AI to overload a machine, detonating it after a delay. Two uses per purchase. /datum/AI_Module/overload_machine @@ -464,48 +440,40 @@ mod_pick_name = "overload" description = "Overheats an electrical machine, causing a moderately-sized explosion and destroying it. Four uses per purchase." cost = 20 - power_type = /datum/action/innate/ai/ranged/overload_machine + power_type = /datum/spell/ai_spell/ranged/overload_machine unlock_text = "You enable the ability for the station's APCs to direct intense energy into machinery." -/datum/action/innate/ai/ranged/overload_machine +/datum/spell/ai_spell/ranged/overload_machine name = "Overload Machine" desc = "Overheats a machine, causing a moderately-sized explosion after a short time." - button_icon_state = "overload_machine" + action_icon_state = "overload_machine" uses = 4 - linked_ability_type = /obj/effect/proc_holder/ranged_ai/overload_machine - -/datum/action/innate/ai/ranged/overload_machine/proc/detonate_machine(obj/machinery/M) - if(M && !QDELETED(M)) - explosion(get_turf(M), 0, 3, 5, 0) - if(M) //to check if the explosion killed it before we try to delete it - qdel(M) - -/obj/effect/proc_holder/ranged_ai/overload_machine active = FALSE ranged_mousepointer = 'icons/effects/cult_target.dmi' - enable_text = "You tap into the station's powernet. Click on a machine to detonate it, or use the ability again to cancel." - disable_text = "You release your hold on the powernet." + selection_activated_message = "You tap into the station's powernet. Click on a machine to detonate it, or use the ability again to cancel." + selection_deactivated_message = "You release your hold on the powernet." -/obj/effect/proc_holder/ranged_ai/overload_machine/InterceptClickOn(mob/living/caller, params, obj/machinery/target) - if(..()) - return - if(ranged_ability_user.incapacitated()) - remove_ranged_ability() - return +/datum/spell/ai_spell/ranged/overload_machine/cast(list/targets, mob/user) + var/obj/machinery/target = targets[1] if(!istype(target)) - to_chat(ranged_ability_user, "You can only overload machines!") + to_chat(user, "You can only overload machines!") return if(target.flags_2 & NO_MALF_EFFECT_2) - to_chat(ranged_ability_user, "That machine can't be overloaded!") + to_chat(user, "That machine can't be overloaded!") return - ranged_ability_user.playsound_local(ranged_ability_user, "sparks", 50, FALSE, use_reverb = FALSE) - attached_action.adjust_uses(-1) + user.playsound_local(user, "sparks", 50, FALSE, use_reverb = FALSE) + adjust_uses(-1, user) target.audible_message("You hear a loud electrical buzzing sound coming from [target]!") - addtimer(CALLBACK(attached_action, TYPE_PROC_REF(/datum/action/innate/ai/ranged/overload_machine, detonate_machine), target), 50) //kaboom! - remove_ranged_ability(ranged_ability_user, "Overloading machine circuitry...") + addtimer(CALLBACK(src, PROC_REF(detonate_machine), target), 5 SECONDS) //kaboom! + to_chat(user, "Overloading machine circuitry...") return TRUE +/datum/spell/ai_spell/ranged/overload_machine/proc/detonate_machine(obj/machinery/M) + if(M && !QDELETED(M)) + explosion(get_turf(M), 0, 3, 5, 0) + if(M) //to check if the explosion killed it before we try to delete it + qdel(M) //Override Machine: Allows the AI to override a machine, animating it into an angry, living version of itself. /datum/AI_Module/override_machine @@ -513,46 +481,37 @@ mod_pick_name = "override" description = "Overrides a machine's programming, causing it to rise up and attack everyone except other machines. Four uses." cost = 30 - power_type = /datum/action/innate/ai/ranged/override_machine + power_type = /datum/spell/ai_spell/ranged/override_machine unlock_text = "You procure a virus from the Space Dark Web and distribute it to the station's machines." -/datum/action/innate/ai/ranged/override_machine +/datum/spell/ai_spell/ranged/override_machine name = "Override Machine" desc = "Animates a targeted machine, causing it to attack anyone nearby." - button_icon_state = "override_machine" + action_icon_state = "override_machine" uses = 4 - linked_ability_type = /obj/effect/proc_holder/ranged_ai/override_machine - -/datum/action/innate/ai/ranged/override_machine/proc/animate_machine(obj/machinery/M) - if(M && !QDELETED(M)) - new/mob/living/simple_animal/hostile/mimic/copy/machine(get_turf(M), M, owner, 1) - -/obj/effect/proc_holder/ranged_ai/override_machine - active = FALSE ranged_mousepointer = 'icons/effects/override_machine_target.dmi' - enable_text = "You tap into the station's powernet. Click on a machine to animate it, or use the ability again to cancel." - disable_text = "You release your hold on the powernet." + selection_activated_message = "You tap into the station's powernet. Click on a machine to animate it, or use the ability again to cancel." + selection_deactivated_message = "You release your hold on the powernet." -/obj/effect/proc_holder/ranged_ai/override_machine/InterceptClickOn(mob/living/caller, params, obj/machinery/target) - if(..()) - return - if(ranged_ability_user.incapacitated()) - remove_ranged_ability() - return +/datum/spell/ai_spell/ranged/override_machine/cast(list/targets, mob/user) + var/obj/machinery/target = targets[1] if(!istype(target)) - to_chat(ranged_ability_user, "You can only animate machines!") + to_chat(user, "You can only animate machines!") return if(target.flags_2 & NO_MALF_EFFECT_2) - to_chat(ranged_ability_user, "That machine can't be overridden!") + to_chat(user, "That machine can't be overridden!") return - ranged_ability_user.playsound_local(ranged_ability_user, 'sound/misc/interference.ogg', 50, FALSE, use_reverb = FALSE) - attached_action.adjust_uses(-1) + user.playsound_local(user, 'sound/misc/interference.ogg', 50, FALSE, use_reverb = FALSE) + adjust_uses(-1, user) target.audible_message("You hear a loud electrical buzzing sound coming from [target]!") - addtimer(CALLBACK(attached_action, TYPE_PROC_REF(/datum/action/innate/ai/ranged/override_machine, animate_machine), target), 50) //kabeep! - remove_ranged_ability(ranged_ability_user, "Sending override signal...") + addtimer(CALLBACK(src, PROC_REF(animate_machine), target), 5 SECONDS) //kabeep! + to_chat(user, "Sending override signal...") return TRUE +/datum/spell/ai_spell/ranged/override_machine/proc/animate_machine(obj/machinery/M, mob/user) + if(M && !QDELETED(M)) + new /mob/living/simple_animal/hostile/mimic/copy/machine(get_turf(M), M, user, 1) //Robotic Factory: Places a large machine that converts humans that go through it into cyborgs. Unlocking this ability removes shunting. /datum/AI_Module/place_cyborg_transformer @@ -561,46 +520,47 @@ description = "Build a machine anywhere, using expensive nanomachines, that can convert a living human into a loyal cyborg slave when placed inside." cost = 100 one_purchase = TRUE - power_type = /datum/action/innate/ai/place_transformer + power_type = /datum/spell/ai_spell/place_transformer unlock_text = "You prepare a robotics factory for deployment." unlock_sound = 'sound/machines/ping.ogg' -/datum/action/innate/ai/place_transformer +/datum/spell/ai_spell/place_transformer name = "Place Robotics Factory" desc = "Places a machine that converts humans into cyborgs. Conveyor belts included!" - button_icon_state = "robotic_factory" + action_icon_state = "robotic_factory" uses = 1 auto_use_uses = FALSE //So we can attempt multiple times var/list/turfOverlays + var/in_use = FALSE -/datum/action/innate/ai/place_transformer/New() +/datum/spell/ai_spell/place_transformer/New() ..() for(var/i in 1 to 3) var/image/I = image("icon"='icons/turf/overlays.dmi') LAZYADD(turfOverlays, I) -/datum/action/innate/ai/place_transformer/Activate() - if(!owner_AI.can_place_transformer(src)) +/datum/spell/ai_spell/place_transformer/cast(list/targets, mob/living/silicon/ai/user) + if(!user.can_place_transformer(src)) return - active = TRUE - if(tgui_alert(owner, "Are you sure you want to place the machine here?", "Are you sure?", list("Yes", "No")) != "Yes") + in_use = TRUE + if(tgui_alert(user, "Are you sure you want to place the machine here?", "Are you sure?", list("Yes", "No")) != "Yes") active = FALSE return - if(!owner_AI.can_place_transformer(src)) + if(!user.can_place_transformer(src)) active = FALSE return - var/turf/T = get_turf(owner_AI.eyeobj) - new /obj/machinery/transformer(T, owner_AI) + var/turf/T = get_turf(user.eyeobj) + new /obj/machinery/transformer(T, user) playsound(T, 'sound/effects/phasein.ogg', 100, 1) - owner_AI.can_shunt = FALSE - to_chat(owner, "You are no longer able to shunt your core to APCs.") - adjust_uses(-1) + user.can_shunt = FALSE + to_chat(user, "You are no longer able to shunt your core to APCs.") + adjust_uses(-1, user) /mob/living/silicon/ai/proc/remove_transformer_image(client/C, image/I, turf/T) if(C && I.loc == T) C.images -= I -/mob/living/silicon/ai/proc/can_place_transformer(datum/action/innate/ai/place_transformer/action) +/mob/living/silicon/ai/proc/can_place_transformer(datum/spell/ai_spell/place_transformer/action) if(!eyeobj || !isturf(loc) || incapacitated() || !action) return var/turf/middle = get_turf(eyeobj) @@ -634,46 +594,46 @@ mod_pick_name = "turretdeployer" description = "Build a turret anywhere that lethally targets organic life in sight." cost = 30 - power_type = /datum/action/innate/ai/place_turret + power_type = /datum/spell/ai_spell/place_turret unlock_text = "You prepare an energy turret for deployment." unlock_sound = 'sound/items/rped.ogg' -/datum/action/innate/ai/place_turret +/datum/spell/ai_spell/place_turret name = "Deploy Turret" desc = "Build a turret anywhere that lethally targets organic life in sight." - button_icon_state = "deploy_turret" + action_icon_state = "deploy_turret" uses = 1 auto_use_uses = FALSE var/image/turf_overlay + var/in_use = FALSE -/datum/action/innate/ai/place_turret/New() +/datum/spell/ai_spell/place_turret/New() ..() turf_overlay = image('icons/turf/overlays.dmi') -/datum/action/innate/ai/place_turret/Activate() - if(active) - to_chat(owner, "Your assemblers can only construct one turret at a time.") +/datum/spell/ai_spell/place_turret/cast(list/targets, mob/living/silicon/ai/user) + if(in_use) + to_chat(user, "Your assemblers can only construct one turret at a time.") return - if(!owner_AI.can_place_turret(src)) + if(!user.can_place_turret(src)) return - active = TRUE - var/response = alert(owner, "Are you sure you want to place a turret here? Deployment will take a few seconds to complete, in which the turret will be vulnerable.", "Are you sure?", "No", "Yes") - if(!response || response == "No") - active = FALSE + in_use = TRUE + if(tgui_alert(user, "Are you sure you want to place a turret here? Deployment will take a few seconds to complete, in which the turret will be vulnerable.", "Are you sure?", list("No", "Yes")) != "Yes") + in_use = FALSE return - if(!owner_AI.can_place_turret(src)) - active = FALSE + if(!user.can_place_turret(src)) + in_use = FALSE return - deploy_turret() - active = FALSE + deploy_turret(user) + in_use = FALSE -/datum/action/innate/ai/place_turret/proc/deploy_turret() - var/turf/T = get_turf(owner_AI.eyeobj) +/datum/spell/ai_spell/place_turret/proc/deploy_turret(mob/living/silicon/ai/user) + var/turf/T = get_turf(user.eyeobj) //Handles the turret construction and configuration playsound(T, 'sound/items/rped.ogg', 100, TRUE) //Plays a sound both at the location of the construction to alert players and to the user as feedback - owner.playsound_local(owner, 'sound/items/rped.ogg', 50, FALSE, use_reverb = FALSE) - to_chat(owner, "You order your electronics to assemble a turret. This will take a few seconds.") + user.playsound_local(user, 'sound/items/rped.ogg', 50, FALSE, use_reverb = FALSE) + to_chat(user, "You order your electronics to assemble a turret. This will take a few seconds.") var/obj/effect/temp_visual/rcd_effect/spawning_effect = new(T) QDEL_IN(spawning_effect, 5 SECONDS) @@ -687,21 +647,21 @@ turret.invisibility = 100 //If turrets are already upgraded, beef it up - if(owner_AI.turrets_upgraded) + if(user.turrets_upgraded) turret.health += 30 turret.eprojectile = /obj/item/projectile/beam/laser/ai_turret/heavylaser //Big gun turret.eshot_sound = 'sound/weapons/lasercannonfire.ogg' - if(do_after_once(owner, 5 SECONDS, target = T, allow_moving = TRUE)) //Once this is done, turret is armed and dangerous + if(do_after_once(user, 5 SECONDS, target = T, allow_moving = TRUE)) //Once this is done, turret is armed and dangerous turret.raised = initial(turret.raised) turret.invisibility = initial(turret.invisibility) turret.disabled = initial(turret.disabled) new /obj/effect/temp_visual/rcd_effect/end(T) playsound(T, 'sound/items/deconstruct.ogg', 100, TRUE) - to_chat(owner, "Turret deployed.") - adjust_uses(-1) + to_chat(user, "Turret deployed.") + adjust_uses(-1, user) -/mob/living/silicon/ai/proc/can_place_turret(datum/action/innate/ai/place_turret/action) +/mob/living/silicon/ai/proc/can_place_turret(datum/spell/ai_spell/place_turret/action) if(!eyeobj || !isturf(eyeobj.loc) || incapacitated() || !action) return @@ -735,26 +695,26 @@ mod_pick_name = "blackout" description = "Attempts to overload the lighting circuits on the station, destroying some bulbs. Three uses." cost = 15 - power_type = /datum/action/innate/ai/blackout + power_type = /datum/spell/ai_spell/blackout unlock_text = "You hook into the powernet and route bonus power towards the station's lighting." -/datum/action/innate/ai/blackout +/datum/spell/ai_spell/blackout name = "Blackout" desc = "Overloads random lights across the station." - button_icon_state = "blackout" + action_icon_state = "blackout" uses = 3 auto_use_uses = FALSE -/datum/action/innate/ai/blackout/Activate() +/datum/spell/ai_spell/blackout/cast(list/targets, mob/user) for(var/thing in GLOB.apcs) var/obj/machinery/power/apc/apc = thing if(prob(30 * apc.overload)) INVOKE_ASYNC(apc, TYPE_PROC_REF(/obj/machinery/power/apc, overload_lighting)) else apc.overload++ - to_chat(owner, "Overcurrent applied to the powernet.") - owner.playsound_local(owner, "sparks", 50, FALSE, use_reverb = FALSE) - adjust_uses(-1) + to_chat(user, "Overcurrent applied to the powernet.") + user.playsound_local(user, "sparks", 50, FALSE, use_reverb = FALSE) + adjust_uses(-1, user) //Reactivate Camera Network: Reactivates up to 30 cameras across the station. /datum/AI_Module/reactivate_cameras @@ -762,19 +722,18 @@ mod_pick_name = "recam" description = "Runs a network-wide diagnostic on the camera network, resetting focus and re-routing power to failed cameras. Can be used to repair up to 30 cameras." cost = 10 - power_type = /datum/action/innate/ai/reactivate_cameras + power_type = /datum/spell/ai_spell/reactivate_cameras unlock_text = "You deploy nanomachines to the cameranet." -/datum/action/innate/ai/reactivate_cameras +/datum/spell/ai_spell/reactivate_cameras name = "Reactivate Cameras" desc = "Reactivates disabled cameras across the station; remaining uses can be used later." - button_icon_state = "reactivate_cameras" + action_icon_state = "reactivate_cameras" uses = 10 auto_use_uses = FALSE - cooldown_period = 3 SECONDS + base_cooldown = 3 SECONDS -/datum/action/innate/ai/reactivate_cameras/Activate() - var/mob/living/silicon/ai/user = usr +/datum/spell/ai_spell/reactivate_cameras/cast(list/targets, mob/living/silicon/ai/user) var/repaired_cameras = 0 if(!istype(user)) return @@ -782,14 +741,14 @@ if(!uses) break if(!camera_to_repair.status || camera_to_repair.view_range != initial(camera_to_repair.view_range)) - camera_to_repair.toggle_cam(owner_AI, 0) + camera_to_repair.toggle_cam(user, 0) camera_to_repair.view_range = initial(camera_to_repair.view_range) camera_to_repair.wires.cut_wires.Cut() repaired_cameras++ uses-- - to_chat(owner, "Diagnostic complete! Cameras reactivated: [repaired_cameras]. Reactivations remaining: [uses].") - owner.playsound_local(owner, 'sound/items/wirecutter.ogg', 50, FALSE, use_reverb = FALSE) - adjust_uses(0, TRUE) + to_chat(user, "Diagnostic complete! Cameras reactivated: [repaired_cameras]. Reactivations remaining: [uses].") + user.playsound_local(user, 'sound/items/wirecutter.ogg', 50, FALSE, use_reverb = FALSE) + adjust_uses(0, user, TRUE) //Upgrade Camera Network: EMP-proofs all cameras, in addition to giving them X-ray vision. /datum/AI_Module/upgrade_cameras @@ -880,124 +839,113 @@ mod_pick_name = "repair_borg" description = "Causes an electrical surge in the targeted cyborg, rebooting and repairing most of its subsystems. Requires two uses on a cyborg with broken armor." cost = 20 - power_type = /datum/action/innate/ai/ranged/repair_cyborg + power_type = /datum/spell/ai_spell/ranged/repair_cyborg unlock_text = "TLB exception on load: Error pointing to address 0000001H, Proceed with execution anywa- SURGE protocols installed, welcome to open APC!" unlock_sound = 'sound/items/rped.ogg' -/datum/action/innate/ai/ranged/repair_cyborg +/datum/spell/ai_spell/ranged/repair_cyborg name = "Repair Cyborg" desc = "Shocks a cyborg back to 'life' after a short delay." - button_icon_state = "overload_machine" + action_icon_state = "overload_machine" uses = 2 - linked_ability_type = /obj/effect/proc_holder/ranged_ai/repair_cyborg - - -/datum/action/innate/ai/ranged/repair_cyborg/proc/fix_borg(mob/living/silicon/robot/to_repair) - for(var/datum/robot_component/component in to_repair.components) - component.brute_damage = 0 - component.electronics_damage = 0 - component.component_disabled = FALSE - to_repair.revive() - -/obj/effect/proc_holder/ranged_ai/repair_cyborg - active = FALSE ranged_mousepointer = 'icons/effects/overload_machine_target.dmi' - enable_text = "Call to address 0FFFFFFF in APC logic thread, awaiting user response." - disable_text = "APC logic thread restarting..." + selection_activated_message = "Call to address 0FFFFFFF in APC logic thread, awaiting user response." + selection_deactivated_message = "APC logic thread restarting..." var/is_active = FALSE -/obj/effect/proc_holder/ranged_ai/repair_cyborg/InterceptClickOn(mob/living/caller, params, mob/living/silicon/robot/robot_target) - if(..()) - return - if(ranged_ability_user.incapacitated()) - remove_ranged_ability() - return +/datum/spell/ai_spell/ranged/repair_cyborg/create_new_targeting() + var/datum/spell_targeting/click/T = new + T.allowed_type = /mob/living/silicon/robot + T.try_auto_target = FALSE + return T + +/datum/spell/ai_spell/ranged/repair_cyborg/cast(list/targets, mob/user) + var/mob/living/silicon/robot/robot_target = targets[1] if(!istype(robot_target)) - to_chat(ranged_ability_user, "You can only repair robots with this ability!") + to_chat(user, "You can only repair robots with this ability!") return if(is_active) - to_chat(ranged_ability_user, "You can only repair one robot at a time!") + to_chat(user, "You can only repair one robot at a time!") return is_active = TRUE - ranged_ability_user.playsound_local(ranged_ability_user, "sparks", 50, FALSE, use_reverb = FALSE) - var/datum/action/innate/ai/ranged/repair_cyborg/actual_action = attached_action - actual_action.adjust_uses(-1) + user.playsound_local(user, "sparks", 50, FALSE, use_reverb = FALSE) + adjust_uses(-1, user) robot_target.audible_message("You hear a loud electrical buzzing sound coming from [robot_target]!") - if(!do_mob(caller, robot_target, 10 SECONDS)) + if(!do_mob(user, robot_target, 10 SECONDS)) is_active = FALSE return is_active = FALSE - actual_action.fix_borg(robot_target) - remove_ranged_ability(ranged_ability_user, "[robot_target] successfully rebooted.") + fix_borg(robot_target) + to_chat(user, "[robot_target] successfully rebooted.") return TRUE +/datum/spell/ai_spell/ranged/repair_cyborg/proc/fix_borg(mob/living/silicon/robot/to_repair) + for(var/datum/robot_component/component in to_repair.components) + component.brute_damage = 0 + component.electronics_damage = 0 + component.component_disabled = FALSE + to_repair.revive() + /datum/AI_Module/core_tilt module_name = "Rolling Servos" mod_pick_name = "watchforrollingcores" description = "Allows you to slowly roll your core around, crushing anything in your path with your bulk." cost = 10 - one_purchase = FALSE - power_type = /datum/action/innate/ai/ranged/core_tilt + one_purchase = TRUE + power_type = /datum/spell/ai_spell/ranged/core_tilt unlock_sound = 'sound/effects/bang.ogg' unlock_text = "You gain the ability to roll over and crush anything in your way." -/datum/action/innate/ai/ranged/core_tilt +/datum/spell/ai_spell/ranged/core_tilt name = "Roll Over" - button_icon_state = "roll_over" + action_icon_state = "roll_over" desc = "Allows you to roll over in the direction of your choosing, crushing anything in your way." auto_use_uses = FALSE - linked_ability_type = /obj/effect/proc_holder/ranged_ai/roll_over - - -/obj/effect/proc_holder/ranged_ai/roll_over - active = FALSE ranged_mousepointer = 'icons/effects/cult_target.dmi' - enable_text = "Your inner servos shift as you prepare to roll around. Click adjacent tiles to roll into them!" - disable_text = "You disengage your rolling protocols." + selection_activated_message = "Your inner servos shift as you prepare to roll around. Click adjacent tiles to roll into them!" + selection_deactivated_message = "You disengage your rolling protocols." COOLDOWN_DECLARE(time_til_next_tilt) /// How long does it take us to roll? var/roll_over_time = MALF_AI_ROLL_TIME /// How long does it take for the ability to cool down, on top of [roll_over_time]? var/roll_over_cooldown = MALF_AI_ROLL_COOLDOWN - -/obj/effect/proc_holder/ranged_ai/roll_over/InterceptClickOn(mob/living/caller, params, atom/target_atom) - if(..()) - return - if(!isAI(ranged_ability_user)) +/datum/spell/ai_spell/ranged/core_tilt/cast(list/targets, mob/living/silicon/ai/user) + var/atom/target_atom = targets[1] + if(!istype(user)) return - if(ranged_ability_user.incapacitated() || !isturf(ranged_ability_user.loc)) - remove_ranged_ability() + if(!isturf(user.loc)) + user.RemoveSpell(src) return if(!COOLDOWN_FINISHED(src, time_til_next_tilt)) - to_chat(ranged_ability_user, "Your rolling capacitors are still powering back up!") + to_chat(user, "Your rolling capacitors are still powering back up!") return var/turf/target = get_turf(target_atom) if(isnull(target)) return - if(target == get_turf(ranged_ability_user)) - to_chat(ranged_ability_user, "You can't roll over on yourself!") + if(target == get_turf(user)) + to_chat(user, "You can't roll over on yourself!") return - var/picked_dir = get_dir(caller, target) + var/picked_dir = get_dir(user, target) if(!picked_dir) return FALSE // we can move during the timer so we cant just pass the ref - var/turf/temp_target = get_step(ranged_ability_user, picked_dir) + var/turf/temp_target = get_step(user, picked_dir) - new /obj/effect/temp_visual/single_user/ai_telegraph(temp_target, ranged_ability_user) - ranged_ability_user.visible_message("[ranged_ability_user] seems to be winding up!") - addtimer(CALLBACK(src, PROC_REF(do_roll_over), caller, picked_dir), MALF_AI_ROLL_TIME) + new /obj/effect/temp_visual/single_user/ai_telegraph(temp_target, user) + user.visible_message("[user] seems to be winding up!") + addtimer(CALLBACK(src, PROC_REF(do_roll_over), user, picked_dir), MALF_AI_ROLL_TIME) - to_chat(ranged_ability_user, "Overloading machine circuitry...") + to_chat(user, "Overloading machine circuitry...") COOLDOWN_START(src, time_til_next_tilt, roll_over_cooldown) return TRUE -/obj/effect/proc_holder/ranged_ai/roll_over/proc/do_roll_over(mob/living/silicon/ai/ai_caller, picked_dir) +/datum/spell/ai_spell/ranged/core_tilt/proc/do_roll_over(mob/living/silicon/ai/ai_caller, picked_dir) var/turf/target = get_step(ai_caller, picked_dir) // in case we moved we pass the dir not the target turf if(isnull(target) || ai_caller.incapacitated() || !isturf(ai_caller.loc)) @@ -1009,7 +957,7 @@ ai_caller.fall_and_crush(target, MALF_AI_ROLL_DAMAGE, prob(MALF_AI_ROLL_CRIT_CHANCE), 2, null, paralyze_time, crush_dir = picked_dir, angle = get_rotation_from_dir(picked_dir)) ai_caller.allow_teleporter = FALSE -/obj/effect/proc_holder/ranged_ai/roll_over/proc/get_rotation_from_dir(dir) +/datum/spell/ai_spell/ranged/core_tilt/proc/get_rotation_from_dir(dir) switch(dir) if(NORTH, NORTHWEST, WEST, SOUTHWEST) return 270 // try our best to not return 180 since it works badly with animate diff --git a/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm b/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm index 045203e0e47c..5dc9a30ce30f 100644 --- a/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm +++ b/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm @@ -147,8 +147,8 @@ /mob/living/simple_animal/demon/shadow/Initialize(mapload) . = ..() - AddSpell(new /obj/effect/proc_holder/spell/fireball/shadow_grapple) - var/obj/effect/proc_holder/spell/bloodcrawl/shadow_crawl/S = new + AddSpell(new /datum/spell/fireball/shadow_grapple) + var/datum/spell/bloodcrawl/shadow_crawl/S = new AddSpell(S) whisper_action.button_icon_state = "shadow_whisper" whisper_action.background_icon_state = "shadow_demon_bg" @@ -176,7 +176,7 @@ return lum_count -/obj/effect/proc_holder/spell/fireball/shadow_grapple +/datum/spell/fireball/shadow_grapple name = "Shadow Grapple" desc = "Fire one of your hands, if it hits a person it pulls them in. If you hit a structure you get pulled to the structure. Any light source hit with this will be disabled in a two tile radius." base_cooldown = 10 SECONDS @@ -193,7 +193,7 @@ invocation_type = "none" invocation = null -/obj/effect/proc_holder/spell/fireball/shadow_grapple/update_icon_state() +/datum/spell/fireball/shadow_grapple/update_spell_icon() return /obj/item/projectile/magic/shadow_hand @@ -239,9 +239,9 @@ /obj/item/organ/internal/heart/demon/shadow/insert(mob/living/carbon/M, special = 0) . = ..() if(M.mind) - M.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball/shadow_grapple) + M.mind.AddSpell(new /datum/spell/fireball/shadow_grapple) /obj/item/organ/internal/heart/demon/shadow/remove(mob/living/carbon/M, special = 0) . = ..() if(M.mind) - M.mind.RemoveSpell(/obj/effect/proc_holder/spell/fireball/shadow_grapple) + M.mind.RemoveSpell(/datum/spell/fireball/shadow_grapple) diff --git a/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm b/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm index 6439cd69f34f..0ee8e70ce671 100644 --- a/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm +++ b/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm @@ -32,7 +32,7 @@ ..() remove_from_all_data_huds() ADD_TRAIT(src, TRAIT_BLOODCRAWL_EAT, "bloodcrawl_eat") - var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new + var/datum/spell/bloodcrawl/bloodspell = new AddSpell(bloodspell) if(istype(loc, /obj/effect/dummy/slaughter)) bloodspell.phased = TRUE @@ -102,7 +102,7 @@ to emerge from it. You are fast, powerful, and almost invincible. By dragging a dead or unconscious body into a blood pool with you, you will consume it after a time and fully regain \ your health. You may use the ability 'Sense Victims' in your Cultist tab to locate a random, living heretic." -/obj/effect/proc_holder/spell/sense_victims +/datum/spell/sense_victims name = "Sense Victims" desc = "Sense the location of heretics" base_cooldown = 0 @@ -113,13 +113,13 @@ action_background_icon_state = "bg_cult" panel = "Demon" -/obj/effect/proc_holder/spell/sense_victims/create_new_targeting() +/datum/spell/sense_victims/create_new_targeting() return new /datum/spell_targeting/alive_mob_list -/obj/effect/proc_holder/spell/sense_victims/valid_target(mob/living/target, user) +/datum/spell/sense_victims/valid_target(mob/living/target, user) return target.stat == CONSCIOUS && target.key && !IS_CULTIST(target) // Only conscious, non cultist players -/obj/effect/proc_holder/spell/sense_victims/cast(list/targets, mob/user) +/datum/spell/sense_victims/cast(list/targets, mob/user) var/mob/living/victim = targets[1] to_chat(victim, "You feel an awful sense of being watched...") victim.Stun(6 SECONDS) //HUE @@ -153,7 +153,7 @@ S.mind.special_role = "Harbinger of the Slaughter" to_chat(S, playstyle_string) S.mind.add_antag_datum(/datum/antagonist/cultist) - var/obj/effect/proc_holder/spell/sense_victims/SV = new + var/datum/spell/sense_victims/SV = new AddSpell(SV) S.mind.add_mind_objective(/datum/objective/cult_slaughter) @@ -257,14 +257,14 @@ /obj/item/organ/internal/heart/demon/slaughter/insert(mob/living/carbon/M, special = 0) . = ..() if(M.mind) - M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null)) + M.mind.AddSpell(new /datum/spell/bloodcrawl(null)) /obj/item/organ/internal/heart/demon/slaughter/remove(mob/living/carbon/M, special = 0) . = ..() if(M.mind) REMOVE_TRAIT(M, TRAIT_BLOODCRAWL, "bloodcrawl") REMOVE_TRAIT(M, TRAIT_BLOODCRAWL_EAT, "bloodcrawl_eat") - M.mind.RemoveSpell(/obj/effect/proc_holder/spell/bloodcrawl) + M.mind.RemoveSpell(/datum/spell/bloodcrawl) /mob/living/simple_animal/demon/slaughter/laughter // The laughter demon! It's everyone's best friend! It just wants to hug diff --git a/code/game/gamemodes/miniantags/guardian/host_actions.dm b/code/game/gamemodes/miniantags/guardian/host_actions.dm index 75157f84991b..23ccc02f24bc 100644 --- a/code/game/gamemodes/miniantags/guardian/host_actions.dm +++ b/code/game/gamemodes/miniantags/guardian/host_actions.dm @@ -102,7 +102,7 @@ dust_if_respawnable(new_stand) qdel(src) -/obj/effect/proc_holder/spell/summon_guardian_beacon +/datum/spell/summon_guardian_beacon name = "Place Teleportation Beacon" desc = "Mark a floor as your beacon point, allowing you to warp targets to it. Your beacon requires an anchor, will not work on space tiles." clothes_req = FALSE @@ -111,10 +111,10 @@ action_background_icon_state = "reset" action_icon = 'icons/mob/guardian.dmi' -/obj/effect/proc_holder/spell/summon_guardian_beacon/create_new_targeting() +/datum/spell/summon_guardian_beacon/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/summon_guardian_beacon/cast(list/targets, mob/living/user = usr) +/datum/spell/summon_guardian_beacon/cast(list/targets, mob/living/user = usr) var/target = targets[1] var/mob/living/simple_animal/hostile/guardian/healer/guardian_user = user var/turf/beacon_loc = get_turf(target) @@ -125,7 +125,7 @@ return TRUE -/obj/effect/proc_holder/spell/surveillance_snare +/datum/spell/surveillance_snare name = "Set Surveillance Snare" desc = "Places an invisible Surveillance Snare on the ground, if someone walks over it you'll be alerted. Max of 6 snares active at a time" clothes_req = FALSE @@ -134,10 +134,10 @@ action_background_icon_state = "reset" action_icon = 'icons/mob/guardian.dmi' -/obj/effect/proc_holder/spell/surveillance_snare/create_new_targeting() +/datum/spell/surveillance_snare/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/surveillance_snare/cast(list/targets, mob/living/user = usr) +/datum/spell/surveillance_snare/cast(list/targets, mob/living/user = usr) var/target = targets[1] var/mob/living/simple_animal/hostile/guardian/ranged/guardian_user = user if(length(guardian_user.snares) < 6) @@ -156,7 +156,7 @@ to_chat(user, "Snare disarmed.") revert_cast() -/obj/effect/proc_holder/spell/choose_battlecry +/datum/spell/choose_battlecry name = "Change battlecry" desc = "Changes your battlecry." clothes_req = FALSE @@ -165,10 +165,10 @@ action_background_icon_state = "communicate" action_icon = 'icons/mob/guardian.dmi' -/obj/effect/proc_holder/spell/choose_battlecry/create_new_targeting() +/datum/spell/choose_battlecry/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/choose_battlecry/cast(list/targets, mob/living/user = usr) +/datum/spell/choose_battlecry/cast(list/targets, mob/living/user = usr) var/mob/living/simple_animal/hostile/guardian/punch/guardian_user = user var/input = tgui_input_text(guardian_user, "What do you want your battlecry to be? Max length of 6 characters.", "Change Battlecry", guardian_user.battlecry, 6) if(!input) diff --git a/code/game/gamemodes/miniantags/guardian/types/healer.dm b/code/game/gamemodes/miniantags/guardian/types/healer.dm index 3423233c91d2..f073bd8935da 100644 --- a/code/game/gamemodes/miniantags/guardian/types/healer.dm +++ b/code/game/gamemodes/miniantags/guardian/types/healer.dm @@ -36,7 +36,7 @@ /mob/living/simple_animal/hostile/guardian/healer/Initialize(mapload, mob/living/host) . = ..() - AddSpell(new /obj/effect/proc_holder/spell/summon_guardian_beacon(null)) + AddSpell(new /datum/spell/summon_guardian_beacon(null)) /mob/living/simple_animal/hostile/guardian/healer/Destroy() QDEL_NULL(beacon) diff --git a/code/game/gamemodes/miniantags/guardian/types/ranged.dm b/code/game/gamemodes/miniantags/guardian/types/ranged.dm index 37953ec72dff..1a254c42f77f 100644 --- a/code/game/gamemodes/miniantags/guardian/types/ranged.dm +++ b/code/game/gamemodes/miniantags/guardian/types/ranged.dm @@ -27,7 +27,7 @@ /mob/living/simple_animal/hostile/guardian/ranged/Initialize(mapload, mob/living/host) . = ..() - AddSpell(new /obj/effect/proc_holder/spell/surveillance_snare(null)) + AddSpell(new /datum/spell/surveillance_snare(null)) /mob/living/simple_animal/hostile/guardian/ranged/ToggleMode() if(loc == summoner) diff --git a/code/game/gamemodes/miniantags/guardian/types/standard_guardian.dm b/code/game/gamemodes/miniantags/guardian/types/standard_guardian.dm index d08698bcacd8..d0f7eee819ca 100644 --- a/code/game/gamemodes/miniantags/guardian/types/standard_guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/types/standard_guardian.dm @@ -12,7 +12,7 @@ /mob/living/simple_animal/hostile/guardian/punch/Initialize(mapload, mob/living/host) . = ..() - AddSpell(new /obj/effect/proc_holder/spell/choose_battlecry(null)) + AddSpell(new /datum/spell/choose_battlecry(null)) /mob/living/simple_animal/hostile/guardian/punch/AttackingTarget() . = ..() diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index 46a2f0af1d23..e65824685188 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -45,11 +45,11 @@ /// How much weaken a successful ambush attack applies var/ambush_weaken = 6 SECONDS /// The spell the morph uses to morph - var/obj/effect/proc_holder/spell/mimic/morph/mimic_spell + var/datum/spell/mimic/morph/mimic_spell /// The ambush action used by the morph - var/obj/effect/proc_holder/spell/morph_spell/ambush/ambush_spell + var/datum/spell/morph_spell/ambush/ambush_spell /// The spell the morph uses to pass through airlocks - var/obj/effect/proc_holder/spell/morph_spell/pass_airlock/pass_airlock_spell + var/datum/spell/morph_spell/pass_airlock/pass_airlock_spell /// How much the morph has gathered in terms of food. Used to reproduce and such var/gathered_food = 20 // Start with a bit to use abilities @@ -60,8 +60,8 @@ AddSpell(mimic_spell) ambush_spell = new AddSpell(ambush_spell) - AddSpell(new /obj/effect/proc_holder/spell/morph_spell/reproduce) - AddSpell(new /obj/effect/proc_holder/spell/morph_spell/open_vent) + AddSpell(new /datum/spell/morph_spell/reproduce) + AddSpell(new /datum/spell/morph_spell/open_vent) pass_airlock_spell = new AddSpell(pass_airlock_spell) @@ -83,8 +83,8 @@ /mob/living/simple_animal/hostile/morph/wizard/Initialize(mapload) . = ..() - AddSpell(new /obj/effect/proc_holder/spell/smoke) - AddSpell(new /obj/effect/proc_holder/spell/forcewall) + AddSpell(new /datum/spell/smoke) + AddSpell(new /datum/spell/forcewall) /mob/living/simple_animal/hostile/morph/proc/try_eat(atom/movable/A) diff --git a/code/game/gamemodes/miniantags/morph/spells/ambush.dm b/code/game/gamemodes/miniantags/morph/spells/ambush.dm index 36da7da9f922..98c79ea1e7a0 100644 --- a/code/game/gamemodes/miniantags/morph/spells/ambush.dm +++ b/code/game/gamemodes/miniantags/morph/spells/ambush.dm @@ -1,16 +1,16 @@ #define MORPH_AMBUSH_PERFECTION_TIME 15 SECONDS -/obj/effect/proc_holder/spell/morph_spell/ambush +/datum/spell/morph_spell/ambush name = "Prepare Ambush" desc = "Prepare an ambush. Dealing significantly more damage on the first hit and you will weaken the target. Only works while morphed. If the target tries to use you with their hands then you will do even more damage. \ Keeping still for another 15 seconds will perfect your disguise." action_icon_state = "morph_ambush" base_cooldown = 8 SECONDS -/obj/effect/proc_holder/spell/morph_spell/ambush/create_new_targeting() +/datum/spell/morph_spell/ambush/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/morph_spell/ambush/can_cast(mob/living/simple_animal/hostile/morph/user, charge_check, show_message) +/datum/spell/morph_spell/ambush/can_cast(mob/living/simple_animal/hostile/morph/user, charge_check, show_message) . = ..() if(!.) return @@ -23,7 +23,7 @@ to_chat(user, "You are already prepared!") return FALSE -/obj/effect/proc_holder/spell/morph_spell/ambush/cast(list/targets, mob/living/simple_animal/hostile/morph/user) +/datum/spell/morph_spell/ambush/cast(list/targets, mob/living/simple_animal/hostile/morph/user) to_chat(user, "You start preparing an ambush.") if(!do_after(user, 6 SECONDS, FALSE, user, TRUE, list(CALLBACK(src, PROC_REF(prepare_check), user)), FALSE)) if(!user.morphed) @@ -33,7 +33,7 @@ return user.prepare_ambush() -/obj/effect/proc_holder/spell/morph_spell/ambush/proc/prepare_check(mob/living/simple_animal/hostile/morph/user) +/datum/spell/morph_spell/ambush/proc/prepare_check(mob/living/simple_animal/hostile/morph/user) return !user.morphed /datum/status_effect/morph_ambush diff --git a/code/game/gamemodes/miniantags/morph/spells/morph_spell.dm b/code/game/gamemodes/miniantags/morph/spells/morph_spell.dm index a4d148660515..d25810208249 100644 --- a/code/game/gamemodes/miniantags/morph/spells/morph_spell.dm +++ b/code/game/gamemodes/miniantags/morph/spells/morph_spell.dm @@ -1,15 +1,15 @@ -/obj/effect/proc_holder/spell/morph_spell +/datum/spell/morph_spell action_background_icon_state = "bg_morph" clothes_req = FALSE /// How much food it costs the morph to use this var/hunger_cost = 0 -/obj/effect/proc_holder/spell/morph_spell/Initialize(mapload) - . = ..() +/datum/spell/morph_spell/New() + ..() if(hunger_cost) name = "[name] ([hunger_cost])" -/obj/effect/proc_holder/spell/morph_spell/create_new_handler() +/datum/spell/morph_spell/create_new_handler() var/datum/spell_handler/morph/H = new H.hunger_cost = hunger_cost return H diff --git a/code/game/gamemodes/miniantags/morph/spells/open_vent.dm b/code/game/gamemodes/miniantags/morph/spells/open_vent.dm index 2b70d6b19c4d..6d198248d03e 100644 --- a/code/game/gamemodes/miniantags/morph/spells/open_vent.dm +++ b/code/game/gamemodes/miniantags/morph/spells/open_vent.dm @@ -1,17 +1,17 @@ -/obj/effect/proc_holder/spell/morph_spell/open_vent +/datum/spell/morph_spell/open_vent name = "Open Vents" desc = "Spit out acidic puke on nearby vents or scrubbers. Will take a little while for the acid to take effect. Not usable from inside a vent." action_icon_state = "acid_vent" base_cooldown = 10 SECONDS hunger_cost = 10 -/obj/effect/proc_holder/spell/morph_spell/open_vent/create_new_targeting() +/datum/spell/morph_spell/open_vent/create_new_targeting() var/datum/spell_targeting/aoe/T = new T.range = 1 T.allowed_type = /obj/machinery/atmospherics/unary return T -/obj/effect/proc_holder/spell/morph_spell/open_vent/valid_target(target, user) +/datum/spell/morph_spell/open_vent/valid_target(target, user) if(istype(target, /obj/machinery/atmospherics/unary/vent_scrubber)) var/obj/machinery/atmospherics/unary/vent_scrubber/S = target return S.welded @@ -20,7 +20,7 @@ return V.welded return FALSE -/obj/effect/proc_holder/spell/morph_spell/open_vent/cast(list/targets, mob/user) +/datum/spell/morph_spell/open_vent/cast(list/targets, mob/user) if(!length(targets)) to_chat(user, "No nearby welded vents found!") revert_cast(user) @@ -36,7 +36,7 @@ addtimer(CALLBACK(src, PROC_REF(unweld_vent), U), 2 SECONDS) playsound(U, 'sound/items/welder.ogg', 100, TRUE) -/obj/effect/proc_holder/spell/morph_spell/open_vent/proc/unweld_vent(obj/machinery/atmospherics/unary/U) +/datum/spell/morph_spell/open_vent/proc/unweld_vent(obj/machinery/atmospherics/unary/U) if(istype(U, /obj/machinery/atmospherics/unary/vent_scrubber)) var/obj/machinery/atmospherics/unary/vent_scrubber/S = U S.welded = FALSE diff --git a/code/game/gamemodes/miniantags/morph/spells/pass_airlock.dm b/code/game/gamemodes/miniantags/morph/spells/pass_airlock.dm index e6cd52148ab8..b8f2f1623bc8 100644 --- a/code/game/gamemodes/miniantags/morph/spells/pass_airlock.dm +++ b/code/game/gamemodes/miniantags/morph/spells/pass_airlock.dm @@ -1,5 +1,5 @@ // TODO refactor when spell code is component based instead of OO based -/obj/effect/proc_holder/spell/morph_spell/pass_airlock +/datum/spell/morph_spell/pass_airlock name = "Pass Airlock" desc = "Reform yourself so you can fit through a non bolted airlock. Takes a while to do and can only be used in a non disguised form." action_background_icon_state = "bg_morph" @@ -8,7 +8,7 @@ base_cooldown = 10 SECONDS selection_activated_message = "Click on an airlock to try pass it." -/obj/effect/proc_holder/spell/morph_spell/pass_airlock/create_new_targeting() +/datum/spell/morph_spell/pass_airlock/create_new_targeting() var/datum/spell_targeting/click/T = new T.range = 1 T.allowed_type = /obj/machinery/door/airlock @@ -16,7 +16,7 @@ return T -/obj/effect/proc_holder/spell/morph_spell/pass_airlock/can_cast(mob/living/simple_animal/hostile/morph/user, charge_check, show_message) +/datum/spell/morph_spell/pass_airlock/can_cast(mob/living/simple_animal/hostile/morph/user, charge_check, show_message) . = ..() if(!.) return @@ -26,7 +26,7 @@ to_chat(user, "You can only pass through airlocks in your true form!") return FALSE -/obj/effect/proc_holder/spell/morph_spell/pass_airlock/cast(list/targets, mob/living/simple_animal/hostile/morph/user) +/datum/spell/morph_spell/pass_airlock/cast(list/targets, mob/living/simple_animal/hostile/morph/user) var/obj/machinery/door/airlock/A = targets[1] if(A.locked) to_chat(user, "[A] is bolted shut! You're unable to create a crack to pass through!") @@ -49,5 +49,5 @@ user.forceMove(A.loc) // Move into the turf of the airlock -/obj/effect/proc_holder/spell/morph_spell/pass_airlock/proc/pass_check(mob/living/simple_animal/hostile/morph/user, obj/machinery/door/airlock/A) +/datum/spell/morph_spell/pass_airlock/proc/pass_check(mob/living/simple_animal/hostile/morph/user, obj/machinery/door/airlock/A) return user.morphed || A.locked diff --git a/code/game/gamemodes/miniantags/morph/spells/reproduce.dm b/code/game/gamemodes/miniantags/morph/spells/reproduce.dm index 814c16cc06a3..d1396646ad7b 100644 --- a/code/game/gamemodes/miniantags/morph/spells/reproduce.dm +++ b/code/game/gamemodes/miniantags/morph/spells/reproduce.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/morph_spell/reproduce +/datum/spell/morph_spell/reproduce name = "Reproduce" desc = "Split yourself in half making a new morph. Can only be used while on a floor. Makes you temporarily unable to vent crawl." hunger_cost = 150 // 5 humans @@ -6,10 +6,10 @@ action_icon_state = "morph_reproduce" create_attack_logs = FALSE -/obj/effect/proc_holder/spell/morph_spell/reproduce/create_new_targeting() +/datum/spell/morph_spell/reproduce/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/morph_spell/reproduce/can_cast(mob/living/simple_animal/hostile/morph/user, charge_check, show_message) +/datum/spell/morph_spell/reproduce/can_cast(mob/living/simple_animal/hostile/morph/user, charge_check, show_message) . = ..() if(!.) return @@ -18,7 +18,7 @@ to_chat(user, "You can only split while on flooring!") return FALSE -/obj/effect/proc_holder/spell/morph_spell/reproduce/cast(list/targets, mob/living/simple_animal/hostile/morph/user) +/datum/spell/morph_spell/reproduce/cast(list/targets, mob/living/simple_animal/hostile/morph/user) to_chat(user, "You prepare to split in two, making you unable to vent crawl!") user.ventcrawler = VENTCRAWLER_NONE // Temporarily disable it var/list/candidates = SSghost_spawns.poll_candidates("Do you want to play as a morph?", ROLE_MORPH, TRUE, poll_time = 10 SECONDS, source = /mob/living/simple_animal/hostile/morph) diff --git a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm index 664ffe97b595..993273c39b75 100644 --- a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm +++ b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm @@ -254,16 +254,16 @@ SSticker.mode.traitors |= mind /mob/living/simple_animal/demon/pulse_demon/proc/give_spells() - AddSpell(new /obj/effect/proc_holder/spell/pulse_demon/cycle_camera) - AddSpell(new /obj/effect/proc_holder/spell/pulse_demon/toggle/do_drain(do_drain)) - AddSpell(new /obj/effect/proc_holder/spell/pulse_demon/toggle/can_exit_cable(can_exit_cable)) - AddSpell(new /obj/effect/proc_holder/spell/pulse_demon/cablehop) - AddSpell(new /obj/effect/proc_holder/spell/pulse_demon/emagtamper) - AddSpell(new /obj/effect/proc_holder/spell/pulse_demon/emp) - AddSpell(new /obj/effect/proc_holder/spell/pulse_demon/overload) - AddSpell(new /obj/effect/proc_holder/spell/pulse_demon/remotehijack) - AddSpell(new /obj/effect/proc_holder/spell/pulse_demon/remotedrain) - AddSpell(new /obj/effect/proc_holder/spell/pulse_demon/open_upgrades) + AddSpell(new /datum/spell/pulse_demon/cycle_camera) + AddSpell(new /datum/spell/pulse_demon/toggle/do_drain(do_drain)) + AddSpell(new /datum/spell/pulse_demon/toggle/can_exit_cable(can_exit_cable)) + AddSpell(new /datum/spell/pulse_demon/cablehop) + AddSpell(new /datum/spell/pulse_demon/emagtamper) + AddSpell(new /datum/spell/pulse_demon/emp) + AddSpell(new /datum/spell/pulse_demon/overload) + AddSpell(new /datum/spell/pulse_demon/remotehijack) + AddSpell(new /datum/spell/pulse_demon/remotedrain) + AddSpell(new /datum/spell/pulse_demon/open_upgrades) /mob/living/simple_animal/demon/pulse_demon/get_status_tab_items() var/list/status_tab_data = ..() @@ -299,7 +299,7 @@ forceMove(T) Move(T) if(!current_cable && !current_power) - var/obj/effect/proc_holder/spell/pulse_demon/toggle/can_exit_cable/S = locate() in mob_spell_list + var/datum/spell/pulse_demon/toggle/can_exit_cable/S = locate() in mob_spell_list if(!S.locked && !can_exit_cable) can_exit_cable = TRUE S.do_toggle(can_exit_cable) @@ -318,7 +318,7 @@ if((!prev && !controlling_area) || (prev && controlling_area)) return // only update icons when we get or no longer have ANY area - for(var/obj/effect/proc_holder/spell/pulse_demon/S in mob_spell_list) + for(var/datum/spell/pulse_demon/S in mob_spell_list) if(!S.action || S.locked) continue if(S.requires_area) @@ -429,7 +429,7 @@ charge_drained += realdelta update_glow() - for(var/obj/effect/proc_holder/spell/pulse_demon/S in mob_spell_list) + for(var/datum/spell/pulse_demon/S in mob_spell_list) if(!S.action || S.locked || !S.cast_cost) continue var/dist = S.cast_cost - orig diff --git a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon_abilities.dm b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon_abilities.dm index 6901e46e7d7b..fb537324b9ab 100644 --- a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon_abilities.dm +++ b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon_abilities.dm @@ -8,7 +8,7 @@ #define PD_UPGRADE_HEALTH_COST "Efficiency" #define PD_UPGRADE_MAX_CHARGE "Capacity" -/obj/effect/proc_holder/spell/pulse_demon +/datum/spell/pulse_demon panel = "Pulse Demon" school = "pulse demon" clothes_req = FALSE @@ -21,11 +21,11 @@ base_cooldown = 20 SECONDS level_max = 4 -/obj/effect/proc_holder/spell/pulse_demon/New() +/datum/spell/pulse_demon/New() . = ..() update_info() -/obj/effect/proc_holder/spell/pulse_demon/proc/update_info() +/datum/spell/pulse_demon/proc/update_info() if(locked) name = "[initial(name)] (Locked) ([format_si_suffix(unlock_cost)]W)" desc = "[initial(desc)] It costs [format_si_suffix(unlock_cost)]W to unlock." @@ -36,7 +36,7 @@ action.desc = desc action.UpdateButtons() -/obj/effect/proc_holder/spell/pulse_demon/can_cast(mob/living/simple_animal/demon/pulse_demon/user, charge_check, show_message) +/datum/spell/pulse_demon/can_cast(mob/living/simple_animal/demon/pulse_demon/user, charge_check, show_message) if(!..()) return FALSE if(!istype(user)) @@ -57,7 +57,7 @@ return FALSE return TRUE -/obj/effect/proc_holder/spell/pulse_demon/cast(list/targets, mob/living/simple_animal/demon/pulse_demon/user) +/datum/spell/pulse_demon/cast(list/targets, mob/living/simple_animal/demon/pulse_demon/user) if(!istype(user) || locked || user.charge < cast_cost || !length(targets)) return FALSE if(requires_area && !user.controlling_area) @@ -72,14 +72,14 @@ revert_cast(user) return FALSE -/obj/effect/proc_holder/spell/pulse_demon/create_new_targeting() +/datum/spell/pulse_demon/create_new_targeting() return new /datum/spell_targeting/clicked_atom -/obj/effect/proc_holder/spell/pulse_demon/proc/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) +/datum/spell/pulse_demon/proc/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) return FALSE // handles purchasing and upgrading abilities -/obj/effect/proc_holder/spell/pulse_demon/AltClick(mob/living/simple_animal/demon/pulse_demon/user) +/datum/spell/pulse_demon/AltClick(mob/living/simple_animal/demon/pulse_demon/user) if(!istype(user)) return @@ -115,11 +115,11 @@ else to_chat(user, "You cannot afford to upgrade this ability! It costs [format_si_suffix(upgrade_cost)]W to upgrade.") -/obj/effect/proc_holder/spell/pulse_demon/proc/do_upgrade(mob/living/simple_animal/demon/pulse_demon/user) +/datum/spell/pulse_demon/proc/do_upgrade(mob/living/simple_animal/demon/pulse_demon/user) cooldown_handler.recharge_duration = round(base_cooldown / (1.5 ** spell_level)) to_chat(user, "You have upgraded [initial(name)] to level [spell_level + 1], it now takes [cooldown_handler.recharge_duration / 10] seconds to recharge.") -/obj/effect/proc_holder/spell/pulse_demon/cablehop +/datum/spell/pulse_demon/cablehop name = "Cable Hop" desc = "Jump to another cable in view." action_icon_state = "pd_cablehop" @@ -127,7 +127,7 @@ cast_cost = 5 KW upgrade_cost = 75 KW -/obj/effect/proc_holder/spell/pulse_demon/cablehop/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) +/datum/spell/pulse_demon/cablehop/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) var/turf/O = get_turf(user) var/turf/T = get_turf(target) var/obj/structure/cable/C = locate(/obj/structure/cable) in T @@ -145,7 +145,7 @@ user.Move(T) return TRUE -/obj/effect/proc_holder/spell/pulse_demon/emagtamper +/datum/spell/pulse_demon/emagtamper name = "Electromagnetic Tamper" desc = "Unlocks hidden programming in machines. Must be inside a hijacked APC to use." action_icon_state = "pd_emag" @@ -154,12 +154,12 @@ upgrade_cost = 200 KW requires_area = TRUE -/obj/effect/proc_holder/spell/pulse_demon/emagtamper/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) +/datum/spell/pulse_demon/emagtamper/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) to_chat(user, "You attempt to tamper with [target]!") target.emag_act(user) return TRUE -/obj/effect/proc_holder/spell/pulse_demon/emp +/datum/spell/pulse_demon/emp name = "Electromagnetic Pulse" desc = "Creates an EMP where you click. Be careful not to use it on yourself!" action_icon_state = "pd_emp" @@ -168,12 +168,12 @@ upgrade_cost = 200 KW requires_area = TRUE -/obj/effect/proc_holder/spell/pulse_demon/emp/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) +/datum/spell/pulse_demon/emp/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) to_chat(user, "You attempt to EMP [target]!") empulse(get_turf(target), 1, 1) return TRUE -/obj/effect/proc_holder/spell/pulse_demon/overload +/datum/spell/pulse_demon/overload name = "Overload Machine" desc = "Overloads a machine, causing it to explode." action_icon_state = "pd_overload" @@ -182,7 +182,7 @@ upgrade_cost = 500 KW requires_area = TRUE -/obj/effect/proc_holder/spell/pulse_demon/overload/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) +/datum/spell/pulse_demon/overload/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) var/obj/machinery/M = target if(!istype(M)) to_chat(user, "That is not a machine.") @@ -194,13 +194,13 @@ addtimer(CALLBACK(src, PROC_REF(detonate), M), 5 SECONDS) return TRUE -/obj/effect/proc_holder/spell/pulse_demon/overload/proc/detonate(obj/machinery/target) +/datum/spell/pulse_demon/overload/proc/detonate(obj/machinery/target) if(!QDELETED(target)) explosion(get_turf(target), 0, 1, 1, 0) if(!QDELETED(target)) qdel(target) -/obj/effect/proc_holder/spell/pulse_demon/remotehijack +/datum/spell/pulse_demon/remotehijack name = "Remote Hijack" desc = "Remotely hijacks an APC." action_icon_state = "pd_remotehack" @@ -209,7 +209,7 @@ level_max = 0 base_cooldown = 3 SECONDS // you have to wait for the regular hijack time anyway -/obj/effect/proc_holder/spell/pulse_demon/remotehijack/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) +/datum/spell/pulse_demon/remotehijack/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) var/obj/machinery/power/apc/A = target if(!istype(A)) to_chat(user, "That is not an APC.") @@ -218,7 +218,7 @@ to_chat(user, "You cannot hijack that APC right now!") return TRUE -/obj/effect/proc_holder/spell/pulse_demon/remotedrain +/datum/spell/pulse_demon/remotedrain name = "Remote Drain" desc = "Remotely drains a power source." action_icon_state = "pd_remotedrain" @@ -226,7 +226,7 @@ cast_cost = 100 upgrade_cost = 100 KW -/obj/effect/proc_holder/spell/pulse_demon/remotedrain/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) +/datum/spell/pulse_demon/remotedrain/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) if(isapc(target)) var/drained = user.drain_APC(target, PULSEDEMON_REMOTE_DRAIN_MULTIPLIER) if(drained == PULSEDEMON_SOURCE_DRAIN_INVALID) @@ -241,20 +241,20 @@ return FALSE return TRUE -/obj/effect/proc_holder/spell/pulse_demon/toggle +/datum/spell/pulse_demon/toggle base_cooldown = 0 cast_cost = 0 create_attack_logs = FALSE var/base_message = "see messages you shouldn't!" -/obj/effect/proc_holder/spell/pulse_demon/toggle/New(initstate = FALSE) +/datum/spell/pulse_demon/toggle/New(initstate = FALSE) . = ..() do_toggle(initstate, null) -/obj/effect/proc_holder/spell/pulse_demon/toggle/create_new_targeting() +/datum/spell/pulse_demon/toggle/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/pulse_demon/toggle/proc/do_toggle(varstate, mob/user) +/datum/spell/pulse_demon/toggle/proc/do_toggle(varstate, mob/user) if(action) action.background_icon_state = varstate ? action_background_icon_state : "[action_background_icon_state]_disabled" action.UpdateButtons() @@ -262,7 +262,7 @@ to_chat(user, "You will [varstate ? "now" : "no longer"] [base_message]") return varstate -/obj/effect/proc_holder/spell/pulse_demon/toggle/do_drain +/datum/spell/pulse_demon/toggle/do_drain name = "Toggle Draining" desc = "Toggle whether you drain charge from power sources." base_message = "drain charge from power sources." @@ -270,11 +270,11 @@ locked = FALSE level_max = 0 -/obj/effect/proc_holder/spell/pulse_demon/toggle/do_drain/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) +/datum/spell/pulse_demon/toggle/do_drain/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) user.do_drain = do_toggle(!user.do_drain, user) return TRUE -/obj/effect/proc_holder/spell/pulse_demon/toggle/do_drain/AltClick(mob/living/simple_animal/demon/pulse_demon/user) +/datum/spell/pulse_demon/toggle/do_drain/AltClick(mob/living/simple_animal/demon/pulse_demon/user) if(!istype(user)) return @@ -288,7 +288,7 @@ user.power_drain_rate = amount to_chat(user, "Drain speed has been set to [format_si_suffix(user.power_drain_rate)]W per second.") -/obj/effect/proc_holder/spell/pulse_demon/toggle/can_exit_cable +/datum/spell/pulse_demon/toggle/can_exit_cable name = "Toggle Self-Sustaining" desc = "Toggle whether you can move outside of cables or power sources." base_message = "move outside of cables." @@ -297,18 +297,18 @@ upgrade_cost = 300 KW level_max = 3 -/obj/effect/proc_holder/spell/pulse_demon/toggle/can_exit_cable/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) +/datum/spell/pulse_demon/toggle/can_exit_cable/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) if(user.can_exit_cable && !(user.current_cable || user.current_power)) to_chat(user, "Enter a cable or power source first!") return FALSE user.can_exit_cable = do_toggle(!user.can_exit_cable, user) return TRUE -/obj/effect/proc_holder/spell/pulse_demon/toggle/can_exit_cable/do_upgrade(mob/living/simple_animal/demon/pulse_demon/user) +/datum/spell/pulse_demon/toggle/can_exit_cable/do_upgrade(mob/living/simple_animal/demon/pulse_demon/user) user.outside_cable_speed = max(initial(user.outside_cable_speed) - spell_level, 1) to_chat(user, "You have upgraded [initial(name)] to level [spell_level + 1], you will now move faster outside of cables.") -/obj/effect/proc_holder/spell/pulse_demon/cycle_camera +/datum/spell/pulse_demon/cycle_camera name = "Cycle Camera View" desc = "Jump between the cameras in your APC's area. Alt-click to return to the APC." action_icon_state = "pd_camera_view" @@ -320,10 +320,10 @@ requires_area = TRUE var/current_camera = 0 -/obj/effect/proc_holder/spell/pulse_demon/cycle_camera/create_new_targeting() +/datum/spell/pulse_demon/cycle_camera/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/pulse_demon/cycle_camera/AltClick(mob/living/simple_animal/demon/pulse_demon/user) +/datum/spell/pulse_demon/cycle_camera/AltClick(mob/living/simple_animal/demon/pulse_demon/user) if(!istype(user)) return current_camera = 0 @@ -334,7 +334,7 @@ return user.forceMove(user.current_power) -/obj/effect/proc_holder/spell/pulse_demon/cycle_camera/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) +/datum/spell/pulse_demon/cycle_camera/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) if(!length(user.controlling_area.cameras)) return FALSE @@ -352,7 +352,7 @@ user.forceMove(locateUID(user.controlling_area.cameras[current_camera + 1])) return TRUE -/obj/effect/proc_holder/spell/pulse_demon/open_upgrades +/datum/spell/pulse_demon/open_upgrades name = "Open Upgrade Menu" desc = "Open the upgrades menu. Alt-click for descriptions and costs." action_icon_state = "pd_upgrade" @@ -380,10 +380,10 @@ PD_UPGRADE_MAX_CHARGE = "Increase the total amount of charge you can have at once." ) -/obj/effect/proc_holder/spell/pulse_demon/open_upgrades/create_new_targeting() +/datum/spell/pulse_demon/open_upgrades/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/pulse_demon/open_upgrades/proc/calc_cost(mob/living/simple_animal/demon/pulse_demon/user, upgrade) +/datum/spell/pulse_demon/open_upgrades/proc/calc_cost(mob/living/simple_animal/demon/pulse_demon/user, upgrade) var/cost switch(upgrade) if(PD_UPGRADE_HIJACK_SPEED) @@ -416,7 +416,7 @@ return -1 return round(cost) -/obj/effect/proc_holder/spell/pulse_demon/open_upgrades/proc/get_upgrades(mob/living/simple_animal/demon/pulse_demon/user) +/datum/spell/pulse_demon/open_upgrades/proc/get_upgrades(mob/living/simple_animal/demon/pulse_demon/user) var/upgrades = list() for(var/upgrade in upgrade_icons) var/cost = calc_cost(user, upgrade) @@ -425,7 +425,7 @@ upgrades["[upgrade] ([format_si_suffix(cost)]W)"] = upgrade_icons[upgrade] return upgrades -/obj/effect/proc_holder/spell/pulse_demon/open_upgrades/AltClick(mob/living/simple_animal/demon/pulse_demon/user) +/datum/spell/pulse_demon/open_upgrades/AltClick(mob/living/simple_animal/demon/pulse_demon/user) if(!istype(user)) return @@ -434,7 +434,7 @@ var/cost = calc_cost(user, upgrade) to_chat(user, "[upgrade] ([cost == -1 ? "Fully Upgraded" : "[format_si_suffix(cost)]W"]) - [upgrade_descs[upgrade]]") -/obj/effect/proc_holder/spell/pulse_demon/open_upgrades/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) +/datum/spell/pulse_demon/open_upgrades/try_cast_action(mob/living/simple_animal/demon/pulse_demon/user, atom/target) var/upgrades = get_upgrades(user) if(!length(upgrades)) to_chat(user, "You have already fully upgraded everything available!") diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index bd3959475574..790fa4ee4478 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -192,13 +192,13 @@ to_chat(src, chat_box_red(messages.Join("
"))) /mob/living/simple_animal/revenant/proc/giveSpells() - mind.AddSpell(new /obj/effect/proc_holder/spell/night_vision/revenant(null)) - mind.AddSpell(new /obj/effect/proc_holder/spell/revenant_transmit(null)) - mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/revenant/defile(null)) - mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/revenant/malfunction(null)) - mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/revenant/overload(null)) - mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/revenant/haunt_object(null)) - mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/revenant/hallucinations(null)) + mind.AddSpell(new /datum/spell/night_vision/revenant(null)) + mind.AddSpell(new /datum/spell/revenant_transmit(null)) + mind.AddSpell(new /datum/spell/aoe/revenant/defile(null)) + mind.AddSpell(new /datum/spell/aoe/revenant/malfunction(null)) + mind.AddSpell(new /datum/spell/aoe/revenant/overload(null)) + mind.AddSpell(new /datum/spell/aoe/revenant/haunt_object(null)) + mind.AddSpell(new /datum/spell/aoe/revenant/hallucinations(null)) return TRUE diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm index bc3b622ad25f..0bb6122c1b22 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm @@ -108,7 +108,7 @@ return //Toggle night vision: lets the revenant toggle its night vision -/obj/effect/proc_holder/spell/night_vision/revenant +/datum/spell/night_vision/revenant base_cooldown = 0 panel = "Revenant Abilities" message = "You toggle your night vision." @@ -116,7 +116,7 @@ action_background_icon_state = "bg_revenant" //Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob -/obj/effect/proc_holder/spell/revenant_transmit +/datum/spell/revenant_transmit name = "Transmit" desc = "Telepathically transmits a message to the target." panel = "Revenant Abilities" @@ -125,12 +125,12 @@ action_icon_state = "r_transmit" action_background_icon_state = "bg_revenant" -/obj/effect/proc_holder/spell/revenant_transmit/create_new_targeting() +/datum/spell/revenant_transmit/create_new_targeting() var/datum/spell_targeting/targeted/T = new() T.allowed_type = /mob/living return T -/obj/effect/proc_holder/spell/revenant_transmit/cast(list/targets, mob/living/simple_animal/revenant/user = usr) +/datum/spell/revenant_transmit/cast(list/targets, mob/living/simple_animal/revenant/user = usr) for(var/mob/living/M in targets) spawn(0) var/msg = tgui_input_text(user, "What do you wish to tell [M]?", "Transmit") @@ -141,7 +141,7 @@ to_chat(user, "You transmit to [M]: [msg]") to_chat(M, "An alien voice resonates from all around... [msg]") -/obj/effect/proc_holder/spell/aoe/revenant +/datum/spell/aoe/revenant name = "Spell" clothes_req = FALSE action_background_icon_state = "bg_revenant" @@ -157,20 +157,20 @@ /// How much essence it costs to use var/cast_amount = 50 -/obj/effect/proc_holder/spell/aoe/revenant/New() +/datum/spell/aoe/revenant/New() ..() if(locked) name = "[initial(name)] ([unlock_amount]E)" else name = "[initial(name)] ([cast_amount]E)" -/obj/effect/proc_holder/spell/aoe/revenant/revert_cast(mob/user) +/datum/spell/aoe/revenant/revert_cast(mob/user) . = ..() to_chat(user, "Your ability wavers and fails!") var/mob/living/simple_animal/revenant/R = user R?.essence += cast_amount //refund the spell and reset -/obj/effect/proc_holder/spell/aoe/revenant/can_cast(mob/living/simple_animal/revenant/user = usr, charge_check = TRUE, show_message = FALSE) +/datum/spell/aoe/revenant/can_cast(mob/living/simple_animal/revenant/user = usr, charge_check = TRUE, show_message = FALSE) if(user.inhibited) return FALSE if(cooldown_handler.is_on_cooldown()) @@ -182,7 +182,7 @@ return FALSE return TRUE -/obj/effect/proc_holder/spell/aoe/revenant/proc/attempt_cast(mob/living/simple_animal/revenant/user = usr) +/datum/spell/aoe/revenant/proc/attempt_cast(mob/living/simple_animal/revenant/user = usr) if(locked) if(!user.castcheck(-unlock_amount)) cooldown_handler.revert_cast() @@ -204,7 +204,7 @@ return TRUE //Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people. -/obj/effect/proc_holder/spell/aoe/revenant/overload +/datum/spell/aoe/revenant/overload name = "Overload Lights" desc = "Directs a large amount of essence into nearby electrical lights, causing lights to shock those nearby." base_cooldown = 20 SECONDS @@ -215,21 +215,21 @@ action_icon_state = "overload_lights" aoe_range = 5 -/obj/effect/proc_holder/spell/aoe/revenant/overload/create_new_targeting() +/datum/spell/aoe/revenant/overload/create_new_targeting() var/datum/spell_targeting/aoe/targeting = new() targeting.range = aoe_range targeting.allowed_type = /obj/machinery/light return targeting -/obj/effect/proc_holder/spell/aoe/revenant/overload/cast(list/targets, mob/living/simple_animal/revenant/user = usr) +/datum/spell/aoe/revenant/overload/cast(list/targets, mob/living/simple_animal/revenant/user = usr) if(attempt_cast(user)) for(var/obj/machinery/light/L as anything in targets) INVOKE_ASYNC(src, PROC_REF(shock_lights), L, user) -/obj/effect/proc_holder/spell/aoe/revenant/overload/proc/shock_lights(obj/machinery/light/L, mob/living/simple_animal/revenant/user) +/datum/spell/aoe/revenant/overload/proc/shock_lights(obj/machinery/light/L, mob/living/simple_animal/revenant/user) if(!L.on) return - L.visible_message("\The [L] suddenly flares brightly and begins to spark!") + L.visible_message("\The [L] suddenly flares brightly and begins to spark!") do_sparks(4, 0, L) new /obj/effect/temp_visual/revenant(L.loc) sleep(2 SECONDS) @@ -246,7 +246,7 @@ playsound(M, 'sound/machines/defib_zap.ogg', 50, TRUE, -1) //Defile: Corrupts nearby stuff, unblesses floor tiles. -/obj/effect/proc_holder/spell/aoe/revenant/defile +/datum/spell/aoe/revenant/defile name = "Defile" desc = "Twists and corrupts the nearby area as well as dispelling holy auras on floors." base_cooldown = 15 SECONDS @@ -257,12 +257,12 @@ action_icon_state = "defile" aoe_range = 4 -/obj/effect/proc_holder/spell/aoe/revenant/defile/create_new_targeting() +/datum/spell/aoe/revenant/defile/create_new_targeting() var/datum/spell_targeting/aoe/turf/targeting = new() targeting.range = aoe_range return targeting -/obj/effect/proc_holder/spell/aoe/revenant/defile/cast(list/targets, mob/living/simple_animal/revenant/user = usr) +/datum/spell/aoe/revenant/defile/cast(list/targets, mob/living/simple_animal/revenant/user = usr) if(!attempt_cast(user)) return for(var/turf/T in targets) @@ -271,7 +271,7 @@ A.defile() //Malfunction: Makes bad stuff happen to robots and machines. -/obj/effect/proc_holder/spell/aoe/revenant/malfunction +/datum/spell/aoe/revenant/malfunction name = "Malfunction" desc = "Corrupts and damages nearby machines and mechanical objects." base_cooldown = 200 @@ -280,18 +280,18 @@ action_icon_state = "malfunction" aoe_range = 2 -/obj/effect/proc_holder/spell/aoe/revenant/malfunction/create_new_targeting() +/datum/spell/aoe/revenant/malfunction/create_new_targeting() var/datum/spell_targeting/aoe/turf/targeting = new() targeting.range = aoe_range return targeting //A note to future coders: do not replace this with an EMP because it will wreck malf AIs and gang dominators and everyone will hate you. -/obj/effect/proc_holder/spell/aoe/revenant/malfunction/cast(list/targets, mob/living/simple_animal/revenant/user = usr) +/datum/spell/aoe/revenant/malfunction/cast(list/targets, mob/living/simple_animal/revenant/user = usr) if(attempt_cast(user)) for(var/turf/T in targets) INVOKE_ASYNC(src, PROC_REF(effect), user, T) -/obj/effect/proc_holder/spell/aoe/revenant/malfunction/proc/effect(mob/living/simple_animal/revenant/user, turf/T) +/datum/spell/aoe/revenant/malfunction/proc/effect(mob/living/simple_animal/revenant/user, turf/T) T.rev_malfunction(TRUE) for(var/atom/A in T.contents) A.rev_malfunction(TRUE) @@ -299,7 +299,7 @@ /** * Makes objects be haunted and then throws them at conscious people to do damage, spooky! */ -/obj/effect/proc_holder/spell/aoe/revenant/haunt_object +/datum/spell/aoe/revenant/haunt_object name = "Haunt Objects" desc = "Empower nearby objects to you with ghostly energy, causing them to attack nearby mortals. \ Items closer to you are more likely to be haunted." @@ -315,13 +315,13 @@ /// A list of all attack timers started by this spell being cast var/list/attack_timers = list() -/obj/effect/proc_holder/spell/aoe/revenant/haunt_object/create_new_targeting() +/datum/spell/aoe/revenant/haunt_object/create_new_targeting() var/datum/spell_targeting/aoe/targeting = new() targeting.range = aoe_range targeting.allowed_type = /obj/item return targeting -/obj/effect/proc_holder/spell/aoe/revenant/haunt_object/cast(list/targets, mob/living/simple_animal/revenant/user = usr) +/datum/spell/aoe/revenant/haunt_object/cast(list/targets, mob/living/simple_animal/revenant/user = usr) if(!attempt_cast(user)) return @@ -357,7 +357,7 @@ addtimer(CALLBACK(src, PROC_REF(stop_timers)), 65 SECONDS, TIMER_UNIQUE) /// Handles making an object haunted and setting it up to attack -/obj/effect/proc_holder/spell/aoe/revenant/haunt_object/proc/make_spooky(obj/item/item_to_possess, mob/living/simple_animal/revenant/user) +/datum/spell/aoe/revenant/haunt_object/proc/make_spooky(obj/item/item_to_possess, mob/living/simple_animal/revenant/user) new /obj/effect/temp_visual/revenant(get_turf(item_to_possess)) // Thematic spooky visuals var/mob/living/simple_animal/possessed_object/possessed_object = new(item_to_possess) // Begin haunting object item_to_possess.throwforce = min(item_to_possess.throwforce + 5, 15) // Damage it should do? throwforce+5 or 15, whichever is lower @@ -372,7 +372,7 @@ addtimer(CALLBACK(possessed_object, TYPE_PROC_REF(/mob/living/simple_animal/possessed_object, death)), 70 SECONDS, TIMER_UNIQUE) // De-haunt the object /// Handles finding a valid target and throwing us at it -/obj/effect/proc_holder/spell/aoe/revenant/haunt_object/proc/attack(mob/living/simple_animal/possessed_object/possessed_object, mob/living/simple_animal/revenant/user) +/datum/spell/aoe/revenant/haunt_object/proc/attack(mob/living/simple_animal/possessed_object/possessed_object, mob/living/simple_animal/revenant/user) var/list/potential_victims = list() for(var/turf/turf_to_search in spiral_range_turfs(aoe_range, get_turf(possessed_object))) for(var/mob/living/carbon/potential_victim in turf_to_search) @@ -393,20 +393,20 @@ possessed_object.throw_at(victim, aoe_range, 2, user, dodgeable = FALSE) /// Sets the glow on the haunted object, scales up based on throwforce -/obj/effect/proc_holder/spell/aoe/revenant/haunt_object/proc/set_outline(mob/living/simple_animal/possessed_object/possessed_object) +/datum/spell/aoe/revenant/haunt_object/proc/set_outline(mob/living/simple_animal/possessed_object/possessed_object) possessed_object.remove_filter("haunt_glow") var/outline_size = min((possessed_object.possessed_item.throwforce / 15) * 3, 3) possessed_object.add_filter("haunt_glow", 2, list("type" = "outline", "color" = "#7A4FA9", "size" = outline_size)) // Give it spooky purple outline /// Stop all attack timers cast by the previous spell use -/obj/effect/proc_holder/spell/aoe/revenant/haunt_object/proc/stop_timers() +/datum/spell/aoe/revenant/haunt_object/proc/stop_timers() for(var/I in attack_timers) deltimer(I) /** * Gives everyone in a 7 tile radius 2 minutes of hallucinations */ -/obj/effect/proc_holder/spell/aoe/revenant/hallucinations +/datum/spell/aoe/revenant/hallucinations name = "Hallucination Aura" desc = "Toy with the living nearby, giving them glimpses of things that could be or once were." action_icon_state = "hallucinations" @@ -416,13 +416,13 @@ stun = 1 SECONDS reveal = 3 SECONDS -/obj/effect/proc_holder/spell/aoe/revenant/hallucinations/create_new_targeting() +/datum/spell/aoe/revenant/hallucinations/create_new_targeting() var/datum/spell_targeting/aoe/targeting = new() targeting.range = aoe_range targeting.allowed_type = /mob/living/carbon return targeting -/obj/effect/proc_holder/spell/aoe/revenant/hallucinations/cast(list/targets, mob/living/simple_animal/revenant/user = usr) +/datum/spell/aoe/revenant/hallucinations/cast(list/targets, mob/living/simple_animal/revenant/user = usr) if(!attempt_cast(user)) return diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm index 47c24e01b488..77e4f3cbb7b4 100644 --- a/code/game/gamemodes/wizard/godhand.dm +++ b/code/game/gamemodes/wizard/godhand.dm @@ -3,7 +3,7 @@ desc = "High Five?" var/catchphrase = "High Five!" var/on_use_sound = null - var/obj/effect/proc_holder/spell/touch/attached_spell + var/datum/spell/touch/attached_spell icon = 'icons/obj/weapons/magical_weapons.dmi' icon_state = "disintegrate" item_state = null diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 713904da0d14..2190b08c3e15 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -400,9 +400,9 @@ if(SS.purified) make_holy() // Replace regular soulstone summoning with purified soulstones - if(is_type_in_list(/obj/effect/proc_holder/spell/aoe/conjure/build/soulstone, mob_spell_list)) - RemoveSpell(/obj/effect/proc_holder/spell/aoe/conjure/build/soulstone) - AddSpell(new /obj/effect/proc_holder/spell/aoe/conjure/build/soulstone/holy) + if(is_type_in_list(/datum/spell/aoe/conjure/build/soulstone, mob_spell_list)) + RemoveSpell(/datum/spell/aoe/conjure/build/soulstone) + AddSpell(new /datum/spell/aoe/conjure/build/soulstone/holy) else if(mind.has_antag_datum(/datum/antagonist/cultist)) // Re-grant cult actions, lost in the transfer var/datum/action/innate/cult/comm/CC = new diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index c35fb06081a4..049dd42d21d0 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -6,7 +6,7 @@ var/category = "Offensive" var/cost = 2 var/refundable = TRUE - var/obj/effect/proc_holder/spell/S = null //Since spellbooks can be used by only one person anyway we can track the actual spell + var/datum/spell/S = null //Since spellbooks can be used by only one person anyway we can track the actual spell var/buy_word = "Learn" var/limit //used to prevent a spellbook_entry from being bought more than X times with one wizard spellbook @@ -21,8 +21,8 @@ return LearnSpell(user, book, S) -/datum/spellbook_entry/proc/LearnSpell(mob/living/carbon/human/user, obj/item/spellbook/book, obj/effect/proc_holder/spell/newspell) - for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list) +/datum/spellbook_entry/proc/LearnSpell(mob/living/carbon/human/user, obj/item/spellbook/book, datum/spell/newspell) + for(var/datum/spell/aspell in user.mind.spell_list) if(initial(newspell.name) == initial(aspell.name)) // Not using directly in case it was learned from one spellbook then upgraded in another if(aspell.spell_level >= aspell.level_max) to_chat(user, "This spell cannot be improved further.") @@ -59,7 +59,7 @@ return FALSE if(!S) S = new spell_type() - for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list) + for(var/datum/spell/aspell in user.mind.spell_list) if(initial(S.name) == initial(aspell.name)) return TRUE return FALSE @@ -72,7 +72,7 @@ if(!S) //This happens when the spell's source is from another spellbook, from loadouts, or adminery, this create a new template temporary spell S = new spell_type() var/spell_levels = 0 - for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list) + for(var/datum/spell/aspell in user.mind.spell_list) if(initial(S.name) == initial(aspell.name)) spell_levels = aspell.spell_level user.mind.spell_list.Remove(aspell) @@ -97,126 +97,126 @@ //Offensive /datum/spellbook_entry/blind name = "Blind" - spell_type = /obj/effect/proc_holder/spell/trigger/blind + spell_type = /datum/spell/genetic/blind category = "Offensive" cost = 1 /datum/spellbook_entry/lightningbolt name = "Lightning Bolt" - spell_type = /obj/effect/proc_holder/spell/charge_up/bounce/lightning + spell_type = /datum/spell/charge_up/bounce/lightning category = "Offensive" cost = 1 /datum/spellbook_entry/cluwne name = "Curse of the Cluwne" - spell_type = /obj/effect/proc_holder/spell/touch/cluwne + spell_type = /datum/spell/touch/cluwne category = "Offensive" /datum/spellbook_entry/banana_touch name = "Banana Touch" - spell_type = /obj/effect/proc_holder/spell/touch/banana + spell_type = /datum/spell/touch/banana cost = 1 /datum/spellbook_entry/mime_malaise name = "Mime Malaise" - spell_type = /obj/effect/proc_holder/spell/touch/mime_malaise + spell_type = /datum/spell/touch/mime_malaise cost = 1 /datum/spellbook_entry/horseman name = "Curse of the Horseman" - spell_type = /obj/effect/proc_holder/spell/horsemask + spell_type = /datum/spell/horsemask category = "Offensive" /datum/spellbook_entry/disintegrate name = "Disintegrate" - spell_type = /obj/effect/proc_holder/spell/touch/disintegrate + spell_type = /datum/spell/touch/disintegrate category = "Offensive" /datum/spellbook_entry/fireball name = "Fireball" - spell_type = /obj/effect/proc_holder/spell/fireball + spell_type = /datum/spell/fireball category = "Offensive" /datum/spellbook_entry/summon_toolbox name = "Homing Toolbox" - spell_type = /obj/effect/proc_holder/spell/fireball/toolbox + spell_type = /datum/spell/fireball/toolbox category = "Offensive" cost = 1 /datum/spellbook_entry/fleshtostone name = "Flesh to Stone" - spell_type = /obj/effect/proc_holder/spell/touch/flesh_to_stone + spell_type = /datum/spell/touch/flesh_to_stone category = "Offensive" /datum/spellbook_entry/mutate name = "Mutate" - spell_type = /obj/effect/proc_holder/spell/genetic/mutate + spell_type = /datum/spell/genetic/mutate category = "Offensive" /datum/spellbook_entry/rod_form name = "Rod Form" - spell_type = /obj/effect/proc_holder/spell/rod_form + spell_type = /datum/spell/rod_form category = "Offensive" /datum/spellbook_entry/infinite_guns name = "Lesser Summon Guns" - spell_type = /obj/effect/proc_holder/spell/infinite_guns + spell_type = /datum/spell/infinite_guns category = "Offensive" //Defensive /datum/spellbook_entry/disabletech name = "Disable Tech" - spell_type = /obj/effect/proc_holder/spell/emplosion/disable_tech + spell_type = /datum/spell/emplosion/disable_tech category = "Defensive" cost = 1 /datum/spellbook_entry/forcewall name = "Force Wall" - spell_type = /obj/effect/proc_holder/spell/forcewall + spell_type = /datum/spell/forcewall category = "Defensive" cost = 1 /datum/spellbook_entry/rathens name = "Rathen's Secret" - spell_type = /obj/effect/proc_holder/spell/rathens + spell_type = /datum/spell/rathens category = "Defensive" cost = 2 /datum/spellbook_entry/repulse name = "Repulse" - spell_type = /obj/effect/proc_holder/spell/aoe/repulse + spell_type = /datum/spell/aoe/repulse category = "Defensive" cost = 1 /datum/spellbook_entry/smoke name = "Smoke" - spell_type = /obj/effect/proc_holder/spell/smoke + spell_type = /datum/spell/smoke category = "Defensive" cost = 1 /datum/spellbook_entry/lichdom name = "Bind Soul" - spell_type = /obj/effect/proc_holder/spell/lichdom + spell_type = /datum/spell/lichdom category = "Defensive" is_ragin_restricted = TRUE /datum/spellbook_entry/magicm name = "Magic Missile" - spell_type = /obj/effect/proc_holder/spell/projectile/magic_missile + spell_type = /datum/spell/projectile/magic_missile category = "Defensive" /datum/spellbook_entry/timestop name = "Time Stop" - spell_type = /obj/effect/proc_holder/spell/aoe/conjure/timestop + spell_type = /datum/spell/aoe/conjure/timestop category = "Defensive" /datum/spellbook_entry/sacred_flame name = "Sacred Flame and Fire Immunity" - spell_type = /obj/effect/proc_holder/spell/sacred_flame + spell_type = /datum/spell/sacred_flame cost = 1 category = "Defensive" -/datum/spellbook_entry/sacred_flame/LearnSpell(mob/living/carbon/human/user, obj/item/spellbook/book, obj/effect/proc_holder/spell/newspell) +/datum/spellbook_entry/sacred_flame/LearnSpell(mob/living/carbon/human/user, obj/item/spellbook/book, datum/spell/newspell) to_chat(user, "You feel fireproof.") ADD_TRAIT(user, TRAIT_RESISTHEAT, MAGIC_TRAIT) ADD_TRAIT(user, TRAIT_RESISTHIGHPRESSURE, MAGIC_TRAIT) @@ -230,11 +230,11 @@ /datum/spellbook_entry/summon_supermatter name = "Summon Supermatter Crystal" - spell_type = /obj/effect/proc_holder/spell/aoe/conjure/summon_supermatter + spell_type = /datum/spell/aoe/conjure/summon_supermatter cost = 3 category = "Defensive" -/datum/spellbook_entry/summon_supermatter/LearnSpell(mob/living/carbon/human/user, obj/item/spellbook/book, obj/effect/proc_holder/spell/newspell) +/datum/spellbook_entry/summon_supermatter/LearnSpell(mob/living/carbon/human/user, obj/item/spellbook/book, datum/spell/newspell) to_chat(user, "You feel a little bit of supermatter enter your body.") ADD_TRAIT(user, TRAIT_RADIMMUNE, MAGIC_TRAIT) ADD_TRAIT(user, SM_HALLUCINATION_IMMUNE, MAGIC_TRAIT) @@ -249,64 +249,64 @@ //Mobility /datum/spellbook_entry/knock name = "Knock" - spell_type = /obj/effect/proc_holder/spell/aoe/knock + spell_type = /datum/spell/aoe/knock category = "Mobility" cost = 1 /datum/spellbook_entry/blink name = "Blink" - spell_type = /obj/effect/proc_holder/spell/turf_teleport/blink + spell_type = /datum/spell/turf_teleport/blink category = "Mobility" /datum/spellbook_entry/jaunt name = "Ethereal Jaunt" - spell_type = /obj/effect/proc_holder/spell/ethereal_jaunt + spell_type = /datum/spell/ethereal_jaunt category = "Mobility" /datum/spellbook_entry/spacetime_dist name = "Spacetime Distortion" - spell_type = /obj/effect/proc_holder/spell/spacetime_dist + spell_type = /datum/spell/spacetime_dist cost = 1 //Better defence than greater forcewall (maybe) but good luck hitting anyone, so 1 point. category = "Mobility" /datum/spellbook_entry/greaterknock name = "Greater Knock" - spell_type = /obj/effect/proc_holder/spell/aoe/knock/greater + spell_type = /datum/spell/aoe/knock/greater category = "Mobility" refundable = 0 //global effect on cast /datum/spellbook_entry/mindswap name = "Mindswap" - spell_type = /obj/effect/proc_holder/spell/mind_transfer + spell_type = /datum/spell/mind_transfer category = "Mobility" /datum/spellbook_entry/teleport name = "Teleport" - spell_type = /obj/effect/proc_holder/spell/area_teleport/teleport + spell_type = /datum/spell/area_teleport/teleport category = "Mobility" //Assistance /datum/spellbook_entry/charge name = "Charge" - spell_type = /obj/effect/proc_holder/spell/charge + spell_type = /datum/spell/charge category = "Assistance" cost = 1 /datum/spellbook_entry/summonitem name = "Summon Item" - spell_type = /obj/effect/proc_holder/spell/summonitem + spell_type = /datum/spell/summonitem category = "Assistance" cost = 1 /datum/spellbook_entry/disguiseself name = "Disguise Self" - spell_type = /obj/effect/proc_holder/spell/disguise_self + spell_type = /datum/spell/disguise_self category = "Assistance" cost = 1 /datum/spellbook_entry/noclothes name = "Remove Clothes Requirement" - spell_type = /obj/effect/proc_holder/spell/noclothes + spell_type = /datum/spell/noclothes category = "Assistance" cost = 1 @@ -433,7 +433,7 @@ /datum/spellbook_entry/item/soulstones/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) . = ..() if(.) - user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/conjure/construct(null)) + user.mind.AddSpell(new /datum/spell/aoe/conjure/construct(null)) return . /datum/spellbook_entry/item/wands @@ -676,7 +676,7 @@ new path(B) user.put_in_hands(B) for(var/path in spells_path) - var/obj/effect/proc_holder/spell/S = new path() + var/datum/spell/S = new path() LearnSpell(user, book, S) OnBuy(user, book) return TRUE @@ -946,7 +946,7 @@ //Single Use Spellbooks /obj/item/spellbook/oneuse - var/spell = /obj/effect/proc_holder/spell/projectile/magic_missile //just a placeholder to avoid runtimes if someone spawned the generic + var/spell = /datum/spell/projectile/magic_missile //just a placeholder to avoid runtimes if someone spawned the generic var/spellname = "sandbox" var/used = FALSE name = "spellbook of " @@ -961,8 +961,8 @@ return /obj/item/spellbook/oneuse/attack_self(mob/user) - var/obj/effect/proc_holder/spell/S = new spell - for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) + var/datum/spell/S = new spell + for(var/datum/spell/knownspell in user.mind.spell_list) if(knownspell.type == S.type) if(user.mind) if(user.mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE || user.mind.special_role == SPECIAL_ROLE_WIZARD) @@ -990,7 +990,7 @@ return /obj/item/spellbook/oneuse/fireball - spell = /obj/effect/proc_holder/spell/fireball + spell = /datum/spell/fireball spellname = "fireball" icon_state = "bookfireball" desc = "This book feels warm to the touch." @@ -1001,7 +1001,7 @@ qdel(src) /obj/item/spellbook/oneuse/smoke - spell = /obj/effect/proc_holder/spell/smoke + spell = /datum/spell/smoke spellname = "smoke" icon_state = "booksmoke" desc = "This book is overflowing with the dank arts." @@ -1012,7 +1012,7 @@ user.adjust_nutrition(-200) /obj/item/spellbook/oneuse/blind - spell = /obj/effect/proc_holder/spell/trigger/blind + spell = /datum/spell/genetic/blind spellname = "blind" icon_state = "bookblind" desc = "This book looks blurry, no matter how you look at it." @@ -1025,7 +1025,7 @@ L.EyeBlind(20 SECONDS) /obj/item/spellbook/oneuse/mindswap - spell = /obj/effect/proc_holder/spell/mind_transfer + spell = /datum/spell/mind_transfer spellname = "mindswap" icon_state = "bookmindswap" desc = "This book's cover is pristine, though its pages look ragged and torn." @@ -1049,7 +1049,7 @@ to_chat(user, "You stare at the book some more, but there doesn't seem to be anything else to learn...") return - var/obj/effect/proc_holder/spell/mind_transfer/swapper = new + var/datum/spell/mind_transfer/swapper = new swapper.cast(user, stored_swap) to_chat(stored_swap, "You're suddenly somewhere else... and someone else?!") @@ -1057,7 +1057,7 @@ stored_swap = null /obj/item/spellbook/oneuse/forcewall - spell = /obj/effect/proc_holder/spell/forcewall + spell = /datum/spell/forcewall spellname = "forcewall" icon_state = "bookforcewall" desc = "This book has a dedication to mimes everywhere inside the front cover." @@ -1070,7 +1070,7 @@ user.drop_item() /obj/item/spellbook/oneuse/knock - spell = /obj/effect/proc_holder/spell/aoe/knock + spell = /datum/spell/aoe/knock spellname = "knock" icon_state = "bookknock" desc = "This book is hard to hold closed properly." @@ -1081,7 +1081,7 @@ user.Weaken(40 SECONDS) /obj/item/spellbook/oneuse/horsemask - spell = /obj/effect/proc_holder/spell/horsemask + spell = /datum/spell/horsemask spellname = "horses" icon_state = "bookhorses" desc = "This book is more horse than your mind has room for." @@ -1101,7 +1101,7 @@ to_chat(user, "I say thee neigh") /obj/item/spellbook/oneuse/charge - spell = /obj/effect/proc_holder/spell/charge + spell = /datum/spell/charge spellname = "charging" icon_state = "bookcharge" desc = "This book is made of 100% post-consumer wizard." @@ -1112,7 +1112,7 @@ empulse(src, 1, 1) /obj/item/spellbook/oneuse/summonitem - spell = /obj/effect/proc_holder/spell/summonitem + spell = /datum/spell/summonitem spellname = "instant summons" icon_state = "booksummons" desc = "This book is bright and garish, very hard to miss." @@ -1123,13 +1123,13 @@ qdel(src) /obj/item/spellbook/oneuse/fake_gib - spell = /obj/effect/proc_holder/spell/touch/fake_disintegrate + spell = /datum/spell/touch/fake_disintegrate spellname = "disintegrate" icon_state = "bookfireball" desc = "This book feels like it will rip stuff apart." /obj/item/spellbook/oneuse/sacredflame - spell = /obj/effect/proc_holder/spell/sacred_flame + spell = /datum/spell/sacred_flame spellname = "sacred flame" icon_state = "booksacredflame" desc = "Become one with the flames that burn within... and invite others to do so as well." diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 6c20df34f165..c0aacd4cf8ef 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -122,13 +122,13 @@ /mob/proc/spellremove() if(!mind) return - for(var/obj/effect/proc_holder/spell/spell_to_remove in mind.spell_list) + for(var/datum/spell/spell_to_remove in mind.spell_list) qdel(spell_to_remove) mind.spell_list -= spell_to_remove //To batch-remove mob spells. /mob/proc/mobspellremove() - for(var/obj/effect/proc_holder/spell/spell_to_remove in mob_spell_list) + for(var/datum/spell/spell_to_remove in mob_spell_list) qdel(spell_to_remove) mob_spell_list -= spell_to_remove diff --git a/code/game/gamemodes/wizard/wizloadouts.dm b/code/game/gamemodes/wizard/wizloadouts.dm index 836fb7b988be..8608d9132777 100644 --- a/code/game/gamemodes/wizard/wizloadouts.dm +++ b/code/game/gamemodes/wizard/wizloadouts.dm @@ -7,8 +7,8 @@ Ethereal Jaunt and Blink provide escape and mobility, while Magic Missile and Disintegrate can be used together for dangerous or key targets.
\ As this set lacks any form of healing or resurrection, healing items should be acquired from the station, and you should be careful to avoid being hurt in the first place.

\
Provides Mutate, Ethereal Jaunt, Blink, Magic Missile, and Disintegrate." - spells_path = list(/obj/effect/proc_holder/spell/genetic/mutate, /obj/effect/proc_holder/spell/ethereal_jaunt, /obj/effect/proc_holder/spell/turf_teleport/blink, \ - /obj/effect/proc_holder/spell/projectile/magic_missile, /obj/effect/proc_holder/spell/touch/disintegrate) + spells_path = list(/datum/spell/genetic/mutate, /datum/spell/ethereal_jaunt, /datum/spell/turf_teleport/blink, \ + /datum/spell/projectile/magic_missile, /datum/spell/touch/disintegrate) /datum/spellbook_entry/loadout/lich name = "Defense Focus - Lich" @@ -16,8 +16,8 @@ Ethereal Jaunt provides escape, Fireball and Rod Form are your offensive spells, and Disable Tech and Forcewall provides utility in disabling sec equipment or blocking their path.
\ Care should be taken in hiding the item you choose as your phylactery after using Bind Soul, as you cannot revive if it destroyed or too far from your body!

\
Provides Bind Soul, Ethereal Jaunt, Fireball, Rod Form, Disable Tech, and Greater Forcewall." - spells_path = list(/obj/effect/proc_holder/spell/lichdom, /obj/effect/proc_holder/spell/ethereal_jaunt, /obj/effect/proc_holder/spell/fireball, \ - /obj/effect/proc_holder/spell/rod_form, /obj/effect/proc_holder/spell/emplosion/disable_tech, /obj/effect/proc_holder/spell/forcewall) + spells_path = list(/datum/spell/lichdom, /datum/spell/ethereal_jaunt, /datum/spell/fireball, \ + /datum/spell/rod_form, /datum/spell/emplosion/disable_tech, /datum/spell/forcewall) is_ragin_restricted = TRUE /datum/spellbook_entry/loadout/wands @@ -27,8 +27,8 @@ Do not lose any of your wands to the station's crew, as they are extremely deadly even in their hands. Remember that the Revive wand can be used on yourself for a full heal!

\
Provides a Belt of Wands, Charge, Ethereal Jaunt, Blink, Repulse, and Disintegrate." items_path = list(/obj/item/storage/belt/wands/full) - spells_path = list(/obj/effect/proc_holder/spell/charge, /obj/effect/proc_holder/spell/ethereal_jaunt, /obj/effect/proc_holder/spell/turf_teleport/blink, \ - /obj/effect/proc_holder/spell/aoe/repulse, /obj/effect/proc_holder/spell/touch/disintegrate) + spells_path = list(/datum/spell/charge, /datum/spell/ethereal_jaunt, /datum/spell/turf_teleport/blink, \ + /datum/spell/aoe/repulse, /datum/spell/touch/disintegrate) //Unique loadouts, which are more gimmicky. Should contain some unique spell or item that separates it from just buying standard wiz spells, and be balanced around a 10 spell point cost. /datum/spellbook_entry/loadout/mimewiz @@ -37,14 +37,14 @@ Provides Finger Gun and Invisible Greater Wall manuals, Mime Robes, a Cane and Duct Tape, Ethereal Jaunt, Blink, Teleport, Mime Malaise, Knock, and Stop Time." items_path = list(/obj/item/spellbook/oneuse/mime/fingergun, /obj/item/spellbook/oneuse/mime/greaterwall, /obj/item/clothing/suit/wizrobe/mime, /obj/item/clothing/head/wizard/mime, \ /obj/item/clothing/mask/gas/mime/wizard, /obj/item/clothing/shoes/sandal/marisa, /obj/item/cane, /obj/item/stack/tape_roll) - spells_path = list(/obj/effect/proc_holder/spell/ethereal_jaunt, /obj/effect/proc_holder/spell/turf_teleport/blink, /obj/effect/proc_holder/spell/area_teleport/teleport, \ - /obj/effect/proc_holder/spell/touch/mime_malaise, /obj/effect/proc_holder/spell/aoe/knock, /obj/effect/proc_holder/spell/aoe/conjure/timestop) + spells_path = list(/datum/spell/ethereal_jaunt, /datum/spell/turf_teleport/blink, /datum/spell/area_teleport/teleport, \ + /datum/spell/touch/mime_malaise, /datum/spell/aoe/knock, /datum/spell/aoe/conjure/timestop) category = "Unique" destroy_spellbook = TRUE /datum/spellbook_entry/loadout/mimewiz/OnBuy(mob/living/carbon/human/user, obj/item/spellbook/book) if(user.mind) - user.mind.AddSpell(new /obj/effect/proc_holder/spell/mime/speak(null)) + user.mind.AddSpell(new /datum/spell/mime/speak(null)) user.mind.miming = TRUE /datum/spellbook_entry/loadout/gunreaper @@ -54,13 +54,13 @@ You will likely need to scavenge additional ammo or weapons aboard the station.

\
Provides a .357 Revolver, 4 speedloaders of ammo, Ethereal Jaunt, Blink, Summon Item, No Clothes, and Bind Soul, with a unique outfit." items_path = list(/obj/item/gun/projectile/revolver, /obj/item/ammo_box/a357, /obj/item/ammo_box/a357, /obj/item/ammo_box/a357, /obj/item/ammo_box/a357, /obj/item/clothing/under/syndicate) - spells_path = list(/obj/effect/proc_holder/spell/ethereal_jaunt, /obj/effect/proc_holder/spell/turf_teleport/blink, \ - /obj/effect/proc_holder/spell/summonitem, /obj/effect/proc_holder/spell/noclothes, /obj/effect/proc_holder/spell/lichdom/gunslinger) + spells_path = list(/datum/spell/ethereal_jaunt, /datum/spell/turf_teleport/blink, \ + /datum/spell/summonitem, /datum/spell/noclothes, /datum/spell/lichdom/gunslinger) category = "Unique" destroy_spellbook = TRUE is_ragin_restricted = TRUE -/obj/effect/proc_holder/spell/lichdom/gunslinger/equip_lich(mob/living/carbon/human/H) +/datum/spell/lichdom/gunslinger/equip_lich(mob/living/carbon/human/H) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(H), SLOT_HUD_OUTER_SUIT) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), SLOT_HUD_SHOES) H.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(H), SLOT_HUD_GLOVES) @@ -74,8 +74,8 @@ Provides His Grace, an Ancient Jumpsuit, an Assistant ID, a Gas Mask and Shoes, Insulated Gloves, a full Toolbelt, Ethereal Jaunt, Force Wall, Homing Toolbox, Knock and No Clothes." items_path = list(/obj/item/his_grace, /obj/item/clothing/under/color/grey/glorf, /obj/item/clothing/mask/gas, /obj/item/clothing/shoes/black, \ /obj/item/clothing/gloves/color/yellow, /obj/item/storage/belt/utility/full/multitool) - spells_path = list(/obj/effect/proc_holder/spell/ethereal_jaunt, /obj/effect/proc_holder/spell/forcewall, \ - /obj/effect/proc_holder/spell/aoe/knock, /obj/effect/proc_holder/spell/noclothes, /obj/effect/proc_holder/spell/fireball/toolbox) + spells_path = list(/datum/spell/ethereal_jaunt, /datum/spell/forcewall, \ + /datum/spell/aoe/knock, /datum/spell/noclothes, /datum/spell/fireball/toolbox) category = "Unique" destroy_spellbook = TRUE @@ -111,8 +111,8 @@ items_path = list(/obj/item/supermatter_halberd, /obj/item/clothing/gloves/color/white/supermatter_immune, \ /obj/item/clothing/suit/hooded/oblivion, /obj/item/clothing/mask/gas/voice_modulator/oblivion, /obj/item/tank/internals/emergency_oxygen/double, \ /obj/item/clothing/under/color/white/enforcer, /obj/item/clothing/shoes/white/enforcer) - spells_path = list(/obj/effect/proc_holder/spell/summonitem, /obj/effect/proc_holder/spell/charge_up/bounce/lightning, \ - /obj/effect/proc_holder/spell/aoe/conjure/summon_supermatter) + spells_path = list(/datum/spell/summonitem, /datum/spell/charge_up/bounce/lightning, \ + /datum/spell/aoe/conjure/summon_supermatter) category = "Unique" destroy_spellbook = TRUE @@ -125,7 +125,7 @@ name = "Fireball. Fireball. Fireball." desc = "Who cares about the rest of the spells. Become an expert in fire magic. Devote yourself to the craft. The only spell you need anyways is Fireball.
\
Provides fire immunity, homing fireballs, rapid-fire fireballs, and some fireball wands. Provides no mobility spells. Replaces your robes with infernal versions." - spells_path = list(/obj/effect/proc_holder/spell/sacred_flame, /obj/effect/proc_holder/spell/fireball/homing, /obj/effect/proc_holder/spell/infinite_guns/fireball) + spells_path = list(/datum/spell/sacred_flame, /datum/spell/fireball/homing, /datum/spell/infinite_guns/fireball) category = "Unique" destroy_spellbook = TRUE diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index 5d636d988f33..820b12c9a101 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -420,8 +420,8 @@ return if(H.mind) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/conjure/build/mime_wall(null)) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/mime/speak(null)) + H.mind.AddSpell(new /datum/spell/aoe/conjure/build/mime_wall(null)) + H.mind.AddSpell(new /datum/spell/mime/speak(null)) H.mind.miming = 1 qdel(H.GetComponent(/datum/component/footstep)) diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index 514e85bdc67b..f97ccfb5422b 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -79,7 +79,7 @@ B.deity_name = new_deity SSblackbox.record_feedback("text", "religion_deity", 1, "[new_deity]", 1) - user.AddSpell(new /obj/effect/proc_holder/spell/chaplain_bless(null)) + user.AddSpell(new /datum/spell/chaplain_bless(null)) if(SSticker) SSticker.Bible_deity_name = B.deity_name diff --git a/code/game/objects/items/granters/_granters.dm b/code/game/objects/items/granters/_granters.dm index cd1c4fa196c3..6978f29064c8 100644 --- a/code/game/objects/items/granters/_granters.dm +++ b/code/game/objects/items/granters/_granters.dm @@ -108,7 +108,7 @@ // Generic action giver /obj/item/book/granter/spell /// The typepath of spell that is given - var/obj/effect/proc_holder/spell/granted_spell + var/datum/spell/granted_spell /// The name of the spell, formatted in a more text-friendly way var/spell_name = "" diff --git a/code/game/objects/items/granters/action_granters/summon_cheese.dm b/code/game/objects/items/granters/action_granters/summon_cheese.dm index 62645a34def7..f86c89c86364 100644 --- a/code/game/objects/items/granters/action_granters/summon_cheese.dm +++ b/code/game/objects/items/granters/action_granters/summon_cheese.dm @@ -3,7 +3,7 @@ desc = "Wonderful! Time for a celebration... Cheese for everyone!" icon_state = "cheese_book" spell_name = "summon cheese" - granted_spell = /obj/effect/proc_holder/spell/aoe/conjure/summon_cheese + granted_spell = /datum/spell/aoe/conjure/summon_cheese remarks = list( "Always forward, never back...", "Are these pages... cheese slices?..", @@ -27,7 +27,7 @@ user.put_in_hands(book_cheese) qdel(src) -/obj/effect/proc_holder/spell/aoe/conjure/summon_cheese +/datum/spell/aoe/conjure/summon_cheese name = "Summon Cheese" desc = "Summon cheesy goodness around you!" base_cooldown = 1 MINUTES diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index d3495458b8f5..f5679c0ad1ef 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -302,7 +302,7 @@ dust_if_respawnable(C) to_chat(H, "You are a servant of [user.real_name]. You must do everything in your power to follow their orders.") - var/obj/effect/proc_holder/spell/summonmob/S = new + var/datum/spell/summonmob/S = new S.target_mob = H user.mind.AddSpell(S) if(17) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 8cf86712c077..c1e98e501944 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -571,10 +571,10 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( return var/list/spell_list = list() - var/type_length = length("/obj/effect/proc_holder/spell") + 2 + var/type_length = length("/datum/spell") + 2 for(var/A in GLOB.spells) spell_list[copytext("[A]", type_length)] = A - var/obj/effect/proc_holder/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spell_list + var/datum/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spell_list if(!S) return S = spell_list[S] diff --git a/code/modules/antagonists/vampire/vamp_datum.dm b/code/modules/antagonists/vampire/vamp_datum.dm index 65625b191a51..7ad89d6ef865 100644 --- a/code/modules/antagonists/vampire/vamp_datum.dm +++ b/code/modules/antagonists/vampire/vamp_datum.dm @@ -17,10 +17,10 @@ /// Nullrods and holywater make their abilities cost more var/nullified = 0 /// a list of powers that all vampires unlock and at what blood level they unlock them, the rest of their powers are found in the vampire_subclass datum - var/list/upgrade_tiers = list(/obj/effect/proc_holder/spell/vampire/self/rejuvenate = 0, - /obj/effect/proc_holder/spell/vampire/glare = 0, + var/list/upgrade_tiers = list(/datum/spell/vampire/self/rejuvenate = 0, + /datum/spell/vampire/glare = 0, /datum/vampire_passive/vision = 100, - /obj/effect/proc_holder/spell/vampire/self/specialize = 150, + /datum/spell/vampire/self/specialize = 150, /datum/vampire_passive/regen = 200, /datum/vampire_passive/vision/advanced = 500) @@ -47,12 +47,12 @@ /datum/antagonist/mindslave/thrall/apply_innate_effects(mob/living/mob_override) mob_override = ..() var/datum/mind/M = mob_override.mind - M.AddSpell(new /obj/effect/proc_holder/spell/vampire/thrall_commune) + M.AddSpell(new /datum/spell/vampire/thrall_commune) /datum/antagonist/mindslave/thrall/remove_innate_effects(mob/living/mob_override) mob_override = ..() var/datum/mind/M = mob_override.mind - M.RemoveSpell(/obj/effect/proc_holder/spell/vampire/thrall_commune) + M.RemoveSpell(/datum/spell/vampire/thrall_commune) /datum/antagonist/vampire/Destroy(force, ...) owner.current.create_log(CONVERSION_LOG, "De-vampired") @@ -73,7 +73,7 @@ /datum/antagonist/vampire/proc/force_add_ability(path) var/spell = new path(owner) powers += spell - if(istype(spell, /obj/effect/proc_holder/spell)) + if(istype(spell, /datum/spell)) owner.AddSpell(spell) if(istype(spell, /datum/vampire_passive)) var/datum/vampire_passive/passive = spell @@ -177,12 +177,12 @@ * Remove and delete the vampire's current subclass and all associated abilities. * * Arguments: - * * give_specialize_power - if the [specialize][/obj/effect/proc_holder/spell/vampire/self/specialize] power should be given back or not + * * give_specialize_power - if the [specialize][/datum/spell/vampire/self/specialize] power should be given back or not */ /datum/antagonist/vampire/proc/clear_subclass(give_specialize_power = TRUE) if(give_specialize_power) // Choosing a subclass in the first place removes this from `upgrade_tiers`, so add it back if needed. - upgrade_tiers[/obj/effect/proc_holder/spell/vampire/self/specialize] = 150 + upgrade_tiers[/datum/spell/vampire/self/specialize] = 150 remove_all_powers() QDEL_NULL(subclass) check_vampire_upgrade() @@ -220,8 +220,8 @@ /datum/antagonist/vampire/proc/announce_new_power(list/old_powers) for(var/p in powers) if(!(p in old_powers)) - if(istype(p, /obj/effect/proc_holder/spell)) - var/obj/effect/proc_holder/spell/power = p + if(istype(p, /datum/spell)) + var/datum/spell/power = p to_chat(owner.current, "[power.gain_desc]") else if(istype(p, /datum/vampire_passive)) var/datum/vampire_passive/power = p @@ -308,7 +308,7 @@ bloodtotal += blood_amount bloodusable += blood_amount check_vampire_upgrade(TRUE) - for(var/obj/effect/proc_holder/spell/S in powers) + for(var/datum/spell/S in powers) if(S.action) S.action.UpdateButtons() diff --git a/code/modules/antagonists/vampire/vampire_powers/dantalion_powers.dm b/code/modules/antagonists/vampire/vampire_powers/dantalion_powers.dm index c9dc978e2e2b..e078349bf7e9 100644 --- a/code/modules/antagonists/vampire/vampire_powers/dantalion_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/dantalion_powers.dm @@ -9,7 +9,7 @@ /datum/vampire_passive/increment_thrall_cap/three -/obj/effect/proc_holder/spell/vampire/enthrall +/datum/spell/vampire/enthrall name = "Enthrall (150)" desc = "You use a large portion of your power to sway those loyal to none to be loyal to you only." gain_desc = "You have gained the ability to thrall people to your will." @@ -17,13 +17,13 @@ required_blood = 150 deduct_blood_on_cast = FALSE -/obj/effect/proc_holder/spell/vampire/enthrall/create_new_targeting() +/datum/spell/vampire/enthrall/create_new_targeting() var/datum/spell_targeting/click/T = new T.range = 1 T.click_radius = 0 return T -/obj/effect/proc_holder/spell/vampire/enthrall/cast(list/targets, mob/user = usr) +/datum/spell/vampire/enthrall/cast(list/targets, mob/user = usr) var/datum/antagonist/vampire/vampire = user.mind.has_antag_datum(/datum/antagonist/vampire) var/mob/living/target = targets[1] user.visible_message("[user] bites [target]'s neck!", "You bite [target]'s neck and begin the flow of power.") @@ -38,7 +38,7 @@ revert_cast(user) to_chat(user, "You or your target moved.") -/obj/effect/proc_holder/spell/vampire/enthrall/proc/can_enthrall(mob/living/user, mob/living/carbon/C) +/datum/spell/vampire/enthrall/proc/can_enthrall(mob/living/user, mob/living/carbon/C) . = FALSE if(!C) CRASH("target was null while trying to vampire enthrall, attacker is [user] [user.key] \ref[user]") @@ -63,7 +63,7 @@ return return TRUE -/obj/effect/proc_holder/spell/vampire/enthrall/proc/handle_enthrall(mob/living/user, mob/living/carbon/human/H) +/datum/spell/vampire/enthrall/proc/handle_enthrall(mob/living/user, mob/living/carbon/human/H) if(!istype(H)) return FALSE @@ -75,17 +75,17 @@ user.create_log(CONVERSION_LOG, "vampire enthralled", H) H.create_log(CONVERSION_LOG, "was vampire enthralled", user) -/obj/effect/proc_holder/spell/vampire/thrall_commune +/datum/spell/vampire/thrall_commune name = "Commune" desc = "Talk to your thralls telepathically." gain_desc = "You have gained the ability to commune with your thralls." action_icon_state = "vamp_communication" base_cooldown = 2 SECONDS -/obj/effect/proc_holder/spell/vampire/thrall_commune/create_new_handler() //so thralls can use it +/datum/spell/vampire/thrall_commune/create_new_handler() //so thralls can use it return -/datum/spell_targeting/select_vampire_network/choose_targets(mob/user, obj/effect/proc_holder/spell/spell, params, atom/clicked_atom) // Returns the vampire and their thralls. If user is a thrall then it will look up their master's network +/datum/spell_targeting/select_vampire_network/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) // Returns the vampire and their thralls. If user is a thrall then it will look up their master's network var/list/mob/living/targets = list() var/datum/antagonist/vampire/V = user.mind.has_antag_datum(/datum/antagonist/vampire) // if the user is a vampire @@ -106,11 +106,11 @@ targets += V.owner.current return targets -/obj/effect/proc_holder/spell/vampire/thrall_commune/create_new_targeting() +/datum/spell/vampire/thrall_commune/create_new_targeting() var/datum/spell_targeting/select_vampire_network/T = new return T -/obj/effect/proc_holder/spell/vampire/thrall_commune/cast(list/targets, mob/user) +/datum/spell/vampire/thrall_commune/cast(list/targets, mob/user) var/input = tgui_input_text(user, "Enter a message to relay to the other thralls", "Thrall Commune") if(!input) revert_cast(user) @@ -124,7 +124,7 @@ log_say("(DANTALION) [input]", user) user.create_log(SAY_LOG, "(DANTALION) [input]") -/obj/effect/proc_holder/spell/vampire/pacify +/datum/spell/vampire/pacify name = "Pacify (10)" desc = "Pacify a target temporarily, making them unable to cause harm." gain_desc = "You have gained the ability to pacify someone's harmful tendencies, preventing them from doing any physical harm to anyone." @@ -132,18 +132,18 @@ base_cooldown = 30 SECONDS required_blood = 10 -/obj/effect/proc_holder/spell/vampire/pacify/create_new_targeting() +/datum/spell/vampire/pacify/create_new_targeting() var/datum/spell_targeting/click/T = new T.range = 7 T.click_radius = 1 T.allowed_type = /mob/living/carbon/human return T -/obj/effect/proc_holder/spell/vampire/pacify/cast(list/targets, mob/user) +/datum/spell/vampire/pacify/cast(list/targets, mob/user) for(var/mob/living/carbon/human/H as anything in targets) H.apply_status_effect(STATUS_EFFECT_PACIFIED) -/obj/effect/proc_holder/spell/vampire/switch_places +/datum/spell/vampire/switch_places name = "Subspace Swap (30)" desc = "Switch positions with a target." gain_desc = "You have gained the ability to switch positions with a targeted mob." @@ -152,7 +152,7 @@ base_cooldown = 30 SECONDS required_blood = 30 -/obj/effect/proc_holder/spell/vampire/switch_places/create_new_targeting() +/datum/spell/vampire/switch_places/create_new_targeting() var/datum/spell_targeting/click/T = new T.range = 7 T.click_radius = 1 @@ -160,14 +160,14 @@ T.allowed_type = /mob/living return T -/obj/effect/proc_holder/spell/vampire/switch_places/cast(list/targets, mob/user) +/datum/spell/vampire/switch_places/cast(list/targets, mob/user) var/mob/living/target = targets[1] var/turf/user_turf = get_turf(user) var/turf/target_turf = get_turf(target) target.forceMove(user_turf) user.forceMove(target_turf) -/obj/effect/proc_holder/spell/vampire/self/decoy +/datum/spell/vampire/self/decoy name = "Deploy Decoy (30)" desc = "Briefly turn invisible and deploy a decoy illusion to fool your prey." gain_desc = "You have gained the ability to turn invisible and create decoy illusions." @@ -175,7 +175,7 @@ required_blood = 30 base_cooldown = 40 SECONDS -/obj/effect/proc_holder/spell/vampire/self/decoy/cast(list/targets, mob/user) +/datum/spell/vampire/self/decoy/cast(list/targets, mob/user) var/mob/living/simple_animal/hostile/illusion/escape/E = new(get_turf(user)) E.Copy_Parent(user, 20, 20) E.GiveTarget(user) //so it starts running right away @@ -183,7 +183,7 @@ user.make_invisible() addtimer(CALLBACK(user, TYPE_PROC_REF(/mob/living, reset_visibility)), 6 SECONDS) -/obj/effect/proc_holder/spell/vampire/rally_thralls +/datum/spell/vampire/rally_thralls name = "Rally Thralls (100)" desc = "Removes all incapacitating effects from your nearby thralls." gain_desc = "You have gained the ability to remove all incapacitating effects from nearby thralls." @@ -191,18 +191,18 @@ required_blood = 100 base_cooldown = 100 SECONDS -/obj/effect/proc_holder/spell/vampire/rally_thralls/create_new_targeting() +/datum/spell/vampire/rally_thralls/create_new_targeting() var/datum/spell_targeting/aoe/thralls/A = new A.allowed_type = /mob/living/carbon/human A.range = 7 return A -/datum/spell_targeting/aoe/thralls/valid_target(target, user, obj/effect/proc_holder/spell/spell, check_if_in_range) +/datum/spell_targeting/aoe/thralls/valid_target(target, user, datum/spell/spell, check_if_in_range) if(!isvampirethrall(target)) return FALSE return ..() -/obj/effect/proc_holder/spell/vampire/rally_thralls/cast(list/targets, mob/user) +/datum/spell/vampire/rally_thralls/cast(list/targets, mob/user) for(var/mob/living/carbon/human/H as anything in targets) var/image/I = image('icons/effects/vampire_effects.dmi', "rallyoverlay", layer = EFFECTS_LAYER) playsound(H, 'sound/magic/staff_healing.ogg', 30) @@ -210,21 +210,21 @@ H.add_overlay(I) addtimer(CALLBACK(H, TYPE_PROC_REF(/atom, cut_overlay), I), 6 SECONDS) // this makes it obvious who your thralls are for a while. -/obj/effect/proc_holder/spell/vampire/self/share_damage +/datum/spell/vampire/self/share_damage name = "Blood Bond" desc = "Creates a net between you and your nearby thralls that evenly shares all damage received." gain_desc = "You have gained the ability to share damage between you and your thralls." action_icon_state = "blood_bond" required_blood = 5 -/obj/effect/proc_holder/spell/vampire/self/share_damage/cast(list/targets, mob/living/user) +/datum/spell/vampire/self/share_damage/cast(list/targets, mob/living/user) var/datum/status_effect/thrall_net/T = user.has_status_effect(STATUS_EFFECT_THRALL_NET) if(!T) user.apply_status_effect(STATUS_EFFECT_THRALL_NET, user.mind.has_antag_datum(/datum/antagonist/vampire)) return qdel(T) -/obj/effect/proc_holder/spell/vampire/hysteria +/datum/spell/vampire/hysteria name = "Mass Hysteria (70)" desc = "Casts a powerful illusion to make everyone nearby perceive others to looks like random animals after briefly blinding them." gain_desc = "You have gained the ability to make everyone nearby perceive others to looks like random animals after briefly blinding them." @@ -232,13 +232,13 @@ required_blood = 70 base_cooldown = 180 SECONDS -/obj/effect/proc_holder/spell/vampire/hysteria/create_new_targeting() +/datum/spell/vampire/hysteria/create_new_targeting() var/datum/spell_targeting/aoe/A = new A.range = 8 A.allowed_type = /mob/living/carbon/human return A -/obj/effect/proc_holder/spell/vampire/hysteria/cast(list/targets, mob/user) +/datum/spell/vampire/hysteria/cast(list/targets, mob/user) for(var/mob/living/carbon/human/H as anything in targets) if(!H.affects_vampire(user)) continue diff --git a/code/modules/antagonists/vampire/vampire_powers/gargantua_powers.dm b/code/modules/antagonists/vampire/vampire_powers/gargantua_powers.dm index 336ddf3ef7d0..ee34ccebd815 100644 --- a/code/modules/antagonists/vampire/vampire_powers/gargantua_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/gargantua_powers.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/vampire/self/blood_swell +/datum/spell/vampire/self/blood_swell name = "Blood Swell (30)" desc = "You infuse your body with blood, making you highly resistant to stuns and physical damage. However, this makes you unable to fire ranged weapons while it is active." gain_desc = "You have gained the ability to temporarly resist large amounts of stuns and physical damage." @@ -6,13 +6,13 @@ required_blood = 30 action_icon_state = "blood_swell" -/obj/effect/proc_holder/spell/vampire/self/blood_swell/cast(list/targets, mob/user) +/datum/spell/vampire/self/blood_swell/cast(list/targets, mob/user) var/mob/living/target = targets[1] if(ishuman(target)) var/mob/living/carbon/human/H = target H.apply_status_effect(STATUS_EFFECT_BLOOD_SWELL) -/obj/effect/proc_holder/spell/vampire/self/stomp +/datum/spell/vampire/self/stomp name = "Seismic Stomp (30)" desc = "You slam your foot into the ground sending a powerful shockwave through the station's hull, sending people flying away. Cannot be cast if you legs are impared by a bola or similar." gain_desc = "You have gained the ability to knock people back using a powerful stomp." @@ -21,18 +21,18 @@ required_blood = 30 var/max_range = 4 -/obj/effect/proc_holder/spell/vampire/self/stomp/can_cast(mob/living/carbon/user, charge_check, show_message) +/datum/spell/vampire/self/stomp/can_cast(mob/living/carbon/user, charge_check, show_message) if(user.legcuffed) return FALSE return ..() -/obj/effect/proc_holder/spell/vampire/self/stomp/cast(list/targets, mob/user) +/datum/spell/vampire/self/stomp/cast(list/targets, mob/user) var/turf/T = get_turf(user) playsound(T, 'sound/effects/meteorimpact.ogg', 100, TRUE) addtimer(CALLBACK(src, PROC_REF(hit_check), 1, T, user), 0.2 SECONDS) new /obj/effect/temp_visual/stomp(T) -/obj/effect/proc_holder/spell/vampire/self/stomp/proc/hit_check(range, turf/start_turf, mob/user, safe_targets = list()) +/datum/spell/vampire/self/stomp/proc/hit_check(range, turf/start_turf, mob/user, safe_targets = list()) // gets the two outermost turfs in a ring, we get two so people cannot "walk over" the shockwave var/list/targets = view(range, start_turf) - view(range - 2, start_turf) for(var/turf/simulated/floor/flooring in targets) @@ -72,14 +72,14 @@ /datum/vampire_passive/blood_swell_upgrade gain_desc = "While blood swell is active all of your melee attacks deal increased damage." -/obj/effect/proc_holder/spell/vampire/self/overwhelming_force +/datum/spell/vampire/self/overwhelming_force name = "Overwhelming Force" desc = "When toggled you will automatically pry open doors that you bump into if you do not have access." gain_desc = "You have gained the ability to force open doors at a small blood cost." base_cooldown = 2 SECONDS action_icon_state = "OH_YEAAAAH" -/obj/effect/proc_holder/spell/vampire/self/overwhelming_force/cast(list/targets, mob/user) +/datum/spell/vampire/self/overwhelming_force/cast(list/targets, mob/user) if(!HAS_TRAIT_FROM(user, TRAIT_FORCE_DOORS, VAMPIRE_TRAIT)) to_chat(user, "You feel MIGHTY!") ADD_TRAIT(user, TRAIT_FORCE_DOORS, VAMPIRE_TRAIT) @@ -90,7 +90,7 @@ user.move_resist = MOVE_FORCE_DEFAULT user.status_flags |= CANPUSH -/obj/effect/proc_holder/spell/vampire/self/blood_rush +/datum/spell/vampire/self/blood_rush name = "Blood Rush (30)" desc = "Infuse yourself with blood magic to boost your movement speed." gain_desc = "You have gained the ability to temporarily move at high speeds." @@ -98,14 +98,14 @@ required_blood = 30 action_icon_state = "blood_rush" -/obj/effect/proc_holder/spell/vampire/self/blood_rush/cast(list/targets, mob/user) +/datum/spell/vampire/self/blood_rush/cast(list/targets, mob/user) var/mob/living/target = targets[1] if(ishuman(target)) var/mob/living/carbon/human/H = target to_chat(H, "You feel a rush of energy!") H.apply_status_effect(STATUS_EFFECT_BLOOD_RUSH) -/obj/effect/proc_holder/spell/fireball/demonic_grasp +/datum/spell/fireball/demonic_grasp name = "Demonic Grasp (20)" desc = "Fire a hand of demonic energy, snaring and throwing its target around, based on your intent. Disarm pushes, grab pulls." gain_desc = "You have gained the ability to snare and disrupt people with demonic apendages." @@ -124,10 +124,10 @@ invocation_type = "none" invocation = null -/obj/effect/proc_holder/spell/fireball/demonic_grasp/update_icon_state() +/datum/spell/fireball/demonic_grasp/update_spell_icon() return -/obj/effect/proc_holder/spell/fireball/demonic_grasp/create_new_handler() +/datum/spell/fireball/demonic_grasp/create_new_handler() var/datum/spell_handler/vampire/V = new() V.required_blood = 20 return V @@ -178,7 +178,7 @@ icon_state = "immobilized" duration = 1 SECONDS -/obj/effect/proc_holder/spell/vampire/charge +/datum/spell/vampire/charge name = "Charge (30)" desc = "You charge at wherever you click on screen, dealing large amounts of damage, stunning and destroying walls and other objects." gain_desc = "You can now charge at a target on screen, dealing massive damage and destroying structures." @@ -186,16 +186,16 @@ base_cooldown = 30 SECONDS action_icon_state = "vampire_charge" -/obj/effect/proc_holder/spell/vampire/charge/create_new_targeting() +/datum/spell/vampire/charge/create_new_targeting() return new /datum/spell_targeting/clicked_atom -/obj/effect/proc_holder/spell/vampire/charge/can_cast(mob/user, charge_check, show_message) +/datum/spell/vampire/charge/can_cast(mob/user, charge_check, show_message) var/mob/living/L = user if(IS_HORIZONTAL(L)) return FALSE return ..() -/obj/effect/proc_holder/spell/vampire/charge/cast(list/targets, mob/user) +/datum/spell/vampire/charge/cast(list/targets, mob/user) var/target = targets[1] if(isliving(user)) var/mob/living/L = user @@ -204,7 +204,7 @@ #define ARENA_SIZE 3 -/obj/effect/proc_holder/spell/vampire/arena +/datum/spell/vampire/arena name = "Desecrated Duel (150)" desc = "You leap towards someone. Upon landing, you conjure an arena, and within it you will heal brute and burn damage, recover from fatigue faster, and be strengthened against lasting damages. Can be recasted to end the spell early." gain_desc = "You can now leap to a target and trap them in a conjured arena." @@ -218,13 +218,13 @@ /// Holds a reference to all arena walls so we can qdel them easily with dispel() var/list/all_temp_walls = list() -/obj/effect/proc_holder/spell/vampire/arena/create_new_targeting() +/datum/spell/vampire/arena/create_new_targeting() var/datum/spell_targeting/click/T = new T.click_radius = 0 T.allowed_type = /mob/living/carbon/human return T -/obj/effect/proc_holder/spell/vampire/arena/cast(list/targets, mob/living/user) +/datum/spell/vampire/arena/cast(list/targets, mob/living/user) var/target = targets[1] // We only want to dash towards the first mob in our targeting list, if somehow multiple ended up in there if(!targets) return @@ -262,24 +262,24 @@ RegisterSignal(user, COMSIG_PARENT_QDELETING, PROC_REF(dispel)) arena_checks(get_turf(target), user) -/obj/effect/proc_holder/spell/vampire/arena/proc/arena_checks(turf/target_turf, mob/living/user) +/datum/spell/vampire/arena/proc/arena_checks(turf/target_turf, mob/living/user) if(!spell_active || QDELETED(src)) return INVOKE_ASYNC(src, PROC_REF(fighters_check), user) //Checks to see if our fighters died. INVOKE_ASYNC(src, PROC_REF(arena_trap), target_turf) //Gets another arena trap queued up for when this one runs out. addtimer(CALLBACK(src, PROC_REF(arena_checks), target_turf, user), 5 SECONDS) -/obj/effect/proc_holder/spell/vampire/arena/proc/arena_trap(turf/target_turf) +/datum/spell/vampire/arena/proc/arena_trap(turf/target_turf) for(var/tumor_range_turfs in circle_edge_turfs(target_turf, ARENA_SIZE)) tumor_range_turfs = new /obj/effect/temp_visual/elite_tumor_wall/gargantua(tumor_range_turfs, src) all_temp_walls += tumor_range_turfs -/obj/effect/proc_holder/spell/vampire/arena/proc/fighters_check(mob/living/user) +/datum/spell/vampire/arena/proc/fighters_check(mob/living/user) if(QDELETED(user) || user.stat == DEAD) dispel(user) return -/obj/effect/proc_holder/spell/vampire/arena/proc/dispel(mob/living/user) +/datum/spell/vampire/arena/proc/dispel(mob/living/user) spell_active = FALSE if(timer) deltimer(timer) diff --git a/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm b/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm index 185725490562..f086ac67f57f 100644 --- a/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm @@ -1,4 +1,4 @@ -/obj/effect/proc_holder/spell/vampire/self/vamp_claws +/datum/spell/vampire/self/vamp_claws name = "Vampiric Claws (30)" desc = "You channel blood magics to forge deadly vampiric claws that leech blood and strike rapidly. Cannot be used if you are holding something that cannot be dropped." gain_desc = "You have gained the ability to forge your hands into vampiric claws." @@ -6,7 +6,7 @@ required_blood = 30 action_icon_state = "vampire_claws" -/obj/effect/proc_holder/spell/vampire/self/vamp_claws/cast(mob/user) +/datum/spell/vampire/self/vamp_claws/cast(mob/user) if(user.l_hand || user.r_hand) to_chat(user, "You drop what was in your hands as large blades spring from your fingers!") user.drop_l_hand() @@ -17,7 +17,7 @@ RegisterSignal(user, COMSIG_MOB_WILLINGLY_DROP, PROC_REF(dispel)) user.put_in_hands(claws) -/obj/effect/proc_holder/spell/vampire/self/vamp_claws/proc/dispel() +/datum/spell/vampire/self/vamp_claws/proc/dispel() SIGNAL_HANDLER var/mob/living/carbon/human/user = action.owner if(user.mind.has_antag_datum(/datum/antagonist/vampire)) @@ -31,7 +31,7 @@ qdel(current) to_chat(user, "You dispel your claws!") -/obj/effect/proc_holder/spell/vampire/self/vamp_claws/can_cast(mob/user, charge_check, show_message) +/datum/spell/vampire/self/vamp_claws/can_cast(mob/user, charge_check, show_message) var/mob/living/L = user if(L.canUnEquip(L.l_hand) && L.canUnEquip(L.r_hand)) return ..() @@ -55,7 +55,7 @@ var/durability = 15 var/blood_drain_amount = 15 var/blood_absorbed_amount = 5 - var/obj/effect/proc_holder/spell/vampire/self/vamp_claws/parent_spell + var/datum/spell/vampire/self/vamp_claws/parent_spell /obj/item/vamp_claws/Initialize(mapload, new_parent_spell) . = ..() @@ -104,7 +104,7 @@ qdel(src) to_chat(user, "You dispel your claws!") -/obj/effect/proc_holder/spell/vampire/blood_tendrils +/datum/spell/vampire/blood_tendrils name = "Blood Tendrils (10)" desc = "You summon blood tendrils from bluespace after a delay to ensnare people in an area, slowing them down." gain_desc = "You have gained the ability to summon blood tendrils to slow people down in an area that you target." @@ -115,16 +115,16 @@ sound = 'sound/misc/enter_blood.ogg' var/area_of_affect = 1 - selection_activated_message = "You channel blood magics to weaken the bluespace veil. Left-click to cast at a target area!" + selection_activated_message = "You channel blood magics to weaken the bluespace veil. Left-click to cast at a target area!" selection_deactivated_message = "Your magics subside." -/obj/effect/proc_holder/spell/vampire/blood_tendrils/create_new_targeting() +/datum/spell/vampire/blood_tendrils/create_new_targeting() var/datum/spell_targeting/click/T = new T.allowed_type = /atom T.try_auto_target = FALSE return T -/obj/effect/proc_holder/spell/vampire/blood_tendrils/cast(list/targets, mob/user) +/datum/spell/vampire/blood_tendrils/cast(list/targets, mob/user) var/turf/T = get_turf(targets[1]) // there should only ever be one entry in targets for this spell for(var/turf/simulated/blood_turf in view(area_of_affect, T)) @@ -134,7 +134,7 @@ addtimer(CALLBACK(src, PROC_REF(apply_slowdown), T, area_of_affect, 6 SECONDS, user), 0.5 SECONDS) -/obj/effect/proc_holder/spell/vampire/blood_tendrils/proc/apply_slowdown(turf/T, distance, slowed_amount, mob/user) +/datum/spell/vampire/blood_tendrils/proc/apply_slowdown(turf/T, distance, slowed_amount, mob/user) for(var/mob/living/L in range(distance, T)) if(L.affects_vampire(user)) L.Slowed(slowed_amount) @@ -149,7 +149,7 @@ /obj/effect/temp_visual/blood_tendril/long duration = 2 SECONDS -/obj/effect/proc_holder/spell/vampire/blood_barrier +/datum/spell/vampire/blood_barrier name = "Blood Barrier (40)" desc = "Select two points within 3 tiles of each other and make a barrier between them." gain_desc = "You have gained the ability to summon a crystaline wall of blood between two points, the barrier is easily destructable, however you can walk freely through it." @@ -162,24 +162,24 @@ var/max_walls = 3 var/turf/start_turf = null -/obj/effect/proc_holder/spell/vampire/blood_barrier/create_new_targeting() +/datum/spell/vampire/blood_barrier/create_new_targeting() var/datum/spell_targeting/click/T = new T.allowed_type = /atom T.try_auto_target = FALSE return T -/obj/effect/proc_holder/spell/vampire/blood_barrier/remove_ranged_ability(mob/user, msg) +/datum/spell/vampire/blood_barrier/remove_ranged_ability(mob/user, msg) . = ..() if(msg) // this is only true if the user intentionally turned off the spell start_turf = null should_recharge_after_cast = FALSE -/obj/effect/proc_holder/spell/vampire/blood_barrier/should_remove_click_intercept() +/datum/spell/vampire/blood_barrier/should_remove_click_intercept() if(start_turf) return TRUE return FALSE -/obj/effect/proc_holder/spell/vampire/blood_barrier/cast(list/targets, mob/user) +/datum/spell/vampire/blood_barrier/cast(list/targets, mob/user) var/turf/target_turf = get_turf(targets[1]) if(target_turf == start_turf) to_chat(user, "You deselect the targeted turf.") @@ -244,7 +244,7 @@ -/obj/effect/proc_holder/spell/ethereal_jaunt/blood_pool +/datum/spell/ethereal_jaunt/blood_pool name = "Sanguine Pool (50)" desc = "You shift your form into a pool of blood, making you invulnerable and able to move through anything that's not a wall or space. You leave a trail of blood behind you when you do this." gain_desc = "You have gained the ability to shift into a pool of blood, allowing you to evade pursuers with great mobility." @@ -261,12 +261,12 @@ jaunt_in_time = 0 sound1 = 'sound/misc/enter_blood.ogg' -/obj/effect/proc_holder/spell/ethereal_jaunt/blood_pool/create_new_handler() +/datum/spell/ethereal_jaunt/blood_pool/create_new_handler() var/datum/spell_handler/vampire/H = new H.required_blood = 50 return H -/obj/effect/proc_holder/spell/vampire/predator_senses +/datum/spell/vampire/predator_senses name = "Predator Senses" desc = "Hunt down your prey, there's nowhere to hide..." gain_desc = "Your senses are heightened, nobody can hide from you now." @@ -274,16 +274,16 @@ base_cooldown = 20 SECONDS create_attack_logs = FALSE -/obj/effect/proc_holder/spell/vampire/predator_senses/create_new_targeting() +/datum/spell/vampire/predator_senses/create_new_targeting() var/datum/spell_targeting/alive_mob_list/A = new() A.allowed_type = /mob/living/carbon/human A.max_targets = 300 // hopefully we never hit this number return A -/obj/effect/proc_holder/spell/vampire/predator_senses/valid_target(mob/target, mob/user) +/datum/spell/vampire/predator_senses/valid_target(mob/target, mob/user) return target.z == user.z && target.mind -/obj/effect/proc_holder/spell/vampire/predator_senses/cast(list/targets, mob/user) +/datum/spell/vampire/predator_senses/cast(list/targets, mob/user) var/targets_by_name = list() for(var/mob/living/carbon/human/H as anything in targets) targets_by_name[H.real_name] = H @@ -297,7 +297,7 @@ message += " They are wounded..." to_chat(user, "[message]") -/obj/effect/proc_holder/spell/vampire/blood_eruption +/datum/spell/vampire/blood_eruption name = "Blood Eruption (100)" desc = "Every pool of blood in 4 tiles erupts with a spike of living blood, damaging anyone stood on it." gain_desc = "You have gained the ability to weaponise pools of blood to damage those stood on them." @@ -305,13 +305,13 @@ base_cooldown = 200 SECONDS action_icon_state = "blood_spikes" -/obj/effect/proc_holder/spell/vampire/blood_eruption/create_new_targeting() +/datum/spell/vampire/blood_eruption/create_new_targeting() var/datum/spell_targeting/aoe/T = new T.range = 4 T.allowed_type = /mob/living return T -/obj/effect/proc_holder/spell/vampire/blood_eruption/valid_target(mob/living/target, user) +/datum/spell/vampire/blood_eruption/valid_target(mob/living/target, user) var/turf/T = get_turf(target) if(locate(/obj/effect/decal/cleanable/blood) in T) if(target.affects_vampire(user) && !isLivingSSD(target)) @@ -319,7 +319,7 @@ return FALSE -/obj/effect/proc_holder/spell/vampire/blood_eruption/cast(list/targets, mob/user) +/datum/spell/vampire/blood_eruption/cast(list/targets, mob/user) for(var/mob/living/L in targets) var/turf/T = get_turf(L) var/obj/effect/decal/cleanable/blood/B = locate(/obj/effect/decal/cleanable/blood) in T @@ -334,7 +334,7 @@ icon_state = "bloodspike_white" duration = 0.3 SECONDS -/obj/effect/proc_holder/spell/vampire/self/blood_spill +/datum/spell/vampire/self/blood_spill name = "The Blood Bringers Rite" desc = "When toggled, everyone around you begins to bleed profusely. You will drain their blood and rejuvenate yourself with it." gain_desc = "You have gained the ability to rip the very life force out of people and absorb it, healing you." @@ -342,7 +342,7 @@ action_icon_state = "blood_bringers_rite" required_blood = 10 -/obj/effect/proc_holder/spell/vampire/self/blood_spill/cast(list/targets, mob/user) +/datum/spell/vampire/self/blood_spill/cast(list/targets, mob/user) var/datum/antagonist/vampire/V = user.mind.has_antag_datum(/datum/antagonist/vampire) if(!V.get_ability(/datum/vampire_passive/blood_spill)) V.force_add_ability(/datum/vampire_passive/blood_spill) diff --git a/code/modules/antagonists/vampire/vampire_powers/umbrae_powers.dm b/code/modules/antagonists/vampire/vampire_powers/umbrae_powers.dm index 5d75d682faf9..0b1473ee8d88 100644 --- a/code/modules/antagonists/vampire/vampire_powers/umbrae_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/umbrae_powers.dm @@ -1,17 +1,11 @@ -/obj/effect/proc_holder/spell/vampire/self/cloak +/datum/spell/vampire/self/cloak name = "Cloak of Darkness" desc = "Toggles whether you are currently cloaking yourself in darkness. When in darkness and toggled on, you move at increased speeds." gain_desc = "You have gained the Cloak of Darkness ability, which when toggled makes you nearly invisible and highly agile in the shroud of darkness." action_icon_state = "vampire_cloak" base_cooldown = 2 SECONDS -/obj/effect/proc_holder/spell/vampire/self/cloak/New() - ..() - update_name() - -/obj/effect/proc_holder/spell/vampire/self/cloak/update_name() - . = ..() - var/mob/living/user = loc +/datum/spell/vampire/self/cloak/proc/update_spell_name(mob/living/user) if(!ishuman(user) || !user.mind) return var/datum/antagonist/vampire/V = user.mind.has_antag_datum(/datum/antagonist/vampire) @@ -19,9 +13,10 @@ return action.name = "[initial(name)] ([V.iscloaking ? "Deactivate" : "Activate"])" + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_NAME) UpdateButtons() -/obj/effect/proc_holder/spell/vampire/self/cloak/cast(list/targets, mob/user = usr) +/datum/spell/vampire/self/cloak/cast(list/targets, mob/user = usr) var/datum/antagonist/vampire/V = user.mind.has_antag_datum(/datum/antagonist/vampire) V.iscloaking = !V.iscloaking if(ishuman(user)) @@ -32,7 +27,7 @@ else user.UnregisterSignal(user, COMSIG_LIVING_IGNITED) H.physiology.burn_mod /= 1.1 - update_name() + update_spell_name(user) to_chat(user, "You will now be [V.iscloaking ? "hidden" : "seen"] in darkness.") /mob/living/proc/update_vampire_cloak() @@ -40,7 +35,7 @@ var/datum/antagonist/vampire/V = mind.has_antag_datum(/datum/antagonist/vampire) V.handle_vampire_cloak() -/obj/effect/proc_holder/spell/vampire/shadow_snare +/datum/spell/vampire/shadow_snare name = "Shadow Snare (20)" desc = "You summon a trap on the ground. When crossed it will blind the target, extinguish any lights they may have, and ensnare them." gain_desc = "You have gained the ability to summon a trap that will blind, ensnare, and turn off the lights of anyone who crosses it." @@ -48,13 +43,13 @@ required_blood = 20 action_icon_state = "shadow_snare" -/obj/effect/proc_holder/spell/vampire/shadow_snare/create_new_targeting() +/datum/spell/vampire/shadow_snare/create_new_targeting() var/datum/spell_targeting/click/T = new T.allowed_type = /turf/simulated T.click_radius = -1 return T -/obj/effect/proc_holder/spell/vampire/shadow_snare/cast(list/targets, mob/user) +/datum/spell/vampire/shadow_snare/cast(list/targets, mob/user) var/turf/target = targets[1] new /obj/item/restraints/legcuffs/beartrap/shadow_snare(target) @@ -116,7 +111,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/effect/proc_holder/spell/vampire/soul_anchor +/datum/spell/vampire/soul_anchor name = "Soul Anchor (30)" desc = "You summon a dimenional anchor after a delay, casting again will teleport you back to the anchor. You will fake a recall after 2 minutes." gain_desc = "You have gained the ability to save a point in space and teleport back to it at will. Unless you willingly teleport back to that point within 2 minutes, you will fake a recall." @@ -132,10 +127,10 @@ /// Holds a reference to the timer until the caster fake recalls var/timer -/obj/effect/proc_holder/spell/vampire/soul_anchor/create_new_targeting() +/datum/spell/vampire/soul_anchor/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/vampire/soul_anchor/cast(list/targets, mob/user) +/datum/spell/vampire/soul_anchor/cast(list/targets, mob/user) if(making_anchor) // second cast, but we are impatient to_chat(user, "Your anchor isn't ready yet!") return @@ -152,11 +147,11 @@ recall(user) -/obj/effect/proc_holder/spell/vampire/soul_anchor/proc/make_anchor(mob/user, turf/anchor_turf) +/datum/spell/vampire/soul_anchor/proc/make_anchor(mob/user, turf/anchor_turf) anchor = new(anchor_turf) timer = addtimer(CALLBACK(src, PROC_REF(recall), user, TRUE), 2 MINUTES, TIMER_STOPPABLE) -/obj/effect/proc_holder/spell/vampire/soul_anchor/proc/recall(mob/user, fake = FALSE) +/datum/spell/vampire/soul_anchor/proc/recall(mob/user, fake = FALSE) cooldown_handler.start_recharge() if(timer) deltimer(timer) @@ -214,7 +209,7 @@ anchored = TRUE resistance_flags = INDESTRUCTIBLE -/obj/effect/proc_holder/spell/vampire/dark_passage +/datum/spell/vampire/dark_passage name = "Dark Passage (30)" desc = "You teleport to a targeted turf." gain_desc = "You have gained the ability to blink a short distance towards a targeted turf." @@ -223,13 +218,13 @@ centcom_cancast = FALSE action_icon_state = "dark_passage" -/obj/effect/proc_holder/spell/vampire/dark_passage/create_new_targeting() +/datum/spell/vampire/dark_passage/create_new_targeting() var/datum/spell_targeting/click/T = new T.click_radius = 0 T.allowed_type = /turf/simulated return T -/obj/effect/proc_holder/spell/vampire/dark_passage/cast(list/targets, mob/user) +/datum/spell/vampire/dark_passage/cast(list/targets, mob/user) var/turf/target = get_turf(targets[1]) new /obj/effect/temp_visual/vamp_mist_out(get_turf(user)) @@ -241,7 +236,7 @@ icon = 'icons/mob/mob.dmi' icon_state = "mist" -/obj/effect/proc_holder/spell/vampire/vamp_extinguish +/datum/spell/vampire/vamp_extinguish name = "Extinguish" desc = "You extinguish any light source in an area around you." gain_desc = "You have gained the ability to extinguish nearby light sources." @@ -250,17 +245,17 @@ create_attack_logs = FALSE create_custom_logs = TRUE -/obj/effect/proc_holder/spell/vampire/vamp_extinguish/create_new_targeting() +/datum/spell/vampire/vamp_extinguish/create_new_targeting() var/datum/spell_targeting/aoe/turf/T = new return T -/obj/effect/proc_holder/spell/vampire/vamp_extinguish/cast(list/targets, mob/user = usr) +/datum/spell/vampire/vamp_extinguish/cast(list/targets, mob/user = usr) for(var/turf/T in targets) T.extinguish_light() for(var/atom/A in T.contents) A.extinguish_light() -/obj/effect/proc_holder/spell/vampire/shadow_boxing +/datum/spell/vampire/shadow_boxing name = "Shadow Boxing (50)" desc = "Target someone to have your shadow beat them up. You must stay within 2 tiles for this to work." gain_desc = "You have gained the ability to make your shadow fight for you." @@ -269,18 +264,18 @@ required_blood = 50 var/target_UID -/obj/effect/proc_holder/spell/vampire/shadow_boxing/create_new_targeting() +/datum/spell/vampire/shadow_boxing/create_new_targeting() var/datum/spell_targeting/click/C = new C.allowed_type = /mob/living C.range = 2 C.try_auto_target = FALSE return C -/obj/effect/proc_holder/spell/vampire/shadow_boxing/cast(list/targets, mob/user) +/datum/spell/vampire/shadow_boxing/cast(list/targets, mob/user) var/mob/living/target = targets[1] target.apply_status_effect(STATUS_EFFECT_SHADOW_BOXING, user) -/obj/effect/proc_holder/spell/vampire/self/eternal_darkness +/datum/spell/vampire/self/eternal_darkness name = "Eternal Darkness" desc = "When toggled, you shroud the area around you in darkness and slowly lower the body temperature of people nearby. Energy projectiles will dim in its radius." gain_desc = "You have gained the ability to shroud the area around you in darkness, only the strongest of lights can pierce your unholy powers." @@ -289,7 +284,7 @@ required_blood = 5 var/shroud_power = -6 -/obj/effect/proc_holder/spell/vampire/self/eternal_darkness/cast(list/targets, mob/user) +/datum/spell/vampire/self/eternal_darkness/cast(list/targets, mob/user) var/datum/antagonist/vampire/V = user.mind.has_antag_datum(/datum/antagonist/vampire) var/mob/target = targets[1] if(!V.get_ability(/datum/vampire_passive/eternal_darkness)) diff --git a/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm b/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm index ed1c9723aff9..668baada797e 100644 --- a/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm @@ -12,7 +12,7 @@ return FALSE return TRUE -/obj/effect/proc_holder/spell/vampire +/datum/spell/vampire panel = "Vampire" school = "vampire" action_background_icon_state = "bg_vampire" @@ -22,13 +22,13 @@ var/required_blood var/deduct_blood_on_cast = TRUE -/obj/effect/proc_holder/spell/vampire/create_new_handler() +/datum/spell/vampire/create_new_handler() var/datum/spell_handler/vampire/H = new H.required_blood = required_blood H.deduct_blood_on_cast = deduct_blood_on_cast return H -/obj/effect/proc_holder/spell/vampire/self/create_new_targeting() +/datum/spell/vampire/self/create_new_targeting() return new /datum/spell_targeting/self /datum/vampire_passive @@ -48,14 +48,14 @@ owner.update_sight() // Life updates conditionally, so we need to update sight here in case the vamp gets new vision based on his powers. Maybe one day refactor to be more OOP and on the vampire's ability datum. return -/obj/effect/proc_holder/spell/vampire/self/rejuvenate +/datum/spell/vampire/self/rejuvenate name = "Rejuvenate" desc = "Use reserve blood to enliven your body, removing any incapacitating effects." action_icon_state = "vampire_rejuvinate" base_cooldown = 20 SECONDS stat_allowed = UNCONSCIOUS -/obj/effect/proc_holder/spell/vampire/self/rejuvenate/cast(list/targets, mob/user = usr) +/datum/spell/vampire/self/rejuvenate/cast(list/targets, mob/user = usr) var/mob/living/U = user U.SetWeakened(0) @@ -73,7 +73,7 @@ if(rejuv_bonus) INVOKE_ASYNC(src, PROC_REF(heal), U, rejuv_bonus) -/obj/effect/proc_holder/spell/vampire/self/rejuvenate/proc/heal(mob/living/user, rejuv_bonus) +/datum/spell/vampire/self/rejuvenate/proc/heal(mob/living/user, rejuv_bonus) for(var/i in 1 to 5) user.adjustBruteLoss(-2 * rejuv_bonus) user.adjustOxyLoss(-5 * rejuv_bonus) @@ -93,35 +93,35 @@ rejuv_multiplier = clamp((100 - owner.current.health) / 20, 1, 5) // brute and burn healing between 5 and 50 return rejuv_multiplier - return 1 + return TRUE -/obj/effect/proc_holder/spell/vampire/self/specialize +/datum/spell/vampire/self/specialize name = "Choose Specialization" desc = "Choose what sub-class of vampire you want to evolve into." gain_desc = "You can now choose what specialization of vampire you want to evolve into." base_cooldown = 2 SECONDS action_icon_state = "select_class" -/obj/effect/proc_holder/spell/vampire/self/specialize/cast(mob/user) +/datum/spell/vampire/self/specialize/cast(mob/user) ui_interact(user) -/obj/effect/proc_holder/spell/vampire/self/specialize/ui_state(mob/user) +/datum/spell/vampire/self/specialize/ui_state(mob/user) return GLOB.always_state -/obj/effect/proc_holder/spell/vampire/self/specialize/ui_interact(mob/user, datum/tgui/ui = null) +/datum/spell/vampire/self/specialize/ui_interact(mob/user, datum/tgui/ui = null) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "SpecMenu", "Specialisation Menu") ui.set_autoupdate(FALSE) ui.open() -/obj/effect/proc_holder/spell/vampire/self/specialize/ui_data(mob/user) +/datum/spell/vampire/self/specialize/ui_data(mob/user) var/datum/antagonist/vampire/vamp = user.mind.has_antag_datum(/datum/antagonist/vampire) var/list/data = list("subclasses" = vamp.subclass) return data -/obj/effect/proc_holder/spell/vampire/self/specialize/ui_act(action, list/params) +/datum/spell/vampire/self/specialize/ui_act(action, list/params) if(..()) return var/datum/antagonist/vampire/vamp = usr.mind.has_antag_datum(/datum/antagonist/vampire) @@ -157,20 +157,20 @@ if(log_choice) SSblackbox.record_feedback("nested tally", "vampire_subclasses", 1, list("[new_subclass.name]")) -/obj/effect/proc_holder/spell/vampire/glare +/datum/spell/vampire/glare name = "Glare" desc = "Your eyes flash, stunning and silencing anyone in front of you. It has lesser effects for those around you." action_icon_state = "vampire_glare" base_cooldown = 30 SECONDS stat_allowed = UNCONSCIOUS -/obj/effect/proc_holder/spell/vampire/glare/create_new_targeting() +/datum/spell/vampire/glare/create_new_targeting() var/datum/spell_targeting/aoe/T = new T.allowed_type = /mob/living T.range = 1 return T -/obj/effect/proc_holder/spell/vampire/glare/create_new_cooldown() +/datum/spell/vampire/glare/create_new_cooldown() var/datum/spell_cooldown/charges/C = new C.max_charges = 2 C.recharge_duration = base_cooldown @@ -184,7 +184,7 @@ /// Full deviation. Flashed from directly behind or behind-left/behind-rack. Not flashed at all. #define DEVIATION_FULL 1 -/obj/effect/proc_holder/spell/vampire/glare/cast(list/targets, mob/living/user = usr) +/datum/spell/vampire/glare/cast(list/targets, mob/living/user = usr) if(ishuman(user)) var/mob/living/carbon/human/H = user if(istype(H.glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) @@ -221,7 +221,7 @@ to_chat(target, "You are blinded by [user]'s glare.") add_attack_logs(user, target, "(Vampire) Glared at") -/obj/effect/proc_holder/spell/vampire/glare/proc/calculate_deviation(mob/victim, mob/attacker) +/datum/spell/vampire/glare/proc/calculate_deviation(mob/victim, mob/attacker) // Are they on the same tile? We'll return partial deviation. This may be someone flashing while lying down if(victim.loc == attacker.loc) return DEVIATION_PARTIAL @@ -279,7 +279,7 @@ /datum/vampire_passive/full gain_desc = "You have reached your full potential. You are no longer weak to the effects of anything holy." -/obj/effect/proc_holder/spell/vampire/raise_vampires +/datum/spell/vampire/raise_vampires name = "Raise Vampires" desc = "Summons deadly vampires from bluespace." school = "transmutation" @@ -293,12 +293,12 @@ sound = 'sound/magic/wandodeath.ogg' gain_desc = "You have gained the ability to Raise Vampires. This extremely powerful AOE ability affects all humans near you. Vampires/thralls are healed. Corpses are raised as vampires. Others are stunned, then brain damaged, then killed." -/obj/effect/proc_holder/spell/vampire/raise_vampires/create_new_targeting() +/datum/spell/vampire/raise_vampires/create_new_targeting() var/datum/spell_targeting/aoe/T = new T.range = 3 return T -/obj/effect/proc_holder/spell/vampire/raise_vampires/cast(list/targets, mob/user = usr) +/datum/spell/vampire/raise_vampires/cast(list/targets, mob/user = usr) new /obj/effect/temp_visual/cult/sparks(user.loc) var/turf/T = get_turf(user) to_chat(user, "You call out within bluespace, summoning more vampiric spirits to aid you!") @@ -308,17 +308,17 @@ raise_vampire(user, H) -/obj/effect/proc_holder/spell/vampire/raise_vampires/proc/raise_vampire(mob/M, mob/living/carbon/human/H) +/datum/spell/vampire/raise_vampires/proc/raise_vampire(mob/M, mob/living/carbon/human/H) if(!istype(M) || !istype(H)) return if(!H.mind) - visible_message("[H] looks to be too stupid to understand what is going on.") + H.visible_message("[H] looks to be too stupid to understand what is going on.") return if(H.dna && (NO_BLOOD in H.dna.species.species_traits) || H.dna.species.exotic_blood || !H.blood_volume) - visible_message("[H] looks unfazed!") + H.visible_message("[H] looks unfazed!") return if(H.mind.has_antag_datum(/datum/antagonist/vampire) || H.mind.special_role == SPECIAL_ROLE_VAMPIRE || H.mind.special_role == SPECIAL_ROLE_VAMPIRE_THRALL) - visible_message("[H] looks refreshed!") + H.visible_message("[H] looks refreshed!") H.adjustBruteLoss(-60) H.adjustFireLoss(-60) for(var/obj/item/organ/external/E in H.bodyparts) @@ -330,10 +330,10 @@ return if(H.stat != DEAD) if(H.IsWeakened()) - visible_message("[H] looks to be in pain!") + H.visible_message("[H] looks to be in pain!") H.adjustBrainLoss(60) else - visible_message("[H] looks to be stunned by the energy!") + H.visible_message("[H] looks to be stunned by the energy!") H.Weaken(40 SECONDS) return for(var/obj/item/bio_chip/mindshield/L in H) @@ -342,7 +342,7 @@ for(var/obj/item/bio_chip/traitor/T in H) if(T && T.implanted) qdel(T) - visible_message("[H] gets an eerie red glow in their eyes!") + H.visible_message("[H] gets an eerie red glow in their eyes!") var/datum/objective/protect/protect_objective = new protect_objective.target = M.mind diff --git a/code/modules/antagonists/vampire/vampire_subclasses.dm b/code/modules/antagonists/vampire/vampire_subclasses.dm index 250287927463..bddff6daeeab 100644 --- a/code/modules/antagonists/vampire/vampire_subclasses.dm +++ b/code/modules/antagonists/vampire/vampire_subclasses.dm @@ -23,95 +23,95 @@ /datum/vampire_subclass/umbrae name = "umbrae" - standard_powers = list(/obj/effect/proc_holder/spell/vampire/self/cloak = 150, - /obj/effect/proc_holder/spell/vampire/shadow_snare = 250, - /obj/effect/proc_holder/spell/vampire/soul_anchor = 250, - /obj/effect/proc_holder/spell/vampire/dark_passage = 400, - /obj/effect/proc_holder/spell/vampire/vamp_extinguish = 600, - /obj/effect/proc_holder/spell/vampire/shadow_boxing = 800) + standard_powers = list(/datum/spell/vampire/self/cloak = 150, + /datum/spell/vampire/shadow_snare = 250, + /datum/spell/vampire/soul_anchor = 250, + /datum/spell/vampire/dark_passage = 400, + /datum/spell/vampire/vamp_extinguish = 600, + /datum/spell/vampire/shadow_boxing = 800) fully_powered_abilities = list(/datum/vampire_passive/full, /datum/vampire_passive/vision/full, - /obj/effect/proc_holder/spell/vampire/self/eternal_darkness, + /datum/spell/vampire/self/eternal_darkness, /datum/vampire_passive/vision/xray) /datum/vampire_subclass/hemomancer name = "hemomancer" - standard_powers = list(/obj/effect/proc_holder/spell/vampire/self/vamp_claws = 150, - /obj/effect/proc_holder/spell/vampire/blood_tendrils = 250, - /obj/effect/proc_holder/spell/vampire/blood_barrier = 250, - /obj/effect/proc_holder/spell/ethereal_jaunt/blood_pool = 400, - /obj/effect/proc_holder/spell/vampire/predator_senses = 600, - /obj/effect/proc_holder/spell/vampire/blood_eruption = 800) + standard_powers = list(/datum/spell/vampire/self/vamp_claws = 150, + /datum/spell/vampire/blood_tendrils = 250, + /datum/spell/vampire/blood_barrier = 250, + /datum/spell/ethereal_jaunt/blood_pool = 400, + /datum/spell/vampire/predator_senses = 600, + /datum/spell/vampire/blood_eruption = 800) fully_powered_abilities = list(/datum/vampire_passive/full, /datum/vampire_passive/vision/full, - /obj/effect/proc_holder/spell/vampire/self/blood_spill) + /datum/spell/vampire/self/blood_spill) /datum/vampire_subclass/gargantua name = "gargantua" - standard_powers = list(/obj/effect/proc_holder/spell/vampire/self/blood_swell = 150, - /obj/effect/proc_holder/spell/vampire/self/blood_rush = 250, - /obj/effect/proc_holder/spell/vampire/self/stomp = 250, + standard_powers = list(/datum/spell/vampire/self/blood_swell = 150, + /datum/spell/vampire/self/blood_rush = 250, + /datum/spell/vampire/self/stomp = 250, /datum/vampire_passive/blood_swell_upgrade = 400, - /obj/effect/proc_holder/spell/vampire/self/overwhelming_force = 600, - /obj/effect/proc_holder/spell/vampire/charge = 800, - /obj/effect/proc_holder/spell/fireball/demonic_grasp = 800) + /datum/spell/vampire/self/overwhelming_force = 600, + /datum/spell/vampire/charge = 800, + /datum/spell/fireball/demonic_grasp = 800) fully_powered_abilities = list(/datum/vampire_passive/full, /datum/vampire_passive/vision/full, - /obj/effect/proc_holder/spell/vampire/arena) + /datum/spell/vampire/arena) improved_rejuv_healing = TRUE /datum/vampire_subclass/dantalion name = "dantalion" - standard_powers = list(/obj/effect/proc_holder/spell/vampire/enthrall = 150, - /obj/effect/proc_holder/spell/vampire/thrall_commune = 150, - /obj/effect/proc_holder/spell/vampire/pacify = 250, - /obj/effect/proc_holder/spell/vampire/switch_places = 250, - /obj/effect/proc_holder/spell/vampire/self/decoy = 400, + standard_powers = list(/datum/spell/vampire/enthrall = 150, + /datum/spell/vampire/thrall_commune = 150, + /datum/spell/vampire/pacify = 250, + /datum/spell/vampire/switch_places = 250, + /datum/spell/vampire/self/decoy = 400, /datum/vampire_passive/increment_thrall_cap = 400, - /obj/effect/proc_holder/spell/vampire/rally_thralls = 600, + /datum/spell/vampire/rally_thralls = 600, /datum/vampire_passive/increment_thrall_cap/two = 600, - /obj/effect/proc_holder/spell/vampire/self/share_damage = 800) + /datum/spell/vampire/self/share_damage = 800) fully_powered_abilities = list(/datum/vampire_passive/full, - /obj/effect/proc_holder/spell/vampire/hysteria, + /datum/spell/vampire/hysteria, /datum/vampire_passive/vision/full, /datum/vampire_passive/increment_thrall_cap/three) /datum/vampire_subclass/ancient name = "ancient" - standard_powers = list(/obj/effect/proc_holder/spell/vampire/self/vamp_claws, - /obj/effect/proc_holder/spell/vampire/self/blood_swell, - /obj/effect/proc_holder/spell/vampire/self/cloak, - /obj/effect/proc_holder/spell/vampire/enthrall, - /obj/effect/proc_holder/spell/vampire/thrall_commune, - /obj/effect/proc_holder/spell/vampire/blood_tendrils, - /obj/effect/proc_holder/spell/vampire/blood_barrier, - /obj/effect/proc_holder/spell/vampire/self/blood_rush, - /obj/effect/proc_holder/spell/vampire/self/stomp, - /obj/effect/proc_holder/spell/vampire/charge, - /obj/effect/proc_holder/spell/vampire/shadow_snare, - /obj/effect/proc_holder/spell/vampire/soul_anchor, - /obj/effect/proc_holder/spell/vampire/pacify, - /obj/effect/proc_holder/spell/vampire/switch_places, - /obj/effect/proc_holder/spell/ethereal_jaunt/blood_pool, + standard_powers = list(/datum/spell/vampire/self/vamp_claws, + /datum/spell/vampire/self/blood_swell, + /datum/spell/vampire/self/cloak, + /datum/spell/vampire/enthrall, + /datum/spell/vampire/thrall_commune, + /datum/spell/vampire/blood_tendrils, + /datum/spell/vampire/blood_barrier, + /datum/spell/vampire/self/blood_rush, + /datum/spell/vampire/self/stomp, + /datum/spell/vampire/charge, + /datum/spell/vampire/shadow_snare, + /datum/spell/vampire/soul_anchor, + /datum/spell/vampire/pacify, + /datum/spell/vampire/switch_places, + /datum/spell/ethereal_jaunt/blood_pool, /datum/vampire_passive/blood_swell_upgrade, - /obj/effect/proc_holder/spell/vampire/dark_passage, - /obj/effect/proc_holder/spell/vampire/self/decoy, - /obj/effect/proc_holder/spell/vampire/blood_eruption, - /obj/effect/proc_holder/spell/vampire/predator_senses, - /obj/effect/proc_holder/spell/vampire/self/overwhelming_force, - /obj/effect/proc_holder/spell/vampire/vamp_extinguish, - /obj/effect/proc_holder/spell/vampire/rally_thralls, - /obj/effect/proc_holder/spell/vampire/self/share_damage, - /obj/effect/proc_holder/spell/fireball/demonic_grasp, - /obj/effect/proc_holder/spell/vampire/shadow_boxing, + /datum/spell/vampire/dark_passage, + /datum/spell/vampire/self/decoy, + /datum/spell/vampire/blood_eruption, + /datum/spell/vampire/predator_senses, + /datum/spell/vampire/self/overwhelming_force, + /datum/spell/vampire/vamp_extinguish, + /datum/spell/vampire/rally_thralls, + /datum/spell/vampire/self/share_damage, + /datum/spell/fireball/demonic_grasp, + /datum/spell/vampire/shadow_boxing, /datum/vampire_passive/full, /datum/vampire_passive/vision/full, - /obj/effect/proc_holder/spell/vampire/self/blood_spill, - /obj/effect/proc_holder/spell/vampire/arena, - /obj/effect/proc_holder/spell/vampire/self/eternal_darkness, - /obj/effect/proc_holder/spell/vampire/hysteria, - /obj/effect/proc_holder/spell/vampire/raise_vampires, + /datum/spell/vampire/self/blood_spill, + /datum/spell/vampire/arena, + /datum/spell/vampire/self/eternal_darkness, + /datum/spell/vampire/hysteria, + /datum/spell/vampire/raise_vampires, /datum/vampire_passive/vision/xray) improved_rejuv_healing = TRUE thrall_cap = 150 // can thrall high pop diff --git a/code/modules/antagonists/wizard/datum_apprentice.dm b/code/modules/antagonists/wizard/datum_apprentice.dm index a638a34c2da9..3935e7d9e820 100644 --- a/code/modules/antagonists/wizard/datum_apprentice.dm +++ b/code/modules/antagonists/wizard/datum_apprentice.dm @@ -45,28 +45,28 @@ var/list/messages = list() switch(class_type) if("fire") - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball/apprentice(null)) - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/sacred_flame(null)) + new_wiz.mind.AddSpell(new /datum/spell/fireball/apprentice(null)) + new_wiz.mind.AddSpell(new /datum/spell/sacred_flame(null)) ADD_TRAIT(new_wiz, TRAIT_RESISTHEAT, MAGIC_TRAIT) ADD_TRAIT(new_wiz, TRAIT_RESISTHIGHPRESSURE, MAGIC_TRAIT) - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/ethereal_jaunt(null)) + new_wiz.mind.AddSpell(new /datum/spell/ethereal_jaunt(null)) new_wiz.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(new_wiz), SLOT_HUD_SHOES) new_wiz.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(new_wiz), SLOT_HUD_OUTER_SUIT) new_wiz.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(new_wiz), SLOT_HUD_HEAD) messages += "Your service has not gone unrewarded. Under the tutelage of [my_teacher.real_name], you've acquired proficiency in the fundamentals of Firebending, enabling you to cast spells like Fireball, Sacred Flame, and Ethereal Jaunt." messages += "You are immune to fire, but you are NOT immune to the explosions caused by your fireballs. Neither is your teacher, for that matter. Be careful!" if("translocation") - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/area_teleport/teleport(null)) - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/turf_teleport/blink(null)) - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/ethereal_jaunt(null)) + new_wiz.mind.AddSpell(new /datum/spell/area_teleport/teleport(null)) + new_wiz.mind.AddSpell(new /datum/spell/turf_teleport/blink(null)) + new_wiz.mind.AddSpell(new /datum/spell/ethereal_jaunt(null)) new_wiz.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(new_wiz), SLOT_HUD_SHOES) new_wiz.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(new_wiz), SLOT_HUD_OUTER_SUIT) new_wiz.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(new_wiz), SLOT_HUD_HEAD) messages += "Your service has not gone unrewarded. While studying under [my_teacher.real_name], you mastered reality-bending mobility spells, allowing you to cast Teleport, Blink, and Ethereal Jaunt." if("restoration") - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/charge(null)) - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/knock(null)) - var/obj/effect/proc_holder/spell/return_to_teacher/S = new /obj/effect/proc_holder/spell/return_to_teacher(null) + new_wiz.mind.AddSpell(new /datum/spell/charge(null)) + new_wiz.mind.AddSpell(new /datum/spell/aoe/knock(null)) + var/datum/spell/return_to_teacher/S = new /datum/spell/return_to_teacher(null) S.teacher = my_teacher.mind new_wiz.mind.AddSpell(S) new_wiz.equip_to_slot_or_del(new /obj/item/gun/magic/staff/healing(new_wiz), SLOT_HUD_RIGHT_HAND) @@ -76,19 +76,19 @@ messages += "Your service has not gone unrewarded. Under the guidance of [my_teacher.real_name], you've acquired life-saving survival spells. You can now cast Charge and Knock, and possess the ability to teleport back to your mentor." messages += "Your Charge spell can be used to recharge your Staff of Healing or reduce the cooldowns of your teacher, if you are grabbing them with empty hands." if("stealth") - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/mind_transfer(null)) - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/knock(null)) - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball/toolbox(null)) - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/disguise_self(null)) + new_wiz.mind.AddSpell(new /datum/spell/mind_transfer(null)) + new_wiz.mind.AddSpell(new /datum/spell/aoe/knock(null)) + new_wiz.mind.AddSpell(new /datum/spell/fireball/toolbox(null)) + new_wiz.mind.AddSpell(new /datum/spell/disguise_self(null)) new_wiz.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(new_wiz), SLOT_HUD_SHOES) new_wiz.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(new_wiz), SLOT_HUD_WEAR_MASK) new_wiz.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(new_wiz), SLOT_HUD_GLOVES) new_wiz.equip_to_slot_or_del(new /obj/item/storage/belt/utility/full(new_wiz), SLOT_HUD_BELT) messages += "Your service has not gone unrewarded. Under the mentorship of [my_teacher.real_name], you've mastered stealthy, robeless spells. You can now cast Mindswap, Knock, Homing Toolbox, and Disguise Self without the need for wizard robes." if("honk") - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/touch/banana/apprentice(null)) - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/ethereal_jaunt(null)) - new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/summonitem(null)) + new_wiz.mind.AddSpell(new /datum/spell/touch/banana/apprentice(null)) + new_wiz.mind.AddSpell(new /datum/spell/ethereal_jaunt(null)) + new_wiz.mind.AddSpell(new /datum/spell/summonitem(null)) new_wiz.equip_to_slot_or_del(new /obj/item/gun/magic/staff/slipping(new_wiz), SLOT_HUD_RIGHT_HAND) new_wiz.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes/magical/nodrop(new_wiz), SLOT_HUD_SHOES) new_wiz.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/clown(new_wiz), SLOT_HUD_OUTER_SUIT) diff --git a/code/modules/awaymissions/mission_code/ghost_role_spawners/golems.dm b/code/modules/awaymissions/mission_code/ghost_role_spawners/golems.dm index eec5f0faa7af..6ca240ac99e2 100644 --- a/code/modules/awaymissions/mission_code/ghost_role_spawners/golems.dm +++ b/code/modules/awaymissions/mission_code/ghost_role_spawners/golems.dm @@ -135,8 +135,8 @@ else H.rename_character(null, name) if(is_species(H, /datum/species/golem/tranquillite) && H.mind) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/conjure/build/mime_wall(null)) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/mime/speak(null)) + H.mind.AddSpell(new /datum/spell/aoe/conjure/build/mime_wall(null)) + H.mind.AddSpell(new /datum/spell/mime/speak(null)) H.mind.miming = TRUE if(has_owner) diff --git a/code/modules/awaymissions/mission_code/ruins/wizardcrash.dm b/code/modules/awaymissions/mission_code/ruins/wizardcrash.dm index e39220515d8f..c872499557dc 100644 --- a/code/modules/awaymissions/mission_code/ruins/wizardcrash.dm +++ b/code/modules/awaymissions/mission_code/ruins/wizardcrash.dm @@ -2,10 +2,10 @@ /obj/item/paper/fluff/ruins/wizardcrash name = "Mission Briefing" - info = "To the Magnificent Z.A.P.
A small mining base has been created within our territory by wandless scum. Send them a message from the wizard federation they will not forget. I know your kind is rather fragile, but a group of lightly armed miners should not pose any threat to you at all. Just be warned they have a security cyborg for self defence, you might want to tune your spells to that threat. I look forward to hearing of your success.
Grand Magus Abra the Wonderous" + info = "To the Magnificent Z.A.P.
A small mining base has been created within our territory by wandless scum. Send them a message from the wizard federation they will not forget. I know your kind is rather fragile, but a group of lightly armed miners should not pose any threat to you at all. Just be warned they have a security cyborg for self defence, you might want to tune your spells to that threat. I look forward to hearing of your success.
Grand Magus Abra the Wonderous" /obj/item/spellbook/oneuse/emp - spell = /obj/effect/proc_holder/spell/emplosion/disable_tech + spell = /datum/spell/emplosion/disable_tech spellname = "Disable Technology" icon_state = "bookcharge" //it's a lightning bolt, seems appropriate enough desc = "For the tech-hating wizard on the go." diff --git a/code/modules/martial_arts/combos/plasma_fist/tornado_sweep.dm b/code/modules/martial_arts/combos/plasma_fist/tornado_sweep.dm index a3e948a21f1c..bc1d44bebfc7 100644 --- a/code/modules/martial_arts/combos/plasma_fist/tornado_sweep.dm +++ b/code/modules/martial_arts/combos/plasma_fist/tornado_sweep.dm @@ -6,7 +6,7 @@ /datum/martial_combo/plasma_fist/tornado_sweep/perform_combo(mob/living/carbon/human/user, mob/living/target, datum/martial_art/MA) user.say("TORNADO SWEEP!") INVOKE_ASYNC(src, PROC_REF(do_tornado_effect), user) - var/obj/effect/proc_holder/spell/aoe/repulse/R = new(null) + var/datum/spell/aoe/repulse/R = new(null) var/list/turfs = list() for(var/turf/T in range(1,user)) turfs.Add(T) diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm index c5b852393cc9..594db13d7aff 100644 --- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -217,7 +217,7 @@ if(2) to_chat(user, "Power courses through you! You can now shift your form at will.") if(user.mind) - var/obj/effect/proc_holder/spell/shapeshift/dragon/D = new + var/datum/spell/shapeshift/dragon/D = new user.mind.AddSpell(D) if(3) to_chat(user, "You feel like you could walk straight through lava now.") diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm index 64b6b1241dce..fb45849581f2 100644 --- a/code/modules/mining/lavaland/loot/colossus_loot.dm +++ b/code/modules/mining/lavaland/loot/colossus_loot.dm @@ -350,7 +350,7 @@ ADD_TRAIT(L, TRAIT_MUTE, STASIS_MUTE) L.status_flags |= GODMODE L.mind.transfer_to(holder_animal) - var/obj/effect/proc_holder/spell/exit_possession/P = new /obj/effect/proc_holder/spell/exit_possession + var/datum/spell/exit_possession/P = new /datum/spell/exit_possession holder_animal.mind.AddSpell(P) remove_verb(holder_animal, /mob/living/verb/pulled) @@ -362,7 +362,7 @@ L.notransform = FALSE if(holder_animal && !QDELETED(holder_animal)) holder_animal.mind.transfer_to(L) - L.mind.RemoveSpell(/obj/effect/proc_holder/spell/exit_possession) + L.mind.RemoveSpell(/datum/spell/exit_possession) if(kill || !isanimal(loc)) L.death(0) ..() @@ -373,7 +373,7 @@ /obj/structure/closet/stasis/ex_act() return -/obj/effect/proc_holder/spell/exit_possession +/datum/spell/exit_possession name = "Exit Possession" desc = "Exits the body you are possessing" base_cooldown = 60 @@ -382,10 +382,10 @@ action_icon_state = "exit_possession" sound = null -/obj/effect/proc_holder/spell/exit_possession/create_new_targeting() +/datum/spell/exit_possession/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/exit_possession/cast(list/targets, mob/user = usr) +/datum/spell/exit_possession/cast(list/targets, mob/user = usr) if(!isfloorturf(user.loc)) return var/datum/mind/target_mind = user.mind @@ -397,4 +397,4 @@ qdel(S) break current.gib() - target_mind.RemoveSpell(/obj/effect/proc_holder/spell/exit_possession) + target_mind.RemoveSpell(/datum/spell/exit_possession) diff --git a/code/modules/mob/dead/observer/observer_base.dm b/code/modules/mob/dead/observer/observer_base.dm index 9bf21554c174..d1c642334ed3 100644 --- a/code/modules/mob/dead/observer/observer_base.dm +++ b/code/modules/mob/dead/observer/observer_base.dm @@ -53,7 +53,7 @@ GLOBAL_DATUM_INIT(ghost_crew_monitor, /datum/ui_module/crew_monitor/ghost, new) /mob/dead/observer/proc/open_spawners_menu)) // Our new boo spell. - AddSpell(new /obj/effect/proc_holder/spell/boo(null)) + AddSpell(new /datum/spell/boo(null)) can_reenter_corpse = flags & GHOST_CAN_REENTER started_as_observer = flags & GHOST_IS_OBSERVER diff --git a/code/modules/mob/dead/observer/spells.dm b/code/modules/mob/dead/observer/spells.dm index 46f0f4342d66..5128f8a9bb2f 100644 --- a/code/modules/mob/dead/observer/spells.dm +++ b/code/modules/mob/dead/observer/spells.dm @@ -9,7 +9,7 @@ GLOBAL_LIST_INIT(boo_phrases, list( "It feels like someone's standing behind you.", )) -/obj/effect/proc_holder/spell/boo +/datum/spell/boo name = "Boo!" desc = "Fuck with the living." selection_deactivated_message = "Your presence will not be known. For now." @@ -29,13 +29,13 @@ GLOBAL_LIST_INIT(boo_phrases, list( create_attack_logs = FALSE -/obj/effect/proc_holder/spell/boo/create_new_targeting() +/datum/spell/boo/create_new_targeting() var/datum/spell_targeting/click/T = new() T.allowed_type = /atom T.try_auto_target = FALSE return T -/obj/effect/proc_holder/spell/boo/cast(list/targets, mob/user = usr) +/datum/spell/boo/cast(list/targets, mob/user = usr) var/atom/target = targets[1] ASSERT(istype(target)) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/alien_drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/alien_drone.dm index 35c75e4931a4..a9b25613ae63 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/alien_drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/alien_drone.dm @@ -9,7 +9,7 @@ . = ..() name = "alien drone ([rand(1, 1000)])" real_name = name - AddSpell(new /obj/effect/proc_holder/spell/alien_spell/evolve_queen) + AddSpell(new /datum/spell/alien_spell/evolve_queen) /mob/living/carbon/alien/humanoid/drone/get_caste_organs() . = ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index f952bfe2797c..fcb649ab9b4b 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -23,7 +23,7 @@ real_name = name add_language("Xenomorph") add_language("Hivemind") - AddSpell(new /obj/effect/proc_holder/spell/alien_spell/regurgitate) + AddSpell(new /datum/spell/alien_spell/regurgitate) . = ..() AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW, 0.5, -11) diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 1d0e6e931de6..84a31d4d7a43 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -16,7 +16,7 @@ /mob/living/carbon/alien/humanoid/queen/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_FORCE_DOORS, UNIQUE_TRAIT_SOURCE(src)) - AddSpell(new /obj/effect/proc_holder/spell/alien_spell/tail_lash) + AddSpell(new /datum/spell/alien_spell/tail_lash) /mob/living/carbon/alien/humanoid/queen/get_caste_organs() . = ..() diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 7f9bb302712f..3d0e6508cc51 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -25,7 +25,7 @@ regenerate_icons() add_language("Xenomorph") add_language("Hivemind") - AddSpell(new /obj/effect/proc_holder/spell/alien_spell/evolve_larva) + AddSpell(new /datum/spell/alien_spell/evolve_larva) var/datum/action/innate/hide/alien_larva_hide/hide = new() hide.Grant(src) diff --git a/code/modules/mob/living/carbon/human/npcs.dm b/code/modules/mob/living/carbon/human/npcs.dm index bfb37b40a4a8..6974075c918f 100644 --- a/code/modules/mob/living/carbon/human/npcs.dm +++ b/code/modules/mob/living/carbon/human/npcs.dm @@ -107,5 +107,5 @@ /mob/living/carbon/human/monkey/magic/mind_checks() if(!..()) return FALSE - mind.AddSpell(new /obj/effect/proc_holder/spell/turf_teleport/blink(null)) + mind.AddSpell(new /datum/spell/turf_teleport/blink(null)) mind.special_role = SPECIAL_ROLE_WIZARD diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index 2c1426512eaf..eb8f49a44142 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -654,8 +654,8 @@ H.equip_to_slot_or_del(new /obj/item/reagent_containers/drinks/bottle/bottleofnothing(H), SLOT_HUD_RIGHT_STORE) H.equip_to_slot_or_del(new /obj/item/cane(H), SLOT_HUD_LEFT_HAND) if(H.mind) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/conjure/build/mime_wall(null)) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/mime/speak(null)) + H.mind.AddSpell(new /datum/spell/aoe/conjure/build/mime_wall(null)) + H.mind.AddSpell(new /datum/spell/mime/speak(null)) H.mind.miming = TRUE /datum/unarmed_attack/golem/tranquillite diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm index 85528b51b87a..e3bc02451f17 100644 --- a/code/modules/mob/living/carbon/superheroes.dm +++ b/code/modules/mob/living/carbon/superheroes.dm @@ -36,7 +36,7 @@ /datum/superheroes/proc/assign_spells(mob/living/carbon/human/H) if(default_spells.len) for(var/spell in default_spells) - var/obj/effect/proc_holder/spell/S = spell + var/datum/spell/S = spell if(!S) return H.mind.AddSpell(new S(null)) @@ -82,7 +82,7 @@ /datum/superheroes/griffin name = "The Griffin" - default_spells = list(/obj/effect/proc_holder/spell/recruit) + default_spells = list(/datum/spell/recruit) class = "Supervillain" desc = "You are The Griffin, the ultimate supervillain. You thrive on chaos and have no respect for the supposed authority \ of the command staff of this station. Along with your gang of dim-witted yet trusty henchmen, you will be able to execute \ @@ -106,7 +106,7 @@ desc = "You are LightnIan, the lord of lightning! A freak electrical accident while working in the station's kennel \ has given you mastery over lightning and a peculiar desire to sniff butts. Although you are a recent addition to the \ station's hero roster, you intend to leave your mark." - default_spells = list(/obj/effect/proc_holder/spell/charge_up/bounce/lightning/lightnian) + default_spells = list(/datum/spell/charge_up/bounce/lightning/lightnian) /datum/superheroes/lightnian/equip(mob/living/carbon/human/H) ..() @@ -125,7 +125,7 @@ desc = "You were a roboticist, once. Now you are Electro-Negmatic, a name this station will learn to fear. You designed \ your costume to resemble E-N, your faithful dog that some callous RD destroyed because it was sparking up the plasma. You \ intend to take your revenge and make them all pay thanks to your magnetic powers." - default_spells = list(/obj/effect/proc_holder/spell/charge_up/bounce/magnet) + default_spells = list(/datum/spell/charge_up/bounce/magnet) /datum/superheroes/electro/equip(mob/living/carbon/human/H) ..() @@ -143,7 +143,7 @@ //The Griffin's special recruit abilitiy -/obj/effect/proc_holder/spell/recruit +/datum/spell/recruit name = "Recruit Greyshirt" desc = "Allows you to recruit a conscious, non-braindead, non-catatonic human to be part of the Greyshirts, your personal henchmen. This works on Assistants only and you can recruit a maximum of 3!." base_cooldown = 450 @@ -151,16 +151,16 @@ action_icon_state = "spell_greytide" var/recruiting = 0 - selection_activated_message = "You start preparing a mindblowing monologue. Left-click to cast at a target!" + selection_activated_message = "You start preparing a mindblowing monologue. Left-click to cast at a target!" selection_deactivated_message = "You decide to save your brilliance for another day." -/obj/effect/proc_holder/spell/recruit/create_new_targeting() +/datum/spell/recruit/create_new_targeting() var/datum/spell_targeting/click/T = new() T.click_radius = -1 T.range = 1 return T -/obj/effect/proc_holder/spell/recruit/can_cast(mob/user = usr, charge_check = TRUE, show_message = FALSE) +/datum/spell/recruit/can_cast(mob/user = usr, charge_check = TRUE, show_message = FALSE) if(SSticker.mode.greyshirts.len >= 3) if(show_message) to_chat(user, "You have already recruited the maximum number of henchmen.") @@ -171,10 +171,10 @@ return FALSE return ..() -/obj/effect/proc_holder/spell/recruit/valid_target(mob/living/carbon/human/target, user) +/datum/spell/recruit/valid_target(mob/living/carbon/human/target, user) return target.ckey && !target.stat -/obj/effect/proc_holder/spell/recruit/cast(list/targets,mob/living/user = usr) +/datum/spell/recruit/cast(list/targets,mob/living/user = usr) var/mob/living/carbon/human/target = targets[1] if(target.mind.assigned_role != "Assistant") to_chat(user, "You can only recruit Assistants.") diff --git a/code/modules/mob/living/silicon/ai/ai_mob.dm b/code/modules/mob/living/silicon/ai/ai_mob.dm index f660e415f72a..1fcd822f3838 100644 --- a/code/modules/mob/living/silicon/ai/ai_mob.dm +++ b/code/modules/mob/living/silicon/ai/ai_mob.dm @@ -69,7 +69,7 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( //MALFUNCTION var/datum/module_picker/malf_picker - var/datum/action/innate/ai/choose_modules/modules_action + var/datum/spell/ai_spell/choose_modules/modules_action var/list/datum/AI_Module/current_modules = list() var/can_dominate_mechs = FALSE var/shunted = FALSE // TRUE if the AI is currently shunted. Used to differentiate between shunted and ghosted/braindead @@ -1422,7 +1422,7 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( view_core() //A BYOND bug requires you to be viewing your core before your verbs update malf_picker = new /datum/module_picker modules_action = new(malf_picker) - modules_action.Grant(src) + AddSpell(modules_action) ///Removes all malfunction-related /datum/action's from the target AI. /mob/living/silicon/ai/proc/remove_malf_abilities() diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 4513504e42d1..3f160ea41516 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -103,8 +103,8 @@ add_language("Gutter") add_language("Trinary") - AddSpell(new /obj/effect/proc_holder/spell/access_software_pai) - AddSpell(new /obj/effect/proc_holder/spell/unfold_chassis_pai) + AddSpell(new /datum/spell/access_software_pai) + AddSpell(new /datum/spell/unfold_chassis_pai) //PDA pda = new(src) @@ -241,7 +241,7 @@ // mobile pai mob. This also includes handling some of the general shit that can occur // to it. Really this deserves its own file, but for the moment it can sit here. ~ Z -/obj/effect/proc_holder/spell/unfold_chassis_pai +/datum/spell/unfold_chassis_pai name = "Unfold/Fold Chassis" desc = "Allows you to fold in/out of your mobile form." clothes_req = FALSE @@ -249,10 +249,10 @@ action_icon_state = "repairbot" action_background_icon_state = "bg_tech_blue" -/obj/effect/proc_holder/spell/unfold_chassis_pai/create_new_targeting() +/datum/spell/unfold_chassis_pai/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/unfold_chassis_pai/cast(list/targets, mob/living/user = usr) +/datum/spell/unfold_chassis_pai/cast(list/targets, mob/living/user = usr) var/mob/living/silicon/pai/pai_user = user if(pai_user.loc != pai_user.card) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index be46669274a0..57de621d475a 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -12,7 +12,7 @@ GLOBAL_LIST_INIT(pai_emotions, list( GLOBAL_LIST_EMPTY(pai_software_by_key) -/obj/effect/proc_holder/spell/access_software_pai +/datum/spell/access_software_pai name = "Software interface" desc = "Allows you to access your downloaded software." clothes_req = FALSE @@ -20,10 +20,10 @@ GLOBAL_LIST_EMPTY(pai_software_by_key) action_icon_state = "choose_module" action_background_icon_state = "bg_tech_blue" -/obj/effect/proc_holder/spell/access_software_pai/create_new_targeting() +/datum/spell/access_software_pai/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/access_software_pai/cast(list/targets, mob/living/user = usr) +/datum/spell/access_software_pai/cast(list/targets, mob/living/user = usr) var/mob/living/silicon/pai/pai_user = user pai_user.ui_interact(pai_user) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 1540c3aaf069..7a51a6bc812d 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -155,7 +155,7 @@ construct_type = "juggernaut" mob_size = MOB_SIZE_LARGE move_resist = MOVE_FORCE_STRONG - construct_spells = list(/obj/effect/proc_holder/spell/night_vision, /obj/effect/proc_holder/spell/aoe/conjure/build/lesserforcewall) + construct_spells = list(/datum/spell/night_vision, /datum/spell/aoe/conjure/build/lesserforcewall) force_threshold = 11 playstyle_string = "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, \ create shield walls, rip apart enemies and walls." @@ -191,7 +191,7 @@ attacktext = "slashes" attack_sound = 'sound/weapons/bladeslice.ogg' construct_type = "wraith" - construct_spells = list(/obj/effect/proc_holder/spell/night_vision, /obj/effect/proc_holder/spell/ethereal_jaunt/shift) + construct_spells = list(/datum/spell/night_vision, /datum/spell/ethereal_jaunt/shift) retreat_distance = 2 //AI wraiths will move in and out of combat playstyle_string = "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." @@ -227,13 +227,13 @@ minimum_distance = 10 //AI artificers will flee like fuck attack_sound = 'sound/weapons/punch2.ogg' construct_type = "builder" - construct_spells = list(/obj/effect/proc_holder/spell/night_vision, - /obj/effect/proc_holder/spell/projectile/magic_missile/lesser, - /obj/effect/proc_holder/spell/aoe/conjure/construct/lesser, - /obj/effect/proc_holder/spell/aoe/conjure/build/wall, - /obj/effect/proc_holder/spell/aoe/conjure/build/floor, - /obj/effect/proc_holder/spell/aoe/conjure/build/pylon, - /obj/effect/proc_holder/spell/aoe/conjure/build/soulstone) + construct_spells = list(/datum/spell/night_vision, + /datum/spell/projectile/magic_missile/lesser, + /datum/spell/aoe/conjure/construct/lesser, + /datum/spell/aoe/conjure/build/wall, + /datum/spell/aoe/conjure/build/floor, + /datum/spell/aoe/conjure/build/pylon, + /datum/spell/aoe/conjure/build/soulstone) playstyle_string = "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, \ use magic missile, repair allied constructs (by clicking on them), \ @@ -334,10 +334,10 @@ environment_smash = ENVIRONMENT_SMASH_RWALLS attack_sound = 'sound/weapons/tap.ogg' construct_type = "harvester" - construct_spells = list(/obj/effect/proc_holder/spell/night_vision, - /obj/effect/proc_holder/spell/aoe/conjure/build/wall, - /obj/effect/proc_holder/spell/aoe/conjure/build/floor, - /obj/effect/proc_holder/spell/smoke/disable) + construct_spells = list(/datum/spell/night_vision, + /datum/spell/aoe/conjure/build/wall, + /datum/spell/aoe/conjure/build/floor, + /datum/spell/smoke/disable) retreat_distance = 2 //AI harvesters will move in and out of combat, like wraiths, but shittier playstyle_string = "You are a Harvester. You are not strong, but your powers of domination will assist you in your role: \ Bring those who still cling to this world of illusion back to the master so they may know Truth." diff --git a/code/modules/mob/living/simple_animal/hostile/angel_statue.dm b/code/modules/mob/living/simple_animal/hostile/angel_statue.dm index f112f4102544..9f09935dba55 100644 --- a/code/modules/mob/living/simple_animal/hostile/angel_statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/angel_statue.dm @@ -56,9 +56,9 @@ /mob/living/simple_animal/hostile/statue/Initialize(mapload, mob/living/creator) . = ..() // Give spells - AddSpell(new /obj/effect/proc_holder/spell/aoe/flicker_lights(null)) - AddSpell(new /obj/effect/proc_holder/spell/aoe/blindness(null)) - AddSpell(new /obj/effect/proc_holder/spell/night_vision(null)) + AddSpell(new /datum/spell/aoe/flicker_lights(null)) + AddSpell(new /datum/spell/aoe/blindness(null)) + AddSpell(new /datum/spell/night_vision(null)) // Set creator if(creator) @@ -160,7 +160,7 @@ // Statue powers // Flicker lights -/obj/effect/proc_holder/spell/aoe/flicker_lights +/datum/spell/aoe/flicker_lights name = "Flicker Lights" desc = "You will trigger a large amount of lights around you to flicker." @@ -168,18 +168,18 @@ clothes_req = FALSE aoe_range = 14 -/obj/effect/proc_holder/spell/aoe/flicker_lights/create_new_targeting() +/datum/spell/aoe/flicker_lights/create_new_targeting() var/datum/spell_targeting/aoe/turf/targeting = new() targeting.range = aoe_range return targeting -/obj/effect/proc_holder/spell/aoe/flicker_lights/cast(list/targets, mob/user = usr) +/datum/spell/aoe/flicker_lights/cast(list/targets, mob/user = usr) for(var/turf/T in targets) for(var/obj/machinery/light/L in T) L.forced_flicker() //Blind AOE -/obj/effect/proc_holder/spell/aoe/blindness +/datum/spell/aoe/blindness name = "Blindness" desc = "Your prey will be momentarily blind for you to advance on them." @@ -188,13 +188,13 @@ clothes_req = FALSE aoe_range = 10 -/obj/effect/proc_holder/spell/aoe/blindness/create_new_targeting() +/datum/spell/aoe/blindness/create_new_targeting() var/datum/spell_targeting/aoe/targeting = new() targeting.range = aoe_range targeting.allowed_type = /mob/living return targeting -/obj/effect/proc_holder/spell/aoe/blindness/cast(list/targets, mob/user = usr) +/datum/spell/aoe/blindness/cast(list/targets, mob/user = usr) for(var/mob/living/L in targets) if(istype(L, /mob/living/simple_animal/hostile/statue)) continue diff --git a/code/modules/mob/living/simple_animal/hostile/hellhound.dm b/code/modules/mob/living/simple_animal/hostile/hellhound.dm index c50b49221419..16078c0187c5 100644 --- a/code/modules/mob/living/simple_animal/hostile/hellhound.dm +++ b/code/modules/mob/living/simple_animal/hostile/hellhound.dm @@ -118,21 +118,21 @@ /mob/living/simple_animal/hostile/hellhound/greater/Initialize(mapload) . = ..() // Movement - AddSpell(new /obj/effect/proc_holder/spell/ethereal_jaunt/shift) - var/obj/effect/proc_holder/spell/area_teleport/teleport/telespell = new + AddSpell(new /datum/spell/ethereal_jaunt/shift) + var/datum/spell/area_teleport/teleport/telespell = new telespell.clothes_req = FALSE telespell.invocation_type = "none" AddSpell(telespell) - var/obj/effect/proc_holder/spell/aoe/knock/knockspell = new + var/datum/spell/aoe/knock/knockspell = new knockspell.invocation_type = "none" AddSpell(knockspell) // Defense - var/obj/effect/proc_holder/spell/forcewall/wallspell = new + var/datum/spell/forcewall/wallspell = new wallspell.clothes_req = FALSE wallspell.invocation_type = "none" AddSpell(wallspell) // Offense - var/obj/effect/proc_holder/spell/aoe/conjure/creature/summonspell = new + var/datum/spell/aoe/conjure/creature/summonspell = new summonspell.base_cooldown = 1 summonspell.invocation_type = "none" summonspell.summon_type = list(/mob/living/simple_animal/hostile/hellhound) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 0a72200d9655..69ea8e7a312d 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -619,7 +619,7 @@ Difficulty: Medium attack_action_types = list() /mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/Initialize(mapload) - var/obj/effect/proc_holder/spell/aoe/repulse/spacedragon/repulse_action = new /obj/effect/proc_holder/spell/aoe/repulse/spacedragon(src) + var/datum/spell/aoe/repulse/spacedragon/repulse_action = new /datum/spell/aoe/repulse/spacedragon(src) repulse_action.action.Grant(src) mob_spell_list += repulse_action . = ..() @@ -638,7 +638,7 @@ Difficulty: Medium ranged_cooldown = world.time + ranged_cooldown_time fire_stream() -/obj/effect/proc_holder/spell/aoe/repulse/spacedragon +/datum/spell/aoe/repulse/spacedragon name = "Tail Sweep" desc = "Throw back attackers with a sweep of your tail." sound = 'sound/magic/tail_swing.ogg' @@ -651,7 +651,7 @@ Difficulty: Medium action_background_icon_state = "bg_alien" aoe_range = 1 -/obj/effect/proc_holder/spell/aoe/repulse/spacedragon/cast(list/targets, mob/user = usr) +/datum/spell/aoe/repulse/spacedragon/cast(list/targets, mob/user = usr) if(iscarbon(user)) var/mob/living/carbon/C = user playsound(C.loc, 'sound/effects/hit_punch.ogg', 80, TRUE, TRUE) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/kangaroo.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/kangaroo.dm index 86079485cb46..79e1145eee3c 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/kangaroo.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/kangaroo.dm @@ -28,7 +28,7 @@ /mob/living/simple_animal/hostile/retaliate/kangaroo/Initialize(mapload) . = ..() // Leap spell, player-only usage - AddSpell(new /obj/effect/proc_holder/spell/leap) + AddSpell(new /datum/spell/leap) /mob/living/simple_animal/hostile/retaliate/kangaroo/AttackingTarget() if(client && a_intent != INTENT_HARM) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm index dae3abfb64f6..05f9e655b733 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm @@ -46,18 +46,18 @@ /mob/living/simple_animal/hostile/poison/terror_spider/prince/Initialize(mapload) . = ..() if(mind) - var/obj/effect/proc_holder/spell/spell = new /obj/effect/proc_holder/spell/princely_charge() + var/datum/spell/spell = new /datum/spell/princely_charge() mind.AddSpell(spell) else RegisterSignal(src, COMSIG_MOB_LOGIN, TYPE_PROC_REF(/mob/living/simple_animal/hostile/poison/terror_spider/prince, give_spell)) /mob/living/simple_animal/hostile/poison/terror_spider/prince/proc/give_spell() SIGNAL_HANDLER - var/obj/effect/proc_holder/spell/spell = new /obj/effect/proc_holder/spell/princely_charge() + var/datum/spell/spell = new /datum/spell/princely_charge() mind.AddSpell(spell) UnregisterSignal(src, COMSIG_MOB_LOGIN) -/obj/effect/proc_holder/spell/princely_charge +/datum/spell/princely_charge name = "Princely Charge" desc = "You charge at wherever you click on screen, dealing large amounts of damage, stunning and destroying walls and other objects." gain_desc = "You can now charge at a target on screen, dealing massive damage and destroying structures." @@ -65,10 +65,10 @@ clothes_req = FALSE action_icon_state = "terror_prince" -/obj/effect/proc_holder/spell/princely_charge/create_new_targeting() +/datum/spell/princely_charge/create_new_targeting() return new /datum/spell_targeting/clicked_atom -/obj/effect/proc_holder/spell/princely_charge/cast(list/targets, mob/user) +/datum/spell/princely_charge/cast(list/targets, mob/user) var/target = targets[1] if(isliving(user)) var/mob/living/L = user diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index bd5b9b270d37..d89aed14643b 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -70,7 +70,7 @@ /mob/living/simple_animal/shade/sword/Initialize(mapload) .=..() - AddSpell(new /obj/effect/proc_holder/spell/sentient_sword_lunge) + AddSpell(new /datum/spell/sentient_sword_lunge) var/obj/item/nullrod/scythe/talking/host_sword = loc if(istype(host_sword)) health = host_sword.obj_integrity diff --git a/code/modules/mob/living/stat_states.dm b/code/modules/mob/living/stat_states.dm index fb2d64f480b9..8048e4cb75a3 100644 --- a/code/modules/mob/living/stat_states.dm +++ b/code/modules/mob/living/stat_states.dm @@ -77,7 +77,7 @@ if(mind) for(var/S in mind.spell_list) - var/obj/effect/proc_holder/spell/spell = S + var/datum/spell/spell = S spell.UpdateButtons() return TRUE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 2c0e4dac9ae2..aff6b1e7651c 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1158,14 +1158,14 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ visible_message("[src] pukes all over [p_themselves()]!","You puke all over yourself!") add_vomit_floor(TRUE) -/mob/proc/AddSpell(obj/effect/proc_holder/spell/S) +/mob/proc/AddSpell(datum/spell/S) mob_spell_list += S S.action.Grant(src) -/mob/proc/RemoveSpell(obj/effect/proc_holder/spell/spell) //To remove a specific spell from a mind +/mob/proc/RemoveSpell(datum/spell/spell) //To remove a specific spell from a mind if(!spell) return - for(var/obj/effect/proc_holder/spell/S in mob_spell_list) + for(var/datum/spell/S in mob_spell_list) if(istype(S, spell)) qdel(S) mob_spell_list -= S diff --git a/code/modules/mob/mob_vars.dm b/code/modules/mob/mob_vars.dm index 2b3e4cc88e1f..d22ef54752b1 100644 --- a/code/modules/mob/mob_vars.dm +++ b/code/modules/mob/mob_vars.dm @@ -197,7 +197,7 @@ var/registered_z - var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override + var/datum/spell/ranged_ability //Any ranged ability the mob has, as a click override /// Overrides the health HUD element state if set. var/health_hud_override = HEALTH_HUD_OVERRIDE_NONE diff --git a/code/modules/power/apc/apc_malfunction.dm b/code/modules/power/apc/apc_malfunction.dm index b0d892b51fe6..fbf859daa708 100644 --- a/code/modules/power/apc/apc_malfunction.dm +++ b/code/modules/power/apc/apc_malfunction.dm @@ -46,8 +46,8 @@ occupier.eyeobj.name = "[occupier.name] (AI Eye)" if(malf.parent) qdel(malf) - var/datum/action/innate/ai/return_to_core/R = new - R.Grant(occupier) + var/datum/spell/ai_spell/return_to_core/R = new + occupier.AddSpell(R) occupier.cancel_camera() if((SSsecurity_level.get_current_level_as_number() == SEC_LEVEL_DELTA) && malf.nuking) for(var/obj/item/pinpointer/point in GLOB.pinpointer_list) diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 04f4aafbd50b..25e1e1164d07 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -130,7 +130,7 @@ trigger_guard = TRIGGER_GUARD_ALLOW_ALL clumsy_check = FALSE //Stole your uplink! Honk! needs_permit = FALSE //go away beepsky - var/obj/effect/proc_holder/spell/mime/fingergun/parent_spell + var/datum/spell/mime/fingergun/parent_spell /obj/item/gun/projectile/revolver/fingergun/Destroy() if(parent_spell) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 6a7f760a61e0..fe802e47b968 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -28,9 +28,6 @@ || istype(A, /obj/item/reagent_containers) || istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics)) return - if(istype(A, /obj/effect/proc_holder/spell)) - return - if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution if(!A.reagents.total_volume && A.reagents) to_chat(user, "[A] is empty.") diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index e2f0acd79923..dd0ba0dcc732 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -521,12 +521,11 @@ /obj/effect/timestop/New() ..() for(var/mob/living/M in GLOB.player_list) - for(var/obj/effect/proc_holder/spell/aoe/conjure/timestop/T in M.mind.spell_list) //People who can stop time are immune to timestop + for(var/datum/spell/aoe/conjure/timestop/T in M.mind.spell_list) //People who can stop time are immune to timestop immune |= M - /obj/effect/timestop/proc/timestop() - playsound(get_turf(src), 'sound/magic/timeparadox2.ogg', 100, 1, -1) + playsound(get_turf(src), 'sound/magic/timeparadox2.ogg', 100, TRUE, -1) for(var/i in 1 to duration-1) for(var/A in orange (freezerange, loc)) if(isliving(A)) diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index c110a5c76932..b366926e5032 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -472,7 +472,7 @@ /obj/item/organ/internal/cyberimp/brain/hackerman_deck/remove(mob/living/carbon/M, special = 0) . = ..() if(M.mind) - M.mind.RemoveSpell(/obj/effect/proc_holder/spell/hackerman_deck) + M.mind.RemoveSpell(/datum/spell/hackerman_deck) UnregisterSignal(M, COMSIG_BODY_TRANSFER_TO) /obj/item/organ/internal/cyberimp/brain/hackerman_deck/proc/on_body_transfer() @@ -485,8 +485,8 @@ /obj/item/organ/internal/cyberimp/brain/hackerman_deck/proc/add_spell() if(owner.mind) - owner.mind.RemoveSpell(/obj/effect/proc_holder/spell/hackerman_deck) //Just to be sure. - owner.mind.AddSpell(new /obj/effect/proc_holder/spell/hackerman_deck(null)) + owner.mind.RemoveSpell(/datum/spell/hackerman_deck) //Just to be sure. + owner.mind.AddSpell(new /datum/spell/hackerman_deck(null)) /obj/item/organ/internal/cyberimp/brain/hackerman_deck/emp_act(severity) owner.adjustStaminaLoss(40 / severity) @@ -494,7 +494,7 @@ to_chat(owner, "Your [name] heats up drastically!") return TRUE -/obj/effect/proc_holder/spell/hackerman_deck +/datum/spell/hackerman_deck name = "Activate Ranged Hacking" desc = "Click on any machine to hack them. Has a short range of only three tiles." base_cooldown = 10 SECONDS @@ -508,13 +508,13 @@ /// How many times have we successfully hacked in the last minute? Increases burn damage by 3 for each value above 0. var/recent_hacking = 0 -/obj/effect/proc_holder/spell/hackerman_deck/create_new_targeting() +/datum/spell/hackerman_deck/create_new_targeting() var/datum/spell_targeting/clicked_atom/C = new() C.range = 3 C.try_auto_target = FALSE return C -/obj/effect/proc_holder/spell/hackerman_deck/on_mind_transfer(mob/living/L) +/datum/spell/hackerman_deck/on_mind_transfer(mob/living/L) if(!ishuman(L)) return FALSE var/mob/living/carbon/human/H = L @@ -523,7 +523,7 @@ return FALSE return TRUE -/obj/effect/proc_holder/spell/hackerman_deck/cast(list/targets, mob/user) +/datum/spell/hackerman_deck/cast(list/targets, mob/user) var/atom/target = targets[1] if(get_dist(user, target) > 3) //fucking cameras holy shit to_chat(user, "Your implant is not robust enough to hack at that distance!") @@ -557,7 +557,7 @@ recent_hacking++ addtimer(CALLBACK(src, PROC_REF(lower_recent_hacking)), 1 MINUTES) -/obj/effect/proc_holder/spell/hackerman_deck/proc/lower_recent_hacking() +/datum/spell/hackerman_deck/proc/lower_recent_hacking() recent_hacking-- //[[[[MOUTH]]]] diff --git a/code/modules/surgery/organs/subtypes/xenos.dm b/code/modules/surgery/organs/subtypes/xenos.dm index 98960fdd4b55..6512d934cedd 100644 --- a/code/modules/surgery/organs/subtypes/xenos.dm +++ b/code/modules/surgery/organs/subtypes/xenos.dm @@ -60,8 +60,8 @@ w_class = WEIGHT_CLASS_NORMAL origin_tech = "biotech=5;plasmatech=4" slot = "plasmavessel" - alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/plant_weeds, /obj/effect/proc_holder/spell/alien_spell/transfer_plasma) - human_powers = list(/obj/effect/proc_holder/spell/alien_spell/syphon_plasma) + alien_powers = list(/datum/spell/alien_spell/plant_weeds, /datum/spell/alien_spell/transfer_plasma) + human_powers = list(/datum/spell/alien_spell/syphon_plasma) var/stored_plasma = 100 var/max_plasma = 300 @@ -130,8 +130,8 @@ icon_state = "acid" slot = "acid" origin_tech = "biotech=5;materials=2;combat=2" - alien_powers = list(/obj/effect/proc_holder/spell/touch/alien_spell/corrosive_acid) - human_powers = list(/obj/effect/proc_holder/spell/touch/alien_spell/burning_touch) + alien_powers = list(/datum/spell/touch/alien_spell/corrosive_acid) + human_powers = list(/datum/spell/touch/alien_spell/burning_touch) /obj/item/organ/internal/alien/hivenode name = "xeno hive node" @@ -139,7 +139,7 @@ slot = "hivenode" origin_tech = "biotech=5;magnets=4;bluespace=3" w_class = WEIGHT_CLASS_TINY - alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/whisper) + alien_powers = list(/datum/spell/alien_spell/whisper) /obj/item/organ/internal/alien/hivenode/insert(mob/living/carbon/M, special = 0) ..() @@ -160,16 +160,16 @@ icon_state = "neurotox" slot = "neurotox" origin_tech = "biotech=5;combat=5" - alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/neurotoxin) - human_powers = list(/obj/effect/proc_holder/spell/alien_spell/neurotoxin/death_to_xenos) + alien_powers = list(/datum/spell/alien_spell/neurotoxin) + human_powers = list(/datum/spell/alien_spell/neurotoxin/death_to_xenos) /obj/item/organ/internal/alien/resinspinner name = "xeno resin organ" icon_state = "liver-x" slot = "spinner" origin_tech = "biotech=5;materials=4" - alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/build_resin) - human_powers = list(/obj/effect/proc_holder/spell/touch/alien_spell/consume_resin) + alien_powers = list(/datum/spell/alien_spell/build_resin) + human_powers = list(/datum/spell/touch/alien_spell/consume_resin) /obj/item/organ/internal/alien/eggsac name = "xeno egg sac" @@ -177,6 +177,6 @@ slot = "eggsac" w_class = WEIGHT_CLASS_BULKY origin_tech = "biotech=6" - alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/plant_weeds/eggs) - human_powers = list(/obj/effect/proc_holder/spell/alien_spell/combust_facehuggers) + alien_powers = list(/datum/spell/alien_spell/plant_weeds/eggs) + human_powers = list(/datum/spell/alien_spell/combust_facehuggers) cargo_profit = 1000 diff --git a/code/modules/unit_tests/spell_targeting_test.dm b/code/modules/unit_tests/spell_targeting_test.dm index 250a66458f90..e1a189774390 100644 --- a/code/modules/unit_tests/spell_targeting_test.dm +++ b/code/modules/unit_tests/spell_targeting_test.dm @@ -1,6 +1,6 @@ /datum/unit_test/spell_targeting/Run() var/list/bad_spells = list() - for(var/obj/effect/proc_holder/spell/S as anything in typesof(/obj/effect/proc_holder/spell)) + for(var/datum/spell/S as anything in typesof(/datum/spell)) if(initial(S.name) == "Spell") continue // Skip abstract spells S = new S diff --git a/paradise.dme b/paradise.dme index 404e0e040a33..1ae3ef8e6ebc 100644 --- a/paradise.dme +++ b/paradise.dme @@ -554,7 +554,6 @@ #include "code\datums\spells\genetic.dm" #include "code\datums\spells\horsemask.dm" #include "code\datums\spells\infinite_guns.dm" -#include "code\datums\spells\inflict_handler.dm" #include "code\datums\spells\knock.dm" #include "code\datums\spells\lichdom.dm" #include "code\datums\spells\lightning.dm" @@ -573,7 +572,6 @@ #include "code\datums\spells\summon_supermatter.dm" #include "code\datums\spells\summonitem.dm" #include "code\datums\spells\touch_attacks.dm" -#include "code\datums\spells\trigger.dm" #include "code\datums\spells\turf_teleport.dm" #include "code\datums\spells\wizard_spells.dm" #include "code\datums\spells\alien_spells\basetype_alien_spell.dm" From 663e007d4d6678ae1183ea8368e5a004d79a250f Mon Sep 17 00:00:00 2001 From: Charlie Nolan Date: Mon, 1 Apr 2024 00:49:06 -0700 Subject: [PATCH 44/48] Added an autoresponse system for mentorhelp, using the existing button. (#24384) * Added an autoresponse system for mentorhelp, using the existing button. * Apply suggestions from code review Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Review suggestions. * Add How to Objectives * Apply suggestions from code review Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> * Build the response phrases lists only once. * Add Russian autoresponse. * Corrected Russian Paradise server name. --------- Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> --- code/__DEFINES/tickets_defines.dm | 10 +++ .../subsystem/tickets/mentor_tickets.dm | 40 ++++++++++- code/controllers/subsystem/tickets/tickets.dm | 67 +++++++++---------- code/modules/admin/topic.dm | 11 +-- paradise.dme | 1 + 5 files changed, 88 insertions(+), 41 deletions(-) create mode 100644 code/__DEFINES/tickets_defines.dm diff --git a/code/__DEFINES/tickets_defines.dm b/code/__DEFINES/tickets_defines.dm new file mode 100644 index 000000000000..9fbb25a17d6c --- /dev/null +++ b/code/__DEFINES/tickets_defines.dm @@ -0,0 +1,10 @@ +//Time until ticket becomes stale if unanswered. Alerts admins. +#define TICKET_TIMEOUT (10 MINUTES) +//Time before the user is allowed to open another ticket while their existing one is open. +#define TICKET_DUPLICATE_COOLDOWN (5 MINUTES) + +//Status defines +#define TICKET_OPEN 1 +#define TICKET_CLOSED 2 +#define TICKET_RESOLVED 3 +#define TICKET_STALE 4 diff --git a/code/controllers/subsystem/tickets/mentor_tickets.dm b/code/controllers/subsystem/tickets/mentor_tickets.dm index 6b6af90bd7d1..41b5a9522892 100644 --- a/code/controllers/subsystem/tickets/mentor_tickets.dm +++ b/code/controllers/subsystem/tickets/mentor_tickets.dm @@ -26,6 +26,23 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets "Please try to be as descriptive as possible in mentor helps. Mentors do not know the full situation you're in and need more information to give you a helpful response.", "Your [ticket_name] has now been closed.") + response_phrases = list("Known Bug" = "Unfortunately, that's a known bug. Hopefully it gets fixed soon.", + "TM Bug" = "Unfortunately, that's a bug with a current test merge. It should go away when the test merge is removed or fixed.", + "Clear Cache" = "To fix a blank screen, go to the 'Special Verbs' tab and press 'Reload UI Resources'. If that fails, clear your BYOND cache (instructions provided with 'Reload UI Resources'). If that still fails, please ask for help again, stating you have already done these steps.", + "Experiment!" = "Experiment! Part of the joy of this game is trying out various things, and dealing with the consequences if/when they go horribly wrong.", + "How to Objectives" = "There are lots of ways to accomplish your objectives as an antagonist. A direct frontal assault may work, provided you can get in and out before backup arrives. Sneaking in can work, too, as long as you're quick and avoid prying eyes. But don't forget roleplaying methods! Tricking your target into a maze of bear traps is much more interesting than just shooting them with a gun. Even if it fails, you and your target (or its guardians) are likely to have more fun this way, and that's the most important part.", + "MHelp was in Russian" = "Привет! Ты попал на английский Paradise сервер. Возможно, ты ошибся. Русский имеет такое название: SS220\[RU]." + ) + + if(GLOB.configuration.url.github_url) + response_phrases["New Bug"] = "That sounds like a bug! To report it, please go to our Github page. Then go to 'Issues', click 'New Issue', and fill out the report form. If the report would reveal current-round information, file it after the round ends." + + var/unsorted_responses = list() + for(var/key in response_phrases) //build a new list based on the short descriptive keys of the master list so we can send this as the input instead of the full paragraphs to the admin choosing which autoresponse + unsorted_responses += key + sorted_responses = sortTim(unsorted_responses, GLOBAL_PROC_REF(cmp_text_asc)) //use sortTim and cmp_text_asc to sort alphabetically + + /datum/controller/subsystem/tickets/mentor_tickets/message_staff(msg, prefix_type = NONE, important = FALSE) message_mentorTicket(msg, important) @@ -33,4 +50,25 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets SStickets.newTicket(get_client_by_ckey(T.client_ckey), T.first_raw_response, T.title) /datum/controller/subsystem/tickets/mentor_tickets/autoRespond(N) - return + if(!check_rights(rights_needed)) + return + + var/datum/ticket/T = allTickets[N] + var/client/C = usr.client + if((T.staffAssigned && T.staffAssigned != C) || (T.lastStaffResponse && T.lastStaffResponse != C) || ((T.ticketState != TICKET_OPEN) && (T.ticketState != TICKET_STALE))) //if someone took this ticket, is it the same mentor who is autoresponding? if so, then skip the warning + if(alert(usr, "[T.ticketState == TICKET_OPEN ? "Another mentor appears to already be handling this." : "This ticket is already marked as closed or resolved"] Are you sure you want to continue?", "Confirmation", "Yes", "No") != "Yes") + return + T.assignStaff(C) + + var/message_key = input("Select an autoresponse. This will mark the ticket as resolved.", "Autoresponse") as null|anything in sortTim(sorted_responses, GLOBAL_PROC_REF(cmp_text_asc)) //use sortTim and cmp_text_asc to sort alphabetically + var/client/ticket_owner = get_client_by_ckey(T.client_ckey) + if(message_key == null) + T.staffAssigned = null //if they cancel we dont need to hold this ticket anymore + return + + SEND_SOUND(returnClient(N), sound('sound/effects/adminhelp.ogg')) + to_chat_safe(returnClient(N), "[key_name_hidden(C)] is autoresponding with: [response_phrases[message_key]]") //for this we want the full value of whatever key this is to tell the player so we do response_phrases[message_key] + message_staff("[C] has auto responded to [ticket_owner]\'s mentorhelp with: [message_key]") //we want to use the short named keys for this instead of the full sentence which is why we just do message_key + T.lastStaffResponse = "Autoresponse: [message_key]" + resolveTicket(N) + log_game("[C] has auto responded to [ticket_owner]\'s mentorhelp with: [response_phrases[message_key]]") diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm index 655f6eda0868..a349ba9acf3d 100644 --- a/code/controllers/subsystem/tickets/tickets.dm +++ b/code/controllers/subsystem/tickets/tickets.dm @@ -1,15 +1,3 @@ -//Defines -//Deciseconds until ticket becomes stale if unanswered. Alerts admins. -#define TICKET_TIMEOUT 6000 // 10 minutes -//Decisecions before the user is allowed to open another ticket while their existing one is open. -#define TICKET_DUPLICATE_COOLDOWN 3000 // 5 minutes - -//Status defines -#define TICKET_OPEN 1 -#define TICKET_CLOSED 2 -#define TICKET_RESOLVED 3 -#define TICKET_STALE 4 - #define TICKET_STAFF_MESSAGE_ADMIN_CHANNEL 1 #define TICKET_STAFF_MESSAGE_PREFIX 2 @@ -44,6 +32,11 @@ SUBSYSTEM_DEF(tickets) /// DB ID for these tickets to be logged with var/db_save_id = "ADMIN" + // Autoresponse phrases. + var/response_phrases + // Autoresponse keys, in sorted order. + var/sorted_responses + /datum/controller/subsystem/tickets/get_metrics() . = ..() var/list/cust = list() @@ -55,6 +48,31 @@ SUBSYSTEM_DEF(tickets) "Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.", "Your [ticket_name] has now been closed.") + response_phrases = list("Thanks" = "Thanks for the ahelp!", + "Handling It" = "The issue is being looked into, thanks.", + "Already Resolved" = "The problem has been resolved already.", + "Mentorhelp" = "Please redirect your question to Mentorhelp, as they are better experienced with these types of questions.", + "Happens Again" = "Thanks, let us know if it continues to happen.", + "Clear Cache" = "To fix a blank screen, go to the 'Special Verbs' tab and press 'Reload UI Resources'. If that fails, clear your BYOND cache (instructions provided with 'Reload UI Resources'). If that still fails, please adminhelp again, stating you have already done the following." , + "IC Issue" = "This is an In Character (IC) issue and will not be handled by admins. You could speak to Security, Internal Affairs, a Departmental Head, Nanotrasen Representative, or any other relevant authority currently on station.", + "Reject" = "Reject", + "Man Up" = "Man Up", + ) + + if(GLOB.configuration.url.banappeals_url) + response_phrases["Appeal on the Forums"] = "Appealing a ban must occur on the forums. Privately messaging, or adminhelping about your ban will not resolve it. To appeal your ban, please head to [GLOB.configuration.url.banappeals_url]" + + if(GLOB.configuration.url.github_url) + response_phrases["Github Issue Report"] = "To report a bug, please go to our Github page. Then go to 'Issues'. Then 'New Issue'. Then fill out the report form. If the report would reveal current-round information, file it after the round ends." + + if(GLOB.configuration.url.exploit_url) + response_phrases["Exploit Report"] = "To report an exploit, please go to our Exploit Report page. Then 'Start New Topic'. Then fill out the topic with as much information about the exploit that you can. If possible, add steps taken to reproduce the exploit. The Development Team will be informed automatically of the post." + + var/unsorted_responses = list() + for(var/key in response_phrases) //build a new list based on the short descriptive keys of the master list so we can send this as the input instead of the full paragraphs to the admin choosing which autoresponse + unsorted_responses += key + sorted_responses = sortTim(unsorted_responses, GLOBAL_PROC_REF(cmp_text_asc)) //use sortTim and cmp_text_asc to sort alphabetically + /datum/controller/subsystem/tickets/fire() var/stales = checkStaleness() if(LAZYLEN(stales)) @@ -242,31 +260,8 @@ SUBSYSTEM_DEF(tickets) return T.assignStaff(C) - var/response_phrases = list("Thanks" = "Thanks for the ahelp!", - "Handling It" = "The issue is being looked into, thanks.", - "Already Resolved" = "The problem has been resolved already.", - "Mentorhelp" = "Please redirect your question to Mentorhelp, as they are better experienced with these types of questions.", - "Happens Again" = "Thanks, let us know if it continues to happen.", - "Clear Cache" = "To fix a blank screen, go to the 'Special Verbs' tab and press 'Reload UI Resources'. If that fails, clear your BYOND cache (instructions provided with 'Reload UI Resources'). If that still fails, please adminhelp again, stating you have already done the following." , - "IC Issue" = "This is an In Character (IC) issue and will not be handled by admins. You could speak to Security, Internal Affairs, a Departmental Head, Nanotrasen Representative, or any other relevant authority currently on station.", - "Reject" = "Reject", - "Man Up" = "Man Up", - ) - - if(GLOB.configuration.url.banappeals_url) - response_phrases["Appeal on the Forums"] = "Appealing a ban must occur on the forums. Privately messaging, or adminhelping about your ban will not resolve it. To appeal your ban, please head to [GLOB.configuration.url.banappeals_url]" - - if(GLOB.configuration.url.github_url) - response_phrases["Github Issue Report"] = "To report a bug, please go to our Github page. Then go to 'Issues'. Then 'New Issue'. Then fill out the report form. If the report would reveal current-round information, file it after the round ends." - - if(GLOB.configuration.url.exploit_url) - response_phrases["Exploit Report"] = "To report an exploit, please go to our Exploit Report page. Then 'Start New Topic'. Then fill out the topic with as much information about the exploit that you can. If possible, add steps taken to reproduce the exploit. The Development Team will be informed automatically of the post." - - var/sorted_responses = list() - for(var/key in response_phrases) //build a new list based on the short descriptive keys of the master list so we can send this as the input instead of the full paragraphs to the admin choosing which autoresponse - sorted_responses += key - var/message_key = input("Select an autoresponse. This will mark the ticket as resolved.", "Autoresponse") as null|anything in sortTim(sorted_responses, GLOBAL_PROC_REF(cmp_text_asc)) //use sortTim and cmp_text_asc to sort alphabetically + var/message_key = input("Select an autoresponse. This will mark the ticket as resolved.", "Autoresponse") as null|anything in sorted_responses var/client/ticket_owner = get_client_by_ckey(T.client_ckey) if(!ticket_owner) to_chat(C, "Can't respond to the ticket of a disconnected user.") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 021efa163c28..1f9256283d6d 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1728,13 +1728,16 @@ SStickets.resolveTicket(index) else if(href_list["autorespond"]) + var/datum/controller/subsystem/tickets/ticketSystem if(href_list["is_mhelp"]) - to_chat(usr, "Auto responses are not available for mentor helps.") + ticketSystem = SSmentor_tickets + else //Ahelp + ticketSystem = SStickets + + if(!check_rights(ticketSystem.rights_needed)) return var/index = text2num(href_list["autorespond"]) - if(!check_rights(R_ADMIN|R_MOD)) - return - SStickets.autoRespond(index) + ticketSystem.autoRespond(index) if(href_list["convert_ticket"]) var/indexNum = text2num(href_list["convert_ticket"]) diff --git a/paradise.dme b/paradise.dme index 1ae3ef8e6ebc..99ff381c75cd 100644 --- a/paradise.dme +++ b/paradise.dme @@ -120,6 +120,7 @@ #include "code\__DEFINES\tg_cooldowns.dm" #include "code\__DEFINES\tgs.dm" #include "code\__DEFINES\tgui_defines.dm" +#include "code\__DEFINES\tickets_defines.dm" #include "code\__DEFINES\tools_defines.dm" #include "code\__DEFINES\turfs.dm" #include "code\__DEFINES\typeids.dm" From 5c5f7842df608de67b0ff7e600c0226cc7ab5d68 Mon Sep 17 00:00:00 2001 From: Charlie Nolan Date: Mon, 1 Apr 2024 00:50:07 -0700 Subject: [PATCH 45/48] Secondary goals (#24599) * Extract requests console message sending code. * Add secondary goals * Converted supply shuttle to a signal-based system. * Lint. * Review suggestions. * Secondary goals can now check the supply shuttle for their requirements. * Remove redundant completion variable, undef what we define. * Made the request console refuse to issue a secondary goal until you finish the current one. * Made the shuttle blacklist error more specific, added locked/manifest-attached crates to blacklist. * Added round end secondary goal report. * Lint * Add tags to reagents for secondary goals to use. * Extracted the reagent logic from the bar goal, used reagent tags. * Added the Variety of Drinks Bar goal. * Added variety drinks goal for the Bar. * CC no longer complains about sending stuff in containers, but the shuttle will refuse lockboxes without goal items. * Allow unlocked lockboxes on the shuttle. * Added kitchen goals. * Lint * More lint * Add goals for scichem and medchem, pending reagent labelling. * Added Kudzu goal for botany. * I forgot to rename them, oops. * Lint * Made mechs sellable, configurable goal rewards. * Balancing changes. * Added random Ripley goal. * Add Clear Task Backlog station goal. * Lint * Oops. * did i even do this right * Lint * Excluded drinks available from upgraded booze dispenser. * Such bugs. Much fix. Wow. * Goal notice formatting. * Apply suggestions from code review Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Made storage nesting better, improved consistency between storage types. * Out, er, space. * Added a proc for sending a requests console message. * Added error messages to Virology Goals. Backported a few small things from Secondary Goals to make this easier. * Extracted out the three-way reward code into a proc. * Update code/__DEFINES/dcs/signals.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * Removed redundant SIGNAL_HANDLER labels. * Yes, that should be a proc. * Enforce important parent calls. * Thank you, DreamChecker * Undid accidental merge of #24699 * Removed a testing proc that wasn't intended for this PR. * Removed parts of #24750 that also crept in. * Made the variety of [x] goals more explicit that they want 50u of each. * Reduced Kudzu trait requirement to 1. * Request consoles now output the list of valid departments if you're at an unsupported one. * Added personal crates. * Added a supply pack of personal crates. * Added special cargo handling for personal crates. * Added automatic personal crate when requesting a goal. * Required personal crates for most secondary goals. * Add goal labels to the hand labeler, require them for mech goals. * Made secondary goals one-per-person, not one-per-department. * Added support for multi-line system messages to the request consoles. * Made the RC message for goals nicer. * Send goal crates even if no normal crates are ready, name and access-lock them properly. * Don't double-label. * Let's not use registered_account, names are fine. * Add a ton of blackbox data to cargo and secondary goals. * Fix a few bugs. * More bugfixing, couple more stats. * Even more stats. * Text fix. * Made cargo fines more consistent with other cargo feedback. * Fixed a bug that prevented non-top-level items from being checked for CARGO_REQUIRE_PRIORITY. * Blocked large crates from being sent back unopened. * Enum values should probably be different from each other. * Correct a bitflag mishap. * Removed redundant supply shuttle docking and buy/sell attempts. * Tweak message about personal crates to inlclude that they need to lock it. * Add /Crates to the Personal Lockers description. * Less pretty alignment, less complaining linters. * Corrected a bad name in stats tracking. * Reduced SciChem variety goal to 5 types. * Toned down Task Backlog a bit. * Fixed a bug that made unsellable items nested in containers be stolen by CC (qdeleted). * Don't require bluespace 8, that's silly. * Made secondary goals modifiable in the Modify Station Goals UI. * Whoops, that was supposed to be 600u. * i ded pls nerf --------- Co-authored-by: synthtee <127706731+SynthTwo@users.noreply.github.com> Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> --- code/__DEFINES/dcs/signals.dm | 21 + code/__DEFINES/food_defines.dm | 5 + code/__DEFINES/reagents_defines.dm | 6 + code/__DEFINES/station_goals.dm | 7 + code/__DEFINES/supply_defines.dm | 14 + code/__HELPERS/unsorted.dm | 23 +- code/controllers/subsystem/SSeconomy.dm | 31 +- code/datums/components/label.dm | 29 +- code/game/gamemodes/game_mode.dm | 30 +- code/game/jobs/access.dm | 2 +- code/game/machinery/requests_console.dm | 171 ++-- .../structures/crates_lockers/crates.dm | 52 + code/modules/admin/topic.dm | 42 +- code/modules/admin/verbs/randomverbs.dm | 15 +- code/modules/events/spacevine.dm | 111 ++- .../food_and_drinks/food/foods/baked_goods.dm | 36 + .../food_and_drinks/food/foods/bread.dm | 14 + .../food_and_drinks/food/foods/candy.dm | 142 ++- .../food_and_drinks/food/foods/desserts.dm | 6 + .../food_and_drinks/food/foods/ethnic.dm | 10 + .../food_and_drinks/food/foods/frozen.dm | 39 +- .../food_and_drinks/food/foods/ingredients.dm | 2 + .../food_and_drinks/food/foods/meat.dm | 14 + .../food_and_drinks/food/foods/misc_food.dm | 19 + .../food_and_drinks/food/foods/pasta.dm | 6 + .../food_and_drinks/food/foods/pizza.dm | 13 + .../food_and_drinks/food/foods/sandwiches.dm | 34 + .../food_and_drinks/food/foods/seafood.dm | 20 + .../food_and_drinks/food/foods/side_dishes.dm | 11 + .../food_and_drinks/food/foods/soups.dm | 44 + code/modules/food_and_drinks/food_base.dm | 4 + code/modules/hydroponics/grown/kudzu.dm | 8 +- code/modules/paperwork/handlabeler.dm | 42 +- .../reagents/chemistry/reagents/alcohol.dm | 83 ++ .../reagents/chemistry/reagents/drugs.dm | 30 + .../chemistry/reagents/food_reagents.dm | 14 + .../reagents/chemistry/reagents/medicine.dm | 35 + .../reagents/chemistry/reagents/toxins.dm | 20 + .../reagents/chemistry/reagents_datum.dm | 7 + code/modules/research/message_server.dm | 13 +- code/modules/shuttle/shuttle.dm | 4 +- code/modules/shuttle/supply.dm | 900 ++++++++++++++---- .../secondary/bar/random_bulk_drink.dm | 9 + .../secondary/bar/variety_drinks.dm | 11 + .../secondary/botany/kudzu_goal.dm | 105 ++ .../kitchen/random_bulk_condiment.dm | 9 + .../secondary/kitchen/random_bulk_food.dm | 92 ++ .../secondary/medical/random_bulk_medicine.dm | 9 + .../secondary/medical/variety_medicine.dm | 11 + .../secondary/random_bulk_reagent.dm | 102 ++ .../secondary/science/random_bulk_chemical.dm | 9 + .../secondary/science/random_ripley.dm | 105 ++ .../secondary/science/variety_chemicals.dm | 12 + .../station_goals/secondary/secondary_goal.dm | 104 ++ .../secondary/secondary_goal_tracker.dm | 125 +++ .../secondary/variety_reagent.dm | 138 +++ code/modules/station_goals/station_goal.dm | 2 + code/modules/station_goals/task_backlog.dm | 23 + code/modules/supply/supply_console.dm | 4 +- .../supply/supply_packs/pack_miscellaneous.dm | 12 + code/modules/virology/virology_goals.dm | 140 ++- paradise.dme | 17 + .../tgui/interfaces/RequestConsole.js | 64 +- tgui/public/tgui.bundle.js | 152 +-- 64 files changed, 2893 insertions(+), 491 deletions(-) create mode 100644 code/__DEFINES/food_defines.dm create mode 100644 code/__DEFINES/supply_defines.dm create mode 100644 code/modules/station_goals/secondary/bar/random_bulk_drink.dm create mode 100644 code/modules/station_goals/secondary/bar/variety_drinks.dm create mode 100644 code/modules/station_goals/secondary/botany/kudzu_goal.dm create mode 100644 code/modules/station_goals/secondary/kitchen/random_bulk_condiment.dm create mode 100644 code/modules/station_goals/secondary/kitchen/random_bulk_food.dm create mode 100644 code/modules/station_goals/secondary/medical/random_bulk_medicine.dm create mode 100644 code/modules/station_goals/secondary/medical/variety_medicine.dm create mode 100644 code/modules/station_goals/secondary/random_bulk_reagent.dm create mode 100644 code/modules/station_goals/secondary/science/random_bulk_chemical.dm create mode 100644 code/modules/station_goals/secondary/science/random_ripley.dm create mode 100644 code/modules/station_goals/secondary/science/variety_chemicals.dm create mode 100644 code/modules/station_goals/secondary/secondary_goal.dm create mode 100644 code/modules/station_goals/secondary/secondary_goal_tracker.dm create mode 100644 code/modules/station_goals/secondary/variety_reagent.dm create mode 100644 code/modules/station_goals/task_backlog.dm diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index f0ab8e7ac932..0f652808833a 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -1017,3 +1017,24 @@ /// from /obj/structure/cursed_slot_machine/determine_victor() when someone finally wins. #define COMSIG_GLOB_CURSED_SLOT_MACHINE_WON "cursed_slot_machine_won" + +// Signal types for the cargo shuttle + +// Sent before the shuttle scans its contents. +// Use to initialize data that will be needed during the scan. +#define COMSIG_CARGO_BEGIN_SCAN "begin_scan" +// Sent as the shuttle scans its contents. +// Can return sell flags (see code/__DEFINES/supply_defines.dm). +#define COMSIG_CARGO_CHECK_SELL "check_sell" +// Sent as the shuttle begins selling off its contents. +// Use to initialize data that will be needed during the sale. +#define COMSIG_CARGO_BEGIN_SELL "begin_sell" +// Sent during sales for items marked with COMSIG_CARGO_SELL_PRIORITY. +#define COMSIG_CARGO_DO_PRIORITY_SELL "do_priority_sell" +// Sent during sales for items marked with COMSIG_CARGO_SELL_NORMAL. +#define COMSIG_CARGO_DO_SELL "do_sell" +// Sent during sales for items marked with COMSIG_CARGO_SELL_WRONG. +#define COMSIG_CARGO_SEND_ERROR "send_error" +// Sent when sales are completed. +// Use to send summary messages for items that sell in bulk. +#define COMSIG_CARGO_END_SELL "end_sell" diff --git a/code/__DEFINES/food_defines.dm b/code/__DEFINES/food_defines.dm new file mode 100644 index 000000000000..83d378400e11 --- /dev/null +++ b/code/__DEFINES/food_defines.dm @@ -0,0 +1,5 @@ +// Used for secondary goals. +#define FOOD_GOAL_SKIP 0 +#define FOOD_GOAL_EASY 1 +#define FOOD_GOAL_NORMAL 2 +#define FOOD_GOAL_HARD 3 diff --git a/code/__DEFINES/reagents_defines.dm b/code/__DEFINES/reagents_defines.dm index 3b31509b4c70..45bc2fafd1d2 100644 --- a/code/__DEFINES/reagents_defines.dm +++ b/code/__DEFINES/reagents_defines.dm @@ -32,3 +32,9 @@ /// Like O- blood but doesn't contribute to blood_volume or vampire nutrition #define BLOOD_TYPE_FAKE_BLOOD "Vh Null" + +/// Used for secondary goals. +#define REAGENT_GOAL_SKIP 0 +#define REAGENT_GOAL_EASY 1 +#define REAGENT_GOAL_NORMAL 2 +#define REAGENT_GOAL_HARD 3 diff --git a/code/__DEFINES/station_goals.dm b/code/__DEFINES/station_goals.dm index 0c19da7b5f10..01922b2132c3 100644 --- a/code/__DEFINES/station_goals.dm +++ b/code/__DEFINES/station_goals.dm @@ -1,2 +1,9 @@ #define BSA_SIZE_FRONT 4 #define BSA_SIZE_BACK 6 + +// Secondary goals + +/// How many units can be missing from a reagent and still count to the goal. +/// Prevents floationg point rounding from making you fail even though you +/// seemed to have sent enough. +#define REAGENT_GOAL_FORGIVENESS 0.1 diff --git a/code/__DEFINES/supply_defines.dm b/code/__DEFINES/supply_defines.dm new file mode 100644 index 000000000000..f47fdaf111e1 --- /dev/null +++ b/code/__DEFINES/supply_defines.dm @@ -0,0 +1,14 @@ +// Cargo sell flags + +// Priorities +// Each priority blocks all lower priorities. +// Any priority (even WRONG) prevents items from being considered trash. +#define COMSIG_CARGO_SELL_PRIORITY (1<<0) +#define COMSIG_CARGO_SELL_NORMAL (1<<1) +#define COMSIG_CARGO_SELL_WRONG (1<<2) +#define COMSIG_CARGO_SELL_SKIP (1<<3) +#define COMSIG_CARGO_MESS (1<<4) + +// Functional markers +// Marks the item as safe for the shuttle floor (e.g. crates) +#define COMSIG_CARGO_IS_SECURED (1<<5) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 3c1bc5fb997a..50a5df5f38d0 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1596,17 +1596,18 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) closest_atom = A return closest_atom -/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) - if(!value) //nothing should be calling us with a number, so this is safe - value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text - if(isnull(value)) +/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types(), skip_filter = FALSE) + if(!skip_filter) + if(!value) //nothing should be calling us with a number, so this is safe + value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text + if(isnull(value)) + return + value = trim(value) + if(!isnull(value) && value != "") + matches = filter_fancy_list(matches, value) + + if(!length(matches)) return - value = trim(value) - if(!isnull(value) && value != "") - matches = filter_fancy_list(matches, value) - - if(!length(matches)) - return var/chosen if(length(matches) == 1) @@ -1702,6 +1703,8 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) /obj/structure = "STRUCTURE", /obj/vehicle = "VEHICLE", /obj = "O", + /datum/station_goal/secondary = "S_GOAL", + /datum/station_goal = "GOAL", /datum = "D", /turf/simulated/floor = "SIM_FLOOR", /turf/simulated/wall = "SIM_WALL", diff --git a/code/controllers/subsystem/SSeconomy.dm b/code/controllers/subsystem/SSeconomy.dm index db104e779dc5..c261d7f963a7 100644 --- a/code/controllers/subsystem/SSeconomy.dm +++ b/code/controllers/subsystem/SSeconomy.dm @@ -48,14 +48,34 @@ SUBSYSTEM_DEF(economy) ///Current Order number var/ordernum = 1 - /// points gained per slip returned + /// credits gained per slip returned var/credits_per_manifest = 5 - /// points gained per intel returned + /// credits gained per intel sold var/credits_per_intel = 750 - /// points gained per plasma returned + /// credits gained per plasma sold var/credits_per_plasma = 10 - /// points gained per research design returned + /// credits gained per research design sold var/credits_per_design = 20 + /// credits gained per working mech sold + var/credits_per_mech = 100 + /// credits gained for each secondary goal completed + /// These get split in 3, one part for Cargo, one for the department, + /// and one part for the person who requested the goal. + var/credits_per_easy_reagent_goal = 150 + var/credits_per_normal_reagent_goal = 300 + var/credits_per_hard_reagent_goal = 450 + var/credits_per_variety_reagent_goal = 300 + var/credits_per_easy_food_goal = 300 + var/credits_per_normal_food_goal = 450 + var/credits_per_hard_food_goal = 600 + var/credits_per_ripley_goal = 600 + var/credits_per_kudzu_goal = 600 + /// credits lost for sending unsecured cargo + var/fine_for_loose_cargo = -100 + /// credits lost for sending a messy shuttle + var/fine_for_messy_shuttle = -100 + /// credits lost for sending unwanted items + var/fine_for_selling_trash = -100 /// points gained per virology goal var/credits_per_virology_goal = 200 @@ -150,8 +170,7 @@ SUBSYSTEM_DEF(economy) next_paycheck_delay = 30 MINUTES + world.time next_mail_delay = 15 MINUTES + world.time - for(var/obj/machinery/computer/pandemic/P in GLOB.pandemics) - P.print_goal_orders() + check_total_virology_goals_completion() /datum/controller/subsystem/economy/fire() if(next_paycheck_delay <= world.time) diff --git a/code/datums/components/label.dm b/code/datums/components/label.dm index 0a8c50cdf71f..eba55631c5a5 100644 --- a/code/datums/components/label.dm +++ b/code/datums/components/label.dm @@ -52,8 +52,8 @@ * user: The mob who is wielding the attacking object. */ /datum/component/label/proc/OnAttackby(datum/source, obj/item/attacker, mob/user) - // If the attacking object is not a hand labeler or its mode is 1 (has a label ready to apply), return. - // The hand labeler should be off (mode is 0), in order to remove a label. + // If the attacking object is not a hand labeler or it's not off (has a label ready to apply), return. + // The hand labeler should be off in order to remove a label. var/obj/item/hand_labeler/labeler = attacker if(!istype(labeler) || labeler.mode) return @@ -85,3 +85,28 @@ var/atom/owner = parent owner.name = replacetext(owner.name, "([label_name])", "") // Remove the label text from the parent's name, wherever it's located. owner.name = trim(owner.name) // Shave off any white space from the beginning or end of the parent's name. + +/// A verson of the label component specific to labelling goal items. +/datum/component/label/goal + +/datum/component/label/goal/Initialize(_label_name) + if(istype(parent, /obj/item)) + // Can only be attached to things that won't go in a crate. + return COMPONENT_INCOMPATIBLE + return ..() + +/// Adds detailed information to the examine text. +/datum/component/label/goal/Examine(datum/source, mob/user, list/examine_list) + examine_list += "It has a label on it, marking it as part of a secondary goal for [label_name]. Use a hand labeler to remove it." + +/// Applies a static label to the parent's name. +/// We do this instead of using label_name so it's easier to identify goal objects at a glance. +/datum/component/label/goal/apply_label() + var/atom/owner = parent + owner.name += " (Secondary Goal)" + +/// Removes the label from the parent's name +/datum/component/label/goal/remove_label() + var/atom/owner = parent + owner.name = replacetext(owner.name, "(Secondary Goal)", "") // Remove the label text from the parent's name, wherever it's located. + owner.name = trim(owner.name) // Shave off any white space from the beginning or end of the parent's name. diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 6aa34a1d3b3f..ae13b97766d6 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -40,6 +40,7 @@ var/list/blob_overminds = list() var/list/datum/station_goal/station_goals = list() // A list of all station goals for this game mode + var/list/datum/station_goal/secondary/secondary_goals = list() // A list of all secondary goals issued /// Each item in this list can only be rolled once on average. var/list/single_antag_positions = list("Head of Personnel", "Chief Engineer", "Research Director", "Chief Medical Officer", "Quartermaster") @@ -177,6 +178,8 @@ SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_on_pod_3, list("escapees", "on_pod_3")) if(escaped_on_pod_5) SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_on_pod_5, list("escapees", "on_pod_5")) + for(var/tech_id in SSeconomy.tech_levels) + SSblackbox.record_feedback("tally", "cargo max tech level sold", SSeconomy.tech_levels[tech_id], tech_id) GLOB.discord_manager.send2discord_simple(DISCORD_WEBHOOK_PRIMARY, "A round of [name] has ended - [surviving_total] survivors, [ghosts] ghosts.") if(SSredis.connected) @@ -466,12 +469,14 @@ /datum/game_mode/proc/generate_station_goals() var/list/possible = list() for(var/T in subtypesof(/datum/station_goal)) + if(ispath(T, /datum/station_goal/secondary)) + continue var/datum/station_goal/G = T if(config_tag in initial(G.gamemode_blacklist)) continue - possible += T + possible += G var/goal_weights = 0 - while(possible.len && goal_weights < STATION_GOAL_BUDGET) + while(length(possible) && goal_weights < STATION_GOAL_BUDGET) var/datum/station_goal/picked = pick_n_take(possible) goal_weights += initial(picked.weight) station_goals += new picked @@ -492,9 +497,24 @@ print_command_report(message_text, "NAS Trurl Orders", FALSE) /datum/game_mode/proc/declare_station_goal_completion() - for(var/V in station_goals) - var/datum/station_goal/G = V - G.print_result() + for(var/datum/station_goal/goal in station_goals) + goal.print_result() + + var/departments = list() + for(var/datum/station_goal/secondary/goal in secondary_goals) + if(goal.completed) + if(!departments[goal.department]) + departments[goal.department] = 0 + departments[goal.department]++ + + to_chat(world, "Secondary Goals:") + var/any = FALSE + for(var/department in departments) + if(departments[department]) + any = TRUE + to_chat(world, "[department]: [departments[department]] completed!") + if(!any) + to_chat(world, "None completed!") /datum/game_mode/proc/generate_station_trait_report() var/something_to_print = FALSE diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 8f8ebaa110e6..560c136d45e3 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -246,7 +246,7 @@ if(ACCESS_CAPTAIN) return "Captain" if(ACCESS_ALL_PERSONAL_LOCKERS) - return "Personal Lockers" + return "Personal Lockers/Crates" if(ACCESS_CHAPEL_OFFICE) return "Chapel Office" if(ACCESS_TECH_STORAGE) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 63f3814b358f..ba6682cb042d 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -8,17 +8,18 @@ #define RC_INFO (1<<2) //Relay Info //Request Console Screens -#define RCS_MAINMENU 0 // Main menu -#define RCS_RQSUPPLY 1 // Request supplies -#define RCS_RQASSIST 2 // Request assistance -#define RCS_SENDINFO 3 // Relay information -#define RCS_SENTPASS 4 // Message sent successfully -#define RCS_SENTFAIL 5 // Message sent unsuccessfully -#define RCS_VIEWMSGS 6 // View messages -#define RCS_MESSAUTH 7 // Authentication before sending -#define RCS_ANNOUNCE 8 // Send announcement -#define RCS_SHIPPING 9 // Print Shipping Labels/Packages -#define RCS_SHIP_LOG 10 // View Shipping Label Log +#define RCS_MAINMENU 0 // Main menu +#define RCS_RQSUPPLY 1 // Request supplies +#define RCS_RQASSIST 2 // Request assistance +#define RCS_SENDINFO 3 // Relay information +#define RCS_SENTPASS 4 // Message sent successfully +#define RCS_SENTFAIL 5 // Message sent unsuccessfully +#define RCS_VIEWMSGS 6 // View messages +#define RCS_MESSAUTH 7 // Authentication before sending +#define RCS_ANNOUNCE 8 // Send announcement +#define RCS_SHIPPING 9 // Print Shipping Labels/Packages +#define RCS_SHIP_LOG 10 // View Shipping Label Log +#define RCS_SECONDARY 11 // Request secodary goal //Radio list. For a console to announce messages on a specific radio, it's "department" variable must be in the list below. #define ENGI_ROLES list("Atmospherics", "Engineering", "Chief Engineer's Desk") @@ -51,21 +52,28 @@ GLOBAL_LIST_EMPTY(allRequestConsoles) var/announcementConsole = FALSE // FALSE = This console cannot be used to send department announcements // TRUE = This console can send department announcementsf - var/announceAuth = 0 //Will be set to 1 when you authenticate yourself for announcements - var/msgVerified = "" //Will contain the name of the person who varified it - var/msgStamped = "" //If a message is stamped, this will contain the stamp name + /// Will be set to TRUE when you authenticate yourself for announcements + var/announceAuth = FALSE + /// Will be set to TRUE when you authenticate yourself for requesting a secondary goal + var/secondaryGoalAuth = FALSE + /// Will contain the name of the person who verified it + var/msgVerified = "Not verified" + /// If a message is stamped, this will contain the stamp name + var/msgStamped = "Not stamped" var/message = "" var/recipient = ""; //the department which will be receiving the message var/priority = -1 ; //Priority of the message being sent light_range = 0 var/datum/announcer/announcer = new(config_type = /datum/announcement_configuration/requests_console) + /// The ID card of the person requesting a secondary goal. + var/goalRequester var/list/shipping_log = list() var/ship_tag_name = "" var/ship_tag_index = 0 var/print_cooldown = 0 //cooldown on shipping label printer, stores the in-game time of when the printer will next be ready var/obj/item/radio/Radio - var/radiochannel = "" var/reminder_timer_id = TIMER_ID_NULL + var/has_active_secondary_goal = FALSE /obj/machinery/requests_console/power_change() if(!..()) @@ -168,6 +176,8 @@ GLOBAL_LIST_EMPTY(allRequestConsoles) data["msgStamped"] = msgStamped data["msgVerified"] = msgVerified data["announceAuth"] = announceAuth + data["secondaryGoalAuth"] = secondaryGoalAuth + data["secondaryGoalEnabled"] = !has_active_secondary_goal data["shipDest"] = ship_tag_name data["shipping_log"] = shipping_log @@ -213,58 +223,34 @@ GLOBAL_LIST_EMPTY(allRequestConsoles) announcer.Announce(message) reset_message(TRUE) - if("department") - if(!message) + if("requestSecondaryGoal") + has_active_secondary_goal = check_for_active_secondary_goal(goalRequester) + if(has_active_secondary_goal || !secondaryGoalAuth) return - var/log_msg = message - var/pass = FALSE - screen = RCS_SENTFAIL - for(var/M in GLOB.message_servers) - var/obj/machinery/message_server/MS = M - if(!MS.active) - continue - MS.send_rc_message(ckey(params["department"]), department, log_msg, msgStamped, msgVerified, priority) - pass = TRUE - if(pass) + generate_secondary_goal(department, goalRequester, usr) + reset_message(FALSE) + view_messages() + screen = RCS_VIEWMSGS + + if("department") + if(send_requests_console_message(message, department, recipient, msgStamped, msgVerified, priority, Radio)) screen = RCS_SENTPASS - if(recipient in ENGI_ROLES) - radiochannel = "Engineering" - else if(recipient in SEC_ROLES) - radiochannel = "Security" - else if(recipient in MISC_ROLES) - radiochannel = "Service" - else if(recipient in MED_ROLES) - radiochannel = "Medical" - else if(recipient in COM_ROLES) - radiochannel = "Command" - else if(recipient in SCI_ROLES) - radiochannel = "Science" - else if(recipient == "AI") - radiochannel = "AI Private" - else if(recipient in SUPPLY_ROLES) - radiochannel = "Supply" - message_log.Add(list(list("Message sent to [recipient] at [station_time_timestamp()]", "[message]"))) - Radio.autosay("Alert; a new message has been received from [department]", "[recipient] Requests Console", "[radiochannel]") else + screen = RCS_SENTFAIL atom_say("No server detected!") //Handle screen switching if("setScreen") // Ensures screen cant be set higher or lower than it should be - var/tempScreen = round(clamp(text2num(params["setScreen"]), 0, 10), 1) + var/tempScreen = round(clamp(text2num(params["setScreen"]), 0, 11), 1) if(tempScreen == RCS_ANNOUNCE && !announcementConsole) return if(tempScreen == RCS_VIEWMSGS) - for(var/obj/machinery/requests_console/Console in GLOB.allRequestConsoles) - if(Console.department == department) - Console.newmessagepriority = RQ_NONEW_MESSAGES - Console.update_icon(UPDATE_OVERLAYS) - Console.set_light(1) - if(reminder_timer_id != TIMER_ID_NULL) - deltimer(reminder_timer_id) - reminder_timer_id = TIMER_ID_NULL + view_messages() if(tempScreen == RCS_MAINMENU) reset_message() + if(tempScreen == RCS_SECONDARY) + has_active_secondary_goal = check_for_active_secondary_goal(goalRequester) screen = tempScreen if("shipSelect") @@ -303,12 +289,18 @@ GLOBAL_LIST_EMPTY(allRequestConsoles) if(screen == RCS_ANNOUNCE) var/obj/item/card/id/ID = I if(ACCESS_RC_ANNOUNCE in ID.GetAccess()) - announceAuth = 1 + announceAuth = TRUE announcer.author = ID.assignment ? "[ID.assignment] [ID.registered_name]" : ID.registered_name else reset_message() to_chat(user, "You are not authorized to send announcements.") SStgui.update_uis(src) + if(screen == RCS_SECONDARY) + var/obj/item/card/id/ID = I + if(ID) + secondaryGoalAuth = TRUE + goalRequester = ID + has_active_secondary_goal = check_for_active_secondary_goal(goalRequester) if(screen == RCS_SHIPPING) var/obj/item/card/id/T = I msgVerified = "Sender verified as [T.registered_name] ([T.assignment])" @@ -327,16 +319,18 @@ GLOBAL_LIST_EMPTY(allRequestConsoles) message = "" recipient = "" priority = RQ_NONEW_MESSAGES - msgVerified = "" - msgStamped = "" + msgVerified = "Not verified" + msgStamped = "Not stamped" announceAuth = FALSE + secondaryGoalAuth = FALSE announcer.author = "" + goalRequester = "" ship_tag_name = "" ship_tag_index = FALSE if(mainmenu) screen = RCS_MAINMENU -/obj/machinery/requests_console/proc/createMessage(source, title, message, priority, forced = FALSE) +/obj/machinery/requests_console/proc/createMessage(source, title, message, priority, forced = FALSE, verified = "", stamped = "") var/linkedSender if(inoperable() && !forced) message_log.Add(list(list("Message lost due to console failure. Please contact [station_name()]'s system administrator or AI for technical assistance."))) @@ -357,9 +351,9 @@ GLOBAL_LIST_EMPTY(allRequestConsoles) switch(priority) if(RQ_HIGHPRIORITY) // High - message_log.Add(list(list("High Priority - From: [linkedSender]", message))) // List in a list for passing into TGUI + message_log.Add(list(list("High Priority - From: [linkedSender]") + message + list(verified, stamped))) // List in a list for passing into TGUI else // Normal - message_log.Add(list(list("From: [linkedSender]", message))) // List in a list for passing into TGUI + message_log.Add(list(list("From: [linkedSender]") + message + list(verified, stamped))) // List in a list for passing into TGUI set_light(2) /obj/machinery/requests_console/proc/remind_unread_messages() @@ -379,6 +373,62 @@ GLOBAL_LIST_EMPTY(allRequestConsoles) sp.update_desc() print_cooldown = world.time + 600 //1 minute cooldown before you can print another label, but you can still configure the next one during this time +/obj/machinery/requests_console/proc/view_messages() + for(var/obj/machinery/requests_console/Console in GLOB.allRequestConsoles) + if(Console.department == department) + Console.newmessagepriority = RQ_NONEW_MESSAGES + Console.update_icon(UPDATE_OVERLAYS) + Console.set_light(1) + if(reminder_timer_id != TIMER_ID_NULL) + deltimer(reminder_timer_id) + reminder_timer_id = TIMER_ID_NULL + +/obj/machinery/requests_console/proc/check_for_active_secondary_goal(obj/item/card/id/id) + if(!istype(id)) + return FALSE + for(var/datum/station_goal/secondary/goal in SSticker.mode.secondary_goals) + if(goal.requester_name == id.registered_name && !goal.completed) + return TRUE + return FALSE + +/proc/send_requests_console_message(message, sender, recipient, stamped, verified, priority, obj/item/radio/radio) + if(!message) + return + var/found_message_server = FALSE + for(var/M in GLOB.message_servers) + var/obj/machinery/message_server/MS = M + if(!MS.active) + continue + MS.send_rc_message(ckey(recipient), sender, message, stamped, verified, priority) + found_message_server = TRUE + + if(!found_message_server) + return FALSE + + if(!radio) + return TRUE + + var/radiochannel = "" + if(recipient in ENGI_ROLES) + radiochannel = "Engineering" + else if(recipient in SEC_ROLES) + radiochannel = "Security" + else if(recipient in MISC_ROLES) + radiochannel = "Service" + else if(recipient in MED_ROLES) + radiochannel = "Medical" + else if(recipient in COM_ROLES) + radiochannel = "Command" + else if(recipient in SCI_ROLES) + radiochannel = "Science" + else if(recipient == "AI") + radiochannel = "AI Private" + else if(recipient in SUPPLY_ROLES) + radiochannel = "Supply" + radio.autosay("Alert; a new message has been received from [sender]", "[recipient] Requests Console", "[radiochannel]") + + return TRUE + #undef RC_ASSIST #undef RC_SUPPLY #undef RC_INFO @@ -393,6 +443,7 @@ GLOBAL_LIST_EMPTY(allRequestConsoles) #undef RCS_ANNOUNCE #undef RCS_SHIPPING #undef RCS_SHIP_LOG +#undef RCS_SECONDARY #undef ENGI_ROLES #undef SEC_ROLES #undef MISC_ROLES diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index d2d3050e71f9..361d4d9fbd66 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -281,6 +281,58 @@ req_access += pick(get_all_accesses()) ..() +/obj/structure/closet/crate/secure/personal + name = "personal crate" + desc = "The crate version of Nanotrasen's famous personal locker, ideal for shipping booze, food, or drugs to CC without letting Cargo consume it. This one has not been configured by CC, and the first card swiped gains control." + req_access = list(ACCESS_ALL_PERSONAL_LOCKERS) + /// The name of the person this crate is registered to. + var/registered_name = null + // Unlike most secure crates, personal crates are easily obtained. + crate_value = DEFAULT_CRATE_VALUE + +/obj/structure/closet/crate/secure/personal/allowed(mob/user) + if(..()) + return TRUE + var/obj/item/card/id/id = user.get_id_card() + if(is_usable_id(id)) + return id.registered_name == registered_name + return FALSE + +/// Returns whether the object is a usable ID card (not guest pass, has name). +/obj/structure/closet/crate/secure/personal/proc/is_usable_id(obj/item/card/id/id) + if(!istype(id)) + return FALSE + if(istype(id, /obj/item/card/id/guest) || !id.registered_name) + return FALSE + return TRUE + +/obj/structure/closet/crate/secure/personal/attackby(obj/item/I, mob/user, params) + if(opened || !istype(I, /obj/item/card/id)) + return ..() + + if(broken) + to_chat(user, "It appears to be broken.") + return FALSE + + var/obj/item/card/id/id = I + if(!is_usable_id(id)) + to_chat(user, "Invalid identification card.") + return FALSE + + if(registered_name && allowed(user)) + return ..() + + if(!registered_name) + registered_name = id.registered_name + desc = "Owned by [id.registered_name]." + to_chat(user, "Crate reserved") + return TRUE + + if(registered_name == id.registered_name) + return ..() + + return FALSE + /obj/structure/closet/crate/plastic name = "plastic crate" desc = "A rectangular plastic crate." diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 1f9256283d6d..d70c4ab8ae12 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -3317,7 +3317,7 @@ else if(href_list["add_station_goal"]) if(!check_rights(R_EVENT)) return - var/list/type_choices = typesof(/datum/station_goal) + var/list/type_choices = typesof(/datum/station_goal) - typesof(/datum/station_goal/secondary) var/picked = input("Choose goal type") in type_choices|null if(!picked) return @@ -3335,6 +3335,46 @@ SSticker.mode.station_goals += G modify_goals() + else if(href_list["add_secondary_goal"]) + if(!check_rights(R_EVENT)) + return + var/list/type_choices = typesof(/datum/station_goal/secondary) + for(var/T in type_choices) + if(T == /datum/station_goal/secondary) + continue + var/datum/station_goal/secondary/SG = T + if(initial(SG.abstract)) + type_choices -= SG + var/picked = pick_closest_path(FALSE, make_types_fancy(type_choices), skip_filter = TRUE) + if(!picked) + return + var/datum/station_goal/secondary/G = new picked() + if(picked == /datum/station_goal/secondary) + var/newname = clean_input("Enter goal name:") + if(!newname) + return + G.name = newname + var/description = input("Enter A.L.I.C.E message contents:") as message|null + if(!description) + return + G.report_message = description + var/admin_description = input("Enter description for admins:") as message|null + if(!admin_description) + return + G.admin_desc = admin_description + var/department_choices = list() + for(var/obj/machinery/requests_console/RC in GLOB.allRequestConsoles) + department_choices |= RC.department + var/department = input("Choose goal department") in department_choices|null + if(!department) + return + G.department = department + G.should_send_crate = alert("Send a personal crate?","Send crate","Yes","No") == "Yes" + G.Initialize() + message_admins("[key_name_admin(usr)] created \"[G.name]\" station goal. Description: [G.admin_desc]") + SSticker.mode.secondary_goals += G + modify_goals() + else if(href_list["showdetails"]) if(!check_rights(R_ADMIN)) return diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 335b6bd6ea2c..e14ecac59107 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1147,11 +1147,18 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(usr, "This verb can only be used if the round has started.") return - var/dat = "" + var/list/dat = list() for(var/datum/station_goal/S in SSticker.mode.station_goals) - dat += "[S.name] - Announce | Remove
" - dat += "
Add New Goal" - usr << browse(dat, "window=goals;size=400x400") + dat += "[S.name][S.completed ? " (C)" : ""] - Announce | Remove" + dat += "" + dat += "Add New Goal" + dat += "" + dat += "Secondary goals" + for(var/datum/station_goal/secondary/SG in SSticker.mode.secondary_goals) + dat += "[SG.admin_desc][SG.completed ? " (C)" : ""] for [SG.requester_name || SG.department] - Announce | Remove | Mark complete | Reset progress" + dat += "Add New Secondary Goal" + + usr << browse(dat.Join("
"), "window=goals;size=400x400") /// Allow admin to add or remove traits of datum /datum/admins/proc/modify_traits(datum/D) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 0a1ff431e21b..61f9b450ed53 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -17,11 +17,11 @@ // Make the event start fun - give the vine a random hostile mutation if(SC.vines.len) SV = SC.vines[1] - var/list/mutations = SC.mutations_list.Copy() - while(mutations.len) + var/list/mutations = subtypesof(/datum/spacevine_mutation) + while(mutations) var/datum/spacevine_mutation/SM = pick_n_take(mutations) - if(SM.quality == SPACEVINE_MUTATION_NEGATIVE && !SM.nofun) - SM.add_mutation_to_vinepiece(SV) + if(initial(SM.quality) == SPACEVINE_MUTATION_NEGATIVE && !initial(SM.nofun)) + SV.add_mutation(SM) break mutations.Cut() mutations = null @@ -35,19 +35,6 @@ // For stuff that isn't fun as a random-event vine var/nofun = FALSE -/datum/spacevine_mutation/proc/add_mutation_to_vinepiece(obj/structure/spacevine/holder) - holder.mutations |= src - holder.color = hue - -/datum/spacevine_mutation/proc/remove_mutation_from_vinepiece(obj/structure/spacevine/holder) - holder.mutations -= src - var/datum/spacevine_mutation/oldmutation - if(holder.mutations.len) - oldmutation = pick(holder.mutations) - holder.color = oldmutation.hue - else - holder.color = "" - /datum/spacevine_mutation/proc/process_mutation(obj/structure/spacevine/holder) return @@ -91,11 +78,6 @@ return -/datum/spacevine_mutation/space_covering - name = "space protective" - hue = "#aa77aa" - quality = SPACEVINE_MUTATION_POSITIVE - /turf/simulated/floor/vines color = "#aa77aa" icon_state = "vinefloor" @@ -139,6 +121,9 @@ SV.wither() /datum/spacevine_mutation/space_covering + name = "space protective" + hue = "#aa77aa" + quality = SPACEVINE_MUTATION_POSITIVE var/static/list/coverable_turfs /datum/spacevine_mutation/space_covering/New() @@ -181,7 +166,7 @@ // Lose bluespace upon piercing a single tile, and drop it from our own mutations too // Representing a loss in "high potential" // also conveniently prevents this from spreading too crazily - remove_mutation_from_vinepiece(holder) + holder.remove_mutation(src.type) holder.master.spawn_spacevine_piece(target, holder) playsound(holder, 'sound/misc/interference.ogg', 50, 1) . = TRUE @@ -421,9 +406,9 @@ /obj/structure/spacevine/examine(mob/user) . = ..() var/text = "This one is a" - if(mutations.len) + if(length(mutations)) for(var/A in mutations) - var/datum/spacevine_mutation/SM = A + var/datum/spacevine_mutation/SM = mutations[A] text += " [SM.name]" else text += " normal" @@ -431,20 +416,23 @@ . += text /obj/structure/spacevine/proc/wither() - for(var/datum/spacevine_mutation/SM in mutations) + for(var/SM_type in mutations) + var/datum/spacevine_mutation/SM = mutations[SM_type] SM.on_death(src) qdel(src) /obj/structure/spacevine/Destroy() - for(var/datum/spacevine_mutation/SM in mutations) + for(var/SM_type in mutations) + var/datum/spacevine_mutation/SM = mutations[SM_type] SM.on_deletion(src) if(master) master.vines -= src master.growth_queue -= src if(!master.vines.len) var/obj/item/seeds/kudzu/KZ = new(loc) - KZ.mutations |= mutations + for(var/mutation in mutations) + KZ.mutations += mutation KZ.set_potency(10 ** sqrt(master.mutativeness)) KZ.set_production(10 - (master.spread_cap / 10)) qdel(master) @@ -456,12 +444,21 @@ return ..() /obj/structure/spacevine/proc/add_mutation(datum/spacevine_mutation/mutation) - mutations |= mutation - color = mutation.hue + if(!mutations[mutation]) + mutations[mutation] = new mutation + color = mutation.hue + +/obj/structure/spacevine/proc/remove_mutation(datum/spacevine_mutation/mutation) + mutations -= mutation + if(length(mutations)) + var/oldmutation_type = pick(mutations) + var/datum/spacevine_mutation/oldmutation = mutations[oldmutation_type] + color = oldmutation.hue /obj/structure/spacevine/proc/on_chem_effect(datum/reagent/R) var/override = 0 - for(var/datum/spacevine_mutation/SM in mutations) + for(var/SM_type in mutations) + var/datum/spacevine_mutation/SM = mutations[SM_type] override += SM.on_chem(src, R) if(!override && istype(R, /datum/reagent/glyphosate)) if(prob(50)) @@ -469,7 +466,8 @@ /obj/structure/spacevine/proc/eat(mob/eater) var/override = 0 - for(var/datum/spacevine_mutation/SM in mutations) + for(var/SM_type in mutations) + var/datum/spacevine_mutation/SM = mutations[SM_type] override += SM.on_eat(src, eater) if(!override) if(prob(10)) @@ -493,7 +491,8 @@ if(I.damtype == BURN) damage_dealt *= 4 - for(var/datum/spacevine_mutation/SM in mutations) + for(var/SM_type in mutations) + var/datum/spacevine_mutation/SM = mutations[SM_type] damage_dealt = SM.on_hit(src, user, I, damage_dealt) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further take_damage(damage_dealt, I.damtype, MELEE, 1) @@ -512,11 +511,13 @@ /obj/structure/spacevine/Crossed(mob/crosser, oldloc) if(isliving(crosser)) - for(var/datum/spacevine_mutation/SM in mutations) + for(var/SM_type in mutations) + var/datum/spacevine_mutation/SM = mutations[SM_type] SM.on_cross(src, crosser) /obj/structure/spacevine/attack_hand(mob/user) - for(var/datum/spacevine_mutation/SM in mutations) + for(var/SM_type in mutations) + var/datum/spacevine_mutation/SM = mutations[SM_type] SM.on_hit(src, user) user_unbuckle_mob(user, user) @@ -529,14 +530,12 @@ var/list/growth_queue = list() var/spread_multiplier = 5 var/spread_cap = 30 - var/list/mutations_list = list() var/mutativeness = 1 /obj/structure/spacevine_controller/New(loc, list/muts, potency, production) color = "#ffffff" spawn_spacevine_piece(loc, null, muts) START_PROCESSING(SSobj, src) - init_subtypes(/datum/spacevine_mutation/, mutations_list) if(potency != null && potency > 0) // 1 mutativeness at 10 potency // 4 mutativeness at 100 potency @@ -571,20 +570,21 @@ growth_queue += SV vines += SV SV.master = src - if(muts && muts.len) - for(var/datum/spacevine_mutation/M in muts) - M.add_mutation_to_vinepiece(SV) + if(length(muts)) + for(var/M in muts) + SV.add_mutation(M) return if(parent) SV.mutations |= parent.mutations SV.color = parent.color if(prob(mutativeness)) - var/list/random_mutations_picked = mutations_list - SV.mutations - if(random_mutations_picked.len) - var/datum/spacevine_mutation/randmut = pick(random_mutations_picked) - randmut.add_mutation_to_vinepiece(SV) + var/list/random_mutation_candidates = subtypesof(/datum/spacevine_mutation) - SV.mutations + if(length(random_mutation_candidates)) + var/datum/spacevine_mutation/randmut = pick(random_mutation_candidates) + SV.add_mutation(randmut) - for(var/datum/spacevine_mutation/SM in SV.mutations) + for(var/SM_type in SV.mutations) + var/datum/spacevine_mutation/SM = SV.mutations[SM_type] SM.on_birth(SV) /obj/structure/spacevine_controller/process() @@ -607,7 +607,8 @@ i++ queue_end += SV growth_queue -= SV - for(var/datum/spacevine_mutation/SM in SV.mutations) + for(var/SM_type in SV.mutations) + var/datum/spacevine_mutation/SM = SV.mutations[SM_type] SM.process_mutation(SV) if(SV.energy < 2) //If tile isn't fully grown if(prob(20)) @@ -631,7 +632,8 @@ icon_state = pick("Hvy1", "Hvy2", "Hvy3") energy = 2 - for(var/datum/spacevine_mutation/SM in mutations) + for(var/SM_type in mutations) + var/datum/spacevine_mutation/SM = mutations[SM_type] SM.on_grow(src) /obj/structure/spacevine/proc/entangle_mob() @@ -645,7 +647,8 @@ /obj/structure/spacevine/proc/entangle(mob/living/V) if(!V || isvineimmune(V)) return - for(var/datum/spacevine_mutation/SM in mutations) + for(var/SM_type in mutations) + var/datum/spacevine_mutation/SM = mutations[SM_type] SM.on_buckle(src, V) if((V.stat != DEAD) && (V.buckled != src)) //not dead or captured to_chat(V, "The vines [pick("wind", "tangle", "tighten")] around you!") @@ -654,14 +657,16 @@ /obj/structure/spacevine/proc/spread() var/list/dir_list = GLOB.cardinal.Copy() var/spread_search = FALSE // Whether to exhaustive search all 4 cardinal dirs for an open direction - for(var/datum/spacevine_mutation/SM in mutations) + for(var/SM_type in mutations) + var/datum/spacevine_mutation/SM = mutations[SM_type] spread_search |= SM.on_search(src) while(dir_list.len) var/direction = pick(dir_list) dir_list -= direction var/turf/stepturf = get_step(src,direction) var/spread_success = FALSE - for(var/datum/spacevine_mutation/SM in mutations) + for(var/SM_type in mutations) + var/datum/spacevine_mutation/SM = mutations[SM_type] spread_success |= SM.on_spread(src, stepturf) // If this returns 1, spreading succeeded if(!locate(/obj/structure/spacevine, stepturf)) // snowflake for space turf, but space turf is super common and a big deal @@ -674,7 +679,8 @@ /obj/structure/spacevine/ex_act(severity) var/i - for(var/datum/spacevine_mutation/SM in mutations) + for(var/SM_type in mutations) + var/datum/spacevine_mutation/SM = mutations[SM_type] i += SM.on_explosion(severity, src) if(!i && prob(100/severity)) wither() @@ -682,7 +688,8 @@ /obj/structure/spacevine/temperature_expose(null, temp, volume) ..() var/override = 0 - for(var/datum/spacevine_mutation/SM in mutations) + for(var/SM_type in mutations) + var/datum/spacevine_mutation/SM = mutations[SM_type] override += SM.process_temperature(src, temp, volume) if(!override) wither() diff --git a/code/modules/food_and_drinks/food/foods/baked_goods.dm b/code/modules/food_and_drinks/food/foods/baked_goods.dm index a4ab2d626ba3..903e25d32db8 100644 --- a/code/modules/food_and_drinks/food/foods/baked_goods.dm +++ b/code/modules/food_and_drinks/food/foods/baked_goods.dm @@ -25,6 +25,7 @@ trash = /obj/item/trash/plate filling_color = "#FFD675" tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/braincake @@ -47,6 +48,7 @@ trash = /obj/item/trash/plate filling_color = "#E6AEDB" tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/sliceable/cheesecake name = "cheese cake" @@ -68,6 +70,7 @@ trash = /obj/item/trash/plate filling_color = "#FAF7AF" tastes = list("cake" = 4, "cream cheese" = 3) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/plaincake name = "vanilla cake" @@ -89,6 +92,7 @@ trash = /obj/item/trash/plate filling_color = "#F7EDD5" tastes = list("cake" = 5, "vanilla" = 1, "sweetness" = 2) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/orangecake name = "orange cake" @@ -110,6 +114,7 @@ trash = /obj/item/trash/plate filling_color = "#FADA8E" tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/bananacake name = "banana cake" @@ -131,6 +136,7 @@ trash = /obj/item/trash/plate filling_color = "#FADA8E" tastes = list("cake" = 5, "sweetness" = 2, "banana" = 2) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/limecake name = "lime cake" @@ -152,6 +158,7 @@ trash = /obj/item/trash/plate filling_color = "#CBFA8E" tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/lemoncake name = "lemon cake" @@ -173,6 +180,7 @@ trash = /obj/item/trash/plate filling_color = "#FAFA8E" tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/chocolatecake name = "chocolate cake" @@ -194,6 +202,7 @@ trash = /obj/item/trash/plate filling_color = "#805930" tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/birthdaycake name = "birthday cake" @@ -215,6 +224,7 @@ trash = /obj/item/trash/plate filling_color = "#FFD6D6" tastes = list("cake" = 5, "sweetness" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/sliceable/applecake name = "apple cake" @@ -236,6 +246,7 @@ trash = /obj/item/trash/plate filling_color = "#EBF5B8" tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1) + goal_difficulty = FOOD_GOAL_EASY ////////////////////// @@ -251,6 +262,7 @@ filling_color = "#DBC94F" list_reagents = list("nutriment" = 1, "sugar" = 3, "hot_coco" = 5 ) tastes = list("cookie" = 1, "crunchy chocolate" = 1) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/fortunecookie name = "fortune cookie" @@ -261,6 +273,7 @@ list_reagents = list("nutriment" = 3) trash = /obj/item/paper/fortune tastes = list("cookie" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/sugarcookie name = "sugar cookie" @@ -269,6 +282,7 @@ icon_state = "sugarcookie" list_reagents = list("nutriment" = 1, "sugar" = 3) tastes = list("sweetness" = 1) + goal_difficulty = FOOD_GOAL_EASY ////////////////////// @@ -285,6 +299,7 @@ bitesize = 3 list_reagents = list("nutriment" = 6, "banana" = 5, "vitamin" = 2) tastes = list("pie" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/pie/throw_impact(atom/hit_atom) ..() @@ -302,6 +317,7 @@ bitesize = 3 list_reagents = list("nutriment" = 10, "vitamin" = 2) tastes = list("pie" = 1, "meat" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/tofupie name = "tofu-pie" @@ -313,6 +329,7 @@ bitesize = 3 list_reagents = list("nutriment" = 10, "vitamin" = 2) tastes = list("pie" = 1, "tofu" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/amanita_pie name = "amanita pie" @@ -323,6 +340,7 @@ bitesize = 4 list_reagents = list("nutriment" = 6, "amanitin" = 3, "psilocybin" = 1, "vitamin" = 4) tastes = list("pie" = 1, "mushroom" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/plump_pie name = "plump pie" @@ -333,6 +351,7 @@ bitesize = 3 list_reagents = list("nutriment" = 10, "vitamin" = 2) tastes = list("pie" = 1, "mushroom" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/plump_pie/Initialize(mapload) . = ..() @@ -361,6 +380,7 @@ bitesize = 3 list_reagents = list("nutriment" = 10, "vitamin" = 2) tastes = list("pie" = 1, "apple" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/cherrypie @@ -372,6 +392,7 @@ bitesize = 3 list_reagents = list("nutriment" = 10, "vitamin" = 2) tastes = list("pie" = 1, "cherries" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/sliceable/pumpkinpie name = "pumpkin pie" @@ -384,6 +405,7 @@ filling_color = "#F5B951" list_reagents = list("nutriment" = 20, "vitamin" = 5) tastes = list("pie" = 1, "pumpkin" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/pumpkinpieslice name = "pumpkin pie slice" @@ -393,6 +415,7 @@ trash = /obj/item/trash/plate filling_color = "#F5B951" tastes = list("pie" = 1, "pumpkin" = 1) + goal_difficulty = FOOD_GOAL_NORMAL ////////////////////// // Donuts // @@ -433,6 +456,7 @@ desc = "Like life, it never quite tastes the same." bitesize = 10 tastes = list("donut" = 3, "chaos" = 1) + goal_difficulty = FOOD_GOAL_HARD /obj/item/food/snacks/donut/chaos/Initialize(mapload) . = ..() @@ -450,6 +474,7 @@ icon_state = "jdonut1" extra_reagent = "berryjuice" tastes = list("jelly" = 1, "donut" = 3) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/donut/jelly/Initialize(mapload) . = ..() @@ -467,6 +492,7 @@ desc = "You jelly?" icon_state = "jdonut1" extra_reagent = "slimejelly" + goal_difficulty = FOOD_GOAL_HARD /obj/item/food/snacks/donut/jelly/cherryjelly name = "jelly donut" @@ -487,6 +513,7 @@ bitesize = 2 list_reagents = list("nutriment" = 3, "sugar" = 3) tastes = list("sweet cake" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/pancake/attack_tk(mob/user) if(src in user.tkgrabbed_objects) @@ -509,6 +536,7 @@ icon_state = "berry_pancake" list_reagents = list("nutriment" = 3, "sugar" = 3, "berryjuice" = 3) tastes = list("sweet cake" = 2, "berries" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/pancake/choc_chip_pancake name = "choc-chip pancake" @@ -516,6 +544,7 @@ icon_state = "choc_chip_pancake" list_reagents = list("nutriment" = 3, "sugar" = 3, "cocoa" = 3) tastes = list("sweet cake" = 2, "chocolate" = 3) + goal_difficulty = FOOD_GOAL_NORMAL ////////////////////// // Misc // @@ -529,6 +558,7 @@ filling_color = "#E0CF9B" list_reagents = list("nutriment" = 6) tastes = list("muffin" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/berryclafoutis name = "berry clafoutis" @@ -539,6 +569,7 @@ bitesize = 3 list_reagents = list("nutriment" = 10, "berryjuice" = 5, "vitamin" = 2) tastes = list("pie" = 1, "blackberries" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/poppypretzel @@ -549,6 +580,7 @@ filling_color = "#916E36" list_reagents = list("nutriment" = 5) tastes = list("pretzel" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/plumphelmetbiscuit name = "plump helmet biscuit" @@ -558,6 +590,7 @@ filling_color = "#CFB4C4" list_reagents = list("nutriment" = 5) tastes = list("mushroom" = 1, "biscuit" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/plumphelmetbiscuit/Initialize(mapload) . = ..() @@ -576,6 +609,7 @@ bitesize = 3 list_reagents = list("nutriment" = 8, "gold" = 5, "vitamin" = 4) tastes = list("pie" = 1, "apple" = 1, "expensive metal" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/cracker @@ -587,6 +621,7 @@ filling_color = "#F5DEB8" list_reagents = list("nutriment" = 1) tastes = list("cracker" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/croissant name = "croissant" @@ -597,6 +632,7 @@ filling_color = "#ecb54f" list_reagents = list("nutriment" = 4, "sugar" = 2) tastes = list("croissant" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/croissant/throwing throwforce = 20 diff --git a/code/modules/food_and_drinks/food/foods/bread.dm b/code/modules/food_and_drinks/food/foods/bread.dm index c2cfd50226b8..e81ee938ff9c 100644 --- a/code/modules/food_and_drinks/food/foods/bread.dm +++ b/code/modules/food_and_drinks/food/foods/bread.dm @@ -20,6 +20,7 @@ icon = 'icons/obj/food/burgerbread.dmi' icon_state = "meatbreadslice" filling_color = "#FF7575" + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/xenomeatbread name = "xenomeatbread loaf" @@ -75,6 +76,7 @@ icon_state = "bananabreadslice" filling_color = "#EDE5AD" tastes = list("bread" = 10, "banana" = 5) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/tofubread name = "tofubread" @@ -93,6 +95,7 @@ icon = 'icons/obj/food/burgerbread.dmi' icon_state = "tofubreadslice" filling_color = "#F7FFE0" + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/bread name = "bread" @@ -113,6 +116,7 @@ filling_color = "#D27332" list_reagents = list("nutriment" = 2, "bread" = 5) tastes = list("bread" = 1) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/creamcheesebread name = "cream cheese bread" @@ -133,6 +137,7 @@ filling_color = "#FFF896" list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("bread" = 10, "cheese" = 10) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/banarnarbread name = "banarnarbread loaf" @@ -153,6 +158,7 @@ filling_color = "#6F0000" list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("heresy" = 10, "banana" = 10) + goal_difficulty = FOOD_GOAL_EASY ////////////////////// @@ -166,6 +172,7 @@ icon_state = "bun" list_reagents = list("nutriment" = 1) tastes = list("bun" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/flatbread @@ -175,6 +182,7 @@ icon_state = "flatbread" list_reagents = list("nutriment" = 6, "vitamin" = 1) tastes = list("bread" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/baguette name = "baguette" @@ -187,6 +195,7 @@ bitesize = 3 list_reagents = list("nutriment" = 6, "vitamin" = 1) tastes = list("bread" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/baguette/combat sharp = TRUE @@ -205,6 +214,7 @@ bitesize = 3 list_reagents = list("nutriment" = 2, "vitamin" = 2) tastes = list("bread" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/toast name = "toast" @@ -227,9 +237,11 @@ /obj/item/food/snacks/jelliedtoast/cherry list_reagents = list("nutriment" = 1, "cherryjelly" = 5, "vitamin" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/jelliedtoast/slime list_reagents = list("nutriment" = 1, "slimejelly" = 5, "vitamin" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/rofflewaffles name = "roffle waffles" @@ -241,6 +253,7 @@ bitesize = 4 list_reagents = list("nutriment" = 8, "psilocybin" = 2, "vitamin" = 2) tastes = list("waffle" = 1, "mushrooms" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/waffles name = "waffles" @@ -250,3 +263,4 @@ trash = /obj/item/trash/waffles filling_color = "#E6DEB5" list_reagents = list("nutriment" = 8, "vitamin" = 1) + goal_difficulty = FOOD_GOAL_NORMAL diff --git a/code/modules/food_and_drinks/food/foods/candy.dm b/code/modules/food_and_drinks/food/foods/candy.dm index fe3fe0ac48a6..80cbfc5ee20b 100644 --- a/code/modules/food_and_drinks/food/foods/candy.dm +++ b/code/modules/food_and_drinks/food/foods/candy.dm @@ -13,25 +13,19 @@ icon = 'icons/obj/food/candy.dmi' icon_state = "candy" tastes = list("candy" = 1) + goal_difficulty = FOOD_GOAL_NORMAL // *********************************************************** // Candy Ingredients / Flavorings / Byproduct // *********************************************************** -/obj/item/food/snacks/chocolatebar - name = "chocolate bar" - desc = "Such sweet, fattening food." - icon_state = "chocolatebar" - filling_color = "#7D5F46" - list_reagents = list("nutriment" = 2, "chocolate" = 4) - tastes = list("chocolate" = 1) - /obj/item/food/snacks/candy/caramel name = "caramel" desc = "Chewy and dense, yet it practically melts in your mouth!" icon_state = "caramel" filling_color = "#DB944D" list_reagents = list("cream" = 2, "sugar" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/toffee @@ -40,6 +34,7 @@ icon_state = "toffee" filling_color = "#7D5F46" list_reagents = list("nutriment" = 3, "sugar" = 3) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/nougat name = "nougat" @@ -47,6 +42,7 @@ icon_state = "nougat" filling_color = "#7D5F46" list_reagents = list("nutriment" = 3, "sugar" = 3) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/taffy name = "saltwater taffy" @@ -54,6 +50,7 @@ icon_state = "candy1" filling_color = "#7D5F46" list_reagents = list("nutriment" = 3, "sugar" = 3) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/taffy/Initialize(mapload) . = ..() @@ -66,18 +63,21 @@ filling_color = "#7D5F46" bitesize = 3 list_reagents = list("cream" = 3, "chocolate" = 6) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/fudge/peanut name = "peanut fudge" desc = "Chocolate fudge, with bits of peanuts mixed in. People with nut allergies shouldn't eat this." icon_state = "fudge_peanut" filling_color = "#7D5F46" + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/fudge/cherry name = "chocolate cherry fudge" desc = "Chocolate fudge surrounding sweet cherries. Good for tricking kids into eating some fruit." icon_state = "fudge_cherry" filling_color = "#7D5F46" + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/fudge/cookies_n_cream name = "cookies 'n' cream fudge" @@ -85,12 +85,14 @@ icon_state = "fudge_cookies_n_cream" filling_color = "#7D5F46" list_reagents = list("cream" = 6, "chocolate" = 6) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/fudge/turtle name = "turtle fudge" desc = "Chocolate fudge with caramel and nuts. It doesn't contain real turtles, thankfully." icon_state = "fudge_turtle" filling_color = "#7D5F46" + goal_difficulty = FOOD_GOAL_NORMAL // *********************************************************** // Candy Products (Pre-existing) @@ -135,6 +137,7 @@ antable = FALSE list_reagents = list("nutriment" = 1, "chocolate" = 1) tastes = list("chocolate" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/candycane @@ -143,6 +146,7 @@ icon_state = "candycane" filling_color = "#F2F2F2" list_reagents = list("minttoxin" = 1, "sugar" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/gummybear name = "gummy bear" @@ -175,6 +179,7 @@ filling_color = "#ED0758" bitesize = 0.1 //this is gonna take a while, you'll be working at this all shift. list_reagents = list("sugar" = 10) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/cash name = "candy cash" @@ -183,6 +188,7 @@ filling_color = "#302000" list_reagents = list("nutriment" = 2, "chocolate" = 4) tastes = list("chocolate" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/coin @@ -193,6 +199,7 @@ bitesize = 3 list_reagents = list("nutriment" = 2, "chocolate" = 4) tastes = list("chocolate" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/gum @@ -203,6 +210,7 @@ filling_color = "#FF7495" bitesize = 0.2 list_reagents = list("sugar" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/sucker name = "sucker" @@ -210,244 +218,273 @@ icon_state = "sucker" filling_color = "#FFFFFF" list_reagents = list("sugar" = 10) + goal_difficulty = FOOD_GOAL_NORMAL // *********************************************************** // Gummy Bear Flavors // *********************************************************** /obj/item/food/snacks/candy/gummybear/red - name = "gummy bear" + name = "red gummy bear" desc = "A small edible bear. It's red!" icon_state = "gbear_red" filling_color = "#801E28" list_reagents = list("sugar" = 10, "cherryjelly" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/gummybear/blue - name = "gummy bear" + name = "blue gummy bear" desc = "A small edible bear. It's blue!" icon_state = "gbear_blue" filling_color = "#863333" list_reagents = list("sugar" = 10, "berryjuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/gummybear/poison - name = "gummy bear" + name = "blue gummy bear" desc = "A small edible bear. It's blue!" icon_state = "gbear_blue" filling_color = "#863353" list_reagents = list("poisonberryjuice" = 12) /obj/item/food/snacks/candy/gummybear/green - name = "gummy bear" + name = "green gummy bear" desc = "A small edible bear. It's green!" icon_state = "gbear_green" filling_color = "#365E30" list_reagents = list("sugar" = 10, "limejuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/gummybear/yellow - name = "gummy bear" + name = "yellow gummy bear" desc = "A small edible bear. It's yellow!" icon_state = "gbear_yellow" filling_color = "#863333" list_reagents = list("sugar" = 10, "lemonjuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/gummybear/orange - name = "gummy bear" + name = "orange gummy bear" desc = "A small edible bear. It's orange!" icon_state = "gbear_orange" filling_color = "#E78108" list_reagents = list("sugar" = 10, "orangejuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/gummybear/purple - name = "gummy bear" + name = "purple gummy bear" desc = "A small edible bear. It's purple!" icon_state = "gbear_purple" filling_color = "#993399" list_reagents = list("sugar" = 10, "grapejuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/gummybear/wtf - name = "gummy bear" + name = "rainbow gummy bear" desc = "A small bear. Wait... what?" icon_state = "gbear_rainbow" filling_color = "#60A584" list_reagents = list("sugar" = 10, "space_drugs" = 2) + goal_difficulty = FOOD_GOAL_NORMAL // *********************************************************** // Gummy Worm Flavors // *********************************************************** /obj/item/food/snacks/candy/gummyworm/red - name = "gummy worm" + name = "red gummy worm" desc = "An edible worm, made from gelatin. It's red!" icon_state = "gworm_red" filling_color = "#801E28" list_reagents = list("sugar" = 10, "cherryjelly" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/gummyworm/blue - name = "gummy worm" + name = "blue gummy worm" desc = "An edible worm, made from gelatin. It's blue!" icon_state = "gworm_blue" filling_color = "#863333" list_reagents = list("sugar" = 10, "berryjuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/gummyworm/poison - name = "gummy worm" + name = "blue gummy worm" desc = "An edible worm, made from gelatin. It's blue!" icon_state = "gworm_blue" filling_color = "#863353" list_reagents = list("poisonberryjuice" = 12) /obj/item/food/snacks/candy/gummyworm/green - name = "gummy worm" + name = "green gummy worm" desc = "An edible worm, made from gelatin. It's green!" icon_state = "gworm_green" filling_color = "#365E30" list_reagents = list("sugar" = 10, "limejuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/gummyworm/yellow - name = "gummy worm" + name = "yellow gummy worm" desc = "An edible worm, made from gelatin. It's yellow!" icon_state = "gworm_yellow" filling_color = "#863333" list_reagents = list("sugar" = 10, "lemonjuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/gummyworm/orange - name = "gummy worm" + name = "orange gummy worm" desc = "An edible worm, made from gelatin. It's orange!" icon_state = "gworm_orange" filling_color = "#E78108" list_reagents = list("sugar" = 10, "orangejuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/gummyworm/purple - name = "gummy worm" + name = "purple gummy worm" desc = "An edible worm, made from gelatin. It's purple!" icon_state = "gworm_purple" filling_color = "#993399" list_reagents = list("sugar" = 10, "grapejuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/gummyworm/wtf - name = "gummy worm" + name = "rainbow gummy worm" desc = "An edible worm. Did it just move?" icon_state = "gworm_rainbow" filling_color = "#60A584" list_reagents = list("sugar" = 10, "space_drugs" = 2) + goal_difficulty = FOOD_GOAL_NORMAL // *********************************************************** // Jelly Bean Flavors // *********************************************************** /obj/item/food/snacks/candy/jellybean/red - name = "jelly bean" + name = "red jelly bean" desc = "A candy bean, guaranteed to not give you gas. It's red!" icon_state = "jbean_red" filling_color = "#801E28" list_reagents = list("sugar" = 10, "cherryjelly" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/jellybean/blue - name = "jelly bean" + name = "blue jelly bean" desc = "A candy bean, guaranteed to not give you gas. It's blue!" icon_state = "jbean_blue" filling_color = "#863333" list_reagents = list("sugar" = 10, "berryjuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/jellybean/poison - name = "jelly bean" + name = "blue jelly bean" desc = "A candy bean, guaranteed to not give you gas. It's blue!" icon_state = "jbean_blue" filling_color = "#863353" list_reagents = list("poisonberryjuice" = 12) /obj/item/food/snacks/candy/jellybean/green - name = "jelly bean" + name = "green jelly bean" desc = "A candy bean, guaranteed to not give you gas. It's green!" icon_state = "jbean_green" filling_color = "#365E30" list_reagents = list("sugar" = 10, "limejuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/jellybean/yellow - name = "jelly bean" + name = "yellow jelly bean" desc = "A candy bean, guaranteed to not give you gas. It's yellow!" icon_state = "jbean_yellow" filling_color = "#863333" list_reagents = list("sugar" = 10, "lemonjuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/jellybean/orange - name = "jelly bean" + name = "orange jelly bean" desc = "A candy bean, guaranteed to not give you gas. It's orange!" icon_state = "jbean_orange" filling_color = "#E78108" list_reagents = list("sugar" = 10, "orangejuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/jellybean/purple - name = "jelly bean" + name = "purple jelly bean" desc = "A candy bean, guaranteed to not give you gas. It's purple!" icon_state = "jbean_purple" filling_color = "#993399" list_reagents = list("sugar" = 10, "grapejuice" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/jellybean/chocolate - name = "jelly bean" + name = "chocolate jelly bean" desc = "A candy bean, guaranteed to not give you gas. It's chocolate!" icon_state = "jbean_choc" filling_color = "#302000" list_reagents = list("sugar" = 10, "chocolate" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/jellybean/popcorn - name = "jelly bean" + name = "popcorn jelly bean" desc = "A candy bean, guaranteed to not give you gas. It's popcorn flavored!" icon_state = "jbean_popcorn" filling_color = "#664330" list_reagents = list("sugar" = 10, "nutriment" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/jellybean/cola - name = "jelly bean" + name = "cola jelly bean" desc = "A candy bean, guaranteed to not give you gas. It's Cola flavored!" icon_state = "jbean_cola" filling_color = "#102000" list_reagents = list("sugar" = 10, "cola" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/jellybean/drgibb - name = "jelly bean" + name = "\improper Dr. Gibb jelly bean" desc = "A candy bean, guaranteed to not give you gas. It's Dr. Gibb flavored!" icon_state = "jbean_cola" filling_color = "#102000" list_reagents = list("sugar" = 10, "dr_gibb" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/jellybean/coffee - name = "jelly bean" + name = "coffee jelly bean" desc = "A candy bean, guaranteed to not give you gas. It's Coffee flavored!" icon_state = "jbean_choc" filling_color = "#482000" list_reagents = list("sugar" = 10, "coffee" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/jellybean/wtf - name = "jelly bean" + name = "rainbow jelly bean" desc = "A candy bean, guaranteed to not give you gas. You aren't sure what color it is." icon_state = "jbean_rainbow" filling_color = "#60A584" list_reagents = list("sugar" = 10, "space_drugs" = 2) + goal_difficulty = FOOD_GOAL_NORMAL // *********************************************************** // Cotton Candy Flavors // *********************************************************** /obj/item/food/snacks/candy/cotton/red - name = "cotton candy" + name = "red cotton candy" desc = "Light and fluffy, it's like eating a cloud made from sugar!" icon_state = "cottoncandy_red" trash = /obj/item/c_tube filling_color = "#801E28" list_reagents = list("sugar" = 15, "cherryjelly" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/cotton/blue - name = "cotton candy" + name = "blue cotton candy" desc = "Light and fluffy, it's like eating a cloud made from sugar!" icon_state = "cottoncandy_blue" trash = /obj/item/c_tube filling_color = "#863333" list_reagents = list("sugar" = 15, "berryjuice" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/cotton/poison - name = "cotton candy" + name = "blue cotton candy" desc = "Light and fluffy, it's like eating a cloud made from sugar!" icon_state = "cottoncandy_blue" trash = /obj/item/c_tube @@ -455,55 +492,61 @@ list_reagents = list("poisonberryjuice" = 20) /obj/item/food/snacks/candy/cotton/green - name = "cotton candy" + name = "green cotton candy" desc = "Light and fluffy, it's like eating a cloud made from sugar!" icon_state = "cottoncandy_green" trash = /obj/item/c_tube filling_color = "#365E30" list_reagents = list("sugar" = 15, "limejuice" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/cotton/yellow - name = "cotton candy" + name = "yellow cotton candy" desc = "Light and fluffy, it's like eating a cloud made from sugar!" icon_state = "cottoncandy_yellow" trash = /obj/item/c_tube filling_color = "#863333" list_reagents = list("sugar" = 15, "lemonjuice" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/cotton/orange - name = "cotton candy" + name = "orange cotton candy" desc = "Light and fluffy, it's like eating a cloud made from sugar!" icon_state = "cottoncandy_orange" trash = /obj/item/c_tube filling_color = "#E78108" list_reagents = list("sugar" = 15, "orangejuice" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/cotton/purple - name = "cotton candy" + name = "purple cotton candy" desc = "Light and fluffy, it's like eating a cloud made from sugar!" icon_state = "cottoncandy_purple" trash = /obj/item/c_tube filling_color = "#993399" list_reagents = list("sugar" = 15, "grapejuice" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/cotton/pink - name = "cotton candy" + name = "pink cotton candy" desc = "Light and fluffy, it's like eating a cloud made from sugar!" icon_state = "cottoncandy_pink" trash = /obj/item/c_tube filling_color = "#863333" list_reagents = list("sugar" = 15, "watermelonjuice" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/cotton/rainbow - name = "cotton candy" + name = "rainbow cotton candy" desc = "Light and fluffy, it's like eating a cloud made from sugar!" icon_state = "cottoncandy_rainbow" trash = /obj/item/c_tube filling_color = "#C8A5DC" list_reagents = list("omnizine" = 20) + goal_difficulty = FOOD_GOAL_HARD /obj/item/food/snacks/candy/cotton/bad_rainbow - name = "cotton candy" + name = "rainbow cotton candy" desc = "Light and fluffy, it's like eating a cloud made from sugar!" icon_state = "cottoncandy_rainbow" trash = /obj/item/c_tube @@ -523,27 +566,32 @@ icon_state = "asteroidcrunch" trash = /obj/item/trash/candy filling_color = "#7D5F46" + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/confectionery/toffee name = "Yum-Baton Bar" desc = "Chocolate and toffee in the shape of a baton. Security sure knows how to pound these down!" icon_state = "yumbaton" filling_color = "#7D5F46" + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/confectionery/caramel name = "Malper Bar" desc = "A chocolate syringe filled with a caramel injection. Just what the doctor ordered!" icon_state = "malper" filling_color = "#7D5F46" + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/confectionery/caramel_nougat name = "Toxins Test Bar" desc = "An explosive combination of chocolate, caramel, and nougat. Research has never been so tasty!" icon_state = "toxinstest" filling_color = "#7D5F46" + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candy/confectionery/nougat name = "Tool-erone Bar" desc = "Chocolate-covered nougat, shaped like a wrench. Great for an engineer on the go!" icon_state = "toolerone" filling_color = "#7D5F46" + goal_difficulty = FOOD_GOAL_NORMAL diff --git a/code/modules/food_and_drinks/food/foods/desserts.dm b/code/modules/food_and_drinks/food/foods/desserts.dm index c68b8bc55f17..8c3517c8c66c 100644 --- a/code/modules/food_and_drinks/food/foods/desserts.dm +++ b/code/modules/food_and_drinks/food/foods/desserts.dm @@ -7,6 +7,7 @@ desc = "Goreng Pisang, also known as fried bananas." icon_state = "friedbanana" list_reagents = list("sugar" = 5, "nutriment" = 8, "cornoil" = 4) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/ricepudding name = "rice pudding" @@ -16,6 +17,7 @@ filling_color = "#FFFBDB" list_reagents = list("nutriment" = 7, "vitamin" = 2) tastes = list("rice" = 1, "sweetness" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/spacylibertyduff name = "spacy liberty duff" @@ -26,6 +28,7 @@ bitesize = 3 list_reagents = list("nutriment" = 6, "psilocybin" = 6) tastes = list("jelly" = 1, "mushroom" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/amanitajelly name = "amanita jelly" @@ -36,6 +39,7 @@ bitesize = 3 list_reagents = list("nutriment" = 6, "amanitin" = 6, "psilocybin" = 3) tastes = list("jelly" = 1, "mushroom" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/candiedapple name = "candied apple" @@ -45,6 +49,7 @@ bitesize = 3 list_reagents = list("nutriment" = 3, "sugar" = 2) tastes = list("apple" = 2, "sweetness" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/mint name = "mint" @@ -53,3 +58,4 @@ bitesize = 1 filling_color = "#F2F2F2" list_reagents = list("minttoxin" = 1) + goal_difficulty = FOOD_GOAL_NORMAL diff --git a/code/modules/food_and_drinks/food/foods/ethnic.dm b/code/modules/food_and_drinks/food/foods/ethnic.dm index 153dc2b7407c..b620811936b3 100644 --- a/code/modules/food_and_drinks/food/foods/ethnic.dm +++ b/code/modules/food_and_drinks/food/foods/ethnic.dm @@ -10,6 +10,7 @@ bitesize = 3 list_reagents = list("nutriment" = 7, "vitamin" = 1) tastes = list("taco" = 4, "meat" = 2, "cheese" = 2, "lettuce" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burrito name = "burrito" @@ -19,6 +20,7 @@ filling_color = "#A36A1F" list_reagents = list("nutriment" = 4, "vitamin" = 1) tastes = list("torilla" = 2, "meat" = 3) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/chimichanga @@ -28,6 +30,7 @@ trash = /obj/item/trash/plate filling_color = "#A36A1F" list_reagents = list("omnizine" = 4, "cheese" = 2) //Deadpool reference. Deal with it. + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/enchiladas name = "enchiladas" @@ -38,6 +41,7 @@ bitesize = 4 list_reagents = list("nutriment" = 8, "capsaicin" = 6) tastes = list("hot peppers" = 1, "meat" = 3, "cheese" = 1, "sour cream" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/cornchips name = "corn chips" @@ -47,6 +51,7 @@ trash = /obj/item/trash/chips filling_color = "#E8C31E" list_reagents = list("nutriment" = 3) + goal_difficulty = FOOD_GOAL_NORMAL ////////////////////// @@ -113,6 +118,7 @@ filling_color = "#F0F2E4" list_reagents = list("nutriment" = 5) tastes = list("custard" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/yakiimo name = "yaki imo" @@ -122,6 +128,7 @@ list_reagents = list("nutriment" = 5, "vitamin" = 4) filling_color = "#8B1105" tastes = list("sweet potato" = 1) + goal_difficulty = FOOD_GOAL_NORMAL ////////////////////// @@ -143,6 +150,7 @@ trash = /obj/item/stack/rods filling_color = "#A85340" list_reagents = list("nutriment" = 8) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/tofukabob name = "tofu-kabob" @@ -151,6 +159,7 @@ trash = /obj/item/stack/rods filling_color = "#FFFEE0" list_reagents = list("nutriment" = 8) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/picoss_kabob name = "picoss-kabob" @@ -160,3 +169,4 @@ list_reagents = list("protein" = 8, "vitamin" = 4, "vinegar" = 1, "capsaicin" = 1) filling_color = "#A85340" tastes = list("fish" = 4, "acid" = 1, "onion" = 1, "heat" = 1) + goal_difficulty = FOOD_GOAL_NORMAL diff --git a/code/modules/food_and_drinks/food/foods/frozen.dm b/code/modules/food_and_drinks/food/foods/frozen.dm index d00db915ed0a..dd117fbaecb1 100644 --- a/code/modules/food_and_drinks/food/foods/frozen.dm +++ b/code/modules/food_and_drinks/food/foods/frozen.dm @@ -30,13 +30,7 @@ filling_color = "#FFD675" list_reagents = list("nutriment" = 4, "sugar" = 1, "vitamin" = 1, "banana" = 3) tastes = list("cake" = 5, "sweetness" = 2, "sad clowns" = 1, "ice-cream" = 1) - -/obj/item/food/snacks/frozen/sundae - name = "sundae" - desc = "Portable ice cream in its own packaging." - icon_state = "sundae" - list_reagents = list("nutriment" = 2, "ice" = 2) - tastes = list("ice cream" = 1, "banana" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /////////////////// // Ice Cream // @@ -100,6 +94,7 @@ icon_state = "icecreamsandwich" list_reagents = list("nutriment" = 2, "ice" = 2) tastes = list("ice cream" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/berryicecreamsandwich name = "strawberry icecream sandwich" @@ -107,6 +102,7 @@ icon_state = "strawberryicecreamsandwich" list_reagents = list("nutriment" = 2, "ice" = 2) tastes = list("ice cream" = 1, "strawberry" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/sundae name = "sundae" @@ -114,6 +110,7 @@ icon_state = "sundae" list_reagents = list("nutriment" = 6, "banana" = 5, "vitamin" = 2) tastes = list("ice cream" = 1, "banana" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/honkdae name = "honkdae" @@ -121,6 +118,7 @@ icon_state = "honkdae" list_reagents = list("nutriment" = 6, "banana" = 10, "vitamin" = 4) tastes = list("ice cream" = 1, "banana" = 1, "a bad joke" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/cornuto name = "cornuto" @@ -128,6 +126,7 @@ icon_state = "cornuto" list_reagents = list("nutriment" = 6, "hot_coco" = 4, "cream" = 2, "vanilla" = 4, "sugar" = 2) tastes = list("chopped hazelnuts" = 3, "waffle" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/peanutbuttermochi name = "peanut butter ice cream mochi" @@ -135,6 +134,7 @@ icon_state = "pb_ice_cream_mochi" list_reagents = list("nutriment" = 4, "sugar" = 6, "peanutbutter" = 4, "milk" = 2) tastes = list("peanut butter" = 1, "mochi" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/spacefreezy name = "spacefreezy" @@ -142,6 +142,7 @@ icon_state = "spacefreezy" list_reagents = list("nutriment" = 8, "vitamin" = 5, "bluecherryjelly" = 5) tastes = list("blue cherries" = 2, "ice cream" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /////////////////// // Snow Cones // @@ -161,6 +162,7 @@ icon_state = "amber_sc" list_reagents = list("water" = 10, "ice" = 5, "nutriment" = 1, "applejuice" = 5) tastes = list("ice" = 1, "water" = 1, "apples" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/snowcone/berry name = "berry snowcone" @@ -168,6 +170,7 @@ icon_state = "berry_sc" list_reagents = list("water" = 10, "ice" = 5, "nutriment" = 1, "berryjuice" = 5) tastes = list("ice" = 1, "water" = 1, "berries" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/snowcone/bluecherry name = "bluecherry snowcone" @@ -175,6 +178,7 @@ icon_state = "blue_sc" list_reagents = list("water" = 10, "ice" = 5, "nutriment" = 1, "bluecherryjelly" = 5) tastes = list("ice" = 1, "water" = 1, "bluecherries" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/snowcone/cherry name = "cherry snowcone" @@ -182,6 +186,7 @@ icon_state = "red_sc" list_reagents = list("water" = 10, "ice" = 5, "nutriment" = 1, "cherryjelly" = 5) tastes = list("ice" = 1, "water" = 1, "cherries" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/snowcone/fruitsalad name = "fruit salad snowcone" @@ -189,6 +194,7 @@ icon_state = "fruitsalad_sc" list_reagents = list("water" = 10, "ice" = 5, "nutriment" = 1, "limejuice" = 5, "lemonjuice" = 5, "orangejuice" = 5) tastes = list("ice" = 1, "water" = 1, "oranges" = 5, "lemons" = 5, "limes" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/snowcone/grape name = "grape snowcone" @@ -196,6 +202,7 @@ icon_state = "grape_sc" list_reagents = list("water" = 10, "ice" = 5, "nutriment" = 1, "grapejuice" = 5) tastes = list("ice" = 1, "water" = 1, "grapes" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/snowcone/honey name = "honey snowcone" @@ -203,6 +210,7 @@ icon_state = "amber_sc" list_reagents = list("water" = 10, "ice" = 5, "nutriment" = 1, "honey" = 5) tastes = list("ice" = 1, "water" = 1, "honey" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/snowcone/lemon name = "lemon snowcone" @@ -210,6 +218,7 @@ icon_state = "lemon_sc" list_reagents = list("water" = 10, "ice" = 5, "nutriment" = 1, "lemonjuice" = 5) tastes = list("ice" = 1, "water" = 1, "lemons" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/snowcone/lime name = "lime snowcone" @@ -217,6 +226,7 @@ icon_state = "lime_sc" list_reagents = list("water" = 10, "ice" = 5, "nutriment" = 1, "limejuice" = 5) tastes = list("ice" = 1, "water" = 1, "limes" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/snowcone/mime name = "mime snowcone" @@ -224,6 +234,7 @@ icon_state = "mime_sc" list_reagents = list("water" = 10, "ice" = 5, "nutriment" = 1, "nothing" = 5) tastes = list("ice" = 1, "water" = 1, "silence" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/snowcone/orange name = "orange snowcone" @@ -231,6 +242,7 @@ icon_state = "orange_sc" list_reagents = list("water" = 10, "ice" = 5, "nutriment" = 1, "orangejuice" = 5) tastes = list("ice" = 1, "water" = 1, "oranges" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/snowcone/pineapple name = "pineapple snowcone" @@ -238,6 +250,7 @@ icon_state = "pineapple_sc" list_reagents = list("water" = 10, "ice" = 5, "nutriment" = 1, "pineapplejuice" = 5) tastes = list("ice" = 1, "water" = 1, "pineapple" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/snowcone/rainbow name = "rainbow snowcone" @@ -245,6 +258,7 @@ icon_state = "rainbow_sc" list_reagents = list("water" = 10, "ice" = 5, "colorful_reagent" = 5) tastes = list("ice" = 1, "water" = 1, "rainbows" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/snowcone/cola name = "space cola snowcone" @@ -252,6 +266,7 @@ icon_state = "soda_sc" list_reagents = list("water" = 10, "ice" = 5, "nutriment" = 1, "cola" = 5) tastes = list("ice" = 1, "water" = 1, "soda" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/snowcone/spacemountain name = "space mountain wind snowcone" @@ -259,6 +274,7 @@ icon_state = "mountainwind_sc" list_reagents = list("water" = 10, "ice" = 5, "nutriment" = 1, "spacemountainwind" = 5) tastes = list("ice" = 1, "water" = 1, "mountain wind" = 5) + goal_difficulty = FOOD_GOAL_NORMAL /////////////////// // Popsicles // @@ -271,6 +287,7 @@ trash = /obj/item/trash/popsicle_stick list_reagents = list("nutriment" = 4, "sugar" = 4, "chocolate" = 3) tastes = list("ice cream" = 1, "chocolate" = 1, "vanilla" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/popsicle/bananatop name = "banana topsicle" @@ -278,6 +295,7 @@ icon_state = "topsicle_banana" list_reagents = list("vitamin" = 4, "sugar" = 6, "banana" = 4) tastes = list("bananas" = 1, "tofu" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/popsicle/berrytop name = "berry topsicle" @@ -285,6 +303,7 @@ icon_state = "topsicle_berry" list_reagents = list("vitamin" = 4, "sugar" = 6, "berryjuice" = 4) tastes = list("berries" = 1, "tofu" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/popsicle/pineappletop name = "pineapple topsicle" @@ -292,6 +311,7 @@ icon_state = "topsicle_pineapple" list_reagents = list("vitamin" = 4, "sugar" = 6, "pineapplejuice" = 4) tastes = list("pineapples" = 1, "tofu" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/popsicle/licoricecream name = "licorice creamsicle" @@ -299,6 +319,7 @@ icon_state = "licorice_creamsicle" list_reagents = list("nutriment" = 4, "cream" = 2, "vanilla" = 1, "sugar" = 4, "salt" = 1) tastes = list("salty licorice" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/popsicle/orangecream name = "orange creamsicle" @@ -306,6 +327,7 @@ icon_state = "creamsicle_o" list_reagents = list("orangejuice" = 4, "cream" = 2, "vanilla" = 2, "sugar" = 4) tastes = list("ice cream" = 1, "oranges" = 1, "vanilla" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/popsicle/berrycream name = "berry creamsicle" @@ -313,6 +335,7 @@ icon_state = "creamsicle_m" list_reagents = list("berryjuice" = 4, "cream" = 2, "vanilla" = 2, "sugar" = 4) tastes = list("ice cream" = 1, "berries" = 1, "vanilla" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/popsicle/frozenpineapple name = "frozen pineapple pop" @@ -320,6 +343,7 @@ icon_state = "pineapple_pop" list_reagents = list("pineapplejuice" = 4, "sugar" = 4, "nutriment" = 2, "vitamin" = 2) tastes = list("cold pineapple" = 1, "chocolate" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/popsicle/sea_salt name = "sea salt ice-cream bar" @@ -327,6 +351,7 @@ icon_state = "sea_salt_pop" list_reagents = list("salt" = 1, "nutriment" = 2, "cream" = 2, "vanilla" = 2, "sugar"= 4,) tastes = list("salt" = 1, "sweet" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/frozen/popsicle/ant name = "ant popsicle" diff --git a/code/modules/food_and_drinks/food/foods/ingredients.dm b/code/modules/food_and_drinks/food/foods/ingredients.dm index d6331119b2c4..ffb42057fad6 100644 --- a/code/modules/food_and_drinks/food/foods/ingredients.dm +++ b/code/modules/food_and_drinks/food/foods/ingredients.dm @@ -21,6 +21,7 @@ bitesize = 3 list_reagents = list("plantmatter" = 3) tastes = list("tofu" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/soydope name = "soy dope" @@ -230,6 +231,7 @@ filling_color = "#7D5F46" list_reagents = list("nutriment" = 2, "sugar" = 2, "cocoa" = 2) tastes = list("chocolate" = 1) + goal_difficulty = FOOD_GOAL_EASY ///Chocolate crumbles/pile /obj/item/food/snacks/chocolatebar/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/food_and_drinks/food/foods/meat.dm b/code/modules/food_and_drinks/food/foods/meat.dm index 0a0a410807bb..5cc637ba2d66 100644 --- a/code/modules/food_and_drinks/food/foods/meat.dm +++ b/code/modules/food_and_drinks/food/foods/meat.dm @@ -201,6 +201,7 @@ bitesize = 3 list_reagents = list("nutriment" = 5) tastes = list("meat" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/bacon name = "bacon" @@ -209,6 +210,7 @@ icon_state = "bacon" list_reagents = list("nutriment" = 4, "porktonium" = 10, "msg" = 4) tastes = list("bacon" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/telebacon name = "tele bacon" @@ -218,6 +220,7 @@ var/obj/item/radio/beacon/bacon/baconbeacon list_reagents = list("nutriment" = 4, "porktonium" = 10) tastes = list("bacon" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/telebacon/Initialize(mapload) . = ..() @@ -250,6 +253,7 @@ filling_color = "#DB0000" list_reagents = list("protein" = 6, "vitamin" = 1, "porktonium" = 10) tastes = list("meat" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/cutlet name = "cutlet" @@ -258,6 +262,7 @@ icon_state = "cutlet" list_reagents = list("protein" = 2) tastes = list("meat" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/spidereggsham name = "green eggs and ham" @@ -461,6 +466,7 @@ bitesize = 1 list_reagents = list("nutriment" = 3, "egg" = 5) tastes = list("egg" = 1, "salt" = 1, "pepper" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/boiledegg name = "boiled egg" @@ -469,6 +475,7 @@ icon_state = "egg" filling_color = "#FFFFFF" list_reagents = list("nutriment" = 2, "egg" = 5, "vitamin" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/chocolateegg name = "chocolate egg" @@ -477,6 +484,7 @@ icon_state = "chocolateegg" filling_color = "#7D5F46" list_reagents = list("nutriment" = 4, "sugar" = 2, "cocoa" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/omelette name = "omelette du fromage" @@ -488,6 +496,7 @@ list_reagents = list("nutriment" = 8, "vitamin" = 1) bitesize = 1 tastes = list("egg" = 1, "cheese" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/benedict name = "eggs benedict" @@ -497,6 +506,7 @@ bitesize = 3 list_reagents = list("nutriment" = 6, "egg" = 3, "vitamin" = 4) tastes = list("egg" = 1, "bacon" = 1, "bun" = 1) + goal_difficulty = FOOD_GOAL_NORMAL ////////////////////// @@ -511,6 +521,7 @@ bitesize = 3 list_reagents = list("nutriment" = 6, "ketchup" = 3, "vitamin" = 3) tastes = list("bun" = 3, "meat" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/meatbun name = "meat bun" @@ -520,6 +531,7 @@ bitesize = 6 list_reagents = list("nutriment" = 6, "vitamin" = 2) tastes = list("bun" = 3, "meat" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/sliceable/turkey name = "turkey" @@ -539,6 +551,7 @@ trash = /obj/item/trash/plate filling_color = "#B97A57" tastes = list("turkey" = 1) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/organ name = "organ" @@ -573,3 +586,4 @@ list_reagents = list("nutriment" = 3, "protein" = 10, "bbqsauce" = 10) filling_color = "#FF1C1C" bitesize = 3 + goal_difficulty = FOOD_GOAL_NORMAL diff --git a/code/modules/food_and_drinks/food/foods/misc_food.dm b/code/modules/food_and_drinks/food/foods/misc_food.dm index 26624dbd595e..d9189b03aa36 100644 --- a/code/modules/food_and_drinks/food/foods/misc_food.dm +++ b/code/modules/food_and_drinks/food/foods/misc_food.dm @@ -11,6 +11,7 @@ filling_color = "#4D2F5E" list_reagents = list("nutriment" = 6, "vitamin" = 2) tastes = list("eggplant" = 2, "cheese" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/soylentgreen name = "soylent green" @@ -29,6 +30,7 @@ filling_color = "#E6FA61" list_reagents = list("nutriment" = 10, "vitamin" = 1) tastes = list("waffles" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/monkeysdelight name = "monkey's delight" @@ -39,6 +41,7 @@ bitesize = 6 list_reagents = list("nutriment" = 10, "banana" = 5, "vitamin" = 5) tastes = list("banana" = 1, "the jungle" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/dionaroast name = "roast diona" @@ -48,6 +51,7 @@ filling_color = "#75754B" list_reagents = list("plantmatter" = 4, "nutriment" = 2, "radium" = 2, "vitamin" = 4) tastes = list("chewy vegetables" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/tofurkey name = "tofurkey" @@ -57,6 +61,7 @@ bitesize = 3 list_reagents = list("nutriment" = 12, "ether" = 3) tastes = list("tofu" = 1) + goal_difficulty = FOOD_GOAL_NORMAL ////////////////////// @@ -73,6 +78,7 @@ bitesize = 3 list_reagents = list("nutriment" = 6,"vitamin" = 4) tastes = list("lettuce" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/salad/aesir name = "aesir salad" @@ -80,6 +86,7 @@ icon_state = "aesirsalad" list_reagents = list("nutriment" = 8, "omnizine" = 8, "vitamin" = 6) tastes = list("divinity" = 1, "lettuce" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/salad/antipasto name = "antipasto salad" @@ -87,6 +94,7 @@ icon_state = "antipasto_salad" list_reagents = list("nutriment" = 12, "protein" = 6, "vitamin" = 6) tastes = list("lettuce" = 2, "salami" = 2, "mozzarella cheese" = 2, "tomatoes" = 2, "dressing" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/salad/caesar name = "Caesar salad" @@ -94,6 +102,7 @@ icon_state = "caesar_salad" list_reagents = list("nutriment" = 12, "vitamin" = 6) tastes = list("healthy greens" = 2, "olive dressing" = 2, "feta cheese" = 2, "pita bread" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/salad/fruit name = "fruit salad" @@ -101,6 +110,7 @@ icon_state = "fruitsalad" list_reagents = list("nutriment" = 9, "vitamin" = 4) tastes = list("fruit" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/salad/greek name = "Greek salad" @@ -108,6 +118,7 @@ icon_state = "greek_salad" list_reagents = list("nutriment" = 13, "vitamin" = 14) tastes = list("healthy greens" = 2, "olive dressing" = 1, "feta cheese" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/salad/citrusdelight name = "citrus delight" @@ -115,6 +126,7 @@ icon_state = "citrusdelight" list_reagents = list("nutriment" = 11, "vitamin" = 7) tastes = list("sourness" = 1, "leaves" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/salad/jungle name = "jungle salad" @@ -122,6 +134,7 @@ icon_state = "junglesalad" list_reagents = list("banana" = 5, "nutriment" = 11, "vitamin" = 7) tastes = list("fruit" = 1, "the jungle" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/salad/kale name = "kale salad" @@ -129,6 +142,7 @@ icon_state = "kale_salad" list_reagents = list("nutriment" = 12, "vitamin" = 12) tastes = list("healthy greens" = 2, "olive dressing" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/salad/potato name = "potato salad" @@ -136,6 +150,7 @@ icon_state = "potato_salad" list_reagents = list("nutriment" = 10, "protein" = 4) tastes = list("potato" = 2, "egg" = 2, "mayonnaise" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/salad/melonfruitbowl name = "melon fruit bowl" @@ -144,6 +159,7 @@ trash = null list_reagents = list("nutriment" = 6, "vitamin" = 4) tastes = list("melon" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/salad/herb name = "herb salad" @@ -152,6 +168,7 @@ filling_color = "#76B87F" list_reagents = list("nutriment" = 8, "vitamin" = 2) tastes = list("lettuce" = 1, "apple" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/salad/valid name = "valid salad" @@ -160,6 +177,7 @@ filling_color = "#76B87F" list_reagents = list("nutriment" = 8, "salglu_solution" = 5, "vitamin" = 2) tastes = list("fried potato" = 1, "lettuce" = 1, "meat" = 1, "valids" = 1) + goal_difficulty = FOOD_GOAL_NORMAL ////////////////////// @@ -270,6 +288,7 @@ bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 list_reagents = list("nutriment" = 2) tastes = list("popcorn" = 3, "butter" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/popcorn/Initialize(mapload) . = ..() diff --git a/code/modules/food_and_drinks/food/foods/pasta.dm b/code/modules/food_and_drinks/food/foods/pasta.dm index 984fb60c1a8e..e8aadb6ce29d 100644 --- a/code/modules/food_and_drinks/food/foods/pasta.dm +++ b/code/modules/food_and_drinks/food/foods/pasta.dm @@ -35,6 +35,7 @@ filling_color = "#FCEE81" list_reagents = list("nutriment" = 2, "vitamin" = 1) tastes = list("pasta" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/pastatomato name = "spaghetti" @@ -46,6 +47,7 @@ bitesize = 4 list_reagents = list("nutriment" = 6, "tomatojuice" = 10, "vitamin" = 4) tastes = list("pasta" = 1, "tomato" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/meatballspaghetti name = "spaghetti & meatballs" @@ -56,6 +58,7 @@ filling_color = "#DE4545" list_reagents = list("nutriment" = 8, "synaptizine" = 5, "vitamin" = 4) tastes = list("pasta" = 1, "tomato" = 1, "meat" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/spesslaw name = "spesslaw" @@ -65,6 +68,7 @@ filling_color = "#DE4545" list_reagents = list("nutriment" = 8, "synaptizine" = 10, "vitamin" = 6) tastes = list("pasta" = 1, "tomato" = 1, "meat" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/macncheese name = "mac 'n' cheese" @@ -75,6 +79,7 @@ filling_color = "#ffe45d" list_reagents = list("nutriment" = 5, "vitamin" = 2, "cheese" = 4) tastes = list("pasta" = 1, "cheese" = 1, "comfort" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/lasagna name = "lasagna" @@ -84,3 +89,4 @@ filling_color = "#E18712" list_reagents = list("nutriment" = 10, "msg" = 3, "vitamin" = 4, "tomatojuice" = 10) tastes = list("pasta" = 1, "cheese" = 1, "tomato" = 1, "meat" = 1) + goal_difficulty = FOOD_GOAL_NORMAL diff --git a/code/modules/food_and_drinks/food/foods/pizza.dm b/code/modules/food_and_drinks/food/foods/pizza.dm index d37e3f058435..8e7a92050457 100644 --- a/code/modules/food_and_drinks/food/foods/pizza.dm +++ b/code/modules/food_and_drinks/food/foods/pizza.dm @@ -24,6 +24,7 @@ icon_state = "margheritapizzaslice" filling_color = "#BAA14C" tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1) + goal_difficulty = FOOD_GOAL_EASY // Meat Pizza /obj/item/food/snacks/sliceable/pizza/meatpizza @@ -41,6 +42,7 @@ icon_state = "meatpizzaslice" filling_color = "#BAA14C" tastes = list("crust" = 1, "cheese" = 1, "meat" = 1) + goal_difficulty = FOOD_GOAL_EASY // Mushroom Pizza /obj/item/food/snacks/sliceable/pizza/mushroompizza @@ -58,6 +60,7 @@ icon_state = "mushroompizzaslice" filling_color = "#BAA14C" tastes = list("crust" = 1, "cheese" = 1, "mushroom" = 1) + goal_difficulty = FOOD_GOAL_EASY // Vegetable Pizza /obj/item/food/snacks/sliceable/pizza/vegetablepizza @@ -75,6 +78,7 @@ icon_state = "vegetablepizzaslice" filling_color = "#BAA14C" tastes = list("crust" = 1, "tomato" = 1, "carrot" = 1, "vegetables" = 1) + goal_difficulty = FOOD_GOAL_EASY // Hawaiian Pizza /obj/item/food/snacks/sliceable/pizza/hawaiianpizza @@ -92,6 +96,7 @@ icon_state = "hawaiianpizzaslice" filling_color = "#e5b437" tastes = list("crust" = 1, "cheese" = 1, "pineapple" = 1) + goal_difficulty = FOOD_GOAL_EASY // Mac 'n' Cheese Pizza /obj/item/food/snacks/sliceable/pizza/macpizza @@ -110,6 +115,7 @@ icon_state = "macpizzaslice" filling_color = "#ffe45d" tastes = list("crust" = 1, "tomato" = 1, "cheese" = 2, "pasta" = 1) + goal_difficulty = FOOD_GOAL_EASY // Pepperoni Pizza /obj/item/food/snacks/sliceable/pizza/pepperonipizza @@ -128,6 +134,7 @@ icon_state = "pepperonipizzaslice" filling_color = "#ffe45d" tastes = list("cheese" = 3, "pepperoni" = 3, "grease" = 1) + goal_difficulty = FOOD_GOAL_EASY // Cheese Pizza /obj/item/food/snacks/sliceable/pizza/cheesepizza @@ -144,6 +151,7 @@ icon_state = "cheesepizzaslice" filling_color = "#BAA14C" tastes = list("crust" = 1, "tomato" = 1, "cheese" = 3) + goal_difficulty = FOOD_GOAL_EASY // Donk-pocket Pizza /obj/item/food/snacks/sliceable/pizza/donkpocketpizza @@ -161,6 +169,7 @@ icon_state = "donkpocketpizzaslice" filling_color = "#BAA14C" tastes = list("crust" = 1, "meat" = 1, "laziness" = 1) + goal_difficulty = FOOD_GOAL_EASY // Dank Pizza /obj/item/food/snacks/sliceable/pizza/dankpizza @@ -178,6 +187,7 @@ icon_state = "dankpizzaslice" filling_color = "#BAA14C" tastes = list("crust" = 1, "cheese" = 1, "special herbs" = 2) + goal_difficulty = FOOD_GOAL_EASY // Firecracker Pizza /obj/item/food/snacks/sliceable/pizza/firecrackerpizza @@ -195,6 +205,7 @@ icon_state = "firecrackerpizzaslice" filling_color = "#BAA14C" tastes = list("crust" = 1, "cheese" = 1, "HOTNESS" = 1) + goal_difficulty = FOOD_GOAL_EASY // "Pesto" Pizza /obj/item/food/snacks/sliceable/pizza/pestopizza @@ -212,6 +223,7 @@ icon_state = "pestopizzaslice" filling_color = "#BAA14C" tastes = list("tomato" = 1, "cheese" = 1, "wasabi" = 1) + goal_difficulty = FOOD_GOAL_EASY // Garlic Pizza /obj/item/food/snacks/sliceable/pizza/garlicpizza @@ -229,6 +241,7 @@ icon_state = "garlicpizzaslice" filling_color = "#BAA14C" tastes = list("crust" = 1, "cheese" = 1, "garlic" = 1) + goal_difficulty = FOOD_GOAL_EASY ////////////////////// diff --git a/code/modules/food_and_drinks/food/foods/sandwiches.dm b/code/modules/food_and_drinks/food/foods/sandwiches.dm index 05d584229845..42a9a4d0b694 100644 --- a/code/modules/food_and_drinks/food/foods/sandwiches.dm +++ b/code/modules/food_and_drinks/food/foods/sandwiches.dm @@ -19,6 +19,7 @@ bitesize = 3 list_reagents = list("nutriment" = 6, "vitamin" = 1) tastes = list("bun" = 4, "meat" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/brain name = "brainburger" @@ -59,6 +60,7 @@ bitesize = 3 list_reagents = list("nutriment" = 6, "vitamin" = 1) tastes = list("bun" = 4, "meat" = 1, "cheese" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/tofu name = "tofu burger" @@ -68,6 +70,7 @@ bitesize = 3 list_reagents = list("nutriment" = 6, "vitamin" = 1) tastes = list("bun" = 4, "tofu" = 4) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/hamborger name = "hamborger" @@ -135,6 +138,7 @@ bitesize = 3 list_reagents = list("nutriment" = 10, "vitamin" = 2) tastes = list("bun" = 4, "meat" = 2, "cheese" = 2, "type two diabetes" = 10) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/superbite name = "SuperBite burger" @@ -162,6 +166,7 @@ bitesize = 2 list_reagents = list("nutriment" = 7, "protein" = 1) tastes = list("bun" = 2, "meat" = 2, "white" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/ppatty/red name = "red pretty patty" @@ -171,6 +176,7 @@ bitesize = 2 list_reagents = list("nutriment" = 7, "protein" = 1) tastes = list("bun" = 2, "meat" = 2, "red" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/ppatty/orange name = "orange pretty patty" @@ -180,6 +186,7 @@ bitesize = 2 list_reagents = list("nutriment" = 7, "protein" = 1) tastes = list("bun" = 2, "meat" = 2, "orange" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/ppatty/yellow name = "yellow pretty patty" @@ -189,6 +196,7 @@ bitesize = 2 list_reagents = list("nutriment" = 7, "protein" = 1) tastes = list("bun" = 2, "meat" = 2, "yellow" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/ppatty/green name = "green pretty patty" @@ -198,6 +206,7 @@ bitesize = 2 list_reagents = list("nutriment" = 7, "protein" = 1) tastes = list("bun" = 2, "meat" = 2, "green" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/ppatty/blue name = "blue pretty patty" @@ -207,6 +216,7 @@ bitesize = 2 list_reagents = list("nutriment" = 7, "protein" = 1) tastes = list("bun" = 2, "meat" = 2, "blue" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/ppatty/purple name = "purple pretty patty" @@ -216,6 +226,7 @@ bitesize = 2 list_reagents = list("nutriment" = 7, "protein" = 1) tastes = list("bun" = 2, "meat" = 2, "purple" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/ppatty/rainbow name = "rainbow pretty patty" @@ -225,6 +236,7 @@ bitesize = 4 list_reagents = list("nutriment" = 14, "protein" = 5, "omnizine" = 10) tastes = list("bun" = 2, "meat" = 2, "rainbow" = 5) + goal_difficulty = FOOD_GOAL_HARD /obj/item/food/snacks/burger/elec name = "empowered burger" @@ -234,6 +246,7 @@ bitesize = 2 list_reagents = list("nutriment" = 5, "protein" = 1, "plasma" = 2) tastes = list("bun" = 2, "pure electricity" = 5) + goal_difficulty = FOOD_GOAL_HARD /obj/item/food/snacks/burger/rat name = "mouse burger" @@ -261,6 +274,7 @@ bitesize = 3 list_reagents = list("nutriment" = 3, "vitamin" = 2, "protein" = 6) tastes = list("bun" = 1, "bacon" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/bearger @@ -280,6 +294,7 @@ filling_color = "#F2B6EA" list_reagents = list("nutriment" = 4, "protein" = 6, "condensedcapsaicin" = 5, "capsaicin" = 5) tastes = list("bun" = 1, "extreme heat" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/mcguffin name = "mcGuffin" @@ -289,6 +304,7 @@ filling_color = "#F2B6EA" list_reagents = list("nutriment" = 2, "protein" = 7, "vitamin" = 1) tastes = list("muffin" = 1, "bacon" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/mcrib name = "mcRib" @@ -298,6 +314,7 @@ filling_color = "#F2B6EA" list_reagents = list("nutriment" = 2, "protein" = 7, "vitamin" = 4, "bbqsauce" = 1) tastes = list("bun" = 1, "pork" = 1, "patty" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/jelly name = "jelly burger" @@ -308,10 +325,13 @@ tastes = list("bun" = 4, "jelly" = 2) /obj/item/food/snacks/burger/jelly/slime + name = "slime burger" list_reagents = list("nutriment" = 6, "slimejelly" = 5, "vitamin" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/burger/jelly/cherry list_reagents = list("nutriment" = 6, "cherryjelly" = 5, "vitamin" = 1) + goal_difficulty = FOOD_GOAL_NORMAL ////////////////////// @@ -326,6 +346,7 @@ filling_color = "#D9BE29" list_reagents = list("nutriment" = 6, "vitamin" = 1) tastes = list("meat" = 2, "cheese" = 1, "bread" = 2, "lettuce" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/toastedsandwich name = "toasted sandwich" @@ -335,6 +356,7 @@ filling_color = "#D9BE29" list_reagents = list("nutriment" = 6, "carbon" = 2) tastes = list("toast" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/grilledcheese name = "grilled cheese sandwich" @@ -344,6 +366,7 @@ filling_color = "#D9BE29" list_reagents = list("nutriment" = 7, "vitamin" = 1) //why make a regualr sandwhich when you can make grilled cheese, with this nutriment value? tastes = list("toast" = 1, "grilled cheese" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/jellysandwich name = "jelly sandwich" @@ -356,9 +379,12 @@ /obj/item/food/snacks/jellysandwich/slime list_reagents = list("nutriment" = 2, "slimejelly" = 5, "vitamin" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/jellysandwich/cherry + name = "slime sandwich" list_reagents = list("nutriment" = 2, "cherryjelly" = 5, "vitamin" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/notasandwich name = "not-a-sandwich" @@ -375,6 +401,7 @@ icon_state = "wrap" list_reagents = list("nutriment" = 5) tastes = list("egg" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/blt name = "\improper BLT" @@ -385,6 +412,7 @@ bitesize = 4 list_reagents = list("nutriment" = 5, "protein" = 2) tastes = list("bacon" = 3, "lettuce" = 2, "tomato" = 2, "bread" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/peanut_butter_jelly name = "peanut butter and jelly sandwich" @@ -396,10 +424,14 @@ tastes = list("peanut butter" = 3, "jelly" = 3, "bread" = 2) /obj/item/food/snacks/peanut_butter_jelly/slime + name = "peanut butter and slime sandwich" + desc = "A classic PB&J sandwich, just like your mom used to make?" list_reagents = list("peanutbutter" = 2, "slimejelly" = 5, "nutriment" = 5, "protein" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/peanut_butter_jelly/cherry list_reagents = list("peanutbutter" = 2, "cherryjelly" = 5, "nutriment" = 5, "protein" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/philly_cheesesteak name = "Philly cheesesteak" @@ -410,6 +442,7 @@ bitesize = 4 list_reagents = list("nutriment" = 10, "protein" = 4) tastes = list("steak" = 3, "melted cheese" = 3, "onions" = 2, "bread" = 2) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/peanut_butter_banana name = "peanut butter and banana sandwich" @@ -420,3 +453,4 @@ bitesize = 2 list_reagents = list("nutriment" = 5, "protein" = 2) tastes = list("peanutbutter" = 3, "banana" = 3, "bread" = 2) + goal_difficulty = FOOD_GOAL_NORMAL diff --git a/code/modules/food_and_drinks/food/foods/seafood.dm b/code/modules/food_and_drinks/food/foods/seafood.dm index 629886de6b54..69f88b307ecd 100644 --- a/code/modules/food_and_drinks/food/foods/seafood.dm +++ b/code/modules/food_and_drinks/food/foods/seafood.dm @@ -51,6 +51,7 @@ bitesize = 1 list_reagents = list("nutriment" = 4) tastes = list("fish" = 1, "bread" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/fishburger name = "Fillet-O-Carp sandwich" @@ -61,6 +62,7 @@ bitesize = 3 list_reagents = list("nutriment" = 6, "vitamin" = 1) tastes = list("bun" = 4, "fish" = 4) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/cubancarp name = "cuban carp" @@ -72,6 +74,7 @@ bitesize = 3 list_reagents = list("nutriment" = 6, "capsaicin" = 1) tastes = list("fish" = 4, "batter" = 1, "hot peppers" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/fishandchips name = "fish and chips" @@ -82,6 +85,7 @@ bitesize = 3 list_reagents = list("nutriment" = 6) tastes = list("fish" = 1, "chips" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/sashimi name = "carp sashimi" @@ -91,6 +95,7 @@ bitesize = 3 list_reagents = list("nutriment" = 6, "capsaicin" = 5) tastes = list("raw carp" = 1, "hot peppers" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/fried_shrimp name = "fried shrimp" @@ -100,6 +105,7 @@ bitesize = 3 list_reagents = list("nutriment" = 2) tastes = list("shrimp" = 1, "bread crumbs" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/boiled_shrimp name = "boiled shrimp" @@ -109,6 +115,7 @@ bitesize = 3 list_reagents = list("nutriment" = 2) tastes = list("shrimp" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/shrimp_skewer name = "shrimp skewer" @@ -119,6 +126,7 @@ bitesize = 3 list_reagents = list("nutriment" = 8) tastes = list("shrimp" = 4) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/fish_skewer name = "fish skewer" @@ -129,6 +137,7 @@ bitesize = 3 list_reagents = list("protein" = 6, "vitamin" = 4) tastes = list("shrimp" = 1, "batter" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/sliceable/Ebi_maki name = "ebi maki roll" @@ -149,6 +158,7 @@ bitesize = 3 list_reagents = list("nutriment" = 2) tastes = list("shrimp" = 1, "rice" = 1, "seaweed" = 1) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/Ikura_maki name = "ikura maki roll" @@ -169,6 +179,7 @@ bitesize = 3 list_reagents = list("nutriment" = 2, "protein" = 1) tastes = list("salmon roe" = 1, "rice" = 1, "seaweed" = 1) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/Sake_maki name = "sake maki roll" @@ -189,6 +200,7 @@ bitesize = 3 list_reagents = list("nutriment" = 2) tastes = list("raw salmon" = 1, "rice" = 1, "seaweed" = 1) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/SmokedSalmon_maki name = "smoked salmon maki roll" @@ -209,6 +221,7 @@ bitesize = 3 list_reagents = list("nutriment" = 2) tastes = list("smoked salmon" = 1, "rice" = 1, "seaweed" = 1) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/Tamago_maki name = "tamago maki roll" @@ -229,6 +242,7 @@ bitesize = 3 list_reagents = list("nutriment" = 2) tastes = list("egg" = 1, "rice" = 1, "seaweed" = 1) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/Inari_maki name = "inari maki roll" @@ -249,6 +263,7 @@ bitesize = 3 list_reagents = list("nutriment" = 2) tastes = list("fried tofu" = 1, "rice" = 1, "seaweed" = 1) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/Masago_maki name = "masago maki roll" @@ -269,6 +284,7 @@ bitesize = 3 list_reagents = list("nutriment" = 2, "protein" = 1) tastes = list("goldfish roe" = 1, "rice" = 1, "seaweed" = 1) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/Tobiko_maki name = "tobiko maki roll" @@ -289,6 +305,7 @@ bitesize = 3 list_reagents = list("nutriment" = 2, "protein" = 1) tastes = list("shark roe" = 1, "rice" = 1, "seaweed" = 1) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/TobikoEgg_maki name = "tobiko and egg maki roll" @@ -309,6 +326,7 @@ bitesize = 3 list_reagents = list("nutriment" = 2, "protein" = 1) tastes = list("shark roe" = 1, "rice" = 1, "egg" = 1, "seaweed" = 1) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sliceable/Tai_maki name = "tai maki roll" @@ -329,6 +347,7 @@ bitesize = 3 list_reagents = list("nutriment" = 2) tastes = list("catfish" = 1, "rice" = 1, "seaweed" = 1) + goal_difficulty = FOOD_GOAL_EASY /obj/item/food/snacks/sushi_Unagi name = "unagi sushi" @@ -338,3 +357,4 @@ bitesize = 3 list_reagents = list("nutriment" = 2) tastes = list("grilled eel" = 1, "seaweed" = 1) + goal_difficulty = FOOD_GOAL_NORMAL diff --git a/code/modules/food_and_drinks/food/foods/side_dishes.dm b/code/modules/food_and_drinks/food/foods/side_dishes.dm index 648fd6f1038d..31e7aec36703 100644 --- a/code/modules/food_and_drinks/food/foods/side_dishes.dm +++ b/code/modules/food_and_drinks/food/foods/side_dishes.dm @@ -24,6 +24,7 @@ filling_color = "#EDDD00" list_reagents = list("nutriment" = 4) tastes = list("fries" = 3, "salt" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/cheesyfries name = "cheesy fries" @@ -33,6 +34,7 @@ filling_color = "#EDDD00" list_reagents = list("nutriment" = 6) tastes = list("fries" = 3, "cheese" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/tatortot name = "tator tot" @@ -41,6 +43,7 @@ list_reagents = list("nutriment" = 4) filling_color = "FFD700" tastes = list("fried potato" = 3, "valids" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/onionrings name = "onion rings" @@ -50,6 +53,7 @@ filling_color = "#C0C9A0" gender = PLURAL tastes = list("onion" = 3, "batter" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/carrotfries name = "carrot fries" @@ -59,6 +63,7 @@ filling_color = "#FAA005" list_reagents = list("plantmatter" = 3, "oculine" = 3, "vitamin" = 2) tastes = list("carrots" = 3, "salt" = 1) + goal_difficulty = FOOD_GOAL_NORMAL ////////////////////// @@ -71,6 +76,7 @@ icon_state = "beans" list_reagents = list("nutriment" = 10, "beans" = 10, "vitamin" = 3) tastes = list("beans" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /// mashed taters /obj/item/food/snacks/mashed_potatoes @@ -81,6 +87,7 @@ filling_color = "#D6D9C1" list_reagents = list("nutriment" = 5, "gravy" = 5, "mashedpotatoes" = 10, "vitamin" = 2) tastes = list("mashed potato" = 3, "gravy" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/stuffing name = "stuffing" @@ -89,6 +96,7 @@ filling_color = "#C9AC83" list_reagents = list("nutriment" = 3) tastes = list("bread crumbs" = 1, "herbs" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/loadedbakedpotato name = "loaded baked potato" @@ -97,6 +105,7 @@ filling_color = "#9C7A68" list_reagents = list("nutriment" = 6) tastes = list("potato" = 1, "cheese" = 1, "herbs" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/boiledrice name = "boiled rice" @@ -106,6 +115,7 @@ filling_color = "#FFFBDB" list_reagents = list("nutriment" = 5, "vitamin" = 1) tastes = list("rice" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/roastparsnip @@ -116,3 +126,4 @@ list_reagents = list("nutriment" = 3, "vitamin" = 4) filling_color = "#FF5500" tastes = list("parsnip" = 1) + goal_difficulty = FOOD_GOAL_NORMAL diff --git a/code/modules/food_and_drinks/food/foods/soups.dm b/code/modules/food_and_drinks/food/foods/soups.dm index d60b10a0d6e8..e2c4df37a92a 100644 --- a/code/modules/food_and_drinks/food/foods/soups.dm +++ b/code/modules/food_and_drinks/food/foods/soups.dm @@ -20,6 +20,7 @@ filling_color = "#785210" list_reagents = list("nutriment" = 8, "water" = 5, "vitamin" = 4) tastes = list("meatball" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/soup/slimesoup name = "slime soup" @@ -28,6 +29,7 @@ filling_color = "#C4DBA0" list_reagents = list("nutriment" = 5, "slimejelly" = 5, "water" = 5, "vitamin" = 4) tastes = list("slime" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/soup/bloodsoup name = "tomato soup" @@ -36,6 +38,7 @@ filling_color = "#FF0000" list_reagents = list("nutriment" = 2, "blood" = 10, "water" = 5, "vitamin" = 4) tastes = list("iron" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/soup/clownstears name = "clown's tears" @@ -52,6 +55,7 @@ filling_color = "#AFC4B5" list_reagents = list("nutriment" = 8, "water" = 5, "vitamin" = 4) tastes = list("vegetables" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/soup/nettlesoup name = "nettle soup" @@ -60,6 +64,7 @@ filling_color = "#AFC4B5" list_reagents = list("nutriment" = 8, "water" = 5, "vitamin" = 4) tastes = list("nettles" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/soup/mysterysoup name = "mystery soup" @@ -68,6 +73,7 @@ var/extra_reagent = null list_reagents = list("nutriment" = 6) tastes = list("chaos" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/soup/mysterysoup/Initialize(mapload) . = ..() @@ -96,6 +102,7 @@ filling_color = "#D92929" list_reagents = list("nutriment" = 5, "tomatojuice" = 10, "vitamin" = 3) tastes = list("tomato" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/soup/misosoup name = "miso soup" @@ -103,6 +110,7 @@ icon_state = "misosoup" list_reagents = list("nutriment" = 7, "vitamin" = 2) tastes = list("miso" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/soup/mushroomsoup name = "chantrelle soup" @@ -111,6 +119,7 @@ filling_color = "#E386BF" list_reagents = list("nutriment" = 8, "vitamin" = 4) tastes = list("mushroom" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/soup/beetsoup name = "beet soup" @@ -119,6 +128,7 @@ filling_color = "#FAC9FF" list_reagents = list("nutriment" = 7, "vitamin" = 2) tastes = list("beet" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/soup/beetsoup/Initialize(mapload) . = ..() @@ -131,6 +141,7 @@ filling_color = "#E386BF" list_reagents = list("nutriment" = 7, "protein" = 2) tastes = list("squirming" = 2, "tomato" = 2) + goal_difficulty = FOOD_GOAL_HARD /obj/item/food/snacks/soup/sweetpotatosoup name = "sweet potato soup" @@ -138,6 +149,7 @@ icon_state = "sweetpotatosoup" list_reagents = list("nutriment" = 5) tastes = list("sweet potato" = 1) + goal_difficulty = FOOD_GOAL_NORMAL /obj/item/food/snacks/soup/redbeetsoup name = "red beet soup" @@ -145,6 +157,8 @@ icon_state = "redbeetsoup" list_reagents = list("nutriment" = 5) tastes = list("red beet" = 1) + goal_difficulty = FOOD_GOAL_NORMAL + /obj/item/food/snacks/soup/frenchonionsoup name = "french onion soup" @@ -152,6 +166,8 @@ icon_state = "onionsoup" list_reagents = list("nutriment" = 8) tastes = list("caramelized onions" = 3, "cheese" = 1) + goal_difficulty = FOOD_GOAL_NORMAL + /obj/item/food/snacks/soup/zurek name = "zurek" @@ -159,6 +175,8 @@ icon_state = "zurek" list_reagents = list("nutriment" = 10, "protein" = 4) tastes = list("creamy vegetables" = 3, "sausage" = 2) + goal_difficulty = FOOD_GOAL_NORMAL + /obj/item/food/snacks/soup/cullenskink name = "cullen skink" @@ -166,6 +184,8 @@ icon_state = "cullen_skink" list_reagents = list("nutriment" = 10, "protein" = 4) tastes = list("creamy broth" = 2, "fish" = 2, "vegetables" = 2) + goal_difficulty = FOOD_GOAL_NORMAL + /obj/item/food/snacks/soup/chicken_noodle_soup name = "chicken noodle soup" @@ -173,6 +193,8 @@ icon_state = "chicken_noodle_soup" list_reagents = list("nutriment" = 10, "protein" = 4) tastes = list("broth" = 1, "chicken" = 1, "carrots" = 1, "noodles" = 1) + goal_difficulty = FOOD_GOAL_NORMAL + /obj/item/food/snacks/soup/cornchowder name = "corn chowder" @@ -180,6 +202,8 @@ icon_state = "corn_chowder" list_reagents = list("nutriment" = 10, "protein" = 4) tastes = list("creamy broth" = 1, "bacon" = 1, "mixed vegetables" = 1) + goal_difficulty = FOOD_GOAL_NORMAL + /obj/item/food/snacks/soup/meatball_noodles name = "meatball noodle soup" @@ -187,6 +211,8 @@ icon_state = "meatball_noodles" list_reagents = list("nutriment" = 10, "protein" = 4) tastes = list("bone broth" = 1, "meat" = 1, "gnocchi" = 1, "peanuts" = 1) + goal_difficulty = FOOD_GOAL_NORMAL + /obj/item/food/snacks/soup/seedsoup name = "Misklmæsch" //miskl = seed, mæsch = soup @@ -195,6 +221,8 @@ icon_state = "moth_seed_soup" list_reagents = list("nutriment" = 6) tastes = list("bitterness" = 1, "sourness" = 1, "nature" = 1) + goal_difficulty = FOOD_GOAL_NORMAL + ////////////////////// // Stews // @@ -208,6 +236,8 @@ bitesize = 7 list_reagents = list("nutriment" = 10, "oculine" = 5, "tomatojuice" = 5, "vitamin" = 5) tastes = list("tomato" = 1, "carrot" = 1) + goal_difficulty = FOOD_GOAL_NORMAL + /obj/item/food/snacks/stewedsoymeat name = "stewed soy meat" @@ -217,6 +247,8 @@ trash = /obj/item/trash/plate list_reagents = list("nutriment" = 8) tastes = list("soy" = 1, "vegetables" = 1) + goal_difficulty = FOOD_GOAL_NORMAL + /obj/item/food/snacks/soup/beanstew name = "Prickeldröndolhaskl" //prickeld = spicy, röndol = bean, haskl = stew @@ -224,6 +256,8 @@ icon_state = "moth_bean_stew" list_reagents = list("nutriment" = 10) tastes = list("beans" = 1, "cabbage" = 1, "spicy sauce" = 1) + goal_difficulty = FOOD_GOAL_NORMAL + /obj/item/food/snacks/soup/oatstew name = "Häfmisklhaskl" //häfmiskl = oat (häf from German hafer meaning oat, miskl meaning seed), haskl = stew @@ -231,6 +265,8 @@ icon_state = "moth_oat_stew" list_reagents = list("nutriment" = 10) tastes = list("oats" = 1, "sweet potato" = 1, "carrot" = 1, "pumpkin" = 1, "parsnip" = 1) + goal_difficulty = FOOD_GOAL_NORMAL + /obj/item/food/snacks/soup/hong_kong_borscht name = "hong kong borscht" @@ -238,6 +274,8 @@ icon_state = "hong_kong_borscht" list_reagents = list("nutriment" = 10, "protein" = 2) tastes = list("tomato" = 1, "cabbage" = 1, "meat" = 1) + goal_difficulty = FOOD_GOAL_NORMAL + /obj/item/food/snacks/soup/hong_kong_macaroni name = "hong kong macaroni" @@ -245,6 +283,8 @@ icon_state = "hong_kong_macaroni" list_reagents = list("nutriment" = 8, "protein" = 2) tastes = list("cream" = 1, "chicken" = 1, "pasta" = 1, "ham" =1) + goal_difficulty = FOOD_GOAL_NORMAL + ////////////////////// // Chili // @@ -257,6 +297,8 @@ filling_color = "#FF3C00" list_reagents = list("nutriment" = 5, "capsaicin" = 1, "tomatojuice" = 2, "vitamin" = 2) tastes = list("hot peppers" = 1, "tomato" = 1) + goal_difficulty = FOOD_GOAL_NORMAL + /obj/item/food/snacks/soup/coldchili name = "cold chili" @@ -265,6 +307,8 @@ filling_color = "#2B00FF" list_reagents = list("nutriment" = 5, "frostoil" = 1, "tomatojuice" = 2, "vitamin" = 2) tastes = list("tomato" = 1, "mint" = 1) + goal_difficulty = FOOD_GOAL_NORMAL + /obj/item/food/snacks/soup/clownchili name = "chili con carnival" diff --git a/code/modules/food_and_drinks/food_base.dm b/code/modules/food_and_drinks/food_base.dm index 64facc6b031f..d748c00e5bd8 100644 --- a/code/modules/food_and_drinks/food_base.dm +++ b/code/modules/food_and_drinks/food_base.dm @@ -29,6 +29,10 @@ var/temperature_min = 0 // To limit the temperature of a reagent container can attain when exposed to heat/cold var/temperature_max = 10000 + // How difficult is this food for the kitchen to make? + // Affects the quantity of food that is requested by CC. + var/goal_difficulty = REAGENT_GOAL_SKIP + /obj/item/food/Initialize(mapload) . = ..() diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index 6eb13e46ead0..1f08ff6b3473 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -44,7 +44,7 @@ var/text = ..() var/text_string = "" for(var/datum/spacevine_mutation/SM in mutations) - text_string += "[(text_string == "") ? "" : ", "][SM.name]" + text_string += "[(text_string == "") ? "" : ", "][initial(SM.name)]" text += "\n- Plant Mutations: [(text_string == "") ? "None" : text_string]" return text @@ -53,7 +53,7 @@ if(S.has_reagent("sterilizine", 5)) for(var/datum/spacevine_mutation/SM in mutations) - if(SM.quality == SPACEVINE_MUTATION_NEGATIVE) + if(initial(SM.quality) == SPACEVINE_MUTATION_NEGATIVE) temp_mut_list += SM if(prob(20) && temp_mut_list.len) mutations.Remove(pick(temp_mut_list)) @@ -61,7 +61,7 @@ if(S.has_reagent("fuel", 5)) for(var/datum/spacevine_mutation/SM in mutations) - if(SM.quality == SPACEVINE_MUTATION_POSITIVE) + if(initial(SM.quality) == SPACEVINE_MUTATION_POSITIVE) temp_mut_list += SM if(prob(20) && temp_mut_list.len) mutations.Remove(pick(temp_mut_list)) @@ -69,7 +69,7 @@ if(S.has_reagent("phenol", 5)) for(var/datum/spacevine_mutation/SM in mutations) - if(SM.quality == SPACEVINE_MUTATION_MINOR_NEGATIVE) + if(initial(SM.quality) == SPACEVINE_MUTATION_MINOR_NEGATIVE) temp_mut_list += SM if(prob(20) && temp_mut_list.len) mutations.Remove(pick(temp_mut_list)) diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 11726195d055..72fae016821b 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -1,3 +1,7 @@ +#define LABEL_MODE_OFF 0 +#define LABEL_MODE_NORMAL 1 +#define LABEL_MODE_GOAL 2 + /obj/item/hand_labeler name = "hand labeler" desc = "A combined label printer, applicator, and remover, all in a single portable device. Designed to be easy to operate and use." @@ -6,12 +10,12 @@ item_state = "flight" var/label = null var/labels_left = 30 - var/mode = 0 + var/mode = LABEL_MODE_OFF /obj/item/hand_labeler/afterattack(atom/A, mob/user, proximity) if(!proximity) return - if(!mode) //if it's off, give up. + if(mode == LABEL_MODE_OFF) //if it's off, give up. return if(!labels_left) @@ -20,13 +24,23 @@ if(!label || !length(label)) to_chat(user, "No text set!") return - if(length(A.name) + length(label) > 64) - to_chat(user, "Label too big!") - return if(ismob(A)) to_chat(user, "You can't label creatures!") // use a collar return + if(mode == LABEL_MODE_GOAL) + if(istype(A, /obj/item)) + to_chat(user, "Put it in a personal crate instead!") + return + user.visible_message("[user] labels [A] as part of a secondary goal for [label].", \ + "You label [A] as part of a secondary goal for [label].") + A.AddComponent(/datum/component/label/goal, label) + return + + if(length(A.name) + length(label) > 64) + to_chat(user, "Label too big!") + return + user.visible_message("[user] labels [A] as [label].", \ "You label [A] as [label].") investigate_log("[key_name(user)] ([ADMIN_FLW(user,"FLW")]) labelled \"[A]\" ([ADMIN_VV(A, "VV")]) with \"[label]\" at [COORD(A.loc)] [ADMIN_JMP(A)].", INVESTIGATE_RENAME) // Investigate goes BEFORE rename so the original name is preserved in the log @@ -35,6 +49,8 @@ labels_left-- /obj/item/hand_labeler/attack_self(mob/user as mob) + // off -> normal + // normal or goal -> off mode = !mode icon_state = "labeler[mode]" if(mode) @@ -55,8 +71,16 @@ user.drop_item() qdel(I) labels_left = initial(labels_left) //Yes, it's capped at its initial value - else - return ..() + else if(istype(I, /obj/item/card/id)) + var/obj/item/card/id/id = I + if(istype(id, /obj/item/card/id/guest) || !id.registered_name) + to_chat(user, "Invalid ID card.") + return + label = id.registered_name + mode = LABEL_MODE_GOAL + to_chat(user, "You configure the hand labeler with [I].") + icon_state = "labeler1" + /obj/item/hand_labeler_refill name = "hand labeler paper roll" @@ -65,3 +89,7 @@ icon_state = "labeler_refill" item_state = "electropack" w_class = WEIGHT_CLASS_TINY + +#undef LABEL_MODE_OFF +#undef LABEL_MODE_NORMAL +#undef LABEL_MODE_GOAL diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm index 9ef0f6fac0a1..e72a81a8a684 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol.dm @@ -9,6 +9,7 @@ var/dizzy_adj = 6 SECONDS var/alcohol_perc = 1 //percentage of ethanol in a beverage 0.0 - 1.0 taste_description = "liquid fire" + goal_department = "Bar" /datum/reagent/consumable/ethanol/on_mob_life(mob/living/M) M.AdjustDrunk(alcohol_perc STATUS_EFFECT_CONSTANT) @@ -125,6 +126,7 @@ drink_name = "Hooch" drink_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." taste_description = "pure resignation" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/hooch/on_mob_life(mob/living/carbon/M) if(M.mind && M.mind.assigned_role == "Assistant") @@ -161,6 +163,7 @@ drink_name = "Glass of Mojito" drink_desc = "Fresh from Spesscuba." taste_description = "mojito" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/vodka name = "Vodka" @@ -242,6 +245,7 @@ drink_name = "Suicider" drink_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." taste_description = "approaching death" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/ale name = "Ale" @@ -291,6 +295,7 @@ drink_name = "Glass of bilk" drink_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." taste_description = "bilk" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/atomicbomb name = "Atomic Bomb" @@ -303,6 +308,7 @@ drink_name = "Atomic Bomb" drink_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." taste_description = "a long, fiery burn" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/consumable/ethanol/threemileisland name = "Three Mile Island Iced Tea" @@ -315,6 +321,7 @@ drink_name = "Three Mile Island Ice Tea" drink_desc = "A glass of this is sure to prevent a meltdown." taste_description = "a creeping heat" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/consumable/ethanol/goldschlager name = "Goldschlager" @@ -351,6 +358,7 @@ drink_name = "Gin and Tonic" drink_desc = "A mild but still great cocktail. Drink up, like a true Englishman." taste_description = "bitter medicine" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/cuba_libre name = "Cuba Libre" @@ -363,6 +371,7 @@ drink_name = "Cuba Libre" drink_desc = "A classic mix of rum and cola." taste_description = "liberation" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/whiskey_cola name = "Whiskey Cola" @@ -375,6 +384,7 @@ drink_name = "Whiskey Cola" drink_desc = "An innocent-looking mixture of cola and Whiskey. Delicious." taste_description = "whiskey and coke" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/daiquiri name = "Daiquiri" @@ -387,6 +397,7 @@ drink_name = "Daiquiri" drink_desc = "When Botany gives you limes, make daiquiris." taste_description = "sweetened lime juice and rum" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/martini name = "Classic Martini" @@ -399,6 +410,7 @@ drink_name = "Classic Martini" drink_desc = "Damn, the bartender even stirred it, not shook it." taste_description = "class" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/vodkamartini name = "Vodka Martini" @@ -411,6 +423,7 @@ drink_name = "Vodka martini" drink_desc ="A bastardisation of the classic martini. Still great." taste_description = "class and potatoes" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/white_russian name = "White Russian" @@ -423,6 +436,7 @@ drink_name = "White Russian" drink_desc = "A very nice looking drink. But that's just, like, your opinion, man." taste_description = "very creamy alcohol" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/screwdrivercocktail name = "Screwdriver" @@ -435,6 +449,7 @@ drink_name = "Screwdriver" drink_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." taste_description = "a naughty secret" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/booger name = "Booger" @@ -447,6 +462,7 @@ drink_name = "Booger" drink_desc = "Eww..." taste_description = "a fruity mess" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/bloody_mary name = "Bloody Mary" @@ -459,6 +475,7 @@ drink_name = "Bloody Mary" drink_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." taste_description = "tomatoes with booze" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/gargle_blaster name = "Pan-Galactic Gargle Blaster" @@ -471,6 +488,7 @@ drink_name = "Pan-Galactic Gargle Blaster" drink_desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." taste_description = "the number fourty two" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/flaming_homer name = "Flaming Moe" @@ -483,6 +501,7 @@ drink_name = "Flaming Moe" drink_desc = "Happiness is just a Flaming Moe away!" taste_description = "caramelised booze and sweet, salty medicine" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/brave_bull name = "Brave Bull" @@ -507,6 +526,7 @@ drink_name = "Tequila Sunrise" drink_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." taste_description = "fruity alcohol" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/toxins_special name = "Toxins Special" @@ -519,6 +539,7 @@ drink_name = "Toxins Special" drink_desc = "Whoah, this thing is on FIRE" taste_description = "FIRE" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/toxins_special/on_mob_life(mob/living/M) if(M.bodytemperature < 330) @@ -536,6 +557,7 @@ drink_name = "Beepsky Smash" drink_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." taste_description = "THE LAW" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/irish_cream name = "Irish Cream" @@ -560,6 +582,7 @@ drink_name = "The Manly Dorf" drink_desc = "A manly concotion made from Ale and Beer. Intended for true men only." taste_description = "manliness" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/longislandicedtea name = "Long Island Iced Tea" @@ -572,6 +595,7 @@ drink_name = "Long Island Iced Tea" drink_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." taste_description = "fruity alcohol" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/moonshine name = "Moonshine" @@ -584,6 +608,7 @@ drink_name = "Moonshine" drink_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." taste_description = "prohibition" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/b52 name = "B-52" @@ -596,6 +621,7 @@ drink_name = "B-52" drink_desc = "Kahlua, Irish Cream, and congac. You will get bombed." taste_description = "destruction" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/irishcoffee name = "Irish Coffee" @@ -608,6 +634,7 @@ drink_name = "Irish Coffee" drink_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." taste_description = "coffee and booze" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/margarita name = "Margarita" @@ -620,6 +647,7 @@ drink_name = "Margarita" drink_desc = "On the rocks with salt on the rim. Arriba~!" taste_description = "daisies" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/black_russian name = "Black Russian" @@ -632,6 +660,7 @@ drink_name = "Black Russian" drink_desc = "For the lactose-intolerant. Still as classy as a White Russian." taste_description = "sweet alcohol" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/manhattan name = "Manhattan" @@ -656,6 +685,7 @@ drink_name = "Manhattan Project" drink_desc = "A scientist's drink of choice, for thinking how to blow up the station." taste_description = "the apocalypse" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/consumable/ethanol/whiskeysoda name = "Whiskey Soda" @@ -668,6 +698,7 @@ drink_name = "Whiskey Soda" drink_desc = "Ultimate refreshment." taste_description = "mediocrity" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/antifreeze name = "Anti-freeze" @@ -680,6 +711,7 @@ drink_name = "Anti-freeze" drink_desc = "The ultimate refreshment." taste_description = "poor life choices" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/M) if(M.bodytemperature < 330) @@ -698,6 +730,7 @@ drink_name = "Admin Freeze" drink_desc = "The ultimate punishment." taste_description = "a series of bad decisions" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/consumable/ethanol/adminfreeze/reaction_mob(mob/living/M, method = REAGENT_INGEST, volume) ..() @@ -716,6 +749,7 @@ drink_name = "Barefoot" drink_desc = "Barefoot and pregnant" taste_description = "pregnancy" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/snowwhite name = "Snow White" @@ -728,6 +762,7 @@ drink_name = "Snow White" drink_desc = "A cold refreshment." taste_description = "a poisoned apple" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/demonsblood name = "Demons Blood" @@ -741,6 +776,7 @@ drink_name = "Demons Blood" drink_desc = "Just looking at this thing makes the hair at the back of your neck stand up." taste_description = "evil" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/vodkatonic name = "Vodka and Tonic" @@ -754,6 +790,7 @@ drink_name = "Vodka and Tonic" drink_desc = "For when a gin and tonic isn't russian enough." taste_description = "bitter medicine" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/ginfizz name = "Gin Fizz" @@ -767,6 +804,7 @@ drink_name = "Gin Fizz" drink_desc = "Refreshingly lemony, deliciously dry." taste_description = "fizzy alcohol" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/bahama_mama name = "Bahama mama" @@ -779,6 +817,7 @@ drink_name = "Bahama Mama" drink_desc = "Tropic cocktail" taste_description = "HONK" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/singulo name = "Singulo" @@ -792,6 +831,7 @@ drink_name = "Singulo" drink_desc = "A bluespace beverage." taste_description = "infinity" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/sbiten name = "Sbiten" @@ -804,6 +844,7 @@ drink_name = "Sbiten" drink_desc = "A spicy mix of Vodka and Spice. Very hot." taste_description = "comforting warmth" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/M) if(M.bodytemperature < 360) @@ -821,6 +862,7 @@ drink_name = "Devils Kiss" drink_desc = "Creepy time!" taste_description = "naughtiness" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/red_mead name = "Red Mead" @@ -833,6 +875,7 @@ drink_name = "Red Mead" drink_desc = "A True Vikings Beverage, though its color is strange." taste_description = "blood" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/consumable/ethanol/mead name = "Mead" @@ -875,6 +918,7 @@ drink_name = "Grog" drink_desc = "A fine and cepa drink for Space." taste_description = "strongly diluted rum" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/aloe name = "Aloe" @@ -887,6 +931,7 @@ drink_name = "Aloe" drink_desc = "Very, very, very good." taste_description = "healthy skin" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/andalusia name = "Andalusia" @@ -899,6 +944,7 @@ drink_name = "Andalusia" drink_desc = "A nice, strange named drink." taste_description = "sweet alcohol" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/alliescocktail name = "Allies Cocktail" @@ -911,6 +957,7 @@ drink_name = "Allies cocktail" drink_desc = "A drink made from your allies." taste_description = "victory" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/acid_spit name = "Acid Spit" @@ -923,6 +970,7 @@ drink_name = "Acid Spit" drink_desc = "A drink from Nanotrasen. Made from live aliens." taste_description = "PAIN" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/amasec name = "Amasec" @@ -935,6 +983,7 @@ drink_name = "Amasec" drink_desc = "Always handy before COMBAT!!!" taste_description = "a stunbaton" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/neurotoxin name = "Neuro-toxin" @@ -949,6 +998,7 @@ drink_name = "Neurotoxin" drink_desc = "A drink that is guaranteed to knock you silly." taste_description = "brain damageeeEEeee" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/neurotoxin/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -971,6 +1021,7 @@ drink_name = "Hippie's Delight" drink_desc = "A drink enjoyed by people during the 1960's." taste_description = "colors" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -1009,6 +1060,7 @@ drink_name = "Changeling Sting" drink_desc = "A stingy drink." taste_description = "a tiny prick" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/dublindrop name = "Dublin Drop" @@ -1022,6 +1074,7 @@ drink_name = "Dublin Drop" drink_desc = "A Dublin drop. Pub legends say one of the ingredients can bring back the dead." taste_description = "a belt in the gob" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/syndicatebomb name = "Syndicate Bomb" @@ -1034,6 +1087,7 @@ drink_name = "Syndicate Bomb" drink_desc = "A syndicate bomb." taste_description = "a job offer" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/erikasurprise name = "Erika Surprise" @@ -1046,6 +1100,7 @@ drink_name = "Erika Surprise" drink_desc = "The surprise is, it's green!" taste_description = "disappointment" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/driestmartini name = "Driest Martini" @@ -1059,6 +1114,7 @@ drink_name = "Driest Martini" drink_desc = "Only for the experienced. You think you see sand floating in the glass." taste_description = "dust and ashes" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/driestmartini/on_mob_life(mob/living/M) if(current_cycle >= 55 && current_cycle < 115) @@ -1093,6 +1149,7 @@ drink_name = "Gin and Sonic" drink_desc = "An extremely high amperage drink. Absolutely not for the true Englishman." taste_description = "SPEED" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/ginsonic/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -1121,6 +1178,7 @@ drink_name = "Glass of applejack" drink_desc = "When cider isn't strong enough, you gotta jack it." taste_description = "strong cider" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/jackrose name = "Jack Rose" @@ -1132,6 +1190,7 @@ drink_name = "Jack Rose" drink_desc = "Drinking this makes you feel like you belong in a luxury hotel bar during the 1920s." taste_description = "style" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/drunkenblumpkin name = "Drunken Blumpkin" @@ -1143,6 +1202,7 @@ drink_name = "Drunken Blumpkin" drink_desc = "A drink for the drunks" taste_description = "weirdness" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/eggnog name = "Eggnog" @@ -1155,6 +1215,7 @@ drink_name = "Eggnog" drink_desc = "For enjoying the most wonderful time of the year." taste_description = "christmas spirit" + goal_difficulty = REAGENT_GOAL_HARD /// inaccessible to players, but here for admin shennanigans /datum/reagent/consumable/ethanol/dragons_breath @@ -1256,6 +1317,7 @@ drink_name = "Glass of Trinary" drink_desc = "Colorful drink made for synthetic crewmembers. It doesn't seem like it would taste well." taste_description = "modem static" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/synthanol/servo name = "Servo" @@ -1268,6 +1330,7 @@ drink_name = "Glass of Servo" drink_desc = "Chocolate - based drink made for IPCs. Not sure if anyone's actually tried out the recipe." taste_description = "motor oil and cocoa" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/synthanol/uplink name = "Uplink" @@ -1280,6 +1343,7 @@ drink_name = "Glass of Uplink" drink_desc = "An exquisite mix of the finest liquoirs and synthanol. Meant only for synthetics." taste_description = "a GUI in visual basic" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/synthanol/synthnsoda name = "Synth 'n Soda" @@ -1292,6 +1356,7 @@ drink_name = "Glass of Synth 'n Soda" drink_desc = "Classic drink altered to fit the tastes of a robot. Bad idea to drink if you're made of carbon." taste_description = "fizzy motor oil" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/synthanol/synthignon name = "Synthignon" @@ -1464,6 +1529,7 @@ drink_desc = "A sawed-off cola bottle filled with Fernet Cola. You can hear cuarteto music coming from the inside." taste_description = "low class heaven" remove_nutrition = 1 + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/gimlet name = "Gimlet" @@ -1475,6 +1541,7 @@ drink_name = "Gimlet" drink_desc = "There are debates on whether this drink should be half gin and half lime, or three parts gin and one part lime. All you know is, it's alcohol." taste_description = "sharpness" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/sidecar name = "Sidecar" @@ -1486,6 +1553,7 @@ drink_name = "Sidecar" drink_desc = "You can smell the citrus from here!" taste_description = "smooth cognac and tart citrus" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/consumable/ethanol/whiskey_sour name = "Whiskey Sour" @@ -1497,6 +1565,7 @@ drink_name = "Whiskey Sour" drink_desc = "Lemon and whiskey, with a cute foamy head!" taste_description = "warm whiskey and sweetness" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/consumable/ethanol/mint_julep name = "Mint Julep" @@ -1508,6 +1577,7 @@ drink_name = "Mint Julep" drink_desc = "A dainty glass of whiskey and mint on the rocks. Perfect for summer!" taste_description = "sweet and cooling mint" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/pina_colada name = "Pina Colada" @@ -1519,6 +1589,7 @@ drink_name = "Pina Colada" drink_desc = "After taking a sip, you feel contractually obligated to start singing a certain song of the same name." taste_description = "tart and tropical pineapple" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/bilkshake name = "Bilkshake" @@ -1531,6 +1602,7 @@ drink_name = "Bilkshake" drink_desc = "Your mind bubbles and oozes as it tries to comprehend what it's seeing. What the HELL is this?" taste_description = "bilk, cream, and cold tears" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/sontse name = "Sontse" @@ -1543,6 +1615,7 @@ drink_desc = "The Sun, The Sun, The Sun, The Sun, The Sun, THE SUN!" taste_description = "warmth and brightness" var/light_activated = FALSE + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/consumable/ethanol/sontse/on_mob_life(mob/living/M) if(current_cycle != 5 || !ismoth(M)) @@ -1571,6 +1644,7 @@ drink_desc = "Blizzard in a glass. Tajaran signature drink!" taste_description = "ice" var/min_achievable_temp = 250 + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/ahdomai_eclipse/on_mob_life(mob/living/M) . = ..() @@ -1587,6 +1661,7 @@ drink_name = "Feast by the Beach" drink_desc = "A classic Unathi drink. You can spot sand sediment at the bottom of the glass. The drink is hot as hell and more." taste_description = "sand" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/beach_feast/on_mob_life(mob/living/M) if(!isunathi(M)) @@ -1605,6 +1680,7 @@ drink_name = "Jungle Vox" drink_desc = "Classy drink in a glass vox head with a bit of liquid nitrogen added on." taste_description = "bubbles" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/jungle_vox/on_mob_life(mob/living/M) if(current_cycle <= 5 || !isvox(M)) @@ -1624,6 +1700,7 @@ drink_name = "Slime Mold" drink_desc = "You can swear that this jelly looks alive." taste_description = "jelly" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/consumable/ethanol/slime_mold/on_mob_life(mob/living/M) if(!isslimeperson(M)) @@ -1644,6 +1721,7 @@ drink_name = "Die Seife" drink_desc = "There is a piece of soap at the bottom of the glass and it is slowly melting." taste_description = "soap" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/die_seife/on_mob_life(mob/living/M) if(current_cycle % 10 != 0 || !isdrask(M)) @@ -1664,6 +1742,7 @@ drink_name = "Acid Dreams" drink_desc = "This one looks just weird and reeks of acid." taste_description = "acid" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/acid_dreams/on_mob_life(mob/living/M) if(current_cycle % 10 != 0 || !isgrey(M)) @@ -1689,6 +1768,7 @@ drink_name = "Islay Whiskey" drink_desc = "Named in honor of one of the most gritty and earth smelling types of Whiskey of Earth, this drink is a treat for any Diona." taste_description = "soil" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/islay_whiskey/on_mob_life(mob/living/M) if(current_cycle <=5 || !isdiona(M)) @@ -1715,6 +1795,7 @@ drink_desc = "In the triangle of fire, this is apex of fuel." taste_description = "fire" var/on_fire = FALSE + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/consumable/ethanol/ultramatter/on_mob_life(mob/living/M) // species agnostic as it is DRINKS on_fire, so only plasmaman can get it @@ -1747,6 +1828,7 @@ drink_name = "Howler" drink_desc = "Old classic human drink that was adopted by Vulpkanin." taste_description = "citrus" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/consumable/ethanol/howler/on_mob_life(mob/living/M) if(!isvulpkanin(M)) @@ -1769,6 +1851,7 @@ drink_desc = "Fake Diona is floating carelessly in the middle of this drink." taste_description = "the crunch" var/mutated = FALSE + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ethanol/diona_smash/on_mob_life(mob/living/M) if(mutated || !iskidan(M)) diff --git a/code/modules/reagents/chemistry/reagents/drugs.dm b/code/modules/reagents/chemistry/reagents/drugs.dm index 9854ebec5c26..f2a1442f275a 100644 --- a/code/modules/reagents/chemistry/reagents/drugs.dm +++ b/code/modules/reagents/chemistry/reagents/drugs.dm @@ -28,6 +28,8 @@ reagent_state = LIQUID color = "#0000D8" taste_description = "a magical journey" + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/lsd/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -46,6 +48,8 @@ addiction_threshold = 10 heart_rate_decrease = 1 taste_description = "a synthetic high" + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/space_drugs/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -171,6 +175,8 @@ addiction_threshold = 5 addiction_decay_rate = 0.2 // half the metabolism rate taste_description = "bitterness" + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/crank/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -249,6 +255,8 @@ overdose_threshold = 20 addiction_chance = 10 addiction_threshold = 5 + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/pump_up/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -290,6 +298,8 @@ addiction_threshold = 10 taste_description = "very poor life choices" allowed_overdose_process = TRUE + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/krokodil/on_mob_life(mob/living/M) @@ -370,6 +380,8 @@ allowed_overdose_process = TRUE //Requested by balance. /// modifier to the stun time of the mob taking the drug var/tenacity = 1.5 + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/methamphetamine/on_mob_add(mob/living/L) ADD_TRAIT(L, TRAIT_GOTTAGOFAST, id) @@ -440,6 +452,8 @@ addiction_decay_rate = 0.2 taste_description = "WAAAAGH" var/bonus_damage = 2 + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/bath_salts/on_mob_add(mob/living/L) if(ishuman(L)) @@ -541,6 +555,8 @@ addiction_chance = 5 addiction_threshold = 5 taste_description = "the inside of a toilet... or worse" + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/jenkem/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -563,6 +579,8 @@ addiction_decay_rate = 0.2 /// how much do we edit the stun and stamina mods? lower is more resistance var/tenacity = 0.5 + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/aranesp/on_mob_add(mob/living/L) if(ishuman(L)) @@ -610,6 +628,8 @@ addiction_chance_additional = 20 addiction_threshold = 20 minor_addiction = TRUE + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/happiness/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -718,6 +738,8 @@ addiction_chance_additional = 20 addiction_threshold = 10 taste_description = "flips" + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/fliptonium/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -784,6 +806,8 @@ color = "#AC88CA" //RGB: 172, 136, 202 metabolization_rate = 0.6 * REAGENTS_METABOLISM taste_description = "spinning" + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/rotatium/on_mob_life(mob/living/carbon/M) if(M.hud_used) @@ -834,6 +858,8 @@ var/constant_dose_time = 0 /// Keeps track of how many chemicals we are delaying the changeling by. var/changeling_chemical_tracker = 0 + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/mephedrone/on_mob_add(mob/living/carbon/L) @@ -1121,6 +1147,8 @@ addiction_decay_rate = 0.1 //very low to force them to take time off of meth taste_description = "wiper fluid" var/tenacity = 1.5 // higher is worse + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/lube/ultra/on_mob_add(mob/living/L) ADD_TRAIT(L, TRAIT_GOTTAGOFAST, id) @@ -1184,6 +1212,8 @@ addiction_threshold = 5 addiction_decay_rate = 0.2 taste_description = "silicon" + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/surge/on_mob_life(mob/living/M) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 1db066db7dc0..28e66a573fd2 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -133,6 +133,8 @@ nutriment_factor = 2 * REAGENTS_METABOLISM color = "#792300" // rgb: 121, 35, 0 taste_description = "soy" + goal_department = "Kitchen" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/ketchup name = "Ketchup" @@ -150,6 +152,8 @@ reagent_state = LIQUID color = "#DFDFDF" // rgb: 223, 223, 223 taste_description = "mayonnaise" + goal_department = "Kitchen" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/consumable/peanutbutter name = "Peanut Butter" @@ -169,6 +173,8 @@ color = "#78280A" // rbg: 120, 40, 10 taste_mult = 2.5 taste_description = "smokey sweetness" + goal_department = "Kitchen" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/capsaicin name = "Capsaicin Oil" @@ -372,6 +378,8 @@ nutriment_factor = 10 * REAGENTS_METABOLISM color = "#DBCF5C" //rgb: 219, 207, 92 taste_description = "olive oil" + goal_department = "Kitchen" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/cornoil/reaction_turf(turf/simulated/T, volume) if(!istype(T)) @@ -393,6 +401,8 @@ reagent_state = LIQUID color = "#282314" // rgb: 54, 94, 48 taste_description = "sweetness" + goal_department = "Kitchen" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/consumable/dry_ramen name = "Dry Ramen" @@ -778,6 +788,8 @@ reagent_state = LIQUID color = "#B4641B" taste_description = "gravy" + goal_department = "Kitchen" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/consumable/wasabi name = "Wasabi" @@ -1014,3 +1026,5 @@ description = "Useful for pickling, or putting on chips." taste_description = "vinegar" color = "#ffffff" + goal_department = "Kitchen" + goal_difficulty = REAGENT_GOAL_NORMAL diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 9ba2163d191a..5e779a760704 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -3,6 +3,7 @@ id = "medicine" taste_description = "bitterness" harmless = TRUE + goal_department = "Medbay" /datum/reagent/medicine/on_mob_life(mob/living/M) current_cycle++ @@ -22,6 +23,7 @@ metabolization_rate = 0.3 // Lasts 1.5 minutes for 15 units shock_reduction = 200 taste_description = "numbness" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/medicine/hydrocodone/on_mob_life(mob/living/M) //Needed so the hud updates when injested / removed from system var/update_flags = STATUS_UPDATE_HEALTH @@ -34,6 +36,7 @@ reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 taste_description = "antiseptic" + goal_difficulty = REAGENT_GOAL_EASY //makes you squeaky clean /datum/reagent/medicine/sterilizine/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume) @@ -97,6 +100,7 @@ reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 taste_description = "nurturing" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/medicine/mitocholide/on_mob_life(mob/living/M) if(ishuman(M)) @@ -124,6 +128,7 @@ color = "#0000C8" // rgb: 200, 165, 220 heart_rate_decrease = 1 taste_description = "a safe refuge" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/medicine/cryoxadone/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume, show_message = TRUE) if(iscarbon(M)) @@ -161,6 +166,7 @@ overdose_threshold = 30 harmless = FALSE taste_description = "reformation" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/medicine/rezadone/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -190,6 +196,7 @@ color = "#0AB478" metabolization_rate = 0.2 taste_description = "antibiotics" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/medicine/spaceacillin/on_mob_life(mob/living/M) var/list/organs_list = list() @@ -223,6 +230,7 @@ penetrates_skin = TRUE metabolization_rate = 0.15 taste_description = "salt" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -286,6 +294,7 @@ color = "#FFEBEB" penetrates_skin = TRUE taste_description = "blood" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/medicine/heal_on_apply/synthflesh/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume, show_message = 1) var/mob/living/carbon/human/H = M @@ -320,6 +329,7 @@ metabolization_rate = 3 harmless = FALSE taste_description = "wound cream" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/medicine/heal_on_apply/styptic_powder/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -353,6 +363,7 @@ metabolization_rate = 3 harmless = FALSE //toxic if ingested, and I am NOT going to account for the difference taste_description = "burn cream" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/medicine/heal_on_apply/silver_sulfadiazine/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -383,6 +394,7 @@ reagent_state = LIQUID color = "#000000" taste_description = "dust" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/medicine/charcoal/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -464,6 +476,7 @@ metabolization_rate = 0.8 harmless = FALSE taste_description = "a painful cleansing" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/medicine/calomel/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -483,6 +496,7 @@ reagent_state = LIQUID color = "#B4DCBE" taste_description = "cleansing" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/M) M.radiation = max(0, M.radiation - 25) @@ -496,6 +510,7 @@ color = "#C8A5DC" harmless = FALSE taste_description = "a purge" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/medicine/pen_acid/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -521,6 +536,7 @@ overdose_threshold = 25 harmless = FALSE taste_description = "relief" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/medicine/sal_acid/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -555,6 +571,7 @@ color = "#00FFFF" metabolization_rate = 0.2 taste_description = "safety" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/medicine/salbutamol/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -576,6 +593,7 @@ addiction_threshold = 10 harmless = FALSE taste_description = "oxygenation" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/medicine/perfluorodecalin/on_mob_life(mob/living/carbon/human/M) var/update_flags = STATUS_UPDATE_NONE @@ -601,6 +619,7 @@ overdose_threshold = 35 harmless = FALSE taste_description = "stimulation" + goal_difficulty = REAGENT_GOAL_HARD //super weak antistun chem, barely any downside /datum/reagent/medicine/ephedrine/on_mob_life(mob/living/M) @@ -656,6 +675,7 @@ overdose_threshold = 35 harmless = FALSE taste_description = "antihistamine" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/M) M.AdjustJitter(-40 SECONDS) @@ -743,6 +763,7 @@ reagent_state = LIQUID color = "#C8A5DC" taste_description = "clarity" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/medicine/oculine/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -775,6 +796,7 @@ overdose_threshold = 25 harmless = FALSE taste_description = "a moment of respite" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/medicine/atropine/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -804,6 +826,7 @@ overdose_threshold = 20 harmless = FALSE taste_description = "borrowed time" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/medicine/epinephrine/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -856,6 +879,7 @@ taste_description = "life" harmless = FALSE var/revive_type = SENTIENCE_ORGANIC //So you can't revive boss monsters or robots with it + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/medicine/lazarus_reagent/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -926,6 +950,7 @@ taste_description = "coppery fuel" harmless = FALSE overdose_threshold = 15 + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/medicine/sanguine_reagent/on_mob_life(mob/living/M) if(!ishuman(M)) @@ -981,6 +1006,7 @@ taste_description = "chunky marrow" harmless = FALSE overdose_threshold = 30 //so a single shotgun dart can't cause the tumor effect + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/medicine/osseous_reagent/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -1004,6 +1030,7 @@ description = "Mannitol is a sugar alcohol that can help alleviate cranial swelling." color = "#D1D1F1" taste_description = "sweetness" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/medicine/mannitol/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -1016,6 +1043,7 @@ description = "Mutadone is an experimental bromide that can cure genetic abnomalities." color = "#5096C8" taste_description = "cleanliness" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/human/M) if(M.mind && M.mind.assigned_role == "Cluwne") // HUNKE @@ -1045,6 +1073,7 @@ description = "A medicine which quickly eliminates alcohol in the body." color = "#009CA8" taste_description = "sobriety" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/medicine/antihol/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -1160,6 +1189,7 @@ color = "#eee6da" overdose_threshold = 20 taste_description = "bitterness" + goal_difficulty = REAGENT_GOAL_HARD /datum/reagent/heparin/on_mob_life(mob/living/M) M.reagents.remove_reagent("cholesterol", 2) @@ -1200,6 +1230,7 @@ addiction_threshold = 10 overdose_threshold = 50 taste_description = "warmth and stability" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/medicine/teporone/on_mob_life(mob/living/M) if(M.bodytemperature > 310) @@ -1217,6 +1248,7 @@ taste_description = "stability" harmless = FALSE var/list/drug_list = list("crank", "methamphetamine", "space_drugs", "synaptizine", "psilocybin", "ephedrine", "epinephrine", "stimulants", "stimulative_agent", "bath_salts", "lsd", "thc", "mephedrone") + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/medicine/haloperidol/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -1246,6 +1278,7 @@ metabolization_rate = 0.1 harmless = FALSE taste_description = "sleepiness" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/medicine/ether/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -1326,6 +1359,7 @@ color = "#CC7A00" process_flags = SYNTHETIC taste_description = "overclocking" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/medicine/degreaser/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -1354,6 +1388,7 @@ color = "#D7B395" process_flags = SYNTHETIC taste_description = "heavy metals" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/medicine/liquid_solder/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index 8e0d0b7f3ff8..5b2d97525360 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -182,6 +182,8 @@ metabolization_rate = 0.3 taste_mult = 0.9 taste_description = "slime" + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/mutagen/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume) if(!M || !M.dna || HAS_TRAIT(M, TRAIT_BADDNA) || HAS_TRAIT(M, TRAIT_GENELESS)) @@ -279,6 +281,8 @@ process_flags = ORGANIC | SYNTHETIC taste_description = "ACID" var/acidpwr = 10 //the amount of protection removed from the armour + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/acid/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -336,6 +340,8 @@ description = "Fluorosulfuric acid is a an extremely corrosive super-acid." color = "#5050FF" acidpwr = 42 + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/acid/facid/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -389,6 +395,8 @@ color = "#0080ff" reagent_state = LIQUID taste_description = "vinegar" + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/acetic_acid/reaction_mob(mob/living/carbon/human/H, method = REAGENT_TOUCH, volume) if(method != REAGENT_TOUCH) @@ -588,6 +596,8 @@ color = "#B44B00" penetrates_skin = TRUE taste_description = "bitterness" + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/formaldehyde/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -604,6 +614,8 @@ color = "#B44B00" penetrates_skin = TRUE taste_description = "apples" + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/acetaldehyde/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -645,6 +657,8 @@ color = "#60A584" metabolization_rate = 1 taste_mult = 0 + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_EASY /datum/reagent/neurotoxin2/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -685,6 +699,8 @@ metabolization_rate = 0.1 penetrates_skin = TRUE taste_description = "almonds" + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/cyanide/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -710,6 +726,8 @@ metabolization_rate = 0.3 penetrates_skin = TRUE taste_description = "prickliness" + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_NORMAL /datum/reagent/itching_powder/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_STAT @@ -1083,6 +1101,8 @@ reagent_state = LIQUID color = "#773E73" //RGB: 47 24 45 lethality = 2 //Atrazine, however, is definitely toxic + goal_department = "Science" + goal_difficulty = REAGENT_GOAL_EASY /// To-Do; make this more realistic. diff --git a/code/modules/reagents/chemistry/reagents_datum.dm b/code/modules/reagents/chemistry/reagents_datum.dm index 90cb9a79e576..2b4fbe56263d 100644 --- a/code/modules/reagents/chemistry/reagents_datum.dm +++ b/code/modules/reagents/chemistry/reagents_datum.dm @@ -38,6 +38,13 @@ /// how quickly the addiction threshold var decays var/addiction_decay_rate = 0.01 + // Which department's (if any) reagent goals this is eligible for. + // Must match the values used by request consoles. + var/goal_department = "Unknown" + // How difficult is this chemical for the department to make? + // Affects the quantity of the reagent that is requested by CC. + var/goal_difficulty = REAGENT_GOAL_SKIP + /datum/reagent/Destroy() . = ..() holder = null diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index 1299016a5a7d..0777506e95e0 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -82,23 +82,20 @@ GLOBAL_LIST_EMPTY(message_servers) /obj/machinery/message_server/proc/send_pda_message(recipient = "", sender = "", message = "") pda_msgs += new/datum/data_pda_msg(recipient,sender,message) -/obj/machinery/message_server/proc/send_rc_message(recipient = "", sender = "", message = "", stamp = "", id_auth = "", priority = 1) +/obj/machinery/message_server/proc/send_rc_message(recipient = "", sender = "", message = list(), stamp = "Not stamped", id_auth = "Not verified", priority = 1) + if(!islist(message)) + message = list(message) rc_msgs += new/datum/data_rc_msg(recipient,sender,message,stamp,id_auth) - var/authmsg = "[message]" - if(id_auth) - authmsg += " - [id_auth]" - if(stamp) - authmsg += " - [stamp]" for(var/C in GLOB.allRequestConsoles) var/obj/machinery/requests_console/RC = C if(ckey(RC.department) == ckey(recipient)) var/title switch(priority) if(2) - title = "PRIORITY Alert in [sender]" + title = "PRIORITY Alert from [sender]" else title = "Message from [sender]" - RC.createMessage(sender, title, authmsg, priority) + RC.createMessage(sender, title, message, priority, verified = id_auth, stamped = stamp) /obj/machinery/message_server/attack_hand(user as mob) to_chat(user, "You toggle PDA message passing from [active ? "On" : "Off"] to [active ? "Off" : "On"]") diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index a11c6174ed47..021265fd716e 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -284,7 +284,7 @@ //this is a hook for custom behaviour. Maybe at some point we could add checks to see if engines are intact /obj/docking_port/mobile/proc/canMove() - return 0 //0 means we can move + return TRUE // TRUE means we can move. Why would it ever be otherwise? //this is to check if this shuttle can physically dock at dock S /obj/docking_port/mobile/proc/canDock(obj/docking_port/stationary/S) @@ -450,7 +450,7 @@ if(!check_dock(S1)) return -1 - if(canMove()) + if(!canMove()) return -1 var/obj/docking_port/stationary/S0 = get_docked() diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index a15863a3866b..9fcc73e6fc6d 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -1,5 +1,12 @@ #define MAX_CRATE_DELIVERY 40 +#define CARGO_OK 0 +#define CARGO_PREVENT_SHUTTLE 1 +#define CARGO_SKIP_ATOM 2 +#define CARGO_REQUIRE_PRIORITY 3 +#define CARGO_HAS_PRIORITY 4 + + /obj/docking_port/mobile/supply name = "supply shuttle" id = "supply" @@ -10,45 +17,57 @@ dwidth = 5 height = 7 + // The list of things that can't be sent to CC. + var/list/blacklist = list( + "living creatures" = list( + /mob/living, + /obj/structure/blob, + /obj/structure/spider/spiderling, + /obj/machinery/clonepod, + /obj/item/paicard), + "classified nuclear weaponry" = list( + /obj/item/disk/nuclear, + /obj/machinery/nuclearbomb), + "homing beacons" = list( + /obj/item/radio/beacon, + /obj/machinery/quantumpad, + /obj/machinery/teleport/station, + /obj/machinery/teleport/hub, + /obj/machinery/telepad, + /obj/machinery/telepad_cargo, + /obj/structure/extraction_point), + "high-energy objects" = list( + /obj/singularity, + /obj/machinery/the_singularitygen, + /obj/effect/hierophant, + /obj/item/warp_cube), + "undelivered mail" = list(/obj/item/envelope)) + + // The current manifest of what's on the shuttle. + var/datum/economy/cargo_shuttle_manifest/manifest = new + + // The auto-registered simple_seller instances. + var/list/simple_sellers = list() + + // The item preventing this shuttle from going to CC. + var/blocking_item = "ERR_UNKNOWN" + +/obj/docking_port/mobile/supply/Initialize() + ..() + for(var/T in subtypesof(/datum/economy/simple_seller)) + var/datum/economy/simple_seller/seller = new T + simple_sellers += seller + seller.register(src) + /obj/docking_port/mobile/supply/register() if(!..()) return FALSE SSshuttle.supply = src return TRUE -/obj/docking_port/mobile/supply/proc/forbidden_atoms_check(atom/A) - var/list/blacklist = list( - /mob/living, - /obj/structure/blob, - /obj/structure/spider/spiderling, - /obj/item/disk/nuclear, - /obj/machinery/nuclearbomb, - /obj/item/radio/beacon, - /obj/machinery/the_singularitygen, - /obj/singularity, - /obj/machinery/teleport/station, - /obj/machinery/teleport/hub, - /obj/machinery/telepad, - /obj/machinery/telepad_cargo, - /obj/machinery/clonepod, - /obj/effect/hierophant, - /obj/item/warp_cube, - /obj/machinery/quantumpad, - /obj/structure/extraction_point, - /obj/item/envelope, - /obj/item/paicard) - if(A) - if(is_type_in_list(A, blacklist)) - return TRUE - for(var/thing in A) - if(.(thing)) - return TRUE - - return FALSE - /obj/docking_port/mobile/supply/canMove() if(is_station_level(z)) - return forbidden_atoms_check(areaInstance) + return scan_cargo() return ..() /obj/docking_port/mobile/supply/request(obj/docking_port/stationary/S) @@ -56,27 +75,30 @@ return 2 return ..() -/obj/docking_port/mobile/supply/dock() +/obj/docking_port/mobile/supply/dock(port) . = ..() if(.) return - buy() - sell() + if(istype(port, /obj/docking_port/stationary/transit)) + // Ignore transit ports. + return -/obj/docking_port/mobile/supply/proc/buy() - if(!is_station_level(z)) //we only buy when we are -at- the station - return 1 + if(is_station_level(z)) + // Buy when arriving at the station. + buy() + if(z == level_name_to_num(CENTCOMM)) + // Sell when arriving at CentComm. + sell() + +/obj/docking_port/mobile/supply/proc/buy() for(var/datum/supply_order/order as anything in SSeconomy.shopping_list) if(length(SSeconomy.delivery_list) >= MAX_CRATE_DELIVERY) break SSeconomy.delivery_list += order SSeconomy.shopping_list -= order - if(!length(SSeconomy.delivery_list)) - return 2 - var/list/emptyTurfs = list() for(var/turf/simulated/T in areaInstance) if(T.density) @@ -108,151 +130,673 @@ SSeconomy.delivery_list.Cut() -/obj/docking_port/mobile/supply/proc/sell() - if(z != level_name_to_num(CENTCOMM)) //we only sell when we are -at- centcomm - return 1 + for(var/datum/station_goal/secondary/SG in SSticker.mode.secondary_goals) + if(!SG.should_send_crate) + continue + + var/turf/T = pick_n_take(emptyTurfs) //turf we will place it in + if(!T) + break - var/plasma_count = 0 - var/intel_count = 0 - var/crate_count = 0 - var/total_crate_value = 0 + var/obj/structure/closet/crate/secure/personal/PC = new(T) + if(SG.requester_name) + PC.name = "goal crate ([SG.requester_name] in [SG.department])" + PC.desc = "This personal crate has been configured by CC for [SG.requester_name]'s use in completing the secondary goal [SG.name]." + PC.registered_name = SG.requester_name + else + PC.name = "goal crate (Unknown in [SG.department])" + PC.locked = FALSE + PC.update_icon() + + SG.should_send_crate = FALSE + +/obj/docking_port/mobile/supply/proc/scan_cargo() + manifest = new + SEND_SIGNAL(src, COMSIG_CARGO_BEGIN_SCAN) + for(var/atom/movable/AM in areaInstance) + if(deep_scan(AM, TRUE) == CARGO_PREVENT_SHUTTLE) + return FALSE + return TRUE - var/msg = "
---[station_time_timestamp()]---

" - var/credits_to_deposit = 0 - var/research_credits = 0 - var/service_credits = 0 - var/medical_credits = 0 +/obj/docking_port/mobile/supply/proc/deep_scan(atom/movable/AM, top_level = FALSE) + var/handling = prefilter_atom(AM) + if(handling == CARGO_PREVENT_SHUTTLE) + return CARGO_PREVENT_SHUTTLE + + var/found_priority = FALSE + for(var/atom/movable/child in AM) + var/child_handling = deep_scan(child) + if(child_handling == CARGO_PREVENT_SHUTTLE) + return CARGO_PREVENT_SHUTTLE + if(child_handling == CARGO_HAS_PRIORITY) + found_priority = TRUE + + if(handling != CARGO_SKIP_ATOM) + if(handling == CARGO_REQUIRE_PRIORITY && !found_priority) + blocking_item = "locked containers that don't contain goal items ([AM])" + return CARGO_PREVENT_SHUTTLE + var/sellable = SEND_SIGNAL(src, COMSIG_CARGO_CHECK_SELL, AM) + manifest.items_to_sell[AM] = sellable + if(top_level && !(sellable & COMSIG_CARGO_IS_SECURED)) + manifest.loose_cargo = TRUE + if(sellable & COMSIG_CARGO_SELL_PRIORITY) + if(top_level) + return CARGO_OK + return CARGO_HAS_PRIORITY + + return CARGO_OK + +/obj/docking_port/mobile/supply/proc/prefilter_atom(atom/movable/AM) + for(var/reason in blacklist) + if(is_type_in_list(AM, blacklist[reason])) + blocking_item = "[reason] ([AM])" + return CARGO_PREVENT_SHUTTLE + + if(istype(AM, /obj/structure/largecrate)) + blocking_item = "unopened large crates ([AM])" + return CARGO_PREVENT_SHUTTLE + + if(istype(AM, /obj/structure/closet/crate)) + var/obj/structure/closet/crate/C = AM + if(C.manifest) + blocking_item = "crates with their manifest still attached ([AM])" + return CARGO_PREVENT_SHUTTLE + + if(istype(AM, /obj/structure/closet/crate/secure)) + var/obj/structure/closet/crate/secure/SC = AM + if(SC.locked) + return CARGO_REQUIRE_PRIORITY + else if(istype(SC, /obj/structure/closet/crate/secure/personal)) + blocking_item = "unlocked personal crates ([AM])" + return CARGO_PREVENT_SHUTTLE + + if(istype(AM, /obj/item/storage/lockbox)) + var/obj/item/storage/lockbox/LB = AM + if(LB.locked) + return CARGO_REQUIRE_PRIORITY + + if(istype(AM, /obj/effect)) + var/obj/effect/E = AM + if(E.is_cleanable()) + return CARGO_OK + + if(AM.anchored && !istype(AM, /obj/mecha/working)) + return CARGO_SKIP_ATOM + + return CARGO_OK - for(var/atom/movable/MA in areaInstance) - if(MA.anchored) + +/obj/docking_port/mobile/supply/proc/sell() + SEND_SIGNAL(src, COMSIG_CARGO_BEGIN_SELL) + SSeconomy.sold_atoms = list() + var/list/qdel_atoms = list() + var/list/rescue_atoms = list() + for(var/atom/movable/AM in manifest.items_to_sell) + var/sellable = manifest.items_to_sell[AM] + if(sellable & COMSIG_CARGO_SELL_PRIORITY) + SEND_SIGNAL(src, COMSIG_CARGO_DO_PRIORITY_SELL, AM, manifest) + SSeconomy.sold_atoms += "[AM.name](priority)" + qdel_atoms += AM + continue + else if(sellable & COMSIG_CARGO_SELL_NORMAL) + SEND_SIGNAL(src, COMSIG_CARGO_DO_SELL, AM, manifest) + SSeconomy.sold_atoms += "[AM.name](normal)" + qdel_atoms += AM continue - if(istype(MA, /mob/dead)) + else if(sellable & COMSIG_CARGO_SELL_WRONG) + SEND_SIGNAL(src, COMSIG_CARGO_SEND_ERROR, AM, manifest) + SSeconomy.sold_atoms += "[AM.name](error)" + qdel_atoms += AM continue - if(istype(MA, /obj/structure/closet/crate/mail)) + else if(sellable & COMSIG_CARGO_MESS) + manifest.messy_shuttle = TRUE + SSeconomy.sold_atoms += "[AM.name](mess)" + qdel_atoms += AM continue - SSeconomy.sold_atoms += " [MA.name]" - - // Must be in a crate (or a critter crate)! - if(istype(MA, /obj/structure/closet/crate) || istype(MA, /obj/structure/closet/critter)) - SSeconomy.sold_atoms += ":" - if(!length(MA.contents)) - SSeconomy.sold_atoms += " (empty)" - if(istype(MA, /obj/structure/closet/crate)) - var/obj/structure/closet/crate/exported_crate = MA - total_crate_value += exported_crate.crate_value - else - total_crate_value += DEFAULT_CRATE_VALUE - crate_count++ - - var/find_slip = TRUE - for(var/thing in MA) - // Sell manifests - SSeconomy.sold_atoms += " [thing:name]" - if(find_slip && istype(thing,/obj/item/paper/manifest)) - var/obj/item/paper/manifest/slip = thing - credits_to_deposit += SSeconomy.credits_per_manifest - msg += "+[SSeconomy.credits_per_manifest]: Package [slip.ordernumber] accorded.
" - - // Sell plasma - if(istype(thing, /obj/item/stack/sheet/mineral/plasma)) - var/obj/item/stack/sheet/mineral/plasma/P = thing - plasma_count += P.amount - - // Sell syndicate intel - if(istype(thing, /obj/item/documents/syndicate)) - ++intel_count - - // Sell tech levels - if(istype(thing, /obj/item/disk/tech_disk)) - var/obj/item/disk/tech_disk/disk = thing - if(!disk.stored) - continue - var/datum/tech/tech = disk.stored - - var/cost = tech.getCost(SSeconomy.tech_levels[tech.id]) - if(cost) - SSeconomy.tech_levels[tech.id] = tech.level - research_credits += cost / 2 - credits_to_deposit += cost / 2 - msg += "+[cost]: [tech.name] - new data.
" - - // Sell designs - if(istype(thing, /obj/item/disk/design_disk)) - var/obj/item/disk/design_disk/disk = thing - if(!disk.blueprint) - continue - var/datum/design/design = disk.blueprint - if(design.id in SSeconomy.research_designs) - continue - credits_to_deposit += SSeconomy.credits_per_design - SSeconomy.research_designs += design.id - msg += "+[SSeconomy.credits_per_design]: [design.name] design.
" - - // Sell viral sample virology goals, those in vial lockboxes included - if(istype(thing, /obj/item/reagent_containers) || istype(thing, /obj/item/storage/lockbox/vials)) - var/list/sold_containers = list() - if(istype(thing, /obj/item/reagent_containers)) - sold_containers += thing - if(istype(thing, /obj/item/storage/lockbox/vials)) - for(var/obj/item/reagent_containers/C in thing) - sold_containers += C - for(var/obj/item/reagent_containers/C in sold_containers) - if(C.reagents?.reagent_list) - for(var/datum/virology_goal/G in GLOB.virology_goals) - if(G.completed) - continue - if(G.check_completion(C.reagents.reagent_list)) - medical_credits += SSeconomy.credits_per_virology_goal - msg += "+[SSeconomy.credits_per_virology_goal]: [G.name] completion.
" - - // Sell exotic plants - if(istype(thing, /obj/item/seeds)) - var/obj/item/seeds/S = thing - if(S.rarity == 0) // Mundane species - msg += "+0: We don't need samples of mundane species \"[capitalize(S.species)]\".
" - else if(SSeconomy.discovered_plants[S.type]) // This species has already been sent to CentComm - var/potDiff = S.potency - SSeconomy.discovered_plants[S.type] // Compare it to the previous best - if(potDiff > 0) // This sample is better - SSeconomy.discovered_plants[S.type] = S.potency - msg += "+[potDiff]: New sample of \"[capitalize(S.species)]\" is superior. Good work.
" - service_credits += potDiff / 2 - credits_to_deposit += potDiff / 2 - else // This sample is worthless - msg += "+0: New sample of \"[capitalize(S.species)]\" is not more potent than existing sample ([SSeconomy.discovered_plants[S.type]] potency).
" - else // This is a new discovery! - SSeconomy.discovered_plants[S.type] = S.potency - msg += "[S.rarity]: New species discovered: \"[capitalize(S.species)]\". Excellent work.
" - service_credits += S.rarity / 2 // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later - credits_to_deposit += S.rarity / 2 - - if(istype(thing, /obj/item/organ/internal/alien)) - var/obj/item/organ/internal/alien/organ = thing - credits_to_deposit += organ.cargo_profit - qdel(MA) - SSeconomy.sold_atoms += "." - - if(plasma_count > 0) - var/credits_from_plasma = plasma_count * SSeconomy.credits_per_plasma - msg += "+[credits_from_plasma]: Received [plasma_count] unit(s) of exotic material.
" - credits_to_deposit += credits_from_plasma - - if(intel_count > 0) - var/credits_from_intel = intel_count * SSeconomy.credits_per_intel - msg += "+[credits_from_intel]: Received [intel_count] article(s) of enemy intelligence.
" - credits_to_deposit += credits_from_intel - - if(crate_count > 0) - msg += "+[total_crate_value]: Received [crate_count] crate(s).
" - credits_to_deposit += total_crate_value + else if(!(sellable & COMSIG_CARGO_SELL_SKIP)) + manifest.sent_trash = TRUE + + rescue_atoms += AM + + for(var/atom/movable/AM in rescue_atoms) + if(AM.loc in qdel_atoms) + AM.forceMove(get_turf(AM)) + + for(var/AM in qdel_atoms) + qdel(AM) + + SEND_SIGNAL(src, COMSIG_CARGO_END_SELL, manifest) + + SSblackbox.record_feedback("amount", "cargo shipments", 1) + + if(manifest.loose_cargo) + var/datum/economy/line_item/item = new + item.account = SSeconomy.cargo_account + item.credits = SSeconomy.fine_for_loose_cargo + item.reason = "Please remember to secure all items in crates." + manifest.line_items += item + SSblackbox.record_feedback("nested tally", "cargo fines", 1, list("loose cargo", "amount")) + SSblackbox.record_feedback("nested tally", "cargo fines", SSeconomy.fine_for_loose_cargo, list("loose cargo", "credits")) + if(manifest.messy_shuttle) + var/datum/economy/line_item/item = new + item.account = SSeconomy.cargo_account + item.credits = SSeconomy.fine_for_messy_shuttle + item.reason = "Shuttle cleaning fee." + manifest.line_items += item + SSblackbox.record_feedback("nested tally", "cargo fines", 1, list("messy shuttle", "amount")) + SSblackbox.record_feedback("nested tally", "cargo fines", SSeconomy.fine_for_messy_shuttle, list("messy shuttle", "credits")) + if(manifest.sent_trash) + var/datum/economy/line_item/item = new + item.account = SSeconomy.cargo_account + item.credits = SSeconomy.fine_for_selling_trash + item.reason = "Don't send us random junk." + manifest.line_items += item + SSblackbox.record_feedback("nested tally", "cargo fines", 1, list("sent trash", "amount")) + SSblackbox.record_feedback("nested tally", "cargo fines", SSeconomy.fine_for_selling_trash, list("sent trash", "credits")) + + var/msg = "
---[station_time_timestamp()]---

" + + var/list/credit_changes = list() + for(var/datum/economy/line_item/item in manifest.line_items) + if(!credit_changes[item.account]) + credit_changes[item.account] = 0 + credit_changes[item.account] += item.credits + + if(item.credits > 0) + msg += "[item.account.account_name] +[item.credits]: [item.reason]
" + else if(item.credits == 0) + msg += "[item.account.account_name] Notice: [item.reason]
" + else + msg += "[item.account.account_name] [item.credits]: [item.reason]
" + + for(var/datum/money_account/account in credit_changes) + if(account.account_type == ACCOUNT_TYPE_DEPARTMENT) + SSblackbox.record_feedback("tally", "cargo profits", credit_changes[account], "[account.account_name]") + else + SSblackbox.record_feedback("tally", "cargo profits", credit_changes[account], "All personal accounts") + + if(credit_changes[account] > 0) + GLOB.station_money_database.credit_account(account, credit_changes[account], "Supply Shuttle Exports Payment", "Central Command Supply Master", supress_log = FALSE) + else + GLOB.station_money_database.charge_account(account, -credit_changes[account], "Supply Shuttle Fine", "Central Command Supply Master", allow_overdraft = TRUE, supress_log = FALSE) SSeconomy.centcom_message += "[msg]
" - if(credits_to_deposit > 0) - GLOB.station_money_database.credit_account(SSeconomy.cargo_account, credits_to_deposit, "Supply Shuttle Exports Payment", "Central Command Supply Master", supress_log = FALSE) - if(research_credits) - GLOB.station_money_database.credit_account(GLOB.station_money_database.get_account_by_department(DEPARTMENT_SCIENCE), research_credits, "Supply Shuttle Exports Payment", "Central Command Supply Master", supress_log = FALSE) - if(service_credits) - GLOB.station_money_database.credit_account(GLOB.station_money_database.get_account_by_department(DEPARTMENT_SERVICE), service_credits, "Supply Shuttle Exports Payment", "Central Command Supply Master", supress_log = FALSE) - if(medical_credits) - GLOB.station_money_database.credit_account(GLOB.station_money_database.get_account_by_department(DEPARTMENT_MEDICAL), medical_credits, "Supply Shuttle Exports Payment", "Central Command Supply Master", supress_log = FALSE) + manifest = new + + +// Convenience object that registers itself with the supply shuttle and provides +// methods for you to override. +/datum/economy/simple_seller + +/datum/economy/simple_seller/proc/register(obj/docking_port/mobile/supply/S) + RegisterSignal(S, COMSIG_CARGO_BEGIN_SCAN, PROC_REF(begin_scan)) + RegisterSignal(S, COMSIG_CARGO_CHECK_SELL, PROC_REF(check_sell)) + RegisterSignal(S, COMSIG_CARGO_BEGIN_SELL, PROC_REF(begin_sell)) + RegisterSignal(S, COMSIG_CARGO_DO_PRIORITY_SELL, PROC_REF(sell_priority)) + RegisterSignal(S, COMSIG_CARGO_DO_SELL, PROC_REF(sell_normal)) + RegisterSignal(S, COMSIG_CARGO_SEND_ERROR, PROC_REF(sell_wrong)) + RegisterSignal(S, COMSIG_CARGO_END_SELL, PROC_REF(end_sell)) + +/datum/economy/simple_seller/proc/begin_scan(obj/docking_port/mobile/supply/S) + SIGNAL_HANDLER // COMSIG_CARGO_BEGIN_SCAN + return + +/datum/economy/simple_seller/proc/check_sell(obj/docking_port/mobile/supply/S, atom/movable/AM) + SIGNAL_HANDLER // COMSIG_CARGO_CHECK_SELL + return NONE + +/datum/economy/simple_seller/proc/begin_sell(obj/docking_port/mobile/supply/S) + SIGNAL_HANDLER // COMSIG_CARGO_BEGIN_SELL + return + +/datum/economy/simple_seller/proc/sell_priority(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + SIGNAL_HANDLER // COMSIG_CARGO_DO_PRIORITY_SELL + return check_sell(S, AM) & COMSIG_CARGO_SELL_PRIORITY + +/datum/economy/simple_seller/proc/sell_normal(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + SIGNAL_HANDLER // COMSIG_CARGO_DO_SELL + return check_sell(S, AM) & COMSIG_CARGO_SELL_NORMAL + +/datum/economy/simple_seller/proc/sell_wrong(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + SIGNAL_HANDLER // COMSIG_CARGO_SEND_ERROR + return check_sell(S, AM) & COMSIG_CARGO_SELL_WRONG + +/datum/economy/simple_seller/proc/end_sell(obj/docking_port/mobile/supply/S, datum/economy/cargo_shuttle_manifest/manifest) + SIGNAL_HANDLER // COMSIG_CARGO_END_SELL + return + + +/datum/economy/simple_seller/crates + var/crates = 0 + var/credits = 0 + +/datum/economy/simple_seller/crates/begin_sell(obj/docking_port/mobile/supply/S) + crates = 0 + credits = 0 + +/datum/economy/simple_seller/crates/check_sell(obj/docking_port/mobile/supply/S, AM) + if(istype(AM, /obj/structure/closet/crate) || istype(AM, /obj/structure/closet/critter) || istype(AM, /obj/structure/closet/crate/mail)) + return COMSIG_CARGO_SELL_NORMAL | COMSIG_CARGO_IS_SECURED + +/datum/economy/simple_seller/crates/sell_normal(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + if(!..()) + return + + crates += 1 + if(istype(AM, /obj/structure/closet/crate)) + var/obj/structure/closet/crate/exported_crate = AM + credits += exported_crate.crate_value + else + credits += DEFAULT_CRATE_VALUE + +/datum/economy/simple_seller/crates/end_sell(obj/docking_port/mobile/supply/S, datum/economy/cargo_shuttle_manifest/manifest) + if(!credits) + return + var/datum/economy/line_item/item = new + item.account = SSeconomy.cargo_account + item.credits = credits + item.reason = "Returned [crates] crate(s)." + manifest.line_items += item + SSblackbox.record_feedback("tally", "cargo crates sold", crates, "amount") + SSblackbox.record_feedback("tally", "cargo crates sold", item.credits, "credits") + + +/datum/economy/simple_seller/plasma + var/plasma = 0 + +/datum/economy/simple_seller/plasma/begin_sell(obj/docking_port/mobile/supply/S) + plasma = 0 + +/datum/economy/simple_seller/plasma/check_sell(obj/docking_port/mobile/supply/S, atom/movable/AM) + if(istype(AM, /obj/item/stack/sheet/mineral/plasma)) + return COMSIG_CARGO_SELL_NORMAL + +/datum/economy/simple_seller/plasma/sell_normal(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + if(!..()) + return + + var/obj/item/stack/sheet/mineral/plasma/P = AM + plasma += P.amount + +/datum/economy/simple_seller/plasma/end_sell(obj/docking_port/mobile/supply/S, datum/economy/cargo_shuttle_manifest/manifest) + if(!plasma) + return + var/datum/economy/line_item/item = new + item.account = SSeconomy.cargo_account + item.credits = plasma * SSeconomy.credits_per_plasma + item.reason = "Received [plasma] unit(s) of exotic material." + manifest.line_items += item + SSblackbox.record_feedback("tally", "cargo plasma sold", plasma, "amount") + SSblackbox.record_feedback("tally", "cargo plasma sold", item.credits, "credits") + + +/datum/economy/simple_seller/intel + var/intel = 0 + +/datum/economy/simple_seller/intel/begin_sell(obj/docking_port/mobile/supply/S) + intel = 0 + +/datum/economy/simple_seller/intel/check_sell(obj/docking_port/mobile/supply/S, atom/movable/AM) + if(istype(AM, /obj/item/documents/syndicate)) + return COMSIG_CARGO_SELL_NORMAL + +/datum/economy/simple_seller/intel/sell_normal(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + if(!..()) + return + + intel++ + +/datum/economy/simple_seller/intel/end_sell(obj/docking_port/mobile/supply/S, datum/economy/cargo_shuttle_manifest/manifest) + if(!intel) + return + var/datum/economy/line_item/item = new + item.account = SSeconomy.cargo_account + item.credits = intel * SSeconomy.credits_per_intel + item.reason = "Received [intel] article(s) of enemy intelligence." + manifest.line_items += item + SSblackbox.record_feedback("tally", "cargo intel sold", intel, "amount") + SSblackbox.record_feedback("tally", "cargo intel sold", item.credits, "credits") + + +/datum/economy/simple_seller/alien_organs + +/datum/economy/simple_seller/alien_organs/check_sell(obj/docking_port/mobile/supply/S, atom/movable/AM) + if(istype(AM, /obj/item/organ/internal/alien)) + return COMSIG_CARGO_SELL_NORMAL + +/datum/economy/simple_seller/alien_organs/sell_normal(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + if(!..()) + return + + var/obj/item/organ/internal/alien/organ = AM + var/datum/economy/line_item/item = new + item.account = SSeconomy.cargo_account + item.credits = organ.cargo_profit + item.reason = "Received a sample of exotic biological tissue." + manifest.line_items += item + SSblackbox.record_feedback("tally", "cargo alien organs sold", 1, "amount") + SSblackbox.record_feedback("tally", "cargo alien organs sold", item.credits, "credits") + + +/datum/economy/simple_seller/shipping_manifests + +/datum/economy/simple_seller/shipping_manifests/check_sell(obj/docking_port/mobile/supply/S, atom/movable/AM) + if(istype(AM,/obj/item/paper/manifest)) + return COMSIG_CARGO_SELL_NORMAL + +/datum/economy/simple_seller/shipping_manifests/sell_normal(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + if(!..()) + return + + var/obj/item/paper/manifest/slip = AM + + var/datum/economy/line_item/item = new + item.account = SSeconomy.cargo_account + item.credits = SSeconomy.credits_per_manifest + item.reason = "Package [slip.ordernumber] accorded." + manifest.line_items += item + SSblackbox.record_feedback("tally", "cargo manifests sold", 1, "amount") + SSblackbox.record_feedback("tally", "cargo manifests sold", item.credits, "credits") + + +/datum/economy/simple_seller/tech_levels + var/list/temp_tech_levels + +/datum/economy/simple_seller/tech_levels/begin_scan(obj/docking_port/mobile/supply/S) + temp_tech_levels = SSeconomy.tech_levels.Copy() + +/datum/economy/simple_seller/tech_levels/begin_sell(obj/docking_port/mobile/supply/S) + temp_tech_levels = SSeconomy.tech_levels.Copy() + +/datum/economy/simple_seller/tech_levels/check_sell(obj/docking_port/mobile/supply/S, atom/movable/AM) + if(istype(AM, /obj/item/disk/tech_disk)) + var/obj/item/disk/tech_disk/disk = AM + if(!disk.stored) + return COMSIG_CARGO_SELL_WRONG + var/datum/tech/tech = disk.stored + + var/cost = tech.getCost(temp_tech_levels[tech.id]) + if(cost) + temp_tech_levels[tech.id] = tech.level + return COMSIG_CARGO_SELL_NORMAL + return COMSIG_CARGO_SELL_WRONG + +/datum/economy/simple_seller/tech_levels/sell_normal(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + if(!..()) + return + + var/obj/item/disk/tech_disk/disk = AM + if(!disk.stored) + return + var/datum/tech/tech = disk.stored + + var/cost = tech.getCost(SSeconomy.tech_levels[tech.id]) + if(!cost) + return + + SSeconomy.tech_levels[tech.id] = tech.level + SSblackbox.record_feedback("tally", "cargo tech disks sold", 1, "amount") + SSblackbox.record_feedback("tally", "cargo tech disks sold", cost, "credits") + + var/datum/economy/line_item/cargo_item = new + cargo_item.account = SSeconomy.cargo_account + cargo_item.credits = cost / 2 + cargo_item.reason = "[tech.name] - new data." + manifest.line_items += cargo_item + + var/datum/economy/line_item/science_item = new + science_item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SCIENCE) + science_item.credits = cost / 2 + science_item.reason = "[tech.name] - new data." + manifest.line_items += science_item + +/datum/economy/simple_seller/tech_levels/sell_wrong(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + if(!..()) + return + + var/datum/economy/line_item/item = new + item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SCIENCE) + item.credits = 0 + + var/obj/item/disk/tech_disk/disk = AM + if(!disk.stored) + item.reason = "Blank tech disk." + manifest.line_items += item + SSblackbox.record_feedback("tally", "cargo tech disks sold", 1, "blank") + return + + var/datum/tech/tech = disk.stored + var/cost = tech.getCost(SSeconomy.tech_levels[tech.id]) + if(!cost) + item.reason = "[tech.name] - no new data." + manifest.line_items += item + SSblackbox.record_feedback("tally", "cargo tech disks sold", 1, "repeat") + + +/datum/economy/simple_seller/designs + var/list/temp_designs + +/datum/economy/simple_seller/designs/begin_scan(obj/docking_port/mobile/supply/S) + temp_designs = SSeconomy.research_designs.Copy() + +/datum/economy/simple_seller/designs/begin_sell(obj/docking_port/mobile/supply/S) + temp_designs = SSeconomy.research_designs.Copy() + +/datum/economy/simple_seller/designs/check_sell(obj/docking_port/mobile/supply/S, atom/movable/AM) + if(istype(AM, /obj/item/disk/design_disk)) + var/obj/item/disk/design_disk/disk = AM + if(!disk.blueprint) + return COMSIG_CARGO_SELL_WRONG + var/datum/design/design = disk.blueprint + if(design.id in temp_designs) + return COMSIG_CARGO_SELL_WRONG + temp_designs += design.id + return COMSIG_CARGO_SELL_NORMAL + +/datum/economy/simple_seller/designs/sell_normal(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + if(!..()) + return + + var/obj/item/disk/design_disk/disk = AM + if(!disk.blueprint) + return + var/datum/design/design = disk.blueprint + if(design.id in SSeconomy.research_designs) + return + SSeconomy.research_designs += design.id + SSblackbox.record_feedback("tally", "cargo design disks sold", 1, "amount") + SSblackbox.record_feedback("tally", "cargo design disks sold", SSeconomy.credits_per_design, "credits") + + var/datum/economy/line_item/cargo_item = new + cargo_item.account = SSeconomy.cargo_account + cargo_item.credits = SSeconomy.credits_per_design / 2 + cargo_item.reason = "[design.name] design." + manifest.line_items += cargo_item + + var/datum/economy/line_item/science_item = new + science_item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SCIENCE) + science_item.credits = SSeconomy.credits_per_design / 2 + science_item.reason = "[design.name] design." + manifest.line_items += science_item + +/datum/economy/simple_seller/designs/sell_wrong(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + if(!..()) + return + + var/datum/economy/line_item/item = new + item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SCIENCE) + item.credits = 0 + + var/obj/item/disk/design_disk/disk = AM + if(!disk.blueprint) + item.reason = "Blank design disk." + manifest.line_items += item + SSblackbox.record_feedback("tally", "cargo design disks sold", 1, "blank") + return + var/datum/design/design = disk.blueprint + if(design.id in SSeconomy.research_designs) + item.reason = "Duplicate design for [design.name]." + manifest.line_items += item + SSblackbox.record_feedback("tally", "cargo design disks sold", 1, "repeat") + return + + +/datum/economy/simple_seller/seeds + var/list/temp_discovered + +/datum/economy/simple_seller/seeds/begin_scan(obj/docking_port/mobile/supply/S) + temp_discovered = SSeconomy.discovered_plants.Copy() + +/datum/economy/simple_seller/seeds/begin_sell(obj/docking_port/mobile/supply/S) + temp_discovered = SSeconomy.discovered_plants.Copy() + +/datum/economy/simple_seller/seeds/check_sell(obj/docking_port/mobile/supply/S, atom/movable/AM) + if(istype(AM, /obj/item/seeds)) + var/obj/item/seeds/seed = AM + if(seed.rarity == 0) // Mundane species + return COMSIG_CARGO_SELL_WRONG + if(!temp_discovered[seed.type] || temp_discovered[seed.type] < seed.potency) + temp_discovered[seed.type] = seed.potency + return COMSIG_CARGO_SELL_NORMAL + return COMSIG_CARGO_SELL_WRONG + +/datum/economy/simple_seller/seeds/sell_normal(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + if(!..()) + return + + var/msg = "" + var/credits = 0 + var/obj/item/seeds/seed = AM + if(seed.rarity == 0) // Mundane species + return + else if(SSeconomy.discovered_plants[seed.type]) + // This species has already been sent to CentComm + // Compare it to the previous best + var/potDiff = seed.potency - SSeconomy.discovered_plants[seed.type] + if(potDiff > 0) + SSeconomy.discovered_plants[seed.type] = seed.potency + credits = potDiff + msg = "New sample of \"[capitalize(seed.species)]\" is superior. Good work." + SSblackbox.record_feedback("tally", "cargo seeds sold", 1, "improved") + else + // This is a new discovery! + SSeconomy.discovered_plants[seed.type] = seed.potency + credits = seed.rarity + seed.potency + msg = "New species discovered: \"[capitalize(seed.species)]\". Excellent work." + SSblackbox.record_feedback("tally", "cargo seeds sold", 1, "new") + + if(credits == 0) + return + + SSblackbox.record_feedback("tally", "cargo seeds sold", 1, "amount") + SSblackbox.record_feedback("tally", "cargo seeds sold", credits, "credits") + + var/datum/economy/line_item/cargo_item = new + cargo_item.account = SSeconomy.cargo_account + cargo_item.credits = credits / 2 + cargo_item.reason = msg + manifest.line_items += cargo_item + + var/datum/economy/line_item/service_item = new + service_item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SERVICE) + service_item.credits = credits / 2 + service_item.reason = msg + manifest.line_items += service_item + +/datum/economy/simple_seller/seeds/sell_wrong(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + if(!..()) + return + + var/datum/economy/line_item/item = new + item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SERVICE) + item.credits = 0 + + var/obj/item/seeds/seed = AM + if(seed.rarity == 0) + item.reason = "We don't need samples of mundane species \"[capitalize(seed.species)]\"." + manifest.line_items += item + SSblackbox.record_feedback("tally", "cargo seeds sold", 1, "boring") + else if(SSeconomy.discovered_plants[seed.type] && SSeconomy.discovered_plants[seed.type] < seed.potency) + item.reason = "New sample of \"[capitalize(seed.species)]\" is not more potent than existing sample ([SSeconomy.discovered_plants[seed.type]] potency)." + manifest.line_items += item + SSblackbox.record_feedback("tally", "cargo seeds sold", 1, "repeat") + // If neither succeeds, this seed was declared wrong by a different + // seller, so we should be quiet. + + +/datum/economy/simple_seller/messes + +/datum/economy/simple_seller/messes/check_sell(obj/docking_port/mobile/supply/S, atom/movable/AM) + if(istype(AM, /obj/effect)) + var/obj/effect/E = AM + if(E.is_cleanable()) + return COMSIG_CARGO_MESS | COMSIG_CARGO_IS_SECURED + + +/datum/economy/simple_seller/containers + +/datum/economy/simple_seller/containers/check_sell(obj/docking_port/mobile/supply/S, atom/movable/AM) + if(istype(AM, /obj/item/storage)) + return COMSIG_CARGO_SELL_NORMAL + +/datum/economy/simple_seller/containers/sell_normal(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + if(!..()) + return + SSblackbox.record_feedback("amount", "cargo containers sold", 1) + + +/datum/economy/simple_seller/mechs + +/datum/economy/simple_seller/mechs/sell_normal(obj/docking_port/mobile/supply/S, atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest) + if(!..()) + return + SSblackbox.record_feedback("tally", "cargo basic mechs sold", 1, "amount") + SSblackbox.record_feedback("tally", "cargo basic mechs sold", SSeconomy.credits_per_mech, "credits") + + var/datum/economy/line_item/cargo_item = new + cargo_item.account = SSeconomy.cargo_account + cargo_item.credits = SSeconomy.credits_per_mech / 2 + cargo_item.reason = "Received a working [AM.name], great job!" + manifest.line_items += cargo_item + + var/datum/economy/line_item/science_item = new + science_item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SCIENCE) + science_item.credits = SSeconomy.credits_per_mech / 2 + science_item.reason = "Received a working [AM.name], great job!" + manifest.line_items += science_item + + +/datum/economy/simple_seller/mechs/check_sell(obj/docking_port/mobile/supply/S, atom/movable/AM) + if(istype(AM, /obj/mecha/working)) + return COMSIG_CARGO_SELL_NORMAL | COMSIG_CARGO_IS_SECURED + + +// Skip mech parts to avoid complaining about them. +/datum/economy/simple_seller/mech_parts + +/datum/economy/simple_seller/mech_parts/check_sell(obj/docking_port/mobile/supply/S, atom/movable/AM) + if(istype(AM.loc, /obj/mecha/working)) + return COMSIG_CARGO_SELL_SKIP + + +/datum/economy/cargo_shuttle_manifest + var/list/items_to_sell = list() + var/list/line_items = list() + var/loose_cargo = FALSE + var/messy_shuttle = FALSE + var/sent_trash = FALSE + + +/datum/economy/line_item + var/datum/money_account/account + var/credits + var/reason + var/zero_is_good = FALSE #undef MAX_CRATE_DELIVERY + +#undef CARGO_OK +#undef CARGO_PREVENT_SHUTTLE +#undef CARGO_SKIP_ATOM +#undef CARGO_REQUIRE_PRIORITY +#undef CARGO_HAS_PRIORITY diff --git a/code/modules/station_goals/secondary/bar/random_bulk_drink.dm b/code/modules/station_goals/secondary/bar/random_bulk_drink.dm new file mode 100644 index 000000000000..016e9e74b3b0 --- /dev/null +++ b/code/modules/station_goals/secondary/bar/random_bulk_drink.dm @@ -0,0 +1,9 @@ +/datum/station_goal/secondary/random_bulk_reagent/bar + name = "Random Bulk Drink" + department = "Bar" + abstract = FALSE + +/datum/station_goal/secondary/random_bulk_reagent/bar/randomize_params() + ..() + department_account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SERVICE) + report_message = "A visiting dignitary loves [initial(reagent_type.name)]. Please send us at least [amount] units of it." diff --git a/code/modules/station_goals/secondary/bar/variety_drinks.dm b/code/modules/station_goals/secondary/bar/variety_drinks.dm new file mode 100644 index 000000000000..fe11f919de37 --- /dev/null +++ b/code/modules/station_goals/secondary/bar/variety_drinks.dm @@ -0,0 +1,11 @@ +/datum/station_goal/secondary/variety_reagent/bar + name = "Variety of Drinks" + progress_type = /datum/secondary_goal_progress/variety_reagent + department = "Bar" + generic_name_plural = "alcoholic drinks" + abstract = FALSE + +/datum/station_goal/secondary/variety_reagent/bar/randomize_params() + ..() + department_account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SERVICE) + report_message = "We're hosting a party, and need a variety of alcoholic drinks. Send us at least [amount_per] units each of [different_types] different ones. Keep them separate, and don't include anything too simple; we have our own booze dispenser." diff --git a/code/modules/station_goals/secondary/botany/kudzu_goal.dm b/code/modules/station_goals/secondary/botany/kudzu_goal.dm new file mode 100644 index 000000000000..68387c00754d --- /dev/null +++ b/code/modules/station_goals/secondary/botany/kudzu_goal.dm @@ -0,0 +1,105 @@ +/datum/station_goal/secondary/random_kudzu + name = "Random Kudzu" + department = "Hydroponics" + progress_type = /datum/secondary_goal_progress/random_kudzu + abstract = FALSE + var/list/traits = list() + var/amount = 5 + +/datum/station_goal/secondary/random_kudzu/randomize_params() + var/list/valid_traits = subtypesof(/datum/spacevine_mutation) + + traits += pick(valid_traits) + + var/list/trait_names = list() + for(var/dumb_trait in traits) + var/datum/spacevine_mutation/trait = dumb_trait + trait_names += initial(trait.name) + + report_message = "The NSV Watney is studying kudzu, and needs some samples with [english_list(trait_names)], but no other mutations. [amount] packs of seeds should do." + admin_desc = "Kudzu with [trait_names.Join(",")]" + +/datum/secondary_goal_progress/random_kudzu + var/list/traits + var/needed + var/sent = 0 + var/sent_this_shipment = 0 + +/datum/secondary_goal_progress/random_kudzu/configure(datum/station_goal/secondary/random_kudzu/goal) + ..() + traits = goal.traits + needed = goal.amount + +/datum/secondary_goal_progress/random_kudzu/Copy() + var/datum/secondary_goal_progress/random_kudzu/copy = ..() + copy.traits = traits + copy.needed = needed + copy.sent = sent + return copy + +/datum/secondary_goal_progress/random_kudzu/start_shipment() + sent_this_shipment = 0 + +/datum/secondary_goal_progress/random_kudzu/proc/check_mutations(obj/item/seeds/kudzu/seed) + if(length(seed.mutations) != length(traits)) + // Wrong number of traits. + return FALSE + if(length(seed.mutations - traits)) + // Different traits. + return FALSE + return TRUE + + +/datum/secondary_goal_progress/random_kudzu/update(atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest = null) + // Not in a matching personal crate? Ignore. + if(!check_personal_crate(AM)) + return + + if(!istype(AM, /obj/item/seeds/kudzu)) + return + + if(!check_mutations(AM)) + if(!manifest) + return COMSIG_CARGO_SELL_WRONG + var/datum/economy/line_item/item = new + item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SERVICE) + item.credits = 0 + item.reason = "[AM] does not have the right traits." + manifest.line_items += item + return COMSIG_CARGO_SELL_WRONG + + sent++ + sent_this_shipment++ + return COMSIG_CARGO_SELL_PRIORITY + +/datum/secondary_goal_progress/random_kudzu/check_complete(datum/economy/cargo_shuttle_manifest/manifest) + if(sent_this_shipment > 0) + var/datum/economy/line_item/update_item = new + update_item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SERVICE) + update_item.credits = 0 + update_item.zero_is_good = TRUE + update_item.reason = "Received [sent_this_shipment] useful samples of kudzu seeds." + manifest.line_items += update_item + + if(sent < needed) + return + + var/datum/economy/line_item/supply_item = new + supply_item.account = SSeconomy.cargo_account + supply_item.credits = SSeconomy.credits_per_kudzu_goal / 3 + supply_item.reason = "Secondary goal complete: [needed] samples of kudzu seeds." + manifest.line_items += supply_item + + var/datum/economy/line_item/department_item = new + department_item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SERVICE) + department_item.credits = SSeconomy.credits_per_kudzu_goal / 3 + department_item.reason = "Secondary goal complete: [needed] samples of kudzu seeds." + manifest.line_items += department_item + + var/datum/economy/line_item/personal_item = new + personal_item.account = personal_account || department_item.account + personal_item.credits = SSeconomy.credits_per_kudzu_goal / 3 + personal_item.reason = "Secondary goal complete: [needed] samples of kudzu seeds." + manifest.line_items += personal_item + + return TRUE diff --git a/code/modules/station_goals/secondary/kitchen/random_bulk_condiment.dm b/code/modules/station_goals/secondary/kitchen/random_bulk_condiment.dm new file mode 100644 index 000000000000..a92d3fae94bb --- /dev/null +++ b/code/modules/station_goals/secondary/kitchen/random_bulk_condiment.dm @@ -0,0 +1,9 @@ +/datum/station_goal/secondary/random_bulk_reagent/kitchen + name = "Random Bulk Condiment" + department = "Kitchen" + abstract = FALSE + +/datum/station_goal/secondary/random_bulk_reagent/kitchen/randomize_params() + ..() + department_account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SERVICE) + report_message = "Steve drank all of our [initial(reagent_type.name)]. Please send us another [amount] units of it." diff --git a/code/modules/station_goals/secondary/kitchen/random_bulk_food.dm b/code/modules/station_goals/secondary/kitchen/random_bulk_food.dm new file mode 100644 index 000000000000..7580945d7113 --- /dev/null +++ b/code/modules/station_goals/secondary/kitchen/random_bulk_food.dm @@ -0,0 +1,92 @@ +/datum/station_goal/secondary/random_bulk_food + name = "Random Bulk Food" + department = "Kitchen" + progress_type = /datum/secondary_goal_progress/random_bulk_food + abstract = FALSE + var/obj/item/food/snacks/food_type + var/amount + var/reward + +/datum/station_goal/secondary/random_bulk_food/randomize_params() + var/list/valid_food = list() + for(var/S in subtypesof(/obj/item/food/snacks)) + var/obj/item/food/snacks/candidate = S + if(initial(candidate.goal_difficulty) == FOOD_GOAL_SKIP) + continue + valid_food += candidate + + if(!valid_food) + food_type = /obj/item/food/snacks/cheesewedge + amount = 50 + return + + food_type = pick(valid_food) + switch(initial(food_type.goal_difficulty)) + if(FOOD_GOAL_EASY) + amount = 35 + reward = SSeconomy.credits_per_easy_food_goal + if(FOOD_GOAL_NORMAL) + amount = 15 + reward = SSeconomy.credits_per_normal_food_goal + else // FOOD_GOAL_HARD + amount = 5 + reward = SSeconomy.credits_per_hard_food_goal + + report_message = "Someone spiked the water cooler at CC with Space Drugs again, and we all have a craving for [initial(food_type.name)]. Please send us [amount] servings of it." + admin_desc = "[amount] servings of [initial(food_type.name)]" + + +/datum/secondary_goal_progress/random_bulk_food + var/obj/item/food/snacks/food_type + var/needed + var/sent = 0 + var/sent_this_shipment = 0 + var/reward + +/datum/secondary_goal_progress/random_bulk_food/configure(datum/station_goal/secondary/random_bulk_food/goal) + ..() + food_type = goal.food_type + needed = goal.amount + reward = goal.reward + +/datum/secondary_goal_progress/random_bulk_food/Copy() + var/datum/secondary_goal_progress/random_bulk_food/copy = ..() + copy.food_type = food_type + copy.needed = needed + copy.sent = sent + // These ones aren't really needed in the intended use case, they're + // just here in case someone uses this method somewhere else. + copy.reward = reward + return copy + +/datum/secondary_goal_progress/random_bulk_food/start_shipment() + sent_this_shipment = 0 + +/datum/secondary_goal_progress/random_bulk_food/update(atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest = null) + // Not in a matching personal crate? Ignore. + if(!check_personal_crate(AM)) + return + + if(!istype(AM, food_type)) + return + + sent++ + sent_this_shipment++ + return COMSIG_CARGO_SELL_PRIORITY + +/datum/secondary_goal_progress/random_bulk_food/check_complete(datum/economy/cargo_shuttle_manifest/manifest) + if(sent_this_shipment > 0) + SSblackbox.record_feedback("nested tally", "secondary goals", 1, list(goal_name, "food shipments", initial(food_type.name))) + SSblackbox.record_feedback("nested tally", "secondary goals", sent_this_shipment, list(goal_name, "food servings", initial(food_type.name))) + var/datum/economy/line_item/update_item = new + update_item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SERVICE) + update_item.credits = 0 + update_item.zero_is_good = TRUE + update_item.reason = "Received [sent_this_shipment] servings of [initial(food_type.name)]." + manifest.line_items += update_item + + if(sent < needed) + return + + three_way_reward(manifest, "Kitchen", GLOB.station_money_database.get_account_by_department(DEPARTMENT_SERVICE), reward, "Secondary goal complete: [needed] units of [initial(food_type.name)].") + return TRUE diff --git a/code/modules/station_goals/secondary/medical/random_bulk_medicine.dm b/code/modules/station_goals/secondary/medical/random_bulk_medicine.dm new file mode 100644 index 000000000000..67f4ecba4025 --- /dev/null +++ b/code/modules/station_goals/secondary/medical/random_bulk_medicine.dm @@ -0,0 +1,9 @@ +/datum/station_goal/secondary/random_bulk_reagent/medchem + name = "Random Bulk Medicine" + department = "Medbay" + abstract = FALSE + +/datum/station_goal/secondary/random_bulk_reagent/medchem/randomize_params() + ..() + department_account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_MEDICAL) + report_message = "Doctor, I've got a fever, and the only prescription, is more [initial(reagent_type.name)]. No, really, send us [amount] units of it, please." diff --git a/code/modules/station_goals/secondary/medical/variety_medicine.dm b/code/modules/station_goals/secondary/medical/variety_medicine.dm new file mode 100644 index 000000000000..4344004fa352 --- /dev/null +++ b/code/modules/station_goals/secondary/medical/variety_medicine.dm @@ -0,0 +1,11 @@ +/datum/station_goal/secondary/variety_reagent/medchem + name = "Variety of Medicine" + progress_type = /datum/secondary_goal_progress/variety_reagent + department = "Medbay" + generic_name_plural = "medicines" + abstract = FALSE + +/datum/station_goal/secondary/variety_reagent/medchem/randomize_params() + ..() + department_account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_MEDICAL) + report_message = "A refrigiration failure on a smaller station has left them critically low on supplies. Please send us at least [amount_per] units each of [different_types] different medicines. Pills, patches, bottles, however you can send them, just keep the medicines from mixing." diff --git a/code/modules/station_goals/secondary/random_bulk_reagent.dm b/code/modules/station_goals/secondary/random_bulk_reagent.dm new file mode 100644 index 000000000000..62585e95e4c4 --- /dev/null +++ b/code/modules/station_goals/secondary/random_bulk_reagent.dm @@ -0,0 +1,102 @@ +/datum/station_goal/secondary/random_bulk_reagent + name = "Random Bulk Reagent" + progress_type = /datum/secondary_goal_progress/random_bulk_reagent + var/datum/reagent/reagent_type + var/amount + var/department_account + var/reward + +/datum/station_goal/secondary/random_bulk_reagent/Initialize(requester_account) + ..() + admin_desc = "[amount] units of [initial(reagent_type.name)]" + +/datum/station_goal/secondary/random_bulk_reagent/randomize_params() + var/list/valid_reagents = list() + for(var/R in subtypesof(/datum/reagent)) + var/datum/reagent/candidate = R + if(initial(candidate.goal_department) != department) + continue + if(initial(candidate.goal_difficulty) == REAGENT_GOAL_SKIP) + continue + valid_reagents += candidate + + if(!valid_reagents) + reagent_type = /datum/reagent/water + amount = 100 + return + + reagent_type = pick(valid_reagents) + switch(initial(reagent_type.goal_difficulty)) + if(REAGENT_GOAL_EASY) + amount = 600 + reward = SSeconomy.credits_per_easy_reagent_goal + if(REAGENT_GOAL_NORMAL) + amount = 300 + reward = SSeconomy.credits_per_normal_reagent_goal + else // REAGENT_GOAL_HARD + amount = 50 + reward = SSeconomy.credits_per_hard_reagent_goal + + +/datum/secondary_goal_progress/random_bulk_reagent + var/datum/reagent/reagent_type + var/needed + var/sent = 0 + var/department + var/department_account + var/reward + +/datum/secondary_goal_progress/random_bulk_reagent/configure(datum/station_goal/secondary/random_bulk_reagent/goal) + ..(goal) + reagent_type = goal.reagent_type + needed = goal.amount + department = goal.department + department_account = goal.department_account + reward = goal.reward + +/datum/secondary_goal_progress/random_bulk_reagent/Copy() + var/datum/secondary_goal_progress/random_bulk_reagent/copy = ..() + copy.reagent_type = reagent_type + copy.needed = needed + copy.sent = sent + // These ones aren't really needed in the intended use case, they're + // just here in case someone uses this method somewhere else. + copy.department = department + copy.department_account = department_account + copy.reward = reward + return copy + +/datum/secondary_goal_progress/random_bulk_reagent/update(atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest = null) + // Not a reagent container? Ignore. + if(!istype(AM, /obj/item/reagent_containers)) + return + + // Not in a matching personal crate? Ignore. + if(!check_personal_crate(AM)) + return + + var/obj/item/reagent_containers/container = AM + var/amount = container.reagents?.get_reagent_amount(initial(reagent_type.id)) + if(!amount) + return + sent += amount + if(!manifest) + return COMSIG_CARGO_SELL_PRIORITY + + SSblackbox.record_feedback("nested tally", "secondary goals", 1, list(goal_name, "reagents", initial(reagent_type.id), "containers")) + SSblackbox.record_feedback("nested tally", "secondary goals", amount, list(goal_name, "reagents", initial(reagent_type.id), "units")) + var/datum/economy/line_item/item = new + item.account = department_account + item.credits = 0 + item.reason = "Received [amount] units of [initial(reagent_type.name)]." + item.zero_is_good = TRUE + manifest.line_items += item + + return COMSIG_CARGO_SELL_PRIORITY + +/datum/secondary_goal_progress/random_bulk_reagent/check_complete(datum/economy/cargo_shuttle_manifest/manifest) + if(sent < needed - REAGENT_GOAL_FORGIVENESS) + return + + three_way_reward(manifest, department, department_account, reward, "Secondary goal complete: [needed] units of [initial(reagent_type.name)].") + return TRUE diff --git a/code/modules/station_goals/secondary/science/random_bulk_chemical.dm b/code/modules/station_goals/secondary/science/random_bulk_chemical.dm new file mode 100644 index 000000000000..ce20898ed20e --- /dev/null +++ b/code/modules/station_goals/secondary/science/random_bulk_chemical.dm @@ -0,0 +1,9 @@ +/datum/station_goal/secondary/random_bulk_reagent/scichem + name = "Random Bulk Chemical" + department = "Science" + abstract = FALSE + +/datum/station_goal/secondary/random_bulk_reagent/scichem/randomize_params() + ..() + department_account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SCIENCE) + report_message = "We're running an experiment with [initial(reagent_type.name)] and need more. Please send us [amount] units of it." diff --git a/code/modules/station_goals/secondary/science/random_ripley.dm b/code/modules/station_goals/secondary/science/random_ripley.dm new file mode 100644 index 000000000000..8398a523fbff --- /dev/null +++ b/code/modules/station_goals/secondary/science/random_ripley.dm @@ -0,0 +1,105 @@ +/datum/station_goal/secondary/random_ripley + name = "Random Ripley" + department = "Robotics" + progress_type = /datum/secondary_goal_progress/random_ripley + should_send_crate = FALSE + abstract = FALSE + var/list/modules = list() + var/static/list/general_modules = list( + /obj/item/mecha_parts/mecha_equipment/repair_droid, + /obj/item/mecha_parts/mecha_equipment/generator/nuclear, + /obj/item/mecha_parts/mecha_equipment/generator, + /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay, + /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster, + /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster, + /obj/item/mecha_parts/mecha_equipment/thrusters, + /obj/item/mecha_parts/mecha_equipment/gravcatapult + ) + var/static/list/engineering_modules = list( + /obj/item/mecha_parts/mecha_equipment/cable_layer, + /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp, + /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma, + /obj/item/mecha_parts/mecha_equipment/drill, + /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill, + /obj/item/mecha_parts/mecha_equipment/rcd, + /obj/item/mecha_parts/mecha_equipment/mining_scanner, + /obj/item/mecha_parts/mecha_equipment/extinguisher + ) + +/datum/station_goal/secondary/random_ripley/randomize_params() + var/obj/item/mecha_parts/general_module = pick(general_modules) + modules += general_module + var/obj/item/mecha_parts/engineering_module = pick(engineering_modules) + modules += engineering_module + + report_message = list("One of our rapid-response teams lost a mech, and needs a replacement Ripley with \a [initial(general_module.name)] and \a [initial(engineering_module.name)].", + "You must label the mech properly. Use your ID card on a hand labeller to configure it.") + admin_desc = "Ripley with [initial(general_module.name)] and [initial(engineering_module.name)]" + + +/datum/secondary_goal_progress/random_ripley + var/obj/item/food/snacks/food_type + var/list/modules + var/sent = FALSE + +/datum/secondary_goal_progress/random_ripley/configure(datum/station_goal/secondary/random_ripley/goal) + ..() + modules = goal.modules + +/datum/secondary_goal_progress/random_ripley/Copy() + var/datum/secondary_goal_progress/random_ripley/copy = ..() + copy.modules = modules + copy.sent = sent + // These ones aren't really needed in the intended use case, they're + // just here in case someone uses this method somewhere else. + copy.personal_account = personal_account + return copy + +/datum/secondary_goal_progress/random_ripley/update(atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest = null) + var/datum/component/label/goal/label = AM.GetComponent(/datum/component/label/goal) + // Not labelled for this goal? Ignore. + if(!istype(label) || label.label_name != goal_requester) + return + if(!istype(AM, /obj/mecha/working/ripley)) + return + if(!manifest) + return COMSIG_CARGO_SELL_PRIORITY | COMSIG_CARGO_IS_SECURED + if(sent) + SSblackbox.record_feedback("nested tally", "secondary goals", 1, list(goal_name, "extra mech")) + SSblackbox.record_feedback("nested tally", "secondary goals", SSeconomy.credits_per_mech, list(goal_name, "extra mech credits")) + var/datum/economy/line_item/extra_item = new + extra_item.account = SSeconomy.cargo_account + extra_item.credits = SSeconomy.credits_per_mech + extra_item.reason = "We already got the mech we needed, but we'll take this one at the usual price." + manifest.line_items += extra_item + send_requests_console_message(extra_item.reason, "Central Command", "Robotics", "Stamped with the Central Command rubber stamp.", null, RQ_NORMALPRIORITY) + return COMSIG_CARGO_SELL_PRIORITY | COMSIG_CARGO_IS_SECURED + + var/remaining_needs = modules.Copy() + for(var/component in AM) + for(var/need in remaining_needs) + if(istype(component, need)) + remaining_needs -= need + break + // We sell or skip all of these, so we can delete it. + qdel(component) + if(length(remaining_needs)) + if(manifest) + SSblackbox.record_feedback("nested tally", "secondary goals", 1, list(goal_name, "incorrect mech")) + SSblackbox.record_feedback("nested tally", "secondary goals", SSeconomy.credits_per_mech, list(goal_name, "incorrect mech credits")) + var/datum/economy/line_item/wrong_item = new + wrong_item.account = SSeconomy.cargo_account + wrong_item.credits = SSeconomy.credits_per_mech + wrong_item.reason = "That's not the equipment we needed, but it's still a mech" + manifest.line_items += wrong_item + send_requests_console_message(wrong_item.reason + ", so we sent the usual amount to your supply account.", "Central Command", "Robotics", "Stamped with the Central Command rubber stamp.", null, RQ_NORMALPRIORITY) + return COMSIG_CARGO_SELL_PRIORITY | COMSIG_CARGO_IS_SECURED + + sent = TRUE + return COMSIG_CARGO_SELL_PRIORITY | COMSIG_CARGO_IS_SECURED + +/datum/secondary_goal_progress/random_ripley/check_complete(datum/economy/cargo_shuttle_manifest/manifest) + if(sent) + SSblackbox.record_feedback("nested tally", "secondary goals", 1, list(goal_name, "correct mech")) + three_way_reward(manifest, "Robotics", GLOB.station_money_database.get_account_by_department(DEPARTMENT_SCIENCE), SSeconomy.credits_per_ripley_goal, "Secondary goal complete: Customized Ripley.") + return sent diff --git a/code/modules/station_goals/secondary/science/variety_chemicals.dm b/code/modules/station_goals/secondary/science/variety_chemicals.dm new file mode 100644 index 000000000000..68080f0641e1 --- /dev/null +++ b/code/modules/station_goals/secondary/science/variety_chemicals.dm @@ -0,0 +1,12 @@ +/datum/station_goal/secondary/variety_reagent/scichem + name = "Variety of Chemicals" + progress_type = /datum/secondary_goal_progress/variety_reagent + different_types = 5 + department = "Science" + generic_name_plural = "chemicals" + abstract = FALSE + +/datum/station_goal/secondary/variety_reagent/scichem/randomize_params() + ..() + department_account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SCIENCE) + report_message = "We're training a drug moose, and need some samples of drugs. Send us at least [amount_per] units each of [different_types] different ones. --Not Steve" diff --git a/code/modules/station_goals/secondary/secondary_goal.dm b/code/modules/station_goals/secondary/secondary_goal.dm new file mode 100644 index 000000000000..ae5df8807c91 --- /dev/null +++ b/code/modules/station_goals/secondary/secondary_goal.dm @@ -0,0 +1,104 @@ +/datum/station_goal/secondary + name = "Generic Secondary Goal" + required_crew = 1 + /// Admin-only shor description of the goal. + var/admin_desc = "No description" + /// Assigned department. Should match the values used for requests consoles. + var/department = "Unknown" + /// The person who requested the goal. + var/requester_name + /// The money account of the person who requested the goal. + var/personal_account + /// Should we (still) send a personal crate on the next shipment? + var/should_send_crate = TRUE + /// Type path of the progress tracker used. + var/progress_type = /datum/secondary_goal_progress + /// Progress type of this goal. + var/datum/secondary_goal_progress/progress + /// Tracker that manages the goal progress, permanent and temporary. + var/datum/secondary_goal_tracker/tracker + /// Abstract goals can't be used directly. + var/abstract = TRUE + +/datum/station_goal/secondary/proc/Initialize(requester_name_in, requester_account) + SHOULD_CALL_PARENT(TRUE) + requester_name = requester_name_in + personal_account = requester_account + randomize_params() + progress = new progress_type + progress.configure(src) + tracker = new(src, progress) + tracker.register(SSshuttle.supply) + +// Override this to randomly configure the goal before generating a progress +// tracker. +/datum/station_goal/secondary/proc/randomize_params() + return + +/datum/station_goal/secondary/send_report(requester, intro_override = FALSE) + var/list/message_parts = list() + if(intro_override) + message_parts += intro_override + else + message_parts += "Received secondary goal request from [requester] for [department]." + message_parts += "Querying master task list...." + message_parts += "Suitable task found. Task details:" + message_parts += "" + message_parts += report_message + if(should_send_crate) + message_parts += "You must submit this in a locked personal crate. One will be sent to your Cargo department. More can be ordered if needed." + send_requests_console_message(message_parts, "Central Command", department, "Stamped with the Central Command rubber stamp.", "Verified by A.L.I.C.E (CentCom AI)", RQ_HIGHPRIORITY) + if(department != "Captain's Desk") + send_requests_console_message(message_parts, "Central Command", "Captain's Desk", "Stamped with the Central Command rubber stamp.", "Verified by A.L.I.C.E (CentCom AI)", RQ_NORMALPRIORITY) + if(department != "Bridge") + send_requests_console_message(message_parts, "Central Command", "Bridge", "Stamped with the Central Command rubber stamp.", "Verified by A.L.I.C.E (CentCom AI)", RQ_NORMALPRIORITY) + +/proc/generate_secondary_goal(department, requester = null, mob/user = null) + var/list/possible = list() + var/list/departments = list() + for(var/T in subtypesof(/datum/station_goal/secondary)) + var/datum/station_goal/secondary/G = T + if(!initial(G.abstract) && !departments[initial(G.department)]) + departments[initial(G.department)] = TRUE + if(initial(G.department) != department || initial(G.abstract)) + continue + possible += G + + if(!length(possible)) + if(user) + to_chat(user, "No goals available for [department]. Goals are currently available for [english_list(departments)].") + return + + var/datum/station_goal/secondary/picked = pick(possible) + var/datum/station_goal/secondary/built = new picked + + var/requester_name = null + var/requester_account = null + var/obj/item/card/id/ID = requester + if(ID) + requester_name = ID.registered_name + requester_account = GLOB.station_money_database.find_user_account(ID.associated_account_number) + built.Initialize(requester_name, requester_account) + if(!ID) + built.send_report("CentCom") + else + built.send_report(ID.assignment ? "[ID.assignment] [ID.registered_name]" : ID.registered_name) + SSticker.mode.secondary_goals += built + +/datum/station_goal/secondary/Topic(href, href_list) + if(!check_rights(R_EVENT)) + return + + if(href_list["announce"]) + send_report("CentCom", "A task for [department] has been issued by Central Command:") + else if(href_list["remove"]) + SSticker.mode.secondary_goals -= src + qdel(src) + usr.client.modify_goals() + else if(href_list["mark_complete"]) + completed = 1 + usr.client.modify_goals() + else if(href_list["reset_progress"]) + completed = 0 + tracker.reset() + usr.client.modify_goals() diff --git a/code/modules/station_goals/secondary/secondary_goal_tracker.dm b/code/modules/station_goals/secondary/secondary_goal_tracker.dm new file mode 100644 index 000000000000..db31ce322bfb --- /dev/null +++ b/code/modules/station_goals/secondary/secondary_goal_tracker.dm @@ -0,0 +1,125 @@ +/datum/secondary_goal_tracker + var/datum/secondary_goal_progress/real_progress + var/datum/secondary_goal_progress/temporary_progress + var/datum/station_goal/secondary/goal + +/datum/secondary_goal_tracker/New(datum/station_goal/secondary/goal_in, datum/secondary_goal_progress/progress) + goal = goal_in + real_progress = progress + temporary_progress = progress.Copy() + +/datum/secondary_goal_tracker/proc/reset() + real_progress = new real_progress.type(goal) + temporary_progress = real_progress.Copy() + +/datum/secondary_goal_tracker/proc/register(shuttle) + RegisterSignal(shuttle, COMSIG_CARGO_BEGIN_SCAN, PROC_REF(reset_tempporary_progress)) + RegisterSignal(shuttle, COMSIG_CARGO_BEGIN_SELL, PROC_REF(reset_tempporary_progress)) + RegisterSignal(shuttle, COMSIG_CARGO_CHECK_SELL, PROC_REF(check_for_progress)) + RegisterSignal(shuttle, COMSIG_CARGO_DO_PRIORITY_SELL, PROC_REF(update_progress)) + RegisterSignal(shuttle, COMSIG_CARGO_SEND_ERROR, PROC_REF(update_progress)) + RegisterSignal(shuttle, COMSIG_CARGO_END_SELL, PROC_REF(check_for_completion)) + +/datum/secondary_goal_tracker/proc/unregister(shuttle) + UnregisterSignal(shuttle, COMSIG_CARGO_BEGIN_SCAN) + UnregisterSignal(shuttle, COMSIG_CARGO_BEGIN_SELL) + UnregisterSignal(shuttle, COMSIG_CARGO_CHECK_SELL) + UnregisterSignal(shuttle, COMSIG_CARGO_DO_PRIORITY_SELL) + UnregisterSignal(shuttle, COMSIG_CARGO_SEND_ERROR) + UnregisterSignal(shuttle, COMSIG_CARGO_END_SELL) + +// Resets the temporary porgress to match the real progress. +/datum/secondary_goal_tracker/proc/reset_tempporary_progress(obj/docking_port/mobile/supply/shuttle) + SIGNAL_HANDLER // COMSIG_CARGO_BEGIN_SCAN, COMSIG_CARGO_BEGIN_SELL + temporary_progress = real_progress.Copy() + real_progress.start_shipment() + +// Checks for temporary goal progress when selling a cargo item. +/datum/secondary_goal_tracker/proc/check_for_progress(obj/docking_port/mobile/supply/shuttle, atom/movable/thing) + SIGNAL_HANDLER // COMSIG_CARGO_CHECK_SELL + return temporary_progress.update(thing) + +// Update real goal progress when selling a cargo item. +/datum/secondary_goal_tracker/proc/update_progress(obj/docking_port/mobile/supply/shuttle, atom/movable/thing, datum/economy/cargo_shuttle_manifest/manifest) + SIGNAL_HANDLER // COMSIG_CARGO_DO_PRIORITY_SELL, COMSIG_CARGO_DO_SELL, COMSIG_CARGO_SEND_ERROR + . = real_progress.update(thing, manifest) + if(. & COMSIG_CARGO_SELL_PRIORITY) + SSblackbox.record_feedback("nested tally", "secondary goals", 1, list(goal.name, "items sold")) + +/datum/secondary_goal_tracker/proc/check_for_completion(obj/docking_port/mobile/supply/shuttle, datum/economy/cargo_shuttle_manifest/manifest) + SIGNAL_HANDLER // COMSIG_CARGO_END_SELL + if(real_progress.check_complete(manifest)) + goal.completed = TRUE + SSblackbox.record_feedback("nested tally", "secondary goals", 1, list(goal.name, "times completed")) + unregister(SSshuttle.supply) + + +/datum/secondary_goal_progress + var/personal_account + var/goal_requester + var/goal_name + +/datum/secondary_goal_progress/proc/configure(datum/station_goal/secondary/goal) + SHOULD_CALL_PARENT(TRUE) + goal_requester = goal.requester_name + personal_account = goal.personal_account + goal_name = goal.name + +/datum/secondary_goal_progress/proc/Copy() + SHOULD_CALL_PARENT(TRUE) + var/datum/secondary_goal_progress/copy = new type + copy.personal_account = personal_account + copy.goal_requester = goal_requester + copy.goal_name = goal_name + return copy + +// Override for custom shipment start behavior +// (e.g. ampount-per-shipment tracking) +// Only called on the real progress tracker. +/datum/secondary_goal_progress/proc/start_shipment() + return + +// Check the item to see if it belongs to this goal. +// Update the manifest accodingly, if provided. +// Return values from code/__DEFINES/supply_defines.dm. +// Use COMSIG_CARGO_SELL_PRIORITY, not COMSIG_CARGO_SELL_NORMAL. +/datum/secondary_goal_progress/proc/update(atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest = null) + return + +// Check to see if this goal has been completed. +// Update the manifest accordingly. +// Returns whether the goal was completed. +/datum/secondary_goal_progress/proc/check_complete(datum/economy/cargo_shuttle_manifest/manifest) + return FALSE + +/datum/secondary_goal_progress/proc/check_personal_crate(atom/movable/AM) + var/obj/structure/closet/crate/secure/personal/PC = get_atom_on_turf(AM, /obj/structure/closet/crate/secure/personal) + if(!istype(PC)) + return FALSE + if(goal_requester && PC.registered_name != goal_requester) + return FALSE + return TRUE + +/datum/secondary_goal_progress/proc/three_way_reward(datum/economy/cargo_shuttle_manifest/manifest, department, department_account, reward, message) + SSblackbox.record_feedback("nested tally", "secondary goals", 1, list(goal_name, "payments made")) + SSblackbox.record_feedback("nested tally", "secondary goals", reward, list(goal_name, "credits")) + + var/datum/economy/line_item/supply_item = new + supply_item.account = SSeconomy.cargo_account + supply_item.credits = reward / 3 + supply_item.reason = message + manifest.line_items += supply_item + + var/datum/economy/line_item/department_item = new + department_item.account = department_account + department_item.credits = reward / 3 + department_item.reason = message + manifest.line_items += department_item + + var/datum/economy/line_item/personal_item = new + personal_item.account = personal_account || department_account + personal_item.credits = reward / 3 + personal_item.reason = message + manifest.line_items += personal_item + + send_requests_console_message(message, "Central Command", department, "Stamped with the Central Command rubber stamp.", null, RQ_NORMALPRIORITY) diff --git a/code/modules/station_goals/secondary/variety_reagent.dm b/code/modules/station_goals/secondary/variety_reagent.dm new file mode 100644 index 000000000000..ffccf8c8912f --- /dev/null +++ b/code/modules/station_goals/secondary/variety_reagent.dm @@ -0,0 +1,138 @@ +/datum/station_goal/secondary/variety_reagent + name = "Variety of Reagent" + progress_type = /datum/secondary_goal_progress/variety_reagent + var/different_types = 10 + var/amount_per = 50 + var/department_account + var/generic_name_plural = "reagents" + var/reward + +/datum/station_goal/secondary/variety_reagent/Initialize(requester_account) + reward = SSeconomy.credits_per_variety_reagent_goal + ..() + admin_desc = "[amount_per] units of [different_types] [generic_name_plural]" + + +/datum/secondary_goal_progress/variety_reagent + var/list/reagents_sent = list() + var/department + var/needed + var/amount_per + var/department_account + var/reward + var/generic_name_plural + +/datum/secondary_goal_progress/variety_reagent/configure(datum/station_goal/secondary/variety_reagent/goal) + ..() + department = goal.department + needed = goal.different_types + amount_per = goal.amount_per + department_account = goal.department_account + reward = goal.reward + generic_name_plural = goal.generic_name_plural + +/datum/secondary_goal_progress/variety_reagent/Copy() + var/datum/secondary_goal_progress/variety_reagent/copy = ..() + copy.reagents_sent = reagents_sent.Copy() + copy.department = department + copy.needed = needed + copy.amount_per = amount_per + // These ones aren't really needed in the intended use case, they're + // just here in case someone uses this method somewhere else. + copy.department_account = department_account + copy.reward = reward + copy.generic_name_plural = generic_name_plural + return copy + +/datum/secondary_goal_progress/variety_reagent/update(atom/movable/AM, datum/economy/cargo_shuttle_manifest/manifest = null) + // Not a reagent container? Ignore. + if(!istype(AM, /obj/item/reagent_containers)) + return + + // Not in a matching personal crate? Ignore. + if(!check_personal_crate(AM)) + return + + var/obj/item/reagent_containers/container = AM + // No reagents? Ignore. + if(!container.reagents.reagent_list) + return + + var/datum/reagent/reagent = container.reagents?.get_master_reagent() + + // Make sure it's for our department. + if(!reagent || reagent.goal_department != department) + return + + // Isolated reagents only, please. + if(length(container.reagents.reagent_list) != 1) + if(!manifest) + return COMSIG_CARGO_SELL_WRONG + SSblackbox.record_feedback("nested tally", "secondary goals", 1, list(goal_name, "mixed reagents")) + var/datum/economy/line_item/item = new + item.account = department_account + item.credits = 0 + item.reason = "That [reagent.name] seems to be mixed with something else. Send it by itself, please." + manifest.line_items += item + send_requests_console_message(item.reason, "Central Command", department, "Stamped with the Central Command rubber stamp.", null, RQ_NORMALPRIORITY) + return COMSIG_CARGO_SELL_WRONG + + // No easy reagents allowed. + if(reagent.goal_difficulty == REAGENT_GOAL_SKIP) + if(!manifest) + return COMSIG_CARGO_SELL_WRONG + SSblackbox.record_feedback("nested tally", "secondary goals", 1, list(goal_name, "boring reagents")) + var/datum/economy/line_item/item = new + item.account = department_account + item.credits = 0 + item.reason = "We don't need [reagent.name]. Send something better." + manifest.line_items += item + send_requests_console_message(item.reason, "Central Command", department, "Stamped with the Central Command rubber stamp.", null, RQ_NORMALPRIORITY) + return COMSIG_CARGO_SELL_WRONG + + // Make sure there's enough. + if(reagent.volume < amount_per - REAGENT_GOAL_FORGIVENESS) + if(!manifest) + return COMSIG_CARGO_SELL_WRONG + SSblackbox.record_feedback("nested tally", "secondary goals", 1, list(goal_name, "insufficient quantity of reagents")) + var/datum/economy/line_item/item = new + item.account = department_account + item.credits = 0 + item.reason = "That batch of [reagent.name] was too small; send at least [amount_per] units." + manifest.line_items += item + send_requests_console_message(item.reason, "Central Command", department, "Stamped with the Central Command rubber stamp.", null, RQ_NORMALPRIORITY) + return COMSIG_CARGO_SELL_WRONG + + if(reagents_sent[reagent.id]) + if(!manifest) + return COMSIG_CARGO_SELL_WRONG + SSblackbox.record_feedback("nested tally", "secondary goals", 1, list(goal_name, "repeat reagents")) + var/datum/economy/line_item/item = new + item.account = department_account + item.credits = 0 + item.reason = "You already sent us [reagent.name]." + manifest.line_items += item + send_requests_console_message(item.reason, "Central Command", department, "Stamped with the Central Command rubber stamp.", null, RQ_NORMALPRIORITY) + return COMSIG_CARGO_SELL_WRONG + + reagents_sent[reagent.id] = TRUE + + if(!manifest) + return COMSIG_CARGO_SELL_PRIORITY + SSblackbox.record_feedback("nested tally", "secondary goals", 1, list(goal_name, "valid reagents")) + SSblackbox.record_feedback("nested tally", "secondary goals", 1, list(goal_name, "reagents", reagent.id)) + var/datum/economy/line_item/item = new + item.account = department_account + item.credits = 0 + item.reason = "Received [initial(reagent.name)]." + item.zero_is_good = TRUE + manifest.line_items += item + send_requests_console_message(item.reason, "Central Command", department, "Stamped with the Central Command rubber stamp.", null, RQ_NORMALPRIORITY) + return COMSIG_CARGO_SELL_PRIORITY + +/datum/secondary_goal_progress/variety_reagent/check_complete(datum/economy/cargo_shuttle_manifest/manifest) + if(length(reagents_sent) < needed) + return + + three_way_reward(manifest, department, department_account, reward, "Secondary goal complete: [needed] different [generic_name_plural].") + return TRUE diff --git a/code/modules/station_goals/station_goal.dm b/code/modules/station_goals/station_goal.dm index 683c1bdc35d0..5cf4c0b67d63 100644 --- a/code/modules/station_goals/station_goal.dm +++ b/code/modules/station_goals/station_goal.dm @@ -46,4 +46,6 @@ on_report() send_report() else if(href_list["remove"]) + SSticker.mode.station_goals -= src qdel(src) + usr.client.modify_goals() diff --git a/code/modules/station_goals/task_backlog.dm b/code/modules/station_goals/task_backlog.dm new file mode 100644 index 000000000000..3850adbe84fe --- /dev/null +++ b/code/modules/station_goals/task_backlog.dm @@ -0,0 +1,23 @@ +/datum/station_goal/clear_task_backlog + name = "Clear Task Backlog" + var/goal = 10 + +/datum/station_goal/clear_task_backlog/get_report() + return {"Clear Task Backlog
+ The last few weeks have been extremely profitable for Nanotrasen, but + we've got so many things to do that we're getting a bit overwhelmed.
+
+ We need you to pick up the slack. Use the Request Consoles on your + station to get Secondary Goals, and complete at least [goal] of them. +
+
+ -Nanotrasen Accounting"} + +/datum/station_goal/clear_task_backlog/check_completion() + if(..()) + return TRUE + var/count = 0 + for(var/datum/station_goal/secondary/S in SSticker.mode.secondary_goals) + if(S.completed) + count++ + return count >= goal diff --git a/code/modules/supply/supply_console.dm b/code/modules/supply/supply_console.dm index f24d0693b148..a70e43223b1b 100644 --- a/code/modules/supply/supply_console.dm +++ b/code/modules/supply/supply_console.dm @@ -441,8 +441,8 @@ /obj/machinery/computer/supplycomp/proc/move_shuttle(mob/user) if(is_public) // Public consoles cant move the shuttle. Dont allow exploiters. return - if(SSshuttle.supply.canMove()) - to_chat(user, "For safety reasons the automated supply shuttle cannot transport live organisms, undelivered mail, classified nuclear weaponry or homing beacons.") + if(!SSshuttle.supply.canMove()) + to_chat(user, "For safety reasons, the automated supply shuttle cannot transport [SSshuttle.supply.blocking_item].") else if(SSshuttle.supply.getDockedId() == "supply_home") SSshuttle.toggleShuttle("supply", "supply_home", "supply_away", 1) investigate_log("| [key_name(user)] has sent the supply shuttle away. Shuttle contents: [SSeconomy.sold_atoms]", "cargo") diff --git a/code/modules/supply/supply_packs/pack_miscellaneous.dm b/code/modules/supply/supply_packs/pack_miscellaneous.dm index 80dfa802b469..66b1ef894d69 100644 --- a/code/modules/supply/supply_packs/pack_miscellaneous.dm +++ b/code/modules/supply/supply_packs/pack_miscellaneous.dm @@ -82,6 +82,18 @@ contains = list(/obj/item/stack/tile/carpet/twenty) containername = "carpet crate" +/datum/supply_packs/misc/personal_crates + name = "Personal Crates Pack" + cost = 100 + containertype = /obj/structure/largecrate + contains = list(/obj/structure/closet/crate/secure/personal, + /obj/structure/closet/crate/secure/personal, + /obj/structure/closet/crate/secure/personal, + /obj/structure/closet/crate/secure/personal, + /obj/structure/closet/crate/secure/personal, + /obj/structure/closet/crate/secure/personal) + containername = "personal crates pack" + ///////////// Paper Work diff --git a/code/modules/virology/virology_goals.dm b/code/modules/virology/virology_goals.dm index 4306ec9093f5..805e1c232963 100644 --- a/code/modules/virology/virology_goals.dm +++ b/code/modules/virology/virology_goals.dm @@ -1,4 +1,4 @@ -GLOBAL_LIST_INIT(virology_goals, list(new /datum/virology_goal/property_symptom, new /datum/virology_goal/virus, new /datum/virology_goal/virus/stealth)) +GLOBAL_LIST_EMPTY(virology_goals) GLOBAL_LIST_EMPTY(archived_virology_goals) #define MAX_LOOPS 30 @@ -10,10 +10,62 @@ GLOBAL_LIST_EMPTY(archived_virology_goals) var/delivery_goal = 15 var/completed = FALSE +/datum/virology_goal/proc/register() + RegisterSignal(SSshuttle.supply, COMSIG_CARGO_CHECK_SELL, PROC_REF(check_for_virus)) + RegisterSignal(SSshuttle.supply, COMSIG_CARGO_DO_PRIORITY_SELL, PROC_REF(sell_virus)) + RegisterSignal(SSshuttle.supply, COMSIG_CARGO_SEND_ERROR, PROC_REF(complain_about_virus)) + +/datum/virology_goal/proc/unregister() + UnregisterSignal(SSshuttle.supply, COMSIG_CARGO_CHECK_SELL) + UnregisterSignal(SSshuttle.supply, COMSIG_CARGO_DO_PRIORITY_SELL) + UnregisterSignal(SSshuttle.supply, COMSIG_CARGO_SEND_ERROR) + +/datum/virology_goal/proc/check_for_virus(shuttle, atom/movable/thing) + SIGNAL_HANDLER // COMSIG_CARGO_CHECK_SELL + if(istype(thing, /obj/item/reagent_containers)) + var/obj/item/reagent_containers/C = thing + if(check_viruses(C.reagents.reagent_list)) + return COMSIG_CARGO_SELL_PRIORITY + return COMSIG_CARGO_SELL_WRONG + +/datum/virology_goal/proc/sell_virus(shuttle, atom/movable/thing, datum/economy/cargo_shuttle_manifest/manifest, complain = FALSE) + SIGNAL_HANDLER // COMSIG_CARGO_DO_PRIORITY_SELL + // Ignore everything after we're done. + if(completed) + return + + // Look for reagent containers, those in vial lockboxes included + if(!istype(thing, /obj/item/reagent_containers)) + return + + var/obj/item/reagent_containers/C = thing + if(!length(C.reagents?.reagent_list)) + // Nothing to look at. + return + + check_viruses(C.reagents.reagent_list, manifest, complain, complain) + + if(!completed) + // Didn't finish yet. + return + + // Report and give credits for the goal. + var/datum/economy/line_item/item = new + item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_MEDICAL) + item.credits = SSeconomy.credits_per_virology_goal + item.reason = "[name] completed." + manifest.line_items += item + + // Stop listening. + unregister() + +/datum/virology_goal/proc/complain_about_virus(shuttle, atom/movable/thing, datum/economy/cargo_shuttle_manifest/manifest) + sell_virus(shuttle, thing, manifest, TRUE) + /datum/virology_goal/proc/get_report() return "Complete this goal." -/datum/virology_goal/proc/check_completion(list/reagent_list) +/datum/virology_goal/proc/check_viruses(list/reagent_list) check_total_virology_goals_completion() return TRUE @@ -45,12 +97,13 @@ GLOBAL_LIST_EMPTY(archived_virology_goals) /datum/virology_goal/property_symptom name = "Symptom With Properties Viral Sample Request" - var/goal_symptom //Type path of the symptom + var/datum/symptom/goal_symptom //Type path of the symptom var/goal_symptom_name var/goal_property var/goal_property_value /datum/virology_goal/property_symptom/New() + register() var/times_looped = 0 //The chance for this to make a infinite loop that lags the server is astronomically small but its still a chance do var/type = pick(subtypesof(/datum/symptom)) @@ -87,7 +140,7 @@ GLOBAL_LIST_EMPTY(archived_virology_goals) return_text += "Viral samples with a specific symptom and properties are required to study the effects of this symptom in various conditions. We need you to deliver [delivery_goal]u of viral samples containing the [goal_symptom_name] symptom and with the [goal_property] property at level [goal_property_value] along with 3 other symptoms to us through the cargo shuttle." return return_text -/datum/virology_goal/property_symptom/check_completion(list/datum/reagent/reagent_list) +/datum/virology_goal/property_symptom/check_viruses(list/datum/reagent/reagent_list, datum/economy/cargo_shuttle_manifest/manifest, simulate = TRUE, complain = FALSE) . = FALSE var/datum/reagent/blood/BL = locate() in reagent_list if(!BL) @@ -95,27 +148,54 @@ GLOBAL_LIST_EMPTY(archived_virology_goals) if(!BL.data || !BL.data["viruses"]) return for(var/datum/disease/advance/D in BL.data["viruses"]) - if(length(D.symptoms) < 4) //We want 3 other symptoms alongside the requested one + //We want 3 other symptoms alongside the requested one + var/required_symptoms = 4 + if(length(D.symptoms) < required_symptoms) + if(simulate || !manifest || !complain) + continue + var/datum/economy/line_item/item = new + item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_MEDICAL) + item.credits = 0 + item.reason = "Virus [D.name] has too few symptoms for [name] ([length(D.symptoms)] is less than [required_symptoms])." + manifest.line_items += item continue var/properties = D.GenerateProperties() var/property = properties[goal_property] if(property != goal_property_value) + if(simulate || !manifest || !complain) + continue + var/datum/economy/line_item/item = new + item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_MEDICAL) + item.credits = 0 + item.reason = "Virus [D.name] has the wrong [goal_property] for [name] ([property] is not [goal_property_value])." + manifest.line_items += item continue - var/found_goal_symptom = FALSE for(var/datum/symptom/S in D.symptoms) if(!goal_symptom) return if(S.type != goal_symptom) continue - found_goal_symptom = TRUE - break - if(!found_goal_symptom) - return - delivered_amount += BL.volume - if(delivered_amount >= delivery_goal) - completed = TRUE - check_total_virology_goals_completion() - return TRUE + if(simulate) + return TRUE + if(manifest) + var/datum/economy/line_item/item = new + item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_MEDICAL) + item.credits = 0 + item.zero_is_good = TRUE + item.reason = "Received [BL.volume] units of usable virus [D.name] for [name]." + manifest.line_items += item + delivered_amount += BL.volume + if(delivered_amount >= delivery_goal) + completed = TRUE + check_total_virology_goals_completion() + return TRUE + if(simulate || !manifest || !complain) + continue + var/datum/economy/line_item/item = new + item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_MEDICAL) + item.credits = 0 + item.reason = "Virus [D.name] is missing the required symptom [initial(goal_symptom.name)] for [name]." + manifest.line_items += item /datum/virology_goal/virus name = "Specific Viral Sample Request (Non-Stealth)" @@ -123,6 +203,7 @@ GLOBAL_LIST_EMPTY(archived_virology_goals) var/symptoms_amount = 5 /datum/virology_goal/virus/New() + register() var/times_looped = 0 //The chance for this to make a infinite loop that lags the server is astronomically small but its still a chance do goal_symptoms = list() @@ -165,7 +246,7 @@ GLOBAL_LIST_EMPTY(archived_virology_goals) msg += initial(S.name) return english_list(msg, ", ") -/datum/virology_goal/virus/check_completion(list/datum/reagent/reagent_list) +/datum/virology_goal/virus/check_viruses(list/datum/reagent/reagent_list, datum/economy/cargo_shuttle_manifest/manifest, simulate = TRUE, complain = FALSE) . = FALSE var/datum/reagent/blood/BL = locate() in reagent_list if(!BL) @@ -173,12 +254,35 @@ GLOBAL_LIST_EMPTY(archived_virology_goals) if(!BL.data || !BL.data["viruses"]) return for(var/datum/disease/advance/D in BL.data["viruses"]) - if(length(D.symptoms) != length(goal_symptoms)) //This is here so viruses with extra symptoms dont get approved - return + if(length(D.symptoms) != length(goal_symptoms)) + if(simulate || !manifest || !complain) + continue + var/datum/economy/line_item/item = new + item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_MEDICAL) + item.credits = 0 + item.reason = "Virus [D.name] has the wrong number of symptoms for [name] ([length(D.symptoms)] is not [length(goal_symptoms)])." + manifest.line_items += item + continue for(var/S in goal_symptoms) var/datum/symptom/SY = locate(S) in D.symptoms if(!SY) + if(simulate || !manifest || !complain) + continue + var/datum/economy/line_item/item = new + item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_MEDICAL) + item.credits = 0 + item.reason = "Virus [D.name] is missing symptom [initial(SY.name)] for [name]." + manifest.line_items += item return + if(simulate) + return TRUE + if(manifest) + var/datum/economy/line_item/item = new + item.account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_MEDICAL) + item.credits = 0 + item.zero_is_good = TRUE + item.reason = "Received [BL.volume] units of usable virus [D.name] for [name]." + manifest.line_items += item delivered_amount += BL.volume if(delivered_amount >= delivery_goal) completed = TRUE diff --git a/paradise.dme b/paradise.dme index 99ff381c75cd..c7abc1778798 100644 --- a/paradise.dme +++ b/paradise.dme @@ -59,6 +59,7 @@ #include "code\__DEFINES\emotes_defines.dm" #include "code\__DEFINES\error_handler_defines.dm" #include "code\__DEFINES\flags.dm" +#include "code\__DEFINES\food_defines.dm" #include "code\__DEFINES\footstep_defines.dm" #include "code\__DEFINES\game_defines.dm" #include "code\__DEFINES\gamemode.dm" @@ -115,6 +116,7 @@ #include "code\__DEFINES\status_effects.dm" #include "code\__DEFINES\subsystems.dm" #include "code\__DEFINES\supermatter_defines.dm" +#include "code\__DEFINES\supply_defines.dm" #include "code\__DEFINES\surgery_defines.dm" #include "code\__DEFINES\text_defines.dm" #include "code\__DEFINES\tg_cooldowns.dm" @@ -2712,6 +2714,21 @@ #include "code\modules\station_goals\dna_vault.dm" #include "code\modules\station_goals\shield.dm" #include "code\modules\station_goals\station_goal.dm" +#include "code\modules\station_goals\task_backlog.dm" +#include "code\modules\station_goals\secondary\random_bulk_reagent.dm" +#include "code\modules\station_goals\secondary\secondary_goal.dm" +#include "code\modules\station_goals\secondary\secondary_goal_tracker.dm" +#include "code\modules\station_goals\secondary\variety_reagent.dm" +#include "code\modules\station_goals\secondary\bar\random_bulk_drink.dm" +#include "code\modules\station_goals\secondary\bar\variety_drinks.dm" +#include "code\modules\station_goals\secondary\botany\kudzu_goal.dm" +#include "code\modules\station_goals\secondary\kitchen\random_bulk_condiment.dm" +#include "code\modules\station_goals\secondary\kitchen\random_bulk_food.dm" +#include "code\modules\station_goals\secondary\medical\random_bulk_medicine.dm" +#include "code\modules\station_goals\secondary\medical\variety_medicine.dm" +#include "code\modules\station_goals\secondary\science\random_bulk_chemical.dm" +#include "code\modules\station_goals\secondary\science\random_ripley.dm" +#include "code\modules\station_goals\secondary\science\variety_chemicals.dm" #include "code\modules\supply\supply_console.dm" #include "code\modules\supply\supply_order.dm" #include "code\modules\supply\supply_pack.dm" diff --git a/tgui/packages/tgui/interfaces/RequestConsole.js b/tgui/packages/tgui/interfaces/RequestConsole.js index 2001a7014b79..b1cd113399c8 100644 --- a/tgui/packages/tgui/interfaces/RequestConsole.js +++ b/tgui/packages/tgui/interfaces/RequestConsole.js @@ -30,13 +30,15 @@ export const RequestConsole = (props, context) => { return ; case 10: return ; + case 11: + return ; default: return "WE SHOULDN'T BE HERE!"; } }; return ( - + {pickPage(screen)} @@ -116,6 +118,14 @@ const MainMenu = (props, context) => { icon="box" onClick={() => act('setScreen', { setScreen: 2 })} /> +

#`-cN>q+;!?kZ>CncwAx?qp#6$z1a`F&7- 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 delta 379500 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 IiY%32SXDx4k>KeC(i`AmitRUbxf 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