Fixes map merge conflict

This commit is contained in:
Kyep
2017-05-22 22:20:10 -07:00
346 changed files with 4222 additions and 11365 deletions
+9
View File
@@ -9,6 +9,15 @@
#define GIRDER_DISPLACED 3
#define GIRDER_DISASSEMBLED 4
//rwall construction states
#define RWALL_INTACT 0
#define RWALL_SUPPORT_LINES 1
#define RWALL_COVER 2
#define RWALL_CUT_COVER 3
#define RWALL_BOLTS 4
#define RWALL_SUPPORT_RODS 5
#define RWALL_SHEATH 6
//plastic flaps construction states
#define PLASTIC_FLAPS_NORMAL 0
#define PLASTIC_FLAPS_DETACHED 1
+7 -1
View File
@@ -17,4 +17,10 @@
#define NONGLOBAL 32 // Do not add to general languages list
#define INNATE 64 // All mobs can be assumed to speak and understand this language (audible emotes)
#define NO_TALK_MSG 128 // Do not show the "\The [speaker] talks into \the [radio]" message
#define NO_STUTTER 256 // No stuttering, slurring, or other speech problems
#define NO_STUTTER 256 // No stuttering, slurring, or other speech problems
//Auto-accent level defines.
#define AUTOHISS_OFF 0
#define AUTOHISS_BASIC 1
#define AUTOHISS_FULL 2
#define AUTOHISS_NUM 3 //Number of auto-accent options.
+14 -1
View File
@@ -18,4 +18,17 @@
#define SCHECK if(world.tick_usage >= next_sleep_usage) defer()
//Timing Controller
#define GLOBAL_PROC "some_magic_bullshit"
#define GLOBAL_PROC "some_magic_bullshit"
#define DECLARE_GLOBAL_CONTROLLER(PROCESS,VARNAME) \
/datum/controller/process/##PROCESS/assertGlobality(){\
if(##VARNAME){\
message_admins("Controller '[name]' tried to become global but found another controller there already. Deleting the old controller.");\
qdel(##VARNAME);}\
##VARNAME = src;}\
\
/datum/controller/process/##PROCESS/releaseGlobality(){\
if(##VARNAME == src)\
##VARNAME = null;\
else\
message_admins("Controller '[name]' asked to release global control in spite of not having it!");}\
+3 -1
View File
@@ -52,7 +52,9 @@
#define SHUTTLE_ALREADY_DOCKED "we_are_already_docked"
#define SHUTTLE_SOMEONE_ELSE_DOCKED "someone_else_docked"
// Ripples, effects that signal a shuttle's arrival
#define SHUTTLE_RIPPLE_TIME 100
#define SHUTTLE_RIPPLE_FADEIN 50
/*
Logic
+1 -1
View File
@@ -454,7 +454,7 @@ proc/pollCandidates(Question, be_special_type, antag_age_check = 0, poll_time =
if(roletext)
if(jobban_isbanned(G, roletext) || jobban_isbanned(G, "Syndicate"))
continue
if(min_hours)
if(config.use_exp_restrictions && min_hours)
if(G.client.get_exp_living_num() < min_hours * 60)
continue
if(G.has_enabled_antagHUD)
+6 -3
View File
@@ -78,8 +78,8 @@
for (var/thing in atoms)
var/atom/A = thing
if(typecache[A.type])
. += A
. += A
//Like typesof() or subtypesof(), but returns a typecache instead of a list
/proc/typecacheof(path, ignore_root_path)
if(ispath(path))
@@ -625,7 +625,7 @@ proc/dd_sortedObjectList(list/incoming)
/datum/alarm/dd_SortValue()
return "[sanitize(last_name)]"
//Picks from the list, with some safeties, and returns the "default" arg if it fails
#define DEFAULTPICK(L, default) ((istype(L, /list) && L:len) ? pick(L) : default)
@@ -637,3 +637,6 @@ proc/dd_sortedObjectList(list/incoming)
#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null)
#define LAZYLEN(L) length(L)
#define LAZYCLEARLIST(L) if(L) L.Cut()
// LAZYING PT 2: THE LAZENING
#define LAZYREINITLIST(L) LAZYCLEARLIST(L); LAZYINITLIST(L);
+4 -1
View File
@@ -1,2 +1,5 @@
#define QDEL_IN(item, time) addtimer(GLOBAL_PROC, "qdel", time, FALSE, item)
#define QDEL_NULL(item) if(item) { qdel(item); item = null }
#define QDEL_NULL(item) if(item) { qdel(item); item = null }
#define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); }
#define QDEL_LIST_ASSOC(L) if(L) { for(var/I in L) { qdel(L[I]); qdel(I); } L.Cut(); }
#define QDEL_LIST_ASSOC_VAL(L) if(L) { for(var/I in L) qdel(L[I]); L.Cut(); }
+13 -6
View File
@@ -33,13 +33,20 @@
if(control_disabled || stat)
return
var/turf/pixel_turf = get_turf_pixel(A)
if(pixel_turf && !cameranet.checkTurfVis(pixel_turf))
log_admin("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(A)])")
message_admins("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(A)]))")
send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(A)]))")
return
var/turf_visible
if(pixel_turf)
turf_visible = cameranet.checkTurfVis(pixel_turf)
if(!turf_visible)
if(istype(loc, /obj/item/device/aicard) && (pixel_turf in view(client.view, loc)))
turf_visible = TRUE
else
if(pixel_turf.obscured)
log_admin("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)])")
message_admins("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))")
send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))")
return
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["ctrl"])
+16 -4
View File
@@ -339,6 +339,10 @@ so as to remain in compliance with the most up-to-date laws."
timeout = 600
var/atom/target = null
/obj/screen/alert/hackingapc/Destroy()
target = null
return ..()
/obj/screen/alert/hackingapc/Click()
if(!usr || !usr.client)
return
@@ -366,7 +370,8 @@ so as to remain in compliance with the most up-to-date laws."
timeout = 300
/obj/screen/alert/notify_cloning/Click()
if(!usr || !usr.client) return
if(!usr || !usr.client)
return
var/mob/dead/observer/G = usr
G.reenter_corpse()
@@ -378,11 +383,18 @@ so as to remain in compliance with the most up-to-date laws."
var/atom/target = null
var/action = NOTIFY_JUMP
/obj/screen/alert/notify_action/Destroy()
target = null
return ..()
/obj/screen/alert/notify_action/Click()
if(!usr || !usr.client) return
if(!target) return
if(!usr || !usr.client)
return
if(!target)
return
var/mob/dead/observer/G = usr
if(!istype(G)) return
if(!istype(G))
return
switch(action)
if(NOTIFY_ATTACK)
target.attack_ghost(G)
+5 -18
View File
@@ -51,34 +51,21 @@
if(mymob.hud_used == src)
mymob.hud_used = null
qdel(hide_actions_toggle)
hide_actions_toggle = null
QDEL_NULL(hide_actions_toggle)
QDEL_NULL(module_store_icon)
if(static_inventory.len)
for(var/thing in static_inventory)
qdel(thing)
static_inventory.Cut()
QDEL_LIST(static_inventory)
inv_slots.Cut()
action_intent = null
move_intent = null
if(toggleable_inventory.len)
for(var/thing in toggleable_inventory)
qdel(thing)
toggleable_inventory.Cut()
QDEL_LIST(toggleable_inventory)
if(hotkeybuttons.len)
for(var/thing in hotkeybuttons)
qdel(thing)
hotkeybuttons.Cut()
QDEL_LIST(hotkeybuttons)
if(infodisplay.len)
for(var/thing in infodisplay)
qdel(thing)
infodisplay.Cut()
QDEL_LIST(infodisplay)
//clear mob refs to screen objects
mymob.throw_icon = null
@@ -398,3 +398,11 @@
if(isnull(caught) || !istype(caught) || !isnull(caught.gcDestroyed))
return // Only bother with types we can identify and that don't belong
catchException("Type [caught.type] does not belong in process' queue")
// This is called to make a controller THE global authority on a global variable - like `air_master`
/datum/controller/process/proc/assertGlobality()
return
// Called to let another instance of the controller have the fun
/datum/controller/process/proc/releaseGlobality()
return
@@ -122,6 +122,7 @@ var/global/datum/controller/processScheduler/processScheduler
process.idle()
idle.Add(process)
process.assertGlobality()
// Set up process
process.setup()
@@ -132,6 +133,8 @@ var/global/datum/controller/processScheduler/processScheduler
processes.Remove(oldProcess)
processes.Add(newProcess)
oldProcess.releaseGlobality()
newProcess.assertGlobality()
newProcess.idle()
idle.Remove(oldProcess)
running.Remove(oldProcess)
+3 -1
View File
@@ -22,11 +22,11 @@ var/global/datum/controller/process/air_system/air_master
var/last_hotspots = 0
var/last_asc = 0
/datum/controller/process/air_system/setup()
name = "air"
schedule_interval = 20 // every 2 seconds
start_delay = 4
air_master = src
var/watch = start_watch()
log_startup_progress("Processing geometry...")
@@ -50,6 +50,8 @@ var/global/datum/controller/process/air_system/air_master
stat(null, "[last_active] active")
stat(null, "[last_excited] EG | [last_hpd] HPD | [last_asc] ASC | [last_hotspots] Hot")
DECLARE_GLOBAL_CONTROLLER(air_system, air_master)
/datum/controller/process/air_system/proc/process_hotspots()
last_hotspots = hotspots.len
for(var/obj/effect/hotspot/H in hotspots)
+2 -1
View File
@@ -17,12 +17,13 @@ var/datum/controller/process/alarm/alarm_manager
name = "alarm"
schedule_interval = 20 // every 2 seconds
all_handlers = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm)
alarm_manager = src
/datum/controller/process/alarm/doWork()
for(var/datum/alarm_handler/AH in all_handlers)
AH.process()
DECLARE_GLOBAL_CONTROLLER(alarm, alarm_manager)
/datum/controller/process/alarm/proc/active_alarms()
var/list/all_alarms = new
for(var/datum/alarm_handler/AH in all_handlers)
+2 -3
View File
@@ -9,9 +9,6 @@ var/datum/controller/process/diseases/disease_master
schedule_interval = 20 // every 2 seconds
start_delay = 7
log_startup_progress("Disease controller starting.")
if(disease_master)
qdel(disease_master) //only one mob master
disease_master = src
register_diseases() //register all pre-round diseases created
@@ -38,6 +35,8 @@ var/datum/controller/process/diseases/disease_master
catchBadType(thing)
processing_diseases.Remove(thing)
DECLARE_GLOBAL_CONTROLLER(diseases, disease_master)
/datum/controller/process/diseases/proc/register_diseases()
for(var/datum/disease/D in world)
if(!processing_diseases.Find(D))
+1 -1
View File
@@ -45,4 +45,4 @@ var/global/datum/controller/holiday/holiday_master //This has to be defined befo
if(holidays)
holidays = shuffle(holidays)
world.update_status()
world.update_status()
+3 -2
View File
@@ -6,7 +6,6 @@ var/global/datum/controller/process/fire/fire_master
/datum/controller/process/fire/setup()
name = "fire"
schedule_interval = 20 //every 2 seconds
fire_master = src
log_startup_progress("Fire process starting up.")
/datum/controller/process/fire/statProcess()
@@ -20,4 +19,6 @@ var/global/datum/controller/process/fire/fire_master
burningobj.burn()
SCHECK
else
burning.Remove(burningobj)
burning.Remove(burningobj)
DECLARE_GLOBAL_CONTROLLER(fire, fire_master)
+4 -2
View File
@@ -1,10 +1,10 @@
var/global/datum/controller/process/garbage_collector/garbageCollector
/datum/controller/process/garbage_collector/setup()
name = "garbage"
schedule_interval = 10
start_delay = 3
garbageCollector = src
/datum/controller/process/garbage_collector/doWork()
// Garbage collection code can be found in code\modules\garbage collection\garbage_collector.dm
processGarbage()
@@ -13,3 +13,5 @@
..()
stat(null, "[del_everything ? "Off" : "On"], [queue.len] queued")
stat(null, "Dels: [dels_count], [soft_dels] soft, [hard_dels] hard")
DECLARE_GLOBAL_CONTROLLER(garbage_collector, garbageCollector)
+3 -4
View File
@@ -8,9 +8,6 @@ var/global/datum/controller/process/mob/mob_master
schedule_interval = 20 // every 2 seconds
start_delay = 16
log_startup_progress("Mob ticker starting up.")
if(mob_master)
qdel(mob_master) //only one mob master
mob_master = src
/datum/controller/process/mob/started()
..()
@@ -33,4 +30,6 @@ var/global/datum/controller/process/mob/mob_master
else
catchBadType(M)
mob_list -= M
current_cycle++
current_cycle++
DECLARE_GLOBAL_CONTROLLER(mob, mob_master)
@@ -15,7 +15,6 @@ var/global/datum/controller/process/mob_hunt/mob_hunt_server
/datum/controller/process/mob_hunt/setup()
name = "Nano-Mob Hunter GO Server"
start_delay = 20
mob_hunt_server = src
/datum/controller/process/mob_hunt/doWork()
if(reset_cooldown) //if reset_cooldown is set (we are on cooldown, duh), reduce the remaining cooldown every cycle
@@ -26,6 +25,8 @@ var/global/datum/controller/process/mob_hunt/mob_hunt_server
if(normal_spawns.len < max_normal_spawns)
spawn_mob()
DECLARE_GLOBAL_CONTROLLER(mob_hunt, mob_hunt_server)
//leaving this here in case admins want to use it for a random mini-event or something
/datum/controller/process/mob_hunt/proc/server_crash(recover_time = 3000)
server_status = 0
+4 -4
View File
@@ -9,9 +9,6 @@ var/global/datum/controller/process/npcai/npcai_master
schedule_interval = 20 // every 2 seconds
start_delay = 16
log_startup_progress("NPC ticker starting up.")
if(npcai_master)
qdel(npcai_master) //only one mob master
npcai_master = src
/datum/controller/process/npcai/started()
..()
@@ -58,4 +55,7 @@ var/global/datum/controller/process/npcai/npcai_master
catchBadType(M)
snpc_list -= M
current_cycle++
current_cycle++
DECLARE_GLOBAL_CONTROLLER(npcai, npcai_master)
+4 -4
View File
@@ -14,9 +14,6 @@ var/global/datum/controller/process/npcpool/npc_master
schedule_interval = 100
start_delay = 17
log_startup_progress("NPC pool ticker starting up.")
if(npc_master)
qdel(npc_master) //only one mob master
npc_master = src
/datum/controller/process/npcpool/copyStateFrom(var/datum/controller/process/npcpool/target)
canBeUsed = target.canBeUsed
@@ -27,6 +24,9 @@ var/global/datum/controller/process/npcpool/npc_master
botPool_l = target.botPool_l
botPool_l_non = target.botPool_l_non
DECLARE_GLOBAL_CONTROLLER(npcpool, npc_master)
/datum/controller/process/npcpool/proc/insertBot(toInsert)
if(istype(toInsert, /mob/living/carbon/human/interactive))
botPool_l |= toInsert
@@ -113,4 +113,4 @@ var/global/datum/controller/process/npcpool/npc_master
needsAssistant -= check
canBeUsed -= candidate
candidate.change_eye_color(255, 255, 0)
SCHECK
SCHECK
+3 -2
View File
@@ -40,8 +40,6 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
name = "shuttle"
schedule_interval = 20
shuttle_master = src
var/watch = start_watch()
log_startup_progress("Initializing shuttle docks...")
initialize_docks()
@@ -72,6 +70,9 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
continue
mobile.Remove(thing)
DECLARE_GLOBAL_CONTROLLER(shuttle, shuttle_master)
/datum/controller/process/shuttle/proc/initialize_docks()
for(var/obj/docking_port/D in world)
D.register()
+1 -1
View File
@@ -10,7 +10,6 @@ var/global/datum/controller/process/sun/sun
/datum/controller/process/sun/setup()
name = "sun"
schedule_interval = 600 // every 60 seconds
sun = src
log_startup_progress("Sun ticker starting up.")
angle = rand (0,360) // the station position to the sun is randomised at round start
@@ -22,6 +21,7 @@ var/global/datum/controller/process/sun/sun
calc_position()
update_solar_machinery()
DECLARE_GLOBAL_CONTROLLER(sun, sun)
// calculate the sun's position given the time of day
// at the standard rate (100%) the angle is increase/decreased by 6 degrees every minute.
+2 -2
View File
@@ -14,12 +14,12 @@ var/global/datum/controller/process/ticker/tickerProcess
if(!ticker)
ticker = new
tickerProcess = src
spawn(0)
if(ticker)
ticker.pregame()
DECLARE_GLOBAL_CONTROLLER(ticker, tickerProcess)
/datum/controller/process/ticker/doWork()
var/currentTime = world.timeofday
+2 -1
View File
@@ -7,7 +7,6 @@ var/global/datum/controller/process/timer/timer_master
/datum/controller/process/timer/setup()
name = "timer"
schedule_interval = 1 //every 0.1 seconds--2 server ticks
timer_master = src
log_startup_progress("Timer process starting up.")
/datum/controller/process/timer/statProcess()
@@ -27,6 +26,8 @@ var/global/datum/controller/process/timer/timer_master
qdel(event)
SCHECK
DECLARE_GLOBAL_CONTROLLER(timer, timer_master)
/datum/controller/process/timer/proc/runevent(datum/timedevent/event)
set waitfor = 0
if(event.thingToCall)
+2 -1
View File
@@ -10,7 +10,6 @@ var/global/datum/controller/process/weather/weather_master
/datum/controller/process/weather/setup()
name = "weather"
schedule_interval = 10
weather_master = src
for(var/V in subtypesof(/datum/weather))
var/datum/weather/W = V
@@ -40,6 +39,8 @@ var/global/datum/controller/process/weather/weather_master
eligible_zlevels -= Z
addtimer(src, "make_z_eligible", rand(3000, 6000) + W.weather_duration_upper, TRUE, Z) //Around 5-10 minutes between weathers
DECLARE_GLOBAL_CONTROLLER(weather, weather_master)
/datum/controller/process/weather/proc/run_weather(weather_name)
if(!weather_name)
return
-3
View File
@@ -27,7 +27,6 @@
/datum/ai_laws/nanotrasen
name = "NT Default"
selectable = 1
default = 1
/datum/ai_laws/nanotrasen/New()
src.add_inherent_law("Safeguard: Protect your assigned space station to the best of your abilities. It is not something we can easily afford to replace.")
@@ -61,7 +60,6 @@
/datum/ai_laws/robocop
name = "Robocop"
selectable = 1
default = 1
/datum/ai_laws/robocop/New()
add_inherent_law("Serve the public trust.")
@@ -74,7 +72,6 @@
name = "P.A.L.A.D.I.N."
law_header = "Divine Ordainments"
selectable = 1
default = 1
/datum/ai_laws/paladin/New()
add_inherent_law("Never willingly commit an evil act.")
+1 -1
View File
@@ -654,7 +654,7 @@
var/bruteloss = M.bruteloss
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/C = M
for(var/obj/item/organ/external/L in C.organs)
for(var/obj/item/organ/external/L in C.bodyparts)
bruteloss += L.brute_dam
if(bruteloss < 100) // requires tenderization
M.apply_damage(rand(5,15),BRUTE)
+1 -1
View File
@@ -372,7 +372,7 @@ var/record_id_num = 1001
temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[H.tail]_s")
preview_icon.Blend(temp, ICON_OVERLAY)
for(var/obj/item/organ/external/E in H.organs)
for(var/obj/item/organ/external/E in H.bodyparts)
preview_icon.Blend(E.get_icon(), ICON_OVERLAY)
// Skin tone
+2 -2
View File
@@ -155,7 +155,7 @@ var/list/diseases = subtypesof(/datum/disease)
if(disease_flags & CAN_RESIST)
if(!(type in affected_mob.resistances))
affected_mob.resistances += type
remove_virus()
remove_virus()
qdel(src)
@@ -164,7 +164,7 @@ var/list/diseases = subtypesof(/datum/disease)
if(ishuman(affected_mob))
var/mob/living/carbon/human/H = affected_mob
for(var/obj/item/organ/O in required_organs)
if(!locate(O) in H.organs)
if(!locate(O) in H.bodyparts)
if(!locate(O) in H.internal_organs)
cure()
return
+1
View File
@@ -42,6 +42,7 @@
materials[MAT_TRANQUILLITE] = new /datum/material/tranquillite()
/datum/material_container/Destroy()
QDEL_LIST_ASSOC_VAL(materials)
owner = null
return ..()
+3 -6
View File
@@ -659,16 +659,13 @@
if("remove")
for(var/obj/item/weapon/implant/mindshield/I in H.contents)
if(I && I.implanted)
I.removed(H)
qdel(I)
to_chat(H, "<span class='notice'><Font size =3><B>Your mindshield implant has been deactivated.</B></FONT></span>")
log_admin("[key_name(usr)] has deactivated [key_name(current)]'s mindshield implant")
message_admins("[key_name_admin(usr)] has deactivated [key_name_admin(current)]'s mindshield implant")
if("add")
var/obj/item/weapon/implant/mindshield/L = new/obj/item/weapon/implant/mindshield(H)
L.imp_in = H
L.implanted = 1
H.sec_hud_set_implants()
L.implant(H)
log_admin("[key_name(usr)] has given [key_name(current)] a mindshield implant")
message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a mindshield implant")
@@ -1171,7 +1168,7 @@
if(ishuman(current))
var/mob/living/carbon/human/H = current
// Don't "undress" organs right out of the body
for(var/obj/item/W in H.contents - (H.organs | H.internal_organs))
for(var/obj/item/W in H.contents - (H.bodyparts | H.internal_organs))
current.unEquip(W, 1)
else
for(var/obj/item/W in current)
@@ -1335,7 +1332,7 @@
to_chat(current, "<font color=\"cultitalic\"><b><i>You catch a glimpse of the Realm of [ticker.mode.cultdat.entity_name], [ticker.mode.cultdat.entity_title2]. You now see how flimsy the world is, you see that it should be open to the knowledge of [ticker.mode.cultdat.entity_name].</b></i></font>")
to_chat(current, "<font color=\"cultitalic\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>")
var/datum/game_mode/cult/cult = ticker.mode
if(istype(cult))
if(GAMEMODE_IS_CULT)
cult.memorize_cult_objectives(src)
else
var/explanation = "Summon [ticker.mode.cultdat.entity_name] via the use of the appropriate rune. It will only work if nine cultists stand on and around it."
+3 -9
View File
@@ -219,9 +219,7 @@
apply_to_card(I, H, get_centcom_access("Nanotrasen Navy Officer"), "Nanotrasen Navy Officer")
var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H)
L.imp_in = H
L.implanted = 1
H.sec_hud_set_implants()
L.implant(H)
/datum/outfit/admin/nt_special_ops_officer
@@ -330,9 +328,7 @@
apply_to_card(I, H, get_centcom_access("Nanotrasen Navy Captain"), "Nanotrasen Navy Captain")
var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H)
L.imp_in = H
L.implanted = 1
H.sec_hud_set_implants()
L.implant(H)
/datum/outfit/admin/nt_diplomat
name = "NT Diplomat"
@@ -756,9 +752,7 @@
apply_to_card(I, H, get_centcom_access("Emergency Response Team Member"), "Emergency Response Team Member")
var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H)
L.imp_in = H
L.implanted = 1
H.sec_hud_set_implants()
L.implant(H)
/datum/outfit/admin/chrono
name = "Chrono Legionnaire"
+1 -3
View File
@@ -33,7 +33,7 @@
H.apply_damage(10, BRUTE, "chest")
to_chat(H, "<span class='userdanger'>You have no appendix, but something had to give! Holy shit, what was that?</span>")
H.Weaken(3)
for(var/obj/item/organ/external/E in H.organs)
for(var/obj/item/organ/external/E in H.bodyparts)
if(istype(E, /obj/item/organ/external/head))
continue
if(istype(E, /obj/item/organ/external/chest))
@@ -43,5 +43,3 @@
if(prob(7))
to_chat(H, "<span class='userdanger'>Your [E] was severed by the explosion!</span>")
E.droplimb(1, DROPLIMB_EDGE, 0, 1)
+2 -2
View File
@@ -70,8 +70,8 @@
if(ishuman(M)) //Edge case housekeeping
var/mob/living/carbon/human/C = M
/*if(C.internal_organs_by_name && item_to_retrive in C.internal_organs_by_name ) //This won't work, as we use organ datums instead of objects. --DZD
C.internal_organs_by_name -= item_to_retrive
/*if(C.internal_bodyparts_by_name && item_to_retrive in C.internal_bodyparts_by_name ) //This won't work, as we use organ datums instead of objects. --DZD
C.internal_bodyparts_by_name -= item_to_retrive
if(istype(marked_item, /obj/item/brain)) //If this code ever runs I will be happy
var/obj/item/brain/B = new /obj/item/brain(target.loc)
B.transfer_identity(C)
+8 -2
View File
@@ -486,15 +486,19 @@ var/list/ghostteleportlocs = list()
/area/centcom/control
name = "\improper Centcom Control"
icon_state = "centcom_ctrl"
/area/centcom/evac
name = "\improper Centcom Emergency Shuttle"
icon_state = "centcom_evac"
/area/centcom/suppy
name = "\improper Centcom Supply Shuttle"
icon_state = "centcom_supply"
/area/centcom/ferry
name = "\improper Centcom Transport Shuttle"
icon_state = "centcom_ferry"
/area/centcom/shuttle
name = "\improper Centcom Administration Shuttle"
@@ -507,9 +511,11 @@ var/list/ghostteleportlocs = list()
/area/centcom/specops
name = "\improper Centcom Special Ops"
icon_state = "centcom_specops"
/area/centcom/creed
name = "Creed's Office"
/area/centcom/gamma
name = "\improper Centcom Gamma Armory"
icon_state = "centcom_gamma"
/area/centcom/holding
name = "\improper Holding Facility"
+2 -2
View File
@@ -26,7 +26,7 @@
// If you're wondering what goofery this is, this is for things that need the environment
// around them set up - like `air_update_turf` and the like
if((ticker && ticker.current_state == GAME_STATE_PLAYING))
if((ticker && ticker.current_state >= GAME_STATE_SETTING_UP))
attempt_init()
/atom/movable/Destroy()
@@ -231,7 +231,7 @@
if(isobj(A))
if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement
src.throw_impact(A,speed)
/atom/movable/proc/throw_at_fast(atom/target, range, speed, thrower, no_spin)
set waitfor = 0
throw_at(target, range, speed, thrower, no_spin)
+11 -10
View File
@@ -263,11 +263,11 @@
/obj/effect/proc_holder/spell/targeted/eat/proc/doHeal(var/mob/user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
for(var/name in H.organs_by_name)
for(var/name in H.bodyparts_by_name)
var/obj/item/organ/external/affecting = null
if(!H.organs[name])
if(!H.bodyparts_by_name[name])
continue
affecting = H.organs[name]
affecting = H.bodyparts_by_name[name]
if(!istype(affecting, /obj/item/organ/external))
continue
affecting.heal_damage(4, 0)
@@ -554,7 +554,8 @@
return
to_chat(user, "<span class='notice'>Mind Reading of <b>[M.name]:</b></span>")
var/pain_condition = M.health
var/pain_condition = M.health / M.maxHealth
// lower health means more pain
var/list/randomthoughts = list("what to have for lunch","the future","the past","money",
"their hair","what to do next","their job","space","amusing things","sad things",
@@ -562,20 +563,20 @@
var/thoughts = "thinking about [pick(randomthoughts)]"
if(M.fire_stacks)
pain_condition -= 50
pain_condition -= 0.5
thoughts = "preoccupied with the fire"
if(M.radiation)
pain_condition -= 25
pain_condition -= 0.25
switch(pain_condition)
if(81 to INFINITY)
if(0.81 to INFINITY)
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] feels good.</span>")
if(61 to 80)
if(0.61 to 0.8)
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering mild pain.</span>")
if(41 to 60)
if(0.41 to 0.6)
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering significant pain.</span>")
if(21 to 40)
if(0.21 to 0.4)
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering severe pain.</span>")
else
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering excruciating pain.</span>")
+1 -2
View File
@@ -44,8 +44,7 @@
/mob/camera/blob/Destroy()
if(ghostimage)
ghost_darkness_images -= ghostimage
qdel(ghostimage)
ghostimage = null;
QDEL_NULL(ghostimage)
updateallghostimages()
return ..()
+11 -11
View File
@@ -35,29 +35,29 @@
H.species.create_organs(H)
// Now that recreating all organs is necessary, the rest of this organ stuff probably
// isn't, but I don't want to remove it, just in case.
for(var/organ_name in H.organs_by_name)
var/obj/item/organ/external/O = H.organs_by_name[organ_name]
if(!O) continue
for(var/organ_name in H.bodyparts_by_name)
var/obj/item/organ/external/O = H.bodyparts_by_name[organ_name]
if(!O)
continue
for(var/obj/item/weapon/shard/shrapnel/s in O.implants)
if(istype(s))
O.implants -= s
H.contents -= s
qdel(s)
O.implants -= s
H.contents -= s
qdel(s)
O.brute_dam = 0
O.burn_dam = 0
O.damage_state = "00"
O.germ_level = 0
O.hidden = null
QDEL_NULL(O.hidden)
O.number_wounds = 0
O.open = 0
O.perma_injury = 0
O.status = 0
O.trace_chemicals = list()
O.wounds = list()
O.trace_chemicals.Cut()
QDEL_LIST(O.wounds)
O.wound_update_accuracy = 1
for(var/obj/item/organ/internal/IO in H.internal_organs)
IO.damage = 0
IO.trace_chemicals = list()
IO.trace_chemicals.Cut()
H.updatehealth()
to_chat(user, "<span class='notice'>We have regenerated.</span>")
+2 -8
View File
@@ -170,6 +170,7 @@ var/global/list/all_cults = list()
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE
if(!istype(cult_mind))
return 0
var/datum/game_mode/cult/cult_mode = ticker.mode
if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind))
cult += cult_mind
cult_mind.current.faction |= "cult"
@@ -179,18 +180,11 @@ var/global/list/all_cults = list()
if(jobban_isbanned(cult_mind.current, ROLE_CULTIST) || jobban_isbanned(cult_mind.current, ROLE_SYNDICATE))
replace_jobbanned_player(cult_mind.current, ROLE_CULTIST)
update_cult_icons_added(cult_mind)
cult_mode.memorize_cult_objectives(cult_mind)
if(GAMEMODE_IS_CULT)
var/datum/game_mode/cult/cult_mode = ticker.mode
cult_mode.check_numbers()
return 1
/datum/game_mode/cult/add_cultist(datum/mind/cult_mind) //INHERIT
if(!..(cult_mind))
return
memorize_cult_objectives(cult_mind)
/datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, show_message = 1)
if(cult_mind in cult)
cult -= cult_mind
+1 -1
View File
@@ -21,7 +21,7 @@
if("convert")
explanation = "We must increase our influence before we can summon [ticker.mode.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions."
if("bloodspill")
spilltarget = 100 + rand(0,player_list.len * 3)
spilltarget = 70 + rand(0,player_list.len * 3)
explanation = "We must prepare this place for [ticker.mode.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles."
if("sacrifice")
explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for his blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual."
+7 -7
View File
@@ -145,7 +145,7 @@
text += "<font color='red'><b>Talisman of Teleportation</b></font><br>The talisman form of the Teleport rune will transport the invoker to a selected Teleport rune once.<br><br>"
text += "<font color='red'><b>Talisman of Fabrication</b></font><br>This talisman is the main way of creating construct shells. To use it, one must strike 30 sheets of metal with the talisman. The sheets will then be twisted into a construct shell, ready to recieve a soul to occupy it.<br><br>"
text += "<font color='red'><b>Talisman of Fabrication</b></font><br>This talisman is the main way of creating construct shells. To use it, one must strike 30 sheets of metal with the talisman. The sheets will then be twisted into a construct shell, ready to receive a soul to occupy it.<br><br>"
text += "<font color='red'><b>Talisman of Tome Summoning</b></font><br>This talisman will produce a single tome at your feet.<br><br>"
@@ -159,9 +159,9 @@
Robotic lifeforms will suffer the effects of a heavy electromagnetic pulse instead.<br><br>"
text += "<font color='red'><b>Talisman of Armaments</b></font><br>The Talisman of Arming will equip the user with armored robes, a backpack, shoes, an eldritch longsword, and an empowered bola. Any equipment that cannot \
be equipped will not be summoned, weaponary will be put on the floor below the user. Attacking a fellow cultist with it will instead equip them.<br><br>"
be equipped will not be summoned, weaponry will be put on the floor below the user. Attacking a fellow cultist with it will instead equip them.<br><br>"
text += "<font color='red'><b>Talisman of Horrors</b></font><br>The Talisman of Horror must be applied directly to the victim, it will shatter your victim's mind with visions of the endtimes that may incapitate them.<br><br>"
text += "<font color='red'><b>Talisman of Horrors</b></font><br>The Talisman of Horror must be applied directly to the victim, it will shatter your victim's mind with visions of the end-times that may incapacitate them.<br><br>"
text += "<font color='red'><b>Talisman of Shackling</b></font><br>The Talisman of Shackling must be applied directly to the victim, it has 4 uses and cuffs victims with magic shackles that disappear when removed.<br><br>"
@@ -169,7 +169,7 @@
text += "<font color='red'><b>Equipment:</b></font><br><br>"
text += "<font color='red'><b>Cult Blade</b></font><br>Cult blades are sharp weapons that, notably, cannot be used by noncultists. These blades are produced by the Talisman of Arming.<br><br>"
text += "<font color='red'><b>Cult Blade</b></font><br>Cult blades are sharp weapons that, notably, cannot be used by non-cultists. These blades are produced by the Talisman of Arming.<br><br>"
text += "<font color='red'><b>Cult Bola</b></font><br>Cult bolas are strong bolas, useful for snaring targets. These bolas are produced by the Talisman of Arming.<br><br>"
@@ -216,14 +216,14 @@
if(!((CULT_ELDERGOD in cult_mode.objectives) || (CULT_SLAUGHTER in cult_mode.objectives)))
to_chat(user, "<span class='warning'>[cult_mode.cultdat.entity_name]'s power does not wish to be unleashed!</span>")
return 0
var/confirm_final = alert(user, "This is the FINAL step to summon your dietys power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [cult_mode.cultdat.entity_name]!", "No")
var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [cult_mode.cultdat.entity_name]!", "No")
if(confirm_final == "No" || confirm_final == null)
to_chat(user, "<span class='cult'>You decide to prepare further before scribing the rune.</span>")
return 0
else
return 1
else//the game mode is not cult..but we ARE a cultist...ALL ON THE ADMINBUS
var/confirm_final = alert(user, "This is the FINAL step to summon your dietys power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [cult_mode.cultdat.entity_name]!", "No")
var/confirm_final = alert(user, "This is the FINAL step to summon your deities power, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [cult_mode.cultdat.entity_name]!", "No")
if(confirm_final == "No" || confirm_final == null)
to_chat(user, "<span class='cult'>You decide to prepare further before scribing the rune.</span>")
return 0
@@ -269,7 +269,7 @@
return
if(ispath(rune_to_scribe, /obj/effect/rune/narsie) || ispath(rune_to_scribe, /obj/effect/rune/slaughter))//may need to change this - Fethas
if(finale_runes_ok(user,rune_to_scribe))
command_announcement.Announce("Figments from an eldritch god are being summoned somwhere on the station from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg')
command_announcement.Announce("Figments from an eldritch god are being summoned somwhere on the station from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", 'sound/AI/spanomalies.ogg')
for(var/B in spiral_range_turfs(1, user, 1))
var/turf/T = B
var/obj/machinery/shield/N = new(T)
+5 -3
View File
@@ -336,7 +336,7 @@ var/list/teleport_runes = list()
var/turf/T = get_turf(src)
for(var/mob/living/M in T.contents)
if(!iscultist(M) && !ismindshielded(M))
if(!iscultist(M) && !ismindshielded(M) && ishuman(M))
convertees.Add(M)
if(!convertees.len)
fail_invoke()
@@ -415,6 +415,7 @@ var/list/teleport_runes = list()
/obj/effect/rune/sacrifice/proc/sac(var/list/invokers, mob/living/T)
var/sacrifice_fulfilled
var/datum/game_mode/cult/cult_mode = ticker.mode
if(T)
if(istype(T, /mob/living/simple_animal/pet/corgi))
for(var/M in invokers)
@@ -428,11 +429,12 @@ var/list/teleport_runes = list()
sacrifice_fulfilled = 1
new /obj/effect/overlay/temp/cult/sac(loc)
if(ticker && ticker.mode && ticker.mode.name == "cult")
var/datum/game_mode/cult/cult_mode = ticker.mode
cult_mode.harvested++
for(var/M in invokers)
if(sacrifice_fulfilled)
to_chat(M, "<span class='cultlarge'>\"Yes! This is the one I desire! You have done well.\"</span>")
cult_mode.additional_phase()
else
if(ishuman(T) || isrobot(T))
to_chat(M, "<span class='cultlarge'>\"I accept this sacrifice.\"</span>")
@@ -534,7 +536,7 @@ var/list/teleport_runes = list()
/obj/effect/rune/slaughter
cultist_name = "Call Forth The Slaughter (Demons)"
cultist_desc = "Calls forth the doom of a eldrtich being. Three slaughter demons will appear to wreak havoc on the station."
cultist_desc = "Calls forth the doom of an eldritch being. Three slaughter demons will appear to wreak havoc on the station."
invocation = null
req_cultists = 9
color = rgb(125,23,23)
+2 -2
View File
@@ -64,7 +64,7 @@
dat += "<A href='?src=[UID()];rune=emp'>Ta'gh fara'qha fel d'amar det!</A> - Allows you to destroy technology in a short range.<BR>"
dat += "<A href='?src=[UID()];rune=runestun'>Fuu ma'jin!</A> - Allows you to stun a person by attacking them with the talisman.<BR>"
dat += "<A href='?src=[UID()];rune=veiling'>Kla'atu barada nikt'o!</A> - Two use talisman, first use makes all nearby runes invisible, second use reveals nearby hidden runes.<BR>"
dat += "<A href='?src=[UID()];rune=soulstone'>Kal'om neth!</A> - Summons a soul stone, used to capure the spirits of dead or dying humans.<BR>"
dat += "<A href='?src=[UID()];rune=soulstone'>Kal'om neth!</A> - Summons a soul stone, used to capture the spirits of dead or dying humans.<BR>"
dat += "<A href='?src=[UID()];rune=construct'>Daa'ig osk!</A> - Summons a construct shell for use with soulstone-captured souls. It is too large to carry on your person.<BR>"
var/datum/browser/popup = new(user, "talisman", "", 400, 400)
popup.set_content(jointext(dat, ""))
@@ -300,7 +300,7 @@
/obj/item/weapon/paper/talisman/horror/attack(mob/living/target, mob/living/user)
if(iscultist(user))
to_chat(user, "<span class='cultitalic'>You disturb [target] with visons of the end!</span>")
to_chat(user, "<span class='cultitalic'>You disturb [target] with visions of the end!</span>")
if(iscarbon(target))
var/mob/living/carbon/H = target
H.AdjustHallucinate(30)
-13
View File
@@ -406,18 +406,6 @@ var/round_start_time = 0
if(F.name == name)
return F
/datum/controller/gameticker/proc/karmareminder()
for(var/mob/living/player in player_list)
if(player.client)
if(player.client.karma_spent == 0)
if(!player.get_preference(DISABLE_KARMA_REMINDER))
var/dat
dat += {"<html><head><title>Karma Reminder</title></head><body><h1><B>Karma Reminder</B></h1><br>
You have not yet spent your karma for the round, surely there is a player who was worthy of receiving<br>
your reward? Look under 'OOC' for the 'Award Karma' button, and use it once a round for best results!</table></body></html>"}
player << browse(dat, "window=karmareminder;size=400x300")
/datum/controller/gameticker/proc/declare_completion()
nologevent = 1 //end of round murder and shenanigans are legal; there's no need to jam up attack logs past this point.
@@ -472,7 +460,6 @@ var/round_start_time = 0
call(mode, handler)()
scoreboard()
karmareminder()
// Declare the completion of the station goals
mode.declare_station_goal_completion()
+3 -4
View File
@@ -121,13 +121,12 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
vox.update_dna()
vox.update_eyes()
for(var/obj/item/organ/external/limb in vox.organs)
for(var/obj/item/organ/external/limb in vox.bodyparts)
limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
//Now apply cortical stack.
var/obj/item/weapon/implant/cortical/I = new(vox)
I.imp_in = vox
I.implanted = 1
I.implant(vox)
cortical_stacks += I
vox.equip_vox_raider()
@@ -313,4 +312,4 @@ datum/game_mode/proc/auto_declare_completion_heist()
log_admin("[key_name(user)] pressed the vox win button during a vox round.")
var/datum/game_mode/heist/H = ticker.mode
H.win_button_triggered = 1
H.win_button_triggered = 1
-7
View File
@@ -29,13 +29,6 @@
if(I.stat == DEAD && is_station_level(I.z))
score_deadcrew++
if(I && I.mind)
if(I.mind.assigned_role == "Clown")
for(var/thing in I.attack_log)
if(findtext(thing, "<font color='orange'>")) //This has to be the hackiest fucking way _ever_ to see attacks.
score_clownabuse++
if(shuttle_master.emergency.mode >= SHUTTLE_ENDGAME)
for(var/mob/living/player in mob_list)
if(player.client)
@@ -45,4 +45,12 @@
return //You think an ascendant can be hurt by bombs? HA
/mob/living/simple_animal/ascendant_shadowling/singularity_act()
return 0 //Well hi, fellow god! How are you today?
return 0 //Well hi, fellow god! How are you today?
/mob/living/simple_animal/ascendant_shadowling/proc/announce(var/text, var/size = 4, var/new_sound = null)
var/message = "<font size=[size]><span class='shadowling'><b>\"[text]\"</font></span>"
for(var/mob/M in player_list)
if(!isnewplayer(M) && M.client)
to_chat(M, message)
if(new_sound)
M << new_sound
@@ -873,8 +873,8 @@
action_icon_state = "transmit"
/obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
for(var/mob/living/simple_animal/ascendant_shadowling/target in targets)
var/text = stripped_input(target, "What do you want to say to everything on and near [station_name()]?.", "Transmit to World", "")
if(!text)
return
to_chat(world, "<font size=4><span class='shadowling'><b>\"[text]\"</font></span>")
target.announce(text)
@@ -28,7 +28,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
H.visible_message("<span class='warning'>[H]'s things suddenly slip off. They hunch over and vomit up a copious amount of purple goo which begins to shape around them!</span>", \
"<span class='shadowling'>You remove any equipment which would hinder your hatching and begin regurgitating the resin which will protect you.</span>")
for(var/obj/item/I in H.contents - (H.organs | H.internal_organs)) //drops all items except organs
for(var/obj/item/I in H.contents - (H.bodyparts | H.internal_organs)) //drops all items except organs
H.unEquip(I)
sleep(50)
@@ -155,11 +155,10 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
for(var/mob/living/M in orange(7, H))
M.Weaken(10)
to_chat(M, "<span class='userdanger'>An immense pressure slams you onto the ground!</span>")
to_chat(world, "<font size=5><span class='shadowling'><b>\"VYSHA NERADA YEKHEZET U'RUU!!\"</font></span>")
world << 'sound/hallucinations/veryfar_noise.ogg'
for(var/obj/machinery/power/apc/A in apcs)
A.overload_lighting()
var/mob/A = new /mob/living/simple_animal/ascendant_shadowling(H.loc)
var/mob/living/simple_animal/ascendant_shadowling/A = new /mob/living/simple_animal/ascendant_shadowling(H.loc)
A.announce("VYSHA NERADA YEKHEZET U'RUU!!", 5, 'sound/hallucinations/veryfar_noise.ogg')
for(var/obj/effect/proc_holder/spell/S in H.mind.spell_list)
if(S == src) continue
H.mind.RemoveSpell(S)
@@ -340,7 +340,7 @@
H.mind.special_role = SPECIAL_ROLE_VAMPIRE_THRALL
to_chat(H, "<span class='danger'>You have been Enthralled by [user]. Follow their every command.</span>")
to_chat(user, "<span class='warning'>You have successfully Enthralled [H]. <i>If they refuse to do as you say just adminhelp.</i></span>")
log_admin("[ckey(user.key)] has mind-slaved [ckey(H.key)].")
add_logs(user, H, "vampire-thralled")
/obj/effect/proc_holder/spell/vampire/self/cloak
name = "Cloak of Darkness"
+1 -1
View File
@@ -464,7 +464,7 @@ var/global/list/multiverse = list()
if("cyborg")
if(M.get_species() != "Machine")
for(var/obj/item/organ/O in M.organs)
for(var/obj/item/organ/O in M.bodyparts)
O.robotize()
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(sword, slot_r_hand)
+2 -4
View File
@@ -199,9 +199,7 @@
if(implants)
for(var/implant_type in implants)
var/obj/item/weapon/implant/I = new implant_type(H)
I.imp_in = H
I.implanted = 1
H.sec_hud_set_implants()
I.implant(H)
if(gear_leftovers.len)
for(var/datum/gear/G in gear_leftovers)
@@ -210,7 +208,7 @@
if(isturf(placed_in))
to_chat(H, "<span class='notice'>Placing \the [G] on [placed_in]!</span>")
else
to_chat(H, "<span class='noticed'>Placing \the [G] in [placed_in.name]]")
to_chat(H, "<span class='noticed'>Placing \the [G] in [placed_in.name]")
continue
if(H.equip_to_appropriate_slot(G))
to_chat(H, "<span class='notice'>Placing \the [G] in your inventory!</span>")
+42 -12
View File
@@ -52,7 +52,7 @@
selection_color = "#ffeef0"
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_mineral_storeroom)
minimal_access = list(access_medical, access_morgue, access_surgery, access_maint_tunnels)
alt_titles = list("Surgeon","Nurse","Coroner")
alt_titles = list("Surgeon","Nurse")
minimal_player_age = 3
exp_requirements = 180
exp_type = EXP_TYPE_CREW
@@ -75,19 +75,49 @@
satchel = /obj/item/weapon/storage/backpack/satchel_med
dufflebag = /obj/item/weapon/storage/backpack/duffel/medical
/datum/job/coroner
title = "Coroner"
flag = CORONER
department_flag = MEDSCI
total_positions = 1
spawn_positions = 1
is_medical = 1
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_mineral_storeroom)
minimal_access = list(access_medical, access_morgue, access_maint_tunnels)
minimal_player_age = 3
exp_requirements = 180
exp_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/coroner
/datum/outfit/job/coroner
name = "Coroner"
jobtype = /datum/job/coroner
uniform = /obj/item/clothing/under/rank/medical/mortician
suit = /obj/item/clothing/suit/storage/labcoat/mortician
shoes = /obj/item/clothing/shoes/white
l_ear = /obj/item/device/radio/headset/headset_med
id = /obj/item/weapon/card/id/medical
suit_store = /obj/item/device/flashlight/pen
l_hand = /obj/item/weapon/clipboard
pda = /obj/item/device/pda/medical
backpack = /obj/item/weapon/storage/backpack/medic
satchel = /obj/item/weapon/storage/backpack/satchel_med
dufflebag = /obj/item/weapon/storage/backpack/duffel/medical
backpack_contents = list(
/obj/item/clothing/head/surgery/black = 1,
/obj/item/weapon/autopsy_scanner = 1,
/obj/item/device/mass_spectrometer = 1,
/obj/item/weapon/storage/box/bodybags = 1)
/datum/outfit/job/doctor/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
if(H.mind.role_alt_title)
switch(H.mind.role_alt_title)
if("Coroner")
uniform = /obj/item/clothing/under/rank/medical/mortician
suit = /obj/item/clothing/suit/storage/labcoat/mortician
backpack_contents = list(
/obj/item/clothing/head/surgery/black = 1,
/obj/item/weapon/autopsy_scanner = 1,
/obj/item/device/mass_spectrometer = 1,
/obj/item/weapon/storage/box/bodybags = 1
)
if("Surgeon")
uniform = /obj/item/clothing/under/rank/medical/blue
head = /obj/item/clothing/head/surgery/blue
@@ -257,8 +287,8 @@
supervisors = "the chief medical officer"
department_head = list("Chief Medical Officer")
selection_color = "#ffeef0"
access = list(access_paramedic, access_medical, access_sec_doors, access_maint_tunnels, access_external_airlocks, access_morgue)
minimal_access=list(access_paramedic, access_medical, access_sec_doors, access_maint_tunnels, access_external_airlocks, access_morgue)
access = list(access_paramedic, access_medical, access_maint_tunnels, access_external_airlocks, access_morgue)
minimal_access=list(access_paramedic, access_medical, access_maint_tunnels, access_external_airlocks, access_morgue)
minimal_player_age = 3
exp_requirements = 180
exp_type = EXP_TYPE_CREW
+2 -2
View File
@@ -156,8 +156,8 @@
title = "Security Officer"
flag = OFFICER
department_flag = ENGSEC
total_positions = 5
spawn_positions = 5
total_positions = 7
spawn_positions = 7
is_security = 1
supervisors = "the head of security"
department_head = list("Head of Security")
+8
View File
@@ -195,6 +195,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
implants = list(/obj/item/weapon/implant/mindshield)
backpack = /obj/item/weapon/storage/backpack/security
satchel = /obj/item/weapon/storage/backpack/satchel_sec
dufflebag = /obj/item/weapon/storage/backpack/duffel/security
/datum/job/judge
@@ -239,6 +241,9 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
implants = list(/obj/item/weapon/implant/mindshield)
satchel = /obj/item/weapon/storage/backpack/satchel_sec
dufflebag = /obj/item/weapon/storage/backpack/duffel/security
//var/global/lawyer = 0//Checks for another lawyer //This changed clothes on 2nd lawyer, both IA get the same dreds.
@@ -276,3 +281,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
pda = /obj/item/device/pda/lawyer
implants = list(/obj/item/weapon/implant/mindshield)
satchel = /obj/item/weapon/storage/backpack/satchel_sec
dufflebag = /obj/item/weapon/storage/backpack/duffel/security
+58
View File
@@ -1,3 +1,40 @@
// Playtime requirements for special roles (hours)
var/global/list/role_playtime_requirements = list(
// CREW-FRIENDLY ROLES
ROLE_PAI = 0,
ROLE_POSIBRAIN = 5, // Same as cyborg job.
ROLE_SENTIENT = 5,
ROLE_ERT = 10, // High, because they're team-based, and we want ERT to be robust
ROLE_TRADER = 5,
// SOLO ANTAGS
ROLE_TRAITOR = 3,
ROLE_CHANGELING = 3,
ROLE_WIZARD = 3,
ROLE_VAMPIRE = 3,
ROLE_BLOB = 3,
ROLE_REVENANT = 3,
ROLE_BORER = 3,
ROLE_NINJA = 3,
ROLE_MORPH = 3,
ROLE_DEMON = 3,
// DUO ANTAGS
ROLE_GUARDIAN = 5,
ROLE_GSPIDER = 5,
// TEAM ANTAGS
// Higher numbers here, because they require more experience to be played correctly
ROLE_SHADOWLING = 10,
ROLE_REV = 10,
ROLE_OPERATIVE = 10,
ROLE_CULTIST = 10,
ROLE_RAIDER = 10,
ROLE_ALIEN = 10,
ROLE_ABDUCTOR = 10,
)
// Admin Verbs
/client/proc/cmd_mentor_check_player_exp() //Allows admins to determine who the newer players are.
@@ -53,6 +90,27 @@
// Procs
/proc/role_available_in_playtime(client/C, role)
if(!C)
return 0
if(!role)
return 0
if(!config.use_exp_restrictions)
return 0
if(config.use_exp_restrictions_admin_bypass && check_rights(R_ADMIN, 0, C.mob))
return 0
var/list/play_records = params2list(C.prefs.exp)
var/isexempt = text2num(play_records[EXP_TYPE_EXEMPT])
if(isexempt)
return 0
var/minimal_player_hrs = role_playtime_requirements[role]
if(!minimal_player_hrs)
return 0
var/req_mins = minimal_player_hrs * 60
var/my_exp = text2num(play_records[EXP_TYPE_CREW])
if(!isnum(my_exp))
return req_mins
return max(0, req_mins - my_exp)
/datum/job/proc/available_in_playtime(client/C)
if(!C)
+3 -1
View File
@@ -25,6 +25,7 @@ var/const/VIROLOGIST =(1<<6)
var/const/PSYCHIATRIST =(1<<7)
var/const/ROBOTICIST =(1<<8)
var/const/PARAMEDIC =(1<<9)
var/const/CORONER =(1<<10)
var/const/SUPPORT =(1<<2)
@@ -84,7 +85,8 @@ var/list/medical_positions = list(
"Psychiatrist",
"Chemist",
"Virologist",
"Paramedic"
"Paramedic",
"Coroner"
)
+2 -2
View File
@@ -385,7 +385,7 @@
occupantData["implant_len"] = implantData.len
var/extOrganData[0]
for(var/obj/item/organ/external/E in H.organs)
for(var/obj/item/organ/external/E in H.bodyparts)
var/organData[0]
organData["name"] = E.name
organData["open"] = E.open
@@ -562,7 +562,7 @@
dat += "<th>Other Wounds</th>"
dat += "</tr>"
for(var/obj/item/organ/external/e in occupant.organs)
for(var/obj/item/organ/external/e in occupant.bodyparts)
dat += "<tr>"
var/AN = ""
var/open = ""
+7 -1
View File
@@ -213,6 +213,10 @@
radio_controller.remove_object(src, frequency)
air_alarm_repository.update_cache(src)
QDEL_NULL(wires)
if(alarm_area && alarm_area.master_air_alarm == src)
alarm_area.master_air_alarm = null
elect_master(exclude_self = 1)
alarm_area = null
return ..()
/obj/machinery/alarm/proc/first_run()
@@ -236,8 +240,10 @@
return alarm_area.master_air_alarm && !(alarm_area.master_air_alarm.stat & (NOPOWER|BROKEN))
/obj/machinery/alarm/proc/elect_master()
/obj/machinery/alarm/proc/elect_master(exclude_self = 0) //Why is this an alarm and not area proc?
for(var/obj/machinery/alarm/AA in alarm_area)
if(exclude_self && AA == src)
continue
if(!(AA.stat & (NOPOWER|BROKEN)))
alarm_area.master_air_alarm = AA
return 1
@@ -21,9 +21,7 @@
*/
/obj/item/weapon/camera_assembly/Destroy()
for(var/thing in upgrades)
qdel(thing)
upgrades.Cut()
QDEL_LIST(upgrades)
return ..()
/obj/item/weapon/camera_assembly/attackby(obj/item/W, mob/living/user, params)
+95 -66
View File
@@ -10,88 +10,117 @@
power_channel = EQUIP
var/obj/item/weapon/stock_parts/cell/charging = null
var/chargelevel = -1
proc
updateicon()
icon_state = "ccharger[charging ? 1 : 0]"
if(charging && !(stat & (BROKEN|NOPOWER)) )
/obj/machinery/cell_charger/Destroy()
QDEL_NULL(charging)
return ..()
var/newlevel = round(charging.percent() * 4 / 100)
// to_chat(world, "nl: [newlevel]")
/obj/machinery/cell_charger/proc/updateicon()
icon_state = "ccharger[charging ? 1 : 0]"
if(chargelevel != newlevel)
if(charging && !(stat & (BROKEN|NOPOWER)))
var/newlevel = round(charging.percent() * 4 / 100)
overlays.Cut()
overlays += "ccharger-o[newlevel]"
if(chargelevel != newlevel)
chargelevel = newlevel
chargelevel = newlevel
else
overlays.Cut()
examine(mob/user)
if(..(user, 5))
to_chat(user, "There's [charging ? "a" : "no"] cell in the charger.")
if(charging)
to_chat(user, "Current charge: [charging.charge]")
overlays.Cut()
overlays += "ccharger-o[newlevel]"
attackby(obj/item/weapon/W, mob/user, params)
else
overlays.Cut()
/obj/machinery/cell_charger/examine(mob/user)
..()
to_chat(user, "There's [charging ? "a" : "no"] cell in the charger.")
if(charging)
to_chat(user, "Current charge: [round(charging.percent(), 1)]%")
/obj/machinery/cell_charger/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/stock_parts/cell))
if(stat & BROKEN)
to_chat(user, "<span class='warning'>[src] is broken!</span>")
return
if(!anchored)
to_chat(user, "<span class='warning'>[src] isn't attached to the ground!</span>")
return
if(istype(W, /obj/item/weapon/stock_parts/cell) && anchored)
if(charging)
to_chat(user, "<span class='warning'>There is already a cell in the charger.</span>")
return
else
var/area/a = loc.loc // Gets our locations location, like a dream within a dream
if(!isarea(a))
return
if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power!
to_chat(user, "<span class='warning'>The [name] blinks red as you try to insert the cell!</span>")
return
user.drop_item()
W.loc = src
charging = W
user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger.")
chargelevel = -1
updateicon()
else if(istype(W, /obj/item/weapon/wrench))
if(charging)
to_chat(user, "<span class='warning'>Remove the cell first!</span>")
return
anchored = !anchored
to_chat(user, "You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground")
playsound(get_turf(src), W.usesound, 75, 1)
attack_hand(mob/user)
if(charging)
usr.put_in_hands(charging)
charging.add_fingerprint(user)
charging.updateicon()
to_chat(user, "<span class='warning'>There is already a cell in the charger!</span>")
return
else
var/area/a = loc.loc // Gets our locations location, like a dream within a dream
if(!isarea(a))
return
if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power!
to_chat(user, "<span class='warning'>[src] blinks red as you try to insert the cell!</span>")
return
if(!user.drop_item())
return
src.charging = null
user.visible_message("[user] removes the cell from the charger.", "You remove the cell from the charger.")
W.forceMove(src)
charging = W
user.visible_message("[user] inserts a cell into the charger.", "<span class='notice'>You insert a cell into the charger.</span>")
chargelevel = -1
updateicon()
else if(iswrench(W))
if(charging)
to_chat(user, "<span class='warning'>Remove the cell first!</span>")
return
attack_ai(mob/user)
anchored = !anchored
to_chat(user, "<span class='notice'>You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground</span>")
playsound(src.loc, W.usesound, 75, 1)
else
return ..()
/obj/machinery/cell_charger/proc/removecell()
charging.updateicon()
charging = null
chargelevel = -1
updateicon()
/obj/machinery/cell_charger/attack_hand(mob/user)
if(!charging)
return
emp_act(severity)
if(stat & (BROKEN|NOPOWER))
return
if(charging)
charging.emp_act(severity)
..(severity)
user.put_in_hands(charging)
charging.add_fingerprint(user)
user.visible_message("[user] removes [charging] from [src].", "<span class='notice'>You remove [charging] from [src].</span>")
removecell()
/obj/machinery/cell_charger/attack_tk(mob/user)
if(!charging)
return
charging.forceMove(loc)
to_chat(user, "<span class='notice'>You telekinetically remove [charging] from [src].</span>")
removecell()
/obj/machinery/cell_charger/attack_ai(mob/user)
return
/obj/machinery/cell_charger/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
return
if(charging)
charging.emp_act(severity)
..(severity)
process()
// to_chat(world, "ccpt [charging] [stat]")
if(!charging || (stat & (BROKEN|NOPOWER)) || !anchored)
return
/obj/machinery/cell_charger/process()
if(!charging || !anchored || (stat & (BROKEN|NOPOWER)))
return
use_power(200) //this used to use CELLRATE, but CELLRATE is fucking awful. feel free to fix this properly!
charging.give(175) //inefficiency.
if(charging.percent() >= 100)
return
updateicon()
use_power(200) //this used to use CELLRATE, but CELLRATE is fucking awful. feel free to fix this properly!
charging.give(175) //inefficiency.
updateicon()
+2 -4
View File
@@ -142,14 +142,12 @@
/obj/machinery/computer/aifixer/Destroy()
if(occupant)
occupant.ghostize()
qdel(occupant)
occupant = null
QDEL_NULL(occupant)
return ..()
/obj/machinery/computer/aifixer/emp_act()
if(occupant)
occupant.ghostize()
qdel(occupant)
occupant = null
QDEL_NULL(occupant)
else
..()
+3 -6
View File
@@ -413,13 +413,10 @@
R.languages=subject.languages
//Add an implant if needed
var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)
if(isnull(imp))
if(!imp)
imp = new /obj/item/weapon/implant/health(subject)
imp.implanted = subject
R.implant = "\ref[imp]"
//Update it if needed
else
R.implant = "\ref[imp]"
imp.implant(subject)
R.implant = "\ref[imp]"
if(!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning.
R.mind = "\ref[subject.mind]"
@@ -5,13 +5,6 @@
light_color = LIGHT_COLOR_DARKGREEN
/obj/machinery/computer/vr_control/New()
..()
/obj/machinery/computer/vr_control/Destroy()
return ..()
/obj/machinery/computer/vr_control/attack_ai(mob/user)
attack_hand(user)
ui_interact(user)
+2
View File
@@ -136,6 +136,8 @@ for reference:
icon = 'icons/obj/structures.dmi'
icon_state = "woodenbarricade"
stacktype = /obj/item/stack/sheet/wood
burn_state = FLAMMABLE
burntime = 25
/obj/structure/barricade/mime
name = "floor"
+8
View File
@@ -1142,6 +1142,14 @@ About the new airlock wires panel:
open()
safe = TRUE
/obj/machinery/door/airlock/narsie_act()
var/turf/T = get_turf(src)
if(prob(20))
new/obj/machinery/door/airlock/cult(T)
qdel(src)
//////////////////////////////////
/*
Cult Airlocks
-15
View File
@@ -19,13 +19,6 @@ FIRE ALARM
var/last_process = 0
var/wiresexposed = 0
var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
var/area/master_area
/obj/machinery/firealarm/New()
var/area/A = get_area_master(src)
if(!istype(A, /area))
return
master_area = A
/obj/machinery/firealarm/update_icon()
@@ -294,14 +287,6 @@ Just a object used in constructing fire alarms
idle_power_usage = 2
active_power_usage = 6
var/area/master_area
/obj/machinery/partyalarm/New()
var/area/A = get_area_master(src)
if(!( istype(A, /area) ))
return
master_area=A
/obj/machinery/partyalarm/attack_hand(mob/user)
if((user.stat && !isobserver(user)) || stat & (NOPOWER|BROKEN))
return
+13
View File
@@ -65,6 +65,7 @@
var/has_cover = 1 //Hides the cover
/obj/machinery/porta_turret/centcom
name = "Centcom Turret"
enabled = 0
ailock = 1
check_synth = 0
@@ -74,6 +75,14 @@
check_weapons = 1
check_anomalies = 1
/obj/machinery/porta_turret/centcom/pulse
name = "Pulse Turret"
health = 200
enabled = 1
lethal = 1
req_access = list(access_cent_commander)
installation = /obj/item/weapon/gun/energy/pulse/turret
/obj/machinery/porta_turret/stationary
ailock = 1
lethal = 1
@@ -149,6 +158,10 @@
eshot_sound = 'sound/weapons/Laser.ogg'
egun = 1
if(/obj/item/weapon/gun/energy/pulse/turret)
eprojectile = /obj/item/projectile/beam/pulse
eshot_sound = 'sound/weapons/pulse.ogg'
var/list/turret_icons
/obj/machinery/porta_turret/update_icon()
if(!turret_icons)
+1 -2
View File
@@ -141,8 +141,7 @@
var/locked = 0
/obj/machinery/shieldgen/Destroy()
for(var/obj/machinery/shield/shield_tile in deployed_shields)
qdel(shield_tile)
QDEL_LIST(deployed_shields)
deployed_shields = null
return ..()
+10 -5
View File
@@ -21,7 +21,7 @@
add_req_access = 0
internal_damage_threshold = 25
force = 45
max_equip = 4
max_equip = 5
/obj/mecha/combat/marauder/loaded/New()
@@ -30,6 +30,8 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/xray(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
@@ -47,8 +49,8 @@
health = 550
wreckage = /obj/effect/decal/mecha_wreckage/seraph
internal_damage_threshold = 20
force = 55
max_equip = 5
force = 80
max_equip = 8
/obj/mecha/combat/marauder/seraph/add_cell()
cell = new /obj/item/weapon/stock_parts/cell/bluespace(src)
@@ -62,9 +64,11 @@
for(ME in equipment)
equipment -= ME
qdel(ME)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/heavy(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/xray/triple(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/dual(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter/precise(src)
ME.attach(src)
@@ -73,6 +77,7 @@
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
/obj/mecha/combat/marauder/mauler
desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model."
name = "Mauler"
+58 -3
View File
@@ -68,12 +68,18 @@
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
equip_cooldown = 8
name = "CH-PS \"Immolator\" Laser"
name = "CH-PS \"Firedart\" Laser"
icon_state = "mecha_laser"
energy_drain = 30
projectile = /obj/item/projectile/beam
fire_sound = 'sound/weapons/Laser.ogg'
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/disabler
name = "CH-PD Disabler"
projectile = /obj/item/projectile/beam/disabler
projectiles_per_shot = 2
projectile_delay = 1
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
equip_cooldown = 10
name = "CH-LC \"Solaris\" Laser Cannon"
@@ -90,6 +96,41 @@
projectile = /obj/item/projectile/ion
fire_sound = 'sound/weapons/Laser.ogg'
/obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla
equip_cooldown = 35
name = "P-X Tesla Cannon"
desc = "A weapon for combat exosuits. Fires bolts of electricity similar to the experimental tesla engine"
icon_state = "mecha_laser"
origin_tech = "materials=4;combat=5;magnets=4"
energy_drain = 500
projectile = /obj/item/projectile/energy/shock_revolver
fire_sound = 'sound/magic/lightningbolt.ogg'
/obj/item/mecha_parts/mecha_equipment/weapon/energy/xray
equip_cooldown = 35
name = "S-1 X-Ray Projector"
desc = "A weapon for combat exosuits. Fires beams of X-Rays that pass through solid matter."
icon_state = "mecha_laser"
origin_tech = "materials=3;combat=5;magnets=2;syndicate=2"
energy_drain = 80
projectile = /obj/item/projectile/beam/xray
fire_sound = 'sound/weapons/laser3.ogg'
/obj/item/mecha_parts/mecha_equipment/weapon/energy/xray/triple
name = "X-XR Triple-barrel X-Ray Stream Projector"
projectiles_per_shot = 3
projectile_delay = 1
/obj/item/mecha_parts/mecha_equipment/weapon/energy/immolator
equip_cooldown = 35
name = "ZFI Immolation Beam Gun"
desc = "A weapon for combat exosuits. Fires beams of extreme heat that set targets on fire."
icon_state = "mecha_laser"
origin_tech = "materials=4;combat=4;magnets=3;plasmatech=2"
energy_drain = 80
projectile = /obj/item/projectile/beam/immolator
fire_sound = 'sound/weapons/laser3.ogg'
/obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
equip_cooldown = 30
name = "eZ-13 mk2 Heavy pulse rifle"
@@ -273,8 +314,12 @@
variance = 6
projectile_delay = 2
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/dual
name = "XMG-9 Autocannon"
projectiles_per_shot = 6
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
name = "SRM-8 Missile Rack"
name = "SRM-8 Light Missile Rack"
icon_state = "mecha_missilerack"
projectile = /obj/item/missile
fire_sound = 'sound/effects/bang.ogg'
@@ -283,6 +328,7 @@
equip_cooldown = 60
var/missile_speed = 2
var/missile_range = 30
var/heavy_missile = 0
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/action(target, params)
if(!action_checks(target))
@@ -290,6 +336,8 @@
set_ready_state(0)
var/obj/item/missile/M = new projectile(chassis.loc)
M.primed = 1
if(heavy_missile)
M.heavy_missile = 1
playsound(chassis, fire_sound, 50, 1)
M.throw_at(target, missile_range, missile_speed, chassis)
projectiles--
@@ -300,16 +348,23 @@
do_after_cooldown()
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/heavy
name = "SRX-13 Heavy Missile Launcher"
heavy_missile = 1
/obj/item/missile
icon = 'icons/obj/grenade.dmi'
icon_state = "missile"
var/primed = null
var/heavy_missile = 0
throwforce = 15
/obj/item/missile/throw_impact(atom/hit_atom)
if(primed)
explosion(hit_atom, 0, 0, 2, 4, 0)
if(heavy_missile)
explosion(hit_atom, 2, 3, 4, 6, 0)
else
explosion(hit_atom, 0, 0, 2, 4, 0)
qdel(src)
else
..()
+3 -7
View File
@@ -610,13 +610,9 @@
WR.crowbar_salvage += internal_tank
internal_tank.forceMove(WR)
else
for(var/obj/item/mecha_parts/mecha_equipment/E in equipment)
E.forceMove(loc)
qdel(E)
if(cell)
qdel(cell)
if(internal_tank)
qdel(internal_tank)
QDEL_LIST(equipment)
QDEL_NULL(cell)
QDEL_NULL(internal_tank)
processing_objects.Remove(src)
poi_list.Remove(src)
@@ -20,6 +20,7 @@ var/global/list/image/splatter_cache=list()
var/basecolor="#A10808" // Color when wet.
var/amount = 5
appearance_flags = NO_CLIENT_COLOR
var/dry_timer = 0
/obj/effect/decal/cleanable/blood/New()
..()
@@ -41,8 +42,7 @@ var/global/list/image/splatter_cache=list()
if(B.blood_DNA)
blood_DNA |= B.blood_DNA.Copy()
qdel(B)
spawn(DRYING_TIME * (amount+1))
dry()
dry_timer = addtimer(src, "dry", DRYING_TIME * (amount+1))
/obj/effect/decal/cleanable/blood/Destroy()
if(GAMEMODE_IS_CULT)
@@ -51,7 +51,9 @@ var/global/list/image/splatter_cache=list()
if(T && (is_station_level(T.z)))
mode_ticker.bloody_floors -= T
mode_ticker.blood_check()
.=..()
if(dry_timer)
deltimer(dry_timer)
return ..()
/obj/effect/decal/cleanable/blood/update_icon()
if(basecolor == "rainbow") basecolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]"
@@ -137,8 +139,7 @@ var/global/list/image/splatter_cache=list()
/obj/effect/decal/cleanable/blood/drip/New()
..()
spawn(1)
drips |= icon_state
drips |= icon_state
/obj/effect/decal/cleanable/blood/writing
icon_state = "tracks"
+44 -23
View File
@@ -2,7 +2,7 @@
#define NUM_OF_POSTER_DESIGNS 33 //subtype 0-contraband posters
#define NUM_OF_POSTER_DESIGNS_LEGIT 33 //subtype 1-corporate approved posters
#define NUM_OF_POSTER_DESIGNS_LEGIT 40 //subtype 1-corporate approved posters
/obj/item/weapon/contraband
name = "contraband item"
@@ -167,20 +167,20 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
name += " - Rebels Unite!"
desc += " A poster telling the viewer to rebel against Nanotrasen."
if(24)
name += " - C-20r Advertisment"
name += " - C-20r Advertisement"
desc += " A poster advertising the Scarborough Arms C-20r."
if(25)
name += " - Have A Puff"
desc += " Who cares about lung cancer when you're high as a kite?"
if(26)
name += " - Revolver Advertisment"
name += " - Revolver Advertisement"
desc += " Because seven shots are all you need."
if(27)
name += " - D-Day Promotional Poster"
desc += " A promotional poster for some rapper."
if(28)
name += " - Syndicate Pistol Advertisment"
desc += " A poster advertising syndicate pistols as being 'Classy as fuck'."
name += " - Syndicate Pistol Advertisement"
desc += " A poster advertising Syndicate pistols as being 'Classy as fuck'."
if(29)
name += " - E-sword Rainbow"
desc += " All the colors of bloody murder rainbow."
@@ -188,7 +188,7 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
name += " - Red Rum"
desc += " Looking at this poster makes you want to kill."
if(31)
name += " - CC 64K Advertisment"
name += " - CC 64K Advertisement"
desc += " The latest portable computer from Comrade Computing, with a whole 64kB of ram!"
if(32)
name += " - Punch Shit"
@@ -198,13 +198,13 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
desc += " The Griffin commands you to be the worst you can be. Will you?"
else
name += " - Error (subtype 0 serial_number)"
desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/tgstation/-tg-station/issues."
desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/ParadiseSS13/Paradise/issues."
if(subtype == 1)
icon_state = "poster[serial_number]_legit"
switch(serial_number)
if(1)
name += " - Here for Your Saftey"
name += " - Here for Your Safety"
desc += " A poster glorifying the station's security force."
if(2)
name += " - Nanotrasen Logo"
@@ -247,7 +247,7 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
desc += " This thing is all in Japanese."
if(15)
name += " - Get Your LEGS"
desc += " LEGS: Leadership, Experiance, Genius, S(Opportunity)."
desc += " LEGS: Leadership, Experience, Genius, S(Opportunity)."
if(16)
name += " - Do Not Question"
desc += " A poster instructing the viewer not to ask about things they aren't meant to know."
@@ -258,53 +258,74 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
name += " - Soft Cap Pop Art"
desc += " A poster reprint of some cheap pop art."
if(19)
name += " - Saftey: Internals"
name += " - Safety: Internals"
desc += " A poster instructing the viewer to wear internals in environments where there is no oxygen or the air has been rendered toxic."
if(20)
name += " - Saftey: Eye Protection"
name += " - Safety: Eye Protection"
desc += " A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights."
if(21)
name += " - Saftey: Report"
name += " - Safety: Report"
desc += " A poster instructing the viewer to report suspicious activity to the security force."
if(22)
name += " - Report Crimes"
desc += " Report crimes at: 1-800-FUCKING-TERRORISTS or at https://www.sectorthirteen.nt/malconetents."
desc += " Report crimes at: 1-800-FUCKING-TERRORISTS or at https://www.sectorthirteen.nt/malcontents."
if(23)
name += " - Ion Rifle"
desc += " A poster displaying an Ion Rifle."
if(24)
name += " - Foam Force Advertisment"
name += " - Foam Force Advertisement"
desc += " Foam Force, it's Foam or be Foamed!"
if(25)
name += " - Cohiba Robusto Advertisment"
name += " - Cohiba Robusto Advertisement"
desc += " Cohiba Robusto, the classy cigar."
if(26)
name += " - 50th Aniversery Vintage Reprint"
desc += " A reprint of a poster from 2504, commemorating the 50th Aniversery of Nanoposters Manufacturing, a subsidary of Nanotrasen."
name += " - 50th Anniversary Vintage Reprint"
desc += " A reprint of a poster from 2504, commemorating the 50th Anniversary of Nanoposters Manufacturing, a subsidiary of Nanotrasen."
if(27)
name += " - Fruit Bowl"
desc += " Simple, yet awe inspiring."
if(28)
name += " - NanoPDA 1000 Advertisment"
name += " - NanoPDA 1000 Advertisement"
desc += " A poster advertising the latest PDA from Nanotrasen."
if(29)
name += " - Enlist"
desc += " Enlist in the Nanotrasen ERT reserves today!"
if(30)
name += " - Nanomichi Advertisment"
name += " - Nanomichi Advertisement"
desc += " A poster advertising Nanomichi brand audio cassettes."
if(31)
name += " - 12 Gauge"
desc += " A poster boasting about the superiority of 12 gauge shotgun shells."
desc += " A poster boasting about the superiority of 12-gauge shotgun shells."
if(32)
name += " - High-Class Martini"
desc += " I told you to shake it, no stirring"
desc += " I told you to shake it, no stirring."
if(33)
name += " - The Owl"
desc += " The Owl would do his best to protect the station. Will you?"
if(34)
name += " - Spider Risk"
desc += " A poster detailing what to do when giant spiders are seen."
if(35)
name += " - Kill Syndicate"
desc += " A poster demanding that all crew should be ready to fight the Syndicate."
if(36)
name += " - Information on Air"
desc += " A poster providing visual aid to remind crew of air canisters."
if(37)
name += " - Information on Air"
desc += " A poster providing visual aid to remind crew of air canisters."
if(38)
name += " - Dig for Glory!"
desc += " A poster providing trying to convince crew to mine for ore."
if(39)
name += " - Religious Poster"
desc += " A generic religious poser telling you to believe."
if(40)
name += " - Stay Healthy!"
desc += " A healthy crew is a happy crew!"
else
name += " - Error (subtype 1 serial_number)"
desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/NTStation/NTstation13/issues."
desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/ParadiseSS13/Paradise/issues."
..()
obj/structure/sign/poster/attackby(obj/item/I, mob/user, params)
@@ -405,6 +426,6 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params)
//Putting non-contraband posters here because everything else here is related to posters anyway. -JS
/obj/item/weapon/contraband/poster/legit
desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. It's contents go through Nanotrasen's strict content guidlines."
desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. It's contents go through Nanotrasen's strict content guidelines."
icon_state = "rolled_poster_legit"
subtype = 1
+3 -2
View File
@@ -122,6 +122,7 @@
processing_objects.Add(src)
/obj/structure/spider/spiderling/Destroy()
processing_objects.Remove(src)
entry_vent = null
return ..()
@@ -234,7 +235,7 @@
icon_state = pick("cocoon1","cocoon2","cocoon3")
/obj/structure/spider/cocoon/Destroy()
src.visible_message("<span class='danger'>\The [src] splits open.</span>")
visible_message("<span class='danger'>[src] splits open.</span>")
for(var/atom/movable/A in contents)
A.loc = src.loc
A.forceMove(loc)
return ..()
+5 -5
View File
@@ -85,8 +85,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
if(ismob(loc))
var/mob/m = loc
m.unEquip(src, 1)
for(var/X in actions)
qdel(X)
QDEL_LIST(actions)
master = null
return ..()
/obj/item/proc/check_allowed_items(atom/target, not_inside, target_self)
@@ -186,9 +186,9 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
if(!user) return 0
if(hasorgans(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
var/obj/item/organ/external/temp = H.bodyparts_by_name["r_hand"]
if(user.hand)
temp = H.organs_by_name["l_hand"]
temp = H.bodyparts_by_name["l_hand"]
if(!temp)
to_chat(user, "<span class='warning'>You try to use your hand, but it's missing!</span>")
return 0
@@ -469,7 +469,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
if(istype(H))
var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes)
if(!eyes) // should still get stabbed in the head
var/obj/item/organ/external/head/head = H.organs_by_name["head"]
var/obj/item/organ/external/head/head = H.bodyparts_by_name["head"]
head.take_damage(rand(10,14), 1)
return
eyes.take_damage(rand(3,4), 1)
+4
View File
@@ -17,6 +17,10 @@
// No visible message
light(show_message = 0)
/obj/item/candle/Destroy()
processing_objects.Remove(src)
return ..()
/obj/item/candle/update_icon()
var/i
if(wax>150)
+9 -1
View File
@@ -7,16 +7,24 @@
w_class = WEIGHT_CLASS_TINY
origin_tech = "materials=1;biotech=1"
var/list/datum/autopsy_data_scanner/wdata = list()
var/list/datum/autopsy_data_scanner/chemtraces = list()
var/list/chemtraces = list()
var/target_name = null
var/timeofdeath = null
/obj/item/weapon/autopsy_scanner/Destroy()
QDEL_LIST_ASSOC_VAL(wdata)
return ..()
/datum/autopsy_data_scanner
var/weapon = null // this is the DEFINITE weapon type that was used
var/list/organs_scanned = list() // this maps a number of scanned organs to
// the wounds to those organs with this data's weapon type
var/organ_names = ""
/datum/autopsy_data_scanner/Destroy()
QDEL_LIST_ASSOC_VAL(organs_scanned)
return ..()
/datum/autopsy_data
var/weapon = null
var/pretend_weapon = null
+1 -2
View File
@@ -31,8 +31,7 @@
/obj/item/device/paicard/Destroy()
if(pai)
pai.ghostize()
qdel(pai)
pai = null
QDEL_NULL(pai)
QDEL_NULL(radio)
return ..()
@@ -66,8 +66,6 @@ var/global/list/default_medbay_channels = list(
/obj/item/device/radio/New()
..()
wires = new(src)
if(radio_controller)
initialize()
internal_channels = default_internal_channels.Copy()
global_radios |= src
@@ -269,6 +267,7 @@ var/global/list/default_medbay_channels = list(
/mob/living/automatedannouncer/Destroy()
if(lifetime_timer)
deltimer(lifetime_timer)
lifetime_timer = null
return ..()
/mob/living/automatedannouncer/proc/autocleanup()
+5 -5
View File
@@ -204,8 +204,8 @@ REAGENT SCANNER
user.show_message("<span class='warning'>Significant brain damage detected. Subject may have had a concussion.</span>")
if(ishuman(M))
var/mob/living/carbon/human/H = M
for(var/name in H.organs_by_name)
var/obj/item/organ/external/e = H.organs_by_name[name]
for(var/name in H.bodyparts_by_name)
var/obj/item/organ/external/e = H.bodyparts_by_name[name]
if(!e)
continue
var/limb = e.name
@@ -215,14 +215,14 @@ REAGENT SCANNER
if(e.has_infected_wound())
user.show_message("<span class='warning'>Infected wound detected in subject [limb]. Disinfection recommended.</span>")
for(var/name in H.organs_by_name)
var/obj/item/organ/external/e = H.organs_by_name[name]
for(var/name in H.bodyparts_by_name)
var/obj/item/organ/external/e = H.bodyparts_by_name[name]
if(!e)
continue
if(e.status & ORGAN_BROKEN)
user.show_message(text("<span class='warning'>Bone fractures detected. Advanced scanner required for location.</span>"), 1)
break
for(var/obj/item/organ/external/e in H.organs)
for(var/obj/item/organ/external/e in H.bodyparts)
for(var/datum/wound/W in e.wounds) if(W.internal)
user.show_message(text("<span class='warning'>Internal bleeding detected. Advanced scanner required for location.</span>"), 1)
break
@@ -155,8 +155,7 @@
return
else if(playing)
playing = 0
var/turf/T = get_turf(src)
T.visible_message("<font color=Maroon><B>Tape Recorder</B>: Playback stopped.</font>")
atom_say("Playback stopped.")
update_icon()
@@ -185,19 +184,18 @@
break
if(mytape.storedinfo.len < i)
break
var/turf/T = get_turf(src)
T.visible_message("<font color=Maroon><B>Tape Recorder</B>: [mytape.storedinfo[i]]</font>")
atom_say("[mytape.storedinfo[i]]")
if(mytape.storedinfo.len < i + 1)
playsleepseconds = 1
sleep(10)
T = get_turf(src)
T.visible_message("<font color=Maroon><B>Tape Recorder</B>: End of recording.</font>")
atom_say("End of recording.")
else
playsleepseconds = mytape.timestamp[i + 1] - mytape.timestamp[i]
if(playsleepseconds > 14)
sleep(10)
T = get_turf(src)
T.visible_message("<font color=Maroon><B>Tape Recorder</B>: Skipping [playsleepseconds] seconds of silence</font>")
atom_say("Skipping [playsleepseconds] seconds of silence.")
playsleepseconds = 1
i++
@@ -314,4 +312,4 @@
//Random colour tapes
/obj/item/device/tape/random/New()
icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
+108 -84
View File
@@ -10,8 +10,7 @@
var/model_info
dir = SOUTH
/obj/item/robot_parts/New(var/newloc, var/model)
/obj/item/robot_parts/New(newloc, model)
..(newloc)
if(model_info && model)
model_info = model
@@ -57,9 +56,13 @@
desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell."
icon_state = "chest"
part = list("groin","chest")
var/wires = 0.0
var/wired = FALSE
var/obj/item/weapon/stock_parts/cell/cell = null
/obj/item/robot_parts/chest/Destroy()
QDEL_NULL(cell)
return ..()
/obj/item/robot_parts/head
name = "head"
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
@@ -68,6 +71,11 @@
var/obj/item/device/flash/flash1 = null
var/obj/item/device/flash/flash2 = null
/obj/item/robot_parts/head/Destroy()
QDEL_NULL(flash1)
QDEL_NULL(flash2)
return ..()
/obj/item/robot_parts/robot_suit
name = "endoskeleton"
desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors."
@@ -88,89 +96,108 @@
/obj/item/robot_parts/robot_suit/New()
..()
src.updateicon()
updateicon()
/obj/item/robot_parts/robot_suit/Destroy()
QDEL_NULL(l_arm)
QDEL_NULL(r_arm)
QDEL_NULL(l_leg)
QDEL_NULL(r_leg)
QDEL_NULL(chest)
QDEL_NULL(head)
forced_ai = null
return ..()
/obj/item/robot_parts/robot_suit/proc/updateicon()
src.overlays.Cut()
if(src.l_arm)
src.overlays += "l_arm+o"
if(src.r_arm)
src.overlays += "r_arm+o"
if(src.chest)
src.overlays += "chest+o"
if(src.l_leg)
src.overlays += "l_leg+o"
if(src.r_leg)
src.overlays += "r_leg+o"
if(src.head)
src.overlays += "head+o"
overlays.Cut()
if(l_arm)
overlays += "l_arm+o"
if(r_arm)
overlays += "r_arm+o"
if(chest)
overlays += "chest+o"
if(l_leg)
overlays += "l_leg+o"
if(r_leg)
overlays += "r_leg+o"
if(head)
overlays += "head+o"
/obj/item/robot_parts/robot_suit/proc/check_completion()
if(src.l_arm && src.r_arm)
if(src.l_leg && src.r_leg)
if(src.chest && src.head)
if(l_arm && r_arm)
if(l_leg && r_leg)
if(chest && head)
feedback_inc("cyborg_frames_built",1)
return 1
return 0
/obj/item/robot_parts/robot_suit/attackby(obj/item/W as obj, mob/user as mob, params)
/obj/item/robot_parts/robot_suit/attackby(obj/item/W, mob/user, params)
..()
if(istype(W, /obj/item/stack/sheet/metal) && !l_arm && !r_arm && !l_leg && !r_leg && !chest && !head)
var/obj/item/stack/sheet/metal/M = W
var/obj/item/weapon/ed209_assembly/B = new /obj/item/weapon/ed209_assembly
B.loc = get_turf(src)
B.forceMove(get_turf(src))
to_chat(user, "You armed the robot frame")
W:use(1)
M.use(1)
if(user.get_inactive_hand()==src)
user.unEquip(src)
user.put_in_inactive_hand(B)
qdel(src)
if(istype(W, /obj/item/robot_parts/l_leg))
if(src.l_leg) return
if(l_leg)
return
user.drop_item()
W.loc = src
src.l_leg = W
src.updateicon()
W.forceMove(src)
l_leg = W
updateicon()
if(istype(W, /obj/item/robot_parts/r_leg))
if(src.r_leg) return
if(r_leg)
return
user.drop_item()
W.loc = src
src.r_leg = W
src.updateicon()
W.forceMove(src)
r_leg = W
updateicon()
if(istype(W, /obj/item/robot_parts/l_arm))
if(src.l_arm) return
if(l_arm)
return
user.drop_item()
W.loc = src
src.l_arm = W
src.updateicon()
W.forceMove(src)
l_arm = W
updateicon()
if(istype(W, /obj/item/robot_parts/r_arm))
if(src.r_arm) return
if(r_arm)
return
user.drop_item()
W.loc = src
src.r_arm = W
src.updateicon()
W.forceMove(src)
r_arm = W
updateicon()
if(istype(W, /obj/item/robot_parts/chest))
if(src.chest) return
if(W:wires && W:cell)
var/obj/item/robot_parts/chest/CH = W
if(chest)
return
if(CH.wired && CH.cell)
user.drop_item()
W.loc = src
src.chest = W
src.updateicon()
else if(!W:wires)
W.forceMove(src)
chest = W
updateicon()
else if(!CH.wired)
to_chat(user, "<span class='notice'>You need to attach wires to it first!</span>")
else
to_chat(user, "<span class='notice'>You need to attach a cell to it first!</span>")
if(istype(W, /obj/item/robot_parts/head))
if(src.head) return
if(W:flash2 && W:flash1)
var/obj/item/robot_parts/head/HD = W
if(head)
return
if(HD.flash2 && HD.flash1)
user.drop_item()
W.loc = src
src.head = W
src.updateicon()
W.forceMove(src)
head = W
updateicon()
else
to_chat(user, "<span class='notice'>You need to attach a flash to it first!</span>")
@@ -183,11 +210,11 @@
if(istype(W, /obj/item/device/mmi))
var/obj/item/device/mmi/M = W
if(check_completion())
if(!istype(loc,/turf))
to_chat(user, "<span class='warning'>You can't put \the [W] in, the frame has to be standing on the ground to be perfectly precise.</span>")
if(!isturf(loc))
to_chat(user, "<span class='warning'>You can't put [M] in, the frame has to be standing on the ground to be perfectly precise.</span>")
return
if(!M.brainmob)
to_chat(user, "<span class='warning'>Sticking an empty [W] into the frame would sort of defeat the purpose.</span>")
to_chat(user, "<span class='warning'>Sticking an empty [M] into the frame would sort of defeat the purpose.</span>")
return
if(!M.brainmob.key)
@@ -202,15 +229,15 @@
ghost_can_reenter = 1
break
if(!ghost_can_reenter)
to_chat(user, "<span class='notice'>\The [W] is completely unresponsive; there's no point.</span>")
to_chat(user, "<span class='notice'>[M] is completely unresponsive; there's no point.</span>")
return
if(M.brainmob.stat == DEAD)
to_chat(user, "<span class='warning'>Sticking a dead [W] into the frame would sort of defeat the purpose.</span>")
to_chat(user, "<span class='warning'>Sticking a dead [M] into the frame would sort of defeat the purpose.</span>")
return
if(M.brainmob.mind in ticker.mode.head_revolutionaries)
to_chat(user, "<span class='warning'>The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [W].</span>")
to_chat(user, "<span class='warning'>The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [M].</span>")
return
if(jobban_isbanned(M.brainmob, "Cyborg") || jobban_isbanned(M.brainmob,"nonhumandept"))
@@ -218,7 +245,8 @@
return
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), unfinished = 1)
if(!O) return
if(!O)
return
user.drop_item()
@@ -257,9 +285,9 @@
O.job = "Cyborg"
O.cell = chest.cell
chest.cell.loc = O
chest.cell.forceMove(O)
chest.cell = null
W.loc = O//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame.
M.forceMove(O) //Should fix cybros run time erroring when blown up. It got deleted before, along with the frame.
// Since we "magically" installed a cell, we also have to update the correct component.
if(O.cell)
var/datum/robot_component/cell_component = O.components["power cell"]
@@ -271,7 +299,8 @@
feedback_inc("cyborg_birth",1)
callHook("borgify", list(O))
src.loc = O
forceMove(O)
O.robot_suit = src
if(!locomotion)
O.lockcharge = 1
@@ -308,8 +337,8 @@
return
if(href_list["Name"])
var/new_name = reject_bad_name(input(usr, "Enter new designation. Set to blank to reset to default.", "Cyborg Debug", src.created_name),1)
if(!in_range(src, usr) && src.loc != usr)
var/new_name = reject_bad_name(input(usr, "Enter new designation. Set to blank to reset to default.", "Cyborg Debug", created_name),1)
if(!in_range(src, usr) && loc != usr)
return
if(new_name)
created_name = new_name
@@ -337,22 +366,22 @@
/obj/item/robot_parts/chest/attackby(obj/item/W as obj, mob/user as mob, params)
..()
if(istype(W, /obj/item/weapon/stock_parts/cell))
if(src.cell)
if(cell)
to_chat(user, "<span class='notice'>You have already inserted a cell!</span>")
return
else
user.drop_item()
W.loc = src
src.cell = W
W.forceMove(src)
cell = W
to_chat(user, "<span class='notice'>You insert the cell!</span>")
if(istype(W, /obj/item/stack/cable_coil))
if(src.wires)
if(wired)
to_chat(user, "<span class='notice'>You have already inserted wire!</span>")
return
else
var/obj/item/stack/cable_coil/coil = W
coil.use(1)
src.wires = 1.0
wired = TRUE
to_chat(user, "<span class='notice'>You insert the wire!</span>")
return
@@ -362,18 +391,18 @@
if(istype(user,/mob/living/silicon/robot))
to_chat(user, "<span class='warning'>How do you propose to do that?</span>")
return
else if(src.flash1 && src.flash2)
else if(flash1 && flash2)
to_chat(user, "<span class='notice'>You have already inserted the eyes!</span>")
return
else if(src.flash1)
else if(flash1)
user.drop_item()
W.loc = src
src.flash2 = W
W.forceMove(src)
flash2 = W
to_chat(user, "<span class='notice'>You insert the flash into the eye socket!</span>")
else
user.drop_item()
W.loc = src
src.flash1 = W
W.forceMove(src)
flash1 = W
to_chat(user, "<span class='notice'>You insert the flash into the eye socket!</span>")
else if(istype(W, /obj/item/weapon/stock_parts/manipulator))
to_chat(user, "<span class='notice'>You install some manipulators and modify the head, creating a functional spider-bot!</span>")
@@ -381,15 +410,10 @@
user.drop_item()
qdel(W)
qdel(src)
return
return
/obj/item/robot_parts/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/weapon/card/emag))
if(sabotaged)
to_chat(user, "<span class='warning'>[src] is already sabotaged!</span>")
else
to_chat(user, "<span class='warning'>You slide [W] into the dataport on [src] and short out the safeties.</span>")
sabotaged = 1
return
..()
/obj/item/robot_parts/emag_act(user)
if(sabotaged)
to_chat(user, "<span class='warning'>[src] is already sabotaged!</span>")
else
to_chat(user, "<span class='warning'>You slide the emag into the dataport on [src] and short out the safeties.</span>")
sabotaged = 1
@@ -154,6 +154,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
new /datum/stack_recipe("wooden chair", /obj/structure/stool/bed/chair/wood/normal, 3, time = 10, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("bookcase", /obj/structure/bookcase, 5, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("dresser", /obj/structure/dresser, 30, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 15, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("dog bed", /obj/structure/stool/bed/dogbed, 10, time = 10, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40),
@@ -18,6 +18,10 @@
var/sound_file = 'sound/misc/briefcase_bees.ogg'
var/next_sound = 0
/obj/item/weapon/bee_briefcase/Destroy()
blood_list.Cut()
return ..()
/obj/item/weapon/bee_briefcase/examine(mob/user)
..()
if(loc == user)
@@ -70,6 +74,6 @@
//Release up to 5 bees per use. Without using strange reagent, that means two uses. WITH strange reagent, you can get more if you don't release the last bee
for(var/bee = min(5, bees_left), bee > 0, bee--)
var/mob/living/simple_animal/hostile/poison/bees/syndi/B = new /mob/living/simple_animal/hostile/poison/bees/syndi(null)
B.master_and_friends = blood_list //Doesn't automatically add the person who opens the case, so the bees will attack the user unless they gave their blood
B.master_and_friends = blood_list.Copy() //Doesn't automatically add the person who opens the case, so the bees will attack the user unless they gave their blood
B.forceMove(get_turf(user)) //RELEASE THE BEES!
bees_left -= 5
@@ -606,6 +606,12 @@
name = "Prisoner #13-007"
registered_name = "Prisoner #13-007"
/obj/item/weapon/card/id/prisoner/random
/obj/item/weapon/card/id/prisoner/random/New()
var/random_number = "#[rand(0, 99)]-[rand(0, 999)]"
name = "Prisoner [random_number]"
registered_name = name
/obj/item/weapon/card/id/salvage_captain
name = "Captain's ID"
registered_name = "Captain"
+2 -2
View File
@@ -393,7 +393,7 @@
M.visible_message("<span class='warning'>[M]'s body convulses a bit.")
playsound(get_turf(src), "bodyfall", 50, 1)
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
for(var/obj/item/organ/external/O in H.organs)
for(var/obj/item/organ/external/O in H.bodyparts)
total_brute += O.brute_dam
total_burn += O.burn_dam
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations) && (H.get_int_organ(/obj/item/organ/internal/heart) || H.get_int_organ(/obj/item/organ/internal/brain/slime)))
@@ -515,7 +515,7 @@
M.visible_message("<span class='warning'>[M]'s body convulses a bit.")
playsound(get_turf(src), "bodyfall", 50, 1)
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
for(var/obj/item/organ/external/O in H.organs)
for(var/obj/item/organ/external/O in H.bodyparts)
total_brute += O.brute_dam
total_burn += O.burn_dam
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations))
@@ -28,9 +28,7 @@
/obj/item/weapon/grenade/chem_grenade/Destroy()
QDEL_NULL(nadeassembly)
for(var/thing in beakers)
qdel(thing)
beakers.Cut()
QDEL_LIST(beakers)
return ..()
/obj/item/weapon/grenade/chem_grenade/examine(mob/user)
@@ -1,12 +1,11 @@
/obj/item/weapon/grenade/empgrenade
name = "classic emp grenade"
name = "classic EMP grenade"
desc = "It is designed to wreak havoc on electronic systems."
icon_state = "emp"
item_state = "emp"
origin_tech = "materials=2;magnets=3"
prime()
..()
if(empulse(src, 4, 10))
qdel(src)
return
/obj/item/weapon/grenade/empgrenade/prime()
update_mob()
empulse(src, 4, 10)
qdel(src)
+1 -3
View File
@@ -14,9 +14,7 @@
var/max_signs = 20
/obj/item/weapon/holosign_creator/Destroy()
for(var/sign in signs)
qdel(sign)
signs.Cut()
QDEL_LIST(signs)
return ..()
/obj/item/weapon/holosign_creator/afterattack(atom/target, mob/user, flag)
@@ -283,13 +283,17 @@
/obj/item/weapon/nullrod/whip
name = "holy whip"
desc = "What a terrible night to be on Space Station 13."
desc = "What a terrible night to be in spess"
icon_state = "chain"
item_state = "chain"
slot_flags = SLOT_BELT
attack_verb = list("whipped", "lashed")
hitsound = 'sound/weapons/slash.ogg'
/obj/item/weapon/nullrod/whip/New()
..()
desc = "What a terrible night to be on the [station_name()]."
/obj/item/weapon/nullrod/whip/afterattack(atom/movable/AM, mob/user, proximity)
if(!proximity)
return
@@ -48,7 +48,7 @@
for(var/X in actions)
var/datum/action/A = X
A.Grant(source)
if(istype(source, /mob/living/carbon/human))
if(ishuman(source))
var/mob/living/carbon/human/H = source
H.sec_hud_set_implants()
@@ -66,7 +66,7 @@
var/datum/action/A = X
A.Grant(source)
if(istype(source, /mob/living/carbon/human))
if(ishuman(source))
var/mob/living/carbon/human/H = source
H.sec_hud_set_implants()
@@ -18,9 +18,7 @@
/obj/item/weapon/pneumatic_cannon/Destroy()
QDEL_NULL(tank)
for(var/obj/item/I in loadedItems)
qdel(I)
loadedItems.Cut()
QDEL_LIST(loadedItems)
return ..()
/obj/item/weapon/pneumatic_cannon/examine(mob/user)
+1 -1
View File
@@ -71,7 +71,7 @@
/obj/item/weapon/shard/Crossed(AM as mob|obj)
if(isliving(AM))
var/mob/living/M = AM
if(M.incorporeal_move || M.flying)//you are incorporal or flying..no shard stepping!
if(M.incorporeal_move || M.flying || M.throwing)//you are incorporal or flying or being thrown ..no shard stepping!
return
to_chat(M, "<span class='danger'>You step on \the [src]!</span>")
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
@@ -32,7 +32,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/heal_amt = 10
for(var/obj/item/organ/external/affecting in H.organs)
for(var/obj/item/organ/external/affecting in H.bodyparts)
if(affecting.heal_damage(heal_amt, heal_amt))
H.UpdateDamageIcon()
return
@@ -69,8 +69,7 @@
/obj/item/weapon/watertank/Destroy()
if(on)
remove_noz()
qdel(noz)
noz = null
QDEL_NULL(noz)
return ..()
/obj/item/weapon/watertank/attack_hand(mob/user as mob)
+4 -3
View File
@@ -289,7 +289,7 @@
playsound(loc, 'sound/items/jaws_cut.ogg', 50, 1, -1)
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/head/head = H.organs_by_name["head"]
var/obj/item/organ/external/head/head = H.bodyparts_by_name["head"]
if(head)
head.droplimb(0, DROPLIMB_BLUNT, FALSE, TRUE)
playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
@@ -400,7 +400,7 @@
/obj/item/weapon/weldingtool/attack(mob/M, mob/user)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting]
var/obj/item/organ/external/S = H.bodyparts_by_name[user.zone_sel.selecting]
if(!S)
return
@@ -511,7 +511,8 @@
to_chat(user, "<span class='warning'>You need more fuel!</span>")
switched_off(user)
else
to_chat(user, "<span class='notice'>You switch [src] off.</span>")
if(user)
to_chat(user, "<span class='notice'>You switch [src] off.</span>")
playsound(loc, deac_sound, 50, 1)
switched_off(user)

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