Merge branch 'master' into Timidwomen

This commit is contained in:
Blue Wildrose
2021-01-18 14:42:52 -07:00
66 changed files with 435 additions and 319 deletions
+131 -83
View File
@@ -2337,9 +2337,12 @@
/turf/open/floor/plasteel/dark,
/area/security/prison)
"afJ" = (
/obj/effect/landmark/carpspawn,
/turf/open/space/basic,
/area/space/nearstation)
/obj/effect/turf_decal/tile/neutral,
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"afK" = (
/obj/machinery/atmospherics/components/unary/tank/air{
dir = 1
@@ -20027,9 +20030,7 @@
/obj/structure/cable{
icon_state = "1-8"
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/bar)
"aUQ" = (
@@ -20044,6 +20045,9 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
},
/turf/open/floor/plasteel/dark,
/area/hydroponics)
"aUR" = (
@@ -20485,8 +20489,16 @@
/turf/closed/wall,
/area/janitor)
"aVT" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
/obj/machinery/door/firedoor,
/obj/machinery/door/poddoor/shutters{
id = "jangarage";
name = "Custodial Closet Shutters"
},
/obj/effect/turf_decal/delivery,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/janitor)
"aVU" = (
/obj/machinery/door/window/eastright{
@@ -20510,6 +20522,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/janitor)
"aVV" = (
@@ -20892,9 +20905,6 @@
/obj/machinery/camera{
c_tag = "Custodial Quarters"
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
},
/obj/machinery/light/small{
dir = 1
},
@@ -20915,6 +20925,9 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
},
/turf/open/floor/plasteel/dark,
/area/janitor)
"aWO" = (
@@ -20934,6 +20947,9 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
},
/turf/open/floor/plasteel/dark,
/area/janitor)
"aWP" = (
@@ -23004,9 +23020,6 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"baW" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
/obj/machinery/button/door{
id = "jangarage";
name = "Custodial Closet Shutters Control";
@@ -23014,14 +23027,12 @@
req_access_txt = "26"
},
/obj/effect/turf_decal/tile/neutral,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"baX" = (
/obj/vehicle/ridden/janicart,
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/machinery/light{
dir = 8
},
@@ -23034,6 +23045,9 @@
/obj/structure/cable{
icon_state = "2-4"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
/turf/open/floor/plasteel,
/area/janitor)
"baY" = (
@@ -23398,6 +23412,9 @@
/obj/structure/cable{
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
/turf/open/floor/plasteel,
/area/janitor)
"bbY" = (
@@ -31173,17 +31190,26 @@
"bup" = (
/obj/machinery/rnd/destructive_analyzer,
/obj/effect/turf_decal/delivery,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/science/lab)
"buq" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/bot,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/science/lab)
"bur" = (
/obj/effect/turf_decal/delivery,
/obj/machinery/rnd/production/protolathe/department/science,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/science/lab)
"bus" = (
@@ -31202,6 +31228,9 @@
/obj/machinery/light{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
/turf/open/floor/plasteel/white,
/area/science/lab)
"but" = (
@@ -31664,6 +31693,7 @@
/obj/structure/cable{
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white,
/area/science/lab)
"bvA" = (
@@ -32372,6 +32402,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white,
/area/science/lab)
"bxh" = (
@@ -33056,12 +33087,6 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"byD" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
/obj/structure/cable{
icon_state = "2-4"
},
/obj/machinery/door/airlock/research{
name = "R&D Lab";
req_one_access_txt = "7;29;30"
@@ -33070,6 +33095,12 @@
/obj/structure/disposalpipe/segment{
dir = 6
},
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/science/lab)
"byE" = (
@@ -33091,7 +33122,6 @@
/turf/open/floor/plasteel/white,
/area/science/lab)
"byG" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/structure/cable{
icon_state = "1-2"
},
@@ -33919,10 +33949,6 @@
/area/hallway/primary/aft)
"bAm" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
/area/hallway/primary/aft)
"bAo" = (
@@ -33952,7 +33978,6 @@
/obj/structure/cable{
icon_state = "1-4"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/purple{
dir = 1
},
@@ -34404,17 +34429,14 @@
name = "RD Office APC";
pixel_x = -25
},
/obj/structure/cable{
icon_state = "0-4"
},
/obj/effect/turf_decal/tile/purple{
dir = 1
},
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
/obj/structure/cable{
icon_state = "4-8"
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hor)
@@ -34425,8 +34447,8 @@
/obj/structure/disposalpipe/segment{
dir = 5
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hor)
@@ -34434,6 +34456,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hor)
"bBt" = (
@@ -34441,6 +34466,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hor)
"bBu" = (
@@ -34478,6 +34506,9 @@
/obj/effect/turf_decal/tile/purple{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hor)
"bBw" = (
@@ -35240,6 +35271,7 @@
/obj/structure/cable{
icon_state = "0-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/crew_quarters/heads/hor)
"bCK" = (
@@ -44248,9 +44280,11 @@
/turf/open/floor/engine/co2,
/area/engine/atmos)
"bWh" = (
/obj/effect/turf_decal/sand,
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
/turf/open/floor/plasteel,
/area/chapel/office)
/area/hallway/primary/aft)
"bWi" = (
/obj/structure/flora/ausbushes/leafybush,
/obj/structure/flora/ausbushes/reedbush,
@@ -52824,6 +52858,9 @@
/turf/closed/wall/r_wall,
/area/science/lab)
"cCt" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
/turf/open/floor/plasteel/white,
/area/science/lab)
"cCB" = (
@@ -53058,6 +53095,9 @@
freq = 1400;
location = "Research Division"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel/dark,
/area/science/lab)
"cXW" = (
@@ -53151,10 +53191,6 @@
/area/maintenance/department/security/brig)
"dhz" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/chair{
dir = 8;
name = "Defense"
@@ -53163,9 +53199,6 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"dir" = (
@@ -53960,11 +53993,11 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
dir = 4
},
/obj/structure/cable{
icon_state = "1-8"
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
@@ -55488,6 +55521,12 @@
/obj/effect/turf_decal/tile/purple{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
/obj/structure/cable{
icon_state = "2-4"
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"ioj" = (
@@ -55591,6 +55630,9 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/structure/cable{
icon_state = "4-8"
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"iyg" = (
@@ -56345,9 +56387,13 @@
/turf/open/floor/plasteel/white,
/area/science/mixing)
"koz" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"kpK" = (
@@ -56634,10 +56680,14 @@
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
"kSb" = (
/obj/structure/lattice,
/obj/structure/grille,
/turf/open/space/basic,
/area/space)
/obj/structure/chair/office/light{
dir = 8
},
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
/turf/open/floor/plasteel/white,
/area/science/lab)
"kSF" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -56711,6 +56761,10 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/cable{
icon_state = "1-2"
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"lcU" = (
@@ -57121,6 +57175,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white,
/area/science/lab)
"meF" = (
@@ -57128,8 +57183,9 @@
/turf/closed/wall/r_wall,
/area/engine/supermatter)
"mfC" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/cable{
icon_state = "1-2"
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
@@ -59343,6 +59399,7 @@
/area/hallway/secondary/exit/departure_lounge)
"qVk" = (
/obj/machinery/door/poddoor/incinerator_atmos_aux,
/obj/structure/lattice/catwalk,
/turf/open/space/basic,
/area/maintenance/disposal/incinerator)
"qVP" = (
@@ -60493,6 +60550,9 @@
id = "research_shutters_2";
name = "research shutters"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/science/lab)
"tLP" = (
@@ -60815,12 +60875,6 @@
/obj/structure/disposalpipe/segment{
dir = 9
},
/obj/structure/cable{
icon_state = "1-8"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
},
/obj/structure/chair{
dir = 8;
name = "Defense"
@@ -61500,12 +61554,6 @@
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
"wfG" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/closed/wall/r_wall,
/area/crew_quarters/heads/hor)
"wfO" = (
/mob/living/simple_animal/hostile/retaliate/poison/snake,
/turf/open/floor/plating,
@@ -76969,7 +77017,7 @@ aaa
bOv
bNs
bNs
bWh
bQg
bQg
bQg
bQg
@@ -84176,7 +84224,7 @@ bIZ
cbb
bDi
ccO
bIZ
bva
cjm
cjm
xgh
@@ -84436,8 +84484,8 @@ bva
bva
aht
aht
kSb
kSb
fon
fon
aht
aht
mau
@@ -86691,7 +86739,7 @@ aXL
aYL
aZN
baW
aKI
afJ
aKI
beb
aKI
@@ -86947,8 +86995,8 @@ aVS
aXM
aVS
aVS
aXM
bbW
aVS
aVT
bbW
aVS
aVS
@@ -87149,7 +87197,7 @@ aaa
aaa
aaa
aaa
afJ
cFB
aby
aaa
agQ
@@ -87456,7 +87504,7 @@ aRJ
aSz
aSz
aUP
aVT
aVS
aWN
aXO
aYM
@@ -89468,7 +89516,7 @@ aaa
aaa
aaa
aaa
afJ
cFB
aaa
aaa
abI
@@ -94932,12 +94980,12 @@ jcT
xje
tTl
tTl
tTl
bWh
gkS
tTl
tTl
tTl
koz
tTl
dgg
phJ
phJ
@@ -95189,7 +95237,7 @@ bjm
mhn
cqi
cqi
cqi
koz
cqi
cqi
imE
@@ -95708,7 +95756,7 @@ duF
bxa
byE
bBp
wfG
bBp
bBp
bBp
bBp
@@ -95961,7 +96009,7 @@ cCl
brq
byF
cCt
byF
kSb
bxc
nIU
bAo
+2 -2
View File
@@ -2,7 +2,7 @@
#define APPROVAL_VOTING "APPROVAL"
#define SCHULZE_VOTING "SCHULZE"
#define SCORE_VOTING "SCORE"
#define MAJORITY_JUDGEMENT_VOTING "MAJORITY_JUDGEMENT"
#define HIGHEST_MEDIAN_VOTING "HIGHEST_MEDIAN"
#define INSTANT_RUNOFF_VOTING "IRV"
#define SHOW_RESULTS (1<<0)
@@ -18,7 +18,7 @@ GLOBAL_LIST_INIT(vote_type_names,list(\
"IRV (single winner ranked choice)" = INSTANT_RUNOFF_VOTING,\
"Schulze (ranked choice, higher result=better)" = SCHULZE_VOTING,\
"Raw Score (returns results from 0 to 1, winner is 1)" = SCORE_VOTING,\
"Majority Judgement (single-winner score voting)" = MAJORITY_JUDGEMENT_VOTING,\
"Highest Median (single-winner score voting)" = HIGHEST_MEDIAN_VOTING,\
))
GLOBAL_LIST_INIT(display_vote_settings, list(\
+1 -1
View File
@@ -271,7 +271,7 @@ Turf and target are separate in case you want to teleport some distance from a t
if(skip_mindless && (!M.mind && !M.ckey))
if(!isbot(M) && !iscameramob(M) && !ismegafauna(M))
continue
if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins
if(M.client?.holder?.fakekey && isobserver(M))
continue
var/name = avoid_assoc_duplicate_keys(M.name, namecounts)
+1 -1
View File
@@ -89,7 +89,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/effect/spawner/lootdrop/welder_tools = 3,
/obj/effect/spawner/lootdrop/low_tools = 5,
/obj/item/relic = 3,
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 2,
/obj/item/weaponcrafting/receiver = 2,
/obj/item/clothing/head/cone = 2,
/obj/item/grenade/smokebomb = 2,
/obj/item/geiger_counter = 3,
+29 -38
View File
@@ -141,8 +141,8 @@ SUBSYSTEM_DEF(vote)
choices[choices[i]]++ // higher shortest path = better candidate, so we add to choices here
// choices[choices[i]] is the schulze ranking, here, rather than raw vote numbers
/datum/controller/subsystem/vote/proc/calculate_majority_judgement_vote(var/blackbox_text)
// https://en.wikipedia.org/wiki/Majority_judgment
/datum/controller/subsystem/vote/proc/calculate_highest_median(var/blackbox_text)
// https://en.wikipedia.org/wiki/Highest_median_voting_rules
var/list/scores_by_choice = list()
for(var/choice in choices)
scores_by_choice += "[choice]"
@@ -161,33 +161,24 @@ SUBSYSTEM_DEF(vote)
// END BALLOT GATHERING
for(var/score_name in scores_by_choice)
var/list/score = scores_by_choice[score_name]
for(var/indiv_score in score)
SSblackbox.record_feedback("nested tally","voting",1,list(blackbox_text,"Scores",score_name,GLOB.vote_score_options[indiv_score]))
if(score.len == 0)
scores_by_choice -= score_name
while(scores_by_choice.len > 1)
var/highest_median = 0
for(var/score_name in scores_by_choice) // first get highest median
var/list/score = scores_by_choice[score_name]
if(!score.len)
scores_by_choice -= score_name
continue
if(!score.len)
choices[score_name] = 0
else
var/median = score[max(1,round(score.len/2))]
if(median >= highest_median)
highest_median = median
for(var/score_name in scores_by_choice) // then, remove
var/list/score = scores_by_choice[score_name]
var/median = score[max(1,round(score.len/2))]
if(median < highest_median)
scores_by_choice -= score_name
for(var/score_name in scores_by_choice) // after removals
var/list/score = scores_by_choice[score_name]
if(score.len == 0)
choices[score_name] += 100 // we're in a tie situation--just go with the first one
return
var/median_pos = max(1,round(score.len/2))
score.Cut(median_pos,median_pos+1)
choices[score_name]++
var/p = 0 // proponents (those with higher than median)
var/q = 0 // opponents (lower than median)
var/list/this_score_list = scores_by_choice[score_name]
for(var/indiv_score in score)
SSblackbox.record_feedback("nested tally","voting",1,list(blackbox_text,"Scores",score_name,GLOB.vote_score_options[indiv_score]))
if(indiv_score < median) // this is possible to do in O(logn) but n is never more than 200 so this is fine
q += 1
else if(indiv_score > median)
p += 1
p /= this_score_list.len
q /= this_score_list.len
choices[score_name] = median + (((p - q) / (1 - p - q)) * 0.5) // usual judgement
// choices[score_name] = median + p - q // typical judgement
// choices[score_name] = median + (((p - q) / (p + q)) * 0.5) // central judgement
/datum/controller/subsystem/vote/proc/calculate_scores(var/blackbox_text)
for(var/choice in choices)
@@ -245,8 +236,8 @@ SUBSYSTEM_DEF(vote)
calculate_condorcet_votes(vote_title_text)
if(vote_system == SCORE_VOTING)
calculate_scores(vote_title_text)
if(vote_system == MAJORITY_JUDGEMENT_VOTING)
calculate_majority_judgement_vote(vote_title_text) // nothing uses this at the moment
if(vote_system == HIGHEST_MEDIAN_VOTING)
calculate_highest_median(vote_title_text) // nothing uses this at the moment
var/list/winners = vote_system == INSTANT_RUNOFF_VOTING ? get_runoff_results() : get_result()
var/was_roundtype_vote = mode == "roundtype" || mode == "dynamic"
if(winners.len > 0)
@@ -255,8 +246,8 @@ SUBSYSTEM_DEF(vote)
if(display_votes & SHOW_RESULTS)
if(vote_system == SCHULZE_VOTING)
text += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!"
if(vote_system == MAJORITY_JUDGEMENT_VOTING)
text += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!"
if(vote_system == HIGHEST_MEDIAN_VOTING)
text += "\nThis is the highest median score plus the tiebreaker!"
for(var/i=1,i<=choices.len,i++)
var/votes = choices[choices[i]]
if(!votes)
@@ -302,7 +293,7 @@ SUBSYSTEM_DEF(vote)
if(vote_system != SCORE_VOTING)
if(vote_system == SCHULZE_VOTING)
admintext += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!"
else if(vote_system == MAJORITY_JUDGEMENT_VOTING)
else if(vote_system == HIGHEST_MEDIAN_VOTING)
admintext += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!"
for(var/i=1,i<=choices.len,i++)
var/votes = choices[choices[i]]
@@ -429,7 +420,7 @@ SUBSYSTEM_DEF(vote)
voted[usr.ckey] = list()
voted[usr.ckey] += vote
saved -= usr.ckey
if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING)
if(SCORE_VOTING,HIGHEST_MEDIAN_VOTING)
if(!(usr.ckey in voted))
voted += usr.ckey
voted[usr.ckey] = list()
@@ -584,7 +575,7 @@ SUBSYSTEM_DEF(vote)
. += "<h3>Vote any number of choices.</h3>"
if(SCHULZE_VOTING,INSTANT_RUNOFF_VOTING)
. += "<h3>Vote by order of preference. Revoting will demote to the bottom. 1 is your favorite, and higher numbers are worse.</h3>"
if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING)
if(SCORE_VOTING,HIGHEST_MEDIAN_VOTING)
. += "<h3>Grade the candidates by how much you like them.</h3>"
. += "<h3>No-votes have no power--your opinion is only heard if you vote!</h3>"
. += "Time Left: [DisplayTimeText(end_time-world.time)]<hr><ul>"
@@ -621,7 +612,7 @@ SUBSYSTEM_DEF(vote)
. += "(Saved!)"
. += "(<a href='?src=[REF(src)];vote=load'>Load vote from save</a>)"
. += "(<a href='?src=[REF(src)];vote=reset'>Reset votes</a>)"
if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING)
if(SCORE_VOTING,HIGHEST_MEDIAN_VOTING)
var/list/myvote = voted[C.ckey]
for(var/i=1,i<=choices.len,i++)
. += "<li><b>[choices[i]]</b>"
@@ -724,7 +715,7 @@ SUBSYSTEM_DEF(vote)
voted[usr.ckey] = SSpersistence.saved_votes[usr.ckey][mode]
if(islist(voted[usr.ckey]))
var/malformed = FALSE
if(vote_system == SCORE_VOTING || vote_system == MAJORITY_JUDGEMENT_VOTING)
if(vote_system == SCORE_VOTING || vote_system == HIGHEST_MEDIAN_VOTING)
for(var/thing in voted[usr.ckey])
if(!(thing in choices))
malformed = TRUE
@@ -738,7 +729,7 @@ SUBSYSTEM_DEF(vote)
to_chat(usr,"Your saved vote was malformed! Start over!")
voted -= usr.ckey
else
if(vote_system == SCORE_VOTING || vote_system == MAJORITY_JUDGEMENT_VOTING)
if(vote_system == SCORE_VOTING || vote_system == HIGHEST_MEDIAN_VOTING)
submit_vote(round(text2num(href_list["vote"])),round(text2num(href_list["score"])))
else
submit_vote(round(text2num(href_list["vote"])))
+6 -38
View File
@@ -2,6 +2,12 @@
/obj/item/weaponcrafting
icon = 'icons/obj/improvised.dmi'
/obj/item/weaponcrafting/receiver
name = "modular receiver"
desc = "A prototype modular receiver and trigger assembly for a firearm."
icon = 'icons/obj/improvised.dmi'
icon_state = "receiver"
/obj/item/weaponcrafting/stock
name = "rifle stock"
desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood."
@@ -12,41 +18,3 @@
name = "wound thread"
desc = "A long piece of thread with some resemblance to cable coil."
icon_state = "durastring"
////////////////////////////////
// IMPROVISED WEAPON PARTS//
////////////////////////////////
/obj/item/weaponcrafting/improvised_parts
name = "Debug Improvised Gun Part"
desc = "A badly coded gun part. You should report coders if you see this."
icon = 'icons/obj/guns/gun_parts.dmi'
icon_state = "palette"
// RECEIVERS
/obj/item/weaponcrafting/improvised_parts/rifle_receiver
name = "rifle receiver"
desc = "A crudely constructed receiver to create an improvised bolt-action breechloaded rifle." // removed some text implying that the item had more uses than it does
icon_state = "receiver_rifle"
w_class = WEIGHT_CLASS_SMALL
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver
name = "shotgun reciever"
desc = "An improvised receiver to create a break-action breechloaded shotgun." // removed some text implying that the item had more uses than it does
icon_state = "receiver_shotgun"
w_class = WEIGHT_CLASS_SMALL
// MISC
/obj/item/weaponcrafting/improvised_parts/trigger_assembly
name = "firearm trigger assembly"
desc = "A modular trigger assembly with a firing pin, this can be used to make a whole bunch of improvised firearss."
icon_state = "trigger_assembly"
w_class = WEIGHT_CLASS_SMALL
/obj/item/weaponcrafting/improvised_parts/wooden_body
name = "wooden firearm body"
desc = "A crudely fashioned wooden body to help keep higher calibre improvised weapons from blowing themselves apart."
icon_state = "wooden_body"
@@ -297,30 +297,15 @@
/datum/crafting_recipe/ishotgun
name = "Improvised Shotgun"
result = /obj/item/gun/ballistic/revolver/doublebarrel/improvised
reqs = list(/obj/item/pipe = 2, // putting a large amount of meaningless timegates by forcing people to turn base resources into upgraded resources kinda sucks
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 1,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
/obj/item/weaponcrafting/improvised_parts/wooden_body = 1,
/obj/item/weaponcrafting/stock = 1,
/obj/item/stack/packageWrap = 5)
tools = list(TOOL_SCREWDRIVER)
time = 100
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/irifle // larger and less versatile gun, but a bit easier to make
name = "Improvised Rifle (7.62mm)"
result = /obj/item/gun/ballistic/shotgun/boltaction/improvised
reqs = list(/obj/item/pipe = 2, // above
/obj/item/weaponcrafting/improvised_parts/rifle_receiver = 1,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
/obj/item/weaponcrafting/improvised_parts/wooden_body = 1,
reqs = list(/obj/item/pipe = 1,
/obj/item/weaponcrafting/receiver = 1,
/obj/item/weaponcrafting/stock = 1,
/obj/item/stack/packageWrap = 5)
tools = list(TOOL_SCREWDRIVER)
time = 100
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
//the Improvised Rifle will not be missed. Rest in Pieces 2019-2021
//////////////////
///AMMO CRAFTING//
@@ -449,38 +434,6 @@
// PARTS CRAFTING //
////////////////////
// RECEIVERS
/datum/crafting_recipe/rifle_receiver
name = "Improvised Rifle Receiver"
result = /obj/item/weaponcrafting/improvised_parts/rifle_receiver
reqs = list(/obj/item/stack/sheet/metal = 15)
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
time = 25
category = CAT_WEAPONRY
subcategory = CAT_PARTS
/datum/crafting_recipe/shotgun_receiver
name = "Improvised Shotgun Receiver"
result = /obj/item/weaponcrafting/improvised_parts/shotgun_receiver
reqs = list(/obj/item/stack/sheet/metal = 10) // shotgun does less damage than the rifle and can't 1shot but is more portable
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
time = 20
category = CAT_WEAPONRY
subcategory = CAT_PARTS
// MISC
/datum/crafting_recipe/trigger_assembly
name = "Trigger Assembly"
result = /obj/item/weaponcrafting/improvised_parts/trigger_assembly
reqs = list(/obj/item/stack/sheet/metal = 3,
/obj/item/assembly/igniter = 1)
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
time = 20
category = CAT_WEAPONRY
subcategory = CAT_PARTS
// BOKKEN CRAFTING
/datum/crafting_recipe/bokken_blade
@@ -664,9 +664,8 @@
lootcount = 1
spawn_on_turf = FALSE
loot = list("" = 50,
/obj/item/weaponcrafting/improvised_parts/rifle_receiver = 13,
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 13,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 12,
/obj/item/weaponcrafting/receiver = 25,
/obj/item/weaponcrafting/stock = 25,
)
/obj/effect/spawner/lootdrop/weapon_parts
@@ -674,8 +673,8 @@
lootcount = 1
spawn_on_turf = FALSE
loot = list("" = 80,
/obj/item/weaponcrafting/improvised_parts/rifle_receiver = 5,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 5,
/obj/item/weaponcrafting/receiver = 5,
/obj/item/weaponcrafting/stock = 5,
)
/obj/effect/spawner/lootdrop/ammo
@@ -263,6 +263,7 @@
/obj/machinery/vending/cola = "Robust Softdrinks",
/obj/machinery/vending/cigarette = "ShadyCigs Deluxe",
/obj/machinery/vending/games = "\improper Good Clean Fun",
/obj/machinery/vending/kink = "KinkMate",
/obj/machinery/vending/autodrobe = "AutoDrobe",
/obj/machinery/vending/assist = "\improper Vendomat",
/obj/machinery/vending/engivend = "\improper Engi-Vend",
+1
View File
@@ -803,6 +803,7 @@
force = 4
throwforce = 0
attack_verb = list("whipped", "repented", "lashed", "flagellated")
slot_flags = ITEM_SLOT_BELT
var/praying = FALSE
var/deity_name = "Coderbus" //This is the default, hopefully won't actually appear if the religion subsystem is running properly
+48
View File
@@ -476,3 +476,51 @@
return TRUE
to_chat(user, "<span class='warning'>You can't heal [M] with the \the [src]!</span>")
/obj/item/stack/medical/nanogel
name = "nanogel"
singular_name = "nanogel"
desc = "A highly advanced gel that when applied on a sufficiently repaired robotic limb will neutralize internal damage if present, allowing further repairs without the need for surgery."
self_delay = 150 //Agonizingly slow if used on self, but, not completely forbidden because antags with robolimbs need a way to handle their thresholds.
other_delay = 30 //Pretty fast if used on others.
amount = 12
max_amount = 12 //Two synths worth of fixing, if every single bodypart of them has internal damage. Usually, probably more like 6-12.
icon_state = "nanogel"
var/being_applied = FALSE //No doafter stacking.
/obj/item/stack/medical/nanogel/try_heal(mob/living/M, mob/user, silent = FALSE)
if(being_applied)
to_chat(user, "<span class='warning'>You are already applying [src]!</span>")
return
if(!iscarbon(M))
to_chat(user, "<span class='warning'>This won't work on [M]!</span>")
return
being_applied = TRUE
..()
being_applied = FALSE
/obj/item/stack/medical/nanogel/heal(mob/living/M, mob/user)
var/mob/living/carbon/C = M //Only carbons should be able to get here
if(!C)
return
var/obj/item/bodypart/affecting = C.get_bodypart(check_zone(user.zone_selected))
if(!affecting) //Missing limb?
to_chat(user, "<span class='warning'>[C] doesn't have \a [parse_zone(user.zone_selected)]!</span>")
return
if(!affecting.is_robotic_limb())
to_chat(user, "<span class='warning'>This won't work on nonrobotic limbs!</span>")
return
if(!affecting.threshhold_brute_passed && !affecting.threshhold_burn_passed)
to_chat(user, "<span class='warning'>There is no need to use this on [affecting]</span>")
return
if(affecting.threshhold_brute_passed && affecting.brute_dam == affecting.threshhold_passed_mindamage)
. = TRUE
affecting.threshhold_brute_passed = FALSE
if(affecting.threshhold_burn_passed && affecting.burn_dam == affecting.threshhold_passed_mindamage)
. = TRUE
affecting.threshhold_burn_passed = FALSE
if(.)
user.visible_message("<span class='green'>The nanogel gets to work on [C], repairing [affecting]'s internal damage.</span>", "<span_class='green'>You watch as the nanogel gets to work on fixing the internal damage in [affecting]</span>")
return
//If it gets here: It failed, lets tell the user why.
to_chat(user, "<span class='warning'>[src] fails to work on [affecting] due to residual [(affecting.threshhold_burn_passed && affecting.threshhold_burn_passed) ? "brute and burn" : "[affecting.threshhold_burn_passed ? "burn" : "brute"]"] damage! Perform some external repairs before using this.</span>")
@@ -246,7 +246,6 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new /datum/stack_recipe("pew (right)", /obj/structure/chair/pew/right, 3, one_per_turf = TRUE, on_floor = TRUE),\
)),
null, \
new/datum/stack_recipe("wooden firearm body", /obj/item/weaponcrafting/improvised_parts/wooden_body, 10, time = 20), \
new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 20), \
new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \
new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wood, 2, time = 30), \
@@ -391,7 +390,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("construction bag", /obj/item/storage/bag/construction, 4), \
null, \
new/datum/stack_recipe("string", /obj/item/weaponcrafting/string, 1, time = 10), \
new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6), \
new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 10), \
new/datum/stack_recipe("rag", /obj/item/reagent_containers/rag, 1), \
new/datum/stack_recipe("towel", /obj/item/reagent_containers/rag/towel, 3), \
new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \
+4 -4
View File
@@ -193,7 +193,7 @@
return FALSE
stunpwr *= round(stuncharge/hitcost, 0.1)
if(!user.UseStaminaBuffer(getweight(user, STAM_COST_BATON_MOB_MULT), warn = TRUE))
if(user && !user.UseStaminaBuffer(getweight(user, STAM_COST_BATON_MOB_MULT), warn = TRUE))
return FALSE
if(!disarming)
@@ -314,12 +314,12 @@
/obj/item/melee/baton/boomerang
name = "\improper OZtek Boomerang"
desc = "A device invented in 2486 for the great Space Emu War by the confederacy of Australicus, these high-tech boomerangs also work exceptionally well at stunning crewmembers. Just be careful to catch it when thrown!"
throw_speed = 1
throw_speed = 1.5
icon_state = "boomerang"
item_state = "boomerang"
force = 5
throwforce = 5
throw_range = 5
throw_range = 10
hitcost = 2000
throw_hit_chance = 99 //Have you prayed today?
custom_materials = list(/datum/material/iron = 10000, /datum/material/glass = 4000, /datum/material/silver = 10000, /datum/material/gold = 2000)
@@ -328,7 +328,7 @@
if(turned_on)
if(ishuman(thrower))
var/mob/living/carbon/human/H = thrower
H.throw_mode_off() //so they can catch it on the return.
H.throw_mode_on() //so they can catch it on the return.
return ..()
/obj/item/melee/baton/boomerang/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+2 -1
View File
@@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
var/endspanpart = "</span>"
//Message
var/messagepart = " <span class='message'>[say_emphasis(lang_treat(speaker, message_language, raw_message, spans, message_mode))]</span></span>"
var/messagepart = " <span class='message'>[lang_treat(speaker, message_language, raw_message, spans, message_mode)]</span></span>"
var/languageicon = ""
var/datum/language/D = GLOB.language_datum_instances[message_language]
@@ -116,6 +116,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
/atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, message_mode, no_quote = FALSE)
if(has_language(language))
var/atom/movable/AM = speaker.GetSource()
raw_message = say_emphasis(raw_message)
if(AM) //Basically means "if the speaker is virtual"
return no_quote ? AM.quoteless_say_quote(raw_message, spans, message_mode) : AM.say_quote(raw_message, spans, message_mode)
else
@@ -69,6 +69,7 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear))
build_path = /obj/item/abductor_machine_beacon/chem_dispenser
category = "Advanced Gear"
/*
/datum/abductor_gear/shrink_ray
name = "Shrink Ray Blaster"
description = "This is a piece of frightening alien tech that enhances the magnetic pull of atoms in a localized space to temporarily make an object shrink. \
@@ -77,3 +78,4 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear))
cost = 2
build_path = /obj/item/gun/energy/shrink_ray
category = "Advanced Gear"
*/
+1
View File
@@ -123,6 +123,7 @@ obj/item/dildo/flared/huge
desc = "THIS THING IS HUGE!"
dildo_size = 4
force = 10
hitsound = 'sound/weapons/klonk.ogg'
obj/item/dildo/custom
name = "customizable dildo"
+6 -1
View File
@@ -55,7 +55,7 @@
/obj/item/clothing/suit/toggle/labcoat/virologist
name = "virologist labcoat"
desc = "A suit that protects against minor chemical spills. Offers slightly more protection against biohazards than the standard model. Has a green stripe on the shoulder."
desc = "A suit that protects against minor chemical spills. Has a green stripe on the shoulder."
icon_state = "labcoat_vir"
/obj/item/clothing/suit/toggle/labcoat/science
@@ -63,6 +63,11 @@
desc = "A suit that protects against minor chemical spills. Has a purple stripe on the shoulder."
icon_state = "labcoat_tox"
/obj/item/clothing/suit/toggle/labcoat/roboticist
name = "roboticist labcoat"
desc = "More like an eccentric coat than a labcoat. Helps pass off bloodstains as part of the aesthetic. Comes with red shoulder pads."
icon_state = "labcoat_robo"
// Departmental Jackets
/obj/item/clothing/suit/toggle/labcoat/depjacket
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
+8
View File
@@ -58,6 +58,11 @@
RemoveHood()
/obj/item/clothing/suit/hooded/proc/ToggleHood()
if(!hood)
to_chat(loc, "<span class='warning'>[src] seems to be missing its hood..</span>")
return
hood.atom_colours = atom_colours.Copy()
hood.update_atom_colour()
if(!suittoggled)
if(ishuman(src.loc))
var/mob/living/carbon/human/H = src.loc
@@ -191,7 +196,10 @@
if(!helmettype)
return
if(!helmet)
to_chat(H, "<span class='warning'>[src] seems to be missing its helmet..</span>")
return
helmet.atom_colours = atom_colours.Copy()
helmet.update_atom_colour()
if(!suittoggled)
if(ishuman(src.loc))
if(H.wear_suit != src)
@@ -596,7 +596,7 @@
name = "Buzz Fuzz"
desc = "The sister drink of Shambler's Juice! Uses real honey, making it a sweet tooth's dream drink. The slogan reads ''A Hive of Flavour'', there's also a label about how it is adddicting."
icon_state = "honeysoda_can"
list_reagents = list(/datum/reagent/consumable/buzz_fuzz = 25, /datum/reagent/consumable/honey = 5)
list_reagents = list(/datum/reagent/consumable/buzz_fuzz = 30)
foodtype = SUGAR | JUNKFOOD
/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull
@@ -117,7 +117,7 @@
/obj/item/weldingtool = 3,
/obj/item/wirecutters = 2,
/obj/item/wrench = 4,
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 1,
/obj/item/weaponcrafting/receiver = 1,
/obj/item/geiger_counter = 3,
/obj/item/reagent_containers/food/snacks/grown/citrus/orange = 5,
/obj/item/assembly/infra = 1,
+1 -1
View File
@@ -32,7 +32,7 @@
l_pocket = /obj/item/pda/roboticist
ears = /obj/item/radio/headset/headset_sci
uniform = /obj/item/clothing/under/rank/rnd/roboticist
suit = /obj/item/clothing/suit/toggle/labcoat
suit = /obj/item/clothing/suit/toggle/labcoat/roboticist
backpack = /obj/item/storage/backpack/science
satchel = /obj/item/storage/backpack/satchel/tox
@@ -304,10 +304,16 @@
emote("wag")
else if(check_zone(M.zone_selected) == BODY_ZONE_R_ARM || check_zone(M.zone_selected) == BODY_ZONE_L_ARM)
M.visible_message( \
"<span class='notice'>[M] shakes [src]'s hand.</span>", \
"<span class='notice'>You shake [src]'s hand.</span>", target = src,
target_message = "<span class='notice'>[M] shakes your hand.</span>")
if((pulling == M) && (grab_state == GRAB_PASSIVE))
M.visible_message( \
"<span class='notice'>[M] squeezes [src]'s hand.</span>", \
"<span class='notice'>You squeeze [src]'s hand.</span>", target = src,
target_message = "<span class='notice'>[M] squeezes your hand.</span>")
else
M.visible_message( \
"<span class='notice'>[M] shakes [src]'s hand.</span>", \
"<span class='notice'>You shake [src]'s hand.</span>", target = src,
target_message = "<span class='notice'>[M] shakes your hand.</span>")
else
M.visible_message("<span class='notice'>[M] hugs [src] to make [p_them()] feel better!</span>", \
@@ -426,6 +426,10 @@
//Misc
.["Cyborg - Misc (dog - blade)"] = process_holoform_icon_filter(icon('modular_citadel/icons/mob/widerobot.dmi', "blade"), HOLOFORM_FILTER_PAI, FALSE)
// Gorillas
.["Gorilla (standing)"] = process_holoform_icon_filter(icon('icons/mob/gorilla.dmi', "standing"), HOLOFORM_FILTER_PAI, FALSE)
.["Gorilla (crawling)"] = process_holoform_icon_filter(icon('icons/mob/gorilla.dmi', "crawling"), HOLOFORM_FILTER_PAI, FALSE)
/mob/living/silicon/pai/proc/default_chassis_pixel_offsets_x()
. = list()
//Engi
@@ -94,16 +94,17 @@
consume_bait()
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/proc/consume_bait()
var/obj/item/stack/ore/diamond/diamonds = locate(/obj/item/stack/ore/diamond) in oview(src, 9)
var/obj/item/pen/survival/bait = locate(/obj/item/pen/survival) in oview(src, 9)
if(!diamonds && !bait)
return
var/list/L = list()
for(var/obj/O in view(src, 9))
L += O
var/obj/item/stack/ore/diamond/diamonds = locate(/obj/item/stack/ore/diamond) in L
if(diamonds)
var/distanced = 0
distanced = get_dist(loc,diamonds.loc)
if(distanced <= 1 && diamonds)
qdel(diamonds)
src.visible_message("<span class='notice'>[src] consumes [diamonds], and it disappears! ...At least, you think.</span>")
var/obj/item/pen/survival/bait = locate(/obj/item/pen/survival) in L
if(bait)
var/distanceb = 0
distanceb = get_dist(loc,bait.loc)
@@ -373,7 +373,6 @@
sawn_off = TRUE
slot_flags = ITEM_SLOT_BELT
/obj/item/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course.
clumsy_check = 0
@@ -318,7 +318,7 @@
pump()
return TRUE
// DOUBLE BARRELED SHOTGUN and IMPROVISED SHOTGUN are in revolver.dm
//due to code weirdness, and the fact that a refactor is coming soon anyway, the barman's shotgun and maint shotgun are in revolver.dm
/obj/item/gun/ballistic/shotgun/doublebarrel/hook
name = "hook modified sawn-off shotgun"
+47 -14
View File
@@ -173,18 +173,60 @@
force = 15
ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv)
//Sci guns
/obj/item/gun/energy/gravity_gun
name = "one-point gravitational manipulator"
desc = "An experimental, multi-mode device that fires bolts of Zero-Point Energy, causing local distortions in gravity. Requires an anomaly core to function."
ammo_type = list(/obj/item/ammo_casing/energy/gravity/repulse, /obj/item/ammo_casing/energy/gravity/attract, /obj/item/ammo_casing/energy/gravity/chaos)
item_state = "gravity_gun"
icon_state = "gravity_gun"
var/power = 4
var/firing_core = FALSE
/obj/item/gun/energy/gravity_gun/attackby(obj/item/C, mob/user)
if(istype(C, /obj/item/assembly/signaler/anomaly))
to_chat(user, "<span class='notice'>You insert [C] into the gravitational manipulator and the weapon gently hums to life.</span>")
firing_core = TRUE
playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
qdel(C)
return
return ..()
/obj/item/gun/energy/gravity_gun/can_shoot()
if(!firing_core)
return FALSE
return ..()
/obj/item/gun/energy/wormhole_projector
name = "bluespace wormhole projector"
desc = "A projector that emits high density quantum-coupled bluespace beams."
desc = "A projector that emits high density quantum-coupled bluespace beams. Requires an anomaly core to function."
ammo_type = list(/obj/item/ammo_casing/energy/wormhole, /obj/item/ammo_casing/energy/wormhole/orange)
item_state = null
icon_state = "wormhole_projector"
pin = null
inaccuracy_modifier = 0.25
automatic_charge_overlays = FALSE
var/obj/effect/portal/p_blue
var/obj/effect/portal/p_orange
var/atmos_link = FALSE
var/firing_core = FALSE
/obj/item/gun/energy/wormhole_projector/attackby(obj/item/C, mob/user)
if(istype(C, /obj/item/assembly/signaler/anomaly))
to_chat(user, "<span class='notice'>You insert [C] into the wormhole projector and the weapon gently hums to life.</span>")
firing_core = TRUE
playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
qdel(C)
return
/obj/item/gun/energy/wormhole_projector/can_shoot()
if(!firing_core)
return FALSE
return ..()
/obj/item/gun/energy/wormhole_projector/shoot_with_empty_chamber(mob/living/user)
. = ..()
to_chat(user, "<span class='danger'>The display says, 'NO CORE INSTALLED'.</span>")
/obj/item/gun/energy/wormhole_projector/update_icon_state()
icon_state = "[initial(icon_state)][current_firemode_index]"
@@ -243,6 +285,9 @@
p_blue = P
crosslink()
/obj/item/gun/energy/wormhole_projector/core_inserted
firing_core = TRUE
/* 3d printer 'pseudo guns' for borgs */
/obj/item/gun/energy/printer
@@ -298,18 +343,6 @@
/obj/item/gun/energy/laser/instakill/emp_act() //implying you could stop the instagib
return
/obj/item/gun/energy/gravity_gun
name = "one-point bluespace-gravitational manipulator"
desc = "An experimental, multi-mode device that fires bolts of Zero-Point Energy, causing local distortions in gravity."
ammo_type = list(/obj/item/ammo_casing/energy/gravity/repulse, /obj/item/ammo_casing/energy/gravity/attract, /obj/item/ammo_casing/energy/gravity/chaos)
item_state = "gravity_gun"
icon_state = "gravity_gun"
pin = null
var/power = 4
/obj/item/gun/energy/gravity_gun/security
pin = /obj/item/firing_pin
//Emitter Gun
/obj/item/gun/energy/emitter
@@ -20,8 +20,9 @@
newcasing.modified = modified
var/obj/item/projectile/bullet/reusable/foam_dart/newdart = newcasing.BB
newdart.modified = modified
newdart.damage = damage
newdart.nodamage = nodamage
if(modified)
newdart.damage = 5
newdart.nodamage = FALSE
newdart.damage_type = damage_type
if(pen)
newdart.pen = pen
@@ -625,8 +625,9 @@
myseed.adjust_potency(round(chems.get_reagent_amount(src.type) * 0.5))
/datum/reagent/consumable/buzz_fuzz/on_mob_life(mob/living/carbon/M)
M.reagents.add_reagent(/datum/reagent/consumable/sugar,1)
if(prob(5))
if(prob(33))
M.reagents.add_reagent(/datum/reagent/consumable/sugar,1)
if(prob(1))
M.reagents.add_reagent(/datum/reagent/consumable/honey,1)
..()
@@ -1125,7 +1125,7 @@
/datum/reagent/space_cleaner/sterilizine/reaction_obj(obj/O, reac_volume)
if(istype(O, /obj/item/stack/medical/gauze))
var/obj/item/stack/medical/gauze/G = O
reac_volume = min((reac_volume / 10), G.amount)
reac_volume = min((reac_volume / 5), G.amount)
new /obj/item/stack/medical/gauze/adv(get_turf(G), reac_volume)
G.use(reac_volume)
@@ -74,12 +74,12 @@
build_path = /obj/item/restraints/handcuffs
category = list("hacked", "Security")
/datum/design/rifle_receiver
name = "Rifle Receiver"
id = "rifle_receiver"
/datum/design/reciever
name = "Modular Receiver"
id = "modular_receiver"
build_type = AUTOLATHE
materials = list(/datum/material/iron = 24000)
build_path = /obj/item/weaponcrafting/improvised_parts/rifle_receiver
build_path = /obj/item/weaponcrafting/receiver
category = list("hacked", "Security")
/datum/design/shotgun_slug
@@ -282,10 +282,3 @@
build_path = /obj/item/vending_refill/custom
category = list("initial", "Misc")
/datum/design/trigger_assembly
name = "Trigger Assembly"
id = "trigger_assembly"
build_type = AUTOLATHE
materials = list(/datum/material/iron = 6500, /datum/material/glass = 50)
build_path = /obj/item/weaponcrafting/improvised_parts/trigger_assembly
category = list("initial", "Misc")
@@ -9,6 +9,8 @@
invocation_type = "shout"
level_max = 0
cooldown_min = 100
action_icon = 'icons/obj/magic.dmi'
action_icon_state = "iconmantra"
/obj/effect/proc_holder/spell/self/mantra/cast(mob/living/carbon/human/user)
if(user.has_status_effect(STATUS_EFFECT_MANTRA))
@@ -27,6 +29,8 @@
invocation_type = "shout"
level_max = 0
cooldown_min = 100
action_icon = 'icons/obj/magic.dmi'
action_icon_state = "iconasura"
/obj/effect/proc_holder/spell/self/asura/cast(mob/living/carbon/human/user)
if(user.has_status_effect(STATUS_EFFECT_ASURA))
@@ -297,6 +297,7 @@
owner.update_stamina()
consider_processing()
update_disabled()
update_threshhold_state()
return update_bodypart_damage_state()
/// Allows us to roll for and apply a wound without actually dealing damage. Used for aggregate wounding power with pellet clouds
@@ -475,6 +476,7 @@
owner.updatehealth()
consider_processing()
update_disabled()
update_threshhold_state()
return update_bodypart_damage_state()
//Returns total damage.
-1
View File
@@ -2,7 +2,6 @@
name = "KinkMate"
desc = "A vending machine for all your unmentionable desires."
icon_state = "kink"
circuit = /obj/item/circuitboard/machine/kinkmate
product_slogans = "Kinky!;Sexy!;Check me out, big boy!"
vend_reply = "Have fun, you shameless pervert!"
products = list(
+2 -1
View File
@@ -34,7 +34,8 @@
/obj/item/healthanalyzer/wound = 4,
/obj/item/stack/medical/ointment = 2,
/obj/item/stack/medical/suture = 2,
/obj/item/stack/medical/bone_gel = 4)
/obj/item/stack/medical/bone_gel = 4,
/obj/item/stack/medical/nanogel = 4)
contraband = list(/obj/item/reagent_containers/pill/tox = 3,
/obj/item/reagent_containers/pill/morphine = 4,
/obj/item/reagent_containers/pill/charcoal = 6)
+1
View File
@@ -13,6 +13,7 @@
/obj/item/reagent_containers/medspray/sterilizine = 1,
/obj/item/healthanalyzer/wound = 2,
/obj/item/stack/medical/bone_gel = 2,
/obj/item/stack/medical/nanogel = 2,
/obj/item/reagent_containers/syringe/dart = 10)
contraband = list(/obj/item/reagent_containers/pill/tox = 2,
/obj/item/reagent_containers/pill/morphine = 2)
+2 -1
View File
@@ -17,7 +17,8 @@
/obj/item/tank/internals/anesthetic = 2,
/obj/item/clothing/mask/breath/medical = 5,
/obj/item/screwdriver = 5,
/obj/item/crowbar = 5)
/obj/item/crowbar = 6,
/obj/item/stack/medical/nanogel = 5)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
default_price = PRICE_EXPENSIVE
+1 -1
View File
@@ -212,7 +212,7 @@
/obj/item/clothing/under/rank/rnd/roboticist/sleek = 3,
/obj/item/clothing/under/rank/rnd/roboticist/skirt = 3,
/obj/item/clothing/suit/hooded/wintercoat/robotics = 3,
/obj/item/clothing/suit/toggle/labcoat = 3,
/obj/item/clothing/suit/toggle/labcoat/roboticist = 3,
/obj/item/clothing/shoes/sneakers/black = 3,
/obj/item/clothing/gloves/fingerless = 3,
/obj/item/clothing/head/soft/black = 3,
+4
View File
@@ -359,6 +359,10 @@
if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.vore_flags & LICKABLE)) || !Adjacent(tasted) || incapacitated(ignore_restraints = TRUE))
return
if(ishuman(tasted))
var/mob/living/carbon/human/H = tasted
H.wash_cream()
visible_message("<span class='warning'>[src] licks [tasted]!</span>","<span class='notice'>You lick [tasted]. They taste rather like [tasted.get_taste_message()].</span>","<b>Slurp!</b>")
/mob/living/proc/get_taste_message(allow_generic = TRUE, datum/species/mrace)
+2 -2
View File
@@ -25,5 +25,5 @@ RESPAWN_MINIMUM_DELAY_ROUNDSTART 30.0
## Gamemode (config tags!) banlist for respawn
RESPAWN_CHAOS_GAMEMODES WIZARD
RESPAWN_CHAOS_GAMEMODES NUCLEAR
RESPAWN_CHAOS_GAMEMODES CLONWOPS
RESPAWN_CHOAS_GAMEMODES REVOLUTION
RESPAWN_CHAOS_GAMEMODES CLOWNOPS
RESPAWN_CHAOS_GAMEMODES REVOLUTION
@@ -0,0 +1,4 @@
author: "necromanceranne"
delete-after: True
changes:
- rscadd: "Adds new roboticist labcoat sprites!"
@@ -0,0 +1,4 @@
author: "HeroWithYay"
delete-after: True
changes:
- tweak: "Wormhole Projector and Gravity Gun now require anomaly cores to function instead of firing pins."
@@ -0,0 +1,4 @@
author: "Putnam3145"
delete-after: True
changes:
- tweak: "Replaces majority judgement with usual judgement."
@@ -0,0 +1,4 @@
author: "DeltaFire15"
delete-after: True
changes:
- rscadd: "Nanogel, available at medical and robotics, which fixes internal damage in sufficiently repaired robotic limbs."
@@ -0,0 +1,4 @@
author: "LetterN"
delete-after: True
changes:
- bugfix: "fixed telecomms pda log"
@@ -0,0 +1,4 @@
author: "kiwedespars"
delete-after: True
changes:
- rscadd: "the robust dildo weapon now has sound."
@@ -0,0 +1,4 @@
author: "timothyteakettle"
delete-after: True
changes:
- rscadd: "licking people washes pie off their face"
@@ -0,0 +1,4 @@
author: "corin9090"
delete-after: True
changes:
- tweak: "The chaplain's prayer beads can now be worn on your belt slot"
@@ -0,0 +1,4 @@
author: "MrJWhit"
delete-after: True
changes:
- tweak: "Updates suit storage info on Tip Of the Round."
@@ -0,0 +1,5 @@
author: "TheObserver"
delete-after: True
changes:
- rscadd: "Re-adds the rifle stock, and sets the improv shotgun to be as it was."
- rscdel: "The maintenance rifle has been shelved - for now. Watch this space."
@@ -0,0 +1,4 @@
author: "BlueWildrose"
delete-after: True
changes:
- tweak: "No more straining when your cock or breasts are growing via incubus draft or succubus milk."
@@ -0,0 +1,4 @@
author: "Hatterhat"
delete-after: True
changes:
- rscdel: "Apparently, shrink rays were buyable again, despite a PR having been made a while ago specifically for removing shrink rays. They're gone again."
@@ -0,0 +1,5 @@
author: "Hatterhat"
delete-after: True
changes:
- tweak: "Improvised gauzes can now be crafted in stacks up to 10, like their maximum stacksize implies they should be capable of doing."
- bugfix: "Pouring sterilizine on gauze now takes the proper 5u per sterilized gauze instead of 10u."
@@ -0,0 +1,4 @@
author: "kappa-sama"
delete-after: True
changes:
- bugfix: "super saiyan"
@@ -0,0 +1,4 @@
author: "MrJWhit"
delete-after: True
changes:
- tweak: "A small bucket of random fixes,"
@@ -0,0 +1,4 @@
author: "YakumoChen"
delete-after: True
changes:
- balance: "To lower production costs, Buzz Fuzz is now manufactured with Real™️ Synthetic honey."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 460 KiB

