diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 74353835d33..e05b93216be 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -2493,7 +2493,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/door/airlock/maintenance_hatch{
name = "Maintenance Hatch";
- req_access_txt = "12"
+ req_access_txt = "0";
+ req_one_access_txt = "32;47;48"
},
/obj/effect/turf_decal/stripes/line{
dir = 2
@@ -9688,7 +9689,7 @@
/obj/structure/table/wood,
/obj/effect/decal/cleanable/dirt,
/obj/item/clothing/suit/suspenders,
-/obj/effect/landmark/costume,
+/obj/effect/spawner/lootdrop/costume,
/turf/open/floor/plasteel/redblue,
/area/maintenance/fpmaint2/fore_port_maintenance)
"atx" = (
@@ -32058,7 +32059,7 @@
/area/space)
"bjo" = (
/obj/structure/rack,
-/obj/effect/landmark/costume,
+/obj/effect/spawner/lootdrop/costume,
/obj/effect/spawner/lootdrop/maintenance{
lootcount = 2;
name = "2maintenance loot spawner"
@@ -38443,10 +38444,13 @@
/turf/closed/wall/r_wall,
/area/engine/break_room)
"bvt" = (
-/obj/machinery/computer/atmos_control,
/obj/machinery/status_display{
pixel_x = -32
},
+/obj/structure/cable/white{
+ icon_state = "0-4"
+ },
+/obj/machinery/modular_computer/console/preset/engineering,
/turf/open/floor/plasteel/caution{
dir = 8
},
@@ -38466,6 +38470,9 @@
name = "Atmospheric Technician"
},
/obj/effect/turf_decal/bot,
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel,
/area/atmos)
"bvw" = (
@@ -57270,9 +57277,6 @@
/turf/open/floor/plating,
/area/engine/engineering)
"cde" = (
-/obj/machinery/computer/monitor{
- name = "Engineering Power Monitoring Console"
- },
/obj/machinery/firealarm{
dir = 8;
pixel_x = -24;
@@ -57289,6 +57293,7 @@
dir = 1;
name = "engineering camera"
},
+/obj/machinery/modular_computer/console/preset/engineering,
/turf/open/floor/plasteel/vault,
/area/engine/engineering)
"cdf" = (
@@ -97079,8 +97084,8 @@
})
"dAG" = (
/obj/structure/rack,
-/obj/effect/landmark/costume,
-/obj/effect/landmark/costume,
+/obj/effect/spawner/lootdrop/costume,
+/obj/effect/spawner/lootdrop/costume,
/obj/item/clothing/neck/tie/black,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/neutral/side{
@@ -97796,8 +97801,8 @@
"dBY" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/rack,
-/obj/effect/landmark/costume,
-/obj/effect/landmark/costume,
+/obj/effect/spawner/lootdrop/costume,
+/obj/effect/spawner/lootdrop/costume,
/obj/effect/spawner/lootdrop/maintenance,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/neutral/side{
@@ -98551,7 +98556,7 @@
})
"dDp" = (
/obj/structure/closet/crate,
-/obj/effect/landmark/costume,
+/obj/effect/spawner/lootdrop/costume,
/obj/effect/spawner/lootdrop/maintenance,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
@@ -103451,7 +103456,7 @@
/area/maintenance/fpmaint2/aft_port_maintenance)
"dMJ" = (
/obj/structure/closet,
-/obj/effect/landmark/costume,
+/obj/effect/spawner/lootdrop/costume,
/obj/effect/spawner/lootdrop/maintenance,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -111346,7 +111351,7 @@
/obj/structure/table/wood,
/obj/effect/decal/cleanable/dirt,
/obj/item/clothing/shoes/jackboots,
-/obj/effect/landmark/costume,
+/obj/effect/spawner/lootdrop/costume,
/obj/structure/sign/poster/contraband/random{
pixel_y = -32
},
@@ -112886,6 +112891,15 @@
/area/engine/gravity_generator{
name = "Atmospherics Engine"
})
+"ehz" = (
+/obj/structure/chair/office/dark{
+ dir = 8
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/neutral,
+/area/atmos)
(1,1,1) = {"
aaa
@@ -139729,7 +139743,7 @@ bqf
brq
bsD
aZq
-bvu
+ehz
bvu
byX
aIZ
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 7c61f5d7e3d..c26ba78c62c 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -9905,7 +9905,7 @@
/area/maintenance/starboard)
"arI" = (
/obj/structure/rack,
-/obj/effect/landmark/costume,
+/obj/effect/spawner/lootdrop/costume,
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/starboard)
@@ -23791,9 +23791,6 @@
d2 = 4;
icon_state = "0-4"
},
-/obj/machinery/computer/monitor{
- name = "Engineering Power Monitoring Console"
- },
/obj/machinery/status_display{
density = 0;
layer = 4;
@@ -23805,6 +23802,7 @@
dir = 2;
network = list("SS13")
},
+/obj/machinery/modular_computer/console/preset/engineering,
/turf/open/floor/plasteel/vault,
/area/engine/engineering)
"aPX" = (
@@ -24416,8 +24414,8 @@
/area/crew_quarters/locker)
"aRa" = (
/obj/structure/rack,
-/obj/effect/landmark/costume,
-/obj/effect/landmark/costume,
+/obj/effect/spawner/lootdrop/costume,
+/obj/effect/spawner/lootdrop/costume,
/obj/item/clothing/mask/balaclava,
/obj/machinery/airalarm{
dir = 8;
@@ -51223,8 +51221,8 @@
dir = 8;
layer = 2.9
},
-/obj/effect/landmark/costume,
-/obj/effect/landmark/costume,
+/obj/effect/spawner/lootdrop/costume,
+/obj/effect/spawner/lootdrop/costume,
/turf/open/floor/plating,
/area/maintenance/fpmaint2{
name = "Port Maintenance"
@@ -51235,8 +51233,8 @@
dir = 8;
layer = 2.9
},
-/obj/effect/landmark/costume,
-/obj/effect/landmark/costume,
+/obj/effect/spawner/lootdrop/costume,
+/obj/effect/spawner/lootdrop/costume,
/turf/open/floor/plating,
/area/maintenance/fpmaint2{
name = "Port Maintenance"
@@ -81754,7 +81752,7 @@
})
"cJY" = (
/obj/structure/rack,
-/obj/effect/landmark/costume,
+/obj/effect/spawner/lootdrop/costume,
/obj/effect/spawner/lootdrop/maintenance{
lootcount = 2;
name = "2maintenance loot spawner"
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index 5a1b933d94c..acc7e47806a 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -776,9 +776,10 @@
tag = "icon-0-2";
icon_state = "0-2"
},
-/obj/structure/grille,
-/obj/structure/window/reinforced/fulltile,
-/turf/open/floor/plating,
+/obj/machinery/modular_computer/console/preset/command,
+/turf/open/floor/plasteel/vault{
+ dir = 5
+ },
/area/bridge)
"abo" = (
/turf/open/floor/plasteel/vault{
@@ -21889,12 +21890,12 @@
icon_state = "1-2"
},
/obj/effect/turf_decal/bot,
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aIx" = (
-/obj/machinery/computer/monitor{
- name = "Engineering Power Monitoring Console"
- },
/obj/machinery/light_switch{
pixel_x = 38;
pixel_y = 24
@@ -21907,6 +21908,7 @@
req_access_txt = "10"
},
/obj/effect/turf_decal/bot,
+/obj/machinery/modular_computer/console/preset/engineering,
/turf/open/floor/plasteel,
/area/engine/engineering)
"aIy" = (
@@ -41983,6 +41985,16 @@
},
/turf/open/floor/circuit/green,
/area/engine/engineering)
+"buW" = (
+/obj/structure/cable/white{
+ tag = "icon-0-2";
+ icon_state = "0-2"
+ },
+/obj/machinery/modular_computer/console/preset/research,
+/turf/open/floor/plasteel/vault{
+ dir = 5
+ },
+/area/bridge)
(1,1,1) = {"
aaa
@@ -84210,7 +84222,7 @@ aav
aaH
aaQ
abb
-abn
+buW
abF
ack
adc
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 13827c71fde..94b70c5c371 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -45713,13 +45713,11 @@
},
/area/engine/engineering)
"bME" = (
-/obj/machinery/computer/monitor{
- name = "Engineering Power Monitoring Console"
- },
/obj/structure/cable{
icon_state = "0-2";
d2 = 2
},
+/obj/machinery/modular_computer/console/preset/engineering,
/turf/open/floor/plasteel/yellow/side{
dir = 1
},
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index 3bdd86ae399..bc5816dbb91 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -1,6 +1,12 @@
//These are all the different status effects. Use the paths for each effect in the defines.
+#define STATUS_EFFECT_MULTIPLE 0 //if it allows multiple instances of the effect
+
+#define STATUS_EFFECT_UNIQUE 1 //if it allows only one, preventing new instances
+
+#define STATUS_EFFECT_REPLACE 2 //if it allows only one, but new instances replace
+
#define BASIC_STATUS_EFFECT /datum/status_effect //Has no effect.
///////////
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 1cf1c184c97..7f14d9d5b12 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -214,7 +214,7 @@ Proc for attack log creation, because really why not
stoplag()
if (progress)
progbar.update(world.time - starttime)
- if(!user || !target)
+ if(QDELETED(user) || QDELETED(target))
. = 0
break
if(uninterruptible)
@@ -266,11 +266,11 @@ Proc for attack log creation, because really why not
drifting = 0
Uloc = user.loc
- if(!user || user.stat || user.weakened || user.stunned || (!drifting && user.loc != Uloc) || (extra_checks && !extra_checks.Invoke()))
+ if(QDELETED(user) || user.stat || user.weakened || user.stunned || (!drifting && user.loc != Uloc) || (extra_checks && !extra_checks.Invoke()))
. = 0
break
- if(Tloc && (!target || Tloc != target.loc))
+ if(!QDELETED(Tloc) && (QDELETED(target) || Tloc != target.loc))
if((Uloc != Tloc || Tloc != user) && !drifting)
. = 0
break
@@ -316,7 +316,7 @@ Proc for attack log creation, because really why not
sleep(1)
if(progress)
progbar.update(world.time - starttime)
- if(!user || !targets)
+ if(QDELETED(user) || !targets)
. = 0
break
if(uninterruptible)
@@ -327,7 +327,7 @@ Proc for attack log creation, because really why not
user_loc = user.loc
for(var/atom/target in targets)
- if((!drifting && user_loc != user.loc) || originalloc[target] != target.loc || user.get_active_held_item() != holding || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke()))
+ if((!drifting && user_loc != user.loc) || QDELETED(target) || originalloc[target] != target.loc || user.get_active_held_item() != holding || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke()))
. = 0
break mainloop
if(progbar)
diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm
index ec2bd2812bb..932d61793f2 100644
--- a/code/controllers/subsystem/persistence.dm
+++ b/code/controllers/subsystem/persistence.dm
@@ -81,12 +81,25 @@ SUBSYSTEM_DEF(persistence)
var/saved_messages = json_decode(saved_json)
for(var/item in saved_messages)
- var/turf/T = locate(item["x"], item["y"], ZLEVEL_STATION)
+ if(!islist(item))
+ continue
+
+ var/xvar = item["x"]
+ var/yvar = item["y"]
+ var/zvar = item["z"]
+
+ if(!xvar || !yvar || !zvar)
+ continue
+
+ var/turf/T = locate(xvar, yvar, zvar)
if(!isturf(T))
continue
+
if(locate(/obj/structure/chisel_message) in T)
continue
+
var/obj/structure/chisel_message/M = new(T)
+
M.unpack(item)
if(!M.loc)
M.persists = FALSE
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 57ef56d8732..db459b2aabd 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -333,6 +333,10 @@
/datum/action/item_action/hands_free/shift_nerves
name = "Shift Nerves"
+/datum/action/item_action/explosive_implant
+ check_flags = 0
+ name = "Activate Explosive Implant"
+
/datum/action/item_action/toggle_research_scanner
name = "Toggle Research Scanner"
button_icon_state = "scan_mode"
@@ -467,4 +471,4 @@
/datum/action/item_action/bhop
name = "Activate Jump Boots"
desc = "Activates the jump boot's internal propulsion system, allowing the user to dash over 4-wide gaps."
- button_icon_state = "jetboot"
\ No newline at end of file
+ button_icon_state = "jetboot"
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 1078dbfaebc..918df017562 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -44,6 +44,7 @@
id = "vanguard"
duration = 200
tick_interval = 0 //tick as fast as possible
+ status_type = STATUS_EFFECT_REPLACE
alert_type = /obj/screen/alert/status_effect/vanguard
var/datum/progressbar/progbar
@@ -58,7 +59,8 @@
if(istype(L)) //this is probably more safety than actually needed
var/vanguard = L.stun_absorption["vanguard"]
desc = initial(desc)
- desc += "
[vanguard["stuns_absorbed"] * 2] seconds of stuns held back.
[round(min(vanguard["stuns_absorbed"] * 0.25, 20)) * 2] seconds of stun will affect you."
+ desc += "
[vanguard["stuns_absorbed"] * 2] seconds of stuns held back.\
+ [ratvar_awakens ? "":"
[round(min(vanguard["stuns_absorbed"] * 0.25, 20)) * 2] seconds of stun will affect you."]"
..()
/datum/status_effect/vanguard_shield/Destroy()
diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm
index 7ab9022848a..c2c070dbece 100644
--- a/code/datums/status_effects/gas.dm
+++ b/code/datums/status_effects/gas.dm
@@ -1,7 +1,7 @@
/datum/status_effect/freon
id = "frozen"
duration = 100
- unique = TRUE
+ status_type = STATUS_EFFECT_UNIQUE
alert_type = /obj/screen/alert/status_effect/freon
var/icon/cube
diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm
index 38f3de0b242..c6e8f8e3b7a 100644
--- a/code/datums/status_effects/status_effect.dm
+++ b/code/datums/status_effects/status_effect.dm
@@ -9,7 +9,7 @@ var/global/list/all_status_effects = list() //a list of all status effects, if f
var/duration = -1 //How long the status effect lasts in DECISECONDS. Enter -1 for an effect that never ends unless removed through some means.
var/tick_interval = 10 //How many deciseconds between ticks, approximately. Leave at 10 for every second.
var/mob/living/owner //The mob affected by the status effect.
- var/unique = TRUE //If there can be multiple status effects of this type on one mob.
+ var/status_type = STATUS_EFFECT_UNIQUE //How many of the effect can be on one mob, and what happens when you try to add another
var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description
/datum/status_effect/New(mob/living/new_owner)
@@ -57,6 +57,11 @@ var/global/list/all_status_effects = list() //a list of all status effects, if f
/datum/status_effect/proc/on_apply() //Called whenever the buff is applied.
/datum/status_effect/proc/tick() //Called every tick.
/datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed.
+/datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself
+ owner.clear_alert(id)
+ LAZYREMOVE(owner.status_effects, src)
+ owner = null
+ qdel(src)
////////////////
// ALERT HOOK //
@@ -76,8 +81,11 @@ var/global/list/all_status_effects = list() //a list of all status effects, if f
var/datum/status_effect/S1 = effect
LAZYINITLIST(status_effects)
for(var/datum/status_effect/S in status_effects)
- if(S.id == initial(S1.id) && initial(S1.unique))
- return
+ if(S.id == initial(S1.id) && S.status_type)
+ if(S.status_type == STATUS_EFFECT_REPLACE)
+ S.be_replaced()
+ else
+ return
S1 = new effect(src)
. = S1
diff --git a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm
index 26575d881e6..b8bef0e1b6d 100644
--- a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm
+++ b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm
@@ -112,7 +112,7 @@
/obj/effect/clockwork/spatial_gateway/Bumped(atom/A)
..()
- if(isliving(A) || istype(A, /obj/item))
+ if(A && !QDELETED(A))
pass_through_gateway(A)
/obj/effect/clockwork/spatial_gateway/proc/pass_through_gateway(atom/movable/A, no_cost)
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm
index c5de8550e9b..74bfbc3186c 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm
@@ -17,11 +17,20 @@
timeout_time = 50
/datum/clockwork_scripture/ranged_ability/linked_vanguard/check_special_requirements()
- if(islist(invoker.stun_absorption) && invoker.stun_absorption["vanguard"] && invoker.stun_absorption["vanguard"]["end_time"] > world.time)
+ if(!ratvar_awakens && islist(invoker.stun_absorption) && invoker.stun_absorption["vanguard"] && invoker.stun_absorption["vanguard"]["end_time"] > world.time)
to_chat(invoker, "You are already shielded by a Vanguard!")
return FALSE
return TRUE
+/datum/clockwork_scripture/ranged_ability/linked_vanguard/scripture_effects()
+ if(ratvar_awakens) //hey, ratvar's up! give everybody stun immunity.
+ for(var/mob/living/L in view(7, get_turf(invoker)))
+ if(L.stat != DEAD && is_servant_of_ratvar(L))
+ L.apply_status_effect(STATUS_EFFECT_VANGUARD)
+ CHECK_TICK
+ return TRUE
+ return ..()
+
//Judicial Marker: places a judicial marker at a target location
/datum/clockwork_scripture/ranged_ability/judicial_marker
name = "Judicial Marker"
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
index 009e3f3089d..cb343802422 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
@@ -74,13 +74,19 @@
quickbind_desc = "Allows you to temporarily absorb stuns. All stuns absorbed will affect you when disabled."
/datum/clockwork_scripture/vanguard/check_special_requirements()
- if(islist(invoker.stun_absorption) && invoker.stun_absorption["vanguard"] && invoker.stun_absorption["vanguard"]["end_time"] > world.time)
+ if(!ratvar_awakens && islist(invoker.stun_absorption) && invoker.stun_absorption["vanguard"] && invoker.stun_absorption["vanguard"]["end_time"] > world.time)
to_chat(invoker, "You are already shielded by a Vanguard!")
return FALSE
return TRUE
/datum/clockwork_scripture/vanguard/scripture_effects()
- invoker.apply_status_effect(STATUS_EFFECT_VANGUARD)
+ if(ratvar_awakens)
+ for(var/mob/living/L in view(7, get_turf(invoker)))
+ if(L.stat != DEAD && is_servant_of_ratvar(L))
+ L.apply_status_effect(STATUS_EFFECT_VANGUARD)
+ CHECK_TICK
+ else
+ invoker.apply_status_effect(STATUS_EFFECT_VANGUARD)
return TRUE
diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm
index 9ada010732c..ca2d421e0fa 100644
--- a/code/game/machinery/computer/apc_control.dm
+++ b/code/game/machinery/computer/apc_control.dm
@@ -37,9 +37,11 @@
active_apc.update_icon()
active_apc = null
-/obj/machinery/computer/apc_control/attack_ai(mob/living/AI) //You already have APC access, cheater!
- AI << "[src] does not support AI control."
- return
+/obj/machinery/computer/apc_control/attack_ai(mob/living/AI)
+ if(!IsAdminGhost(src))
+ to_chat(AI,"[src] does not support AI control.") //You already have APC access, cheater!
+ return
+ ..(AI)
/obj/machinery/computer/apc_control/proc/check_apc(obj/machinery/power/apc/APC)
return APC.z == z && !APC.malfhack && !APC.aidisabled && !APC.emagged && !APC.stat && !istype(APC.area, /area/ai_monitored) && !APC.area.outdoors
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 3019528f8bb..da1950c041a 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -34,7 +34,6 @@
/obj/item/toy/redbutton = 2,
/obj/item/toy/talking/owl = 2,
/obj/item/toy/talking/griffin = 2,
- /obj/item/toy/talking/skeleton = 2,
/obj/item/weapon/coin/antagtoken = 2,
/obj/item/stack/tile/fakespace/loaded = 2,
/obj/item/stack/tile/fakepit/loaded = 2,
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index d446603fabb..c81900c1cdb 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -12,7 +12,7 @@ var/const/SAFETY_COOLDOWN = 100
var/icon_name = "grinder-o"
var/blood = 0
var/eat_dir = WEST
- var/amount_produced = 1
+ var/amount_produced = 50
var/datum/material_container/materials
var/crush_damage = 1000
var/eat_victim_items = TRUE
@@ -40,9 +40,9 @@ var/const/SAFETY_COOLDOWN = 100
mat_mod = 2 * B.rating
mat_mod *= 50000
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
- amt_made = 25 * M.rating //% of materials salvaged
+ amt_made = 12.5 * M.rating //% of materials salvaged
materials.max_amount = mat_mod
- amount_produced = min(100, amt_made)
+ amount_produced = min(50, amt_made) + 50
/obj/machinery/recycler/examine(mob/user)
..()
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index 95afbfeb0c7..66c85a1784b 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -33,7 +33,7 @@
light_color = LIGHT_COLOR_BROWN
-/obj/machinery/computer/slot_machine/New()
+/obj/machinery/computer/slot_machine/Initialize()
..()
jackpots = rand(1, 4) //false hope
plays = rand(75, 200)
@@ -47,9 +47,8 @@
toggle_reel_spin(0)
for(var/cointype in typesof(/obj/item/weapon/coin))
- var/obj/item/weapon/coin/C = new cointype(src)
- coinvalues["[cointype]"] = C.value
- qdel(C)
+ var/obj/item/weapon/coin/C = cointype
+ coinvalues["[cointype]"] = initial(C.value)
/obj/machinery/computer/slot_machine/Destroy()
if(balance)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index d8f42849c04..696cc09ba47 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -528,6 +528,7 @@
if(icon_vend) //Show the vending animation if needed
flick(icon_vend,src)
new R.product_path(get_turf(src))
+ feedback_add_details("vending_machine_usage","[R.product_path]|[src.type]")
vend_ready = 1
return
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index b981b7da38d..d2c75e57cc1 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -84,153 +84,6 @@
start_landmarks_list -= src
return ..()
-//Costume spawner landmarks
-
-/obj/effect/landmark/costume/New() //costume spawner, selects a random subclass and disappears
-
- var/list/options = typesof(/obj/effect/landmark/costume)
- var/PICK= options[rand(1,options.len)]
- new PICK(src.loc)
- qdel(src)
-
-//SUBCLASSES. Spawn a bunch of items and disappear likewise
-/obj/effect/landmark/costume/chicken/New()
- new /obj/item/clothing/suit/chickensuit(src.loc)
- new /obj/item/clothing/head/chicken(src.loc)
- new /obj/item/weapon/reagent_containers/food/snacks/egg(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/gladiator/New()
- new /obj/item/clothing/under/gladiator(src.loc)
- new /obj/item/clothing/head/helmet/gladiator(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/madscientist/New()
- new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc)
- new /obj/item/clothing/head/flatcap(src.loc)
- new /obj/item/clothing/suit/toggle/labcoat/mad(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/elpresidente/New()
- new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc)
- new /obj/item/clothing/head/flatcap(src.loc)
- new /obj/item/clothing/mask/cigarette/cigar/havana(src.loc)
- new /obj/item/clothing/shoes/jackboots(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/nyangirl/New()
- new /obj/item/clothing/under/schoolgirl(src.loc)
- new /obj/item/clothing/head/kitty(src.loc)
- new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/maid/New()
- new /obj/item/clothing/under/skirt/black(src.loc)
- var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears )
- new CHOICE(src.loc)
- new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/butler/New()
- new /obj/item/clothing/tie/waistcoat(src.loc)
- new /obj/item/clothing/under/suit_jacket(src.loc)
- new /obj/item/clothing/head/that(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/highlander/New()
- new /obj/item/clothing/under/kilt(src.loc)
- new /obj/item/clothing/head/beret(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/prig/New()
- new /obj/item/clothing/tie/waistcoat(src.loc)
- new /obj/item/clothing/glasses/monocle(src.loc)
- var/CHOICE= pick( /obj/item/clothing/head/bowler, /obj/item/clothing/head/that)
- new CHOICE(src.loc)
- new /obj/item/clothing/shoes/sneakers/black(src.loc)
- new /obj/item/weapon/cane(src.loc)
- new /obj/item/clothing/under/sl_suit(src.loc)
- new /obj/item/clothing/mask/fakemoustache(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/plaguedoctor/New()
- new /obj/item/clothing/suit/bio_suit/plaguedoctorsuit(src.loc)
- new /obj/item/clothing/head/plaguedoctorhat(src.loc)
- new /obj/item/clothing/mask/gas/plaguedoctor(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/nightowl/New()
- new /obj/item/clothing/suit/toggle/owlwings(src.loc)
- new /obj/item/clothing/under/owl(src.loc)
- new /obj/item/clothing/mask/gas/owl_mask(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/thegriffin/New()
- new /obj/item/clothing/suit/toggle/owlwings/griffinwings(src.loc)
- new /obj/item/clothing/shoes/griffin(src.loc)
- new /obj/item/clothing/under/griffin(src.loc)
- new /obj/item/clothing/head/griffin(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/waiter/New()
- new /obj/item/clothing/under/waiter(src.loc)
- var/CHOICE= pick( /obj/item/clothing/head/kitty, /obj/item/clothing/head/rabbitears)
- new CHOICE(src.loc)
- new /obj/item/clothing/suit/apron(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/pirate/New()
- new /obj/item/clothing/under/pirate(src.loc)
- new /obj/item/clothing/suit/pirate(src.loc)
- var/CHOICE = pick( /obj/item/clothing/head/pirate , /obj/item/clothing/head/bandana )
- new CHOICE(src.loc)
- new /obj/item/clothing/glasses/eyepatch(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/commie/New()
- new /obj/item/clothing/under/soviet(src.loc)
- new /obj/item/clothing/head/ushanka(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/imperium_monk/New()
- new /obj/item/clothing/suit/imperium_monk(src.loc)
- if (prob(25))
- new /obj/item/clothing/mask/gas/cyborg(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/holiday_priest/New()
- new /obj/item/clothing/suit/holidaypriest(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/marisawizard/fake/New()
- new /obj/item/clothing/shoes/sandal/marisa(src.loc)
- new /obj/item/clothing/head/wizard/marisa/fake(src.loc)
- new/obj/item/clothing/suit/wizrobe/marisa/fake(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/cutewitch/New()
- new /obj/item/clothing/under/sundress(src.loc)
- new /obj/item/clothing/head/witchwig(src.loc)
- new /obj/item/weapon/staff/broom(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/fakewizard/New()
- new /obj/item/clothing/shoes/sandal(src.loc)
- new /obj/item/clothing/suit/wizrobe/fake(src.loc)
- new /obj/item/clothing/head/wizard/fake(src.loc)
- new /obj/item/weapon/staff/(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/sexyclown/New()
- new /obj/item/clothing/mask/gas/sexyclown(src.loc)
- new /obj/item/clothing/under/rank/clown/sexy(src.loc)
- qdel(src)
-
-/obj/effect/landmark/costume/sexymime/New()
- new /obj/item/clothing/mask/gas/sexymime(src.loc)
- new /obj/item/clothing/under/sexymime(src.loc)
- qdel(src)
-
//Department Security spawns
/obj/effect/landmark/start/depsec
diff --git a/code/game/objects/effects/spawners/bundle.dm b/code/game/objects/effects/spawners/bundle.dm
new file mode 100644
index 00000000000..c272c383e98
--- /dev/null
+++ b/code/game/objects/effects/spawners/bundle.dm
@@ -0,0 +1,170 @@
+/obj/effect/spawner/bundle
+ name = "bundle spawner"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x2"
+ color = "#00FF00"
+
+ var/list/items
+
+/obj/effect/spawner/bundle/Initialize(mapload)
+ ..()
+ if(items && items.len)
+ var/turf/T = get_turf(src)
+ for(var/path in items)
+ new path(T)
+ qdel(src)
+
+/obj/effect/spawner/bundle/costume/chicken
+ name = "chicken costume spawner"
+ items = list(
+ /obj/item/clothing/suit/chickensuit,
+ /obj/item/clothing/head/chicken,
+ /obj/item/weapon/reagent_containers/food/snacks/egg)
+
+/obj/effect/spawner/bundle/costume/gladiator
+ name = "gladitator costume spawner"
+ items = list(
+ /obj/item/clothing/under/gladiator,
+ /obj/item/clothing/head/helmet/gladiator)
+
+/obj/effect/spawner/bundle/costume/madscientist
+ name = "mad scientist costume spawner"
+ items = list(
+ /obj/item/clothing/under/gimmick/rank/captain/suit,
+ /obj/item/clothing/head/flatcap,
+ /obj/item/clothing/suit/toggle/labcoat/mad)
+
+/obj/effect/spawner/bundle/costume/elpresidente
+ name = "el presidente costume spawner"
+ items = list(
+ /obj/item/clothing/under/gimmick/rank/captain/suit,
+ /obj/item/clothing/head/flatcap,
+ /obj/item/clothing/mask/cigarette/cigar/havana,
+ /obj/item/clothing/shoes/jackboots)
+
+/obj/effect/spawner/bundle/costume/nyangirl
+ name = "nyangirl costume spawner"
+ items = list(
+ /obj/item/clothing/under/schoolgirl,
+ /obj/item/clothing/head/kitty,
+ /obj/item/clothing/glasses/sunglasses/blindfold)
+
+/obj/effect/spawner/bundle/costume/maid
+ name = "maid costume spawner"
+ items = list(
+ /obj/item/clothing/under/skirt/black,
+ /obj/effect/spawner/lootdrop/minor/beret_or_rabbitears,
+ /obj/item/clothing/glasses/sunglasses/blindfold)
+
+
+/obj/effect/spawner/bundle/costume/butler
+ name = "butler costume spawner"
+ items = list(
+ /obj/item/clothing/tie/waistcoat,
+ /obj/item/clothing/under/suit_jacket,
+ /obj/item/clothing/head/that)
+
+/obj/effect/spawner/bundle/costume/highlander
+ name = "highlander costume spawner"
+ items = list(
+ /obj/item/clothing/under/kilt,
+ /obj/item/clothing/head/beret)
+
+/obj/effect/spawner/bundle/costume/prig
+ name = "prig costume spawner"
+ items = list(
+ /obj/item/clothing/tie/waistcoat,
+ /obj/item/clothing/glasses/monocle,
+ /obj/effect/spawner/lootdrop/minor/bowler_or_that,
+ /obj/item/clothing/shoes/sneakers/black,
+ /obj/item/weapon/cane,
+ /obj/item/clothing/under/sl_suit,
+ /obj/item/clothing/mask/fakemoustache)
+
+/obj/effect/spawner/bundle/costume/plaguedoctor
+ name = "plague doctor costume spawner"
+ items = list(
+ /obj/item/clothing/suit/bio_suit/plaguedoctorsuit,
+ /obj/item/clothing/head/plaguedoctorhat,
+ /obj/item/clothing/mask/gas/plaguedoctor)
+
+/obj/effect/spawner/bundle/costume/nightowl
+ name = "night owl costume spawner"
+ items = list(
+ /obj/item/clothing/suit/toggle/owlwings,
+ /obj/item/clothing/under/owl,
+ /obj/item/clothing/mask/gas/owl_mask)
+
+/obj/effect/spawner/bundle/costume/griffin
+ name = "griffin costume spawner"
+ items = list(
+ /obj/item/clothing/suit/toggle/owlwings/griffinwings,
+ /obj/item/clothing/shoes/griffin,
+ /obj/item/clothing/under/griffin,
+ /obj/item/clothing/head/griffin)
+
+/obj/effect/spawner/bundle/costume/waiter
+ name = "waiter costume spawner"
+ items = list(
+ /obj/item/clothing/under/waiter,
+ /obj/effect/spawner/lootdrop/minor/kittyears_or_rabbitears,
+ /obj/item/clothing/suit/apron)
+
+/obj/effect/spawner/bundle/costume/pirate
+ name = "pirate costume spawner"
+ items = list(
+ /obj/item/clothing/under/pirate,
+ /obj/item/clothing/suit/pirate,
+ /obj/effect/spawner/lootdrop/minor/pirate_or_bandana,
+ /obj/item/clothing/glasses/eyepatch)
+
+/obj/effect/spawner/bundle/costume/commie
+ name = "commie costume spawner"
+ items = list(
+ /obj/item/clothing/under/soviet,
+ /obj/item/clothing/head/ushanka)
+
+/obj/effect/spawner/bundle/costume/imperium_monk
+ name = "imperium monk costume spawner"
+ items = list(
+ /obj/item/clothing/suit/imperium_monk,
+ /obj/effect/spawner/lootdrop/minor/twentyfive_percent_cyborg_mask)
+
+/obj/effect/spawner/bundle/costume/holiday_priest
+ name = "holiday priest costume spawner"
+ items = list(
+ /obj/item/clothing/suit/holidaypriest)
+
+/obj/effect/spawner/bundle/costume/marisawizard
+ name = "marisa wizard costume spawner"
+ items = list(
+ /obj/item/clothing/shoes/sandal/marisa,
+ /obj/item/clothing/head/wizard/marisa/fake,
+ /obj/item/clothing/suit/wizrobe/marisa/fake)
+
+/obj/effect/spawner/bundle/costume/cutewitch
+ name = "cute witch costume spawner"
+ items = list(
+ /obj/item/clothing/under/sundress,
+ /obj/item/clothing/head/witchwig,
+ /obj/item/weapon/staff/broom)
+
+/obj/effect/spawner/bundle/costume/wizard
+ name = "wizard costume spawner"
+ items = list(
+ /obj/item/clothing/shoes/sandal,
+ /obj/item/clothing/suit/wizrobe/fake,
+ /obj/item/clothing/head/wizard/fake,
+ /obj/item/weapon/staff)
+
+/obj/effect/spawner/bundle/costume/sexyclown
+ name = "sexy clown costume spawner"
+ items = list(
+ /obj/item/clothing/mask/gas/sexyclown,
+ /obj/item/clothing/under/rank/clown/sexy)
+
+/obj/effect/spawner/bundle/costume/sexymime
+ name = "sexy mime costume spawner"
+ items = list(
+ /obj/item/clothing/mask/gas/sexymime,
+ /obj/item/clothing/under/sexymime)
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 2b2db8b172a..2118edb57c8 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -3,24 +3,27 @@
icon_state = "x2"
color = "#00FF00"
var/lootcount = 1 //how many items will be spawned
- var/lootdoubles = 1 //if the same item can be spawned twice
+ var/lootdoubles = TRUE //if the same item can be spawned twice
var/list/loot //a list of possible items to spawn e.g. list(/obj/item, /obj/structure, /obj/effect)
-/obj/effect/spawner/lootdrop/New()
+/obj/effect/spawner/lootdrop/Initialize(mapload)
+ ..()
+
if(loot && loot.len)
- for(var/i = lootcount, i > 0, i--)
- if(!loot.len) break
+ var/turf/T = get_turf(src)
+ while(lootcount && loot.len)
var/lootspawn = pickweight(loot)
if(!lootdoubles)
loot.Remove(lootspawn)
if(lootspawn)
- new lootspawn(get_turf(src))
+ new lootspawn(T)
+ lootcount--
qdel(src)
/obj/effect/spawner/lootdrop/armory_contraband
name = "armory contraband gun spawner"
- lootdoubles = 0
+ lootdoubles = FALSE
loot = list(
/obj/item/weapon/gun/ballistic/automatic/pistol = 8,
@@ -144,7 +147,7 @@
/obj/item/weapon/wirecutters = 1,
/obj/item/weapon/wrench = 4,
/obj/item/weapon/relic = 3,
- /obj/item/weaponcrafting/reciever = 2,
+ /obj/item/weaponcrafting/receiver = 2,
/obj/item/clothing/head/cone = 2,
/obj/item/weapon/grenade/smokebomb = 2,
/obj/item/device/geiger_counter = 3,
@@ -165,7 +168,7 @@
/obj/effect/spawner/lootdrop/crate_spawner
name = "lootcrate spawner" //USE PROMO CODE "SELLOUT" FOR 20% OFF!
- lootdoubles = 0
+ lootdoubles = FALSE
loot = list(
/obj/structure/closet/crate/secure/loot = 20,
@@ -194,3 +197,44 @@
loot = list(
/obj/effect/decal/remains/xeno = 49,
/obj/effect/spawner/xeno_egg_delivery = 1)
+
+/obj/effect/spawner/lootdrop/costume
+ name = "random costume spawner"
+
+/obj/effect/spawner/lootdrop/costume/Initialize()
+ loot = list()
+ for(var/path in subtypesof(/obj/effect/spawner/bundle/costume))
+ loot[path] = TRUE
+ ..()
+
+// Minor lootdrops follow
+
+/obj/effect/spawner/lootdrop/minor/beret_or_rabbitears
+ name = "beret or rabbit ears spawner"
+ loot = list(
+ /obj/item/clothing/head/beret = 1,
+ /obj/item/clothing/head/rabbitears = 1)
+
+/obj/effect/spawner/lootdrop/minor/bowler_or_that
+ name = "bowler or top hat spawner"
+ loot = list(
+ /obj/item/clothing/head/bowler = 1,
+ /obj/item/clothing/head/that = 1)
+
+/obj/effect/spawner/lootdrop/minor/kittyears_or_rabbitears
+ name = "kitty ears or rabbit ears spawner"
+ loot = list(
+ /obj/item/clothing/head/kitty = 1,
+ /obj/item/clothing/head/rabbitears = 1)
+
+/obj/effect/spawner/lootdrop/minor/pirate_or_bandana
+ name = "pirate hat or bandana spawner"
+ loot = list(
+ /obj/item/clothing/head/pirate = 1,
+ /obj/item/clothing/head/bandana = 1)
+
+/obj/effect/spawner/lootdrop/minor/twentyfive_percent_cyborg_mask
+ name = "25% cyborg mask spawner"
+ loot = list(
+ /obj/item/clothing/mask/gas/cyborg = 25,
+ "" = 75)
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 732206e93ce..c6c940c623b 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -721,7 +721,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/mob/M = loc
M.put_in_hands(inserted_item)
else
- inserted_item.forceMove(loc)
+ inserted_item.forceMove(get_turf(src))
to_chat(usr, "You remove \the [inserted_item] from \the [src].")
inserted_item = null
update_icon()
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 56fc3f30477..faa45a7e55f 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -300,7 +300,9 @@
return
-/obj/item/device/radio/headset/AltClick(mob/user)
+/obj/item/device/radio/headset/AltClick(mob/living/user)
+ if(!istype(user) || !Adjacent(user) || user.incapacitated())
+ return
if (command)
use_command = !use_command
- to_chat(user, "You toggle high-volume mode.")
\ No newline at end of file
+ to_chat(user, "You toggle high-volume mode [use_command ? "on" : "off"].")
\ No newline at end of file
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 8f5cbf5e75e..a2218658651 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -554,81 +554,6 @@
chattering = TRUE
phomeme = "griffin"
-/obj/item/toy/talking/skeleton
- name = "skeleton action figure"
- desc = "An action figure modeled after 'Oh-cee', the original content \
- skeleton.\nNot suitable for infants or assistants under 36 months \
- of age."
- icon_state = "skeletonprize"
- attack_verb = list("boned", "dunked on", "worked down to the bone")
- chattering = TRUE
-
- var/list/regular_messages = list(
- "Why was the skeleton such a bad liar? \
- Because you can see right through him!",
- "When does a skeleton laugh? When something tickles his funny bone!",
- "Why couldn't the skeleton win the beauty contest? \
- Because he had no body!",
- "What do you call a skeleton in the winter? A numbskull!",
- "What did the skeleton say before eating? Bone appetit!",
- "What type of art do skeletons like? Skulltures!",
- "What instrument do skeletons play? The trom-bone!",
- "Why are skeletons always so calm? \
- Because nothing gets under their skin!",
- "How did the skeleton know it was going to rain? \
- He could feel it in his bones.",
- "Why did the skeleton go to the hospital? \
- To get his ghoul stones removed.",
- "Why can't skeletons play music in churches? \
- Because they have no organs.",
- "There's a skeleton inside everyone! Except slime people I guess...",
- "The birds are too busy to notice me acting in the shadows!",
- "Giraffes have the same number of bones in their necks as humans. \
- You should never trust a giraffe.",
- "When I meet a dog in the street, I always offer it a bone!",
- "In corsetry, a bone is one of the rigid parts of a corset that \
- forms its frame and gives it rigidity.",
- "A person who plays the trombone is called a trombonist or \
- trombone player.",
- "Remember, compromise is for those without backbones!",
- "If you go up to the captain and say the word 'bone' repeatedly, \
- eventually he'll brig you.",
- "Yo ho ho, shiver me bones!",
- "So what you're saying is, you only love me for my legs?",
- "You will never again find socks that match!",
- "BONES! BONES! BONES!",
- "Bones absorb x-rays, which is why radiation gives you superpowers.",
- "Oh-cee! The ORIGINAL CONTENT SKELETON. Suitable for ages 36 months \
- and up.",
- "I just don't have the heart to judge you.",
- "I don't have the stomach for this.",
- "I'm a fighter, not a liver.",
- "How can I see without eyeballs?",
- "Ask your parents about 'boning', before you get pregnant.",
- "Remember, a dog is for life, not just for christmas.")
-
-/obj/item/toy/talking/skeleton/suicide_act(mob/user)
- user.visible_message("[user] is trying to commit suicide with [src].")
-
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- H.set_species(/datum/species/skeleton)
-
- toy_talk(user, "RATTLE ME BONES")
-
- user.Stun(5)
- sleep(20)
- return OXYLOSS
-
-/obj/item/toy/talking/skeleton/generate_messages()
- return list(pick(regular_messages))
-
-/obj/item/toy/talking/skeleton/toy_talk(user, message)
- phomeme = pick("sans", "papyrus")
-
- span = "danger [phomeme]"
- ..()
-
/*
|| A Deck of Cards for playing various games of chance ||
*/
diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm
index 9e93d3fb3eb..c6e558533a7 100644
--- a/code/game/objects/items/weapons/implants/implant_explosive.dm
+++ b/code/game/objects/items/weapons/implants/implant_explosive.dm
@@ -3,10 +3,13 @@
desc = "And boom goes the weasel."
icon_state = "explosive"
origin_tech = "materials=2;combat=3;biotech=4;syndicate=4"
+ actions_types = list(/datum/action/item_action/explosive_implant)
+ // Explosive implant action is always availible.
var/weak = 2
var/medium = 0.8
var/heavy = 0.4
var/delay = 7
+ var/popup = FALSE // is the DOUWANNABLOWUP window open?
/obj/item/weapon/implant/explosive/get_data()
var/dat = {"Implant Specifications:
@@ -27,8 +30,12 @@
/obj/item/weapon/implant/explosive/activate(cause)
if(!cause || !imp_in)
return 0
- if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your [name]? This will cause you to explode!", "[name] Confirmation", "Yes", "No") != "Yes")
- return 0
+ if(cause == "action_button" || !popup)
+ popup = TRUE
+ var/response = alert(imp_in, "Are you sure you want to activate your [name]? This will cause you to explode!", "[name] Confirmation", "Yes", "No")
+ popup = FALSE
+ if(response == "No")
+ return 0
heavy = round(heavy)
medium = round(medium)
weak = round(weak)
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index ba82c6177d1..fc221ea968d 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -81,7 +81,11 @@
/obj/structure/flora/tree/jungle
name = "tree"
+ icon_state = "tree"
desc = "It's seriously hampering your view of the jungle."
+ icon = 'icons/obj/flora/jungletrees.dmi'
+ pixel_x = -48
+ pixel_y = -20
/obj/structure/flora/tree/jungle/Initialize()
icon_state = "[icon_state][rand(1, 3)]"
@@ -335,12 +339,13 @@
/obj/structure/flora/rock/jungle
icon_state = "pile of rocks"
desc = "A pile of rocks."
+ icon_state = "rocks"
icon = 'icons/obj/flora/jungleflora.dmi'
density = FALSE
/obj/structure/flora/rock/jungle/Initialize()
..()
- icon_state = "[icon_state][rand(1,5)]"
+ icon_state = "[initial(icon_state)][rand(1,5)]"
//Jungle bushes
@@ -364,9 +369,17 @@
icon_state = "bush"
icon = 'icons/obj/flora/largejungleflora.dmi'
pixel_x = -16
+ pixel_y = -12
layer = ABOVE_ALL_MOB_LAYER
/obj/structure/flora/rock/pile/largejungle
name = "rocks"
+ icon_state = "rocks"
icon = 'icons/obj/flora/largejungleflora.dmi'
density = FALSE
+ pixel_x = -16
+ pixel_y = -16
+
+/obj/structure/flora/rock/jungle/Initialize()
+ ..()
+ icon_state = "[initial(icon_state)][rand(1,3)]"
\ No newline at end of file
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index 312f6c32dcb..3138c7cbcc6 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -9,7 +9,7 @@
obj_integrity = 50
max_integrity = 50
layer = LATTICE_LAYER //under pipes
- var/obj/item/stack/rods/stored
+ var/number_of_rods = 1
canSmoothWith = list(/obj/structure/lattice,
/turf/open/floor,
/turf/closed/wall,
@@ -17,26 +17,20 @@
smooth = SMOOTH_MORE
// flags = CONDUCT
-/obj/structure/lattice/New()
+/obj/structure/lattice/Initialize(mapload)
..()
- for(var/obj/structure/lattice/LAT in src.loc)
+ for(var/obj/structure/lattice/LAT in loc)
if(LAT != src)
qdel(LAT)
- stored = new/obj/item/stack/rods(src)
-
-/obj/structure/lattice/Destroy()
- qdel(stored)
- stored = null
- return ..()
/obj/structure/lattice/blob_act(obj/structure/blob/B)
return
/obj/structure/lattice/ratvar_act()
if(IsEven(x + y))
- new/obj/structure/lattice/clockwork(loc)
+ new /obj/structure/lattice/clockwork(loc)
else
- new/obj/structure/lattice/clockwork/large(loc)
+ new /obj/structure/lattice/clockwork/large(loc)
/obj/structure/lattice/attackby(obj/item/C, mob/user, params)
if(istype(C, /obj/item/weapon/wirecutters))
@@ -48,8 +42,7 @@
/obj/structure/lattice/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
- stored.forceMove(get_turf(src))
- stored = null
+ new /obj/item/stack/rods(get_turf(src), amount=number_of_rods)
qdel(src)
/obj/structure/lattice/singularity_pull(S, current_size)
@@ -61,15 +54,15 @@
desc = "A lightweight support lattice. These hold the Justicar's station together."
icon = 'icons/obj/smooth_structures/lattice_clockwork.dmi'
-/obj/structure/lattice/clockwork/New()
+/obj/structure/lattice/clockwork/Initialize(mapload)
..()
ratvar_act()
/obj/structure/lattice/clockwork/ratvar_act()
if(IsOdd(x+y))
- new/obj/structure/lattice/clockwork/large(loc)
+ new /obj/structure/lattice/clockwork/large(loc) // deletes old one
-/obj/structure/lattice/clockwork/large/New()
+/obj/structure/lattice/clockwork/large/Initialize(mapload)
..()
icon = 'icons/obj/smooth_structures/lattice_clockwork_large.dmi'
pixel_x = -9
@@ -77,7 +70,7 @@
/obj/structure/lattice/clockwork/large/ratvar_act()
if(IsEven(x + y))
- new/obj/structure/lattice/clockwork(loc)
+ new /obj/structure/lattice/clockwork(loc)
/obj/structure/lattice/catwalk
name = "catwalk"
@@ -87,13 +80,12 @@
smooth = SMOOTH_TRUE
canSmoothWith = null
-/obj/structure/lattice/catwalk/New()
+/obj/structure/lattice/catwalk/Initialize(mapload)
..()
- stored.amount++
- stored.update_icon()
+ number_of_rods++
/obj/structure/lattice/catwalk/ratvar_act()
- new/obj/structure/lattice/catwalk/clockwork(loc)
+ new /obj/structure/lattice/catwalk/clockwork(loc)
/obj/structure/lattice/catwalk/Move()
var/turf/T = loc
@@ -111,7 +103,7 @@
name = "clockwork catwalk"
icon = 'icons/obj/smooth_structures/catwalk_clockwork.dmi'
-/obj/structure/lattice/catwalk/clockwork/New()
+/obj/structure/lattice/catwalk/clockwork/Initialize(mapload)
..()
new /obj/effect/overlay/temp/ratvar/floor/catwalk(loc)
new /obj/effect/overlay/temp/ratvar/beam/catwalk(loc)
diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm
index 2b32864aecf..90500f14db7 100644
--- a/code/game/objects/structures/traps.dm
+++ b/code/game/objects/structures/traps.dm
@@ -1,5 +1,5 @@
/obj/structure/trap
- name = "IT'S A TARP"
+ name = "IT'S A TRAP"
desc = "stepping on me is a guaranteed bad day"
icon = 'icons/obj/hand_of_god_structures.dmi'
icon_state = "trap"
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 9a6c368ef92..fc8b7e21bc7 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -1592,7 +1592,6 @@
/obj/item/toy/talking/AI,
/obj/item/toy/talking/owl,
/obj/item/toy/talking/griffin,
- /obj/item/toy/talking/skeleton,
/obj/item/toy/nuke,
/obj/item/toy/minimeteor,
/obj/item/toy/carpplushie,
diff --git a/code/modules/crafting/guncrafting.dm b/code/modules/crafting/guncrafting.dm
index eba8c301972..d96be9be106 100644
--- a/code/modules/crafting/guncrafting.dm
+++ b/code/modules/crafting/guncrafting.dm
@@ -2,11 +2,11 @@
// PARTS //
-/obj/item/weaponcrafting/reciever
+/obj/item/weaponcrafting/receiver
name = "modular receiver"
desc = "A prototype modular receiver and trigger assembly for a firearm."
icon = 'icons/obj/improvised.dmi'
- icon_state = "reciever"
+ icon_state = "receiver"
/obj/item/weaponcrafting/stock
name = "rifle stock"
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index c9e71abf0bb..d1a663cfb2a 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -254,7 +254,7 @@
/datum/crafting_recipe/ishotgun
name = "Improvised Shotgun"
result = /obj/item/weapon/gun/ballistic/revolver/doublebarrel/improvised
- reqs = list(/obj/item/weaponcrafting/reciever = 1,
+ reqs = list(/obj/item/weaponcrafting/receiver = 1,
/obj/item/pipe = 1,
/obj/item/weaponcrafting/stock = 1,
/obj/item/stack/packageWrap = 5)
diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm
index ba81f65344d..424f3756c0c 100644
--- a/code/modules/library/soapstone.dm
+++ b/code/modules/library/soapstone.dm
@@ -192,10 +192,14 @@
var/turf/T = get_turf(src)
data["x"] = T.x
data["y"] = T.y
+ data["z"] = T.z
data["like_keys"] = like_keys
data["dislike_keys"] = dislike_keys
/obj/structure/chisel_message/proc/unpack(list/data)
+ if(!islist(data))
+ return
+
hidden_message = data["hidden_message"]
creator_name = data["creator_name"]
creator_key = data["creator_key"]
@@ -209,8 +213,10 @@
var/x = data["x"]
var/y = data["y"]
- var/turf/newloc = locate(x, y, ZLEVEL_STATION)
- forceMove(newloc)
+ var/z = data["z"]
+ var/turf/newloc = locate(x, y, z)
+ if(isturf(newloc))
+ forceMove(newloc)
update_icon()
/obj/structure/chisel_message/examine(mob/user)
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index aec6d00b603..f061fee1d76 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -270,7 +270,7 @@
explosion(src.loc,-1,1,3,adminlog = notify_admins)
qdel(src)
-/obj/item/weapon/ore/New()
+/obj/item/weapon/ore/Initialize()
..()
pixel_x = rand(0,16)-8
pixel_y = rand(0,8)-8
@@ -297,68 +297,73 @@
var/cooldown = 0
var/value = 1
-/obj/item/weapon/coin/New()
+/obj/item/weapon/coin/Initialize()
..()
pixel_x = rand(0,16)-8
pixel_y = rand(0,8)-8
- icon_state = "coin_[cmineral]_heads"
- if(cmineral)
- name = "[cmineral] coin"
-
/obj/item/weapon/coin/examine(mob/user)
..()
if(value)
to_chat(user, "It's worth [value] credit\s.")
/obj/item/weapon/coin/gold
+ name = "gold coin"
cmineral = "gold"
icon_state = "coin_gold_heads"
value = 50
materials = list(MAT_GOLD = MINERAL_MATERIAL_AMOUNT*0.2)
/obj/item/weapon/coin/silver
+ name = "silver coin"
cmineral = "silver"
icon_state = "coin_silver_heads"
value = 20
materials = list(MAT_SILVER = MINERAL_MATERIAL_AMOUNT*0.2)
/obj/item/weapon/coin/diamond
+ name = "diamond coin"
cmineral = "diamond"
icon_state = "coin_diamond_heads"
value = 500
materials = list(MAT_DIAMOND = MINERAL_MATERIAL_AMOUNT*0.2)
/obj/item/weapon/coin/iron
+ name = "iron coin"
cmineral = "iron"
icon_state = "coin_iron_heads"
value = 1
materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT*0.2)
/obj/item/weapon/coin/plasma
+ name = "plasma coin"
cmineral = "plasma"
icon_state = "coin_plasma_heads"
value = 100
materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT*0.2)
/obj/item/weapon/coin/uranium
+ name = "uranium coin"
cmineral = "uranium"
icon_state = "coin_uranium_heads"
value = 80
materials = list(MAT_URANIUM = MINERAL_MATERIAL_AMOUNT*0.2)
/obj/item/weapon/coin/clown
+ name = "bananium coin"
cmineral = "bananium"
icon_state = "coin_bananium_heads"
value = 1000 //makes the clown cry
materials = list(MAT_BANANIUM = MINERAL_MATERIAL_AMOUNT*0.2)
/obj/item/weapon/coin/adamantine
+ name = "adamantine coin"
cmineral = "adamantine"
icon_state = "coin_adamantine_heads"
value = 1500
/obj/item/weapon/coin/mythril
+ name = "mythril coin"
cmineral = "mythril"
icon_state = "coin_mythril_heads"
value = 3000
@@ -379,9 +384,6 @@
sideslist = list("valid", "salad")
value = 0
-/obj/item/weapon/coin/antagtoken/New()
- return
-
/obj/item/weapon/coin/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/CC = W
@@ -411,12 +413,12 @@
else ..()
/obj/item/weapon/coin/attack_self(mob/user)
- if(cooldown < world.time - 15)
+ if(cooldown > world.time)
if(string_attached) //does the coin have a wire attached
to_chat(user, "The coin won't flip very well with something attached!" )
return //do not flip the coin
var/coinflip = pick(sideslist)
- cooldown = world.time
+ cooldown = world.time + 15
flick("coin_[cmineral]_flip", src)
icon_state = "coin_[cmineral]_[coinflip]"
playsound(user.loc, 'sound/items/coinflip.ogg', 50, 1)
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index c368d75ec5d..45007140dc4 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -7,6 +7,8 @@
species_traits = list(MUTCOLORS,EYECOLOR,LIPS)
mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs")
mutant_organs = list(/obj/item/organ/tongue/lizard)
+ coldmod = 1.5
+ heatmod = 0.67
default_features = list("mcolor" = "0F0", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
@@ -38,4 +40,4 @@
name = "Ash Walker"
id = "ashlizard"
limbs_id = "lizard"
- species_traits = list(MUTCOLORS,EYECOLOR,LIPS,NOBREATH,NOGUNS,DIGITIGRADE)
\ No newline at end of file
+ species_traits = list(MUTCOLORS,EYECOLOR,LIPS,NOBREATH,NOGUNS,DIGITIGRADE)
diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
index dfc44b4eb4f..e940081db39 100644
--- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
@@ -164,7 +164,7 @@
M.emote("scream")
/datum/reagent/blob/blazing_oil/extinguish_reaction(obj/structure/blob/B)
- B.take_damage(rand(1, 3), BURN, "energy")
+ B.take_damage(1.5, BURN, "energy")
/datum/reagent/blob/blazing_oil/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_type == BURN && damage_flag != "energy")
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 040997da874..28b5a893a98 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -616,6 +616,14 @@
build_path = /obj/item/weapon/restraints/handcuffs
category = list("hacked", "Security")
+/datum/design/receiver
+ name = "Modular Receiver"
+ id = "reciever"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 15000)
+ build_path = /obj/item/weaponcrafting/receiver
+ category = list("hacked", "Security")
+
/datum/design/shotgun_slug
name = "Shotgun slug"
id = "shotgun_slug"
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 500f61beff4..80863259e85 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -177,16 +177,6 @@
build_path = /obj/item/weapon/gun/energy/wormhole_projector
category = list("Weapons")
-/datum/design/reciever
- name = "Modular Receiver"
- desc = "A prototype modular receiver and trigger assembly for a variety of firearms."
- id = "reciever"
- req_tech = list("combat" = 4, "materials" = 4)
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 6500, MAT_SILVER = 500)
- build_path = /obj/item/weaponcrafting/reciever
- category = list("Weapons")
-
//WT550 Mags
/datum/design/mag_oldsmg
diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm
index daca4d2ffea..686c54e3dd7 100644
--- a/code/modules/shuttle/arrivals.dm
+++ b/code/modules/shuttle/arrivals.dm
@@ -66,12 +66,12 @@
/obj/docking_port/mobile/arrivals/check()
. = ..()
-
+
if(perma_docked)
if(mode != SHUTTLE_CALL)
sound_played = FALSE
mode = SHUTTLE_IDLE
- else
+ else
SendToStation()
return
@@ -79,7 +79,7 @@
if(!CheckTurfsPressure())
damaged = FALSE
if(console)
- console.say("Repairs complete, launching soon.")
+ console.say("Repairs complete, launching soon.")
return
//If this proc is high on the profiler add a cooldown to the stuff after this line
@@ -93,7 +93,7 @@
if(mode != SHUTTLE_CALL)
sound_played = FALSE
mode = SHUTTLE_IDLE
- else
+ else
SendToStation()
return
@@ -130,7 +130,7 @@
var/dockTime = config.arrivals_shuttle_dock_window
if(mode == SHUTTLE_CALL && timeLeft(1) > dockTime)
if(console)
- console.say(damaged ? "Initiating emergency docking for repairs!" : "Now approaching: [SSmapping.config.map_name].")
+ console.say(damaged ? "Initiating emergency docking for repairs!" : "Now approaching: [station_name()].")
hyperspace_sound(HYPERSPACE_LAUNCH, areas) //for the new guy
setTimer(dockTime)
@@ -174,7 +174,7 @@
/obj/docking_port/mobile/arrivals/proc/RequireUndocked(mob/user)
if(mode == SHUTTLE_CALL || damaged)
return
-
+
Launch(TRUE)
user << "Calling your shuttle. One moment..."
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 6e84add5037..455eb38202c 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -651,10 +651,6 @@
if("papyrus")
. |= SPAN_PAPYRUS
-/obj/item/organ/tongue/bone/chatter
- name = "chattering bone \"tongue\""
- chattering = TRUE
-
/obj/item/organ/tongue/robot
name = "robotic voicebox"
desc = "A voice synthesizer that can interface with organic lifeforms."
diff --git a/html/changelog.html b/html/changelog.html
index e6cb447c149..8194585f874 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,48 @@
-->