Merge remote-tracking branch 'upstream/master' into universal-damage

This commit is contained in:
Fox McCloud
2019-09-14 21:15:31 -04:00
212 changed files with 2977 additions and 1726 deletions
+14 -3
View File
@@ -34,17 +34,28 @@ actual development.
* Pull requests should be atomic; Make one commit for each distinct change, so if a part
of a pull request needs to be removed/changed, you may simply modify that single commit.
Due to limitations of the engine, this may not always be possible; but do try your best.
* Document and explain your pull requests thoroughly. Detail what each commit changes,
and why it changes it. We do not want to have to read all of you commit names to figure
out what your pull request is about.
* Document and explain your pull requests thoroughly. Failure to do so will delay a PR as
we question why changes were made. This is especially important if you're porting a PR
from another codebase (i.e. TG) and divert from the original. Explaining with single
comment on why you've made changes will help us review the PR faster and understand your
decision making process.
* Any pull request must have a changelog, this is to allow us to know when a PR is deployed
on the live server. Inline changelogs are supported through the format described
[here](https://github.com/ParadiseSS13/Paradise/pull/3291#issuecomment-172950466)
and should be used rather than manually edited .yml file changelogs.
* Pull requests should not have any merge commits except in the case of fixing merge
conflicts for an existing pull request. New pull requests should not have any merge
commits. Use `git rebase` or `git reset` to update your branches, not `git pull`.
* Please explain why you are submitting the pull request, and how you think your change will be beneficial to the game. Failure to do so will be grounds for rejecting the PR.
* If your pull request is not finished make sure it is at least testable in a live environment. Pull requests that do not at least meet this requirement may be closed at maintainer discretion. You may request a maintainer reopen the pull request when you're ready, or make a new one.
* While we have no issue helping contributors (and especially new contributors) bring reasonably sized contributions up to standards via the pull request review process, larger contributions are expected to pass a higher bar of completeness and code quality *before* you open a pull request. Maintainers may close such pull requests that are deemed to be substantially flawed. You should take some time to discuss with maintainers or other contributors on how to improve the changes.
#### Using Changelog
* Tags used in changelog include add/rscadd, del/rscdel, fix/fixes, typo/spellcheck.
* Without specifying a name it will default to using your GitHub name.
+13 -6
View File
@@ -1,11 +1,16 @@
**What does this PR do:**
Include a small to medium description of what your PR changes. Feel free to give it a little flourish if you want to show off a new feature more completely.
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull request process. -->
**Images of sprite/map changes (IF APPLICABLE):**
If you did not make a map or sprite edit, you may leave this section blank. You may include a gif of your feature if you want
## What Does This PR Do
<!-- Include a small to medium description of what your PR changes. Document every changes or this may delay review or even discourage maintainers from merging your PR! -->
**Changelog:**
*Remove this line, and appropriate fields from the changelog*
## Why It's Good For The Game
<!-- Please add a short description of why you think these changes would benefit the game. If you can't justify it in words, it might not be worth adding. -->
## Images of changes
<!-- If you did not make a map or sprite edit, you may delete this section. You may include a gif of your feature if you want -->
## Changelog
:cl:
add: Added new things
del: Removed old things
@@ -21,3 +26,5 @@ spellcheck: fixed a few typos
experiment: added an experimental thingy
/:cl:
<!-- Both :cl:'s are required for the changelog to work! You can put your name to the right of the first :cl: if you want to overwrite your GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the icon ingame) and delete the unneeded ones. Despite some of the tags, changelogs should generally represent how a player might be affected by the changes rather than a summary of the PR's contents. -->
+31 -31
View File
@@ -22514,7 +22514,7 @@
},
/area/crew_quarters/bar/atrium)
"aRy" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/carpet,
/area/crew_quarters/bar/atrium)
"aRz" = (
@@ -23422,7 +23422,7 @@
d2 = 8;
icon_state = "1-8"
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/carpet,
@@ -24305,7 +24305,7 @@
},
/area/crew_quarters/bar/atrium)
"aUH" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 1
},
/turf/simulated/floor/carpet,
@@ -89006,7 +89006,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/wood{
broken = 1;
icon_state = "wood-broken"
@@ -89016,12 +89016,12 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plating,
/area/maintenance/gambling_den)
"dcT" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plasteel{
icon_state = "wood"
},
@@ -90537,7 +90537,7 @@
/area/maintenance/gambling_den)
"dfP" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/wood{
@@ -91371,7 +91371,7 @@
},
/area/maintenance/gambling_den)
"dhw" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/plasteel{
@@ -91380,7 +91380,7 @@
/area/maintenance/gambling_den)
"dhx" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/plating,
@@ -92327,7 +92327,7 @@
/turf/simulated/floor/plating,
/area/maintenance/starboard)
"diY" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/wood{
@@ -92346,7 +92346,7 @@
/area/maintenance/gambling_den)
"dja" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/plasteel{
@@ -93121,7 +93121,7 @@
},
/area/maintenance/gambling_den)
"dkr" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/plating,
@@ -94305,7 +94305,7 @@
/turf/simulated/floor/plasteel,
/area/hallway/secondary/construction)
"dmM" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plating,
/area/maintenance/gambling_den)
"dmN" = (
@@ -96153,7 +96153,7 @@
/turf/simulated/floor/plasteel,
/area/crew_quarters/hor)
"dpR" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 1
},
/turf/simulated/floor/plating,
@@ -96848,7 +96848,7 @@
},
/area/maintenance/gambling_den)
"dra" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/plating,
@@ -101412,7 +101412,7 @@
},
/area/crew_quarters/theatre)
"dzq" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/plasteel{
@@ -102176,7 +102176,7 @@
dir = 4;
level = 1
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/plasteel{
@@ -102619,7 +102619,7 @@
},
/area/crew_quarters/theatre)
"dBq" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/plasteel{
@@ -108948,21 +108948,21 @@
},
/area/chapel/office)
"dMT" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "chapel"
},
/area/chapel/main)
"dMU" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plasteel{
icon_state = "chapel"
},
/area/chapel/main)
"dMV" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "chapel"
@@ -108970,14 +108970,14 @@
/area/chapel/main)
"dMW" = (
/obj/structure/disposalpipe/segment,
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "chapel"
},
/area/chapel/main)
"dMX" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/obj/machinery/firealarm{
dir = 4;
pixel_x = 28
@@ -109317,14 +109317,14 @@
},
/area/chapel/office)
"dNJ" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plasteel{
dir = 1;
icon_state = "chapel"
},
/area/chapel/main)
"dNK" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plasteel{
dir = 4;
icon_state = "chapel"
@@ -109332,7 +109332,7 @@
/area/chapel/main)
"dNL" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plasteel{
dir = 1;
icon_state = "chapel"
@@ -109340,7 +109340,7 @@
/area/chapel/main)
"dNM" = (
/obj/structure/disposalpipe/segment,
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plasteel{
dir = 1;
icon_state = "chapel"
@@ -109692,7 +109692,7 @@
},
/area/chapel/office)
"dOq" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/obj/machinery/light{
icon_state = "tube1";
dir = 8
@@ -109715,7 +109715,7 @@
},
/area/chapel/main)
"dOt" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/obj/machinery/light{
icon_state = "tube1";
dir = 4
@@ -111770,7 +111770,7 @@
/area/chapel/office)
"dSf" = (
/obj/machinery/light/small,
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/obj/machinery/newscaster{
@@ -111783,7 +111783,7 @@
/area/chapel/main)
"dSg" = (
/obj/machinery/light/small,
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/obj/machinery/newscaster{
@@ -13578,7 +13578,7 @@
/turf/simulated/floor/plating,
/area/maintenance/fore)
"aya" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/wood,
/area/crew_quarters/mrchangs)
"ayb" = (
@@ -14935,7 +14935,7 @@
name = "Port Maintenance"
})
"aAB" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 1
},
/turf/simulated/floor/wood,
@@ -14952,7 +14952,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 1
},
/turf/simulated/floor/wood,
@@ -15652,7 +15652,7 @@
/turf/simulated/floor/wood,
/area/crew_quarters/sleep)
"aBS" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 1
},
/turf/simulated/floor/wood,
@@ -21926,7 +21926,7 @@
name = "\improper Warehouse"
})
"aMA" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/wood,
@@ -78,7 +78,7 @@
/obj/item/shard{
icon_state = "medium"
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/wood,
@@ -128,7 +128,7 @@
/turf/simulated/floor/wood,
/area/ruin/unpowered)
"av" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/wood,
@@ -201,7 +201,7 @@
/turf/simulated/floor/wood,
/area/ruin/unpowered)
"aH" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/carpet,
+2 -2
View File
@@ -1134,7 +1134,7 @@
/turf/simulated/floor/plasteel,
/area/awaymission/academy/classrooms)
"ds" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 1
},
/turf/simulated/floor/wood,
@@ -2204,7 +2204,7 @@
},
/area/awaymission/academy/classrooms)
"gb" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/wood,
/area/awaymission/academy/classrooms)
"gc" = (
+4 -4
View File
@@ -605,7 +605,7 @@
},
/area/awaymission/example)
"bB" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plasteel{
icon_state = "bar"
},
@@ -670,7 +670,7 @@
},
/area/awaymission/example)
"bJ" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
tag = "icon-wooden_chair (EAST)";
icon_state = "wooden_chair";
dir = 4
@@ -680,7 +680,7 @@
},
/area/awaymission/example)
"bK" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
tag = "icon-wooden_chair (WEST)";
icon_state = "wooden_chair";
dir = 8
@@ -706,7 +706,7 @@
},
/area/awaymission/example)
"bN" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
tag = "icon-wooden_chair (NORTH)";
icon_state = "wooden_chair";
dir = 1
@@ -2195,7 +2195,7 @@
name = "Syndicate Outpost"
})
"dh" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/obj/machinery/alarm/monitor{
dir = 4;
frequency = 1439;
@@ -7981,7 +7981,7 @@
/obj/machinery/light/small{
dir = 4
},
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/obj/machinery/alarm/monitor{
dir = 8;
frequency = 1439;
@@ -8717,7 +8717,7 @@
name = "MO19 Arrivals"
})
"mB" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/carpet,
+17 -17
View File
@@ -224,7 +224,7 @@
},
/area/awaymission/UO71/plaza)
"aH" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
tag = "icon-wooden_chair (NORTH)";
icon_state = "wooden_chair";
dir = 1
@@ -873,7 +873,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 10
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
tag = "icon-wooden_chair (EAST)";
icon_state = "wooden_chair";
dir = 4
@@ -921,7 +921,7 @@
on = 1;
pressure_checks = 1
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
tag = "icon-wooden_chair (NORTH)";
icon_state = "wooden_chair";
dir = 1
@@ -2216,7 +2216,7 @@
on = 1;
pressure_checks = 1
},
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/carpet,
/area/awaymission/UO71/plaza)
"eW" = (
@@ -6161,7 +6161,7 @@
pixel_y = 23;
req_access = null
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/obj/item/paper/terrorspiders4,
@@ -6479,7 +6479,7 @@
req_access_txt = "0";
specialfunctions = 4
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
tag = "icon-wooden_chair (NORTH)";
icon_state = "wooden_chair";
dir = 1
@@ -8632,7 +8632,7 @@
},
/area/awaymission/UO71/centralhall)
"qL" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/carpet,
/area/awaymission/UO71/centralhall)
"qM" = (
@@ -9040,7 +9040,7 @@
/turf/simulated/floor/carpet,
/area/awaymission/UO71/centralhall)
"ru" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/carpet,
@@ -12195,7 +12195,7 @@
/obj/machinery/light/small{
dir = 1
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/carpet,
@@ -12540,7 +12540,7 @@
},
/area/awaymission/UO71/eng)
"xF" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/carpet,
/area/awaymission/UO71/mining)
"xG" = (
@@ -13396,7 +13396,7 @@
/turf/simulated/floor/carpet,
/area/awaymission/UO71/loot)
"zt" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/obj/item/clothing/shoes/chameleon/noslip,
/turf/simulated/floor/carpet,
/area/awaymission/UO71/loot)
@@ -13506,12 +13506,12 @@
/turf/simulated/floor/wood,
/area/awaymission/UO71/queen)
"zW" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/wood,
/area/awaymission/UO71/queen)
"zX" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
tag = "icon-wooden_chair (EAST)";
icon_state = "wooden_chair";
dir = 4
@@ -13523,7 +13523,7 @@
/turf/simulated/floor/wood,
/area/awaymission/UO71/queen)
"zZ" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
tag = "icon-wooden_chair (EAST)";
icon_state = "wooden_chair";
dir = 4
@@ -13531,7 +13531,7 @@
/turf/simulated/floor/wood,
/area/awaymission/UO71/queen)
"Aa" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/wood,
@@ -13544,7 +13544,7 @@
/turf/simulated/floor/wood,
/area/awaymission/UO71/queen)
"Ac" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
tag = "icon-wooden_chair (NORTH)";
icon_state = "wooden_chair";
dir = 1
@@ -13568,7 +13568,7 @@
/turf/simulated/floor/wood,
/area/awaymission/UO71/queen)
"Ag" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/obj/machinery/light,
@@ -1423,7 +1423,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 10
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
tag = "icon-wooden_chair (EAST)";
icon_state = "wooden_chair";
dir = 4
@@ -1491,7 +1491,7 @@
on = 1;
pressure_checks = 1
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
tag = "icon-wooden_chair (NORTH)";
icon_state = "wooden_chair";
dir = 1
@@ -3362,7 +3362,7 @@
on = 1;
pressure_checks = 1
},
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/carpet,
/area/awaycontent/a1{
has_gravity = 1;
@@ -8156,7 +8156,7 @@
pixel_y = 23;
req_access = null
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/carpet,
@@ -8519,7 +8519,7 @@
req_access_txt = "0";
specialfunctions = 4
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
tag = "icon-wooden_chair (NORTH)";
icon_state = "wooden_chair";
dir = 1
@@ -11135,7 +11135,7 @@
name = "UO45 Crew Quarters"
})
"qt" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/carpet,
/area/awaycontent/a2{
has_gravity = 1;
@@ -11629,7 +11629,7 @@
name = "UO45 Crew Quarters"
})
"ra" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/carpet,
@@ -15331,7 +15331,7 @@
/obj/machinery/light/small{
dir = 1
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/carpet,
@@ -15833,7 +15833,7 @@
name = "UO45 Engineering"
})
"wN" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/carpet,
/area/awaycontent/a4{
has_gravity = 1;
+10 -10
View File
@@ -682,7 +682,7 @@
},
/area/awaymission/wwmines)
"cc" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/plasteel{
@@ -704,7 +704,7 @@
},
/area/awaymission/wwmines)
"ce" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/plasteel{
@@ -861,7 +861,7 @@
/turf/simulated/floor/wood,
/area/awaymission/wwgov)
"cA" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/wood,
@@ -995,13 +995,13 @@
/turf/simulated/floor/wood,
/area/awaymission/wwmines)
"cV" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/wood,
/area/awaymission/wwmines)
"cW" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/wood,
@@ -2303,7 +2303,7 @@
/turf/simulated/wall/mineral/sandstone,
/area/awaymission/wwmines)
"gm" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/plasteel{
@@ -2312,7 +2312,7 @@
},
/area/awaymission/wwmines)
"gn" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/plasteel{
@@ -2428,7 +2428,7 @@
/turf/simulated/floor/wood,
/area/awaymission/wwmines)
"gD" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "barber"
@@ -2479,7 +2479,7 @@
/turf/simulated/floor/wood,
/area/awaymission/wwmines)
"gL" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 1
},
/turf/simulated/floor/plasteel{
@@ -2528,7 +2528,7 @@
tag = "icon-gibup1";
icon_state = "gibup1"
},
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "barber"
+8 -8
View File
@@ -18897,7 +18897,7 @@
/obj/structure/sign/poster/contraband/random{
pixel_y = 32
},
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plating,
/area/maintenance/fpmaint)
"aGk" = (
@@ -33468,7 +33468,7 @@
},
/area/hallway/primary/central/north)
"biP" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/carpet,
@@ -33483,7 +33483,7 @@
/turf/simulated/floor/carpet,
/area/crew_quarters/mrchangs)
"biR" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/carpet,
@@ -79735,7 +79735,7 @@
/turf/simulated/floor/plasteel,
/area/atmos/control)
"cMb" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/wood{
@@ -79748,7 +79748,7 @@
/turf/simulated/floor/wood,
/area/maintenance/asmaint)
"cMd" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/carpet,
@@ -83569,7 +83569,7 @@
/turf/simulated/floor/carpet,
/area/crew_quarters/mrchangs)
"cSX" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/obj/structure/cable{
d1 = 1;
d2 = 2;
@@ -84339,7 +84339,7 @@
/turf/simulated/floor/plating,
/area/maintenance/aft)
"cUi" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/carpet,
/area/crew_quarters/mrchangs)
"cUj" = (
@@ -91152,7 +91152,7 @@
name = "station intercom (General)";
pixel_y = -28
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/wood,
+9 -9
View File
@@ -3384,7 +3384,7 @@
/turf/simulated/floor/plating/airless,
/area/space/nearstation)
"hx" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/wood{
tag = "icon-wood-broken7";
icon_state = "wood-broken7"
@@ -3946,7 +3946,7 @@
},
/area/derelict/crew_quarters)
"ix" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/wood{
@@ -4279,7 +4279,7 @@
name = "Derelict Annex"
})
"je" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/plasteel{
@@ -4296,7 +4296,7 @@
},
/area/derelict/arrival)
"jg" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/obj/structure/sign/poster/contraband/random{
@@ -4370,7 +4370,7 @@
/turf/simulated/floor/plasteel,
/area/derelict/crew_quarters)
"jn" = (
/obj/structure/chair/wood/normal,
/obj/structure/chair/wood,
/turf/simulated/floor/plasteel{
icon_state = "wood"
},
@@ -4613,7 +4613,7 @@
},
/area/derelict/crew_quarters)
"jM" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 8
},
/turf/simulated/floor/plasteel{
@@ -7287,7 +7287,7 @@
d2 = 2;
icon_state = "1-2"
},
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/plasteel{
@@ -7301,7 +7301,7 @@
},
/area/derelict/crew_quarters)
"qo" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/turf/simulated/floor/plasteel{
@@ -8210,7 +8210,7 @@
name = "Derelict Annex"
})
"sd" = (
/obj/structure/chair/wood/normal{
/obj/structure/chair/wood{
dir = 4
},
/obj/effect/decal/cleanable/dirt,
@@ -80,7 +80,7 @@
/obj/machinery/atmospherics/unary/vent_pump/update_icon(var/safety = 0)
..()
plane = FLOOR_PLANE
if(!check_icon_cache())
@@ -152,7 +152,7 @@
if(pressure_delta > 0.5)
if(air_contents.temperature > 0)
var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION) / 5
var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
@@ -170,7 +170,7 @@
if(pressure_delta > 0.5)
if(environment.temperature > 0)
var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) / 5
var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
if(isnull(removed)) //in space
@@ -98,7 +98,7 @@
/obj/machinery/atmospherics/unary/vent_scrubber/update_icon(var/safety = 0)
..()
plane = FLOOR_PLANE
if(!check_icon_cache())
@@ -227,7 +227,7 @@
if(scrubbing)
if((scrub_O2 && environment.oxygen>0.001) || (scrub_N2 && environment.nitrogen>0.001) || (scrub_CO2 && environment.carbon_dioxide>0.001) || (scrub_Toxins && environment.toxins>0.001) || (environment.trace_gases.len>0))
var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles() / 5
var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles()
//Take a gas sample
var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
@@ -269,7 +269,7 @@
if(air_contents.return_pressure()>=50*ONE_ATMOSPHERE)
return
var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume) / 5
var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume)
var/datum/gas_mixture/removed = tile.remove_air(transfer_moles)
+19 -52
View File
@@ -298,63 +298,30 @@
excited_group.reset_cooldowns()
/turf/proc/high_pressure_movements()
for(var/atom/movable/M in src)
M.experience_pressure_difference(pressure_difference, pressure_direction)
var/atom/movable/M
for(var/thing in src)
M = thing
if(!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired)
M.experience_pressure_difference(pressure_difference, pressure_direction)
/atom/movable/var/pressure_resistance = 5
/atom/movable/var/throw_pressure_limit = 15
/atom/movable/var/last_forced_movement = 0
/atom/movable/var/pressure_resistance = 10
/atom/movable/var/last_high_pressure_movement_air_cycle = 0
/atom/movable/proc/experience_pressure_difference(pressure_difference, direction)
if(last_forced_movement >= SSair.times_fired)
return 0
if(anchored || move_resist == INFINITY)
return 0
else if(!pulledby)
var/turf/target = get_turf(src)
var/datum/gas_mixture/target_air = target.return_air()
if(isspaceturf(target) || isunsimulatedturf(target) || pressure_resistance > target_air.return_pressure())
return 0
if(pressure_difference >= throw_pressure_limit)
var/general_direction = get_edge_target_turf(src, direction)
if(last_forced_movement + 10 < SSair.times_fired && is_valid_tochat_target(src)) //the first check prevents spamming throw to_chat
to_chat(src, "<span class='userdanger'>The pressure sends you flying!</span>")
spawn()
var/max_distance = 14 // reduce by one each calculation to prevent infinate loops.
var/min_observed_pressure = INFINITY
var/turf/possible_target = get_turf(src)
while(!isspaceturf(target) && !isunsimulatedturf(target) && max_distance > 0)
max_distance--
target_air = target.return_air()
min_observed_pressure = target_air.return_pressure()
possible_target = get_step_towards(target,general_direction)
if(istype(possible_target, /turf/space))
target = possible_target
break
if(!CanAtmosPass(possible_target))
target = possible_target
max_distance = 0
break
var/datum/gas_mixture/possible_target_air = possible_target.return_air()
if(possible_target_air.return_pressure() > min_observed_pressure)
target = possible_target
break
target = possible_target
if(max_distance)
throw_at(target, get_dist(src, target), pressure_difference / 200, null, 0, 0, null)
else
throw_at(target, pressure_difference / 10, pressure_difference / 200, null, 0, 0, null)
last_forced_movement = SSair.times_fired
return 1
else if(pressure_difference > pressure_resistance)
spawn()
step(src, direction)
last_forced_movement = SSair.times_fired
return 1
return 0
/atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0)
var/const/PROBABILITY_OFFSET = 25
var/const/PROBABILITY_BASE_PRECENT = 75
var/max_force = sqrt(pressure_difference) * (MOVE_FORCE_DEFAULT / 5)
set waitfor = 0
var/move_prob = 100
if(pressure_resistance > 0)
move_prob = (pressure_difference / pressure_resistance * PROBABILITY_BASE_PRECENT) - PROBABILITY_OFFSET
move_prob += pressure_resistance_prob_delta
if(move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO))))
step(src, direction)
last_high_pressure_movement_air_cycle = SSair.times_fired
+8 -1
View File
@@ -63,4 +63,11 @@
#define AREACOORD(src) "[src ? "[get_area_name(src, TRUE)] [COORD(src)]" : "nonexistent location" ]"
#define ADMIN_COORDJMP(src) "[src ? "[COORD(src)] [ADMIN_JMP(src)]" : "nonexistent location"]"
#define ADMIN_VERBOSEJMP(src) "[src ? "[AREACOORD(src)] [ADMIN_JMP(src)]" : "nonexistent location"]"
#define ADMIN_SHOWDETAILS(mask, content) "<a href='?_src_=holder;showdetails=[html_encode(content)]'>[mask]</a>"
#define ADMIN_SHOWDETAILS(mask, content) "<a href='?_src_=holder;showdetails=[html_encode(content)]'>[mask]</a>"
///Max length of a keypress command before it's considered to be a forged packet/bogus command
#define MAX_KEYPRESS_COMMANDLENGTH 16
///Max amount of keypress messages per second over two seconds before client is autokicked
#define MAX_KEYPRESS_AUTOKICK 50
///Length of held key rolling buffer
#define HELD_KEY_BUFFER_LENGTH 15
+43
View File
@@ -0,0 +1,43 @@
GLOBAL_LIST_EMPTY(typelists)
#ifndef TESTING
/datum/proc/typelist(key, list/values = list())
var/list/mytypelist = GLOB.typelists[type] || (GLOB.typelists[type] = list())
return mytypelist[key] || (mytypelist[key] = values.Copy())
#else
// mostly the same code as above, just more verbose, slower and has tallying for saved lists
/datum/proc/typelist(key, list/values)
if (!values)
values = list()
GLOB.typelistkeys |= key
if (GLOB.typelists[type])
if (GLOB.typelists[type][key])
GLOB.typelists[type]["[key]-saved"]++
return GLOB.typelists[type][key]
else
GLOB.typelists[type][key] = values.Copy()
else
GLOB.typelists[type] = list()
GLOB.typelists[type][key] = values.Copy()
return GLOB.typelists[type][key]
GLOBAL_LIST_EMPTY(typelistkeys)
/proc/tallytypelistsavings()
var/savings = list()
var/saveditems = list()
for (var/key in GLOB.typelistkeys)
savings[key] = 0
saveditems[key] = 0
for (var/type in GLOB.typelists)
for (var/saving in savings)
if (GLOB.typelists[type]["[saving]-saved"])
savings[saving] += GLOB.typelists[type]["[saving]-saved"]
saveditems[saving] += (GLOB.typelists[type]["[saving]-saved"] * length(GLOB.typelists[type][saving]))
for (var/saving in savings)
to_chat(world, "Savings for [saving]: [savings[saving]] lists, [saveditems[saving]] items")
#endif
-2
View File
@@ -34,8 +34,6 @@ GLOBAL_LIST_INIT(restricted_camera_networks, list(
"Hotel"
)) //Those networks can only be accessed by preexisting terminals. AIs and new terminals can't use them.
GLOBAL_LIST_INIT(mineral_turfs, list())
GLOBAL_LIST_INIT(ruin_landmarks, list())
GLOBAL_LIST_INIT(round_end_sounds, list(
+2 -2
View File
@@ -4,7 +4,7 @@ GLOBAL_LIST_INIT(base_chemicals, list("water","oxygen","nitrogen","hydrogen","po
"iron","aluminum","silicon","sugar","ethanol"))
// Standard chemicals
GLOBAL_LIST_INIT(standard_chemicals, list("slimejelly","blood","water","lube","charcoal","toxin","cyanide",
"morphine","epinephrine","space_drugs","serotrotium","oxygen","copper",
"morphine","epinephrine","space_drugs","oxygen","copper",
"nitrogen","hydrogen","potassium","mercury","sulfur","carbon","chlorine",
"fluorine","sodium","phosphorus","lithium","sugar","sacid","facid",
"glycerol","radium","mutadone","thermite","mutagen","virusfood","iron",
@@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(standard_chemicals, list("slimejelly","blood","water","lube","c
GLOBAL_LIST_INIT(rare_chemicals, list("minttoxin","syndicate_nanites", "xenomicrobes"))
// Standard medicines
GLOBAL_LIST_INIT(standard_medicines, list("charcoal","toxin","cyanide","morphine","epinephrine","space_drugs",
"serotrotium","mutadone","mutagen","teporone","lexorin","silver_sulfadiazine",
"mutadone","mutagen","teporone","lexorin","silver_sulfadiazine",
"salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol",
"potass_iodide","pen_acid","mannitol","oculine","styptic_powder",
"methamphetamine","spaceacillin","carpotoxin","lsd","ethanol","ammonia",
+1 -1
View File
@@ -31,7 +31,7 @@ SUBSYSTEM_DEF(mapping)
if (mining_type == "lavaland")
// Spawn Lavaland ruins and rivers.
seedRuins(list(level_name_to_num(MINING)), config.lavaland_budget, /area/lavaland/surface/outdoors/unexplored, lava_ruins_templates)
spawn_rivers()
spawn_rivers(list(level_name_to_num(MINING)))
else
// Populate mining Z-level hidden rooms
for(var/i = 0, i < max_secret_rooms, i++)
+12 -1
View File
@@ -263,7 +263,12 @@ UI STUFF
else
continue
dat += "</table></body>"
dat += "</table>"
dat += "<h1>Resolve All</h1>"
if(ticket_system_name == "Mentor Tickets")
dat += "<a href='?src=[UID()];resolveall=1'>Resolve All Open Mentor Tickets</a></body>"
else
dat += "<a href='?src=[UID()];resolveall=1'>Resolve All Open Admin Tickets</a></body>"
return dat
@@ -402,6 +407,12 @@ UI STUFF
takeTicket(indexNum)
showDetailUI(usr, indexNum)
if(href_list["resolveall"])
if(ticket_system_name == "Mentor Tickets")
usr.client.resolveAllMentorTickets()
else
usr.client.resolveAllAdminTickets()
/datum/controller/subsystem/tickets/proc/takeTicket(var/index)
if(assignStaffToTicket(usr.client, index))
if(span_class == "mentorhelp")
+6 -6
View File
@@ -383,18 +383,18 @@
name = "Repulse"
desc = "This spell throws everything around the user away."
charge_max = 400
clothes_req = 1
clothes_req = TRUE
invocation = "GITTAH WEIGH"
invocation_type = "shout"
range = 5
cooldown_min = 150
selection_type = "view"
sound = 'sound/magic/repulse.ogg'
var/maxthrow = 5
var/sparkle_path = /obj/effect/temp_visual/gravpush
action_icon_state = "repulse"
sound = 'sound/magic/repulse.ogg'
/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets, mob/user = usr)
/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets, mob/user = usr, stun_amt = 2)
var/list/thrownatoms = list()
var/atom/throwtarget
var/distfromcaster
@@ -411,16 +411,16 @@
throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(AM, user)))
distfromcaster = get_dist(user, AM)
if(distfromcaster == 0)
if(istype(AM, /mob/living))
if(isliving(AM))
var/mob/living/M = AM
M.Weaken(5)
M.adjustBruteLoss(5)
to_chat(M, "<span class='userdanger'>You're slammed into the floor by a mystical force!</span>")
else
new sparkle_path(get_turf(AM), get_dir(user, AM)) //created sparkles will disappear on their own
if(istype(AM, /mob/living))
if(isliving(AM))
var/mob/living/M = AM
M.Weaken(2)
M.Weaken(stun_amt)
to_chat(M, "<span class='userdanger'>You're thrown back by a mystical force!</span>")
spawn(0)
AM.throw_at(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1)//So stuff gets tossed around at the same time.
+46
View File
@@ -0,0 +1,46 @@
/datum/status_effect/freon
id = "frozen"
duration = 100
status_type = STATUS_EFFECT_UNIQUE
alert_type = /obj/screen/alert/status_effect/freon
var/icon/cube
var/can_melt = TRUE
/obj/screen/alert/status_effect/freon
name = "Frozen Solid"
desc = "You're frozen inside an ice cube, and cannot move! You can still do stuff, like shooting. Resist out of the cube!"
icon_state = "frozen"
/datum/status_effect/freon/on_apply()
RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/owner_resist)
if(!owner.stat)
to_chat(owner, "<span class='userdanger'>You become frozen in a cube!</span>")
cube = icon('icons/effects/freeze.dmi', "ice_cube")
owner.add_overlay(cube)
owner.update_canmove()
return ..()
/datum/status_effect/freon/tick()
owner.update_canmove()
if(can_melt && owner.bodytemperature >= BODYTEMP_NORMAL)
qdel(src)
/datum/status_effect/freon/proc/owner_resist()
to_chat(owner, "You start breaking out of the ice cube!")
if(do_mob(owner, owner, 40))
if(!QDELETED(src))
to_chat(owner, "You break out of the ice cube!")
owner.remove_status_effect(/datum/status_effect/freon)
owner.update_canmove()
/datum/status_effect/freon/on_remove()
if(!owner.stat)
to_chat(owner, "The cube melts!")
owner.cut_overlay(cube)
owner.adjust_bodytemperature(100)
owner.update_canmove()
UnregisterSignal(owner, COMSIG_LIVING_RESIST)
/datum/status_effect/freon/watcher
duration = 8
can_melt = FALSE
+43 -39
View File
@@ -1037,7 +1037,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/explosives/grenadier
name = "Grenadier's belt"
desc = "A belt containing 25 lethally dangerous and destructive grenades."
desc = "A belt containing 26 lethally dangerous and destructive grenades."
item = /obj/item/storage/belt/grenade/full
cost = 30
surplus = 0
@@ -1052,15 +1052,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
gamemodes = list(/datum/game_mode/nuclear)
surplus = 35
/datum/uplink_item/explosives/saringrenades
name = "Sarin Gas Grenades"
desc = "A box of four (4) grenades filled with Sarin, a deadly neurotoxin. Use extreme caution when handling and be sure to vacate the premise after using; ensure communication is maintained with team to avoid accidental gassings."
reference = "TGG"
item = /obj/item/storage/box/syndie_kit/sarin
cost = 12
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
/datum/uplink_item/explosives/atmosn2ogrenades
name = "Knockout Gas Grenades"
desc = "A box of two (2) grenades that spread knockout gas over a large area. Equip internals before using one of these."
@@ -1108,21 +1099,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 1
surplus = 35
/datum/uplink_item/stealthy_tools/syndigaloshes
name = "No-Slip Chameleon Shoes"
desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \
They do not work on heavily lubricated surfaces."
reference = "NSSS"
item = /obj/item/clothing/shoes/chameleon/noslip
cost = 2
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/stealthy_tools/syndigaloshes/nuke
reference = "TNSSS"
cost = 4 //but they aren't
excludefrom = list()
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/stealthy_tools/chamsechud
name = "Chameleon Security HUD"
desc = "A stolen Nanotrasen Security HUD with Syndicate chameleon technology implemented into it. Similarly to a chameleon jumpsuit, the HUD can be morphed into various other eyewear, while retaining the HUD qualities when worn."
@@ -1168,7 +1144,29 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Due to budget cuts, the shoes don't provide protection against slipping. The set comes with a complementary chameleon stamp."
reference = "CHAM"
item = /obj/item/storage/box/syndie_kit/chameleon
cost = 4
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/stealthy_tools/chameleon/nuke
reference = "NCHAM"
cost = 6
excludefrom = list()
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/stealthy_tools/syndigaloshes
name = "No-Slip Chameleon Shoes"
desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \
They do not work on heavily lubricated surfaces."
reference = "NSSS"
item = /obj/item/clothing/shoes/chameleon/noslip
cost = 2
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/stealthy_tools/syndigaloshes/nuke
reference = "NNSSS"
cost = 4
excludefrom = list()
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/stealthy_tools/chameleon_proj
name = "Chameleon-Projector"
@@ -1209,6 +1207,21 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 2
surplus = 30
/datum/uplink_item/stealthy_tools/syndigaloshes
name = "No-Slip Chameleon Shoes"
desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. They do not work on heavily lubricated surfaces."
reference = "NOCS"
item = /obj/item/clothing/shoes/chameleon/noslip
cost = 2
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/stealthy_tools/syndigaloshes/nuke
reference = "NOCSN"
item = /obj/item/clothing/shoes/chameleon/noslip
cost = 4
excludefrom = list()
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/stealthy_tools/cutouts
name = "Adaptive Cardboard Cutouts"
desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. This pack contains three as well as a \
@@ -1373,16 +1386,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
These reverse-engineered knockoffs of Nanotrasen's 'Advanced Magboots' slow you down in simulated-gravity environments much like the standard issue variety."
reference = "BRMB"
item = /obj/item/clothing/shoes/magboots/syndie
cost = 3
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/magboots/advance
name = "Advanced Blood-Red Magboots"
desc = "Reverse-engineered magboots that appear to be based on an advanced model, as they have a lighter magnetic pull. Property of Gorlex Marauders."
reference = "ABRMB"
item = /obj/item/clothing/shoes/magboots/syndie/advance
cost = 3
excludefrom = list()
cost = 2
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/powersink
@@ -1638,10 +1642,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/bundles_TC/c20r
name = "C-20r Bundle"
desc = "Old Faithful: The classic C-20r, bundled with two magazines and a (surplus) suppressor at discount price."
desc = "Old Faithful: The classic C-20r, bundled with three magazines and a (surplus) suppressor at discount price."
reference = "C20B"
item = /obj/item/storage/backpack/duffel/syndie/c20rbundle
cost = 14 // normally 17
cost = 18 // normally 21
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/bundles_TC/cyber_implants
@@ -1656,10 +1660,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/bundles_TC/medical
name = "Medical Bundle"
desc = "The support specialist: Aid your fellow operatives with this medical bundle. Contains a tactical medkit, \
a Donksoft LMG and a box of riot darts."
a medical beam gun and a pair of syndicate magboots."
reference = "MEDB"
item = /obj/item/storage/backpack/duffel/syndie/med/medicalbundle
cost = 15 // normally 20
cost = 20 // normally 24
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/bundles_TC/sniper
+1 -7
View File
@@ -45,13 +45,7 @@
loc.handle_atom_del(src)
for(var/atom/movable/AM in contents)
qdel(AM)
var/turf/un_opaque
if(opacity && isturf(loc))
un_opaque = loc
loc = null
if(un_opaque)
un_opaque.recalc_atom_opacity()
if(pulledby)
if(pulledby.pulling == src)
pulledby.pulling = null
@@ -120,7 +114,7 @@
return
if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //separated from our puller and not in the middle of a diagonal move.
pulledby.stop_pulling()
/atom/movable/proc/can_be_pulled(user, grab_state, force)
if(src == user || !isturf(loc))
return FALSE
+1 -6
View File
@@ -45,8 +45,6 @@
var/obj/structure/blob/factory/factory = null
var/list/human_overlays = list()
var/is_zombie = 0
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120 //120 kPa difference required to throw
/mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
..()
@@ -97,8 +95,6 @@
human_overlays = H.overlays
update_icons()
H.forceMove(src)
pressure_resistance = 20 //5 kPa difference required to push lowered
throw_pressure_limit = 30 //15 kPa difference required to throw lowered
visible_message("<span class='warning'>The corpse of [H.name] suddenly rises!</span>")
/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed)
@@ -176,8 +172,7 @@
force_threshold = 10
mob_size = MOB_SIZE_LARGE
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120 //120 kPa difference required to throw
pressure_resistance = 50
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
@@ -382,7 +382,7 @@
if(ismob(loc))
loc.visible_message("<span class='warning'>The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!</span>", "<span class='warning'>We inflate our hand into a strong shield.</span>", "<span class='warning'>You hear organic matter ripping and tearing!</span>")
/obj/item/shield/changeling/hit_reaction()
/obj/item/shield/changeling/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(remaining_uses < 1)
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
+1 -1
View File
@@ -160,7 +160,7 @@
user.Dizzy(30)
user.Weaken(5)
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/hit_reaction(mob/living/carbon/human/owner, attack_text, isinhands)
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(current_charges)
owner.visible_message("<span class='danger'>\The [attack_text] is deflected in a burst of blood-red sparks!</span>")
current_charges--
@@ -80,9 +80,8 @@
M.overlays.Cut()
M.regenerate_icons()
/obj/item/clothing/suit/armor/abductor/vest/hit_reaction()
/obj/item/clothing/suit/armor/abductor/vest/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
DeactivateStealth()
return 0
/obj/item/clothing/suit/armor/abductor/vest/IsReflect()
DeactivateStealth()
@@ -455,7 +454,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK))
if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
return 0
+1 -1
View File
@@ -456,7 +456,7 @@
/datum/spellbook_entry/item/armor/Buy(var/mob/living/carbon/human/user,var/obj/item/spellbook/book)
. = ..()
if(.)
new /obj/item/clothing/shoes/magboots/wizard(get_turf(user))
new /obj/item/clothing/shoes/sandal(get_turf(user)) //In case they've lost them.
new /obj/item/clothing/gloves/color/purple(get_turf(user)) // To complete the outfit
/datum/spellbook_entry/item/mjolnir
-8
View File
@@ -119,8 +119,6 @@
var/report_danger_level = TRUE
var/automatic_emergency = TRUE //Does the alarm automaticly respond to an emergency condition
/obj/machinery/alarm/monitor
report_danger_level = FALSE
@@ -315,12 +313,6 @@
if(old_danger_level!=danger_level)
apply_danger_level()
if(automatic_emergency && mode == AALARM_MODE_SCRUBBING && danger_level == ATMOS_ALARM_DANGER)
if(pressure_dangerlevel == ATMOS_ALARM_DANGER)
mode = AALARM_MODE_OFF
if(temperature_dangerlevel == ATMOS_ALARM_DANGER && cur_tlv.max2 <= environment.temperature)
mode = AALARM_MODE_PANIC
apply_mode()
if(mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05)
mode = AALARM_MODE_SCRUBBING
+1 -1
View File
@@ -71,7 +71,7 @@ var/datum/canister_icons/canister_icon_container = new()
var/can_label = 1
var/filled = 0.5
pressure_resistance = 7*ONE_ATMOSPHERE
pressure_resistance = 7 * ONE_ATMOSPHERE
var/temperature_resistance = 1000 + T0C
volume = 1000
use_power = NO_POWER_USE
+1 -1
View File
@@ -12,7 +12,7 @@
volume = 750
var/minrate = 0//probably useless, but whatever
var/maxrate = 10 * ONE_ATMOSPHERE / 4
var/maxrate = 10 * ONE_ATMOSPHERE
/obj/machinery/portable_atmospherics/scrubber/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
@@ -420,7 +420,7 @@
/obj/item/holo/esword/red/New()
item_color = "red"
/obj/item/holo/esword/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
/obj/item/holo/esword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(active)
return ..()
return 0
+1 -1
View File
@@ -492,7 +492,7 @@
playsound(src.loc, 'sound/weapons/genhit.ogg', 100, 1)
var/turf/space/T
for(T in orange(1, src))
T.ChangeTurf(/turf/simulated/floor/plating/)
T.ChangeTurf(/turf/simulated/floor/plating)
else
atom_say("Something slams into the floor around [src] - luckily, it didn't get through!")
playsound(src.loc, 'sound/effects/bang.ogg', 20, 1)
+1 -1
View File
@@ -96,7 +96,7 @@ Class Procs:
/obj/machinery
name = "machinery"
icon = 'icons/obj/stationobjs.dmi'
pressure_resistance = 10
pressure_resistance = 15
layer = BELOW_OBJ_LAYER
var/stat = 0
var/emagged = 0
-3
View File
@@ -84,7 +84,6 @@
name = "security suit storage unit"
suit_type = /obj/item/clothing/suit/space/hardsuit/security
mask_type = /obj/item/clothing/mask/gas/sechailer
magboots_type = /obj/item/clothing/shoes/magboots
req_access = list(access_security)
/obj/machinery/suit_storage_unit/security/secure
@@ -130,7 +129,6 @@
/obj/machinery/suit_storage_unit/cmo/secure/sec_storage
name = "medical suit storage unit"
mask_type = /obj/item/clothing/mask/gas
magboots_type = /obj/item/clothing/shoes/magboots
/obj/machinery/suit_storage_unit/clown
name = "clown suit storage unit"
@@ -154,7 +152,6 @@
name = "syndicate suit storage unit"
suit_type = /obj/item/clothing/suit/space/hardsuit/syndi
mask_type = /obj/item/clothing/mask/gas/syndicate
magboots_type = /obj/item/clothing/shoes/magboots/syndie
storage_type = /obj/item/tank/jetpack/oxygen/harness
req_access = list(access_syndicate)
safeties = FALSE //in a syndicate base, everything can be used as a murder weapon at a moment's notice.
+177 -47
View File
@@ -121,9 +121,10 @@
product_records = list()
hidden_records = list()
coin_records = list()
build_inventory(products, product_records, start_empty = TRUE)
build_inventory(contraband, hidden_records, start_empty = TRUE)
build_inventory(premium, coin_records, start_empty = TRUE)
if(refill_canister)
build_inventory(products, product_records, start_empty = TRUE)
build_inventory(contraband, hidden_records, start_empty = TRUE)
build_inventory(premium, coin_records, start_empty = TRUE)
for(var/obj/item/vending_refill/VR in component_parts)
restock(VR)
@@ -1275,16 +1276,57 @@
product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!"
product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!"
icon_state = "seeds"
products = list(/obj/item/seeds/aloe =3, /obj/item/seeds/ambrosia = 3, /obj/item/seeds/apple = 3, /obj/item/seeds/cotton = 3, /obj/item/seeds/banana = 3, /obj/item/seeds/berry = 3,
/obj/item/seeds/cabbage = 3, /obj/item/seeds/carrot = 3, /obj/item/seeds/cherry = 3, /obj/item/seeds/chanter = 3,
/obj/item/seeds/chili = 3, /obj/item/seeds/cocoapod = 3, /obj/item/seeds/coffee = 3, /obj/item/seeds/comfrey =3, /obj/item/seeds/corn = 3,
/obj/item/seeds/nymph =3, /obj/item/seeds/eggplant = 3, /obj/item/seeds/grape = 3, /obj/item/seeds/grass = 3, /obj/item/seeds/lemon = 3,
/obj/item/seeds/lime = 3, /obj/item/seeds/onion = 3, /obj/item/seeds/orange = 3, /obj/item/seeds/peanuts = 3, /obj/item/seeds/pineapple = 3, /obj/item/seeds/potato = 3, /obj/item/seeds/poppy = 3,
/obj/item/seeds/pumpkin = 3, /obj/item/seeds/replicapod = 3, /obj/item/seeds/wheat/rice = 3, /obj/item/seeds/soya = 3, /obj/item/seeds/sunflower = 3, /obj/item/seeds/sugarcane = 3,
/obj/item/seeds/tea = 3, /obj/item/seeds/tobacco = 3, /obj/item/seeds/tomato = 3,
/obj/item/seeds/tower = 3, /obj/item/seeds/watermelon = 3, /obj/item/seeds/wheat = 3, /obj/item/seeds/whitebeet = 3)
contraband = list(/obj/item/seeds/amanita = 2, /obj/item/seeds/glowshroom = 2, /obj/item/seeds/liberty = 2, /obj/item/seeds/nettle = 2,
/obj/item/seeds/plump = 2, /obj/item/seeds/reishi = 2, /obj/item/seeds/cannabis = 3, /obj/item/seeds/starthistle = 2, /obj/item/seeds/fungus = 3, /obj/item/seeds/random = 2)
products = list(/obj/item/seeds/aloe =3,
/obj/item/seeds/ambrosia = 3,
/obj/item/seeds/apple = 3,
/obj/item/seeds/cotton = 3,
/obj/item/seeds/banana = 3,
/obj/item/seeds/berry = 3,
/obj/item/seeds/cabbage = 3,
/obj/item/seeds/carrot = 3,
/obj/item/seeds/cherry = 3,
/obj/item/seeds/chanter = 3,
/obj/item/seeds/chili = 3,
/obj/item/seeds/cocoapod = 3,
/obj/item/seeds/coffee = 3,
/obj/item/seeds/comfrey =3,
/obj/item/seeds/corn = 3,
/obj/item/seeds/nymph =3,
/obj/item/seeds/eggplant = 3,
/obj/item/seeds/garlic = 3,
/obj/item/seeds/grape = 3,
/obj/item/seeds/grass = 3,
/obj/item/seeds/lemon = 3,
/obj/item/seeds/lime = 3,
/obj/item/seeds/onion = 3,
/obj/item/seeds/orange = 3,
/obj/item/seeds/peanuts = 3,
/obj/item/seeds/pineapple = 3,
/obj/item/seeds/potato = 3,
/obj/item/seeds/poppy = 3,
/obj/item/seeds/pumpkin = 3,
/obj/item/seeds/replicapod = 3,
/obj/item/seeds/wheat/rice = 3,
/obj/item/seeds/soya = 3,
/obj/item/seeds/sunflower = 3,
/obj/item/seeds/sugarcane = 3,
/obj/item/seeds/tea = 3,
/obj/item/seeds/tobacco = 3,
/obj/item/seeds/tomato = 3,
/obj/item/seeds/tower = 3,
/obj/item/seeds/watermelon = 3,
/obj/item/seeds/wheat = 3,
/obj/item/seeds/whitebeet = 3)
contraband = list(/obj/item/seeds/amanita = 2,
/obj/item/seeds/glowshroom = 2,
/obj/item/seeds/liberty = 2,
/obj/item/seeds/nettle = 2,
/obj/item/seeds/plump = 2,
/obj/item/seeds/reishi = 2,
/obj/item/seeds/cannabis = 3,
/obj/item/seeds/starthistle = 2,
/obj/item/seeds/fungus = 3,
/obj/item/seeds/random = 2)
premium = list(/obj/item/reagent_containers/spray/waterflower = 1)
refill_canister = /obj/item/vending_refill/hydroseeds
@@ -1326,41 +1368,129 @@
product_slogans = "Dress for success!;Suited and booted!;It's show time!;Why leave style up to fate? Use AutoDrobe!"
vend_delay = 15
vend_reply = "Thank you for using AutoDrobe!"
products = list(/obj/item/clothing/suit/chickensuit = 1,/obj/item/clothing/head/chicken = 1,/obj/item/clothing/under/gladiator = 1,
/obj/item/clothing/head/helmet/gladiator = 1,/obj/item/clothing/under/gimmick/rank/captain/suit = 1,/obj/item/clothing/head/flatcap = 1,
/obj/item/clothing/suit/storage/labcoat/mad = 1,/obj/item/clothing/glasses/gglasses = 1,/obj/item/clothing/shoes/jackboots = 1,
/obj/item/clothing/under/schoolgirl = 1,/obj/item/clothing/head/kitty = 1,/obj/item/clothing/under/blackskirt = 1,
/obj/item/clothing/suit/toggle/owlwings = 1, /obj/item/clothing/under/owl = 1,/obj/item/clothing/mask/gas/owl_mask = 1,
/obj/item/clothing/suit/toggle/owlwings/griffinwings = 1, /obj/item/clothing/under/griffin = 1, /obj/item/clothing/shoes/griffin = 1, /obj/item/clothing/head/griffin = 1,
/obj/item/clothing/accessory/waistcoat = 1,/obj/item/clothing/under/suit_jacket = 1,/obj/item/clothing/head/that =1,/obj/item/clothing/under/kilt = 1,/obj/item/clothing/accessory/waistcoat = 1,
/obj/item/clothing/glasses/monocle =1,/obj/item/clothing/head/bowlerhat = 1,/obj/item/cane = 1,/obj/item/clothing/under/sl_suit = 1,
/obj/item/clothing/mask/fakemoustache = 1,/obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 1,/obj/item/clothing/head/plaguedoctorhat = 1,/obj/item/clothing/mask/gas/plaguedoctor = 1,
/obj/item/clothing/suit/apron = 1,/obj/item/clothing/under/waiter = 1,/obj/item/clothing/suit/jacket/miljacket = 1,
/obj/item/clothing/suit/jacket/miljacket/white = 1, /obj/item/clothing/suit/jacket/miljacket/desert = 1, /obj/item/clothing/suit/jacket/miljacket/navy = 1,
/obj/item/clothing/under/pirate = 1,/obj/item/clothing/suit/pirate_brown = 1,/obj/item/clothing/suit/pirate_black =1,/obj/item/clothing/under/pirate_rags =1,/obj/item/clothing/head/pirate = 1,/obj/item/clothing/head/bandana = 1,
/obj/item/clothing/head/bandana = 1,/obj/item/clothing/under/soviet = 1,/obj/item/clothing/head/ushanka = 1,/obj/item/clothing/suit/imperium_monk = 1,
/obj/item/clothing/mask/gas/cyborg = 1,/obj/item/clothing/suit/holidaypriest = 1,/obj/item/clothing/head/wizard/marisa/fake = 1,
/obj/item/clothing/suit/wizrobe/marisa/fake = 1,/obj/item/clothing/under/sundress = 1,/obj/item/clothing/head/witchwig = 1,/obj/item/twohanded/staff/broom = 1,
/obj/item/clothing/suit/wizrobe/fake = 1,/obj/item/clothing/head/wizard/fake = 1,/obj/item/twohanded/staff = 3,/obj/item/clothing/mask/gas/clown_hat/sexy = 1,
/obj/item/clothing/under/rank/clown/sexy = 1,/obj/item/clothing/mask/gas/sexymime = 1,/obj/item/clothing/under/sexymime = 1,
/obj/item/clothing/mask/face/bat = 1,/obj/item/clothing/mask/face/bee = 1,/obj/item/clothing/mask/face/bear = 1,/obj/item/clothing/mask/face/raven = 1,/obj/item/clothing/mask/face/jackal = 1,/obj/item/clothing/mask/face/fox = 1,/obj/item/clothing/mask/face/tribal = 1,/obj/item/clothing/mask/face/rat = 1,
products = list(/obj/item/clothing/suit/chickensuit = 1,
/obj/item/clothing/head/chicken = 1,
/obj/item/clothing/under/gladiator = 1,
/obj/item/clothing/head/helmet/gladiator = 1,
/obj/item/clothing/under/gimmick/rank/captain/suit = 1,
/obj/item/clothing/head/flatcap = 1,
/obj/item/clothing/suit/storage/labcoat/mad = 1,
/obj/item/clothing/glasses/gglasses = 1,
/obj/item/clothing/shoes/jackboots = 1,
/obj/item/clothing/under/schoolgirl = 1,
/obj/item/clothing/head/kitty = 1,
/obj/item/clothing/under/blackskirt = 1,
/obj/item/clothing/suit/toggle/owlwings = 1,
/obj/item/clothing/under/owl = 1,
/obj/item/clothing/mask/gas/owl_mask = 1,
/obj/item/clothing/suit/toggle/owlwings/griffinwings = 1,
/obj/item/clothing/under/griffin = 1,
/obj/item/clothing/shoes/griffin = 1,
/obj/item/clothing/head/griffin = 1,
/obj/item/clothing/accessory/waistcoat = 1,
/obj/item/clothing/under/suit_jacket = 1,
/obj/item/clothing/head/that =1,
/obj/item/clothing/under/kilt = 1,
/obj/item/clothing/accessory/waistcoat = 1,
/obj/item/clothing/glasses/monocle =1,
/obj/item/clothing/head/bowlerhat = 1,
/obj/item/cane = 1,
/obj/item/clothing/under/sl_suit = 1,
/obj/item/clothing/mask/fakemoustache = 1,
/obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 1,
/obj/item/clothing/head/plaguedoctorhat = 1,
/obj/item/clothing/mask/gas/plaguedoctor = 1,
/obj/item/clothing/suit/apron = 1,
/obj/item/clothing/under/waiter = 1,
/obj/item/clothing/suit/jacket/miljacket = 1,
/obj/item/clothing/suit/jacket/miljacket/white = 1,
/obj/item/clothing/suit/jacket/miljacket/desert = 1,
/obj/item/clothing/suit/jacket/miljacket/navy = 1,
/obj/item/clothing/under/pirate = 1,
/obj/item/clothing/suit/pirate_brown = 1,
/obj/item/clothing/suit/pirate_black =1,
/obj/item/clothing/under/pirate_rags =1,
/obj/item/clothing/head/pirate = 1,
/obj/item/clothing/head/bandana = 1,
/obj/item/clothing/head/bandana = 1,
/obj/item/clothing/under/soviet = 1,
/obj/item/clothing/head/ushanka = 1,
/obj/item/clothing/suit/imperium_monk = 1,
/obj/item/clothing/mask/gas/cyborg = 1,
/obj/item/clothing/suit/holidaypriest = 1,
/obj/item/clothing/head/wizard/marisa/fake = 1,
/obj/item/clothing/suit/wizrobe/marisa/fake = 1,
/obj/item/clothing/under/sundress = 1,
/obj/item/clothing/head/witchwig = 1,
/obj/item/twohanded/staff/broom = 1,
/obj/item/clothing/suit/wizrobe/fake = 1,
/obj/item/clothing/head/wizard/fake = 1,
/obj/item/twohanded/staff = 3,
/obj/item/clothing/mask/gas/clown_hat/sexy = 1,
/obj/item/clothing/under/rank/clown/sexy = 1,
/obj/item/clothing/mask/gas/sexymime = 1,
/obj/item/clothing/under/sexymime = 1,
/obj/item/clothing/mask/face/bat = 1,
/obj/item/clothing/mask/face/bee = 1,
/obj/item/clothing/mask/face/bear = 1,
/obj/item/clothing/mask/face/raven = 1,
/obj/item/clothing/mask/face/jackal = 1,
/obj/item/clothing/mask/face/fox = 1,
/obj/item/clothing/mask/face/tribal = 1,
/obj/item/clothing/mask/face/rat = 1,
/obj/item/clothing/suit/apron/overalls = 1,
/obj/item/clothing/head/rabbitears =1, /obj/item/clothing/head/sombrero = 1, /obj/item/clothing/suit/poncho = 1,
/obj/item/clothing/suit/poncho/green = 1, /obj/item/clothing/suit/poncho/red = 1, /obj/item/clothing/accessory/blue = 1, /obj/item/clothing/accessory/red = 1, /obj/item/clothing/accessory/black = 1, /obj/item/clothing/accessory/horrible = 1,
/obj/item/clothing/under/maid = 1, /obj/item/clothing/under/janimaid = 1,
/obj/item/clothing/under/jester = 1, /obj/item/clothing/head/jester = 1,
/obj/item/clothing/under/pants/camo = 1, /obj/item/clothing/mask/bandana = 1, /obj/item/clothing/mask/bandana/black = 1,
/obj/item/clothing/shoes/singery = 1,/obj/item/clothing/under/singery = 1,
/obj/item/clothing/shoes/singerb = 1,/obj/item/clothing/under/singerb = 1,
/obj/item/clothing/suit/hooded/carp_costume = 1,/obj/item/clothing/suit/hooded/bee_costume = 1,
/obj/item/clothing/suit/snowman = 1,/obj/item/clothing/head/snowman = 1,
/obj/item/clothing/head/cueball = 1,/obj/item/clothing/under/scratch = 1,
/obj/item/clothing/under/victdress = 1, /obj/item/clothing/under/victdress/red = 1, /obj/item/clothing/suit/victcoat = 1, /obj/item/clothing/suit/victcoat/red = 1,
/obj/item/clothing/under/victsuit = 1, /obj/item/clothing/under/victsuit/redblk = 1, /obj/item/clothing/under/victsuit/red = 1, /obj/item/clothing/suit/tailcoat = 1,
/obj/item/clothing/suit/draculacoat = 1, /obj/item/clothing/head/zepelli = 1,
/obj/item/clothing/under/redhawaiianshirt = 1, /obj/item/clothing/under/pinkhawaiianshirt = 1, /obj/item/clothing/under/bluehawaiianshirt = 1, /obj/item/clothing/under/orangehawaiianshirt = 1)
contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/gun/magic/wand = 1, /obj/item/clothing/mask/balaclava=1, /obj/item/clothing/mask/horsehead = 2)
premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/shield/riot/roman = 1)
/obj/item/clothing/head/rabbitears =1,
/obj/item/clothing/head/sombrero = 1,
/obj/item/clothing/suit/poncho = 1,
/obj/item/clothing/suit/poncho/green = 1,
/obj/item/clothing/suit/poncho/red = 1,
/obj/item/clothing/accessory/blue = 1,
/obj/item/clothing/accessory/red = 1,
/obj/item/clothing/accessory/black = 1,
/obj/item/clothing/accessory/horrible = 1,
/obj/item/clothing/under/maid = 1,
/obj/item/clothing/under/janimaid = 1,
/obj/item/clothing/under/jester = 1,
/obj/item/clothing/head/jester = 1,
/obj/item/clothing/under/pants/camo = 1,
/obj/item/clothing/mask/bandana = 1,
/obj/item/clothing/mask/bandana/black = 1,
/obj/item/clothing/shoes/singery = 1,
/obj/item/clothing/under/singery = 1,
/obj/item/clothing/shoes/singerb = 1,
/obj/item/clothing/under/singerb = 1,
/obj/item/clothing/suit/hooded/carp_costume = 1,
/obj/item/clothing/suit/hooded/bee_costume = 1,
/obj/item/clothing/suit/snowman = 1,
/obj/item/clothing/head/snowman = 1,
/obj/item/clothing/head/cueball = 1,
/obj/item/clothing/under/scratch = 1,
/obj/item/clothing/under/victdress = 1,
/obj/item/clothing/under/victdress/red = 1,
/obj/item/clothing/suit/victcoat = 1,
/obj/item/clothing/suit/victcoat/red = 1,
/obj/item/clothing/under/victsuit = 1,
/obj/item/clothing/under/victsuit/redblk = 1,
/obj/item/clothing/under/victsuit/red = 1,
/obj/item/clothing/suit/tailcoat = 1,
/obj/item/clothing/suit/draculacoat = 1,
/obj/item/clothing/head/zepelli = 1,
/obj/item/clothing/under/redhawaiianshirt = 1,
/obj/item/clothing/under/pinkhawaiianshirt = 1,
/obj/item/clothing/under/bluehawaiianshirt = 1,
/obj/item/clothing/under/orangehawaiianshirt = 1)
contraband = list(/obj/item/clothing/suit/judgerobe = 1,
/obj/item/clothing/head/powdered_wig = 1,
/obj/item/gun/magic/wand = 1,
/obj/item/clothing/mask/balaclava=1,
/obj/item/clothing/mask/horsehead = 2)
premium = list(/obj/item/clothing/suit/hgpirate = 1,
/obj/item/clothing/head/hgpiratecap = 1,
/obj/item/clothing/head/helmet/roman/fake = 1,
/obj/item/clothing/head/helmet/roman/legionaire/fake = 1,
/obj/item/clothing/under/roman = 1,
/obj/item/clothing/shoes/roman = 1,
/obj/item/shield/riot/roman/fake = 1)
refill_canister = /obj/item/vending_refill/autodrobe
/obj/machinery/vending/autodrobe/Initialize(mapload)
@@ -77,7 +77,7 @@
/turf/simulated/floor/plating/asteroid/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill)
for(var/turf/simulated/floor/plating/asteroid/M in range(1, drill.chassis))
if((get_dir(drill.chassis, M) & drill.chassis.dir) && !M.dug)
M.gets_dug()
M.getDug()
drill.log_message("Drilled through [src]")
drill.move_ores()
+3
View File
@@ -21,6 +21,9 @@
/obj/effect/acid_act()
return
/obj/effect/experience_pressure_difference()
return
/obj/effect/decal
plane = FLOOR_PLANE
var/no_scoop = FALSE //if it has this, don't let it be scooped up
@@ -90,6 +90,10 @@
/obj/effect/temp_visual/dir_setting/wraith/out
icon_state = "phase_shift"
/obj/effect/temp_visual/dir_setting/tailsweep
icon_state = "tailsweep"
duration = 4
/obj/effect/temp_visual/wizard
name = "water"
icon = 'icons/mob/mob.dmi'
+2 -2
View File
@@ -25,7 +25,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/w_class = WEIGHT_CLASS_NORMAL
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
pass_flags = PASSTABLE
pressure_resistance = 3
pressure_resistance = 4
// causeerrorheresoifixthis
var/obj/item/master = null
@@ -361,7 +361,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
else
return ..()
/obj/item/proc/hit_reaction(mob/living/carbon/human/owner, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, atom/movable/AM)
/obj/item/proc/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
SEND_SIGNAL(src, COMSIG_ITEM_HIT_REACT, args)
if(prob(final_block_chance))
owner.visible_message("<span class='danger'>[owner] blocks [attack_text] with [src]!</span>")
+123 -106
View File
@@ -41,160 +41,160 @@
/obj/item/lightreplacer
name = "light replacer"
desc = "A device to automatically replace lights. Refill with working lightbulbs."
desc = "A device to automatically replace lights. Refill with broken or working light bulbs, or sheets of glass."
icon = 'icons/obj/janitor.dmi'
icon_state = "lightreplacer0"
item_state = "electronic"
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
origin_tech = "magnets=3;engineering=4"
force = 8
var/emagged = FALSE
var/max_uses = 20
var/uses = 0
var/shards = 0
var/recycle = 3
var/emagged = 0
var/failmsg = ""
var/uses = 10
// How much to increase per each glass?
var/increment = 5
// How much to take from the glass?
var/decrement = 1
var/charge = 1
/obj/item/lightreplacer/New()
uses = max_uses / 2
failmsg = "The [name]'s refill light blinks red."
..()
// Eating used bulbs gives us bulb shards
var/bulb_shards = 0
// when we get this many shards, we get a free bulb.
var/shards_required = 4
/obj/item/lightreplacer/examine(mob/user)
if(..(user, 2))
to_chat(user, "It has [uses] lights and [shards] shards remaining.")
..()
to_chat(user, status_string())
/obj/item/lightreplacer/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = W
if(G.amount - decrement >= 0 && uses < max_uses)
var/remaining = max(G.amount - decrement, 0)
if(!remaining && !(G.amount - decrement) == 0)
to_chat(user, "There isn't enough glass.")
return
G.amount = remaining
if(!G.amount)
user.drop_item()
qdel(G)
AddUses(increment)
to_chat(user, "You insert a piece of glass into the [src.name]. You have [uses] lights remaining.")
/obj/item/lightreplacer/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = I
if(uses >= max_uses)
to_chat(user, "<span class='warning'>[src] is full.</span>")
return
else if(G.use(decrement))
AddUses(increment)
to_chat(user, "<span class='notice'>You insert a piece of glass into [src]. You have [uses] light\s remaining.</span>")
return
else
to_chat(user, "<span class='warning'>You need one sheet of glass to replace lights!</span>")
return
if(istype(W, /obj/item/light))
var/obj/item/light/L = W
if(istype(I, /obj/item/shard))
if(uses >= max_uses)
to_chat(user, "<span class='warning'>[src] is full.</span>")
return
if(!user.unEquip(I))
return
AddUses(round(increment * 0.75))
to_chat(user, "<span class='notice'>You insert a shard of glass into [src]. You have [uses] light\s remaining.</span>")
qdel(I)
return
if(istype(I, /obj/item/light))
var/obj/item/light/L = I
if(L.status == 0) // LIGHT OKAY
if(!user.drop_item())
to_chat(user, "[L] is stuck to your hand!")
return
if(uses < max_uses)
if(!user.unEquip(L))
return
AddUses(1)
to_chat(user, "You insert the [L.name] into the [src.name]. You have [uses] lights remaining.")
user.drop_item()
qdel(L)
return
else if(L.status == 2 || L.status == 3)
if(!user.drop_item())
to_chat(user, "[L] is stuck to your hand!")
return
else
AddShards(1)
to_chat(user, "You insert [L] into [src]. You have [shards] shards remaining.")
user.drop_item()
qdel(L)
else
if(!user.unEquip(L))
return
to_chat(user, "<span class='notice'>You insert [L] into [src].</span>")
AddShards(1, user)
qdel(L)
return
if(istype(W, /obj/item/storage))
var/obj/item/storage/S = W
var/found_lightbulbs = 0
if(istype(I, /obj/item/storage))
var/obj/item/storage/S = I
var/found_lightbulbs = FALSE
var/replaced_something = TRUE
for(var/obj/item/I in S.contents)
if(istype(I,/obj/item/light))
var/obj/item/light/L = I
found_lightbulbs = 1
for(var/obj/item/IT in S.contents)
if(istype(IT, /obj/item/light))
var/obj/item/light/L = IT
found_lightbulbs = TRUE
if(uses >= max_uses)
to_chat(user, "<span class='warning'>[src] is full!</span>")
break
if(L.status == 0)
if(L.status == LIGHT_OK)
replaced_something = TRUE
AddUses(1)
qdel(L)
else if(L.status == 2 || L.status == 3)
AddShards(1)
else if(L.status == LIGHT_BROKEN || L.status == LIGHT_BURNED)
replaced_something = TRUE
AddShards(1, user)
qdel(L)
to_chat(user, "<span class='notice'>You fill [src] with lights from [S].")
if(!found_lightbulbs)
to_chat(user, "<span class='warning'>[S] contains no bulbs.</span>")
return
if(!replaced_something && uses == max_uses)
to_chat(user, "<span class='warning'>[src] is full!</span>")
return
to_chat(user, "<span class='notice'>You fill [src] with lights from [S]. " + status_string() + "</span>")
return
return ..()
/obj/item/lightreplacer/emag_act(user as mob)
if(!emagged)
Emag()
/obj/item/lightreplacer/attack_self(mob/user)
/* // This would probably be a bit OP. If you want it though, uncomment the code.
if(isrobot(user))
var/mob/living/silicon/robot/R = user
if(R.emagged)
src.Emag()
to_chat(usr, "You shortcircuit the [src].")
return
*/
to_chat(usr, "It has [uses] lights remaining.")
for(var/obj/machinery/light/target in user.loc)
ReplaceLight(target, user)
to_chat(user, status_string())
/obj/item/lightreplacer/update_icon()
icon_state = "lightreplacer[emagged]"
/obj/item/lightreplacer/proc/status_string()
return "It has [uses] light\s remaining (plus [bulb_shards] fragment\s)."
/obj/item/lightreplacer/proc/Use(var/mob/user)
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
/obj/item/lightreplacer/proc/Use(mob/user)
playsound(loc, 'sound/machines/click.ogg', 50, TRUE)
AddUses(-1)
return 1
// Negative numbers will subtract
/obj/item/lightreplacer/proc/AddUses(var/amount = 1)
uses = min(max(uses + amount, 0), max_uses)
/obj/item/lightreplacer/proc/AddUses(amount = 1)
uses = Clamp(uses + amount, 0, max_uses)
/obj/item/lightreplacer/proc/AddShards(amount = 1)
shards += amount
var/recycled_lights = round(shards / recycle)
if(recycled_lights > 0)
AddUses(recycled_lights)
shards = shards % recycle
return recycled_lights
/obj/item/lightreplacer/proc/AddShards(amount = 1, user)
bulb_shards += amount
var/new_bulbs = round(bulb_shards / shards_required)
if(new_bulbs > 0)
AddUses(new_bulbs)
bulb_shards = bulb_shards % shards_required
if(new_bulbs != 0)
to_chat(user, "<span class='notice'>[src] has fabricated a new bulb from the broken glass it has stored. It now has [uses] uses.</span>")
playsound(loc, 'sound/machines/ding.ogg', 50, TRUE)
return new_bulbs
/obj/item/lightreplacer/proc/Charge(var/mob/user)
charge += 1
if(charge > 7)
if(charge > 3)
AddUses(1)
charge = 1
/obj/item/lightreplacer/proc/ReplaceLight(var/obj/machinery/light/target, var/mob/living/U)
/obj/item/lightreplacer/proc/ReplaceLight(obj/machinery/light/target, mob/living/U)
if(target.status != LIGHT_OK)
if(CanUse(U))
if(!Use(U)) return
to_chat(U, "<span class='notice'>You replace the [target.fitting] with the [src].</span>")
if(!Use(U))
return
to_chat(U, "<span class='notice'>You replace [target.fitting] with [src].</span>")
if(target.status != LIGHT_EMPTY)
var/obj/item/light/L1 = new target.light_type(target.loc)
L1.status = target.status
L1.rigged = target.rigged
L1.brightness_range = target.brightness_range
L1.brightness_power = target.brightness_power
L1.brightness_color = target.brightness_color
L1.switchcount = target.switchcount
target.switchcount = 0
L1.update()
AddShards(1, U)
target.status = LIGHT_EMPTY
target.update()
@@ -215,37 +215,54 @@
return
else
to_chat(U, failmsg)
to_chat(U, "[src]'s refill light blinks red.")
return
else
to_chat(U, "There is a working [target.fitting] already inserted.")
to_chat(U, "<span class='warning'>There is a working [target.fitting] already inserted!</span>")
return
/obj/item/lightreplacer/proc/Emag()
emagged = !emagged
playsound(src.loc, "sparks", 100, 1)
playsound(loc, "sparks", 100, TRUE)
if(emagged)
name = "Shortcircuited [initial(name)]"
name = "shortcircuited [initial(name)]"
else
name = initial(name)
update_icon()
//Can you use it?
/obj/item/lightreplacer/proc/CanUse(mob/living/user)
add_fingerprint(user)
if(uses > 0)
return 1
else
return 0
/obj/item/lightreplacer/afterattack(atom/T, mob/U, proximity)
if(!proximity)
return
if(!isturf(T))
return
var/used = FALSE
for(var/atom/A in T)
if(!CanUse(U))
break
used = TRUE
if(istype(A, /obj/machinery/light))
ReplaceLight(A, U)
if(!used)
to_chat(U, "[src]'s refill light blinks red.")
/obj/item/lightreplacer/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J)
J.put_in_cart(src, user)
J.myreplacer = src
J.update_icon()
/obj/item/lightreplacer/proc/CanUse(var/mob/living/user)
src.add_fingerprint(user)
//Not sure what else to check for. Maybe if clumsy?
if(uses > 0)
return 1
else
return 0
/obj/item/lightreplacer/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
return
#undef LIGHT_OK
#undef LIGHT_EMPTY
#undef LIGHT_BROKEN
#undef LIGHT_BURNED
#undef LIGHT_BURNED
+1 -1
View File
@@ -9,7 +9,7 @@
throw_range = 1
throw_speed = 1
layer = 4
pressure_resistance = 1
pressure_resistance = 2
/obj/item/documents/nanotrasen
desc = "\"Top Secret\" Nanotrasen documents printed on special copy-protected paper. It is filled with complex diagrams and lists of names, dates and coordinates."
+1 -1
View File
@@ -12,7 +12,7 @@
/obj/item/borg/stun/attack(mob/living/M, mob/living/silicon/robot/user)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.check_shields(0, "[M]'s [name]", src, MELEE_ATTACK))
if(H.check_shields(src, 0, "[M]'s [name]", MELEE_ATTACK))
playsound(M, 'sound/weapons/genhit.ogg', 50, 1)
return 0
@@ -167,7 +167,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
new /datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1),
new /datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20),
new /datum/stack_recipe("wood table frame", /obj/structure/table_frame/wood, 2, time = 10), \
new /datum/stack_recipe("wooden chair", /obj/structure/chair/wood/normal, 3, time = 10, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("wooden chair", /obj/structure/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("bookcase", /obj/structure/bookcase, 5, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("dresser", /obj/structure/dresser, 30, time = 50, one_per_turf = 1, on_floor = 1),
+1 -1
View File
@@ -210,7 +210,7 @@
brightness_on = 0
sharp_when_wielded = FALSE // It's a toy
/obj/item/twohanded/dualsaber/toy/hit_reaction()
/obj/item/twohanded/dualsaber/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
return 0
/obj/item/twohanded/dualsaber/toy/IsReflect()//Stops Toy Dualsabers from reflecting energy projectiles
+132 -107
View File
@@ -7,32 +7,35 @@
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
flags = CONDUCT
force = 3.0
throwforce = 10.0
force = 3
throwforce = 10
throw_speed = 1
throw_range = 5
w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL=500)
origin_tech = "combat=1;plasmatech=2;engineering=2"
var/status = 0
var/lit = 0 //on or off
var/operating = 0//cooldown
var/turf/previousturf = null
var/status = FALSE
var/lit = FALSE //on or off
var/operating = FALSE//cooldown
var/obj/item/weldingtool/weldtool = null
var/obj/item/assembly/igniter/igniter = null
var/obj/item/tank/plasma/ptank = null
var/warned_admins = FALSE //for the message_admins() when lit
//variables for prebuilt flamethrowers
var/create_full = FALSE
var/create_with_tank = FALSE
var/igniter_type = /obj/item/assembly/igniter
/obj/item/flamethrower/Destroy()
QDEL_NULL(weldtool)
QDEL_NULL(igniter)
QDEL_NULL(ptank)
previousturf = null
return ..()
/obj/item/flamethrower/process()
if(!lit)
if(!lit || !igniter)
STOP_PROCESSING(SSobj, src)
return null
var/turf/location = loc
@@ -41,133 +44,139 @@
if(M.l_hand == src || M.r_hand == src)
location = M.loc
if(isturf(location)) //start a fire if possible
location.hotspot_expose(700, 2)
return
igniter.flamethrower_process(location)
/obj/item/flamethrower/update_icon()
overlays.Cut()
cut_overlays()
if(igniter)
overlays += "+igniter[status]"
add_overlay("+igniter[status]")
if(ptank)
overlays += "+ptank"
add_overlay("+ptank")
if(lit)
overlays += "+lit"
add_overlay("+lit")
item_state = "flamethrower_1"
else
item_state = "flamethrower_0"
return
if(ismob(loc))
var/mob/M = loc
M.update_inv_l_hand()
M.update_inv_r_hand()
/obj/item/flamethrower/afterattack(atom/target, mob/user, flag)
if(flag) return // too close
// Make sure our user is still holding us
if(user && user.is_in_active_hand(src))
. = ..()
if(flag)
return // too close
if(user && user.get_active_hand() == src) // Make sure our user is still holding us
var/turf/target_turf = get_turf(target)
if(target_turf)
var/turflist = getline(user, target_turf)
add_attack_logs(user, target, "Flamethrowered at [target.x],[target.y],[target.z]")
flame_turf(turflist)
/obj/item/flamethrower/attackby(obj/item/W as obj, mob/user as mob, params)
if(user.stat || user.restrained() || user.lying) return
if(iswrench(W) && !status)//Taking this apart
/obj/item/flamethrower/attackby(obj/item/I, mob/user, params)
if(iswrench(I) && !status)//Taking this apart
var/turf/T = get_turf(src)
if(weldtool)
weldtool.loc = T
weldtool.forceMove(T)
weldtool = null
if(igniter)
igniter.loc = T
igniter.forceMove(T)
igniter = null
if(ptank)
ptank.loc = T
ptank.forceMove(T)
ptank = null
new /obj/item/stack/rods(T)
qdel(src)
return
if(isscrewdriver(W) && igniter && !lit)
else if(isscrewdriver(I) && igniter && !lit)
status = !status
to_chat(user, "<span class='notice'>[igniter] is now [status ? "secured" : "unsecured"]!</span>")
update_icon()
return
if(isigniter(W))
var/obj/item/assembly/igniter/I = W
if(I.secured) return
if(igniter) return
user.drop_item()
I.loc = src
igniter = I
update_icon()
return
if(istype(W,/obj/item/tank/plasma))
if(ptank)
to_chat(user, "<span class='notice'>There appears to already be a plasma tank loaded in [src]!</span>")
else if(isigniter(I))
var/obj/item/assembly/igniter/IG = I
if(IG.secured)
return
user.drop_item()
ptank = W
W.loc = src
if(igniter)
return
if(!user.drop_item())
return
IG.forceMove(src)
igniter = IG
update_icon()
return
if(istype(W, /obj/item/analyzer) && ptank)
else if(istype(I, /obj/item/tank/plasma))
if(ptank)
if(user.drop_item())
I.forceMove(src)
ptank.forceMove(get_turf(src))
ptank = I
to_chat(user, "<span class='notice'>You swap the plasma tank in [src]!</span>")
return
if(!user.drop_item())
return
I.forceMove(src)
ptank = I
update_icon()
return
else if(istype(I, /obj/item/analyzer) && ptank)
atmosanalyzer_scan(ptank.air_contents, user)
else
return ..()
/obj/item/flamethrower/attack_self(mob/user)
toggle_igniter(user)
/obj/item/flamethrower/AltClick(mob/user)
if(ptank && isliving(user) && user.Adjacent(src))
user.put_in_hands(ptank)
ptank = null
to_chat(user, "<span class='notice'>You remove the plasma tank from [src]!</span>")
update_icon()
/obj/item/flamethrower/examine(mob/user)
..()
return
if(ptank)
to_chat(user, "<span class='notice'>[src] has \a [ptank] attached. Alt-click to remove it.</span>")
/obj/item/flamethrower/attack_self(mob/user as mob)
if(user.stat || user.restrained() || user.lying) return
user.set_machine(src)
/obj/item/flamethrower/proc/toggle_igniter(mob/user)
if(!ptank)
to_chat(user, "<span class='notice'>Attach a plasma tank first!</span>")
return
var/dat = text("<TT><B>Flamethrower (<A HREF='?src=[UID()];light=1'>[lit ? "<font color='red'>Lit</font>" : "Unlit"]</a>)</B><BR>\n Tank Pressure: [ptank.air_contents.return_pressure()]<BR>\n<A HREF='?src=[UID()];remove=1'>Remove plasmatank</A> - <A HREF='?src=[UID()];close=1'>Close</A></TT>")
user << browse(dat, "window=flamethrower;size=600x300")
onclose(user, "flamethrower")
return
/obj/item/flamethrower/Topic(href,href_list[])
if(href_list["close"])
usr.unset_machine()
usr << browse(null, "window=flamethrower")
if(!status)
to_chat(user, "<span class='notice'>Secure the igniter first!</span>")
return
if(usr.stat || usr.restrained() || usr.lying) return
usr.set_machine(src)
if(href_list["light"])
if(!ptank) return
if(!status) return
lit = !lit
if(lit)
START_PROCESSING(SSobj, src)
if(href_list["remove"])
if(!ptank) return
usr.put_in_hands(ptank)
ptank = null
lit = 0
usr.unset_machine()
usr << browse(null, "window=flamethrower")
for(var/mob/M in viewers(1, loc))
if((M.client && M.machine == src))
attack_self(M)
to_chat(user, "<span class='notice'>You [lit ? "extinguish" : "ignite"] [src]!</span>")
lit = !lit
if(lit)
START_PROCESSING(SSobj, src)
if(!warned_admins)
message_admins("[ADMIN_LOOKUPFLW(user)] has lit a flamethrower.")
warned_admins = TRUE
else
STOP_PROCESSING(SSobj,src)
update_icon()
return
/obj/item/flamethrower/CheckParts(list/parts_list)
..()
weldtool = locate(/obj/item/weldingtool) in contents
igniter = locate(/obj/item/assembly/igniter) in contents
weldtool.status = 0
igniter.secured = 0
status = 1
weldtool.status = FALSE
igniter.secured = FALSE
status = TRUE
update_icon()
//Called from turf.dm turf/dblclick
/obj/item/flamethrower/proc/flame_turf(turflist)
if(!lit || operating) return
operating = 1
if(!lit || operating)
return
operating = TRUE
var/turf/previousturf = get_turf(src)
for(var/turf/simulated/T in turflist)
if(!T.air)
@@ -176,47 +185,63 @@
continue //so we don't burn the tile we be standin on
if(!T.CanAtmosPass(previousturf))
break
ignite_turf(T)
if(igniter)
igniter.ignite_turf(src, T)
else
default_ignite(T)
sleep(1)
previousturf = T
operating = 0
operating = FALSE
for(var/mob/M in viewers(1, loc))
if((M.client && M.machine == src))
attack_self(M)
return
/obj/item/flamethrower/proc/ignite_turf(turf/target, release_amount = 0.05)
/obj/item/flamethrower/proc/default_ignite(turf/target, release_amount = 0.05)
//TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this...
//Transfer 5% of current tank air contents to turf
var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(release_amount)
air_transfer.toxins = air_transfer.toxins // This is me not comprehending the air system. I realize this is retarded and I could probably make it work without fucking it up like this, but there you have it. -- TLE
if(air_transfer.toxins)
air_transfer.toxins = air_transfer.toxins * 5
target.assume_air(air_transfer)
//Burn it based on transfered gas
target.hotspot_expose((ptank.air_contents.temperature*2) + 380,500) // -- More of my "how do I shot fire?" dickery. -- TLE
target.hotspot_expose((ptank.air_contents.temperature*2) + 380, 500)
//location.hotspot_expose(1000,500,1)
SSair.add_to_active(target, 0)
return
/obj/item/flamethrower/full/New(var/loc)
..()
if(!weldtool)
weldtool = new /obj/item/weldingtool(src)
weldtool.status = 0
if(!igniter)
igniter = new /obj/item/assembly/igniter(src)
igniter.secured = 0
status = 1
update_icon()
/obj/item/flamethrower/Initialize(mapload)
. = ..()
if(create_full)
if(!weldtool)
weldtool = new /obj/item/weldingtool(src)
weldtool.status = FALSE
if(!igniter)
igniter = new igniter_type(src)
igniter.secured = FALSE
status = TRUE
if(create_with_tank)
ptank = new /obj/item/tank/plasma/full(src)
update_icon()
/obj/item/flamethrower/full/tank/New(var/loc)
..()
ptank = new /obj/item/tank/plasma/full(src)
update_icon()
/obj/item/flamethrower/full
create_full = TRUE
/obj/item/flamethrower/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
if(ptank && damage && attack_type == PROJECTILE_ATTACK && prob(15))
/obj/item/flamethrower/full/tank
create_with_tank = TRUE
/obj/item/flamethrower/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/obj/item/projectile/P = hitby
if(damage && attack_type == PROJECTILE_ATTACK && P.damage_type != STAMINA && prob(15))
owner.visible_message("<span class='danger'>[attack_text] hits the fueltank on [owner]'s [src], rupturing it! What a shot!</span>")
var/target_turf = get_turf(owner)
ignite_turf(target_turf, 100)
qdel(ptank)
var/turf/target_turf = get_turf(owner)
log_game("A projectile ([hitby]) detonated a flamethrower tank held by [key_name(owner)] at [COORD(target_turf)]")
igniter.ignite_turf(src,target_turf, release_amount = 100)
QDEL_NULL(ptank)
return 1 //It hit the flamethrower, not them
/obj/item/assembly/igniter/proc/flamethrower_process(turf/simulated/location)
location.hotspot_expose(700, 2)
/obj/item/assembly/igniter/proc/ignite_turf(obj/item/flamethrower/F, turf/simulated/location, release_amount = 0.05)
F.default_ignite(location, release_amount)
@@ -113,9 +113,13 @@
spawn(det_time)
prime()
/obj/item/grenade/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
if(damage && attack_type == PROJECTILE_ATTACK && prob(15))
/obj/item/grenade/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/obj/item/projectile/P = hitby
if(damage && attack_type == PROJECTILE_ATTACK && P.damage_type != STAMINA && prob(15))
owner.visible_message("<span class='danger'>[attack_text] hits [owner]'s [src], setting it off! What a shot!</span>")
var/turf/T = get_turf(src)
log_game("A projectile ([hitby]) detonated a grenade held by [key_name(owner)] at [COORD(T)]")
message_admins("A projectile ([hitby]) detonated a grenade held by [key_name_admin(owner)] at [ADMIN_COORDJMP(T)]")
prime()
return 1 //It hit the grenade, not them
@@ -563,7 +567,7 @@
update_icon()
/obj/item/grenade/chem_grenade/saringas
payload_name = "saringas"
payload_name = "sarin gas"
desc = "Contains sarin gas; extremely deadly and fast acting; use with extreme caution."
stage = READY
@@ -137,7 +137,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
/obj/item/nullrod/claymore/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
/obj/item/nullrod/claymore/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(attack_type == PROJECTILE_ATTACK)
final_block_chance = 0 //Don't bring a sword to a gunfight
return ..()
@@ -120,7 +120,7 @@
if(item_color == null)
item_color = pick("red", "blue", "green", "purple")
/obj/item/melee/energy/sword/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
/obj/item/melee/energy/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)
if(active)
return ..()
return 0
@@ -157,7 +157,7 @@
..()
item_color = null
/obj/item/melee/energy/sword/cyborg/saw/hit_reaction()
/obj/item/melee/energy/sword/cyborg/saw/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
return 0
/obj/item/melee/energy/sword/saber
@@ -44,7 +44,7 @@
hitsound = 'sound/weapons/rapierhit.ogg'
materials = list(MAT_METAL = 1000)
/obj/item/melee/rapier/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
/obj/item/melee/rapier/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(attack_type == PROJECTILE_ATTACK)
final_block_chance = 0 //Don't bring a sword to a gunfight
return ..()
+53 -62
View File
@@ -1,27 +1,30 @@
// Glass shards
/obj/item/shard
name = "glass shard"
name = "shard"
desc = "A nasty looking shard of glass."
icon = 'icons/obj/shards.dmi'
icon_state = "large"
sharp = TRUE
desc = "Could probably be used as ... a throwing weapon?"
w_class = WEIGHT_CLASS_TINY
force = 5
throwforce = 10
item_state = "shard-glass"
materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
materials = list(MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
attack_verb = list("stabbed", "slashed", "sliced", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100)
sharp = TRUE
var/cooldown = 0
var/icon_prefix
var/obj/item/stack/sheet/welded_type = /obj/item/stack/sheet/glass
/obj/item/shard/suicide_act(mob/user)
to_chat(viewers(user), pick("<span class='danger'>[user] is slitting [user.p_their()] wrists with [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>",
"<span class='danger'>[user] is slitting [user.p_their()] throat with [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>"))
return BRUTELOSS
/obj/item/shard/New()
..()
/obj/item/shard/Initialize(mapload)
. = ..()
icon_state = pick("large", "medium", "small")
switch(icon_state)
if("small")
@@ -33,6 +36,8 @@
if("large")
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
if(icon_prefix)
icon_state = "[icon_prefix][icon_state]"
/obj/item/shard/afterattack(atom/movable/AM, mob/user, proximity)
if(!proximity || !(src in user))
@@ -48,15 +53,17 @@
if(affecting.is_robotic())
return
to_chat(H, "<span class='warning'>[src] cuts into your hand!</span>")
if(affecting.receive_damage(force*0.5))
if(affecting.receive_damage(force * 0.5))
H.UpdateDamageIcon()
/obj/item/shard/attackby(obj/item/I, mob/user, params)
if(iswelder(I))
var/obj/item/weldingtool/WT = I
if(WT.remove_fuel(0, user))
var/obj/item/stack/sheet/glass/NG = new (user.loc)
for(var/obj/item/stack/sheet/glass/G in user.loc)
var/obj/item/stack/sheet/NG = new welded_type(user.loc)
for(var/obj/item/stack/sheet/G in user.loc)
if(!istype(G, welded_type))
continue
if(G == NG)
continue
if(G.amount >= G.max_amount)
@@ -64,64 +71,48 @@
G.attackby(NG, user)
to_chat(user, "<span class='notice'>You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s.</span>")
qdel(src)
else
return ..()
return
if(istype(I, /obj/item/lightreplacer))
I.attackby(src, user)
return
return ..()
/obj/item/shard/Crossed(AM as mob|obj, oldloc)
if(isliving(AM))
var/mob/living/M = AM
if(M.incorporeal_move || M.flying || M.throwing)//you are incorporal or flying or being thrown ..no shard stepping!
/obj/item/shard/Crossed(mob/living/L, oldloc)
if(istype(L) && has_gravity(loc))
if(L.incorporeal_move || L.flying)
return
to_chat(M, "<span class='danger'>You step on \the [src]!</span>")
playsound(loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
if(ishuman(M))
var/mob/living/carbon/human/H = M
playsound(loc, 'sound/effects/glass_step.ogg', 50, TRUE)
if(ishuman(L))
var/mob/living/carbon/human/H = L
var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
if(!affecting)
return
if(affecting.is_robotic())
return
var/feetCover = (H.wear_suit && H.wear_suit.body_parts_covered & FEET) || (H.w_uniform && H.w_uniform.body_parts_covered & FEET)
if(H.shoes || feetCover || H.buckled)
return
if(affecting.receive_damage(force, 0))
H.UpdateDamageIcon()
if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
if(!affecting)
return
if(affecting.is_robotic())
return
H.Weaken(3)
if(affecting.receive_damage(5, 0))
H.UpdateDamageIcon()
..()
if(cooldown < world.time - 10) //cooldown to avoid message spam.
if(!H.incapacitated(ignore_restraints = TRUE))
H.visible_message("<span class='danger'>[H] steps on [src]!</span>", \
"<span class='userdanger'>You step on [src]!</span>")
else
H.visible_message("<span class='danger'>[H] slides on [src]!</span>", \
"<span class='userdanger'>You slide on [src]!</span>")
cooldown = world.time
H.Weaken(3)
return ..()
/obj/item/shard/plasma
name = "plasma shard"
desc = "A shard of plasma glass. Considerably tougher then normal glass shards. Apparently not tough enough to be a window."
force = 8
throwforce = 15
force = 6
throwforce = 11
icon_state = "plasmalarge"
sharp = TRUE
/obj/item/shard/plasma/New()
..()
icon_state = pick("plasmalarge", "plasmamedium", "plasmasmall")
switch(icon_state)
if("plasmasmall")
pixel_x = rand(-12, 12)
pixel_y = rand(-12, 12)
if("plasmamedium")
pixel_x = rand(-8, 8)
pixel_y = rand(-8, 8)
if("plasmalarge")
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
/obj/item/shard/plasma/attackby(obj/item/W, mob/user, params)
if(iswelder(W))
var/obj/item/weldingtool/WT = W
if(WT.remove_fuel(0, user))
var/obj/item/stack/sheet/plasmaglass/NG = new (user.loc)
for(var/obj/item/stack/sheet/plasmaglass/G in user.loc)
if(G == NG)
continue
if(G.amount >= G.max_amount)
continue
G.attackby(NG, user, params)
to_chat(usr, "You add the newly-formed plasma glass to the stack. It now contains [NG.amount] sheets.")
qdel(src)
else
return ..()
materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
icon_prefix = "plasma"
welded_type = /obj/item/stack/sheet/plasmaglass
+9 -3
View File
@@ -3,7 +3,7 @@
block_chance = 50
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70)
/obj/item/shield/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
/obj/item/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(attack_type == THROWN_PROJECTILE_ATTACK)
final_block_chance += 30
if(attack_type == LEAP_ATTACK)
@@ -39,6 +39,12 @@
desc = "Bears an inscription on the inside: <i>\"Romanes venio domus\"</i>."
icon_state = "roman_shield"
item_state = "roman_shield"
materials = list(MAT_METAL=8500)
/obj/item/shield/riot/roman/fake
desc = "Bears an inscription on the inside: <i>\"Romanes venio domus\"</i>. It appears to be a bit flimsy."
block_chance = 0
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
/obj/item/shield/riot/buckler
name = "wooden buckler"
@@ -63,7 +69,7 @@
attack_verb = list("shoved", "bashed")
var/active = 0
/obj/item/shield/energy/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
/obj/item/shield/energy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
return 0
/obj/item/shield/energy/IsReflect()
@@ -110,7 +116,7 @@
w_class = WEIGHT_CLASS_NORMAL
var/active = 0
/obj/item/shield/riot/tele/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
/obj/item/shield/riot/tele/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(active)
return ..()
return 0
@@ -390,6 +390,7 @@
..()
new /obj/item/ammo_box/magazine/smgm45(src)
new /obj/item/ammo_box/magazine/smgm45(src)
new /obj/item/ammo_box/magazine/smgm45(src)
new /obj/item/gun/projectile/automatic/c20r(src)
new /obj/item/suppressor/specialoffer(src)
@@ -404,13 +405,13 @@
new /obj/item/clothing/glasses/chameleon/thermal(src)
/obj/item/storage/backpack/duffel/syndie/med/medicalbundle
desc = "A large duffel bag containing a tactical medkit, a Donksoft machine gun and a big jumbo box of riot darts."
desc = "A large duffel bag containing a tactical medkit, a medical beam gun and a pair of syndicate magboots."
/obj/item/storage/backpack/duffel/syndie/med/medicalbundle/New()
..()
new /obj/item/storage/firstaid/tactical(src)
new /obj/item/gun/projectile/automatic/l6_saw/toy(src)
new /obj/item/ammo_box/foambox/riot(src)
new /obj/item/clothing/shoes/magboots/syndie(src)
new /obj/item/gun/medbeam(src)
/obj/item/storage/backpack/duffel/syndie/c4/New()
..()
@@ -332,6 +332,7 @@
new /obj/item/grenade/gluon(src)
new /obj/item/grenade/gluon(src)
new /obj/item/grenade/chem_grenade/facid(src) //1
new /obj/item/grenade/chem_grenade/saringas(src) //1
new /obj/item/grenade/gas/plasma(src) //2
new /obj/item/grenade/gas/plasma(src)
new /obj/item/grenade/frag(src) //10
+1 -1
View File
@@ -176,7 +176,7 @@
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK)) //No message; check_shields() handles that
if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
return
@@ -51,7 +51,7 @@
if(cooldown <= 0)
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK))
if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
return
if(check_martial_counter(H, user))
return
@@ -8,7 +8,7 @@
slot_flags = SLOT_BACK
hitsound = 'sound/weapons/smash.ogg'
w_class = WEIGHT_CLASS_NORMAL
pressure_resistance = ONE_ATMOSPHERE*5
pressure_resistance = ONE_ATMOSPHERE * 5
force = 5.0
throwforce = 10.0
throw_speed = 1
@@ -279,22 +279,22 @@
if(Adj)
return //Safety check so you don't blast yourself trying to refill your tank
var/datum/reagents/R = reagents
if(R.total_volume < 50)
to_chat(user, "You need at least 50 units of water to use the nanofrost launcher!")
if(R.total_volume < 100)
to_chat(user, "You need at least 100 units of water to use the nanofrost launcher!")
return
if(nanofrost_cooldown)
to_chat(user, "Nanofrost launcher is still recharging")
return
nanofrost_cooldown = 1
R.remove_any(50)
R.remove_any(100)
var/obj/effect/nanofrost_container/A = new /obj/effect/nanofrost_container(get_turf(src))
log_game("[key_name(user)] used Nanofrost at [get_area(user)] ([user.x], [user.y], [user.z]).")
playsound(src,'sound/items/syringeproj.ogg',40,1)
for(var/a=0, a<5, a++)
step_towards(A, target)
sleep(1)
sleep(2)
A.Smoke()
spawn(50)
spawn(100)
if(src)
nanofrost_cooldown = 0
return
+16 -9
View File
@@ -269,7 +269,7 @@
user.SpinAnimation(7, 1)
sleep(1)
/obj/item/twohanded/dualsaber/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
/obj/item/twohanded/dualsaber/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(wielded)
return ..()
return FALSE
@@ -340,14 +340,23 @@
no_spin_thrown = TRUE
var/obj/item/grenade/explosive = null
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
var/icon_prefix = "spearglass"
/obj/item/twohanded/spear/update_icon()
if(explosive)
icon_state = "spearbomb[wielded]"
else
icon_state = "spearglass[wielded]"
icon_state = "[icon_prefix][wielded]"
/obj/item/twohanded/spear/CheckParts(list/parts_list)
var/obj/item/shard/tip = locate() in parts_list
if(istype(tip, /obj/item/shard/plasma))
force_wielded = 19
force_unwielded = 11
throwforce = 21
icon_prefix = "spearplasma"
update_icon()
qdel(tip)
..()
/obj/item/twohanded/spear/afterattack(atom/movable/AM, mob/user, proximity)
if(!proximity)
return
@@ -373,9 +382,7 @@
force_wielded = 20 //I have no idea how to balance
throwforce = 22
armour_penetration = 15 //Enhanced armor piercing
/obj/item/twohanded/spear/bonespear/update_icon()
icon_state = "bone_spear[wielded]"
icon_prefix = "bone_spear"
//GREY TIDE
/obj/item/twohanded/spear/grey_tide
@@ -510,7 +517,7 @@
armour_penetration = 100
force_on = 30
/obj/item/twohanded/required/chainsaw/doomslayer/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
/obj/item/twohanded/required/chainsaw/doomslayer/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(attack_type == PROJECTILE_ATTACK)
owner.visible_message("<span class='danger'>Ranged attacks just make [owner] angrier!</span>")
playsound(src, pick('sound/weapons/bulletflyby.ogg','sound/weapons/bulletflyby2.ogg','sound/weapons/bulletflyby3.ogg'), 75, 1)
+9 -4
View File
@@ -108,7 +108,12 @@
..()
if(istype(I, /obj/item/shard))
var/obj/item/twohanded/spear/S = new /obj/item/twohanded/spear
if(istype(I, /obj/item/shard/plasma))
S.force_wielded = 19
S.force_unwielded = 11
S.throwforce = 21
S.icon_prefix = "spearplasma"
S.update_icon()
if(!remove_item_from_storage(user))
user.unEquip(src)
user.unEquip(I)
@@ -174,11 +179,11 @@
desc = "This thing looks dangerous... Dangerously good at baseball, that is."
homerun_able = 1
/obj/item/melee/baseball_bat/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type, atom/movable/AM)
/obj/item/melee/baseball_bat/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
. = ..()
if(!istype(AM, /obj/item) || attack_type != THROWN_PROJECTILE_ATTACK)
if(!isitem(hitby) || attack_type != THROWN_PROJECTILE_ATTACK)
return FALSE
var/obj/item/I = AM
var/obj/item/I = hitby
if(I.w_class <= WEIGHT_CLASS_NORMAL || istype(I, /obj/item/beach_ball)) // baseball bat deflecting
if(deflectmode)
if(prob(10))
@@ -272,7 +272,6 @@
new /obj/item/sensor_device(src)
new /obj/item/key/ambulance(src)
new /obj/item/pinpointer/crew(src)
new /obj/item/clothing/shoes/magboots(src)
new /obj/item/handheld_defibrillator(src)
/obj/structure/closet/secure_closet/reagents
@@ -26,7 +26,6 @@
new /obj/item/clothing/mask/gas/syndicate(src)
new /obj/item/clothing/suit/space/hardsuit/syndi(src)
new /obj/item/tank/jetpack/oxygen/harness(src)
new /obj/item/clothing/shoes/magboots/syndie(src)
/obj/structure/closet/syndicate/nuclear
desc = "It's a storage unit for a Syndicate boarding party."
@@ -133,6 +133,9 @@
// Chair types
/obj/structure/chair/wood
name = "wooden chair"
desc = "Old is never too old to not be in fashion."
icon_state = "wooden_chair"
burn_state = FLAMMABLE
burntime = 20
buildstackamount = 3
@@ -142,15 +145,8 @@
/obj/structure/chair/wood/narsie_act()
return
/obj/structure/chair/wood/normal
icon_state = "wooden_chair"
name = "wooden chair"
desc = "Old is never too old to not be in fashion."
/obj/structure/chair/wood/wings
icon_state = "wooden_chair_wings"
name = "wooden chair"
desc = "Old is never too old to not be in fashion."
item_chair = /obj/item/chair/wood/wings
/obj/structure/chair/comfy
+85 -60
View File
@@ -1,6 +1,8 @@
/**********************Asteroid**************************/
/turf/simulated/floor/plating/asteroid
gender = PLURAL
name = "asteroid sand"
baseturf = /turf/simulated/floor/plating/asteroid
icon_state = "asteroid"
@@ -8,17 +10,32 @@
footstep_sounds = list()
var/environment_type = "asteroid"
var/turf_type = /turf/simulated/floor/plating/asteroid //Because caves do whacky shit to revert to normal
var/dug = 0 //0 = has not yet been dug, 1 = has already been dug
var/sand_type = /obj/item/stack/ore/glass
var/floor_variance = 20 //probability floor has a different icon state
var/obj/item/stack/digResult = /obj/item/stack/ore/glass/basalt
var/dug
/turf/simulated/floor/plating/asteroid/New()
/turf/simulated/floor/plating/asteroid/Initialize(mapload)
var/proper_name = name
..()
. = ..()
name = proper_name
if(prob(floor_variance))
icon_state = "[environment_type][rand(0,12)]"
/turf/simulated/floor/plating/asteroid/proc/getDug()
new digResult(src, 5)
icon_plating = "[environment_type]_dug"
icon_state = "[environment_type]_dug"
dug = TRUE
/turf/simulated/floor/plating/asteroid/proc/can_dig(mob/user)
if(!dug)
return TRUE
if(user)
to_chat(user, "<span class='notice'>Looks like someone has dug here already.</span>")
/turf/simulated/floor/plating/asteroid/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
return
/turf/simulated/floor/plating/asteroid/burn_tile()
return
@@ -31,46 +48,50 @@
/turf/simulated/floor/plating/asteroid/remove_plating()
return
/turf/simulated/floor/plating/asteroid/ex_act(severity, target)
/turf/simulated/floor/plating/asteroid/ex_act(severity)
if(!can_dig())
return
switch(severity)
if(3)
return
if(2)
if(prob(20))
gets_dug()
getDug()
if(1)
gets_dug()
getDug()
/turf/simulated/floor/plating/asteroid/attackby(obj/item/W, mob/user, params)
/turf/simulated/floor/plating/asteroid/attackby(obj/item/I, mob/user, params)
//note that this proc does not call ..()
if(!W || !user)
return 0
if(!I|| !user)
return FALSE
if((istype(I, /obj/item/shovel) || istype(I, /obj/item/pickaxe)))
if(!can_dig(user))
return TRUE
if((istype(W, /obj/item/shovel) || istype(W, /obj/item/pickaxe)))
var/turf/T = get_turf(user)
if(!istype(T))
return
if(dug)
to_chat(user, "<span class='warning'>This area has already been dug!</span>")
return
to_chat(user, "<span class='notice'>You start digging...</span>")
playsound(src, W.usesound, 50, 1)
if(do_after(user, 20 * W.toolspeed, target = src))
to_chat(user, "<span class='notice'>You dig a hole.</span>")
gets_dug()
return
else if(istype(W,/obj/item/storage/bag/ore))
var/obj/item/storage/bag/ore/S = W
playsound(src, I.usesound, 50, TRUE)
if(do_after(user, 40 * I.toolspeed, target = src))
if(!can_dig(user))
return TRUE
to_chat(user, "<span class='notice'>You dig a hole.</span>")
getDug()
return TRUE
else if(istype(I, /obj/item/storage/bag/ore))
var/obj/item/storage/bag/ore/S = I
if(S.collection_mode == 1)
for(var/obj/item/stack/ore/O in src.contents)
O.attackby(W,user)
for(var/obj/item/stack/ore/O in contents)
O.attackby(I, user)
return
else if(istype(W, /obj/item/stack/tile))
var/obj/item/stack/tile/Z = W
else if(istype(I, /obj/item/stack/tile))
var/obj/item/stack/tile/Z = I
if(!Z.use(1))
return
if(istype(Z, /obj/item/stack/tile/plasteel)) // Turn asteroid floors into plating by default
@@ -79,25 +100,14 @@
ChangeTurf(Z.turf_type, keep_icon = FALSE)
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
/turf/simulated/floor/plating/asteroid/proc/gets_dug()
if(dug)
return
for(var/i in 1 to 5)
new sand_type(src)
dug = 1
icon_plating = "[environment_type]_dug"
icon_state = "[environment_type]_dug"
slowdown = 0
return
/turf/simulated/floor/plating/asteroid/basalt
name = "volcanic floor"
baseturf = /turf/simulated/floor/plating/asteroid/basalt
icon_state = "basalt"
icon_plating = "basalt"
environment_type = "basalt"
sand_type = /obj/item/stack/ore/glass/basalt
floor_variance = 15
digResult = /obj/item/stack/ore/glass/basalt
/turf/simulated/floor/plating/asteroid/basalt/lava //lava underneath
baseturf = /turf/simulated/floor/plating/lava/smooth
@@ -107,10 +117,14 @@
oxygen = 0
nitrogen = 0
/turf/simulated/floor/plating/asteroid/basalt/Initialize()
/turf/simulated/floor/plating/asteroid/basalt/Initialize(mapload)
. = ..()
set_basalt_light(src)
/turf/simulated/floor/plating/asteroid/basalt/getDug()
set_light(0)
return ..()
/proc/set_basalt_light(turf/simulated/floor/B)
switch(B.icon_state)
if("basalt1", "basalt2", "basalt3")
@@ -118,11 +132,6 @@
if("basalt5", "basalt9")
B.set_light(1.4, 0.6, LIGHT_COLOR_LAVA) //barely anything!
/turf/simulated/floor/plating/asteroid/basalt/gets_dug()
if(!dug)
set_light(0)
..()
///////Surface. The surface is warm, but survivable without a suit. Internals are required. The floors break to chasms, which drop you into the underground.
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
@@ -138,9 +147,10 @@
nitrogen = 0
turf_type = /turf/simulated/floor/plating/asteroid/airless
#define SPAWN_MEGAFAUNA "MEGAFAUNA"
#define SPAWN_MEGAFAUNA "bluh bluh huge boss"
#define SPAWN_BUBBLEGUM 6
GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = 6))
GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = SPAWN_BUBBLEGUM))
/turf/simulated/floor/plating/asteroid/airless/cave
var/length = 100
@@ -169,22 +179,20 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
/turf/simulated/floor/plating/asteroid/airless/cave/volcanic/has_data //subtype for producing a tunnel with given data
has_data = TRUE
/turf/simulated/floor/plating/asteroid/airless/cave/New()
/turf/simulated/floor/plating/asteroid/airless/cave/Initialize(mapload)
if (!mob_spawn_list)
mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goldgrub = 1, /mob/living/simple_animal/hostile/asteroid/goliath = 5, /mob/living/simple_animal/hostile/asteroid/basilisk = 4, /mob/living/simple_animal/hostile/asteroid/hivelord = 3)
if (!megafauna_spawn_list)
megafauna_spawn_list = GLOB.megafauna_spawn_list
if (!flora_spawn_list)
flora_spawn_list = list(/obj/structure/flora/ash/leaf_shroom = 2 , /obj/structure/flora/ash/cap_shroom = 2 , /obj/structure/flora/ash/stem_shroom = 2 , /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/tall_shroom = 2)
. = ..()
if(!has_data)
produce_tunnel_from_data()
..()
/turf/simulated/floor/plating/asteroid/airless/cave/proc/get_cave_data(set_length, exclude_dir = -1)
// If set_length (arg1) isn't defined, get a random length; otherwise assign our length to the length arg.
@@ -234,7 +242,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
if(istype(tunnel))
// Small chance to have forks in our tunnel; otherwise dig our tunnel.
if(i > 3 && prob(20))
var/turf/simulated/floor/plating/asteroid/airless/cave/C = tunnel.ChangeTurf(data_having_type,FALSE,TRUE)
var/turf/simulated/floor/plating/asteroid/airless/cave/C = tunnel.ChangeTurf(data_having_type, FALSE, TRUE)
C.going_backwards = FALSE
C.produce_tunnel_from_data(rand(10, 15), dir)
else
@@ -260,19 +268,22 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
SpawnFlora(T)
SpawnMonster(T)
T.ChangeTurf(turf_type,FALSE,FALSE,TRUE)
T.ChangeTurf(turf_type, FALSE, FALSE, TRUE)
/turf/simulated/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T)
if(prob(30))
if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored))
if(istype(loc, /area/mine/explored) || !istype(loc, /area/lavaland/surface/outdoors/unexplored))
return
var/randumb = pickweight(mob_spawn_list)
while(randumb == SPAWN_MEGAFAUNA)
var/maybe_boss = pickweight(megafauna_spawn_list)
if(megafauna_spawn_list[maybe_boss])
randumb = maybe_boss
if(ispath(maybe_boss, /mob/living/simple_animal/hostile/megafauna/bubblegum)) //there can be only one bubblegum, so don't waste spawns on it
megafauna_spawn_list.Remove(maybe_boss)
if(istype(loc, /area/lavaland/surface/outdoors/unexplored/danger)) //this is danger. it's boss time.
var/maybe_boss = pickweight(megafauna_spawn_list)
if(megafauna_spawn_list[maybe_boss])
randumb = maybe_boss
if(ispath(maybe_boss, /mob/living/simple_animal/hostile/megafauna/bubblegum)) //there can be only one bubblegum, so don't waste spawns on it
megafauna_spawn_list.Remove(maybe_boss)
else //this is not danger, don't spawn a boss, spawn something else
randumb = pickweight(mob_spawn_list)
for(var/mob/living/simple_animal/hostile/H in urange(12,T)) //prevents mob clumps
if((ispath(randumb, /mob/living/simple_animal/hostile/megafauna) || ismegafauna(H)) && get_dist(src, H) <= 7)
@@ -286,6 +297,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
return
#undef SPAWN_MEGAFAUNA
#undef SPAWN_BUBBLEGUM
/turf/simulated/floor/plating/asteroid/airless/cave/proc/SpawnFlora(turf/T)
if(prob(12))
@@ -300,6 +312,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
/turf/simulated/floor/plating/asteroid/snow
gender = PLURAL
name = "snow"
desc = "Looks cold."
icon = 'icons/turf/snow.dmi'
@@ -309,7 +322,18 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
temperature = 180
slowdown = 2
environment_type = "snow"
sand_type = /obj/item/stack/sheet/mineral/snow
planetary_atmos = TRUE
burnt_states = list("snow_dug")
digResult = /obj/item/stack/sheet/mineral/snow
/turf/simulated/floor/plating/asteroid/snow/burn_tile()
if(!burnt)
visible_message("<span class='danger'>[src] melts away!.</span>")
slowdown = 0
burnt = TRUE
icon_state = "snow_dug"
return TRUE
return FALSE
/turf/simulated/floor/plating/asteroid/snow/airless
temperature = TCMB
@@ -322,4 +346,5 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
/turf/simulated/floor/plating/asteroid/snow/atmosphere
oxygen = 22
nitrogen = 82
temperature = 180
temperature = 180
planetary_atmos = FALSE
@@ -48,7 +48,7 @@
temperature = 300
planetary_atmos = TRUE
/turf/simulated/floor/indestructible/necropolis/Initialize()
/turf/simulated/floor/indestructible/necropolis/Initialize(mapload)
. = ..()
if(prob(12))
icon_state = "necro[rand(2,3)]"
+91 -104
View File
@@ -6,12 +6,12 @@
icon_state = "rock"
var/smooth_icon = 'icons/turf/smoothrocks.dmi'
smooth = SMOOTH_MORE | SMOOTH_BORDER
canSmoothWith
canSmoothWith = null
baseturf = /turf/simulated/floor/plating/asteroid/airless
temperature = 2.7
opacity = 1
density = 1
blocks_air = 1
density = TRUE
blocks_air = TRUE
layer = EDGED_TURF_LAYER
temperature = TCMB
var/environment_type = "asteroid"
@@ -21,21 +21,18 @@
var/spread = 0 //will the seam spread?
var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles
var/last_act = 0
var/scan_state = null //Holder for the image we display when we're pinged by a mining scanner
var/defer_change = FALSE
var/scan_state = "" //Holder for the image we display when we're pinged by a mining scanner
var/defer_change = 0
/turf/simulated/mineral/New()
if (!canSmoothWith)
/turf/simulated/mineral/Initialize(mapload)
if(!canSmoothWith)
canSmoothWith = list(/turf/simulated/mineral)
var/matrix/M = new
M.Translate(-4, -4)
transform = M
icon = smooth_icon
..()
GLOB.mineral_turfs += src
if (mineralType && mineralAmt && spread && spreadChance)
. = ..()
if(mineralType && mineralAmt && spread && spreadChance)
for(var/dir in cardinal)
if(prob(spreadChance))
var/turf/T = get_step(src, dir)
@@ -56,37 +53,34 @@
return TRUE
return ..()
/turf/simulated/mineral/attackby(var/obj/item/pickaxe/P as obj, mob/user as mob, params)
/turf/simulated/mineral/attackby(obj/item/I, mob/user, params)
if(!user.IsAdvancedToolUser())
to_chat(usr, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
if(istype(P, /obj/item/pickaxe))
if(istype(I, /obj/item/pickaxe))
var/obj/item/pickaxe/P = I
var/turf/T = user.loc
if(!isturf(T))
return
if(last_act + (40 * P.toolspeed) > world.time) // Prevents message spam
return
last_act = world.time
to_chat(user, "<span class='notice'>You start picking...</span>")
P.playDigSound()
if(do_after(user, 40 * P.toolspeed, target = src))
if(istype(src, /turf/simulated/mineral)) //sanity check against turf being deleted during digspeed delay
if(ismineralturf(src)) //sanity check against turf being deleted during digspeed delay
to_chat(user, "<span class='notice'>You finish cutting into the rock.</span>")
P.update_icon()
gets_drilled(user)
feedback_add_details("pick_used_mining","[P.name]")
else
return attack_hand(user)
/turf/simulated/mineral/proc/gets_drilled()
if(mineralType && (mineralAmt > 0) && (mineralAmt < 11))
var/i
for(i=0; i < mineralAmt; i++)
new mineralType(src)
if(mineralType && (mineralAmt > 0))
new mineralType(src, mineralAmt)
feedback_add_details("ore_mined","[mineralType]|[mineralAmt]")
for(var/obj/effect/temp_visual/mining_overlay/M in src)
qdel(M)
@@ -94,26 +88,20 @@
addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE)
playsound(src, 'sound/effects/break_stone.ogg', 50, 1) //beautiful destruction
if(rand(1, 750) == 1)
visible_message("<span class='notice'>An old dusty crate was buried within!</span>")
new /obj/structure/closet/crate/secure/loot(src)
return
/turf/simulated/mineral/attack_animal(mob/living/simple_animal/user as mob)
if((user.environment_smash & ENVIRONMENT_SMASH_WALLS) || (user.environment_smash & ENVIRONMENT_SMASH_RWALLS))
gets_drilled()
..()
/turf/simulated/mineral/attack_alien(var/mob/living/carbon/alien/M)
/turf/simulated/mineral/attack_alien(mob/living/carbon/alien/M)
to_chat(M, "<span class='notice'>You start digging into the rock...</span>")
playsound(src, 'sound/effects/break_stone.ogg', 50, 1)
playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE)
if(do_after(M, 40, target = src))
to_chat(M, "<span class='notice'>You tunnel into the rock.</span>")
gets_drilled()
gets_drilled(M)
/turf/simulated/mineral/Bumped(AM as mob|obj)
. = ..()
/turf/simulated/mineral/Bumped(atom/movable/AM)
..()
if(ishuman(AM))
var/mob/living/carbon/human/H = AM
if((istype(H.l_hand,/obj/item/pickaxe)) && (!H.hand))
@@ -124,18 +112,19 @@
else if(isrobot(AM))
var/mob/living/silicon/robot/R = AM
if(istype(R.module_active,/obj/item/pickaxe))
attackby(R.module_active,R)
if(istype(R.module_active, /obj/item/pickaxe))
attackby(R.module_active, R)
else if(ismecha(AM))
var/obj/mecha/M = AM
if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/drill))
if(istype(M.selected, /obj/item/mecha_parts/mecha_equipment/drill))
M.selected.action(src)
/turf/simulated/mineral/acid_melt()
ChangeTurf(baseturf)
/turf/simulated/mineral/ex_act(severity, target)
/turf/simulated/mineral/ex_act(severity)
..()
switch(severity)
if(3)
@@ -148,22 +137,23 @@
gets_drilled(null, 1)
/turf/simulated/mineral/random
var/mineralSpawnChanceList
var/mineralSpawnChanceList = list(/turf/simulated/mineral/uranium = 5, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 10,
/turf/simulated/mineral/silver = 12, /turf/simulated/mineral/plasma = 20, /turf/simulated/mineral/iron = 40, /turf/simulated/mineral/titanium = 11,
/turf/simulated/mineral/gibtonite = 4, /turf/simulated/floor/plating/asteroid/airless/cave = 2, /turf/simulated/mineral/bscrystal = 1)
//Currently, Adamantine won't spawn as it has no uses. -Durandan
var/mineralChance = 13
var/display_icon_state = "rock"
/turf/simulated/mineral/random/New()
if (!mineralSpawnChanceList)
mineralSpawnChanceList = list(
/turf/simulated/mineral/uranium = 5, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 10,
/turf/simulated/mineral/silver = 12, /turf/simulated/mineral/plasma = 20, /turf/simulated/mineral/iron = 40, /turf/simulated/mineral/titanium = 11,
/turf/simulated/mineral/gibtonite = 4, /turf/simulated/floor/plating/asteroid/airless/cave = 2, /turf/simulated/mineral/bscrystal = 1)
if (display_icon_state)
/turf/simulated/mineral/random/Initialize(mapload)
mineralSpawnChanceList = typelist("mineralSpawnChanceList", mineralSpawnChanceList)
if(display_icon_state)
icon_state = display_icon_state
..()
. = ..()
if (prob(mineralChance))
var/path = pickweight(mineralSpawnChanceList)
var/turf/T = ChangeTurf(path,FALSE,TRUE)
var/turf/T = ChangeTurf(path, FALSE, TRUE)
if(T && ismineralturf(T))
var/turf/simulated/mineral/M = T
@@ -194,7 +184,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
mineralSpawnChanceList = list(
/turf/simulated/mineral/uranium/volcanic = 35, /turf/simulated/mineral/diamond/volcanic = 30, /turf/simulated/mineral/gold/volcanic = 45, /turf/simulated/mineral/titanium/volcanic = 45,
@@ -215,7 +204,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
mineralChance = 10
@@ -226,9 +214,9 @@
/turf/simulated/mineral/random/labormineral
mineralSpawnChanceList = list(
/turf/simulated/mineral/uranium = 2, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 3, /turf/simulated/mineral/titanium = 4,
/turf/simulated/mineral/silver = 6, /turf/simulated/mineral/plasma = 15, /turf/simulated/mineral/iron = 80,
/turf/simulated/mineral/gibtonite = 3)
/turf/simulated/mineral/uranium = 3, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 8, /turf/simulated/mineral/titanium = 8,
/turf/simulated/mineral/silver = 20, /turf/simulated/mineral/plasma = 30, /turf/simulated/mineral/iron = 95,
/turf/simulated/mineral/gibtonite = 2)
icon_state = "rock_labor"
/turf/simulated/mineral/random/labormineral/volcanic
@@ -238,12 +226,11 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
mineralSpawnChanceList = list(
/turf/simulated/mineral/uranium/volcanic = 2, /turf/simulated/mineral/diamond/volcanic = 1, /turf/simulated/mineral/gold/volcanic = 3, /turf/simulated/mineral/titanium/volcanic = 4,
/turf/simulated/mineral/silver/volcanic = 6, /turf/simulated/mineral/plasma/volcanic = 15, /turf/simulated/mineral/iron/volcanic = 80,
/turf/simulated/mineral/gibtonite/volcanic = 3)
/turf/simulated/mineral/uranium/volcanic = 3, /turf/simulated/mineral/diamond/volcanic = 1, /turf/simulated/mineral/gold/volcanic = 8, /turf/simulated/mineral/titanium/volcanic = 8,
/turf/simulated/mineral/silver/volcanic = 20, /turf/simulated/mineral/plasma/volcanic = 30, /turf/simulated/mineral/bscrystal/volcanic = 1, /turf/simulated/mineral/gibtonite/volcanic = 2,
/turf/simulated/mineral/iron/volcanic = 95)
// Actual minerals
/turf/simulated/mineral/iron
@@ -259,7 +246,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/uranium
@@ -275,7 +261,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/diamond
@@ -291,7 +276,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/gold
@@ -307,7 +291,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/silver
@@ -323,7 +306,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/titanium
@@ -339,7 +321,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/plasma
@@ -355,7 +336,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/clown
@@ -372,7 +352,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/mime
@@ -388,7 +367,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/bscrystal
@@ -405,7 +383,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/volcanic
@@ -415,7 +392,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
/turf/simulated/mineral/volcanic/lava_land_surface
environment_type = "basalt"
@@ -423,6 +399,12 @@
baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface
defer_change = 1
//gibtonite state defines
#define GIBTONITE_UNSTRUCK 0
#define GIBTONITE_ACTIVE 1
#define GIBTONITE_STABLE 2
#define GIBTONITE_DETONATE 3
// Gibtonite
/turf/simulated/mineral/gibtonite
mineralAmt = 1
@@ -430,39 +412,29 @@
spread = 0
scan_state = "rock_Gibtonite"
var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it
var/stage = 0 //How far into the lifecycle of gibtonite we are, 0 is untouched, 1 is active and attempting to detonate, 2 is benign and ready for extraction
var/stage = GIBTONITE_UNSTRUCK //How far into the lifecycle of gibtonite we are
var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes
var/activated_name = null
var/activated_image = null
var/mutable_appearance/activated_overlay
/turf/simulated/mineral/gibtonite/volcanic
environment_type = "basalt"
turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/gibtonite/New()
/turf/simulated/mineral/gibtonite/Initialize(mapload)
det_time = rand(8,10) //So you don't know exactly when the hot potato will explode
..()
. = ..()
/turf/simulated/mineral/gibtonite/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner) && stage == 1)
user.visible_message("<span class='notice'>You use [I] to locate where to cut off the chain reaction and attempt to stop it...</span>")
user.visible_message("<span class='notice'>[user] holds [I] to [src]...</span>", "<span class='notice'>You use [I] to locate where to cut off the chain reaction and attempt to stop it...</span>")
defuse()
..()
else
return ..()
/turf/simulated/mineral/gibtonite/proc/explosive_reaction(var/mob/user = null, triggered_by_explosion = 0)
if(stage == 0)
var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_active", layer = ON_EDGED_TURF_LAYER)
add_overlay(I)
activated_image = I
/turf/simulated/mineral/gibtonite/proc/explosive_reaction(mob/user = null, triggered_by_explosion = 0)
if(stage == GIBTONITE_UNSTRUCK)
activated_overlay = mutable_appearance('icons/turf/smoothrocks.dmi', "rock_Gibtonite_active", ON_EDGED_TURF_LAYER)
add_overlay(activated_overlay)
name = "gibtonite deposit"
desc = "An active gibtonite reserve. Run!"
stage = 1
stage = GIBTONITE_ACTIVE
visible_message("<span class='danger'>There was gibtonite inside! It's going to explode!</span>")
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
@@ -484,39 +456,39 @@
/turf/simulated/mineral/gibtonite/proc/countdown(notify_admins = 0)
set waitfor = 0
while(istype(src, /turf/simulated/mineral/gibtonite) && stage == 1 && det_time > 0 && mineralAmt >= 1)
while(istype(src, /turf/simulated/mineral/gibtonite) && stage == GIBTONITE_ACTIVE && det_time > 0 && mineralAmt >= 1)
det_time--
sleep(5)
if(istype(src, /turf/simulated/mineral/gibtonite))
if(stage == 1 && det_time <= 0 && mineralAmt >= 1)
if(stage == GIBTONITE_ACTIVE && det_time <= 0 && mineralAmt >= 1)
var/turf/bombturf = get_turf(src)
mineralAmt = 0
stage = 3
stage = GIBTONITE_DETONATE
explosion(bombturf,1,3,5, adminlog = notify_admins)
/turf/simulated/mineral/gibtonite/proc/defuse()
if(stage == 1)
overlays -= activated_image
var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_inactive", layer = ON_EDGED_TURF_LAYER)
add_overlay(I)
if(stage == GIBTONITE_ACTIVE)
cut_overlay(activated_overlay)
activated_overlay.icon_state = "rock_Gibtonite_inactive"
add_overlay(activated_overlay)
desc = "An inactive gibtonite reserve. The ore can be extracted."
stage = 2
stage = GIBTONITE_STABLE
if(det_time < 0)
det_time = 0
visible_message("<span class='notice'>The chain reaction was stopped! The gibtonite had [src.det_time] reactions left till the explosion!</span>")
visible_message("<span class='notice'>The chain reaction was stopped! The gibtonite had [det_time] reactions left till the explosion!</span>")
/turf/simulated/mineral/gibtonite/gets_drilled(var/mob/user, triggered_by_explosion = 0)
if(stage == 0 && mineralAmt >= 1) //Gibtonite deposit is activated
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg',50,1)
if(stage == GIBTONITE_UNSTRUCK && mineralAmt >= 1) //Gibtonite deposit is activated
playsound(src,'sound/effects/hit_on_shattered_glass.ogg', 50, TRUE)
explosive_reaction(user, triggered_by_explosion)
return
if(stage == 1 && mineralAmt >= 1) //Gibtonite deposit goes kaboom
if(stage == GIBTONITE_ACTIVE && mineralAmt >= 1) //Gibtonite deposit goes kaboom
var/turf/bombturf = get_turf(src)
mineralAmt = 0
stage = 3
explosion(bombturf, 1, 2, 5, adminlog = 0)
if(stage == 2) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore.
var/obj/item/twohanded/required/gibtonite/G = new /obj/item/twohanded/required/gibtonite/(src)
stage = GIBTONITE_DETONATE
explosion(bombturf,1,2,5, adminlog = 0)
if(stage == GIBTONITE_STABLE) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore.
var/obj/item/twohanded/required/gibtonite/G = new(src)
if(det_time <= 0)
G.quality = 3
G.icon_state = "Gibtonite ore 3"
@@ -526,3 +498,18 @@
ChangeTurf(turf_type, defer_change)
addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE)
/turf/simulated/mineral/gibtonite/volcanic
environment_type = "basalt"
turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
oxygen = 14
nitrogen = 23
temperature = 300
defer_change = 1
#undef GIBTONITE_UNSTRUCK
#undef GIBTONITE_ACTIVE
#undef GIBTONITE_STABLE
#undef GIBTONITE_DETONATE
+1 -1
View File
@@ -4,7 +4,7 @@
#define RANDOM_LOWER_X 50
#define RANDOM_LOWER_Y 50
/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/simulated/floor/plating/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors/unexplored, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y)
/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/simulated/floor/plating/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y)
var/list/river_nodes = list()
var/num_spawned = 0
var/list/possible_locs = block(locate(min_x, min_y, target_z), locate(max_x, max_y, target_z))
+2 -2
View File
@@ -54,7 +54,7 @@ var/global/nologevent = 0
///////////////////////////////////////////////////////////////////////////////////////////////Panels
/datum/admins/proc/show_player_panel(var/mob/M in GLOB.mob_list)
set category = "Admin"
set category = null
set name = "Show Player Panel"
set desc="Edit player (respawn, ban, heal, etc)"
@@ -937,9 +937,9 @@ var/global/nologevent = 0
message_admins("[key_name_admin(usr)] checked the AI laws")
/client/proc/update_mob_sprite(mob/living/carbon/human/H as mob)
set category = "Admin"
set name = "Update Mob Sprite"
set desc = "Should fix any mob sprite update errors."
set category = null
if(!check_rights(R_ADMIN))
return
+4 -5
View File
@@ -71,13 +71,12 @@ var/list/admin_verbs_admin = list(
/client/proc/alt_check,
/client/proc/secrets,
/client/proc/change_human_appearance_admin, /* Allows an admin to change the basic appearance of human-based mobs */
/client/proc/change_human_appearance_self, /* Allows the human-based mob itself change its basic appearance */
/client/proc/change_human_appearance_self, /* Allows the human-based mob itself to change its basic appearance */
/client/proc/debug_variables,
/client/proc/reset_all_tcs, /*resets all telecomms scripts*/
/client/proc/toggle_mentor_chat,
/client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/
/client/proc/list_ssds,
/client/proc/list_afks,
/client/proc/list_ssds_afks,
/client/proc/cmd_admin_headset_message,
/client/proc/spawn_floor_cluwne,
/client/proc/show_discord_duplicates, // This needs removing at some point, ingame discord linking got removed in #11359
@@ -803,7 +802,7 @@ var/list/admin_verbs_ticket = list(
/client/proc/change_human_appearance_admin(mob/living/carbon/human/H in GLOB.mob_list)
set name = "C.M.A. - Admin"
set desc = "Allows you to change the mob appearance"
set category = "Admin"
set category = null
if(!check_rights(R_ADMIN))
return
@@ -829,7 +828,7 @@ var/list/admin_verbs_ticket = list(
/client/proc/change_human_appearance_self(mob/living/carbon/human/H in GLOB.mob_list)
set name = "C.M.A. - Self"
set desc = "Allows the mob to change its appearance"
set category = "Admin"
set category = null
if(!check_rights(R_ADMIN))
return
@@ -12,12 +12,12 @@
/client/proc/resolveAllAdminTickets()
set name = "Resolve All Open Admin Tickets"
set category = "Admin"
set category = null
if(!holder || !check_rights(R_ADMIN))
return
if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes")
if(alert("Are you sure you want to resolve ALL open admin tickets?","Resolve all open admin tickets?","Yes","No") != "Yes")
return
SStickets.resolveAllOpenTickets()
@@ -12,12 +12,12 @@
/client/proc/resolveAllMentorTickets()
set name = "Resolve All Open Mentor Tickets"
set category = "Admin"
set category = null
if(!holder || !check_rights(R_ADMIN))
return
if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes")
if(alert("Are you sure you want to resolve ALL open mentor tickets?","Resolve all open mentor tickets?","Yes","No") != "Yes")
return
SSmentor_tickets.resolveAllOpenTickets()
+1 -9
View File
@@ -37,7 +37,7 @@
return
var/ticketID = text2num(href_list["openmentorticket"])
SSmentor_tickets.showDetailUI(usr, ticketID)
if(href_list["stickyban"])
stickyban(href_list["stickyban"],href_list)
@@ -169,14 +169,6 @@
message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom IP and computer id fields replaced with the IP and computer id from the located mob")
DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey, banip, bancid )
if(BANTYPE_PERMA)
add_note(banckey, "Permanently Banned - [banreason]", null, usr.ckey, 0)
else if(BANTYPE_TEMP)
add_note(banckey, "Banned for [banduration] minutes - [banreason]", null, usr.ckey, 0)
else if(BANTYPE_JOB_PERMA)
add_note(banckey, "Banned from [banjob] - [banreason]", null, usr.ckey, 0)
else
add_note(banckey, "[banreason]", null, usr.ckey, 0)
else if(href_list["editrights"])
+1 -1
View File
@@ -30,7 +30,7 @@
/client/proc/jumptoturf(var/turf/T in world)
set name = "Jump to Turf"
set category = "Admin"
set category = null
if(!check_rights(R_ADMIN))
return
+4 -4
View File
@@ -191,7 +191,7 @@
else
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
to_chat(X, "<span class='boldnotice'>[type]: [key_name(src, TRUE, type)]-&gt;[key_name(C, TRUE, type)]: [emoji_msg]</span>")
//Check if the mob being PM'd has any open admin tickets.
var/tickets = list()
if(type == "Mentorhelp")
@@ -205,10 +205,10 @@
if(type == "Mentorhelp")
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets
tickets = SSmentor_tickets.checkForTicket(src)
else // Ahelp
else // Ahelp
if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets
tickets = SStickets.checkForTicket(src)
if(tickets)
for(var/datum/ticket/i in tickets)
i.addResponse(src, msg)
@@ -351,7 +351,7 @@
var/client/C = pms[title].client || update_client(title)
if(!C)
return "[title] (Disconnected)"
return "[key_name(C, FALSE)] ([ADMIN_QUE(C.mob,"?")]) ([ADMIN_PP(C.mob,"PP")]) ([ADMIN_VV(C.mob,"VV")]) ([ADMIN_SM(C.mob,"SM")]) ([admin_jump_link(C.mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>)"
return "[key_name(C, FALSE)] ([ADMIN_QUE(C.mob,"?")]) ([ADMIN_PP(C.mob,"PP")]) ([ADMIN_VV(C.mob,"VV")]) ([ADMIN_TP(C.mob,"TP")]) ([ADMIN_SM(C.mob,"SM")]) ([admin_jump_link(C.mob)])"
/datum/pm_tracker/proc/update_client(title)
var/client/C = GLOB.directory[ckey(title)]
+2 -2
View File
@@ -7,8 +7,8 @@
////////////////////////////////////////////////////////////////////////////////
var/global/list/frozen_mob_list = list()
/client/proc/freeze(var/mob/living/M as mob in GLOB.mob_list)
set category = "Admin"
set name = "Freeze"
set category = null
if(!check_rights(R_ADMIN))
return
@@ -87,8 +87,8 @@ var/global/list/frozen_mob_list = list()
//////////////////////////Freeze Mech
/client/proc/freezemecha(var/obj/mecha/O as obj in GLOB.mechas_list)
set category = "Admin"
set name = "Freeze Mech"
set category = null
if(!check_rights(R_ADMIN))
return
+6 -6
View File
@@ -30,7 +30,7 @@
deity = SSticker.cultdat.entity_name
log_say("(PRAYER) [msg]", usr)
msg = "<span class='notice'>[bicon(cross)]<b><font color=[font_color]>[prayer_type][deity ? " (to [deity])" : ""][mind && mind.isholy ? " (blessings: [mind.num_blessed])" : ""]:</font> [key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_SC(src,"SC")]) (<A HREF='?_src_=holder;Bless=[UID()]'>BLESS</A>) (<A HREF='?_src_=holder;Smite=[UID()]'>SMITE</A>):</b> [msg]</span>"
msg = "<span class='notice'>[bicon(cross)]<b><font color=[font_color]>[prayer_type][deity ? " (to [deity])" : ""][mind && mind.isholy ? " (blessings: [mind.num_blessed])" : ""]:</font> [key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_TP(src,"TP")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) ([ADMIN_SC(src,"SC")]) (<A HREF='?_src_=holder;Bless=[UID()]'>BLESS</A>) (<A HREF='?_src_=holder;Smite=[UID()]'>SMITE</A>):</b> [msg]</span>"
for(var/client/X in GLOB.admins)
if(check_rights(R_EVENT,0,X.mob))
@@ -41,7 +41,7 @@
/proc/Centcomm_announce(var/text , var/mob/Sender)
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
msg = "<span class='boldnotice'><font color=orange>CENTCOMM: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")])):</span> [msg]"
msg = "<span class='boldnotice'><font color=orange>CENTCOMM: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")])):</span> [msg]"
for(var/client/X in GLOB.admins)
if(R_EVENT & X.holder.rights)
to_chat(X, msg)
@@ -50,7 +50,7 @@
/proc/Syndicate_announce(var/text , var/mob/Sender)
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
msg = "<span class='boldnotice'><font color='#DC143C'>SYNDICATE: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_SYNDICATE_REPLY(Sender,"RPLY")]):</span> [msg]"
msg = "<span class='boldnotice'><font color='#DC143C'>SYNDICATE: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_SYNDICATE_REPLY(Sender,"RPLY")]):</span> [msg]"
for(var/client/X in GLOB.admins)
if(check_rights(R_EVENT,0,X.mob))
to_chat(X, msg)
@@ -59,7 +59,7 @@
/proc/HONK_announce(var/text , var/mob/Sender)
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
msg = "<span class='boldnotice'><font color=pink>HONK: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;HONKReply=[Sender.UID()]'>RPLY</A>):</span> [msg]"
msg = "<span class='boldnotice'><font color=pink>HONK: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;HONKReply=[Sender.UID()]'>RPLY</A>):</span> [msg]"
for(var/client/X in GLOB.admins)
if(R_EVENT & X.holder.rights)
to_chat(X, msg)
@@ -68,7 +68,7 @@
/proc/ERT_Announce(var/text , var/mob/Sender, var/repeat_warning)
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
msg = "<span class='adminnotice'><b><font color=orange>ERT REQUEST: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;ErtReply=[Sender.UID()]'>RESPOND</A>):</b> [msg]</span>"
msg = "<span class='adminnotice'><b><font color=orange>ERT REQUEST: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;ErtReply=[Sender.UID()]'>RESPOND</A>):</b> [msg]</span>"
if(repeat_warning)
msg += "<BR><span class='adminnotice'><b>WARNING: ERT request has gone 5 minutes with no reply!</b></span>"
for(var/client/X in GLOB.admins)
@@ -80,7 +80,7 @@
/proc/Nuke_request(text , mob/Sender)
var/nuke_code = get_nuke_code()
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
msg = "<span class='adminnotice'><b><font color=orange>NUKE CODE REQUEST: </font>[key_name(Sender)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")]):</b> [msg]</span>"
msg = "<span class='adminnotice'><b><font color=orange>NUKE CODE REQUEST: </font>[key_name(Sender)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) ([ADMIN_CENTCOM_REPLY(Sender,"RPLY")]):</b> [msg]</span>"
for(var/client/X in GLOB.admins)
if(check_rights(R_EVENT,0,X.mob))
to_chat(X, msg)
+13 -24
View File
@@ -776,8 +776,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
feedback_add_details("admin_verb","GIBS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_check_contents(mob/living/M as mob in GLOB.mob_list)
set category = "Admin"
set name = "Check Contents"
set category = null
if(!check_rights(R_ADMIN))
return
@@ -957,21 +957,24 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(usr)] reset NTTC scripts.")
feedback_add_details("admin_verb","RAT2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/list_ssds()
/client/proc/list_ssds_afks()
set category = "Admin"
set name = "List SSDs"
set desc = "Lists SSD players"
set name = "List SSDs and AFKs"
set desc = "Lists SSD and AFK players"
if(!check_rights(R_ADMIN))
return
var/msg = "<html><head><title>SSD Report</title></head><body>"
/* ======== SSD Section ========= */
var/msg = "<html><head><title>SSD & AFK Report</title></head><body>"
msg += "SSD Players:<BR><TABLE border='1'>"
msg += "<TR><TD><B>Key</B></TD><TD><B>Real Name</B></TD><TD><B>Job</B></TD><TD><B>Mins SSD</B></TD><TD><B>Special Role</B></TD><TD><B>Area</B></TD><TD><B>PPN</B></TD><TD><B>Cryo</B></TD></TR>"
var/mins_ssd
var/job_string
var/key_string
var/role_string
var/obj_count = 0
var/obj_string = ""
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
if(!isLivingSSD(H))
continue
@@ -984,8 +987,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(job_string in command_positions)
job_string = "<U>" + job_string + "</U>"
role_string = "-"
var/obj_count = 0
var/obj_string = ""
if(H.mind)
if(H.mind.special_role)
role_string = "<U>[H.mind.special_role]</U>"
@@ -1003,24 +1004,12 @@ Traitors and the like can also be revived with the previous role mostly intact.
else
msg += "<TD><A href='?_src_=holder;cryossd=[H.UID()]'>Cryo</A></TD>"
msg += "</TR>"
msg += "</TABLE></BODY></HTML>"
src << browse(msg, "window=Player_ssd_check")
msg += "</TABLE><br></BODY></HTML>"
/client/proc/list_afks()
set category = "Admin"
set name = "List AFKs"
set desc = "Lists AFK players"
if(!check_rights(R_ADMIN))
return
var/msg = "<html><head><title>AFK Report</title></head><body>"
/* ======== AFK Section ========= */
msg += "AFK Players:<BR><TABLE border='1'>"
msg += "<TR><TD><B>Key</B></TD><TD><B>Real Name</B></TD><TD><B>Job</B></TD><TD><B>Mins AFK</B></TD><TD><B>Special Role</B></TD><TD><B>Area</B></TD><TD><B>PPN</B></TD><TD><B>Cryo</B></TD></TR>"
var/mins_afk
var/job_string
var/key_string
var/role_string
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
if(H.client == null || H.stat == DEAD) // No clientless or dead
continue
@@ -1035,8 +1024,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(job_string in command_positions)
job_string = "<U>" + job_string + "</U>"
role_string = "-"
var/obj_count = 0
var/obj_string = ""
obj_count = 0
obj_string = ""
if(H.mind)
if(H.mind.special_role)
role_string = "<U>[H.mind.special_role]</U>"
@@ -1055,7 +1044,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
msg += "<TD><A href='?_src_=holder;cryossd=[H.UID()];cryoafk=1'>Cryo</A></TD>"
msg += "</TR>"
msg += "</TABLE></BODY></HTML>"
src << browse(msg, "window=Player_afk_check")
src << browse(msg, "window=Player_ssd_afk_check;size=600x300")
/client/proc/toggle_ert_calling()
set category = "Event"
+5
View File
@@ -95,3 +95,8 @@
// Has the client been varedited by an admin? [Inherits from datum now]
// var/var_edited = FALSE
var/client_keysend_amount = 0
var/next_keysend_reset = 0
var/next_keysend_trip_reset = 0
var/keysend_tripped = FALSE
+8
View File
@@ -163,12 +163,20 @@
strip_delay = 100
dog_fashion = null
/obj/item/clothing/head/helmet/roman/fake
desc = "An ancient helmet made of plastic and leather."
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
/obj/item/clothing/head/helmet/roman/legionaire
name = "roman legionaire helmet"
desc = "An ancient helmet made of bronze and leather. Has a red crest on top of it."
icon_state = "roman_c"
item_state = "roman_c"
/obj/item/clothing/head/helmet/roman/legionaire/fake
desc = "An ancient helmet made of plastic and leather. Has a red crest on top of it."
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
/obj/item/clothing/head/helmet/gladiator
name = "gladiator helmet"
desc = "Ave, Imperator, morituri te salutant."
+1 -1
View File
@@ -527,7 +527,7 @@
var/shield_on = "shield-old"
sprite_sheets = null
/obj/item/clothing/suit/space/hardsuit/shielded/hit_reaction(mob/living/carbon/human/owner, attack_text)
/obj/item/clothing/suit/space/hardsuit/shielded/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(current_charges > 0)
do_sparks(2, 1, src)
owner.visible_message("<span class='danger'>[owner]'s shields deflect [attack_text] in a shower of sparks!</span>")
+4 -4
View File
@@ -300,7 +300,7 @@
desc = "Someone seperated our Research Director from his own head!"
var/tele_range = 6
/obj/item/clothing/suit/armor/reactive/teleport/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
/obj/item/clothing/suit/armor/reactive/teleport/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(!active)
return 0
if(prob(hit_reaction_chance))
@@ -331,7 +331,7 @@
/obj/item/clothing/suit/armor/reactive/fire
name = "reactive incendiary armor"
/obj/item/clothing/suit/armor/reactive/fire/hit_reaction(mob/living/carbon/human/owner, attack_text)
/obj/item/clothing/suit/armor/reactive/fire/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(!active)
return 0
if(prob(hit_reaction_chance))
@@ -348,7 +348,7 @@
/obj/item/clothing/suit/armor/reactive/stealth
name = "reactive stealth armor"
/obj/item/clothing/suit/armor/reactive/stealth/hit_reaction(mob/living/carbon/human/owner, attack_text)
/obj/item/clothing/suit/armor/reactive/stealth/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(!active)
return 0
if(prob(hit_reaction_chance))
@@ -365,7 +365,7 @@
/obj/item/clothing/suit/armor/reactive/tesla
name = "reactive tesla armor"
/obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, attack_text)
/obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(!active)
return 0
if(prob(hit_reaction_chance))
+1 -1
View File
@@ -60,7 +60,7 @@
name = "ancient jumpsuit"
desc = "A terribly ragged and frayed grey jumpsuit. It looks like it hasn't been washed in over a decade."
/obj/item/clothing/under/color/grey/glorf/hit_reaction(mob/living/carbon/human/owner)
/obj/item/clothing/under/color/grey/glorf/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
owner.forcesay(GLOB.hit_appends)
return 0
+1 -1
View File
@@ -74,7 +74,7 @@
. = ..()
AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg' = 1), 50)
/obj/item/clothing/under/rank/clown/hit_reaction()
/obj/item/clothing/under/rank/clown/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
if(H.mind && H.mind.assigned_role == "Clown")
+1 -1
View File
@@ -135,7 +135,7 @@
force = 5
sharp = 0
/obj/item/claymore/fluff/hit_reaction()
/obj/item/claymore/fluff/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
return 0
/obj/item/fluff/rsik_katana //Xydonus: Rsik Ugsharki Atan
+41 -33
View File
@@ -269,51 +269,59 @@ Gunshots/explosions/opening doors/less rare audio (done)
px = -32
/obj/effect/hallucination/oh_yeah
var/turf/simulated/wall/wall
var/obj/effect/hallucination/simple/bubblegum/bubblegum = null
var/obj/effect/hallucination/simple/bubblegum/bubblegum
var/image/fakebroken
var/image/fakerune
/obj/effect/hallucination/oh_yeah/New(loc, mob/living/carbon/T)
/obj/effect/hallucination/oh_yeah/New(loc, mob/living/carbon/C)
set waitfor = FALSE
..()
target = T
for(var/turf/simulated/wall/W in range(7,target))
target = C
var/turf/simulated/wall/wall
for(var/turf/simulated/wall/W in range(7, target))
wall = W
break
if(wall)
fakebroken = image('icons/turf/floors.dmi', wall, "plating", layer = TURF_LAYER)
var/turf/landing = get_turf(target)
var/turf/landing_image_turf = get_step(landing, SOUTHWEST) //the icon is 3x3
fakerune = image('icons/effects/96x96.dmi', landing_image_turf, "landing", layer = ABOVE_OPEN_TURF_LAYER)
fakebroken.override = TRUE
if(target.client)
target.client.images |= fakebroken
target.client.images |= fakerune
target.playsound_local(wall,'sound/effects/meteorimpact.ogg', 150, 1)
bubblegum = new(wall, target)
sleep(10) //ominous wait
var/charged = FALSE //only get hit once
while(get_turf(bubblegum) != landing && target)
bubblegum.forceMove(get_step_towards(bubblegum, landing))
bubblegum.setDir(get_dir(bubblegum, landing))
target.playsound_local(get_turf(bubblegum), 'sound/effects/meteorimpact.ogg', 150, 1)
shake_camera(target, 2, 1)
if(bubblegum.Adjacent(target) && !charged)
charged = TRUE
target.Weaken(4)
target.adjustStaminaLoss(40)
step_away(target, bubblegum)
shake_camera(target, 4, 3)
target.visible_message("<span class='warning'>[target] jumps backwards, falling on the ground!</span>","<span class='userdanger'>[bubblegum] slams into you!</span>")
sleep(2)
sleep(30)
qdel(bubblegum)
if(!wall)
qdel(src)
return
fakebroken = image('icons/turf/floors.dmi', wall, "plating", layer = TURF_LAYER)
var/turf/landing = get_turf(target)
var/turf/landing_image_turf = get_step(landing, SOUTHWEST) //the icon is 3x3
fakerune = image('icons/effects/96x96.dmi', landing_image_turf, "landing", layer = ABOVE_OPEN_TURF_LAYER)
fakebroken.override = TRUE
if(target.client)
target.client.images |= fakebroken
target.client.images |= fakerune
target.playsound_local(wall,'sound/effects/meteorimpact.ogg', 150, 1)
bubblegum = new(wall, target)
addtimer(CALLBACK(src, .proc/bubble_attack, landing), 10)
/obj/effect/hallucination/oh_yeah/proc/bubble_attack(turf/landing)
var/charged = FALSE //only get hit once
while(get_turf(bubblegum) != landing && target && target.stat != DEAD)
bubblegum.forceMove(get_step_towards(bubblegum, landing))
bubblegum.setDir(get_dir(bubblegum, landing))
target.playsound_local(get_turf(bubblegum), 'sound/effects/meteorimpact.ogg', 150, 1)
shake_camera(target, 2, 1)
if(bubblegum.Adjacent(target) && !charged)
charged = TRUE
target.Weaken(4)
target.adjustStaminaLoss(40)
step_away(target, bubblegum)
shake_camera(target, 4, 3)
target.visible_message("<span class='warning'>[target] jumps backwards, falling on the ground!</span>", "<span class='userdanger'>[bubblegum] slams into you!</span>")
sleep(2)
sleep(30)
qdel(src)
/obj/effect/hallucination/oh_yeah/Destroy()
if(target.client)
target.client.images.Remove(fakebroken)
target.client.images.Remove(fakerune)
QDEL_NULL(fakebroken)
QDEL_NULL(fakerune)
QDEL_NULL(bubblegum)
return ..()
/obj/effect/hallucination/singularity_scare
@@ -334,14 +334,6 @@
icon_state = "britcup"
volume = 30
/obj/item/reagent_containers/food/drinks/mushroom_bowl
name = "mushroom bowl"
desc = "A bowl made out of mushrooms. Not food, though it might have contained some at some point."
icon = 'icons/obj/lavaland/ash_flora.dmi'
icon_state = "mushroom_bowl"
w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/drinks/bag
name = "drink bag"
desc = "Normally put in wine boxes, or down pants at stadium events."
+1
View File
@@ -374,6 +374,7 @@
seed.genes += disk.gene.Copy()
if(istype(disk.gene, /datum/plant_gene/reagent))
seed.reagents_from_genes()
disk.gene.apply_vars(seed)
repaint_seed()
update_genes()
+2 -2
View File
@@ -15,7 +15,7 @@
icon_dead = "soybean-dead"
genes = list(/datum/plant_gene/trait/repeated_harvest)
mutatelist = list(/obj/item/seeds/soya/koi)
reagents_add = list("soybeanoil" = 0.2, "vitamin" = 0.04, "plantmatter" = 0.05)
reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.05, "soybeanoil" = 0.03)
/obj/item/reagent_containers/food/snacks/grown/soybeans
seed = /obj/item/seeds/soya
@@ -25,7 +25,7 @@
icon_state = "soybeans"
filling_color = "#F0E68C"
bitesize_mod = 2
tastes = list("soybean" = 1)
tastes = list("soy" = 1)
wine_power = 0.2
// Koibean
+5 -5
View File
@@ -46,8 +46,8 @@
desc = "Taste so good, you could die!"
icon_state = "poisonberrypile"
filling_color = "#C71585"
distill_reagent = null
tastes = list("poison-berry" = 1)
distill_reagent = null
wine_power = 0.35
// Death Berries
@@ -70,8 +70,8 @@
desc = "Taste so good, you could die!"
icon_state = "deathberrypile"
filling_color = "#708090"
distill_reagent = null
tastes = list("death-berry" = 1)
distill_reagent = null
wine_power = 0.5
// Glow Berries
@@ -130,8 +130,8 @@
gender = PLURAL
filling_color = "#FF0000"
bitesize_mod = 2
wine_power = 0.3
tastes = list("cherry" = 1)
wine_power = 0.3
// Blue Cherries
/obj/item/seeds/cherry/blue
@@ -152,8 +152,8 @@
icon_state = "bluecherry"
filling_color = "#6495ED"
bitesize_mod = 2
wine_power = 0.5
tastes = list("blue cherry" = 1)
wine_power = 0.5
// Grapes
/obj/item/seeds/grape
@@ -184,8 +184,8 @@
dried_type = /obj/item/reagent_containers/food/snacks/no_raisin
filling_color = "#FF1493"
bitesize_mod = 2
distill_reagent = "wine"
tastes = list("grapes" = 1)
distill_reagent = "wine"
// Green Grapes
/obj/item/seeds/grape/green
+1 -1
View File
@@ -51,7 +51,7 @@
filling_color = "#0000CD"
bitesize_mod = 2
origin_tech = "biotech=4"
tastes = list("chilli" = 1)
tastes = list("chilly" = 1)
wine_power = 0.3
// Ghost Chili
+1 -1
View File
@@ -31,7 +31,6 @@
icon_state = "lime"
filling_color = "#00FF00"
tastes = list("lime" = 1)
distill_reagent = "triple_sec"
// Orange
/obj/item/seeds/orange
@@ -59,6 +58,7 @@
icon_state = "orange"
tastes = list("orange" = 1)
filling_color = "#FFA500"
distill_reagent = "triple_sec"
// Lemon
/obj/item/seeds/lemon
+1 -1
View File
@@ -62,7 +62,7 @@
/obj/item/grown/snapcorn
seed = /obj/item/seeds/corn/snapcorn
name = "snap corn"
desc = "A cob with snap pops"
desc = "A cob with snap pops."
icon_state = "snapcorn"
item_state = "corncob"
w_class = WEIGHT_CLASS_TINY
@@ -27,9 +27,11 @@
// Egg-Plant
/obj/item/seeds/eggplant/eggy
name = "pack of egg-plant seeds"
desc = "These seeds grow to produce berries that look a lot like eggs."
icon_state = "seed-eggy"
species = "eggy"
plantname = "Egg-Plants"
product = /obj/item/reagent_containers/food/snacks/grown/shell/eggy
lifespan = 75
production = 12
+5 -1
View File
@@ -138,6 +138,8 @@
icon_state = "seed-moonflower"
species = "moonflower"
plantname = "Moonflowers"
icon_grow = "moonflower-grow"
icon_dead = "sunflower-dead"
product = /obj/item/reagent_containers/food/snacks/grown/moonflower
mutatelist = list()
reagents_add = list("moonshine" = 0.2, "vitamin" = 0.02, "plantmatter" = 0.02)
@@ -152,7 +154,7 @@
filling_color = "#E6E6FA"
bitesize_mod = 2
tastes = list("moonflower" = 1)
distill_reagent = "absinthe"
distill_reagent = "absinthe" //It's made from flowers.
// Novaflower
/obj/item/seeds/sunflower/novaflower
@@ -161,6 +163,8 @@
icon_state = "seed-novaflower"
species = "novaflower"
plantname = "Novaflowers"
icon_grow = "novaflower-grow"
icon_dead = "sunflower-dead"
product = /obj/item/grown/novaflower
mutatelist = list()
reagents_add = list("condensedcapsaicin" = 0.25, "capsaicin" = 0.3, "plantmatter" = 0)
+22
View File
@@ -0,0 +1,22 @@
/obj/item/seeds/garlic
name = "pack of garlic seeds"
desc = "A packet of extremely pungent seeds."
icon_state = "seed-garlic"
species = "garlic"
plantname = "Garlic Sprouts"
product = /obj/item/reagent_containers/food/snacks/grown/garlic
yield = 6
potency = 25
growthstages = 3
growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
reagents_add = list("garlic" = 0.15, "plantmatter" = 0.1)
/obj/item/reagent_containers/food/snacks/grown/garlic
seed = /obj/item/seeds/garlic
name = "garlic"
desc = "Delicious, but with a potentially overwhelming odor."
icon_state = "garlic"
filling_color = "#C0C9A0"
bitesize_mod = 2
tastes = list("garlic" = 1)
wine_power = 0.1
+1 -10
View File
@@ -38,17 +38,8 @@
continue
grassAmt += 1 + round(G.seed.potency * tile_coefficient)
qdel(G)
var/obj/item/stack/tile/GT = new stacktype(user.loc)
while(grassAmt > GT.max_amount)
GT.amount = GT.max_amount
grassAmt -= GT.max_amount
GT = new stacktype(user.loc)
GT.amount = grassAmt
for(var/obj/item/stack/tile/T in user.loc)
if((T.type == stacktype) && (T.amount < T.max_amount) && (T != GT))
T.attackby(GT, user)
new stacktype(user.drop_location(), grassAmt)
qdel(src)
return
// Carpet
/obj/item/seeds/grass/carpet
+7
View File
@@ -14,6 +14,13 @@
mutatelist = list(/obj/item/seeds/watermelon/holy)
reagents_add = list("water" = 0.2, "vitamin" = 0.04, "plantmatter" = 0.2)
/obj/item/seeds/watermelon/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is swallowing [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
user.gib()
new product(drop_location())
qdel(src)
return OBLITERATION
/obj/item/reagent_containers/food/snacks/grown/watermelon
seed = /obj/item/seeds/watermelon
name = "watermelon"

Some files were not shown because too many files have changed in this diff Show More