Merge Conflicts and a passive-aggressive response to tiger

This commit is contained in:
FlattestGuitar
2017-05-07 19:24:25 +02:00
60 changed files with 606 additions and 405 deletions
+1 -1
View File
@@ -2,4 +2,4 @@
#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) qel(L[I]); L.Cut(); }
#define QDEL_LIST_ASSOC_VAL(L) if(L) { for(var/I in L) qdel(L[I]); L.Cut(); }
+13 -6
View File
@@ -33,13 +33,20 @@
if(control_disabled || stat)
return
var/turf/pixel_turf = get_turf_pixel(A)
if(pixel_turf && !cameranet.checkTurfVis(pixel_turf))
log_admin("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(A)])")
message_admins("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(A)]))")
send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(A)]))")
return
var/turf_visible
if(pixel_turf)
turf_visible = cameranet.checkTurfVis(pixel_turf)
if(!turf_visible)
if(istype(loc, /obj/item/device/aicard) && (pixel_turf in view(client.view, loc)))
turf_visible = TRUE
else
if(pixel_turf.obscured)
log_admin("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)])")
message_admins("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))")
send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))")
return
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["ctrl"])
-3
View File
@@ -27,7 +27,6 @@
/datum/ai_laws/nanotrasen
name = "NT Default"
selectable = 1
default = 1
/datum/ai_laws/nanotrasen/New()
src.add_inherent_law("Safeguard: Protect your assigned space station to the best of your abilities. It is not something we can easily afford to replace.")
@@ -61,7 +60,6 @@
/datum/ai_laws/robocop
name = "Robocop"
selectable = 1
default = 1
/datum/ai_laws/robocop/New()
add_inherent_law("Serve the public trust.")
@@ -74,7 +72,6 @@
name = "P.A.L.A.D.I.N."
law_header = "Divine Ordainments"
selectable = 1
default = 1
/datum/ai_laws/paladin/New()
add_inherent_law("Never willingly commit an evil act.")
+1 -4
View File
@@ -659,16 +659,13 @@
if("remove")
for(var/obj/item/weapon/implant/mindshield/I in H.contents)
if(I && I.implanted)
I.removed(H)
qdel(I)
to_chat(H, "<span class='notice'><Font size =3><B>Your mindshield implant has been deactivated.</B></FONT></span>")
log_admin("[key_name(usr)] has deactivated [key_name(current)]'s mindshield implant")
message_admins("[key_name_admin(usr)] has deactivated [key_name_admin(current)]'s mindshield implant")
if("add")
var/obj/item/weapon/implant/mindshield/L = new/obj/item/weapon/implant/mindshield(H)
L.imp_in = H
L.implanted = 1
H.sec_hud_set_implants()
L.implant(H)
log_admin("[key_name(usr)] has given [key_name(current)] a mindshield implant")
message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a mindshield implant")
+3 -9
View File
@@ -219,9 +219,7 @@
apply_to_card(I, H, get_centcom_access("Nanotrasen Navy Officer"), "Nanotrasen Navy Officer")
var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H)
L.imp_in = H
L.implanted = 1
H.sec_hud_set_implants()
L.implant(H)
/datum/outfit/admin/nt_special_ops_officer
@@ -330,9 +328,7 @@
apply_to_card(I, H, get_centcom_access("Nanotrasen Navy Captain"), "Nanotrasen Navy Captain")
var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H)
L.imp_in = H
L.implanted = 1
H.sec_hud_set_implants()
L.implant(H)
/datum/outfit/admin/nt_diplomat
name = "NT Diplomat"
@@ -756,9 +752,7 @@
apply_to_card(I, H, get_centcom_access("Emergency Response Team Member"), "Emergency Response Team Member")
var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H)
L.imp_in = H
L.implanted = 1
H.sec_hud_set_implants()
L.implant(H)
/datum/outfit/admin/chrono
name = "Chrono Legionnaire"
+2 -2
View File
@@ -26,7 +26,7 @@
// If you're wondering what goofery this is, this is for things that need the environment
// around them set up - like `air_update_turf` and the like
if((ticker && ticker.current_state == GAME_STATE_PLAYING))
if((ticker && ticker.current_state >= GAME_STATE_SETTING_UP))
attempt_init()
/atom/movable/Destroy()
@@ -231,7 +231,7 @@
if(isobj(A))
if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement
src.throw_impact(A,speed)
/atom/movable/proc/throw_at_fast(atom/target, range, speed, thrower, no_spin)
set waitfor = 0
throw_at(target, range, speed, thrower, no_spin)
@@ -37,27 +37,27 @@
// isn't, but I don't want to remove it, just in case.
for(var/organ_name in H.bodyparts_by_name)
var/obj/item/organ/external/O = H.bodyparts_by_name[organ_name]
if(!O) continue
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>")
+1 -1
View File
@@ -21,7 +21,7 @@
if("convert")
explanation = "We must increase our influence before we can summon [ticker.mode.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions."
if("bloodspill")
spilltarget = 100 + rand(0,player_list.len * 3)
spilltarget = 70 + rand(0,player_list.len * 3)
explanation = "We must prepare this place for [ticker.mode.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles."
if("sacrifice")
explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for his blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual."
+4 -2
View File
@@ -336,7 +336,7 @@ var/list/teleport_runes = list()
var/turf/T = get_turf(src)
for(var/mob/living/M in T.contents)
if(!iscultist(M) && !ismindshielded(M))
if(!iscultist(M) && !ismindshielded(M) && ishuman(M))
convertees.Add(M)
if(!convertees.len)
fail_invoke()
@@ -415,6 +415,7 @@ var/list/teleport_runes = list()
/obj/effect/rune/sacrifice/proc/sac(var/list/invokers, mob/living/T)
var/sacrifice_fulfilled
var/datum/game_mode/cult/cult_mode = ticker.mode
if(T)
if(istype(T, /mob/living/simple_animal/pet/corgi))
for(var/M in invokers)
@@ -428,11 +429,12 @@ var/list/teleport_runes = list()
sacrifice_fulfilled = 1
new /obj/effect/overlay/temp/cult/sac(loc)
if(ticker && ticker.mode && ticker.mode.name == "cult")
var/datum/game_mode/cult/cult_mode = ticker.mode
cult_mode.harvested++
for(var/M in invokers)
if(sacrifice_fulfilled)
to_chat(M, "<span class='cultlarge'>\"Yes! This is the one I desire! You have done well.\"</span>")
cult_mode.additional_phase()
else
if(ishuman(T) || isrobot(T))
to_chat(M, "<span class='cultlarge'>\"I accept this sacrifice.\"</span>")
+1 -2
View File
@@ -126,8 +126,7 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
//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()
+2 -4
View File
@@ -198,9 +198,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)
@@ -228,7 +226,7 @@
var/datum/job/J = job_master.GetJobType(jobtype)
if(!J)
J = job_master.GetJob(H.job)
var/alt_title
if(H.mind)
alt_title = H.mind.role_alt_title
+8
View File
@@ -191,6 +191,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
@@ -234,6 +236,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.
@@ -270,3 +275,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
+7 -1
View File
@@ -213,6 +213,10 @@
radio_controller.remove_object(src, frequency)
air_alarm_repository.update_cache(src)
QDEL_NULL(wires)
if(alarm_area && alarm_area.master_air_alarm == src)
alarm_area.master_air_alarm = null
elect_master(exclude_self = 1)
alarm_area = null
return ..()
/obj/machinery/alarm/proc/first_run()
@@ -236,8 +240,10 @@
return alarm_area.master_air_alarm && !(alarm_area.master_air_alarm.stat & (NOPOWER|BROKEN))
/obj/machinery/alarm/proc/elect_master()
/obj/machinery/alarm/proc/elect_master(exclude_self = 0) //Why is this an alarm and not area proc?
for(var/obj/machinery/alarm/AA in alarm_area)
if(exclude_self && AA == src)
continue
if(!(AA.stat & (NOPOWER|BROKEN)))
alarm_area.master_air_alarm = AA
return 1
+95 -66
View File
@@ -10,88 +10,117 @@
power_channel = EQUIP
var/obj/item/weapon/stock_parts/cell/charging = null
var/chargelevel = -1
proc
updateicon()
icon_state = "ccharger[charging ? 1 : 0]"
if(charging && !(stat & (BROKEN|NOPOWER)) )
/obj/machinery/cell_charger/Destroy()
QDEL_NULL(charging)
return ..()
var/newlevel = round(charging.percent() * 4 / 100)
// to_chat(world, "nl: [newlevel]")
/obj/machinery/cell_charger/proc/updateicon()
icon_state = "ccharger[charging ? 1 : 0]"
if(chargelevel != newlevel)
if(charging && !(stat & (BROKEN|NOPOWER)))
var/newlevel = round(charging.percent() * 4 / 100)
overlays.Cut()
overlays += "ccharger-o[newlevel]"
if(chargelevel != newlevel)
chargelevel = newlevel
chargelevel = newlevel
else
overlays.Cut()
examine(mob/user)
if(..(user, 5))
to_chat(user, "There's [charging ? "a" : "no"] cell in the charger.")
if(charging)
to_chat(user, "Current charge: [charging.charge]")
overlays.Cut()
overlays += "ccharger-o[newlevel]"
attackby(obj/item/weapon/W, mob/user, params)
else
overlays.Cut()
/obj/machinery/cell_charger/examine(mob/user)
..()
to_chat(user, "There's [charging ? "a" : "no"] cell in the charger.")
if(charging)
to_chat(user, "Current charge: [round(charging.percent(), 1)]%")
/obj/machinery/cell_charger/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/stock_parts/cell))
if(stat & BROKEN)
to_chat(user, "<span class='warning'>[src] is broken!</span>")
return
if(!anchored)
to_chat(user, "<span class='warning'>[src] isn't attached to the ground!</span>")
return
if(istype(W, /obj/item/weapon/stock_parts/cell) && anchored)
if(charging)
to_chat(user, "<span class='warning'>There is already a cell in the charger.</span>")
return
else
var/area/a = loc.loc // Gets our locations location, like a dream within a dream
if(!isarea(a))
return
if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power!
to_chat(user, "<span class='warning'>The [name] blinks red as you try to insert the cell!</span>")
return
user.drop_item()
W.loc = src
charging = W
user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger.")
chargelevel = -1
updateicon()
else if(istype(W, /obj/item/weapon/wrench))
if(charging)
to_chat(user, "<span class='warning'>Remove the cell first!</span>")
return
anchored = !anchored
to_chat(user, "You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground")
playsound(get_turf(src), W.usesound, 75, 1)
attack_hand(mob/user)
if(charging)
usr.put_in_hands(charging)
charging.add_fingerprint(user)
charging.updateicon()
to_chat(user, "<span class='warning'>There is already a cell in the charger!</span>")
return
else
var/area/a = loc.loc // Gets our locations location, like a dream within a dream
if(!isarea(a))
return
if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power!
to_chat(user, "<span class='warning'>[src] blinks red as you try to insert the cell!</span>")
return
if(!user.drop_item())
return
src.charging = null
user.visible_message("[user] removes the cell from the charger.", "You remove the cell from the charger.")
W.forceMove(src)
charging = W
user.visible_message("[user] inserts a cell into the charger.", "<span class='notice'>You insert a cell into the charger.</span>")
chargelevel = -1
updateicon()
else if(iswrench(W))
if(charging)
to_chat(user, "<span class='warning'>Remove the cell first!</span>")
return
attack_ai(mob/user)
anchored = !anchored
to_chat(user, "<span class='notice'>You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground</span>")
playsound(src.loc, W.usesound, 75, 1)
else
return ..()
/obj/machinery/cell_charger/proc/removecell()
charging.updateicon()
charging = null
chargelevel = -1
updateicon()
/obj/machinery/cell_charger/attack_hand(mob/user)
if(!charging)
return
emp_act(severity)
if(stat & (BROKEN|NOPOWER))
return
if(charging)
charging.emp_act(severity)
..(severity)
user.put_in_hands(charging)
charging.add_fingerprint(user)
user.visible_message("[user] removes [charging] from [src].", "<span class='notice'>You remove [charging] from [src].</span>")
removecell()
/obj/machinery/cell_charger/attack_tk(mob/user)
if(!charging)
return
charging.forceMove(loc)
to_chat(user, "<span class='notice'>You telekinetically remove [charging] from [src].</span>")
removecell()
/obj/machinery/cell_charger/attack_ai(mob/user)
return
/obj/machinery/cell_charger/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
return
if(charging)
charging.emp_act(severity)
..(severity)
process()
// to_chat(world, "ccpt [charging] [stat]")
if(!charging || (stat & (BROKEN|NOPOWER)) || !anchored)
return
/obj/machinery/cell_charger/process()
if(!charging || !anchored || (stat & (BROKEN|NOPOWER)))
return
use_power(200) //this used to use CELLRATE, but CELLRATE is fucking awful. feel free to fix this properly!
charging.give(175) //inefficiency.
if(charging.percent() >= 100)
return
updateicon()
use_power(200) //this used to use CELLRATE, but CELLRATE is fucking awful. feel free to fix this properly!
charging.give(175) //inefficiency.
updateicon()
+3 -6
View File
@@ -413,13 +413,10 @@
R.languages=subject.languages
//Add an implant if needed
var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)
if(isnull(imp))
if(!imp)
imp = new /obj/item/weapon/implant/health(subject)
imp.implanted = subject
R.implant = "\ref[imp]"
//Update it if needed
else
R.implant = "\ref[imp]"
imp.implant(subject)
R.implant = "\ref[imp]"
if(!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning.
R.mind = "\ref[subject.mind]"
-15
View File
@@ -19,13 +19,6 @@ FIRE ALARM
var/last_process = 0
var/wiresexposed = 0
var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
var/area/master_area
/obj/machinery/firealarm/New()
var/area/A = get_area_master(src)
if(!istype(A, /area))
return
master_area = A
/obj/machinery/firealarm/update_icon()
@@ -294,14 +287,6 @@ Just a object used in constructing fire alarms
idle_power_usage = 2
active_power_usage = 6
var/area/master_area
/obj/machinery/partyalarm/New()
var/area/A = get_area_master(src)
if(!( istype(A, /area) ))
return
master_area=A
/obj/machinery/partyalarm/attack_hand(mob/user)
if((user.stat && !isobserver(user)) || stat & (NOPOWER|BROKEN))
return
+4
View File
@@ -17,6 +17,10 @@
// No visible message
light(show_message = 0)
/obj/item/candle/Destroy()
processing_objects.Remove(src)
return ..()
/obj/item/candle/update_icon()
var/i
if(wax>150)
+9 -1
View File
@@ -7,16 +7,24 @@
w_class = WEIGHT_CLASS_TINY
origin_tech = "materials=1;biotech=1"
var/list/datum/autopsy_data_scanner/wdata = list()
var/list/datum/autopsy_data_scanner/chemtraces = list()
var/list/chemtraces = list()
var/target_name = null
var/timeofdeath = null
/obj/item/weapon/autopsy_scanner/Destroy()
QDEL_LIST_ASSOC_VAL(wdata)
return ..()
/datum/autopsy_data_scanner
var/weapon = null // this is the DEFINITE weapon type that was used
var/list/organs_scanned = list() // this maps a number of scanned organs to
// the wounds to those organs with this data's weapon type
var/organ_names = ""
/datum/autopsy_data_scanner/Destroy()
QDEL_LIST_ASSOC_VAL(organs_scanned)
return ..()
/datum/autopsy_data
var/weapon = null
var/pretend_weapon = null
@@ -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
+108 -84
View File
@@ -10,8 +10,7 @@
var/model_info
dir = SOUTH
/obj/item/robot_parts/New(var/newloc, var/model)
/obj/item/robot_parts/New(newloc, model)
..(newloc)
if(model_info && model)
model_info = model
@@ -57,9 +56,13 @@
desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell."
icon_state = "chest"
part = list("groin","chest")
var/wires = 0.0
var/wired = FALSE
var/obj/item/weapon/stock_parts/cell/cell = null
/obj/item/robot_parts/chest/Destroy()
QDEL_NULL(cell)
return ..()
/obj/item/robot_parts/head
name = "head"
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
@@ -68,6 +71,11 @@
var/obj/item/device/flash/flash1 = null
var/obj/item/device/flash/flash2 = null
/obj/item/robot_parts/head/Destroy()
QDEL_NULL(flash1)
QDEL_NULL(flash2)
return ..()
/obj/item/robot_parts/robot_suit
name = "endoskeleton"
desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors."
@@ -88,89 +96,108 @@
/obj/item/robot_parts/robot_suit/New()
..()
src.updateicon()
updateicon()
/obj/item/robot_parts/robot_suit/Destroy()
QDEL_NULL(l_arm)
QDEL_NULL(r_arm)
QDEL_NULL(l_leg)
QDEL_NULL(r_leg)
QDEL_NULL(chest)
QDEL_NULL(head)
forced_ai = null
return ..()
/obj/item/robot_parts/robot_suit/proc/updateicon()
src.overlays.Cut()
if(src.l_arm)
src.overlays += "l_arm+o"
if(src.r_arm)
src.overlays += "r_arm+o"
if(src.chest)
src.overlays += "chest+o"
if(src.l_leg)
src.overlays += "l_leg+o"
if(src.r_leg)
src.overlays += "r_leg+o"
if(src.head)
src.overlays += "head+o"
overlays.Cut()
if(l_arm)
overlays += "l_arm+o"
if(r_arm)
overlays += "r_arm+o"
if(chest)
overlays += "chest+o"
if(l_leg)
overlays += "l_leg+o"
if(r_leg)
overlays += "r_leg+o"
if(head)
overlays += "head+o"
/obj/item/robot_parts/robot_suit/proc/check_completion()
if(src.l_arm && src.r_arm)
if(src.l_leg && src.r_leg)
if(src.chest && src.head)
if(l_arm && r_arm)
if(l_leg && r_leg)
if(chest && head)
feedback_inc("cyborg_frames_built",1)
return 1
return 0
/obj/item/robot_parts/robot_suit/attackby(obj/item/W as obj, mob/user as mob, params)
/obj/item/robot_parts/robot_suit/attackby(obj/item/W, mob/user, params)
..()
if(istype(W, /obj/item/stack/sheet/metal) && !l_arm && !r_arm && !l_leg && !r_leg && !chest && !head)
var/obj/item/stack/sheet/metal/M = W
var/obj/item/weapon/ed209_assembly/B = new /obj/item/weapon/ed209_assembly
B.loc = get_turf(src)
B.forceMove(get_turf(src))
to_chat(user, "You armed the robot frame")
W:use(1)
M.use(1)
if(user.get_inactive_hand()==src)
user.unEquip(src)
user.put_in_inactive_hand(B)
qdel(src)
if(istype(W, /obj/item/robot_parts/l_leg))
if(src.l_leg) return
if(l_leg)
return
user.drop_item()
W.loc = src
src.l_leg = W
src.updateicon()
W.forceMove(src)
l_leg = W
updateicon()
if(istype(W, /obj/item/robot_parts/r_leg))
if(src.r_leg) return
if(r_leg)
return
user.drop_item()
W.loc = src
src.r_leg = W
src.updateicon()
W.forceMove(src)
r_leg = W
updateicon()
if(istype(W, /obj/item/robot_parts/l_arm))
if(src.l_arm) return
if(l_arm)
return
user.drop_item()
W.loc = src
src.l_arm = W
src.updateicon()
W.forceMove(src)
l_arm = W
updateicon()
if(istype(W, /obj/item/robot_parts/r_arm))
if(src.r_arm) return
if(r_arm)
return
user.drop_item()
W.loc = src
src.r_arm = W
src.updateicon()
W.forceMove(src)
r_arm = W
updateicon()
if(istype(W, /obj/item/robot_parts/chest))
if(src.chest) return
if(W:wires && W:cell)
var/obj/item/robot_parts/chest/CH = W
if(chest)
return
if(CH.wired && CH.cell)
user.drop_item()
W.loc = src
src.chest = W
src.updateicon()
else if(!W:wires)
W.forceMove(src)
chest = W
updateicon()
else if(!CH.wired)
to_chat(user, "<span class='notice'>You need to attach wires to it first!</span>")
else
to_chat(user, "<span class='notice'>You need to attach a cell to it first!</span>")
if(istype(W, /obj/item/robot_parts/head))
if(src.head) return
if(W:flash2 && W:flash1)
var/obj/item/robot_parts/head/HD = W
if(head)
return
if(HD.flash2 && HD.flash1)
user.drop_item()
W.loc = src
src.head = W
src.updateicon()
W.forceMove(src)
head = W
updateicon()
else
to_chat(user, "<span class='notice'>You need to attach a flash to it first!</span>")
@@ -183,11 +210,11 @@
if(istype(W, /obj/item/device/mmi))
var/obj/item/device/mmi/M = W
if(check_completion())
if(!istype(loc,/turf))
to_chat(user, "<span class='warning'>You can't put \the [W] in, the frame has to be standing on the ground to be perfectly precise.</span>")
if(!isturf(loc))
to_chat(user, "<span class='warning'>You can't put [M] in, the frame has to be standing on the ground to be perfectly precise.</span>")
return
if(!M.brainmob)
to_chat(user, "<span class='warning'>Sticking an empty [W] into the frame would sort of defeat the purpose.</span>")
to_chat(user, "<span class='warning'>Sticking an empty [M] into the frame would sort of defeat the purpose.</span>")
return
if(!M.brainmob.key)
@@ -202,15 +229,15 @@
ghost_can_reenter = 1
break
if(!ghost_can_reenter)
to_chat(user, "<span class='notice'>\The [W] is completely unresponsive; there's no point.</span>")
to_chat(user, "<span class='notice'>[M] is completely unresponsive; there's no point.</span>")
return
if(M.brainmob.stat == DEAD)
to_chat(user, "<span class='warning'>Sticking a dead [W] into the frame would sort of defeat the purpose.</span>")
to_chat(user, "<span class='warning'>Sticking a dead [M] into the frame would sort of defeat the purpose.</span>")
return
if(M.brainmob.mind in ticker.mode.head_revolutionaries)
to_chat(user, "<span class='warning'>The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [W].</span>")
to_chat(user, "<span class='warning'>The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [M].</span>")
return
if(jobban_isbanned(M.brainmob, "Cyborg") || jobban_isbanned(M.brainmob,"nonhumandept"))
@@ -218,7 +245,8 @@
return
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), unfinished = 1)
if(!O) return
if(!O)
return
user.drop_item()
@@ -257,9 +285,9 @@
O.job = "Cyborg"
O.cell = chest.cell
chest.cell.loc = O
chest.cell.forceMove(O)
chest.cell = null
W.loc = O//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame.
M.forceMove(O) //Should fix cybros run time erroring when blown up. It got deleted before, along with the frame.
// Since we "magically" installed a cell, we also have to update the correct component.
if(O.cell)
var/datum/robot_component/cell_component = O.components["power cell"]
@@ -271,7 +299,8 @@
feedback_inc("cyborg_birth",1)
callHook("borgify", list(O))
src.loc = O
forceMove(O)
O.robot_suit = src
if(!locomotion)
O.lockcharge = 1
@@ -308,8 +337,8 @@
return
if(href_list["Name"])
var/new_name = reject_bad_name(input(usr, "Enter new designation. Set to blank to reset to default.", "Cyborg Debug", src.created_name),1)
if(!in_range(src, usr) && src.loc != usr)
var/new_name = reject_bad_name(input(usr, "Enter new designation. Set to blank to reset to default.", "Cyborg Debug", created_name),1)
if(!in_range(src, usr) && loc != usr)
return
if(new_name)
created_name = new_name
@@ -337,22 +366,22 @@
/obj/item/robot_parts/chest/attackby(obj/item/W as obj, mob/user as mob, params)
..()
if(istype(W, /obj/item/weapon/stock_parts/cell))
if(src.cell)
if(cell)
to_chat(user, "<span class='notice'>You have already inserted a cell!</span>")
return
else
user.drop_item()
W.loc = src
src.cell = W
W.forceMove(src)
cell = W
to_chat(user, "<span class='notice'>You insert the cell!</span>")
if(istype(W, /obj/item/stack/cable_coil))
if(src.wires)
if(wired)
to_chat(user, "<span class='notice'>You have already inserted wire!</span>")
return
else
var/obj/item/stack/cable_coil/coil = W
coil.use(1)
src.wires = 1.0
wired = TRUE
to_chat(user, "<span class='notice'>You insert the wire!</span>")
return
@@ -362,18 +391,18 @@
if(istype(user,/mob/living/silicon/robot))
to_chat(user, "<span class='warning'>How do you propose to do that?</span>")
return
else if(src.flash1 && src.flash2)
else if(flash1 && flash2)
to_chat(user, "<span class='notice'>You have already inserted the eyes!</span>")
return
else if(src.flash1)
else if(flash1)
user.drop_item()
W.loc = src
src.flash2 = W
W.forceMove(src)
flash2 = W
to_chat(user, "<span class='notice'>You insert the flash into the eye socket!</span>")
else
user.drop_item()
W.loc = src
src.flash1 = W
W.forceMove(src)
flash1 = W
to_chat(user, "<span class='notice'>You insert the flash into the eye socket!</span>")
else if(istype(W, /obj/item/weapon/stock_parts/manipulator))
to_chat(user, "<span class='notice'>You install some manipulators and modify the head, creating a functional spider-bot!</span>")
@@ -381,15 +410,10 @@
user.drop_item()
qdel(W)
qdel(src)
return
return
/obj/item/robot_parts/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/weapon/card/emag))
if(sabotaged)
to_chat(user, "<span class='warning'>[src] is already sabotaged!</span>")
else
to_chat(user, "<span class='warning'>You slide [W] into the dataport on [src] and short out the safeties.</span>")
sabotaged = 1
return
..()
/obj/item/robot_parts/emag_act(user)
if(sabotaged)
to_chat(user, "<span class='warning'>[src] is already sabotaged!</span>")
else
to_chat(user, "<span class='warning'>You slide the emag into the dataport on [src] and short out the safeties.</span>")
sabotaged = 1
@@ -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
@@ -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()
+1 -1
View File
@@ -71,7 +71,7 @@
/obj/item/weapon/shard/Crossed(AM as mob|obj)
if(isliving(AM))
var/mob/living/M = AM
if(M.incorporeal_move || M.flying)//you are incorporal or flying..no shard stepping!
if(M.incorporeal_move || M.flying || M.throwing)//you are incorporal or flying or being thrown ..no shard stepping!
return
to_chat(M, "<span class='danger'>You step on \the [src]!</span>")
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
@@ -256,6 +256,9 @@ var/global/list/captain_display_cases = list()
new /obj/machinery/constructable_frame/machine_frame(T)
qdel(src)
return
if(W.flags & ABSTRACT)
to_chat(user, "<span class='danger'>You can't put this into the case.</span>")
return
if(user.a_intent == I_HARM)
if(locked && !destroyed)
src.health -= W.force
+1 -2
View File
@@ -485,8 +485,7 @@ client/proc/one_click_antag()
//Now apply cortical stack.
var/obj/item/weapon/implant/cortical/I = new(new_vox)
I.imp_in = new_vox
I.implanted = 1
I.implant(new_vox)
cortical_stacks += I
new_vox.equip_vox_raider()
+1 -3
View File
@@ -158,9 +158,7 @@ var/global/sent_strike_team = 0
var/obj/item/weapon/implant/mindshield/L = new/obj/item/weapon/implant/mindshield(src)
L.imp_in = src
L.implanted = 1
sec_hud_set_implants()
L.implant(src)
var/obj/item/weapon/card/id/W = new(src)
W.name = "[real_name]'s ID Card"
@@ -0,0 +1,40 @@
/datum/gear/racial
sort_category = "Racial"
subtype_path = /datum/gear/racial
cost = 2
/datum/gear/racial/tajciv
display_name = "embroidered veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
path = /obj/item/clothing/glasses/tajblind
/datum/gear/racial/tajsec
display_name = "sleek veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. This one has an in-built security HUD."
path = /obj/item/clothing/glasses/hud/security/tajblind
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent", "Magistrate")
/datum/gear/racial/tajmed
display_name = "lightweight veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. This one has an in-built medical HUD."
path = /obj/item/clothing/glasses/hud/health/tajblind
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Brig Physician")
/datum/gear/racial/tajsci
display_name = "hi-tech veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
path = /obj/item/clothing/glasses/tajblind/sci
allowed_roles = list("Scientist", "Research Director", "Robotocist")
/datum/gear/racial/tajeng
display_name = "industrial veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
path = /obj/item/clothing/glasses/tajblind/eng
allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist")
/datum/gear/racial/tajcargo
display_name = "khaki veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. It is light and comfy!"
path = /obj/item/clothing/glasses/tajblind/cargo
allowed_roles = list("Quartermaster","Cargo Technician", "Miner")
+43 -1
View File
@@ -495,4 +495,46 @@
else
to_chat(user, "<span class='notice'>The eye winks at you and vanishes into the abyss, you feel really unlucky.</span>")
qdel(src)
..()
..()
/obj/item/clothing/glasses/tajblind
name = "embroidered veil"
desc = "An Ahdominian made veil that allows the user to see while obscuring their eyes."
icon_state = "tajblind"
item_state = "tajblind"
flags_cover = GLASSESCOVERSEYES
actions_types = list(/datum/action/item_action/toggle)
up = 0
tint = 0
/obj/item/clothing/glasses/tajblind/eng
name = "industrial veil"
icon_state = "tajblind_engi"
item_state = "tajblind_engi"
/obj/item/clothing/glasses/tajblind/sci
name = "hi-tech veil"
icon_state = "tajblind_sci"
item_state = "tajblind_sci"
/obj/item/clothing/glasses/tajblind/cargo
name = "khaki veil"
icon_state = "tajblind_cargo"
item_state = "tajblind_cargo"
/obj/item/clothing/glasses/tajblind/attack_self()
toggle_veil()
/obj/item/clothing/glasses/proc/toggle_veil()
if(usr.canmove && !usr.incapacitated())
if(up)
up = !up
tint = initial(tint)
to_chat(usr, "You activate [src], allowing you to see.")
else
up = !up
tint = 3
to_chat(usr, "You deactivate [src], obscuring your vision.")
var/mob/living/carbon/user = usr
user.update_tint()
user.update_inv_glasses()
+26 -1
View File
@@ -9,6 +9,7 @@
/obj/item/clothing/glasses/hud/equipped(mob/living/carbon/human/user, slot)
..()
if(HUDType && slot == slot_glasses)
var/datum/atom_hud/H = huds[HUDType]
H.add_hud_to(user)
@@ -133,4 +134,28 @@
item_state = "glasses"
darkness_view = 8
invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these
prescription_upgradable = 0
prescription_upgradable = 0
/obj/item/clothing/glasses/hud/security/tajblind
name = "sleek veil"
desc = "An Ahdominian made veil that allows the user to see while obscuring their eyes. This one has an in-built security HUD."
icon_state = "tajblind_sec"
item_state = "tajblind_sec"
flags_cover = GLASSESCOVERSEYES
actions_types = list(/datum/action/item_action/toggle)
up = 0
/obj/item/clothing/glasses/hud/security/tajblind/attack_self()
toggle_veil()
/obj/item/clothing/glasses/hud/health/tajblind
name = "lightweight veil"
desc = "An Ahdominian made veil that allows the user to see while obscuring their eyes. This one has an installed medical HUD."
icon_state = "tajblind_med"
item_state = "tajblind_med"
flags_cover = GLASSESCOVERSEYES
actions_types = list(/datum/action/item_action/toggle)
up = 0
/obj/item/clothing/glasses/hud/health/tajblind/attack_self()
toggle_veil()
@@ -294,6 +294,16 @@
icon_state = "plasmaman_HoS_helmet0"
base_state = "plasmaman_HoS_helmet"
//NT REP
/obj/item/clothing/suit/space/eva/plasmaman/nt_rep
name = "plasmaman NT representative suit"
icon_state = "plasmaman_rep"
/obj/item/clothing/head/helmet/space/eva/plasmaman/nt_rep
name = "plasmaman NT representative helmet"
icon_state = "plasmaman_rep_helmet0"
base_state = "plasmaman_rep_helmet"
//SECURITY
/obj/item/clothing/suit/space/eva/plasmaman/security
+5 -7
View File
@@ -390,11 +390,10 @@
picked_color = input(H, "Which color would you like to paint [target]?", "Recolor") as null|anything in helmets
var/obj/item/clothing/head/helmet/space/eva/plasmaman/P = target
if(picked_color)
P.icon_state = helmets[picked_color] + "[P.on]"
P.base_state = helmets[picked_color]
else
if(!picked_color)
return
P.icon_state = helmets[picked_color] + "[P.on]"
P.base_state = helmets[picked_color]
to_chat(H, "<span class='notice'>You modify the appearance of [target].</span>")
P.icon = 'icons/obj/custom_items.dmi'
@@ -410,10 +409,9 @@
picked_color = input(H, "Which color would you like to paint [target]?", "Recolor") as null|anything in suits
var/obj/item/clothing/suit/space/eva/plasmaman/P = target
if(picked_color)
P.icon_state = suits[picked_color]
else
if(!picked_color)
return
P.icon_state = suits[picked_color]
to_chat(H, "<span class='notice'>You modify the appearance of [target].</span>")
P.icon = 'icons/obj/custom_items.dmi'
@@ -61,7 +61,7 @@
head.disfigure("burn")
add_logs(user, G.affecting, "deep-fried", addition="'s face")
qdel(G) //Removes the grip so the person MIGHT have a small chance to run the fuck away and to prevent rapid dunks.
return 1
return 0
return 0
@@ -57,5 +57,5 @@
C.adjustFireLoss(30)
add_logs(user, G.affecting, "burned", src)
qdel(G) //Removes the grip to prevent rapid sears and give you a chance to run
return 1
return 0
return 0
@@ -63,5 +63,5 @@
C.Weaken(2)
add_logs(user, G.affecting, "smashed", addition="'s head on [src]")
qdel(G) //Removes the grip to prevent rapid bashes. With the weaken, you PROBABLY can't run unless they are slow to grab you again...
return 1
return 0
return 0
@@ -51,11 +51,13 @@
/obj/structure/beebox/Destroy()
processing_objects.Remove(src)
for(var/mob/living/simple_animal/hostile/poison/bees/B in bees)
B.beehome = null
bees.Cut()
bees = null
honeycombs.Cut()
honeycombs = null
queen_bee = null
QDEL_LIST(honeycombs)
QDEL_LIST(honey_frames)
QDEL_NULL(queen_bee)
return ..()
+1
View File
@@ -75,6 +75,7 @@
plant_hud_set_water()
/obj/machinery/hydroponics/Destroy()
remove_from_all_data_huds()
QDEL_NULL(myseed)
return ..()
+7 -3
View File
@@ -44,7 +44,7 @@
icon_state = "sextractor"
density = 1
anchored = 1
var/piles = list()
var/list/piles = list()
var/max_seeds = 1000
var/seed_multiplier = 1
@@ -56,6 +56,10 @@
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
RefreshParts()
/obj/machinery/seed_extractor/Destroy()
QDEL_LIST(piles)
return ..()
/obj/machinery/seed_extractor/RefreshParts()
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
max_seeds = 1000 * B.rating
@@ -125,14 +129,14 @@
/obj/machinery/seed_extractor/attack_hand(mob/user)
interact(user)
/obj/machinery/seed_extractor/attack_ghost(mob/user)
interact(user)
/obj/machinery/seed_extractor/interact(mob/user)
if(stat)
return 0
add_fingerprint(user)
user.set_machine(src)
+1 -3
View File
@@ -69,9 +69,7 @@
genes += new /datum/plant_gene/reagent(reag_id, reagents_add[reag_id])
/obj/item/seeds/Destroy()
for(var/thing in genes)
qdel(thing)
genes.Cut()
QDEL_LIST(genes)
return ..()
/obj/item/seeds/proc/Copy()
@@ -84,9 +84,12 @@
if("Captain", "Blueshield")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/captain
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/captain
if("Head of Personnel", "Nanotrasen Representative")
if("Head of Personnel")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hop
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hop
if("Nanotrasen Representative")
suit = /obj/item/clothing/suit/space/eva/plasmaman/nt_rep
helm = /obj/item/clothing/head/helmet/space/eva/plasmaman/nt_rep
if("Medical Doctor","Brig Physician")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical
@@ -97,7 +97,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/head/griffin/(H), slot_head)
var/obj/item/weapon/implant/freedom/L = new/obj/item/weapon/implant/freedom(H)
L.implant(H, H)
L.implant(H)
/datum/superheroes/lightnian
+49 -11
View File
@@ -41,6 +41,7 @@ var/list/robot_verbs_default = list(
// Components are basically robot organs.
var/list/components = list()
var/obj/item/robot_parts/robot_suit/robot_suit = null //Used for deconstruction to remember what the borg was constructed out of..
var/obj/item/device/mmi/mmi = null
var/obj/item/device/pda/silicon/robot/rbPDA = null
@@ -255,6 +256,7 @@ var/list/robot_verbs_default = list(
QDEL_NULL(module)
QDEL_NULL(camera)
QDEL_NULL(cell)
QDEL_NULL(robot_suit)
return ..()
/mob/living/silicon/robot/proc/pick_module()
@@ -644,20 +646,13 @@ var/list/robot_verbs_default = list(
else if(wiresexposed && wires.IsAllCut())
//Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob.
if(!mmi)
to_chat(user, "\The [src] has no brain to remove.")
to_chat(user, "[src] has no brain to remove.")
return
to_chat(user, "You jam the crowbar into the robot and begin levering [mmi].")
to_chat(user, "You jam the crowbar into the robot and begin levering the securing bolts.")
if(do_after(user, 30 * W.toolspeed, target = src))
to_chat(user, "You damage some parts of the chassis, but eventually manage to rip out [mmi]!")
var/obj/item/robot_parts/robot_suit/C = new/obj/item/robot_parts/robot_suit(loc)
C.l_leg = new/obj/item/robot_parts/l_leg(C)
C.r_leg = new/obj/item/robot_parts/r_leg(C)
C.l_arm = new/obj/item/robot_parts/l_arm(C)
C.r_arm = new/obj/item/robot_parts/r_arm(C)
C.updateicon()
new/obj/item/robot_parts/chest(loc)
qdel(src)
user.visible_message("[user] deconstructs [src]!", "<span class='notice'>You unfasten the securing bolts, and [src] falls to pieces!</span>")
deconstruct()
else
// Okay we're not removing the cell or an MMI, but maybe something else?
var/list/removable_components = list()
@@ -1135,6 +1130,49 @@ var/list/robot_verbs_default = list(
update_icons()
/mob/living/silicon/robot/proc/deconstruct()
var/turf/T = get_turf(src)
if(robot_suit)
robot_suit.forceMove(T)
robot_suit.l_leg.forceMove(T)
robot_suit.l_leg = null
robot_suit.r_leg.forceMove(T)
robot_suit.r_leg = null
new /obj/item/stack/cable_coil(T, robot_suit.chest.wired)
robot_suit.chest.forceMove(T)
robot_suit.chest.wired = FALSE
robot_suit.chest = null
robot_suit.l_arm.forceMove(T)
robot_suit.l_arm = null
robot_suit.r_arm.forceMove(T)
robot_suit.r_arm = null
robot_suit.head.forceMove(T)
robot_suit.head.flash1.forceMove(T)
robot_suit.head.flash1.burn_out()
robot_suit.head.flash1 = null
robot_suit.head.flash2.forceMove(T)
robot_suit.head.flash2.burn_out()
robot_suit.head.flash2 = null
robot_suit.head = null
robot_suit.updateicon()
else
new /obj/item/robot_parts/robot_suit(T)
new /obj/item/robot_parts/l_leg(T)
new /obj/item/robot_parts/r_leg(T)
new /obj/item/stack/cable_coil(T, 1)
new /obj/item/robot_parts/chest(T)
new /obj/item/robot_parts/l_arm(T)
new /obj/item/robot_parts/r_arm(T)
new /obj/item/robot_parts/head(T)
var/b
for(b=0, b!=2, b++)
var/obj/item/device/flash/F = new /obj/item/device/flash(T)
F.burn_out()
if(cell) //Sanity check.
cell.forceMove(T)
cell = null
qdel(src)
#define BORG_CAMERA_BUFFER 30
/mob/living/silicon/robot/Move(a, b, flag)
var/oldLoc = src.loc
@@ -58,15 +58,12 @@
/mob/living/simple_animal/hostile/poison/bees/Destroy()
beegent = null
if(beehome)
if(beehome.bees)
beehome.bees.Remove(src)
beehome = null
return ..()
/mob/living/simple_animal/hostile/poison/bees/death(gibbed)
beegent = null
..()
/mob/living/simple_animal/hostile/poison/bees/examine(mob/user)
..()
/mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals()
overlays.Cut()
@@ -137,21 +134,6 @@
/mob/living/simple_animal/hostile/poison/bees/worker
//Blank type define in case we need to give them special stuff later, plus organization (currently they are same as base type bee)
/mob/living/simple_animal/hostile/poison/bees/worker/Destroy()
if(beehome)
if(beehome.bees)
beehome.bees.Remove(src)
beehome = null
return ..()
/mob/living/simple_animal/hostile/poison/bees/worker/death(gibbed)
if(beehome)
if(beehome.bees)
beehome.bees.Remove(src)
beehome = null
..()
/mob/living/simple_animal/hostile/poison/bees/worker/examine(mob/user)
..()
@@ -313,6 +295,10 @@
beegent = new /datum/reagent/facid() //prepare to die
var/list/master_and_friends = list()
/mob/living/simple_animal/hostile/poison/bees/syndi/Destroy()
master_and_friends.Cut()
return ..()
/mob/living/simple_animal/hostile/poison/bees/syndi/assign_reagent(datum/reagent/R)
return
@@ -30,7 +30,7 @@
var/attack_same = 0 //Set us to 1 to allow us to attack our own faction, or 2, to only ever attack our own faction
var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever)
//typecache of things this mob will attack in DestroySurroundings() if it has environment_smash
var/list/environment_target_typecache = list(
/obj/machinery/door/window,
@@ -44,15 +44,16 @@
var/atom/targets_from = null //all range/attack/etc. calculations should be done from this atom, defaults to the mob itself, useful for Vehicles and such
var/list/emote_taunt = list()
var/taunt_chance = 0
/mob/living/simple_animal/hostile/New()
..()
if(!targets_from)
targets_from = src
environment_target_typecache = typecacheof(environment_target_typecache)
/mob/living/simple_animal/hostile/Destroy()
targets_from = null
target = null
return ..()
/mob/living/simple_animal/hostile/Life()
@@ -80,7 +81,7 @@
if(AIShouldSleep(possible_targets)) // we try to acquire a new one
AIStatus = AI_IDLE // otherwise we go idle
return 1
/mob/living/simple_animal/hostile/attacked_by(obj/item/I, mob/living/user)
if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client && user)
FindTarget(list(user), 1)
@@ -91,8 +92,8 @@
if(P.firer && get_dist(src, P.firer) <= aggro_vision_range)
FindTarget(list(P.firer), 1)
Goto(P.starting, move_to_delay, 3)
return ..()
return ..()
//////////////HOSTILE MOB TARGETTING AND AGGRESSION////////////
@@ -126,7 +127,7 @@
var/Target = PickTarget(.)
GiveTarget(Target)
return Target //We now have a target
/mob/living/simple_animal/hostile/proc/PossibleThreats()
. = list()
for(var/pos_targ in ListTargets())
@@ -176,24 +177,24 @@
if(faction_check && !attack_same)
return 0
return 1
if(ishuman(the_target))
var/mob/living/carbon/human/H = the_target
if(is_type_in_list(src, H.species.ignored_by))
return 0
if(istype(the_target, /obj/mecha))
var/obj/mecha/M = the_target
if(M.occupant)//Just so we don't attack empty mechs
if(CanAttack(M.occupant))
return 1
if(istype(the_target, /obj/spacepod))
var/obj/spacepod/S = the_target
if(S.pilot) //Just so we don't attack empty pods
if(CanAttack(S.pilot))
return 1
if(istype(the_target, /obj/machinery/porta_turret))
var/obj/machinery/porta_turret/P = the_target
if(P.faction in faction)
@@ -292,7 +293,7 @@
/mob/living/simple_animal/hostile/death(gibbed)
LoseTarget()
..(gibbed)
/mob/living/simple_animal/hostile/proc/summon_backup(distance)
do_alert_animation(src)
playsound(loc, 'sound/machines/chime.ogg', 50, 1, -1)
+13 -13
View File
@@ -34,9 +34,9 @@
post_status("alert", "outline")
for(var/obj/machinery/firealarm/FA in world)
for(var/obj/machinery/firealarm/FA in machines)
if(is_station_contact(FA.z))
FA.overlays = list()
FA.overlays.Cut()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_green")
if(SEC_LEVEL_BLUE)
@@ -48,9 +48,9 @@
post_status("alert", "outline")
for(var/obj/machinery/firealarm/FA in world)
for(var/obj/machinery/firealarm/FA in machines)
if(is_station_contact(FA.z))
FA.overlays = list()
FA.overlays.Cut()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_blue")
if(SEC_LEVEL_RED)
@@ -60,16 +60,16 @@
security_announcement_down.Announce("The station's self-destruct mechanism has been deactivated, but there is still an immediate and serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised.","Attention! Code Red!")
security_level = SEC_LEVEL_RED
var/obj/machinery/door/airlock/highsecurity/red/R = locate(/obj/machinery/door/airlock/highsecurity/red) in world
var/obj/machinery/door/airlock/highsecurity/red/R = locate(/obj/machinery/door/airlock/highsecurity/red) in airlocks
if(R && is_station_level(R.z))
R.locked = 0
R.update_icon()
post_status("alert", "redalert")
for(var/obj/machinery/firealarm/FA in world)
for(var/obj/machinery/firealarm/FA in machines)
if(is_station_contact(FA.z))
FA.overlays = list()
FA.overlays.Cut()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_red")
if(SEC_LEVEL_GAMMA)
@@ -91,9 +91,9 @@
post_status("alert", "gammaalert")
for(var/obj/machinery/firealarm/FA in world)
for(var/obj/machinery/firealarm/FA in machines)
if(is_station_contact(FA.z))
FA.overlays = list()
FA.overlays.Cut()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_gamma")
FA.update_icon()
@@ -103,9 +103,9 @@
post_status("alert", "epsilonalert")
for(var/obj/machinery/firealarm/FA in world)
for(var/obj/machinery/firealarm/FA in machines)
if(is_station_contact(FA.z))
FA.overlays = list()
FA.overlays.Cut()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_epsilon")
if(SEC_LEVEL_DELTA)
@@ -114,9 +114,9 @@
post_status("alert", "deltaalert")
for(var/obj/machinery/firealarm/FA in world)
for(var/obj/machinery/firealarm/FA in machines)
if(is_station_contact(FA.z))
FA.overlays = list()
FA.overlays.Cut()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_delta")
else
-1
View File
@@ -291,7 +291,6 @@
user.visible_message("[user] places [I] into [case]!", "<span class='notice'>You place [I] into [case].</span>")
else
qdel(I)
//target.sec_hud_set_implants()
return 1
else
user.visible_message("<span class='notice'> [user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.</span>", \
+8
View File
@@ -32,6 +32,14 @@ var/list/organ_cache = list()
var/sterile = 0 //can the organ be infected by germs?
var/tough = 0 //can organ be easily damaged?
/obj/item/organ/Destroy()
processing_objects.Remove(src)
if(owner)
remove(owner, 1)
QDEL_LIST_ASSOC_VAL(autopsy_data)
QDEL_NULL(dna)
return ..()
/obj/item/organ/proc/update_health()
return
@@ -71,11 +71,11 @@
/obj/item/organ/external/necrotize(update_sprite=TRUE)
if(status & (ORGAN_ROBOT|ORGAN_DEAD))
return
to_chat(owner, "<span class='notice'>You can't feel your [name] anymore...</span>")
status |= ORGAN_DEAD
if(dead_icon)
icon_state = dead_icon
if(owner)
to_chat(owner, "<span class='notice'>You can't feel your [name] anymore...</span>")
owner.update_body(update_sprite)
owner.bad_external_organs |= src
if(vital)
@@ -85,6 +85,8 @@
if(parent && parent.children)
parent.children -= src
parent = null
if(internal_organs)
for(var/obj/item/organ/internal/O in internal_organs)
internal_organs -= O
@@ -102,6 +104,12 @@
deltimer(wound_cleanup_timer)
wound_cleanup_timer = null
QDEL_LIST(wounds)
QDEL_LIST(implants)
QDEL_NULL(hidden)
return ..()
/obj/item/organ/external/attackby(obj/item/weapon/W as obj, mob/user as mob)
+5 -28
View File
@@ -15,11 +15,6 @@
if(istype(holder))
insert(holder)
/obj/item/organ/internal/Destroy()
if(owner)
remove(owner, 1)
return ..()
/obj/item/organ/internal/proc/insert(mob/living/carbon/M, special = 0, var/dont_remove_slot = 0)
if(!iscarbon(M) || owner == M)
return
@@ -120,12 +115,6 @@
reagents.add_reagent("nutriment", 5)
/obj/item/organ/internal/Destroy()
if(owner)
remove(owner, 1)
return ..()
/obj/item/organ/internal/attack(mob/living/carbon/M, mob/user)
if(M == user && ishuman(user))
var/mob/living/carbon/human/H = user
@@ -296,21 +285,18 @@
// . = ..()
/obj/item/organ/internal/lungs/process()
/obj/item/organ/internal/lungs/on_life()
..()
if(!owner)
return
if(germ_level > INFECTION_LEVEL_ONE)
if(prob(5))
owner.emote("cough") //respitory tract infection
if(is_bruised())
if(prob(2))
spawn owner.custom_emote(1, "coughs up blood!")
owner.custom_emote(1, "coughs up blood!")
owner.drip(10)
if(prob(4))
spawn owner.custom_emote(1, "gasps for air!")
owner.custom_emote(1, "gasps for air!")
owner.AdjustLoseBreath(5)
/obj/item/organ/internal/kidneys
@@ -321,13 +307,8 @@
parent_organ = "groin"
slot = "kidneys"
/obj/item/organ/internal/kidneys/process()
/obj/item/organ/internal/kidneys/on_life()
..()
if(!owner)
return
// Coffee is really bad for you with busted kidneys.
// This should probably be expanded in some way, but fucked if I know
// what else kidneys can process in our reagent list.
@@ -439,12 +420,8 @@
slot = "liver"
var/alcohol_intensity = 1
/obj/item/organ/internal/liver/process()
/obj/item/organ/internal/liver/on_life()
..()
if(!owner)
return
if(germ_level > INFECTION_LEVEL_ONE)
if(prob(1))
to_chat(owner, "<span class='warning'> Your skin itches.</span>")
@@ -1,66 +0,0 @@
//CORTICAL BORER ORGANS.
/obj/item/organ/internal/borer
name = "cortical borer"
icon = 'icons/obj/objects.dmi'
icon_state = "borer"
parent_organ = "head"
organ_tag = "brain"
slot = "borer"
vital = 1
/obj/item/organ/internal/borer/process()
// Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss.
for(var/chem in list("saline", "sailcylic", "meth", "mannitol"))
if(owner.reagents.get_reagent_amount(chem) < 3)
owner.reagents.add_reagent(chem, 5)
// They're also super gross and ooze ichor.
if(prob(5))
var/mob/living/carbon/human/H = owner
if(!istype(H))
return
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list
blood_splatter(H,B,1)
var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner)
if(goo)
goo.name = "husk ichor"
goo.desc = "It's thick and stinks of decay."
goo.basecolor = "#412464"
goo.update_icon()
/obj/item/organ/internal/borer/remove(var/mob/living/user)
..()
var/mob/living/simple_animal/borer/B = owner.has_brain_worms()
if(B)
B.leave_host()
B.ckey = owner.ckey
spawn(0)
qdel(src)
return null
//VOX ORGANS.
/obj/item/organ/internal/stack
name = "cortical stack"
icon_state = "brain-prosthetic"
parent_organ = "head"
organ_tag = "stack"
slot = "vox_stack"
robotic = 2
vital = 1
var/backup_time = 0
var/datum/mind/backup
/obj/item/organ/internal/stack/process()
if(owner && owner.stat != 2 && !is_broken())
backup_time = world.time
if(owner.mind) backup = owner.mind
/obj/item/organ/internal/stack/vox
name = "vox cortical stack"
/obj/item/organ/internal/stack/vox/stack
@@ -1,3 +1,16 @@
/obj/item/organ/internal/liver/vox
alcohol_intensity = 1.6
species = "Vox"
/obj/item/organ/internal/stack
name = "cortical stack"
icon_state = "brain-prosthetic"
parent_organ = "head"
organ_tag = "stack"
slot = "vox_stack"
robotic = 2
vital = 1
/obj/item/organ/internal/stack/vox
name = "vox cortical stack"
+35
View File
@@ -55,6 +55,41 @@
-->
<div class="commit sansserif">
<h2 class="date">07 May 2017</h2>
<h3 class="author">Twinmold updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">No longer able to put grabs into kitchen equipment (deep-fried grab).</li>
<li class="bugfix">No longer able to put grabs inside of display cases.</li>
</ul>
<h2 class="date">06 May 2017</h2>
<h3 class="author">Allfd updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Thrown mobs will not step on broken glass while being thrown.</li>
</ul>
<h3 class="author">Fethas updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixes sacreficed your target not triggering the next objective.</li>
<li class="bugfix">YOU CAN NOW ONLY CONVERT HUMANS NOT MICE!</li>
<li class="tweak">bloodspill tiles changed from base 100 (plus random number based on players) to 70.</li>
<li class="rscadd">Adds Tajaran veils as a loadout options</li>
<li class="rscadd">Racial loadout tab</li>
</ul>
<h3 class="author">LightFire69 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added a pretty plasmaman suit</li>
</ul>
<h3 class="author">uraniummeltdown updated:</h3>
<ul class="changes bgimages16">
<li class="rscdel">Removed Robocop, Paladin, NT Default as roundstart lawsets.</li>
</ul>
<h2 class="date">05 May 2017</h2>
<h3 class="author">Fethas updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Magistrate, IAA, and BS will now spawn with the correct color dpet satchal and duffel</li>
</ul>
<h2 class="date">01 May 2017</h2>
<h3 class="author">Fethas updated:</h3>
<ul class="changes bgimages16">
+22
View File
@@ -4601,3 +4601,25 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
Fethas:
- rscadd: There will now be an visual indicator to annouce that an incomming shuttle
is about yo wreck you.
2017-05-05:
Fethas:
- tweak: Magistrate, IAA, and BS will now spawn with the correct color dpet satchal
and duffel
2017-05-06:
Allfd:
- tweak: Thrown mobs will not step on broken glass while being thrown.
Fethas:
- bugfix: Fixes sacreficed your target not triggering the next objective.
- bugfix: YOU CAN NOW ONLY CONVERT HUMANS NOT MICE!
- tweak: bloodspill tiles changed from base 100 (plus random number based on players)
to 70.
- rscadd: Adds Tajaran veils as a loadout options
- rscadd: Racial loadout tab
LightFire69:
- rscadd: Added a pretty plasmaman suit
uraniummeltdown:
- rscdel: Removed Robocop, Paladin, NT Default as roundstart lawsets.
2017-05-07:
Twinmold:
- bugfix: No longer able to put grabs into kitchen equipment (deep-fried grab).
- bugfix: No longer able to put grabs inside of display cases.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

+1 -1
View File
@@ -1143,6 +1143,7 @@
#include "code\modules\client\preference\loadout\loadout_donor.dm"
#include "code\modules\client\preference\loadout\loadout_general.dm"
#include "code\modules\client\preference\loadout\loadout_hat.dm"
#include "code\modules\client\preference\loadout\loadout_racial.dm"
#include "code\modules\client\preference\loadout\loadout_shoes.dm"
#include "code\modules\client\preference\loadout\loadout_suit.dm"
#include "code\modules\client\preference\loadout\loadout_uniform.dm"
@@ -2185,7 +2186,6 @@
#include "code\modules\surgery\organs\subtypes\grey.dm"
#include "code\modules\surgery\organs\subtypes\kidan.dm"
#include "code\modules\surgery\organs\subtypes\machine.dm"
#include "code\modules\surgery\organs\subtypes\misc.dm"
#include "code\modules\surgery\organs\subtypes\nucleation.dm"
#include "code\modules\surgery\organs\subtypes\shadow.dm"
#include "code\modules\surgery\organs\subtypes\skrell.dm"