mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-25 04:57:12 +01:00
Fixes map merge conflict
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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!");}\
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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"])
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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."
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -44,8 +44,7 @@
|
||||
/mob/camera/blob/Destroy()
|
||||
if(ghostimage)
|
||||
ghost_darkness_images -= ghostimage
|
||||
qdel(ghostimage)
|
||||
ghostimage = null;
|
||||
QDEL_NULL(ghostimage)
|
||||
updateallghostimages()
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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 = ""
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
@@ -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
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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")]"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user