Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into zandario-sound-overhaul

This commit is contained in:
Zandario
2019-03-29 14:28:31 -05:00
137 changed files with 1657 additions and 297 deletions
+11 -1
View File
@@ -64,12 +64,17 @@
/obj/structure/chair{
dir = 4
},
/obj/item/clothing/under/polychromic/shirt,
/obj/item/clothing/neck/tie/black,
/obj/item/clothing/shoes/laceup,
/obj/item/storage/wallet/random,
/obj/item/clothing/gloves/color/white,
/obj/effect/decal/remains/human,
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/powered/dinner_for_two)
"n" = (
/obj/structure/table,
/obj/item/candle{
/obj/item/candle/infinite{
pixel_y = 5
},
/obj/item/trash/plate{
@@ -84,6 +89,11 @@
/obj/structure/chair{
dir = 8
},
/obj/item/clothing/under/polychromic/skirt,
/obj/item/clothing/shoes/laceup,
/obj/item/clothing/gloves/color/white,
/obj/item/clothing/glasses/regular,
/obj/item/lipstick/random,
/obj/effect/decal/remains/human,
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/powered/dinner_for_two)
@@ -350,6 +350,7 @@
dir = 4
},
/obj/structure/closet/cabinet,
/obj/item/pda/neko,
/obj/item/gps{
gpstag = "kitty"
},
+3 -3
View File
@@ -4696,7 +4696,7 @@
},
/area/abductor_ship)
"lI" = (
/turf/open/space/transit,
/turf/open/space/transit/centcom,
/area/space)
"lJ" = (
/obj/machinery/door/airlock/centcom{
@@ -20511,7 +20511,7 @@ fX
fX
fX
fX
fY
fX
fX
fX
fX
@@ -21282,7 +21282,7 @@ fX
fX
fX
fX
fX
fY
fX
fX
fX
+35 -33
View File
@@ -91,6 +91,40 @@
"aj" = (
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/shuttle/pirate)
"ak" = (
/obj/machinery/airalarm/all_access{
dir = 4;
pixel_x = -24
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/small{
dir = 8
},
/obj/structure/closet/secure_closet/freezer{
locked = 0;
name = "fridge"
},
/obj/item/storage/box/donkpockets{
pixel_x = 2;
pixel_y = 3
},
/obj/item/storage/box/donkpockets,
/obj/item/storage/fancy/donut_box,
/obj/item/reagent_containers/food/snacks/cookie,
/obj/item/reagent_containers/food/snacks/cookie{
pixel_x = -6;
pixel_y = -6
},
/obj/item/reagent_containers/food/snacks/chocolatebar,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
},
/obj/item/reagent_containers/food/condiment/milk,
/obj/item/reagent_containers/food/condiment/milk,
/turf/open/floor/plasteel,
/area/shuttle/pirate)
"al" = (
/obj/machinery/loot_locator,
/obj/effect/decal/cleanable/dirt,
@@ -622,38 +656,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/shuttle/pirate)
"bw" = (
/obj/machinery/airalarm/all_access{
dir = 4;
pixel_x = -24
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/small{
dir = 8
},
/obj/structure/closet/secure_closet/freezer{
locked = 0;
name = "fridge"
},
/obj/item/storage/box/donkpockets{
pixel_x = 2;
pixel_y = 3
},
/obj/item/storage/box/donkpockets,
/obj/item/storage/fancy/donut_box,
/obj/item/reagent_containers/food/snacks/cookie,
/obj/item/reagent_containers/food/snacks/cookie{
pixel_x = -6;
pixel_y = -6
},
/obj/item/reagent_containers/food/snacks/chocolatebar,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
},
/turf/open/floor/plasteel,
/area/shuttle/pirate)
"bx" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -1207,7 +1209,7 @@ eA
aa
ap
aw
bw
ak
bF
aj
aj
+14
View File
@@ -97,6 +97,20 @@
//the define for visible message range in combat
#define COMBAT_MESSAGE_RANGE 3
//Shove knockdown lengths (deciseconds)
#define SHOVE_KNOCKDOWN_SOLID 30
#define SHOVE_KNOCKDOWN_HUMAN 30
#define SHOVE_KNOCKDOWN_TABLE 30
#define SHOVE_KNOCKDOWN_COLLATERAL 10
//Shove slowdown
#define SHOVE_SLOWDOWN_ID "shove_slowdown"
#define SHOVE_SLOWDOWN_LENGTH 30
#define SHOVE_SLOWDOWN_STRENGTH 0.85 //multiplier
//Shove disarming item list
GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
/obj/item/gun)))
//Combat object defines
//Embedded objects
+1
View File
@@ -25,6 +25,7 @@
#define NOBLUDGEON (1<<7) // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
#define NODROP (1<<8) // This flag makes it so that an item literally cannot be removed at all, or at least that's how it should be. Only deleted.
#define ABSTRACT (1<<9) // for all things that are technically items but used for various different stuff
#define IMMUTABLE_SLOW (1<<10) //When players should not be able to change the slowdown of the item (Speed potions, ect)
// Flags for the clothing_flags var on /obj/item/clothing
-34
View File
@@ -90,10 +90,6 @@ GLOBAL_LIST_INIT(dildo_colors, list(//mostly neon colors
"Purple" = "#e300ff"//purple
))
//Looc stuff
GLOBAL_VAR_INIT(looc_allowed, 1)
GLOBAL_VAR_INIT(dlooc_allowed, 1)
//Crew objective and miscreants stuff
GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
@@ -124,36 +120,6 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
src << "You will [(prefs.chat_toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel."
SSblackbox.record_feedback("tally", "admin_verb", 1, "TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/togglelooc()
set category = "Server"
set desc="Fukken metagamers"
set name="Toggle LOOC"
toggle_looc()
log_admin("[key_name(usr)] toggled LOOC.")
message_admins("[key_name_admin(usr)] toggled LOOC.")
SSblackbox.record_feedback("tally", "admin_verb", 1, "TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/proc/toggle_looc(toggle = null)
if(toggle != null) //if we're specifically en/disabling ooc
if(toggle != GLOB.looc_allowed)
GLOB.looc_allowed = toggle
else
return
else //otherwise just toggle it
GLOB.looc_allowed = !GLOB.looc_allowed
world << "<B>The LOOC channel has been globally [GLOB.looc_allowed ? "enabled" : "disabled"].</B>"
/datum/admins/proc/toggleloocdead()
set category = "Server"
set desc="Toggle dis bitch"
set name="Toggle Dead LOOC"
GLOB.dlooc_allowed = !( GLOB.dlooc_allowed )
log_admin("[key_name(usr)] toggled Dead LOOC.")
message_admins("[key_name_admin(usr)] toggled Dead LOOC.")
SSblackbox.record_feedback("tally", "admin_verb", 1, "TDLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/mob/living/carbon/proc/has_penis()
if(getorganslot("penis"))//slot shared with ovipositor
if(istype(getorganslot("penis"), /obj/item/organ/genital/penis))
+2 -1
View File
@@ -413,7 +413,8 @@
var/list/candidates = list()
for(var/mob/dead/observer/G in GLOB.player_list)
candidates += G
if(G.can_reenter_round)
candidates += G
return pollCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category, flashwindow, candidates)
+1
View File
@@ -9,6 +9,7 @@ GLOBAL_VAR_INIT(changelog_hash, "")
GLOBAL_VAR_INIT(hub_visibility, FALSE)
GLOBAL_VAR_INIT(ooc_allowed, TRUE) // used with admin verbs to disable ooc - not a config option apparently
GLOBAL_VAR_INIT(looc_allowed, TRUE)
GLOBAL_VAR_INIT(dooc_allowed, TRUE)
GLOBAL_VAR_INIT(aooc_allowed, FALSE)
GLOBAL_VAR_INIT(enter_allowed, TRUE)
+1 -1
View File
@@ -111,7 +111,7 @@
if(mob && LAZYLEN(mob.mousemove_intercept_objects))
for(var/datum/D in mob.mousemove_intercept_objects)
D.onMouseMove(object, location, control, params)
if(mob) //CIT CHANGE - passes onmousemove() to mobs
if(!show_popup_menus && mob) //CIT CHANGE - passes onmousemove() to mobs
mob.onMouseMove(object, location, control, params) //CIT CHANGE - ditto
..()
+3
View File
@@ -167,4 +167,7 @@
attack_message = "[user] has [message_verb] [src][message_hit_area] with [I]!"
visible_message("<span class='danger'>[attack_message]</span>",\
"<span class='userdanger'>[attack_message]</span>", null, COMBAT_MESSAGE_RANGE)
if(hit_area == BODY_ZONE_HEAD)
if(prob(2))
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
return 1
+2 -1
View File
@@ -655,7 +655,8 @@ SUBSYSTEM_DEF(ticker)
'sound/roundend/its_only_game.ogg',
'sound/roundend/yeehaw.ogg',
'sound/roundend/disappointed.ogg',
'sound/roundend/gondolabridge.ogg'\
'sound/roundend/gondolabridge.ogg',
'sound/roundend/haveabeautifultime.ogg'\
)
SEND_SOUND(world, sound(round_end_sound))
+3 -3
View File
@@ -131,9 +131,9 @@ Credit where due:
config_tag = "clockwork_cult"
antag_flag = ROLE_SERVANT_OF_RATVAR
false_report_weight = 10
required_players = 20
required_enemies = 2
recommended_enemies = 4
required_players = 30
required_enemies = 3
recommended_enemies = 5
enemy_minimum_age = 7
protected_jobs = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain") //Silicons can eventually be converted
restricted_jobs = list("Chaplain", "Captain")
+3 -3
View File
@@ -37,9 +37,9 @@
false_report_weight = 10
restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")
protected_jobs = list()
required_players = 20
required_enemies = 2
recommended_enemies = 4
required_players = 30
required_enemies = 3
recommended_enemies = 5
enemy_minimum_age = 7
announce_span = "cult"
+4 -4
View File
@@ -227,7 +227,7 @@
if((mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes.
connected_message("Clone Rejected: Deceased.")
if(internal_radio)
SPEAK("The cloning of [mob_occupant.real_name] has been \
SPEAK("The cloning has been \
aborted due to unrecoverable tissue failure.")
go_out()
mob_occupant.apply_vore_prefs()
@@ -261,7 +261,7 @@
else if((mob_occupant.cloneloss <= (100 - heal_level)))
connected_message("Cloning Process Complete.")
if(internal_radio)
SPEAK("The cloning cycle of [mob_occupant.real_name] is complete.")
SPEAK("The cloning cycle is complete.")
// If the cloner is upgraded to debugging high levels, sometimes
// organs and limbs can be missing.
@@ -319,7 +319,7 @@
return
else
connected_message("Emergency Ejection")
SPEAK("An emergency ejection of [clonemind.name] has occurred. Survival not guaranteed.")
SPEAK("An emergency ejection of the current clone has occurred. Survival not guaranteed.")
to_chat(user, "<span class='notice'>You force an emergency ejection. </span>")
go_out()
mob_occupant.apply_vore_prefs()
@@ -412,7 +412,7 @@
var/mob/living/mob_occupant = occupant
if(mob_occupant && prob(100/(severity*efficiency)))
connected_message(Gibberish("EMP-caused Accidental Ejection", 0))
SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely." ,0))
SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of, ERROR: John Doe, prematurely." ,0))
mob_occupant.apply_vore_prefs()
go_out()
+4 -4
View File
@@ -71,7 +71,7 @@
return
if(timing)
if(world.time - activation_time >= timer_duration)
if(world.realtime - activation_time >= timer_duration)
timer_end() // open doors, reset timer, clear status screen
update_icon()
@@ -87,7 +87,7 @@
if(stat & (NOPOWER|BROKEN))
return 0
activation_time = world.time
activation_time = world.realtime
timing = TRUE
for(var/obj/machinery/door/window/brigdoor/door in targets)
@@ -136,7 +136,7 @@
/obj/machinery/door_timer/proc/time_left(seconds = FALSE)
. = max(0,timer_duration - (activation_time ? world.time - activation_time : 0))
. = max(0,timer_duration - (activation_time ? world.realtime - activation_time : 0))
if(seconds)
. /= 10
@@ -240,7 +240,7 @@
preset_time = PRESET_LONG
. = set_timer(preset_time)
if(timing)
activation_time = world.time
activation_time = world.realtime
else
. = FALSE
@@ -30,20 +30,20 @@
playsound(src, "sparks", 100, TRUE)
var/turf/T = loc
if(isturf(T))
T.hotspot_expose(300,5)
T.hotspot_expose(700,5)
QDEL_IN(src, 20)
/obj/effect/particle_effect/sparks/Destroy()
var/turf/T = loc
if(isturf(T))
T.hotspot_expose(300,1)
T.hotspot_expose(700,1)
return ..()
/obj/effect/particle_effect/sparks/Move()
..()
var/turf/T = loc
if(isturf(T))
T.hotspot_expose(300,1)
T.hotspot_expose(700,1)
/datum/effect_system/spark_spread
effect_type = /obj/effect/particle_effect/sparks
+4 -2
View File
@@ -187,6 +187,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
var/datum/effect_system/spark_spread/spark_system
var/effectcooldown
var/working = 0
var/p_dir = NORTH
var/p_flipped = FALSE
@@ -207,7 +208,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
/obj/item/pipe_dispenser/New()
. = ..()
spark_system = new /datum/effect_system/spark_spread
spark_system.set_up(5, 0, src)
spark_system.set_up(1, 0, src)
spark_system.attach(src)
if(!first_atmos)
first_atmos = GLOB.atmos_pipe_recipes[GLOB.atmos_pipe_recipes[1]][1]
@@ -313,8 +314,9 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
else
mode |= n
if(playeffect)
if(playeffect && world.time >= effectcooldown)
spark_system.start()
effectcooldown = world.time + 100
playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0)
/obj/item/pipe_dispenser/pre_attack(atom/A, mob/user)
+28 -30
View File
@@ -8,72 +8,70 @@
item_state = "candle1"
w_class = WEIGHT_CLASS_TINY
light_color = LIGHT_COLOR_FIRE
heat = 1000
var/wax = 1000
var/lit = FALSE
var/infinite = FALSE
var/start_lit = FALSE
heat = 1000
/obj/item/candle/Initialize()
. = ..()
if(start_lit)
// No visible message
light(show_message = FALSE)
light()
/obj/item/candle/update_icon()
var/i
if(wax>750)
i = 1
else if(wax>400)
i = 2
else i = 3
icon_state = "candle[i][lit ? "_lit" : ""]"
icon_state = "candle[(wax > 400) ? ((wax > 750) ? 1 : 2) : 3][lit ? "_lit" : ""]"
/obj/item/candle/attackby(obj/item/W, mob/user, params)
..()
var/msg = W.ignition_effect(src, user)
if(msg)
light(msg)
else
return ..()
/obj/item/candle/fire_act(exposed_temperature, exposed_volume)
if(!src.lit)
if(!lit)
light() //honk
..()
return ..()
/obj/item/candle/is_hot()
return lit * heat
/obj/item/candle/proc/light(show_message)
if(!src.lit)
src.lit = TRUE
//src.damtype = "fire"
if(!lit)
lit = TRUE
if(show_message)
usr.visible_message(show_message)
set_light(CANDLE_LUMINOSITY, 0.8)
set_light(CANDLE_LUMINOSITY)
START_PROCESSING(SSobj, src)
update_icon()
/obj/item/candle/proc/put_out_candle()
if(!lit)
return
lit = FALSE
update_icon()
set_light(0)
return TRUE
/obj/item/candle/extinguish()
put_out_candle()
return ..()
/obj/item/candle/process()
if(!lit)
return
return PROCESS_KILL
if(!infinite)
wax--
if(!wax)
new/obj/item/trash/candle(src.loc)
new /obj/item/trash/candle(loc)
qdel(src)
update_icon()
open_flame()
/obj/item/candle/attack_self(mob/user)
if(lit)
user.visible_message(
"<span class='notice'>[user] snuffs [src].</span>")
lit = FALSE
update_icon()
set_light(0)
/obj/item/candle/is_hot()
return lit * heat
if(put_out_candle())
user.visible_message("<span class='notice'>[user] snuffs [src].</span>")
/obj/item/candle/infinite
infinite = TRUE
@@ -114,7 +114,7 @@
/obj/item/pda/heads/rd
name = "research director PDA"
default_cartridge = /obj/item/cartridge/rd
inserted_item = /obj/item/pen/fountain
inserted_item = /obj/item/pen/fourcolor
icon_state = "pda-rd"
/obj/item/pda/captain
@@ -185,6 +185,12 @@
desc = "A portable microcomputer by Thinktronic Systems, LTD. This model is a special edition with a transparent case."
note = "Congratulations, you have chosen the Thinktronic 5230 Personal Data Assistant Deluxe Special Max Turbo Limited Edition!"
/obj/item/pda/neko
name = "neko PDA"
icon_state = "pda-neko"
desc = "A portable microcomputer by Thinktronic Systems, LTD. This model is a special edition a feline fine case."
note = "Congratulations, you have chosen the Thinktronic 5230 Personal Data Assistant Deluxe Special Mew Turbo Limited Edition NYA~!"
/obj/item/pda/cook
name = "cook PDA"
icon_state = "pda-cook"
@@ -34,6 +34,10 @@
if(LAZYLEN(current_fields) >= max_fields)
to_chat(user, "<span class='notice'>[src] cannot sustain any more forcefields!</span>")
return
var/obj/structure/projected_forcefield/same = locate() in T
if(same)
to_chat(user, "<span class='notice'>There is already a forcefield on [T]!</span>")
return
playsound(src,'sound/weapons/resonator_fire.ogg',50,1)
user.visible_message("<span class='warning'>[user] projects a forcefield!</span>","<span class='notice'>You project a forcefield.</span>")
@@ -59,6 +63,8 @@
/obj/item/forcefield_projector/Destroy()
STOP_PROCESSING(SSobj, src)
for(var/i in current_fields)
qdel(i)
return ..()
/obj/item/forcefield_projector/process()
+2 -1
View File
@@ -227,7 +227,7 @@
repetition++
addtimer(CALLBACK(src, /obj/item/extinguisher/proc/move_chair, B, movementdirection, repetition), timer_seconds)
/obj/item/extinguisher/AltClick(mob/user)
/obj/item/extinguisher/screwdriver_act(mob/user, obj/item/tool)
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
EmptyExtinguisher(user)
@@ -242,3 +242,4 @@
theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "<span class='info'>You quietly empty out \the [src] using its release valve.</span>")
+14
View File
@@ -51,6 +51,20 @@
new /obj/item/stack/rods(get_turf(src), number_of_rods)
qdel(src)
/obj/structure/lattice/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
if(the_rcd.mode == RCD_FLOORWALL)
return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 2)
/obj/structure/lattice/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
if(passed_mode == RCD_FLOORWALL)
to_chat(user, "<span class='notice'>You build a floor.</span>")
var/turf/T = src.loc
if(isspaceturf(T))
T.PlaceOnTop(/turf/open/floor/plating)
qdel(src)
return TRUE
return FALSE
/obj/structure/lattice/singularity_pull(S, current_size)
if(current_size >= STAGE_FOUR)
deconstruct()
+4
View File
@@ -245,6 +245,10 @@
return 0
if(C.m_intent == MOVE_INTENT_WALK && (lube&NO_SLIP_WHEN_WALKING))
return 0
if(ishuman(C) && (lube&NO_SLIP_WHEN_WALKING))
var/mob/living/carbon/human/H = C
if(!H.sprinting && H.getStaminaLoss() >= 20)
return 0
if(!(lube&SLIDE_ICE))
to_chat(C, "<span class='notice'>You slipped[ O ? " on the [O.name]" : ""]!</span>")
playsound(C.loc, 'sound/misc/slip.ogg', 50, 1, -3)
@@ -126,6 +126,17 @@
else
to_chat(user, "<span class='danger'>You hit [src], to no effect!</span>")
/turf/open/floor/plating/foam/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
if(the_rcd.mode == RCD_FLOORWALL)
return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 1)
/turf/open/floor/plating/foam/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
if(passed_mode == RCD_FLOORWALL)
to_chat(user, "<span class='notice'>You build a floor.</span>")
ChangeTurf(/turf/open/floor/plating)
return TRUE
return FALSE
/turf/open/floor/plating/foam/ex_act()
..()
ScrapeAway()
+8
View File
@@ -41,6 +41,14 @@
/turf/open/space/transit/border/east
dir = EAST
/turf/open/space/transit/centcom
dir = SOUTH
/turf/open/space/transit/centcom/Entered(atom/movable/AM, atom/OldLoc)
..()
if(!locate(/obj/structure/lattice) in src)
throw_atom(AM)
/turf/open/space/transit/border/Entered(atom/movable/AM, atom/OldLoc)
..()
if(!locate(/obj/structure/lattice) in src)
+2 -1
View File
@@ -167,6 +167,7 @@
vr_human.undershirt = H.undershirt
vr_human.underwear = H.underwear
vr_human.updateappearance(TRUE, TRUE, TRUE)
vr_human.give_genitals(TRUE) //CITADEL ADD
if(outfit)
var/datum/outfit/O = new outfit()
O.equip(vr_human)
@@ -229,4 +230,4 @@
for (var/mob/living/carbon/human/virtual_reality/H in vr_area)
if (H.stat == DEAD && !H.vr_sleeper && !H.real_mind)
qdel(H)
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
+10 -1
View File
@@ -538,13 +538,22 @@
message_admins("[key_name_admin(usr)] toggled OOC.")
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle OOC", "[GLOB.ooc_allowed ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/toggleooclocal()
set category = "Server"
set desc="Toggle dat bitch"
set name="Toggle Local OOC"
toggle_looc()
log_admin("[key_name(usr)] toggled LOOC.")
message_admins("[key_name_admin(usr)] toggled LOOC.")
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Local OOC", "[GLOB.ooc_allowed ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/toggleoocdead()
set category = "Server"
set desc="Toggle dis bitch"
set name="Toggle Dead OOC"
toggle_dooc()
log_admin("[key_name(usr)] toggled OOC.")
log_admin("[key_name(usr)] toggled Dead OOC.")
message_admins("[key_name_admin(usr)] toggled Dead OOC.")
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Dead OOC", "[GLOB.dooc_allowed ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+1
View File
@@ -24,6 +24,7 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
/client/proc/game_panel, /*game panel, allows to change game-mode etc*/
/client/proc/check_ai_laws, /*shows AI and borg laws*/
/datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/
/datum/admins/proc/toggleooclocal, /*toggles looc on/off for everyone*/
/datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/
/datum/admins/proc/toggleaooc, /*toggles antag ooc on/off*/
/datum/admins/proc/toggleenter, /*toggles whether people can join the current game*/
+1 -1
View File
@@ -714,7 +714,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null
SDQL_print(x, text_list)
if (!isnull(x) && !isnum(x) && L[x] != null)
text_list += " -> "
SDQL_print(L[L[x]])
SDQL_print(L[L[x]], text_list)
text_list += "]<br>"
else
if(isnull(object))
@@ -184,6 +184,9 @@
/proc/_list_swap(list/L, Index1, Index2)
L.Swap(Index1, Index2)
/proc/_list_get(list/L, index)
return L[index]
/proc/_walk(ref, dir, lag)
walk(ref, dir, lag)
+7 -5
View File
@@ -13,6 +13,7 @@
if (new_pb && !SSdbcore.Connect())
message_admins("The Database is not connected! Panic bunker will not work until the connection is reestablished.")
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Panic Bunker", "[new_pb ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
send2irc("Panic Bunker", "[key_name(usr)] has toggled the Panic Bunker, it is now [new_pb ? "enabled" : "disabled"].")
/client/proc/addbunkerbypass(ckeytobypass as text)
set category = "Special Verbs"
@@ -22,9 +23,10 @@
to_chat(usr, "<span class='adminnotice'>The Database is not enabled!</span>")
return
GLOB.bunker_passthrough |= ckeytobypass
GLOB.bunker_passthrough |= ckey(ckeytobypass)
log_admin("[key_name(usr)] has added [ckeytobypass] to the current round's bunker bypass list.")
message_admins("[key_name(usr)] has added [ckeytobypass] to the current round's bunker bypass list.")
message_admins("[key_name_admin(usr)] has added [ckeytobypass] to the current round's bunker bypass list.")
send2irc("Panic Bunker", "[key_name(usr)] has added [ckeytobypass] to the current round's bunker bypass list.")
/client/proc/revokebunkerbypass(ckeytobypass as text)
set category = "Special Verbs"
@@ -34,7 +36,7 @@
to_chat(usr, "<span class='adminnotice'>The Database is not enabled!</span>")
return
GLOB.bunker_passthrough -= ckeytobypass
GLOB.bunker_passthrough -= ckey(ckeytobypass)
log_admin("[key_name(usr)] has removed [ckeytobypass] from the current round's bunker bypass list.")
message_admins("[key_name(usr)] has removed [ckeytobypass] from the current round's bunker bypass list.")
message_admins("[key_name_admin(usr)] has removed [ckeytobypass] from the current round's bunker bypass list.")
send2irc("Panic Bunker", "[key_name(usr)] has removed [ckeytobypass] from the current round's bunker bypass list.")
+36 -6
View File
@@ -185,6 +185,9 @@ structure_check() searches for nearby cultist structures required for the invoca
color = RUNE_COLOR_OFFER
req_cultists = 1
rune_in_use = FALSE
var/mob/living/currentconversionman
var/conversiontimeout
var/conversionresult
/obj/effect/rune/convert/do_invoke_glow()
return
@@ -241,6 +244,25 @@ structure_check() searches for nearby cultist structures required for the invoca
to_chat(M, "<span class='warning'>Something is shielding [convertee]'s mind!</span>")
log_game("Offer rune failed - convertee had anti-magic")
return 0
to_chat(convertee, "<span class='cult italic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
and something evil takes root.</b></span>")
to_chat(convertee, "<span class='cult italic'>Do you wish to embrace the Geometer of Blood? <a href='?src=\ref[src];signmeup=1'>Click here to stop resisting the truth.</a> Or you could choose to continue resisting...</span>")
currentconversionman = convertee
conversiontimeout = world.time + (10 SECONDS)
convertee.Stun(100)
convertee.add_trait(TRAIT_MUTE, "conversionrune")
conversionresult = FALSE
while(world.time < conversiontimeout && convertee && !conversionresult)
stoplag(1)
currentconversionman = null
if(!convertee)
return FALSE
convertee.remove_trait(TRAIT_MUTE, "conversionrune")
if(get_turf(convertee) != get_turf(src))
return FALSE
if(!conversionresult)
do_sacrifice(convertee, invokers, TRUE)
return FALSE
var/brutedamage = convertee.getBruteLoss()
var/burndamage = convertee.getFireLoss()
if(brutedamage || burndamage)
@@ -252,8 +274,6 @@ structure_check() searches for nearby cultist structures required for the invoca
SSticker.mode.add_cultist(convertee.mind, 1)
new /obj/item/melee/cultblade/dagger(get_turf(src))
convertee.mind.special_role = ROLE_CULTIST
to_chat(convertee, "<span class='cult italic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
and something evil takes root.</b></span>")
to_chat(convertee, "<span class='cult italic'><b>Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
</b></span>")
if(ishuman(convertee))
@@ -263,7 +283,7 @@ structure_check() searches for nearby cultist structures required for the invoca
H.cultslurring = 0
return 1
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers)
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers, force_a_sac)
var/mob/living/first_invoker = invokers[1]
if(!first_invoker)
return FALSE
@@ -273,7 +293,7 @@ structure_check() searches for nearby cultist structures required for the invoca
var/big_sac = FALSE
if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
if(!force_a_sac && (((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
for(var/M in invokers)
to_chat(M, "<span class='cult italic'>[sacrificial] is too greatly linked to the world! You need three acolytes!</span>")
log_game("Offer rune failed - not enough acolytes and target is living or sac target")
@@ -313,6 +333,12 @@ structure_check() searches for nearby cultist structures required for the invoca
sacrificial.gib()
return TRUE
/obj/effect/rune/convert/Topic(href, href_list)
if(href_list["signmeup"])
if(currentconversionman == usr)
conversionresult = TRUE
else
to_chat(usr, "<span class='cult italic'><b>Your fate has already been set in stone.</b></span>")
/obj/effect/rune/empower
@@ -442,9 +468,9 @@ structure_check() searches for nearby cultist structures required for the invoca
//Ritual of Dimensional Rending: Calls forth the avatar of Nar'Sie upon the station.
/obj/effect/rune/narsie
cultist_name = "Nar'Sie"
cultist_desc = "tears apart dimensional barriers, calling forth the Geometer. Requires 9 invokers."
cultist_desc = "tears apart dimensional barriers, calling forth the Geometer. Requires 9 invokers, minus one for every 3 sacrifices."
invocation = "TOK-LYR RQA-NAP G'OLT-ULOFT!!"
req_cultists = 9
req_cultists = 1
icon = 'icons/effects/96x96.dmi'
color = RUNE_COLOR_DARKRED
icon_state = "rune_large"
@@ -471,6 +497,10 @@ structure_check() searches for nearby cultist structures required for the invoca
if(!is_station_level(z))
return
var/mob/living/user = invokers[1]
if(invokers.len < 9 - (GLOB.sacrificed.len * 0.35))
to_chat(user, "<span class='danger'>You need at least [(9 - (GLOB.sacrificed.len * 0.35)) - invokers.len] more adjacent cultists to use this rune in such a manner.</span>")
fail_invoke()
return
var/datum/antagonist/cult/user_antag = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
var/datum/objective/eldergod/summon_objective = locate() in user_antag.cult_team.objectives
var/area/place = get_area(src)
@@ -61,6 +61,8 @@
//Actually transfer the gas
var/datum/gas_mixture/removed = air2.remove(transfer_moles)
removed.react(src)
update_parents()
return removed
+5
View File
@@ -41,6 +41,11 @@
return
if(QDELETED(src) || QDELETED(user))
return
if(isobserver(user))
var/mob/dead/observer/O = user
if(!O.can_reenter_round)
to_chat(user, "<span class='warning'>You are unable to reenter the round.</span>")
return
var/ghost_role = alert(latejoinercalling ? "Latejoin as [mob_name]? (This is a ghost role, and as such, it's very likely to be off-station.)" : "Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No")
if(ghost_role == "No" || !loc)
return
+8 -8
View File
@@ -622,7 +622,7 @@
/datum/supply_pack/security/armory/wt550
name = "WT-550 Auto Rifle Crate"
name = "WT-550 Semi-Auto Rifle Crate"
desc = "Contains two high-powered, semiautomatic rifles chambered in 4.6x30mm. Requires Armory access to open."
cost = 3500
contains = list(/obj/item/gun/ballistic/automatic/wt550,
@@ -630,8 +630,8 @@
crate_name = "auto rifle crate"
/datum/supply_pack/security/armory/wt550ammo
name = "WT-550 Auto Rifle Ammo Crate"
desc = "Contains four 20-round magazines for the WT-550 Auto Rifle. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open."
name = "WT-550 Semi-Auto SMG Ammo Crate"
desc = "Contains four 20-round magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open."
cost = 2500
contains = list(/obj/item/ammo_box/magazine/wt550m9,
/obj/item/ammo_box/magazine/wt550m9,
@@ -639,9 +639,9 @@
/obj/item/ammo_box/magazine/wt550m9)
crate_name = "auto rifle ammo crate"
/datum/supply_pack/security/armory/wt550ammo_nonlethal // Takes around 11 shots to stun crit someone
name = "WT-550 Auto Rifle Non-Lethal Ammo Crate"
desc = "Contains four 20-round magazines for the WT-550 Auto Rifle. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open."
/datum/supply_pack/security/armory/wt550ammo_nonlethal // Takes around 12 shots to stun crit someone
name = "WT-550 Semi-Auto SMG Non-Lethal Ammo Crate"
desc = "Contains four 20-round magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open."
cost = 1500
contains = list(/obj/item/ammo_box/magazine/wt550m9/wtrubber,
/obj/item/ammo_box/magazine/wt550m9/wtrubber,
@@ -650,8 +650,8 @@
crate_name = "auto rifle ammo crate"
/datum/supply_pack/security/armory/wt550ammo_special
name = "WT-550 Auto Rifle Special Ammo Crate"
desc = "Contains 2 20-round Armour Piercing and Incendiary magazines for the WT-550 Auto Rifle. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open."
name = "WT-550 Semi-Auto SMG Special Ammo Crate"
desc = "Contains 2 20-round Armour Piercing and Incendiary magazines for the WT-550 Semi-Auto SMG. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open."
cost = 4500
contains = list(/obj/item/ammo_box/magazine/wt550m9/wtap,
/obj/item/ammo_box/magazine/wt550m9/wtap,
+1 -1
View File
@@ -499,7 +499,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
qdel(query_client_in_db)
return
if(!query_client_in_db.NextRow())
if (CONFIG_GET(flag/panic_bunker) && !holder && !GLOB.deadmins[ckey] && !ckey in GLOB.bunker_passthrough)
if (CONFIG_GET(flag/panic_bunker) && !holder && !GLOB.deadmins[ckey] && !(ckey in GLOB.bunker_passthrough))
log_access("Failed Login: [key] - New account attempting to connect during panic bunker")
message_admins("<span class='adminnotice'>Failed Login: [key] - New account attempting to connect during panic bunker</span>")
to_chat(src, "<span class='notice'>You must first join the Discord to verify your account before joining this server.<br>To do so, read the rules and post a request in the #station-access-requests channel under the \"Main server\" category in the Discord server linked here: <a href='https://discord.gg/E6SQuhz'>https://discord.gg/E6SQuhz</a></span>") //CIT CHANGE - makes the panic bunker disconnect message point to the discord
+2 -5
View File
@@ -24,11 +24,8 @@
return
if(!holder)
if(!GLOB.ooc_allowed)
to_chat(src, "<span class='danger'> OOC is globally muted</span>")
return
if(!GLOB.dooc_allowed && (mob.stat == DEAD))
to_chat(usr, "<span class='danger'> OOC for dead mobs has been turned off.</span>")
if(!GLOB.looc_allowed)
to_chat(src, "<span class='danger'> LOOC is globally muted</span>")
return
if(prefs.muted & MUTE_OOC)
to_chat(src, "<span class='danger'> You cannot use OOC (muted).</span>")
+10
View File
@@ -80,6 +80,16 @@
GLOB.ooc_allowed = !GLOB.ooc_allowed
to_chat(world, "<B>The OOC channel has been globally [GLOB.ooc_allowed ? "enabled" : "disabled"].</B>")
/proc/toggle_looc(toggle = null)
if(toggle != null)
if(toggle != GLOB.looc_allowed)
GLOB.looc_allowed = toggle
else
return
else
GLOB.looc_allowed = !GLOB.looc_allowed
/proc/toggle_dooc(toggle = null)
if(toggle != null)
if(toggle != GLOB.dooc_allowed)
+6 -4
View File
@@ -198,11 +198,13 @@
death(0)
/mob/living/proc/suicide_log()
log_game("[key_name(src)] committed suicide at [AREACOORD(src)] as [src.type].")
/mob/living/proc/suicide_log(ghosting)
log_game("[key_name(src)] [ghosting ? "ghosted" : "committed suicide"] at [AREACOORD(src)] as [src.type].")
message_admins("[key_name(src)] [ghosting ? "ghosted" : "committed suicide"] at [AREACOORD(src)].")
/mob/living/carbon/human/suicide_log()
log_game("[key_name(src)] (job: [src.job ? "[src.job]" : "None"]) committed suicide at [AREACOORD(src)].")
/mob/living/carbon/human/suicide_log(ghosting)
log_game("[key_name(src)] (job: [src.job ? "[src.job]" : "None"]) [is_special_character(src) ? "(ANTAG!) " : ""][ghosting ? "ghosted" : "committed suicide"] at [AREACOORD(src)].")
message_admins("[key_name(src)] (job: [src.job ? "[src.job]" : "None"]) [is_special_character(src) ? "(ANTAG!) " : ""][ghosting ? "ghosted" : "committed suicide"] at [AREACOORD(src)].")
/mob/living/proc/canSuicide()
switch(stat)
+2
View File
@@ -24,6 +24,8 @@
var/can_flashlight = 0
var/scan_reagents = 0 //Can the wearer see reagents while it's equipped?
var/blocks_shove_knockdown = FALSE //Whether wearing the clothing item blocks the ability for shove to knock down.
var/clothing_flags = NONE
//Var modification - PLEASE be careful with this I know who you are and where you live
+1 -1
View File
@@ -3,7 +3,7 @@
desc = "Standard Security gear. Protects the head from impacts."
icon_state = "helmet"
item_state = "helmet"
armor = list("melee" = 35, "bullet" = 30, "laser" = 30,"energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
flags_inv = HIDEEARS
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
+2 -2
View File
@@ -139,7 +139,7 @@
name = "security beret"
desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection."
icon_state = "beret_badge"
armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 50)
armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
strip_delay = 60
dog_fashion = null
@@ -152,7 +152,7 @@
name = "warden's beret"
desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class."
icon_state = "wardenberet"
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 50)
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
strip_delay = 60
/obj/item/clothing/head/beret/sec/navyofficer
+4 -1
View File
@@ -712,7 +712,10 @@
/obj/item/clothing/suit/space/hardsuit/shielded/worn_overlays(isinhands)
. = list()
if(!isinhands)
. += mutable_appearance('icons/effects/effects.dmi', shield_state, MOB_LAYER + 0.01)
if(taurmode >= SNEK_TAURIC)
. += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', shield_state, MOB_LAYER + 0.01)
else
. += mutable_appearance('icons/effects/effects.dmi', shield_state, MOB_LAYER + 0.01)
/obj/item/clothing/head/helmet/space/hardsuit/shielded
resistance_flags = FIRE_PROOF | ACID_PROOF
+5 -2
View File
@@ -36,7 +36,7 @@
if(tauric == TRUE)
center = TRUE
dimension_x = 64
else if(H.dna.features["taur"] in list("Fox", "Wolf", "Otie", "Drake", "Lab", "Shepherd", "Husky", "Eevee", "Panther", "Tajaran", "Horse", "Cow"))
else if(H.dna.features["taur"] in list("Fox","Wolf","Otie","Drake","Lab","Shepherd","Husky","Eevee","Panther","Horse","Cow","Tiger"))
taurmode = PAW_TAURIC
if(tauric == TRUE)
center = TRUE
@@ -61,7 +61,10 @@
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]")
IF_HAS_BLOOD_DNA(src)
. += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood")
if(taurmode >= SNEK_TAURIC)
. += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "[blood_overlay_type]blood")
else
. += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood")
var/mob/living/carbon/human/M = loc
if(ishuman(M) && M.w_uniform)
var/obj/item/clothing/under/U = M.w_uniform
+2 -1
View File
@@ -110,13 +110,14 @@
/obj/item/clothing/suit/armor/riot
name = "riot suit"
desc = "A suit of semi-flexible polycarbonate body armor with heavy padding to protect against melee attacks."
desc = "A suit of semi-flexible polycarbonate body armor with heavy padding to protect against melee attacks. Helps the wearer resist shoving in close quarters."
icon_state = "riot"
item_state = "swat_suit"
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
blocks_shove_knockdown = TRUE
strip_delay = 80
equip_delay_other = 60
@@ -184,6 +184,15 @@
tastes = list("the jungle" = 1, "bananas" = 1)
foodtype = MEAT | SUGAR
/obj/item/reagent_containers/food/snacks/monkeycube/On_Consume(mob/living/carbon/M)
if(iscarbon(M))
M.visible_message("[src] bursts out of [M]!</span>")
M.emote("scream")
M.Knockdown(40)
M.adjustBruteLoss(60)
Expand()
return ..()
/obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand()
var/mob/spammer = get_mob_by_key(fingerprintslast)
var/mob/living/carbon/monkey/bananas = new(drop_location(), TRUE, spammer)
@@ -160,6 +160,15 @@
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pineapple" = 6, "ham" = 2)
foodtype = PINEAPPLE //Over powering tast of gods fruit
/obj/item/reagent_containers/food/snacks/pizza/pineapple/anomaly
desc = "A anomaly made pizza with pineapple..."
bonus_reagents = list("nutriment" = 16, "vitamin" = 16)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pineapple" = 6, "ham" = 2, "good" = 10)
/obj/item/reagent_containers/food/snacks/pizzaslice/pineapple/anomaly
desc = "A slice of good tasting pizza. But has pineapple on it, what a anomaly!"
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pineapple" = 6, "ham" = 2, "good" = 10)
/obj/item/reagent_containers/food/snacks/pizza/arnold
name = "\improper Arnold pizza"
desc = "Hello, you've reached Arnold's pizza shop. I'm not here now, I'm out killing pepperoni."
@@ -692,3 +692,15 @@
id = "pwr_game"
results = list("pwr_game" = 5)
required_reagents = list("sodawater" = 1, "blackcrayonpowder" = 1, "sodiumchloride" = 1)
/datum/chemical_reaction/pinkmilk
name = "Strawberry Milk"
id = "pinkmilk"
results = list("pinkmilk" = 5)
required_reagents = list("aphro+" = 1, "milk" = 1)
/datum/chemical_reaction/pinktea
name = "Strawberry Tea"
id = "pinktea"
results = list("pinktea" = 5)
required_reagents = list("aphro" = 1, "arnold_palmer" = 1, "sugar" = 1)
@@ -101,3 +101,22 @@
)
result = /obj/item/reagent_containers/food/snacks/pizza/pineapple
subcategory = CAT_PIZZA
/datum/crafting_recipe/food/pineapplepizza/anomaly
name = "Anomaly Hawaiian pizza"
reqs = list(
/obj/item/assembly/signaler/anomaly = 1,
/obj/item/reagent_containers/food/snacks/pizza/pineapple = 1
)
result = /obj/item/reagent_containers/food/snacks/pizza/pineapple/anomaly
subcategory = CAT_PIZZA
/datum/crafting_recipe/food/anomalypizzaboy
name = "Anomaly pizza box"
reqs = list(
/obj/item/pizzabox = 5,
/obj/item/assembly/signaler/anomaly = 1
)
tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
result = /obj/item/pizzabox/infinite
subcategory = CAT_PIZZA
@@ -239,10 +239,10 @@
if(ishostile(target))
var/mob/living/simple_animal/hostile/H = target
if(H.ranged) //briefly delay ranged attacks
if(H.ranged_cooldown_time >= world.time)
H.ranged_cooldown_time += bonus_value
if(H.ranged_cooldown >= world.time)
H.ranged_cooldown += bonus_value
else
H.ranged_cooldown_time = bonus_value + world.time
H.ranged_cooldown = bonus_value + world.time
//magmawing watcher
/obj/item/crusher_trophy/blaster_tubes/magma_wing
+26 -4
View File
@@ -11,6 +11,7 @@
var/obj/item/card/id/inserted_id
var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces.
new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
new /datum/data/mining_equipment("50 Point Transfer Card", /obj/item/card/mining_point_card, 50),
new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100),
new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300),
new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100),
@@ -23,7 +24,7 @@
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500),
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500),
new /datum/data/mining_equipment("500 Point Transfer Card", /obj/item/card/mining_point_card/mp500, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600),
new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 750),
@@ -41,6 +42,9 @@
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining_conscript, 1000),
new /datum/data/mining_equipment("1000 Point Transfer Card", /obj/item/card/mining_point_card/mp1000, 1000),
new /datum/data/mining_equipment("1500 Point Transfer Card", /obj/item/card/mining_point_card/mp1500, 1500),
new /datum/data/mining_equipment("2000 Point Transfer Card", /obj/item/card/mining_point_card/mp2000, 2000),
new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/tank/jetpack/suit, 2000),
new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000),
@@ -245,12 +249,30 @@
w_class = WEIGHT_CLASS_TINY
/**********************Mining Point Card**********************/
//mp = Miner Pointers
//c = Cash
//TODO add in cr = Credits for cargo
/obj/item/card/mining_point_card
name = "mining points card"
desc = "A small card preloaded with mining points. Swipe your ID card over it to transfer the points, then discard."
desc = "A small card preloaded with mining points. Swipe your ID card over it to transfer the points, then discard. This one only holds a small 50 points on it."
icon_state = "data_1"
var/points = 500
var/points = 50
/obj/item/card/mining_point_card/mp500
desc = "A small card preloaded with 500 mining points. Swipe your ID card over it to transfer the points, then discard."
points = 500
/obj/item/card/mining_point_card/mp1000
desc = "A small card preloaded with 1000 mining points. Swipe your ID card over it to transfer the points, then discard."
points = 1000
/obj/item/card/mining_point_card/mp1500
desc = "A small card preloaded with 1500 mining points. Swipe your ID card over it to transfer the points, then discard."
points = 1500
/obj/item/card/mining_point_card/mp2000
desc = "A small card preloaded with 2000 mining points. Swipe your ID card over it to transfer the points, then discard."
points = 2000
/obj/item/card/mining_point_card/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/card/id))
+10 -3
View File
@@ -18,6 +18,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
invisibility = INVISIBILITY_OBSERVER
hud_type = /datum/hud/ghost
var/can_reenter_corpse
var/can_reenter_round = TRUE
var/datum/hud/living/carbon/hud = null // hud
var/bootime = 0
var/started_as_observer //This variable is set to 1 when you enter the game as an observer.
@@ -266,6 +267,7 @@ Works together with spawning an observer, noted above.
var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc.
SStgui.on_transfer(src, ghost) // Transfer NanoUIs.
ghost.can_reenter_corpse = can_reenter_corpse
ghost.can_reenter_round = (can_reenter_corpse && !suiciding)
ghost.key = key
return ghost
@@ -280,7 +282,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
// CITADEL EDIT
if(istype(loc, /obj/machinery/cryopod))
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you may not play again this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost")//darn copypaste
return
var/obj/machinery/cryopod/C = loc
@@ -293,17 +295,18 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(stat == DEAD)
ghostize(1)
else
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you may not play again this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost")
return //didn't want to ghost after-all
ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
suicide_log(TRUE)
/mob/camera/verb/ghost()
set category = "OOC"
set name = "Ghost"
set desc = "Relinquish your life and enter the land of the dead."
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you may not play again this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost")
return
ghostize(0)
@@ -617,6 +620,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(src, "<span class='warning'>This isn't really a creature, now is it!</span>")
return 0
if(!can_reenter_round)
to_chat(src, "<span class='warning'>You are unable to re-enter the round.</span>")
return FALSE
if(can_reenter_corpse && mind && mind.current)
if(alert(src, "Your soul is still tied to your former life as [mind.current.name], if you go forward there is no going back to that life. Are you sure you wish to continue?", "Move On", "Yes", "No") == "No")
return 0
@@ -341,8 +341,13 @@
else if(isobserver(user) && traitstring)
msg += "<span class='info'><b>Traits:</b> [traitstring]</span><br>"
if(print_flavor_text() && get_visible_name() != "Unknown")//Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation.
msg += "[print_flavor_text()]\n"
if(print_flavor_text())
if(get_visible_name() == "Unknown") //Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation.
msg += "...?<br>"
else if(skipface) //Sometimes we're not unknown, but impersonating someone in a hardsuit, let's not reveal our flavor text then either.
msg += "...?<br>"
else
msg += "[print_flavor_text()]\n"
msg += "*---------*</span>"
to_chat(user, msg)
+17 -2
View File
@@ -495,11 +495,11 @@
/mob/living/carbon/human/proc/canUseHUD()
return !(src.stat || IsKnockdown() || IsStun() || src.restrained())
/mob/living/carbon/human/can_inject(mob/user, error_msg, target_zone, var/penetrate_thick = 0)
/mob/living/carbon/human/can_inject(mob/user, error_msg, target_zone, penetrate_thick = FALSE, bypass_immunity = FALSE)
. = 1 // Default to returning true.
if(user && !target_zone)
target_zone = user.zone_selected
if(has_trait(TRAIT_PIERCEIMMUNE))
if(has_trait(TRAIT_PIERCEIMMUNE) && !bypass_immunity)
. = 0
// If targeting the head, see if the head item is thin enough.
// If targeting anything else, see if the wear suit is thin enough.
@@ -892,6 +892,21 @@
. = ..(M,force,check_loc)
stop_pulling()
/mob/living/carbon/human/proc/is_shove_knockdown_blocked() //If you want to add more things that block shove knockdown, extend this
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor)
for(var/bp in body_parts)
if(istype(bp, /obj/item/clothing))
var/obj/item/clothing/C = bp
if(C.blocks_shove_knockdown)
return TRUE
return FALSE
/mob/living/carbon/human/proc/clear_shove_slowdown()
remove_movespeed_modifier(SHOVE_SLOWDOWN_ID)
var/active_item = get_active_held_item()
if(is_type_in_typecache(active_item, GLOB.shove_disarming_types))
visible_message("<span class='warning'>[src.name] regains their grip on \the [active_item]!</span>", "<span class='warning'>You regain your grip on \the [active_item]</span>", null, COMBAT_MESSAGE_RANGE)
/mob/living/carbon/human/do_after_coefficent()
. = ..()
. *= physiology.do_after_speed
@@ -4,7 +4,9 @@
if(def_zone)
if(isbodypart(def_zone))
return checkarmor(def_zone, type)
var/obj/item/bodypart/bp = def_zone
if(bp.body_part)
return checkarmor(def_zone, type)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(def_zone))
return checkarmor(affecting, type)
//If a specific bodypart is targetted, check how that bodypart is protected and return the value.
@@ -1653,13 +1653,19 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/obj/item/bodypart/BP = null
if(isbodypart(def_zone))
BP = def_zone
if(damagetype == STAMINA && istype(def_zone, /obj/item/bodypart/head))
BP = H.get_bodypart(check_zone(BODY_ZONE_CHEST))
else
BP = def_zone
else
if(!def_zone)
def_zone = ran_zone(def_zone)
if(damagetype == STAMINA && def_zone == BODY_ZONE_HEAD)
def_zone = BODY_ZONE_CHEST
BP = H.get_bodypart(check_zone(def_zone))
if(!BP)
BP = H.bodyparts[1]
if(!BP)
BP = H.bodyparts[1]
switch(damagetype)
if(BRUTE)
+3
View File
@@ -170,6 +170,9 @@
var/mob/living/L = M
if(L.has_trait(TRAIT_PUSHIMMUNE))
return 1
//If they're a human, and they're not in help intent, block pushing
if(ishuman(M) && (M.a_intent != INTENT_HELP))
return TRUE
//anti-riot equipment is also anti-push
for(var/obj/item/I in M.held_items)
if(!istype(M, /obj/item/clothing))
@@ -487,28 +487,6 @@
if(O)
O.reagents.add_reagent("enzyme", 2 * coeff)
/obj/item/robot_module/butler/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Waitress", "Butler", "Tophat", "Kent", "Bro")
if(!borg_icon)
return FALSE
switch(borg_icon)
if("Waitress")
cyborg_base_icon = "service_f"
if("Butler")
cyborg_base_icon = "service_m"
if("Bro")
cyborg_base_icon = "brobot"
if("Kent")
cyborg_base_icon = "kent"
special_light_key = "medical"
hat_offset = 3
if("Tophat")
cyborg_base_icon = "tophat"
special_light_key = null
hat_offset = INFINITY //He is already wearing a hat
return ..()
/obj/item/robot_module/miner
name = "Miner"
basic_modules = list(
+3 -20
View File
@@ -29,27 +29,10 @@
/proc/ran_zone(zone, probability = 80)
zone = check_zone(zone)
if(prob(probability))
return zone
var/t = rand(1, 18) // randomly pick a different zone, or maybe the same one
switch(t)
if(1)
return BODY_ZONE_HEAD
if(2)
return BODY_ZONE_CHEST
if(3 to 6)
return BODY_ZONE_L_ARM
if(7 to 10)
return BODY_ZONE_R_ARM
if(11 to 14)
return BODY_ZONE_L_LEG
if(15 to 18)
return BODY_ZONE_R_LEG
zone = check_zone(zone)
else
zone = pickweight(list(BODY_ZONE_HEAD = 6, BODY_ZONE_CHEST = 6, BODY_ZONE_L_ARM = 22, BODY_ZONE_R_ARM = 22, BODY_ZONE_L_LEG = 22, BODY_ZONE_R_LEG = 22))
return zone
/proc/above_neck(zone)
+1 -1
View File
@@ -65,7 +65,7 @@
if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0)
var/efficiency = 0.45
var/efficiency = 0.00025 + (hot_air.reaction_results["fire"]*0.01)
var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
+1 -1
View File
@@ -66,7 +66,7 @@
sparks = new
sparks.attach(src)
sparks.set_up(5, TRUE, src)
sparks.set_up(1, TRUE, src)
/obj/machinery/power/emitter/ComponentInitialize()
. = ..()
+2
View File
@@ -451,6 +451,8 @@
target.visible_message("<span class='warning'>[user] pulls the trigger!</span>", "<span class='userdanger'>[user] pulls the trigger!</span>")
playsound('sound/weapons/dink.ogg', 30, 1)
if(chambered && chambered.BB)
chambered.BB.damage *= 5
@@ -161,6 +161,7 @@
var/turf/T = get_turf(user)
process_fire(user, user, FALSE, null, BODY_ZONE_HEAD)
user.visible_message("<span class='suicide'>[user] blows [user.p_their()] brain[user.p_s()] out with [src]!</span>")
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
var/turf/target = get_ranged_target_turf(user, turn(user.dir, 180), BRAINS_BLOWN_THROW_RANGE)
B.Remove(user)
B.forceMove(T)
@@ -113,8 +113,8 @@
icon_state = "c20r[magazine ? "-[CEILING(get_ammo(0)/4, 1)*4]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
/obj/item/gun/ballistic/automatic/wt550
name = "security auto rifle"
desc = "An outdated personal defence weapon. Uses 4.6x30mm rounds and is designated the WT-550 Automatic Rifle."
name = "security semi-auto smg"
desc = "An outdated personal defence weapon. Uses 4.6x30mm rounds and is designated the WT-550 Semi-Automatic SMG."
icon_state = "wt550"
item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/wt550m9
+1
View File
@@ -184,6 +184,7 @@
if(user.is_holding(src))
user.visible_message("<span class='suicide'>[user] melts [user.p_their()] face off with [src]!</span>")
playsound(loc, fire_sound, 50, 1, -1)
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
cell.use(shot.e_cost)
update_icon()
+3
View File
@@ -18,6 +18,7 @@
var/def_zone = "" //Aiming at
var/atom/movable/firer = null//Who shot it
var/suppressed = FALSE //Attack message
var/candink = FALSE //Can this projectile play the dink sound when hitting the head?
var/yo = null
var/xo = null
var/atom/original = null // the original target clicked
@@ -185,6 +186,8 @@
playsound(loc, hitsound, volume, 1, -1)
L.visible_message("<span class='danger'>[L] is hit by \a [src][organ_hit_text]!</span>", \
"<span class='userdanger'>[L] is hit by \a [src][organ_hit_text]!</span>", null, COMBAT_MESSAGE_RANGE)
if(candink && def_zone == BODY_ZONE_HEAD)
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
L.on_hit(src)
var/reagent_note
@@ -4,6 +4,7 @@
damage = 60
damage_type = BRUTE
nodamage = FALSE
candink = TRUE
flag = "bullet"
hitsound_wall = "ricochet"
impact_effect_type = /obj/effect/temp_visual/impact_effect
@@ -5,6 +5,7 @@
knockdown = 60
forcedodge = TRUE
nodamage = TRUE
candink = FALSE
hitsound = 'sound/items/bikehorn.ogg'
icon = 'icons/obj/hydroponics/harvest.dmi'
icon_state = "banana"
@@ -745,3 +745,37 @@
taste_description = "sweet pomegranates"
glass_name = "glass of grenadine"
glass_desc = "Delicious flavored syrup."
/datum/reagent/consumable/pinkmilk
name = "Strawberry Milk"
id = "pinkmilk"
description = "A drink of a bygone era of milk and artificial sweetener back on a rock."
color = "#f76aeb"//rgb(247, 106, 235)
glass_icon_state = "pinkmilk"
quality = DRINK_FANTASTIC //Love drink
taste_description = "sweet strawberry and milk cream"
glass_name = "tall glass of strawberry milk"
glass_desc = "Delicious flavored strawberry syrup mixed with milk."
/datum/reagent/consumable/tea/pinkmilk/on_mob_life(mob/living/carbon/M)
if(prob(15))
to_chat(M, "<span class = 'notice'>[pick("You cant help to smile.","You feel nostalgia all of sudden.","You remember to relax.")]</span>")
..()
. = 1
/datum/reagent/consumable/pinktea //Tiny Tim song
name = "Strawberry Tea"
id = "pinktea"
description = "A timeless classic!"
color = "#f76aeb"//rgb(247, 106, 235)
glass_icon_state = "pinktea"
quality = DRINK_FANTASTIC //Love drink
taste_description = "sweet tea with a hint of strawberry"
glass_name = "mug of strawberry tea"
glass_desc = "Delicious traditional tea flavored with strawberries."
/datum/reagent/consumable/tea/pinktea/on_mob_life(mob/living/carbon/M)
if(prob(10))
to_chat(M, "<span class = 'notice'>[pick("Diamond skies where white deer fly.","Sipping strawberry tea.","Silver raindrops drift through timeless, Neverending June.","Crystal ... pearls free, with love!","Beaming love into me.")]</span>")
..()
. = 1
@@ -167,10 +167,10 @@
/datum/reagent/drug/methamphetamine/on_mob_add(mob/living/L)
..()
L.add_trait(TRAIT_GOTTAGOREALLYFAST, id)
L.add_trait(TRAIT_IGNORESLOWDOWN, id)
/datum/reagent/drug/methamphetamine/on_mob_delete(mob/living/L)
L.remove_trait(TRAIT_GOTTAGOREALLYFAST, id)
L.remove_trait(TRAIT_IGNORESLOWDOWN, id)
..()
/datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/M)
@@ -180,9 +180,12 @@
M.AdjustStun(-40, 0)
M.AdjustKnockdown(-40, 0)
M.AdjustUnconscious(-40, 0)
M.adjustStaminaLoss(-2, 0)
M.adjustStaminaLoss(-7.5 * REM, 0)
M.Jitter(2)
M.adjustBrainLoss(rand(1,4))
if(prob(30))
M.confused = max(1, M.confused)
M.heal_overall_damage(2, 2)
if(prob(5))
M.emote(pick("twitch", "shiver"))
..()
@@ -14,11 +14,11 @@
/obj/item/reagent_containers/pill/patch/attack(mob/living/L, mob/user)
if(ishuman(L))
var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected))
if(!L.can_inject(user, 1, affecting)) //like monkey code, thickmaterial stops patches
return
if(!affecting)
to_chat(user, "<span class='warning'>The limb is missing!</span>")
return
if(!L.can_inject(user, TRUE, user.zone_selected, FALSE, TRUE)) //stopped by clothing, not by species immunity.
return
if(affecting.status != BODYPART_ORGANIC)
to_chat(user, "<span class='notice'>Medicine won't work on a robotic limb!</span>")
return
@@ -218,8 +218,8 @@
//WT550 Mags
/datum/design/mag_oldsmg
name = "WT-550 Auto Gun Magazine (4.6x30mm)"
desc = "A 20 round magazine for the out of date security WT-550 Auto Rifle"
name = "WT-550 Semi-Auto SMG Magazine (4.6x30mm)"
desc = "A 20 round magazine for the out of date security WT-550 Semi-Auto SMG."
id = "mag_oldsmg"
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000)
@@ -228,16 +228,16 @@
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/mag_oldsmg/ap_mag
name = "WT-550 Auto Gun Armour Piercing Magazine (4.6x30mm AP)"
desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle"
name = "WT-550 Semi-Auto SMG Armour Piercing Magazine (4.6x30mm AP)"
desc = "A 20 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG."
id = "mag_oldsmg_ap"
materials = list(MAT_METAL = 6000, MAT_SILVER = 600)
build_path = /obj/item/ammo_box/magazine/wt550m9/wtap
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/mag_oldsmg/ic_mag
name = "WT-550 Auto Gun Incendiary Magazine (4.6x30mm IC)"
desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle"
name = "WT-550 Semi-Auto SMG Incendiary Magazine (4.6x30mm IC)"
desc = "A 20 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG."
id = "mag_oldsmg_ic"
materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_GLASS = 1000)
build_path = /obj/item/ammo_box/magazine/wt550m9/wtic
@@ -0,0 +1,144 @@
/*
Slimecrossing Armor
Armor added by the slimecrossing system.
Collected here for clarity.
*/
//Rebreather mask - Chilling Blue
/obj/item/clothing/mask/nobreath
name = "rebreather mask"
desc = "A transparent mask, resembling a conventional breath mask, but made of bluish slime. Seems to lack any air supply tube, though."
icon_state = "slime"
item_state = "slime"
body_parts_covered = NONE
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0
permeability_coefficient = 0.5
flags_cover = MASKCOVERSMOUTH
resistance_flags = NONE
/obj/item/clothing/mask/nobreath/equipped(mob/living/carbon/human/user, slot)
. = ..()
if(slot == SLOT_WEAR_MASK)
user.add_trait(TRAIT_NOBREATH, "breathmask_[REF(src)]")
user.failed_last_breath = FALSE
user.clear_alert("not_enough_oxy")
user.apply_status_effect(/datum/status_effect/rebreathing)
/obj/item/clothing/mask/nobreath/dropped(mob/living/carbon/human/user)
..()
user.remove_trait(TRAIT_NOBREATH, "breathmask_[REF(src)]")
user.remove_status_effect(/datum/status_effect/rebreathing)
/obj/item/clothing/glasses/prism_glasses
name = "prism glasses"
desc = "The lenses seem to glow slightly, and reflect light into dazzling colors."
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "prismglasses"
actions_types = list(/datum/action/item_action/change_prism_colour, /datum/action/item_action/place_light_prism)
var/glasses_color = "#FFFFFF"
/obj/item/clothing/glasses/prism_glasses/item_action_slot_check(slot)
if(slot == SLOT_GLASSES)
return TRUE
/obj/structure/light_prism
name = "light prism"
desc = "A shining crystal of semi-solid light. Looks fragile."
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "lightprism"
density = FALSE
anchored = TRUE
max_integrity = 10
/obj/structure/light_prism/Initialize(mapload, var/newcolor)
. = ..()
color = newcolor
light_color = newcolor
set_light(5)
/obj/structure/light_prism/attack_hand(mob/user)
to_chat(user, "<span class='notice'>You dispel [src]</span>")
qdel(src)
/datum/action/item_action/change_prism_colour
name = "Adjust Prismatic Lens"
icon_icon = 'icons/obj/slimecrossing.dmi'
button_icon_state = "prismcolor"
/datum/action/item_action/change_prism_colour/Trigger()
if(!IsAvailable())
return
var/obj/item/clothing/glasses/prism_glasses/glasses = target
var/new_color = input(owner, "Choose the lens color:", "Color change",glasses.glasses_color) as color|null
if(!new_color)
return
glasses.glasses_color = new_color
/datum/action/item_action/place_light_prism
name = "Fabricate Light Prism"
icon_icon = 'icons/obj/slimecrossing.dmi'
button_icon_state = "lightprism"
/datum/action/item_action/place_light_prism/Trigger()
if(!IsAvailable())
return
var/obj/item/clothing/glasses/prism_glasses/glasses = target
if(locate(/obj/structure/light_prism) in get_turf(owner))
to_chat(owner, "<span class='warning'>There isn't enough ambient energy to fabricate another light prism here.</span>")
return
if(istype(glasses))
if(!glasses.glasses_color)
to_chat(owner, "<span class='warning'>The lens is oddly opaque...</span>")
return
to_chat(owner, "<span class='notice'>You channel nearby light into a glowing, ethereal prism.</span>")
new /obj/structure/light_prism(get_turf(owner), glasses.glasses_color)
/obj/item/clothing/head/peaceflower
name = "heroine bud"
desc = "An extremely addictive flower, full of peace magic."
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "peaceflower"
item_state = "peaceflower"
slot_flags = ITEM_SLOT_HEAD
body_parts_covered = NONE
dynamic_hair_suffix = ""
force = 0
throwforce = 0
w_class = WEIGHT_CLASS_TINY
throw_speed = 1
throw_range = 3
/obj/item/clothing/head/peaceflower/equipped(mob/living/carbon/human/user, slot)
. = ..()
if(slot == SLOT_HEAD)
user.add_trait(TRAIT_PACIFISM, "peaceflower_[REF(src)]")
/obj/item/clothing/head/peaceflower/dropped(mob/living/carbon/human/user)
..()
user.remove_trait(TRAIT_PACIFISM, "peaceflower_[REF(src)]")
/obj/item/clothing/head/peaceflower/attack_hand(mob/user)
if(iscarbon(user))
var/mob/living/carbon/C = user
if(src == C.head)
to_chat(user, "<span class='warning'>You feel at peace. <b style='color:pink'>Why would you want anything else?</b></span>")
return
return ..()
/obj/item/clothing/suit/armor/heavy/adamantine
name = "adamantine armor"
desc = "A full suit of adamantine plate armor. Impressively resistant to damage, but weighs about as much as you do."
icon_state = "adamsuit"
item_state = "adamsuit"
flags_inv = NONE
obj_flags = IMMUTABLE_SLOW
slowdown = 4
var/hit_reflect_chance = 10 // Citadel Change: because 40% chance of bouncing lasers back into peoples faces isn't good.
armor = list("melee" = 70, "bullet" = 70, "laser" = 40, "energy" = 40, "bomb" = 80, "bio" = 80, "rad" = 80, "fire" = 70, "acid" = 90) //Citadel Change to avoid immortal Xenobiologists.
/obj/item/clothing/suit/armor/heavy/adamantine/IsReflect(def_zone)
if(def_zone in list(BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) && prob(hit_reflect_chance))
return TRUE
else
return FALSE
@@ -0,0 +1,135 @@
//Barrier cube - Chilling Grey
/obj/item/barriercube
name = "barrier cube"
desc = "A compressed cube of slime. When squeezed, it grows to massive size!"
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "barriercube"
w_class = WEIGHT_CLASS_TINY
/obj/item/barriercube/attack_self(mob/user)
if(locate(/obj/structure/barricade/slime) in get_turf(loc))
to_chat(user, "<span class='warning'>You can't fit more than one barrier in the same space!</span>")
return
to_chat(user, "<span class='notice'>You squeeze [src].</span>")
var/obj/B = new /obj/structure/barricade/slime(get_turf(loc))
B.visible_message("<span class='warning'>[src] suddenly grows into a large, gelatinous barrier!</span>")
qdel(src)
//Slime barricade - Chilling Grey
/obj/structure/barricade/slime
name = "gelatinous barrier"
desc = "A huge chunk of grey slime. Bullets might get stuck in it."
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "slimebarrier"
proj_pass_rate = 40
max_integrity = 60
//Melting Gel Wall - Chilling Metal
/obj/effect/forcefield/slimewall
name = "solidified gel"
desc = "A mass of solidified slime gel - completely impenetrable, but it's melting away!"
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "slimebarrier_thick"
CanAtmosPass = ATMOS_PASS_NO
opacity = TRUE
timeleft = 100
//Rainbow barrier - Chilling Rainbow
/obj/effect/forcefield/slimewall/rainbow
name = "rainbow barrier"
desc = "Despite others' urgings, you probably shouldn't taste this."
icon_state = "rainbowbarrier"
//Ration pack - Chilling Silver
/obj/item/reagent_containers/food/snacks/rationpack
name = "ration pack"
desc = "A square bar that sadly <i>looks</i> like chocolate, packaged in a nondescript grey wrapper. Has saved soldiers' lives before - usually by stopping bullets."
icon_state = "rationpack"
bitesize = 3
junkiness = 15
filling_color = "#964B00"
tastes = list("cardboard" = 3, "sadness" = 3)
foodtype = null //Don't ask what went into them. You're better off not knowing.
list_reagents = list("stabilizednutriment" = 10, "nutriment" = 2) //Won't make you fat. Will make you question your sanity.
/obj/item/reagent_containers/food/snacks/rationpack/checkLiked(fraction, mob/M) //Nobody likes rationpacks. Nobody.
if(last_check_time + 50 < world.time)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.mind && !H.has_trait(TRAIT_AGEUSIA))
to_chat(H,"<span class='notice'>That didn't taste very good...</span>") //No disgust, though. It's just not good tasting.
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
if(mood)
mood.add_event(null,"gross_food", /datum/mood_event/gross_food)
last_check_time = world.time
return
..()
//Ice stasis block - Chilling Dark Blue
/obj/structure/ice_stasis
name = "ice block"
desc = "A massive block of ice. You can see something vaguely humanoid inside."
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "frozen"
density = TRUE
max_integrity = 100
armor = list("melee" = 30, "bullet" = 50, "laser" = -50, "energy" = -50, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = -80, "acid" = 30)
/obj/structure/ice_stasis/Initialize()
. = ..()
playsound(src, 'sound/magic/ethereal_exit.ogg', 50, 1)
/obj/structure/ice_stasis/Destroy()
for(var/atom/movable/M in contents)
M.forceMove(loc)
playsound(src, 'sound/effects/glassbr3.ogg', 50, 1)
return ..()
//Gold capture device - Chilling Gold
/obj/item/capturedevice
name = "gold capture device"
desc = "Bluespace technology packed into a roughly egg-shaped device, used to store nonhuman creatures. Can't catch them all, though - it only fits one."
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "capturedevice"
/obj/item/capturedevice/attack(mob/living/M, mob/user)
if(length(contents))
to_chat(user, "<span class='warning'>The device already has something inside.</span>")
return
if(!isanimal(M))
to_chat(user, "<span class='warning'>The capture device only works on simple creatures.</span>")
return
if(M.mind)
to_chat(user, "<span class='notice'>You offer the device to [M].</span>")
if(alert(M, "Would you like to enter [user]'s capture device?", "Gold Capture Device", "Yes", "No") == "Yes")
if(user.canUseTopic(src, BE_CLOSE) && user.canUseTopic(M, BE_CLOSE))
to_chat(user, "<span class='notice'>You store [M] in the capture device.</span>")
to_chat(M, "<span class='notice'>The world warps around you, and you're suddenly in an endless void, with a window to the outside floating in front of you.</span>")
store(M, user)
else
to_chat(user, "<span class='warning'>You were too far away from [M].</span>")
to_chat(M, "<span class='warning'>You were too far away from [user].</span>")
else
to_chat(user, "<span class='warning'>[M] refused to enter the device.</span>")
return
else
if(istype(M, /mob/living/simple_animal/hostile) && !("neutral" in M.faction))
to_chat(user, "<span class='warning'>This creature is too aggressive to capture.</span>")
return
to_chat(user, "<span class='notice'>You store [M] in the capture device.</span>")
store(M)
/obj/item/capturedevice/attack_self(mob/user)
if(contents.len)
to_chat(user, "<span class='notice'>You open the capture device!</span>")
release()
else
to_chat(user, "<span class='warning'>The device is empty...</span>")
/obj/item/capturedevice/proc/store(var/mob/living/M)
M.forceMove(src)
/obj/item/capturedevice/proc/release()
for(var/atom/movable/M in contents)
M.forceMove(get_turf(loc))
@@ -0,0 +1,13 @@
//Slime corgi - Chilling Pink
/mob/living/simple_animal/pet/dog/corgi/puppy/slime
name = "\improper slime corgi puppy"
real_name = "slime corgi puppy"
desc = "An unbearably cute pink slime corgi puppy."
icon_state = "slime_puppy"
icon_living = "slime_puppy"
icon_dead = "slime_puppy_dead"
nofur = TRUE
gold_core_spawnable = NO_SPAWN
speak_emote = list("blorbles", "bubbles", "borks")
emote_hear = list("bubbles!", "splorts.", "splops!")
emote_see = list("gets goop everywhere.", "flops.", "jiggles!")
@@ -57,6 +57,184 @@
owner.visible_message("<span class='warning'>[owner]'s gel coating liquefies and dissolves away.</span>",
"<span class='notice'>Your gel second-skin dissolves!</span>")
/datum/status_effect/slimerecall
id = "slime_recall"
duration = -1 //Will be removed by the extract.
alert_type = null
var/interrupted = FALSE
var/mob/target
var/icon/bluespace
var/datum/weakref/redirect_component
/datum/status_effect/slimerecall/on_apply()
redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/resistField))))
to_chat(owner, "<span class='danger'>You feel a sudden tug from an unknown force, and feel a pull to bluespace!</span>")
to_chat(owner, "<span class='notice'>Resist if you wish avoid the force!</span>")
bluespace = icon('icons/effects/effects.dmi',"chronofield")
owner.add_overlay(bluespace)
return ..()
/datum/status_effect/slimerecall/proc/resistField()
interrupted = TRUE
owner.remove_status_effect(src)
/datum/status_effect/slimerecall/on_remove()
qdel(redirect_component.resolve())
redirect_component = null
owner.cut_overlay(bluespace)
if(interrupted || !ismob(target))
to_chat(owner, "<span class='warning'>The bluespace tug fades away, and you feel that the force has passed you by.</span>")
return
owner.visible_message("<span class='warning'>[owner] disappears in a flurry of sparks!</span>",
"<span class='warning'>The unknown force snatches briefly you from reality, and deposits you next to [target]!</span>")
do_sparks(3, TRUE, owner)
owner.forceMove(target.loc)
/obj/screen/alert/status_effect/freon/stasis
desc = "You're frozen inside of a protective ice cube! While inside, you can't do anything, but are immune to harm! Resist to get out."
/datum/status_effect/frozenstasis
id = "slime_frozen"
status_type = STATUS_EFFECT_UNIQUE
duration = -1 //Will remove self when block breaks.
alert_type = /obj/screen/alert/status_effect/freon/stasis
var/obj/structure/ice_stasis/cube
var/datum/weakref/redirect_component
/datum/status_effect/frozenstasis/on_apply()
redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/breakCube))))
cube = new /obj/structure/ice_stasis(get_turf(owner))
owner.forceMove(cube)
owner.status_flags |= GODMODE
return ..()
/datum/status_effect/frozenstasis/tick()
if(!cube || owner.loc != cube)
owner.remove_status_effect(src)
/datum/status_effect/frozenstasis/proc/breakCube()
owner.remove_status_effect(src)
/datum/status_effect/frozenstasis/on_remove()
if(cube)
qdel(cube)
owner.status_flags &= ~GODMODE
qdel(redirect_component.resolve())
redirect_component = null
/datum/status_effect/slime_clone
id = "slime_cloned"
status_type = STATUS_EFFECT_UNIQUE
duration = -1
alert_type = null
var/mob/living/clone
var/datum/mind/originalmind //For when the clone gibs.
/datum/status_effect/slime_clone/on_apply()
var/typepath = owner.type
clone = new typepath(owner.loc)
var/mob/living/carbon/O = owner
var/mob/living/carbon/C = clone
if(istype(C) && istype(O))
C.real_name = O.real_name
O.dna.transfer_identity(C)
C.updateappearance(mutcolor_update=1)
if(owner.mind)
originalmind = owner.mind
owner.mind.transfer_to(clone)
clone.apply_status_effect(/datum/status_effect/slime_clone_decay)
return ..()
/datum/status_effect/slime_clone/tick()
if(!istype(clone) || clone.stat != CONSCIOUS)
owner.remove_status_effect(src)
/datum/status_effect/slime_clone/on_remove()
if(clone && clone.mind && owner)
clone.mind.transfer_to(owner)
else
if(owner && originalmind)
originalmind.transfer_to(owner)
if(originalmind.key)
owner.ckey = originalmind.key
if(clone)
clone.unequip_everything()
qdel(clone)
/obj/screen/alert/status_effect/clone_decay
name = "Clone Decay"
desc = "You are simply a construct, and cannot maintain this form forever. You will be returned to your original body if you should fall."
icon_state = "slime_clonedecay"
/datum/status_effect/slime_clone_decay
id = "slime_clonedecay"
status_type = STATUS_EFFECT_UNIQUE
duration = -1
alert_type = /obj/screen/alert/status_effect/clone_decay
/datum/status_effect/slime_clone_decay/tick()
owner.adjustToxLoss(1, 0)
owner.adjustOxyLoss(1, 0)
owner.adjustBruteLoss(1, 0)
owner.adjustFireLoss(1, 0)
owner.color = "#007BA7"
/obj/screen/alert/status_effect/bloodchill
name = "Bloodchilled"
desc = "You feel a shiver down your spine after getting hit with a glob of cold blood. You'll move slower and get frostbite for a while!"
icon_state = "bloodchill"
/datum/status_effect/bloodchill
id = "bloodchill"
duration = 100
alert_type = /obj/screen/alert/status_effect/bloodchill
/datum/status_effect/bloodchill/on_apply()
owner.add_movespeed_modifier("bloodchilled", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = 3)
return ..()
/datum/status_effect/bloodchill/tick()
if(prob(50))
owner.adjustFireLoss(2)
/datum/status_effect/bloodchill/on_remove()
owner.remove_movespeed_modifier("bloodchilled")
/obj/screen/alert/status_effect/bloodchill
name = "Bloodchilled"
desc = "You feel a shiver down your spine after getting hit with a glob of cold blood. You'll move slower and get frostbite for a while!"
icon_state = "bloodchill"
/datum/status_effect/bonechill
id = "bonechill"
duration = 80
alert_type = /obj/screen/alert/status_effect/bonechill
/datum/status_effect/bonechill/on_apply()
owner.add_movespeed_modifier("bonechilled", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = 3)
return ..()
/datum/status_effect/bonechill/tick()
if(prob(50))
owner.adjustFireLoss(1)
owner.Jitter(3)
owner.adjust_bodytemperature(-10)
/datum/status_effect/bonechill/on_remove()
owner.remove_movespeed_modifier("bonechilled")
/obj/screen/alert/status_effect/bonechill
name = "Bonechilled"
desc = "You feel a shiver down your spine after hearing the haunting noise of bone rattling. You'll move slower and get frostbite for a while!"
icon_state = "bloodchill"
/datum/status_effect/rebreathing
id = "rebreathing"
duration = -1
alert_type = null
datum/status_effect/rebreathing/tick()
owner.adjustOxyLoss(-6, 0) //Just a bit more than normal breathing.
///////////////////////////////////////////////////////
//////////////////CONSUMING EXTRACTS///////////////////
///////////////////////////////////////////////////////
@@ -0,0 +1,45 @@
//Bloodchiller - Chilling Green
/obj/item/gun/magic/bloodchill
name = "blood chiller"
desc = "A horrifying weapon made of your own bone and blood vessels. It shoots slowing globules of your own blood. Ech."
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "bloodgun"
item_state = "bloodgun"
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
item_flags = ABSTRACT | DROPDEL | NODROP
w_class = WEIGHT_CLASS_HUGE
force = 5
max_charges = 1 //Recharging costs blood.
recharge_rate = 1
ammo_type = /obj/item/ammo_casing/magic/bloodchill
fire_sound = 'sound/effects/attackblob.ogg'
/obj/item/gun/magic/bloodchill/process()
charge_tick++
if(charge_tick < recharge_rate || charges >= max_charges)
return 0
charge_tick = 0
var/mob/living/M = loc
if(istype(M) && M.blood_volume >= 20)
charges++
M.blood_volume -= 20
if(charges == 1)
recharge_newshot()
return 1
/obj/item/ammo_casing/magic/bloodchill
projectile_type = /obj/item/projectile/magic/bloodchill
/obj/item/projectile/magic/bloodchill
name = "blood ball"
icon_state = "pulse0_bl"
damage = 0
damage_type = OXY
nodamage = 1
hitsound = 'sound/effects/splat.ogg'
/obj/item/projectile/magic/bloodchill/on_hit(mob/living/target)
. = ..()
if(isliving(target))
target.apply_status_effect(/datum/status_effect/bloodchill)
@@ -0,0 +1,312 @@
/*
Chilling extracts:
Have a unique, primarily defensive effect when
filled with 10u plasma and activated in-hand.
*/
/obj/item/slimecross/chilling
name = "chilling extract"
desc = "It's cold to the touch, as if frozen solid."
effect = "chilling"
container_type = INJECTABLE | DRAWABLE
icon_state = "chilling"
/obj/item/slimecross/chilling/Initialize()
. = ..()
create_reagents(10)
/obj/item/slimecross/chilling/attack_self(mob/user)
if(!reagents.has_reagent("plasma",10))
to_chat(user, "<span class='warning'>This extract needs to be full of plasma to activate!</span>")
return
reagents.remove_reagent("plasma",10)
to_chat(user, "<span class='notice'>You squeeze the extract, and it absorbs the plasma!</span>")
playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
playsound(src, 'sound/effects/glassbr1.ogg', 50, 1)
do_effect(user)
/obj/item/slimecross/chilling/proc/do_effect(mob/user) //If, for whatever reason, you don't want to delete the extract, don't do ..()
qdel(src)
return
/obj/item/slimecross/chilling/grey
colour = "grey"
/obj/item/slimecross/chilling/grey/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] produces a few small, grey cubes</span>")
for(var/i in 1 to 3)
new /obj/item/barriercube(get_turf(user))
..()
/obj/item/slimecross/chilling/orange
colour = "orange"
/obj/item/slimecross/chilling/orange/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] shatters, and lets out a jet of heat!</span>")
for(var/turf/T in orange(get_turf(user),2))
if(get_dist(get_turf(user), T) > 1)
new /obj/effect/hotspot(T)
..()
/obj/item/slimecross/chilling/purple
colour = "purple"
/obj/item/slimecross/chilling/purple/do_effect(mob/user)
var/area/A = get_area(get_turf(user))
if(A.outdoors)
to_chat(user, "<span class='warning'>[src] can't affect such a large area.</span>")
return
user.visible_message("<span class='notice'>[src] shatters, and a healing aura fills the room briefly.</span>")
for(var/mob/living/carbon/C in A)
C.reagents.add_reagent("regen_jelly",10)
..()
/obj/item/slimecross/chilling/blue
colour = "blue"
/obj/item/slimecross/chilling/blue/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] cracks, and spills out a liquid goo, which reforms into a mask!</span>")
new /obj/item/clothing/mask/nobreath(get_turf(user))
..()
/obj/item/slimecross/chilling/metal
colour = "metal"
/obj/item/slimecross/chilling/metal/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] melts like quicksilver, and surrounds [user] in a wall!</span>")
for(var/turf/T in orange(get_turf(user),1))
if(get_dist(get_turf(user), T) > 0)
new /obj/effect/forcefield/slimewall(T)
..()
/obj/item/slimecross/chilling/yellow
colour = "yellow"
/obj/item/slimecross/chilling/yellow/do_effect(mob/user)
var/area/A = get_area(get_turf(user))
user.visible_message("<span class='notice'>[src] shatters, and a the air suddenly feels charged for a moment.</span>")
for(var/obj/machinery/power/apc/C in A)
if(C.cell)
C.cell.charge = min(C.cell.charge + C.cell.maxcharge/2, C.cell.maxcharge)
..()
/obj/item/slimecross/chilling/darkpurple
colour = "dark purple"
/obj/item/slimecross/chilling/darkpurple/do_effect(mob/user)
var/area/A = get_area(get_turf(user))
if(A.outdoors)
to_chat(user, "<span class='warning'>[src] can't affect such a large area.</span>")
return
var/filtered = FALSE
for(var/turf/open/T in A)
var/datum/gas_mixture/G = T.air
if(istype(G))
G.assert_gas(/datum/gas/plasma)
G.gases[/datum/gas/plasma][MOLES] = 0
filtered = TRUE
G.garbage_collect()
T.air_update_turf()
if(filtered)
user.visible_message("<span class='notice'>Cracks spread throughout [src], and some air is sucked in!</span>")
else
user.visible_message("<span class='notice'>[src] cracks, but nothing happens.</span>")
..()
/obj/item/slimecross/chilling/darkblue
colour = "dark blue"
/obj/item/slimecross/chilling/darkblue/do_effect(mob/user)
if(isliving(user))
user.visible_message("<span class='notice'>[src] freezes over [user]'s entire body!</span>")
var/mob/living/M = user
M.apply_status_effect(/datum/status_effect/frozenstasis)
..()
/obj/item/slimecross/chilling/silver
colour = "silver"
/obj/item/slimecross/chilling/silver/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] crumbles into icy powder, leaving behind several emergency food supplies!</span>")
var/amount = rand(5, 10)
for(var/i in 1 to amount)
new /obj/item/reagent_containers/food/snacks/rationpack(get_turf(user))
..()
/obj/item/slimecross/chilling/bluespace
colour = "bluespace"
var/list/allies = list()
var/active = FALSE
/obj/item/slimecross/chilling/bluespace/afterattack(atom/target, mob/user, proximity)
if(!proximity || !isliving(target) || active)
return
if(target in allies)
allies -= target
to_chat(user, "<span class='notice'>You unlink [src] with [target].</span>")
else
allies |= target
to_chat(user, "<span class='notice'>You link [src] with [target].</span>")
return
/obj/item/slimecross/chilling/bluespace/do_effect(mob/user)
if(allies.len <= 0)
to_chat(user, "<span class='warning'>[src] is not linked to anyone!</span>")
return
to_chat(user, "<span class='notice'>You feel [src] pulse as it begins charging bluespace energies...</span>")
active = TRUE
for(var/mob/living/M in allies)
var/datum/status_effect/slimerecall/S = M.apply_status_effect(/datum/status_effect/slimerecall)
S.target = user
if(do_after(user, 100, target=src))
to_chat(user, "<span class='notice'>[src] shatters as it tears a hole in reality, snatching the linked individuals from the void!</span>")
for(var/mob/living/M in allies)
var/datum/status_effect/slimerecall/S = M.has_status_effect(/datum/status_effect/slimerecall)
M.remove_status_effect(S)
else
to_chat(user, "<span class='warning'>[src] falls dark, dissolving into nothing as the energies fade away.</span>")
for(var/mob/living/M in allies)
var/datum/status_effect/slimerecall/S = M.has_status_effect(/datum/status_effect/slimerecall)
if(istype(S))
S.interrupted = TRUE
M.remove_status_effect(S)
..()
/obj/item/slimecross/chilling/sepia
colour = "sepia"
var/list/allies = list()
/obj/item/slimecross/chilling/sepia/afterattack(atom/target, mob/user, proximity)
if(!proximity || !isliving(target))
return
if(target in allies)
allies -= target
to_chat(user, "<span class='notice'>You unlink [src] with [target].</span>")
else
allies |= target
to_chat(user, "<span class='notice'>You link [src] with [target].</span>")
return
/obj/item/slimecross/chilling/sepia/do_effect(mob/user)
user.visible_message("<span class='warning'>[src] shatters, freezing time itself!</span>")
new /obj/effect/timestop(get_turf(user), 2, 300, allies)
..()
/obj/item/slimecross/chilling/cerulean
colour = "cerulean"
/obj/item/slimecross/chilling/cerulean/do_effect(mob/user)
if(isliving(user))
user.visible_message("<span class='warning'>[src] creaks and shifts into a clone of [user]!</span>")
var/mob/living/M = user
M.apply_status_effect(/datum/status_effect/slime_clone)
..()
/obj/item/slimecross/chilling/pyrite
colour = "pyrite"
/obj/item/slimecross/chilling/pyrite/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] crystallizes into a pair of spectacles!</span>")
new /obj/item/clothing/glasses/prism_glasses(get_turf(user))
..()
/obj/item/slimecross/chilling/red
colour = "red"
/obj/item/slimecross/chilling/red/do_effect(mob/user)
var/slimesfound = FALSE
for(var/mob/living/simple_animal/slime/S in view(get_turf(user), 7))
slimesfound = TRUE
S.docile = TRUE
if(slimesfound)
user.visible_message("<span class='notice'>[src] lets out a peaceful ring as it shatters, and nearby slimes seem calm.</span>")
else
user.visible_message("<span class='notice'>[src] lets out a peaceful ring as it shatters, but nothing happens...</span>")
..()
/obj/item/slimecross/chilling/green
colour = "green"
/obj/item/slimecross/chilling/green/do_effect(mob/user)
var/which_hand = "l_hand"
if(!(user.active_hand_index % 2))
which_hand = "r_hand"
var/mob/living/L = user
if(!istype(user))
return
var/obj/item/held = L.get_active_held_item() //This should be itself, but just in case...
L.dropItemToGround(held)
var/obj/item/gun/magic/bloodchill/gun = new(user)
if(!L.put_in_hands(gun))
qdel(gun)
user.visible_message("<span class='warning'>[src] flash-freezes [user]'s arm, cracking the flesh horribly!</span>")
else
user.visible_message("<span class='danger'>[src] chills and snaps off the front of the bone on [user]'s arm, leaving behind a strange, gun-like structure!</span>")
user.emote("scream")
L.apply_damage(30,BURN,which_hand)
..()
/obj/item/slimecross/chilling/pink
colour = "pink"
/obj/item/slimecross/chilling/pink/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] cracks like an egg, and an adorable puppy comes tumbling out!</span>")
new /mob/living/simple_animal/pet/dog/corgi/puppy/slime(get_turf(user))
..()
/obj/item/slimecross/chilling/gold
colour = "gold"
/obj/item/slimecross/chilling/gold/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] lets off golden light as it melts and reforms into an egg-like device!</span>")
new /obj/item/capturedevice(get_turf(user))
..()
/obj/item/slimecross/chilling/oil
colour = "oil"
/obj/item/slimecross/chilling/oil/do_effect(mob/user)
user.visible_message("<span class='danger'>[src] begins to shake with muted intensity!</span>")
addtimer(CALLBACK(src, .proc/boom), 50)
/obj/item/slimecross/chilling/oil/proc/boom()
explosion(get_turf(src), -1, -1, 3, 10) //Large radius, but mostly light damage.
qdel(src)
/obj/item/slimecross/chilling/black
colour = "black"
/obj/item/slimecross/chilling/black/do_effect(mob/user)
if(ishuman(user))
user.visible_message("<span class='notice'>[src] crystallizes along [user]'s skin, turning into metallic scales!</span>")
var/mob/living/carbon/human/H = user
H.set_species(/datum/species/golem/random)
..()
/obj/item/slimecross/chilling/lightpink
colour = "light pink"
/obj/item/slimecross/chilling/lightpink/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] blooms into a beautiful flower!</span>")
new /obj/item/clothing/head/peaceflower(get_turf(user))
..()
/obj/item/slimecross/chilling/adamantine
colour = "adamantine"
/obj/item/slimecross/chilling/adamantine/do_effect(mob/user)
user.visible_message("<span class='notice'>[src] creaks and breaks as it shifts into a heavy set of armor!</span>")
new /obj/item/clothing/suit/armor/heavy/adamantine(get_turf(user))
..()
/obj/item/slimecross/chilling/rainbow
colour = "rainbow"
/obj/item/slimecross/chilling/rainbow/do_effect(mob/user)
var/area/area = get_area(user)
if(area.outdoors)
to_chat(user, "<span class='warning'>[src] can't affect such a large area.</span>")
return
user.visible_message("<span class='warning'>[src] reflects an array of dazzling colors and light, energy rushing to nearby doors!</span>")
for(var/obj/machinery/door/airlock/door in area)
new /obj/effect/forcefield/slimewall/rainbow(door.loc)
return ..()
@@ -840,7 +840,7 @@
return
if(isitem(C))
var/obj/item/I = C
if(I.slowdown <= 0)
if(I.slowdown <= 0 || I.obj_flags & IMMUTABLE_SLOW)
to_chat(user, "<span class='warning'>The [C] can't be made any faster!</span>")
return ..()
I.slowdown = 0
+1 -1
View File
@@ -27,7 +27,7 @@
/datum/surgery_step/revive
name = "repair body"
implements = list(/obj/item/twohanded/shockpaddles = 100, /obj/item/melee/baton = 75, /obj/item/gun/energy = 60)
implements = list(/obj/item/twohanded/shockpaddles = 100, /obj/item/abductor/gizmo = 100, /obj/item/melee/baton = 75, /obj/item/organ/cyberimp/arm/baton = 75, /obj/item/organ/cyberimp/arm/gun/taser = 60, /obj/item/gun/energy/e_gun/advtaser = 60, /obj/item/gun/energy/taser = 60)
time = 120
/datum/surgery_step/revive/tool_check(mob/user, obj/item/tool)
@@ -0,0 +1,4 @@
author: "deathride58"
delete-after: True
changes:
- balance: "The TEG will now only produce a meaningful amount of power if the hot pipe contains gas that's actively combusting"
@@ -0,0 +1,4 @@
author: "deathride58"
delete-after: True
changes:
- rscadd: "Jogging is no longer treated exactly the same as sprinting for water slips. When you're jogging, you will only slip on water if you have more than 20% staminaloss."
@@ -0,0 +1,5 @@
author: "deathride58"
delete-after: True
changes:
- rscadd: "Bloodcult conversions are now consensual. Convertees are given a ten second timer to accept or wait out. This should drastically improve the quality of those that get converted into bloodcult."
- rscadd: "All sacrifices now count as a third of a cultist for the end-game narsie summon."
@@ -0,0 +1,4 @@
author: "Poojawa"
delete-after: True
changes:
- tweak: "Clone pods no longer announce the name of the clone"
@@ -0,0 +1,5 @@
author: "deathride58 (Original PR by actioninja)"
delete-after: True
changes:
- rscadd: "Disarm pushing (combat mode right click in disarm intent) will now actually push mobs away. Knockdowns from disarm pushing are no longer rng based on the target's staminaloss. Knockdowns from disarm pushing now only happen when you push someone into another mob, a table, or a wall. Pushes will now also temporarily stop targets from using firearms, and will disarm the firearm if performed a second time. Pushes still deal staminaloss to standing targets, and won't deal a single ounce of staminaloss to resting targets."
- rscdel: "You can no longer displace mobs that are in harm intent by simply walking into them. Mobs that aren't in help intent have to be disarm pushed to actually be moved."
@@ -0,0 +1,5 @@
author: "deathride58"
delete-after: True
changes:
- bugfix: "Transit turfs on the centcom z-level now function properly again at keeping mobs within the areas defined by their boundaries."
- bugfix: "The title screen is also positioned correctly again."
@@ -0,0 +1,4 @@
author: "Coolgat3"
delete-after: True
changes:
- bugfix: "Made the sec and warden berret offer as much protection like the helmet"
@@ -0,0 +1,5 @@
author: "Ghommie"
delete-after: True
changes:
- bugfix: "Fixes chemical patches always checking the suit slot even if the targetted limb was the head."
- bugfix: "Skeleton, nightmare and golem races are once again available to get chemical patches applied onto."
@@ -0,0 +1,4 @@
author: "Ghommie"
delete-after: True
changes:
- rscadd: "Adds two cartons of space milk to the space skellie pirates cutter's fridge."
@@ -0,0 +1,4 @@
author: "izzyinbox"
delete-after: True
changes:
- tweak: "lowered the player age for command jobs to 1/3 of their previous setting"
@@ -0,0 +1,6 @@
author: "deathride58"
delete-after: True
changes:
- tweak: "Ghost role eligibility for both event and spawner ghost roles is now affected by DNR status. If you suicide, ghost, or cryo out, you will be unable to qualify for any ghost roles"
- tweak: "Cryo now applies DNR status no matter how long the round has been going on"
- tweak: "Suicide is now properly admin logged as it is supposed to be. Ghosting while alive is now also logged."
@@ -0,0 +1,5 @@
author: "deathride58"
delete-after: True
changes:
- bugfix: "Sparks and igniters will now actually heat areas rather than cooling them, as was intended."
- tweak: "To alleviate some potential complaints, RPDs now have a cooldown before they can create sparks, and both RPDs and emitters produce less sparks."
@@ -0,0 +1,5 @@
author: "deathride58"
delete-after: True
changes:
- tweak: "Conversion runes will now mute the victim temporarily while they're deciding whether to convert or be sacrificed."
- bugfix: "Conversion runes no longer require a third cultist to sacrifice if the victim refuses conversion"
@@ -0,0 +1,4 @@
author: "deathride58"
delete-after: True
changes:
- bugfix: "Staminaloss targeted at the head now properly redirects to the chest."
@@ -0,0 +1,4 @@
author: "Poojawa"
delete-after: True
changes:
- bugfix: "fixed flavor text appearing when your face is hidden but you're not an Unknown"
@@ -0,0 +1,4 @@
author: "Poojawa"
delete-after: True
changes:
- bugfix: "Tauric suits now apply an (placeholder) blood overlay, as well as their shield overlay."
@@ -0,0 +1,4 @@
author: "deathride58"
delete-after: True
changes:
- code_imp: "In an attempt to improve performance during highpop, mouse movements will now only call onmousemove() while a user is in combat mode"
@@ -0,0 +1,4 @@
author: "deathride58"
delete-after: True
changes:
- tweak: "Ballistic projectiles are now the only projectiles capable of emitting dinks."

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