After

Width:  |  Height:  |  Size: 444 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 KiB

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 51 KiB

@@ -30,7 +30,6 @@
inverse_chem = /datum/reagent/fermi/BEsmaller //At really impure vols, it just becomes 100% inverse
can_synth = FALSE
value = REAGENT_VALUE_VERY_RARE
var/message_spam = FALSE
/datum/reagent/fermi/breast_enlarger/on_mob_metabolize(mob/living/M)
. = ..()
@@ -81,16 +80,7 @@
H.reagents.remove_reagent(type, 5)
B.Insert(H)
//If they have them, increase size. If size is comically big, limit movement and rip clothes.
B.modify_size(0.05)
if (ISINRANGE_EX(B.cached_size, 8.5, 9) && (H.w_uniform || H.wear_suit))
var/target = H.get_bodypart(BODY_ZONE_CHEST)
if(!message_spam)
to_chat(H, "<span class='danger'>Your breasts begin to strain against your clothes tightly!</b></span>")
message_spam = TRUE
H.adjustOxyLoss(5, 0)
H.apply_damage(1, BRUTE, target)
return ..()
/datum/reagent/fermi/breast_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders.
@@ -189,7 +179,6 @@
inverse_chem = /datum/reagent/fermi/PEsmaller //At really impure vols, it just becomes 100% inverse and shrinks instead.
can_synth = FALSE
value = REAGENT_VALUE_VERY_RARE
var/message_spam = FALSE
/datum/reagent/fermi/penis_enlarger/on_mob_metabolize(mob/living/M)
. = ..()
@@ -232,14 +221,6 @@
P.Insert(H)
P.modify_size(0.1)
var/max_D = CONFIG_GET(number/penis_max_inches_prefs)
if (ISINRANGE_EX(P.length, max_D + 0.5, max_D + 1) && (H.w_uniform || H.wear_suit))
var/target = H.get_bodypart(BODY_ZONE_CHEST)
if(!message_spam)
to_chat(H, "<span class='danger'>Your cock begin to strain against your clothes tightly!</b></span>")
message_spam = TRUE
H.apply_damage(2.5, BRUTE, target)
return ..()
/datum/reagent/fermi/penis_enlarger/overdose_process(mob/living/carbon/human/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders.
+1 -1
View File
@@ -295,7 +295,7 @@ In a pinch, stripping yourself naked will give you a sizeable resistance to bein
Wearing riot armor makes you significantly more effective at performing tackle takedowns, but will use extra stamina with each leap! It will also significantly protect you from other tackles!
Epipens contain a powerful coagulant that drastically reduces bleeding on all bleeding wounds. If you don't have time to properly treat someone with lots of slashes or piercings, stick them with a pen to buy some time!
Anything you can light a cigarette with, you can use to cauterize a bleeding wound. Technically, that includes the supermatter.
Suit storage units entirely purge radiation from any carbon mob put inside of them when cycling, at the cost of some horrific burns, this is a very effective strategy to clean someone up after they bathed in the engine.
Suit storage units, when hacked, entirely purge radiation from any carbon mob put inside of them when cycling, at the cost of some horrific burns, this is a very effective strategy to clean someone up after they bathed in the engine.
Laser pointers can be upgraded by replacing its micro laser with a better one from RnD! Use a screwdriver on it to remove the old laser. Upgrading the laser pointer gives you better odds of stunning a cyborg, and even blinding people with sunglasses.
Being out of combat mode makes makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by resting.
Resting makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by being out of combat mode.
@@ -365,9 +365,9 @@ export const TeleLogs = (props, context) => {
);
};
export const CustomMsg = context => {
export const CustomMsg = (props, context) => {
const { act, data } = useBackend(context);
const fake_message = data.fake_message || {
const fake_message = data.fake_message !== {} ? data.fake_message : {
'sender': 'System Administrator',
'job': 'Admin',
'recepient': null,
File diff suppressed because one or more lines are too long
+15 -21
View File
@@ -1702,12 +1702,12 @@ __metadata:
languageName: node
linkType: hard
"axios@npm:^0.19.2":
version: 0.19.2
resolution: "axios@npm:0.19.2"
"axios@npm:^0.21.1":
version: 0.21.1
resolution: "axios@npm:0.21.1"
dependencies:
follow-redirects: 1.5.10
checksum: bad346deea24050f9953ce09bb8015f85a99a7b8f016806adccfab0b8981827d1fbee9c77c0ef7c70cc48392c1af6bbc65e07c3e88221d17282d2d5fd0a191f6
follow-redirects: ^1.10.0
checksum: 864fb7b5d077d236737f10adca53bf451a93f35a15271f56fba8da07265a02d26b7d881b935a6697dc6adb0549ea3e56d2eecb403edaa3bb78f6479901c10f69
languageName: node
linkType: hard
@@ -2872,15 +2872,6 @@ __metadata:
languageName: node
linkType: hard
"debug@npm:=3.1.0":
version: 3.1.0
resolution: "debug@npm:3.1.0"
dependencies:
ms: 2.0.0
checksum: 1295acd5e0531761255661d325cd0a80ac8c5f6de8942a53bb23c2197ccb97526972de662ed0e5d9393be83f3428a298a6e7185ecb02f0da6282019cd2ffb4a8
languageName: node
linkType: hard
"debug@npm:^4.0.1, debug@npm:^4.1.0":
version: 4.1.1
resolution: "debug@npm:4.1.1"
@@ -3796,12 +3787,15 @@ __metadata:
languageName: node
linkType: hard
"follow-redirects@npm:1.5.10":
version: 1.5.10
resolution: "follow-redirects@npm:1.5.10"
dependencies:
debug: =3.1.0
checksum: 6e58e02c31337b6b41ffc3d5f3d49920b7db428eddcf374537da00ef121fe473983e12d8557f4304287604168d3efcc288d1f009abaf4c9d61e5db0c0cee3c4a
"follow-redirects@npm:^1.10.0":
version: 1.13.1
resolution: "follow-redirects@npm:1.13.1"
peerDependencies:
debug: "*"
peerDependenciesMeta:
debug:
optional: true
checksum: c7c6c905876b939af04a1b27afa70e9c0ab5015d96f5ee49dd80db6952dc8c960b96a229647504468615d8a1a400da9bec9449e2aea9f9c6da6fdca0ba17d4c2
languageName: node
linkType: hard
@@ -8078,7 +8072,7 @@ fsevents@~2.1.2:
version: 0.0.0-use.local
resolution: "tgui-dev-server@workspace:packages/tgui-dev-server"
dependencies:
axios: ^0.19.2
axios: ^0.21.1
common: "workspace:*"
esm: ^3.2.25
glob: ^7.1.4