mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
* first bow powercreep edition * first patch * description updates * added the stuff * follow-up edits * very mild voicebox updates * all the stuff * some value/wording changes + shifts shadow cloak to nukies * halve bow slowdown * aaaa * uhoh * cloak charge rate changes * remove redundant line * upgrades break bow damage to middle finger * spellbook adjustments * tribal armor tweaks (I'm looking at you pathfinder cloak and you're gonna get slapped soon) * aaa * more stuff * agh * done? * minor tweaks + craftable gloves * adds bone crossbow crafting recipe * maybe fix cornflakes * Squashed commit of the following: commit414af05928Author: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 18 22:05:17 2023 -0500 Automatic changelog generation #17965 [ci skip] commit4dbd995239Author: adamsong <adamsong@users.noreply.github.com> Date: Sat Feb 18 22:05:15 2023 -0500 Fix apply_innate_effects not getting mob refs like its supposed to, fixes veil health not being modified (#17965) commit8f9f915f69Author: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 18 22:04:08 2023 -0500 Automatic changelog generation #17970 [ci skip] commit50ed5323a5Author: ynot01 <ynot000001@gmail.com> Date: Sat Feb 18 22:04:06 2023 -0500 Easier wounds on unclosed surgery sites (#17970) * Update _bodyparts.dm * Update code/modules/surgery/bodyparts/_bodyparts.dm commit9c4d0652dbAuthor: Changelogs <action@github.com> Date: Sat Feb 18 14:07:01 2023 +0000 Automatic changelog compile [ci skip] commit03aae8b4cfAuthor: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 18 01:58:51 2023 -0500 Automatic changelog generation #17934 [ci skip] commit2761924c1bAuthor: ynot01 <ynot000001@gmail.com> Date: Sat Feb 18 01:58:49 2023 -0500 pvp enabled (#17934) commitcfe754a9a5Author: Changelogs <action@github.com> Date: Sat Feb 18 06:10:32 2023 +0000 Automatic changelog compile [ci skip] commit491ba04913Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 17 18:08:00 2023 -0500 Automatic changelog generation #17949 [ci skip] commita65d885b53Author: ynot01 <ynot000001@gmail.com> Date: Fri Feb 17 18:07:57 2023 -0500 Fixes energy sword dupe exploit (#17949) * Update SuperBeepsky.dm * Update code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm Co-authored-by: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> * Update SuperBeepsky.dm --------- Co-authored-by: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> commit7a8a6689b6Author: Changelogs <action@github.com> Date: Fri Feb 17 22:17:32 2023 +0000 Automatic changelog compile [ci skip] commite43f06f61cAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 17 15:41:43 2023 -0500 Automatic changelog generation #17924 [ci skip] commita4229d8acbAuthor: ynot01 <ynot000001@gmail.com> Date: Fri Feb 17 15:41:40 2023 -0500 [BOUNTY] Holy Light sect, dedicated to healing (#17924) * you defy the light * revive and be less bad flavor * Update code/modules/religion/religion_sects.dm Co-authored-by: Molti <108117184+Moltijoe@users.noreply.github.com> --------- Co-authored-by: Molti <108117184+Moltijoe@users.noreply.github.com> commitad64a89f0aAuthor: ktlwjec <122807629+ktlwjec0@users.noreply.github.com> Date: Fri Feb 17 18:04:42 2023 +0000 removes plate from greeneggsandham (#17883) commitb0c3ca40a8Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 17 10:59:34 2023 -0500 Automatic changelog generation #17969 [ci skip] commiteefceef5edAuthor: wejengin2 <48154165+wejengin2@users.noreply.github.com> Date: Fri Feb 17 16:59:31 2023 +0100 [box] fixes opacity on psych doors (#17969) * windows * opac commit4b75b528eeAuthor: Changelogs <action@github.com> Date: Fri Feb 17 14:07:57 2023 +0000 Automatic changelog compile [ci skip] commit0a5d72beafAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 17 01:56:41 2023 -0500 Automatic changelog generation #17880 [ci skip] commitf6ed8e4b0bAuthor: adamsong <adamsong@users.noreply.github.com> Date: Fri Feb 17 01:56:39 2023 -0500 Makes vote weight and preferred map actually work (#17880) commit22657a9023Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 17 01:50:20 2023 -0500 Automatic changelog generation #17901 [ci skip] commit783f444541Author: Aquizit <70451213+Aquizit@users.noreply.github.com> Date: Fri Feb 17 00:50:17 2023 -0600 Adds new access define for Secure Tech Storage (#17901) * creates secure tech storage define, gives it to CE and adds it to appropriate lists * sets new access to secure tech storage doors * added secure tech storage to ID modification access * reverting map changes, will be changed in another pr per wej commitb306a6f4c3Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 17 01:33:16 2023 -0500 Automatic changelog generation #17935 [ci skip] commit32cdd383e4Author: SapphicOverload <93578146+SapphicOverload@users.noreply.github.com> Date: Fri Feb 17 01:33:14 2023 -0500 Malfunctioning AIs no longer need to kill androids or synthetics (#17935) * Update objective.dm * Update Malf_Modules.dm commitd83cc04e94Author: Changelogs <action@github.com> Date: Fri Feb 17 06:11:59 2023 +0000 Automatic changelog compile [ci skip] commitb89713fa7cAuthor: Yogbot-13 <admin@yogstation.net> Date: Thu Feb 16 22:40:04 2023 -0500 Automatic changelog generation #17861 [ci skip] commit818973e1e9Author: wejengin2 <48154165+wejengin2@users.noreply.github.com> Date: Fri Feb 17 04:40:02 2023 +0100 fixes some issues in infiltrator base (#17861) * huh * man * adds griddle * that's really funny but fuck you --------- Co-authored-by: Byemoh <baiomurang@gmail.com> commitaf417335c1Author: Yogbot-13 <admin@yogstation.net> Date: Thu Feb 16 22:32:01 2023 -0500 Automatic changelog generation #17942 [ci skip] commit4e6037ec58Author: wejengin2 <48154165+wejengin2@users.noreply.github.com> Date: Fri Feb 17 04:31:58 2023 +0100 [box] Fixes some map issues (#17942) * eo * more * more fixes * damn * cargo double lights * rogue cable and wrong id on ai core door * derwalls a random rwall * tile commit2e52265500Author: Yogbot-13 <admin@yogstation.net> Date: Thu Feb 16 20:08:21 2023 -0500 Automatic changelog generation #17917 [ci skip] commit6ebf0318d9Author: Theos <theubernyan@gmail.com> Date: Thu Feb 16 20:08:18 2023 -0500 Removes the knockout from high level bloodsucker mesmerize since it makes the ability weaker (#17917) * Removes the knockout from high level bloodsucker mesmerize since it makes the ability weaker * Update mesmerize.dm * killing you commit7d664d3af5Author: Yogbot-13 <admin@yogstation.net> Date: Thu Feb 16 20:06:53 2023 -0500 Automatic changelog generation #17918 [ci skip] commitdc8148dcb1Author: ynot01 <ynot000001@gmail.com> Date: Thu Feb 16 20:06:51 2023 -0500 Update roundend.dm (#17918) commita46d618224Author: Yogbot-13 <admin@yogstation.net> Date: Thu Feb 16 20:06:21 2023 -0500 Automatic changelog generation #17928 [ci skip] commitf04bc81f0cAuthor: LazennG <58535870+LazennG@users.noreply.github.com> Date: Thu Feb 16 17:06:18 2023 -0800 Update kinetic_crusher.dm (#17928) commit18fa2ae7afAuthor: Yogbot-13 <admin@yogstation.net> Date: Thu Feb 16 20:05:51 2023 -0500 Automatic changelog generation #17946 [ci skip] commit6857bacb76Author: SapphicOverload <93578146+SapphicOverload@users.noreply.github.com> Date: Thu Feb 16 20:05:48 2023 -0500 Update mousetrap.dm (#17946) commit1751af026cAuthor: Changelogs <action@github.com> Date: Thu Feb 16 22:17:07 2023 +0000 Automatic changelog compile [ci skip] commite005525535Author: Yogbot-13 <admin@yogstation.net> Date: Thu Feb 16 12:19:45 2023 -0500 Automatic changelog generation #17922 [ci skip] commitbc8ae716abAuthor: Ling <lingbleed@gmail.com> Date: Thu Feb 16 18:19:42 2023 +0100 Fixes Atmos fire fighting backpack (#17922) commite04fc1b6a8Author: Yogbot-13 <admin@yogstation.net> Date: Thu Feb 16 12:18:03 2023 -0500 Automatic changelog generation #17939 [ci skip] commit93daa6c361Author: ynot01 <ynot000001@gmail.com> Date: Thu Feb 16 12:18:00 2023 -0500 Bloodsucker Brawn knockdown patch (#17939) * Update brawn.dm * Update brawn.dm * Update brawn.dm commit1ef9484767Author: Changelogs <action@github.com> Date: Thu Feb 16 14:09:56 2023 +0000 Automatic changelog compile [ci skip] commiteaff1fdb1bAuthor: Yogbot-13 <admin@yogstation.net> Date: Thu Feb 16 05:52:39 2023 -0500 Automatic changelog generation #17936 [ci skip] commit3d42d664bcAuthor: adamsong <adamsong@users.noreply.github.com> Date: Thu Feb 16 05:52:36 2023 -0500 Fixes editing bans in game (#17936) * Fixes editing bans in game * Fixes other error commit69ea8d6ca9Author: Changelogs <action@github.com> Date: Thu Feb 16 06:11:47 2023 +0000 Automatic changelog compile [ci skip] commit4e6a16b426Author: Yogbot-13 <admin@yogstation.net> Date: Thu Feb 16 00:37:02 2023 -0500 Automatic changelog generation #17923 [ci skip] commit2a7da8c107Author: ynot01 <ynot000001@gmail.com> Date: Thu Feb 16 00:37:00 2023 -0500 fixes clown sect not healing (#17923) commit890bc91805Author: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 15 20:56:34 2023 -0500 Automatic changelog generation #17945 [ci skip] commitb2b39d3ed8Author: TheRyeGuyWhoWillNowDie <70169560+TheRyeGuyWhoWillNowDie@users.noreply.github.com> Date: Wed Feb 15 20:56:32 2023 -0500 Update revolution.dm (#17945) commitec2cbd2c89Author: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 15 20:48:13 2023 -0500 Automatic changelog generation #17864 [ci skip] commitcd14d86ed6Author: Theos <theubernyan@gmail.com> Date: Wed Feb 15 20:48:10 2023 -0500 Buffs the ebow to be faster (#17864) * ebow buff?? * obliterate ebow polonium * reduced cooldown commitdf7f9bc020Author: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 15 20:47:28 2023 -0500 Automatic changelog generation #17870 [ci skip] commit232aa3fa55Author: ynot01 <ynot000001@gmail.com> Date: Wed Feb 15 20:47:26 2023 -0500 Update bloodsuckers.dm (#17870) commitd679caad3cAuthor: Changelogs <action@github.com> Date: Wed Feb 15 22:17:39 2023 +0000 Automatic changelog compile [ci skip] commit9678f1f65aAuthor: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 15 14:58:11 2023 -0500 Automatic changelog generation #17930 [ci skip] commit039792ea37Author: Byemoh <baiomurang@gmail.com> Date: Wed Feb 15 13:58:09 2023 -0600 NVS Gax Incinerator Expansion (#17930) commita0fe3e174cAuthor: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 15 11:04:14 2023 -0500 Automatic changelog generation #17941 [ci skip] commita263586d88Author: wejengin2 <48154165+wejengin2@users.noreply.github.com> Date: Wed Feb 15 17:04:08 2023 +0100 eee (#17941) commitf8b90faa17Author: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 15 10:11:12 2023 -0500 Automatic changelog generation #17721 [ci skip] commit1d22d7da18Author: ynot01 <ynot000001@gmail.com> Date: Wed Feb 15 10:11:07 2023 -0500 Long Awaited Psychiatrist Rework (#17721) * PART FIVE * Update brain_trauma.dm * Update examine.dm * Update mild.dm * Update brain_trauma.dm * Update brain_trauma.dm * anomalous floating lightswitch * undo unintended map changes I am sorry I don't know what happened to asteroid station I don't know what changed on the AI satellite I am sorry mapper man * can no longer cure things u shouldnt wound traumas traumas that require the aheal staff traumas that come from quirks * wej * wej 2 * Update YogStation.dmm * Update brain_trauma.dm * Update brain_trauma.dm * Update brain_trauma.dm commit85de433d2dAuthor: Changelogs <action@github.com> Date: Wed Feb 15 14:08:21 2023 +0000 Automatic changelog compile [ci skip] commita8bd8c2280Author: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 15 07:32:49 2023 -0500 Automatic changelog generation #17916 [ci skip] commit3b587559a5Author: Molti <108117184+Moltijoe@users.noreply.github.com> Date: Wed Feb 15 06:32:46 2023 -0600 Who approved this (#17916) commit6828c4758dAuthor: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 15 06:58:56 2023 -0500 Automatic changelog generation #17914 [ci skip] commit3e3ab2b4d6Author: ktlwjec <122807629+ktlwjec0@users.noreply.github.com> Date: Wed Feb 15 11:58:53 2023 +0000 fixes processor recipes (#17914) commit601ce3f675Author: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 15 06:41:26 2023 -0500 Automatic changelog generation #17888 [ci skip] commitbf8867a331Author: Molti <108117184+Moltijoe@users.noreply.github.com> Date: Wed Feb 15 05:41:24 2023 -0600 no hardcritdamage (#17888) commite1a500ec62Author: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 15 05:28:58 2023 -0500 Automatic changelog generation #17781 [ci skip] commit874db73a73Author: ynot01 <ynot000001@gmail.com> Date: Wed Feb 15 05:28:55 2023 -0500 Revert commit64a6c3a(#17781) This reverts64a6c3ac21commit734d6ec0fcAuthor: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 15 05:28:03 2023 -0500 Automatic changelog generation #17772 [ci skip] commit30d564c8dcAuthor: Manatee <74586965+MajManatee@users.noreply.github.com> Date: Wed Feb 15 04:28:00 2023 -0600 A vain attempt to make the minigun more viable (#17772) * mmm minigun * Update minigun.dm commite7542e1f55Author: Changelogs <action@github.com> Date: Wed Feb 15 06:11:58 2023 +0000 Automatic changelog compile [ci skip] commitb5ed98fe7cAuthor: Ling <lingbleed@gmail.com> Date: Wed Feb 15 02:18:53 2023 +0100 Fix crew monitor runtime (#17921) commit4c7b5535b6Author: Changelogs <action@github.com> Date: Tue Feb 14 14:08:13 2023 +0000 Automatic changelog compile [ci skip] commitcfb81a4b91Author: Yogbot-13 <admin@yogstation.net> Date: Tue Feb 14 04:06:15 2023 -0500 Automatic changelog generation #17919 [ci skip] commit5268119ca6Author: ynot01 <ynot000001@gmail.com> Date: Tue Feb 14 04:06:12 2023 -0500 Update recharger.dm (#17919) commit06acbae28dAuthor: Changelogs <action@github.com> Date: Tue Feb 14 06:12:20 2023 +0000 Automatic changelog compile [ci skip] commit369dba9990Author: Changelogs <action@github.com> Date: Mon Feb 13 22:17:26 2023 +0000 Automatic changelog compile [ci skip] commita8b8df1868Author: Yogbot-13 <admin@yogstation.net> Date: Mon Feb 13 16:51:13 2023 -0500 Automatic changelog generation #17887 [ci skip] commit991c54d7e3Author: wejengin2 <48154165+wejengin2@users.noreply.github.com> Date: Mon Feb 13 22:51:10 2023 +0100 yeah (#17887) commitd9aec4444dAuthor: Changelogs <action@github.com> Date: Mon Feb 13 06:12:20 2023 +0000 Automatic changelog compile [ci skip] commitbad039c45fAuthor: Yogbot-13 <admin@yogstation.net> Date: Sun Feb 12 17:52:39 2023 -0500 Automatic changelog generation #17897 [ci skip] commitf251ff8187Author: Skrem_7 <98909416+Skrem7@users.noreply.github.com> Date: Sun Feb 12 17:52:36 2023 -0500 better metashield (#17897) commit1c7d28f658Author: Yogbot-13 <admin@yogstation.net> Date: Sun Feb 12 17:51:22 2023 -0500 Automatic changelog generation #17889 [ci skip] commit4f4d2d8bbbAuthor: LazennG <58535870+LazennG@users.noreply.github.com> Date: Sun Feb 12 14:51:19 2023 -0800 cooldown actions isavailable now calls parent pro (#17889) commit5e3f4b08a7Author: Yogbot-13 <admin@yogstation.net> Date: Sun Feb 12 17:50:40 2023 -0500 Automatic changelog generation #17894 [ci skip] commit062f0a2fd5Author: Manatee <74586965+MajManatee@users.noreply.github.com> Date: Sun Feb 12 16:50:37 2023 -0600 augh (#17894) commit494bbd1982Author: ynot01 <ynot000001@gmail.com> Date: Sun Feb 12 07:41:24 2023 -0500 Update yogstation.dme (#17903) commit596b836652Author: Changelogs <action@github.com> Date: Sun Feb 12 06:10:28 2023 +0000 Automatic changelog compile [ci skip] commitdc689f3715Author: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Sun Feb 12 01:30:21 2023 +0100 Moves some config settings around which should make debug builds from github run faster (#17900) * config update * opos commit80284d7ca0Author: Changelogs <action@github.com> Date: Sat Feb 11 22:15:52 2023 +0000 Automatic changelog compile [ci skip] commit56e85c55c3Author: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 13:38:04 2023 -0500 Automatic changelog generation #17833 [ci skip] commit80afe50f46Author: ynot01 <ynot000001@gmail.com> Date: Sat Feb 11 13:38:01 2023 -0500 Darkspawn is now a midround instead of a gamemode (#17833) * dspawn midround * disable * performance * move sec counting down * disable nightmare * changes S to H * runtime safety * H and D to var names commit435823b827Author: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 12:49:50 2023 -0500 Automatic changelog generation #17878 [ci skip] commitfa4b2b98a3Author: ynot01 <ynot000001@gmail.com> Date: Sat Feb 11 12:49:47 2023 -0500 You can no longer change directions while dead (#17878) * Update bindings_atom.dm * Update bindings_atom.dm * Update bindings_atom.dm commit75cfed640fAuthor: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 12:17:44 2023 -0500 Automatic changelog generation #17842 [ci skip] commit291a70fb8fAuthor: Molti <108117184+Moltijoe@users.noreply.github.com> Date: Sat Feb 11 11:17:42 2023 -0600 Removes appendix from darkspawn (#17842) * no appendix please * just uses nohunger * thing * might as well remove it from shadowpeople they have enough going against them as is commit1cc076d57aAuthor: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 12:14:44 2023 -0500 Automatic changelog generation #17828 [ci skip] commitfef1aed09bAuthor: Molti <108117184+Moltijoe@users.noreply.github.com> Date: Sat Feb 11 11:14:42 2023 -0600 IPC martial buffs (#17828) * IPC martial tweak * update the movespeed * it's the mob that does it * bit more uplink stuff * no other guns commitbf62a065f5Author: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 12:01:19 2023 -0500 Automatic changelog generation #17824 [ci skip] commit20c67e451bAuthor: ynot01 <ynot000001@gmail.com> Date: Sat Feb 11 12:01:16 2023 -0500 Antag Reputation Redux (#17824) * antag repwork * check centcom specifically * GLOB.player_list * Update antag_rep.txt * Update antag_rep.txt * better loop * set miner to 6 * set AI to 6 * cook 5 * psyfch 5 commit866c4f0e97Author: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 11:39:29 2023 -0500 Automatic changelog generation #17814 [ci skip] commit64726b0798Author: Redd <36747151+ReddicusDragon@users.noreply.github.com> Date: Sat Feb 11 11:39:26 2023 -0500 Changes lizard hiss and increases staff, mentor, and donor retention by allowing felinids to hiss. (#17814) * adds sound * felinids can hiss * felinids can purr * You can no longer purr at people NanoTrasen has noticed an increase in harassment complaints from stations that employ felinids. The reports indicate that felinids would purr at people. NanoTrasen has since banned workplace purring at people. * removes purring * update lizard hiss commitb956f2caaeAuthor: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 11:36:59 2023 -0500 Automatic changelog generation #17809 [ci skip] commit00769859a2Author: Molti <108117184+Moltijoe@users.noreply.github.com> Date: Sat Feb 11 10:36:57 2023 -0600 Nanite heart buff (#17809) commit87bd1794dbAuthor: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 11:36:15 2023 -0500 Automatic changelog generation #17805 [ci skip] commitf286bdb997Author: SapphicOverload <93578146+SapphicOverload@users.noreply.github.com> Date: Sat Feb 11 11:36:12 2023 -0500 you are a good (#17805) commita737b7291eAuthor: Ling <lingbleed@gmail.com> Date: Sat Feb 11 17:35:33 2023 +0100 Fix a ton of harddels (#17803) * Fix a ton of harddels * Out of scope * Stupid commitf77eb885d9Author: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 11:34:47 2023 -0500 Automatic changelog generation #17724 [ci skip] commit8f4993ae0bAuthor: Molti <108117184+Moltijoe@users.noreply.github.com> Date: Sat Feb 11 10:34:45 2023 -0600 Miners wormhole jaunter location shuffle (#17724) * Gives mining medic a jaunter * in the outfit rather than the locker --------- Co-authored-by: Jamie D <993128+JamieD1@users.noreply.github.com> commita6779b3a77Author: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 11:27:41 2023 -0500 Automatic changelog generation #17778 [ci skip] commit402e2d775aAuthor: Xander3359 <66163761+Xander3359@users.noreply.github.com> Date: Sat Feb 11 11:27:38 2023 -0500 One handed crusher (With new sprites) (#17778) * 1-Handed Crusher The crusher can now be held in 1 hand, wield it to use it. * one-handed crusher one-handed crusher * Update dynamic.json commitfa67c930d0Author: Jamie D <993128+JamieD1@users.noreply.github.com> Date: Sat Feb 11 16:23:06 2023 +0000 Update dynamic_rulesets_roundstart.dm commit0e05a643a6Author: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 11:20:01 2023 -0500 Automatic changelog generation #17720 [ci skip] commit738aac2d74Author: Manatee <74586965+MajManatee@users.noreply.github.com> Date: Sat Feb 11 10:19:59 2023 -0600 Revert "replaces chasm spawn from tendrils with lava (#17340)" (#17720) This reverts commitd0abdd2d33. commit0679f56ea6Author: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 11:19:12 2023 -0500 Automatic changelog generation #17609 [ci skip] commita5660a07e6Author: Theos <theubernyan@gmail.com> Date: Sat Feb 11 11:19:10 2023 -0500 Increase wizard playercount from 27 to 34 so its not syndicate station 2 (the second one) (#17609) * Increase wizard playercount from 27 to 37 so its not syndicate station 2 (the second one) * Update wizard.dm * Update dynamic_rulesets_roundstart.dm commitd1ec159cf3Author: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 10:50:38 2023 -0500 Automatic changelog generation #17610 [ci skip] commitf49b009b1dAuthor: BurgerLUA <8602857+BurgerLUA@users.noreply.github.com> Date: Sat Feb 11 07:50:35 2023 -0800 Increase nuke op from 27 to 37 so its not syndicate station 3 (the third one) (#17610) commit75b0447f82Author: Changelogs <action@github.com> Date: Sat Feb 11 14:07:34 2023 +0000 Automatic changelog compile [ci skip] commitab07a0c5caAuthor: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 04:18:21 2023 -0500 Automatic changelog generation #17739 [ci skip] commited09aa658dAuthor: Manatee <74586965+MajManatee@users.noreply.github.com> Date: Sat Feb 11 03:18:18 2023 -0600 Removes mod disks from loot pool, and makes them orderable from cargo. Also adds a KA crate. (#17739) * fug * no more disks commitf6cd327077Author: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 04:07:17 2023 -0500 Automatic changelog generation #17873 [ci skip] commit09a038e850Author: LazennG <58535870+LazennG@users.noreply.github.com> Date: Sat Feb 11 01:07:15 2023 -0800 no more curveballs (#17873) commit186fedce46Author: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 04:05:05 2023 -0500 Automatic changelog generation #17865 [ci skip] commit422a595d6cAuthor: Skrem_7 <98909416+Skrem7@users.noreply.github.com> Date: Sat Feb 11 04:05:02 2023 -0500 makes darkspawn mindshield text a little less cringe (#17865) * makes this text a little less cringe * i love repetition of sound commitc4217e2080Author: Yogbot-13 <admin@yogstation.net> Date: Sat Feb 11 04:04:45 2023 -0500 Automatic changelog generation #17867 [ci skip] commit20fc9d7f33Author: Theos <theubernyan@gmail.com> Date: Sat Feb 11 04:04:42 2023 -0500 Reduces drakeling attack cooldowns slightly to match the mining equipment they are meant to upgrade (#17867) commitfdf31d11a7Author: Changelogs <action@github.com> Date: Sat Feb 11 06:10:17 2023 +0000 Automatic changelog compile [ci skip] commit6b0ddaf194Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 20:45:30 2023 -0500 Automatic changelog generation #17863 [ci skip] commit484a70bdc6Author: Skrem_7 <98909416+Skrem7@users.noreply.github.com> Date: Fri Feb 10 20:45:27 2023 -0500 hammer fix (#17863) commitc3f4bee6a9Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 20:43:51 2023 -0500 Automatic changelog generation #17866 [ci skip] commit44d935e116Author: Mqiib <43766432+Mqiib@users.noreply.github.com> Date: Fri Feb 10 20:43:49 2023 -0500 Unfucks darkspawn veils but they're still weaker (#17866) * brtuh * Update yogstation/code/game/gamemodes/darkspawn/veil.dm whoops Co-authored-by: Molti <108117184+Moltijoe@users.noreply.github.com> --------- Co-authored-by: Molti <108117184+Moltijoe@users.noreply.github.com> commit80045a2877Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 19:56:54 2023 -0500 Automatic changelog generation #17770 [ci skip] commit40564ae7f4Author: githubuser4141 <61243846+githubuser4141@users.noreply.github.com> Date: Sat Feb 11 13:56:51 2023 +1300 Buffs the MK-II Ripley's speed (#17770) * dir * Update mecha_defense.dm * Update uplink_items.dm * Update uplink_items.dm * Update uplink_items.dm * Update ripley.dm * Update ripley.dm * Update uplink_items.dm commitbece519a8bAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 18:45:30 2023 -0500 Automatic changelog generation #17784 [ci skip] commit4a499be90fAuthor: Skrem_7 <98909416+Skrem7@users.noreply.github.com> Date: Fri Feb 10 18:45:27 2023 -0500 True semi-auto shotguns + racking medium/heavy ballistics requires both hands + removes outdated stechkin animations (#17784) * shotguns actually semi-auto now * updates desc * removes stechkin animations * fixes rack sound * Update code/modules/projectiles/guns/ballistic.dm Co-authored-by: tattax <71668564+tattax@users.noreply.github.com> * slight fixes --------- Co-authored-by: tattax <71668564+tattax@users.noreply.github.com> commit24ad52b6bdAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 18:22:35 2023 -0500 Automatic changelog generation #17835 [ci skip] commit053f8bf856Author: Redd <36747151+ReddicusDragon@users.noreply.github.com> Date: Fri Feb 10 18:22:32 2023 -0500 Typo fix (#17835) * Update swarmer.dm * Update scripture_scripts.dm * Update golems.dm * Update pen.dm * Update touch_attacks.dm * Update uplink_items.dm * Update explosive_fist.dm * Update garden_warfare.dm * Update stealth.dm * Update uplink_item.dm * Update code/modules/mob/living/carbon/human/species_types/golems.dm Co-authored-by: ynot01 <ynot000001@gmail.com> * Update scripture_scripts.dm --------- Co-authored-by: ynot01 <ynot000001@gmail.com> commitd0e1c6f1f9Author: Ling <lingbleed@gmail.com> Date: Sat Feb 11 00:09:14 2023 +0100 Actually fixes gas mixer sprite for real this time (#17840) commit66545d3beeAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 18:07:46 2023 -0500 Automatic changelog generation #17847 [ci skip] commitb04412e57eAuthor: Molti <108117184+Moltijoe@users.noreply.github.com> Date: Fri Feb 10 17:07:42 2023 -0600 Removes #1 cause of suicide in Lizards (#17847) * CarkFetishContent * 20 minutes and chat message * no dead lizards * optimization commitc6ab8818ffAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 18:01:32 2023 -0500 Automatic changelog generation #17854 [ci skip] commit0c13569569Author: Molti <108117184+Moltijoe@users.noreply.github.com> Date: Fri Feb 10 17:01:20 2023 -0600 Gives mining medic a laptop to keep track of bodycams (#17854) * Gives mining medic a laptop * upgraded network card commit9a3512a44bAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 17:59:29 2023 -0500 Automatic changelog generation #17836 [ci skip] commit606c9ced8fAuthor: Aquizit <70451213+Aquizit@users.noreply.github.com> Date: Fri Feb 10 16:59:27 2023 -0600 Adds Personnel HUD Type, gives HoP and Cap a pair of sunglasses with it (#17836) * adds personnel hud type, sunglasses for HoP and Cap with it * renames CMO shades for HoP/Cap, made new shades for CMO * forgot to make the sunglasses tint blue commitfc4a64ed52Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 17:58:53 2023 -0500 Automatic changelog generation #17871 [ci skip] commitab089cfae7Author: ynot01 <ynot000001@gmail.com> Date: Fri Feb 10 17:58:51 2023 -0500 Cult tiles now block atmos like everyone though it did (#17871) * Update reinf_floor.dm * Update cult_structures.dm * Update cult_structures.dm commit20af730457Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 17:58:27 2023 -0500 Automatic changelog generation #17819 [ci skip] commit3e918a5658Author: Mqiib <43766432+Mqiib@users.noreply.github.com> Date: Fri Feb 10 17:58:25 2023 -0500 Unstupidify (#17819) commit411c213dcdAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 17:58:11 2023 -0500 Automatic changelog generation #17818 [ci skip] commit919a2686b6Author: Ling <lingbleed@gmail.com> Date: Fri Feb 10 23:58:08 2023 +0100 Prevents wormholes from spawning in syndicate shuttles (#17818) commitb66d0720bbAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 17:56:47 2023 -0500 Automatic changelog generation #17811 [ci skip] commitb9eb469042Author: Molti <108117184+Moltijoe@users.noreply.github.com> Date: Fri Feb 10 16:56:44 2023 -0600 Reduces body temp increase from being on fire (#17811) * Greatly reduces heat from being on fire * even less commitcdb38b84fdAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 17:49:43 2023 -0500 Automatic changelog generation #17804 [ci skip] commit1f02d82d27Author: ynot01 <ynot000001@gmail.com> Date: Fri Feb 10 17:49:41 2023 -0500 from fortnite (#17804) do the thing commit0c64a222c8Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 17:47:18 2023 -0500 Automatic changelog generation #17801 [ci skip] commitf6bf19009fAuthor: Ezhan <39889035+Ethan4303@users.noreply.github.com> Date: Fri Feb 10 17:47:15 2023 -0500 rotates the gas simulator in yogstation turbine (#17801) commit7c9b4054a0Author: ynot01 <ynot000001@gmail.com> Date: Fri Feb 10 17:46:46 2023 -0500 Protects events from being faked random by admins (#17790) * Update _event.dm * Update _event.dm commitcf793830ecAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 17:46:06 2023 -0500 Automatic changelog generation #17785 [ci skip] commit15bb9f53b7Author: Skrem_7 <98909416+Skrem7@users.noreply.github.com> Date: Fri Feb 10 17:46:03 2023 -0500 adds a spare mag to oddjob kit (#17785) commitc69563273bAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 17:45:23 2023 -0500 Automatic changelog generation #17769 [ci skip] commit367cf38f16Author: ynot01 <ynot000001@gmail.com> Date: Fri Feb 10 17:45:20 2023 -0500 Purchasable autosurgeon for 5TC (#17769) * syndi cat * Update uplink_items.dm commit247a50bc9fAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 17:43:58 2023 -0500 Automatic changelog generation #17735 [ci skip] commit167ab6af2bAuthor: SapphicOverload <93578146+SapphicOverload@users.noreply.github.com> Date: Fri Feb 10 17:43:55 2023 -0500 Multilingual quirk can no longer give you centcom encrypted language and costs 2 points instead of 3 (#17735) * guh * Update good.dm commitbb77f2d6a3Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 17:22:33 2023 -0500 Automatic changelog generation #17856 [ci skip] commitf13f241426Author: Redd <36747151+ReddicusDragon@users.noreply.github.com> Date: Fri Feb 10 17:22:31 2023 -0500 Revert "Removes felinid language (#17825)" (#17856) This reverts commite75cb0ad00. commitc53b3bc784Author: Changelogs <action@github.com> Date: Fri Feb 10 22:17:13 2023 +0000 Automatic changelog compile [ci skip] commitbf214dad30Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 15:57:59 2023 -0500 Automatic changelog generation #17832 [ci skip] commit0144098f5cAuthor: Addust <80979251+Addust@users.noreply.github.com> Date: Fri Feb 10 20:57:56 2023 +0000 Gives onehalf a blue oxygen tank instead of a red one inside the safe (#17832) yes commit84c1ff3331Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 13:08:39 2023 -0500 Automatic changelog generation #17881 [ci skip] commite2ce0336ffAuthor: wejengin2 <48154165+wejengin2@users.noreply.github.com> Date: Fri Feb 10 19:08:36 2023 +0100 ye (#17881) commit596ac490f7Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 12:29:57 2023 -0500 Automatic changelog generation #17812 [ci skip] commit2047871e5bAuthor: Molti <108117184+Moltijoe@users.noreply.github.com> Date: Fri Feb 10 11:29:53 2023 -0600 Adds a chemical that purges nanites (#17812) * NaniteRemovalChemical * rename * Update code/modules/reagents/chemistry/reagents/medicine_reagents.dm Co-authored-by: Ling <lingbleed@gmail.com> --------- Co-authored-by: Ling <lingbleed@gmail.com> commitbb0d420b09Author: wejengin2 <48154165+wejengin2@users.noreply.github.com> Date: Fri Feb 10 16:04:20 2023 +0100 Massacres the unused maps. (#17764) * someone has to do it * camels * order * ok no commit0424f5f5e4Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 09:40:37 2023 -0500 Automatic changelog generation #17823 [ci skip] commit611fc49e0bAuthor: Jamie D <993128+JamieD1@users.noreply.github.com> Date: Fri Feb 10 14:40:33 2023 +0000 e (#17823) commitadda8bc9a0Author: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Fri Feb 10 15:17:47 2023 +0100 Update unique_donator_items.dm (#17874) commit3a8ad081f9Author: Changelogs <action@github.com> Date: Fri Feb 10 14:08:30 2023 +0000 Automatic changelog compile [ci skip] commitff2f15a395Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 05:01:24 2023 -0500 Automatic changelog generation #17848 [ci skip] commit58a00ef32dAuthor: Waterpig <49160555+Majkl-J@users.noreply.github.com> Date: Fri Feb 10 11:01:21 2023 +0100 Adds barricading of airlocks and doors (#17848) * I like wood 😩 * Makes them faster to remove * 😩 * I hate molti Co-authored-by: Molti <108117184+Moltijoe@users.noreply.github.com> --------- Co-authored-by: Molti <108117184+Moltijoe@users.noreply.github.com> commit726c31fd2fAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 04:29:51 2023 -0500 Automatic changelog generation #17807 [ci skip] commit9d4d28edd3Author: Redd <36747151+ReddicusDragon@users.noreply.github.com> Date: Fri Feb 10 04:29:48 2023 -0500 Removes corn syrup from catsip (#17807) commita995a0e6fdAuthor: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 04:28:25 2023 -0500 Automatic changelog generation #17831 [ci skip] commitd35292c3d4Author: Ling <lingbleed@gmail.com> Date: Fri Feb 10 10:28:20 2023 +0100 RPD now builds even when clicked on another pipe (#17831) commit51fd6de808Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 03:53:48 2023 -0500 Automatic changelog generation #17852 [ci skip] commit9f91e2edf7Author: Manatee <74586965+MajManatee@users.noreply.github.com> Date: Fri Feb 10 02:53:45 2023 -0600 les go (#17852) commita55a6d4297Author: Changelogs <action@github.com> Date: Fri Feb 10 06:11:39 2023 +0000 Automatic changelog compile [ci skip] commit380e400cb3Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 01:04:58 2023 -0500 Automatic changelog generation #17837 [ci skip] commit861567f4dbAuthor: Byemoh <baiomurang@gmail.com> Date: Fri Feb 10 00:04:56 2023 -0600 Update airlock.dm (#17837) commit08cec4a012Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 01:01:14 2023 -0500 Automatic changelog generation #17813 [ci skip] commit5cf47b2580Author: ynot01 <ynot000001@gmail.com> Date: Fri Feb 10 01:01:12 2023 -0500 Update hologram.dm (#17813) commitef783cb856Author: Yogbot-13 <admin@yogstation.net> Date: Fri Feb 10 00:58:35 2023 -0500 Automatic changelog generation #17834 [ci skip] commita00b6ce757Author: ynot01 <ynot000001@gmail.com> Date: Fri Feb 10 00:58:33 2023 -0500 Update medbeam.dm (#17834) commitd5b72b2259Author: Yogbot-13 <admin@yogstation.net> Date: Thu Feb 9 20:22:06 2023 -0500 Automatic changelog generation #17723 [ci skip] commit4a6973a465Author: Byemoh <baiomurang@gmail.com> Date: Thu Feb 9 19:22:03 2023 -0600 Falling into a chasm doesn't delete your body and someone can fish you up (#17723) * eeeee * e * map * break * eeeee * cope * Update chasm.dm commit229d6664efAuthor: Changelogs <action@github.com> Date: Thu Feb 9 22:17:48 2023 +0000 Automatic changelog compile [ci skip] commitf606eaac8eAuthor: Yogbot-13 <admin@yogstation.net> Date: Thu Feb 9 10:41:20 2023 -0500 Automatic changelog generation #17670 [ci skip] commit26ad93fd58Author: ynot01 <ynot000001@gmail.com> Date: Thu Feb 9 10:41:17 2023 -0500 Big Heretic revamp (finally) (#17670) * heresy * Update eldritch_book.dm * heat resistant lizards * 5 tile range only! * delete the shield dummy! * Update eldritch_items.dm * new sounds * Update eldritch_antag.dm * Update eldritch_items.dm * sanity * Update code/modules/antagonists/eldritch_cult/eldritch_book.dm Co-authored-by: Ling <lingbleed@gmail.com> --------- Co-authored-by: Ling <lingbleed@gmail.com> commit2264d7e6bcAuthor: Yogbot-13 <admin@yogstation.net> Date: Thu Feb 9 10:36:18 2023 -0500 Automatic changelog generation #17795 [ci skip] commit6e401075bdAuthor: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Thu Feb 9 16:36:15 2023 +0100 It now takes 6 seconds to cremate someone, and 3 seconds to break out if they're conscious (#17795) * Update morgue.dm * Update morgue.dm * Update code/game/objects/structures/morgue.dm * Update code/game/objects/structures/morgue.dm commitc28d359784Author: Yogbot-13 <admin@yogstation.net> Date: Thu Feb 9 10:27:17 2023 -0500 Automatic changelog generation #17766 [ci skip] commita0c31d2aeeAuthor: Skrem_7 <98909416+Skrem7@users.noreply.github.com> Date: Thu Feb 9 10:27:13 2023 -0500 brrrt (#17766) commit9ff2bc445aAuthor: Changelogs <action@github.com> Date: Thu Feb 9 06:11:19 2023 +0000 Automatic changelog compile [ci skip] commitd268cadedaAuthor: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 8 18:44:13 2023 -0500 Automatic changelog generation #17806 [ci skip] commitc223e28c9dAuthor: Ling <lingbleed@gmail.com> Date: Thu Feb 9 00:44:11 2023 +0100 Fix 'id in pda' pref (#17806) commit44decca884Author: Changelogs <action@github.com> Date: Wed Feb 8 22:16:57 2023 +0000 Automatic changelog compile [ci skip] commitd750b905ddAuthor: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 8 13:17:57 2023 -0500 Automatic changelog generation #17777 [ci skip] commit00a527192bAuthor: Manatee <74586965+MajManatee@users.noreply.github.com> Date: Wed Feb 8 12:17:54 2023 -0600 More snowflake items - Boxta (#17777) * all non spritework * Quirky first hat * mmm sprites commitf028dd3418Author: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 8 12:31:26 2023 -0500 Automatic changelog generation #17825 [ci skip] commite75cb0ad00Author: Redd <36747151+ReddicusDragon@users.noreply.github.com> Date: Wed Feb 8 12:31:23 2023 -0500 Removes felinid language (#17825) * Removes felinid language from silicons * Removes multilingual (felinid) trait * Removes felinid from being granted upon using cat ears * Redd moment * removes felinid from tongue's possible language base. * removes felinid from telecomms * removes felinid from language holders * removes the felinid language as it provides a material benefit to donors * gives felinids the english language holder * removes felinid language icon commit060c415b04Author: Changelogs <action@github.com> Date: Wed Feb 8 14:08:15 2023 +0000 Automatic changelog compile [ci skip] commit7345f0e82dAuthor: Yogbot-13 <admin@yogstation.net> Date: Wed Feb 8 05:39:07 2023 -0500 Automatic changelog generation #17846 [ci skip] commit3e51ef4f8bAuthor: Molti <108117184+Moltijoe@users.noreply.github.com> Date: Wed Feb 8 04:39:03 2023 -0600 Update lavaland_surface_maze.dmm (#17846) commite7823cfc39Author: Changelogs <action@github.com> Date: Wed Feb 8 06:11:43 2023 +0000 Automatic changelog compile [ci skip] commitd927ebc03dAuthor: Yogbot-13 <admin@yogstation.net> Date: Tue Feb 7 20:39:04 2023 -0500 Automatic changelog generation #17802 [ci skip] commit0fd7dcfc9dAuthor: cuackles <68789204+cuackles@users.noreply.github.com> Date: Tue Feb 7 22:39:01 2023 -0300 monkey energy no longer becomes invisible when crushed (#17802) * Update janitor.dmi * Update janitor.dmi * Update janitor.dmi commit61601d937eAuthor: Yogbot-13 <admin@yogstation.net> Date: Tue Feb 7 19:57:01 2023 -0500 Automatic changelog generation #17791 [ci skip] commit902e743274Author: BurgerLUA <8602857+BurgerLUA@users.noreply.github.com> Date: Tue Feb 7 16:56:58 2023 -0800 MALF is no longer continuous (#17791) commit81c0963f74Author: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Wed Feb 8 01:56:07 2023 +0100 Update adminhelp.dm (#17783) commit95947d2fe2Author: Yogbot-13 <admin@yogstation.net> Date: Tue Feb 7 19:53:00 2023 -0500 Automatic changelog generation #17742 [ci skip] commitf83723c389Author: Ling <lingbleed@gmail.com> Date: Wed Feb 8 01:52:57 2023 +0100 Ports SSfoam and SSsmoke (#17742) * Ports SSfoam and SSsmoke * Remove dupe define commit9bb63a7577Author: Yogbot-13 <admin@yogstation.net> Date: Tue Feb 7 19:52:22 2023 -0500 Automatic changelog generation #17738 [ci skip] commit0cf7ecf050Author: Ling <lingbleed@gmail.com> Date: Wed Feb 8 01:52:19 2023 +0100 Actually adds passive vent to RPD (#17738) * Actually adds passive vent to RPD * Fixed and re-added passive vents commit5b9d198f6fAuthor: Yogbot-13 <admin@yogstation.net> Date: Tue Feb 7 18:37:58 2023 -0500 Automatic changelog generation #17816 [ci skip] commit148e80f8ecAuthor: ynot01 <ynot000001@gmail.com> Date: Tue Feb 7 18:37:55 2023 -0500 Fixes foam darts not doing any stamina damage (#17816) * Update foam_dart.dm * Update foam_dart.dm commit42165a9806Author: Changelogs <action@github.com> Date: Tue Feb 7 22:17:04 2023 +0000 Automatic changelog compile [ci skip] commitb9f7613d59Author: Yogbot-13 <admin@yogstation.net> Date: Tue Feb 7 14:59:58 2023 -0500 Automatic changelog generation #17748 [ci skip] commit1cfbe0fd48Author: Byemoh <baiomurang@gmail.com> Date: Tue Feb 7 13:59:54 2023 -0600 adds det's sunglasses and shit on his desk on gax and other misc stuff (#17748) * eeeeeeeeee * shudders * readds stuff commit3947b4ac5aAuthor: Yogbot-13 <admin@yogstation.net> Date: Tue Feb 7 11:46:17 2023 -0500 Automatic changelog generation #17799 [ci skip] commitc3cfad4913Author: ynot01 <ynot000001@gmail.com> Date: Tue Feb 7 11:46:14 2023 -0500 weird (#17799) commit8de1275a99Author: Changelogs <action@github.com> Date: Tue Feb 7 14:08:44 2023 +0000 Automatic changelog compile [ci skip] commit198c9f89aaAuthor: Yogbot-13 <admin@yogstation.net> Date: Tue Feb 7 06:52:05 2023 -0500 Automatic changelog generation #17822 [ci skip] commit63928e7f87Author: Jamie D <993128+JamieD1@users.noreply.github.com> Date: Tue Feb 7 11:52:02 2023 +0000 Update game_options.txt (#17822) commit7daad46a71Author: Yogbot-13 <admin@yogstation.net> Date: Tue Feb 7 05:15:44 2023 -0500 Automatic changelog generation #17776 [ci skip] commitb01613407aAuthor: Byemoh <baiomurang@gmail.com> Date: Tue Feb 7 04:15:40 2023 -0600 Alternate Gax Arrivals design for free miner ship (#17776) * Update GaxStation.dmm * Update GaxStation.dmm * e commit23abc5abd2Author: Changelogs <action@github.com> Date: Tue Feb 7 06:11:41 2023 +0000 Automatic changelog compile [ci skip] commitd170eab0aaAuthor: Yogbot-13 <admin@yogstation.net> Date: Mon Feb 6 19:03:32 2023 -0500 Automatic changelog generation #17797 [ci skip] commit1aac303800Author: Redd <36747151+ReddicusDragon@users.noreply.github.com> Date: Mon Feb 6 19:03:29 2023 -0500 Updates inventory procs to allow silent pickup (#17797) * adds make_sound parameter to put_in_hands, first step to making items able to be picked up with or without sound * adds make_sound parameter to put_in_active_hand, second step in allowing items to be picked up with or without sound * adds make_sound parameter to put_in_hand, third step * redd moment * weeeeeeee * NukeOps nuke code papers spawning are now silent commit57283fa900Author: Yogbot-13 <admin@yogstation.net> Date: Mon Feb 6 18:17:08 2023 -0500 Automatic changelog generation #17712 [ci skip] commitb2c06b0866Author: Byemoh <baiomurang@gmail.com> Date: Mon Feb 6 17:17:05 2023 -0600 Lavaland Corn Maze Ruin (#17712) * eeee * yep * Update lavaruinblacklist.txt --------- Co-authored-by: wejengin2 <48154165+wejengin2@users.noreply.github.com> commit0d00d7457cAuthor: Changelogs <action@github.com> Date: Mon Feb 6 22:16:37 2023 +0000 Automatic changelog compile [ci skip] commit7955f64f79Author: Yogbot-13 <admin@yogstation.net> Date: Mon Feb 6 10:52:52 2023 -0500 Automatic changelog generation #17582 [ci skip] commit8df29b5392Author: 00ze-cyclone <96987868+00ze-cyclone@users.noreply.github.com> Date: Mon Feb 6 16:52:48 2023 +0100 Uranium eating aegun, second try (#17582) * new aegun * it just work * Update code/modules/projectiles/guns/energy/energy_gun.dm Co-authored-by: Molti <108117184+Moltijoe@users.noreply.github.com> * Add files via upload * dfuisqbdusq --------- Co-authored-by: Molti <108117184+Moltijoe@users.noreply.github.com> commit498e4e6ae4Author: Changelogs <action@github.com> Date: Mon Feb 6 14:09:30 2023 +0000 Automatic changelog compile [ci skip] commite37654707eAuthor: Yogbot-13 <admin@yogstation.net> Date: Mon Feb 6 07:43:42 2023 -0500 Automatic changelog generation #17768 [ci skip] commit5725a33174Author: ynot01 <ynot000001@gmail.com> Date: Mon Feb 6 07:43:39 2023 -0500 Foam darts now deal stamina damage if you're holding a toy foam gun (#17768) * Update foam_dart.dm * Update foam_dart.dm commitd7f3ee4734Author: Yogbot-13 <admin@yogstation.net> Date: Mon Feb 6 06:38:11 2023 -0500 Automatic changelog generation #17707 [ci skip] commita6c0573423Author: Mqiib <43766432+Mqiib@users.noreply.github.com> Date: Mon Feb 6 06:38:08 2023 -0500 Shimmyjimmies ion bolts to be less "why are they like that" and more "hey that kinda makes sense" (#17707) * NEW IONS * forgor * hos gun shooty commitcc868113c1Author: Changelogs <action@github.com> Date: Sun Feb 5 22:15:50 2023 +0000 Automatic changelog compile [ci skip] commit0343eb61c8Author: Yogbot-13 <admin@yogstation.net> Date: Sun Feb 5 14:37:43 2023 -0500 Automatic changelog generation #17749 [ci skip] commite9bb5b6679Author: ynot01 <ynot000001@gmail.com> Date: Sun Feb 5 14:37:41 2023 -0500 Adds the rest of the roundstart race languages to multilingual quirks (#17749) * Update good.dm * Update code/datums/traits/good.dm Co-authored-by: 00ze-cyclone <96987868+00ze-cyclone@users.noreply.github.com> --------- Co-authored-by: 00ze-cyclone <96987868+00ze-cyclone@users.noreply.github.com> commit00d55013b1Author: Yogbot-13 <admin@yogstation.net> Date: Sun Feb 5 12:14:21 2023 -0500 Automatic changelog generation #17779 [ci skip] commit85661c5d71Author: LazennG <58535870+LazennG@users.noreply.github.com> Date: Sun Feb 5 09:14:18 2023 -0800 buster arm patch (#17779) commit20b3adaae3Author: Changelogs <action@github.com> Date: Sun Feb 5 14:07:35 2023 +0000 Automatic changelog compile [ci skip] commit123638a50eAuthor: Yogbot-13 <admin@yogstation.net> Date: Sun Feb 5 01:21:47 2023 -0500 Automatic changelog generation #17774 [ci skip] commit707b8379f9Author: ktlwjec <122807629+ktlwjec0@users.noreply.github.com> Date: Sun Feb 5 06:21:45 2023 +0000 blue burger uses patty (#17774) commit6ba5dd3f5fAuthor: Changelogs <action@github.com> Date: Sun Feb 5 06:10:13 2023 +0000 Automatic changelog compile [ci skip] * Revert "Squashed commit of the following:" This reverts commit294dc43cff. * makes anomaly quiver printable * running it back * DIE ICON CORNFLAKES DIE * Revert "DIE ICON CORNFLAKES DIE" This reverts commita5294ffab4. * if this does not work I will scream * i forgor lazenn redid this * linter fixes? * weh * adds returning variable to break bow * fixes quiver/hardlight outlines * resets dmi files * hello? * indentation my beloathed * icons? please don't github * fixes gumballs/lollipops * fixes foam force shotguns * Revert "fixes foam force shotguns" This reverts commit37d079dc91. * fixes foam force for real * tidies up some sprites * agh * fixes bone-tipped nocked sprite * makes it so beanbag "slugs" don't look like syringes * fixes in-hand bone-tipped * removes message_admins from debugging (oops) * fixes an oversight with bone crossbow crafting * aaa * agh * Agh x2 * should fix icon cornflakes * killing * holy shit i think i learned something today * a g h --------- Co-authored-by: nmajask <nmajask@gmail.com>
1965 lines
73 KiB
Plaintext
1965 lines
73 KiB
Plaintext
//The chests dropped by mob spawner tendrils. Also contains associated loot.
|
|
GLOBAL_LIST_EMPTY(aide_list)
|
|
#define HIEROPHANT_CLUB_CARDINAL_DAMAGE 30
|
|
|
|
|
|
/obj/structure/closet/crate/necropolis
|
|
name = "necropolis chest"
|
|
desc = "It's watching you closely."
|
|
icon_state = "necrocrate"
|
|
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
|
|
|
/obj/structure/closet/crate/necropolis/tendril
|
|
desc = "It's watching you suspiciously."
|
|
|
|
/obj/structure/closet/crate/necropolis/tendril/PopulateContents()
|
|
var/loot = rand(1,23)
|
|
switch(loot)
|
|
if(1)
|
|
new /obj/item/shared_storage/red(src)
|
|
if(2)
|
|
new /obj/item/clothing/under/drip(src)
|
|
new /obj/item/clothing/shoes/drip(src)
|
|
if(3)
|
|
new /obj/item/bodypart/r_arm/robot/seismic(src)
|
|
if(4)
|
|
new /obj/item/reagent_containers/glass/bottle/potion/flight(src)
|
|
if(5)
|
|
new /obj/item/stack/sheet/mineral/mythril(src)
|
|
if(6)
|
|
new /obj/item/rod_of_asclepius(src)
|
|
if(7)
|
|
new /obj/item/organ/heart/cursed/wizard(src)
|
|
if(8)
|
|
new /obj/item/ship_in_a_bottle(src)
|
|
if(9)
|
|
new /obj/item/clothing/gloves/gauntlets(src)
|
|
if(10)
|
|
new /obj/item/jacobs_ladder(src)
|
|
if(11)//select and spawn a random nullrod that a chaplain could choose from
|
|
var/found = FALSE
|
|
while(!found)
|
|
var/path = pick(subtypesof(/obj/item/nullrod))
|
|
var/obj/item/nullrod/rod = new path(src)
|
|
if(rod.chaplain_spawnable)
|
|
found = TRUE
|
|
else
|
|
qdel(rod)
|
|
if(12)
|
|
new /obj/item/warp_cube/red(src)
|
|
if(13)
|
|
new /obj/item/organ/heart/gland/heals(src)
|
|
if(14)
|
|
new /obj/item/eflowers(src)
|
|
if(15)
|
|
new /obj/item/voodoo(src)
|
|
if(16)
|
|
new /obj/item/clothing/suit/space/hardsuit/powerarmor_advanced(src)
|
|
if(17)
|
|
new /obj/item/book_of_babel(src)
|
|
if(18)
|
|
new /obj/item/borg/upgrade/modkit/lifesteal(src)
|
|
new /obj/item/bedsheet/cult(src)
|
|
if(19)
|
|
new /obj/item/clothing/neck/necklace/memento_mori(src)
|
|
if(20)
|
|
new /obj/item/rune_scimmy(src)
|
|
if(21)
|
|
new /obj/item/dnainjector/dwarf(src)
|
|
new /obj/item/grenade/plastic/miningcharge/mega(src)
|
|
new /obj/item/grenade/plastic/miningcharge/mega(src)
|
|
new /obj/item/grenade/plastic/miningcharge/mega(src)
|
|
if(22)
|
|
new /obj/item/clothing/gloves/gauntlets(src)
|
|
if(23)
|
|
new /obj/item/gun/ballistic/bow/ashen(src)
|
|
new /obj/item/storage/belt/quiver/returning/bone(src)
|
|
|
|
//KA modkit design discs
|
|
/obj/item/disk/design_disk/modkit_disc
|
|
name = "KA Mod Disk"
|
|
desc = "A design disc containing the design for a unique kinetic accelerator modkit. It's compatible with a research console."
|
|
icon_state = "datadisk1"
|
|
var/modkit_design = /datum/design/unique_modkit
|
|
|
|
/obj/item/disk/design_disk/modkit_disc/Initialize()
|
|
. = ..()
|
|
blueprints[1] = new modkit_design
|
|
|
|
/datum/design/unique_modkit
|
|
category = list("Mining Designs", "Cyborg Upgrade Modules") //can't be normally obtained
|
|
build_type = PROTOLATHE | MECHFAB
|
|
departmental_flags = DEPARTMENTAL_FLAG_CARGO
|
|
|
|
//Spooky special loot
|
|
|
|
//Rod of Asclepius
|
|
/obj/item/rod_of_asclepius
|
|
name = "\improper Rod of Asclepius"
|
|
desc = "A wooden rod about the size of your forearm with a snake carved around it, winding its way up the sides of the rod. Something about it seems to inspire in you the responsibilty and duty to help others."
|
|
icon = 'icons/obj/lavaland/artefacts.dmi'
|
|
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
|
|
icon_state = "asclepius_dormant"
|
|
var/activated = FALSE
|
|
var/usedHand
|
|
var/list/advanced_surgeries = list()
|
|
var/efficiency = 1
|
|
|
|
/obj/item/rod_of_asclepius/attack_self(mob/user)
|
|
if(activated)
|
|
return
|
|
if(!iscarbon(user))
|
|
to_chat(user, span_warning("The snake carving seems to come alive, if only for a moment, before returning to its dormant state, almost as if it finds you incapable of holding its oath."))
|
|
return
|
|
var/mob/living/carbon/itemUser = user
|
|
usedHand = itemUser.get_held_index_of_item(src)
|
|
if(itemUser.has_status_effect(STATUS_EFFECT_HIPPOCRATIC_OATH))
|
|
to_chat(user, span_warning("You can't possibly handle the responsibility of more than one rod!"))
|
|
return
|
|
var/failText = span_warning("The snake seems unsatisfied with your incomplete oath and returns to its previous place on the rod, returning to its dormant, wooden state. You must stand still while completing your oath!")
|
|
to_chat(itemUser, span_notice("The wooden snake that was carved into the rod seems to suddenly come alive and begins to slither down your arm! The compulsion to help others grows abnormally strong..."))
|
|
if(do_after(itemUser, 4 SECONDS, itemUser))
|
|
itemUser.say("I swear to fulfill, to the best of my ability and judgment, this covenant:", forced = "hippocratic oath")
|
|
else
|
|
to_chat(itemUser, failText)
|
|
return
|
|
if(do_after(itemUser, 2 SECONDS, itemUser))
|
|
itemUser.say("I will apply, for the benefit of the sick, all measures that are required, avoiding those twin traps of overtreatment and therapeutic nihilism.", forced = "hippocratic oath")
|
|
else
|
|
to_chat(itemUser, failText)
|
|
return
|
|
if(do_after(itemUser, 3 SECONDS, itemUser))
|
|
itemUser.say("I will remember that I remain a member of society, with special obligations to all my fellow human beings, those sound of mind and body as well as the infirm.", forced = "hippocratic oath")
|
|
else
|
|
to_chat(itemUser, failText)
|
|
return
|
|
if(do_after(itemUser, 3 SECONDS, itemUser))
|
|
itemUser.say("If I do not violate this oath, may I enjoy life and art, respected while I live and remembered with affection thereafter. May I always act so as to preserve the finest traditions of my calling and may I long experience the joy of healing those who seek my help.", forced = "hippocratic oath")
|
|
else
|
|
to_chat(itemUser, failText)
|
|
return
|
|
to_chat(itemUser, span_notice("The snake, satisfied with your oath, attaches itself and the rod to your forearm with an inseparable grip. Your thoughts seem to only revolve around the core idea of helping others, and harm is nothing more than a distant, wicked memory..."))
|
|
var/datum/status_effect/hippocraticOath/effect = itemUser.apply_status_effect(STATUS_EFFECT_HIPPOCRATIC_OATH, efficiency, type)
|
|
effect.hand = usedHand
|
|
activated()
|
|
|
|
/obj/item/rod_of_asclepius/proc/activated()
|
|
item_flags = DROPDEL
|
|
ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT)
|
|
desc = "A short wooden rod with a mystical snake inseparably gripping itself and the rod to your forearm. It flows with a healing energy that disperses amongst yourself and those around you. The snake can learn surgeries from disks or operating consoles by hitting them with it."
|
|
icon_state = "asclepius_active"
|
|
activated = TRUE
|
|
|
|
/obj/item/rod_of_asclepius/afterattack(obj/item/O, mob/user, proximity)
|
|
. = ..()
|
|
if(!proximity)
|
|
return
|
|
if(!activated)
|
|
return
|
|
if(istype(O, /obj/item/disk/surgery))
|
|
to_chat(user, span_notice("Your snake bites into [O], and seems to have learned the surgery procedures stored in the disk."))
|
|
var/obj/item/disk/surgery/D = O
|
|
if(do_after(user, 1 SECONDS, O))
|
|
advanced_surgeries |= D.surgeries
|
|
return TRUE
|
|
if(istype(O, /obj/machinery/computer/operating))
|
|
to_chat(user, span_notice("You move your snake in view of [O], allowing it to memorize the surgery procedures from the console."))
|
|
var/obj/machinery/computer/operating/OC = O
|
|
if(do_after(user, 1 SECONDS, O))
|
|
advanced_surgeries |= OC.advanced_surgeries
|
|
return TRUE
|
|
return
|
|
|
|
//Memento Mori
|
|
/obj/item/clothing/neck/necklace/memento_mori
|
|
name = "Memento Mori"
|
|
desc = "A mysterious pendant. An inscription on it says: \"Certain death tomorrow means certain life today.\""
|
|
icon = 'icons/obj/lavaland/artefacts.dmi'
|
|
icon_state = "memento_mori"
|
|
actions_types = list(/datum/action/item_action/hands_free/memento_mori)
|
|
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
|
var/mob/living/carbon/human/active_owner
|
|
|
|
/obj/item/clothing/neck/necklace/memento_mori/item_action_slot_check(slot)
|
|
return slot == SLOT_NECK
|
|
|
|
/obj/item/clothing/neck/necklace/memento_mori/attack_hand(mob/user)
|
|
if(active_owner && user == active_owner)
|
|
var/safety = alert(user, "Doing this will instantly kill you, reducing you to nothing but dust.", "Take off [src]?", "Abort", "Proceed")
|
|
if(safety != "Proceed")
|
|
return
|
|
. = ..()
|
|
|
|
/obj/item/clothing/neck/necklace/memento_mori/dropped(mob/user)
|
|
..()
|
|
if(active_owner)
|
|
mori()
|
|
|
|
//Just in case
|
|
/obj/item/clothing/neck/necklace/memento_mori/Destroy()
|
|
if(active_owner)
|
|
mori()
|
|
return ..()
|
|
|
|
/obj/item/clothing/neck/necklace/memento_mori/proc/memento(mob/living/carbon/human/user)
|
|
var/list/hasholos = user.hasparasites()
|
|
if(hasholos.len)
|
|
to_chat(user, span_warning("The pendant refuses to work with a guardian spirit..."))
|
|
return
|
|
if(IS_BLOODSUCKER(user))
|
|
to_chat(user, span_warning("The Memento notices your undead soul, and refuses to react.."))
|
|
return
|
|
to_chat(user, span_warning("You feel your life being drained by the pendant..."))
|
|
if(do_after(user, 4 SECONDS, user))
|
|
to_chat(user, span_notice("Your lifeforce is now linked to the pendant! You feel like removing it would kill you, and yet you instinctively know that until then, you won't die."))
|
|
ADD_TRAIT(user, TRAIT_NODEATH, "memento_mori")
|
|
ADD_TRAIT(user, TRAIT_NOHARDCRIT, "memento_mori")
|
|
ADD_TRAIT(user, TRAIT_NOCRITDAMAGE, "memento_mori")
|
|
icon_state = "memento_mori_active"
|
|
active_owner = user
|
|
RegisterSignal(src, COMSIG_ITEM_PRESTRIP, .proc/moriwarn)
|
|
|
|
/obj/item/clothing/neck/necklace/memento_mori/proc/moriwarn()
|
|
active_owner.visible_message(span_userdanger("The [src] writhes and shudders as it starts to tear away [active_owner]'s lifeforce!"))
|
|
|
|
/obj/item/clothing/neck/necklace/memento_mori/proc/mori()
|
|
icon_state = "memento_mori"
|
|
if(!active_owner)
|
|
return
|
|
UnregisterSignal(src, COMSIG_ITEM_PRESTRIP)
|
|
var/mob/living/carbon/human/H = active_owner //to avoid infinite looping when dust unequips the pendant
|
|
active_owner = null
|
|
to_chat(H, span_userdanger("You feel your life rapidly slipping away from you!"))
|
|
H.dust(TRUE, TRUE)
|
|
|
|
/datum/action/item_action/hands_free/memento_mori
|
|
check_flags = NONE
|
|
name = "Memento Mori"
|
|
desc = "Bind your life to the pendant."
|
|
|
|
/datum/action/item_action/hands_free/memento_mori/Trigger()
|
|
var/obj/item/clothing/neck/necklace/memento_mori/MM = target
|
|
if(!MM.active_owner)
|
|
if(ishuman(owner))
|
|
MM.memento(owner)
|
|
else
|
|
to_chat(owner, span_warning("You try to free your lifeforce from the pendant..."))
|
|
if(do_after(owner, 4 SECONDS, owner))
|
|
MM.mori()
|
|
|
|
//Wisp Lantern
|
|
/obj/item/wisp_lantern
|
|
name = "spooky lantern"
|
|
desc = "This lantern gives off no light, but is home to a friendly wisp."
|
|
icon = 'icons/obj/lighting.dmi'
|
|
icon_state = "lantern-blue"
|
|
item_state = "lantern"
|
|
lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi'
|
|
var/obj/effect/wisp/wisp
|
|
|
|
/obj/item/wisp_lantern/attack_self(mob/user)
|
|
if(!wisp)
|
|
to_chat(user, span_warning("The wisp has gone missing!"))
|
|
icon_state = "lantern"
|
|
return
|
|
|
|
if(wisp.loc == src)
|
|
to_chat(user, span_notice("You release the wisp. It begins to bob around your head."))
|
|
icon_state = "lantern"
|
|
wisp.orbit(user, 20)
|
|
SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Freed")
|
|
|
|
else
|
|
to_chat(user, span_notice("You return the wisp to the lantern."))
|
|
icon_state = "lantern-blue"
|
|
wisp.forceMove(src)
|
|
SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Returned")
|
|
|
|
/obj/item/wisp_lantern/Initialize()
|
|
. = ..()
|
|
wisp = new(src)
|
|
|
|
/obj/item/wisp_lantern/Destroy()
|
|
if(wisp)
|
|
if(wisp.loc == src)
|
|
qdel(wisp)
|
|
else
|
|
wisp.visible_message(span_notice("[wisp] has a sad feeling for a moment, then it passes."))
|
|
return ..()
|
|
|
|
/obj/effect/wisp
|
|
name = "friendly wisp"
|
|
desc = "Happy to light your way."
|
|
icon = 'icons/obj/lighting.dmi'
|
|
icon_state = "orb"
|
|
light_system = MOVABLE_LIGHT
|
|
light_range = 7
|
|
light_flags = LIGHT_ATTACHED
|
|
layer = ABOVE_ALL_MOB_LAYER
|
|
var/sight_flags = SEE_MOBS
|
|
var/lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
|
|
|
/obj/effect/wisp/orbit(atom/thing, radius, clockwise, rotation_speed, rotation_segments, pre_rotation, lockinorbit)
|
|
. = ..()
|
|
if(ismob(thing))
|
|
RegisterSignal(thing, COMSIG_MOB_UPDATE_SIGHT, .proc/update_user_sight)
|
|
var/mob/being = thing
|
|
being.update_sight()
|
|
to_chat(thing, span_notice("The wisp enhances your vision."))
|
|
|
|
/obj/effect/wisp/stop_orbit(datum/component/orbiter/orbits)
|
|
. = ..()
|
|
if(ismob(orbits.parent))
|
|
UnregisterSignal(orbits.parent, COMSIG_MOB_UPDATE_SIGHT)
|
|
to_chat(orbits.parent, span_notice("Your vision returns to normal."))
|
|
|
|
/obj/effect/wisp/proc/update_user_sight(mob/user)
|
|
user.sight |= sight_flags
|
|
if(!isnull(lighting_alpha))
|
|
user.lighting_alpha = min(user.lighting_alpha, lighting_alpha)
|
|
|
|
//Red/Blue Cubes
|
|
/obj/item/warp_cube
|
|
name = "blue cube"
|
|
desc = "A mysterious blue cube."
|
|
icon = 'icons/obj/lavaland/artefacts.dmi'
|
|
icon_state = "blue_cube"
|
|
var/teleport_color = "#3FBAFD"
|
|
var/obj/item/warp_cube/linked
|
|
var/teleporting = FALSE
|
|
|
|
/obj/item/warp_cube/Destroy()
|
|
if(!QDELETED(linked))
|
|
qdel(linked)
|
|
linked = null
|
|
return ..()
|
|
|
|
/obj/item/warp_cube/attack_self(mob/user)
|
|
var/turf/current_location = get_turf(user)//yogs added a current location check that was totally ripped from the hand tele code honk
|
|
var/area/current_area = current_location.loc //yogs more location check stuff
|
|
if(!linked || current_area.noteleport) //yogs added noteleport
|
|
to_chat(user, "[src] fizzles uselessly.")
|
|
return
|
|
if(teleporting)
|
|
return
|
|
if(!is_mining_level(current_location.z))
|
|
user.visible_message(span_danger("[user] starts fiddling with [src]!"))
|
|
if(!do_after(user, 3 SECONDS, user))
|
|
return
|
|
teleporting = TRUE
|
|
linked.teleporting = TRUE
|
|
var/turf/T = get_turf(src)
|
|
new /obj/effect/temp_visual/warp_cube(T, user, teleport_color, TRUE)
|
|
SSblackbox.record_feedback("tally", "warp_cube", 1, type)
|
|
new /obj/effect/temp_visual/warp_cube(get_turf(linked), user, linked.teleport_color, FALSE)
|
|
var/obj/effect/warp_cube/link_holder = new /obj/effect/warp_cube(T)
|
|
user.forceMove(link_holder) //mess around with loc so the user can't wander around
|
|
sleep(0.25 SECONDS)
|
|
if(QDELETED(user))
|
|
qdel(link_holder)
|
|
return
|
|
if(QDELETED(linked))
|
|
user.forceMove(get_turf(link_holder))
|
|
qdel(link_holder)
|
|
return
|
|
link_holder.forceMove(get_turf(linked))
|
|
sleep(0.25 SECONDS)
|
|
if(QDELETED(user))
|
|
qdel(link_holder)
|
|
return
|
|
teleporting = FALSE
|
|
if(!QDELETED(linked))
|
|
linked.teleporting = FALSE
|
|
user.forceMove(get_turf(link_holder))
|
|
qdel(link_holder)
|
|
|
|
/obj/item/warp_cube/red
|
|
name = "red cube"
|
|
desc = "A mysterious red cube."
|
|
icon_state = "red_cube"
|
|
teleport_color = "#FD3F48"
|
|
|
|
/obj/item/warp_cube/red/Initialize()
|
|
. = ..()
|
|
if(!linked)
|
|
var/obj/item/warp_cube/blue = new(src.loc)
|
|
linked = blue
|
|
blue.linked = src
|
|
|
|
/obj/effect/warp_cube
|
|
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
|
anchored = TRUE
|
|
|
|
/obj/effect/warp_cube/ex_act(severity, target)
|
|
return
|
|
|
|
//Meat Hook
|
|
/obj/item/gun/magic/hook
|
|
name = "meat hook"
|
|
desc = "Mid or feed."
|
|
ammo_type = /obj/item/ammo_casing/magic/hook
|
|
icon_state = "hook"
|
|
item_state = "chain"
|
|
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
|
fire_sound = 'sound/weapons/batonextend.ogg'
|
|
max_charges = 1
|
|
item_flags = NEEDS_PERMIT | NOBLUDGEON
|
|
force = 18
|
|
|
|
/obj/item/ammo_casing/magic/hook
|
|
name = "hook"
|
|
desc = "A hook."
|
|
projectile_type = /obj/item/projectile/hook
|
|
caliber = "hook"
|
|
icon_state = "hook"
|
|
|
|
/obj/item/projectile/hook
|
|
name = "hook"
|
|
icon_state = "hook"
|
|
icon = 'icons/obj/lavaland/artefacts.dmi'
|
|
pass_flags = PASSTABLE
|
|
damage = 25
|
|
armour_penetration = 100
|
|
damage_type = BRUTE
|
|
hitsound = 'sound/effects/splat.ogg'
|
|
knockdown = 30
|
|
var/chain
|
|
|
|
/obj/item/projectile/hook/fire(setAngle)
|
|
if(firer)
|
|
chain = firer.Beam(src, icon_state = "chain", time = INFINITY, maxdistance = INFINITY)
|
|
..()
|
|
//TODO: root the firer until the chain returns
|
|
|
|
/obj/item/projectile/hook/on_hit(atom/target, blocked)
|
|
. = ..()
|
|
if(ismovable(target) && blocked != 100)
|
|
var/atom/movable/A = target
|
|
if(A.anchored)
|
|
return
|
|
A.visible_message(span_danger("[A] is snagged by [firer]'s hook!"))
|
|
new /datum/forced_movement(A, get_turf(firer), 5, TRUE)
|
|
//TODO: keep the chain beamed to A
|
|
//TODO: needs a callback to delete the chain
|
|
|
|
/obj/item/projectile/hook/Destroy()
|
|
qdel(chain)
|
|
return ..()
|
|
|
|
|
|
//Immortality Talisman
|
|
/obj/item/immortality_talisman
|
|
name = "\improper Immortality Talisman"
|
|
desc = "A dread talisman that can render you completely invulnerable."
|
|
icon = 'icons/obj/lavaland/artefacts.dmi'
|
|
icon_state = "talisman"
|
|
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
|
actions_types = list(/datum/action/item_action/immortality)
|
|
var/cooldown = 0
|
|
|
|
/obj/item/immortality_talisman/Initialize()
|
|
. = ..()
|
|
AddComponent(/datum/component/anti_magic, TRUE, TRUE, TRUE)
|
|
|
|
/datum/action/item_action/immortality
|
|
name = "Immortality"
|
|
|
|
/obj/item/immortality_talisman/attack_self(mob/user)
|
|
if(isliving(user))
|
|
var/mob/living/L = user
|
|
if(cooldown < world.time)
|
|
SSblackbox.record_feedback("amount", "immortality_talisman_uses", 1)
|
|
cooldown = world.time + 600
|
|
L.apply_status_effect(STATUS_EFFECT_VOIDED)
|
|
|
|
else
|
|
to_chat(L, span_warning("[src] is not ready yet!"))
|
|
else
|
|
to_chat(user, span_warning("Only the living can attain this power!"))
|
|
|
|
/obj/effect/immortality_talisman
|
|
name = "hole in reality"
|
|
desc = "It's shaped an awful lot like a person."
|
|
icon_state = "blank"
|
|
icon = 'icons/effects/effects.dmi'
|
|
var/vanish_description = "vanishes from reality"
|
|
var/can_destroy = TRUE
|
|
|
|
/obj/effect/immortality_talisman/Initialize(mapload, mob/new_user)
|
|
. = ..()
|
|
|
|
/obj/effect/immortality_talisman/proc/vanish(mob/user)
|
|
user.visible_message(span_danger("[user] [vanish_description], leaving a hole in [user.p_their()] place!"))
|
|
|
|
desc = "It's shaped an awful lot like [user.name]."
|
|
setDir(user.dir)
|
|
|
|
user.forceMove(src)
|
|
user.notransform = TRUE
|
|
user.status_flags |= GODMODE
|
|
|
|
can_destroy = FALSE
|
|
|
|
/obj/effect/immortality_talisman/proc/unvanish(mob/user)
|
|
user.status_flags &= ~GODMODE
|
|
user.notransform = FALSE
|
|
user.forceMove(get_turf(user))
|
|
|
|
user.visible_message(span_danger("[user] pops back into reality!"))
|
|
can_destroy = TRUE
|
|
qdel(src)
|
|
|
|
/obj/effect/immortality_talisman/attackby()
|
|
return
|
|
|
|
/obj/effect/immortality_talisman/ex_act()
|
|
return
|
|
|
|
/obj/effect/immortality_talisman/singularity_pull()
|
|
return
|
|
|
|
/obj/effect/immortality_talisman/Destroy(force)
|
|
if(!can_destroy && !force)
|
|
return QDEL_HINT_LETMELIVE
|
|
else
|
|
. = ..()
|
|
|
|
/obj/effect/immortality_talisman/void
|
|
vanish_description = "is dragged into the void"
|
|
|
|
//Shared Bag
|
|
|
|
/obj/item/shared_storage
|
|
name = "paradox bag"
|
|
desc = "Somehow, it's in two places at once."
|
|
icon = 'icons/obj/storage.dmi'
|
|
icon_state = "cultpack"
|
|
slot_flags = ITEM_SLOT_BACK
|
|
resistance_flags = INDESTRUCTIBLE
|
|
|
|
/obj/item/shared_storage/red
|
|
name = "paradox bag"
|
|
desc = "Somehow, it's in two places at once."
|
|
|
|
/obj/item/shared_storage/red/Initialize()
|
|
. = ..()
|
|
var/datum/component/storage/STR = AddComponent(/datum/component/storage/concrete)
|
|
STR.max_w_class = WEIGHT_CLASS_NORMAL
|
|
STR.max_combined_w_class = 60
|
|
STR.max_items = 21
|
|
new /obj/item/shared_storage/blue(drop_location(), STR)
|
|
|
|
/obj/item/shared_storage/blue/Initialize(mapload, datum/component/storage/concrete/master)
|
|
. = ..()
|
|
if(!istype(master))
|
|
return INITIALIZE_HINT_QDEL
|
|
var/datum/component/storage/STR = AddComponent(/datum/component/storage, master)
|
|
STR.max_w_class = WEIGHT_CLASS_NORMAL
|
|
STR.max_combined_w_class = 60
|
|
STR.max_items = 21
|
|
|
|
//Book of Babel
|
|
|
|
/obj/item/book_of_babel
|
|
name = "Book of Babel"
|
|
desc = "An ancient tome written in countless tongues."
|
|
icon = 'icons/obj/library.dmi'
|
|
icon_state = "book1"
|
|
w_class = 2
|
|
|
|
/obj/item/book_of_babel/attack_self(mob/user)
|
|
if(!user.can_read(src))
|
|
return FALSE
|
|
to_chat(user, span_notice("You flip through the pages of the book, quickly and conveniently learning every language in existence. Somewhat less conveniently, the aging book crumbles to dust in the process. Whoops."))
|
|
user.grant_all_languages()
|
|
new /obj/effect/decal/cleanable/ash(get_turf(user))
|
|
qdel(src)
|
|
|
|
|
|
//Runite Scimitar
|
|
/obj/item/rune_scimmy
|
|
name = "rune scimitar"
|
|
desc = "A curved sword smelted from an unknown metal. Looking at it gives you the otherworldly urge to pawn it off for '30k', whatever that means."
|
|
lefthand_file = 'yogstation/icons/mob/inhands/weapons/scimmy_lefthand.dmi'
|
|
righthand_file = 'yogstation/icons/mob/inhands/weapons/scimmy_righthand.dmi'
|
|
icon = 'yogstation/icons/obj/lavaland/artefacts.dmi'
|
|
icon_state = "rune_scimmy"
|
|
force = 20
|
|
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
|
|
damtype = BRUTE
|
|
sharpness = SHARP_EDGED
|
|
hitsound = 'yogstation/sound/weapons/rs_slash.ogg'
|
|
attack_verb = list("slashed","pk'd","atk'd")
|
|
var/mobs_grinded = 0
|
|
var/max_grind = 20
|
|
|
|
/obj/item/rune_scimmy/examine(mob/living/user)
|
|
. = ..()
|
|
. += span_notice("This blade fills you with a need to 'grind'. Slay hostile fauna to increase the Scimmy's power and earn loot.")
|
|
. += span_notice("The blade has grinded [mobs_grinded] out of [max_grind] fauna to reach maximum power, and will deal [mobs_grinded * 5] bonus damage to fauna.")
|
|
|
|
/obj/item/rune_scimmy/afterattack(atom/target, mob/user, proximity, click_parameters)
|
|
. = ..()
|
|
if(!proximity)
|
|
return
|
|
if(isliving(target))
|
|
var/mob/living/L = target
|
|
if(ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid)) //no loot allowed from the little skulls
|
|
if(!istype(L, /mob/living/simple_animal/hostile/asteroid/hivelordbrood))
|
|
RegisterSignal(target,COMSIG_GLOB_MOB_DEATH,.proc/roll_loot, TRUE)
|
|
//after quite a bit of grinding, you'll be doing a total of 120 damage to fauna per hit. A lot, but i feel like the grind justifies the payoff. also this doesn't effect crew. so. go nuts.
|
|
L.apply_damage(mobs_grinded*5,BRUTE)
|
|
|
|
///This proc handles rolling the loot on the loot table and "drops" the loot where the hostile fauna died
|
|
/obj/item/rune_scimmy/proc/roll_loot(mob/living/target)
|
|
UnregisterSignal(target, COMSIG_GLOB_MOB_DEATH)
|
|
if(mobs_grinded<max_grind)
|
|
mobs_grinded++
|
|
var/spot = get_turf(target)
|
|
var/loot = rand(1,100)
|
|
switch(loot)
|
|
if(1 to 20)//20% chance at 3 gold coins, the most basic rs drop
|
|
for(var/i in 1 to 3)
|
|
new /obj/item/coin/gold(spot)
|
|
if(21 to 30)//10% chance for 5 gold coins
|
|
for(var/i in 1 to 5)
|
|
new /obj/item/coin/gold(spot)
|
|
if(31 to 40)//10% chance for 2 GOLD (banana) DOUBLOONS
|
|
for(var/i in 1 to 2)
|
|
new /obj/item/coin/bananium(spot)
|
|
if(41 to 50) //10% chance to spawn 10 gold, diamond, or bluespace crystal ores, because runescape ore drops and gem drops
|
|
for(var/i in 1 to 5)
|
|
switch(rand(1,5))
|
|
if(1 to 2)
|
|
new /obj/item/stack/ore/gold(spot)
|
|
if(3 to 4)
|
|
new /obj/item/stack/ore/diamond(spot)
|
|
if(5)
|
|
new /obj/item/stack/sheet/bluespace_crystal(spot)
|
|
if(51 to 60)//10% for bow and bronze tipped arrows, bronze are supposed to be the worst in runescape but they kinda slap in here, hopefully limited by the 5 arrows
|
|
new /obj/item/gun/ballistic/bow(spot)
|
|
for(var/i in 1 to 5)
|
|
new /obj/item/ammo_casing/reusable/arrow/bronze(spot)
|
|
if(61 to 70)//10% chance at a seed drop, runescape drops seeds somewhat frequently for players to plant and harvest later
|
|
switch(rand(1,5))
|
|
if(1)
|
|
new /obj/item/seeds/lavaland/cactus(spot)
|
|
if(2)
|
|
new /obj/item/seeds/lavaland/ember(spot)
|
|
if(3)
|
|
new /obj/item/seeds/lavaland/inocybe(spot)
|
|
if(4)
|
|
new /obj/item/seeds/lavaland/polypore(spot)
|
|
if(5)
|
|
new /obj/item/seeds/lavaland/porcini(spot)
|
|
if(prob(25)) //25% chance to get strange seeds, should they feel like cooperating with botanists. this would also be interesting to see ash walkers get lmao
|
|
new /obj/item/seeds/random(spot)
|
|
if(71 to 80) //magmite is cool and somewhat rare i think?
|
|
new /obj/item/magmite(spot)
|
|
if(81 to 90) //i could make it drop foods for healing items like rs dropping fish, but i think the rewards should be a bit more immediate
|
|
new /obj/item/reagent_containers/autoinjector/medipen/survival(spot)
|
|
if(91 to 95) //5% PET DROP LET'S GO
|
|
new /mob/living/simple_animal/hostile/mining_drone(spot)
|
|
if(96 to 99) //4% DHIDE ARMOR
|
|
new /obj/item/stack/sheet/animalhide/ashdrake(spot)
|
|
if(100)
|
|
new /obj/structure/closet/crate/necropolis/tendril(spot)
|
|
|
|
//Potion of Flight
|
|
/obj/item/reagent_containers/glass/bottle/potion
|
|
icon = 'icons/obj/lavaland/artefacts.dmi'
|
|
icon_state = "potionflask"
|
|
|
|
|
|
/obj/item/reagent_containers/glass/bottle/potion/flight/syndicate
|
|
icon = 'icons/obj/lavaland/artefacts.dmi'
|
|
icon_state = "potionflask"
|
|
|
|
/obj/item/reagent_containers/glass/bottle/potion/flight
|
|
name = "strange elixir"
|
|
desc = "A flask with an almost-holy aura emitting from it. The label on the bottle says: 'erqo'hyy tvi'rf lbh jv'atf'."
|
|
list_reagents = list(/datum/reagent/flightpotion = 5)
|
|
|
|
/obj/item/reagent_containers/glass/bottle/potion/update_icon()
|
|
if(reagents.total_volume)
|
|
icon_state = "potionflask"
|
|
else
|
|
icon_state = "potionflask_empty"
|
|
|
|
/datum/reagent/flightpotion
|
|
name = "Flight Potion"
|
|
description = "Strange mutagenic compound of unknown origins."
|
|
reagent_state = LIQUID
|
|
process_flags = ORGANIC | SYNTHETIC
|
|
color = "#FFEBEB"
|
|
|
|
/datum/reagent/flightpotion/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
|
|
if(iscarbon(M) && M.stat != DEAD)
|
|
var/mob/living/carbon/C = M
|
|
var/valid_species = (ishumanbasic(C) || islizard(C) || ismoth(C) || isskeleton(C) || ispreternis(C) || isipc(C) || ispodperson(C))
|
|
if(valid_species && (reac_volume < 5)) //humans, lizards, skeletons, and preterni can get wings
|
|
to_chat(C, span_notice("<i>You feel something stir in you, but it quickly fades away.</i>"))
|
|
return ..()
|
|
if(!valid_species)
|
|
if(method == INGEST && show_message)
|
|
to_chat(C, span_notice("<i>You feel nothing but a terrible aftertaste.</i>"))
|
|
return ..()
|
|
|
|
to_chat(C, span_userdanger("A terrible pain travels down your back as wings burst out!"))
|
|
C.dna.species.GiveSpeciesFlight(C)
|
|
if(ishumanbasic(C))
|
|
to_chat(C, span_notice("You feel blessed!"))
|
|
ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
|
|
if(islizard(C))
|
|
to_chat(C, span_notice("You feel blessed... by... something?"))
|
|
ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
|
|
if(ismoth(C))
|
|
to_chat(C, span_notice("Your wings feel.... stronger?"))
|
|
ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
|
|
if(isskeleton(C))
|
|
to_chat(C, span_notice("Your ribcage feels... bigger?"))
|
|
ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
|
|
if(ispreternis(C) || isipc(C))
|
|
to_chat(C, span_notice("The servos in your back feel... different?"))
|
|
ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
|
|
playsound(C.loc, 'sound/items/poster_ripped.ogg', 50, TRUE, -1)
|
|
C.adjustBruteLoss(20)
|
|
C.emote("scream")
|
|
..()
|
|
|
|
|
|
/obj/item/jacobs_ladder
|
|
name = "jacob's ladder"
|
|
desc = "A celestial ladder that violates the laws of physics."
|
|
icon = 'icons/obj/structures.dmi'
|
|
icon_state = "ladder00"
|
|
|
|
/obj/item/jacobs_ladder/attack_self(mob/user)
|
|
var/turf/T = get_turf(src)
|
|
var/ladder_x = T.x
|
|
var/ladder_y = T.y
|
|
to_chat(user, span_notice("You unfold the ladder. It extends much farther than you were expecting."))
|
|
var/last_ladder = null
|
|
for(var/i in 1 to world.maxz)
|
|
if(is_centcom_level(i) || is_reserved_level(i) || is_reebe(i) || is_away_level(i))
|
|
continue
|
|
var/turf/T2 = locate(ladder_x, ladder_y, i)
|
|
last_ladder = new /obj/structure/ladder/unbreakable/jacob(T2, null, last_ladder)
|
|
qdel(src)
|
|
|
|
// Inherit from unbreakable but don't set ID, to suppress the default Z linkage
|
|
/obj/structure/ladder/unbreakable/jacob
|
|
name = "jacob's ladder"
|
|
desc = "An indestructible celestial ladder that violates the laws of physics."
|
|
|
|
#define COOLDOWN_SUMMON 1 MINUTES
|
|
/obj/item/eflowers
|
|
name ="enchanted flowers"
|
|
desc ="A charming bunch of flowers, most animals seem to find the bearer amicable after momentary contact with it. Squeeze the bouqet to summon tamed creatures. Megafauna cannot be summoned.<b>Megafauna need to be exposed 35 times to become friendly.</b>"
|
|
icon = 'icons/obj/lavaland/artefacts.dmi'
|
|
icon_state = "eflower"
|
|
var/next_summon = 0
|
|
var/list/summons = list()
|
|
attack_verb = list("thumped", "brushed", "bumped")
|
|
|
|
/obj/item/eflowers/attack_self(mob/user)
|
|
var/turf/T = get_turf(user)
|
|
var/area/A = get_area(user)
|
|
if(next_summon > world.time)
|
|
to_chat(user, span_warning("You can't do that yet!"))
|
|
return
|
|
if(is_station_level(T.z) && !A.outdoors)
|
|
to_chat(user, span_warning("You feel like calling a bunch of animals indoors is a bad idea."))
|
|
return
|
|
user.visible_message(span_warning("[user] holds the bouqet out, summoning their allies!"))
|
|
for(var/mob/m in summons)
|
|
m.forceMove(T)
|
|
playsound(T, 'sound/effects/splat.ogg', 80, 5, -1)
|
|
next_summon = world.time + COOLDOWN_SUMMON
|
|
|
|
/obj/item/eflowers/afterattack(mob/living/simple_animal/M, mob/user, proximity)
|
|
var/datum/status_effect/taming/G = M.has_status_effect(STATUS_EFFECT_TAMING)
|
|
. = ..()
|
|
if(!proximity)
|
|
return
|
|
if(M.client)
|
|
to_chat(user, span_warning("[M] is too intelligent to tame!"))
|
|
return
|
|
if(M.stat)
|
|
to_chat(user, span_warning("[M] is dead!"))
|
|
return
|
|
if(M.faction == user.faction)
|
|
to_chat(user, span_warning("[M] is already on your side!"))
|
|
return
|
|
if(M.sentience_type == SENTIENCE_BOSS)
|
|
if(!G)
|
|
M.apply_status_effect(STATUS_EFFECT_TAMING, user)
|
|
else
|
|
G.add_tame(G.tame_buildup)
|
|
if(ISMULTIPLE(G.tame_crit-G.tame_amount, 5))
|
|
to_chat(user, span_notice("[M] has to be exposed [G.tame_crit-G.tame_amount] more times to accept your gift!"))
|
|
return
|
|
if(M.sentience_type != SENTIENCE_ORGANIC)
|
|
to_chat(user, span_warning("[M] cannot be tamed!"))
|
|
return
|
|
if(!do_after(user, 1.5 SECONDS, M))
|
|
return
|
|
M.visible_message(span_notice("[M] seems happy with you after exposure to the bouqet!"))
|
|
M.add_atom_colour("#11c42f", FIXED_COLOUR_PRIORITY)
|
|
M.drop_loot()
|
|
M.faction = user.faction
|
|
summons |= M
|
|
|
|
///Bosses
|
|
|
|
//Miniboss Miner
|
|
|
|
/obj/item/melee/transforming/cleaving_saw
|
|
name = "cleaving saw"
|
|
desc = "This saw, effective at drawing the blood of beasts, transforms into a long cleaver that makes use of centrifugal force."
|
|
force = 12
|
|
force_on = 20 //force when active
|
|
throwforce = 20
|
|
throwforce_on = 20
|
|
icon = 'icons/obj/lavaland/artefacts.dmi'
|
|
lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/64x64_righthand.dmi'
|
|
inhand_x_dimension = 64
|
|
inhand_y_dimension = 64
|
|
icon_state = "cleaving_saw"
|
|
icon_state_on = "cleaving_saw_open"
|
|
slot_flags = ITEM_SLOT_BELT
|
|
attack_verb_off = list("attacked", "sawed", "sliced", "torn", "ripped", "diced", "cut")
|
|
attack_verb_on = list("cleaved", "swiped", "slashed", "chopped")
|
|
hitsound = 'sound/weapons/bladeslice.ogg'
|
|
hitsound_on = 'sound/weapons/bladeslice.ogg'
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
w_class_on = WEIGHT_CLASS_BULKY
|
|
sharpness = SHARP_EDGED
|
|
faction_bonus_force = 30
|
|
nemesis_factions = list("mining", "boss")
|
|
var/transform_cooldown
|
|
var/swiping = FALSE
|
|
|
|
/obj/item/melee/transforming/cleaving_saw/examine(mob/user)
|
|
. = ..()
|
|
. += "<span class='notice'>It is [active ? "open, will cleave enemies in a wide arc and deal additional damage to fauna, while getting you blood-drunk":"closed, and can be used for rapid consecutive attacks that cause fauna to bleed, dealing passive damage"].\n"+\
|
|
"Both modes will build up existing bleed effects, doing a burst of high damage and healing you if the bleed is built up high enough.\n"+\
|
|
"Transforming it immediately after an attack causes the next attack to come out faster.</span>"
|
|
|
|
/obj/item/melee/transforming/cleaving_saw/suicide_act(mob/user)
|
|
user.visible_message(span_suicide("[user] is [active ? "closing [src] on [user.p_their()] neck" : "opening [src] into [user.p_their()] chest"]! It looks like [user.p_theyre()] trying to commit suicide!"))
|
|
transform_cooldown = 0
|
|
transform_weapon(user, TRUE)
|
|
return BRUTELOSS
|
|
|
|
/obj/item/melee/transforming/cleaving_saw/transform_weapon(mob/living/user, supress_message_text)
|
|
if(transform_cooldown > world.time)
|
|
return FALSE
|
|
. = ..()
|
|
if(.)
|
|
transform_cooldown = world.time + (CLICK_CD_MELEE * 0.5)
|
|
user.changeNext_move(CLICK_CD_MELEE * 0.25)
|
|
|
|
/obj/item/melee/transforming/cleaving_saw/transform_messages(mob/living/user, supress_message_text)
|
|
if(!supress_message_text)
|
|
if(active)
|
|
to_chat(user, span_notice("You open [src]. It will now cleave enemies in a wide arc and deal additional damage to fauna, getting you drunk on blood."))
|
|
else
|
|
to_chat(user, span_notice("You close [src]. It will now attack rapidly and cause fauna to bleed, letting you drink their blood to heal."))
|
|
playsound(user, 'sound/magic/clockwork/fellowship_armory.ogg', 35, TRUE, frequency = 90000 - (active * 30000))
|
|
|
|
/obj/item/melee/transforming/cleaving_saw/clumsy_transform_effect(mob/living/user)
|
|
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
|
|
to_chat(user, span_warning("You accidentally cut yourself with [src], like a doofus!"))
|
|
user.take_bodypart_damage(10)
|
|
|
|
/obj/item/melee/transforming/cleaving_saw/melee_attack_chain(mob/living/user, atom/target, params)
|
|
..()
|
|
if(!active)
|
|
user.changeNext_move(CLICK_CD_MELEE * 0.5) //when closed, it attacks very rapidly
|
|
else
|
|
if(iscarbon(target) && prob(25)) //RNG wound application regardless of armor.
|
|
var/mob/living/carbon/carbon_target = target
|
|
var/obj/item/bodypart/bodypart = pick(carbon_target.bodyparts)
|
|
var/datum/wound/slash/moderate/crit_wound = new
|
|
user.visible_message(span_boldwarning("[user] cleaves [target] delivering a viscious wound!"))
|
|
crit_wound.apply_wound(bodypart)
|
|
|
|
/obj/item/melee/transforming/cleaving_saw/nemesis_effects(mob/living/user, mob/living/target)
|
|
var/datum/status_effect/saw_bleed/B = target.has_status_effect(STATUS_EFFECT_SAWBLEED)
|
|
if(!B)
|
|
if(!active) //This isn't in the above if-check so that the else doesn't care about active
|
|
target.apply_status_effect(STATUS_EFFECT_SAWBLEED)
|
|
else
|
|
if(active && prob(33)) //This isn't in an else check above so that it doesn't care if they're not bleeding.
|
|
user.apply_status_effect(STATUS_EFFECT_BLOODDRUNK)
|
|
B.add_bleed(B.bleed_buildup)
|
|
|
|
if(B.needs_to_bleed)
|
|
to_chat(user, span_notice("You drink the blood spilled from [target] healing your wounds!"))
|
|
user.adjustBruteLoss(-10)
|
|
user.adjustFireLoss(-10)
|
|
user.adjustToxLoss(-10)
|
|
user.blood_volume += 10
|
|
|
|
/obj/item/melee/transforming/cleaving_saw/attack(mob/living/target, mob/living/carbon/human/user)
|
|
if(!active || swiping || !target.density || get_turf(target) == get_turf(user))
|
|
if(!active)
|
|
faction_bonus_force = 0
|
|
..()
|
|
if(!active)
|
|
faction_bonus_force = initial(faction_bonus_force)
|
|
else
|
|
var/turf/user_turf = get_turf(user)
|
|
var/dir_to_target = get_dir(user_turf, get_turf(target))
|
|
swiping = TRUE
|
|
var/static/list/cleaving_saw_cleave_angles = list(0, -45, 45) //so that the animation animates towards the target clicked and not towards a side target
|
|
for(var/i in cleaving_saw_cleave_angles)
|
|
var/turf/T = get_step(user_turf, turn(dir_to_target, i))
|
|
for(var/mob/living/L in T)
|
|
if(user.Adjacent(L) && L.density)
|
|
melee_attack_chain(user, L)
|
|
swiping = FALSE
|
|
|
|
//Dragon
|
|
|
|
/obj/structure/closet/crate/necropolis/dragon
|
|
name = "dragon chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/dragon/PopulateContents()
|
|
new /obj/item/gem/amber(src)
|
|
var/loot = rand(1,4)
|
|
switch(loot)
|
|
if(1)
|
|
new /obj/item/melee/ghost_sword(src)
|
|
if(2)
|
|
new /obj/item/lava_staff(src)
|
|
new /obj/item/book/granter/spell/sacredflame(src)
|
|
if(3)
|
|
new /obj/item/dragon_egg(src)
|
|
if(4)
|
|
new /obj/item/dragons_blood(src)
|
|
|
|
/obj/structure/closet/crate/necropolis/dragon/crusher
|
|
name = "firey dragon chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/dragon/crusher/PopulateContents()
|
|
..()
|
|
new /obj/item/crusher_trophy/tail_spike(src)
|
|
new /obj/item/gem/amber(src)
|
|
|
|
/obj/item/melee/ghost_sword
|
|
name = "\improper spectral blade"
|
|
desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly."
|
|
icon = 'icons/obj/weapons/swords.dmi'
|
|
icon_state = "spectral"
|
|
item_state = "spectral"
|
|
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
|
flags_1 = CONDUCT_1
|
|
sharpness = SHARP_EDGED
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
force = 1
|
|
throwforce = 1
|
|
hitsound = 'sound/effects/ghost2.ogg'
|
|
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended")
|
|
var/summon_cooldown = 0
|
|
var/list/mob/dead/observer/spirits
|
|
|
|
/obj/item/melee/ghost_sword/Initialize()
|
|
. = ..()
|
|
spirits = list()
|
|
START_PROCESSING(SSobj, src)
|
|
GLOB.poi_list |= src
|
|
AddComponent(/datum/component/butchering, 150, 90)
|
|
|
|
/obj/item/melee/ghost_sword/Destroy()
|
|
for(var/mob/dead/observer/G in spirits)
|
|
G.invisibility = GLOB.observer_default_invisibility
|
|
G.mouse_opacity = initial(G.mouse_opacity)
|
|
spirits.Cut()
|
|
STOP_PROCESSING(SSobj, src)
|
|
GLOB.poi_list -= src
|
|
. = ..()
|
|
|
|
/obj/item/melee/ghost_sword/attack_self(mob/user)
|
|
if(summon_cooldown > world.time)
|
|
to_chat(user, "You just recently called out for aid. You don't want to annoy the spirits.")
|
|
return
|
|
to_chat(user, "You call out for aid, attempting to summon spirits to your side.")
|
|
|
|
notify_ghosts("[user] is raising [user.p_their()] [src], calling for your help!",
|
|
enter_link="<a href=?src=[REF(src)];orbit=1>(Click to help)</a>",
|
|
source = user, action=NOTIFY_ORBIT, ignore_key = POLL_IGNORE_SPECTRAL_BLADE)
|
|
|
|
summon_cooldown = world.time + 600
|
|
|
|
/obj/item/melee/ghost_sword/Topic(href, href_list)
|
|
if(href_list["orbit"])
|
|
var/mob/dead/observer/ghost = usr
|
|
if(istype(ghost))
|
|
ghost.ManualFollow(src)
|
|
|
|
/obj/item/melee/ghost_sword/process()
|
|
ghost_check()
|
|
|
|
/obj/item/melee/ghost_sword/proc/recursive_orbit_collect(atom/A, list/L)
|
|
for(var/i in A.orbiters?.orbiters)
|
|
if(!isobserver(i) || (i in L))
|
|
continue
|
|
L |= i
|
|
recursive_orbit_collect(i, L)
|
|
|
|
/obj/item/melee/ghost_sword/proc/ghost_check()
|
|
var/list/mob/dead/observer/current_spirits = list()
|
|
|
|
recursive_orbit_collect(src, current_spirits)
|
|
recursive_orbit_collect(loc, current_spirits) //anything holding us
|
|
|
|
for(var/i in spirits - current_spirits)
|
|
var/mob/dead/observer/G = i
|
|
G.invisibility = GLOB.observer_default_invisibility
|
|
G.mouse_opacity = initial(G.mouse_opacity)
|
|
|
|
for(var/i in current_spirits)
|
|
var/mob/dead/observer/G = i
|
|
G.invisibility = 0
|
|
G.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
|
|
|
spirits = current_spirits
|
|
return length(spirits)
|
|
|
|
/obj/item/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user)
|
|
force = 0
|
|
var/ghost_counter = ghost_check()
|
|
|
|
force = clamp((ghost_counter * 4), 0, 75)
|
|
user.visible_message(span_danger("[user] strikes with the force of [ghost_counter] vengeful spirits!"))
|
|
..()
|
|
|
|
/obj/item/melee/ghost_sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
|
var/ghost_counter = ghost_check()
|
|
final_block_chance += clamp((ghost_counter * 5), 0, 75)
|
|
owner.visible_message(span_danger("[owner] is protected by a ring of [ghost_counter] ghosts!"))
|
|
return ..()
|
|
|
|
//Blood
|
|
|
|
/obj/item/dragons_blood
|
|
name = "bottle of dragons blood"
|
|
desc = "You're not actually going to drink this, are you?"
|
|
icon = 'icons/obj/wizard.dmi'
|
|
icon_state = "vial"
|
|
|
|
/obj/item/dragons_blood/attack_self(mob/living/carbon/human/user)
|
|
if(!istype(user))
|
|
return
|
|
|
|
var/mob/living/carbon/human/H = user
|
|
var/random = rand(1,4)
|
|
|
|
switch(random)
|
|
if(1)
|
|
to_chat(user, span_danger("Your appearance morphs to that of a very small humanoid ash dragon! You feel a little tougher, and fire now seems oddly comforting."))
|
|
H.dna.features = list("mcolor" = "A02720", "tail_lizard" = "Dark Tiger", "tail_human" = "None", "snout" = "Sharp", "horns" = "Drake", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "Long", "body_markings" = "Dark Tiger Body", "legs" = "Digitigrade Legs")
|
|
H.set_species(/datum/species/lizard/draconid)
|
|
H.eye_color = "fee5a3"
|
|
H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK)
|
|
H.updateappearance()
|
|
if(2)
|
|
to_chat(user, span_danger("Your flesh begins to melt! Miraculously, you seem fine otherwise."))
|
|
H.set_species(/datum/species/skeleton)
|
|
if(3)
|
|
to_chat(user, span_danger("Power courses through you! You can now shift your form at will."))
|
|
if(user.mind)
|
|
var/obj/effect/proc_holder/spell/targeted/shapeshift/dragon/D = new
|
|
user.mind.AddSpell(D)
|
|
if(4)
|
|
to_chat(user, span_danger("You feel like you could walk straight through lava now."))
|
|
H.weather_immunities |= "lava"
|
|
|
|
playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1)
|
|
qdel(src)
|
|
|
|
/obj/item/dragons_blood/syndicate
|
|
name = "bottle of refined dragons blood"
|
|
desc = "You're totally going to drink this, aren't you?"
|
|
|
|
/obj/item/dragons_blood/syndicate/attack_self(mob/living/carbon/human/user)
|
|
if(!istype(user))
|
|
return
|
|
|
|
var/mob/living/carbon/human/H = user
|
|
|
|
if(!islizard(H)) //Something about it being refined to only work on lizards or whatever
|
|
to_chat(user, span_danger("You're about to take a sip, but the acrid fumes from whatever's in this bottle make you reconsider."))
|
|
return
|
|
else
|
|
to_chat(user, span_danger("You feel the warmth spread through you, scales hardening and claws growing sharper. You feel... strong!"))
|
|
H.set_species(/datum/species/lizard/draconid)
|
|
|
|
playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1)
|
|
qdel(src)
|
|
|
|
|
|
/datum/disease/transformation/dragon
|
|
name = "dragon transformation"
|
|
cure_text = "nothing"
|
|
cures = list(/datum/reagent/medicine/adminordrazine)
|
|
agent = "dragon's blood"
|
|
desc = "What do dragons have to do with Space Station 13?"
|
|
stage_prob = 20
|
|
severity = DISEASE_SEVERITY_BIOHAZARD
|
|
visibility_flags = 0
|
|
stage1 = list("Your bones ache.")
|
|
stage2 = list("Your skin feels scaly.")
|
|
stage3 = list(span_danger("You have an overwhelming urge to terrorize some peasants."), span_danger("Your teeth feel sharper."))
|
|
stage4 = list(span_danger("Your blood burns."))
|
|
stage5 = list(span_danger("You're a fucking dragon. However, any previous allegiances you held still apply. It'd be incredibly rude to eat your still human friends for no reason."))
|
|
new_form = /mob/living/simple_animal/hostile/megafauna/dragon/lesser
|
|
|
|
|
|
//Lava Staff
|
|
|
|
/obj/item/lava_staff
|
|
name = "staff of lava"
|
|
desc = "The ability to fill the emergency shuttle with lava. What more could you want out of life?"
|
|
icon_state = "staffofstorms"
|
|
item_state = "staffofstorms"
|
|
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
|
|
icon = 'icons/obj/guns/magic.dmi'
|
|
slot_flags = ITEM_SLOT_BACK
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
force = 12
|
|
damtype = BURN
|
|
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
|
hitsound = 'sound/weapons/sear.ogg'
|
|
var/turf_type = /turf/open/lava/smooth
|
|
var/transform_string = "lava"
|
|
var/reset_turf_type = /turf/open/floor/plating/asteroid/basalt
|
|
var/reset_string = "basalt"
|
|
var/create_cooldown = 10 SECONDS
|
|
var/create_delay = 3 SECONDS
|
|
var/reset_cooldown = 5 SECONDS
|
|
var/timer = 0
|
|
var/static/list/banned_turfs = typecacheof(list(/turf/open/space/transit, /turf/closed))
|
|
|
|
/obj/item/lava_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
|
. = ..()
|
|
if(timer > world.time)
|
|
return
|
|
|
|
if(is_type_in_typecache(target, banned_turfs))
|
|
return
|
|
|
|
if(target in view(user.client.view, get_turf(user)))
|
|
|
|
var/turf/open/T = get_turf(target)
|
|
if(!istype(T))
|
|
return
|
|
if(!istype(T, turf_type))
|
|
var/obj/effect/temp_visual/lavastaff/L = new /obj/effect/temp_visual/lavastaff(T)
|
|
L.alpha = 0
|
|
animate(L, alpha = 255, time = create_delay)
|
|
user.visible_message(span_danger("[user] points [src] at [T]!"))
|
|
timer = world.time + create_delay + 1
|
|
if(do_after(user, create_delay, T))
|
|
var/old_name = T.name
|
|
if(T.TerraformTurf(turf_type, flags = CHANGETURF_INHERIT_AIR))
|
|
user.visible_message(span_danger("[user] turns \the [old_name] into [transform_string]!"))
|
|
message_admins("[ADMIN_LOOKUPFLW(user)] fired the lava staff at [ADMIN_VERBOSEJMP(T)]")
|
|
log_game("[key_name(user)] fired the lava staff at [AREACOORD(T)].")
|
|
timer = world.time + create_cooldown
|
|
playsound(T,'sound/magic/fireball.ogg', 200, 1)
|
|
else
|
|
timer = world.time
|
|
qdel(L)
|
|
else
|
|
var/old_name = T.name
|
|
if(T.TerraformTurf(reset_turf_type, flags = CHANGETURF_INHERIT_AIR))
|
|
user.visible_message(span_danger("[user] turns \the [old_name] into [reset_string]!"))
|
|
timer = world.time + reset_cooldown
|
|
playsound(T,'sound/magic/fireball.ogg', 200, 1)
|
|
|
|
/obj/effect/temp_visual/lavastaff
|
|
icon_state = "lavastaff_warn"
|
|
duration = 50
|
|
|
|
//Dragon Egg
|
|
|
|
/obj/item/dragon_egg
|
|
name = "dragon's egg"
|
|
desc = "A large egg-shaped rock. It's cold to the touch..."
|
|
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
|
icon_state = "large_egg"
|
|
color = "#2C2C2C"
|
|
|
|
/obj/item/dragon_egg/burn()
|
|
visible_message(span_boldwarning("[src] suddenly begins to glow red and starts violently shaking!"))
|
|
name = "heated dragon's egg"
|
|
desc = "A large egg seemingly made out of rock. It's red-hot and seems to be shaking!"
|
|
color = "#990000"
|
|
extinguish()
|
|
resistance_flags = LAVA_PROOF | FIRE_PROOF
|
|
addtimer(CALLBACK(src, .proc/hatch), 20 SECONDS)
|
|
|
|
/obj/item/dragon_egg/proc/hatch()
|
|
visible_message(span_boldwarning("[src] suddenly cracks apart, revealing a tiny ash drake!"))
|
|
new /mob/living/simple_animal/hostile/drakeling(get_turf(src))
|
|
qdel(src)
|
|
|
|
//Bubblegum
|
|
/obj/structure/closet/crate/necropolis/bubblegum
|
|
name = "bubblegum chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/bubblegum/PopulateContents()
|
|
new /obj/item/clothing/suit/space/hostile_environment(src)
|
|
new /obj/item/clothing/head/helmet/space/hostile_environment(src)
|
|
new /obj/item/gem/bloodstone(src)
|
|
var/loot = rand(1,2)
|
|
switch(loot)
|
|
if(1)
|
|
new /obj/item/melee/knuckles(src)
|
|
if(2)
|
|
new /obj/item/clothing/gloves/bracer/cuffs(src)
|
|
|
|
/obj/structure/closet/crate/necropolis/bubblegum/crusher
|
|
name = "bloody bubblegum chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/bubblegum/crusher/PopulateContents()
|
|
..()
|
|
new /obj/item/crusher_trophy/demon_claws(src)
|
|
new /obj/item/gem/bloodstone(src)
|
|
|
|
/obj/item/mayhem
|
|
name = "mayhem in a bottle"
|
|
desc = "A magically infused bottle of blood, the scent of which will drive anyone nearby into a murderous frenzy."
|
|
icon = 'icons/obj/wizard.dmi'
|
|
icon_state = "vial"
|
|
|
|
/obj/item/mayhem/attack_self(mob/user)
|
|
for(var/mob/living/carbon/human/H in range(7,user))
|
|
var/obj/effect/mine/pickup/bloodbath/B = new(H)
|
|
INVOKE_ASYNC(B, /obj/effect/mine/pickup/bloodbath/.proc/mineEffect, H)
|
|
to_chat(user, span_notice("You shatter the bottle!"))
|
|
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
|
|
message_admins(span_adminnotice("[ADMIN_LOOKUPFLW(user)] has activated a bottle of mayhem!"))
|
|
log_combat(user, null, "activated a bottle of mayhem", src)
|
|
qdel(src)
|
|
|
|
/obj/item/blood_contract
|
|
name = "blood contract"
|
|
icon = 'icons/obj/wizard.dmi'
|
|
icon_state = "scroll2"
|
|
color = "#FF0000"
|
|
desc = "Mark your target for death."
|
|
var/used = FALSE
|
|
|
|
/obj/item/blood_contract/attack_self(mob/user)
|
|
if(used)
|
|
return
|
|
used = TRUE
|
|
|
|
var/list/da_list = list()
|
|
for(var/I in GLOB.alive_mob_list & GLOB.player_list)
|
|
var/mob/living/L = I
|
|
da_list[L.real_name] = L
|
|
|
|
var/choice = input(user,"Who do you want dead?","Choose Your Victim") as null|anything in da_list
|
|
|
|
choice = da_list[choice]
|
|
|
|
if(!choice)
|
|
used = FALSE
|
|
return
|
|
if(!(isliving(choice)))
|
|
to_chat(user, "[choice] is already dead!")
|
|
used = FALSE
|
|
return
|
|
if(choice == user)
|
|
to_chat(user, "You feel like writing your own name into a cursed death warrant would be unwise.")
|
|
used = FALSE
|
|
return
|
|
|
|
var/mob/living/L = choice
|
|
|
|
message_admins(span_adminnotice("[ADMIN_LOOKUPFLW(L)] has been marked for death by [ADMIN_LOOKUPFLW(user)]!"))
|
|
|
|
var/datum/antagonist/blood_contract/A = new
|
|
L.mind.add_antag_datum(A)
|
|
|
|
log_combat(user, L, "took out a blood contract on", src)
|
|
qdel(src)
|
|
|
|
#define COOLDOWN 150
|
|
#define COOLDOWN_HUMAN 100
|
|
#define COOLDOWN_ANIMAL 60
|
|
#define COOLDOWN_SPLASH 100
|
|
/obj/item/melee/knuckles
|
|
name = "bloody knuckles"
|
|
desc = "Knuckles born of a desire for violence. Made to ensure their victims stay in the fight until there's a winner. Activating these knuckles covers several meters \
|
|
ahead of the user with blood. They're particularly effective against lavaland fauna."
|
|
icon = 'icons/obj/lavaland/artefacts.dmi'
|
|
icon_state = "bloodyknuckle"
|
|
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
|
item_state = "knuckles"
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
force = 18
|
|
var/next_reach = 0
|
|
var/next_splash = 0
|
|
var/next_knuckle = 0
|
|
var/splash_range = 9
|
|
var/fauna_damage_bonus = 32
|
|
var/fauna_damage_type = BRUTE
|
|
attack_verb = list("thrashed", "pummeled", "walloped")
|
|
actions_types = list(/datum/action/item_action/reach, /datum/action/item_action/visegrip)
|
|
|
|
/obj/item/melee/knuckles/afterattack(mob/living/target, mob/living/user, proximity)
|
|
var/mob/living/L = target
|
|
if(ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid))
|
|
L.apply_damage(fauna_damage_bonus,fauna_damage_type)
|
|
if(proximity)
|
|
if(L.has_status_effect(STATUS_EFFECT_KNUCKLED))
|
|
L.apply_status_effect(/datum/status_effect/roots)
|
|
return
|
|
if(next_knuckle > world.time)
|
|
to_chat(user, span_warning("The knuckles aren't ready to mark yet."))
|
|
return
|
|
else
|
|
L.apply_status_effect(STATUS_EFFECT_KNUCKLED)
|
|
if(ishuman(L))
|
|
next_knuckle = world.time + COOLDOWN_HUMAN
|
|
return
|
|
next_knuckle = world.time + COOLDOWN_ANIMAL
|
|
|
|
/obj/item/melee/knuckles/attack_self(mob/user)
|
|
var/turf/T = get_turf(user)
|
|
if(next_splash > world.time)
|
|
to_chat(user, span_warning("You can't do that yet!"))
|
|
return
|
|
user.visible_message(span_warning("[user] splashes blood from [user.p_their()] knuckles!"))
|
|
playsound(T, 'sound/effects/splat.ogg', 80, 5, -1)
|
|
for(var/i = 0 to splash_range)
|
|
if(T)
|
|
new /obj/effect/decal/cleanable/blood(T)
|
|
T = get_step(T,user.dir)
|
|
next_splash = world.time + COOLDOWN_SPLASH
|
|
|
|
/obj/item/melee/knuckles/ui_action_click(mob/living/user, action)
|
|
var/mob/living/U = user
|
|
if(istype(action, /datum/action/item_action/reach))
|
|
if(next_reach > world.time)
|
|
to_chat(U, span_warning("You can't do that yet!"))
|
|
return
|
|
var/valid_reaching = FALSE
|
|
for(var/mob/living/L in view(7, U))
|
|
if(L == U)
|
|
continue
|
|
for(var/obj/effect/decal/cleanable/B in range(0,L))
|
|
if(istype(B, /obj/effect/decal/cleanable/blood )|| istype(B, /obj/effect/decal/cleanable/trail_holder))
|
|
valid_reaching = TRUE
|
|
L.apply_status_effect(STATUS_EFFECT_KNUCKLED)
|
|
if(!valid_reaching)
|
|
to_chat(U, span_warning("There's nobody to use this on!"))
|
|
return
|
|
next_reach = world.time + COOLDOWN
|
|
else if(istype(action, /datum/action/item_action/visegrip))
|
|
var/valid_casting = FALSE
|
|
for(var/mob/living/L in view(8, U))
|
|
if(L.has_status_effect(STATUS_EFFECT_KNUCKLED))
|
|
valid_casting = TRUE
|
|
L.apply_status_effect(/datum/status_effect/roots)
|
|
if(!valid_casting)
|
|
to_chat(U, span_warning("There's nobody to use this on!"))
|
|
return
|
|
#undef COOLDOWN
|
|
#undef COOLDOWN_HUMAN
|
|
#undef COOLDOWN_ANIMAL
|
|
//Colossus
|
|
/obj/structure/closet/crate/necropolis/colossus
|
|
name = "colossus chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/colossus/bullet_act(obj/item/projectile/P)
|
|
if(istype(P, /obj/item/projectile/colossus))
|
|
return BULLET_ACT_FORCE_PIERCE
|
|
return ..()
|
|
|
|
/obj/structure/closet/crate/necropolis/colossus/PopulateContents()
|
|
var/list/choices = subtypesof(/obj/machinery/anomalous_crystal)
|
|
var/random_crystal = pick(choices)
|
|
new random_crystal(src)
|
|
new /obj/item/organ/vocal_cords/colossus(src)
|
|
new /obj/item/clothing/glasses/godeye(src)
|
|
new /obj/item/gem/void(src)
|
|
|
|
/obj/structure/closet/crate/necropolis/colossus/crusher
|
|
name = "angelic colossus chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/colossus/crusher/PopulateContents()
|
|
..()
|
|
new /obj/item/crusher_trophy/blaster_tubes(src)
|
|
new /obj/item/gem/void(src)
|
|
|
|
//Hierophant
|
|
/obj/item/hierophant_club
|
|
name = "hierophant club"
|
|
desc = "The strange technology of this large club allows various nigh-magical feats. It used to beat you, but now you can set the beat."
|
|
icon_state = "hierophant_club_ready_beacon"
|
|
item_state = "hierophant_club_ready_beacon"
|
|
icon = 'icons/obj/lavaland/artefacts.dmi'
|
|
lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/64x64_righthand.dmi'
|
|
inhand_x_dimension = 64
|
|
inhand_y_dimension = 64
|
|
slot_flags = ITEM_SLOT_BACK
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
force = 15
|
|
attack_verb = list("clubbed", "beat", "pummeled")
|
|
hitsound = 'sound/weapons/sonic_jackhammer.ogg'
|
|
actions_types = list(/datum/action/item_action/vortex_recall, /datum/action/item_action/toggle_unfriendly_fire)
|
|
var/z_level_check = TRUE //Whether or not it checks for mining z level
|
|
var/cooldown_time = 20 //how long the cooldown between non-melee ranged attacks is
|
|
var/chaser_cooldown = 81 //how long the cooldown between firing chasers at mobs is
|
|
var/chaser_timer = 0 //what our current chaser cooldown is
|
|
var/chaser_speed = 0.8 //how fast our chasers are
|
|
var/timer = 0 //what our current cooldown is
|
|
var/blast_range = 13 //how long the cardinal blast's walls are
|
|
var/obj/effect/hierophant/beacon //the associated beacon we teleport to
|
|
var/teleporting = FALSE //if we ARE teleporting
|
|
var/friendly_fire_check = FALSE //if the blasts we make will consider our faction against the faction of hit targets
|
|
|
|
/obj/item/hierophant_club/examine(mob/user)
|
|
. = ..()
|
|
. += "[span_hierophant_warning("The[beacon ? " beacon is not currently":"re is a beacon"] attached.")]"
|
|
|
|
/obj/item/hierophant_club/suicide_act(mob/living/user)
|
|
say("Xverwpsgexmrk...", forced = "hierophant club suicide")
|
|
user.visible_message(span_suicide("[user] holds [src] into the air! It looks like [user.p_theyre()] trying to commit suicide!"))
|
|
new/obj/effect/temp_visual/hierophant/telegraph(get_turf(user))
|
|
playsound(user,'sound/machines/airlockopen.ogg', 75, TRUE)
|
|
user.visible_message("[span_hierophant_warning("[user] fades out, leaving [user.p_their()] belongings behind!")]")
|
|
for(var/obj/item/I in user)
|
|
if(I != src)
|
|
user.dropItemToGround(I)
|
|
for(var/turf/T in RANGE_TURFS(1, user))
|
|
var/obj/effect/temp_visual/hierophant/blast/B = new(T, user, TRUE)
|
|
B.damage = 0
|
|
user.dropItemToGround(src) //Drop us last, so it goes on top of their stuff
|
|
qdel(user)
|
|
|
|
/obj/item/hierophant_club/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
|
. = ..()
|
|
var/turf/T = get_turf(target)
|
|
if(!T || timer > world.time)
|
|
return
|
|
if(!is_mining_level(T.z) && z_level_check)
|
|
to_chat(user, span_warning("The club fizzles weakly, it seem its power doesn't reach this area.") )
|
|
return
|
|
calculate_anger_mod(user)
|
|
timer = world.time + CLICK_CD_MELEE //by default, melee attacks only cause melee blasts, and have an accordingly short cooldown
|
|
if(proximity_flag)
|
|
INVOKE_ASYNC(src, .proc/aoe_burst, T, user)
|
|
log_combat(user, target, "fired 3x3 blast at", src)
|
|
else
|
|
if(ismineralturf(target) && get_dist(user, target) < 6) //target is minerals, we can hit it(even if we can't see it)
|
|
INVOKE_ASYNC(src, .proc/cardinal_blasts, T, user)
|
|
timer = world.time + cooldown_time
|
|
else if(target in view(5, get_turf(user))) //if the target is in view, hit it
|
|
timer = world.time + cooldown_time
|
|
if(isliving(target) && chaser_timer <= world.time) //living and chasers off cooldown? fire one!
|
|
chaser_timer = world.time + chaser_cooldown
|
|
var/obj/effect/temp_visual/hierophant/chaser/C = new(get_turf(user), user, target, chaser_speed, friendly_fire_check)
|
|
C.damage = 30
|
|
C.monster_damage_boost = FALSE
|
|
log_combat(user, target, "fired a chaser at", src)
|
|
else
|
|
INVOKE_ASYNC(src, .proc/cardinal_blasts, T, user) //otherwise, just do cardinal blast
|
|
log_combat(user, target, "fired cardinal blast at", src)
|
|
else
|
|
to_chat(user, span_warning("That target is out of range!") )
|
|
timer = world.time
|
|
INVOKE_ASYNC(src, .proc/prepare_icon_update)
|
|
|
|
/obj/item/hierophant_club/proc/calculate_anger_mod(mob/user) //we get stronger as the user loses health
|
|
chaser_cooldown = initial(chaser_cooldown)
|
|
cooldown_time = initial(cooldown_time)
|
|
chaser_speed = initial(chaser_speed)
|
|
blast_range = initial(blast_range)
|
|
if(isliving(user))
|
|
var/mob/living/L = user
|
|
var/health_percent = L.health / L.maxHealth
|
|
chaser_cooldown += round(health_percent * 20) //two tenths of a second for each missing 10% of health
|
|
cooldown_time += round(health_percent * 10) //one tenth of a second for each missing 10% of health
|
|
chaser_speed = max(chaser_speed + health_percent, 0.5) //one tenth of a second faster for each missing 10% of health
|
|
blast_range -= round(health_percent * 10) //one additional range for each missing 10% of health
|
|
|
|
/obj/item/hierophant_club/update_icon()
|
|
icon_state = "hierophant_club[timer <= world.time ? "_ready":""][(beacon && !QDELETED(beacon)) ? "":"_beacon"]"
|
|
item_state = icon_state
|
|
if(ismob(loc))
|
|
var/mob/M = loc
|
|
M.update_inv_hands()
|
|
M.update_inv_back()
|
|
|
|
/obj/item/hierophant_club/proc/prepare_icon_update()
|
|
update_icon()
|
|
sleep(timer - world.time)
|
|
update_icon()
|
|
|
|
/obj/item/hierophant_club/ui_action_click(mob/user, action)
|
|
if(istype(action, /datum/action/item_action/toggle_unfriendly_fire)) //toggle friendly fire...
|
|
friendly_fire_check = !friendly_fire_check
|
|
to_chat(user, span_warning("You toggle friendly fire [friendly_fire_check ? "off":"on"]!"))
|
|
return
|
|
if(timer > world.time)
|
|
return
|
|
if(!user.is_holding(src)) //you need to hold the staff to teleport
|
|
to_chat(user, span_warning("You need to hold the club in your hands to [beacon ? "teleport with it":"detach the beacon"]!"))
|
|
return
|
|
if(!beacon || QDELETED(beacon))
|
|
if(isturf(user.loc))
|
|
user.visible_message("[span_hierophant_warning("[user] starts fiddling with [src]'s pommel...")]", \
|
|
span_notice("You start detaching the hierophant beacon..."))
|
|
timer = world.time + 5.1 SECONDS
|
|
INVOKE_ASYNC(src, .proc/prepare_icon_update)
|
|
if(do_after(user, 5 SECONDS, user) && !beacon)
|
|
var/turf/T = get_turf(user)
|
|
playsound(T,'sound/magic/blind.ogg', 200, 1, -4)
|
|
new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user)
|
|
beacon = new/obj/effect/hierophant(T)
|
|
user.update_action_buttons_icon()
|
|
user.visible_message("[span_hierophant_warning("[user] places a strange machine beneath [user.p_their()] feet!")]", \
|
|
"[span_hierophant("You detach the hierophant beacon, allowing you to teleport yourself and any allies to it at any time!")]\n\
|
|
[span_notice("You can remove the beacon to place it again by striking it with the club.")]")
|
|
else
|
|
timer = world.time
|
|
INVOKE_ASYNC(src, .proc/prepare_icon_update)
|
|
else
|
|
to_chat(user, span_warning("You need to be on solid ground to detach the beacon!"))
|
|
return
|
|
if(get_dist(user, beacon) <= 2) //beacon too close abort
|
|
to_chat(user, span_warning("You are too close to the beacon to teleport to it!"))
|
|
return
|
|
if(is_blocked_turf(get_turf(beacon), TRUE))
|
|
to_chat(user, span_warning("The beacon is blocked by something, preventing teleportation!"))
|
|
return
|
|
if(!isturf(user.loc))
|
|
to_chat(user, span_warning("You don't have enough space to teleport from here!"))
|
|
return
|
|
teleporting = TRUE //start channel
|
|
user.update_action_buttons_icon()
|
|
user.visible_message("[span_hierophant_warning("[user] starts to glow faintly...")]")
|
|
timer = world.time + 5 SECONDS
|
|
INVOKE_ASYNC(src, .proc/prepare_icon_update)
|
|
beacon.icon_state = "hierophant_tele_on"
|
|
var/obj/effect/temp_visual/hierophant/telegraph/edge/TE1 = new /obj/effect/temp_visual/hierophant/telegraph/edge(user.loc)
|
|
var/obj/effect/temp_visual/hierophant/telegraph/edge/TE2 = new /obj/effect/temp_visual/hierophant/telegraph/edge(beacon.loc)
|
|
if(do_after(user, 4 SECONDS, user) && user && beacon)
|
|
var/turf/T = get_turf(beacon)
|
|
var/turf/source = get_turf(user)
|
|
if(is_blocked_turf(T, TRUE))
|
|
teleporting = FALSE
|
|
to_chat(user, span_warning("The beacon is blocked by something, preventing teleportation!"))
|
|
user.update_action_buttons_icon()
|
|
timer = world.time
|
|
INVOKE_ASYNC(src, .proc/prepare_icon_update)
|
|
beacon.icon_state = "hierophant_tele_off"
|
|
return
|
|
new /obj/effect/temp_visual/hierophant/telegraph(T, user)
|
|
new /obj/effect/temp_visual/hierophant/telegraph(source, user)
|
|
playsound(T,'sound/magic/wand_teleport.ogg', 200, 1)
|
|
playsound(source,'sound/machines/airlockopen.ogg', 200, 1)
|
|
if(!do_after(user, 0.3 SECONDS, user) || !user || !beacon || QDELETED(beacon)) //no walking away shitlord
|
|
teleporting = FALSE
|
|
if(user)
|
|
user.update_action_buttons_icon()
|
|
timer = world.time
|
|
INVOKE_ASYNC(src, .proc/prepare_icon_update)
|
|
if(beacon)
|
|
beacon.icon_state = "hierophant_tele_off"
|
|
return
|
|
if(is_blocked_turf(T, TRUE))
|
|
teleporting = FALSE
|
|
to_chat(user, span_warning("The beacon is blocked by something, preventing teleportation!"))
|
|
user.update_action_buttons_icon()
|
|
timer = world.time
|
|
INVOKE_ASYNC(src, .proc/prepare_icon_update)
|
|
beacon.icon_state = "hierophant_tele_off"
|
|
return
|
|
user.log_message("teleported self from [AREACOORD(source)] to [beacon]", LOG_GAME)
|
|
new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user)
|
|
new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, user)
|
|
for(var/t in RANGE_TURFS(1, T))
|
|
var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //blasts produced will not hurt allies
|
|
B.damage = 30
|
|
for(var/t in RANGE_TURFS(1, source))
|
|
var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //but absolutely will hurt enemies
|
|
B.damage = 30
|
|
for(var/mob/living/L in range(1, source))
|
|
INVOKE_ASYNC(src, .proc/teleport_mob, source, L, T, user) //regardless, take all mobs near us along
|
|
sleep(0.6 SECONDS) //at this point the blasts detonate
|
|
if(beacon)
|
|
beacon.icon_state = "hierophant_tele_off"
|
|
else
|
|
qdel(TE1)
|
|
qdel(TE2)
|
|
timer = world.time
|
|
INVOKE_ASYNC(src, .proc/prepare_icon_update)
|
|
if(beacon)
|
|
beacon.icon_state = "hierophant_tele_off"
|
|
teleporting = FALSE
|
|
if(user)
|
|
user.update_action_buttons_icon()
|
|
|
|
/obj/item/hierophant_club/proc/teleport_mob(turf/source, mob/M, turf/target, mob/user)
|
|
var/turf/turf_to_teleport_to = get_step(target, get_dir(source, M)) //get position relative to caster
|
|
if(!turf_to_teleport_to || is_blocked_turf(turf_to_teleport_to, TRUE))
|
|
return
|
|
animate(M, alpha = 0, time = 0.2 SECONDS, easing = EASE_OUT) //fade out
|
|
sleep(0.1 SECONDS)
|
|
if(!M)
|
|
return
|
|
M.visible_message("[span_hierophant_warning("[M] fades out!")]")
|
|
sleep(0.2 SECONDS)
|
|
if(!M)
|
|
return
|
|
M.forceMove(turf_to_teleport_to)
|
|
sleep(0.1 SECONDS)
|
|
if(!M)
|
|
return
|
|
animate(M, alpha = 255, time = 0.2 SECONDS, easing = EASE_IN) //fade IN
|
|
sleep(0.1 SECONDS)
|
|
if(!M)
|
|
return
|
|
M.visible_message("[span_hierophant_warning("[M] fades in!")]")
|
|
if(user != M)
|
|
log_combat(user, M, "teleported", null, "from [AREACOORD(source)]")
|
|
|
|
/obj/item/hierophant_club/proc/cardinal_blasts(turf/T, mob/living/user) //fire cardinal cross blasts with a delay
|
|
if(!T)
|
|
return
|
|
new /obj/effect/temp_visual/hierophant/telegraph/cardinal(T, user)
|
|
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
|
|
sleep(0.2 SECONDS)
|
|
var/obj/effect/temp_visual/hierophant/blast/B = new(T, user, friendly_fire_check)
|
|
B.damage = HIEROPHANT_CLUB_CARDINAL_DAMAGE
|
|
B.monster_damage_boost = FALSE
|
|
for(var/d in GLOB.cardinals)
|
|
INVOKE_ASYNC(src, .proc/blast_wall, T, d, user)
|
|
|
|
/obj/item/hierophant_club/proc/blast_wall(turf/T, dir, mob/living/user) //make a wall of blasts blast_range tiles long
|
|
if(!T)
|
|
return
|
|
var/range = blast_range
|
|
var/turf/previousturf = T
|
|
var/turf/J = get_step(previousturf, dir)
|
|
for(var/i in 1 to range)
|
|
if(!J)
|
|
return
|
|
var/obj/effect/temp_visual/hierophant/blast/B = new(J, user, friendly_fire_check)
|
|
B.damage = HIEROPHANT_CLUB_CARDINAL_DAMAGE
|
|
B.monster_damage_boost = FALSE
|
|
previousturf = J
|
|
J = get_step(previousturf, dir)
|
|
|
|
/obj/item/hierophant_club/proc/aoe_burst(turf/T, mob/living/user) //make a 3x3 blast around a target
|
|
if(!T)
|
|
return
|
|
new /obj/effect/temp_visual/hierophant/telegraph(T, user)
|
|
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
|
|
sleep(0.2 SECONDS)
|
|
for(var/t in RANGE_TURFS(1, T))
|
|
var/obj/effect/temp_visual/hierophant/blast/B = new(t, user, friendly_fire_check)
|
|
B.damage = 15 //keeps monster damage boost due to lower damage
|
|
|
|
/obj/item/hierophant_antenna
|
|
name = "hierophant's antenna"
|
|
icon = 'icons/obj/lavaland/artefacts.dmi'
|
|
icon_state = "hierophant_antenna"
|
|
item_state = "hierophant_antenna"
|
|
desc = "Extends the range of the herald's power."
|
|
|
|
/obj/item/hierophant_club/attackby(obj/item/I, mob/user)
|
|
if(istype(I, /obj/item/hierophant_antenna))
|
|
if(z_level_check)
|
|
z_level_check = FALSE
|
|
desc += " It has an ominous antenna attached."
|
|
qdel(I)
|
|
else
|
|
to_chat(user, span_warning("The herald's power already reaches this club!"))
|
|
return TRUE
|
|
else
|
|
return ..()
|
|
|
|
/obj/item/hierophant_club/station
|
|
z_level_check = FALSE
|
|
|
|
//Stalwart
|
|
|
|
/obj/item/gun/energy/plasmacutter/adv/robocutter
|
|
name = "ancient focusing crystal"
|
|
desc = "A humming crystaline weapon, firing scattered blasts of focused energy."
|
|
fire_delay = 4
|
|
icon = 'icons/obj/guns/energy.dmi'
|
|
icon_state = "robocutter"
|
|
ammo_type = list(/obj/item/ammo_casing/energy/plasma/stalwart)
|
|
materials = list(/datum/material/bluespace = 8000, /datum/material/diamond = 2000, /datum/material/dilithium = 2000)
|
|
usesound = list('sound/weapons/taserhit.ogg')
|
|
toolspeed = 0.33 //funky bluespace welding effect idk
|
|
selfcharge = 1
|
|
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
|
|
|
/obj/item/twohanded/bonespear/stalwartpike
|
|
icon = 'icons/obj/weapons/spears.dmi'
|
|
icon_state = "stalwart_spear0"
|
|
lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
|
|
name = "ancient control rod"
|
|
//don't want your rare megafauna loot shattering easily
|
|
max_integrity = 2000
|
|
desc = "A mysterious crystaline rod of exceptional length, humming with ancient power. Too unweildy for use in one hand."
|
|
wielded_stats = list(SWING_SPEED = 0.8, ENCUMBRANCE = 0.2, ENCUMBRANCE_TIME = 2, REACH = 3, DAMAGE_LOW = 0, DAMAGE_HIGH = 0)
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
var/w_class_on = WEIGHT_CLASS_HUGE
|
|
slot_flags = ITEM_SLOT_BELT
|
|
force = 0
|
|
throwforce = 0
|
|
throw_speed = 4
|
|
materials = list(/datum/material/bluespace = 8000, /datum/material/diamond = 2000, /datum/material/dilithium = 2000)
|
|
sharpness = SHARP_NONE
|
|
block_chance = 0
|
|
var/fauna_damage_bonus = 0
|
|
var/fauna_damage_type = BRUTE
|
|
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
|
|
|
/obj/item/twohanded/bonespear/stalwartpike/update_icon()
|
|
. = ..()
|
|
if(wielded)
|
|
icon_state = "stalwart_spear1"
|
|
else
|
|
icon_state = "stalwart_spear0"
|
|
SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_TYPE_BLOOD)
|
|
|
|
/obj/item/twohanded/bonespear/stalwartpike/wield(mob/living/carbon/M)
|
|
. = ..()
|
|
if(wielded)
|
|
playsound(src, 'sound/magic/summonitems_generic.ogg', 50, 1)
|
|
sharpness = SHARP_POINTY
|
|
w_class = w_class_on
|
|
block_chance = 25
|
|
force = 8
|
|
fauna_damage_bonus = 52
|
|
|
|
/obj/item/twohanded/bonespear/stalwartpike/unwield(mob/living/carbon/M)
|
|
if(wielded)
|
|
playsound(src, 'sound/magic/teleport_diss.ogg', 50, 1)
|
|
sharpness = initial(sharpness)
|
|
w_class = initial(w_class)
|
|
force = initial(force)
|
|
block_chance = initial(block_chance)
|
|
fauna_damage_bonus = initial(fauna_damage_bonus)
|
|
. = ..()
|
|
|
|
/obj/item/twohanded/bonespear/stalwartpike/afterattack(atom/target, mob/user, proximity)
|
|
. = ..()
|
|
if(!proximity || !wielded)
|
|
return
|
|
if(isliving(target))
|
|
var/mob/living/L = target
|
|
if(ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid))
|
|
L.apply_damage(fauna_damage_bonus,fauna_damage_type)
|
|
playsound(L, 'sound/magic/blind.ogg', 100, 1)
|
|
|
|
/obj/structure/closet/crate/sphere/stalwart
|
|
name = "silvery capsule"
|
|
desc = "It feels cold to the touch..."
|
|
|
|
/obj/structure/closet/crate/sphere/stalwart/PopulateContents()
|
|
var/loot = rand(1,2)
|
|
switch(loot)
|
|
if(1)
|
|
new /obj/item/gun/energy/plasmacutter/adv/robocutter(src)
|
|
new /obj/item/gem/purple(src)
|
|
if(2)
|
|
new /obj/item/twohanded/bonespear/stalwartpike(src)
|
|
new /obj/item/ai_cpu/stalwart(src)
|
|
|
|
//Just some minor stuff
|
|
/obj/structure/closet/crate/necropolis/puzzle
|
|
name = "puzzling chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/puzzle/PopulateContents()
|
|
var/loot = rand(1,3)
|
|
switch(loot)
|
|
if(1)
|
|
new /obj/item/bodypart/r_arm/robot/seismic(src)
|
|
if(2)
|
|
new /obj/item/wisp_lantern(src)
|
|
if(3)
|
|
new /obj/item/prisoncube(src)
|
|
|
|
//Legion
|
|
#define COOLDOWN_TAP 60
|
|
#define COOLDOWN_BAND 200
|
|
#define COOLDOWN_TELE 15
|
|
/obj/item/cane/cursed
|
|
name = "cursed cane"
|
|
desc = "A pristine marble cane. Tapping the cane against the ground calls lesser minions to you while tapping it against a dead or dying victim will make them yours should you\
|
|
have the capacity for it. Throwing the cane teleports you to it if it hits something and can be done to finish off targets from afar. Additionally, one would only need to\
|
|
hold the cane once to avoid the hostility of the aides."
|
|
icon = 'icons/obj/lavaland/artefacts.dmi'
|
|
icon_state = "cursedcane"
|
|
item_state = "cursedcane"
|
|
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
|
force = 1 //for weaker animals and fucking legion skulls
|
|
throwforce = 0
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
|
actions_types = list(/datum/action/item_action/band)
|
|
var/limit = 3
|
|
var/telerange = 20
|
|
var/next_tap = 0
|
|
var/next_band = 0
|
|
var/next_teleport = 0
|
|
|
|
/obj/item/cane/cursed/pickup(mob/user)
|
|
. = ..()
|
|
user.faction |= "cane"
|
|
|
|
/obj/item/cane/cursed/attack_self(mob/user)
|
|
if(next_tap > world.time)
|
|
to_chat(user, span_warning("You can't do that yet!"))
|
|
return
|
|
for(var/i=1 to limit)
|
|
var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/aide/B = new(user.loc)
|
|
B.faction = user.faction
|
|
to_chat(user, span_notice("You tap the cane against a nearby surface and call upon your aides!"))
|
|
playsound(loc, 'sound/weapons/ricochet.ogg', 20, 1)
|
|
next_tap = world.time + COOLDOWN_TAP
|
|
|
|
/obj/item/cane/cursed/proc/bigfinish(mob/living/user, mob/living/target)
|
|
var/mob/living/M = target
|
|
if(M.stat != DEAD)
|
|
var/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/attendant/L = new(M.loc)
|
|
M.adjustBruteLoss(M.health)
|
|
GLOB.aide_list += L
|
|
L.faction = user.faction
|
|
playsound(user, pick('sound/effects/curse1.ogg','sound/effects/curse2.ogg','sound/effects/curse3.ogg'), 30)
|
|
user.visible_message(span_warning("[user] jabs [M] with [user.p_their()] cane before enveloping [M.p_them()] in a dark mass!"))
|
|
to_chat(user, span_notice("You finish off your victim with an infusion of your cursed energy, raising a stronger minion!"))
|
|
|
|
/obj/item/cane/cursed/proc/littlefinish(mob/living/user, mob/living/target)
|
|
var/mob/living/M = target
|
|
var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/aide/L = new(M.loc)
|
|
M.adjustBruteLoss(M.health)
|
|
L.stored_mob = M
|
|
M.forceMove(L)
|
|
playsound(user, pick('sound/effects/curse1.ogg','sound/effects/curse2.ogg','sound/effects/curse3.ogg'), 30)
|
|
user.visible_message(span_warning("[user] jabs [M] with [user.p_their()] cane before enveloping [M.p_them()] in a dark mass!"))
|
|
to_chat(M, span_userdanger("You feel the last of your energy fade away as everything turns to black!"))
|
|
|
|
/obj/item/cane/cursed/proc/execute(mob/living/user, mob/living/target)
|
|
var/mob/living/M = target
|
|
M.adjustBruteLoss(M.health)
|
|
user.visible_message(span_warning("[user] jabs [M] with [user.p_their()] cane, making [M.p_their()] eyes flash black before keeling over!"))
|
|
|
|
/obj/item/cane/cursed/proc/curse(mob/living/user, mob/living/target)
|
|
var/mob/living/M = target
|
|
if((faction_check(M.faction, "cane")) || istype(M, /mob/living/simple_animal/hostile/asteroid/elite/legionnairehead) || istype(M, /mob/living/simple_animal/hostile/asteroid/hivelordbrood))
|
|
return FALSE
|
|
if(isbot(M))//because they just walk out of the aide lol
|
|
return FALSE
|
|
if(GLOB.aide_list.len >= limit)
|
|
if(M.stat == CONSCIOUS)
|
|
if(iscarbon(M) && M.health < M.maxHealth/8)
|
|
execute(user, M)
|
|
return FALSE
|
|
if(ismegafauna(M) && M.health < M.maxHealth/5)
|
|
execute(user, M)
|
|
limit++
|
|
return FALSE
|
|
if(M.health < M.maxHealth/2.8)
|
|
execute(user, M)
|
|
return FALSE
|
|
else
|
|
to_chat(user, span_notice("You can't control that many minions!"))
|
|
return FALSE
|
|
if(ismegafauna(M))
|
|
if(M.health > M.maxHealth/5)
|
|
to_chat(user, span_notice("Your target must be weakened!"))
|
|
return FALSE
|
|
else if (M.stat == CONSCIOUS)
|
|
bigfinish(user, M)
|
|
limit ++
|
|
to_chat(user, span_notice("Defeating a powerful foe has increased the cane's capacity for minions!"))
|
|
return TRUE
|
|
if(istype(M, /mob/living/simple_animal/hostile/asteroid/elite))
|
|
if(M.health > M.maxHealth/5)
|
|
to_chat(user, span_notice("Your target must be weakened!"))
|
|
return FALSE
|
|
else
|
|
bigfinish(user, M)
|
|
return TRUE
|
|
if(M.has_status_effect(STATUS_EFFECT_EXHUMED))
|
|
to_chat(user, span_notice("[target] cannot be raised again!"))
|
|
return FALSE
|
|
if(M.stat == DEAD)
|
|
littlefinish(user, M)
|
|
M.apply_status_effect(/datum/status_effect/exhumed)
|
|
return TRUE
|
|
if(iscarbon(M) && M.health < M.maxHealth/8)
|
|
littlefinish(user, M)
|
|
return TRUE
|
|
if(M.health < M.maxHealth/2.8)
|
|
littlefinish(user, M)
|
|
return TRUE
|
|
|
|
/obj/item/cane/cursed/ui_action_click(mob/living/user, action)
|
|
if(istype(action, /datum/action/item_action/band))
|
|
if(next_band > world.time)
|
|
to_chat(user, span_warning("You can't do that yet!"))
|
|
return
|
|
if(GLOB.aide_list.len < 1)
|
|
to_chat(user, span_notice("You don't have any minions to summon!"))
|
|
return
|
|
user.visible_message(span_warning("With the snap of [user.p_their()] fingers, [user] calls upon [user.p_their()] aides!"))
|
|
playsound(usr, 'sound/misc/fingersnap1.ogg', 100, 1)
|
|
for(var/turf/open/O in view(2, user))
|
|
if(!istype(O, /turf/open/chasm) && O)
|
|
for(var/mob/living/simple_animal/aide in GLOB.aide_list)
|
|
if(prob(30))
|
|
aide.forceMove(O)
|
|
playsound(aide, 'sound/magic/teleport_app.ogg', 20, 1)
|
|
next_band = world.time + COOLDOWN_BAND
|
|
|
|
|
|
/obj/item/cane/cursed/afterattack(mob/living/target , mob/living/carbon/user, proximity)
|
|
.=..()
|
|
if(!proximity)
|
|
return
|
|
curse(user, target)
|
|
|
|
/obj/item/cane/cursed/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
|
. = ..()
|
|
var/turf/D = get_turf(src)
|
|
var/turf/Z = get_turf(thrownby)
|
|
if(hit_atom.density == TRUE && get_dist(src,thrownby) <= telerange)
|
|
var/obj/effect/temp_visual/decoy/fading/halfsecond/F = new(Z, thrownby)
|
|
if(next_teleport < world.time)
|
|
F.forceMove(Z)
|
|
next_teleport = world.time + COOLDOWN_TELE
|
|
thrownby.forceMove(D)
|
|
thrownby.visible_message(span_warning("[thrownby] reappears at the location of [thrownby.p_their()] cane!"))
|
|
thrownby.put_in_hands(src)
|
|
if(isliving(hit_atom))
|
|
var/mob/living/M = hit_atom
|
|
if(curse(thrownby, M) == TRUE)
|
|
to_chat(thrownby, span_notice("You appear before the cane and stab [M], making a new minion out of [M.p_them()]!"))
|